Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung |
gf_informatik:programmieren_ii:problems [2022-12-10 11:01] – [Probleme 1...5] gra | gf_informatik:programmieren_ii:problems [2022-12-21 07:29] (aktuell) – [Probleme 1...5] gra |
---|
=== Probleme 1...5 === | === Probleme 1...5 === |
In jedem der folgenden Codes hat es jeweils einen Fehler bzw. ein Problem. | In jedem der folgenden Codes hat es jeweils einen Fehler bzw. ein Problem. |
- Finde das Problem. Du kannst denn Code auch kopieren und in TigerJython testen, was passiert. | - Finde das Problem. Du kannst den Code auch kopieren und in TigerJython testen, was passiert. |
- Beschreibe das Problem in eigenen Worten. | - Beschreibe das Problem in eigenen Worten. |
- Behebe das Problem und teste, ob der Code läuft. | - Behebe das Problem und teste, ob der Code läuft. |
</code> | </code> |
| |
<nodisp 2> | <nodisp 1> |
++++Lösung| | ++++Lösung| |
Das Problem liegt in der ersten Zeile und in der darauffolgenden if-Bedingung: ''input()'' ist eine Funktion, die einen Wert //zurückgibt// (Rückgabewert). Und zwar gibt sie denjenigen Wert zurück, den die Benutzer:in eingegeben hat. In der ersten Code-Zeile wird dieser Wert aber nirgends gespeichert – es wird blos die Funktion ''input()'' aufgerufen. Korrekt wäre also: | Das Problem liegt in der ersten Zeile und in der darauffolgenden if-Bedingung: ''input()'' ist eine Funktion, die einen Wert //zurückgibt// (Rückgabewert). Und zwar gibt sie denjenigen Wert zurück, den die Benutzer:in eingegeben hat. In der ersten Code-Zeile wird dieser Wert aber nirgends gespeichert – es wird blos die Funktion ''input()'' aufgerufen. Korrekt wäre also: |
print("Zahl ist negativ.") | print("Zahl ist negativ.") |
</code> | </code> |
\\ | |
| |
<nodisp 2> | <nodisp 1> |
++++Lösung| | ++++Lösung| |
Das Problem ensteht hier, wenn die Benutzer:in die Zahl 0 eingibt: Dann gibt das Programm nicht "Zahl ist 0" aus, sondern "Zahl ist positiv". Für die Zahl 0 ist sowohl die erste Bedingung ''eingabe <= 0'' als auch die zweite Bedingung ''eingabe == 0'' wahr. Wenn bei einer if-elif-Verzweigung eine Bedingung wahr ist, werden alle nachfolgenden Bedingungen übersprungen. Hier heisst das: Wenn eingabe <= 0 wahr ist, dann wird gar nicht mehr gefragt, ob auch ''eingabe == 0'' wahr ist. Das Problem lässt sich leicht beheben, die erste Bedingung muss für die Zahl 0 falsch sein: | Das Problem ensteht hier, wenn die Benutzer:in die Zahl 0 eingibt: Dann gibt das Programm nicht "Zahl ist 0" aus, sondern "Zahl ist positiv". Für die Zahl 0 ist sowohl die erste Bedingung ''eingabe <= 0'' als auch die zweite Bedingung ''eingabe == 0'' wahr. Wenn bei einer if-elif-Verzweigung eine Bedingung wahr ist, werden alle nachfolgenden Bedingungen übersprungen. Hier heisst das: Wenn eingabe <= 0 wahr ist, dann wird gar nicht mehr gefragt, ob auch ''eingabe == 0'' wahr ist. Das Problem lässt sich leicht beheben, die erste Bedingung muss für die Zahl 0 falsch sein: |
| |
\\ | \\ |
<code python> | <code python Problem_03.py> |
from gturtle import * | from gturtle import * |
Options.setPlaygroundSize(400, 400) | Options.setPlaygroundSize(400, 400) |
Michelangelo.right(90) | Michelangelo.right(90) |
else: | else: |
print("Gib entweder 'Figur' oder 'Kreis' ein") | print("Gib entweder 'Quadrat' oder 'Kreis' ein") |
</code> | </code> |
| |
<nodisp 2> | <nodisp 1> |
++++Lösung| | ++++Lösung| |
Das Problem ensteht hier, wenn die Benutzer:in "Kreis" eingibt: Dann zeichnet das Programm zwar einen Kreis, aber es gibt auch die Fehlermeldung ("Gib entweder 'Figur' oder 'Kreis' ein") aus. Das liegt daran, dass hier //mehrere if-Bedingungen// verwendet wurden – und nicht //eine if-elif-Verbindung//. Wenn du nun "Kreis" eingibst, ist die erste if-Bedingung zwar wahr, die zweite aber falsch: Also wird die Zeile unter ''else:'' ausgeführt. Die Lösung ist einfach: du machst aus dem zweiten ''if'' ein ''elif'', so hast du aus **zwei** aufeinandernfolgenden Verzweigungen **eine** mit drei Ästen gemacht: | Das Problem ensteht hier, wenn die Benutzer:in "Kreis" eingibt: Dann zeichnet das Programm zwar einen Kreis, aber es gibt auch die Fehlermeldung ("Gib entweder 'Figur' oder 'Kreis' ein") aus. Das liegt daran, dass hier //mehrere if-Bedingungen// verwendet wurden – und nicht //eine if-elif-Verbindung//. Wenn du nun "Kreis" eingibst, ist die erste if-Bedingung zwar wahr, die zweite aber falsch: Also wird die Zeile unter ''else:'' ausgeführt. Die Lösung ist einfach: du machst aus dem zweiten ''if'' ein ''elif'', so hast du aus **zwei** aufeinandernfolgenden Verzweigungen **eine** mit drei Ästen gemacht. Wie sehen die beide Varianten als Struktogramme aus? Zeichne es auf! |
<code python> | <code python> |
if figur == "Kreis": | if figur == "Kreis": |
| |
\\ | \\ |
| <code python Problem_04.py> |
| from gturtle import * |
| Options.setPlaygroundSize(400, 400) |
| Michelangelo = Turtle() |
| |
| figur = input("Welche Figur: Quadrat oder Kreis?") |
| |
| if figur == Kreis: |
| Michelangelo.rightArc(50,360) |
| elif figur == Quadrat: |
| repeat 4: |
| Michelangelo.forward(50) |
| Michelangelo.right(90) |
| else: |
| print("Fehler!") |
| </code> |
| |
| <nodisp 1> |
| ++++Lösung| |
| Dieser Code ergibt eine Fehlermeldung bei der if-Bedingung. Denn hier wird die Variable namens ''figur'' mit der bisher unbekannten und undefinierten Variable namens ''Kreis'' verglichen. Natürlich wollen wir das nicht: Wir wollen die Variable ''figur'' mit dem //Wert// <color #ff7f27>"Kreis"</color> vergleichen. Wie müssen also bloss Anführungs- und Schlusszeichen vor bzw. hinter ''Kreis'' setzen. Selbiges gilt für ''Quadrat''. |
| ++++ |
| </nodisp> |
| |
| \\ |
| <code python Problem_05.py> |
| # Wo liegt das Problem? |
| from gturtle import * |
| Options.setPlaygroundSize(400, 400) |
| Michelangelo = Turtle() |
| |
| figur = input("Welche Figur: Quadrat oder Kreis?") |
| Kreis = Michelangelo.rightArc(50,360) |
| |
| if figur == "Kreis": |
| Kreis |
| else: |
| print("Fehler!") |
| </code> |
| |
| <nodisp 1> |
| ++++Lösung| |
| Dieser Code gibt eine Fehlermeldung beim "Befehl" Kreis aus (gleich nach der if-Bedingungn). Klar: Was soll Python tun, wenn einfach nur eine Variable dasteht und sonst nichts? |
| Das Problem besteht aber schon weiter oben in dieser Zeile: |
| <code python> |
| Kreis = Michelangelo.rightArc(50,360) |
| </code> |
| Hier wird wohl versucht, eine Funktion, die einen Kreis zeichnet, in einer Variable zu speichern. Das ist nicht möglich. In Variablen kannst du nur //Werte// speichern – auch Werte, die von Funktionen zurückgegeben werden. Also: |
| <code python> |
| Kreis = Michelangelo.rightArc(50,360) # Sinnlos, weil die Funktion rightArc() keinen Wert zurückgibt. |
| figur = input("Gib eine Figur ein.") # Sinnvoll, weil die Funktion input() einen Wert zurückgibt: Das, was vom Benutzer eingegeben wurde. |
| </code> |
| ++++ |
| </nodisp> |
| |