Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

2 Ein - und Ausgabe

2 Ein - und Ausgabe

Für die Eingabe benutzt man z.B. die Funktion "scanf()" (alternativ "cin"). Für die Ausgabe empfiehlt sich z.B. die Funktion "printf()" (alternativ "cout"). Ein - und Ausgabe sind in der Programmierung wesentliche Bestandteile und werden in fast jedem Beispiel vorkommen. Nach diesem großen Kapitel 2 werde ich diese Funktionen nicht weiter erklären.

Zum Seitenanfang
Zum Inhaltsverzeichnis

2.7 Kombination der Funktionen

2.7 Kombination der Funktionen

Variante 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
					
int iSummand1;
int iSummand2;

printf("Bitte eine Zahl eingeben:      ");
scanf("%i", &iSummand1);

printf("Bitte noch eine Zahl eingeben: ");
scanf("%1", &iSummand2);

printf("Die Summe beider Zahlen ist %i.", (iSummand1 + iSummand2));
printf("\n\n");
printf("Auf Wiedersehen!");	
					

Variante 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
					
int iSummand1;
int iSummand2;

cout << "Bitte eine Zahl eingeben:      ";
cin >> iSummand1;

cout << "Bitte noch eine Zahl eingeben: ";
cin >> &iSummand2;

cout << "Die Summe beider Zahlen ist " << (iSummand1 + iSummand2) << ".";
cout << endl << endl;
cout << "Auf Wiedersehen!";
					

Ausgabe:

Bitte eine Zahl eingeben:      5
Bitte noch eine Zahl eingeben: 10
Die Summe beider Zahlen ist 15.	

Auf Wiedersehen!
		
Zum Seitenanfang
Zum Inhaltsverzeichnis

2.8 Übungsaufgabem I

2.8 Übungsaufgabem I

  1. Schreiben Sie ein "hello world" Programm, welches nur auf dem Bildschirm "Hello World" ausgeben soll. Benutzen Sie dazu die Funktion "printf".
  2. Bauen Sie das Programm aus Aufgabe 1 so um, dass "cout" benutzt wird.
  3. Geben Sie das Ergebnis der Berechnung 15 / 4 so auf dem Bildschirm aus, dass das Ergebnis eine ganze Zahl ist und der Rest mit da Steht.
  4. Geben Sie das genaue Ergebnis der Berechnung 17 / 16 als Gleitkommazahl aus.
  5. Lassen Sie vom Benutzer zwei ganzzahlige Werte einlesen und geben Sie diese in umgekehrter Reihenfolge wieder aus. Benutzen Sie dafür die Funktionen "printf" und "scanf".
  6. Bauen Sie das Programm aus Aufgabe 5 so um, dass "cout" und "cin" benutzt wird.
  7. Lassen Sie den Benutzer zwei Gleitkommazahlen eingeben und geben Sie das Produkt aus.
Zum Seitenanfang
Zum Inhaltsverzeichnis

2.6 Eingaben mit getch und getche

2.6 Eingaben mit getch und getche

Bisher musste der Benutzer immer ENTER drücken, um seine Eingabe zu bestätigen. Dies muss aber nicht sein, denn es gibt auch Funktionen, welche sofort auf einen Tastendruck reagieren. Um dies zu realisieren, gibt es in der Bibliothek "conio.u" zum einen die Funktion "getch", welche versteckte Eingaben macht (z.B. für Passwortabfragen oder kleine Spiele ganz nützlich, wie Sie gleich sehen werden) und "getche", welche die Eingabe auf der Console ausgibt. Allerdings läuft es mit diesen Funktionen etwas anders, als bisher. Zum einen übergibt man ihnen keine Referenz auf eine Variable, sondern die Funktionen liefert einen Tastencode zurück und zum anderen ist dieser Code ein Integer und kein Zeichen. Dies ist aber nicht weiter schlimm, da Sie ja wissen, wie man Variablen ineinander Konvertiert.

Des Weiteren sei noch erwähnt, dass nicht alle Tasten auf ihrer Tastatur gleichberechtigt sind. Es gibt Zeichen-Tasten (a-z, 1-0 usw.), Steuerungs-Tasten (Strg, Alt, Tab usw.) und Sondertasten (F1-F12, Bild hoch/runter, Einfg, Entf usw.). Die zwei Funktionen reagieren nur auf die Zeichen-Tasten und die Sondertasten, wobei die Sondertasten durch zwei Zeichen dargestellt werden. Die einzige Ausnahme ist die Steuertaste ENTER, welche dem ASCII-Code 10 entspricht.

