Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con cin.fail...forse!
Forum - C/C++ - Problema con cin.fail...forse!

Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 17:03
Venerdì, 26/02/2010
Riprendo l'esempio di qualche giorno fa:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Operazione
  5. {
  6.     private:
  7.         int x;
  8.         int y;
  9.         char operatore;
  10.  
  11.         int addizione ();
  12.         int sottrazione ();
  13.     public:
  14.         Operazione ();
  15.  
  16.         int risultato ();
  17.  
  18.         void setx (int a);
  19.         void sety (int b);
  20.         bool setOperazione (char operazione);
  21.         bool setAll (int a, char op, int b);
  22. };
  23.  
  24. int main() {
  25.     int controllo = 0;
  26.  
  27.     while (!controllo) {
  28.         char operatore;
  29.         int a, b;
  30.         Operazione op;
  31.         cout << "Insere il calcolo da eseguire nella forma <primo numero> <operatore> <secondo numero>\n>> ";
  32.         cin >> a >> operatore >> b;
  33.         if (!op.setAll (a, operatore, b))
  34.         {
  35.             cout << "Errore operatore\n";
  36.             continue;
  37.         }
  38.         if (cin.fail())
  39.         {
  40.             cout<< "Errore nel dato di input!" <<endl;
  41.             cin.clear();
  42.             cin.ignore(20,'\n');
  43.             continue;
  44.         }  
  45.         cout <<"Risultato: " << op.risultato() << endl;
  46.         cout <<"Voui eseguire altre operazioni?" << endl;
  47.         cout <<"Premi 0 per continuare, qualsiasi altro numero per uscire!" << endl;
  48.         cin >> controllo;
  49.     }
  50.     return 0;
  51. }
  52.  
  53. Operazione::Operazione() {
  54.     x = y = 0;
  55.     operatore='+';
  56. }
  57.  
  58. int Operazione::addizione() {
  59.     return (x + y);
  60. }
  61.  
  62. int Operazione::sottrazione() {
  63.     return (x - y);
  64. }
  65.  
  66. int Operazione::risultato () {
  67.     if (operatore == '+')
  68.         return addizione();
  69.     else
  70.         return sottrazione();
  71. }
  72.  
  73. void Operazione::setx(int a) {
  74.     x = a;
  75. }
  76.  
  77. void Operazione::sety(int b) {
  78.     y = b;
  79. }
  80.  
  81. bool Operazione::setOperazione (char operazione) {
  82.         if (operazione != '-')
  83.             if (operazione != '+')
  84.                 return false;
  85.         operatore = operazione;
  86.         return true;
  87. }
  88.  
  89. bool Operazione::setAll(int a, char op, int b) {
  90.         setx(a);
  91.         sety(b);
  92.         return setOperazione (op);
  93. }


Ho inserito un controllo sui caratteri nel main.
Uso cin.fail()per verificare se è stato inserito un carattere diverso da quello dichiarato.Se effettivamente è stato inserito un carattere la funzione cin.fail ritorna true,quindi si entra nel if,si stampa "errore nel dato di input",chiamo cin.clear() per ripristinare lo stato corretto dello stream di input e chiamo cin.ginore() per svuotare lo stream di input.Con il continue vengono ignorate le istruzioni successive ma non il controllo della condizione di test del ciclo (while).
Ora,il mio problema è questo:il programma funziona anche sul test del carattere,però se come primo test eseguo "3 + k" tutto ok,se invece inserisco "k + 3"...va in palla!
E va in palla anche dopo una serie di test andati a buon fine.
Mi sapreste dire come'è possibile?????

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:55
Venerdì, 26/02/2010
Ho letto il tuo programma, e devo dire che non ho capito molto la funzione int main().

(La funzione fail() si usa per le operazioni di letture e scritura di file, almeno credo)

Non ho capito nemmeno la modalità del controllo. In questi casi, i dati di input si salvano in una stringa, e successivamente si fa la conversione numerica.



Nulla va più veloce della luce, quindi rilassati.
PM Quote