Zwischen float und char unterscheiden?
-
Wieso stehen Ober- und Untergrenze überhaupt in der Bedingung?
-
Du kannst explizit ein Zeichen einlesen und evtl. wieder zurück in den Stream geben:
char c; cin << c; if (c == 'q') break; cin.putback(c);
Außerdem kannst du mittels
while(cin)
oder innerhalb der Schleife mit
if (!cin) break;
testen, ob der Stream noch gültig ist (d.h. in deinem Fall alle nicht als Zahl umwandelbaren Zeichen eingegeben wurden).
-
Th69 schrieb:
Du kannst explizit ein Zeichen einlesen und evtl. wieder zurück in den Stream geben:
char c; cin << c; if (c == 'q') break; cin.putback(c);
Außerdem kannst du mittels
while(cin)
oder innerhalb der Schleife mit
if (!cin) break;
testen, ob der Stream noch gültig ist (d.h. in deinem Fall alle nicht als Zahl umwandelbaren Zeichen eingegeben wurden).
Ist es auch möglich eine Schleife mit
while(cin)
eine Datentyp-Bedingung zu erstellen? Also solange mein cin vom Typ int ist, die Schleife zu durchlaufen und sobald keine Zahlen mehr eingegeben werden abzubrechen?
-
Ja, das ist sogar eine sehr üblicher Art und Weise. So sehen typische C++-Eingabeschleifen aus:
while(cin >> wert) { verarbeite(wert); }
So wird der Wert dann und nur dann verarbeitet, wenn erfolgreich etwas gelesen wurde. Bei allen Arten von Fehlern (z.B. Buchstaben, wenn Zahlenwert erwartet werden; Dateiende) gibt die Leseoperation einen Fehlerwert zurück und die Schleife bricht sofort ab.
-
SeppJ schrieb:
Ja, das ist sogar eine sehr üblicher Art und Weise. So sehen typische C++-Eingabeschleifen aus:
while(cin >> wert) { verarbeite(wert); }
So wird der Wert dann und nur dann verarbeitet, wenn erfolgreich etwas gelesen wurde. Bei allen Arten von Fehlern (z.B. Buchstaben, wenn Zahlenwert erwartet werden; Dateiende) gibt die Leseoperation einen Fehlerwert zurück und die Schleife bricht sofort ab.
Wahnsinn, das ist genau das was ich gesucht habe, vielen Dank. Mache ich das dann so indem ich die Schleife folgendermaßen gestalte?
while(cin >> int) { Programmablauf; } //Hier bei Buchstaben zb return 0;
-
ProZerger schrieb:
while(cin >> int) { Programmablauf; } //Hier bei Buchstaben zb return 0;
Nein.
cin >> int
? Was soll das denn bedeuten? Rechts muss schon eine Variable stehen, die dann auch das Ergebnis aufnimmt. Das ist keine Zaubersyntax, das ist die ganz normale Eingabe mit cin, die du schon 1000x gesehen hast. Die Eingabe hat halt auch einen Rückgabewert bezüglich Erfolg oder Nichterfolg, den man prüfen kann und sollte, bevor man den gelesenen Wert verarbeitet. Diesen Rückgabewert kann man halt auch als Bedingung für eine ganz normale Schleife nehmen, die du auch schon 1000x gesehen hast.Probier mal folgendes Programm bei dir aus, dann verstehst du besser:
#include <iostream> int main() { double sum = 0; double input; while(std::cin >> input) { sum += input; } std::cout << "Die Summe der eingegebenen Zahlen ist " << sum << '\n'; }
Gib ein paar Zahlen ein. Dann gib entweder etwas ein, das keine Zahl ist, oder beende den Eingabestream (Linuxartige: CTRL+D; Windowsartige: CTRL+Z). Dann schlägt das
std::cin >> input
fehl und du landest bei der Ausgabe hinter der Schleife.
-
Das hab ich soweit verstanden. Somit habe ich mein Programm in der Schleifenbedingung geändert:
#include <iostream> using namespace std; float OGrenze; float uGrenze; float Ergebnis; int main(int argc, char **argv) { cout << "Zum Verlassen, bitte \"q\" eingeben." << endl; cout << "Wir integrieren die Funktion f(x)=x. " << endl; while(std::cin >> uGrenze || std::cin >> OGrenze) { cout << "\nBitte geben Sie die untere Grenze ein: "; cin >> uGrenze; cout << "\nNun die Obere Grenze: "; cin >> OGrenze; Ergebnis = ((OGrenze*OGrenze)/2) - ((uGrenze*uGrenze)/2); cout << "\nDas Ergebnis ist: " << Ergebnis << endl; } cout << "Ende der Integration" << endl; }
Mir kommen da 2 neue Fragen auf.
Erstens: Muss ich in der Bedingung std::cin schreiben, oder kann ich das std:: weglassen, da ich das Programm mit
using namespace std;
beginne, oder handelt es sich dabei um eine Funktion, einem Operator oder ähnlichem?
Zweitens: Meine Schleife wird immer nur dann angefangen, wenn ich eine Zahl eingebe und mit Enter bestätige. Gibt es nicht eine Möglichkeit, in der Schleife zu bleiben und nur zu verlassen, wenn ich etwas anderes als eine Zahl eingebe?
-
Durch die zusätzliche Ausgaben wird der Code etwas komplizierter (darum hatte ich in meinem Beitrag extra if...break benutzt).
Daher würde ich als Code jetzt folgendes vorschlagen:
while(true) { cout << "\nBitte geben Sie die untere Grenze ein: "; if (!(cin >> uGrenze)) break; cout << "\nNun die Obere Grenze: "; if (!(cin >> OGrenze)) break; Ergebnis = ((OGrenze*OGrenze)/2) - ((uGrenze*uGrenze)/2); cout << "\nDas Ergebnis ist: " << Ergebnis << endl; }
std::cin ist ein globales std::istream-Objekt (d.h. std:: kannst du wegen dem using namespace std weglassen).
-
Frage 1:
Wie schon gesagt, das ist keine Zaubersyntax. Entsprechend gelten da die ganz normalen Regeln, inklusive aller Regeln zu Namespaces.So etwas wie
cin >> wert;
ist ein ganz normaler Funktionsaufruf, wie jeder andere auch. Denk dir, dass da stattdessen stündecin.eingabeoperator(wert);
(oder wenn du nichts von Klassen und Objekten verstehst, denk es dir alseingabeoperator(cin, wert);
). Die andere Schreibweise ist bloß schöner. Aber als ein ganz normaler Funktionsaufruf gelten all die ganz normalen Regeln.Frage 2:
Du kannst den Programmablauf beliebig gestalten. Ich habe leider nicht so ganz verstanden, was du willst, daher kann ich es nicht genau vormachen. Dein jetziger Programmablauf kommt mir auch zweifelhaft vor. ODER-Verknüpfung? Du möchtest doch gewiss, dass die untere UND die obere Grenze korrekt gelesen wurden. Zudem hast du das Grundprinzip immer noch nicht verstanden, denn du liest ja in der Schleife wieder etwas ein, aber du hast doch bereits in der Schleifenbedingung etwas eingelesen! Guck dir mein Beispielprogramm noch einmal an, wie das funktioniert!Außerdem kannst du sowieso mehrere Eingabeoperatoren aneinander hängen:
cin >> untere_grenze >> obere_grenze;
-
Th69 schrieb:
Durch die zusätzliche Ausgaben wird der Code etwas komplizierter (darum hatte ich in meinem Beitrag extra if...break benutzt).
Daher würde ich als Code jetzt folgendes vorschlagen:
while(true) { cout << "\nBitte geben Sie die untere Grenze ein: "; if (!(cin >> uGrenze)) break; cout << "\nNun die Obere Grenze: "; if (!(cin >> OGrenze)) break; Ergebnis = ((OGrenze*OGrenze)/2) - ((uGrenze*uGrenze)/2); cout << "\nDas Ergebnis ist: " << Ergebnis << endl; }
std::cin ist ein globales std::istream-Objekt (d.h. std:: kannst du wegen dem using namespace std weglassen).
Dankeschön, das hat mir meine Fragen beantwortet
Außerdem ist das Problem jetzt auch gelöst, also vielen Dank nochmal
SeppJ schrieb:
Frage 2:
-
Dein jetziger Programmablauf kommt mir auch zweifelhaft vor. ODER-Verknüpfung? Du möchtest doch gewiss, dass die untere UND die obere Grenze korrekt gelesen wurden.
-
Zudem hast du das Grundprinzip immer noch nicht verstanden, denn du liest ja in der Schleife wieder etwas ein, aber du hast doch bereits in der Schleifenbedingung etwas eingelesen! Guck dir mein Beispielprogramm noch einmal an, wie das funktioniert!
-
Außerdem kannst du sowieso mehrere Eingabeoperatoren aneinander hängen:
cin >> untere_grenze >> obere_grenze;
-
Mein Plan war es, dass ich den Ablauf beende wenn die untere Grenze, oder die obere Grenze keine gültigen Werte liefern.
-
Das habe ich tatsächlich falsch verstanden, denn meiner Auffassung nach sollte in der while Schleife die Bedingung nicht eingegeben werden, sondern die Schleife sollte durchlaufen werden solange ich in den Grenzen korrekte Werte eingebe.
-
Könnte man so machen, dann müsste man aber die Textausgabe bzw. Aufforderung der Eingabe im Programm ändern.
-
-
Da das Problem jetzt gelöst ist kann der thread geschlossen werden falls man das hier so macht.
Nochmal vielen Dank an Th69 und SeppJ