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: