Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

Schachtelung von Funktionen

Ein Dia scannen und drucken

Früher - vor der Zeit der digitalen Fotografie - wurden Fotos oft als Dias entwickelt und aufbewahrt.

Dia[1]

Viele Menschen haben noch Diasammlungen zu Hause mit interessanten Fotos von früher, aber keinen Diaprojektor mehr, um sie anzuzeigen. In solch einer Situation kann man das Dia einscannen und anschließend (z.B. als Poster`) ausdrucken. Wir entwickeln für solch eine Situation geeignete Berechnungsprogramme.

Folgendes Problem soll mit Hilfe von Funktionen bearbeitet werden: Ein Dia (36mm x 24mm) wird mit 4000 PPI eingescannt und anschließend als Poster mit 160 PPI gedruckt. Wie groß wird das Poster?

Funktionen für Teilberechnungen

Die Funktionen für die Teilberechnungen wurden bereits in den vorangegangenen Abschnitten entwickelt.

Die Funktion druckLaenge berechnet aus der Anzahl der Pixel und der Pixeldichte (in PPI) die erwartete Laenge der Bildseite (in cm, auf eine Nachkommastelle gerundet) beim Ausdrucken.

<<Black-Box-Diagramm><Funktionsname>druckLaenge</Funktionsname><Übergaben><Übergabe><Wert>5184</Wert><Variable>anzahlPixel</Variable><Typ></Typ></Übergabe><Übergabe><Wert>600</Wert><Variable>dichtePixel</Variable><Typ></Typ></Übergabe></Übergaben><Rückgabe><Typ></Typ><Wert>21.94..</Wert></Rückgabe></Black-Box-Diagramm>

Die Funktion pixelAnzahl berechnet aus der Länge der Bildseite (in cm) und der Pixeldichte (in PPI) die (gerundete) Anzahl der Pixel beim Scannen.

<Black-Box-Diagramm><Funktionsname>pixelAnzahl</Funktionsname><Übergaben><Übergabe><Wert>12.5</Wert><Variable>laengeSeite</Variable><Typ></Typ></Übergabe><Übergabe><Wert>300</Wert><Variable>pixelDichte</Variable><Typ></Typ></Übergabe></Übergaben><Rückgabe><Typ></Typ><Wert>1476</Wert></Rückgabe></Black-Box-Diagramm>

Hier eine Implementierung dieser beiden Funktionen.

def inchToCm(laengeInch):
    return laengeInch * 2.54

def cmToInch(laengeCM):
    return laengeCM / 2.54

def druckLaenge(anzahlPixel, pixelDichte):
    return round(inchToCm(anzahlPixel / pixelDichte), 1)

def pixelAnzahl(laengeSeite, pixelDichte):
    return round(cmToInch(laengeSeite) * pixelDichte)

Wir benutzen diese beiden Funktionen, um die Berchnungen für das Diaposter durchzuführen.

>>> pixelAnzahl(3.6, 4000)
5669
>>> druckLaenge(5669, 160)
90.0
>>> ...

Aufgabe 1

Führe die Berechnungen selbst durch. Wie groß wird das Poster?

Schachtelung von Funktionen

Die oben gezeigten Berechnungen lassen sich auch in einem Schritt durchführen:

>>> druckLaenge(pixelAnzahl(3.6, 4000), 160)
90.0
>>> ...

Hier liefert der innere Funktionsaufruf pixelAnzahl(3.6, 4000) ein Ergebnis, das direkt an die äußere Funktion druckLaenge zur Verarbeitung weitergegeben wird.

Diese Schachtelung von Funktionen lässt sich auch in der Funktionsdefinition umsetzen:

def inchToCm(laengeInch):
    return laengeInch * 2.54

def cmToInch(laengeCM):
    return laengeCM / 2.54

def druckLaenge(anzahlPixel, pixelDichte):
    return round(inchToCm(anzahlPixel / pixelDichte), 1)

def pixelAnzahl(laengeSeite, pixelDichte):
    return round(cmToInch(laengeSeite) * pixelDichte)

def scanDruckBildLaenge(laengeSeite, pixelDichteScan, pixelDichteDruck):
    return druckLaenge(pixelAnzahl(laengeSeite, pixelDichteScan), pixelDichteDruck)

Aufgabe 2

(a) Erläutere den Aufbau der Funktion scanDruckBildLaenge.

(b) Benutze die Funktion scanDruckBildLaenge zur Bestimmung der Postergröße bei den oben angegebenen Daten.

Aufgabe 3

Bearbeite den Abschnitt Fachkonzept - teile und herrsche durch und übetrage die Argumentation auf das vorliegende Beispiel.

Quellen

X

Fehler melden

X

Suche