3.3    Verzweigungsstrukturen

Häufig muss ein Programm zwei Zahlenwerte miteinander vergleichen und mit dem größeren oder kleineren Wert weiterrechnen. Eine andere typische Situation verlangt die Überprüfung innerhalb einer Schleife, ob beispielsweise die Differenz |ab| < ε ist. Trifft dieser Fall zu, dann muss das Programm die Berechnung abbrechen.

Stehen mehrere Alternativen zur Auswahl – gibt es also eine Mehrfachauswahl –, müssen Sie abfragen können, welcher Fall zutrifft. Das kommt beispielsweise vor, wenn in einem Menü mehrere Alternativen zur Auswahl vorgesehen sind.

Für die Fallabfragen stellt Python die Vergleichsoperatoren aus Tabelle 3.2 zur Verfügung.

Vergleichsoperator

Bedeutung

==

gleich

!=

ungleich

a > b

a ist größer b

a < b

a ist kleiner b

a >= b

a ist größer gleich b

a <= b

a ist kleiner gleich b

Tabelle 3.2     Vergleichsoperatoren

Bei der Überprüfung auf Gleichheit von zwei Objekten sollten Sie darauf achten, dass Sie den Operator == nicht mit dem Zuweisungsoperator = verwechseln. Für Fallabfragen werden mitunter auch logische Operatoren gebraucht. Diese sind in Tabelle 3.3 aufgelistet.

Operator

Bedeutung

And

Konjunktion

Or

Disjunktion

Not

Negation

Tabelle 3.3     Logische Operatoren

3.3.1    Einfachauswahl

Bei einer Einfachauswahl wird überprüft, ob eine Bedingung zutrifft, also wahr ist. Trifft diese Bedingung zu, dann wird die Anweisung 1 ausgeführt; trifft sie nicht zu, dann wird Anweisung 2 ausgeführt.

Eine einfache Fallabfrage, die eine mit einem Zufallszahlengenerator erzeugte Zahl a mit einer Zahl b vergleicht, könnte in Pseudocode etwa so formuliert werden:

erzeuge einen Zufallswert für a
initialisiere b mit einem Wert
wenn a > b, dann
Ausgabe: a ist größer als b
sonst
Ausgabe: a ist kleiner als b

Auffällig an diesem Pseudocode sind die für Python typischen Einrückungen, die den Quelltext strukturieren.

Einrückungen

Charakteristisch für das Programmieren mit Python ist das Einrücken von Programmzeilen bei Fallabfragen mit if ... else, nach einer Funktionsdefinition oder nach Definitionen von for- und while-Schleifen. Hier sind Einrückungen immer zwingend notwendig. Wenn sie nicht den gleichen Abstand haben, kommt es bei der Programmausführung zu Fehlermeldungen. Die Einrückungen werden automatisch vom Python-Editor nach Eingabe des Doppelpunktes und einem Zeilenumbruch mit der (¢)-Taste angelegt.

Solche Fallunterscheidungen werden in Python mit dem Konstrukt if ... else implementiert.

Listing 3.2 erzeugt nach jedem Programmstart eine neue Zufallszahl a. Mit einer if-Abfrage werden beide Zahlen miteinander verglichen. Sie erfahren anschließend, welche der beiden Zahlen größer oder kleiner ist.

01  #02_einfachauswahl.py
02 from random import random
03 a=random()
04 b=0.5
05 #Fallabfrage
06 if a > b:
07 print(a,">",b)
08 print("a ist größer als b")
09 else:
10 print(a,"<",b)
11 print("a ist kleiner als b")

Listing 3.2     Einfachauswahl

Ausgabe

     a                 b
0.32767912073835026 < 0.5
a ist kleiner als b

Analyse

In Zeile 02 wird die Methode random aus dem Modul random importiert. In Zeile 03 wird eine Zufallszahl zwischen 0 und 1 generiert und in die Variable a gespeichert. In Zeile 04 wird die Variable b mit dem Wert 0.5 initialisiert. In Zeile 06 ermittelt die if-Anweisung, ob a größer als b ist. Wenn das der Fall ist, dann wird a ist größer als b ausgegeben (Zeile 08). Wenn a nicht größer als b ist, wird der else-Zweig in Zeile 09 ausgeführt, und die Ausgabe lautet a ist kleiner als b. Nach jedem neuen Programmstart kann der Größenvergleich ein anderes Resultat ergeben.

Das Programm hat einen Mangel: Es erfasst nicht den Fall, dass a gleich b ist. Mit sehr großer Wahrscheinlichkeit wird dieser Fall nicht eintreten. In der Praxis sollte man auch keine Gleitpunktzahlen auf Gleichheit hin überprüfen. Dieses Programm dient aber dazu, die prinzipielle Funktionsweise der Einfachauswahl zu demonstrieren.

3.3.2    Mehrfachauswahl

Bei einer Mehrfachauswahl muss das Programm überprüfen, welcher Fall von mehreren möglichen Fällen zutrifft. Als Erstes muss eine Variable definiert werden, die die Aufgabe des Selektors übernimmt. Der Wert des Selektors entscheidet darüber, welche Anweisung ausgeführt werden soll.

Es soll ein Programm entwickelt werden, das einen Würfelwurf simuliert. Die Variable a soll die Aufgabe des Selektors übernehmen. In Pseudocode könnte man das Problem wie folgt lösen:

Erzeuge eine Zufallszahl zwischen 1 und 6
wenn a==1, dann
Ausgabe: Es wurde eine 1 gewürfelt
wenn a==2, dann
Ausgabe: Es wurde eine 2 gewürfelt
wenn a==3, dann
Ausgabe: Es wurde eine 3 gewürfelt
wenn a==4, dann
Ausgabe: Es wurde eine 4 gewürfelt
wenn a==5, dann
Ausgabe: Es wurde eine 5 gewürfelt
wenn a==6, dann
Ausgabe: Es wurde eine 6 gewürfelt

Eine Mehrfachauswahl wird mit dem Konstrukt if ... elif implementiert. Das Programm aus Listing 3.3 simuliert einen Würfel. Es erzeugt mit einem Zufallszahlengenerator ganze Zahlen zwischen 1 und 6. Welche Zahl generiert wurde, wird durch eine Fallabfrage ermittelt.

01  #03_mehrfachauswahl.py
02 from random import randint
03 a=randint(1,6)
04 #Fallabfragen
05 if a==1:
06 print("Es wurde eine 1 gewürfelt")
07 elif a==2:
08 print("Es wurde eine 2 gewürfelt")
09 elif a==3:
10 print("Es wurde eine 3 gewürfelt")
11 elif a==4:
12 print("Es wurde eine 4 gewürfelt")
13 elif a==5:
14 print("Es wurde eine 5 gewürfelt")
15 elif a==6:
16 print("Es wurde eine 6 gewürfelt")
17 else:
18 print("Fehler")

Listing 3.3     Mehrfachauswahl

Ausgabe

Es wurde eine 4 gewürfelt

Analyse

In Zeile 03 werden Zufallszahlen zwischen 1 und 6 erzeugt und in die Variable a gespeichert. Die Mehrfachauswahl beginnt in Zeile 05 mit der if-Anweisung. Danach folgen die elif-Verzweigungen. Der Wert der Variablen a bestimmt, welcher Zweig ausgeführt wird.

Zur Sicherheit kann zum Programmende noch ein else-Zweig eingefügt werden, der nicht vorgesehene Fälle abfragt.