[C++] Uscita dal while che non va

di il
13 risposte

[C++] Uscita dal while che non va

Salve, è il primo post sul forum, spero di non aver aperto un topic di cui si è già parlato in passato (ho cercato girando un po' le pag ed utilizzando il "cerca" ma non ho trovato niente di soddisfacente), e colgo l'occasione per salutare tutti.

Ho scritto un piccolo programmino che funge da convertitore °Celsius - °Fahrenheit tanto per fare pratica, ma riscontro in esecuzione un errore al do...while del case 3 dello switch, quello che richiede la conferma all'uscita. In sostanza, posso dare alla variabile exit qualsiasi carattere che nessuno di questi mi fa uscire dal ciclo, inclusi quelli che dovrebbero.
#include <iostream>

using namespace std;

int main()
{

        int operation;
        bool pass = true;
        char exit;
        double celsius, fahrenheit;

        cout << endl << "°F <--> °C by Pr0gMa v1.0" << endl << endl;

        do
        {
                cout << "1) °C to °F" << endl;
                cout << "2) °F to °C" << endl;
                cout << "3) Exit" << endl;

                cout << endl << "#: ";
                        cin >> operation;

                switch (operation)
                {   
                        case 1 : 
                                cout << endl << "°C #: ";
                                        cin >> celsius;
    
                                cout << "°F #: " << (9 * celsius) / 5 + 32 << endl << endl;

                                break;

                        case 2 : 
                                cout << endl << "°F #: ";
                                        cin >> fahrenheit;

                                cout << "°C #: " << (5 * (fahrenheit - 32)) / 9 << endl << endl;
    
                                break;

                        case 3 : 
                                do  
                                {   
                                        cout << endl << "Are you sure? [Y-y / N-n] $: ";
                                                cin >> exit;
                                                cin.ignore();

                                        if (exit == 'y' || exit == 'Y')
                                                pass = false;
                                }
                                while (exit != 'y' || exit != 'Y' || exit != 'n' || exit != 'N');

                                break;

                        default :
                                cout << endl << "Unknown operation, try again." << endl << endl;

                                break;
                }
        }
        while (pass);

        cout << endl << "Ok, bye!" << endl << endl;

        return 0;
}                                                                                          
Probabilmente l'utilizzo della variabile bool è un po' ridondante, ma lo lascio così per fare un po' di pratica. In ogni caso, questo è l'output del programma con il problema incriminato:
°F <--> °C by Pr0gMa v1.0

1) °C to °F
2) °F to °C
3) Exit

#: 3

Are you sure? [Y-y / N-n] $: y

Are you sure? [Y-y / N-n] $: Y

Are you sure? [Y-y / N-n] $: n

Are you sure? [Y-y / N-n] $: N

Are you sure? [Y-y / N-n] $: d

Are you sure? [Y-y / N-n] $: D

Are you sure? [Y-y / N-n] $: 3

Are you sure? [Y-y / N-n] $: 9

Are you sure? [Y-y / N-n] $: !

Are you sure? [Y-y / N-n] $: 
Insomma, non esce dal while... suggerimenti?
Grazie anticipatamente

