======Verzweigungen====== Häufig ist es notwendig, die Ausführung eines Algorithmus in Abhängigkeit von bestimmten Bedingungen zu verzweigen. Dazu verwendet man Alternativen bzw. Verzweigungen. Diese werden hier vorgestellt. Die Beispiele aus diesem Abschnitt können in einem Jupyternotebook nachvollzogen werden. Es muss zusammen mit den Bilddateien vorher entpackt werden. {{ :neuerlehrplan:klasse10:verzweigungen.zip |Notebook Verzweigungen}} Danach kann man das Notebook zusammen mit den Bildern z.B. bei https://jupyter.org/try -> JupyterLab hochladen und öffnen. =====Einfache Verzweigung mit und ohne Alternative===== Bei einfachen Verzweigungen steht am Anfang immer eine **Frage**, die mit **ja** oder **nein** beantwortet werden kann. Diese Frage wird auch **Bedingung** genannt, die **wahr** (entspricht ja) oder **falsch** (entspricht nein) sein kann. In Ahängikeit von der Beantwortung der Frage werden nun die Anweisungen des Algorithmus ausgeführt. {{ :neuerlehrplan:klasse10:1_05_alternativen.svg |}} ====Verzweigung ohne Alternative==== Bei der Verzweigung ohne Alternative (, auch **einseitige Verzweigung** oder **einseitige Alternative** genannt,) werden Anweisungen nur ausgeführt, wenn die Frage mit ja beantwortet wird bzw. wenn diie Bedingung wahr ist. Im Satz könnte man formulieren: **Wenn** die Bedingung wahr ist, **dann** führe Anweisungen aus. Im Struktogramm kann man sie wie folgt darstellen: {{ :neuerlehrplan:klasse10:1_05_strukteinfverzwoa.png?600 |}} Das Struktogramm für eine einfache Alternative besteht zunächst aus einem Rechteck mit drei Dreiecken. Im zentralen Dreieck wird die Frage oder die Bedingung formuliert, im linken Dreieck steht dann wahr oder ja, im rechten Dreieck steht falsch oder nein. Unter dem linken Dreieck erscheint dann ein Rechteck mit einer oder mehreren Anweisungen, die ausgeführt werden, wenn die Bedingung erfüllt ist oder die Frage mit ja beantwortet wird. **Bei der Verzweigung ohne Alternative bleibt das Rechteck unter dem rechten Dreieck leer bzw. man schreibt man das Symbol der leeren Menge $\emptyset$ hinein**. In Python kann die **Verzweigung ohne Alternative (einseitige Verzweigung)** mit der ''%%if%%''-Anweisung umgesetzt werden: if Bedingung: ... Anweisungen ... Hinter dem ''%%if%%'' steht die Bedingung. Das ist ein Ausdruck mit dem Datentyp **bool**, also er kann die Werte ''%%True%%'' oder ''%%False%%'' annehmen. Danach kommen die Anweisungen, die im Fall ''%%True%%'' ausgeführt werden sollen. Sie werden um dieselbe Tiefe eingerückt. Um das Programm nach der ''%%if%%''-Anweisung fortzusetzen, muss der Quellcode wieder genau so tief eingerückt werden wie das ''%%if%%''. ===Beispiel 1=== Es ist ein Programm zu erstellen, dass nach Eingabe einer ganzen Zahl entscheidet, ob die Zahl negativ ist. Zusätzlich soll der Betrag der Zahl ausgegeben werden. **Stichwortartige Beschreibung des Algorithmus** Eingabe: Ganze Zahl n **Wenn** n negativ ist: * Ausgabe: Die Zahl ist negativ * Ausgabe: -n **Darstellung des Algorithmus als Struktogramm** {{ :neuerlehrplan:klasse10:1_05_beispiel01.png?600 |}} **Algorithmus als Pythonprogramm** n = int(input("n = ")) if n < 0: print("Die Zahl n ist negativ.") print("Betrag von n:", -n) ====Verzweigung mit Alternative==== Bei der Verzweigung mit Alternative (, auch **zweiseitige Verzweigung** oder **zweiseitige Alternative** genannt,) werden Anweisungen ausgeführt, wenn die Frage mit ja beantwortet wird bzw. wenn diie Bedingung wahr ist. Wenn Frage mit ja beantwortet wird bzw. die Bedingung falsch ist werden andere Anweisungen ausgeführt. Im Satz könnte man formulieren: **Wenn** die Bedingung wahr ist, **dann** führe Anweisungen aus, **anderenfalls** führe andere Anweisungen aus. Im Struktogramm kann man sie wie folgt darstellen: {{ :neuerlehrplan:klasse10:1_05_strukteinfverzwma.png?600 |}} Das Struktogramm ist zunächst genau so aufgebaut, wie bei der Verzweigung ohne Alternative. **Im Unterschied zu Verzweigung ohne Alternative stehen jetzt unter dem rechten Dreieck die Anweisungen, die ausgeführt werden, wenn die Bedingung nicht erfüllt ist bzw. wenn die Frage mit nein beantwortet wird**. In Python kann die **Verzweigung mit Alternative (zweiseitige Verzweigung)** mit der ''%%if%%''-''%%else%%''-Anweisung umgesetzt werden: if Bedingung: ... Anweisungen ... else: ... Anweisungen ... Hinter dem ''%%if%%'' steht die Bedingung. Das ist ein Ausdruck mit dem Datentyp **bool**, also er kann die Werte ''%%True%%'' oder ''%%False%%'' annehmen. Danach kommen die Anweisungen, die im Fall ''%%True%%'' ausgeführt werden sollen. Sie werden um dieselbe Tiefe eingerückt. Danach erscheint in derselben Einrücktiefe wie das ''%%if%%'' das ''%%else%%'' gefolgt von einem Doppelpunkt. Die nach dem ''%%else%%'' eingerückten Anweisungen werden ausgeführt, wenn die Bedingung nicht erfüllt ist. Um das Programm nach der ''%%else%%''-Anweisung fortzusetzen, muss der Quellcode wieder genau so tief eingerückt werden wie das ''%%if%%''. ===Beispiel 2=== s ist ein Programm zu erstellen, dass nach Eingabe einer ganzen Zahl entscheidet, ob die Zahl negativ oder nichtnegativ ist. Zusätzlich soll der Betrag der Zahl ausgegeben werden. **Stichwortartige Beschreibung des Algorithmus** Eingabe: Ganze Zahl n **Wenn** n negativ ist: * Ausgabe: Die Zahl ist negativ * Ausgabe: -n **anderenfalls** * Ausgabe: "Die Zahl ist nicht negativ." * Ausgabe: n **Darstellung des Algorithmus als Struktogramm** {{ :neuerlehrplan:klasse10:1_05_beispiel02.png?600 |}} **Algorithmus als Pythonprogramm** n = int(input("n = ")) if n < 0: print("Die Zahl n ist negativ.") print("Betrag von n:", -n) else: print("Die Zahl n ist nicht negativ.") print("Betrag von n:", n) ====Verschachtelte Verzweigungen==== Wir wollen nun unser Beispiel erweitern. Nachdem wir festgestellt haben, dass die Zahl nicht negativ ist, soll noch festgestellt werden, ob die Zahl Null ist, oder ob die Zahl positiv ist. Im Struktogramm könnte der Algorithmus so aussehen: ===Beispiel 3=== {{ :neuerlehrplan:klasse10:1_05_beispiel03.png?600 |}} In diesem Struktogramm befindet sich im ''%%else%%''-Zweig eine weitere Verzweigung. Hier rückt man den Quelltext nach dem inneren ''%%if%%'' bzw. ''%%else%%'' noch weiter ein. n = int(input("n = ")) if n < 0: print("Die Zahl n ist negativ.") print("Betrag von n:", -n) else: if n > 0: print("Die Zahl n ist positiv.") else: print("Die Zahl n ist Null.") print("Betrag von n:", n) ====Formulierung der Bedingung==== Im Abschnitt **Grundlegendes zu Python** haben wir die folgenden Operatoren kennengelernt: === Arithmetische Operatoren === ^Operator ^Wirkung bei ^^^ ^ ::: ^int ^float ^str ^ ^ + |Addition|Addition|Verkettung| ^ - |Subtraktion|Subtraktion| | ^ * |Multiplikation|Multiplikation| | ^ / |Division|Division| | ^ %%//%% |ganzzahlige Division|ganzzahlige Division| | ^ % |ganzzahliger Rest (Modulo) | Rest | | ^ %%**%% | Potenzieren | Potenzieren, Radizieren | | === Vergleichsoperatoren === ^Operator ^Wirkung^ ^ ''%%>%%'' | größer | ^ ''%%<%%'' | kleiner | ^ ''%%>=%%'' | größer gleich | ^ ''%%<=%%'' | kleiner gleich | ^ ''%%==%%'' | gleich | ^ ''%%!=%%'' | ungleich | === Logische Operatoren === ^Operator ^Wirkung^ ^ A and B | ist wahr, wenn A und B wahr sind | ^ A or B |ist wahr, wenn A oder B oder beide wahr sind | ^ not A |ist wahr, wenn A nicht wahr (falsch) ist | Diese Opratoren können benutzt werden um die Bedingung zu formulieren. Die Bedingung muss vom Datentyp **bool** sein. Manchmal ist die Bedingung nich offensichtlich und man muss sich etwas einfallen lassen ===Beispiel 4=== "Die Zahl n ist durch 3 teilbar" kann man auch formulieren als "Die Zahl n lässt bei der Division durch 3 den Rest 0" und dass lässt sich in Python ausdrücken als: n%3 == 0 =====Mehrfachverzweigung===== In Python gibt es auch die Möglichkeit, in eine Verzweigung mehrere Bedingenungen einzugeben. Im Beispiel zu verschachtelten Verweigungen gibt es insgesamt drei Bedingungen: - ''%%n > 0%%'' - ''%%n == 0%%'' - ''%%n < 0%%'' Wenn noch mehr Bedingungen nötig sind, wird die Verzweigung noch weiter verschachtelt und der Quellcode wird unübersichtlich. Deshalb hat man in Python die ''%%if-elif- else%%''-Anweisung eingeführt: if Bedingung1: ... Anweisungen ... elif Bedingung2: ... Anweisungen ... elif Bedingung3: ... Anweisungen ... ... else: ... Anweisungen ... In Python würde das geänderte Beispiel 3 so aussehen: ===Beispiel 4=== n = int(input("n = ")) if n < 0: print("Die Zahl n ist negativ.") print("Betrag von n:", -n) elif n > 0: print("Die Zahl n ist positiv.") print("Betrag von n:", n) else: print("Die Zahl n ist Null.") print("Betrag von n:", n) Am Beispiel 4 möchte ich auch zeigen, wie man eine Mehrfachverzweigung im Struktogramm darstellt: {{ :neuerlehrplan:klasse10:1_05_beispiel04.png?600 |}} ===== Übungen ===== Im folgenden Jupyternotebook finden sich einige Übungsaufgaben zum Thema. {{ :neuerlehrplan:klasse10:verzweigungen_uebungen.zip |Übungen}}