peace software
  Berndt Wischnewski  Richard-Wagner-Str. 49  10585 Berlin 
  Tel.: 030 - 3429075  FAX : 030 34704037  email: webmaster@peacesoftware.de  Ust-ID: DE135577379 
<= Previous

C Kurs - too many ifs - I think I switch

Im Kapitel if Abfragen haben wir gelernt, wie wir eine if - else -if -else -if -else ...Leiter bauen, dies wird aber recht unpraktisch wenn man 20 , 100, oder sonstwievele Bedingungen abfragen muss. Für diese Fälle bietet C das switch Element, mit dem man solche Fälle viel bequemer programmieren kann.Auf gut deutsch heißt dass multiple branching. Die switch Anweisung wird in der Praxis häufig benutzt um Tastatureingaben oder die Menü-Auswahl zu bearbeiten, aber jede andere Aufgabe, die viele Auswahlmöglichkeiten bietet ist genauso willkommen. Also aufgepasst, die switch Anweisung funktioniert wie folgt:

switch(expression)
{
   case constant1:
       statements
   break;

   case constant2:
       statements
   break;

   case constant3:
       statements
   break;

.
.
.

   case constantn:
       statements
   break;

   default:
       statements
}

Jetzt der Reihe nach, in der ersten Zeile steht: switch(expression) mit expression ist eine Variable oder der Rückgabewert einer Funktion z. B.
switch(x) oder
switch( AFunction() )
danach folgt ein Block mit geschweiften Klammern, geschweifte Klammer auf und geschweifte Klammer zu.
Es folgen mehrere Blöcke der Form:
case constant:
   statements
break;    z. B.
switch(x)
{
   case 1:
     y = 1000;
  break;

  case 2:
     y = 5000;
     z = 3000;
  break; 

  case 42:
    mychar = 'a';
  break; 
}

Der Sinn ist völlig klar:
wenn x gleich 1 ist, wird y = 1000 gesetzt
wenn x gleich 2 ist, wird y = 5000 und z = 3000 gesetzt
wenn x gleich 42 ist, wird mychar zu 'a' gesetzt

Zur Schreibweise, wenn es sich nur um eine oder wenige gleichlautende Anweisungen handelt, schreibt man einen case Block gerne in einer Zeile. Das ist syntaktisch völlig OK und sieht außerdem noch übersichtlich aus. Beispiel:

switch(x)
{
   case 1: y = 1000; z = 2000; break;
   case 2: y = 1500; z = 1000; break;
   case 3: y = 2000; z = 500; break;
   case 4: y = 6000; z = 250; break;
   case 5: y = 10000; z = 125; break;
}

Zwei Bemerkungen zum case Block:1. im Unterschied zu einer if Abfrage wird in den cases immer nur auf Gleichheit geprüft und 2. die abgefragte Konstante im case Block darf nur einmal abgefragt werden. Die folgen beiden Beispiele sind also völlig falsch und ergeben Syntaxfehler.
// Fehlerhafte case Blöcke
switch(x)
{
   case x < 100: // das ist ein Fehler
     y = 1000;
  break;

  case x > 100: // das ist genauso falsch
     y = 5000;
     z = 3000;
  break; 
}

switch(x)
{
   case 10: // das ist noch richtig
     y = 1000;
  break;

  case 10: // jetzt wird die selbe Konstante, 10 nochmals abgefragt -> FEHLER
     y = 5000;
     z = 3000;
  break; 
}

Die break Anweisung beendet einen case Block. Durch weglassen der break Anweisung kann man trickreiche switch Konstrukte schreiben. Der switch "fällt dann nach unten durch", bis zum nächsten break oder bis zum Ende des switches. Hier ein Beispiel:

x = 1;
switch
(x)
{
   case 1:
     a = 1000;

  case 2:
     b = 5000;
     c = 3000;

  case 42:
    mychar = 'a';
}

Jetzt passiert folgendes: der erste case ist wahr(x gleich 1), also wird
a = 1000; ausgeführt. Da keine break Anweisung vorhanden ist werden jetzt aber alle anderen Anweisungen,
b = 5000;
c = 3000;
mychar = 'a'; ebenfalls ausgeführt, wie gesagt "der switch fällt nach unten durch".

Als letztes Syntaxelement folgt der default Block hier "fällt" man rein, wenn alle case Blöcke nicht zutreffen. Der default Block ist optional, man muss ihn nicht in das switch Konstrukt einfügen. Er steht meistens am Ende des switches, er darf aber auch am Anfang oder irgendwo in der Mitte zwischen den cases stehen. Wenn man dann die break Anweisung wegläßt, werden alle folgenden Anweisungen auch ausgeführt. Als erstes Beispiel die normale Form:

x = 99;
switch
(x)
{
   case 1: y = 1000; z = 2000; break;
   case 2: y = 1500; z = 1000; break;
   case 3: y = 2000; z = 500; break;
   case 4: y = 6000; z = 250; break;
   case 5: y = 10000; z = 125; break;

  default:
       y = 0;
       z = 0;
   break;
}
Da keine einzige case Abfrage wahr ist, wird der default Block ausgeführt. Das break der default Anweisung kann man auch weglassen, da danach der switch sowieso beendet ist.

 

x = 99;
switch
(x)
{
  default:
      y = 0;

   case 1:
      mychar = 'a';
   break;

   case 2:
      y = 42;
      mychar = 'b';
   break;
}

In diesem kurzen Beispiel steht die default Anweisung oben und wird nicht mit einem break beendet. Da beide folgenden cases nicht zutreffen, wird der default block zuerst ausgeführt, es wird y gleich Null gesetzt. Da kein break vorhanden ist, wird die nächste Anweisung, mychar = 'a'; auch ausgeführt. Danach steht break und es ist Schluß.

Zum Schluß noch die obligatorischen Testaufgabe indem Sie auf Next klicken, da die Möglichkeiten mit multiple choice und Texteingabe sehr beschränkt sind als Hausaufgabe vielleicht zusätzlich folgendes:

  • 1. Programmieren Sie bitte einen switch, der die integer Variable x abfragt und 5 verschiedene Fälle behandelt (ganz einfach).
  • 2. Programmieren Sie bitte einen switch, der die integer Variable x abfragt, 5 verschiedene Fälle behandelt und eine Routine enthällt, die ausgeführt wird, wenn keiner der Fälle zutrifft.
  • 3. Programmieren Sie bitte einen switch, der die integer Variable x abfragt, 5 verschiedene Fälle behandelt. Wenn ein Fall zutrifft sollten die nachfolgenden Fälle auch ausgeführt werden.


Und wenn alles nichts hilft, dann switchen Sie eben von Windows zum Macintosh.

<= Previous











Programmieren Sie doch mal den Mac: