Kapitel 02

Funktionen und Prozeduren

Eigene Befehle definieren, Parameter übergeben und Rückgabewerte nutzen.

Aufgabe 1

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?

Musterlösung

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").

Aufgabe 2

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.
Musterlösung

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))
Aufgabe 3

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 CelsiusGrad Fahrenheit
0 °C °F
5 °C °F
25 °C °F
100 °C °F
Musterlösung
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)))
Aufgabe 4

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.

Musterlösung
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))
Challenge

Kurvendiskussion mit GPanel

Parabel

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)).

Musterlösung
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)
Aufgabe 6

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)))
Pythagoras
Musterlösung
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)))
Aufgabe 7

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
Musterlösung
pythondef minimum(a,b):
    if a <= b:
        return a
    else:
        return b

print(minimum(10,20))
print(minimum(1,-1))
print(minimum(5,5))
Aufgabe 8

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:

BefehlsaufrufReihenfolge
print
erstes minimum
zweites minimum
sqrt
Challenge

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.

Berghütte
Musterlösung
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.")
Aufgabe 10

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 passOrFail fä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.

Musterlösung

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))
Aufgabe 11

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:

ProzedurFunktion

c) Eine Schülerin hat folgende Zeugnisnoten. Ergänzen Sie das Programm mit einem Hauptprogramm, das calculate für jede Note einmal ausführt.

DeutschMatheFranzösischInformatik
4.54.53.56.0

d) Was ist unbefriedigend? e) Wandeln Sie calculate in eine Funktion um, sodass die Schülerin nichts mehr selber ausrechnen muss.

Musterlösung
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))
Challenge

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.

Sonnenblume Muster

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 mit setPos(x,y), setzt den Stift wieder an und zeichnet dot(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 s einen Punkt zeichnen.
Musterlösung
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