Strukturierung: Die Listenfunktionen filter und fold
Die Listenfunktion filter
Möchte man aus einer Liste nur die Elemente selektieren, die eine bestimmte Bedingung erfüllen, nutzen wir die Funktion
filter.
#t zurückgibt, werden zu einer neuen Liste zusammengefügt und zurückgegeben.
filter-Ausdrucks in Racket besteht aus:
-
Dem Operator
filter - Einer Funktion als ersten Operanden
- Einer Liste als zweiten Operanden.
(filter natural? (list 42 #t 3.4 17 "keinNatural")) (filter (lambda (x) (<= 18 x)) (list 16 17 18 14 18 17 19))Bei Ausführung des Ausdrucks wird die übergebene Funktion auf alle Elemente der übergebenen Liste angewandt. Damit dies gelingt, muss die Signatur der übergebenen Funktion beachtet werden!
Aufgabe 1: filter
(a) Dein monatlicher Kontoauszug ist da und listet alle Ein- und Auszahlungen auf deinem Konto auf. Filtere den Kontoauszug so, dass nur die Einzahlungen angezeigt werden.
(define kontoauszug
(list -13 -8.50 -10 550 -376 50 -22.10 -49.9 -120 13 120 -24.67 -1.50 -4.50 -4 -3.6 -5 -5))
(b) Für eine Webseite benötigst du ein Passwort, das mindestens aus 8 Zeichen besteht. Ein automatisierter Chatbot liefert dir direkt mehrere Vorschläge. Bestimme, wie viel Prozent der vorgeschlagenen Passwörter den Anforderungen entsprechen.
(define passwoerter
(list "hawae7" "12345" "lh7aDWwae3" "kaArrhit0" "075607561" "j8j7j6" "jasper434" "7adhadio66" "pasSW" "testpw"
"hallo90" "1FCK" "bahamas"))
(c) Paulo hat sich auf mehrere Universitäten in Deutschland beworben. Angenommen wurde er in den Städten Kaiserslautern, München, Mainz, Stuttgart und Wiesbaden. Da ihm die Entscheidung schwerfällt, beschließt er die Liste weiter einzugrenzen. Auf keinen Fall möchte Paulo während seines Studiums mehr als 7,50 € für einen Döner ausgeben. Anhand folgender Definition des durchschnittlichen Dönerpreises in deutschen Städten: Welche der 5 Universitätsstädte kommen für Paulo noch infrage?
(define doenerpreis
(list
(list "Nürnberg" 6.93) (list "Dresden" 7.33) (list "München" 8.60) (list "Stuttgart" 8.55)
(list "Berlin" 7.33) (list "Hamburg" 8.20) (list "Kaiserslautern" 7.25) (list "Wiesbaden" 7.90)
(list "Dortmund" 6.55) (list "Mainz" 7.43) (list "Saarbrücken" 7.44) (list "Bremen" 7.43)))
Die Listenfunktion fold
Möchte man die Werte einer Liste miteinander verarbeiten, zum Beispiel zur Berechnung der Summe aller Daten, nutzen
wir die Funktion fold.
fold-Ausdrucks in Racket besteht aus:
-
Dem Operator
fold - Einen Wert als ersten Operanden
- Einer Funktion als zweiten Operanden
- Einer Liste als dritten Operanden.
(fold 0 + (list 4 7 5 6 9)) (fold "Problem." string-append (list "Das " "ist " "kein "))
Verkettung der Funktionsanwendungen:
Die übergebene Funktion wird jeweils auf zwei Elemente angewandt. Zum einen auf ein Element aus der übergebenen Liste und zum anderen
auf die Rückgabe der Funktionsanwendung auf die vorherig verarbeiteten Listenelemente. Da für die erste Anwendung noch keine
vorherige Rückgabe vorhanden ist, wird im fold-Ausdruck ein zusätzlicher Wert als erster Operand übergeben.
Dieser wird beim innersten Ausdruck anstelle einer vorherigen Rückgabe genutzt.
Der Ausdruck ...
(fold 3 / (list 2 4 6))entspricht somit:
(/ 2 (/ 4 (/ 6 3)))
Aufgabe 2: fold
Hinweis: Die hier verwendeten Definitionen sind die selben wie in Aufgabe 1.
(a) Bestimme anhand des Kontoauszugs, ob du am Ende des Monats einen Gewinn oder Verlust gemacht hast und wie hoch der Betrag ist.
(define kontoauszug
(list -13 -8.50 -10 550 -376 50 -22.10 -49.9 -120 13 120 -24.67 -1.50 -4.50 -4 -3.6 -5 -5))
(b) Ermittle die Länge des längsten Passworts in der Liste.
(define passwoerter
(list "hawae7" "12345" "lh7aDWwae3" "kaArrhit0" "075607561" "j8j7j6" "jasper434" "7adhadio66" "pasSW" "testpw"
"hallo90" "1FCK" "bahamas"))
(c) Du möchtest deinen Kontoauszug in Excel übertragen. Für den Import in Excel eignet sich die
Darstellung als CSV-Datei (Comma-separated values). Die Liste (list 1 2 3)
könnte man beispielsweise als einen String: "1,2,3" darstellen.
Schreibe ein Programm, das dir anhand der Definition einen String nach diesem Format zurückgibt.
(define kontoauszug
(list -13 -8.50 -10 550 -376 50 -22.10 -49.9 -120 13 120 -24.67 -1.50 -4.50 -4 -3.6 -5 -5))
Hinweis: Nutze zur Umwandlung einer Zahl zu einem String die folgende Funktion:
;Wandelt eine Zahl in einen String um
(: to-string (real -> string))
(check-expect (to-string 13.4) "13.4")
(define to-string
(lambda (x)
(number->string (exact->inexact x))))