Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38

    [c++] Problema nel controllo di un valore

    Salve a tutti!

    Non riesco a capire il comportamento che si verifica quando cerco di eseguire il controllo dell'input di un semplice numero intero...
    Non voglio usare le eccezioni.. (essendo principiante è un'argomento che ancora non ho affrontato)..

    Pensavo di cavermela in questo modo:
    Codice PHP:
    #include <iostream>

    using namespace std;

    int value;

    int main() {

        while(
    true) {
            
    cout << "Type a number: ";
            if(!(
    cin >> value))
                break;
        }

        
    cout << "Errore!\n";

        return(
    0);


    In questo caso se ad esempio si dovesse verificare l'immissione di un carattere anziché un numero, chiude il ciclo e stampa il messaggio d'errore!

    Ma se io non volessi interrompere il ciclo, avvisare dell'errore e ripetere il ciclo sino a quando il valore è inserito correttamente, ho pensato di cavarmela in questo modo:

    Codice PHP:
    #include <iostream>

    using namespace std;

    int value;

    int main() {

        while(
    true) {
            
    cout << "Type a number: ";
            if(!(
    cin >> value))
                
    cout << "Error!\n";
            else
                break;
        }

        
    cout << "Number is: " << value << '\n';

        return(
    0);


    Ma questa volta non me la sono cavata molto bene.. poiché alla pressione di un carattere (e dopo l'invio ovviamente).. succede il delirio.. ovvero il ciclo ricomincia da capo, stampa il messaggio "Type a number: ", ma questa volta non aspetta l'immissione del valore ma ricomincia nuovamente il ciclo da capo.. come se fosse infinito!!
    Come mai si comporta così?
    Pensavo che ad ogni modo avesse aspettato l'immissione di un nuovo valore invece... no..
    Devo abbandonare questo ragionamento ?
    Il problema è che non riesco ad aspettare le eccezioni... (ancora lontane) e l'idea che si possa verificare un errore mi fa saltare un pò i nervi..

    Grazie ancora!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    444
    Secondo me c'è qualche problema anche a livello di algoritmo... però non ricordo bene se la cin dia effettivamente in uscita uno 0 quando viene inserito un valore errato, ma non ricordavo una cosa del genere.
    Ad ogni modo, prova a scrivere i cicli in modo più carino, senza quei break che se no se passa qualche persona serissima ci sviene sul colpo e non lo riprendiamo più...
    *********************************
    Andrea
    *********************************

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Ciao,
    A dire il vero ho provato a consultare il libro sul quale sto 'studiando', e sinceramente non dice se la cin restituisce zero in caso di errore...

    Poi credo di non conoscere altri modi per terminare un ciclo, intendi che devo chudere i cicli con return; ?

    In ogni caso il metodo che ho usato è 'casalingo', ma sarà sicuramente errato...
    però non capisco perchè si comporta così, se l'istruzione riceve un dato errato viene saltata e si chiude il programma (questo quando non c'è un ciclo) con il ciclo invece mi trovo costretto a terminarlo altrimenti succede quello che ho anche detto sopra.. non capisco...

    dove sto sbagliando ?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    444
    Dal punto di vista "stilistico" conviene mettere una condizione sensata sul ciclo ed evitare return e break all'interno, questo contribuisce ad una programmazione più strutturata.
    Per l'algoritmo di per sé, sarò abbastanza franco: scrivendo un programma console non ho mai prestato particolare attenzione al fatto che l'utente inserisca un carattere al posto di un numero, o meglio, accettavo che in caso contrario il programma "scoppiasse".
    Sinceramente non ho mai provato neppure con i blocchi try...catch, quindi non ti saprei dare un aiuto diretto.
    Il metodo che usavo quando lavoravo in Assembly era di leggere tutto come una stringa, poi farmi le conversioni che mi servivano. Ad esempio, leggi una stringa e poi usi la funzione atoi() per tentare una conversione in numero. In questo modo la lettura non darà mai errori e l'atio() di certo non scoppia se gli passi una stringa senza numeri, al massimo dà 0.
    *********************************
    Andrea
    *********************************

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Devi usare il metodo clear e l'ignore ...

    codice:
      if(!(cin >> value)) 
      {
         cout << "Error!\n"; 
         cin.clear();
         cin.ignore(100, '\n');
      }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    444
    cin.clear() è come la fflush del C??
    *********************************
    Andrea
    *********************************

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Squall1988
    cin.clear() è come la fflush del C??
    No ... la fflush e' assimilabile alla ignore ... la clear serve a resettare la condizione d'errore ...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    444
    io però ricordo che con la ignore avevo non pochi problemi se dovevo leggere dati dopo la stringa...
    *********************************
    Andrea
    *********************************

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ovvero?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    22
    Originariamente inviato da oregon
    Devi usare il metodo clear e l'ignore ...

    codice:
      if(!(cin >> value)) 
      {
         cout << "Error!\n"; 
         cin.clear();
         cin.ignore(100, '\n');
      }
    Scusate l'intromissione sono un alle primissime armi con il C/C++ ed ho notato che il codice suggerito funziona egregiamente ma, purtroppo, non si ha il totale controllo d'inserimento di SOLI numeri, in quanto se si inserisce un numero seguito da una lettera, salta il controllo - lo considera come se si avesse inserito un intero.

    Grazie dell'attenzione.
    Marco.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.