[C] conteggio delle parole complesso!

di Anonimizzato11275 il
15 risposte
Come esercizio devo fare questo programma che conta le parole in una stringa di testo. Solo che il programma deve ignorare gli spazi di troppo e contare il numero effettivo delle parole, per es.:
___ciao___mondo! _ = spazio

l'ulteriore peroblema è che posso usare solo le funzioni fatte fino ad ora quindi dovrei farlo usando cicli e if, il prof ha suggerito di usare lo switch ma non so come!

15 Risposte

  • Quindi? Proponi del codice ...
  • oregon ha scritto:


    Quindi? Proponi del codice ...
    ho iniziato così:
    for(i=0;i<L_TESTO;i++)
                         {
                                               if(testo[i]!=' ')
                                               {
                                                              if(testo[i+1]==' ')
                                                              {
                                                                             num_parole ++;
                                                                             
                                                              }
                                                              else if(testo[i+1]=='\0')
                                                              {
                                                                             num_parole ++;
                                                                             break;
                                                              }
                                               }
                         }
                                   
                         
                         printf("Parole trovate: %u.\n",num_parole);
  • Prova con una variabile che ti indichi la presenza dello spazio ...
    
    	int sp=1;
    
    	for(i=0; i<L_TESTO; i++)
        {
    		if(testo[i]==' ')
    			sp=1;
    		else
    		{
    			if(testo[i]=='\0')
    				break;
    
    			if(sp==1)
    			{
    				sp=0;
    				num_parole++;
    			}
    		}
    	}
    
  • oregon ha scritto:


    Prova con una variabile che ti indichi la presenza dello spazio ...
    
    	int sp=1;
    
    	for(i=0; i<L_TESTO; i++)
        {
    		if(testo[i]==' ')
    			sp=1;
    		else
    		{
    			if(testo[i]=='\0')
    				break;
    
    			if(sp==1)
    			{
    				sp=0;
    				num_parole++;
    			}
    		}
    	}
    
    gia ma in questo modo ogni spazio inserito viene associato ad una parola ed inserendo spazi in più... non torna
  • già ma
    Non ti capisco ... ma l'hai provato? In quale condizione non ti soddisfa?

    Fai un esempio pratico concreto ...
  • Oregon nel tuo codice ogni spazio conterà una parola,se l'intervallo degli spazi tra parole è superiore ad uno il codice aumenterà il wordcount piu del dovuto.

    Un metodo potrebbe essere quello di tenere traccia delle parole contate,ovvero se trovo un carattere dopo uno spazio e non l'ho contata allora la conto.
    Tradotto in c diviene:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    int wordcount(char* s)
    {
        int nw;
        int havecount;
    
        for(nw=0,havecount=0; *s!='\0';s++)
        {
            if (isgraph(*s))
            {
                if (!havecount)
                {
                    nw++;
                    havecount=1;
                }
            }
            else
            {
                havecount=0;
            }
        }
        return nw;
    }
    
    int main()
    {
        char *test="     ciao mondo        come stai?";
        int r=wordcount(test);
        printf("Word Count::%d\n",r);
        return 0;
    }
    
  • vbextreme ha scritto:


    oregon nel tuo codice ogni spazio conterà una parola,se l'intervallo degli spazi tra parole è superiore ad uno il codice aumenterà il wordcount piu del dovuto.

    Un metodo potrebbe essere quello di tenere traccia delle parole contate,ovvero se trovo un carattere dopo uno spazio e non l'ho contata allora la conto.
    Tradotto in c diviene:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    int wordcount(char* s)
    {
        int nw;
        int havecount;
    
        for(nw=0,havecount=0; *s!='\0';s++)
        {
            if (isgraph(*s))
            {
                if (!havecount)
                {
                    nw++;
                    havecount=1;
                }
            }
            else
            {
                havecount=0;
            }
        }
        return nw;
    }
    
    int main()
    {
        char *test="     ciao mondo        come stai?";
        int r=wordcount(test);
        printf("Word Count::%d\n",r);
        return 0;
    }
    
    intanto grazie per la risposta anche se non ho capito molto dato che studio c da poco... comunque ho risolto così:
    i=0;
                         while(testo[i]!='\0')
                         {
                         while(testo[i]==' ')
                         {
                                           i++;
                         }
                         num_parole ++;
                         while((testo[i]!=' ')&&(testo[i]!='\0'))
                         {
                                            i ++;
                         }
                         }
                         if(testo[i-1]==' ')
                         {
                                          num_parole --;
                         }
                         printf("Parole trovate: %u.\n",num_parole);
                         sleep(2000);
  • vbextreme ha scritto:


    oregon nel tuo codice ogni spazio conterà una parola,se l'intervallo degli spazi tra parole è superiore ad uno il codice aumenterà il wordcount piu del dovuto.
    Mai sei sicuro di quello che dici perché hai provato il mio codice o è una tua ipotesi ?
  • simobest400 ha scritto:


    comunque ho risolto così
    Non mi sembra che il codice che hai scritto sia molto lineare né semplice rispetto a quello che ti avevo proposto o ti avevano proposto altri. In realtà non hai neanche controllato il funzionamento dei codici che ti hanno proposto, segno che in realtà non avevi poi così bisogno di aiuto.
  • No non lo avevo testato,scusa funziona a dovere....mi ero impappinato in quegli if e a prima vista mi sembrava non andare.Scusa ancora.
    Diciamo che la soluzione adottata è forse delle peggiori!
  • vbextreme ha scritto:


    no non lo avevo testato,scusa funziona a dovere....mi ero impappinato in quegli if e a prima vista mi sembrava non andare.Scusa ancora.
    Di nulla ...
    Diciamo che la soluzione adottata è forse delle peggiori!
    Sicuramente ...


    Ci vediamo sugli altri forum ...
  • Gia di certo non è il modo piu conveniente ma è quello che ero in grado di fare con le mie conoscenze di funzioni!
  • simobest400 ha scritto:


    Gia di certo non è il modo piu conveniente ma è quello che ero in grado di fare con le mie conoscenze di funzioni!
    Con il codice che ti ho proposto (e che non hai neanche provato) non ci sono cose che non conosci, anzi, ce ne sono meno di quelle che hai usato nel tuo. Era un codice molto più semplice e valeva la pena di dargli un'occhiata, dopo che avevi fatto richiesta di aiuto.

    Tutto qui.
  • E non solo dire,guarda cosa avresti ottenuto ottimizzandolo(ovvero sprecando 5 min per migliorare le soluzioni proposte:
    
    int wordcountOregonMod(char *s)
    {
        int sp=1;
        int num_parole=0;
    
        for(; *s!='\0'; s++)
        {
            if(*s==' ')
            {
                sp=1;    
            }
            else if (sp==1)
            {
                sp=0;
                num_parole++;
            }
        }
        
        return num_parole;
    }
    
Devi accedere o registrarti per scrivere nel forum
15 risposte