5. Verzweigungen und bedingte Schleifen
Verzweigungen mit if, elif und else
In vielen Fällen möchten wir Code nur ausführen, falls eine gewisse Bedingung wahr ist: beispielsweise möchte ein Arzt nur dann eine Warnung erhalten, wenn der Blutdruck eines Patienten zu hoch ist, oder ein selbstfahrendes Auto sollte nur dann piepsen, wenn der Fahrer nicht aufmerksam auf die Strasse schaut. Um solche konditionale (bedingte) Logik zu programmieren, können wir die Begriffe if (“falls”), elif (“sonst falls”) und else (“in allen anderen Fällen”) verwenden.
Verzweigungen mit if
Folgendes Beispiel führt nur zu einem Output, falls eine Temperatur von 30 Grad oder mehr eingegeben wird.
Der Code kann folgendermassen als Fluss-Diagramm aufgezeichnet werden (siehe Abschnitt). Auf dem Flussdiagramm werden die einzelnen Schritte des Codes als Boxen dargestellt. Die Boxen sind durch Pfeile verbunden, die den Fluss des Codes darstellen. Die Entscheidungspunkte sind durch Rauten dargestellt, und die Pfeile zeigen, welche Aktion ausgeführt wird, je nachdem, ob die Bedingung wahr oder falsch ist.
Dabei bezeichnen blaue, rechteckig-abgerundete Boxen eine Zeile Code. Grüne, rauteförmige Formen bezeichnen einen Test und der schwarze Punkt bezeichnet das Programmende. Wenn immer eine Verzweigung vorliegt, geht der Pfeil für True nach links, der Pfeil für False geht nach rechts.
Nach jedem if steht ein logischer Ausdruck oder ein logischer Wert.
, auch sind Ausdrücke, die genau zwei verschiedene Werte annehmen können: entweder wahr (True) oder falsch (False). Beispiele sind:
Wie Sie im obigen Beispiel sehen, wird von einem Wahrheitstest ein Wert zurückgegeben: entweder der Wert True (Wahr) oder False (Falsch).
Mögliche logische Relationen sind in Abschnitt abgebildet.
| Python | Mathematische Bedeutung |
|---|---|
== |
gleich (\(=\)) |
| ungleich (\(\neq\)) | |
< |
kleiner (\(<\)) |
<= |
kleiner oder gleich (\(\leq\)) |
> |
grösser (\(>\)) |
>= |
grösser oder gleich (\(\geq\)) |
Logische (oder auch bool’sche) Ausdrücke wie z.B. 3 < 45 führen zu einem , also einem Wahrheitswert, welcher entweder den Wert True (wahr) oder False (falsch) hat.
Die typische Verwendungsart logischer Ausdrücke ist in folgendem Code abgebildet:
Entwickeln Sie eine Funktion quadrat(laenge) zum Zeichnen von Quadraten. Der Befehl soll aber nur etwas zeichnen, wenn die Seitenlänge mindestens 40 beträgt. Zeichnen Sie sich zuerst ein Flussdiagramm des Codes auf Papier auf.
# File: quadrat40.py
import turtle as t
def quadrat(laenge):
if laenge >= 40:
for _ in range(4):
t.forward(laenge)
t.left(90)
quadrat(100)
t.done()💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Entwickeln Sie ein Programm, das dem Benutzer im Rahmen einer interaktiven Fragerunde drei Fragen stellt (mit dem Befehl input("...")).
Das Programm soll die Anzahl der richtigen Antworten zählen und diese Anzahl ausgeben.
Zur Erinnerung: input("Frage") gibt den Text "Frage" auf dem Bildschirm aus und wartet auf eine Eingabe des Benutzers. Um die Antwort zu speichern, muss der Befehl in eine Variable gespeichert werden. Zum Beispiel:
Die Eingabe eines input("...")-Befehls wird immer als Text zurückgegeben, selbst wenn eine Zahl eingetippt wird. Um die Eingabe als Zahl zu interpretieren, muss der Text in eine Zahl umgewandelt werden. Dies geschieht mit dem Befehl int(input("Frage")). Beispiel:
Zeichnen Sie Ihre Lösung als Flussdiagramm des Codes auf Papier auf.
Verzweigungen mit if und else
In folgendem Code wird mit dem else-Ausdruck ein Fall definiert, welcher ausgeführt wird, sofern die if-Kondition nicht zutrifft.
Beachten Sie, dass nach dem else kein logischer Ausdruck steht, da der Code unterhalb des else nur dann stattfindet, wenn alle zuvor genannten Tests falsch waren.
Der Code kann ebenfalls als Fluss-Diagramm aufgezeichnet werden:
Verzweigungen mit if, elif und else
Folgender Code führt eine von drei Möglichkeiten aus:
Der Code kann folgendermassen als Fluss-Diagramm aufgezeichnet werden:
Ein Bäcker möchte Kekse backen und gleichmässig in Keksdosen verpacken, so dass jede Dose voll ist. Jede Dose fasst 12 Kekse. Schreibe ein Programm, das berechnet:
- Wie viele Dosen benötigt werden für n Kekse.
- Wie viele Kekse übrig bleiben.
Falls mehr als 500 oder weniger als 1 für n eingegeben werden, soll ausgegeben werden:
"Ungültige Anzahl Kekse“|
Verwenden Sie die Ganzzahldivision (//) und Modulo (%)! Zur Erinnerung: // gibt den ganzzahligen Teil der Division zurück, % gibt den Rest der Division zurück.
Bei einer Flugreise darf der aufgegebene Koffer üblicherweise nicht schwerer sein als 20 kg. Ansonsten bezahlt man einen Aufschlag von CHF 5.- pro kg Übergewicht.
Schreiben Sie ein Unterprogramm koffer(gewicht), das einen Parameter Gewicht entgegennimmt und einen Text auf der Konsole druckt, je nach Fall:
- Wenn der Koffer über 100 kg wiegt, wird er nicht transportiert (
"Der Koffer ist zu schwer"). - Wenn der Koffer über 20 kg und bis und mit 100 kg wiegt, muss der Aufpreis berechnet und ausgegeben werden (z.B.
"Ihr Koffer hat X kg Übergewicht. Das kostet (5*X).-"). - Wenn der Koffer über 0 kg und bis und mit 20 kg wiegt, muss kein Aufpreis bezahlt werden und es wird gedruckt
"Der Koffer ist gratis". - In allen anderen Fällen soll ausgegeben werden
Das eingegebene Gewicht ist nicht zulässig(0, negative Zahlen etc.).
Entwickeln Sie eine Funktion vielecke_sicher(anzahl, seite) zum Zeichnen von regelmässigen Vielecken mit wählbarer Anzahl Ecken und wählbarer Seitenlänge. Wenn anzahl (die Anzahl der Ecken) kleiner als 1 ist, soll das Programm nichts tun. Wenn anzahl == 1 ist, soll das Programm "Es gibt kein 1-Eck" ausgeben. Wenn anzahl == 2 ist, soll das Programm "Es gibt kein 2-Eck" ausgeben. Wenn anzahl >= 3 ist, soll das Programm das anzahl-Eck mit Seitenlänge seite zeichnen. Zeichnen Sie auch das dazugehörige Flussdiagramm.
# File: vieleck_sicher.py
import turtle as t
def vielecke_sicher(anzahl, seite):
if anzahl < 1:
return
elif anzahl == 1:
print("Es gibt kein 1-Eck")
elif anzahl == 2:
print("Es gibt kein 2-Eck")
else:
for _ in range(anzahl):
t.forward(seite)
t.left(360 / anzahl)
t.done()
# Beispielaufruf
vielecke_sicher(5, 100)💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Was gibt dieser Code aus? Ist die Ausgabe sinnvoll? Weshalb (nicht)?
Der Code gibt sowohl "Es ist heiss" als auch "Es ist warm" aus. Dies ist nicht sinnvoll, da die Temperatur 33 Grad beträgt und somit nur eine der beiden Aussagen wahr sein kann.
Der Grund dafür ist, dass die zweite if-Bedingung unabhängig von der ersten if-Bedingung ist. Das else gehört nur zur zweiten if-Bedingung. Das bedeutet, dass die zweite if-Bedingung immer ausgeführt wird, selbst wenn die erste if-Bedingung bereits wahr war. Aus diesem Grund wäre es sinnvoller, statt einem if-Befehl eine elif-Bedingung zu verwenden.
Das Flussdiagramm zeigt dieses Problem grafisch auf. Der rote, dicke Pfeil zeigt den problematischen Teil des Codes auf. Der zweite Test wird immer ausgeführt, auch wenn die erste Bedingung bereits wahr war. Zudem gehört das else nur zur zweiten if-Bedingung.
Entwickeln Sie eine Funktion quadgleich(a, b, c), welche quadratische Gleichungen der Form (ax^2 + bx + c = 0) löst.
Zur Erinnerung: die Formel zur Berechnung der Lösungen ist: \[\begin{equation} x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \end{equation}\] Der Befehl soll zuerst (d = b^2 - 4ac) ausrechnen und abhängig vom Wert von \(d\) keine, eine oder zwei Lösungen ausgeben.
- Falls \(d < 0\), gibt es keine reelle Lösung
- falls \(d = 0\), gibt es genau eine reelle Lösung
- falls \(d > 0\), gibt es genau zwei Lösungen
Gegeben seien zwei Zahlen x1 und x2. Schreiben Sie eine Funktion maxzahl(x1, x2), welche die grössere der beiden Zahlen mit return zurückgibt. Wenn beide Zahlen gleich gross sind, soll x2 ausgegeben werden.
Wir möchten ein quadratisches Schachbrettmuster mit \(n \times n\) Feldern erzeugen, wobei \(n\) eine gerade positive natürliche Zahl ist. Jedes der \(n^2\) Felder soll dabei eine Grösse von genau \(s \times s\) Zeichen haben (\(s \geq 1\)). Die Zahl~1 repräsentiere die schwarzen Felder, die Zahl~0 die weissen Felder.
Zusätzlich möchten wir wählen können, ob das linke obere Feld schwarz oder weiss sein soll (upper_left = 'black' oder upper_left = 'white'). Folgende Beispiele zeigen die entsprechenden Schachbrettmuster für verschiedene Wahlen der drei Parameter \(n\), \(s\) und upper_left:
Allgemein soll das Muster immer genau \(ns\) Zeichen breit und ebenso hoch sein. Schreiben Sie ein Python-Programm, welches die drei oben beschriebenen Parameter akzeptiert und das entsprechende Schachbrettmuster ausgibt.
Logische Ausdrücke miteinander verbinden: and und or
Häufig fällen wir im echten Leben Entscheidungen, welche nicht nur von einer Bedingung abhängen, sondern gleich von mehreren, so zum Beispiel:
- Ich gehe per Fahrrad zur Schule, falls das Wetter schön ist und ich mich körperlich fit fühle.
- Ich esse etwas, falls ich Hunger habe oder ich Lust darauf habe (auch wenn ich keinen Hunger habe).
Beim ersten Beispiel handelt es sich um eine Verbindung per “und”: beide Konditionen müssen wahr sein, damit etwas geschieht. Dies kann in Python mit and (englisch für “und”) umgesetzt werden.
Folgendes Beispiel illustriert, wie mehrere Bedingungen miteinander verknüpft werden können:
Beim zweiten Beispiel handelt es sich um eine Verbindung mehrerer Bedingungen per “oder”: es reicht, dass eine von beiden Bedingungen wahr ist, damit etwas geschieht. Dies kann in Python mittels des Wortes or (englisch für “oder”) umgesetzt werden.
Folgendes Beispiel illustriert, wie mehrere Bedingungen miteinander verknüpft werden können:
Der logische Operator and gibt True zurück, nur wenn beide Bedingungen A und B wahr sind:
| A | B | A and B |
|---|---|---|
False |
False |
False |
False |
True |
False |
True |
False |
False |
True |
True |
True |
Der logische Operator or gibt True zurück, wenn mindestens eine der beiden Bedingungen A und B wahr ist:
| A | B | A or B |
|---|---|---|
False |
False |
False |
False |
True |
True |
True |
False |
True |
True |
True |
True |
Schreiben Sie eine Funktion geschwindigkeit_angemessen(geschwindigkeit), welche als Parameter geschwindigkeit eine Zahl entgegennimmt (z.B. 50 oder 120). Falls die Geschwindigkeit zwischen 30 und 100 km/h liegt (einschliesslich dieser Werte), soll auf der Konsole ausgegeben werden: “Die Geschwindigkeit ist angemessen”. Ansonsten soll ausgegeben werden “Die Geschwindigkeit ist nicht angemessen”. Verwenden Sie dazu den Ausdruck and.
Schreiben Sie eine Funktion temperatur_ist_unangenehm(temperatur), welche einen Parameter temperatur als Zahl entgegennimmt. Falls die Temperatur kleiner als 10 Grad oder grösser als 30 Grad ist, soll auf der Konsole ausgegeben werden: “Unangenehme Temperatur”. Ansonsten soll ausgegeben werden: “Angenehme Temperatur”. Verwenden Sie dazu den Ausdruck or.
Entwickeln Sie eine Funktion vieleck_kreis(anzahl_ecken, umfang), die ein Vieleck zeichnet. Damit das Vieleck aussieht wie ein Kreis, soll es nur gezeichnet werden, wenn die Anzahl der Ecken grösser als 35 ist und wenn der Umfang mindestens 100 ist.
# File: vieleck_kreis_and.py
import turtle as t
def vieleck_kreis(anzahl_ecken, umfang):
if anzahl_ecken > 35 and umfang >= 100:
for _ in range(anzahl_ecken):
t.fd(umfang / anzahl_ecken)
t.lt(360 / anzahl_ecken)
else:
print(
"Das Vieleck wird nicht gezeichnet, da die Bedingungen nicht erfüllt sind."
)
# Beispielaufruf
vieleck_kreis(40, 220)
t.done()💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Verwenden Sie einen input-Befehl, um den Benutzer nach einer Zahl \(n\) zu fragen.
- Falls die Zahl \(n = 1\) eingegeben wird, soll ein blaues Viereck gezeichnet werden.
- Falls eine Zahl \(n\) von 2 bis und mit 6 eingegeben wird, soll ein grünes Sechseck gezeichnet werden.
- Falls eine Zahl \(n\) von 7 oder grösser eingegeben wird, soll ein schwarzes \(n\)-Eck gezeichnet werden.
# File: vieleck_if_elif_2.py
import turtle as t
def zeichne_vieleck():
n = int(input("Gib eine Zahl ein"))
if n == 1:
t.color("blue")
for _ in range(4):
t.forward(100)
t.right(90)
elif n >= 2 and n <= 6:
t.color("green")
for _ in range(6):
t.forward(100)
t.right(60)
elif n >= 7:
t.color("black")
for _ in range(n):
t.forward(100)
t.right(360 / n)
else:
print("Bitte eine Zahl grösser oder gleich 1 eingeben.")
t.done()
zeichne_vieleck()💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Schreiben Sie eine Funktion positiv_und_gerade(zahl), welche einen Parameter zahl entgegennimmt, und testet, ob die Zahl positiv und gerade ist, und falls dies zutrifft, den Text ausgibt "Die Zahl ist positiv und gerade". Ansonsten soll nichts ausgegeben werden.
Zur Erinnerung: Eine Zahl ist gerade, wenn sie ohne Rest durch 2 teilbar ist. Der Rest einer Ganzzahldivision kann in Python mit dem Modulo-Operator % berechnet werden. Beispiel:
Dieser Ausdruck gibt True zurück, wenn die Zahl gerade ist, da sie dann vollständig (ohne Rest) durch 2 teilbar ist. Andernfalls gibt der Ausdruck den Wert False zurück.
Entwickeln Sie ein Programm, das alle natürlichen Zahlen zwischen 0 und 100 auf den Bildschirm schreibt, die durch 7, aber nicht durch 3 teilbar sind.
Einen Code mit mehreren Bedingungen kann man statt mit or häufig auch mit if, elif und else umsetzen. Überlegen Sie sich, wie Sie den Code aus Abschnitt mit if, elif und else statt mit or schreiben könnten.
In welchen Fällen ist es sinnvoller, if, elif und else zu verwenden? In welchen Fällen ist es sinnvoller or zu verwenden?
if, elif und else sind primär dann sinnvoll, wenn unterschiedliche Ausgaben gemacht werden sollen, je nachdem, welche Bedingung zutrifft. or ist sinnvoll, wenn nur eine Bedingung wahr sein muss, damit etwas geschieht. Beispiel: if (a == 1) or (b == 2) – hier ist es egal, ob nur eine der beiden Bedingungen wahr ist oder beide.
Einen Code mit mehreren Bedingungen kann man statt mit and häufig auch mit verschachtelten if-Bedingungen umsetzen. Überlegen Sie sich, wie Sie den Code aus Abschnitt mit verschachtelten if-Bedingungen statt mit and schreiben könnten.
In welchen Fällen ist es sinnvoller, and zu verwenden? In welchen Fällen sind verschachtelte if-Bedingungen besser geeignet?
and ist primär dann sinnvoll, wenn alle Bedingungen gleichzeitig erfüllt sein müssen, damit etwas geschieht, und die Logik klar und einfach bleibt. Beispiel: if (a > 0) and (b > 0) – hier ist es leicht verständlich, dass beide Bedingungen erfüllt sein müssen.
Verschachtelte if-Bedingungen sind besser geeignet, wenn die Bedingungen in einer bestimmten Reihenfolge geprüft werden sollen oder wenn unterschiedliche Aktionen bei Nichterfüllung der Bedingungen notwendig sind.
Vorteile von and:
- Kürzerer und übersichtlicherer Code.
- Gut geeignet für einfache Bedingungen.
Vorteile von verschachtelten if-Bedingungen:
- Flexibler bei komplexeren Logiken.
- Ermöglicht unterschiedliche Aktionen bei Nichterfüllung einzelner Bedingungen.
Diskutieren Sie den Gebrauch der Begriffe “und” und “oder” im Alltag und in der Informatik. Wo sehen Sie Unterschiede in der Verwendung dieser Begriffe?
- “und” bedeutet in der Informatik, dass beide Bedingungen erfüllt sein müssen, damit etwas geschieht. Im Alltag kann “und” auch bedeuten, dass nur eine der beiden Bedingungen erfüllt sein muss, oder dass die genannten Aspekte nacheinander eintreten (nicht gleichzeitig, wie in der Informatik), wie in folgendem Beispiel: “Ich gehe zur Schule und dann gehe ich nach Hause”.
- “oder” bedeutet in der Informatik, dass mindestens eine der beiden Bedingungen erfüllt sein muss, damit etwas geschieht. Im Alltag kann “oder” auch bedeuten, dass beide Bedingungen möglich sind. Beispiel: “Ich nehme das Auto oder das Fahrrad.” – Hier ist die Bedeutung unklar: Vielleicht nimmt die Person nur eines der beiden, aber auch beide (in Kombination) wären theoretisch möglich.
Das harmonische Mittel zweier Zahlen a und b ist eine wichtige Grösse in der Informatik, da es in vielen Algorithmen verwendet wird, beispielsweise in der Berechnung von Durchschnittswerten.
Beispiel: Wenn Sie 100 Kilometer mit 50 km/h und 100 Kilometer mit 100 km/h fahren, beträgt die Durchschnittsgeschwindigkeit nicht 75 km/h, sondern 66.67 km/h. Das harmonische Mittel kann in diesem Fall verwendet werden, um die Durchschnittsgeschwindigkeit zu berechnen:
Das harmonische Mittel zweier Zahlen a und b ist \(\frac{2}{\frac{1}{a}+\frac{1}{b}}\). Es lässt sich aber nur berechnen, wenn weder \(a\) noch \(b\) null sind. Entwickeln Sie eine Funktion harmonisches_mittel(a, b), die für die Parameter \(a\) und \(b\) das harmonische Mittel ausrechnet, wenn sowohl \(a\) als auch \(b\) nicht null sind. Ansonsten gibt der Befehl den Text "Das kann man nicht berechnen." aus.
Schreiben Sie eine Python-Funktion def ist_schaltjahr(jahr), welche prüft, ob ein gegebenes Jahr ein Schaltjahr ist oder nicht.
Ein Jahr ist ein Schaltjahr, genau dann wenn gilt:
- (das Jahr ist durch 400 teilbar) oder
- (das Jahr ist durch 4 teilbar aber nicht durch 100)
Für die Prüfung auf Teilbarkeit sollen Sie den Modulo-Operator (%) verwenden.
Logische Ausdrücke negieren: not
Negieren bedeutet in der Informatik nicht zwingend, das Gegenteil einer (ursprünglichen) Aussage zu machen, sondern alle Aussagen zu machen, welche durch die ursprüngliche Aussage nicht gemacht wurden, also alles “andere” als die ursprüngliche Aussage zu sagen.
Folgende Tabelle illustriert, was mit der Negation einer Aussage gemeint ist.
| p{7cm}} | |
|---|---|
| Aussage | Negation |
| “Das Mädchen heisst Elin” | “Das Mädchen heisst nicht Elin” |
| “Niemand in dieser Klasse ist volljährig” | “Mindestens eine Person in dieser Klasse ist volljährig” |
| \(x > 2\) | \(x \leq 2\) |
(Von Hand) Notieren Sie zu folgenden Aussagen die Negation, ohne die Wörter “nicht” oder “kein” zu verwenden:
- \(x \geq 3\)
- \(y\) ist eine negative Zahl
- in der Variable
testist der Wert"Franz"gespeichert. - Im Auto sitzen mindestens drei Menschen
- Der Koffer ist leer
- Das Programm ist falsch geschrieben
- Die Anzahl der Jugendlichen in der Klasse ist genau 19
- Morgen wird es in Zürich mindestens 22 Grad Celsius warm
- \(x < 3\)
- \(y\) ist eine positive Zahl oder Null
- in der Variable
testist etwas Anderes als der Wert"Franz"gespeichert. - Im Auto sitzen weniger als drei Menschen
- Der Koffer enthält mindestens einen Gegenstand
- Das Programm ist richtig geschrieben
- Die Anzahl der Jugendlichen in der Klasse ist kleiner oder grösser als 19
- Morgen wird es in Zürich weniger als 22 Grad Celsius warm
Die Negation einer Aussage kann in Python mit dem Ausdruck not (englisch für “nicht”) gemacht werden. Die Negation einer Aussage (mit not) ist insbesondere praktisch, um die Negation einer Aussage zu machen, ohne die Aussage komplett umschreiben zu müssen.
Wir können den Code aus Abschnitt einfach mit dem Ausdruck not umschreiben, um auszugeben, unter welchen Bedingungen wir nicht per Fahrrad zu Schule gehen wollen:
Man könnte dieselbe Aussage auch folgendermassen formulieren: “Falls ich mich nicht fit fühle oder das Wetter schlecht ist, gehe ich nicht per Fahrrad zur Schule”. Dies sähe in Python folgendermassen aus:
Weshalb haben wir im ersten Code ein and und im zweiten Code ein or? Dank dem not müssen wir nichts vom ursprünglichen Code in Abschnitt umformulieren, da wir mit dem not einfach alljene Fälle negieren, welche innerhalb der Klammer stehen. Somit kommen beide Codes zum selben Resultat.
Schreiben Sie Ihren Code aus Abschnitt so um, dass getestet wird, ob eine Zahl weder gerade noch positiv ist. Verwenden Sie dazu unter anderem den Ausdruck not. Testen Sie ihre Funktion für die Werte -3, +3, -4 und +4.
Schreiben Sie danach dieselbe Funktion nochmals, ohne den Ausdruck not zu verwenden.
Entwickeln Sie ein Programm, das alle Zahlen von 1 bis 24 mit print ausgibt, die nicht Teiler von 24 sind. Verwenden Sie den Ausdruck not.
Fussgesteuerte Schleifen mit break
Bisher haben wir eine Art von Schleife gesehen: for _ in range(...). Dabei gibt die Zahl innerhalb des Befehls range(...) an, wie viele Mal der Schleifenkörper wiederholt wird. Manchmal wissen wir jedoch nicht im Voraus, wie viele Male eine Schleife wiederholt werden soll, wir kennen jedoch eine Bedingung, bei der die Schleife abgebrochen werden soll. Dies könnte beispielsweise der Fall sein, wenn wir eine Spirale zeichnen wollen, die immer grösser wird, bis die Seitenlänge eine gewisse maximale Länge max_seite erreicht hat.
Natürlich könnte man auch hier berechnen, wie viele Male die for-Schleife ausgeführt werden muss. Die Formel, um dies zu berechnen, wäre: [ + 1]
Es geht allerdings auch einfacher, indem wir eine “unendliche” Schleife starten, die wir abbrechen, sobald eine gewisse Kondition wahr ist.
Grundsätzlich können wir auch direkt die Werte True (Wahr) oder False (Falsch) in Logischen Ausdrücken verwenden:
Der print-Befehl in folgendem Beispiel wird immer ausgeführt:
Den Wert True könnten wir beispielsweise verwenden, um eine Endlosschleife mit while True: zu konstruieren.
Schreiben Sie eine Funktion erraten_zahl(), die ein einfaches Zahlenratespiel implementiert (siehe Code-Vorlage untenan). Die Funktion soll:
- Eine zufällige Zahl zwischen 1 und 100 generieren (dies wird gemacht mit dem Befehl
random.randint(1, 100), ist im Code bereits gemacht). - Den Benutzer in einer Schleife auffordern, die Zahl zu erraten (
int(input("Rate die Zahl: "))). - Falls die Eingabe kleiner als die gesuchte Zahl ist, soll ausgegeben werden: “Die Zahl ist grösser.”.
- Falls die Eingabe grösser als die gesuchte Zahl ist, soll ausgegeben werden: “Die Zahl ist kleiner.”.
- Falls die Eingabe korrekt ist, soll die Nachricht “Richtig! Du hast die Zahl erraten.” ausgegeben werden und die Schleife mit
breakbeendet werden.
Testen Sie die Funktion, indem Sie sie ausführen und versuchen, die Zahl zu erraten. Vervollständigen Sie folgende Code-Vorlage:
Schreiben Sie eine Funktion zeichne_spirale(seitenlaenge, winkel, increment), die eine Spirale zeichnet. Die Funktion soll folgende Parameter haben:
seitenlaenge: Die Startlänge der ersten Seite.winkel: Der Winkel, um den sich die Turtle nach jeder gezeichneten Seite dreht.increment: Der Wert, um den die Seitenlänge nach jeder gezeichneten Seite erhöht wird.
Die Spirale soll so lange gezeichnet werden, bis die Seitenlänge 200 erreicht oder überschritten hat.
# File: zeichne_spirale.py
import turtle as t
def zeichne_spirale(seitenlaenge, winkel, increment):
while seitenlaenge < 200:
t.forward(seitenlaenge)
t.right(winkel)
seitenlaenge += increment
t.speed(0)
zeichne_spirale(10, 45, 5)
t.done()💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Schreiben Sie eine Funktion ist_quadrat(x), die überprüft, ob eine gegebene natürliche Zahl \(x\) eine Quadratzahl ist (also ob es eine ganze Zahl \(a\) gibt, so dass \(x = a \cdot a\)).
Das Programm soll mit \(a = 1\) starten und überprüfen, ob \(a \cdot a = x\). Falls \(a \cdot a = x\), soll \(a\) ausgegeben werden und die Schleife abgebrochen werden. Ansonsten fährt man mit \(a = a+1\) weiter.
Sobald \(a \cdot a > x\) soll die Schleife abgebrochen und ausgegeben werden: x ist kein Quadrat.
Verwenden Sie dazu eine while True-Schleife.
Was gibt folgender Code aus und wann endet er?
Der Code gibt nichts aus und endet nie (läuft unendlich weiter). Grund: Die Bedingung i > 5 wird nie erfüllt, da der Wert von i innerhalb der Schleife nicht verändert wird. Die Schleife ist somit eine Endlosschleife.
Kopfgesteuerte Schleifen mit while
Folgendes Beispiel zeigt, wie ein while True: mit einem break-Befehl zu einem einfachen while mit Ausführungs-Bedingung vereinfacht werden kann. Beide Codes machen dasselbe. Die Schleife wird solange ausgeführt, wie die Ausführungs-Bedingung wahr ist. Die Abbruchbedingung wird vor jeder neuen Schleifenausführung überprüft und die Schleife wird nur dann ausgeführt, wenn die Ausführungs-Bedingung noch wahr ist. Beim linken Code verwenden wir nicht eine Ausführungs-Bedingung sondern eine Abbruch-Bedingung.
import turtle as t
def spirale(seite, add, max_seite):
while True: !!
if seite > max_seite:
break !!
t.fd(seite)
t.rt(90)
seite+=add
spirale(10, 10, 100)💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Beachten Sie folgende Punkte:
- Passen Sie auf, dass Sie keine unendlichen Schleifen produzieren! In diesem Fall kann das Programm, auf dem Python läuft, hängen bleiben. Vergessen Sie daher nie die Abbruchbedingung klar zu formulieren!
- Ein
while True:(unendliche Schleife) ohnebreakkann zum Absturz des Programms führen - Je nachdem kann das auch in einem
whilemit einer Kondition passieren, sofern die Bedingung nach demwhileso geschrieben ist, dass sie immer wahr (True) ist (siehe Abschnitt zu semantischen Fehlern). - Speichern Sie regelmässig Ihre Aufgaben!
- Falls VS Code hängenbleibt: Beenden mit (Windows), bzw. Activity Monitor unter MacOS
Schreiben Sie eine Funktion verdreifache_bis_ueber1Mio(zahl), welche eine Zahl zahl so lange immer wieder verdreifacht, bis zahl erstmals grösser als 1’000’000 ist. Dabei sollen alle Zwischenresultate in der Konsole ausgegeben werden. Am Schluss soll ausserdem die Anzahl Verdreifachungen ausgedruckt werden.
Entwickeln Sie eine Funktion, dem eine Zahl \(x > 1\) als Parameter übergeben wird. Aus \(x\) wird nun eine Folge von Zahlen generiert und ausgegeben. Dabei wird folgende Regel angewendet: Wenn \(x\) durch zwei teilbar ist, ist die nächste Zahl \(x / 2\) . Wenn \(x\) nicht durch zwei teilbar ist, ist die nächste Zahl \(3 \cdot x + 1\) . Dieser Prozess wird wiederholt, solange die neu berechnete Zahl grösser als 1 ist.
Entwickeln Sie ein Programm, das eine siebeneckige Spirale von aussen nach innen zeichnet. Die Startlänge der Seite und die Verkleinerung der Seite in jedem Schritt sollen Parameter sein. Verwenden Sie eine while-Schleife und lassen Sie die Spirale so lange zeichnen, wie die Seitenlänge grösser als 10 ist.
# File: spirale_sieben.py
import turtle as t
def zeichne_siebeneckige_spirale(startlaenge, verkleinerung):
seitenlaenge = startlaenge
winkel = 360 / 7 # Winkel für ein Siebeneck
while seitenlaenge > 10:
t.forward(seitenlaenge)
t.right(winkel)
seitenlaenge -= verkleinerung
# Turtle-Setup
t.speed(0) # Maximale Geschwindigkeit
t.penup()
t.goto(0, 0)
t.pendown()
# Parameter für die Spirale
startlaenge = 100 # Startlänge der Seite
verkleinerung = 5 # Verkleinerung der Seitenlänge pro Schritt
zeichne_siebeneckige_spirale(startlaenge, verkleinerung)
# Fenster offen halten
t.done()💡 Hinweis: Dieses Skript verwendet grafische Desktop-Bibliotheken (turtle / pygame). Führen Sie diesen Code in Ihrer lokalen Entwicklungsumgebung (z.B. VS Code) aus.
Gegeben ist eine natürliche Zahl x > 1. Ein echter Teiler einer Zahl ist eine Zahl, die grösser als 1 und kleiner als x ist und x ohne Rest teilt. 10 hat beispielsweise die Teiler 1, 2, 5 und 10, wovon nur 2 und 5 echte Teiler sind.
Schreiben Sie ein Programm, das für eine vom Benutzer eingegebene Zahl x mit einer while-Schleife den kleinsten und den grössten echten Teiler von x bestimmt.
Gibt es keine echten Teiler (d.h. x ist eine Primzahl), soll das Programm ausgeben "x ist eine Primzahl.". Andernfalls sollen der kleinste und der grösste echte Teiler ausgegeben werden.
Wenn man die folgende Zahlenfolge von Brüchen immer weiter addiert, wird die Summe immer grösser:
[ + + + + ]
Wie viele Brüche müssen addiert werden, damit die Summe mindestens gleich einer gegebenen Zahl \(x\) wird?
Schreiben Sie ein Python-Programm, das die Brüche addiert, solange deren Summe kleiner als \(x\) ist. Am Ende soll das Programm ausgeben, welcher Nenner beim letzten hinzugefügten Bruch verwendet wurde und wie gross die Summe insgesamt ist.
Wenn über 100 Brüche addiert wurden, soll die while-Schleife abgebrochen werden (mit break).
Wie viele Schleifen durchläuft das folgende Programm?
Das Programm durchläuft theoretisch unendlich viele Schleifen. Es handelt sich hier um eine asymptotische Funktion, welche sich immer weiter der Zahl 2 annähert, diese aber nie erreicht. Es endet jedoch trotzdem, da Python irgendwann an die Grenze der Genauigkeit von Gleitkommazahlen kommt und die Berechnung von summe nicht mehr korrekt durchgeführt werden kann. Sobald summe den Wert 2 erreicht oder überschreitet, wird die Schleife mit break abgebrochen.
Schreiben Sie ein Programm, das den Benutzer wiederholt auffordert, Wörter einzugeben. Sobald das Wort “Voldemort” eingegeben wird, soll der Prozess beendet werden. Der Computer soll anschliessend eine Aneinanderreihung aller vor “Voldemort” eingegebenen Wörter ausgeben.
Sissa ibn Dahir lebte angeblich im dritten oder vierten Jahrhundert in Indien und gilt Legenden zufolge als der Erfinder des Schachspiels.
Der indische Herrscher Shihram tyrannisierte seine Untertanen und stürzte sein Land in Not und Elend. Um die Aufmerksamkeit des Königs auf seine Fehler zu lenken, ohne seinen Zorn zu entfachen, schuf der weise Brahmane Sissa ein Spiel, in welchem der König als wichtigste Figur ohne Hilfe anderer Figuren und Bauern nichts ausrichten kann. Der Unterricht im Schachspiel machte auf den Herrscher Shihram einen starken Eindruck. Er wurde milder und liess das Schachspiel verbreiten, damit alle davon Kenntnis nehmen.
Um sich für die anschauliche Lehre von Lebensweisheit und zugleich Unterhaltung zu bedanken, gewährte er dem Brahmanen einen freien Wunsch. Dieser wünschte sich Weizenkörner: Auf das erste Feld eines Schachbretts wollte er ein Korn, auf das zweite Feld das Doppelte, also zwei, auf das dritte wiederum die doppelte Menge, also vier und so weiter.
Sie sollen die Menge Weizenkörner, welche Sissa vom Herrscher gefordert hat, berechnen. Gehen Sie folgendermassen vor:
Auf dem ersten Schachfeld liegt 1 Weizenkorn, auf dem zweiten Feld liegen 2 Weizenkörner, auf dem dritten Feld liegen 4 Körner usw.
Allgemein liegen auf dem (n+1)-ten Schachfeld genau doppelt so viele Körner wie auf dem (n)-ten Schachfeld. Unser Schachbrett habe (n)-Felder, wobei (n ). Wie viele Weizenkörner würden in dieser Situation insgesamt auf dem Schachfeld liegen (angenommen so viel Weizen hätte Platz)?
Schreiben Sie eine Funktion reis(n), welche die gesuchte Anzahl Körner in Abhängigkeit der Anzahl (n) der Felder berechnet und per return zurückgibt.
reis(3)sollte 7 ausgeben.reis(8)sollte 255 ausgeben.reis(64)sollte 18446744073709551615 ausgeben.
- Ein Teiler \(d\) einer natürlichen Zahl \(n\), heisst trivial, falls \(d = 1\) oder \(d = n\) gilt. Beispiele: Die trivialen Teiler von 8 sind 1 und 8 selbst. Die nichttrivialen Teiler von 8 hingegen sind 2 und 4. Die Zahl 24 besitzt genau die sechs nichttrivialen Teiler 2, 3, 4, 6, 8 und 12 und die beiden trivialen Teiler 1 und 24.
- Die Quersumme einer Zahl ist die Summe der einzelnen Ziffern ihrer Darstellung im Dezimalsystem. Beispiele: Die Quersumme von 315 ist \(3 + 1 + 5 = 9\). Die Quersumme von 1004 ist \(1 + 4 = 5\).
- Anstelle der Quersumme können wir auch die Quersumme der quadrierten Ziffern berechnen, indem wir die Ziffern jeweils zuerst quadrieren, bevor wir sie summieren. Beispiel: Die Quersumme der quadrierten Ziffern von 52 ist \(5^2 + 2^2 = 25 + 4 = 29\). Die Quersumme der quadrierten Ziffern von 134 ist \(1^2 + 3^2 + 4^2 = 1 + 9 + 16 = 26\).
- Eine natürliche Zahl \(n>1\) heisst , falls die Summe der nichttrivialen Teiler von \(n\) der Quersumme der quadrierten Ziffern von \(n\) entspricht.
- Die kleinste kanada-perfekte Zahl ist 125. Die nichttrivialen Teiler von 125 sind 5 und 25. Somit ist die Summe der nichttrivialen Teiler von 125 gegeben durch \(5 + 25 = 30\). Die Quersumme der quadrierten Ziffern von 125 ist ebenfalls 30, denn \(1^2 + 2^2 + 5^2 = 30\). Somit ist 125 eine kanada-perfekte Zahl.
Schreiben Sie ein Python-Programm, welches alle kanada-perfekten Zahlen kleiner als 600 findet. Hinweis: Es gibt genau zwei.
Eine natürliche Zahl heisst ``Perfekte Zahl’’, falls sie der Summe aller ihrer natürlichen Teiler ausser sich selbst entspricht.
- Die Zahl 6 ist eine perfekte Zahl. Sie besitzt genau die natürlichen Teiler \(1, 2\) und \(3\) (die Zahl \(6\) selbst nicht inbegriffen). Die Summe \(1 + 2 + 3 = 6\) dieser Teiler entspricht der Zahl selbst.
- Die Zahl 28 ist ebenfalls perfekt, da \(28 = 1 + 2 + 4 + 7 + 14\).
- Die Zahl 10 ist nicht perfekt. Ihre Teiler sind \(1, 2\) und \(5\) aber \(10 \neq 1 + 2 + 5 = 8\).
Schreiben Sie ein Python-Programm, welches genau die perfekten Zahlen \(\leq 10^5\) ausgibt.
Wir möchten ein quadratisches Schachbrettmuster mit \(n\times n\) Feldern erzeugen, wobei \(n\) eine gerade positive natürliche Zahl ist. Jedes der \(n^2\) Felder soll dabei eine Grösse von genau \(s\times s\) Zeichen haben (\(s\geq 1\)). Die Zahl 1 repräsentiere die schwarzen Felder, die Zahl 0 die weissen Felder.
Zur Vereinfachung dürfen Sie annehmen, dass das Feld in der linken oberen Ecke stets weiss ist. Die Aufgabe ist noch etwas schwieriger (soweit sind wir in der Theorie zur Zeit noch nicht), falls Sie zusätzlich wählen können, ob das linke obere Feld schwarz oder weiss sein soll (upper_left = 'black' oder upper_left = 'white'). Folgende Beispiele zeigen die entsprechenden Schachbrettmuster für verschiedene Wahlen der drei Parameter n, s und upper_left:
Allgemein soll das Muster immer genau \(ns\) Zeichen breit und ebenso hoch sein. Schreiben Sie ein TigerJython-Programm, welches die drei oben beschriebenen Parameter akzeptiert und das entsprechende Schachbrettmuster ausgibt.
Dies ist eine etwas vereinfachte Version von Problem 56 von Project Euler (https://projecteuler.net/problem=56). Finden Sie natürliche Zahlen \(a, b < 10\), sodass
$$
a^b
$$
eine möglichst grosse Quersumme hat. Schreiben Sie ein Python-Programm, welches optimale \(a\) und \(b\) berechnet.