PDA

Visualizza la versione completa : [C/C++] Utilizzo delle eccezioni su input di valori numerici


Ol3iconfini
06-05-2006, 00:29
Salve, ho il seguente problema.
Nel codice che implementa un algoritmo per grafi la mia applicazione richiede l' immissione del numero di vertici che si vuole abbia il grafo.
Ovviamente se invece di un intero l' utente malizioso immette un carattere l' applicazione va in bomba...
Come posso fare?
Avevo pensato all' utilizzo delle eccezioni, però non trattandosi di una funzione non so come fare.
Vi posto il codice. Grazie per le risposte.


.
.
int n;
cout << " Prima di accedere al menu, inserisci il numero di vertici del grafo: ";
cin >> n;
cout << endl;


Come posso fare un controllo sul tipo??

pablo1986
06-05-2006, 02:02
potresti usare la funzione
atol che converte un vettore di caratteri in un numero
esempio:
char buffer[100];
int numero;
cout<<"inserisci un numero"<<endl;
cin.getline(buffer,10);
numero=atol(buffer);



atol restituisce zero se il vettore che legge non è un numero.....

Ol3iconfini
06-05-2006, 20:01
Innanzitutto grazie mille per la risposta!
Ho seguito il tuo consiglio e ho risolto il problema! :unz:
Ma adesso ho provato a utilizzare lo stesso criterio per altri casi simili, ti spiego:
Una volta immesso il numero di vertici del grafo, nel menu c'è l' opzione di inserimento di un nuovo arco. Si inserisce il primo nodo, si inserisce il secondo nodo e poi si inserisce il peso dell' arco.
Se ci sono 5 vertici essi sono nominati come 0 1 2 3 4.
Quindi se si vuole un arco che collega i vertici 0 e 4 si immetteranno i valori 0 e 4.
Quindi avevo bisogno dello stesso controllo del tipo per evitare l' immissione di caratteri.
Però utilizzando il tuo suggerimento ho qualcosa di questo tipo:
immettere primo vertice: //qui salta e va direttamente a
immettere secondo vertice:

Come posso fare??
Ti posto il semplice codice in questione!


int v1;
int v2;
int w;
cout << " Inserisci il primo vertice: "; //ho provato a utilizzare
//cout<<"inserisci un numero"<<endl;
//cin.getline(buffer,10);
//v1=atol(buffer); ma non funge
cin >> v1;
cout << endl;
cout << " Inserisci il secondo vertice: ";
cin >> v2;
cout << endl;
cout << " Inserisci il peso dell'arco " << "(" << v1 << "," << v2 << "): ";
cin >> w;
cout << "\n";
G.inserisci_arco(v1, v2, w);





Spero tu possa darmi una mano! :ciauz:

pablo1986
06-05-2006, 20:37
tu nell'inserire il primo vertice devi quindi mettere uno "0" giuso?

Ol3iconfini
07-05-2006, 00:11
Non necessariamente. Se i vertici sono 0 1 2 3 posso immettere uno di questi valori. :ciauz:

Ol3iconfini
07-05-2006, 20:43
Niente!? :cry: :cry: :cry:

pablo1986
08-05-2006, 16:00
ovviamente nel codice che hai postato devi anche dichiarare
char buffer[100];

char buffer[100];
int v1;
int v2;
int w;
cout << " Inserisci il primo vertice: "<<endl; //ho provato a utilizzare
cin.getline(buffer,5);
v1=atol(buffer);
if(v1==0){
cout<<"Errore,non hai inserito un numero"<<endl;
exit(1);
}
cout << " Inserisci il secondo vertice: "<<endl;

e cosi' via....

potrebbe uscirti qualche errore se prima di chiedere il primo vertice usi un cin....fammi sapere
cmq ricorda che se il valore che vuoi mettere è 0 allora la funzione atol nn ti è piu' di aiuto perchè ovviamente restituirà a v1 uno 0 che pero' ,nel caso del nostro codice, è previsto come situazione di errore

Ol3iconfini
08-05-2006, 16:30
Allora se ho ben capito la funzione atol converte un vettore di caratteri in un long restituendo zero se il vettore che legge non è un numero. Il problema è che 0 è un valore valido che non deve essere codificato come errore.
Ti spiego, se volessi l' arco che collega i vertici 0 e 4 dovrei inserire il valore 0, che però porterebbe al fallimento col controllo v1==0.
Per cui avrei bisogno di un valore che non possa essere codificato con uno dei vertici del grafo, che ti ricordo può essere qualsiasi numero naturale maggiore o uguale a 0...
Per cui mi servirebbe una funzione che controlli il tipo, ovvero se si immette un carattere invece che un intero, oppure una funzione che converta il carattere in un valore negativo che non può essere mai un vertice. Se un carattere fosse convertito in -1, ad esempio non ci sarebbero problemi perché nessun vertice può essere -1.
TI ricordo che se i vertici sono 5 la loro codifica è 0 1 2 3 4.
Aspetto i tuoi preziosi consigli :ciauz:

pablo1986
08-05-2006, 16:43
bhe allora in questo caso potresti sempre dichiarare un vettore di caratteri
una volta acquisito in tale vettore la tua stringa chiami una funzione che scandisce ogni elemento di tale vettore
e controlli che il suo codice ascii sia compreso tra 48 e 57 dato che in questo intervallo sono compresi i valori numerici
tutti gli altri valori corrispondono a lettere o segni grammatici
credo che conuna funzione che svolge un lavoro del genere non dovresti avere alcun problema



puoi usare la seguente funzione
che vale se vuoi inserire un numero in virgola mobile ma va bene cmq anche con un numero intero

float legginumero()
{
char buffer[100]
float valore;
int numeri=0;
int punti=0;
int altri_caratteri=0;
int valido;
int i;
do{
cin.getline(buffer,99);
for(i=0;i<strlen(buffer;i++)
{
if(buffer[i]>='0'&&buffer[i]<='9')
numeri=1;
if(buffer[i]=='.')
punti++;
if(!(buffer[i]>='0'&&buffer[i]<='9')&&buffer[i]!='.')
altricaratteri++;
}
if(numeri&&punti<=1&&!altri_caratteri)
valido=1;
else
valido=0;
if(!valido)cout<<"Valore non consentito"<<endl;
}while(!valido)


valore=atof(buffer);
return valore;
}

Ol3iconfini
08-05-2006, 18:15
Quindi dovrei dichiarare la funzione in un file header e poi come devo utilizzarla?


int v1;
int v2;
int w;
cout << " Inserisci il primo vertice: "; //ho provato a utilizzare
//cout<<"inserisci un numero"<<endl;
//cin.getline(buffer,10);
//v1=atol(buffer); ma non funge
v1=legginumero();
cout << endl;
cout << " Inserisci il secondo vertice: ";
v2=legginumero();
cout << endl;
cout << " Inserisci il peso dell'arco " << "(" << v1 << "," << v2 << "): ";
w=legginumero();
cout << "\n";
G.inserisci_arco(v1, v2, w);

Loading