Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: [C++] Problema "goto"

  1. #1

    [C++] Problema "goto"

    Salve a tutti, sono Mirko, un utente nuovo appena registrato e che ha appena finito ti leggere il regolamento ( )
    Sono uno sviluppatore (se così posso definirmi) che ha iniziato da poco una scuola informatica.

    Come da titolo ho un problema, ho scritto un programma che mi permetta di calcolare l'iva di un prodotto e anche scorporarla( ) con xCode su OSx , questo è il codice:
    codice:
    //
    //  main.cpp
    //  calcolo iva
    //
    //  Created by Mirko Milovanovic on 11/06/12.
    //  Copyright (c) 2012 mir_ko inc. All rights reserved.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char f;
        cout<<"Benvenuto nel programma, cosa vuoi fare? ";
    menu:
        cout<<"\n OPZIONI: ";
        cout<<endl <<"1. Per scorporare l'iva da un prezzo. ";
        cout<<endl <<"2. Per fare il calcolo PREZZO + IVA. " <<endl;
        cout<<endl <<"Scelta: ";
        cin>> f;
        if (f==1) {
            char e;
            do {
                float a, b, c, d;
                cout<<"Inserisci l'importo compreso di 'IVA': " <<endl;
                cin >> a;
                cout <<"Inserisci l'IVA che vuoi sottrarre (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >> b;
                c= a * 100;
                d= c / (100 + b);
                cout <<"L'importo senza IVA è' di: " <<d <<endl;
                cout <<"Vuoi rieseguire la operazione? s/n ";
                cin >> e;
            }while(e=='s' || e=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
    
        }
        else if (f==2) {
            char h;
            do {
                float a, b, c, d, e;
                cout <<"Inserire il prezzo del prodotto :" <<endl;
                cin >>a;
                cout <<"Inserisci l'IVA da applicare (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >>b;
                c= a * b;
                d= c / 100;
                e= a + d;
                cout<<"\nIl prezzo con la IVA applicata (di " <<b;
                cout<<"%) e' di " <<e;
                cout<<"€ ";
                cout <<"\nVuoi rieseguire la operazione? s/n ";
                cin >> h;
            }while(h=='s' || h=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
        }
        else {
            cout <<"Scelta non valida! " <<endl <<"Torno al menu' principale!\n ";
            goto menu;
        }
        return 0;
    }
    Il problema che ho è il seguente: come da codice quando un utente fa una selezione diversa da 1 o 2 il programma stampa
    codice:
    cout <<"Scelta non valida! " <<endl <<"Torno al menu' principale!\n ";
    e dopo di che fa tornare alle opzioni iniziali utilizzando il "goto". So che il goto è deprecato ed è utilizzato sono nel c, ma non so come fare altrimenti, il punto è che quando il programma torna alle opzioni quando poi faccio una selezione giusta, mi rimanda sempre all' "else" ( :dry: ) e mi dice che ho fatto una scelta non valida. A questo punto come potrei fare per risolvere? ho letto in giro che al posto di utilizzare il "goto" di utilizzare un ciclo "while" o meglio ancora un "do....while" ma non so veramente come applicarlo qui....
    Mi servirebbe una mano......
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    si fa piu o meno cosi

    codice:
    do
    {
      opzione = LeggiInput();
      
      switch (opzione) {
      case A:
         operazioneA();
         break;
      case B:
         operazioneB();
         break;
      default:
         MessaggioOpzioneErrata();
         break;
      }
    } while ((opzione != A) && (opzione != B))

  3. #3
    Ciao, e grazie per avermi risposto, comunque, dici di utilizzare uno switch? Ma se io quando accade il caso di "default" voglio che l'utente debba debba scegliere di nuovo cosa fare come faccio a far "tornare indietro" il programma? era questa la mia domanda iniziale...il goto non va quindi come potrei fare?

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    so qual'è la domanda iniziale, so quella finale

    codice:
    ho letto in giro che al posto di utilizzare il "goto" di utilizzare un ciclo "while" o meglio ancora un "do....while" ma non so veramente come applicarlo qui....
    so anche che sarebbe stata migliore una risposta che non contemplasse l'uso del goto.

    so qual'è l'errore nel tuo codice e che il goto non centrava nulla ma non te l'ho voluto dire subito proprio perche volevo prima farti capire come affrontare questo tipo di problema

    insomma credo di avere un quadro completo della situazione

    vemiamo a noi, lo switch l'ho usato solo perche in caso di 3 o piu opzioni rende il codice piu leggibile ma il nocciolo della questione è nel do-while.
    Sai come funziona il do-while perche lo usi nel tuo codice quindi cos'è che non ti è chiaro in quello snippet che ho postato?

    P.S.
    lo snippet è in pseudo codice, sei tu che te lo devi adattare in base alle esigenze.

    l'errore è sul tipo di variabile usata per la scelta dell'operazione, in C++ int e char possono essere usati come se fossero dello stesso tipo ma devi ricordarti che sono di tipo diverso: 1 è una cosa '1' è un altra cosa.

  5. #5
    Ciao, scusa per la mia insistenza, non volevo sembrare scortese o cosa, comunque quello che non capivo era come sostituire il goto con il do..while, ma ci sono arrivato!

    Questo è quello che sono riuscito a fare:
    codice:
    //
    //  main.cpp
    //  calcolo iva
    //
    //  Created by Mirko Milovanovic on 11/06/12.
    //  Copyright (c) 2012 mir_ko inc. All rights reserved.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int imput;
        cout<<"#########################################" <<endl;
        cout<<"Benvenuto nel programma!";
        cout<<"#########################################" <<endl;
        cout<<"Cosa vuoi fare? \n";
        do{
        cout<<"OPZIONI: ";
        cout<<endl <<"1. Scorporare l'iva da un prezzo. ";
        cout<<endl <<"2. Fare il calcolo PREZZO + IVA. ";
        cout<<endl <<"3. Uscire dal programma. " <<endl;
        cout<<endl <<"Scelta: ";
        cin>> imput;
        switch (imput) {
            case (1):
            char e;
            do {
                float a, b, c, d;
                cout<<"Inserisci l'importo compreso di 'IVA': " <<endl;
                cin >> a;
                cout <<"Inserisci l'IVA che vuoi sottrarre (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >> b;
                c= a * 100;
                d= c / (100 + b);
                cout <<"L'importo senza IVA è' di: " <<d <<endl;
                cout <<"Vuoi rieseguire la operazione? s/n ";
                cin >> e;
            }while(e=='s' || e=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            break;
        case (2):
            char h;
            do {
                float a, b, c, d, e;
                cout <<"Inserire il prezzo del prodotto :" <<endl;
                cin >>a;
                cout <<"Inserisci l'IVA da applicare (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >>b;
                c= a * b;
                d= c / 100;
                e= a + d;
                cout<<"\nIl prezzo con la IVA applicata (di " <<b;
                cout<<"%) e' di " <<e;
                cout<<"€ ";
                cout <<"\nVuoi rieseguire la operazione? s/n ";
                cin >> h;
            }while(h=='s' || h=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            break;
        case (3):
                return 0;
                break;
        default:
            cout <<endl <<"Scelta non valida! " <<endl <<"Torno al menu' principale! \n\n";
        }
            
        }while ((imput!=1) && (imput!=2));
        return 0;
    }
    Una cosa non ho capito però, come mai metto "while ((imput!=1) && (imput!=2));"??
    Il do..while da quando l'ho studiato non lo ho ancora capito del tutto, .__.

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Qualsiasi goto può essere sostituito con un loop.
    Ecco come fare nel tuo caso:

    codice:
    int go=1;
    while(go)
    {
        cout<<"\n OPZIONI: ";
        cout<<endl <<"1. Per scorporare l'iva da un prezzo. ";
        cout<<endl <<"2. Per fare il calcolo PREZZO + IVA. " <<endl;
        cout<<endl <<"Scelta: ";
        cin>> f;
        if (f==1) 
        {
            char e;
            do {
                float a, b, c, d;
                cout<<"Inserisci l'importo compreso di 'IVA': " <<endl;
                cin >> a;
                cout <<"Inserisci l'IVA che vuoi sottrarre (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >> b;
                c= a * 100;
                d= c / (100 + b);
                cout <<"L'importo senza IVA è' di: " <<d <<endl;
                cout <<"Vuoi rieseguire la operazione? s/n ";
                cin >> e;
            }while(e=='s' || e=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            go=0; // go è uguale a 0 per cui il codice non viene ripetuto   
        }
        else if (f==2) {
            char h;
            do {
                float a, b, c, d, e;
                cout <<"Inserire il prezzo del prodotto :" <<endl;
                cin >>a;
                cout <<"Inserisci l'IVA da applicare (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >>b;
                c= a * b;
                d= c / 100;
                e= a + d;
                cout<<"\nIl prezzo con la IVA applicata (di " <<b;
                cout<<"%) e' di " <<e;
                cout<<"€ ";
                cout <<"\nVuoi rieseguire la operazione? s/n ";
                cin >> h;
            }while(h=='s' || h=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            go=0; // go è uguale a 0 per cui il codice non viene ripetuto  
        }
        else {
            cout <<"Scelta non valida! " <<endl <<"Torno al menu' principale!\n ";
            // go resta = 1 per cui il codice viene ripetuto, ed è l' equivalente di un "goto menu"
        }
    }

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ma no figurati, era solo per dire che la domanda l'avevo compresa

    innanzitutto iNput e non iMput.

    dal while si entra quando la condizione è vera, altrimenti si esce. Nel nostro caso per rientrare nel while è necessario che l'utente non abbia scelto ne 1 ne 2 altrimenti si deve uscire.

    (input != 1) && (input != 2) //ne 1 ne 2

    ma si potrebbe anche dire

    !((input == 1) || (input ==2)) //se non è vero che la scelta è uguale a 1 o uguale a 2

    dovresti fare una ripassatina di logica booleana, sono davvero 4 cosette.

    La tecnica descritta da who am i è quella di usare i "flag"; è una scelta altrettanto valida ma non la preferisco perche le condizioni vengono spalmate su piu punti del programma ed in caso di codice complesso diventa facile perdersi. Comunque è una tecnica che dovresti saper maneggiare.


  8. #8
    Scusa per l'errore di battitura, ahah comunque "dovresti fare una ripassatina di logica booleana, sono davvero 4 cosette." credo che abbia ragione solo che i libri che ho sono molto scarsi e mi tocca andare sempre in internet........

    Poi un'ultima cosa all'inizio
    codice:
    int input;
    l'ho cambiato in
    codice:
    char input;
    così che se l'utente digita un carattere al posto del numero mi ripeta il ciclo senza che vada in loop, posso parlo vero? ahah (ultimamente non ho programmato in c ma in html e ci ho perso la mano )

  9. #9
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    solo se poi nelle condizioni lo confronti poi con un carattere ('1') e non con un intero (1)

  10. #10
    Ok, sono riuscito a completare il programma, il codice finale dovrebbe essere questo:
    codice:
    //
    //  main.cpp
    //  calcolo iva
    //
    //  Created by Mirko Milovanovic on 11/06/12.
    //  Copyright (c) 2012 mir_ko inc. All rights reserved.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char input;
        cout<<"#########################################" <<endl;
        cout<<"Benvenuto nel programma!";
        cout<<"#########################################" <<endl;
        cout<<"Cosa vuoi fare? \n";
        do{
        cout<<"OPZIONI: ";
        cout<<endl <<"1. Scorporare l'iva da un prezzo. ";
        cout<<endl <<"2. Fare il calcolo PREZZO + IVA. ";
        cout<<endl <<"3. Uscire dal programma. " <<endl;
        cout<<endl <<"Scelta: ";
        cin>> input;
        switch (input) {
            case ('1'):
            char e;
            do {
                float a, b, c, d;
                cout<<"Inserisci l'importo compreso di 'IVA': " <<endl;
                cin >> a;
                cout <<"Inserisci l'IVA che vuoi sottrarre (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >> b;
                c= a * 100;
                d= c / (100 + b);
                cout <<"L'importo senza IVA è' di: " <<d;
                cout <<" €" <<endl;
                cout <<"Vuoi rieseguire la operazione? s/n ";
                cin >> e;
            }while(e=='s' || e=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            return 0;
            break;
        case ('2'):
            char h;
            do {
                float a, b, c, d, e;
                cout <<"Inserire il prezzo del prodotto :" <<endl;
                cin >>a;
                cout <<"Inserisci l'IVA da applicare (numero in percentuale, esempio: '20', '21', ecc): " <<endl;
                cin >>b;
                c= a * b;
                d= c / 100;
                e= a + d;
                cout<<"\nIl prezzo con la IVA applicata (di " <<b;
                cout<<"%) e' di " <<e;
                cout<<" €";
                cout <<"\nVuoi rieseguire la operazione? s/n ";
                cin >> h;
            }while(h=='s' || h=='S');
            cout<<"\nGrazie per aver utilizzato il programma.";
            return 0;
            break;
        case ('3'):
                cout<<"\nGrazie per aver utilizzato il programma.";
                return 0;
                break;
        default:
                cout <<endl <<"Scelta non valida! " <<endl <<"Torno al menu' principale! \n\n";
                }
            }while ((input!='1') && (input!='2'));
        return 0;
    }
    Spero sia giusto

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 © 2026 vBulletin Solutions, Inc. All rights reserved.