[C/C++] Einsteigerfrage

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von J4de, 17. Januar 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 17. Januar 2009
    Einsteigerfrage

    Hey... habe grade angefangen, C++ zu lernen
    Allerdings... wurde mir folgende Aufgabe gestellt:

    Spoiler
    Ein Programm, dass 3 Zahlen eingelesen werden und diese in der Reihenfolge: 1 3 2 ausgegeben werden. Also die erste eingegebene Zahl wird zuerst ausgegeben, danach wird die zuletzt eingegebene Zahl ausgegeben und zum Schluss die mittlere.

    Hatte dann die Lösung auch "fast" richtig
    Hier aber die vorgegebene Lösung:
    Spoiler
    #include<iostream>
    using namespace std;

    int main()
    {

    int zahl1;
    int zahl2;
    int zahl3;

    cout<<"Bitte eine Zahl eingeben\n";
    cin>>zahl1;
    cout<<"Bitte noch eine Zahl eingeben\n";
    cin>>zahl2;
    cout<<"Noch eine Zahl bitte\n";
    cin>>zahl3;
    cout<<"Die Ausgabe lautet\n";
    cout<<zahl1<<" "<<zahl3<<" "<<zahl2<<"\n";
    }

    So... läuft auch soweit ganz gut... doch am Ende gibt er mir die Zahlen net aus , sondern schließt das Programm einfach... Wo liegt mein Fehler ?^^
    Hoffe , ihr könnt mir helfen ^^
    LG und BW ist Ehrensache
    J4de
     
  2. 17. Januar 2009
    AW: Einsteigerfrage

    Na dein Programm gibt die Zahlen schon aus nur
    hast du keine Funktion, die dem Programm sagt, dass es
    warten soll... so beendet sich es direkt

    Du hast jetzt Zweit möglichkeiten:

    1. Du kannst das Programm über die Console starten
    (Also Start-->Ausführen --> "cmd")

    2. Kannst du die "Wartfunktion" einbauen:
    Dafür gibt es "cin.get();". Nun Wartet das Programm auf
    einen Tastendruck (um genau zu sein auf Enter).
    Allerdings ist ist durch deine vorherigen eingaben der Puffer
    noch belegt, das Programm würde sich also trotzdem beenden.
    Was tun? Dafür kenne ich spontan zwei möglichkeiten:
    Du kannst zuum einen noch den Befehl cin.ignore(); vor
    dein cin.get(); schreiben oder fflsuh(stdin);. Beim ersten bin ich mir
    nicht 100% sicher, was es bewirkt aber fflsuh leert den Puffer.
    Also:

    Code:
    ....
    cout<<"Bitte eine Zahl eingeben\n";
    cin>>zahl1;
    cout<<"Bitte noch eine Zahl eingeben\n";
    cin>>zahl2;
    cout<<"Noch eine Zahl bitte\n";
    cin>>zahl3;
    cout<<"Die Ausgabe lautet\n";
    cout<<zahl1<<" "<<zahl3<<" "<<zahl2<<"\n";
    
    cin.ignore(); // oder Halt fflush(stdin);
    cin.get();
    
    ...
    
    
    Sollte so klappen...

    Ach eins noch: Ich habe es eigl so gelernt, das man
    immer am ende eines Programms "return 0;" schreibt,
    auch wenn es vom ISO-Standard (meine ich zumindest xD)
    vorgegeben ist, das der Compiler selbst ein return ran
    hängen muss

    MFG
    xXsoureXX
     
  3. 17. Januar 2009
    AW: Einsteigerfrage

    du kannst auch einfach : system ("pause") nehmen.
    glaube so war die syntax.
    gruß
     
  4. 17. Januar 2009
    AW: Einsteigerfrage

    allerdings geht das nur auf windows und das ist dann nicht so vorteilhaft
     
  5. 17. Januar 2009
    AW: Einsteigerfrage

    Gut , das hätte soweit geklappt ^^ BWs sind raus...
    Allerdings... verstehe ich noch nicht, was mit dem Puffer gemeint ist und was cin.ignore nun genau bringt (bzw. cin.get)
    Hoffe, da könnt ihr mir helfen
    LG
     
  6. 17. Januar 2009
    AW: Einsteigerfrage

    Wenn du eingaben liest (mit cin) dann wird das alles in nen internen Puffer geschrieben. Allerdings wird der Puffer nicht zwangsweise geleert, d.h. es könnte z.b. noch der Zeilenumbruch im Puffer legen und damit würde cin.get(); auch nichts bringen.
    Deshalb kann man mit cin.ignore(); bestimmte Zeichen ignorieren (genaugenommen die aus dem Puffer) und dann funktioniert cin.get(); richtig.
    fflush würde ich nicht nehmen, den wenn du stdin mit fflush leerst, dann kriegst du ein undefiniertes Verhalten wenn du danach mit den iostreams drauf zugreifst.

    Das hier ist der beste Code, wenn du das Schließen verhidnern willst:

    Code:
     std::cin.clear(); // setzt die error state flags zurück
     std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignoriert alle zeichen im buffer [rdbuf() gibt einen Zeiger auf den Buffer zurück, in_avail() die zahl der bytes im buffer
     std::cin.get(); //auf enter warten
    edit: system() is natürlich ganz böse, weil die befehle u.U. nicht plattformunabhängig sind und man im extremfall sogar "bösen" code ausführen kann.
     
  7. 17. Januar 2009
    AW: Einsteigerfrage

    Du kannst das ganze auch in eine Endlosschleife packen:

    Code:
    int main()
    {
    for(;;) {
     int zahl1;
     int zahl2;
     int zahl3;
     
     cout<<"Bitte eine Zahl eingeben\n";
     cin>>zahl1;
     cout<<"Bitte noch eine Zahl eingeben\n";
     cin>>zahl2;
     cout<<"Noch eine Zahl bitte\n";
     cin>>zahl3;
     cout<<"Die Ausgabe lautet\n";
     cout<<zahl1<<" "<<zahl3<<" "<<zahl2<<"\n";
    }
    return 0;
    }
    
     
  8. 17. Januar 2009
    AW: Einsteigerfrage

    blöde frage...kann es sein dass du beim übersetzen nicht Ctrl+F5 drückst, sondern den debugger mit mausklick startest? da bleibt das programm nämlich auch nicht offen.
     
  9. 17. Januar 2009
    AW: Einsteigerfrage

    das is aber SEHR unsauber, würde zum beispiuel nicht unterbrochen werden... aber das problem is doch schon gelöst... vote 4 close
    edit: guck noch mal hier http://de.wikipedia.org/wiki/Puffer_(Informatik)
     
  10. 17. Januar 2009
    AW: Einsteigerfrage

    kk, close hier mal ^^ Merke schon, dass es ziemlich schwer wird, C++ zu lernen
    LG J4de
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.