[C] conteggio delle parole complesso!

di il
15 risposte

[C] conteggio delle parole complesso!

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

  • Re: [C] conteggio delle parole complesso!

    Quindi? Proponi del codice ...
  • Re: [C] conteggio delle parole complesso!

    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);
  • Re: [C] conteggio delle parole complesso!

    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++;
    			}
    		}
    	}
    
  • Re: [C] conteggio delle parole complesso!

    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
  • Re: [C] conteggio delle parole complesso!

    già ma
    Non ti capisco ... ma l'hai provato? In quale condizione non ti soddisfa?

    Fai un esempio pratico concreto ...
  • Re: [C] conteggio delle parole complesso!

    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;
    }
    
  • Re: [C] conteggio delle parole complesso!

    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);
  • Re: [C] conteggio delle parole complesso!

    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 ?
  • Re: [C] conteggio delle parole complesso!

    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.
  • Re: [C] conteggio delle parole complesso!

    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!
  • Re: [C] conteggio delle parole complesso!

    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 ...
  • Re: [C] conteggio delle parole complesso!

    Gia di certo non è il modo piu conveniente ma è quello che ero in grado di fare con le mie conoscenze di funzioni!
  • Re: [C] conteggio delle parole complesso!

    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.
  • Re: [C] conteggio delle parole complesso!

    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