8.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 auch einfacher geht? Für solche Aufgaben gibt es die Fallunterscheidung mit switch, was auf Deutsch so viel wie »Schalter« heißt. 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 ist ein Programm, das Sie nach den Zahlen 1 – 5 fragt:
/* 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 8.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; }
Abbildung 8.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.
8.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 auch bei falschen Werten sollte 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("Grundrechenarten \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 ist 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: Falls eine passende case-Verzweigung fehlt, nimm immer das Folgende. Wenn also keine case-Anweisung greift, dann wird der Code-Block nach default ausgeführt (man spricht oft vom sogenannten Default-Verhalten, wenn der default-Block ausgeführt wird). Sie werden in einem späteren Abschnitt (8.9) noch sehen, dass sich die switch-Verzweigung hervorragend für den Aufbau eines einfachen Menüs in einer Konsolenanwendung eignet.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.