Function

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Function

    Tra tutte queste contorsioni strane con maschere di bit, shift ed altre operazioni bitwise non è stato fatto notare che la variabile i, nella funzione vocali, non viene mai inizializzata.
    Io innanzitutto definirei precisamente cosa è una parola, dopodiché scriverei due funzioni separate: una che estrae una parola alla volta da una stringa (ad esempio nextWord oppure firstWord) ed un'altra che verifica che la parola passata contenga tutte le vocali. Così si semplifica il codice e si mantengono le due funzioni indipendenti (disaccoppiate) e riutilizzabili per i prossimi esercizi.
  • Re: Function

    LoopUnrolling: "scriverei due funzioni separate: una che estrae una parola alla volta da una stringa ed un'altra che verifica che la parola passata contenga tutte le vocali"

    Io l'ho fatto! Io l'ho fatto! (con malcelato autocompiacimento)

    P.S. Casomai non fosse chiaro, sto scherzando.
  • Re: Function

    migliorabile ha scritto:



    @toni, l'errore e' BANALE: usi strotok per suddividere la frase in 'token' e 'c' e' il token, MA invece di usare il token, usi DI NUOVO la stringa intera: ed allora a che ti serve suddividere la stringa in token?

    CONSIGLIO: assegna SEMPRE alle variabili/parametri NOMI CHE ABBIANO SENSO. E' FONDAMENTALE., per capire quello che si sta' scrivendo.
    )
    
    #include <stdio.h>
    #include <string.h>
    #define DIM 80
    int vocali(char stringa[]);
    main()
    {
      int parola;
      char stringa[DIM];
      /*lettura stringa*/
      printf("\ninserire la frase>> ");
      fgets(stringa,DIM,stdin);
      stringa[strlen(stringa)-1]='\0';
      /*usare la funzione che rende la frase tutta minuscola*/
      parola=vocali(stringa);
      printf("sono state trovate: %d che hanno 5 vocali ",parola);
    
    }
    
    int vocali(char stringa[])
    {
       int contatore,i=0;
       char *c;
       c=strtok(stringa," ");
     for(;c!=NULL; c=strtok(NULL," "))
        {
            printf("%s\n",c);
        contatore=0;
        if(c[i]=='a'||  c[i]=='e' || c[i]=='i'||  c[i]=='o' ||  c[i]=='u')
            {
            contatore++;
            }
            if (contatore==5)
                i++;
         }
        return i;
    }
    
    l'errore che indicavi tu forse l'ho individuato.
    ma continua ad essere tutto FUMO e niente arrosto
  • Re: Function

    Non hai preso bene in considerazione che c è una stringa e va esaminata nella sua lunghezza, carattere per carattere.

    Per rimanere nel "sentiero" del tuo codice e dato che non hai ancora compreso come fare, dai un'occhiata a
    
    int vocali(char stringa[])
    {
    	int parole = 0;
    	char *c = strtok(stringa, " ");
    	for (; c != NULL; c = strtok(NULL, " "))
    	{
    		printf("%s\n", c);
    
    		int p, pa=0, pe=0, pi=0, po=0, pu=0;
    		for (p = 0; p < strlen(c); p++)
    		{
    			if (c[p] == 'a') pa = 1;
    			if (c[p] == 'e') pe = 1;
    			if (c[p] == 'i') pi = 1;
    			if (c[p] == 'o') po = 1;
    			if (c[p] == 'i') pu = 1;
    		}
    
    		if (pa + pe + pi + po + pu == 5) parole++;
    	}
    
    	return parole;
    }
    
    ma se ci riflettevi un po' ci arrivavi da solo.
  • Re: Function

    oregon ha scritto:


    Non hai preso bene in considerazione che c è una stringa e va esaminata nella sua lunghezza, carattere per carattere.

    Per rimanere nel "sentiero" del tuo codice e dato che non hai ancora compreso come fare, dai un'occhiata a
    
    int vocali(char stringa[])
    {
    	int parole = 0;
    	char *c = strtok(stringa, " ");
    	for (; c != NULL; c = strtok(NULL, " "))
    	{
    		printf("%s\n", c);
    
    		int p, pa=0, pe=0, pi=0, po=0, pu=0;
    		for (p = 0; p < strlen(c); p++)
    		{
    			if (c[p] == 'a') pa = 1;
    			if (c[p] == 'e') pe = 1;
    			if (c[p] == 'i') pi = 1;
    			if (c[p] == 'o') po = 1;
    			if (c[p] == 'i') pu = 1;
    		}
    
    		if (pa + pe + pi + po + pu == 5) parole++;
    	}
    
    	return parole;
    }
    
    ma se ci riflettevi un po' ci arrivavi da solo.
    hai ragione
    bastava solamente usare di nuovo un for che cercasse le vocali per poi aumentare il contatore...
    che baggianata
  • Re: Function

    toni1705 ha scritto:


    che baggianata
    Il fatto è che credi di dover fare chissà quale ragionamento ... E questo vuol dire che non hai ben chiari gli argomenti, presi uno alla volta, soprattutto il concetto di 'stringa' del C. Ti consiglio di rivederlo in teoria.
Devi accedere o registrarti per scrivere nel forum
20 risposte