Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14
Überblick 1 2 / 14
Motivation Computer arbeiten nach dem EVA-Prinzip: Eingabe, Verarbeitung, Ausgabe. Dies bedeutet, dass eine Eingabe durch verschiedene Geräte erfolgt, vom System verarbeitet (Berechnungen) und anschliessend auf einem Ausgabegerät dem Benutzer oder einem anderen System übergeben wird. In C++ existieren mehrere sogenannte Kanäle für die Ein- und Ausgabe (engl. Input, Output), die der Programmierer ansprechen kann. Dabei muss er sich nicht darum kümmern, wie genau der jeweilige Bildschirm die Ausgabe umsetzt oder wie die Tastatur eingaben erkennt, da diese Funktionalitäten das Betriebssystem zur Verfügung stellt. Durch sogenannte Schnittstellen kann ein Programm auf diese Geräte zugreifen. C++ verwendet als Standardeingabekanal die Tastatur, für die Standardausgabe ist der Bildschirm vorgesehen. Beides lässt sich aber verändern, so dass auch von einer Datei gelesen oder auf das Netzwerk geschrieben werden kann (nicht Teil dieser Veranstaltung). 3 / 14
Überblick 1 4 / 14
In C++ ist die Ein- und Ausgabe nicht fester Bestandteil der Programmiersprache, da manche Geräte diese gar nicht benötigen (z.b. Mikrochips in Embedded Geräten). Um diese Funktionalität zu nutzen, muss diese vorher mittels include eingebunden werden. C++ nutzt sogenannte I/O Streams (Ströme), über die vom Programm aus Eingaben oder Ausgaben erfolgen. Die Anweisung dazu haben wir bereits im Hallo Welt-Programm gesehen. 1 # include <iostream > // ermoeglicht Verwendung von cout / cin 2 using namespace std; 3 4 int main () { 5 cout << " Hallo Welt "; // Ausgabe von Hallo Welt 6 return 0; 7 } 5 / 14
Ausgabeströme verketten Ausgabeströme lassen sich miteinander verketten, um mehrere Elemente wie Variablen und Strings auf einmal auszugeben. Der Operator << verbindet diese Elemente miteinander. 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 float mwst = 19; 6 cout << " Die Mehrwertsteuer betraegt " << mwst << "%"; 7 return 0; 8 } 6 / 14
Berechnungen in Ausgabeströmen Ausgabeströme sind in der Lage, die Ergebnisse von Berechnungen direkt auszugeben. 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 cout << " 2 * 3 = " << 2 * 3; 6 return 0; 7 } Hierbei ist zu beachten, dass abhängig vom verwendeten Compiler nicht vorhersehbar ist, in welcher Richtung die Berechnungen ausgeführt werden. int x = 2; cout << "x = " << x << ", x**2 = " << (x *= x); Zwei Ergebnisse sind hier möglich: von links nach rechts von rechts nach links x = 2, x**2 = 4 x = 4, x**2 = 4 7 / 14
formatieren Die Ausgabeströme lassen sich auf vielfältige Weise manipulieren, um eine andere Darstellungsweise zu erzeugen. Dazu muss die Headerdatei iomanip.h über #include eingebunden sein. Die folgende Tabelle zeigt einige dieser Manipulatoren: Manipulator dec hex oct flush endl setw(int) setprecision(int) Beschreibung Dezimale Zahlenausgabe (Standard) Hexadezimale Zahlenausgabe Oktale Zahlenausgabe Ausgabepuffer auf das Ausgabemedium leeren Ausgabe von \n (Zeilenumbruch) mit anschliessendem flush int setzt die minimale Ausgabebreite (nur unmittelbare Ausgabe, wird danach wieder auf 0 gesetzt) Ausgabegenauigkeit von Zahlen auf insgesamt int Stellen (gerundet) setfill(char) Fügt char als Füllzeichen an 8 / 14
Beispiele zur Ausgabemanipulation 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 cout << oct << 10 << endl ; 6 cout << hex << 10 << endl ; 7 cout << dec << 10 << endl << endl ; 8 9 cout << setfill ( 0 ) << setw (4) << 123 << endl ; 10 cout << setw (2) << 127 << endl ; 11 12 cout << setprecision (4) << 3.1415 << endl ; 13 cout << setw (10) << setprecision (4) << 3.2 << endl ; 14 return 0; 15 } Ausgabe: 12 a 10 0123 127 3.142 00000003.2 9 / 14
Weitere Manipulatoren Manipulator boolalpha noboolalpha showuppercase noshowuppercase fixed Beschreibung Bool sche Werte werden anstatt Integerwerten mit true und false dargestellt Gegenteil zu boolalpha Wandelt Strings vor der Ausgabe in Grossbuchstaben um Gegenteil zu showuppercase Erzwingt eine feste Anzahl von Dezimalstellen für Fliesskommazahlen scientific Wissenschaftliche Darstellungsweise für Fliesskommazahlen 10 / 14
Überblick 1 11 / 14
Variablenwerte lassen sich über cin von der Tastatur einlesen. Damit lassen sich Programme interaktiver gestalten. 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 float zahl ; 6 cout << " Eine Zahl eingeben, die quadriert werden soll : "; 7 cin >> zahl ; // einlesen der Variable zahl von Tastatur 8 cout << zahl << " quadriert ist " << zahl * zahl ; 9 return 0; 10 } Zu Beachten ist hier besonders die Richtung der Operatoren << und >>. Diese zeigen immer dorthin, wohin der Ein- bzw. fliesst. Beispielsweise zeigt der Operator in Zeile 7 auf die Variable (hier zahl), in die eingelesen werden soll. Bei cout weisen die Pfeile nach links, um anzuzeigen, dass hier eine Ausgabe stattfindet. 12 / 14
Eingabeströme verketten Es lassen sich mehrere Variablen über den gleichen einlesen. Um die Variablen bei der Eingabe voneinander zu trennen, muss ein Leerzeichen eingegeben werden. 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 float zahl1, zahl2 ; 6 cout << " Bitte zwei Zahlen zur Multiplikation eingeben : "; 7 cin >> zahl1 >> zahl2 ; // einlesen von zahl1 und zahl2 8 cout << zahl1 << " * " << zahl2 << " = " zahl1 * zahl2 ; 9 return 0; 10 } Puffer dienen dazu, die Eingaben im Speicher vorzuhalten, um die Werte dann den Variablen zuzuweisen. Durch Puffer können auch Eingaben auf langsamen Eingabegeräten (z.b. im Netzwerk) so lange gesammelt und vorgehalten werden, bis diese vollständig sind (nach Eingabe von Enter oder dem Trennzeichen). 13 / 14
Werden in Zeile 7 drei Zahlen statt nur zwei eingegeben, so verbleibt die dritte Zahl im Puffer und wird dann beim einlesen von zahl3 in Zeile 13 verwendet. Der Benutzer hat gar nicht die Chance, an dieser Stelle eine Zahl einzugeben. 14 / 14 Gepufferte Eingabe Mehr Eingaben als erwartet füllen die Variablen aus dem Puffer der Reihe nach auf und geben diese dann ebenso in dieser Reihenfolge wieder aus. 1 # include <iostream > 2 using namespace std; 3 4 int main () { 5 int zahl1, zahl2, zahl3 ; 6 cout << " Bitte zwei Zahlen eingeben : "; 7 cin >> zahl1 >> zahl2 ; 8 9 cout << " Zahl1 : " << zahl1 << endl 10 << " Zahl2 : " << zahl2 << endl ; 11 12 cout << " Und jetzt noch eine Zahl : "; 13 cin >> zahl3 ; 14 cout << " Zahl3 : " << zahl3 << endl ; 15 return 0; 16 }