Buchstabe in Dezimalzahlwert Fehler



  • Achso, jetzt hab ich erst ganz verstanden, was das hinter while heißt 🙂

    Aber wenn ich es jetzt kompiliere und dann einen Buchstaben eingebe, dann kommt danach gar nichts mehr. 😕

    EDIT: Aber wenn ich eine Zahl eingebe, dann macht das Programm normal weiter und rechnet auch mit der Zahl 🙂

    Löscht der bei cin.clear(); eigentlich immer alle Variablen oder jetzt nur X11?
    Weil ich würde die Schleife ja wenn schon hinter jede Abfrage schreiben.



  • cin.clear() löscht keine Variablen, es setzt lediglich den Fehlerzustand des Streams zurück.



  • Achso 😃

    Danke 😉

    Aber hat jemand noch einen Rat zu meinem Problem von weiter oben?



  • #include <limits>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    cout<<"Geben Sie die X Koordinate des ERSTEN Punktes der ERSTEN Geraden ein: ";
       // cin >> X11;
        while( !(cin >> X11) ) {  
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');  // hier ein 2ter Parameter
    		cout<<"Bitte wiederholen Sie Ihre Eingabe!"<<endl;
            cout<<""<<endl;
        }
    	cin.get();
    }
    

    cin.clear löscht keine Variablen, es setzt den Fehlerzustand des Streamobjekts (in diesem Fall cin zurück).

    Warum hinter jede Abfrage schreiben?
    Ich bin mir jetzt nicht 100% sicher, aber das

    while ( !( cin >> x11 ) )
    

    ist das selbe wie das

    cin >> x11;
    while ( cin.fail() )
    

    und ersteres ist kürzer und ich weiß sofort was der Programmierer will.

    PS: Falls das nicht stimmt, bitte korrigieren 🙂



  • Ja, stimmt nicht ganz.
    Bei deiner Version wird die Schleife solange ausgeführt, solange !cin.fail() true ist. Die Einlese Operation findet nur einmal statt!
    Richtig wäre:

    while (!(cin >> somewhat, cin.fail()))
    {
    
    }
    

    Auf das Ergebnis von cin >> somewaht, cin.fail() also für cin.fail() wird ! angewandt, was in der Bedingung der Schleife dann ausgewertet wird.
    Bei der nächsten Iteration, wird cin >> somewaht wieder ausgeführt.



  • Achja, das hab ich übersehen. Danke Nathan 👍



  • Jetzt sieht meins so aus, funktioniert aber so wie ganz am Anfang ohne die Schleife:

    cout<<"Geben Sie die X Koordinate des ERSTEN Punktes der ERSTEN Geraden ein: ";
    	while (!(cin>>X11, cin.fail())) {
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max());
    		cout<<""<<endl;
    		cout<<"Bitte wiederholen Sie Ihre Eingabe:"<<endl;
    		cout<<"Geben Sie die X Koordinate des ERSTEN Punktes der ERSTEN Geraden ein: ";
    	}
    

    Funktioniert sogar noch weniger, bei Zahlen bricht es ab.



  • cout<<"Geben Sie die X Koordinate des ERSTEN Punktes der ERSTEN Geraden ein: ";
        while( !(cin >> X11) ) {  
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');  // hier ein 2ter Parameter
            cout<<"Bitte wiederholen Sie Ihre Eingabe!"<<endl;
            cout<<""<<endl;
    


  • Danke, danke, danke 😃 😃

    Es funktioniert jetzt einwandfrei!!
    Danke an euch 3 😉



  • Hier ist jetzt der fertige Code:

    http://pastebin.com/yTWgYHb5



  • Furchtbar.
    - viel zu viel Code für diese triviale Aufgabenstellung
    - goto ist Anfängermüll
    - Note 6 setzen



  • Dann schreib doch nen kürzeren Code, der auch gegen jede möglichen Fehleingaben geschützt ist und als Ausgabe auch nur Dezimalzahlen und keine Fehler ausgibt.

    Außerdem bin ich ja auch Anfänger.



  • Da hast du hier was falsch verstanden.
    Ich schreibe dir hier nicht deine Hausaufgaben.
    Du ignorierst die hier gegebenen Hinweise, aber genau dafür ist dieses Forum ja auch gedacht: Hinweise auf konkrete Fragen zu geben.
    Das ignorierst du und bist deshalb ein Noob.
    Naiv auch dein anfängerhafter Glaube:
    Es funktioniert jetzt einwandfrei!!
    mit dem du implizierst, dass der Code korrekt ist. Ist er nicht.
    Und standardkonform schon gar nicht.
    Und float-Gleichheitsabfragen sind auch Schrott.
    Und ...



  • Wutz macht hier eigentlich gar nichts außer blöd rumzuflamen. Ignorier ihn. Selbst wenn der code nicht unbedingt "optimal" ist.



  • Du sollst mir auch nicht deine Hausaufgaben schreiben. Die hab ich ja schon.

    Außerdem brauchst du auch nicht auf Threads zu antworten nur um irgendwelche Leute zu beleidigen.

    Du kannst gerne Kritik äußern, aber dann lass bitte nächstes mal Bemerkungen wie "Note 6 setzen" oder "bist deshalb ein Noob" weg.



  • Schon wieder falsch verstanden.
    Ich lasse mir von dir nichts vorschreiben.
    Wenn dein Lehrer halbwegs Ahnung hat, wird er dir evtl. eine 5 geben.



  • @TE, Zagatho:
    Mein Beispiel konnte gar nicht funktionieren, das ! muss natürlich weg...
    Mein Fehler. Aber im Ansatz wäre das die Alternative, die Zagatho meinte.
    Sie ist aber nicht zur Nachahmung geeignet, weil das schon ein bisschen unleserlicher ist, als die ursprüngliche Version.



  • Zutz:
    Konstruktiv? Ich denke nicht.

    Ein paar Dinge zu Herzen nehmen solltest Du Dir wohl schon. Wenn ihr Schleifen noch nicht hattet, kann der FehlerLehrer Dein goto eigentlich nicht kritisieren. Gut wäre natürlich trotzdem, wenn Du es selbst anlernst.



  • Ok, Danke. Schleifen werde ich mir mal ansehn. 😉



  • Davon abgesehen:

    if (b2 == 0) {
                    cout<<"y = "<<m2<<" * x"<<endl;
                    goto punkt6;
            }
    
            if (b2 < 0) {
                    cout<<"y = "<<m2<<" * x - "<<b4<<endl;
                    goto punkt6;
            }
    
            cout<<"y = "<<m2<<" * x + "<<b2<<endl;
    punkt6:
    

    Besser:

    if (b2 == 0) {
                    cout<<"y = "<<m2<<" * x"<<endl;
            }
            else if (b2 < 0) { //wenn das erste if falsch war, prüfe b2 <0
                    cout<<"y = "<<m2<<" * x - "<<b4<<endl;
            } 
            else cout<<"y = "<<m2<<" * x + "<<b2<<endl; //wenn auch das zweite if falsch war (und nur dann) führe das hier aus
    

    Macht soweit ich sehen kann das selbe, aber goto ist so unübersichtlich, sicher sein kann man sich da fast nie...


Anmelden zum Antworten