C++ Anweisungen: Auswahlanweisungen mit if und switch

Die Programmiersprache C++ bietet einen konventionellen und flexiblen Satz von Anweisungen. Im Prinzip ist jede Programmzeile, die mit einem Semikolon endet eine Anweisung. In diesem Unterpunkt werden wir die sogennanten Auswahlanweisungen behandeln wobei wir in der vorigen Vorlesung die Schleifenanweisungen vorstellt hatten (siehe C++ Anweisungen: Die for-, while- und do-Schleifen). Auswahlanweisungen werden auch als Verzweigung , Tests oder bedingte Anweisungen bezeichnet und sind immer dann anzuwenden, wenn das Programm bei einem gewissen Ereignis bzw. unter einer gewissen Bedingung etwas bestimmtes tun soll. Es teilt somit das Programm in unterschiedliche Anweisungspfade auf. Auswahlanweisungen können in Form einer if-, (if-else)- oder switch-Anweisung ausgedrückt werden.

Die if-Anweisung

Eine if-Anweisung hat die folgende Struktur:

if ('Anweisungsbedingung') { 'Block von Anweisungen' }

Die 'Anweisungsbedingung' spezifiziert, in welchem Fall der 'Block von Anweisungen' ausgeführt werden soll. Ist diese Bedingung nicht erfüllt, so überspringt das Programm einfach die if-Anweisung.

If_0.cpp
#include <iostream>                                            // Ein- und Ausgabebibliothek
using namespace std;                                           // Benutze den Namensraum std

int main(){                                                    // Hauptfunktion
    int zahl;                                                  // Deklaration der Integer Variable 'zahl'
    
    cout << "Geben Sie bitte eine Fibonacci-Zahl im Bereich zwischen 100 und 200 ein: "; // Ausgabe eines Textes
    cin  >> zahl;                                              // Einlesen der Zahl mittels der Tastatur
    
    if( zahl == 144 ){                                         // if-Anweisung Anfang
        cout << "Richtig!" << endl;                            // Ausgabe falls if-Bedingung erfüllt ist
    }                                                          // if-Anweisung Ende
    
    cout << "Vielen Dank für Ihre Eingabe."  << endl;          // Ausgabe eines Textes
}

Das nebenstehende Programm gibt ein einfaches Beispiel für die Verwendung einer if-Anweisung. Das Programm fordert zunächst den Benutzer auf eine Zahl der Fibonacci-Folge im Bereich zwischen 100 und 200 einzugeben. Da es in diesem Zahlenbereich nur eine Fibonacci-Zahl gibt (144) ist es eindeutig, ob die vom Benutzer eingegebene Zahl richtig ist. Die if-Anweisung wird nun dafür benutzt zu entscheiden, ob die eingegebene Zahl richtig ist und dies wird mittels der 'Anweisungsbedingung' ( zahl == 144 ) überprüft. Falls die 'Anweisungsbedingung' erfüllt ist, wird der 'Block von Anweisungen', in diesem Fall nur eine Anweisung ( cout << "Richtig!" << endl; ) ausgeführt. Am Ende des Programms wird, egal ob die eingegebene Zahl richtig oder falsch war, noch der Satz 'Vielen Dank für Ihre Eingabe.' im Terminal ausgegeben. Die untere Abbildung zeigt die Terminalausgabe, wobei beim ersten Versuch der falsche Zahlenwert (178) eingegeben wurde. Danach wurde das Programm nochmals gestartet und der richtige Wert eingegeben.

Doppelsumme_If_0.cpp
#include <iostream>                                        // Ein- und Ausgabebibliothek
#include <cmath>                                           // Bibliothek für mathematisches (e-Funktion, Betrag, ...)
using namespace std;                                       // Benutze den Namensraum std

int main(){                                                // Hauptfunktion
    int k, i;                                              // Deklaration der Summenindexe k und i
    double Ergebnis = 0;                                   // Deklaration und Initialisierung der Ergebnis-Variable
    
    for(k=1; k<=4; ++k){                                   // Schleifen Anfang der 1.Summe
        for(i=1; i<=20; ++i){                               // Schleifen Anfang der 2.Summe
            if( i != k ){                                  // if-Anweisung Anfang
                Ergebnis = Ergebnis + pow(i,k)/(k - i);    //Innerer, math. Teil der Doppelsumme
                }                                          // if-Anweisung Ende
        }                                                  // Schleifen Ende der 2.Summe
    }                                                      // Schleifen Ende der 1.Summe

    cout << "Das Ergebnis der Doppelsumme beträgt: " << Ergebnis << endl; // Ausgabe des Ergebnisses
}

