[Solved] C++ Einsteiger, Problem mit einer Aufgabe.



  • Hallo,
    ich habe ein Problem mit ner Aufgabe aus dem Buch "Einführung in die Programmierung mit C++,von Bjarne Stroustrup".

    Aufgabe 1 v. Kapitel 4:
    Schreiben Sie ein Programm, das aus einer while-Schleife besteht, die bei jedem Schleifendurchlauf
    zwei int-Werte einliest und diese dann ausgibt. Verlassen Sie das Programm, wenn zum Beenden
    ein '|' eingegeben wurde.

    Undzwar kriege ich es einfach nicht hin, das Programm NUR bei der Eingabe von '|' zu beenden...
    Ich sitze jetzt schon seit einer ganzen Zeit an dem Lösungsversuch, doch es wollte einfach nicht klappen.

    Leider konnte ich keine Musterlösung für die Aufgabe finden...

    Ich hoffe jemand kann mir helfen.

    MFG


  • Administrator

    Zeig doch mal, was du schon gemacht hast. Oder stell eine konkrete Frage.

    Siehe auch: https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe



  • Wenn du ein int einliest und '|' eingibst, wird danach bei cin das failbit gesetzt (cin.fail() ist dann true).
    Du kannst dann mit cin.clear() das failbit löschen und danach schauen, ob cin.peek() dir '|' zurückgibt. (sicherheitshalber solltes du auch noch auf eof checken und dann auch beenden).



  • @wardog19

    das Programm NUR bei der Eingabe von '|' zu beenden

    Das ist auch nicht verlangt.



  • @Dravere
    Danke für die Antwort

    	int a = 0, b = 0;
    
    	while (a != '|' && b != '|') {
    		
    		cin >> a >> b;
    
    		if (a == '|' || b == '|') {
    
    		}
    		else {
    
    			cout << "a= " << a << " b= " << b << endl;
    		}
    	}
    

    Das ist der letzte Versuch den ich hatte... habe vorher auch schon andere Dinge probiert, aber ich habe das alles
    leider überschrieben...
    Es läuft da leider auf ne Dauerschleife hinaus sobald ich einmal keinen integer eingebe....
    Ich verstehe das nicht.

    @wob
    Danke für die Antwort auf jeden Fall!
    Bin mir gerade nicht sicher ob ich das richtig verstehe, ich probiere mal etwas rum...
    Müsste ich also die Prüfung der While Schleife irgendwie mit cin.peek() auf '|' prüfen?

    @manni66
    Dir auch danke!
    hmm aber da steht doch "[...]wenn zum Beenden ein '|' eingegeben wurde"??



  • @wardog19

    hmm aber da steht doch "[...]wenn zum Beenden ein '|' eingegeben wurde"??

    Da steht nicht, was passieren soll, wenn du ein a eingibst. Ob du das a in Kapitel 4 schon ignorieren können sollst kann ich nicht sagen.



  • Es steht denn im Buch vorher beim einlesen im while (...)?



  • @manni66 sagte in C++ Einsteiger, Problem mit einer Aufgabe.:

    Es steht denn im Buch vorher beim einlesen im while (...)?

    Zu deiner 1. Antwort:
    Ich komme gerade nicht drauf, warum du das so siehst... Ich meine da steht doch explizit mit '|'...

    zur 2. Antwort:
    Also du meinst, was mir im Buch bisher alles über While Schleifen gesagt wurde??



  • @wardog19 sagte in C++ Einsteiger, Problem mit einer Aufgabe.:

    if (a == '|' || b == '|') {

    a und b sind vom Typ "int". Es sind also Zahlen. Es macht wenig Sinn, diese mit einem Zeichen zu vergleichen (C++ nimmt hier den Code des Zeichens).

    Genereller Tip: überprüfe direkt beim Einlesen, ob dieses funktioniert hat. So in der Art:

    while (cin >> variable) { .... }
    

    oder

    if (cin >> variable) { ... }
    

    Im else-Fall wurde keine gültige Zahl eingegeben.



  • @wob

    Alles klar.

    Also müsste das ungefähr so aussehen?

    	int a, b;
    
    	while (cin >> a >> b) {
    		cout << "a= " << a << " b= " << b << endl;
    	}
    
    	if (cin.peek() == '|') {
    		cout << "Das Programm wurde beendet" << endl;
    		keep_window_open();
    	}
    	else {
    		cout << "Es wurde kein gültiger Integer Wert eingeben." << endl;
    		keep_window_open();
    	}
    

    Ich habe das mit dem cin.peek etc. aber wohl noch nicht richtig verstanden..
    Weil mir ist wichtig, das ich dann auch nur bei '|' beende und nicht z.B. mit 'k', was ja auch nen fail zur folge hätte.



  • @wardog19 Ja, so ungefähr. Aber du musst vor dem peek den Fehlerstatus des Streams löschen mit cin.clear().

    Als Alternative zu peek, das nach dem nächsten Zeichen schaut, kannst du auch dann versuchen, einen String zu lesen und diesen testen. Denn im Fehlerfall ohne Beenden willst du ggf. den Stream leeren. (dazu schau dir auch cin.ignore an)



  • @wob
    Danke dir vielmals!
    Habe es so lösen können, bin mir gerade nicht sicher ob eine if Anweisung nicht davon überflüssig ist,
    aber es tut was es tun soll, bin für heute zu fertig mich damit weiter zu befassen 😅 .

    Hier meine vollständige Lösung:

    int main() {
    	int a, b;
    
    	cout << "Bitte geben Sie 2 Integer Werte ein: \n"
    		<< "Zum Beenden '|' eingeben.\n";
    
    	while (cin.fail() == false) {
    
    		cin >> a >> b;
    
    		if (cin.fail() == false) {
    			cout << "a= " << a << " b= " << b << endl;
    		}
    		else {
    
    			if (cin.fail() == true) {
    				cin.clear();
    
    				if (cin.peek() == '|') {
    					cout << "Das Programm wurde beendet." << endl;
    					cin.clear();
    					cin.ignore();
    					break;
    				}
    				else {
    					cout << "Falsche Eingabe" << endl;
    					cin.clear();
    					cin.ignore();
    				}
    
    			}
    		}
    	}
    
    	keep_window_open();
    }
    

    @Alle anderen
    Natürlich auch vielen Dank für die Unterstützung!



  • @wardog19 Noch als Anmerkung: nutze bitte nicht == true oder == false. Das sieht grauenhaft aus.
    Das == true lässt du direkt weg und das == false ersetzt du einfach durch den Negationsoperator !, also z.B. if(std::cin.fail()) und if(!std::cin.fail()).



  • @Unterfliege

    okay, danke dir für den Tipp!
    Das ist natürlich wirklich viel "klarer".


Log in to reply