i

Fallunterscheidungen in Racket

Möchte man in der Chemie den pH‑Wert von Lösungen bestimmen, so kann dies mittels eines pH‑Indikators erfolgen. Gibt man einen pH‑Indikator in eine Lösung, so nimmt dieser in Abhängigkeit des pH‑Werts unterschiedliche Farben an. Ein gängiger pH‑Indikator ist das Bromthymolblau (BTB). Die untere Abbildung zeigt das Farbspektrum an, dass BTB je nach pH‑Wert annimmt.

Farben des pH-Indikators Bromthymolblau[1]
Der Indikator gibt uns eine aussagekräftige Auskunft darüber, ob die untersuchte Lösung einen sauren (pH < 7), einen neutralen (pH = 7) oder einen alkalischen/basischen (pH > 7) pH‑Zustand aufweist.


Aufgabe 1: Fallunterscheidungen

Neue Datei - FaelleUndDaten.rkt

Die Racket-Funktion bestimme-pH-Zustand soll die Informationen des ph-Indikators abbilden. Übergeben wir der Funktion die Farbe des Indikators (gelb, grün, blau), soll diese uns den entsprechenden pH-Zustand (sauer, neutral, alkalisch) zurückgeben.

(a) Betrachte den unten stehenden Code. Füge in den Tests die zu überprüfenden Fälle ein. Ersetze hierzu jeweils die Platzhalter "...".

;Bestimmt den pH-Zustand anhand der Färbung des pH-Indikators Bromthymolblau
(: bestimme-pH-Zustand (string -> string))
(check-expect (bestimme-pH-Zustand "...") "...")
(check-expect (bestimme-pH-Zustand "...") "...")
(check-expect (bestimme-pH-Zustand "...") "...")
(define bestimme-pH-Zustand
  (lambda (farbe)
    (?)
) )

Um eine Funktion umsetzten zu können, welche alle drei Test-Fälle abdeckt benötigen wir im Funktionskörper der Funktion die Möglichkeit eine Fallunterscheidung durchzuführen.

Eine Funktion die eine Fallunterscheidung nutzt ist die Folgende:

;Bestimmt ob eine Zahl positiv oder negativ ist
(: positiv-oder-negativ (real -> string))
(check-expect (positiv-oder-negativ -0.2) "negativ")
(check-expect (positiv-oder-negativ 0) "weder positiv noch negativ")
(check-expect (positiv-oder-negativ 12.7) "positiv")
(define positiv-oder-negativ
  (lambda (zahl)
    (cond
      ([< zahl 0] "negativ")
      ([= zahl 0] "weder positiv noch negativ")
      ([> zahl 0] "positiv")
    ) 
) ) 

(b) Analysiere den Funktionskörper der Funktion positiv-oder-negativ und erkläre den Aufbau einer Fallunterscheidung in Racket.

(c) Schreibe analog zur Funktion positiv-oder-negativ den Funktionskörper der Funktion bestimme-pH-Zustand. Ersetze hierzu den Platzhalter (?).


Aufgabe 2: Der else-Fall

Bestehende Datei - FaelleUndDaten.rkt

(a) Rufe die Funktion bestimme-pH-Zustand mit dem Übergabedatum "rot" auf. Welche Ausgabe erhälst du in der REPL?
Überlege und begründe ob du die selbe Fehlermeldung auch in der in Aufgabe 1 vorgestellten Funktion positiv-oder-negativ erhalten kannst.

Racket bietet uns die Möglichkeit alle Fälle, die wir nicht in unserer Fallunterscheidung abdecken, mit einem zusätzlichen Fall innerhalb des (cond ...)-Ausdrucks abzufangen:

(cond
    ...
    (else ...))

(b) Ergänze die Funktion bestimme-pH-Zustand so, dass jede beliebige String-Übergabe eine Rückgabe liefert. Überprüfe anschließend deine Implementierung durch geeignete Tests.


Aufgabe 3: Die binäre Fallunterscheidung

Bestehende Datei - FaelleUndDaten.rkt

Wir möchten Bromthymolblau im Labor dazu nutzen neutrale Lösungen zu bestimmen. Dabei interessiert uns lediglich ob der pH-Zustand neutral ist oder nicht. Hierfür können wir eine Funktion mit folgender Signatur entwerfen:

;Bestimmt, anhand der Färbung des pH-Indikators Bromthymolblau, ob der pH-Zustand neutral ist. 
(: pH-Zustand-neutral? (string -> boolean))
(check-expect (pH-Zustand-neutral? "gelb") "...")
(check-expect (pH-Zustand-neutral? "grün") "...")
(check-expect (pH-Zustand-neutral? "blau") "...")
(check-expect (pH-Zustand-neutral? "rot") "...")
(define pH-Zustand-neutral?
  (lambda (farbe)
    (?)
) )

(a) Vervollständige die Tests. Ersetze hierzu jeweils die Platzhalter "...".

(b) Schreibe einen möglichst kurzen Funktionskörper für die Funktion pH-Zustand-neutral?.

Für Aufgabe (c) hier drücken


Der Funktionskörper benötigt genau zwei Fälle, ist die Übergabe "grün" dann ist die Rückgabe #f, für alle anderen Fälle #f. Haben wir genau zwei Möglichkeiten, dann bietet Racket noch eine weitere Art der Fallunterscheidung: den (if ...)-Ausdruck.

Eine Funktion die einen (if ...)-Ausdruck aus Fallunterscheidung nutzt ist die Folgende: Die Funktion bestanden? nutzt diese Art der Fallunterscheidung.

;Bestimmt ob eine Klassenarbeit mit der erreichten Anzahl an MSS-Notenpunkten bestanden wurde. 
(: bestanden? (natural -> boolean))
(check-expect (bestanden? 4) #f)
(check-expect (bestanden? 5) #t)
(define bestanden?
    (lambda (punkte)
        (if [< punkte 5] #f #t)
)   )

(c) Analysiere den Funktionskörper der Funktion bestanden? und erkläre den Aufbau dieser Art der Fallunterscheidung in Racket.

(d) Verkürze deine Funktion indem du den Funktionskörper der Funktion pH-Zustand-neutral? durch einen (if ...)-Ausdruck ersetzt.

Quellen

Suche

v
100.137.4.1.1 Fallunterscheidungen in Racket
Kopieren durch Anklicken

Rückmeldung geben