Standardeingabe
Eingabestream cin
Für die Standardeingabe, in der Regel ist dies die Tastatur, wird vorzugsweise der Eingabestream cin verwendet, welcher ebenfalls im Namensraum std definiert ist.
Wird der Eingabestream cin verwendet, ist die Datei iostream einzubinden.
Die Syntax für die Eingabe mittels cin lautet:
std::cin >> var1 [ >> var2 [ >> var3 ...]];
Nach dem Eingabestream cin folgt der Operator >> und dann der Name des einzulesenden Datums. Mehrere einzulesende Daten werden durch entsprechende Wiederholungen aneinandergehängt. Die Daten dürfen beliebige Datentypen haben, jedoch ist bei der Eingabe darauf zu achten, dass sich die eingegebenen Daten im dazugehörigen Datum abspeichern lassen. Wie sich fehlerhafte Eingaben auswirken wird gleich noch erklärt.
Einlesen von (alpha-)numerischen Daten
Bei der Eingabe mehrerer Daten werden die Daten durch Leerzeichen voneinander getrennt und die Eingabe wird mit RETURN abgeschlossen. Die Zuordnung, Eingabe zum Datum, erfolgt von links nach rechts.
// Datei einbinden
#include <iostream>
#include <print>
// Variablen definieren
short var1;
long var2;
int main ()
{
std::print("Zwei int-Werte eingeben: ");
// 2 Daten einlesen
std::cin >> var1 >> var2;
// und wieder ausgeben
std::println("var1: {}, var2: {}",var1,var2);
}
Zwei int-Werte eingeben: 1 3445
var1: 1, var2: 3445
Standardmäßig werden numerischen Eingaben im Dezimalformat erwartet. Mithilfe der Manipulatoren std::hex und std::oct können Eingaben jedoch als Hex- oder Oktalwerte eingegeben werden. Die Eingabe darf dabei optional die Präfixe 0X, 0x oder 0 zur Kennzeichnung der Zahlenbasis enthalten. Der Manipulator std::dec stellt die Eingabe wieder auf das Dezimalsystem um.
#include <iostream>
#include <print>
long var; // Variable definieren
int main ()
{
std::print("Bitte eine Hex-Zahl eingeben: ");
// Einlesen eines Wertes in Hex
std::cin >> std::hex >> var;
std::println("Hex {0:#x} ist dezimal {0}\n",var);
std::print("Bitte eine Dezimal-Zahl eingeben: ");
// Eingabe wieder auf Dezimal umstellen
std::cin >> std::dec >> var;
std::println("Dezimal {0} ist hex {0:#x}\n",var);
}
Bitte eine Hex-Zahl eingeben: ff
Hex 0xff ist dezimal 255
Bitte eine Dezimal-Zahl eingeben: 128
Dezimal 128 ist hex 0x80
Der sicherste Weg zum Einlesen von alphanumerischen Eingaben führt über das Einlesen der Daten in ein string-Objekt. Der Datentyp string liegt ebenfalls im Namensraum std und ist in der Header-Datei string definiert, die entsprechend einzubinden ist.
Ein string-Objekt wird wie folgt definiert:
std::string myString;
string-Objekte und deren Anwendung werden in den Kapiteln String-Objekte I und String-Objekte II detaillierter beschrieben. Stellen Sie sich für den Augenblick unter einem string-Objekt eine Variable mit dem Datentyp string vor, die beliebig viele Zeichen aufnehmen kann.
#include <iostream>
#include <print>
long var; // Variable definieren
int main ()
{
// Zwei string-Objekte definieren
std::string wort1, wort2;
// Einlesen zweier Woerter in string-Objekte
std::print("Geben Sie 2 Worte ein: ");
std::cin >> wort1 >> wort2;
std::println("1. Wort: {}, 2. Wort: {}",wort1,wort2);
}
Geben Sie 2 Worte ein: bald Feierabend
1. Wort: bald, 2. Wort: Feierabend
Einlesen einer Zeile
Da beim Eingabestream cin die einzelnen Eingaben durch Leerzeichen voneinander getrennt werden, sind Eingaben die selbst Leerzeichen enthalten zeilenweise einzulesen. Um eine komplette Zeile einzulesen, wird die Bibliotheksfunktion std::getline() eingesetzt.
istream& std::getline (std::istream& in,
std::string& line[, char del]);
in ist der Eingabestream, aus dem die Daten ausgelesen werden, und line das string-Objekt, in dem die Daten abgelegt werden. Der letzte optionale Parameter del definiert das Zeichen, bis zu dem die Daten übernommen werden. Standardmäßig ist dies der Zeilenvorschub (RETURN).
Den Rückgabewert der Bibliotheksfunktion istream& können wir in diesem Fall ignorieren.
#include <iostream>
#include <print>
#include <string>
int main ()
{
// string-Objekt definieren
std::string input;
// Hinweis ausgeben
std::cout << "Bitte einen Text eingeben: ";
// Zeile einlesen
std::getline(std::cin, input);
// Eingabe wieder ausgeben
std::println("Eingabe war: {}", input);
}
Bitte einen Text eingeben: Text mit Leerzeichen
Eingabe war: Text mit Leerzeichen
Wie ein String in einzelne Wörter 'zerlegt' werden kann, wird im Kapitel String I beschrieben.
Fehlerbehandlung
Soll mittels cin ein numerischer Wert eingelesen werden und es wird stattdessen ein nicht-numerischer Ausdruck eingegeben, wird dem einzulesenden Datum der Wert 0 zugewiesen. Die Eingabe wird an die nächsten cin-Anweisung weitergereicht, die nicht-numerische Eingaben verarbeiten kann. Eine solche falsche Eingabe kann abgefangen werden, indem nach dem Einlesen die Methode
bool retVal = cin.fail();
aufgerufen wird. Liefert die Methode true zurück, war die Eingabe fehlerhaft. In diesem Fall ist zu beachten, dass der Fehlerstatus des Eingabestreams mit cin.clear() zu löschen ist und dass die Eingabe noch im Eingabepuffer steht! Um den Inhalt des Eingabepuffers zu löschen, ist die Methode cin.ignore() wie unten im Beispiel angegeben aufzurufen.
Bestand die Eingabe eines numerischen Wertes am Anfang aus numerischen Zeichen gefolgt von nicht-numerischen Zeichen, erhält das einzulesende Datum den numerischen Teil der Eingabe zugewiesen. Der Rest der Eingabe wird wiederum an die nächste cin-Anweisung weitergeleitet, die den nicht-numerischen Teil der Eingabe verarbeiten kann. Unglücklicherweise liefert die Methode cin.fail() hier false zurück, da die Eingabe (wenigstens teilweise) erfolgreich war.
#include <iostream>
#include <print>
int main ()
{
// short Variable definieren und einlesen
short var = 111;
std::println("var: {}",var);
// Wert einlesen
std::print("short Wert eingeben: ");
std::cin >> var;
// Wenn fail() true zurueck gibt
if (std::cin.fail())
{
std::println("cin.fail(): true");
// Fehler loeschen und restl. Eingabe verwerfen
std::cin.clear();
std::cin.ignore(std::numeric_limits<int>::max(), '\n');
}
std::println("var: {}",var);
}
var: 111
short Wert eingeben: text
cin.fail(): true
var: 0
var: 111
short Wert eingeben: 12text
var: 12
Übungen
cin_01
Erstellen Sie ein Programm zur Lösung eines Gleichungssystems mit 2 Unbekannten:
A1x + B1y + C1 = 0
A2x + B2y + C2 = 0
Das Gleichungssystem wird durch Gleichsetzen der beiden Gleichungen gelöst. Dazu werden beiden Gleichungen zuerst normiert und dann so umgeformt, dass auf der linken Seite der Gleichungen nur noch x übrig bleibt.
x = -B1y/A1 - C1/A1
x = -B2y/A2 - C2/A2
Die beiden umgeformten Gleichungen sind dann gleichzusetzen und daraus y zu berechnet. Der so erhaltene y-Wert ist dann in eine der beiden Gleichungen einzusetzen und damit der x-Wert zu berechnen.
Loesung Gleichungssystem mit zwei Unbekannten:
A1x + B1y + C1 = 0
A2x + B2y + C2 = 0
Alle Koeffizienten muessen ungleich 0 sein!
(A1 B1 C1)? 1 -2 -4
(A2 B2 C2)? 2 5 -35
Ergebnis: X = 10, Y = 3
cin_02
Von einem Einkauf sind der Steueranteil und der Nettobetrag zu berechnen. Dazu ist der an der Kasse bezahlte Betrag und der darin enthaltene Steuersatz (in %) einzulesen. Das Programm soll berechnen, wie viel Steuer im gezahlten Betrag enthalten ist und wie viel ohne Steuer zu zahlen wäre.
Die berechneten Beträge sind mit 2 Nachkommastellen auszugeben.
Hinweis: Bei einem angenommenen Steuersatz von 7% zahlen Sie 107% an der Kasse, 100% für die Ware und 7% für das Finanzamt.
Wie viel EUR haben Sie bezahlt? 233.45
Und wie hoch ist die Steuer (%)? 7
Steueranteil: 15.27
Nettobetrag : 218.18
x