Schachtelung von Funktionen
Ein Dia scannen und drucken
Früher - vor der Zeit der digitalen Fotografie - wurden Fotos oft als Dias entwickelt und aufbewahrt.
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.
Die Funktion pixelAnzahl
berechnet aus der Länge der Bildseite (in cm) und der Pixeldichte (in PPI)
die (gerundete) Anzahl der Pixel beim Scannen.
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
- [1]: Dia - Urheber: Hutschi - Lizenz: Creative Commons BY-SA 3.0