Klassen & Objekte
Aufgabe 1: Sichere Division
Datei: 1-safediv.ts
Schreibe eine Funktion safeDivide, welche zwei Zahlen entgegennimmt und folgendes zurückgibt:
- Das Ergebnis der Division als Zahl für einen gültigen Divisor.
- Eine Fehlermeldung als Zeichenkette für einen Divisor von
0oderNaN.
Der Benutzer soll dazu aufgefordert werden, zwei Zahlen einzugeben: den Dividenden und den Divisor. Wiederhole das Einlesen solange (Tipp: fussgesteuerte Schleife), bis die jeweilige Zahl gültig, ist, d.h. Number.isNaN() den Wert false zurückgibt.
Gelingt die Division, soll die komplette Rechnung ausgegeben werden. Schlägt sie fehl, soll die entsprechende Fehlermeldung ausgegeben werden.
Aufgabe 2: Geometrische Formen als Objekttypen
Datei: 2-shape-objtypes.ts
Definiere Objekttypen für die folgenden geometrischen Figuren mit den jeweiligen Eigenschaften:
- Rechteck (
Rectangle)- Breite (
width) - Höhe (
height)
- Breite (
- Quadrat (
Square)- Seitenlänge (
side)
- Seitenlänge (
- Kreis (
Circle)- Radius (
radius)
- Radius (
Definiere zusätzlich eine Typunion namens Shape, sodass eine Variable/Konstante vom Typ Shape Werte aller drei obigen Typen annehmen kann.
Erstelle nun je zwei Objekte von jedem Objekttyp mit unterschiedlichen Angaben.
Schreibe nun für jedes Objekt eine Funktion für die Berechnung von dessen Umfang und Fläche:
rectangleCircumference(r: Rectangle) => numberrectangleArea(r: Rectangle) => numbersquareCircumference(s: Square) => numbersquareArea(s: Square) => numbercircleCircumference(c: Circle) => numbercircleArea(c: Circle) => number
Verwende hierzu die folgenden Formel ($A$: Fläche, $C$: Umfang):
$$ C_R = 2(w + h) $$ $$ A_R = w \times h $$ $$ C_S = 4s $$ $$ A_S = s^2 $$ $$ C_C = 2\pi r $$ $$ A_C = \pi r^2 $$Rufe die Funktionen für alle definierten Objekte auf und gib das Ergebnis mit einer sinnvollen Beschriftung aus.
Aufgabe 3: Geometrische Formen als Klassen
Datei: 3-shape-classes.ts
Erstelle aus den drei Typdefinitionen und sechs Funktionen aus der vorherigen Aufgabe drei Klassen mit je einem Konstruktor und den beiden Methoden für die Berechnung von Umfang und Fläche.
Definiere Instanzen von den jeweiligen Klassen analog zu denjenigen aus der vorherigen Aufgabe und rufe alle Methoden testhalber einmal auf.
Aufgabe 4: Temperaturklasse
Datei: 4-tempconv.ts
Erstelle einen neuen Datentyp TemperatureUnit, welche die beiden Werte "F" (Fahrenheit), "C" (Celsius) und "K" (Kelvin) aufnehmen kann.
Erstelle eine Klasse namens Temperature, welche im Konstruktor eine TemperatureUnit und einen numerischen Wert entgegennimmt und auf der Instanz abspeichert.
Ergänze die Klasse um eine Methode convertTo(u: TemperatureUnit): number, welche die jeweilige Temperatur in die neue Einheit u umrechnet.
Dabei sind folgende Formeln hilfreich:
$$ F = C \times \frac{9}{5} + 32 $$ $$ C = (F -32) \times \frac{5}{9} $$ $$ K = C + 273.15 $$Siehe auch die Übung Temperatur umrechnen von letzter Woche.
Teste die Klasse mit verschiedenen Zahlen, beispielsweise:
- absoluter Nullpunkt: $0K = -273.15°C \approx -460°F$
- Wasser-Gefrierpunkt: $273.15K = 0°C \approx 32°F$
- Wasser-Verdampfpunkt: $373K = 100°C \approx 212°F$
Aufgabe 5: Warteschlange
Datei: 5-queue.ts
Schreibe eine Klasse Queue, welche eine Warteschlange simuliert.
Die Klasse soll eine Eigenschaft namens queue vom Typ string[] haben. Dem Konstruktor soll als Eigenschaft die maximale Länge der Warteschlange mitgegeben werden können.
Schreibe folgende Methoden:
enter(item: string): number | undefined: Das angegebene Element wird in die Warteschlange aufgenommen (this.queue.unshift(item)), sofern diese noch nicht voll ist (Tipp:this.queue.length). Wird das Element aufgenommen, soll die Position in der Warteschlange zurückgegeben werden, sprich die Länge der Warteschlange. Ist die Warteschlange hingegen voll, sollundefinedzurückgegeben werden.exit(): string | undefined: Ist Die Warteschlange leer, sollundefinedzurückgegeben werden, andernfalls das letzte Element (this.queue.pop()).size(): number: Die Länge der Warteschlange soll zurückgegeben werden.
Erstelle eine Warteschlange und fülle diese mit Einträgen auf, bis ein neuer Eintrag nicht mehr angenommen wird. Entferne nun Elemente aus der Warteschlange und gib diese aus. Fülle die Warteschlange nun erneut auf. Tipp: Verwende eine überschaubare Grösse von ca. 5-10 Elemente für das Testen.
Aufgabe 6: Schachfiguren
Datei: 6-chesspieces.ts
Definiere einen Datentyp Kind für die folgenden konkreten Werte, welche Schachfiguren abbilden sollen:
- König (King):
"K" - Königin (Queen):
"Q" - Turm (Rook):
"R" - Läufer (Bishop):
"B" - Pferd/Springer (Knight):
"K""N" - Bauer (Pawn):
"P"
Erstelle nun eine Klasse namens ChessPiece. Diese soll neben dem Typ (wie oben definiert) auch eine Farbe (neuer Typ für die Werte "black"/"white") und eine Position (Spalte: Buchstabe von A-H, Zeile: Zahl von 1 bis 8) haben. Stelle sicher, dass nur erlaubte Positionsangaben verwendet werden können.
Erweitere die Klasse um eine Methode describe(): string, welche beispielsweise folgendes zurückgibt:
"white King at D1""black Queen at E8"
Teste diese Methode mit mindestens einer Instanz von jeder Figurtyp (Kind).