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:funktionen:problems [2023-02-22 10:10] – [Problem 1] gragf_informatik:funktionen:problems [2023-11-16 14:27] (aktuell) – [Problem 5] hof
Zeile 2: Zeile 2:
 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 und beschreibe es in eigenen Worten+Gehe für jedes Problem nach dem folgenden Muster vor: 
-Behebe das Problem und testeob der Code läuft.+  - *Predict*: Code lesen und voraussagen, was passiert
 +  - *Run*: Führe den Code in WebtigerJython aus und vergleich das Resultat mit deiner Voraussage. 
 +  - *Inspect*: Untersucheweshalb der Code nicht funktioniert - schreibe einen `# Kommentar` hinter die fehlerhafte Zeile. 
 +  - *Modify*: Behebe den Fehler im Code. 
  
 ==== Problem 1 ==== ==== Problem 1 ====
Zeile 17: Zeile 21:
     print("       ...bye!")     print("       ...bye!")
          
-if input("Yes or no? (y/n)") == 'y':+if input("Hi or bye? (h/b)") == 'h':
     say_hello     say_hello
 else: else:
Zeile 24: Zeile 28:
  
 ++++Lösung| ++++Lösung|
-In der If-Verzweigung unten soll entweder die Funktion //say\_hello// oder die Funktion //say\_goodbye// aufgerufen werden. Ein Aufruf einer Funktion muss aber immer Klammern (öffnende und schliessend) beinhalten, auch wenn nichts in den Klammern steht. ''say\_hello'' wird nicht als Aufruf einer Funktion erkannt, ''say\_hello()'' schon. +In der If-Verzweigung unten soll entweder die Funktion //say\_hello// oder die Funktion //say\_goodbye// aufgerufen werden. Ein Aufruf einer Funktion muss aber immer Klammern (öffnend und schliessend) beinhalten, auch wenn nichts in den Klammern steht. ''say\_hello'' wird nicht als Aufruf einer Funktion erkannt, ''say\_hello()'' schon. 
 ++++ ++++
 \\ \\
Zeile 44: Zeile 48:
 Wenn du den Code ausführst, siehst du, dass nichts passiert. Die Funktion //drei\_wuerfel()// gibt drei Werte zurück (die durch dreimaligen Aufruf der Funktion wuerfel() zustande kommen). Aber unten wird bloss die Funktion aufgerufen und mit dem Rückgabewert wird nichts gemacht. Sinnvollerweise werden Funktionen, die etwas zurückgeben, nur verwendet, wenn mit dem zurückgegebenen Wert etwas gemacht wird, zum Beispiel so: Wenn du den Code ausführst, siehst du, dass nichts passiert. Die Funktion //drei\_wuerfel()// gibt drei Werte zurück (die durch dreimaligen Aufruf der Funktion wuerfel() zustande kommen). Aber unten wird bloss die Funktion aufgerufen und mit dem Rückgabewert wird nichts gemacht. Sinnvollerweise werden Funktionen, die etwas zurückgeben, nur verwendet, wenn mit dem zurückgegebenen Wert etwas gemacht wird, zum Beispiel so:
 ''print(drei\_wuerfel())'' ''print(drei\_wuerfel())''
 +++++
 +\\
 +
 +==== Problem 3 ====
 +Was ist das Problem mit folgendem Code?
 +<code python>
 +import random
 +
 +def wuerfel():
 +    return random.randint(1,6)
 +
 +def drei_wuerfel(zahl):
 +    return wuerfel()
 +    return wuerfel()
 +    return wuerfel()
 +
 +print(drei_wuerfel())
 +</code>
 +
 +++++Lösung|
 +Die Funktion //drei\_wuerfel()// hat drei ''return''-Anweisungen. Der Code ergibt eine Fehlermeldung, da die zweite (und dirtte) ''return''-Anweisung nie erreicht werden kann: Mit ''return'' sagst du nicht nur, dass du den darauffolgenden Wert oder Ausdruck //zurückgeben// (engl. to return sth.) willst, sondern auch, dass du zum Hauptprogramm **zurückkehren** (engl. to return) willst.
 +++++
 +
 +\\
 +==== Problem 4 ====
 +Welche beiden Zahlen gibt folgender Code aus?
 +<code python>
 +import math
 +a = 1
 +b = 2
 +
 +def summe_quadrate1(a,b):
 +    return a**2 + b**2
 +
 +def summe_quadrate2(x,y):
 +    return a**2 + b**2
 +      
 +print(summe_quadrate1(4,3))
 +print(summe_quadrate2(4,3))
 +</code>
 +
 +++++Lösung|
 +Der Code gibt erst 25, dann 5 aus. Wo liegt nun das Problem? Wenn du nur die letzte Zeile anschaust, würdest du erwarten, dass diese Zeile die Zahl 25 ausgibt (4 hoch 2 plus 3 hoch 2). Aber sie gibt 5 aus. Die Definition der Funktion //summe\_quadrate2// hat die Parameter x und y, rechnet aber mit Variablen namens a und b. Normalerweise würde hier eine Fehlermeldung entstehen – aber das Problem ist dies: Die Variablen a und b sind ganz oben schon definiert. Also verwendet //summe\_quadrate2// einfach diese Variablen, x und y bleiben ungenutzt. Es gilt Folgendes:
 +  * Variablen, die //ausserhalb// der Definition einer Funktion definiert werden, sind //globale Variablen//. Sie sind global, also überall bekannt – auch //in// der Definition der Funktion. 
 +  * Falls in der Definition der Funktion eine Variable definiert wird, die gleich heisst wie die globale Variable, handelt es sich dabei um zwei verschiedene Variablen!
 +
 +**Merke:** Definiere Variablen, die du innerhalb einer Funktion verwendest, immer innerhalb der Funktion, nicht ausserhalb. 
 +
 +++++
 +
 +\\
 +==== Problem 5 ====
 +Die Aufgabenstellung geht so: //Schreibe eine Funktion, die eine zufällige Zahl zwischen 1 und 10 zurückgibt.//
 +
 +Wo liegt das Problem in folgendem Code mit Blick auf die Aufgabenstellung?
 +<code python>
 +import random
 +
 +def zufallszahl():
 +    print random.randint(1,10)
 +      
 +print(zufallszahl())
 +</code>
 +
 +++++Lösung|
 +Die Funktion `zufallszahl()` gibt keinen Wert //zurück//. Sie gibt bloss einen Wert //aus//. Damit die Funktion einen Wert zurückgibt, müsste ''print'' durch ''return'' ersetzt werden. 
 +
 +**Merke:**
 +  * Wenn verlangt ist, dass eine Funktion etwas //zurückgeben// oder //berechnen// soll, muss die Funktion eine ''return''-Anweisung enthalten.
 +  * Wenn verlangt ist, dass eine Funktion etwas //ausgeben// soll, muss die Funktion eine ''print''-Anweisung enthalten.
 ++++ ++++
  • gf_informatik/funktionen/problems.1677060601.txt.gz
  • Zuletzt geändert: 2023-02-22 10:10
  • von gra