Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:programmieren_ii:problems [2022-12-10 10:21] – [Probleme 1...5] gragf_informatik:programmieren_ii:problems [2022-12-21 07:29] (aktuell) – [Probleme 1...5] gra
Zeile 2: Zeile 2:
 === 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 in eigenen Worten, was das Problem ist.  +  - 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 python Problem_01.py> <code python Problem_01.py>
Zeile 14: Zeile 14:
 </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:
Zeile 24: Zeile 24:
 if zahl >= 0: if zahl >= 0:
 </code> </code>
-Alternativ könntest du auch die vollständige input()-Funktion in der Bedingung der if-Verzweigung unterbringen:+Alternativ könntest du auch die vollständige ''input()''-Funktion in der Bedingung der if-Verzweigung unterbringen:
 <code python> <code python>
 if input("Gib eine Zahl ein.") >= 0: if input("Gib eine Zahl ein.") >= 0:
 </code> </code>
-Das Problem an dieser Methode: Der von der Benutzer:in eingegbene Wert ist nur hier 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 eingegbene Wert nur ein einziges mal vergleichen möchtest.   +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> </nodisp>
Zeile 43: Zeile 43:
     print("Zahl ist negativ.")     print("Zahl ist negativ.")
 </code> </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.1670667687.txt.gz
  • Zuletzt geändert: 2022-12-10 10:21
  • von gra