Übungen

Aufgabe 1: einfache Funktionsdefinitionen erstellen

Ziel dieser Aufgabe ist es, Funktionen zur Bestimmung geometrischer Größen zu entwickeln.

Zunächst entwickelt man eine Funktionsdefinition, wie z.B.:

def aRechteck(laenge, breite):
    flaecheninhalt = laenge * breite
    return flaecheninhalt

Eine solche Funktionsdefinition muss anschließend getestet werden. Am einfachsten geht das, indem man Funktionsaufrufe im Ausführfenster eingibt und vom Python-Interpreter ausführen lässt, Z.B.:

>>> aRechteck(2, 5)
10
>>> aRechteck(7, 4)
28

(a) Entwickle analog eine Funktionsdefinition für eine der folgenden geometrischen Größen:

(b) Oft kann man bereits definierte Funktionen benutzen, wenn man weitere Funktionen entwickelt:

def aRechteck(laenge, breite):
    flaecheninhalt = laenge * breite
    return flaecheninhalt

def aQuadrat(seite):
    flaecheninhalt = aRechteck(seite, seite)
    return flaecheninhalt

Kannst du selbst ein entsprechendes Beispiel angeben?

Aufgabe 2: einfache Funktionsdefinitionen erstellen

Funktionen können in den unterschiedlichsten Situationen auftreten. Ziel dieser Aufgabe ist es, geeignete Funktionsdefinitionen zu entwickeln. Du musst dir dabei genau überlegen, welche Daten übergeben und welches berechnete Ergebnis zurückgegeben werden soll. Am besten, du erstellst erst einmal ein Black-Box-Diagramm zur Verdeutlichung der Datenverarbeitung. Entwickle anschließend eine Funktionsdefinition und teste sie mit geeigneten Funktionsaufrufen.

(a) Body-Mass-Index:

Der Body-Mass-Index (kurz: BMI) ist eine Zahl, mit der man abschätzen kann, ob man Unter-, Normal oder Übergewicht hat. Man berechnet diese Zahl nach der folgenden Formel:

          Gewicht
BMI = ---------------
       Größe * Größe

Dabei wird das Gewicht in kg und die Größe in m angegeben.

(b) optimaler Puls:

Der optimale Puls bei Ausdauersportarten hängt vom Alter ab. Er lässt sich mit der Formel P = 165 - 0.75*A bestimmen. Schreibe ein Programm, das folgenden Dialog ermöglicht:

Alter: 18
optimaler Puls:  151.5

(c) Anhalteweg:

In der Fahrschule lernt man folgende Faustformeln zur Berechnung von Anhaltewegen:

Reaktionsweg (in Metern) = (Geschwindigkeit (in km/h) geteilt durch 10) mal 3

Bremsweg (in Metern) = (Geschwindigkeit (in km/h) geteilt durch 10) mal (Geschwindigkeit (in km/h) geteilt durch 10)

Anhalteweg (in Metern) = Reaktionsweg plus Bremsweg

Aufgabe 3: komplexere Funktionsdefinitionen erstellen

(a) Gegeben ist die folgende Funktionsdefinition.

def summe(n):
    zaehler = 0
    zwischensumme = 0
    while zaehler < n:
        zaehler = zaehler + 1
        zwischensumme = zwischensumme + zaehler
    return zwischensumme

Was leistet diese Funktion? Versuche erst einmal, das Verhalten durch Analyse des Quelltextes herauszufinden. Führe anschließend interaktive Tests durch, indem du Funktionsaufrufe wie den folgenden ausführen lässt.

>>> summe(17)
153

Entwickle in Analogie eine Funktion, die bei Übergabe einer natürlichen Zahl n das Produkt 1*2*...*n berechnet und zurückgibt.

(b) Gegeben ist die folgende Funktionsdefinition.

def quadratzahl(n):
    i = 0
    while i*i < n:
        i = i + 1
    if i*i == n:
        ergebnis = True
    else:
        ergebnis = False
    return ergebnis

Was leistet diese Funktion? Versuche erst einmal, das Verhalten durch Analyse des Quelltextes herauszufinden. Führe anschließend interaktive Tests durch, indem du Funktionsaufrufe wie den folgenden ausführen lässt.

>>> quadratzahl(17)
...

