Präprozessor: Wechsel zwischen Ganz- und Kommazahl



  • silent12 schrieb:

    Ok thx für den Tipp, aber das hindert das Programm doch nicht am ausführen oder? Es ist ja eig egal WIE ich es errechne.

    Buch macht kluch.



  • Doch, das verhindert eine vernünftige Abarbeitung. Abgesehen davon, daß ich nicht sicher bin, wie der Präprozessor mit Anweisungen wie "#if Rechenart=PLUS" zurechtkommt (besonders wenn er weder "Rechenart" noch "PLUS" kennt), würde mit dieset Konstruktion maximal einen der Berechnungs-Blöcke im fertigen Programm auftauchen. Die Variable "Rechenart" wird erst als solche akzeptiert, wenn der Compiler sich um den Quelltext kümmert, den der Präprozessor fabriziert, ihren Wert kannst du erst ausnutzen, wenn das Programm fertig compiliert und gelinkt ist und irgendwer es (möglicherweise auf einem ganz anderen Rechner) ausführt.



  • 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