Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:programmieren_ii:problems [2022-12-10 10:19] – angelegt gragf_informatik:programmieren_ii:problems [2022-12-21 07:29] (aktuell) – [Probleme 1...5] gra
Zeile 1: Zeile 1:
 ==== Programmieren 2 – Probleme ==== ==== Programmieren 2 – Probleme ====
 === Probleme 1...5 === === 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.
 +
 +<code python Problem_01.py>
 +input("Gib eine Zahl ein.")
 +if input >= 0:
 +    print("Die Zahl ist positiv.")
 +else:
 +    print("Die Zahl ist negativ.")
 +</code>
 +
 +<nodisp 1>
 +++++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:
 +<code python>
 +zahl = input("Gib eine Zahl ein.")
 +</code>
 +In der folgenden if-Verzweigung muss die Bedingung dann so aussehen:
 +<code python>
 +if zahl >= 0:
 +</code>
 +Alternativ könntest du auch die vollständige ''input()''-Funktion in der Bedingung der if-Verzweigung unterbringen:
 +<code python>
 +if input("Gib eine Zahl ein.") >= 0:
 +</code>
 +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.   
 +++++
 +</nodisp>
 +
 +
 +\\
 +<code python Problem_02.py>
 +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.")
 +</code>
 +
 +<nodisp 1>
 +++++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:
 +<code python Problem_02.py>
 +...
 +if eingabe > 0:
 +    print("Zahl ist positiv.")
 +...
 +</code>
 +++++
 +</nodisp>
 +
 +\\
 +<code python Problem_03.py>
 +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")
 +</code>
 +
 +<nodisp 1>
 +++++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!
 +<code python>
 +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")
 +</code>
 +++++
 +</nodisp>
 +
 +\\
 +<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>
  
  • gf_informatik/programmieren_ii/problems.1670667544.txt.gz
  • Zuletzt geändert: 2022-12-10 10:19
  • von gra