Function

di il
20 risposte

Function

Buonasera
ho scritto un programma che dovrebbe cercarmi tutte le Parole panvocaliche ( nel caso in cui non sapeste il significato https://www.culturaesvago.com/giochiamo-con-le-parole/parole-panvocaliche/)
fatto sta che sballa tantissimo

#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=0,i;
   char *c=strtok(stringa," .");
   while (c!=NULL)
    {
    if(stringa[i]=='a' ||stringa[i]=='e'||stringa[i]=='i'||stringa[i]=='o'||stringa[i]=='u')
      {
        contatore++;
      }
    c=strtok(NULL," .");
    }
    return contatore;
}
se scrivete aurelio funziona
se invece scrivete aurelio fuma erba noterete che riporta 3 parole trovate..

20 Risposte

  • Re: Function

    Ciao.
    Il problema sta nella funzione "int vocali()"...
    Nel "if(stringa=='a' ||stringa=='e'||stringa=='i'||stringa=='o'||stringa=='u')", hai utilizzato l'operazione logica ( || ).
    Questa operazione significa "or" quindi se solo una di quelle condizioni è vera ti svolge l'istruzione...

    Nel tuo caso, per risolvere il problema devi scrivere( && ):
    
    If(stringa[i]=='a' &&stringa[i]=='e'&&stringa[i]=='i'&&stringa[i]=='o'&&stringa[i]=='u');
    
  • Re: Function

    Continua a non funzionare riporta sempre 3 parole
    è come se contasse tutte le parole inserite!
  • Re: Function

    Mi dispiace non esserti stato utile ma ho notato che nella funzione "int vocali()" hai dichiarato *c che è un puntatore...
    I puntatori in teoria si dichiarano come variabili intere quindi ( int ).
    Oltre a questo non trovo altri errori...
    PS: non ne sono completamente sicuro del fatto che si dichiara come intera, ma prova comunque...
  • Re: Function

    Io userei uno switch per verificare i caratteri e un array di cinque elementi per "accumulare" le vocali trovate. Se tutti gli "slot" dell'array contengono un valore diverso da zero significa che è stata trovata almeno un'occorrenza per ogni vocale.
    #include <stdio.h>
    #include <string.h>
    
    #define DIM 80
    
    size_t conta_panvocaliche( char *frase );
    int panvocalica( const char *parola );
    
    int main() {
        size_t l, qPanvocaliche;
        char stringa[DIM];
    
        printf( "\ninserire la frase>> " );
        fgets( stringa, DIM, stdin );
    
        l = strlen( stringa );
        if( '\n'==stringa[l-1] )
            stringa[--l] = '\0';
    
        qPanvocaliche = conta_panvocaliche( stringa );
    
        printf( "quantita' di parole panvocaliche: %d\n\n", qPanvocaliche );
    
        return 0;
    }
    
    /*==============================================================================
    NOTE: non controlla la validita' del parametro
          non riconosce come vocali gli eventuali caratteri con segni diacritici
          considera come separatori di parole solo lo spazio, la virgola e il punto
    ==============================================================================*/
    
    size_t conta_panvocaliche( char *frase ) {
        size_t qPanvocaliche = 0;
    
        char *parola = strtok( frase, " ,." );
    
        while( parola ) {
            qPanvocaliche += panvocalica( parola );
            parola = strtok( NULL, " ,." );
        }
    
        return qPanvocaliche;
    }
    
    /*==============================================================================
    NOTE: non controlla la validita' del parametro
          non riconosce come vocali gli eventuali caratteri con segni diacritici
    ==============================================================================*/
    
    int panvocalica( const char *parola ) {
        size_t qv[5] = { 0,0,0,0,0 };
        size_t i, l = strlen( parola );
    
        for( i=0; i<l; ++i ) {
            switch( parola[i] ) {
                case 'a': case 'A': qv[0]++; break;
                case 'e': case 'E': qv[1]++; break;
                case 'i': case 'I': qv[2]++; break;
                case 'o': case 'O': qv[3]++; break;
                case 'u': case 'U': qv[4]++; break;
                default: ;
            }
        }
    
        return qv[0] && qv[1] && qv[2] && qv[3] && qv[4]; // 1 se e' panvocalica
    }                                                     // 0 in caso contrario
    
  • Re: Function

    Io invece orerei o sommerei maschere di bit o potenze di due
  • Re: Function

    @stebra: l'idea e' buona ma il tuo consiglio e' CANNATO ALLA GRANDE

    Puo', una stessa lettera, essere CONTEMPORANEAMENTE tutte le vocali?

    La riga di codice scritta da @toni e' corretta

    @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.

    Lascia stare la soluzione di AldoBaldo: sei TU che devi capire dove e' l'errore nel TUO codice.

    Come hai notato, a fare copia/incolla senza sapere che cosa fa quello che stai incollando serve solo ad introdurre altri errori.

    E questo succede nel 99% dei casi,
  • Re: Function

    Lascia stare la soluzione di AldoBaldo: sei TU che devi capire dove e' l'errore nel TUO codice.
    Concordo... come più volte ho segnalato ad AldoBaldo bisogna correggere il codice altrui nel forum facendo capire gli errori, non mostrare il proprio codice per proprio compiacimento.

    @ste bra ... rifletti prima di dare consigli solo per darli... non si usa and solo per provare... si deve capire che vuol dire
  • Re: Function

    +m2+: "Io invece orerei o sommerei maschere di bit o potenze di due"
    Come? Alle maschere di bit ci arrivo (anche se non ne colgo il vantaggio in un compito di questo tipo), ma alle potenze di due proprio no... Illuminami!
  • Re: Function

    @aldo ... Che valore hanno i singoli bit in un byte?
  • Re: Function

    @AldoBaldo, se devi mostrare del codice, DEVE ESSERE SEMPLICE, RIDOTTO ALL'OSSO e COERENTE con lo stile dell'autore NON CON IL TUO STILE.

    Se vuoi insegnare qualcosa a qualcuno, e' far ragionare questo qualcuno NON mostrare la TUA bravura.

    Bravura che si scontra con soluzioni semplici come quella di usare maschere di bit, che risilve in un COLPO SOLO tutta una serie di problematiche.

    Se ci RAGIONI, arrivi a capire anche da solo PERCHE' una serie di bit sarebbe una soluzione ELEGANTE.

    Ho appena accesso una lampada da 1KW, dovrebbe essere sufficiente per illuminari
  • Re: Function

    Migliorabile, non ho bravura da mostrare, solo tempo da dedicare (di quando in quando) a un po' di intrattenimento. Non tutti guardano la TV, fanno le parole incrociate o giocano a carte...

    Sulla questione dei bit, so che spostare in avanti un bit porta alla serie numerica 1, 2, 4, 8, 16 ecc. (ammesso che tutti gli altri bit siano 0), so cos'è una maschera di bit, conosco ovviamente gli operatori "bit a bit" eppure non mi sovviene proprio come potrei collegare le tre cose a questo caso particolare. Dovrei andare a vedere se nella tabella dei codici ASCII ci sono organizzazioni dei bit con ricorrenze e combinazioni particolari? Ad esempio ho notato tempo fa che per passare da maiuscolo a minuscolo basta impostare su 1 il sesto bit, ma in questo caso direi che è irrilevante, però non mi viene in mente nessun "trucco" che possa portare a individuare le vocali con un confronto dei bit.
    A  01000001
    E  01000101
    I  01001001
    O  01001111
    U  01010101
    
    a  01100001
    e  01100101
    i  01101001
    o  01101111
    u  01110101
    (ho usato il tag "code" solo per ottenere un incolonnamento migliore)
  • Re: Function

    AldoBaldo ha scritto:


    Migliorabile, non ho bravura da mostrare, solo tempo da dedicare (di quando in quando) a un po' di intrattenimento. Non tutti guardano la TV, fanno le parole incrociate o giocano a carte...
    Non è questo il nocciolo del discorso. Tu aggiri la questione. Mostrando il tuo codice non aiuti altri che te stesso, sicuramente non l'op che ha posto il problema, che non comprende il tuo codice, non lo saprebbe spiegare al professore e che ha bisogno solo di capire dove ha sbagliato nel PROPRIO codice. Ma come si dice, non c'è peggior sordo ...
    la serie numerica 1, 2, 4, 8, 16 ecc.
    Questa non è la serie delle potenze di 2?

    L'ASCII non c'entra nulla.

    Con la questione bit e potenze stai solo confondendo chi ha aperto il thread. Perché non ne crei uno tuo sui tuoi dubbi?
  • Re: Function

    @AldoBaldo genuflettiti per ascoltare la parola dal maestro

    (Nel film era la parola del Signore, ma non voglio esagerare )

    1) non ti serve CONTARE il numero di vocali, ma SOLO SE CI SONO, informazione che puoi rabbresentare con UN SINGOLO BIT
    2) assegna ad ogni vocale una potenza di 2: a->1, i->2, u-> 4, o->8, e->16
    3) ora parti con una variable 'vocali' che vale 0 (TUTTI I BIT a 0)
    4) ogni volta che trovi una vocale, fai l'OR tra 'vocali' e il valore assegnato alla vocale
    5) alla fine se 'vocali' vale 31 (5 BIT a 1), la parola contiene TUTTE le vocali

    a 1 (bit 0)
    i 2 (bit 1)
    u 4 (bit 2)
    o 8 (bit 3)
    e 16 (bit 4)

    E' robetta entry level

    Ma questo NON E' il punto: questa e' UNA possibile soluzione, poi c'e' la tua, ma NESSUNA e' o assomiglia alla soluzione dell'autore del thread!

    (ho spento la lampadina: 1Kw costa troppo
  • Re: Function

    Grazie migliorabile. E io che andavo a immaginare che +m2+ volesse indirizzarmi verso chissà quale osservazione esoterica su chissà quali combinazioni "strategiche" di bit tipiche delle vocali! Sì, sostituisci il mio array di int con un singolo valore e lo sfrutti per "segnare" dei flag, a questo sarei potuto arrivare, ma mi è sembrata più semplice l'altra soluzione. Eh, va be', dai... l'ammiccamento di +m2+ era fuorviante! (secondo me l'ha fatto apposta... )

    Oregon, la questione dei bit e delle potenze non l'ho tirata fuori io dal cappello...

    P.S. Se uno vuole copiare del codice non serve un forum, la rete è piena di esercizi del genere già svolti. Chi vuole copiare copia e basta, chi vuol capire guarda e dice "ma tò, che non ci avevo pensato!". Magari poi fa di testa sua, ma ne ha vista una in più, che male non fa. Comunque, dai, lasciamo perdere.
Devi accedere o registrarti per scrivere nel forum
20 risposte