Lösung des Problems
Eine Lösung zum Problem "Preis der Poolfliesen" mit Hilfsfunktionen
Hier zur Kontrolle eine Zusammenstellung von Funktionen zur Lösung des Problems "Preis der Poolfliesen".
anzahlFliesenRechteck laengeRechteck breiteRechteck seiteFliese =
(ceiling (laengeRechteck / seiteFliese)) * (ceiling (breiteRechteck / seiteFliese))
anzahlFliesenPool laenge breite hoehe seiteFliese =
(1 * anzahlFliesenRechteck laenge breite seiteFliese) +
(2 * anzahlFliesenRechteck laenge hoehe seiteFliese) +
(2 * anzahlFliesenRechteck breite hoehe seiteFliese)
gesamtanzahlFliesen laenge breite hoehe seiteFliese =
ceiling ((toFloat anzahlFliesenPool laenge breite hoehe seiteFliese) * 1.03)
preisPoolFliesen laenge breite hoehe seiteFliese preisFliese =
(toFloat (gesamtanzahlFliesen laenge breite hoehe seiteFliese)) * preisFliese
Aufgabe 1
Die Lösung zum Problen "Preis der Poolfliesen" besteht hier aus vielen Funktionsdefinitionen. Erläutere wie sie voneinander abhängen.
Eine Lösung zum Problem "Preis der Poolfliesen" mit nur einer Funktion
Das Problem "Preis der Poolfliesen" hätte man auch mit einer einzigen Funktion lösen können.
preisPoolFliesen laenge breite hoehe seiteFliese preisFliese =
(toFloat (ceiling ((toFloat
((1 * (ceiling (laenge / seiteFliese)) * (ceiling (breite / seiteFliese))) +
(2 * (ceiling (laenge / seiteFliese)) * (ceiling (hoehe / seiteFliese))) +
(2 * (ceiling (breite / seiteFliese)) * (ceiling (hoehe / seiteFliese))))) * 1.03))) * preisFliese
Aufgabe 2
(a) Teste diese Funktionsdefinition mit Funktionsaufrufen in der REPL.
(b) Vergleiche diese Funktionsdefinition mit der oben gezeigten Variante, die mehrere Hilfsfunktionen benutzt. Erläutere die Vorteile von Hilfsfunktionen.
Eine Lösung zum Problem "Preis der Poolfliesen" mit lokalen Definitionen
Das Problem "Preis der Poolfliesen" hätte man auch so lösen können.
preisPoolFliesen laenge breite hoehe seiteFliese preisFliese =
let
anzahlFliesenBoden = (1 * (ceiling (laenge / seiteFliese)) * (ceiling (breite / seiteFliese)))
anzahlFliesenSeiteHoehe = (2 * (ceiling (laenge / seiteFliese)) * (ceiling (hoehe / seiteFliese)))
anzahlFliesenBreiteHoehe = (2 * (ceiling (breite / seiteFliese)) * (ceiling (hoehe / seiteFliese)))
minimalAnzahlFliesen = anzahlFliesenBoden + anzahlFliesenSeiteHoehe + anzahlFliesenBreiteHoehe
gesamtAnzahlFliesen = ceiling ((toFloat minimalAnzahlFliesen) * 1.03)
in
(toFloat gesamtAnzahlFliesen) * preisFliese
Aufgabe 3
(a) Teste auch diese Funktionsdefinition mit Funktionsaufrufen in der REPL.
(b) Welche Vorteile hat diese Variante?
(c) Begründe, warum es günstig ist, wenn man zumindest die Berechnung der Fliesenanzahl für Rechtecke als eigenständige Funktion auslagert?
Aufgabe 4
Man könnte die Funktion anzahlFliesenRechteck
auch als lokale Funktion innerhalb von preisPoolFliesen
definieren. Teste auch diese Version. Beurteile auch diese Variante.
preisPoolFliesen laenge breite hoehe seiteFliese preisFliese =
let
anzahlFliesenRechteck laengeRechteck breiteRechteck laengeFliese =
(ceiling (laengeRechteck / laengeFliese)) * (ceiling (breiteRechteck / laengeFliese))
anzahlFliesenBoden = anzahlFliesenRechteck laenge breite seiteFliese
anzahlFliesenSeiteHoehe = 2 * (anzahlFliesenRechteck laenge hoehe seiteFliese)
anzahlFliesenBreiteHoehe = 2 * (anzahlFliesenRechteck breite hoehe seiteFliese)
minimalAnzahlFliesen = anzahlFliesenBoden + anzahlFliesenSeiteHoehe + anzahlFliesenBreiteHoehe
gesamtAnzahlFliesen = ceiling ((toFloat minimalAnzahlFliesen) * 1.03)
in
(toFloat gesamtAnzahlFliesen) * preisFliese