Taschenrechner Problem



  • Hey Community,
    Ich habe ein Problem mit einem Taschenrechner den ich vorhin geschrieben habe.
    Es gibt zwar keine Compiler oder Syntaxfehler, aber trotzdem wird nachdem ich die Nummer der Rechenart eingetippt habe nicht die Funktion aus der Switch-Schleife ausgeführt. Woran liegt das?

    #include <iostream>
    
    using namespace std;
    
    int addition(int lhs, int rhs)
    {
        return lhs+rhs;
    }
    
    int subtraktion(int lhs, int rhs)
    {
        return lhs-rhs;
    }
    
    int multiplikation(int lhs, int rhs)
    {
        return lhs*rhs;
    }
    
    int division(int lhs, int rhs)
    {
        if(rhs==0) return 0;
        else return lhs/rhs;
    }
    
    int main()
    {
        int a,b;
        char input;
    
        cout<<"Geben sie 2 Zahlen ein, mit denen sie rechnen möchten. \n";
        cin>>a;
        cin>>b;
    
        cout<<"Geben sie nun ein wie gerechnet werden soll. \n"
            <<"1) Addieren \n"
            <<"2) Subtrahieren \n"
            <<"3) Multiplizieren \n"
            <<"4) Dividieren \n"
            <<"q) Quit \n";
    
        cin>>input;
        switch(input)
        {
             case 1:
                  cout<<"Das Ergebnis aus "<<a<<" + "<<b<<" ist "<<addition(a,b)<<endl;
             break;
             case 2:
                  cout<<"Das Ergebnis aus "<<a<<" - "<<b<<" ist "<<subtraktion(a,b)<<endl;
             break;
             case 3:
                  cout<<"Das Ergebnis aus "<<a<<" x "<<b<<" ist "<<multiplikation(a,b)<<endl;
             break;
             case 4:
                  cout<<"Das Ergebnis aus "<<a<<" : "<<b<<" ist "<<division(a,b)<<endl;
             break;
             case 'q':
             return EXIT_SUCCESS;
        }
        system("PAUSE");
    }
    

    PS: Ich bin ein C++ Anfänger, deswegen bitte die Lösung ein wenig Anfängerfreundlich formulieren. 🙂



  • Du liest einen char ein. Wenn du nun 1 eintippst entspricht das in C++ '1'.
    Und '1' ist != 1.

    Zwar können char-Werte implizit in Ganzzahlen umgewandelt werden, aber dabei gilt halt '1' != 1 etc.

    Du musst entweder den character in eine Ganzzahl umwandeln oder deine Switch anpassen. (1 durch '1' ersetzen, 2 durch '2' etc.)



  • Soweit ich das sehen kann liegt der Fehler darin, dass du faelschlicherweise den ASCII-Code von input pruefst und nicht das 'tatsaechliche' Zeichen.
    Hier eine Verbesserung:

    #include <iostream>
    
    using namespace std;
    
    int addition(int lhs, int rhs)
    {
        return lhs+rhs;
    }
    
    int subtraktion(int lhs, int rhs)
    {
        return lhs-rhs;
    }
    
    int multiplikation(int lhs, int rhs)
    {
        return lhs*rhs;
    }
    
    int division(int lhs, int rhs)
    {
        if(rhs==0) return 0;
        else return lhs/rhs;
    }
    
    int main()
    {
        int a,b;
        char input;
    
        cout<<"Geben sie 2 Zahlen ein, mit denen sie rechnen möchten. \n";
        cin>>a;
        cin>>b;
    
        cout<<"Geben sie nun ein wie gerechnet werden soll. \n"
            <<"1) Addieren \n"
            <<"2) Subtrahieren \n"
            <<"3) Multiplizieren \n"
            <<"4) Dividieren \n"
            <<"q) Quit \n";
    
        cin>>input;
        switch(input)
        {
             case '1':
                  cout<<"Das Ergebnis aus "<<a<<" + "<<b<<" ist "<<addition(a,b)<<endl;
             break;
             case '2':
                  cout<<"Das Ergebnis aus "<<a<<" - "<<b<<" ist "<<subtraktion(a,b)<<endl;
             break;
             case '3':
                  cout<<"Das Ergebnis aus "<<a<<" x "<<b<<" ist "<<multiplikation(a,b)<<endl;
             break;
             case '4':
                  cout<<"Das Ergebnis aus "<<a<<" : "<<b<<" ist "<<division(a,b)<<endl;
             break;
             case 'q':
             return EXIT_SUCCESS;
        }
        system("PAUSE");
    }
    


  • Schau mal, auf welchen Typen du im switch prüfst, und was bei den case -Marken für Konstanten stehen. Tipp: ASCII 😉

    Aber abgesehen davon brauchst du für so kleine Dinge wohl keine Funktionen zu schreiben. Und ich würde den gleich bleibenden Teil cout << "Das Erg... nur einmal nach der Abfrage schreiben, um Codeduplizierung zu vermeiden.



  • Ah, gut, damit hat sich dann auch erledigt warum, wenn ich 'q' eingebe, die Funktion ausgeführt wird. Vielen Dank für die schnellen Antworten, ich kenne kaum ein Forum das so schnell Support bietet 🙂



  • hmmm das Problem hat sich wohl geklärt aber ich frage mich persönlich warum du das gemacht hasst:

    char input;
    

    wäre es nicht einfacher und logischer es so zu machen(?):

    int input;
    

    aber ich glaube ich hab was übersehen oder dis is einfach nur dumm was ich laber.... 😛

    fg Wurst



  • Naja, er möchte auf "q" prüfen, q wie quit 😛



  • achso stimmt hab ich vergessen... aber könnte er ja auch ne zahl für nehmen^^ egal...

    fg Wurst



  • Hm, nur ist der Speicherbedarf bei ints vier mal groesser als bei einem char. Ist aber heutzutage wohl nich wirklich schlimm. Trotzdem sollte meiner Meinung nach die Auswahl des Variablentyps durchdacht sein.

    Wenn das "Menue" allerdings mehr als 10 Eintraege hat, konnt man mit char nich sehr weit. Bei einem Integer haette man dann den Nachteil, dass man nur Zahlen pruefen koennte (anderenfalls wuerde eine Exception aufgerufen werden). Dann waere eventuell noch std::string eine Moeglichkeit.

    Gruss
    Cartman



  • Eric Cartman schrieb:

    Wenn das "Menue" allerdings mehr als 10 Eintraege hat,

    zum glück ist das problem nicht akut. 😉



  • Naja, genau genommen müsste man sowieso noch die Eingabe überprüfen und Fehleingaben abfangen.



  • Natürlich müsste man das noch überprüfen.
    Doch der Taschenrechner an sich ist ja kein Projekt, sondern lediglich ein kleiner Test meiner Fähigkeiten 🙂 Ich bin ja gerade dabei C++ zu lernen und wollte nun mal etwas mit dem gelernten anstellen, denn Übung macht den Meister 🙂


Log in to reply