Entwickle in Analogie eine Funktion, die bei Übergabe einer natürlichen Zahl n überprüft, ob es es sich bei dieser Zahl um eine Kubikzahl / eine Summe der Gestalt 1+2+... handelt.

(c) Hier weitere Beispiele für etwas kompliziertere Funktionen:

Aufgabe 4: Funktionen mit komplexeren Übergabe- und Rückgabedaten

(a) Betrachte die folgenden Funktionsdefinitionen:

def schaltjahr(jahr):
    if (jahr % 400 == 0) or ((jahr % 4 == 0) and not (jahr % 100 == 0)):
        return True
    else:
        return False

def anzahlTageImMonat(monat, jahr):
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        anzahl = 31
    elif monat in [4, 6, 9, 11]:
        anzahl = 30
    elif schaltjahr(jahr):
        anzahl = 29
    else:
        anzahl = 28
    return anzahl

def naechstesDatum(datum):
    (tag, monat, jahr) = datum
    if tag < anzahlTageImMonat(monat, jahr):
        tag = tag + 1
    elif monat < 12:
        tag = 1
        monat = monat + 1
    else:
        tag = 1
        monat = 1
        jahr = jahr + 1
    return (tag, monat, jahr)

Das Black-Box-Diagramm verdeutlicht das Verhalten der Funktion naechstesDatum.

Black-Box zur Funktion

Beachte, dass hier ein Tupel bestehend aus drei Zahlen übergeben wird und auch wieder als Ergebnis zurückgegeben wird. Beim Testen zeigt sich das so:

>>> naechstesDatum((28, 2, 2010))
(1, 3, 2010)

Führe selbst weitere Tests durch.

Die Funktion naechstesDatum könnte auch so modelliert werden.

Black-Box zur Funktion

Wie müsste die Funktionsdefinition abgeändert werden? Wie würden jetzt Funktionsaufrufe aussehen?

(b) Entwickle Funktionsdefinitionen, die die Entwicklung einer Mäusepopulation mit drei Altersgruppen beschreiben.

Eine Funktion naechstePopulation(population) soll die Populationswerte nach einem Simulationsschritt erzeugen.

Eine Funktion neuePopulation(population, schritte) soll die Populationswerte nach einer übergebenen Anzahl von Simulationsschritten erzeugen.

Aufgabe 5: Funktionen mit und ohne Rückgabedaten

Betrachte die beiden folgenden Funktionsdefinitionen.

def bruchAlsZeichenkette(bruch):
    (zaehler, nenner) = bruch
    zeichenkette = str(zaehler) + '/' + str(nenner)
    return zeichenkette

def printBruch(bruch):
    (zaehler, nenner) = bruch
    zeichenkette = str(zaehler) + '/' + str(nenner)
    print(zeichenkette)

(a) Teste sie durch Funktionsaufrufe wie die folgenden:

>>> bruchAlsZeichenkette((4, 5))
'4/5'
>>> printBruch((4, 5))
4/5
>>> print(bruchAlsZeichenkette((4, 5)))
4/5

(b) Worin unterscheiden sich die Funktionen. Verdeutliche den Unterschied auch anhand eines Blck-Box-Diagramms?

(c) Welche Vor- und Nachteile haben die beiden Funktionsversionen?

Aufgabe 6: Funktionen ohne Übergabedaten

Gegeben ist die folgende Funktionsdefinition.

from random import randint

def wuerfeln():
    augen = randint(1, 6)
    return augen

(a) Was leistet die Funktion wuerfeln?

(b) Teste diese Funktion mit geeigneten Funktionsaufrufen.

Aufgabe 7: vorgegebene Funktionen bei der Funktionsentwicklung nutzen

Gegeben sind Schnittstellenbeschreibungen von zwei Funktionen.

Schnittstellenbeschreibung zur Funktion anzahlTageZwischenDatum:

Black-Box zur Funktion

Die Funktion anzahlTageZwischenDatum(datum1, datum2) bestimmt für die übergebenen Werte für datum1 und datum2 die Anzahl der Tage zwischen diesen Daten. Die beiden Daten müssen dabei als Tupel übergeben werden.

Beispiel:

>>> anzahlTageZwischenDatum((26, 2, 2000), (26, 2, 2001))
366

Schnittstellenbeschreibung zur Funktion datumTageNachDatum:

Black-Box zur Funktion

