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 11:01] – [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 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.
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 43: Zeile 43:
     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:
Zeile 58: Zeile 57:
  
 \\ \\
-<code python>+<code python Problem_03.py>
 from gturtle import * from gturtle import *
 Options.setPlaygroundSize(400, 400) Options.setPlaygroundSize(400, 400)
Zeile 72: Zeile 71:
         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":
Zeile 92: Zeile 91:
  
 \\ \\
 +<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.1670670074.txt.gz
  • Zuletzt geändert: 2022-12-10 11:01
  • von gra