Ein einfaches mathematisches Beispiel der Verwendung einer if-Anweisung ist z.B. die folgende Doppelsumme $$ \begin{equation} \sum_{k=1}^4 \,\, \sum_{i=1\\i \neq k}^{20} \frac{i^k}{\left( k-i \right)} \quad. \end{equation} $$ In der zweiten Summe, besteht der Zusatz, dass der Summenindex $i$ niemals den Wert des Summenindex $k$ annehmen darf. Das nebenstehende C++ Programm zeigt den Quelltext des Programmes zur Berechnung der angegebenen Doppelsumme. Der Anweisungsblock der 2. for-Schleife wird nur ausgeführt falls der Wert des Index $i$ ungleich dem Index $k$ ist ( if( i != k ){ ... } ). Das Ergebnis ergibt sich zu "Ergebnis = -64344".

Die (if-else)-Anweisung

Eine (if-else)-Anweisung hat die folgende Struktur:

if ('Anweisungsbedingung') { '1. Block von Anweisungen' } else { '2. Block von Anweisungen' }

Die 'Anweisungsbedingung' spezifiziert, in welchem Fall der '1. Block von Anweisungen' ausgeführt werden soll. Ist diese Bedingung nicht erfüllt, so führt das Programm den '2. Block von Anweisungen' aus. Es wäre wohl schon bei dem vorigen Programm (If_0.cpp) sinnvoll gewesen eine (if-else)-Anweisung zu verwenden, da der Benutzer bei falscher Eingabe nicht gezeigt wird, dass seine Zahl falsch war.

If_Else_0.cpp
#include <iostream>                                            // Ein- und Ausgabebibliothek
using namespace std;                                           // Benutze den Namensraum std

int main(){                                                    // Hauptfunktion
    int zahl;                                                  // Deklaration der Integer Variable 'zahl'
    
    cout << "Geben Sie bitte eine Fibonacci-Zahl im Bereich zwischen 100 und 500 ein: "; // Ausgabe eines Textes
    cin  >> zahl;                                              // Einlesen der Zahl mittels der Tastatur
    
    if( zahl == 144 || zahl == 233 || zahl == 377 ){           // if-Anweisung Anfang mit logischem 'oder'
        cout << "Richtig!" << endl;                            // Ausgabe falls if-Bedingung erfüllt ist
    } else{                                                    // if-Anweisung Ende, else-Anweisung Anfang
        cout << "Leider Falsch :-(" << endl;                   // Ausgabe falls if-Bedingung nicht erfüllt ist
    }                                                          // else-Anweisung Ende
    
    cout << "Vielen Dank für Ihre Eingabe."  << endl;          // Ausgabe eines Textes
}

Das nebenstehende Programm basiert auf dem vorigen, gibt jedoch nun dem Benutzer eine Rückmeldung ob seine Zahl falsch war. Zusätzlich ist die Verwendung von Operatoren der Aussagenlogik bei mehrkomponentigen 'Anweisungsbedingungen' aufgezeigt. Das Programm fordert zunächst den Benutzer auf eine Zahl der Fibonacci-Folge im Bereich zwischen 100 und 500 einzugeben. Da es in diesem Zahlenbereich drei Fibonacci-Zahl gibt (144, 233 und 377) wurden die drei richtigen Fälle unter Verwendung des logischen Oder-Operators '||' in die 'Anweisungsbedingungen' der ( if-else)-Anweisung (if( zahl == 144 || zahl == 233 || zahl == 377 ){ ... } else{ ...} ) eingefügt. Um mehrere 'Anweisungsbedingungen' logisch miteinander zu verknüpfen steht einem neben dem Oder-Operator '||' noch der logische Und-Operator '&&' zu Verfügung. Die untere Abbildung zeigt die Terminalausgabe, wobei beim ersten Versuch ein falscher Zahlenwert (311) eingegeben wurde. Danach wurde das Programm nochmals gestartet und ein richtiger Wert (377) eingegeben.

Die switch-Anweisung

Die folgenden Frames zeigen die formale Struktur einer switch-Anweisung (rechte Abbildung) und ein einfaches C++ Beispielprogramm (linke Abbildung).