13 Risposte

  • Re: [C++] Uscita dal while che non va

    Perchè hai usato un ciclo do while?
    io avrei fatto
    case 3:
     cout << endl << "Are you sure? [Y-y / N-n] $: ";
     cin >> exit;
    
    if (exit=="y"||exit=="y")
    {
    return 0;
    }
    else 
    {
    return main();
    }
    
    Semplice semplice xD
  • Re: [C++] Uscita dal while che non va

    Ho usato un ciclo while perché volevo trovare una soluzione che includesse l'utilizzo di una variabile booleana (sono alle prime armi col c++ e faccio scelte un po' artificiose tanto per vedere che succede ), cmq volendolo risolvere mantenendo il ciclo while...? Quel cin.ignore() dopo il cin >> exit l'avevo tolto, pensavo che il problema stesse nel solito \n che cin lascia in stream ma non è così, sembra.
  • Re: [C++] Uscita dal while che non va

    Semplicissimo.. in questo caso non devi utilizzare or || ma and &&
    testato e funzionante...
    cambia la condizione del while con questa:
    while (exit != 'y' && exit != 'Y' && exit != 'n' && exit != 'N');
  • Re: [C++] Uscita dal while che non va

    rumble94 ha scritto:


    Semplicissimo.. in questo caso non devi utilizzare or || ma and &&
    testato e funzionante...
    cambia la condizione del while con questa:
    while (exit != 'y' && exit != 'Y' && exit != 'n' && exit != 'N');
    o.O vero e io che ci sto perdendo la testa da 20 min ma con l'or non DOVREBBE funzionare lo stesso? perchè non va? >.<
  • Re: [C++] Uscita dal while che non va

    Teoricamente... stando alle tabelle di verità DOVREBBE funzionare lo stesso... ma proprio da poco mi è capitato di dover scrivere un proramma con lo stesso problema.. anche io usavo l'or al posto dell'and... poi ho provato con l'and e tutto funge XD
    non saprei spiegarti il perchè.. ma è così XD attendiamo il parere di uno piu' esperto di me

    ecco le tabelle di verità dell'and e dell'or:
    
    AND
    A 	B 	USCITA
    F 	F 	F
    F 	V 	F
    V 	F 	F
    V 	V 	V
    
    OR
    A 	B 	USCITA
    F 	F 	F
    F 	V 	V
    V 	F 	V
    V 	V 	V
  • Re: [C++] Uscita dal while che non va

    rumble94 ha scritto:


    Teoricamente... stando alle tabelle di verità DOVREBBE funzionare lo stesso... ma proprio da poco mi è capitato di dover scrivere un proramma con lo stesso problema.. anche io usavo l'or al posto dell'and... poi ho provato con l'and e tutto funge XD
    non saprei spiegarti il perchè.. ma è così XD attendiamo il parere di uno piu' esperto di me

    ecco le tabelle di verità dell'and e dell'or:
    
    AND
    A 	B 	USCITA
    F 	F 	F
    F 	V 	F
    V 	F 	F
    V 	V 	V
    
    OR
    A 	B 	USCITA
    F 	F 	F
    F 	V 	V
    V 	F 	V
    V 	V 	V


    quindi avevo ragione ad impazzirci
  • Re: [C++] Uscita dal while che non va

    Grazie rumble, finalmente funziona... anche se a dire la verità non riesco a coglierne molto il senso ! AND non dovrebbe essere l'operatore logico che restituisce vero se tutte le condizioni sono contemporaneamente vere? È strano perché non può valere due caratteri contemporaneamente...
    Penso che sia qualcosa che ha a che fare con i char, perché in un altro programma avevo scelto come tappo di un cin dentro un while il carattere x e anche lì non voleva saperne di funzionare, ed il codice era più o meno simile, del tipo while (char != 'x' ) {...}. Per caso il programma che ti dava lo stesso problema coinvolgeva una variabile char?
  • Re: [C++] Uscita dal while che non va

    AND non dovrebbe essere l'operatore logico che restituisce vero se tutte le condizioni sono contemporaneamente vere? È strano perché non può valere due caratteri contemporaneamente...
    ?!? perchè dici tutte vere ?!?
    
     ...
       while (exit != 'y' || exit != 'Y' || exit != 'n' || exit != 'N');
    ...
    
    se exit = 'Y' ---> VERO FALSO VERO VERO

    Edit:
    
    Aggiungo sull'esempio:
    VERO FALSO VERO VERO
    
    OR (Operatore logico disgiunzione)
    VERO || FALSO = VERO --> VERO || VERO = VERO --> VERO || VERO = VERO
    
    AND (Operatore logico congiunzione)
    VERO && FALSO = FALSO --> FALSO && VERO = FALSO --> FALSO && VERO = FALSO
    
  • Re: [C++] Uscita dal while che non va

    se exit = 'Y' ---> VERO FALSO VERO VERO
    Ok, "vere" non è proprio corretto. Diciamo "condizione verificata".

    Dopo averci pensato un po' su mi sono resto conto dell'errore. Il risultato di un'operazione composta in cui l'operatore sia AND risulta verificata se tutti le condizioni semplici (atomiche) sono verificate. Insomma se la condizione è:
    while (exit != 'y' && exit != 'Y' && exit != 'n' && exit != 'N');
    exit deve essere contemporaneamente diverso da 'Y', 'y', 'N' ed 'n' (deve essere ad es. 'Z', o 'z'). Se exit è 'y' la condizione di rimanenza nel ciclo non è più verificata perché c'è questa condizione semplice che sfasa il risultato dell'AND finale (con l'AND viene F V V V = F --> uscita). Probabilmente ciò che mi traeva in inganno era il != (con un == sarebbe stato più istintivo) , così risultava non verificata una sola espressione atomica e quindi la condizione di rimanenza, per le proprietà dell'OR, era ancora valida (con l'OR succede che F V V V = V --> reiterazione).
  • Re: [C++] Uscita dal while che non va

    Guarda il post precedente che ti ho aggiunto qualcosa!
    Edit:

    Studia quì:
    e scrivi degli esempi
    
    #include<stdio.h>
    #define show(x) ((x)?("Vero"):("Falso"))
    int main()
    {
    
      int t1,t2,t3,t4;
      char ans;
      
      scanf ("%c",&ans);
      t1=(ans!='s');
      t2=(ans!='n');  
      t3=((ans!='s') || (ans!='n'));
      t4=((ans!='s') && (ans!='n'));
      
      printf ("t1=%s t2=%s t3=%s t4=%s\n",show(t1),show(t2),show(t3),show(t4));
      
      return 0;
    }
    
    
  • Re: [C++] Uscita dal while che non va

    Abbiamo scritto più o meno la stessa cosa, probabilmente mentre editavi ho realizzato Cmq grazie a tutti per l'interessamento
  • Re: [C++] Uscita dal while che non va

    Eravate in 3 a non capire. Il mio esempio non vale solo per OP ma anche per gli altri
  • Re: [C++] Uscita dal while che non va

    ixamit ha scritto:


    Eravate in 3 a non capire. Il mio esempio non vale solo per OP ma anche per gli altri
    io considero sempre l'OR come un oppure e non come operatore logico (non linciatemi! ) grazie della lezione
Devi accedere o registrarti per scrivere nel forum
13 risposte