[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
-
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 beicin
dasfailbit
gesetzt (cin.fail()
ist danntrue
).
Du kannst dann mitcin.clear()
das failbit löschen und danach schauen, obcin.peek()
dir'|'
zurückgibt. (sicherheitshalber solltes du auch noch aufeof
checken und dann auch beenden).
-
-
@Dravere
Danke für die Antwortint 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"??
-
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.
-
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())
undif(!std::cin.fail())
.
-
okay, danke dir für den Tipp!
Das ist natürlich wirklich viel "klarer".