Präprozessor: Wechsel zwischen Ganz- und Kommazahl



  • Wie kann ich mithilfe einer Präprozessor-Anweisung, durch ein Makro zwischen Ganz- und Kommazahlen wechseln lassen ?

    Grüße
    silent12



  • Verrate ich nicht, weil das viel zu grausam ist.

    Aber

    typedef int Zahltyp;
    //bzw
    typedef double Zahltyp;
    
    int main(){
       Zahltyp x;
       cin>>x;
       cout<<x*2;
    }
    


  • #define MACH_MIR_AUS_DOUBLE_EIN_INT(x) static_cast<int>(x);
    #define MACH_MIR_AUS_INT_EIN_DOUBLE(x) static_cast<double>(x);
    


  • Du (silent12) scheinst nicht mit dem Typensystem aus C++ klarzukommen.



  • Er scheint auch nicht zu kapieren, wofür der Präprozessor da ist.



  • EOutOfResources schrieb:

    Du (silent12) scheinst nicht mit dem Typensystem aus C++ klarzukommen.

    Eisflamme schrieb:

    Er scheint auch nicht zu kapieren, wofür der Präprozessor da ist.

    Wunderbare Kommentare - der Threadersteller hat sich doch gar (noch) nicht geäussert. Rein aus seinem ersten und bis jetzt einzigen Post das zu schliessen finde ich ein wenig voreilig und auch unnötig.


  • Mod

    theta schrieb:

    Wunderbare Kommentare - der Threadersteller hat sich doch gar (noch) nicht geäussert. Rein aus seinem ersten und bis jetzt einzigen Post das zu schliessen finde ich ein wenig voreilig und auch unnötig.

    Das schließen sie aus seinen anderen Threads, die die gleiche Frage jeweils etwas anders verklausuliert stellen. Und nach Lesen dieser Threads stimme ich ihnen zu.



  • Meine Aufgabe ist:
    Entwickeln Sie einen Taschenrechner, der die Eingabe zweier Zahlen erwartet und diese addieren, subtrahieren, multiplizieren und dividieren kann. Über eine einzige Präprozessor-Anweisung soll eingestellt werden können, ob nur mit Ganz- oder auch mit Kommazahlen gearbeitet werden kann.

    Und mithilfe eurer Tipps habe ich sie so versucht zu lösen

    #include <iostream> 
    #define  MACH_MIR_AUS_DOUBLE_EIN_INT(Zahl1,Zahl2) static_cast<int>(Zahl1,Zahl2); 
    
    using namespace std;
    
    int main ()
    { int Rechenart;
      int Datentyp;
      double Zahl1,Zahl2;
      double Ergebnis;
    
    cout <<" Zur Berechnung von Kommazahlen geben sie bitte die 1 ein. Zur Berechnung von Ganzzahln geben sie bitte die 2 ein." << endl;
    cin >> Datentyp;
    
    cout << "Wollen sie mit dem Taschenrechner:Addieren(1), Multiplizieren(2), Dividieren(3) oder Subtrahieren(4).Geben sie bitte die jeweilige Zahl in der Klammer ein!" << endl;
    cin >> Rechenart;
    
    if (Datentyp = 1)
    { MACH_MIR_AUS_DOUBLE_EIN_INT(Zahl1,Zahl2)
    }
    
    cout << "Geben sie nun die Zahl ein von der Addiert/Multipliziert/.... werden soll." << endl;
    cin >> Zahl1;
    
    cout << "Geben sie  nun die Zahl ein die Addiert/Multipliziert/... werden soll." << 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");
    }
    

    Würde mich SEHR über Tipps freuen
    Grüße
    silent12



  • Mach mit dem typedef. Wenn das klappt, schrauben ich es sogar freiwillig um zur Präpro-Variante.


  • Mod

    silent12 schrieb:

    Würde mich SEHR über Tipps freuen

    1. Die Aufgabe hast du völlig falsch verstanden.
    2. Wie dir schon gesagt wurde, du hast keine Ahnung was der Präprozessor kann und was nicht. Das ist entscheidend für die Aufgabe. Mach dich zumindest mit den Grundlagen vertraut.
    3. Lies nach 2. die Aufgabe noch einmal, vermutlich verstehst du dann auch was gemeint ist.
    4. Und wenn du so weit bist, dass du die Aufgabe überhaupt verstanden hast, dann ist sie auch sehr leicht zu lösen, die Aufgabe selbst sagt ja schon, dass der entscheidende Teil nur eine Zeile ist.



  • Ok ich lese mir dann mal ein anderes Tutorial durch, da in meinem Tutorial nur sehr wenig Funktionen des Präprozessors erklärt werden.



  • silent12 schrieb:

    Ok ich lese mir dann mal ein anderes Tutorial durch, da in meinem Tutorial nur sehr wenig Funktionen des Präprozessors erklärt werden.

    Lies dir ein Buch durch, da gibts kostenlose online, z.B. "Thinking in C++". Die meisten Tutorials (vor allem deutschsprachige) sind die Zeit nicht (mehr) wert, die der Autor investiert hat, um sie zu tippen. Es gibt Ausnahmen, aber nur wenige. Ein weiteres Problem ist, dass viele der Tutorials veraltet sind und einen Programmierstil predigen, der längst obsolet ist.



  • Da werden nur symbolische Konstanten kurz angesprochen, die bedingte Kompilierung, wie ich Dateien einfüge und die Fehlermeldung. Ich könnte das ganze Programm natürlich auch mit Präprozessoranweisungen für die Rechnungen gestalten



  • Entwickeln Sie einen Taschenrechner, der die Eingabe zweier Zahlen erwartet und diese addieren, subtrahieren, multiplizieren und dividieren kann. Über eine einzige Präprozessor-Anweisung soll eingestellt werden können, ob nur mit Ganz- oder auch mit Kommazahlen gearbeitet werden kann.

    Machs so:

    #ifdef USE_FLOAT
    typedef NumberType float;
    #else
    typedef NumberType int;
    #endif
    

    Jetzt benutzt du in deinem ganzen Code durchgehend NumberType zum Speichern von Zahlen (also kein float/int direkt) , ein einfaches

    #define USE_FLOAT
    

    am Anfang der Datei würde dazu führen dass float benutzt wird, ansonsten eben int.



  • silent12 schrieb:

    Da werden nur symbolische Konstanten kurz angesprochen, die bedingte Kompilierung, [...]

    Mehr brauchst du auch nicht. Siehe Ethons Beispiel (das nicht ganz richtig ist, den Fehler findest du aber sicher selbst)



  • pumuckl schrieb:

    silent12 schrieb:

    Da werden nur symbolische Konstanten kurz angesprochen, die bedingte Kompilierung, [...]

    Mehr brauchst du auch nicht. Siehe Ethons Beispiel (das nicht ganz richtig ist, den Fehler findest du aber sicher selbst)

    Whoops, ich hab echt keine Ahnung wieso ich in letzter Zeit immer die Reihenfolge vertausche. oO



  • Ah jetzt habe ich es kapiert (dank euch und diesem Tutorial: http://www.cplusplus.com/doc/tutorial/preprocessor/
    Ah ok und dadurch auch gleich die Aufgabe richtig verstanden :D. Ok ich versuche dann mal alles umzuschreiben.



  • Ok hoffe ich habe die Präprozessoranweisungen so verwendet wie gedacht (es kann gut sein, dass alles noch ziemlich umständlich gemacht ist).

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

    #include <iostream> 
    using namespace std;
    #define USE_FLOAT
    
    #ifdef USE_FLOAT
    typedef Numbertype float;
    #else
    typedef Numbertype int;
    #endif
    
    int main()
    { Numbertype Ergebnis;
        char Rechenart;
    Numbertype Zahl1,Zahl2;
         cout << "Was wollen sie rechnen ? MAL ? PLUS ? MINUS ? oder GETEILT ?" <<endl;
         cin >>Rechenart;
    
    cout <<"Geben sie eine Zahl ein" << endl;
    cin >> Zahl1;
    
    cout <<"Geben sie noch eine Zahl ein" << endl;
    cin >> Zahl2;
    
    #if Rechenart = PLUS
    #define PLUS ((Zahl1) + (Zahl2));
    Ergebnis = PLUS(Zahl1,Zahl2);
    
    #elif Rechenart = MAL
    #define MAL ((Zahl1) * (Zahl2));
    Ergebnis = MAL(Zahl1,Zahl2);
    
    #elif Rechenart = MINUS
    #define MINUS ((Zahl1) - (Zahl2));
    Ergebnis = MINUS (Zahl1,Zahl2);
    
    #else
    #define GETEILT ((Zahl1) / (Zahl2));
    Ergebnis = GETEILT (Zahl1,Zahl2);
    
    #endif
    
    cout <<"Ergebnis:" << Ergebnis << endl;
    
      system("Pause");
    }
    

    Grüße
    silent12



  • Der Abschnitt ab Zeile 28 ist unsinnig - du kennst die erwartete Rechenoperation erst zur Programmlaufzeit, da kannst du mit Präprozessor-Anweisungen überhaupt nichts mehr ausrichten. An der Stelle benötigst du eine normale if()-Anweisung (eventuell auch ein switch()).



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


Log in to reply