~~NOTOC~~ ====== if-(else-)statements ====== 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//. ===== Erklärvideo zu if-statements und if-else-statements ===== 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"]] 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") ---- 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]]. ===== Wesentliche Punkte aus dem Video ===== ''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. 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. ===== Aufgabe zu if-else ===== (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).
Nach jeder Eingabe soll der Benutzer erfahren, ob er recht hatte, und sonst die richtige Antwort erfahren.
(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! 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.")
===== Aufgabe zu if-else mit logischen Verknüpfungen: Schaltjahr ===== 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. jahr = int(input("Jahreszahl: ")) if ????: print(str(jahr) + " ist kein Schaltjahr.") else: print(str(jahr) + " ist ein Schaltjahr.") 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''. 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). Der gesuchte boolesche Ausdruck hat die Form (jahr % 4 ? 0) ? ((jahr % 100 ? 0) ? (jahr % 400 ? 0)) wobei die Fragezeichen durch Vergleichszeichen und logische Verknüpfungen zu ersetzen sind. (jahr % 4 != 0) or ((jahr % 100 == 0) and (jahr % 400 != 0)) Auf Grund der "Operator-Hierarchie" in Python (vgl. Punkt-vor-Strich-Regel in der Mathematik) hat der Ausdruck jahr % 4 != 0 or jahr % 100 == 0 and jahr % 400 != 0 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). ===== if-(else-)-statements sind Kontrollstrukturen ===== 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). ===== Zur Terminologie ===== 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. ===== Erklärvideo zu verschachtelten if-else-statements ===== 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: 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") 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") 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") 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") ===== Aufgabe zu if-else-Verschachtelung und elif ===== (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. 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.") 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.") ===== Aufgabe: Lineare Gleichungen (in Standardform) vom Computer lösen lassen ===== (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$). 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. ---- (2) Teste dein Programm! 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.") ===== Bonus-Material ===== 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. 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! ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:glf22|Zur Kursseite]]