001: #include<stdio.h>
002: #include<stdlib.h>
003: #include<string.h>
004: #include<ctype.h>
005: 
006: char **leggi_file(void);
007: char *sentence2morse(char *, char **);
008: 
009: int main(int argc, char **argv){
010: 
011:   // PUNTO 1: leggo e memorizzo il contenuto del file "morse.txt". 
012:   // Posso usare il classico array di stringhe. 
013:   // L'indice di ciascun elemento mi indica la lettera (0 -> 'A', 1 -> 'B' ecc.)
014:   // per passare da indice a lettera e viceversa sommo all'indice il codice ASCII di 'A' o sottraggo al codice ASCII della lettera quello della 'A'
015:   char **morse = leggi_file();
016:   printf("Dal file ho letto le seguenti codifiche:\n");
017:   for(int i = 0; i < 26; ++i)
018:   {
019:     printf(" %c -> %s\n", 'A' + i, morse[i]);
020:   }
021: 
022:   // PUNTO 2: input utente ed eventuale invocazione delle relative funzioni
023:   while(1)
024:   {
025:     char scelta, tmp[1000], *result; // per memorizzare scelta menu', eventuale frase da codificare o decodificare e relativa codifica/decodifica
026:     printf("Inserisci 'c' per codifica, 'd' per decodifica o 'x' per uscire: ");
027:     scanf(" %c", &scelta);
028: 
029:     switch(scelta)
030:     {
031:       case 'x':
032:   printf("Ciao, ciao, esco\n");
033:   exit(EXIT_SUCCESS);
034:       case 'c':
035:   printf("Inserisci la frase da codificare: ");
036:   scanf(" %[^\n]", tmp);
037:   result = sentence2morse(tmp, morse);
038:   printf("La frase [%s] in morse si codifica come [%s]\n", tmp, result);
039:   free(result);
040:   break;
041:       default:
042:   printf("Scelta sbagliata, per cortesia ripeti\n");
043:     }
044:   }
045:   
046: 
047:   return 0;
048: }
049: 
050: char **leggi_file(void)
051: {
052:   FILE *fp = fopen("morse.txt", "r");
053:   if(!fp)
054:   {
055:     perror("");
056:     exit(EXIT_FAILURE);
057:   }
058: 
059:   char **morse = malloc(26 * sizeof(char*)); // alloco i puntatori a 26 stringhe
060: 
061:   char lettera, codifica[1000]; // le uso per la lettura
062: 
063:   // ciclo di lettura (sono sicuro siano 26 lettere)
064:   for(int i = 0; i < 26; ++i)
065:   {
066:     fscanf(fp, " %c %s", &lettera, codifica); // leggo un carattere e la relativa codifica
067:     //printf("Ho letto %c che viene codificato come %s\n", lettera, codifica); // DEBUG
068: 
069:     // alloco elemento dell'array di stringhe sfruttando la lunghezza della codifica letta e vi copio dentro la codifica
070:     morse[i] = malloc( (strlen(codifica) + 1) * sizeof(char) );
071:     strcpy(morse[i], codifica);
072:   }
073: 
074:   return morse;
075: }
076: 
077: 
078: char *sentence2morse(char *frase, char **morse)
079: {
080:   char tmp[10000] = ""; // stringa in cui costruisco la frase codificata
081:   
082:   // analizzo la frase passata carattere per carattere
083:   for(int i = 0; i < strlen(frase); ++i)
084:   {
085:     if(frase[i] == ' ') // se spazio non devo convertire ma solo aggiungere alla codifica una doppia spaziatura
086:     {
087:       strcat(tmp, "  ");
088:     }
089:     else // quindi e' una lettera
090:     {
091:       char lettera = toupper(frase[i]);  // converto in maiuscolo
092:       strcat(tmp, morse[lettera - 'A']); // aggiungo lettera codificata a risultato
093:       strcat(tmp, " ");                  // aggiungo spazio
094:     }
095:   }
096: 
097:   // alloco array dinamico in cui copio risultato e che restituiro' a chi ha invocato la funzione
098:   char *risultato = malloc( (strlen(tmp) + 1)*sizeof(char));
099:   strcpy(risultato, tmp);
100: 
101:   return risultato;
102: }
103: 
104: