==== Programmieren 2 – Probleme ==== === Probleme 1...5 === In jedem der folgenden Codes hat es jeweils einen Fehler bzw. ein Problem. - Finde das Problem. Du kannst den Code auch kopieren und in TigerJython testen, was passiert. - Beschreibe das Problem in eigenen Worten. - Behebe das Problem und teste, ob der Code läuft. input("Gib eine Zahl ein.") if input >= 0: print("Die Zahl ist positiv.") else: print("Die Zahl ist negativ.") ++++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: zahl = input("Gib eine Zahl ein.") In der folgenden if-Verzweigung muss die Bedingung dann so aussehen: if zahl >= 0: Alternativ könntest du auch die vollständige ''input()''-Funktion in der Bedingung der if-Verzweigung unterbringen: if input("Gib eine Zahl ein.") >= 0: Der Nachteil an dieser Methode: Der von der Benutzer:in eingegbene Wert ist nur hier in der Bedingung verfügbar: Weil er nicht in einer Variable gespeichert wird, könntest du weiter unten im Code nicht mehr auf den Wert zugreifen. Diese Methode eignet sich also nur dann, wenn du den von der Benutzer:in eingegbenen Wert nur ein einziges Mal vergleichen möchtest. ++++ \\ eingabe = input("Gib eine Zahl ein.") if eingabe >= 0: print("Zahl ist positiv.") elif eingabe == 0: print("Zahl ist 0") else: print("Zahl ist negativ.") ++++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: ... if eingabe > 0: print("Zahl ist positiv.") ... ++++ \\ from gturtle import * Options.setPlaygroundSize(400, 400) Michelangelo = Turtle() figur = input("Welche Figur: Quadrat oder Kreis?") if figur == "Kreis": Michelangelo.rightArc(50,360) if figur == "Quadrat": repeat 4: Michelangelo.forward(50) Michelangelo.right(90) else: print("Gib entweder 'Quadrat' oder 'Kreis' ein") ++++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. Wie sehen die beide Varianten als Struktogramme aus? Zeichne es auf! if figur == "Kreis": Michelangelo.rightArc(50,360) elif figur == "Quadrat": repeat 4: Michelangelo.forward(50) Michelangelo.right(90) else: print("Gib entweder 'Figur' oder 'Kreis' ein") ++++ \\ 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!") ++++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// "Kreis" vergleichen. Wie müssen also bloss Anführungs- und Schlusszeichen vor bzw. hinter ''Kreis'' setzen. Selbiges gilt für ''Quadrat''. ++++ \\ # 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!") ++++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: Kreis = Michelangelo.rightArc(50,360) 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: 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. ++++