362 lines
11 KiB
Plaintext
362 lines
11 KiB
Plaintext
{
|
||
"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=> <anonymous>: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<anonymous>\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=> <anonymous>: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<anonymous>\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=> <anonymous>: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<anonymous>\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=> <anonymous>:3:6\u001b[0m\n",
|
||
"03.01.3: Kreis \u001b[0m\u001b[38;5;245m=> <anonymous>:9:6\u001b[0m\n",
|
||
"03.01.3: Quadrat \u001b[0m\u001b[38;5;245m=> <anonymous>: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
|
||
}
|