|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
[C] Problema con programma ciphertext
Salve a tutti, in questi giorni mi sto allenando per le prossime olimpiadi di informatica usando i vecchi quesiti delle precedenti edizioni. In particolare uno mi ha stuzzicato e vorrei riscriverlo distaccandomi dalla soluzione inclusa nei file del quesito.
Quesito: Due ragazzi comunicano tra di loro usando un codice particolare, in cui ogni lettera che si intende comunicare in realtà è rappresentata dalla successiva in ordine alfabetico. Per esempio B=C e P=Q. Allo stesso modo le vocali: A=E e O=U. Nei casi delle ultime consonanti/vocali dell'alfabeto, esse sono rappresentate dalle prime. Esempio: Z=B e Y=A (Y è considerata vocale). La punteggiatura (compresi accenti e apostrofi) rimane invariata. Scrivere un programma in C che rispetti le regole scritte sopra e, acquisendo un input da tastiera, restituisca il messaggio "criptato". (In teoria l'esercizio chiede anche che sia case-sensitive e che le regole vengano applicate anche ai numeri, ma quello ci penserò dopo...) Volevo evitare di farlo con una sequenza lunghissima di case, quindi ho pensato di farlo sfruttando degli array. Ecco il mio elaborato: http://ideone.com/xzgMw Ho provato a compilarlo con Dev-C++ ma m dà errore (ma li spiega da cane), mentre ideone li spiega un po' meglio, ma nonostante questo non riesco a capire. Come posso fare? Come approccio è giusto o sbaglio anche quello? Grazie a tutti quelli che risponderanno!
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 20-11-2011 alle 00:54. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quelli segnalati li sono errori abbastanza banali, del tipo manca un punto e virgola (prog.c:26: error: expected ‘;’ before ‘k’) o c'è un & di troppo (scanf("%s", &msg); ).
Io lo farei in modo diverso, più efficiente; i cicli annidati non sono proprio il max, da questo punto di vista.. suggerimento: click!
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Qualche errore logico o di linguaggio
1) Codice:
alfabeto[j+1] = msg_criptato[k] Codice:
msg_criptato[k] = alfabeto[j+1]; Codice:
for(k=0; k<80; k++) {
printf("Il messaggio criptato è: %s", msg_criptato[80]); //Stampo il messaggio criptato
}
Codice:
printf("Il messaggio criptato è: %s", msg_criptato);
3) I commenti sono quasi tutti inutili. Addirittura un commento Codice:
// auto esplicativo |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
In effetti il ragazzo mostra carenze nella conoscenza del linguaggio C. Il mio consiglio è magari di farlo in Java, dove alcuni di questi problemi non sussistono. Altrimenti, studiarsi C per bene.
|
|
|
|
|
|
#7 | |||
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Quote:
Avevo pensato all'ASCII ma non saprei come implementarlo nel programma; cioè, se io gli do direttamente un hex lui sa già di che carattere si tratta? Quote:
Quote:
--- Comunque ancora ho un errore alla riga 24: prog.c:24: error: expected expression before ‘[’ token. Ma che cosa manca?? EDIT: Trovato l'errore, c'è una [ di troppo. L'ho compilato ma non va, mi stampa una riga vuota. Come mai?
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 20-11-2011 alle 16:41. |
|||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Rimetti codice e cosa ottieni. Così non capisco.
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Ecco il codice corretto: http://codepad.org/La58gWru.
In pratica mi restituisce una riga vuota come messaggio criptato.
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 20-11-2011 alle 19:46. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Prova ad aggiungere queste due righe prima della stampa del messaggio criptato.
Codice:
msg_criptato[k] = '\0';
printf("k = %d", k);
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Mi dice k = 0. Non è un buon segno, vero?
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Beh, vuol dire che non entra mai nell'if. Indaga sul perchè. Assicurati che il messaggio sia tutto in maiuscolo vista la natura del tuo alfabeto. Per esempio potresti, subito dopo aver letto da tastiera la stringa del messaggio, trasformarla tutta in maiuscolo con qualcosa del genere
Codice:
for(int i = 0; i < strlen(msg); i++) msg[i] = toupper(msg[i]); http://www.cplusplus.com/reference/c...ctype/toupper/ |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:40.




















