{ "cells": [ { "cell_type": "markdown", "id": "62e51929", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "# Aufgabe 03.02.4 – Geometrische Figuren\n", "\n", "In diesem Notebook modellierst du **geometrische Figuren** mithilfe von **objektorientierter Programmierung** und **Vererbung**." ] }, { "cell_type": "markdown", "id": "528e0733", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Aufgabe 1: Basisklasse `Figur`\n", "\n", "Erstelle eine Klasse `Figur` mit folgender Eigenschaft:\n", "\n", "- `name: string`\n", "\n", "sowie folgenden Methoden:\n", "\n", "- `umfang(): number` → gibt standardmäßig `0` zurück\n", "- `flaeche(): number` → gibt standardmäßig `0` zurück\n", "- `getInfo(): string`\n", " - gibt z. B. zurück:\n", " `\"Figur: Rechteck, Umfang: 14, Fläche: 12\"`\n", "\n", "**Hinweis:** Die Methoden `umfang()` und `flaeche()` sollen in den Unterklassen überschrieben werden." ] }, { "cell_type": "code", "execution_count": null, "id": "85cf4730", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "// TODO: Klasse Figur hier implementieren\n" ] }, { "cell_type": "markdown", "id": "dea8839f", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Aufgabe 2: Abgeleitete Klasse `Rechteck`\n", "\n", "Erstelle eine Klasse `Rechteck`, die **von `Figur` erbt**.\n", "\n", "Zusätzliche Eigenschaften:\n", "\n", "- `breite: number`\n", "- `hoehe: number`\n", "\n", "Überschreibe die Methoden:\n", "\n", "- `umfang(): number` → `2 * (breite + hoehe)`\n", "- `flaeche(): number` → `breite * hoehe`" ] }, { "cell_type": "code", "execution_count": null, "id": "5e33fec4", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "// TODO: Klasse Rechteck hier implementieren\n" ] }, { "cell_type": "markdown", "id": "b7d388ad", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Aufgabe 3: Abgeleitete Klasse `Kreis`\n", "\n", "Erstelle eine Klasse `Kreis`, die **ebenfalls von `Figur` erbt**.\n", "\n", "Zusätzliche Eigenschaft:\n", "\n", "- `radius: number`\n", "\n", "Überschreibe die Methoden:\n", "\n", "- `umfang(): number` → `2 * Math.PI * radius`\n", "- `flaeche(): number` → `Math.PI * radius * radius`" ] }, { "cell_type": "code", "execution_count": null, "id": "312b3f23", "metadata": {}, "outputs": [], "source": [ "// TODO: Klasse Kreis hier implementieren\n" ] }, { "cell_type": "markdown", "id": "d757634c", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Aufgabe 4: Klasse `Quadrat`\n", "\n", "Ein Quadrat ist ein **spezielles Rechteck**, bei dem alle Seiten gleich lang sind.\n", "\n", "Erstelle eine Klasse `Quadrat`, die **von `Rechteck` erbt**.\n", "\n", "Zusätzliche Eigenschaft:\n", "\n", "- `seitenlaenge: number`\n", "\n", "**Hinweis:** Übergib die Seitenlänge sinnvoll an den Konstruktor der Oberklasse `Rechteck`." ] }, { "cell_type": "code", "execution_count": null, "id": "d38d2215", "metadata": {}, "outputs": [], "source": [ "// TODO: Klasse Quadrat hier implementieren\n" ] }, { "cell_type": "markdown", "id": "72cfd572", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Aufgabe 5: Nutzung der Klassen\n", "\n", "1. Erzeuge:\n", " - ein Rechteck,\n", " - einen Kreis,\n", " - ein Quadrat.\n", "2. Gib für jede Figur die Methode `getInfo()` aus.\n", "3. Überprüfe die Ergebnisse mit `console.log(...)`." ] }, { "cell_type": "code", "execution_count": null, "id": "cd294321", "metadata": {}, "outputs": [], "source": [ "// TODO: Objekte erzeugen und Methoden testen\n" ] }, { "cell_type": "markdown", "id": "bc077348", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Denkfrage\n", "\n", "Warum ist es sinnvoll, die Methoden `umfang()` und `flaeche()` bereits in der Basisklasse `Figur` zu definieren, obwohl ihre konkrete Berechnung erst in den Unterklassen erfolgt?" ] }, { "cell_type": "markdown", "id": "d7dfe130-b4cb-48de-82b6-84f94ffa2591", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Automatische Tests\n", "\n", "Die folgenden Tests überprüfen, ob deine Klassen korrekt funktionieren.\n", "\n", "**Hinweis:** Führe diese Zelle erst aus, wenn alle Klassen implementiert sind." ] }, { "cell_type": "code", "execution_count": 5, "id": "fc097962-d40a-44e5-92c6-e214699686ac", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "03.01.3: Rechteck ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n", "03.01.3: Kreis ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(25ms)\u001b[0m\n", "03.01.3: Quadrat ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n", "\n", "\u001b[0m\u001b[1m\u001b[37m\u001b[41m ERRORS \u001b[0m\n", "\n", "03.01.3: Rechteck \u001b[0m\u001b[38;5;245m=> :3:6\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[31merror\u001b[0m: AssertionError: Values are not equal.\n", "\n", "\n", " \u001b[90m\u001b[1m[Diff]\u001b[22m\u001b[39m \u001b[31m\u001b[1mActual\u001b[22m\u001b[39m / \u001b[32m\u001b[1mExpected\u001b[22m\u001b[39m\n", "\n", "\n", "\u001b[31m\u001b[1m- 0\u001b[22m\u001b[39m\n", "\u001b[32m\u001b[1m+ 14\u001b[22m\u001b[39m\n", "\n", " throw new AssertionError(message);\n", "\u001b[0m\u001b[31m ^\u001b[0m\n", " at \u001b[0m\u001b[1m\u001b[3massertEquals\u001b[0m (\u001b[0m\u001b[36mhttps://jsr.io/@std/assert/1.0.17/equals.ts\u001b[0m:\u001b[0m\u001b[33m65\u001b[0m:\u001b[0m\u001b[33m9\u001b[0m)\n", " at \u001b[0m\u001b[36m\u001b[0m:\u001b[0m\u001b[33m6\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n", "\n", "03.01.3: Kreis \u001b[0m\u001b[38;5;245m=> :9:6\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[31merror\u001b[0m: AssertionError: Values are not equal.\n", "\n", "\n", " \u001b[90m\u001b[1m[Diff]\u001b[22m\u001b[39m \u001b[31m\u001b[1mActual\u001b[22m\u001b[39m / \u001b[32m\u001b[1mExpected\u001b[22m\u001b[39m\n", "\n", "\n", "\u001b[31m\u001b[1m- \u001b[41m\u001b[37mundefined\u001b[31m\u001b[49m\n", "\u001b[22m\u001b[39m\u001b[32m\u001b[1m+ \u001b[42m\u001b[37mfunction\u001b[32m\u001b[49m\n", "\u001b[22m\u001b[39m\n", "\n", " throw new AssertionError(message);\n", "\u001b[0m\u001b[31m ^\u001b[0m\n", " at \u001b[0m\u001b[1m\u001b[3massertEquals\u001b[0m (\u001b[0m\u001b[36mhttps://jsr.io/@std/assert/1.0.17/equals.ts\u001b[0m:\u001b[0m\u001b[33m65\u001b[0m:\u001b[0m\u001b[33m9\u001b[0m)\n", " at \u001b[0m\u001b[36m\u001b[0m:\u001b[0m\u001b[33m10\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n", "\n", "03.01.3: Quadrat \u001b[0m\u001b[38;5;245m=> :15:6\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[31merror\u001b[0m: AssertionError: Values are not equal.\n", "\n", "\n", " \u001b[90m\u001b[1m[Diff]\u001b[22m\u001b[39m \u001b[31m\u001b[1mActual\u001b[22m\u001b[39m / \u001b[32m\u001b[1mExpected\u001b[22m\u001b[39m\n", "\n", "\n", "\u001b[31m\u001b[1m- \u001b[41m\u001b[37mundefined\u001b[31m\u001b[49m\n", "\u001b[22m\u001b[39m\u001b[32m\u001b[1m+ \u001b[42m\u001b[37mfunction\u001b[32m\u001b[49m\n", "\u001b[22m\u001b[39m\n", "\n", " throw new AssertionError(message);\n", "\u001b[0m\u001b[31m ^\u001b[0m\n", " at \u001b[0m\u001b[1m\u001b[3massertEquals\u001b[0m (\u001b[0m\u001b[36mhttps://jsr.io/@std/assert/1.0.17/equals.ts\u001b[0m:\u001b[0m\u001b[33m65\u001b[0m:\u001b[0m\u001b[33m9\u001b[0m)\n", " at \u001b[0m\u001b[36m\u001b[0m:\u001b[0m\u001b[33m16\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n", "\n", "\u001b[0m\u001b[1m\u001b[37m\u001b[41m FAILURES \u001b[0m\n", "\n", "03.01.3: Rechteck \u001b[0m\u001b[38;5;245m=> :3:6\u001b[0m\n", "03.01.3: Kreis \u001b[0m\u001b[38;5;245m=> :9:6\u001b[0m\n", "03.01.3: Quadrat \u001b[0m\u001b[38;5;245m=> :15:6\u001b[0m\n", "\n", "\u001b[0m\u001b[31mFAILED\u001b[0m | 0 passed | 3 failed \u001b[0m\u001b[38;5;245m(27ms)\u001b[0m\n" ] } ], "source": [ "import { assertEquals } from \"jsr:@std/assert\"\n", "\n", "let _nr = \"03.01.3\"\n", "Deno.test(`${_nr}: Rechteck`, () => {\n", " assertEquals(typeof Rechteck, 'function')\n", " const r = new Rechteck(4, 3)\n", " assertEquals(r.umfang(), 14)\n", " assertEquals(r.flaeche(), 12)\n", "})\n", "Deno.test(`${_nr}: Kreis`, () => {\n", " assertEquals(typeof Kreis, 'function')\n", " const k = new Kreis(1)\n", " assertEquals(Number(k.umfang().toFixed(2)), 6.28)\n", " assertEquals(Number(k.flaeche().toFixed(2)), 3.14)\n", "})\n", "Deno.test(`${_nr}: Quadrat`, () => {\n", " assertEquals(typeof Quadrat, 'function')\n", " const q = new Quadrat(5)\n", " assertEquals(q.umfang(), 20)\n", " assertEquals(q.flaeche(), 25)\n", "})" ] } ], "metadata": { "kernelspec": { "display_name": "Deno", "language": "typescript", "name": "deno" }, "language_info": { "codemirror_mode": "typescript", "file_extension": ".ts", "mimetype": "text/x.typescript", "name": "typescript", "nbconvert_exporter": "script", "pygments_lexer": "typescript", "version": "5.8.3" } }, "nbformat": 4, "nbformat_minor": 5 }