Folgendes Beispiel zeigt, wie man so lange wartet, bis der Benutzer eine Taste drückt

 1
 2
 3
 4
 5
 6
 7
 8
 9
					
#include <conio.h>

// ...

printf("Bitte Taste druecken, um fortzufahren!\n");
fflush(stdin);
getch();

// ...
					

Mit dieser Methode finden Sie auch ganz einfach heraus, welcher Tastencode zu welchem Buchstabe passt. Ein Testprogramm könnte wie folgt aussehen.

 1
 2
 3
 4
					
printf("Der Code zu Taste ");
fflush(stdin);
int iEingabe = getche();
printf(" lautet %i\n", iEingabe);
					

Wie Sie sehen konnten, ist es auch hier notwendig, vorher den Tastaturpuffer zu leeren, da noch ein Steuerzeichen enthalten sein könnte.

Zum Seitenanfang
Zum Inhaltsverzeichnis

2.4 Die Funktion scanf()

2.4 Die Funktion scanf()

Diese Funktion ließt Werte für Variablen von der Tastatur ein und benutzt auch einen Formatstring. Man übergibt ihr aber nicht den Wert einer Variable, sondern die Adresse im RAM/Arbeitsspeicher wo die Variable steht, also die Angabe wo die Tastatur den Wert hin tun soll. Stellen Sie sich das so vor. Ich erwähnte bereits die Metapher der Kochtöpfe. Wenn also jemand für Sie Wasser in einen Topf füllen soll, dann bringt es nichts, diesem jemanden den leeren Inhalt des Topfes zu geben, sondern sie müssen auf den Topf zeigen oder der Person den Topf in die Hand drücken. Erst dann weiß derjenige, wo er Wasser einfüllen soll und deswegen übergibt man nicht den Wert der Variable, sondern die Position.

Referenz einer Variable

Doch wie kommt man jetzt an die Adresse bzw. Referenz einer Variable heran? Dies geschieht mittels des "&" Operators. Wenn man wissen will, welche Herdplatte an ist, dann schaut man sich die Knöpfe an und sieht anhand des kleinen Bildchens, welche Platten beheizt werden. Wenn man nun in diesem Bildchen das ganze einkreist, erhält man eine Art Kaufmanns-Und. Dies können Sie sich als Eselsbrücke merken, wenn es darum geht, nicht den Wert einer Variable zu übergeben, sondern ihre Position.

Das Schema sieht so aus: scanf(<Formatstring>, &<Variable>[, &<Variable> ...])

Nun ergibt sich da noch eine kleine Schwierigkeit. Die Tastatur hat einen Puffer, in dem alle Sachen abgelegt werden, die man auf der Tastatur drückt. Dies betrifft nicht nur Zahlen und Buchstaben, sondern auch die ENTER Taste. Liest man Zahlen ein, stört dies nicht weiter, da das ENTER zunächst mit eingelesen, aber nicht mit interpretiert wird. Wenn aber ein einzelnes Zeichen eingelesen werden soll, dann verbleibt das ENTER im Puffer und wenn anschließend noch ein Zeichen eingelesen werden soll, wird dieses verbleibende ENTER genommen und der Benutzer wird nach keiner erneuten Eingabe gefragt. Aus diesem Grund gibt es Funktionen, mit welchen Sie den Tastaturpuffer leeren können und jene sollten Sie immer aufrufen, bevor Sie ein einzelnes Zeichen oder Zeichenketten einlesen wollen. Wie dies aussehen könnte, sehen Sie in folgendem Beispiel.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
					
int  iZahl;
char cZeichen;

// Wartet bis der Anwender eine natürliche Zahl eingegeben hat
// und ENTER gedrückt hat
scanf("%i", &iZahl);

// Tastaturpuffer leeren
fflush(stdin);
// Wartet bis Anwender eine Zahl oder Buchstaben eingegeben hat
// und ENTER gedrückt hat
scanf("%c", &cZeichen);
					
Zum Seitenanfang
Zum Inhaltsverzeichnis

2.1 Die Funktion printf()

2.1 Die Funktion printf()

Diese Funktion benutzt Formatstrings. Dies sind Zeichenketten, welche Platzhalter beinhalten können. Jene Platzhalter werden mit dem Inhalt von Variablen oder Konstanten ersetzt, welche der Funktion mit übergeben werden. Wichtig dabei ist, dass die Anzahl und Reihenfolge der Platzhalter und die Anzahl der übergebenen Variablen/Konstanten übereinstimmt.

