PDA

View Full Version : [c++] controllo input


carugo
01-09-2014, 16:14
Ciao a tutti
#include <cstdlib>
#include <iostream>

using namespace std;

const int MAX_FIUMI = 300;
const int MAX_CITTA = 100;

int FiumiCitta [MAX_FIUMI] [MAX_CITTA] ;


void CaricaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{


for (int fiumi=0; fiumi<n_fiumi; fiumi++)
for (int citta=0; citta<n_citta; citta++)
{
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)

cout <<" Errore inserire 1 o 0" <<endl;

}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);




In questa funzione vorrei avere il controllo dell input da tastiera se inserisco dei numeri che non sono 1 o 0 mi da errore e ripete il ciclo tutto bene,ma se inserisco una lettera il programma va in loop.....

TNX a tutti

Freaxxx
01-09-2014, 17:44
riporta un esempio completo, incluso il main e un esempio di input per la tua funzione .

vendettaaaaa
01-09-2014, 18:30
Tempo fa avevo pensato un po' a come fare, ma non ricordo la soluzione che avevo scelto. A pensarci un po' sbrigativamente, e contando che non tocco il C++ da un po', ho tirato fuori questo:
#include <iostream>
#include <string>

using namespace std;

int read_int_from_console()
{
READ:
string in;
cin >> in;

try
{
return stoi(in); // stoi converte una string ad int; se non riesce, lancia eccezione
}
catch (exception ex)
{
cout << "string " << in << " couldn't be cast to int!!" << endl << endl;
goto READ;
}
}

int main()
{
cout << "Enter an integer number." << endl;

int n = read_int_from_console();
cout << "You entered: " << n << endl << endl;

return 0;
}


Premesso che ti serve un compilatore abbastanza aggiornato (gcc 4.7 o più nuovo, mingw 4.7 o più nuovo, Visual Studio 2012 o più nuovo) per poter usare la funzione stoi, l'idea è leggere una stringa e tentare la conversione ad intero, intercettando le eccezioni che farebbero partire il loop.
Problema: se scrivi 12asdas in console, ti viene restituito 12 anzichè dare errore. Soluzione: pensaci tu, questa risposta è solo un suggerimento sulla strada da percorrere :D

Silvia2003
02-09-2014, 08:47
Nel caso suggerirei questa variante che evita il 'GOTO'.



int read_int_from_console() {
int ret;
string in;
bool loop = false;
while(!loop) {
cin >> in;
try {
ret = stoi(in);
loop = true;
}
catch (exception ex) {
cerr << "Error!" << endl;
}
}
return ret;
}

carugo
02-09-2014, 10:27
Grazie a tutti per le risposte questo è l 'intero codice

#include <cstdlib>
#include <iostream>

using namespace std;

const int MAX_FIUMI = 300;
const int MAX_CITTA = 100;

int FiumiCitta [MAX_FIUMI] [MAX_CITTA] ;


void CaricaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{


for (int fiumi=0; fiumi<n_fiumi; fiumi++)
for (int citta=0; citta<n_citta; citta++)
{
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)

cout <<" Errore inserire 1 o 0" <<endl;

}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);

}

}

void StampaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
{
cout << endl << "Situazione per il fiume" <<fiumi +1 <<": ";

for (int citta=0; citta<n_citta; citta++)
cout <<FiumiCitta [fiumi] [citta];


}

}

void CaricaPerCitta (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int citta=0; citta<n_citta; citta++)
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
{
cout <<endl <<" Inserire 1 se la citta " <<citta +1<<
" e' bagnata dal fiume " <<citta +1 << " ,0 se non e' bagnata ";
cin >>FiumiCitta [fiumi] [citta];
}

}

int main(int argc, char *argv[])
{
CaricaPerFiume (FiumiCitta,3,2);
//CaricaPerCitta (FiumiCitta,3,2);
//StampaPerFiume (FiumiCitta,3,2);

cout <<endl;

system("PAUSE");
return EXIT_SUCCESS;
}


da neofita pensavo che il seguente codice
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)

cout <<" Errore inserire 1 o 0" <<endl;

}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);


avrebbe risolto il problema anche con simboli ,lettere......proverò vostre soluzioni

TNX A TUTTI