inf-abi2027/03 Objektorientierung/02 Vererbung/04 Übung.ipynb

362 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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
}