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

    Utilizzo delle eccezioni

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

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

  3. #3
    Innanzitutto grazie mille per la risposta!
    Ho seguito il tuo consiglio e ho risolto il problema!
    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!
    codice:
              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!

  4. #4
    tu nell'inserire il primo vertice devi quindi mettere uno "0" giuso?

  5. #5
    Non necessariamente. Se i vertici sono 0 1 2 3 posso immettere uno di questi valori.

  6. #6
    Niente!?

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

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

  9. #9
    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;
    }

  10. #10
    Quindi dovrei dichiarare la funzione in un file header e poi come devo utilizzarla?
    codice:
              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);

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.