Übungen: Gemischte Daten
Aufgabe 1: Gravitationsfeldstärke von Himmelskörpern
Bei der Analyse von Himmelskörpern und deren Einfluss auf ihr Umfeld ist die Gravitationsfeldstärke (Symbol: $g$, Einheit: $\frac{m}{s^2}$) eine entscheidende Größe. Diese lässt sich für kugelförmige Körper mit folgender Formel berechnen: $$g = \frac{G \cdot M}{r^2}$$ wobei:
- $G$ die Gravitationskonstante $= 6,6743 \cdot 10^{11}\ \ \frac{m^3}{kg \cdot s^{2}}$
- $M$ die Masse des Himmelskörpers in $kg$
- $r$ der Radius des Himmelskörpers in $m$
(a) Analysiere die Inhalte der unteren Tabelle mit sechs Himmelskörpern.
Lege für die verschiedenen Himmelskörpertypen jeweils eine geeignete Record-Definition an.
(Hinweis: Die Bezeichnung planet ist in Racket bereits vorvergeben. Die Bezeichnung des
Record-Datentyps könnte daher z. B. planett oder ein alternativer Name sein.)
| Himmelskörpertyp | Name | Masse | Radius | Sonnensystem | Planeten Zugehörigkeit | Leuchtkraftklasse |
|---|---|---|---|---|---|---|
| Stern | Sonne | $1,989 \cdot 10^{30}\ kg$ | $6,963 \cdot 10^5\ km$ | das Sonnensystem | - | V |
| Stern | Sirius A | $3,978 \cdot 10^{30}\ kg$ | $1,190 \cdot 10^6\ km$ | Sirius-System | - | V |
| Planet | Erde | $5,972 \cdot 10^{24}\ kg$ | $6,371 \cdot 10^3\ km$ | das Sonnensystem | - | - |
| Planet | Kepler-452b | $1,965 \cdot 10^{25}\ kg$ | $1,038 \cdot 10^4\ km$ | Kepler-452-System | - | - |
| Mond | Mond | $7,346 \cdot 10^{22}\ kg$ | $1,737 \cdot 10^3\ km$ | das Sonnensystem | Erde | - |
| Mond | Ganymed | $1,482 \cdot 10^{23}\ kg$ | $2,631 \cdot 10^3\ km$ | das Sonnensystem | Jupiter | - |
(b) Definiere einen Record für die Sonne, die Erde und den Mond.
(c) Schreibe eine Funktion, die Himmelskörper als gemischte Daten akzeptiert und die Gravitationsfeldstärke des übergebenen Himmelskörpers berechnet.
Aufgabe 2: Undefinierte Y-Achsenwerte
Die untenstehende Racket-Funktion berechnet den y-Achsenwert für die Funktion $f = x^a$ bei der Übergabe von $x \in \mathbb{R}$ und $a \in \mathbb{Z}$.
;Berechnet den y-Wert für x^a
(: x-hoch-a (real integer -> real))
(check-expect (x-hoch-a 1 2) 1)
(check-expect (x-hoch-a 2 3) 8)
(check-expect (x-hoch-a 2 -3) 0.125)
(define x-hoch-a
(lambda (x a)
(expt x a)))
(a) Teste die Funktion mit den Übergabedaten $x = 0\ a = -3$ und $x = 0\ a = -17$. Welches Problem tritt hier auf? Erkläre anschließend, bei welchen Zahlenbereichen von $x$ und $a$ das Problem auftritt.
Anstelle von einer Fehlermeldung soll die Funktion nun einen Record vom Typ undefiniert zurückgeben:
(define-record undefiniert
make-undefiniert)
(b) Ändere die Funktion x-hoch-a so ab, dass diese bei einem definierten y-Wert den entsprechenden
Wert zurückgibt und bei einem undefinierten y-Wert einen Record vom Typ undefiniert.
Überprüfe deine Lösung mit den beiden nachfolgenden sowie den bereits vorhandenen Testfällen.
(check-expect (x-hoch-a 0 -3) (make-undefiniert))
(check-expect (x-hoch-a 0 -17) (make-undefiniert))