Buchstabe in Dezimalzahlwert Fehler



  • Alle nötigen header eingebunden? So wie du postest ist es nicht komilierbar.

    Und das was Eisflamme gesagt hat gilt immer noch:

    Eisflamme schrieb:

    goto bitte vermeiden
    Eine Schleife ist hier das, was Du suchst.

    while( !( std::cin >> x11 ) )
    {
    }
    


  • Achso, oh das hab ich ganz übersehn, dass Eisflamme das geschrieben hatte.

    Header sind folgende eingebunden:

    #include "stdafx.h"
    #include <conio.h>
    #include <iostream>
    #include <climits>
    

    Nur Schleifen hatte ich noch nicht im Unterricht.
    Da weiß ich jetzt nicht was in die Schleife rein muss.
    Und was heißt das, was jetzt hinter while steht?



  • tztztz... goto gelernt aber keine schleifen 🙄

    du musst

    #include <limits>
    

    schreiben.



  • operator>> liefert ebenfalls wieder eine Referenz auf cin zurück. Somit bezieht sich ! auch auf cin.

    Und while läuft solange wie das im Schleifenkopf true ist. Also solange es hier einen Fehler gibt, wird die Abfrage wiederholt.

    Zu den Schleifen findest Du drölfhundert Tutorials, musste einfach googlen.



  • Also jetzt habe ich die limits eingebunden und es kommt auf jeden Fall schonmal kein Fehler mehr 😉

    Mein Programmausschnitt sieht jetzt wie folgt aus:

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

    Wenn ich jetzt einen Buchstaben eingebe, kommt gar nichts mehr danach.

    So wie ich das jetzt verstehe, löscht er den Speicher und ignoriert Buchstaben, solange X11 falsch ist. Das Bitte wiederholen Sie Ihre Eingabe kommt erst gar nicht. Ich glaube ich hab da immer noch was falsch vertsnaden oder weiß nicht wie ich es umsetzen soll.
    Also nachdem er dass gelöscht hat, soll da Bitte wiederholen Sie Ihre Eingabe kommen und danach soll er X11 nochmal neu abfragen und diesmal Buchstaben ignorieren oder Buchstaben generell bei jeder Abfrage ignorieren.
    Also müsste er ja nach der Schleife wieder nach oben springen, aber das geht doch nur mit goto, oder?

    Und selbst wenn ich jetzt eine 9 eingebe, bricht das Programm ab.



  • Du liest ja zwei mal von der Standardeingabe ein:

    cout<<"Geben Sie die X Koordinate des ERSTEN Punktes der ERSTEN Geraden ein: ";
        cin>>X11;     //loesch die Zeile
        while( !( std::cin >> X11 ) ) {    //wenn du using namespace std geschrieben hast, ohne std:: davor
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max());
            cout<<"Bitte wiederholen Sie Ihre Eingabe!"<<endl;
            cout<<""<<endl;
        }
    


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


Anmelden zum Antworten