Klassen & Objekte

Aufgabe 1: Sichere Division

Datei: 1-safediv.ts

Schreibe eine Funktion safeDivide, welche zwei Zahlen entgegennimmt und folgendes zurückgibt:

  1. Das Ergebnis der Division als Zahl für einen gültigen Divisor.
  2. Eine Fehlermeldung als Zeichenkette für einen Divisor von 0 oder NaN.

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:

  1. Rechteck (Rectangle)
    • Breite (width)
    • Höhe (height)
  2. Quadrat (Square)
    • Seitenlänge (side)
  3. Kreis (Circle)
    • 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:

  1. rectangleCircumference(r: Rectangle) => number
  2. rectangleArea(r: Rectangle) => number
  3. squareCircumference(s: Square) => number
  4. squareArea(s: Square) => number
  5. circleCircumference(c: Circle) => number
  6. circleArea(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:

  1. 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, soll undefined zurückgegeben werden.
  2. exit(): string | undefined: Ist Die Warteschlange leer, soll undefined zurückgegeben werden, andernfalls das letzte Element (this.queue.pop()).
  3. 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).