Ergebnis 1 bis 6 von 6

Thema: [C++] Problem mit Funktion und if-Anweisung

  1. #1

    [C++] Problem mit Funktion und if-Anweisung

    Also, ich habe vorhin bei C++ versucht, mich etwas mit den Funktionen, Variablen und if-Anweisungen auseinanderzusetzten, bin dann aber auf zwei kleine Probleme/Fragen gestossen. Die erste betrifft die Funktionen, bei denen mit etwas noch nicht ganz klar ist. Ich habe als Beispiel folgenden Code geschrieben:

    Code:
    #include <iostream>
    
    int addition (int x, int y)
    {
         std::cout << "Was gibt " << x << " plus " << y << "?\n";
         std::cout << "Genau: " << x << " plus " << y << " gibt ";
         return (x+y);
    }
    
    int main() 
     {
        std::cout << "Dies hier ist ein simples kleines Programm, welches ";
        std::cout << "2 Zahlen addiert.\n";
        std::cin.get();
        std::cout << "" << addition (100,1);
        std::cin.get(); 
        return 0;
     }
    Mein Ziel ist es bei diesem Beispiel, mit der Funktion 2 beliebige Zahlen zu addieren. Wenn die Funktion zum Einsatz kommt, sollte dann ganz einach der Text:
    Was gibt 100 plus 1 ?
    Genau: 100 plus 1 gibt 101


    In Zeile 15 soll dann diese Funktion zum auftreten. Wenn ich jedoch nicht
    Code:
    std::cout << "" << addition (100,1)
    schreibe, sondern nur
    Code:
    addition (100,1)
    dann wird das Resultat, bzw. das Ergebnis der Addition nicht angezeigt. Und wenn ich wiederrum eine dritte Möglichkeit wie
    Code:
    std::cout << "2 Zahlen zu addieren " << addition(100,1);
    probiere (also die Funktion Addition noch an den davorstehenden Satz anschliesse) dann kommt folgendes Ergebnis
    Dies ist ein simples kleines Programm, welches Was gibt 100 plus 1
    Genau: 100 plus 1 gibt zwei Zahlen zu addieren.


    Nun zu meiner Frage:
    Wie ich ja selbst bemerkt habe, funktioniert das ganze also nur, wenn ich vor der Funktion noch ein std::cout << "" << hinschreibe. Aber warum? Wieso wird das Ergebnis bei der einfachen Abfrage einer Funktion nicht angezeigt, und wieso wird die Abfolge der einzelnen Sätze bei std::cout << "2 Zahlen zu addieren << addition(100,1) vertrauscht?


    So, das wäre mal die erste Frage gewesen. Nun zum zweiten, etwas einfacheren Problem, das die if-Anweisung betrifft. Dazu ebenfalls erstmal das Codebeispiel:
    Code:
    #include <iostream>
    
    int main() {
        int firstnumber, secondnumber, result;
        std::cout << "Bitte geben Sie eine Zahl ein: ";
        std::cin >> firstnumber;
        std::cout << "Und gleich noch eine: ";
        std::cin >> secondnumber;
        std::cout << "Und nun raten Sie, was diese beiden Zahle addiert ergeben?";
        std::cin >> result;
        if (result == firstnumber + secondnumber) 
        {
           std::cout << "Richtig! ";
           std::cin.get();
           }
        else 
            std::cout << "Falsch! ";
            std::cin.get();
        return 0;
    }
    Mein Ziel hierbei ist es, dass man 2 Zahlen eingeben muss, und danach das Resultat aus der Addition der beiden Zahlen angeben soll. Hat man beide Zahlen richtig zusammengezählt, steht "Richtig!", hat man sie falsch addiert, steht "Falsch!". Das eigentliche Problem liegt theoretisch nicht einmal in der if-Anweisung, sondern eher in std::cin.get();. Mit der if-Anweisung möchte ich abfragen, ob der Benutzer die Zahlen richtig addiert hat. Wenn die dementsprechende Richtig- oder Flaschmeldung angezeigt wird, soll das Programm auf irgendeine Eingabe warten, bevor es einfach Abbricht, nachdem der Code fertig ist. Wenn man jetzt beide Zahlen richtig zusammengezählt hat, besteht soweit kein Problem, und es wird wie vorgesehen "Richtig" angezeigt, und auf ein Tastendruck gewartet. Bei "Falsch" jedoch nicht. Sind beide Zahlen nicht richtig zusammengezählt, bricht das Programm einfach ab (ich vermute einfach dabei, es liegt an irgendwiestd::cin.get();). Meine Frage hierbei ist einfach, ob ich grundsätzlich etwas mit der if-Anweisung falsch mache, oder was sonst der Verursacher für die Missachtung(?) des std::cin.get(); ist.

    So, nach dem ich nun meine 2 Probleme in den bis jetzt optisch längst verfassten Post von mir zusammengefasst habe, hoffe ich ihr versteht in etwa meine Erklärungen, und könnt mir da weiterhelfen.

    Vielen dank und Mfg

    Biosfear

    Geändert von Biosfear (01.08.2005 um 11:53 Uhr)

  2. #2
    also erstmal zu deiner zweiten Frage: Das das Programm bei einer falschen Berechnung abbricht ohne eine Ausgabe anzuzeigen, sollte daran liegen, dass bei
    Code:
     else 
            std::cout << "Falsch! ";
            std::cin.get();
    die geschweiften Klammern fehlen. So sollte es klappen:
    Code:
     else 
    {
            std::cout << "Falsch! ";
            std::cin.get();
    }
    Nun zu den Funktionen: Wenn du die Funktion ohne ein cout aufrufst, kann das Ergebnis nicht angezeigt werden, weil ohne cout nun mal keine Ausgaben gemacht werden. Du musst in deinem Beispiel also entweder die Funktion mit cout aufrufen, oder aber in der Funktion selber statt dem return (x+y) schreiben: cout<<x+y. Dann kannst du die Funktion auch ohne cout aufrufen.
    Warum dir bei deiner dritten Möglichkeit die Zeilen vertauscht werden, kann ich dir so auf die schnelle aber auch nicht sagen.

  3. #3
    Zitat Zitat von NiKrYss
    also erstmal zu deiner zweiten Frage: Das das Programm bei einer falschen Berechnung abbricht ohne eine Ausgabe anzuzeigen, sollte daran liegen, dass bei
    Code:
     else 
            std::cout << "Falsch! ";
            std::cin.get();
    die geschweiften Klammern fehlen. So sollte es klappen:
    Code:
     else 
    {
            std::cout << "Falsch! ";
            std::cin.get();
    }
    Hmm, funktioniert leider auch nicht. Wenn ich bei else ebenfalls 2 geschweifte Klammern setzte dann funktioniert nachher auch das "Richtig" nicht mehr. Ich fasse noch einmal zusammen, bei welche Schreibweisen nun was passiert:


    Code:
    if (result == firstnumber + secondnumber) 
        {
           std::cout << "Richtig! ";
           std::cin.get();
           }
        else 
        {
            std::cout << "Falsch! ";
            std::cin.get();
            }
    4 Klammern: Bei dieser Art klappt weder das Richtig noch das Falsch. Beide werden nicht (oder eben nur extrem kurz, da es vllt. ein Problem mit std::cin.get(); gibt, angezeigt.

    Code:
    if (result == firstnumber + secondnumber) 
        {
           std::cout << "Richtig! ";
           std::cin.get();
           }
        else    
            std::cout << "Falsch! ";
            std::cin.get();
    2 Klammern bei true: Mit dieser Schreibweise wird nur "Richtig" angezeigt (natürlich nur falls die Variable result auch gleichgross ist, wie first- und secondnumber zusammen).

    Code:
    if (result == firstnumber + secondnumber) 
           std::cout << "Richtig! ";
           std::cin.get();
        else 
        {   
            std::cout << "Falsch! ";
            std::cin.get();  
         }
    Mit 2 Klammern bei false gibt der Compiler ein Syntax error before else an.

    Code:
    if (result == firstnumber + secondnumber) 
           std::cout << "Richtig! ";
           std::cin.get();
    else 
            std::cout << "Falsch! ";
            std::cin.get();
    Ohne geschweifte Klammer gibt der Compiler ein Syntax error before else an.
    Irgendwie komme ich einfach nicht drauf, mit was der Compiler ein Problem hat?


    Die erste Frage wäre aber geklärt, vielen Dank NikrYss.

    Mfg Biosfear

  4. #4
    Okay, zur ersten Frage: Die Verdrehung erfolgt, weil die Funktionen, die als Operanden an cout übergeben wurden erst ausgeführt werden müssen, bevor der Rückgabewert eigesetzt und der Text ausgegeben werden kann. Beispiel:
    Code:
    int foo()
    {
     cout << "bar";
     return 0;
    }
     cout << "foo" << foo();
    Das gibt nicht "foobar0", sondern "barfoo0" aus. Zuerst wird die Funktion foo() aufgerufen, welche "bar" ausgibt. Erst dann hat das Programm den Rückgabewert 0 und kann ihn in den Text einsetzen.
    Zum zweiten:
    Dein std::cin.get(); wird ignoriert, weil der Eingabepuffer noch voll ist. Also musst du ihn leeren. Das geht z.B. mit std::cin.sync();. Wenn du das vor der erneuten std::cin.get();-Anwendung aufrufst, sollte es wieder klappen.
    Btw, schreib mal using namespace std; hinter deine Headereinbindungen. Dann kannst du dir das ewige std:: sparen. Und fasse deine Fragen in Zukunft bitte kürzer zusammen.

    freundliche Grüße, Rolus

  5. #5
    Das dein Fenster sofort wieder zugeht und die Ausgabe nur kurz erscheint, liegt tatsächlich an dem cin.get.
    Füge mal nach dieser Zeile
    Code:
    std::cin >> result;
    folgendes ein:
    Code:
    std::cin.ignore();
    und danach deinen Quellcode wie gehabt und bei ELSE an die geschweiften Klammern denken.
    Das cin.ignore() sorgt dafür, dass nach der Eingabe der geratenen Zahl der Tastaturpuffer und damit alle Zeichen, die sich noch im Inputstream befinden, gelöscht werden. Fehlt das cin.ignore(), verbleibt nach der Eingabe der geratenen Zahl noch die Entereingabe des Benutzers im Tastaturpuffer, welches dann vom nächsten cin.get() sofort als Zeicheneingabe interpretiert wird [So, als hätte der Benutzer bereits wieder eine Eingabe gemacht].
    So sollte dein Programm dann funktionieren bei mir läuft es jedenfalls^^

    Im übrigen kannst du den cin.get() -Teil auch aus der if-else-Abfrage rausnehmen und das ganze nur einmal unter die Abfrage schreiben:
    Code:
    if (result == firstnumber + secondnumber) 
           std::cout << "Richtig! ";
    else 
           std::cout << "Falsch! ";
    
    std::cin.get();
    In dem Fall kannst du dann bei IF und ELSE die geschweiften Klammern auch weglassen^^

    Edit: joa, da war wohl jemand schneller^^

  6. #6
    Ok, mit std::cin.ignore(); und std::cin.sync(); klappts.

    Zitat Zitat von Rolus
    Und fasse deine Fragen in Zukunft bitte kürzer zusammen.
    Mein Post sieht schon ziemlich nach viel Text aus, aber einmal abgesehen von den relativ viel Platz in Anspruch nehmenden Codeblöcken ist der Text pro Frage (hinzu kommt ja noch, dass ich gleich 2 Fragen gestellt habe) imho nicht soo gross. Aber zugegeben: Die Fragen sind grosszügig erklärt (ich bin grundsätzlich nicht jemand, der es bei 2-3 knappen Worten belässt).

    Aber danke an euch beide für die Hilfe!

    Mfg Biosfear

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •