Funktionen und Prozeduren
Eigene Befehle definieren, Parameter übergeben und Rückgabewerte nutzen.
Ausdrücke
a) Welche dieser Ausdrücke sind identisch, d.h. ergeben den gleichen Wert? Kreuzen Sie alle an, die übereinstimmen.
b) Welche dieser Ausdrücke sind identisch?
a) Die Ausdrücke Nr. 1 und 3 sind identisch (beide ergeben 7).
b) Die Ausdrücke Nr. 1 und 3 sind identisch (beide ergeben "Ja oder Nein").
James Bond
a) Definieren Sie anhand der Vorlage die Prozedur bondIntro, mit der man sich wie James Bond vorstellen kann.
pythondef bondIntro(firstName, lastName):
print(...)
firstName = input("Was ist Ihr Vorname?")
lastName = input("Was ist Ihr Nachname?")
print("My name is ")
bondIntro(firstName, lastName)
Beispielausgabe bei Vornamen James und Nachnamen Bond:
My name is
Bond. James Bond.
b) Wandeln Sie die Prozedur in eine Funktion um, die den Text mit return zurückgibt, sodass die Ausgabe auf einer Zeile landet:
My name is Bond. James Bond.
a)
pythondef bondIntro(firstName, lastName):
print(lastName + ". " + firstName + " " + lastName + ".")
firstName = input("Was ist Ihr Vorname?")
lastName = input("Was ist Ihr Nachname?")
print("My name is ")
bondIntro(firstName, lastName)
b)
pythondef bondIntro(firstName, lastName):
return lastName + ". " + firstName + " " + lastName + "."
firstName = input("Was ist Ihr Vorname?")
lastName = input("Was ist Ihr Nachname?")
print("My name is " + bondIntro(firstName, lastName))
Temperaturen umrechnen
Definieren Sie eine Funktion toFahrenheit, mit der man eine Temperatur von Celsius auf Fahrenheit umrechnen kann.
pythondef toFahrenheit(c):
# ... hier kommt Ihr Code
celsius = input("Was ist die Temperatur in Grad Celsius?")
print("Die Temperatur in F ist " + str(toFahrenheit(celsius)))
Die entsprechende Formel lautet:
$$F = C \cdot \frac{9}{5} + 32$$
Testen Sie Ihre Umwandlung:
| Grad Celsius | Grad Fahrenheit |
|---|---|
| 0 °C | °F |
| 5 °C | °F |
| 25 °C | °F |
| 100 °C | °F |
pythondef toFahrenheit(c):
return c * 9 / 5 + 32
celsius = input("Was ist die Temperatur in Grad Celsius?")
print("Die Temperatur in F ist " + str(toFahrenheit(celsius)))
Verschiedene Funktionen
Definieren Sie mit return folgende Funktionen und testen Sie sie im Hauptprogramm.
a) f(x): Gibt den y-Wert $\frac{1}{2}x^2 - 3x + 1$ zurück.
b) say_again(text, n): Gibt einen Text zurück, der n Mal text enthält. Z.B. "hellohello" bei say_again("hello", 2).
c) convert_from_chf(amount, currency): Wandelt den Betrag amount von Schweizer Franken in die Währung currency um. Zurzeit gilt Fr. 1 = 1.062 € = $1.186 = £0.896.
d) contains_7(a, b, c): Gibt True zurück, wenn mindestens eine der Variablen die Zahl 7 ist.
pythondef f(x):
return x**2 / 2 - 3 * x + 1
def say_again(text, n):
return text * n
def convert_from_chf(amount, currency):
if currency == "euro":
return amount * 1.062
elif currency == "dollar":
return amount * 1.186
elif currency == "pound":
return amount * 0.896
def contains_7(a, b, c):
if a == 7:
return True
elif b == 7:
return True
elif c == 7:
return True
else:
return False
print(f(0))
print(f(1))
print(say_again("ha", 3))
print(convert_from_chf(42, "euro"))
print(contains_7(5, 11, 7))
Kurvendiskussion mit GPanel
In dieser Aufgabe erstellen wir einen Funktionsgraphen für die quadratische Funktion
$$y = \frac{9}{10}x^2 - \frac{1}{2}x + 2$$
mit Hilfe von GPanel.
a) Importieren Sie mit from gpanel import * sämtliche Befehle aus dem GPanel-Paket und definieren Sie mit def einen Befehl f(x).
b) Öffnen Sie ein GPanel-Fenster mit makeGPanel, x-Werte von -6 bis 6 und y-Werte von -2 bis 32.
c) Zeichnen Sie mit setColor und drawGrid ein graues Raster (x: -5..5, y: 0..30).
d) Berechnen Sie mit f(x) den y-Wert an der Stelle -5 und verschieben Sie den Stift mit move(x, y).
e) Berechnen Sie die y-Werte an den x-Stellen -4.9, -4.8, …, 5 und verbinden Sie die Punkte mit blauen Linien (draw(x, y)).
pythonfrom gpanel import *
def f(x):
return 9 * x**2 / 10 - x / 2 + 2
makeGPanel(-6, 6, -2, 32)
setColor("gray")
drawGrid(-5, 5, 0, 30)
setColor("blue")
x = -5
move(x, f(x))
repeat 100:
x += 0.1
y = f(x)
draw(x, y)
Hypotenuse
Definieren Sie eine Funktion, mit der man die Hypotenuse c eines rechtwinkligen Dreiecks aus den Katheten a und b berechnen kann.
Tipp: Vergessen Sie nicht from math import sqrt.
pythondef hypotenuse(a,b):
# ... hier kommt Ihr Code
a = input("a=?")
b = input("b=?")
print("Die Hypotenuse ist " + str(hypotenuse(a, b)))
pythonfrom math import sqrt
def hypotenuse(a,b):
c = sqrt(a**2 + b**2)
return c
a = input("a=?")
b = input("b=?")
print("Die Hypotenuse ist " + str(hypotenuse(a, b)))
Minimum
Definieren Sie eine Funktion minimum(a,b), die zwei Zahlen akzeptiert und die kleinere zurückgibt.
pythondef minimum(a,b):
# ... hier kommt Ihr Code
print(minimum(10,20))
print(minimum(1,-1))
print(minimum(5,5))
Erwartete Ausgaben:
10
-1
5
pythondef minimum(a,b):
if a <= b:
return a
else:
return b
print(minimum(10,20))
print(minimum(1,-1))
print(minimum(5,5))
Minimum — Auswertungsreihenfolge
Diese Codezeile beinhaltet insgesamt 4 Befehlsaufrufe:
pythonprint(minimum(minimum(20,10),sqrt(121)))
1. Was ist das Ergebnis, wenn man diese Zeile ausführt?
2. Nummerieren Sie die 4 Befehlsaufrufe in der Reihenfolge, in der Python sie auswerten muss:
| Befehlsaufruf | Reihenfolge |
|---|---|
print | |
erstes minimum | |
zweites minimum | |
sqrt |
Berghütte
Aus dem Buch «Informatik für Schweizer Maturitätsschulen», Westermann Verlag.
Zu einer Berghütte gibt es zwei Strassen. Diese führen durch insgesamt fünf Tunnel. Jeder Tunnel hat eine maximale Höhe, mit der ein Lastwagen durchfahren darf.
Schreiben Sie ein Programm, das die Werte a, b, c, d und e entgegennimmt und ausgibt, wie hoch ein Lastwagen höchstens sein darf.
pythondef max(x, y):
if x > y:
return x
else:
return y
def min2(x, y):
if x < y:
return x
else:
return y
def min3(x, y, z):
return min2(min2(x, y), z)
a = input("a=?")
b = input("b=?")
c = input("c=?")
d = input("d=?")
e = input("e=?")
right_road_max_height = min2(a, b)
left_road_max_height = min3(c, d, e)
max_possible_height = max(right_road_max_height, left_road_max_height)
print("Der Lastwagen darf maximal " + str(max_possible_height) + " hoch sein.")
Bestehen oder nicht
Die folgende Prozedur erwartet als Argument eine Note zwischen 1 und 6:
pythondef passOrFail(grade):
if grade >= 4:
print("Passed!")
else:
print("Failed...")
passOrFail(4)
passOrFail(3.5)
passOrFail(4.5)
a) Ergänzen Sie:
- Der Körper des Befehls
passOrFailfängt bei Zeile an und hört bei Zeile auf. - Das Hauptprogramm fängt bei Zeile an und hört bei Zeile auf.
c) Wandeln Sie das Programm in eine Funktion um, die den entsprechenden Text (Passed! oder Failed...) als Rückgabewert zurückgibt. Lassen Sie das Hauptprogramm unverändert. Was sehen Sie, und wie erklären Sie sich das?
d) Ergänzen Sie das Hauptprogramm so, dass es die gleiche Ausgabe gibt wie in der ersten Teilaufgabe.
c) Dieses Programm produziert keine Ausgabe — das Hauptprogramm beachtet den Rückgabewert nicht.
pythondef passOrFail(grade):
if grade >= 4:
return "Passed!"
else:
return "Failed..."
passOrFail(4)
passOrFail(3.5)
passOrFail(4.5)
d) Wir müssen im Hauptprogramm den Rückgabewert jedes Aufrufs von passOrFail an print weitergeben:
pythondef passOrFail(grade):
if grade >= 4:
return "Passed!"
else:
return "Failed..."
print(passOrFail(4))
print(passOrFail(3.5))
print(passOrFail(4.5))
Schulnoten
Der folgende Befehl mit dem geheimnisvollen Namen calculate führt eine Berechnung aus, die Sie aus Ihrem Schulalltag kennen:
pythondef calculate(grade):
if grade >= 4:
print(grade - 4)
else:
print(2 * (grade - 4))
a) Erklären Sie in einem Satz, was dieser Befehl macht.
b) Bei calculate handelt es sich um eine:
| Prozedur | Funktion |
|---|---|
c) Eine Schülerin hat folgende Zeugnisnoten. Ergänzen Sie das Programm mit einem Hauptprogramm, das calculate für jede Note einmal ausführt.
| Deutsch | Mathe | Französisch | Informatik |
|---|---|---|---|
| 4.5 | 4.5 | 3.5 | 6.0 |
d) Was ist unbefriedigend? e) Wandeln Sie calculate in eine Funktion um, sodass die Schülerin nichts mehr selber ausrechnen muss.
pythondef calculate(grade):
if grade >= 4:
return grade - 4
else:
return 2 * (grade - 4)
total = calculate(4.5) + calculate(4.5) + calculate(3.5) + calculate(6.0)
print("Kompensationspunkte: " + str(total))
Goldener Schnitt
Die als goldener Schnitt benannte Zahl (ungefähr 0.6180339) war bereits in der Antike bekannt. Auch in der Natur kommt sie vor, z.B. in der Anordnung von Sonnenblumensamen.
Für dieses Bild werden wir mit gTurtle keine Striche, sondern Punkte produzieren (dot(d)).
- Definieren Sie
punkt(x,y): hebt den Stift ab, teleportiert mitsetPos(x,y), setzt den Stift wieder an und zeichnetdot(10). - Distanz: $d = 10\sqrt{s}$
- Winkel: $w = \dfrac{2s}{1+\sqrt{5}}$
- x-Koordinate: $x = d \cdot \cos(2\pi w)$
- y-Koordinate: $y = d \cdot \sin(2\pi w)$
- Schleife mit 500 Durchläufen, für jede Samennummer
seinen Punkt zeichnen.
pythonfrom gturtle import *
from math import *
def distanz(s):
return 10 * sqrt(s)
def winkel(s):
return s * 2 / (1 + sqrt(5))
def polarX(d,w):
return d * cos(2 * pi * w)
def polarY(d,w):
return d * sin(2 * pi * w)
def punkt(x,y):
penUp()
setPos(x,y)
penDown()
dot(10)
makeTurtle()
hideTurtle()
s = 1
repeat 500:
d = distanz(s)
w = winkel(s)
x = polarX(d,w)
y = polarY(d,w)
punkt(x,y)
s += 1