Ecco il mio problema, posto il codice così avete le idee più chiare...
codice:
#include <iostream>
#include <stdlib.h>
using namespace std;
float legginumero();
int main(int argc, char *argv[])
{
int n;
char buffer[100]; //buffer è l'array di caratteri in cui memorizzare l'input.
int opzione;
cout << " Benvenuto!" << endl;
cout << " Prima di accedere al menu, inserisci il numero di vertici del grafo: ";
cin.getline(buffer,100);//affinché il valore immesso sia solo e soltanto un intero, utilizzo
n=atol(buffer); //la funzione atol che converte un vettore di caratteri in un long
cout << endl; //restituendo zero se il vettore che legge non è un numero! Nel caso in
//cui si immetta un valore in virgola mobile si prende la parte intera.
while(n <= 0)
{
cout << " Errore! Inserire un numero di nodi che sia maggiore di zero: ";
cin.getline(buffer,100);
n=atol(buffer);
cout << endl;
}
cout << " Ti ricordo che i vertici sono indicizzati da 0 a " << n-1;
cout << endl;
Grafo G(n);
menu();
do
{
cin >> opzione;
switch(opzione)
{
case(1):
cout << "\n";
int v1;
int v2;
int w;
cout << " Inserisci il primo vertice: ";
cout<< " ";
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);
cout << " Digita la nuova scelta (menu = 6): ";
break;
case(2):
cout << "\n";
int sorgente;
cout << " Inserisci il vertice sorgente: ";
cin >> sorgente;
cout << endl;
cout << "\n";
dijkstra(G, sorgente);
cout << " Fatto. Digita la nuova scelta (menu = 6): ";
break;
case(3):
cout << "\n";
int sorgente2;
cout << " Inserisci il vertice sorgente: ";
cin >> sorgente2;
cout << endl;
cout << "\n";
bellman_ford(G, sorgente2);
cout << " Fatto. Digita la nuova scelta (menu = 6): ";
break;
case(4):
cout << "\n";
G.stampa_lista_cammini();
cout << "\n";
cout << " Digita la nuova scelta (menu = 6): ";
break;
case(5):
cout << "\n";
G.stampa_lista_adiacenza();
cout << "\n";
cout << " Digita la nuova scelta (menu = 6): ";
break;
case(6):
cout << "\n";
menu();
break;
case(7):
break;
default:
cout << " Scelta errata. Inserire un valore tra 1 e 5: " << endl;
}
}while(opzione != 7);
system("PAUSE");
return 0;
}
float legginumero(){
char buffer2[100];
float valore;
int numeri=0;
int punti=0;
int altri_caratteri;
int valido;
int i;
do{
valido=1;
altri_caratteri=0;
cin.getline(buffer2,99);
for(i=0;i<strlen(buffer2);i++)
{
if(buffer2[i]>='0'&&buffer2[i]<='9')
numeri=1;
if(buffer2[i]=='.')
punti++;
if(!(buffer2[i]>='0'&&buffer2[i]<='9')&&buffer2[i]!='.')
altri_caratteri++;
}
if(numeri&&punti<=1&&!altri_caratteri)
valido=1;
else
valido=0;
if(!valido)
cout<<" Valore non consentito"<<endl;
}while(!valido);
valore=atof(buffer2);
return valore;
}
Dopo aver eseguito l' exe si verifica il seguente problema. Prima di aver immesso un valore compare la scritta :
Inserisci il primo vertice: Valore non consentito
Credo che tutto dipenda dal costrutto do-while...
Come posso fare?
Devo cambiare il ciclo?