Die Listenfunktion map und anonyme Funktionen
Verändern von Elementen in einer Liste
Zur Analyse der Tagesverlaufstemperatur wurde in San-Francisco am Dienstag, den 15.08.2024, stündlich die Temperatur erhoben. Es ergaben sich die folgenden 24 Temperaturwerte in Fahrenheit:
(define temp-sf-fahrenheit
(list 60 59 58 58 59 59 60 62 63 65 66 66 67 70 69 71 70 68 66 63 63 63 62 62))
Damit diese Daten international verständlich sind und sich leichter mit anderen Klimadaten vergleichen lassen, sollen sie nun in das metrische System (Celsius) umgerechnet werden.
Aufgabe 1: Fahrenheit zu Celsius
(a) Schreibe eine Funktion f-zu-c
, die
einen Temperaturwert von Fahrenheit zu Celsius umrechnet.
Umrechnung: $^{\circ}C = \frac{^{\circ}F\ -\ 32}{1,8}$
(b) Erstelle mithilfe deiner Funktion f-zu-c
eine Liste, die die
ersten vier Temperaturwerte von temp-sanfrancisco-fahrenheit
in Celsius enthält.
Aufgabe 2: Funktionen auf alle Listenelemente anwenden
Wie du in Aufgabe 1 gemerkt hast, ist die manuelle Anpassung jedes einzelnen Elements und das anschließende erneute Zusammenfügen zu einer Liste umständlich und zeitraubend. Als alternative Vorgehensweise finden sich im Internet unter anderem die folgenden Beispiele:
> (map ceiling (list 1.3 2.1 -3.1 -5.7))
> (map natural? (list 42 17 24 4.1))
> (map string-length (list "Informatik" "Racket" "Funktion"))
(a) Mach dich mit der Funktion map
vertraut, indem du die
Beispiele in der REPL ausführst und ggf. eigene Ausdrücke entwirfst.
(b) Beschreibe, welchen Zweck die Funktion map
erfüllt.
(c) Nutze die Funktion map
, um eine Liste zu erzeugen,
die jeden Temperaturwert von temp-sanfrancisco-fahrenheit
in Celsius enthält.
(d) Erstelle eine Liste, in der alle Temperaturwerte in Celsius angezeigt werden und auf ganze Zahlwerte gerundet sind.
(e) Die Funktion map
bekommt zwei Operanden als Übergabedaten übergeben.
Welche Eigenschaften müssen die beiden Operanden erfüllen, um einen korrekten
map
-Ausdruck zu erzeugen?
(Tipp: Achte auf die Datentypen.)
Aufgabe 3: Neue Funktionen innerhalb von map
Angenommen, wir möchten die Werte einer Zahlenliste (list 0 1 2 3)
um den Wert 1 erhöhen.
Dann bietet der folgende Code eine Umsetzung dieser Funktionalität:
;Erhöht übergebenen Wert um 1
(: add1 (real -> real))
(define add1
(lambda (x)
(+ x 1)))
(map add1 (list 0 1 2 3))
(a) Schaue dir den obigen Code an und stelle sicher, dass du verstehst, wie dieser funktioniert. Führe den Code anschließend in Racket aus.
Um nicht für alle Operationen auf einer Liste eine neue Funktion definieren zu müssen, bietet uns
Racket eine weitere Möglichkeit, geeignete map
-Ausdrücke zu entwerfen. So lassen
sich Zahlen in einer Liste beispielsweise auch wie folgt erhöhen:
(map (lambda (x) (+ x 1)) (list 0 1 2 3))
(b) Führe den Ausdruck in der REPL aus und vergleiche das Ergebnis mit dem Ergebnis aus Aufgabenteil (a).
(c) Vergleiche den ersten Operanden des map
-Ausdrucks mit der definierten Funktion
aus Aufgabenteil (a). Wo findest du Gemeinsamkeiten und wo Unterschiede?
(d) Verändere den obigen Ausdruck so, dass dieser die Zahlen erst um zwei erhöht und anschließend verdreifacht.
(e) Schreibe einen map
-Ausdruck, der die Celsius-Liste aus Aufgabe 2 in Kelvin umrechnet.
Integriere dabei die Funktionslogik in den map
-Ausdruck.
Umrechnung: $K = {^{\circ}C} + 273,15$