ein Kapitel zurück                                           ein Kapitel weiter

Wir haben jetzt einiges über Variablen und Operatoren gelernt aber viel Einfluss hatten wir dabei nicht auf unser Programm gehabt. Jetzt kommen wir zu einer Kontrollstruktur. Damit ist es uns möglich während des Programmablaufes gewisse Entscheidungen zu beeinflussen.

Die if - Anweisung hat dabei folgendes Aussehen....

if(AUSDRUCK)
{
  anweisung1;
}
anweisung2;


In dem Fall heißt das jetzt, wenn der AUSDRUCK zwischen den beiden Klammer '()' wahr ist wird die anweisung1 ausgeführt. Falls der AUSDRUCK zwischen den Klammern nicht wahr sein sollte wird die anweisung1 übersprungen und es wird mit anweisung2 fortgefahren. Falls die anweisung1 aus mehreren Anweisungen besteht so muss diese zu einem Block zwischen geschweiften Klammern '{}' zusammengefasst werden.

Das ganze in sieht in einem Programmablaufplan etwa so aus...

PAP if


Hierzu erst mal ein Beispiel...

/*Download:if1.c*/
#include <stdio.h>

int main()
{
int zahl;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&zahl);

if(zahl<10)
{
printf("Die Zahl %d ist kleiner wie 10\n",zahl);
}
printf("Bye\n");
return 0;
}




In diesem Beispiel werden sie aufgefordert eine Zahl einzugeben. Die Bedienung in...

if(zahl<10)

...wird nun auf Wahrheit überprüft, ob die eingegebene Zahl kleiner wie 10 war. War sie kleiner wie 10 wird die printf - Anweisung im Anweisnungsblock ausgeführt und die printf - Anweisung danache ebenfalls. Ist die eingegebene Zahl aber nicht 10, wird nur die printf-Anweisung hinter dem Anweisungsblock ausgeführt.

Hier ein weiteres Beispiel...

/*Download:if2.c*/
#include <stdio.h>

int main()
{
unsigned int i;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&i);

if(i>100)
{
printf("Die Zahl ist größer als 100\n");
}

if(i<100)
{
printf("Die Zahl ist kleiner wie 100\n");
}

if(i==100)
{
printf("Die Zahl istgleich 100\n");
}
return 0;
}





Was das Programm macht ist glaube ich erkenntlich. Man gibt eine Zahl ein und durch die einzelnen 'if' - Abfragen schaut das Programm ob die eingegeben Zahl größer, kleiner oder gleich 100 ist. Bevor ich euch die 'if' - Kontrollstruktur erkläre muss ich sie noch über ein paar Operatoren aufklären...

Vergleichsoperator Bedeutung
a<b Wahr, wenn a kleiner als b
a<=b Wahr, wenn a kleiner oder gleich b
a>b Wahr, wenn a größer als b
a>=b Wahr, wenn a größer oder gleich b
a==b Wahr, wenn a gleich b
a!=b Wahr, wenn a ungleich b

Zurück zum Programm. Die erste Anweisung...

if(i>100)

...testet ob die Zahl 'i' die sie eingegeben haben größer als 100 ist. Ist die Bedienung wahr springt das Programm unmittelbar in den für diese Bedienung geschriebenen Anweisungsblock der in den geschweiften Klammern steht. Also falls die eingegeben Zahl größer als 100 ist dann wird der Anweisungsblock...

{
 printf("Die Zahl ist größer als 100\n");
}


...ausgeführt. Besteht der Anweisungsblock hinter der Kontrollstruktur aus nur einer Anweisung können die geschweiften Klammern auch weggelassen werden :

if(i>100)
  printf("Die Zahl ist größer als 100\n");


Aber wir benutzen aus Übersichtlichskeitsgründen am Anfang noch die Schreibweise mit den geschweiften Klammern.

Die nächsten if - Abfragen...

if(i<100)
...........
if(i==100)


muss ich wohl nicht mehr so Ausführlich kommentieren. Sie sind identisch mit der Ausführung zuvor. Hier testen wir ob die eingegebene Zahl kleiner und in dritten if - Abrage gleich 100 sind. Sollte sich einer dieser Fälle als wahr enthalten so wird auch hier der Anweisungsblock ausgeführt.

Ein häufiger Fehler der gemacht wird ist folgender...

if(i=100)

Hiermit wurde der Variablen 'i' der Wert 100 zugewiesen und der Anweisungsblock wird auch ausgeführt. Egal ob der Wert gleich 100 ist. Somit ist diese if - Abfrage immer wahr. Da wird sich der Compiler auch nicht mit einer Fehlermeldung beschweren da ja rein syntaktisch auch kein Fehler vorhanden ist. Also gilt...

'=' ist nicht Daselbe wie '=='

Eigentlich könnten wir uns doch...

if(i==100)

...diese Abfrage sparen. Den wenn die Variable 'i' nicht größer als 100 und auch nicht kleiner als 100 ist somit kann sie nur noch gleich 100 sein. Und um uns so etwas zu ersparen gibt es die else - Anweisung was soviel heißt wie - ansonsten nimm mich- ...

else
 {
  printf("Die Zahl istgleich 100\n");
 }


Der Syntax von if-else sieht folgendermaßen aus (else folgt übrigens immer einem vorrausgehendem if oder else if)...

if(AUSDRUCK==wahr)
{
  anweisung1;
}
else
{
  anweisung2;
}


Und hier der Programmablaufplan zu if-else...

PAP if else


Hierzu nun auch ein kleines Programmbeispiel...

/*Download:if3.c*/
#include <stdio.h>

int main()
{
int zahl;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&zahl);

if(zahl<10)
{
printf("Die Zahl %d ist kleiner wie 10\n",zahl);
}
else
{
printf("Die Zahl %d ist groesser/gleich 10\n",zahl);
}
printf("Bye\n");
return 0;
}





Dies Programm stellt ein kleine Erweiterung unseres ersten Programms in diesem Kapitel da. Wieder werden sie Aufgefordert eine Zahl einzugeben. Anschließend wird die Bedienung in if wieder auf Wahrheit getestet. Falls der Wert kleiner wie 10 ist, kennen wir den Rest schon. Ist die Bedienung aber nicht wahr wird der Anweisungsblock hinter else ausgeführt.

Wollen wir das zweite Programm, von zuvor, in diesem Kapitel erweitern. Wir gehen davon aus das wir 100 für die Variable 'i' eingegeben haben. Hier nun unser Programmablauf...

Ist 'i' größer als 100?Nein! Ist 'i' kleiner als 100?Nein! Ansonsten ist 'i' gleich 100

Nun läuft das Programm zwar, aber wenn die erste Abfrage ob 'i' größer wie 100 wahr ist nimmt er als nächstes trotzdem die Abfrage vor ob 'i' kleiner wie 100 ist. Und das ist Zeitverschwendung. Dies können wir mit 'else if' beeinflussen...

else if(i<100)
 {
  printf("Die Zahl ist kleiner wie 100\n");
 }


Hier nun der Syntax von if, else if und else...

if(BEDIENUNG==wahr)
{
  anweisung1;
}
else if(BEDIENUNG==wahr)
{
  anweisung2;
}
else
{
  anweisung3;
}


Auch hier zu der Programmablaufplan von if else if else...

PAP else if


Jetzt noch unser Programm in der neuen Fassung...

/*Download:if4.c*/
#include <stdio.h>

int main()
{
unsigned int i;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&i);

if(i>100)
{
printf("Die Zahl ist größer als 100\n");
}

else if(i<100)
{
printf("Die Zahl ist kleiner wie 100\n");
}

else
{
printf("Die Zahl istgleich 100\n");
}
return 0;
}






Nun sollten wir zum Beispiel für 'i' den Wert 120 eingegeben haben, wird nach der ersten if(i>100), der Anweisungsblock ausgeführt und nicht wie beim Programm zuvor zur nächsten if-Abfrage gesprungen, da wir ja schon eine Gefunden haben die Wahr war. Somit wird im Beispiel von dem Wert 120 das Programm nach der ersten if-Abfrage mit dem Anweisungsblock das Programm beendet.