Die Funktion datumTageNachDatum(datum1, anzahlTage) bestimmt für die übergebenen Werte für datum1 und anzahlTage das Datum, das sich ergibt, wenn man die übergebene Anzahl der Tage vom eingegebenen Datum aus weitergeht. Das Datum muss dabei als Tupel übergeben werden.

Beispiel:

datumTageNachDatum((26, 2, 2000), 40)
(6, 4, 2000)

Implementierungen der beiden Funktionen kannst du hier herunterladen oder dem Abschnitt Einstieg - Halb so alt entnehmen.

(a) Löse das folgende Problem mit Hilfe einer vorgegebenen Funktion:

Eingabe: Tag, Monat, Jahr eines beliebigen Datums

Ausgabe: Anzahl der Tage bis zum Weihnachten des betreffenden Jahres (bis zum nächsten Weihnachten)

(b) Löse das folgende Problem mit Hilfe einer vorgegebenen Funktion:

Eingabe: Jahr, Anzahl von Tagen

Ausgabe: Datum des Jahres nach der eingegenbenen Anzahl von Tagen

Aufgabe 8: Schnittstellen beschreiben, Funktionen als Bausteine verwenden

(a) Gegeben ist die Funktion ggt mit folgender Funktionsdefinition:

def ggt(x, y):
    while y > 0:
        h = x % y
        x = y
        y = h
    return x

Teste diese Funktion und erstelle eine Schnittstellenbeschreibung.

(b) Die Funktion addiereBrueche soll dazu dienen, Brüche zu addieren:

def addiereBrueche(bruch1, bruch2):
    (zaehler1, nenner1) = bruch1
    (zaehler2, nenner2) = bruch2
    nennerSumme = nenner1 * nenner2
    zaehlerSumme = zaehler1*nenner2 + zaehler2*nenner1
    bruchSumme = (zaehlerSumme, nennerSumme)
    return bruchSumme

Wenn man sie testet, erhält man ungekürzte Ergebnisse:

>>> addiereBrueche((1,4), (1,4))
(8, 16)

Benutze die Funktion ggt zur Verbesserung der Implementierung der Funktion addiereBrueche.

Fertige anschließend eine Schnittstellenbeschreibung für die Funktion addiereBrueche an. Diese soll so gestaltet werden, dass man die Funktion benutzen kann, ohne dass man die Details der Implementierung kennt.

(c) Entwickle und dokumentiere analog Funktionen zur Subtraktion, Multiplikation und Division von Brüchen.

Aufgabe 9: eine komplexere Aufgabe für Mathematiker

Flächeninhalten unter Funktionsgraphen werden mit Hilfe von Unter- und Obersummen angenähert.

Entwickle geeignete Funktionen zur Bestimmung von Unter- und Obersummen zur Funktion f mit f(x)=x2. Frei wählbar soll das Intervall und die Anzahl der Unterteilungen sein. Am besten, du benutzt mehrere Funktionen zur Lösung der Teilprobleme.

Aufgabe 10: Prozeduren entwickeln

(a) Was leistet die folgende Funktion ohne Rückgabedaten (Prozedur)? Versuche es erst einmal durch Analyse des Quelltextes herauszufinden.

def zahlen_ausgeben(anfang, ende):
    zahl = anfang
    while zahl <= ende:
        print(zahl)
        zahl = zahl + 1

Überprüf anschließend deine Vermutung mit interaktiven Tests wie dem folgenden:

>>> zahlen_ausgeben(4, 11)

Was wird ausgegeben, wenn beide aktuellen Parameter gleich sind? Was wird ausgegeben, wenn der zweite aktuelle Parameter kleiner als der erste ist?

(b) Modifiziere das Programm in Aufgabe 10 so, dass sämtliche Quadratzahlen in einem vorgegebenen Intervall ausgegeben werden.

Zusatz: Statt Quadratzahlen sollen die Primzahlen im vorgegebenen Intervall ausgegeben werden.

Aufgabe 11: Prozeduren entwickeln

Mit Hilfe einer Prozedur sollen Rechteckmuster der folgenden Gestalt erzeugt werden:

Muster 1:

********
********
********
********

Muster 2:

OOOO
OOOO
OOOO

Entwickle und teste eine geeignete Prozedur.

Zusatz: Es soll nur der Rand des Rechtecks mit Zeichen dargestellt werden. Du kannst dir auch selbst ein neues Muster ausdenken.

X

Fehler melden

X

Suche