Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 10 Kontrollstrukturen
  gp 10.1 Verzweigungen mit der if-Bedingung
    gp 10.1.1 Anweisungsblock
  gp 10.2 Die Verzweigung mit else if
  gp 10.3 Die Verzweigung mit else
  gp 10.4 Der !-Operator (logischer Operator)
  gp 10.5 Logisches UND (&&) – Logisches ODER (||)
  gp 10.6 Bedingungsoperator ?:
  gp 10.7 Fallunterscheidung: die switch-Verzweigung
    gp 10.7.1 default
  gp 10.8 Die while-Schleife
    gp 10.8.1 Endlosschleife (while)
    gp 10.8.2 Fehlervermeidung bei while-Schleifen
  gp 10.9 Die do while-Schleife
  gp 10.10 Die for-Schleife
    gp 10.10.1 Beispiele für eine for-Schleife
  gp 10.11 Kontrollierte Sprünge
    gp 10.11.1 continue
    gp 10.11.2 break
  gp 10.12 Direkte Sprünge mit goto
  gp 10.13 Notationsstil
    gp 10.13.1 K&R-Stil
    gp 10.13.2 Whitesmith-Stil
    gp 10.13.3 Allman-Stil
    gp 10.13.4 GNU EMACS-Stil
    gp 10.13.5 Der Stil des Autors ;) (K&R-like)


Galileo Computing - Zum Seitenanfang

10.7 Fallunterscheidung: die switch-Verzweigundowntop

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;
}

Abbildung
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.


Galileo Computing - Zum Seitenanfang

10.7.1 default  toptop

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.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de