Nur INT zulassen
-
Tag.
Hab gestern einen einfachen Taschenrechner programmiert, aber komme an paar stellen nicht weiter.Z.b. wenn man statt eine Zahl einen Buchstaben eingibt, schließt sich das Programm.
Ich hoffe ihr könnt mir weiterhelfe.#include <iostream.h> int main() { int x, y, z; char ende; char funktion; do { cout << "Addition: +\nSubtraktion: -\n\nRechnungsart: "; cin >> funktion; switch (funktion) { case '+': cout << "\nErste Zahl: "; cin >> x; cout << "\nZweite Zahl: "; cin >> y; z = x + y; getchar(); cout << "\nErgebnis: " << z << endl; break; case '-': cout << "Erste Zahl: "; cin >> x; cout << "\nZweite Zahl: "; cin >> y; z = x - y; getchar(); cout << "\nErgebnis: "<< z << endl; getchar(); break; default: cout << "FALSCH"; getchar(); break; } cout << "\nWenn Sie weiterrechnen wollen tippen Sie auf E: "; cin >> ende; getchar(); } while (ende == 'e'); return 0; }MfG
Technology
-
iostream.h ist kein standard c++. naja, egal

!google iostream failbit
wenn etwas schief gegangen ist, kann man das an cin.fail() erkennen. mit clear() kann man den zustand wiederr zurpcksetzen.
-
iostream.h ist kein standard c++. naja, egal
Nicht, nein?
Also alle Dateien ohne #include sind Standard!?!???
Sagen wir es mal so: Das ist Quatsch!WAS ZUR HÖLLE IST DENN DANN STANDARD?
-
#include <iostream>Das ist Standard
-
es geht um das
#include <iostream**.h**>
das .h einfach weglassen. die funktionen/klassen befinden sich dann im namespace std.
-
Das .h gibt es seit C98 nicht mehr.
Liste:
-bash-3.00$ ls /usr/include/g++/ FlexLexer.h cstring locale algorithm ctime map backward cwchar memory bits cwctype new bitset cxxabi.h numeric cassert deque ostream cctype exception queue cerrno exception_defines.h set cfloat ext sstream ciso646 fstream stack climits functional std clocale i386-unknown-openbsd3.8 stdexcept cmath iomanip streambuf complex ios string csetjmp iosfwd typeinfo csignal iostream utility cstdarg istream valarray cstddef iterator vector cstdio limits cstdlib list -bash-3.00$Gg
-
ist doch egal oder ob ich nur <iostream> oder <iostream.h> schreib.
mit .h spare ich mir die zeile mit namespace std und so..
und wer kann mir mit meinem problem weiterhelfen?
MfG
Technology
-
Witzbold. Das mit den Namespaces hat schon seinen Sinn, genauso wie die "neuen" Header. Außerdem ist programmieren nach dem Standard Pflicht wenn du im Standard-C++ Forum fragst. Hat dir Gideons Beitrag nicht geholfen?
-
technilogy schrieb:
ist doch egal oder ob ich nur <iostream> oder <iostream.h> schreib.
mit .h spare ich mir die zeile mit namespace std und so..
Es gibt noch mehr unterschiede als nur den anderen Namen. Die neuen Header sind besser, glaub uns.
Zu deinem Problem: Gideon hat die Lösung doch schon gesagt:
#include <iostream> int main() { using namespace std; int a; cin >> a; if(cin.fail()) { cout << "Das ist keine Zahl du Trottel!" << endl; } return 0; }mfg.
-
Nur der Vollstaendigkeit halber;
Du kannst auch einfach string.h includieren, dann in einen string einlesen und anschliessend den string in ein int casten. So bekommst du den Input auf jeden Fall. Zum Casten kannst du einfach Stringstreams benutzen. Dazu sstream.h includieren.
Viel Spass, hau rein, gr33tz
-
perser schrieb:
WAS ZUR HÖLLE IST DENN DANN STANDARD?
ISO/IEC 14882:2003(E)

