Cicli nidificati, ricerca consonanti e vocali

di il
4 risposte

Cicli nidificati, ricerca consonanti e vocali

Salve a tutti, ho questo problema in C, ho realizzato un semplice programma che cerca la frequenza in cui appaiono vocali e consonanti, il conteggio delle vocali è giusto, ma appena entra nel 3 ciclo non esce finché non completa il ciclo delle vocali, Come posso ovviare? Ecco il codice : http://pastebin.com/NGvm4z7

4 Risposte

  • Re: Cicli nidificati, ricerca consonanti e vocali

    Ciao,
    mi sono permesso di fare qualche piccola modifica: in particolare ho aggiunto una semplice funzione che prende in ingresso un carattere e ti dice se si tratta di una vocale oppure no. Questo permette di mantenere molto più "pulito" il codice del main.
    Prova a vedere se ti piace...
    
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    char vocali[] = { 'a', 'e', 'i', 'o', 'u' };
    char consonanti[] = { 'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z' };
    
    /* funzione che restituisce 1 se il carattere passato è una vocale, 0 altrimenti */
    int isVocale(char c)
    {
        int i=0;
        for(i=0; i<5; i++)
        {
            if(c == vocali[i]) return 1;
        }
        return 0;
    }
    
    
    int main()
    {
        char s[30];
        int voca = 0;
        int i;
        int conso = 0;
    
        printf("Inserire una Stringa :\n" );
        gets( s );
    
        for( i = 0; s[i] != '\0'; i++ )
        {
            if(s[i] == ' ') continue;       /* trascura gli spazi */
            if(isVocale(s[i]) == 1) voca++;
            else conso++;                   /* se non è una vocale allora è una consonante... */
        }
    
    
        printf("Vocali : %d\n", voca );
        printf("Consonanti : %d\n", conso );
    
        return 0;
    
    }
    
  • Re: Cicli nidificati, ricerca consonanti e vocali

    Molto piu semplicemente potresti crearti una mappa di caretteri che spieghi se si tratta di un carattere o di una vocale,usando poi questa mappa punterai ad un vettore che conterà le occorrenze:
    
    char* my_gets(char* d,int max)
    {
        char* st = d;
        int c;
        while ( (c = getchar()) != EOF && c != '\n' && --max > 0 ) *d++ = c;
        *d = '\0';
        return st;
    }
    
    int main()
    {
        int conteggio[3] = {0,0,0};
    
        int map[256];
            //reset
            int i;
            for ( i = 0; i < 256 ; i++) map[i] = 0;
            //setto 2 tutte le lettere maiuscole e minuscole
            for ( i = 'A'; i <= 'Z' ; i++) map[i] = 2;
            for ( i = 'a'; i <= 'z' ; i++) map[i] = 2;
            //vocali
            map['a'] = 1; map['e'] = 1; map['i'] = 1;
            map['o'] = 1; map['u'] = 1;
            map['A'] = 1; map['E'] = 1; map['I'] = 1;
            map['O'] = 1; map['U'] = 1;
    
        char buffer[80];
        printf("write string:");
        my_gets(buffer,80);
    
        char* s = buffer;
    
        for (; *s ; s++)
            ++conteggio[map[(unsigned int)*s]];
    
        printf("\nNumero vocali:%d\nNumero consonanti:%d\nNumero altri caratteri:%d\n",conteggio[1],conteggio[2],conteggio[0]);
    
        return 0;
    }
    
    
  • Re: Cicli nidificati, ricerca consonanti e vocali

    Grazie mille a tutti e due, ma il punto era un altro. Certo avrei potuto implementare una funzione, o fare una mappa dei caratteri. Ma ho fatto quel esercizio per capire come funzioni gli algoritmi di ricerca, e anche perché mi sto avvicinando alla crittografia. Per questo motivo ho voluto implementare 3 cicli. Ad ogni modo grazie mille, ma qualcuno sa come uscire dal terzo ciclo? appena trovo un'occorrenza?
  • Re: Cicli nidificati, ricerca consonanti e vocali

    Break; return; goto;
Devi accedere o registrarti per scrivere nel forum
4 risposte