Kapitel 10 Kontrollstrukturen
Mit dem bisherigen Wissen können Sie die Programme immer nur sequenziell ablaufen lassen, sie laufen also immer Zeile für Zeile ab. In diesem Kapitel wird nun der sequenzielle Programmfluss gebrochen.
Folgende drei Möglichkeiten haben Sie, um den sequenziellen Programmfluss zu ändern:
|
Verzweigungen: Im Programm wird eine Bedingung definiert, die entscheidet, an welcher Stelle das Programm fortgesetzt werden soll. |
|
Schleifen (Iteration): Ein Anweisungsblock wird sooft wiederholt, bis eine bestimmte Abbruchbedingung erfüllt wird. |
|
Sprünge: Die Programmausführung wird mit Hilfe von Sprungmarken an einer anderen Position fortgesetzt. Obwohl nach wie vor möglich, werden Sprünge in einem Programm mittlerweile als schlechter Stil angesehen und sind auch nicht notwendig. Es wird dabei von direkten Sprüngen gesprochen. Mit Schlüsselworten wie return, break, continue, exit und der Funktion abort() können jedoch kontrollierte Sprünge ausgeführt werden. |
10.1 Verzweigungen mit der if-Bedingung
 
Die if-Bedingung hat folgende Syntax:
if(BEDINGUNG == wahr) {
Anweisung1;
}
Anweisung2;
Wenn die Bedingung zwischen den Klammern des if-Schlüsselwortes wahr (true) ist, wird Anweisung1 im Anweisungsblock ausgeführt. Anschließend wird das Programm bei Anweisung2, also nach dem Anweisungsblock, fortgesetzt. Ist die Bedingung unwahr (false), wird Anweisung1 nicht ausgeführt, und das Programm fährt sofort mit Anweisung2 fort.
10.1.1 Anweisungsblock
 
In einem Anweisungsblock werden Anweisungen (mindestens eine) zusammengefasst. Als Anweisungsblock gelten alle Anweisungen, die zwischen geschweiften Klammern ({}) stehen. Anweisungsblöcke lassen sich auch ineinander verschachteln. Es empfiehlt sich daher, auf eine saubere Strukturierung (d.h. entsprechendes Einrücken bei den Anweisungen eines Blocks) beim Erstellen eines Programms zu achten, um den Überblick zu bewahren.
Den Programmablauf der if-Bedingung können Sie sich schematisch folgendermaßen vorstellen (die Darstellung wird auch als Programmablaufplan bezeichnet):
 Hier klicken, um das Bild zu Vergrößern
Abbildung 10.1
Programmablaufplan zur if-Anweisung
Sehen Sie sich dazu das folgende Programmbeispiel an:
/* if1.c */
#include <stdio.h>
int main(void) {
unsigned int alter;
printf("Wie alt sind Sie: ");
scanf("%d", &alter);
/* ... noch jünger als 18? */
if(alter < 18) {
printf("Sie sind noch nicht volljährig\n");
}
printf("Bye\n");
return 0;
}
Das Programm fordert Sie auf, Ihr Alter einzugeben. In der Bedingung if(zahl < 18) wird überprüft, ob Sie jünger als 18 Jahre alt sind. Sind Sie jünger, wird die printf()-Anweisung im Anweisungsblock mit entsprechender Ausgabe bearbeitet. Wurde aber ein Wert eingegeben, der größer oder gleich 18 ist, wird nur die printf()-Anweisung hinter dem Anweisungsblock ausgeführt, die »Bye« ausgibt. Dieses Beispiel als Programmablaufplan:
 Hier klicken, um das Bild zu Vergrößern
