Zum Inhalt

Verzweigungen

Grundsätzlich wird ein Programm zeilenweise ausgeführt. Wir können aber die Programmausführung an einer Stelle selbst steuern, sodass ein Teil unseres Programms nur unter bestimmten Bedingungen ausgeführt wird. Dazu verwenden wir Verzweigungen. Bei einer Verzweigung überprüft das Programm, ob die angegebene Bedingung zutrifft oder nicht, und entscheidet so, bei welcher Zeile die Programmausführung weiterläuft.

Eine Verzweigung entspricht der bedingten Anweisung in einem Flussdiagramm.

---
title: "Hausaufgaben-Algorithmus"
---
flowchart TD
    A{"<b>Hausaufgaben?</b>"} -- Ja --> B("Hausaufgaben erledigen")
    A -- Nein --> n1["Bücher lesen, Freunde treffen, (Flixnet schauen) etc."]
    B --> n2["Schlafen gehen"]
    n3["START"] --> A
    n2 --> n4["STOP"]
    n1 --> n2

    n1@{ shape: rounded}
    n2@{ shape: rounded}
    n3@{ shape: terminal}
    n4@{ shape: terminal}

If-Verzweigung

Abstract

Eine Verzweigung steuert, wie ein Programm ausgeführt wird. Je nachdem, ob die dazugehörige Bedingung zutrifft, wird ein anderes „Stück“ vom Programm ausgeführt. In Python beginnt eine Verzweigung mit dem Schlüsselwort if, der Bedingung und einem Doppelpunkt.

Beispiel: Stimmberechtigung bestimmen

Bei Abstimmungen dürfen nur Stimmberechtigte Personen mitentscheiden. Wann ist jemand stimmberechtigt und wie könnte das überprüft werden mit einem Programm?

flowchart TD
    A{"<b>Alter &gt;= 18?</b>"} -- Ja --> n7["<b>Output:</b> Du darfst abstimmen!"]
    A -- Nein --> n8["<b>Output:</b> Du bist nicht stimmberechtigt!"]
    n3["START"] --> n5["<b>Input:</b> Alter eingeben"]
    n7 --> n4["STOP"]
    n8 --> n4
    n5 --> A

    n7@{ shape: lean-l}
    n8@{ shape: lean-l}
    n3@{ shape: terminal}
    n5@{ shape: lean-l}
    n4@{ shape: terminal}

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Beim folgenden Programm wird anhand eines Vergleichsausdrucks entschieden, welche Zeilen ausgeführt werden.

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Um zu markieren, welche Zeile nur dann ausgeführt werden sollen, falls die if-Bedingung zutrifft wird in der Python-Programmiersprache die horizontale Ausrichtung des Programmiercodes verwendet. Um eine Zeile vom Hauptprogramm zu unterscheiden wird sie eingerückt, d.h durch Drücken der Tab-Taste wird der Zeilenanfang etwas nach rechts verschoben, somit wird ein neuer Block markiert.

Block

Abstract

Eine Gruppe von zusammenhängende Zeilen welche die gleiche horizontale Ausrichtung haben nennen wir einen Block. Ein Block kann selber wiederum mehrere Blöcke enthalten, somit können komplexe verschachtelte Programme geschrieben werden. Vor einem neuen Block muss jedoch deklariert werden, was genau der neue Block bedeuten soll. Dazu werden bestimmte Schlüsselwörter verwendet sowie ein Doppelpunkt am Ende der Zeile vor dem neuen Für uns bis jetzt relevante Blöcke sind die if/else-Verzweigungen.

Bedingungen

In einer Verzweigung kann eine Bedingung definiert werden, welche bestimmt ob die Verzweigung genommen wird oder nicht. Dazu können sogenannte Vergleichsoperatoren verwendet werden. Wir definieren zwei Variablen mit den Werten 3 und 7.

A = 3
B = 7
Dann können wir die folgenden Operatoren verwenden

Operator Bedeutung Ergebnis
A < B A ist kleiner als B Wahr
A > B A ist grösser als B Falsch
A <= B A ist kleiner oder gleich B Wahr
A >= B A ist grösser oder gleich B Falsch
A == B A ist gleich B Falsch
A != B A ist nicht gleich B Wahr

else-Verzweigung

Um ein Programmteil nur dann auszuführen, wenn eine Bedingung nicht zutrifft verwenden wir einen else-Block.

else-Verzweigung

Ändere die Zahlen im folgenden Programm und beobachte die Ausgabe.

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Aufgaben

Gleichheit

Warning

Wir können nicht direkt Zahlen und Ziffern vergleichen. Da dies verschiedene Typen sind. Eine Dezimalzahl ist eine Zahl (Typ int) und Texte sind vom Typ str (Zeichenketten). Eine Zeichenkette besteht aus den ASCII-Zeichen!

Gibt bei der Linie mit >>> folgende Vergleiche ein:

123 == 123
und
123 == "123"
Was ist der Unterschied?

Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.
Lösung

Aus dem Vergleich 123 == 123 resultiert der Wert True was Wahr bedeutet. Also sind die zwei Zahlen \(123\) und \(123\) gleich.

Aber beim Vergleich 123 == "123" erhalten wir den Wert False was Falsch bedeutet. Denn "123" ist nun eben nicht mehr die Dezimalzahl \(123\) sondern eine Zeichenkette mit den Ziffern "1", "2" und "3". Das eine ist eine Zahl, das andere drei Ziffern und somit nicht gleich!

