CONTEGGIO VOCALI

di Anonimizzato10605 il
21 risposte
Ciao ragazzi!!
devo fare il conteggio di vocali in una lista di parole..
sono riuscita a definire una funzione,ma quando dal menu scelgo l'opzione visualizza vocali in lista mi dice che le vocali sono zero..mi potete dare una mano a capire il perchè?
vi posto il mio codice,c'è anche tutta la parte iniziale che pone le parole in lista in ordine alfabetico..


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_DIM 20

typedef struct Elenco{
   char info[MAX_DIM];
   struct Elenco *next;
   } Elenco;
typedef Elenco * puntElenco;

puntElenco inserisci(puntElenco L, char*word){
   puntElenco q;
   q=(puntElenco)malloc(sizeof(Elenco)); //crea un elenco allocandolo sulla memoria dinamica
   strcpy(q->info,word);
   q->next=L;  //lega al resto della lista
   return(q);  //ritorna al nuovo puntatore della lista
}
                       
                       //definizione funzione di inserimento in lista      
puntElenco InserisciElementoInLista(puntElenco L,char*parola){
   puntElenco q=L, prec;
   int PosTrovata=0;
   if(q==NULL){        // lista vuota
      q=inserisci(L,parola);
      return(q);
   }
   
                     //lista con una parola con inseriemnto in testa
   if(strcmp(q->info,parola)>=0){ 
      q=inserisci(L,parola);
      return q;
   }
                    //lista con almeno una parola più inserimento dopo la prima parola
   while (q!=NULL && (PosTrovata==0))
   {
      if(strcmp(q->info,parola)<0)
      {
         prec=q;
         q=q->next;
      }
      else
         PosTrovata=1;
   }
   prec->next=inserisci(q,parola);
   return (L);
}
             //definizione funzione di visualizzazione lista
void VisualizzaLista(puntElenco L){
   puntElenco q=L;
   printf("\nLista parole:\n\n");
   while(q!=NULL){
      printf("%s\n",q->info);
      q=q->next;
   }
   printf("\n");
}

void ContaNumeroVocaliInLista(char word[], int *pvocali){
   
   char c; 
   int count; 
   for(count=0;count<MAX_DIM;++count){
                                      if (c== 'a' && c== 'A' || c== 'e' && c== 'E' ||
                                      c== 'i' && c== 'I' || c== 'o' && c== 'O' || c== 'u' && c== 'U' )
                                      ++ *pvocali;
                                      }
                                      return;
                                      }

int main (){
   puntElenco el_parole=NULL;
   el_parole = NULL;
   int scelta,a=1;
   int vocali=0;
   char word[MAX_DIM]={'\0'},lunga[MAX_DIM]={'\0'};
   
   do{
        //creazione MENU
         printf("SCELTA OPERAZIONE \n");
         printf("\nPREMI 1:-----------INSERISCI PAROLA---------------------\n");
         printf("PREMI 2:-----------VISUALIZZA LISTA-----------------\n");
         printf("PREMI 3:----------VISUALIZZA VOCALI IN LISTA-----------\n");
         printf("PREMI 4:----------------USCITA-----------------\n");
         printf("\nScelta: ");
         scanf("%d",&scelta);
             
         if(scelta==1){
            printf("Digita la parola da inserire: ");
            scanf("%s",word);   
            el_parole=InserisciElementoInLista(el_parole,word);
         }
            //definizione delle possibili scelte               
         if(scelta==2) VisualizzaLista(el_parole);
               
         if(scelta==3){
                       ContaNumeroVocaliInLista(word, &vocali);
                       printf("Le vocali presenti in lista sono: %d ", vocali);
                       
                       }
         if(scelta==4) a=0;
             
         if(scelta!= 1 && scelta!= 2 && scelta!= 3 && scelta!=4) printf("\nScelta non valida\n\n");
             
      } while(a!=0);
      
      return 0;
   }   
grazie x l'aiuto!!

