Präprozessor: Wechsel zwischen Ganz- und Kommazahl



  • Habe es jetzt mal probiert, aber habe den Fehler noch nicht gefunden

    Mein Fehler war dass ich die Syntax von typedef (mal wieder) durcheinandergebracht habe.

    Es ist

    typedef %alt% %neu%
    

    und nicht anders herum. 😉



  • @CStoll:
    Ach stimmt :D. Ich muss wohl mehr darauf achten, dass die Präprozessoranweisung VOR dem compilieren ausgeführt wird.
    @Ethon: Ok habe noch nie mit typedef gearbeitet gehabt und deshalb die Syntax auch nicht gekannt.

    Ok habe jetzt die Fehler korrigiert und das Programm wird auch ausgeführt nur die Ergebnisse stimmen nicht 😞

    #include <iostream> 
    using namespace std;
    #define USE_FLOAT
    
    #ifdef USE_FLOAT
    typedef  float Numbertype;
    #else
    typedef int Numbertype;
    #endif
    
    int main()
    { Numbertype Ergebnis;
        int Rechenart;
    Numbertype Zahl1,Zahl2;
    
         cout << "Was wollen sie rechnen ? plus(1) ? mal(2) ? minus(3) ? oder geteilt(4) ?" <<endl;
         cin >>Rechenart;
    
    cout <<"Geben sie eine Zahl ein" << endl;
    cin >> Zahl1;
    
    cout <<"Geben sie noch eine Zahl ein" << endl;
    cin >> Zahl2;
    
    if (Rechenart = 1)
    {Ergebnis = Zahl1 + Zahl2;
    }
    
    if (Rechenart = 2)
    { Ergebnis = Zahl1 * Zahl2;
    }
    
    if (Rechenart = 3)
    { Ergebnis= Zahl1 - Zahl2;
    }
    
    else
    {Ergebnis= Zahl1 / Zahl2;
    }
    
    cout <<"Ergebnis:" << Ergebnis << endl;
    
      system("Pause");
    }
    

    Was habe ich noch falsch gemacht ?



  • Du hast den Vergleich (==) mit einer Zuweisung (=) verwechselt.



  • Rechenart wird doch immer mit den Zahlwerten verglichen, aber wenn ich da statt dem "=" ein "==" einsetze funktioniert es auch nicht



  • silent12 schrieb:

    Rechenart wird doch immer mit den Zahlwerten verglichen, aber wenn ich da statt dem "=" ein "==" einsetze funktioniert es auch nicht

    Sollte es aber...



  • Nein sollte es nicht.

    Überleg dir folgendes:
    Angenommen du möchtest multiplizieren, gibst also eine 2 ein.
    Danach gibst du noch 2 Zahlen ein - soweit ist alles gut.

    Nun kommt der code mit den if-statements.
    Erste Bedingung wird zu false ausgewertet.
    Zweite Bedingung ist true (Rechenart == 2), also werden die beiden Zahlen multipliziert und das Ergebnis gespeichert.
    Dritte Bedingung wieder false, aber es gibt hier einen else-Zweig, daher wird dieser durchlaufen.
    Im Ergebnis steht nun also nicht mehr das Produkt, sondern der Quotient.

    Lösung?
    Entweder switch-case (breaks nicht vergessen), oder else if!

    P.S.: Es ist ratsam, sich mit einem Debugger vertraut zu machen - so kannst du genau nachvollziehen, welcher Ast einer Verzweigung durchlaufen wird, welche Werte die Variablen haben etc.



  • inter2k3 schrieb:

    Nein sollte es nicht.

    Ach, das else habe ich übersehen.



  • OK, da haut noch etwas mit der Zugehörigkeit der if's und else's nicht so hin, wie es sein soll. Das else in Zeile 42 greift immer dann, wenn Rechenart ungleich 3 ist, deshalb überschreibst du dort die Ergebnisse einer Addition oder Subtraktion.



  • Ah danke für den Tipp mit dem "else if". So nun funktioniert es.
    Danke an alle. 🙂
    Grüße
    silent12



  • Oder nur if s...


Anmelden zum Antworten