Der Typ ist beim zweiten Beispiel nicht gleich.

Tresor

Question

Schreibe ein Programm welches den Benutzer nach einem vordefinierten Passwort fragt. Danach soll es überprüfen, ob das eingegebene Passwort korrekt ist. Wenn es korrekt ist, gib eine Meldung aus: “Der Tresor ist geöffnet” Wenn es falsch ist, gib eine Meldung aus: “Leider falsches Passwort”

Hinweis: Verwende als Passwort eine Zeichenkette (Text) und keine Zahl.

Erweiterung: 1. Erlaube höchstens drei Versuche

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
# Tresor nur mit if/else

passwort = "abcde"
eingabe = input("Gib den Passwort ein:")

if eingabe == passwort:
    print("Tresor ist geöffnet")
else:
    print("Leider falsches Passwort")
passwort = "abcde"
eingabe = input("Gib den Passwort ein:")

if eingabe == passwort:
    print("Tresor ist geöffnet")
else:
    print("Leider falsches Passwort! Zwei Versuche übrig.")

    eingabe = input("Gib nochmals Passwort ein (zweiter Versuch):")

    if eingabe == passwort:
        print("Tresor ist geöffnet")
    else:
        print("Leider falsches Passwort! Ein Versuche übrig.")

        eingabe = input("Gib nochmals Passwort ein (letzter Versuch):")

        if eingabe == passwort:
            print("Tresor ist geöffnet")
        else:
            print("Leider falsches Passwort! Keine Versuche übrig!")

Einfaches Malprogramm

Question
  1. Frage mit Hilfe des input()-Befehls, ob Quadrate oder Dreiecke besser sind.
  2. Überprüfe die Eingabe und programmiere (zeichne) die gewünschte geometrische Form.

Erweiterung: Programmiere die Formen auch mit Hilfe von zusätzlichen Informationen:

  1. Frage auch nach der Grösse (Breite, Länge, ...)
  2. Frage nach einer Stiftfarbe. Die Stiftfarbe kannst du mit dem Befehl setPenColor() ändern.
    setPenColor("red")
    
    zeichnet mit einem roten Stift. Ein paar Beispiele von Farben: yellow, gold, orange, red, maroon, violet, magenta, purple, navy, blue, skyblue, cyan, turquoise, lightgreen, green, darkgreen, chocolate, brown, black, gray, white. Du findest eine ausführliche Liste von Farben hier
  3. Füge eine weitere geometrische Form hinzu

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
from gturtle import *
makeTurtle()


form = input("Was findest du besser? Quadrate oder Dreiecke?")

seitenlänge = 30

if form == "Quadrate":
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)

if form == "Dreiecke":
    right(30)
    forward(seitenlänge)
    right(120)
    forward(seitenlänge)
    right(120)
    forward(seitenlänge)
    right(120)
from gturtle import *
makeTurtle()


form = input("Was findest du besser? Quadrate oder Dreiecke?")

seitenlänge = int(input("Seitenlänge?"))

farbe = input("Stiftfarbe?")

setPenColor(farbe)

if form == "Quadrate":
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)
    forward(seitenlänge)
    right(90)

if form == "Dreiecke":
    right(30)
    forward(seitenlänge)
    right(120)
    forward(seitenlänge)
    right(120)
    forward(seitenlänge)
    right(120)

Wurzel ziehen?

Question

Wir beabsichtigen später ein Programm zu schreiben, welches die Quadratwurzeln von Zahlen berechnen kann (\(\sqrt{x}\)). Zuerst wollen wir aber überprüfen ob dies überhaupt geht, denn es ist gar nicht so einfach, von allen beliebigen Zahlen die Wurzel zu berechnen. Falls es nicht direkt möglich ist, versuchen wir gar nicht erst die Wurzel zu berechnen.

Für welche Zahlen können wir die Quadratwurzel berechnen?

Schreibe ein Programm welches eine "Fehlermeldung" herausgibt, wann immer die Quadratwurzel nicht direkt berechenbar ist. Die Wurzel selbst muss du nicht berechnen. Teste dein Programm mit verschiedenen Zahlen, z.B. 9 oder -4

Erweiterung: 1. Recherchiere und finde heraus wie die Wurzel berechnet werden kann. Dazu gibt es in Python eine "Mathematikbibliothek", darin gibt es viele nützliche mathematische Funktionen wie math.sqrt(), damit dies geht, muss zuerst die "Mathematikbibliothek" geladen werden mit import math

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
# Wurzelrechner
zahl = int(input("Gib eine Zahl ein: "))
if zahl < 0:
    print("Kann diese Wurzel nicht berechnen, da die Zahl negativ ist!")
else:
    print("Für diese Zähl wäre es Möglich die Wurzel zu berechnen:")
    print(zahl) 
# Dadurch erhalten wir Mathematik-Befehle
import math

# Wurzelrechner
zahl = int(input("Gib eine Zahl ein: "))
if zahl < 0:
    print("Kann diese Wurzel nicht berechnen, da die Zahl negativ ist!")
else:
    resultat = math.sqrt(zahl)
    print("Das Resultat ist:")
    print(resultat)