Das Schema sieht so aus: print(<Formatstring>[, <Variable1>|<Wert>, <Variable2>|<Wert>, ...])

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
					
#include <stdio.h>

// ...

int iZahl = 15;

// Normaler Text wird ausgegeben			
printf("String ohne Platzhalter\n");
// %i = gebe an dieser Stelle ein Integerwert aus
printf("Zahl = %i\n", iZahl);
// Hier wird eine Konstante übergeben
printf("andere Zahl = %i\n", 18);
// Hier werden drei Variablen/Werte übergeben
printf("%i + %i = %i\n", iZahl, iZahl, (iZahl + iZahl));
// Hier wird ein ASCII-Wert übergeben
printf("%c", 100);
					

Ausgabe:

String ohne Platzhalter
Zahl = 15
andere Zahl = 18
15 + 15 = 30
d
		

Die Ausgaben können auch formatiert werden. Ich nenne jetzt nur ein paar Beispiele, aber wenn ihr das Wort "printf" in Visual Studio hinschreibt und "F1" drückt, bekommt ihr eine Liste mit allen Möglichkeiten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
					
#include <stdio.h>

// ...

// %f = gebe an dieser Stelle ein Floatwert aus
printf("%f\n", 1.5);
// Mindestens 9 Stellen
printf("%9f\n", 1.5);
// Mindestens 10 Stellen, da es aber nur sechs Nachkommastellen + , gibt,
//werden 3 vor dem Komma reserviert
printf("%10f\n", 1.5);
printf("%f\n", 100.25);
// Mindestens 6 Stellen, davon maximal 2 nach dem Komma
printf("%6.2f\n", 10.25)
// Mindestens 7 Stellen, davon maximal 3 nach dem Komma;
printf("%7.3f\n", 1.25)
// Vor dem Komma ist egal, aber danach maximal 3 Stellen;
printf("%.3f\n", 1.25);
// Obwohl ein float übergeben wird, wird nur der Integerwert ausgegeben	
printf("%i", 1.25);
					

Ausgabe:

1.5000000
 1.5000000
  1.5000000
100.2500000
 10.25
  1.250
1.250
1
		
Zum Seitenanfang
Zum Inhaltsverzeichnis

2.3 Ausgaben mit cout

2.3 Ausgaben mit cout

Der modernere Ansatz unter C++, ist die Ausgabe mittels dem statischen Objekt "cout" (gesprochen C-Out). Ich habe lange damit gerungen, ob ich dieses Kapitel an dieser Stelle bringe, da hier ein Mechanismus benutzt wird, der erst ganz am Ende des Buches erklärt wird und ich Ihnen nahe gelegt habe, nichts zu benutzen, was Sie nicht zu 100% verstehen. Dennoch muss das Kapitel kommen, da man zum einen in der Literatur fast nur Ausgaben mit "cout" findet und es zum anderen für Anfänger leichter zu verstehen ist als "printf".

Das Schema sieht so aus: cin << <Variable>|<Wert> [<< <Variable>|<Wert> ...]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
					
#include <iostream>
using namespace std;

// ...

int iZahl = 15;

cout << "String ohne Platzhalter" << endl;
cout << "Zahl = " << iZahl << endl;
cout << "andere Zahl = " << 18 << endl;
cout << iZahl << " + " << iZahl << " = " << (iZahl + iZahl) << endl;
cout << (int)100;
					

Die Ausgabe sieht wieder so aus wie im vorletzten Beispiel, allerdings hat sich einiges am Quelltext getan. Zum einen benötigt man ein anderes Include und dann braucht man noch den Befehl "using namespace std". Letzteres ist wichtig, da man sonst vor jedes "cout" und "endl" noch "std::" schreiben müsste, was auf Dauer sehr nervig sein kann. Neu ist auch, dass ich keine Escape-Zeichen mehr benutze, was aber durchaus möglich ist. "\n" wurde beispielsweise mit "endl" ersetzt.

Der größte Unterschied liegt aber jetzt darin, dass man keine Ausgabefunktion benutzt, sondern das Objekt "cout" und das jede Ausgabe serialisiert, also der "<<" Operator benutzt wird. Man schiebt buchstäblich das Auszugebende in das Objekt rein und es kümmert sich um den Rest.

Es ist außerdem möglich, auch hier die Ausgaben zu formatieren. Dies sieht dann so aus.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
					
#include <iostream>
using namespace std;

// ...

