C++ Kurs

switch-Verzweigung

Die Themen:

Syntax
Ablauf der Verzweigung
break Anweisung
Aktionen im case-Zweig
Beispiel und Übung

Syntax

Sollen je nach Inhalt einer ganzzahligen Variable verschiedene Anweisungen durchlaufen werden, so kann dies, wie nachfolgend dargestellt, durch geschachtelte if-else Anweisungen erfolgen. Im Beispiel werden je nach Inhalt der Variable var die Anweisungen Aktion1, Aktion2 oder Aktion3 ausgeführt. Enthält var einen anderen Wert als 1,2 oder 3, so werden die Anweisungen Aktion4 ausgeführt. Aber das kennen Sie ja schon von der letzten Lektion her.


if (var == 1)
   {Aktion1}
else if (var == 2)
   {Aktion2}
else if (var == 3)
   {Aktion3}
else
   {Aktion4}

Anstelle der oben angegebenen geschachtelten if-else Anweisung kann aber auch die switch-Verzweigung eingesetzt werden. Sie hat folgende Syntax:

switch (Ausdruck)
{
case K1:
   Aktion1
   [break;]
case K2:
   Aktion2
   [break;]
...
case Kx:
   AktionX
   [break;]
[default:
   AktionY]
}

Kx müssen ganzzahlige oder char-Konstanten sein. Beachten Sie bitte genau die Syntax! Der Ausdruck in der switch-Anweisung muss in runden Klammern stehen und nach dem Ausdruck folgt immer ein Block {....}.

Ablauf der Verzweigung

Der Ablauf der switch-Verzweigung ist nun Folgender:

  1. Zuerst wird der Ausdruck der switch-Anweisung ausgewertet. Dieser Ausdruck muss entweder ein ganzzahliges oder char-Ergebnis liefern; Gleitkomma-Ausdrücke sind nicht erlaubt!
  2. Danach wird das Ergebnis des Ausdrucks mit den Literalen/Konstanten verglichen, die auf das Schlüsselwort case folgen. Stimmt das Ergebnis mit einem der aufgeführten Werte überein, so werden die Anweisungen nach der entsprechenden case-Anweisung ausgeführt.
  3. Stimmt das Ergebnis mit keinem der aufgeführten Werte überein, so werden die Anweisungen nach der default-Anweisung ausgeführt.

Das nachfolgende Beispiel entspricht damit der am Anfang dargestellten verschachtelten if-else Anweisung.


switch (var)
{
case 1:
   Aktion1
   break;
case 2:
   Aktion2
   break;
case 3:
   Aktion3
   break;
default:
   Aktion4
}
....

Der default-Zweig ist optional, d.h. er muss nicht zwingend vorhanden sein. Fehlt der default-Zweig und ergibt die Auswertung des switch-Ausdrucks keine Übereinstimmung mit einem der aufgeführten case-Werte, so wird keine Aktion ausgeführt und es geht mit der nächsten Anweisung weiter, die nach der geschweiften Klammer zu des switch-Blocks folgt.

break Anweisung

Die break-Anweisung innerhalb eines switch-Blocks bewirkt ein unmittelbares Verlassen des Blocks, d.h. nach dem break wird als nächstes die Anweisung ausgeführt, die nach der geschweiften Klammer zu folgt. Ohne break-Anweisung werden alle nach der Einsprungsmarke (case x:) folgenden Anweisungen bis zum Ende des switch-Blocks ausführt. Sehen Sie sich dazu die beiden nachfolgenden Beispiele so wie die dazugehörigen Ausgaben an:


// SWITCH-CASE mit break-Anweisung
int var = 2;
...
switch (var)
{
case 1:
   cout << "Variable gleich 1\n";
   break;
case 2:
   cout << "Variable gleich 2\n";
   break;
case 3:
   cout << "Variable gleich 3\n";
   break;
default:
   cout << "Variable weder 1,2 noch 3\n";
}

Variable gleich 2



// SWITCH-CASE ohne break-Anweisung
int var = 2;
....
switch (var)
{
case 1:
   cout << "Variable gleich 1\n";
case 2:
   cout << "Variable gleich 2\n";
case 3:
   cout << "Variable gleich 3\n";
default:
   cout << "Variable weder 1,2 noch 3\n";
}

Variable gleich 2
Variable gleich 3
Variable weder 1,2 noch 3

Aktionen im case-Zweig

Die innerhalb eines case-Zweigs stehenden Aktionen dürfen aus mehreren Anweisungen bestehen. Eine Blockung {...} wie bei der if-Anweisung ist hier nicht notwendig. Innerhalb eines case-Zweigs können beliebige C++ Anweisung stehen mit einer Ausnahme: Sie dürfen hier ohne besondere Vorkehrung keine Variablen definieren! Wollen Sie innerhalb eines case-Zweigs Variablen definieren, so müssen Sie einen entsprechenden Block {....} einfügen, damit die Lebensdauer der Variablen definiert ist.