Ein weiterer häufiger Fehler der gerne gemacht wird ist hinter einer Bedienungsanweisung ein Semikolon zu setzen. z.B....

else if(i<100);    //das ' ; ' hier ist ein Fehler
 {
  printf("Die Zahl ist kleiner wie 100\n");
 }


Compiler werden ihnen in diesem Fall eine Fehlermeldung ausgeben das die Anweisung 'else' hier fehl am Platz ist. Denn eine 'else' - Anweisung geht immer von einer 'if' - Anweisung aus. Und mit 'else if;' wurde die Kontrollstruktur beendet. Und somit wäre auch der Anweisungsblock hier fehl am Platz. Sie können ja mal probeweise hinter der 'else' - Anweisung ein Semikolon setzten. Die Ausgabe das 'i' immer gleich 100 ist wird zusätzlich zu einer der Vorangegangen Ausgaben ausgegeben.

Es ist auch möglich mehrere Anweisungen bzw. Anweisungsblöcke zu Verschachteln. Das heißt eine Anweisung mit Anweisungsblock in eine Anweisung mit Anweisungsblock verschachteln. Dazu wieder ein Beispiel...

/*Download:if5.c*/
#include <stdio.h>

int main()
{
unsigned int i;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&i);

if(i>=100)
{
if(i==100)
{
printf("Die Zahl istgleich 100\n");
}
else
{
printf("Die Zahl ist größer als 100\n");
}
} /*ende if(i>=100)*/
else
{
printf("Die Zahl ist kleiner wie 100\n");
}
return 0;
}







Das Programm ist das selbe wie unser obiges, nur eben Verschachtelt und mit dem Größer oder Gleich - Operator.
Die Anweisung...

if(i>=100)

...testet ob die Zahl 'i' größer oder gleich 100 ist. Sollte dies der Fall sein, geht's in die Verschachtelung und Abfrage ob 'i' gleich 100 ist. Wenn nicht ist 'i' größer wie 100.
Sollte 'i' kleiner wie 100 sein geht´s zu 'else' Anweisung und die ist dann logischerweise kleiner wie 100.

Auf die Frage : Muss ich die Anweisungsblöcke sauber in Reih und Glied schreiben möchte ich unser Programm oben ohne saubere Einrückung zeigen....

/*Download:if6.c*/
#include <stdio.h>

int main()
{
unsigned int i;
printf("Bitte geben sie eine Zahl ein : ");
scanf("%d",&i);
if(i>=100) {
if(i==100) {
printf("Die Zahl istgleich 100\n");
}
else {
printf("Die Zahl ist größer als 100\n");
}
}
else {
printf("Die Zahl ist kleiner wie 100\n");
}
return 0;
}





Das Programm funktioniert natürlich Einwandfrei. Aber Urteilen sie selbst. Ich erspare mir hierzu einen Kommentar!

Aufgabe 1:
Schreiben sie ein Programm das sie Auffordert 2 Zahlen einzugeben. Ausgeben soll das Programm die beiden Zahlen in der Reihenfolge, die kleinste Zahl zuerst.

Aufgabe 2: Schreiben sie ein Programm das sie Aufordert 3 Buchstaben einzugeben. Und diese nach Alphabet sortiert. Das heißt wenn sie 'C','A' und 'B' eingeben soll ihr Programm 'A' , 'B' , 'C' ausgeben. Benutzen sie dazu den Befehl 'fflush(stdin)'. Der Grund: Wenn sie zum Beispiel den Buchstaben 'A' eingeben und Enter drücken, kann es passieren das ihnen dieses Enter im Tastaturpuffer bleibt. Dann wird diese Enter ('\n') eben auch mitsortiert. Das wollen wir aber nicht. Kurz, mit 'fflush' wird der Tastaturpuffer geleert. Schnell ein Beispiel wie sie 'fflush(stdin)' benutzen. Sollte das auch nicht funktionieren, lesen sie bitte das Kapitel scanf durch. Dort wird auf diese Problem und Lösungsmöglichkeiten eingegangen.

Hier gehts zu den Lösungen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf