PDA

Visualizza la versione completa : [C/C++]: Ciclo do-while e dati in input


Ol3iconfini
20-05-2006, 02:41
Ecco il mio problema, posto il codice cos avete le idee pi chiare...


#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?:dh: :dh:

mondobimbi
20-05-2006, 10:03
premetto che non ho studiato il listato,
prova a inizializzare n nella prima riga

int n = 0;

e vedi cosa succede
ciao
sergio

pablo1986
20-05-2006, 10:56
Credo che tutto questo dipenda dal fatto che ci sono cin e cin.getline in serie tra di loro
infatti tempo fa ho avuto lo stesso problema, il programma non aspettava che inserissi un valore e stampava a video senza attendere l'inserimento di dato da parte dell'utente.


se il tuo programma dice
inserisci il primo vertice e poi ti dice valore non consentito evidentemente la funzione atol resituisce uno 0 perch lavora con uno spazio vuoto e per tal motivo ti dice che il valore non valido.


Ora,ho provato a compilare il tuo programma ma manca qualche funzione se non sbaglio e c' qualche errore,cmq io avevo risolto mettendo


while(cin.get()!='\n');



o prima dei cin o prima dei cin.getline,prova un po' a fare tentativi

Ol3iconfini
21-05-2006, 12:56
Innanzitutto, come al solito, vi ringrazio per le risposte.
Ora rispondo a Pablo (sempre gentile con la sua partecipazione)..
Oramai sono nell' effetto domino...
Se inserisco qualcosa di nuovo che mi risolve un problema, automaticamente se ne crea uno nuovo! :cry:

Allora ho provato a inserire nel codice della funzione legginumero la linea da te consigliatami while(cin.get()!='\n');

ti posto il nuovo codice della funzione:



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;

while(cin.get()!='\n');

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;
}



L' output ora questo:

Inserisci il primo vertice :

e aspetta l' immissione del codice, come deve fare. :unz:

Poi per appare
Inserisci il secondo vertice:

aspetta che si inserisca un valore, poi dopo che si preme invio si deve ridigitare il numero perch la prima immissione non la legge... :dh:
Se invece si immette un numero e si preme invio due volte legge solo il secondo invio (dicendo giustamente valore non consentito), a conferma che il primo valore digitato non lo legge.... :cry: :cry:

Cosa caspita succede ora???? :messner: :dh: :dh: :oVVoVe: :oVVoVe: :oVVoVe:

pablo1986
21-05-2006, 13:49
guarda ora esco,tu postami il codice completo via mp.
e se riesco, a meno che qualcuno no risolva il problema prima di me, provo a correggerlo io ok????

cmq non garantisco nulla :)

devil89
21-05-2006, 14:34
Prova a modificare cos l'intestazione del main



int main(int argc, char **argv) {

Ol3iconfini
21-05-2006, 16:10
Originariamente inviato da devil89
Prova a modificare cos l'intestazione del main



int main(int argc, char **argv) {


Provato, non cambia niente...

devil89
21-05-2006, 18:16
Dov' la struttura Grafo?

Posta l'intero codice.

Ol3iconfini
21-05-2006, 19:25
Ma non c' entra niente la struttura grafo col problema in questione..
Il problema credo riguardi la funzione legginumero.

devil89
21-05-2006, 20:04
SE posti l'intero codice posso compilarlo e vedere gli errori totali.

Loading