21 Risposte

  • Ciao milu,

    la funzione ContaNumeroVocaliInLista non passa la lista, passa solo l'array di char.
    Quest'ultima itera non correttamente e controlla la variabile c che non hai assegnato.
    Il mio consiglio è di creare un nuovo programma test scrivendo una funzione così definita:
    
    unsigned int contavocali (char *s);
    
    Provala bene con un piccolo main e quando sei sicura che funziona la integri nel tuo programma. Un'altra funzione simile alla VisualizzaLista chiamerà la funzione contavocali sommando il risultato.
  • È questo il problema..io non so passare la lista..
  • Dimenticati per un attimo della lista e scrivimi la funzione contavocali che accetta un puntatore a char e restituisce il numero di vocali.
  • Ho esattamente lo stesso problema..io farei così..ma mi dice che le vocali sono zero..
    
    #include<stdio.h>
    #include<iostream>
    main()
    {
          char parola[20];
          int vocali=0;
          
          void ContaVocaliParola(char parola[], int *pvocali);
          printf("inserisci parola: \n");
          scanf("%[^\n]", parola);
          
          ContaVocaliParola(parola, &vocali);
          printf("le vocali sono %d\n", vocali);
          system("PAUSE");
          }
          
          void ContaVocaliParola(char parola[], int *pvocali)
          {
              
               
               char c;
               int count;
               for(count=0;count<=20;count++){
                                          if(isalpha(c))
                                          if (c== 'a' && c== 'A' || c== 'e' && c== 'E' ||
                                          c== 'i' && c== 'I' || c== 'o' && c== 'O' || c== 'u' && c== 'U' )
                                          ++ *pvocali;
                                          }
                                         
                                     
                                          return;
                                        
                                          }
  • Ciao milu,
    l'array parola[], quando è inteso come stringa, è così descritta:
    
    parola[0]='H';
    parola[1]='e';
    parola[2]='l';
    parola[3]='l';
    parola[4]='0';
    parola[5]='\0';
    parola[6]=<valore indefinito>
    parola[7]=<valore indefinito>
    ... idem come sopra fino all'ultimo elemento
    parola[19]=<valore indefinito>
    
    
    Nota come il quinto elemento (non è il famoso film di fantascienza) contiene un carattere ASCII 'zero' (backslash zero) che viene usato per terminare la stringa "Hello".

    Nella tua struttura hai definito char info[20], significa che riservi 20 caratteri (byte) al massimo, ma solo alcuni conterranno realmente quello che hai inserito. I caratteri successivi al '\0' possono contenere qualsiasi cosa di indefinito.

    Per cui:
    1) Preleva il carattere dal tuo array parola con c=parola
    2) Trasforma il carattere in maiuscolo con c=toupper(c)
    3) Verifica se vocale
    4) Itera con fino a quando c!='\0'
  • Ci sono riuscita..ecco il codice..
    
    #include<stdio.h>
    #include<iostream>
    main()
    {
          char parola[20];
          int vocali=0;
          
          void ContaVocaliParola(char parola[], int *pvocali);
          printf("inserisci parola: \n");
          scanf("%[^\n]", parola);
          
          ContaVocaliParola(parola, &vocali);
          printf("le vocali sono: %d", vocali);
          system("PAUSE");
          }
          
          void ContaVocaliParola(char parola[], int *pvocali){
              
               
               char c;
               int count;
               
               while((c= toupper(parola[count]))!= '\0') {
                                     
                                          if (c== 'A' || c== 'E' || c== 'I' || c== 'O' || c== 'U' )
                                          ++ *pvocali;
                                          ++ count;
                                          }
                                         
                                          return;
                                        
                                          }
    
    per la lista devo seguire questo ragionamento?
  • Brava milu,

    non è stato poi così difficile no?!
    togli return. la funzione è dichiarata void ed il return è implicito alla fine.
    Indentiamo meglio... dovrebbe essere qualcosa tipo:
    
    void ContaVocaliParola(char parola[], int *pvocali){
      char c;
      int count;
    
      while((c= toupper(parola[count]))!= '\0') {
        if (c== 'A' || c== 'E' || c== 'I' || c== 'O' || c== 'U' )
          ++ *pvocali;
        count++;
      }
    }
    Adesso lo inseriamo nel discorso delle liste.
    Copia la funzione VisualizzaLista creandone un'altra identica con un'altro nome,
    per esempio ContaVocaliLista

    Utilizza l'iterazione (che già funziona) ma anziché stampare q->info chiama la funzione ContaVocaliParola passandogli la stringa e l'indirizzo di una variabile intera che avrai inizialmente azzerato.

    Vai che aspetto...
  • Allora dovrei inserire nel mio codice prima di tutto la funzione che conta le vocali che ho creato prima..giusto?
    non capisco una cosa..poi mi dici di inserire una funzione identica a VisualizzaLista,con un altro nome, usando l'iterazione che gia funziona
    cioè cosi?
    
    
    void ContaVocaliLista(puntElenco L){
    int i=0;
     puntElenco q=L;
     printf("le vocali sono:\n|n")
     while(q!=NULL){
    
    questa è l'iterazione di cui parli?

    e poi al posto del printf che c'è nella funzione VisualizzaLista,mi dici che dovrei chiamare la funzione che conta le vocali,
    cioè il codice deve essere questo?riprendendo proprio dal while
    
    while(q!=NULL){ 
                    ContaVocaliParola  (char*parola, &i);
                    q=q->next;
                    }
    
    e gli ho passato la stringa e l'indirizzo della variabile i,che prima ho posto pari a zero..
    a cosa serve questa variabile?..forse l'iterazione devo farla con questa variabile?
    credo proprio che non ho capito niente..giusto??
  • E' tutto giusto ma ti stai perdendo proprio qui:
    
       ContaVocaliParola  (q->info, &i);
    
    La tua parola è in q->info... quella che stampavi con la printf
  • Ok..ti ringrazio veramente tanto per tutto quello che mi ha detto finora!!
    c'è un problemino..
    ecco il codice
    
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_DIM 20
    
    typedef struct Elenco{
       char info[MAX_DIM];
       struct Elenco *next;
       } Elenco;
    typedef Elenco * puntElenco;
    
    puntElenco inserisci(puntElenco L, char*word){
       puntElenco q;
       q=(puntElenco)malloc(sizeof(Elenco)); //crea un elenco allocandolo sulla memoria dinamica
       strcpy(q->info,word);
       q->next=L;  //lega al resto della lista
       return(q);  //ritorna al nuovo puntatore della lista
    }
                           
                           //definizione funzione di inserimento in lista      
    puntElenco InserisciElementoInLista(puntElenco L,char*parola){
       puntElenco q=L, prec;
       int PosTrovata=0;
       if(q==NULL){        // lista vuota
          q=inserisci(L,parola);
          return(q);
       }
       
                         //lista con una parola con inseriemnto in testa
       if(strcmp(q->info,parola)>=0){ 
          q=inserisci(L,parola);
          return q;
       }
                        //lista con almeno una parola più inserimento dopo la prima parola
       while (q!=NULL && (PosTrovata==0))
       {
          if(strcmp(q->info,parola)<0)
          {
             prec=q;
             q=q->next;
          }
          else
             PosTrovata=1;
       }
       prec->next=inserisci(q,parola);
       return (L);
    }
                 //definizione funzione di visualizzazione lista
    void VisualizzaLista(puntElenco L){
       puntElenco q=L;
       printf("\nLista parole:\n\n");
       while(q!=NULL){
          printf("%s\n",q->info);
          q=q->next;
       }
       printf("\n");
    }
    
    void ContaVocaliParola(char parola[], int *pvocali){
      char c;
      int count;
      while((c= toupper(parola[count]))!= '\0') {
      if (c== 'A' || c== 'E' || c== 'I' || c== 'O' || c== 'U' )
        ++ *pvocali;
        count++;
    }
    }
    void ContaVocaliLista(puntElenco L){
     int i=0;
     puntElenco q=L;
     printf("le vocali sono:\n\n");
     while(q!=NULL){ 
                    
                    ContaVocaliParola(q->info, &i);
                    q=q->next;
                    }
                    printf("\n");
                    }                      
    
    
    int main (){
       puntElenco el_parole=NULL;
       el_parole = NULL;
       int scelta,a=1;
       int vocali=0;
       int max=0;
       char word[MAX_DIM]={'\0'},lunga[MAX_DIM]={'\0'};
       
       do{
            //creazione MENU
             printf("SCELTA OPERAZIONE \n");
             printf("\nPREMI 1:-----------INSERISCI PAROLA---------------------\n");
             printf("PREMI 2:-----------VISUALIZZA LISTA-----------------\n");
             printf("PREMI 3:----------VISUALIZZA VOCALI IN LISTA-----------\n");
             printf("PREMI 4:----------------USCITA-----------------\n");
             printf("\nScelta: ");
             scanf("%d",&scelta);
                 
             if(scelta==1){
                printf("Digita la parola da inserire: ");
                scanf("%s",word);   
                el_parole=InserisciElementoInLista(el_parole,word);
             }
                //definizione delle possibili scelte               
             if(scelta==2) VisualizzaLista(el_parole);
                   
             if(scelta==3) ContaVocaliLista(el_parole);
                         
              if(scelta==4) a=0;
                 
             if(scelta!= 1 && scelta!= 2 && scelta!= 3 &&  scelta!=4) printf("\nScelta non valida\n\n");
                 
          } while(a!=0);
          
          return 0;
       }  
    
    

    mi da errore qui
    
    while((c= toupper(parola[count]))!= '\0') {
    
    e mi dice
    In function `void ContaVocaliParola(char*, int*)':
    `toupper' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
  • Come hai fatto a provare la funzione prima di inserirla nel tuo programma delle liste?

    toupper è definita in ctype.h, devi aggiungere:
    
    #include <ctype.h>
    
  • Da sola l'ho provata e funziona senza aggiungere la libreria che mi hai detto..
    non ti so dire perchè..

    comunque credo che ti sto scocciando..ma se faccio partire il programma e scelgo di visualizzare le vocali..il computer mi blocca l'operazione..sbaglio forse nella main?
    
    if(scelta==3) ContaVocaliLista(el_parole);
    
  • 
    void ContaVocaliParola(char parola[], int *pvocali)
    {
    	char c;
    	int count=0; // <---------FIXME
    	while ((c = toupper(parola[count])) != '\0') {
    		if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
    			++ * pvocali;
    		count++;
    	}
    }
    
    void ContaVocaliLista(puntElenco L)
    {
    	int i = 0;
    	puntElenco q = L;
    	while (q != NULL) {
    
    		ContaVocaliParola(q->info, &i);
    		q = q->next;
    	}
    	printf("Le vocali sono %d\n",i); // <-------------FIXME
    }
    
    
    Guarda le differenza segnate con FIXME
  • Grazie veramente!!
Devi accedere o registrarti per scrivere nel forum
21 risposte