Funzione bool che restituisce sempre true

Pubblicità

Svpam

Nuovo Utente
Messaggi
70
Reazioni
2
Punteggio
27
Sto scrivendo questo programmino per esercizio:
Codice:
Scrivere un programma che letto da input un array di 10 carattere stampi "ok" se il numero di vocali (a,e,i,o,u) minuscole distinte è al max 1, altrimenti stampi errore
es:
input: m m r e t v c d f w
output: ok

in: a d f a s w a a x c
out: ok

in: a s d e d u g d e 
out: errore

questo è il codice:
Codice:
#include <iostream>

using namespace std;
const int dim=10;//100

void leggi (char a[])
{
    for (int i=0; i<dim; i++)
        cin>>a[i];
}

bool ok (char a[])
{
    for (int i=0; i<dim; i++)
    {
        if ((a[i]=='a')&&(a[i]=='e' || a[i]=='i' || a[i]=='o' || a[i]=='u'))
            return false;
        else if ((a[i]=='e')&&(a[i]=='a' || a[i]=='i' || a[i]=='o' || a[i]=='u'))
            return false;
        else if ((a[i]=='i')&&(a[i]=='e' || a[i]=='a' || a[i]=='o' || a[i]=='u'))
            return false;
        else if ((a[i]=='o')&&(a[i]=='e' || a[i]=='i' || a[i]=='a' || a[i]=='u'))
            return false;
        else if ((a[i]=='u')&&(a[i]=='e' || a[i]=='i' || a[i]=='o' || a[i]=='a'))
            return false;
    }
    return true;
}

void stampa(char a[])
{
    [B]cout<<ok(a)<<endl; //risulta sempre 1[/B]
    if (ok(a))
        cout<<"OK";
    else
        cout<<"ERRORE";
}
int main()
{
    char A[dim];
    leggi (A);
    stampa (A);

    return 0;
}

Qualche aiuto/consiglio??

EDIT: ho modificato un po' il codice postato prima, perchè non mi ero accorto di aver postato una versione ancora più sbagliata.
Il problema da quel che ho capito è che la funzione 'ok' restituisce sempre true.
 
Ultima modifica:
Non capisco bene cosa stai facendo in quella funzione, ma il motivo per cui ti ritorna sempre true è ovvio...
Guarda le condizioni degli if dentro al ciclo for... non saranno mai verificate: quale variabile può essere uguale a una lettera e contemporaneamente uguale a un'altra?
 
Neanche io capisco bene cosa fa quella funzione. Mi pare di capire che devi verificare che non ci sia piu di una vocale minuscola nella stringa. Se è cosi penso si possa scrivere con un singolo ciclo for in qualche riga.

Per il resto quoto 1nd33d.

((a=='a')&&(a=='e' || a=='i' || a=='o' || a=='u'))


Non puo essere verificata in quanto il carattere a non può
essere uguale ad 'a' E ad un altra vocale. Lo stesso per le altr condizioni.

EDIT: no in un solo ciclo for non si può fare, mi era sfuggito il distinte.
 
Ultima modifica:
Scusate, ma perché vi state complicando la vita con cicli multipli e duemila controlli?
Basta una cosa del genere (è scritto in C, ma per portarlo in C++ basta che cambi giusto la libreria e mezza riga):

Codice:
#include <stdio.h>

#define LEN 10

int okCheck(char vettore[]);

int main()
{
char ok[LEN] = { 'a', 'd', 'f', 'a', 's', 'w', 'a', 'a', 'x', 'c'};
char ok2[LEN] = { 'm', 'm', 'r', 'e', 't', 'v', 'c', 'd', 'f', 'w'};
char no[LEN] = { 'a', 's', 'd', 'e', 'd', 'u', 'g', 'd', 'e', 'z' }; 
printf("ok: %d, ok2: %d, no: %d\n", okCheck(ok), okCheck(ok2), okCheck(no));
return 0;
}

int okCheck(char vettore[])
{
    int i;
    char temp = 0;
    for (i = 0; i < LEN; i++)
    {
        if (vettore[i] == 'a' || vettore[i] == 'e' || vettore[i] == 'i' ||
            vettore[i] == 'o' || vettore[i] == 'u')
            {
                if (temp == 0)
                {
                    temp = vettore[i];
                }
                else if (vettore[i] != temp)
                {
                    return 0;
                }                    
            }
    }    
    return 1;
}

Sergio :)
 
Ultima modifica:
scusa ma non capisco come funzioni la tua proposta.
Su una stringa "adert" temp diventa 'a', quando arriva ad e temp non è 0, quindi entra nell'else if (dato che vettore[2]='e' che è diverso da 'a') e ritorna 0. Mentre doveva tornare 1.


La soluzione più semplice e efficente (non scrivo codice) credo sia è di creare un array aggiuntivo di 5 caratteri, ogni volta che si trova una vocale scorrere questo array e se la vocale non è presente aggiungerla, altrimenti ritornare false.

Ci sono due cicli for ma è comunque efficente in quanto ha un costo O(n+5).
 
scusa ma non capisco come funzioni la tua proposta.
Su una stringa "adert" temp diventa 'a', quando arriva ad e temp non è 0, quindi entra nell'else if (dato che vettore[2]='e' che è diverso da 'a') e ritorna 0. Mentre doveva tornare 1.

Scusa, ma la consegna non era "restituire true se il numero di vocali minuscole distinte è al max 1"?

La mia funzione con la stringa "adert" restituisce false, perché ci sono due vocali distinte, non vedo il problema :oogle:
 
Pubblicità
Pubblicità
Indietro
Top