Tra parentesi, un consiglio: per il lookup dell'equivalente morse-lettera ti conviene usare un array (quello che si suole chiamare una "lookup table"):
Ti basta quindi mappare i caratteri sconosciuti all'indice zero, i numeri agli indici tra l'1 e il 10, le lettere agli indici successivi, e poi ottenere la rappresentazione in morse è un attimo (basta guardare cosa c'è all'indice trovato nella tabella di lookup):codice:const char * mappaMorse[] = { "" /* per i caratteri sconosciuti */ " ", /* */ "----", /* 0 */ ".----", /* 1 */ "..--", /* 2 */ "...--", /* 3 */ "....-", /* 4 */ ".....", /* 5 */ "-....", /* 6 */ "--...", /* 7 */ "--..", /* 8 */ "----.", /* 9 */ ".-", /* A */ "-...", /* B */ "-.-.", /* C */ "-..", /* D */ ".", /* E */ "..-.", /* F */ "--.", /* G */ "....", /* H */ "..", /* I */ ".--", /* J */ "-.-", /* K */ ".-..", /* L */ "--", /* M */ "-.", /* N */ "--", /* O */ ".--.", /* P */ "--.-", /* Q */ ".-.", /* R */ "...", /* S */ "-", /* T */ "..-", /* U */ "...-", /* V */ ".--", /* W */ "-..-", /* X */ "-.--", /* Y */ "--.." /* Z */ }; enum IndiciLookup { Sconosciuto=0, InizioNumeri=1, FineNumeri=InizioNumeri+9, InizioLettere, FineLettere=InizioLettere+25, LunghezzaTotale=sizeof(mappaMorse)/sizeof(*mappaMorse) };
Per il contrario, non è efficientissimo, ma puoi fare, analogamente a quello che avresti fatto con i tuoi if, una ricerca nella tabella di lookup:codice:#include <ctype.h> /* ... */ const char * toMorse(char Ch) { int indice; if(isnum(Ch)) indice = InizioNumeri+Ch-'0'; /* Ch è una cifra, se ci sottraggo '0' ottengo il numero corrispondente */ else if(isalpha(Ch)) indice = tolower(Ch)-'a'+InizioLettere; /* Stesso concetto, ma con le lettere */ else indice = Sconosciuto; return mappaMorse[indice]; }
Il vantaggio rispetto alla tua soluzione è che ti eviti una marea di if, scrivi la tabella di conversione lettere-morse una sola volta e il codice risulta un po' più compatto. In termini di efficienza, il codice di conversione verso il morse risulta più efficiente (invece di fare 37 confronti vai a colpo sicuro), quello inverso è più o meno analogo alla serie di strcmp di prima.codice:char toIT(const char *c) { /* Cerca l'indice corrispondente */ for(int i=0; i<LunghezzaTotale; i++) { if(strcmp(c, mappaMorse[i])==0) break; } if(i>=InizioNumeri && i<=FineNumeri) return '0'+(i-InizioNumeri); else if(i>=InizioLettere && i<=FineLettere) return 'A'+(i-InizioLettere); else return '?'; }
... ovviamente per un piccolo programma come questo le considerazioni di efficienza sono assolutamente irrilevanti, era più che altro per mostrarti l'uso delle lookup tables.![]()

Rispondi quotando