i

Gemischte Daten

Tierarztpraxissystem

Eine neue Tierarztpraxis möchte die zukünftig in der Praxis behandelten Tiere digital verwalten. Da die Praxis sich auf Hunde, Katzen und Kaninchen spezialisert, sollen vorerst für diese drei Tierarten eigene Definitionen angelegt werden, die je nach Tierart die folgenden Informationen zu den Tieren speichern sollen:

Tierart Felder
Hund Name Geschlecht Alter Gewicht Rasse
Katze Name Geschlecht Alter Gewicht Freigänger?
Kaninchen Name Geschlecht Alter Gewicht -

Aufgabe 1: Tierrecords anlegen

Neue Datei - gemischte_daten.rkt

(a) Lege für jede der drei Tierarten eine geeignete Record-Definition an. Nutze Aufzählungen, wo du diese für angebracht hältst.

(b) Zu den ersten drei Patienten der Tierarztpraxis gehören Snopy, Seppel und Flocke. Definiere für diese drei Tiere jeweils einen Record.

Tierart Felder
Hund Snopy m 15 Jahre 19,2 kg Terrier-Mischling
Katze Seppel m 7 Jahre 4,4 kg Ja
Kaninchen Flocke w 2 Jahre 2,7 kg -

Aufgabe 2: Tiergewichte bestimmen

Bestehende Datei - gemischte_daten.rkt

(a) Schreibe je einen Ausdruck für die drei in Aufgabe 1 (b) definierten Records zur Bestimmung des Gewichts.

(b) Betrachte deine Record-Definitionen für die drei Tierarten. Welche Informationen sind in allen Record-Definitionen abgebildet und welche Informationen nur bei bestimmten Tierarten?


Eine Funktion für alle Tiere

Mit den Feldern für Name, Geschlecht, Alter und Gewicht beinhalten die Record-Definitionen zu großen Teilen die selben Informationen. Dennoch müssen wir abhängig von der Tierart verschiedene Funktionen nutzen, um beispielsweise das Gewicht, wie in Aufgabenteil (a), zu bestimmen.

Um die Nutzerfreundlichkeit zu erhöhen, ist hier eine Funktion wünschenswert, die für ein beliebiges übergebenes Tier das entsprechende Gewicht zurückgibt. Beispielsweise eine Funktion tier-gewicht der folgenden Signatur:

(: tier-gewicht (tier -> real))

Der Datentyp tier muss entsprechend alle Records, unabhängig von der Tierart abdecken. Wie im Kapitel der Aufzählungen bereits gelernt, können wir dies textuell wie folgt beschreiben:

;Ein Tier ist eines der folgenden:
; - Hund
; - Katze
; - Kaninchen
Die Nutzung von Aufzählungen ist daher naheliegend:
(define tier
  (signature
    (enum hund katze kaninchen)))
(c) Übertrage die obige Aufzählung in deinen Code und passe, wenn nötig, die Namen der Records an. Versuche anschließend den Code auszuführen. Welche Fehlermeldung erhältst du?

Die Fehlermeldung signatures: hier keine Signatur zulässig, nur normaler Wert tritt auf, da Aufzählungen nur aus einer endlichen Menge fester Werte bestehen dürfen, wie z. B. festen Zahlen, Strings, oder Records. Aufzählungen dürfen jedoch keine Datentypen wie Natural, String oder Record-Definitionen enthalten.

Um verschiedene Datentypen unter einer Signatur-Bezeichnung zusammenzufassen, nutzen wir anstelle von Aufzählungen daher gemischte Daten. Hierfür ersetzen wir das Schlüsselwort enum durch mixed:

(define tier
  (signature
    (mixed hund katze kaninchen)))
(d) Übertrage die obige Definition der gemischten Daten in deinen Code und passe, wenn nötig, die Namen der Records an. Führe anschließend deinen Code aus.

(e) Schreibe eine beliebige Funktion, die als Übergabedaten gemischte Daten vom Typ tier akzeptiert.


Fallunterscheidungen nach Record-Datentypen

Um das Gewicht der einzelnen Tierarten zu bestimmen, müssen wir weiterhin die in Aufgabenteil (a) genutzten Funktionen der Records aufrufen.

(f) Wir nehmen an, dass eine Funktion ein beliebiges Tier als Übergabedaten erhalten kann. Überlege, welcher Zwischenschritt innerhalb der Funktion notwendig ist, um die korrekte Gewichtsfunktion zu wählen?

(g) Übertrage die untere Record-Definition für einen Eisbären in deinen Code. Welche Bestandteile sind dir unbekannt?

(define-record eisbaer
  make-eisbaer
  eisbaer?
  (eisbaer-name string)
  (eisbaer-gewicht real))
  
(define wilbaer (make-eisbaer "wilbaer" 430))

(h) Führe den unten stehenden Ausdruck in der REPL aus und teste die Funktion eisbaer? anschließend mit deinen Definitionen von Snopy, Seppl und Flocke.

> (eisbaer? wilbaer)

(i) Erweitere deine bestehenden Record-Definitionen aus Aufgabe 1 um eine zu eisbaer? analoge Funktion. Überprüfe anschließend in der REPL die Korrektheit der Funktionen.

(j) Schreibe eine Funktion tier-gewicht, die für jedes übergebene Tier das entsprechende Gewicht zurückgibt.

Das Grundgerüst für eine Funktion tier-gewicht, die das Gewicht für Records vom Typ hund und katze zurückgibt, könnte wie folgt aussehen:

(: tier-gewicht (tier -> real))
(define tier-gewicht
    (lambda (t)
        (cond
          ([hund? t] ...)
          ([katze? t] ...))))
    

Suche

v
100.137.2.4.1 Gemischte Daten
Kopieren durch Anklicken

Rückmeldung geben