| 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> |
| |