10.7 Fallunterscheidung: die switch-Verzweigung
 
Was ist zu tun, wenn unterschiedliche Bedingungen mehrere verschiedene Zahlen beachten sollen? Sie könnten entsprechend viele if-Anweisungen verwenden. Aber warum so umständlich, wenn es einfacher geht? Für solche Aufgaben gibt es die Fallunterscheidung mit switch, was auf Deutsch soviel heißt wie Schalter. Die Syntax von switch sieht so aus:
switch(AUSDRUCK) {
AUSDRUCK_1 : anweisung_1
AUSDRUCK_2 : anweisung_2
AUSDRUCK_3 : anweisung_3
...
AUSDRUCK_n : anweisung_n
}
Der AUSDRUCK in den Klammern nach switch wird im darauf folgenden Anweisungsblock ausgewertet. Sollte der AUSDRUCK==AUSDRUCK_1 sein, so wird anweisung_1 ausgeführt. Sollte aber AUSDRUCK==AUSDRUCK_2 sein, so wird die anweisung_2 ausgeführt usw. Hier ein Programm, welches Sie nach den Zahlen 1–5 abfragt:
/* switch1.c */
#include <stdio.h>
int main(void) {
int a;
printf("Bitte eine Zahl von 1–5 eingeben: ");
scanf("%d", &a);
switch(a) {
case 1: printf("Das war eins \n");
break;
case 2: printf("Das war zwei \n");
break;
case 3: printf("Das war drei \n");
break;
case 4: printf("Das war vier \n");
break;
case 5: printf("Das war fünf \n");
break;
} /* Ende switch */
return 0;
}
Nach der Eingabe einer Zahl wird diese im Schalter ausgewertet mit:
switch(a)
Die Auswertung steht wieder in einem Anweisungsblock in geschweiften Klammern. Zuerst wird
case 1: printf("Das war Eins \n");
ausgewertet. case heißt auf Deutsch Fall. Zuerst wird geprüft, ob der Fall, der in switch(a) steht, zutrifft (also hier, ob a==1). Wenn ja, wird das Programm den entsprechenden Text ausgeben.
break;
Die break-Anweisung am Ende eines jeden Falls bedeutet: Ab hier springt das Programm aus dem Anweisungsblock heraus und setzt seine Ausführung nach dem switch-Anweisungsblock fort. In unserem Fall endet das Programm dann bereits. Wenn break nicht nach jedem Fall angegeben wird, wird der nächste Fall auch ausgegeben. Sehen Sie sich einen Programmablaufplan dazu an (siehe Abbildung 10.8).
Das Weglassen von break kann aber durchaus gewollt sein. Dies hat den Vorteil, dass Sie in gewisser Weise auf mehrere Fälle gleichartig reagieren können. Das obige Programm wird leicht abgewandelt:
/* switch2.c */
#include <stdio.h>
int main(void) {
int a;
printf("Bitte eine Zahl von 1–5 eingeben: ");
scanf("%d", &a);
switch(a) {
case 1: printf("Das war Eins oder...");
case 2: printf("...Zwei \n");
break;
case 3: printf("Das war Drei \n");
break;
case 4: printf("Das war Vier...");
case 5: printf("...oder Fünf \n");
break;
} /* Ende switch */
return 0;
}
 Hier klicken, um das Bild zu Vergrößern
Abbildung 10.8
Programmablaufplan zur switch-Fallunterscheidung
Geben Sie in diesem Programm beispielsweise den Wert 4 für die Variable a ein, so trifft sowohl der Fall case 4 als auch case 5 zu, weil bei der Fallunterscheidung case 4 das break nach der printf()-Ausgabe weggelassen wurde. Ebenso würde sich das Programm verhalten, wenn Sie den Wert 1 eingegeben hätten.
10.7.1 default
 
Jetzt stellt sich die Frage, was geschieht, wenn Sie einen anderen Wert als 1 bis 5 eingeben. Das Programm einfach ohne eine Meldung zu beenden, ist unschön, denn es sollte auch bei falschen Werten eine Reaktion erfolgen. Dafür gibt es das Schlüsselwort default. Testen Sie es gleich in einem Programm:
/* switch3.c */
#include <stdio.h>
int main(void) {
int a,b;
char opera;
printf("Grundrechnen \n");
printf(" (zahl)(Operator)(zahl) ohne Leerzeichen \n");
printf("Rechnung bitte eingeben : ");
scanf("%d%c%d", &a, &opera, &b); /* Bsp.: 10+12 */
switch(opera) {
case '+': printf("%d + %d = %d \n",a ,b ,a+b);
break;
case '-': printf("%d – %d = %d \n", a, b, a-b);
break;
case '*': printf("%d * %d = %d \n", a, b, a*b);
break;
case '/': printf("%d / %d = %d \n", a, b, a/b);
break;
default: printf("%c? kein Rechenoperator \n", opera);
} /* Ende switch */
return 0;
}
Jetzt haben Sie auch gesehen, wie es möglich ist, jedes beliebige darstellbare ASCII-Zeichen mit case zu überprüfen. Einzelne Zeichen werden – wie beim Programm mit den Operatoren eben verwendet – zwischen einzelne Hochkommata gestellt.
Natürlich wäre es auch denkbar, statt
case '+': printf("%d + %d = %d \n", a, b, a+b);
eben
case 43 : printf("%d + %d = %d \n", a, b, a+b);
zu verwenden, da ja das Zeichen '+' den dezimalen Wert 43 hat (siehe ASCII-Tabelle). Sie könnten auch die Oktalzahl 053 oder die Hexzahl 2B verwenden. Hier die Schreibweise für die Hexzahl von '+':
case 0x2B: printf("%d + %d = %d \n", a, b, a+b);
Im Programm haben Sie gesehen, wie default verwendet wurde:
default: printf("'%c' ist kein Rechenoperator \n", opera);
Falls Sie keine gültigen Rechenoperatoren eingegeben haben, bekommen Sie eine entsprechende Meldung.
default bedeutet hier: Im Fall des Fehlens einer passenden case-Verzweigung, nimm immer das Folgende. Wenn also keine case Anweisung greift, dann wird der Code-Block nach default ausgeführt (man spricht oft vom so genannten Default-Verhalten, wenn der default-Block ausgeführt wird). Sie werden in einem späteren Kapitel noch sehen, dass sich die switch-Verzweigung hervorragend für den Aufbau eines einfachen Menüs in einer Konsolenanwendung eignet.
|