Newsgroup: it.comp.lang.c++
Titolo: come posso verificare un dato in ingresso se è valido in C++?

Salve a tutti, sono uno dei tanti che per la prima volta mette le mani sul 
c++ per puro caso e se ne innamora...
Ho iniziato da poco piu di 20 giorni e quindi ho tantissimi dubbi, ma per 
ora non vi assillo e volo basso con le richieste! ;-)
Per ora le mie domande sono 2:
1)
Vorrei sapere se è possibile controllare se un dato in ingresso rispetta il 
valore appropriato al tipo di variabile.
Mi spiego meglio...
dovendo immettere il valore di  una variabile di tipo int col classico 
"cin>>" come potrei fare a controllare che il valore immesso sia 
effettivamente di tipo int? vorrei fare in modo che se ad esempio si digita 
(ammettiamo per errore) un carattere o un reale al posto di un intero il 
programma compia poi un'istruzione. (ad esempio la stampa a video di un 
messaggio di errore).
Esempio:
 {
  int x;
  ...
  cin>>x;
  if  x non è un intero
  cout<<"ERRORE";
  ...
  }
2)
Vorrei mettere alla fine del programma l'opzione
"si desidera rieseguire il programma? [S/N]" e vorrei che si possa 
rispondere appunto digitando  "S" oppure "N" senza poi dopo dover dare per 
forza il comando invio e fare in modo che se si digita qualunque altro tasto 
non accada niente.
Spero di essermi fatto capire, se avete domande da fare per capire meglio 
non preoccupatevi, ancora non mi sono appropriato della dialettica da 
programmatore! ;-)
Dimenticavo... uso DevC++ 4.9.9.0 sia su winXP  che su WinME
Grazie a tutti quelli che mi vorranno dare una mano!
Ciao! 

 Ciao!
Figurati, eccoti accontentato.
#include <iostream>
#include <string>
int main()
{
        bool ripeti_esecuzione=true;
        while(ripeti_esecuzione) // ripete fino a quando è true
        {
                int x;
                std::cout << "Inserisci un numero ? ";
                std::cin >> x;
                if (std::cin.fail()) // se c'è un'errore nell'input
                {
                        // leggiamo una stringa di caratteri
                        std::cin.clear();
                        std::string a;
                        std::cin >> a;
                        std::cout << "Errore, non dovevi scrivere " << a <<
std::endl;
                }
                // di seguito il resto del programma...
                // ora chiediamo se si vuole rieseguire il programma...
                for(char c='\0';c!='s' && c!='n';)
                {
                        std::cout << "Si desidera rieseguire il programma ?
[s/n] ";
                        std::cin >> c;
                        // se la risposta e' no allora facciamo terminare il
                        // ciclo while...
                        if (c=='n') ripeti_esecuzione=false;
                }
        }
        std::cout << "Il programma termina!";
        std::cout << "\nPREMI INVIO...";
        std::cin.ignore();
        std::cin.get();
        return 0;
}
Il programma pone un flag a true ed esegue codice all'interno di un ciclo
while finche il flag ha valore true.
All'interno del ciclo ci mettiamo il codice che intendiamo eseguire, tu hai
chiesto di leggere un numero e verificare se ci sono errori (tipicamente
dovuti all'immissione di caratteri ad una richiesta di valori numerici), io
ho aggiunto anche la lettura della stringa ma non era necessario.
Poi c'è una lettura di un carattere 's' o 'n' che può cambiare lo stato del
flag, in particolare 'n' pone il flag a false in modo che il ciclo while non
produca una nuova iterazione.
Alla fine c'è altro codice che ho aggiunto per chiudere il programma con un
messaggio d'uscita.
Se qualcosa non ti dovesse risultare chiaro chiedi pure...
Ciao e in bocca al lupo per i tuoi studi sul C++.
Paolo.


Buon studio.
FabioMDF
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 std::cin >> c;
Anche qui devi fare i controlli di "std::cin.good()" magari in una "if".

FabioMDF


Grazie mille per le esaurientissime risposte, mi piace il modo con cui 
aiutate le persone, le portate a capire, a ragionare, senza dare loro la 
pappa pronta! Complimenti!
in questi  giorni proverò a mettere in atto quanto da voi consigliato, spero 
fili tutto liscio;-)
Vi pasto il codice del programmino che stavo provando a fare in modo da 
farvi capire meglio le intenzioni che avevo e magari scovare qualche errore 
a me sfugito!. E' il mio secondo programmino, quindi non ridete troppo per 
la stupidità dello stesso ;-))
//Programma che calcola la media oraria
#include <iostream>
#include <cstdlib>
using namespace std;
void testata()
{
system ("cls");
cout<<"\n";
cout<<"#####################################################\n";
cout<<"####                                             ####\n";
cout<<"####  PROGRAMMA CHE RESTITUISCE LA MEDIA ORARIA  ####\n";
cout<<"####                                             ####\n";
cout<<"#####################################################\n\n\n";
}
int main ()
{
double ore,minuti,distanza;
char scelta;
testata();
cout<<"  Il programma vi chiedera' di inserire prima le ore  \n";
cout<<"     poi i minuti e in fine la distanza percorsa      \n";
cout<<"          per ricavarne la media oraria               \n";
cout<<"\n\n\n\n\n\n\n\n";
system ("PAUSE");
do
{
testata();
cout<<"inserire le ore impiegate \n-------->";
cin >> ore;
do
{
testata();
cout<<"inserire i minuti impiegati \n-------->";
cin >> minuti;
if(minuti>=60||minuti<0)
{
cout<<"\n\n\a";
cout<<"              ****ATTENZIONE****\n\n";
cout<<"il valore dei minuti deve essere compreso tra 0 e 59\n\n\n\n";
system ("PAUSE");
}
}
while(minuti>=60 || minuti<0);
testata();
cout<<"inserire la distanza percorsa espressa in Km. \n-------->";
cin >> distanza;
system ("cls");
double ore2 = (ore*60);
testata();
cout<<"          la media oraria per percorrere\n \n      " << distanza <<" 
Km in "
<< ore << " ore e " << minuti << " minuti e' stata di \n\n          -----  
"
<< (distanza/(ore2+minuti))*60 <<" Km/h.   -----\n\n\n";
do
{
cout<<"\nSI DESIDERA RIESEGUIRE IL PROGRAMMA? [S/N]\n\n-------->";
cin>>scelta;
}
while (scelta!='s'&&scelta!='S'&&scelta!='N'&&scelta!='n');
}
while(scelta=='s'||scelta=='S');
return 0;
}
Per quel che riguarda il manuale ancora non l'ho comprato data la vasta 
scelta di testi che c'è in commercio e non volendo effettuare un acquisto 
sbagliato volevo rendermi prima un po conto di quello di cui effetivamente 
avevo bisogno.
Purtroppo il mio inglese è un po scarsino e quindi mi devo "accontentare" di 
testi in italiano.
Vi terrò aggiornati, ancora GRAZIE 1000! :-))
Ciao


