Übung 12 – Die while-Schleife
Ziel dieser Übung
Sie wiederholen Zeilen mit while, solange eine Bedingung wahr ist, und prüfen damit Eingaben.
So arbeiten Sie: Bearbeiten Sie die Schritte der Reihe nach. Ihre Tabellen und Programme tragen Sie in die
Reflexion zu Sitzung 4 ein. Öffnen Sie die Hilfen erst, wenn Sie nicht weiterkommen: zuerst den Tipp, dann das Gerüst, zuletzt die Lösung. Ihre Lösung darf anders aussehen – wichtig ist, dass sie für alle Testeingaben das Richtige ausgibt.
1. Aufbau der while-Schleife
zahl = 3
while zahl > 0:
print(zahl)
zahl = zahl - 1
print("Los!")
3
2
1
Los!
- Wie bei
if: Bedingung, Doppelpunkt, eingerückter Block. - Vor jeder Runde prüft Python die Bedingung neu. Ist sie falsch, geht es nach dem Block weiter.
- Im Block muss sich etwas ändern, hier
zahl = zahl - 1 – sonst läuft die Schleife endlos. Notbremse im Terminal: Strg + C.
2. Aufgaben
Aufgabe 1a · Eingabe prüfen Pflicht, ca. 8 Min.
Ein Spiel fragt nach einer Zahl von 1 bis 9. Wer etwas anderes eintippt, soll so lange einen Hinweis bekommen und neu gefragt werden, bis die Zahl passt.
Ihre Aufgabe
- Tragen Sie ein, wie oft das Programm bei den Eingaben jeweils nach einer Zahl fragt und welche Zahl es am Ende nimmt.
| Eingaben nacheinander | So oft wird gefragt (erwartet) | Gewählte Zahl (erwartet) |
|---|
5 | | |
0, 12, 7 | | |
9 | | |
-3, 10, 1 | | |
- Schreiben Sie
auswahl.py: Es fragt mit Zahl von 1 bis 9: und wiederholt die Frage mit while, solange die Zahl kleiner als 1 oder größer als 9 ist. - Geben Sie bei jeder falschen Zahl den Hinweis und am Ende die gewählte Zahl genau so aus:
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
- Testen Sie das Programm mit allen vier Zeilen aus der Tabelle.
Fertig sind Sie, wenn jede Ausgabe mit Ihrer Tabelle übereinstimmt.
Zusatz: Zählen Sie die Fehlversuche mit und geben Sie sie im Hinweis aus, z. B. Bitte nur 1 bis 9. (Fehlversuch 2)
Tipp
Die Bedingung beschreibt den falschen Fall, denn so lange soll wiederholt werden: zahl < 1 or zahl > 9. Vergessen Sie nicht, im Block erneut zu fragen – sonst ändert sich zahl nie.
Gerüst
Ersetzen Sie jedes ___ durch den passenden Ausdruck.
zahl = int(input("Zahl von 1 bis 9: "))
while ___:
print("Bitte nur 1 bis 9.")
zahl = ___
print(f"Danke, Sie haben {zahl} gewählt.")
Lösung
| Eingaben | So oft gefragt | Gewählte Zahl |
|---|
5 | 1 | 5 |
0, 12, 7 | 3 | 7 |
9 | 1 | 9 |
-3, 10, 1 | 3 | 1 |
zahl = int(input("Zahl von 1 bis 9: "))
while zahl < 1 or zahl > 9:
print("Bitte nur 1 bis 9.")
zahl = int(input("Zahl von 1 bis 9: "))
print(f"Danke, Sie haben {zahl} gewählt.")
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 12
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
Mit and statt or wäre die Bedingung nie wahr: Keine Zahl ist zugleich kleiner als 1 und größer als 9. Dann würde jede Eingabe akzeptiert.
Zusatz:
zahl = int(input("Zahl von 1 bis 9: "))
fehlversuche = 0
while zahl < 1 or zahl > 9:
fehlversuche = fehlversuche + 1
print(f"Bitte nur 1 bis 9. (Fehlversuch {fehlversuche})")
zahl = int(input("Zahl von 1 bis 9: "))
print(f"Danke, Sie haben {zahl} gewählt.")
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9. (Fehlversuch 1)
Zahl von 1 bis 9: 12
Bitte nur 1 bis 9. (Fehlversuch 2)
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
Aufgabe 1b · Zahlenraten ohne Grenze Pflicht, ca. 10 Min.
In Mini-Projekt 1 hatte das Zahlenraten genau drei Versuche. Jetzt darf so lange geraten werden, bis die Zahl stimmt. Zum Testen ist die geheime Zahl fest 42.
Ihre Aufgabe
- Tragen Sie für die geheime Zahl 42 ein, was nach jedem Tipp ausgegeben werden muss.
| Tipps nacheinander | Ausgaben (erwartet) |
|---|
50, 25, 42 | |
42 | |
1, 100, 41, 43, 42 | |
- Schreiben Sie
raten.py mit einer while-Schleife, die so lange nach Ihr Tipp: fragt, wie der Tipp nicht die geheime Zahl ist, und nach jedem falschen Tipp Zu klein. oder Zu groß. ausgibt. - Zählen Sie die Versuche mit und geben Sie am Ende genau so aus:
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 42
Richtig! Sie haben 2 Versuche gebraucht.
- Testen Sie mit allen drei Zeilen der Tabelle. Ersetzen Sie danach
42 durch random.randint(1, 100) und ergänzen Sie import random in der ersten Zeile.
Fertig sind Sie, wenn alle drei Tests stimmen und das Spiel danach mit einer Zufallszahl läuft.
Zusatz für Schnelle: Erlauben Sie höchstens 7 Versuche. Wer es nicht schafft, liest Leider verloren. Die Zahl war 42.
Tipp
Damit die Schleife beim ersten Mal überhaupt startet, braucht tipp vorher einen Wert, der sicher falsch ist, z. B. tipp = 0. Den Zähler erhöhen Sie in jeder Runde mit versuche = versuche + 1.
Gerüst
Ersetzen Sie jedes ___ durch den passenden Ausdruck.
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while ___:
tipp = int(input("Ihr Tipp: "))
versuche = ___
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
Lösung
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while tipp != geheim:
tipp = int(input("Ihr Tipp: "))
versuche = versuche + 1
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 25
Zu klein.
Ihr Tipp: 42
Richtig! Sie haben 3 Versuche gebraucht.
Die Meldung „Richtig!“ steht nach der Schleife: Dort kommt das Programm erst an, wenn tipp != geheim falsch geworden ist, also beim Treffer. Ein else für „Richtig!“ in der Schleife braucht es nicht.
Zusatz:
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while tipp != geheim and versuche < 7:
tipp = int(input("Ihr Tipp: "))
versuche = versuche + 1
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
if tipp == geheim:
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
else:
print(f"Leider verloren. Die Zahl war {geheim}.")
Ihr Tipp: 10
Zu klein.
Ihr Tipp: 20
Zu klein.
Ihr Tipp: 30
Zu klein.
Ihr Tipp: 40
Zu klein.
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 45
Zu groß.
Ihr Tipp: 43
Zu groß.
Leider verloren. Die Zahl war 42.
Weiter zu Übung 13: for und range →
Exercise 12 – The while loop
Goal of this exercise
You repeat lines with while as long as a condition is true and use it to check input.
How to work: work through the steps in order. Enter your tables and programs in the
reflection on session 4. Open the help only when you are stuck: first the tip, then the scaffold, finally the solution. Your solution may look different – what matters is that it gives the right output for every test input.
1. How the while loop is built
zahl = 3
while zahl > 0:
print(zahl)
zahl = zahl - 1
print("Los!")
3
2
1
Los!
- Like
if: condition, colon, indented block. - Before every round, Python checks the condition again. If it is false, execution continues after the block.
- Something must change in the block, here
zahl = zahl - 1 – otherwise the loop runs forever. Emergency stop in the terminal: Ctrl + C.
2. Tasks
Task 1a · Checking input Required, approx. 8 min
A game asks for a number from 1 to 9. Anyone who types something else should get a hint and be asked again until the number fits.
Your task
- Enter how often the program asks for a number for each input sequence and which number it takes in the end.
| Inputs in order | Times asked (expected) | Chosen number (expected) |
|---|
5 | | |
0, 12, 7 | | |
9 | | |
-3, 10, 1 | | |
- Write
auswahl.py: it asks with Zahl von 1 bis 9: and repeats the question with while as long as the number is less than 1 or greater than 9. - Print the hint for every wrong number and the chosen number at the end exactly like this:
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
- Test the program with all four rows from the table.
You are done when every output matches your table.
Extra: count the failed attempts and show them in the hint, e.g. Bitte nur 1 bis 9. (Fehlversuch 2)
Tip
The condition describes the wrong case, because that is when the question is repeated: zahl < 1 or zahl > 9. Do not forget to ask again inside the block – otherwise zahl never changes.
Scaffold
Replace every ___ with the right expression.
zahl = int(input("Zahl von 1 bis 9: "))
while ___:
print("Bitte nur 1 bis 9.")
zahl = ___
print(f"Danke, Sie haben {zahl} gewählt.")
Solution
| Inputs | Times asked | Chosen number |
|---|
5 | 1 | 5 |
0, 12, 7 | 3 | 7 |
9 | 1 | 9 |
-3, 10, 1 | 3 | 1 |
zahl = int(input("Zahl von 1 bis 9: "))
while zahl < 1 or zahl > 9:
print("Bitte nur 1 bis 9.")
zahl = int(input("Zahl von 1 bis 9: "))
print(f"Danke, Sie haben {zahl} gewählt.")
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 12
Bitte nur 1 bis 9.
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
With and instead of or the condition would never be true: no number is less than 1 and greater than 9 at the same time. Then every input would be accepted.
Extra:
zahl = int(input("Zahl von 1 bis 9: "))
fehlversuche = 0
while zahl < 1 or zahl > 9:
fehlversuche = fehlversuche + 1
print(f"Bitte nur 1 bis 9. (Fehlversuch {fehlversuche})")
zahl = int(input("Zahl von 1 bis 9: "))
print(f"Danke, Sie haben {zahl} gewählt.")
Zahl von 1 bis 9: 0
Bitte nur 1 bis 9. (Fehlversuch 1)
Zahl von 1 bis 9: 12
Bitte nur 1 bis 9. (Fehlversuch 2)
Zahl von 1 bis 9: 7
Danke, Sie haben 7 gewählt.
Task 1b · Number guessing without limit Required, approx. 10 min
In mini project 1, number guessing had exactly three guesses. Now the player may guess until the number is right. For testing, the secret number is fixed at 42.
Your task
- For the secret number 42, enter what must be printed after each guess.
| Guesses in order | Outputs (expected) |
|---|
50, 25, 42 | |
42 | |
1, 100, 41, 43, 42 | |
- Write
raten.py with a while loop that keeps asking Ihr Tipp: as long as the guess is not the secret number, and prints Zu klein. or Zu groß. after each wrong guess. - Count the guesses and print at the end exactly like this:
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 42
Richtig! Sie haben 2 Versuche gebraucht.
- Test with all three rows of the table. Then replace
42 with random.randint(1, 100) and add import random in the first line.
You are done when all three tests are right and the game then runs with a random number.
Extra for the faster ones: allow at most 7 guesses. Anyone who does not make it reads Leider verloren. Die Zahl war 42.
Tip
So that the loop starts at all the first time, tipp needs a value beforehand that is surely wrong, e.g. tipp = 0. Increase the counter in every round with versuche = versuche + 1.
Scaffold
Replace every ___ with the right expression.
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while ___:
tipp = int(input("Ihr Tipp: "))
versuche = ___
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
Solution
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while tipp != geheim:
tipp = int(input("Ihr Tipp: "))
versuche = versuche + 1
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 25
Zu klein.
Ihr Tipp: 42
Richtig! Sie haben 3 Versuche gebraucht.
The message “Richtig!” comes after the loop: the program only gets there once tipp != geheim has become false, i.e. on a hit. No else for “Richtig!” is needed inside the loop.
Extra:
geheim = 42 # zum Testen fest, später: random.randint(1, 100)
versuche = 0
tipp = 0
while tipp != geheim and versuche < 7:
tipp = int(input("Ihr Tipp: "))
versuche = versuche + 1
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
if tipp == geheim:
print(f"Richtig! Sie haben {versuche} Versuche gebraucht.")
else:
print(f"Leider verloren. Die Zahl war {geheim}.")
Ihr Tipp: 10
Zu klein.
Ihr Tipp: 20
Zu klein.
Ihr Tipp: 30
Zu klein.
Ihr Tipp: 40
Zu klein.
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 45
Zu groß.
Ihr Tipp: 43
Zu groß.
Leider verloren. Die Zahl war 42.
On to exercise 13: for and range →