Zusatzübungen zu Grundlagen
Aufgabe 1: Quadratische Gleichung
Datei: 1-quadratic-equation.ts
Erstelle eine Klasse namens QuadaticEquation. Dieser sollen drei Eigenschaften übergeben werden: drei Zahlen a, b und c.
Schreibe eine Methode namens solve welche ein Array von Zahlen der Länge 0, 1 oder 2 zurückgibt. Die Anzahl der elemente hängt von der Diskriminante $D$ ab, welche mit der Methode discriminant(): number folgendermassen berechnet werden soll:
- Für $D<0$ gibt es keine Lösung.
- Für $D=0$ gibt es eine Lösung.
- Für $D>0$ gibt es zwei Lösungen.
Berechne nun in solve anhand der Diskriminante die Lösung(en):
Teste die Klasse mit verschiedenen Werten:
- $a=2, b=3, c=-5$ (zwei Lösungen)
- $a=1, b=-2, c=1$ (eine Lösung)
- $a=3, b=4, c=5$ (keine Lösung)
Aufgabe 2: Punkte für Rennergebnisse
Datei: 2-race-points.ts
Erstelle einen literalen Typ namens PointSystem mit den Werten FIS und FIA.
Erstelle eine Klasse namens RacePoints, deren Konstruktor ein PointSystem erwartet und als Eigenschaft abspeichert.
Schreibe eine Methode pointsFor(rank: number): number, welche je nach Rang eine Anzahl Punkte zurückgibt. Die beiden Punktesysteme ergeben folgende Punktzahlen:
- FIA, z.B. Formel 1 (Platz 1 bis 10):
25, 18, 15, 12, 10, 8, 6, 4, 2, 1 - FIS, z.B. Ski Alpin (Platz 1 bis 30):
100, 80, 60, 50, 45, 40, 36, 32, 29, 26, 24, 22, 20, 18, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
Tipp: Lege die Punktzahlen in einem Array ab. Greife dann mit dem Index (Rang-1) auf die passende Punktzahl zu. Teste die Klasse mit den beiden Punktsystemen und Rangierungen, für die es Punkte bzw. keine Punkte gibt.
Aufgabe 3: Spielkarten
Datei: 3-cards.ts
Erstelle folgende zwei literale Typen:
Rank: Kartenwerte Ass (Ace), 2, 3, 4, 5, 6, 7, 8, 9, 10, Bube (Jack), Königin (Queen), König (King)Suite: Kartenfarben Herz (Hearts), Karo (Diamonds), Pik (Spades), Kreuz (Clubs)
Erstelle eine Klasse Card, deren Konstruktor einen Rank und eine Suite erwartet. Ergänze die Klasse um eine Methode show(): string, welche Rank und Suite als String zurückgibt. Tipp: Verwende die Unicode-Notation \u{xxxx} mit den Bereichen 2660-2667 für die entsprechenden Suite-Symbole. Den Rank kannst du als Zeichenkette ausgeben.
Erstelle eine Klasse Deck, welche ein komplettes Kartenset modelliert. Der Konstruktor soll ein Argument full: boolean erwarten. Ist dieses true, sollen alle möglichen (d.h. $13\times4=52$) Karten generiert werden. Wird false übergeben, sollen die Karten mit den Rängen 2, 3, 4 und 5 nicht erstellt werden (d.h. nur $9\times4=36$ Karten). Die Karten sollen in der Klasse mithilfe einer geeigneten Datenstruktur abgespeichert werden. Schreibe eine Methode output(): void, welche das Kartendeck in vier Zeilen (eine Zeile pro Farbe) ausgibt.
Teste die Klasse Deck mit beiden Varianten.
Aufgabe 4: Punkte im Koordinatensystem
Datei: 4-point-2d.ts
Schreibe eine Klasse Point2D, deren Konstruktor zwei Koordinaten x und y erwartet und diese abspeichert.
Schreibe eine Methode namens distanceTo(p: Point2D), welche die Distanz zum übergebenen Punkt berechnet. Die Distanz $d$ zwischen den Punkten $P$ und $Q$ kann mit dem Satz vom Pythagoras berechnet werden:
Exportiere die Klasse, sodass sie aus anderen Dateien verwendet werden kann.
Aufgabe 5: Dreieck im Koordinatensystem
Datei 5-triangle.ts
Schreibe eine Klasse Triangle, deren Konstruktor drei Punkte a, b und c erwartet und diese abspeichert. Importiere hierzu die Klasse Point2D von Aufgabe 4.
Erstelle einen literalen Typ namens TriangleCorner mit den möglichen Werten "A", "B" und "C".
Ergänze die Klasse Triangle um eine Methode sideLength(p: TriangleCorner, q: TriangleCorner): number, welche je nach übergebenem Wert folgende Strecke berechnet und zurückgibt:
- $\over{AB}$: Distanz von Punkt
azub - $\over{BC}$: Distanz von Punkt
bzuc - $\over{CA}$: Distanz von Punkt
czua
Erstelle einen Getter circumference(): number, welcher den Umfang des Dreiecks berechnet und zurückgibt.
Erstelle ein konkretes Dreieck und teste damit die Methode sideLength und den Getter circumference.
Aufgabe 6: Kreis im Koordinatensystem
Datei 6-circle.ts
Schreibe eine Klasse Circle, deren Konstruktor einen Punkt m (den Kreismittelpunkt) und einen Radius r erwartet und abspeichert. (Verwende wieder die Klasse Point2D.)
Ergänze die Klasse um eine Methode scale(s: number): void, welche den Radius um den gegebenen Faktor streckt ($s>1$) oder staucht ($s<1$).
Erstelle zwei Getter circumference(): number und area(): number, welche den Kreisumfang bzw. die Kreisfláche berechnen und zurückgeben:
Teste beide Getter mit einem Kreis, stauche und strecke ihn, und teste die Getter erneut.
Zusatzaufgabe: Die dritte Dimension
Datei: third-dimension.ts
Erstelle eine Klasse Point3D analog zu Aufgabe 4.
Portiere die Klasse Triangle aus Aufgabe 5 in den dreidimensionalen Raum. Tipp: Du solltest nur sehr wenig ändern müssen!
Erstelle eine Klasse Sphere analog zu Aufgabe 6, welche eine Kugel modelliert – wiederum mit Mittelpunkt und Radius. Schreibe dazu einen Getter volume(), welche das Volumen der Kugel berechnet: