Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    13

    [C] Codice Morse

    Salve a tutti sto facendo un programma come da titolo, solo che nella seconda parte da Morse a italiano ho riscontrato un problema durante il passaggio del codice.

    questo è il programma:
    codice:
    #include <stdio.h>
    #include <string.h>
    
    char *toMorse(char c);
    char toIT(char *c);
    
    int main()
    {
    int i;
    char str[100];
    printf("0 to Morse, 1 to IT\n");
    scanf("%d",&i);
    while(getc(stdin)!='\n');
    printf("Inserire una frase da codificare/decodificare:\n");
    fgets(str,100,stdin);
    	if(i==0) {
    		for(i=0;str[i]!='\n';i++) printf("%s ",toMorse(toupper(str[i])));
    	} else if(i==1) {
    		char *ptr;
    		ptr = strtok(str," ");
    			while(ptr!=NULL) {
    			printf("%c",toIT(ptr));
    			ptr = strtok(NULL," ");
    			}
        } else {
        	printf("Scelta non valida!\n");
        	return 0;
    	}
    printf("\n");
    }
    
    char *toMorse(char c)
    {
    	switch(c) {
    	    case ' ':
    	    	return "   ";
    	    	break;
    		case 'A':
    			return ".-";
    			break;
    		case 'B':
    			return "-...";
    			break;
    		case 'C':
    			return "-.-.";
    			break;
    		case 'D':
    			return "-..";
    			break;
    		case 'E':
    			return ".";
    			break;
    		case 'F':
    			return "..-.";
    			break;
    		case 'G':
    			return "--.";
    			break;
    		case 'H':
    			return "....";
    			break;
    		case 'I':
    			return "..";
    			break;
    		case 'J':
    			return ".--";
    			break;
    		case 'K':
    			return "-.-";
    			break;
    		case 'L':
    			return ".-..";
    			break;
    		case 'M':
    			return "--";
    			break;	
    		case 'N':
    			return "-.";
    			break;	
    		case 'O':
    			return "--";
    			break;	
    		case 'P':
    			return ".--.";
    			break;
    		case 'Q':
    			return "--.-";
    			break;	
    		case 'R':
    			return ".-.";
    			break;	
    		case 'S':
    			return "...";
    			break;	
    		case 'T':
    			return "-";
    			break;	
    		case 'U':
    			return "..-";
    			break;	
    		case 'V':
    			return "...-";
    			break;
    		case 'W':
    			return ".--";
    			break;		
    		case 'X':
    			return "-..-";
    			break;	
    		case 'Y':
    			return "-.--";
    			break;		
    		case 'Z':
    			return "--..";
    			break;
    		case '1':
    			return ".----";
    			break;
    		case '2':
    			return "..--";
    			break;
    		case '3':
    			return "...--";
    			break;	
    		case '4':
    			return "....-";
    			break;
    		case '5':
    			return ".....";
    			break;
    		case '6':
    			return "-....";
    			break;
    		case '7':
    			return "--...";
    			break;	
    		case '8':
    			return "--..";
    			break;	
    		case '9':
    			return "----.";
    			break;	
    		case '0':
    			return "----";
    			break;	
    	}
    }
    
    char toIT(char *c)
    {
    	if(c==" ") {
    		return;
    	} else if(c=="   ") {
    		return ' ';
    	} else if(c==".-") {
    		return 'a';
    	} else if(c=="-...") {
    		return 'b';	
    	} else if(c=="-.-.") {
    		return 'c';
    	} else if(c=="-..") {
    		return 'd';	
    	} else if(c==".") {
    		return 'e';	
    	} else if(c=="..-.") {
    		return 'f';	
    	} else if(c=="--.") {
    		return 'g';	
    	} else if(c=="....") {
    		return 'h';	
    	} else if(c=="..") {
    		return 'i';	
    	} else if(c==".--") {
    		return 'j';	
    	} else if(c=="-.-") {
    		return 'k';	
    	} else if(c==".-..") {
    		return 'l';	
    	} else if(c=="--") {
    		return 'm';	
    	} else if(c=="-.") {
    		return 'n';	
    	} else if(c=="--") {
    		return 'o';	
    	} else if(c==".--.") {
    		return 'p';
    	} else if(c=="--.-") {
    		return 'q';	
    	} else if(c==".-.") {
    		return 'r';	
    	} else if(c=="...") {
    		return 's';	
    	} else if(c=="-") {
    		return 't';	
    	} else if(c=="..-") {
    		return 'u';	
    	} else if(c=="...-") {
    		return 'v';	
    	} else if(c==".--") {
    		return 'w';	
    	} else if(c=="-..-") {
    		return 'x';	
    	} else if(c=="-.--") {
    		return 'y';	
    	} else if(c=="--..") {
    		return 'z';	
    	} else if(c==".----") {
    		return '1';	
    	} else if(c=="..--") {
    		return '2';	
    	} else if(c=="...--") {
    		return '3';	
    	} else if(c=="....-") {
    		return '4';	
    	} else if(c==".....") {
    		return '5';	
    	} else if(c=="-....") {
    		return '6';	
    	} else if(c=="--...") {
    		return '7';	
    	} else if(c=="--..") {
    		return '8';	
    	} else if(c=="----.") {
    		return '9';	
    	} else if(c=="----") {
    		return '0';	
    	}
    }
    il problema è nel seguente pezzo:
    codice:
    printf("%c",toIT(ptr));
    se gli passo il puntatore nn funziona, se invece al posto di ptr provo a passargli il testo io con ad esempio ".-.." (L) funziona.da cosa dipende che non riesco a capire?grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Una stringa in C non si confronta così

    c=="----"

    ma solo usando la funzione

    strcmp
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    13
    ti ringrazio!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prego ... ma fossi in te, ragionerei un attimo su quella luuuuunga sequenza di case e di if ...

    Probabilmente non hai affrontato i vettori, ma è il caso di farlo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    13
    (strcmp(c,"-..")==0) non mi va uguale così, cmq riguardo i vettori il tuo consiglio è quello di fare un vettore di stringhe, contenenti i vari casi, e a seconda del indice di vettore dove riscontro il risultato stampo il numero/lettera corrispondente?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... più o meno ...

    ("non mi va uguale" che vuol dire ? Cosa hai scritto ? Cosa succede ?)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    13
    codice:
    char toIT(char *c)
    {
    	if(strcmp(c," ")==0) {
    		return;
    	} else if(strcmp(c,"   ")==0) {
    		return ' ';
    	} else if(strcmp(c,".-")==0) {
    		return 'a';
    	} else if(strcmp(c,"-...")==0) {
    		return 'b';	
    	} else if(strcmp(c,"-.-.")==0) {
    		return 'c';
    	} else if(strcmp(c,"-..")==0) {
    		return 'd';	
    	} else if(strcmp(c,".")==0) {
    		return 'e';	
    	} else if(strcmp(c,"..-.")==0) {
    		return 'f';	
    	} else if(strcmp(c,"--.")==0) {
    		return 'g';	
    	} else if(strcmp(c,"....")==0) {
    		return 'h';	
    	} else if(strcmp(c,"..")==0) {
    		return 'i';	
    	} else if(strcmp(c,".--")==0) {
    		return 'j';	
    	} else if(strcmp(c,"-.-")==0) {
    		return 'k';	
    	} else if(strcmp(c,".-..")==0) {
    		return 'l';	
    	} else if(strcmp(c,"--")==0) {
    		return 'm';	
    	} else if(strcmp(c,"-.")==0) {
    		return 'n';	
    	} else if(strcmp(c,"--")==0) {
    		return 'o';	
    	} else if(strcmp(c,".--.")==0) {
    		return 'p';
    	} else if(strcmp(c,"--.-")==0) {
    		return 'q';	
    	} else if(strcmp(c,".-.")==0) {
    		return 'r';	
    	} else if(strcmp(c,"...")==0) {
    		return 's';	
    	} else if(strcmp(c,"-")==0) {
    		return 't';	
    	} else if(strcmp(c,"..-")==0) {
    		return 'u';	
    	} else if(strcmp(c,"...-")==0) {
    		return 'v';	
    	} else if(strcmp(c,".--")==0) {
    		return 'w';	
    	} else if(strcmp(c,"-..-")==0) {
    		return 'x';	
    	} else if(strcmp(c,"-.--")==0) {
    		return 'y';	
    	} else if(strcmp(c,"--..")==0) {
    		return 'z';	
    	} else if(strcmp(c,".----")==0) {
    		return '1';	
    	} else if(strcmp(c,"..--")==0) {
    		return '2';	
    	} else if(strcmp(c,"...--")==0) {
    		return '3';	
    	} else if(strcmp(c,"....-")==0) {
    		return '4';	
    	} else if(strcmp(c,".....")==0) {
    		return '5';	
    	} else if(strcmp(c,"-....")==0) {
    		return '6';	
    	} else if(strcmp(c,"--...")==0) {
    		return '7';	
    	} else if(strcmp(c,"--..")==0) {
    		return '8';	
    	} else if(strcmp(c,"----.")==0) {
    		return '9';	
    	} else if(strcmp(c,"----")==0) {
    		return '0';	
    	}
    }

  8. #8
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il fatto è che la fgets aggiunge alla fine della stringa un carattere LF e questo fa fallire la strcmp.

    Basta eliminare questo carattere aggiungendo subito dopo la fgets la linea

    str[strlen(str)-1]=0;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    codice:
    if(strcmp(c," ")==0) {
    		return;
    non puoi restituire "il niente" in una funzione che restituisce un char... se questo è per i caratteri sconosciuti (che "all'andata" sono stati convertiti in uno spazio singolo) dovrai restituire comunque un qualche carattere.
    ---EDIT---
    Ho riguardato adesso il programma... hai un altro problema ancora: la strtok considera gli spazi come separatori, per cui lo "spazio-morse" (ovvero i quattro spazi) non viene raccolto tutto insieme, ma considerato come un unico separatore e saltato in blocco.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.