Und auch das ist möglich: sollen für verschiedene Werte die gleichen Anweisungen ausgeführt werden, so können mehrere case-Zweige aufeinander folgen. Auch die Reihenfolge der case-Anweisungen ist beliebig, d.h. sie müssen nicht in sortierter Reihenfolge angegeben werden.


char alpha;
...
switch (alpha)
{
case 'e':
case 'E':
   Aktion1;
   break;
case 'a':
case 'A':
   Aktion2;
}

Im Beispiel wird die char-Variable alpha ausgewertet. Und unabhängig davon, ob ein e oder a als Groß- oder Kleinbuchstabe in der Variable abgelegt ist, es wird immer die gleiche Aktion ausgeführt.

Sie können übrigens mithilfe der Bibliotheksfunktionen

int std::toupper(int toConvert);
int std::tolower(int toConvert);

Kleinbuchstaben in Großbuchstaben umwandeln und umgekehrt. Der umzuwandelnde Buchstabe wird als int-Wert übergeben. Beide Funktionen liefern als Returnwert den entsprechenden gewandelten Buchstaben. Handelt es sich beim übergebenen Wert nicht um einen Buchstaben sondern z.B. um die ASCII-Zahl '9', so wird der Originalwert zurückgeliefert. Die Funktion ist in der Header-Datei cctype deklariert, die Sie dann einbinden müssen.

Beispiel und Übung

Beispiel:

Das Beispiel entspricht von der Funktion her der Übung aus der letzten Lektion.

Es simuliert ein kleines Taschenrechner-Programm, das zwei Zahlen (Operanden) und einen Operator nach folgender Syntax einliest:

Operand1 Operator Operand2

Als Operator sind wieder nur +, -, * und / zugelassen. Wird ein anderer Operator eingegeben, so wird eine entsprechende Fehlermeldung ausgegeben werden. Die Operanden werden als short-Werte eingelesen.

Bei korrekter Eingabe wird das Ergebnis der eingegebenen Formel berechnet und ausgegeben.

Formel nach folgender Syntax eingeben:
Operand1 Operator Operand2
Operator kann sein: + - * /
Formel ? 22 / 4
Ergebnis: 5


// Beispiel zur switch-case Verzweigung

// iostream einbinden
#include <iostream>

using std::cout;
using std::endl;
using std::cin;

// main() Funktion
int main ()
{
   // Variablen für die Operanden
   short operand1, operand2;
   // Variable für den Operator
   char oper;

   // Einlesen der Formel
   cout << "Formel nach folgender Syntax eingeben:\n";
   cout << "Operand1 Operator Operand2\n";
   cout << "Operator kann sein: + - * /" << endl;
   cout << "Formel ? ";
   cin >> operand1 >> oper >> operand2;

   // Ergebnissausgabe vorbereiten
   cout << "Ergebnis: ";
   // Nun den Operator auswerten und die entsprechende
   // Berechung ausführen

   switch (oper)
   {
   case '+':
      cout << operand1+operand2;
      break;
   case '-':
      cout << operand1-operand2;
      break;
   case '*':
      cout << operand1*operand2;
      break;
   case '/':
      cout << operand1/operand2;
      break;
   default:
      cout << "Nur die Operatoren +, -, * und / zugelassen!";
   }
   // Zeilenvorschub ausgeben
   cout << endl;
}

Übung:

Schreiben Sie ein Programm, das  nach dem ohmschen Gesetz

U        = R          * I    d.h.
Spannung = Widerstand * Strom

entweder die Spannung, den Widerstand oder den Strom berechnet. Was berechnet werden soll, ist einzulesen (siehe Programmausgabe). Je nach gesuchtem Wert sind dann die beiden anderen Werte einzulesen. Für die einzulesenden Werte sind Gleitkommazahlen zu verwenden.

Die Ausgabe des berechneten Werts soll mit max. 2 Dezimalstellen erfolgen.

Mit obiger Formel gilt folglich:

Widerstand = Spannung/Strom   bzw.
Strom      = Spannung/Widerstand

 

Sie können nun mit Hilfe des Ohmschen Gesetzes

1. Die Spannung über einen Widerstand berechnen
2. Den Strom durch einen Widerstand berechnen
3. Den Widerstand selbst berechnen

Bitte geben Sie die entsprechende Ziffer ein (1..3): 2
Spannung (in Volt) und Widerstand (in Ohm) eingeben: 235. 1000.
Der Strom durch den Widerstand beträgt 0.23 Ampere

Lösung ansehen!