Tra parentesi, un consiglio: per il lookup dell'equivalente morse-lettera ti conviene usare un array (quello che si suole chiamare una "lookup table"):
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)
};
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:
#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];
}
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:
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 '?';
}
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.
... 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.