CONTEGGIO VOCALI

di il
21 risposte

CONTEGGIO VOCALI

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

  • Re: CONTEGGIO VOCALI

    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.
  • Re: CONTEGGIO VOCALI

    È questo il problema..io non so passare la lista..
  • Re: CONTEGGIO VOCALI

    Dimenticati per un attimo della lista e scrivimi la funzione contavocali che accetta un puntatore a char e restituisce il numero di vocali.
  • Re: CONTEGGIO 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;
                                        
                                          }
  • Re: CONTEGGIO VOCALI

    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'
  • Re: CONTEGGIO VOCALI

    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?
  • Re: CONTEGGIO VOCALI

    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...
  • Re: CONTEGGIO VOCALI

    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??
  • Re: CONTEGGIO VOCALI

    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
  • Re: CONTEGGIO VOCALI

    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.)
  • Re: CONTEGGIO VOCALI

    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>
    
  • Re: CONTEGGIO VOCALI

    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);
    
  • Re: CONTEGGIO VOCALI

    
    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
  • Re: CONTEGGIO VOCALI

    Grazie veramente!!
Devi accedere o registrarti per scrivere nel forum
21 risposte