switch ('Ganzzahlige Variable') {
    case Ganze Zahl Nr.1 :
        'Block von Anweisungen' ;
        break ;
    case Ganze Zahl Nr.2 :
        'Block von Anweisungen' ;
        break ;
     ....
    default :
        'Block von Anweisungen' ;
        break ;
}
Switch_0.cpp
#include <iostream>                                            // Ein- und Ausgabebibliothek
#include <cmath>                                               // Bibliothek für mathematisches (e-Funktion, Betrag, ...)
using namespace std;                                           // Benutze den Namensraum std

int main(){                                                    // Hauptfunktion
    double zahl;                                               // Deklaration der Double Variable 'zahl'
    int auswahl;                                               // Deklaration der Integer Variable 'auswahl' für switch
    
    cout << "Geben Sie bitte eine Gleitkommazahl ein: ";       // Ausgabe eines Textes
    cin  >> zahl;                                              // Einlesen der Zahl mittels der Tastatur
    cout << "Möchten Sie die Zahl ..." << endl; ;              // Ausgabe eines Textes
    cout << "... mal 25 nehmen, dann geben Sie 1 ein." << endl;                   // Ausgabe eines Textes
    cout << "... die Zahl hoch 5 nehmen, dann geben Sie 2 ein." << endl;          // Ausgabe eines Textes
    cout << "... den Sinus dieser Zahl berechnen, dann geben Sie 3 ein." << endl; // Ausgabe eines Textes
    cin  >> auswahl;                                                              // Einlesen der Variable 'auswahl'
    
    switch( auswahl ){                                                            // switch-Anweisung Anfang 
        case 1:                                                                   // switch-Fall Nr.1
            cout << "Der berechnete Wert beträgt: " << 25*zahl << endl;           // Anweisung Nr.1
            break;                                                                // switch-Fall Nr.1 Ende
        case 2:                                                                   // switch-Fall Nr.2
            cout << "Der berechnete Wert beträgt: " << pow(zahl,5) << endl;       // Anweisung Nr.2
            break;                                                                // switch-Fall Nr.2 Ende
        case 3:                                                                   // switch-Fall Nr.3
            cout << "Der berechnete Wert beträgt: " << sin(zahl) << endl;         // Anweisung Nr.3
            break;                                                                // switch-Fall Nr.3 Ende
        default:                                                                  // switch-default
            cout << "Leider haben Sie die falsche Auswahl getroffen :-(" << endl; // Anweisung default
            break;                                                                // switch-default Ende
    }                                                                             // switch-Anweisung Ende
    
    cout << "Vielen Dank für Ihre Eingabe."  << endl;                             // Ausgabe eines Textes
}

Eine switch-Anweisung wählt unter einem Satz von Alternativen (case-Marken) aus. Der Ausdruck welcher direkt hinter dem switch-Befehl in runden Klammern steht, ist die 'Auswahl-Variable' der switch-Anweisung und der aktuelle Wert dieser Variable spezifiziert welche der case-Marken ausgewählt wird. Die 'Auswahl-Variable' sollte eine ganzzahlige Integer-Variable, oder ein char-Zeichen sein. Die einzelnen Werte der case-Marken legen die jeweilige Alternative und den auszuführenden 'Block von Anweisungen' fest. Am Ende einer jeden case-Marke steht ein break-Befehl, der ein Verlassen der switch-Auswahl bewirkt. Am Ende einer switch-Anweisung sollte zusätzlich eine default-Marke stehen, sodass nicht explizit betrachtete, potentiell mögliche Werte der 'Auswahl-Variable' auch behandelt werden können.

In dem Beispielprogramm der switch-Anweisung (linke obere Abbildung) wird zunächst eine Gleitkommazahl vom Benutzer eingegeben und danach wird der Benutzer gefragt, welche mathematische Operation das Programm mit dieser Zahl machen soll. Der Benutzer kann dabei aus drei Alternativen auswählen, die als drei separate case-Marken in der switch-Anweisung implementiert sind. Mittels der default-Marke wird dann gewährleistet, dass eine falsch eingegebene Auswahl des Benutzers auch berücksichtigt wird.
Die untere Abbildung zeigt die Terminalausgabe, wobei beim ersten Versuch ein falscher 'Auswahl-Wert' (4) eingegeben wurde und die danach folgenden zwei Aufrufe des Programms zwei der drei case-Marken ausgewählt wurden.