Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Problema nel ciclo do-while

    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?

  2. #2
    premetto che non ho studiato il listato,
    prova a inizializzare n nella prima riga

    int n = 0;

    e vedi cosa succede
    ciao
    sergio

  3. #3
    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

  4. #4
    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!

    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:
    codice:
    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.

    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...
    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....

    Cosa caspita succede ora???? VVoVe: VVoVe: VVoVe:

  5. #5
    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

  6. #6
    Prova a modificare così l'intestazione del main

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

  7. #7
    Originariamente inviato da devil89
    Prova a modificare così l'intestazione del main

    codice:
    int main(int argc, char **argv) {
    Provato, non cambia niente...

  8. #8
    Dov'è la struttura Grafo?

    Posta l'intero codice.

  9. #9
    Ma non c' entra niente la struttura grafo col problema in questione..
    Il problema credo riguardi la funzione legginumero.

  10. #10
    SE posti l'intero codice posso compilarlo e vedere gli errori totali.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.