cout << 1.5 << endl;
cout.width(4);
cout << 1.5 << endl;
cout.width(5);
cout << 1.5 << endl;
					

Ausgabe:

1.5
 1.5
   1.5
		

Zum manipulieren der Breite der Ausgabe, muss man also im Vorfeld eine extra Funktion aufrufen. Des Weiteren hat man keinerlei Einfluss auf die Darstellung von Nachkommastellen, denn da werden immer nur so viele Stellen angegeben, wie nötig. Es ist also nicht möglich "1,0" auszugeben.

Für welche Form der Ausgabe Sie sich entscheiden überlasse ich Ihnen, allerdings handelt man sich mit "cout" einige Nachteile ein bzw. man ist nicht mehr so flexibel. Wie gezeigt hat man keinen Einfluss auf Gleitkommazahlen, des Weiteren ist die Syntax nicht unbedingt übersichtlicher und man kann es nicht erreichen, dass eine Variable in einem anderen Format dargestellt wird. Hierfür muss man explizit ein Typecast benutzen. Der größte Kritikpunk ist allerdings der starre Aufbau der Ausgabe. Gerade wenn es um Internationalisierung (l14n) geht, also ein Programm Ausgaben in mehreren Sprachen haben soll, bekommt man zunehmend Schwierigkeiten. Feste Wörter kann man in Variablen speichern und die zusammen puzzeln. Soll aber in die Ausgabe noch ein dynamisch berechneter Wert einfließen, der im deutschen wo anders im Satz steht als im englischen, hat man schon mehr zu kämpfen. Aus diesen genannten Gründen, werde ich im weiteren Verlauf meines Buches nur die Funktion "printf" benutzen. Zudem werde ich Ihnen später noch weitere Funktionen zeigen, welche eine ähnliche Syntax benutzen wie "printf" und wenn Sie den Umgang dieser Funktion beherrschen, brauchen Sie sich an nichts Neues zu gewöhnen.

Zum Seitenanfang
Zum Inhaltsverzeichnis

2.5 Eingaben mit cin

2.5 Eingaben mit cin

Eine weitere Möglichkeit Werte einzulesen, ist "cin" (gesprochen C-In). Sie funktioniert ähnlich wie "cout", nur mit dem kleinen Unterschied, dass man jetzt den ">>" Operator benutzt. Das was das Objekt "cin" durch die Tastatur einlesen lässt, wird buchstäblich in die entsprechende rechts stehende Variable rein geschoben.

Das Schema sieht so aus: cin >> <Variable> [>> <Variable> ...]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
					
int  iZahl;
char cZeichen;

// Wartet bis der Anwender eine natürliche Zahl eingegeben hat
// und ENTER gedrückt hat
cin >> iZahl;

// Wartet bis Anwender eine Zahl oder Buchstaben eingegeben hat
// und ENTER gedrückt hat
cin >> cZeichen;
					

Auch hier gibt es wieder Vor - und Nachteile gegenüber der Funktion "scanf". Sehr positiv ist, dass der Variablentyp wieder automatisch erkannt wird (was aber wie gesagt auch Nachteile haben kann). Allerdings benötigt man jetzt keinen "&" Operator. Sie werden sich jetzt sagen, dass das doch gut bzw. einfacher ist. Dies mag zwar stimmen, aber warum das so ist, muss ich Ihnen an dieser Stelle noch vorenthalten. Wenn ich dann später das Kapitel mit den Funktionen und benutzerdefinierten Operatoren besprochen habe, werde ich noch einmal kurz auf "cin" und "cout" zurückkommen. Da ich Ihnen also hiermit wieder ein Mittel in die Hand drücke, was Sie nicht zu 100% verstehen, rate ich eher dazu, die Funktion "scanf" zu benutzen, zumal Sie dadurch üben, wie man an die Adresse einer Variable heran kommt (was dann später bei den Zeigern intensiv benutzt werden muss). Ein weiterer klarer Vorteil ist, dass man sich mit "cin" nicht um den Tastaturpuffer kümmern muss.

Zum Seitenanfang
Zum Inhaltsverzeichnis

2.2 Escapezeichen

2.2 Escapezeichen

Dem aufmerksamen Leser ist in den vorhergehenden Beispielen bestimmt etwas aufgefallen. Ich spreche von den Escapezeichen oder auch Escapesequenzen genannt, die u.a. für Formatierungen sorgen. Sie werden mit einem "\" eingeleitet. Hier mal die Wichtigsten:

Mehr dazu finden Sie in der Online-Hilfe zu "printf"

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012