E' stata un po' una delusione vedere che non hai implementato nessuno dei
tests che ti abbiamo consigliato io e Paolo. Prova e se c'è qualcosa che
ancora non ti è chiaro scrivi ancora.
Buon lavoro,
fabiomdf


 ancora non ti è chiaro scrivi ancora.
Non prendetela come delusione:-(((... solo che prima di mettere in atto i 
vostri consigli volevo capire bene quello che andavo a fare... sto cercando 
di reperire sul web un po di informazioni(non avendo ancora il manuale).
E' la prima volta infatti che mi trovo a usare i "comandi?" che mi avete 
suggerito.. e fare un copia e incolla non mi sarebbe stato di nessuna 
utilità.
Ignoro infatti il perchè del "std::" avanti ai vari "cout" e "cin", cosi 
come altre parti di codice che mi avete passato, purtroppo sono un 
autodidatta e quindi oltre a voi non ho nessuno che mi spieghi un po come 
funzionano le cose.
Comunque ho provato a implementare un po del vostro codice, ma mi ha dato 
parecchi errori e warning dovuti sicuramente a errori macroscopici miei che 
nella mia ignoranza in materia non riesco a vedere!
Proverò da solo a cercare di capire dove sbaglio, se proprio non dovessi 
riuscirci mi ritroverete qui a implorare pietà! ;-)
Approfitto di questo reply per presentarmi un po (come netiquette richiede) 
visto che passerò parecchio tempo in vostra compagnia.
Mi chiamo Francesco, ho 25 anni e sono di Napoli. diplomato sia come maestro 
d'arte e sia come ragioniere, per ora lavoro come investigatore privato 
presso un'agenzia partenopea e sono in attesa di trovare qualcosa di piu 
"stabile". Nella vita sono 4 le cose che amo...Le moto, Il mangiare/bere 
bene, le donne e il PC! Quest'ultima e una passione che mi porto dentro fin 
da bambino, iniziai col "mitico" Vic20 per poi passare di gradino in gradino 
fino al mio attuale P4. Da sempre ho avuto un po la mania di impartare un po 
di programmazione (iniziando dal Basic), ma forse data la "tenera" età 
lasciavo sempre le cose a metà non appena incontravo qualche problema per 
poi dedicarmi al gioco! Per ora ne ho provati 3/4 tra cui anche un po di 
linguaggio HTML come un po tutti gli "internettiani". Il C++ mi sta 
prendendo parecchio e spero di non trovare barriere insormontabili, anche se 
a detta di molti avrei dovuto iniziare dal semplice C per poi passare al 
C++.. beh.. vedremo chi aveva ragione!
Per ora vi ho ammorbato abbastanza ;-), spero di farvi avere buone notizie 
sull'esito delle implementazioni da voi suggerite!
Grazie di nuovo a tutti!
Ciao e a presto!


Buon studio,
