Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] Errore digitazione e reinserimento dati.

    Ragazzi ho questo programma:

    codice:
    #include <iostream>
    using namespace std;
    int main()
    {
    double next;
    double highest;
    cout << "Please enter the temperature values:\n";
    if (cin >> next)
    highest = next;
    else
    {
    cout << "No data!\n";
    return 1;
    }
    while (cin >> next)
    {
    if (next > highest)
    highest = next;
    }
    cout << "The highest temperature is " << highest << "\n";
    return 0;
    }
    chiede di inserire delle temperature e poi se si preme una lettera ti dice quella piu alta, però se all'inizio premi subito la lettera di dice no data! e si chiude il programma.

    come posso modificare il programma per far si che se alla prima scelta mettendo la lettera invece di chiudersi il programma dopo il no data mi richieda di reinserire la temperatura di nuovo? so che si fa con i cicli while (penso) ma come? non ci riesco, ci giro in torno ma niente, vorrei che teoricamente all'inifinito se io alla prima richiesta scrivessi sempre lettere il programma all'infinito mi avverte che ho sbagliato e mi richieda di reinserire la temperatura.

    grazie mille a chi mi saprà aiutare!

  2. #2
    qualcuno che mi aiuti?

  3. #3
    Quando inserisci una lettera e cerchi di leggere come numero lo stato dello stream viene impostato a fail, e i caratteri "errati" rimangono nel buffer di input. Pertanto devi ripristinare lo stato dello stream (cin.clear()), svuotare il buffer dai caratteri errati (cin.ignore(numeric_limits<streamsize>::max(),'\n' );) e tornare a prima dell'inserimento (cosa che puoi fare facilmente con un while e un flag).

    Per evitare tutta questa trafila ho scritto queste funzioni template che si smazzano da loro il problema; metti questo codice in un file a parte, diciamo AcquireInput.hpp
    codice:
    #ifndef ACQUIREINPUT_HPP_INCLUDED
    #define ACQUIREINPUT_HPP_INCLUDED
    
    #include <iostream>
    #include <limits>
    #include <string>
    
        template<typename InType> void AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString, InType & Result)
        {
            do
            {
                Os<<Prompt.c_str();
                if(Is.fail())
                {
                    Is.clear();
                    Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                }
                Is>>Result;
                if(Is.fail())
                    Os<<FailString.c_str();
            } while(Is.fail());
        }
    
        template<typename InType> InType AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString)
        {
            InType temp;
            AcquireInput(Os,Is,Prompt,FailString,temp);
            return temp;
        }
    
        /* Usage example: 
    
            //1st overload
            int AnInteger;
            AcquireInput(cout,cin,"Please insert an integer: ","Invalid value.\n",AnInteger);
    
            //2nd overload (more convenient, in this case)
            int AnInteger=AcquireInput(cout,cin, "Please insert an integer: ","Invalid value.\n");
        */
        
    #endif
    e #includilo nel tuo sorgente; potrai quindi usare le funzioni in questione come da esempi (ci passi cout come stream di output, cin come stream di input, il messaggio di "richiesta dati" come terzo argomento e quello di errore come quarto).
    Amaro C++, il gusto pieno dell'undefined behavior.

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.