Schleifen & Break?
-
HAbe folgendes PRog in ANlehnung an Willms geschrieben.
Soll eine bis zu zwanzigstellige Integerzahl einlesen und Quersumme ausgeben, sowie Summierung bei Eingabe eines falschen Zeichens (nicht-Ziffer) abbrechen.
Habe dies auf zwei Arten zu realisieren versucht und beide Varianten hintereinandergeschalten:#include <iostream> #include <ctype.h> // isdigit using namespace std; // Eigene Version. int main() { char c; int qsum = 0, cnt; for (cnt = 0; (cnt < 20) && ((c=cin.get()) != '\n'); cnt++) { if(c > '9' || c < '0') { cout << "Mind. eine der Eingaben keine Ziffer. Quersumme bis zur Fehleingabe.\n\n"; break; } qsum += c - '0'; } cout << "Quersumme: " << qsum << "\n\n"; for (cnt = 0; (cnt < 20) && ((c=cin.get()) != '\n'); cnt++) { if(!isdigit(c)) { cout << "Mind. eine der Eingaben keine Ziffer. Quersumme bis zur Fehleingabe.\n\n"; break; } qsum += c - '0'; } cout << "Quersumme: " << qsum << "\n\n"; system("pause"); return 0; }So, nun passiert folgendes:
a) Wird die erste Zahl fehlerfrei eingegeben, wird die Quersumme ausgegeben und ich darf die zweite Zahl eingeben, die bei Fehleingabe zum erhoffen Programmabbruch führt.b) Geb ich jedoch bei der ersten Zahl bereits eine Fehleingabe ein, wird auch die zweite Schleife abgebrochen.
Dachte erst, es liegt an der break-Anweisung, hab dann mit "goto" in der ersten Schleife auf das Ende dieser verwiesen - gleicher Fehler.Ich hoffe, ich konnt einigermaßen darlegen, was mein Problem ist.
Vielen Dank für Eure Hilfe!lG
Tonikum
-
Je nachdem, wo eine "nicht Zahl" steht, geht er in der zweiten Schleife ja direkt da weiter.
Also "1234a" würde bei dem 'a' die erste abbrechen, und dann in der zweiten gleich das '\n' bekommen.
Im übrigen solltest du die Quersumme _neu_ berechnen, also vor der zweiten Schleife auf null setzen.
-
Etwas kürzer, geht aber in der Form nur wenn wirklich alle Zeichen Ziffern sind.
std::string str = "1234567890"; std::cout << "quer ist: " << std::accumulate(str.begin(), str.end(), -str.size() * '0') << std::endl;
-
Dankeschön!
Den kürzeren Quellcode kann ich mit meinem Wissensstand noch nich umsetzen bzw. nachvollziehen...Ich verstehe nicht ganz, warum dann das '\n' automatisch in die zweite Schleife geht?
Habe versucht, nach der ersten Schleife sowohl qsum (danke für den Hinweis) als auch c nochmal nullzusetzen. Hab aber den gleichen Fehler:
Abbruch auch der zweiten Schleife bei fehleingabe in der ersten.Was versteh ich da genau falsch?
-
Tonikum schrieb:
Ich verstehe nicht ganz, warum dann das '\n' automatisch in die zweite Schleife geht?
Habe versucht, nach der ersten Schleife sowohl qsum (danke für den Hinweis) als auch c nochmal nullzusetzen. Hab aber den gleichen Fehler:
Abbruch auch der zweiten Schleife bei fehleingabe in der ersten.Nehmen wir an, du gibst "1234a" ein und drückst enter.
Nun wird in der ersten Schleife ja Zeichen für Zeichen eingelesen.
Es wird also 1+2+3+4 gerechnet. Dann kommt das 'a' und die Schleife wird abgebrochen.
Nun gehen wir in die zweite Schleife und lesen weiter Zeichen für Zeichen. Im Eingabepuffer ist aber noch das enter, also '\n' was dann direkt zum Abbruch der zweiten Schleife führt.Oder geb mal "1234a5678" ein

-
Tonikum schrieb:
... Hab aber den gleichen Fehler:
...Am besten vor jeder neuen Eingabe den Puffer leeren.

#include <stdio.h> #define bread break #include <iostream> using namespace std; #define FLASCH pulverizer(); void pulverizer() { setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ); } int main() { int c = 0, i = 0, qsum=0; cout << "Enter numbers please." << endl; while( (c = getc(stdin)) != '\n' && i++ < 4 ) { if(c > '9' || c < '0' ) { puts("pfui"); bread; } qsum += c-'0'; } cout << qsum << endl; FLASCH // Puffer leeren !!! cout << "New Qsum ??? [y/n] " << endl; if ( c = getc(stdin) != 'y' ) goto good_bye; FLASCH // Puffer leeren !!! qsum = 0; cout << "Enter numbers please." << endl; while( (c = getc(stdin)) != '\n' && i++ < 4 ) { if(c > '9' || c < '0' ) { puts("pfui"); bread; } qsum += c-'0'; } cout << qsum << endl; good_bye: cout << "Good Bye!" << endl; return 0; } :)
-
Danke für die Hinweise!
Wi eleere ich genau den Puffer?
Habe es mit der endl; Anweisung nach der ersten Ausgabe nach der ersten Schleife probiert, komm jedoch zum gleichen Ergebnis wie vorher.
-
cin.ignore();endl beinhaltet zwar auch einen flush, allerdings für die Ausgabe.
-
Super, jetzt funktionierts, vielen Dank!

Echt tolles Forum hier, geht ja blitzschnell!
(Sobald Gates vor mir zittert, werde ich mich revanchieren
)