lehrkraefte:snr:informatik:glf22:python:if-else

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:snr:informatik:glf22:python:if-else [2022/09/12 16:17] – [Aufgabe zu if-else mit logischen Verknüpfungen: Schaltjahr] Olaf Schnürerlehrkraefte:snr:informatik:glf22:python:if-else [2022/12/01 17:39] (current) – [Bonus-Material] Olaf Schnürer
Line 1: Line 1:
 +~~NOTOC~~
 +
 +====== if-(else-)statements ======
 +<WRAP center round box>
 +Unsere bisherigen Python-Programme werden beim Ausführen von vorne beginnend Zeile für Zeile abgearbeitet.
 +
 +Oft sollen gewisse Programmteile aber nur unter gewissen Bedingungen ausgeführt werden. Das geht in Python durch sogenannte //if-statements// bzw. //if-else-statements//.
 +</WRAP>
 +
 +===== Erklärvideo zu if-statements und if-else-statements =====
 +
 +<WRAP center round todo>
 +Schau dir das folgende Video zu if- und if-else-statements an.
 +
 +[[https://fginfo.ksbg.ch/~olaf/videos-glf22/einfuehrung-if-und-if-else.mp4|Video "Einführung if und if-else"]]
 +
 +<hidden Endzustand des Programms aus dem Video>
 +<code python tageslicht.py>
 +t = int(input("Wie viele Minuten Tageslicht hattest Du heute bereits? "))
 +
 +if t >= 120:
 +    print("Prima!")
 +    print("Deine Augen werden es dir langfristig danken.")
 +else:
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +print("Programmende")
 +</code>
 +</hidden>
 +
 +----
 +
 +Hintergrundinformation: Zwei Stunden Tageslicht pro Tag minimieren laut wissenschaftlicher Studien das Risiko, kurzsichtig zu werden, siehe [[https://www.deutschlandfunkkultur.de/sehstoerung-des-auges-immer-mehr-kinder-werden-kurzsichtig.976.de.html?dram:article_id=499263|Deutschlandfunk Kultur: Immer mehr Kinder werden kurzsichtig]]. 
 +</WRAP>
 +
 +===== Wesentliche Punkte aus dem Video =====
 +
 +<WRAP round info>
 +''if''-statement: Der um zusätzliche 4 Leerschläge eingerückte Code-Block direkt nach der ''if''-Zeile wird ausgeführt, falls die Bedingung zwischen ''if'' und '':'' den Wahrheitswert ''True'' hat, wenn man die aktuellen Werte der Variablen einsetzt. Wer mag, kann den Doppelpunkt '':'' als ''then'' lesen.
 +
 +''if''-''else''-statement: Der eingerückte Code-Block direkt nach der ''if''-Zeile wird ausgeführt, falls die angegebene Bedingung wahr ist, sonst wird der eingerückte Code-Block nach der Zeile ''else:'' ausgeführt.
 +
 +Danach geht es jeweils mit dem normal eingerückten Code weiter.
 +</WRAP>
 +
 +<WRAP center round important>
 +Einrückungen sind äusserst wichtig in Python! Beachte, dass im Programm aus dem Video drei Zeilen um genau 4 Leerschläge eingerückt sind.
 +
 +In der Standard-Einstellung von Visual Studio Code kannst du solche Einrückungen (um Vielfache von 4) leicht mit ''Tab'' erzeugen (und mit ''Shift+Tab'' rückgängig machen).
 +
 +Neben falschen Einrückungen sind auch vergessene Doppelpunkte eine beliebte Fehlerquelle.
 +</WRAP>
 +
 +===== Aufgabe zu if-else =====
 +
 +<WRAP center round todo>
 +(1) Schreibe ein Quiz-Programm mit mindestens zwei Quiz-Fragen deiner Wahl (möglichst einmal mit Eingabe einer Zahl und einmal mit Eingabe eines Strings).<html><br></html> Nach jeder Eingabe soll der Benutzer erfahren, ob er recht hatte, und sonst die richtige Antwort erfahren.<html><br></html> (Auch wenn du dich daran erinnerst: Schau nicht im Abschnitt über Wahrheitswerte etc. das dortige Quiz-Programm nach, sondern versuche das Programm eigenständig neu zu schreiben!)
 +
 +(2) Definiere am Anfang des Programms eine Variable durch ''richtigeAntworten = 0''. Verwende diese, um dem Benutzer am Ende mitzuteilen, wie viele der Antworten er richtig beantwortet hat. Diese Angabe darf auch in Prozent erfolgen.
 +
 +(3) Teste dein Programm!
 +
 +<hidden Lösungsvorschlag:>
 +<code python>
 +richtigeAntworten = 0
 +
 +antwort = input("Wie heisst das kulturelle und wirtschaftliche Zentrum der Ostschweiz? ")
 +if (antwort == "St. Gallen") or (antwort == "St.Gallen") or (antwort == "Saint-Gall") or (antwort == "San Gallo"):
 +    print("Korrekt!")
 +    richtigeAntworten = richtigeAntworten + 1
 +else:
 +    print("Vermutlich falsch.") # denn auch "Sanggalle" oder "Sogn Gagl" oder "Sankt Gallen" oder "st. gallen" oder "STGALLEN" sollte man wohl akzeptieren...
 +    print("Die als richtig akzeptierten Antworten wären 'St. Gallen', 'St.Gallen', 'Saint-Gall' oder 'San Gallo' gewesen.")
 +
 +antwort2 = int(input("Wie viele Einwohner hatte St. Gallen auf Tausender gerundet am 31. Dezember 2020? "))
 +if antwort2 == 76000:
 +    print("Richtig")
 +    richtigeAntworten = richtigeAntworten + 1
 +else:
 +    print("Leider falsch. Die richtige Antwort ist 76000.")
 +
 +print("Du hast " + str(richtigeAntworten) + " von 2 Fragen korrekt beantwortet, das sind " + str(richtigeAntworten / 2 * 100) + " Prozent der Fragen.")
 +</code>
 +</hidden>
 +</WRAP>
 +
 +===== Aufgabe zu if-else mit logischen Verknüpfungen: Schaltjahr =====
 +
 +<WRAP center round todo>
 +ACHTUNG: Die Aufgabe ist von der Logik her relativ kompliziert; der erste Hinweis entschärft dieses Problem.
 +
 +Ist eine Jahreszahl durch 4 teilbar, so handelt es sich um ein Schaltjahr, es sei denn, die Jahreszahl ist durch 100, aber nicht durch 400 teilbar. 
 +
 +(Diese komplizerte Regel sorgt grob gesagt dafür, dass die Frühlingstagundnachtgleiche immer am selben Tag des Kalenderjahres stattfindet, nämlich dem 21. März; für genauere Informationen siehe https://de.wikipedia.org/wiki/Schaltjahr#Gregorianischer_Kalender.)
 +
 +Ersetze die Fragezeichen im folgenden Python-Programm durch einen booleschen Ausdruck, so dass es korrekt ausgibt, ob die Eingabe ein Schaltjahr ist oder nicht. Teste deine Vermutung durch Eingabe der Jahreszahlen 7, 32, 300, 400.
 +
 +<code python schaltjahr.py>
 +jahr = int(input("Jahreszahl: "))
 +
 +if ????:
 +    print(str(jahr) + " ist kein Schaltjahr.")
 +else:
 +    print(str(jahr) + " ist ein Schaltjahr.")
 +</code>
 +
 +<hidden Nullter Hinweis>
 +Erinnerung:
 +  * Das Rechenzeichen ''%'' liefert den Rest bei ganzzahliger Division.
 +  * Das Vergleichszeichen ''=='' bzw. ''!='' testet auf Gleichheit bzw. Ungleichheit.
 +  * ... und dann gibt es noch die logischen Verknüpfungen ''and'' und ''or''.
 +</hidden>
 +
 +<hidden Erster Hinweis:>
 +  Eine Jahreszahl steht genau dann für KEIN Schaltjahr, wenn sie (nicht durch 4 teilbar ist) oder (durch 100 teilbar und nicht durch 400 teilbar ist).
 +</hidden>
 +
 +<hidden Zweiter Hinweis:>
 +Der gesuchte boolesche Ausdruck hat die Form 
 +<code python>
 +(jahr % 4 ? 0) ? ((jahr % 100 ? 0) ? (jahr % 400 ? 0))
 +</code>
 +wobei die Fragezeichen durch Vergleichszeichen und logische Verknüpfungen zu ersetzen sind.
 +</hidden>
 +
 +<hidden Lösungsvorschlag:>
 +<code python>(jahr % 4 != 0) or ((jahr % 100 == 0) and (jahr % 400 != 0))</code>
 +  
 +Auf Grund der "Operator-Hierarchie" in Python (vgl. Punkt-vor-Strich-Regel in der Mathematik) hat der Ausdruck <code python>jahr % 4 != 0 or jahr % 100 == 0 and jahr % 400 != 0</code> dieselbe Bedeutung (denn ''and'' bindet stärker als ''or'' und Vergleichszeichen binden stärker als logische Verknüpfungen und Rechenzeichen binden stärker als Vergleichszeichen). 
 +</hidden>
 +</WRAP>
 +
 +===== if-(else-)-statements sind Kontrollstrukturen =====
 +
 +<WRAP center round info>
 +If-statements und if-else-statements stellen eine wichtige [[https://de.wikipedia.org/wiki/Kontrollstruktur#Kontrollstrukturen|Kontrollstruktur]] in der Programmierung dar.
 +
 +Sie kontrollieren bzw. steuern den Ablauf eines Programms.
 +
 +Bald werden wir noch die Kontrollstrukturen //Schleife// (= //loop//) (oder Iteration) und eventuell //Rekursion// (= //recursion//) kennenlernen. 
 +
 +Bereits kennengelernt haben wir die "offensichtlichen" Kontrollstrukturen //Sequenz// (einfach diverse Anweisungen hintereinander, die entsprechend nacheinander ausgeführt werden) und //Blockstruktur// (etwa die beiden eingerückten Code-Blocks in einem if-else-statement).
 +</WRAP>
 +
 +===== Zur Terminologie =====
 +
 +<WRAP center round box>
 +Ich verwende hier die Begriffe //if-statement// und //if-else-statement//, da man sofort weiss, was programmiertechnisch gemeint ist.
 +
 +Verbreitet (aber meiner Meinung nach weniger einprägsam) sind auch die folgenden Bezeichnungen:
 +  * //bedingte Anweisung// statt //if-statement//, da eine Anweisung (oder ein Block von Anweisungen) nur unter einer Bedingung durchgeführt wird;
 +  * //Verzweigung// statt //if-else-statement//, da der Programmablauf verzweigt (zwei mögliche Wege), am Ende kommen sie aber wieder zusammen; vgl. [[https://de.wikipedia.org/wiki/Bedingte_Anweisung_und_Verzweigung|bedingte Anweisung und Verzweigung]] (dort ist auch ein "Aktivitätsdiagramm", das den Begriff //Verzweigung// gut illustriert);
 +  * //if-Selektion// oder //if-Auswahl// statt if-statement (da ein Codeblock nur dann ausgewählt und ausgeführt wird, wenn die sogenannte if-Bedingung zutrifft);
 +  * if-(else-)Anweisung statt if-(else-)statement;
 +  * etc.
 +</WRAP>
 +
 +
 +===== Erklärvideo zu verschachtelten if-else-statements =====
 +
 +<WRAP center round todo>
 +Schau dir das folgende Video an.
 + 
 +[[https://fginfo.ksbg.ch/~olaf/videos-glf22/verschachtelte-ifs-und-elif.mp4|Video "Verschachtelte if-statements und elif"]]
 +
 +Zustände des Programms aus dem Video:
 +<hidden (1) mit verschachtelten if-statements:>
 +<code python tageslicht-verschachtelt.py>
 +t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 +
 +if t >= 120:
 +    print("Prima!")
 +    print("Deine Augen werden es dir langfristig danken.")
 +else:
 +    if t < 0:
 +        print("Das kommt mir etwas kurz vor!")
 +    else:
 +        print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +print("Programmende")</code>
 +</code>
 +</hidden>
 +<hidden (2) dasselbe verkürzt mit "elif" als Verschmelzung von "else if">
 +<code python tageslicht-elif.py>
 +t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 +
 +if t >= 120:
 +    print("Prima!")
 +    print("Deine Augen werden es dir langfristig danken.")
 +elif t < 0:
 +    print("Das kommt mir etwas kurz vor!")
 +else:
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +print("Programmende")
 +</code>
 +</hidden>
 +<hidden (3) mit verfeinerter Fallunterscheidung>
 +<code python tageslicht-elif-verfeinert.py>
 +t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 +
 +if t >= 120:
 +    print("Prima!")
 +    print("Deine Augen werden es dir langfristig danken.")
 +elif t < 0:
 +    print("Das kommt mir etwas kurz vor!")
 +elif t > 90:
 +    print("Du bist auf einem guten Weg.")
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +else:
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +print("Programmende")
 +</code>
 +</hidden>
 +<hidden (4) dasselbe nur mit if; möglich, aber nicht empfohlen und fehleranfälliger>
 +<code python tageslicht-naiv-per-if.py>
 +t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 +
 +if t >= 120:
 +    print("Prima!")
 +    print("Deine Augen werden es dir langfristig danken.")
 +if t < 0:
 +    print("Das kommt mir etwas kurz vor!")
 +if t > 90 and t < 120:
 +    print("Du bist auf einem guten Weg.")
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +if 0 <= t <= 90:
 +    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
 +print("Programmende")
 +</code>
 +</hidden>
 +</WRAP>
 +
 +===== Aufgabe zu if-else-Verschachtelung und elif =====
 +
 +
 +<WRAP round todo>
 +(1) Schreibe ein Programm 
 +  * mit //verschachtelten if-else-statements// (und nicht 5 verschiedenen if-statements), 
 +das vom Benutzer eine Temperaturangabe einliest und dann mitteilt, ob es ''kalt'' oder ''kühl'' oder ''behaglich'' oder ''warm'' oder ''heiss'' ist. In welchem Temperaturbereich welches Temperaturempfinden eintritt, ist dir überlassen.
 +
 +Bemerkung: Es gibt viele Möglichkeiten der Verschachtelung. Wenn du willst, kannst du mehrere finden.
 +
 +(2) Ändere dein Programm nun so, dass du alle ''else''-''if''-Kombinationen zu ''elif''s verschmilzt!
 +
 +(3) Teste dein Programm: Für jeden Temperaturbereich ist mindestens ein Test durchzuführen.
 +
 +<hidden Lösungsvorschlag mit verschachtelten if-else-statements (drei Varianten in einem Programm)>
 +<code python temperatur-verschachtelt.py>
 +temperatur = int(input("Wie warm ist es? "))
 +
 +# Es gibt viele Möglichkeiten, die je nach Geschmack 
 +# unterschiedlich elegant (bzw. sogar recht chaotisch) 
 +# wirken. Ich gebe drei relativ systematische Möglichkeiten an:
 +
 +# 1. Möglichkeit (von oben her Rantasten):
 +
 +if temperatur >= 35:
 +    print("Es ist heiss.")
 +else:
 +    if temperatur >= 25:
 +        print("Es ist warm.")
 +    else:
 +        if temperatur >= 15:
 +            print("Es ist behaglich.")
 +        else:
 +            if temperatur >= 5:
 +                print("Es ist kühl.")
 +            else:
 +                print("Es ist kalt.")
 +
 +# 2. Möglichkeit (etwa in der Mitte spalten):
 +
 +if temperatur < 15:
 +    if temperatur < 5:
 +        print("Es ist kalt.")
 +    else:
 +        print("Es ist kühl.")
 +else:
 +    if temperatur < 35:
 +        if temperatur < 25:
 +            print("Es ist behaglich.")
 +        else:
 +            print("Es ist warm.")
 +    else:
 +        print("Es ist heiss.")
 +
 +# 3. Möglichkeit (wohl nicht so naheliegend):
 +
 +if temperatur < 35:
 +    if temperatur < 25:
 +        if temperatur < 15:
 +            if temperatur < 5:
 +                print("Es ist kalt.")
 +            else:
 +                print("Es ist kühl.")
 +        else: 
 +            print("Es ist behaglich.")
 +    else:
 +        print("Es ist warm.")
 +else:
 +    print("Es ist heiss.")
 +</code>
 +</hidden>
 +<hidden ... und nun mit allen else+if zu elif verschmolzen>
 +<code python temperatur-mit-elif>
 +temperatur = int(input("Wie warm ist es? "))
 +
 +# 1. Möglichkeit, eignet sich am besten zum Verschmelzen:
 +
 +if temperatur >= 35:
 +    print("Es ist heiss.")
 +elif temperatur >= 25:
 +    print("Es ist warm.")
 +elif temperatur >= 15:
 +    print("Es ist behaglich.")
 +elif temperatur >= 5:
 +    print("Es ist kühl.")
 +else:
 +    print("Es ist kalt.")
 +
 +# 2. Möglichkeit, nur eine Verschmelzung möglich:
 +
 +if temperatur < 15:
 +    if temperatur < 5:
 +        print("Es ist kalt.")
 +    else:
 +        print("Es ist kühl.")
 +elif temperatur < 35:
 +    if temperatur < 25:
 +        print("Es ist behaglich.")
 +    else:
 +        print("Es ist warm.")
 +else:
 +    print("Es ist heiss.")
 +
 +# 3. Möglichkeit, keine Verschmelzung möglich:
 +
 +if temperatur < 35:
 +    if temperatur < 25:
 +        if temperatur < 15:
 +            if temperatur < 5:
 +                print("Es ist kalt.")
 +            else:
 +                print("Es ist kühl.")
 +        else: 
 +            print("Es ist behaglich.")
 +    else:
 +        print("Es ist warm.")
 +else:
 +    print("Es ist heiss.")
 +</code>
 +</hidden>
 +</WRAP>
 +
 +
 +
 +===== Aufgabe: Lineare Gleichungen (in Standardform) vom Computer lösen lassen =====
 +
 +<WRAP round todo>
 +(1) Schreibe ein Programm, dass vom Benutzer zwei Zahlen $a$ und $b$ einliest. Das Programm soll ausgegeben, wie viele Lösungen die lineare Gleichung $ax+b=0$ hat. Danach sollen alle Lösungen ausgegeben werden.
 +
 +Alle Spezialfälle sind zu behandeln (denke an Fälle wie $0X+2=0$ und $0X+0=0$).
 +
 +<hidden Hinweis, falls dir die Mathematik Probleme macht:>
 +Die Fallunterscheidung in der Mathematik (und dann auch in deinem Python-Programm) geht so:
 +  * Im Fall $a \not=0$ hat die Gleichung genau eine Lösung, nämlich $x=-\frac{b}{a}$.
 +  * Sonst (also im Fall $a=0$) gilt: (Die Gleichung hat dann die Gestalt $0x+b=0$.)
 +    * Im Fall $b\not= 0$ hat die Gleichung keine Lösung, also Lösungsmenge $\mathbb{L} = \emptyset$.
 +    * Sonst (also im Fall $b = 0$) hat die Gleichung jede reelle Zahl als Lösung, also Lösungsmenge $\mathbb{L} = \mathbb{R}$.
 +Als Ausgabe musst du nicht diese mathematischen Symbole verwenden, sondern kannst einfach die Lösungsmenge per Text beschreiben.
 +</hidden>
 +
 +----
 +
 +(2) Teste dein Programm!
 +
 +<hidden Lösungsvorschlag>
 +<code python lineare-gleichung-loesen.py>
 +print("Lösungsprogramm für lineare Gleichunge der Gestalt ax+b=0.")
 +a = int(input("Wert von a: "))
 +b = int(input("Wert von b: "))
 +
 +if a != 0:
 +    print("Die Gleichung hat genau eine Lösung, nämlich " + str(-b/a) + ".")
 +elif b!= 0:
 +    print("Die Gleichung hat keine Lösung.")
 +else:
 +    print("Die Gleichung hat jede reelle Zahl als Lösung.")</code> 
 +</hidden>
 +</WRAP>
 +
 +===== Bonus-Material =====
 +
 +<WRAP center round todo>
 +Schau, was du auf
 +
 +https://www.w3schools.com/python/python_conditions.asp
 +
 +zusätzlich zu if-statements lernen kannst. (Fehlt hier etwas Wichtiges?)
 +
 +Dort kannst du auch viele Beispiele direkt im Browser ausprobieren. Finde heraus, wie das geht!
 +
 +Bearbeite die Übungen am Ende der Seite.
 +</WRAP>
 +
 +<WRAP center round todo>
 +Stell dir selbst ein Problem, das du mit den bereits vorhandenen Programmierkenntnissen lösen kannst.
 +
 +Wenn du es mir mitteilst und es mir gefällt, nehme ich es gerne (je nach Wunsch mit oder ohne Angabe des Autors bzw. der Autorin) in diesen Kurs auf!
 +</WRAP>
 +
 +
 +===== Link zur Kursseite =====
 +
 +[[lehrkraefte:snr:informatik:glf22|Zur Kursseite]]
 +