PDA

View Full Version : [C++] immissione dati


Dr_Kranz
07-04-2005, 16:07
salve a tutti, avrei una domandina probabilmente abb stupida.... riguarda l'immissione di dati da parte dell'utente.

allora, se il mio programma sta aspettando un input di tipo int e l'utente inserisce un decimale o altro, il programma ovviamente sballa. come "forzare" l'immissione dei dati giusti? io ci ho pensato un po', e nella mia niubbiaggine ho pensato che gli operatori di cast potrebbero risolvere (in parte) il problema... ma mi chiedevo qual'era l'espediente usato in questi casi dai "pro" :p thx

DanieleC88
07-04-2005, 18:52
Con cosa stai facendo la lettura dei dati?

pela
07-04-2005, 18:53
prova se così funge:
#include <iostream>
using namespace std;

int main(){
int i;
while(1) {
cout<<"Inserisci un numero: ";
cin>>i;
if(cin)
break;
cin.clear();
cin.ignore(1000,'\n');
};
cout<<"Hai inserito "<<i<<endl;
return 0;
}

Dr_Kranz
07-04-2005, 19:10
Originariamente inviato da DanieleC88
Con cosa stai facendo la lettura dei dati?


da console al momento

DanieleC88
07-04-2005, 19:14
Originariamente inviato da Dr_Kranz
da console al momento
Si, vabbe', ma intendevo dire: "Cosa chiami per ricevere dati?" Forse "cin >> i", come suggeriva pela? Prova con "fscanf(stdio, "%d", &variabile_intera);". È molto da C, piuttosto che da C++, ma dovrebbe andare bene.

Bye!

Dr_Kranz
07-04-2005, 19:17
Originariamente inviato da pela
prova se così funge:
#include <iostream>
using namespace std;

int main(){
int i;
while(1) {
cout<<"Inserisci un numero: ";
cin>>i;
if(cin)
break;
cin.clear();
cin.ignore(1000,'\n');
};
cout<<"Hai inserito "<<i<<endl;
return 0;
}



allora, vediamo se riesco a capire :p

in pratica tu finchè nn inserisci un dato accettabile rimane nel while. ad ogni iterazione, se non si è verificata la corretta immissione del dato, ignori quello che è stato immesso e ripeti il ciclo. non riesco a capire quel cin.ignore(1000,'\n'); però...

mi è venuta in mente una cosa: un throw funzionerebbe? qualcosa tipo



try{
int x;
cin>>x;
if (!cin)
throw (x);
}
catch(double x) {
cout<<"il dato"<<x<<"non è accettabile"<<endl;
}



funzionerebbe?

Dr_Kranz
07-04-2005, 19:19
Originariamente inviato da DanieleC88
Si, vabbe', ma intendevo dire: "Cosa chiami per ricevere dati?" Forse "cin >> i", come suggeriva pela? Prova con "fscanf(stdio, "%d", &variabile_intera);". È molto da C, piuttosto che da C++, ma dovrebbe andare bene.

Bye!


ah sì, scusa, ovviamente è il cin>>i

purtroppo nn ho familiarità con i comandi C, almeno è da molto tempo che nn li uso più... scanf %d ok, ma &variabile_intera?

DanieleC88
07-04-2005, 22:55
Quella serve solo a dire a fscanf che deve inserire il valore numerico appena letto nella variabile puntata da "variabile_intera", dove "variabile_intera" è il nome della variabile di tipo int.

Dr_Kranz
08-04-2005, 07:14
ah ok, purtroppo come ho detto ho poca familiarità coi comandi c, ho sempre lavorato con l'iostream (o con fstream)... in pratica a scanf gli passi gli argomenti come fosse una funzione?

cionci
08-04-2005, 08:10
fscanf risolverebe il problema ? Non mi sembra...

Dr_Kranz
08-04-2005, 08:40
ma il throw-catch funzionerebbe o come penso sballerebbe uguale perchè è legato al tipo int? (throw int -> catch int e non catch double)

cionci
08-04-2005, 08:57
if (!cin)
throw (x);
}

Una cosa del genere funziona comunque se ci sono stati problemi di lettura...

Dr_Kranz
08-04-2005, 09:05
si ma la questione è, catch(x), deve/può essere catch(double x) o deve essere catch(int x)? perchè in quest'ultimo caso sballerebbe cmq

cionci
08-04-2005, 11:42
Gli puoi far lanciare l'eccezione che ti pare...

Ad esempio:

if (!cin)
throw (string("Errore nell'immissione dei dati"));
...
catch(string &e)
{
cerr << e << endl;
}

Dr_Kranz
08-04-2005, 12:17
aaaah avevo capito che throw(x) dovesse essere legato alla variabile che causava l'eccezione :D

DanieleC88
08-04-2005, 16:17
Originariamente inviato da cionci
fscanf risolverebe il problema ? Non mi sembra...
Potrebbe, credo: se il problema è un numero decimale, passando "%d" a fscanf lo forzerebbe a leggere un intero (verrebbe convertito, no?).
...o forse sbaglio? Andavo a memoria, e fscanf non lo uso da parecchio (non interagisco molto conl'utente, io :))(anche perché l'unico utente dei miei programmi sono proprio io :D).

Anyway... perdonatemi, il fatto è che non sono molto esperto di C++.

cionci
08-04-2005, 16:31
Certo...ma passagli delle lettere ;)

DanieleC88
08-04-2005, 16:46
Originariamente inviato da cionci
Certo...ma passagli delle lettere ;)
E vabbe', mo vuoi troppo :D
Bye bye (e scusa, Dr_Kranz, ti stavo facendo sbagliare :(, ma non lo sapevo)!