technilogy schrieb:
ist doch egal oder ob ich nur <iostream> oder <iostream.h> schreib.
Nein, ist es nicht. Punkt.
-
rul00000000r schrieb:
Du kannst auch einfach string.h includieren
Wenn, dann doch bitte <string> (ohne .h) - die <string.h> ist ein Erbe von C und enthält die Verarbeitungsfunktionen für C-Strings (char*): strcmp(), strcpy(),...
-
Bitte lass mich auch zu.
-
Hallo.
Ich weiss, dass ich als Noob euch nerve. Aber was solls ^^
Zu meinem Anfänger Taschenrechnerprogramm habe ich vieles versucht. Aber leider habe ich kein Endprodukt.
In meinem ANSI C++ Buch von Markt & Technik habe ich bei den Schleifen nachgeschaut. Mit IF habe ich Versuche gemacht. Aber habs nicht geschafft.
Mit while habe ich es auch versucht. Auch mit do - while. Aber wenn ich einen String eingebe entsteht eine Endlosschleife.Ich komm leider nicht weiter.
Auf der ersten Seite von diesem Thema findet ihr den Code von meinem Taschenrechner.
Ich möchte nur, dass bei Eingaben von String eine Meldung kommt und das Programm wiederholt wird. Also wieder die Erste Zahl zum Addieren verlangt.mit cin.fail() habe ich es auch nicht geschafft. Weil ich bei meinem Programm nicht nur einmal cin >> verwende, sondern öfterst. Ich glaub deswegen funzt es nicht.
Dann habe ich mit cin.fail() versucht:
int a,b; cin >> a; if (cin.a.fail()) { cout << "Fehler" endl; } else { // else damit er die zweite Zahl zum addieren eingibt cin >> b; if (cin.b.fail()) { cout << "Fehler" endl; }So habe ich es auch versucht. Vielleicht würds ja gehn. Aber ging auch nicht.
Paar Fragen hätte ich noch

Wie ich schon oben erwähnt habe habe ich ein Buch von Markt und Technik (ANSI C++)
Bei den Programmen wird über #include <iostream.h> verwendet.
Und wieso verwendet ihr nur #include <iostream>? Ich verstehe den Unterschied leider noch immer nicht
Und bei Ausgaben ist es glaube ich egal ob ichcout << "Test" endl; // oder cout << "Test";verwende oder?
Danke im Voraus.
MfG
Technology
-
int a,b; cin >> a; if (cin.a.fail()) { cout << "Fehler" endl; } else { // else damit er die zweite Zahl zum addieren eingibt cin >> b; if (cin.b.fail()) { cout << "Fehler" endl; }Vielleicht hast du die auch nur vergessen mit einzutippen, aber am Ende fehlt noch eine geschweifte Klammer. Ich kenne mich mit der Methode fail() nicht aus, aber eigentlich müsste sich diese Methode immer auf das letzte cin beziehen. Also einfach nur cin.fail() und nicht cin.a.fail().
cout << "Test" endl; // oder cout << "Test";Kommt drauf an: Wenn du nach der letzten Variante ein neues cout-Objekt einfügst, würde der Text aneinander gereiht werden:
cout << "Text1"; cout << "Text2";würde die Ausgabe
Text1Text2ergeben. Hingegen
cout "Text1" << endl; cout << "Text2" << endl;die Ausgabe
Text1 Text2ergeben würde. Du siehst: endl beendet die Zeile (du könntest auch stattdessen \n in den String mitreinnehmen).
Mfg Ominion
-
Schau dir das an http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3
-
Dr. Prof schrieb:
Schau dir das an http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3
Dr.Prof vielen Dank für den Link. Hat mir sehr geholfen.
Endlich habe ich es Dank euch geschafft.
Hier mein fertiger Code.#include <iostream> int main() { using namespace std; int x, y, z; char ende, funktion; do { cout << "Addition: +\nSubtraktion: -\n\nRechnungsart: "; cin >> funktion; switch (funktion) { case '+': while ((cout << "Erste Zahl: ") && !(cin >> x)) { cout << "Das ist keine Zahl! "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } while ((cout << "Zweite Zahl: ") && !(cin >> y)) { cout << "Das ist keine Zahl! "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } z = x + y; cout << "\nErgebnis: "<< z << endl; break; case '-': while ((cout << "Erste Zahl: ") && !(cin >> x)) { cout << "Das ist keine Zahl. "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } while ((cout << "Zweite Zahl: ") && !(cin >> y)) { cout << "Das ist keine Zahl. "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); } z = x - y; cout << "Ergebnis: " << endl; break; default: cout << "Falsche Eingabe"; break; } cout << "\nWenn Sie weiterrechnen wollen tippen Sie auf E: "; cin >> ende; getchar(); } while (ende == 'e'); { cout << "Das Programm wird beendet" << endl; } return 0; }Fragen:
**1.**Ich verstehe leider diese while Schleife nicht
Kann sie mir jemand erklären?while ((cout << "Erste Zahl: ") && !(cin >> x)) { cout << "Das ist keine Zahl. "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); }Wieso wird hier !(cin >> x) verwendet?
2.
cin.ignore(numeric_limits<streamsize>::max(), '\n');Was wird hier eigentlich gemacht? Wenn ich den Code bei C++ Builder 6 eingebe bekomme ich jedesmal eine Fehlermeldung.
Code-Parameter kann nicht aufgerufen werden, da der Quelltext Fehler enthält
3. Wie ihr sieht enthält mein Programm sehr viele while Schleifen? Könnte ich diese irgendwie verringern? Besser gefragt, das Programm irgendwie anders programmieren?
4. Wie findet ihr meinen Programmierstil als Anfänger.
Vielen Dank im Voraus.
MfG
Technology
-
technology schrieb:
**1.**Ich verstehe leider diese while Schleife nicht
Kann sie mir jemand erklären?while ((cout << "Erste Zahl: ") && !(cin >> x)) {(cout << "Erste Zahl: ") ist immer true. !(cin >> x) ist solange true, wie du keine Ganzzahlen eingibst.
cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); }Leert dir deinen Buffer.
Angenommen, das Ausgabefenster sieht folgendermaßen aus:
Erste Zahl: 23 blubbsIch habe zwei "Wörter" eingegeben, die 23 wird in x gespeichert, das "blubbs" bleibt allerdings noch im Buffer, d. h. das nächstfolgende cin liest dieses "blubbs" ein, egal, was du eingibst. Das ist sicherlich nicht im Sinne des Erfinders, deshalb wird der Buffer geleert.
Wieso wird hier !(cin >> x) verwendet?
cin liefert einen Fehlerstatus, wenn in x nix Ordentliches eingelesen wurde.
2.
cin.ignore(numeric_limits<streamsize>::max(), '\n');[...] Wenn ich den Code bei C++ Builder 6 eingebe bekomme ich jedesmal eine Fehlermeldung.
Uff, wie mans beim Builder 6 machen muss, weiß ich auch nicht.
3. Wie ihr sieht enthält mein Programm sehr viele while Schleifen? Könnte ich diese irgendwie verringern? Besser gefragt, das Programm irgendwie anders programmieren?
Natürlich. Geh zuerst mal davon aus, dass der User nur richtige Eingaben macht, und bau die Fehlerüberprüfung erst nachträglich ein. Dadurch erhälst du Code, den du auch noch selbst verstehst.
-
Du kannst auch die Tatsache ausnutzen, daß alle while()-Schleifen gleich aufgebaut sind und das in eine Funktion einpacken:
int lese_zahl(const string& Eingabe) { int val; while ((cout << Eingabe) && !(cin >> val)) { cout << "Das ist keine Zahl! "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } return val; } ... switch(funktion) { case '+': x=lese_zahl("Erster Summand: "); y=lese_zahl("Zweiter Summand: "); z=x+y; cout<<"Summe: "<<z<<endl; ... }
-
CStoll schrieb:
int lese_zahl[...]nein! es heißt "lies"

-
Ist doch egal - ich "lese" halt eine "zahl"