Abbildung 10.2
Programmablaufplan zum Listing
Jetzt soll das Programm um einige if-Bedingungen erweitert werden:
/* if2.c */
#include <stdio.h>
int main(void) {
unsigned int alter;
printf("Wie alt sind Sie: ");
scanf("%d", &alter);
if(alter < 18) {
printf("Sie sind noch nicht volljährig\n");
}
if(alter > 18) {
printf("Sie sind volljährig\n");
}
if(alter == 18) {
printf("Den Führerschein schon bestanden?\n");
}
printf("Bye\n");
return 0;
}
Es ist offensichtlich, wie das Programm vorgeht: Sie geben das Alter ein und mithilfe der einzelnen if-Bedingungen testet es, ob die eingegebene Zahl größer, kleiner oder gleich 18 ist. Bevor das Programm etwas genauer analysiert wird, sollten Sie sich eine Tabelle mit den bisher verwendeten Vergleichsoperatoren und ihrer jeweiligen Bedeutung ansehen.
Tabelle 10.1
Übersicht zu Vergleichsoperatoren (Relationale Operatoren)
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(alter < 18)
testet, ob die Zahl, die Sie eingegeben haben, kleiner als 18 ist. Ist die Bedingung wahr, springt das Programm unmittelbar in den für diese Bedingung geschriebenen Anweisungsblock, der in den geschweiften Klammern steht. Falls also die eingegebene Zahl kleiner als 18 ist, wird der Anweisungsblock
{
printf("Sie sind noch nicht volljährig\n");
}
ausgeführt. Besteht der Anweisungsblock hinter der Kontrollstruktur lediglich aus einer einzigen Anweisung, so können die geschweiften Klammern auch weggelassen werden:
if(alter < 18)
printf("Sie sind noch nicht volljährig\n");
Diese Schreibweise ist korrekt und wird auch häufig verwendet. Sie sollten sich jedoch klar machen, dass sie sehr leicht zur Fehlerquelle werden kann. Nämlich dann, wenn Sie eine weitere Anweisung hinzufügen wollen, die auch nur in dem Fall ausgeführt werden soll, wenn die if-Bedingung wahr ist, wie etwa im folgenden Beispiel:
if(alter < 18)
printf("Sie sind noch nicht volljährig\n");
printf("Sollte nur erscheinen, wenn (alter < 18)!\n");
Wenn – wie hier – dann die geschweiften Klammern vergessen werden, wird die zweite printf()-Anweisung immer ausgeführt, da die if-Bedingung im Wahr-Fall wirklich nur eine weitere Anweisung ausführt.
Korrekt müsste es folgendermaßen aussehen:
if(alter < 18) {
printf("Sie sind noch nicht volljährig\n");
printf("Sollte nur erscheinen, wenn (alter < 18)!\n");
}
Jetzt wird auch die zweite Anweisung nur ausgeführt, wenn die if-Bedingung wahr ist.
Die nächsten beiden if-Bedingungen verhalten sich analog. Hiermit wird getestet, ob die eingegebene Zahl für das Alter kleiner bzw. gleich 18 ist. Sollte sich einer dieser Fälle als wahr herausstellen, so wird ebenfalls der jeweils zugehörige Anweisungsblock ausgeführt.
Achtung Ein häufig gemachter Fehler ist if(alter=18). Hier wurde der Variablen alter der Wert 18 zugewiesen, und der Anweisungsblock wird ausgeführt. Dabei ist es jedoch egal, ob der Wert gleich 18 ist, denn alter wird jetzt der Wert 18 zugewiesen. Diese if-Abfrage ist also immer wahr. Der Fehler ist zudem schwer auffindbar, da die Syntax absolut korrekt ist, der Compiler also keine Fehlermeldung anzeigt. Oft verwendete und empfohlene Maßnahme ist es, die Überprüfung umzustellen: if (18 == alter) ist syntaktisch korrekt und bewirkt das Gleiche. Hiermit würde der Compiler sofort eine Fehlermeldung anzeigen, falls Sie versehentlich if (18 = alter) schreiben, da sich einer Zahl keine Variable zuordnen lässt. Diese Umstellungsmethode funktioniert nur bei ==-Vergleichen, nicht bei den anderen Operatoren.
|
|