inf-abi2027/01 Einführung/05 Übungen/01M Übungen.ipynb

1014 lines
36 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "c9079895-47dc-4d88-b630-57c1923a0eb5",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"[Module: null prototype] { }"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import { assertEquals } from \"jsr:@std/assert\"\n",
"import \"https://git.amgdhg.de/kg/tslib/raw/branch/main/logger.ts?5\""
]
},
{
"cell_type": "markdown",
"id": "d4b638e5-98c7-4c03-a496-cb4e0316808b",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.1 - Summe\n",
"\n",
"Programmiere eine Funktion `summe`, die zwei Zahlen als Parameter annimmt, deren Summe berechnet und anschließend zurückgibt.\n",
"\n",
"#### Hinweis:\n",
"\n",
"zurückgeben heißt: `return`"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b05082a3-b2fc-46d1-9f91-d418f1861b69",
"metadata": {
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function summe(a, b) {\n",
" return a+b\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6b14aef1-7dc0-406a-8a7a-6d4ec4727792",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.1: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.1: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.1: summe() mit verschiedenen Zufallszahlen ...\n",
" Teste summe(0.09857567034801862,0.7951677135947943)\n",
" Teste summe(0.3135849847079676,0.0007421504268001478)\n",
" Teste summe(0.13370519238572542,0.20820118080631955)\n",
" Teste summe(0.9365293945707304,0.7582948322292293)\n",
" Teste summe(0.5363182595825601,0.339864147977613)\n",
" Teste summe(0.545377890493888,0.4102543246021325)\n",
" Teste summe(0.14109215444002454,0.5363126715294577)\n",
" Teste summe(0.6421453995692915,0.7198981742317588)\n",
" Teste summe(0.47096352499197125,0.9434132805795907)\n",
" Teste summe(0.7707734463105319,0.08519817940662389)\n",
" \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[32mok\u001b[0m | 3 passed | 0 failed \u001b[0m\u001b[38;5;245m(1ms)\u001b[0m\n"
]
}
],
"source": [
"Deno.test(\"01.05.1: function\", () => {\n",
" assertEquals(typeof summe, 'function')\n",
"})\n",
"Deno.test(\"01.05.1: Parameter\", () => {\n",
" assertEquals(summe.length, 2)\n",
"})\n",
"Deno.test(\"01.05.1: summe() mit verschiedenen Zufallszahlen\", () => {\n",
" console.log(\"\")\n",
" for (let i = 0; i < 10; i++) {\n",
" let a = Math.random()\n",
" let b = Math.random()\n",
" console.log(\" Teste summe(\"+a+\",\"+b+\")\")\n",
" assertEquals(summe(a,b), a+b)\n",
" }\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "272cc82a-2c1b-456d-86e4-5d2b7ebefc68",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.2 - Primzahlen\n",
"\n",
"Programmiere eine Funktion `istPrim`, die eine Zahl als Parameter bekommt. Die Methode soll überprüfen, ob der Parameter eine Primzahl ist und dementsprechend `true` oder `false` zurückgeben.\n",
"\n",
"#### 1. Hinweis:\n",
"1 ist per Definition *keine* Primzahl!\n",
"\n",
"#### 2. Hinweis:\n",
"da TypeScript nur allgemeine Zahltypen versteht, müssen wir hier auch überprüfen, ob es eine ganze Zahl ist! (Tipp: überprüfe, ob der übergebene Parameter durch 1 teilbar ist.)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "50ebf235-210d-439f-8906-4d56f3e70b0a",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function istPrim(p) {\n",
" for (let i = 2; i < p; i++) {\n",
" if (p % i === 0) return false\n",
" }\n",
" return true\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "58073f15-9ba6-4d50-a26e-c83a5002b739",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.3: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(2.052)=false ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(1ms)\u001b[0m\n",
"01.05.3: istPrim(1)=false ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(11ms)\u001b[0m\n",
"01.05.3: istPrim(2)=true ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(3)=true ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(4)=false ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(5)=true ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(72)=false ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: istPrim(97)=true ... \u001b[0m\u001b[32mok\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",
"01.05.3: istPrim(2.052)=false \u001b[0m\u001b[38;5;245m=> <anonymous>:8: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- true\u001b[22m\u001b[39m\n",
"\u001b[32m\u001b[1m+ false\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.16/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[33m9\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n",
"\n",
"01.05.3: istPrim(1)=false \u001b[0m\u001b[38;5;245m=> <anonymous>:11: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- true\u001b[22m\u001b[39m\n",
"\u001b[32m\u001b[1m+ false\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.16/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[33m12\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n",
"\n",
"\u001b[0m\u001b[1m\u001b[37m\u001b[41m FAILURES \u001b[0m\n",
"\n",
"01.05.3: istPrim(2.052)=false \u001b[0m\u001b[38;5;245m=> <anonymous>:8:6\u001b[0m\n",
"01.05.3: istPrim(1)=false \u001b[0m\u001b[38;5;245m=> <anonymous>:11:6\u001b[0m\n",
"\n",
"\u001b[0m\u001b[31mFAILED\u001b[0m | 8 passed | 2 failed \u001b[0m\u001b[38;5;245m(14ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.3\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof istPrim, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(istPrim.length, 1)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(2.052)=false`, () => {\n",
" assertEquals(istPrim(2.052), false)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(1)=false`, () => {\n",
" assertEquals(istPrim(1), false)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(2)=true`, () => {\n",
" assertEquals(istPrim(2), true)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(3)=true`, () => {\n",
" assertEquals(istPrim(3), true)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(4)=false`, () => {\n",
" assertEquals(istPrim(4), false)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(5)=true`, () => {\n",
" assertEquals(istPrim(5), true)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(72)=false`, () => {\n",
" assertEquals(istPrim(72), false)\n",
"})\n",
"Deno.test(`${_nr}: istPrim(97)=true`, () => {\n",
" assertEquals(istPrim(97), true)\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "1bf8c3e7-2fef-46e2-a92a-8d345b4bee5f",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.3 - Primzahl-Doubletten\n",
"\n",
"Eine Primzahl-Doublette besteht aus zwei Primzahlen, deren Differenz gleich 2 ist (z.B. <u>3 und 5</u> oder <u>11 und 13</u> oder <u>1019 und 1021</u>)\n",
"\n",
"Programmiere eine Funktion `primDoublette`, die eine Zahl `min` als Parameter annimmt. Von diesem Wert `min` soll aufsteigend nach der nächsten Primzahl-Doublette gesucht werden.\n",
"\n",
"Zurückgegeben werden soll die kleinere der beiden Zahlen (also in den obigen Beispielen 3 bzw. 11 bzw. 1019)\n",
"\n",
"#### Beispiel:\n",
"\n",
"Wird die Funktion mit dem Paramter `20` aufgerufen, soll als Ergebnis `29` zurückgegeben werden, da <u>29 und 31</u> die kleinsten Primzahl-Doubletten sind, die größer sind als `20`\n",
"\n",
"#### Hinweis:\n",
"\n",
"es soll dabei die Methode `istPrim` aus Aufgabe 01.05.2 weiterverwendet werden!*"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9501c38b-8336-4c06-a09c-917e4d13bce2",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function primDoublette(a) {\n",
" while(!istPrim(a) || !istPrim(a+2)) {\n",
" a++\n",
" }\n",
" return a\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "6ff22110-d320-4bf6-9241-2d87b2891e30",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.3: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(1)=3 ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(10)=11 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(50)=59 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(100)=101 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(1000)=1019 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.3: primDoublette(59108)=59207 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(1ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[1m\u001b[37m\u001b[41m ERRORS \u001b[0m\n",
"\n",
"01.05.3: primDoublette(1)=3 \u001b[0m\u001b[38;5;245m=> <anonymous>:8: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- 1\u001b[22m\u001b[39m\n",
"\u001b[32m\u001b[1m+ 3\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.16/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[33m9\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n",
"\n",
"\u001b[0m\u001b[1m\u001b[37m\u001b[41m FAILURES \u001b[0m\n",
"\n",
"01.05.3: primDoublette(1)=3 \u001b[0m\u001b[38;5;245m=> <anonymous>:8:6\u001b[0m\n",
"\n",
"\u001b[0m\u001b[31mFAILED\u001b[0m | 7 passed | 1 failed \u001b[0m\u001b[38;5;245m(5ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.3\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof primDoublette, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(primDoublette.length, 1)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(1)=3`, () => {\n",
" assertEquals(primDoublette(1), 3)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(10)=11`, () => {\n",
" assertEquals(primDoublette(10), 11)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(50)=59`, () => {\n",
" assertEquals(primDoublette(50), 59)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(100)=101`, () => {\n",
" assertEquals(primDoublette(100), 101)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(1000)=1019`, () => {\n",
" assertEquals(primDoublette(1000), 1019)\n",
"})\n",
"Deno.test(`${_nr}: primDoublette(59108)=59207`, () => {\n",
" assertEquals(primDoublette(59108), 59207)\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "f10e6386-bec1-43b9-8a45-15dc6bd9a4a4",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.4 - Pythagoräische Tripel\n",
"\n",
"Ein pythagoräisches Tripel besteht aus drei ganzen Zahlen `a`, `b` und `c`, die zusammen die Bedingung $a^2+b^2=c^2$ erfüllen, wie z.B. (3,4,5)\n",
"\n",
"Programmiere eine Funktion `pytTripel` ohne Parameter, die sämtliche Pythagoräischen Tripel auf der Konsole ausgibt für $a,b,c \\leq 100$\n",
"\n",
"Außerdem soll gelten: $a\\leq b$. Die Ausgabe soll leerzeichengetrennt erfolgen, also\n",
"```\n",
"3 4 5\n",
"5 12 13\n",
"6 8 10\n",
"[...]\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "eb8318be-02b9-44d5-aa1e-15455ea74b9f",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function pytTripel() {\n",
" for (let a = 1; a <= 100; a++) {\n",
" for (let b = 1; b <= 100; b++) {\n",
" for (let c = 1; c <= 100; c++) {\n",
" if (a*a + b*b === c*c) console.log(a + ' ' + b + ' ' + c)\n",
" }\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "8473f71c-3e33-4321-8ed4-d5fdd85b946b",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.4: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.4: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.4: pytTripel() ... \u001b[0m\u001b[31mFAILED\u001b[0m \u001b[0m\u001b[38;5;245m(7ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[1m\u001b[37m\u001b[41m ERRORS \u001b[0m\n",
"\n",
"01.05.4: pytTripel() \u001b[0m\u001b[38;5;245m=> <anonymous>:8:6\u001b[0m\n",
"\u001b[0m\u001b[1m\u001b[31merror\u001b[0m: AssertionError: Values are not equal: nicht korrekte Anzahl ausgegeben\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- 104\u001b[22m\u001b[39m\n",
"\u001b[32m\u001b[1m+ 52\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.16/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[33m12\u001b[0m:\u001b[0m\u001b[33m3\u001b[0m\n",
"\n",
"\u001b[0m\u001b[1m\u001b[37m\u001b[41m FAILURES \u001b[0m\n",
"\n",
"01.05.4: pytTripel() \u001b[0m\u001b[38;5;245m=> <anonymous>:8:6\u001b[0m\n",
"\n",
"\u001b[0m\u001b[31mFAILED\u001b[0m | 2 passed | 1 failed \u001b[0m\u001b[38;5;245m(11ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.4\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof pytTripel, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(pytTripel.length, 0)\n",
"})\n",
"Deno.test(`${_nr}: pytTripel()`, () => {\n",
" console.start(false)\n",
" pytTripel()\n",
" let result = console.end().split(\"\\n\")\n",
" \n",
" assertEquals(result.length, 52, \"nicht korrekte Anzahl ausgegeben\")\n",
" for(let i = 0; i < result.length; i++) {\n",
" const row = result[i].split(\" \").map(x => parseInt(x))\n",
" assertEquals(row[0]*row[0] + row[1]*row[1], row[2]*row[2], \"ungültiges Tripel ausgegeben\")\n",
"\n",
" if (i < result.length - 1) {\n",
" const next = result[i + 1].split(\" \").map(x => parseInt(x))\n",
" assertEquals(row[0] === next[0] && row[1] === next[1], false, \"zwei gleiche Tripel ausgegeben\")\n",
" }\n",
" }\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "1489f365-a169-46d0-9349-b482db1d5d75",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.5 - lineare Nullstelle\n",
"\n",
"Schreibe eine Funktion `linNst`, die die Nullstelle einer linearen Funktion $f(x) = m\\cdot x + c$ berechnet.\n",
"\n",
"Als Parameter sollen `m` und `c` eingegeben werden, zurückgegeben werden soll der `x`-Wert der Nullstelle.\n",
"\n",
"#### mathematischer Hinweis:\n",
"Eine lineare Funktion hat immer eine Nullstelle, außer mit $a=0$ und $b\\neq0$. Bei $a=0$ und $b=0$ gibt es unendlich viele Nullstellen. Diese Sonderfälle müssen hier nicht beachtet werden!\n",
"\n",
"#### Tipp:\n",
"Für eine Nullstelle gilt $y=0$. Anschließend kann nach $x$ umgeformt werden."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1faf34b0-553d-49ae-87c2-92c335b97aab",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function linNst(m, c) {\n",
" return -c/m\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "7a6012f7-8be8-4b6b-aa28-06d9dc9d4bdb",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.5: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: linNst(1,0)=0 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: linNst(5,0)=0 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: linNst(2,4)=-2 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: linNst(4,2)=-0.5 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.5: linNst(-0.6,9)=15 ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[32mok\u001b[0m | 7 passed | 0 failed \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.5\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof linNst, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(linNst.length, 2)\n",
"})\n",
"Deno.test(`${_nr}: linNst(1,0)=0`, () => {\n",
" assertEquals(linNst(1,0), 0)\n",
"})\n",
"Deno.test(`${_nr}: linNst(5,0)=0`, () => {\n",
" assertEquals(linNst(5,0), 0)\n",
"})\n",
"Deno.test(`${_nr}: linNst(2,4)=-2`, () => {\n",
" assertEquals(linNst(2,4), -2)\n",
"})\n",
"Deno.test(`${_nr}: linNst(4,2)=-0.5`, () => {\n",
" assertEquals(linNst(4,2), -0.5)\n",
"})\n",
"Deno.test(`${_nr}: linNst(-0.6,9)=15`, () => {\n",
" assertEquals(linNst(-0.6,9), 15)\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "e420032b-ed4d-4e4e-80f8-0b14d5f0cc2b",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.6 - quadratische Nullstellen\n",
"\n",
"Äquivalent zur Aufgabe 01.05.5 soll nun die Funktion `quadNst` programmiert werden, die die Nullstellen einer quadratischen Funktion $f(x)=a\\cdot x^2+b\\cdot x + c$ berechnet.\n",
"\n",
"Als Parameter sollen die Werte für $a$, $b$ und $c$ eingegeben werden.\n",
"\n",
"Zurückgegeben werden sollen *alle* möglichen Nullstellen.\n",
"\n",
"#### Hinweis:\n",
"\n",
"Um mehrere Werte zurückgeben zu können, kann folgende Schreibweise genutzt werden:\n",
"* `return []` gibt ein leeres Ergebnis zurück (= keine Nullstelle)\n",
"* `return [x1]` gibt ein Ergebnis mit einer Nullstelle $x_1$ zurück\n",
"* `return [x1, x2]` gibt ein Ergebnis mit zwei Nullstellen $x_1$ und $x_2$ zurück.\n",
"\n",
"#### 2. Hinweis:\n",
"\n",
"Die Wurzel eines Wertes $D$ lässt sich mit `Math.sqrt(D)` berechnen.\n",
"\n",
"#### mathematischer Hinweis:\n",
"\n",
"Die Nullstellen einer quadratischen Funktion berechnet man mit der Mitternachtsformel. Die Diskriminante (= Radikand = Wert unter der Wurzel) entscheidet darüber, wie viele Nullstellen es gibt."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "a49e6ce5-ba34-406c-ab1a-99745a09e468",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function quadNst(a, b, c) {\n",
" let D = b*b - 4*a*c\n",
"\n",
" if (D < 0) return []\n",
" if (D === 0) return [-b/(2*a)]\n",
"\n",
" let x1 = (-b - Math.sqrt(D)) / (2*a)\n",
" let x2 = (-b + Math.sqrt(D)) / (2*a)\n",
"\n",
" return [x1,x2]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "09b15d57-2e91-45d4-ae06-e4872bbfc777",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.6: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(1,-5,6)=[2,3] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(1,-3,2)=[1,2] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(2,-8,6)=[1,3] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(3,-12,9)=[1,3] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(-1,7,-12)=[3,4] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(1,-4,4)=[2] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(-2,8,-8)=[2] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(3,6,3)=[-1] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(1,2,5)=[] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6: quadNst(2,4,6)=[] ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[32mok\u001b[0m | 12 passed | 0 failed \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.6\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof quadNst, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(quadNst.length, 3)\n",
"})\n",
"Deno.test(`${_nr}: quadNst(1,-5,6)=[2,3]`, () => {\n",
" const res = quadNst(1,-5,6)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 2)\n",
" assertEquals(res.sort(), [2,3])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(1,-3,2)=[1,2]`, () => {\n",
" const res = quadNst(1,-3,2)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 2)\n",
" assertEquals(res.sort(), [1,2])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(2,-8,6)=[1,3]`, () => {\n",
" const res = quadNst(2,-8,6)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 2)\n",
" assertEquals(res.sort(), [1,3])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(3,-12,9)=[1,3]`, () => {\n",
" const res = quadNst(3,-12,9)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 2)\n",
" assertEquals(res.sort(), [1,3])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(-1,7,-12)=[3,4]`, () => {\n",
" const res = quadNst(-1,7,-12)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 2)\n",
" assertEquals(res.sort(), [3,4])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(1,-4,4)=[2]`, () => {\n",
" const res = quadNst(1,-4,4)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 1)\n",
" assertEquals(res.sort(), [2])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(-2,8,-8)=[2]`, () => {\n",
" const res = quadNst(-2,8,-8)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 1)\n",
" assertEquals(res.sort(), [2])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(3,6,3)=[-1]`, () => {\n",
" const res = quadNst(3,6,3)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 1)\n",
" assertEquals(res.sort(), [-1])\n",
"})\n",
"Deno.test(`${_nr}: quadNst(1,2,5)=[]`, () => {\n",
" const res = quadNst(1,2,5)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 0)\n",
"})\n",
"Deno.test(`${_nr}: quadNst(2,4,6)=[]`, () => {\n",
" const res = quadNst(2,4,6)\n",
" assertEquals(Array.isArray(res), true)\n",
" assertEquals(res.length, 0)\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "a213d25b-b301-4cd9-9ada-9ad914bfff0f",
"metadata": {
"editable": false,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Aufgabe 01.05.7 - Sonntage zählen\n",
"Die folgenden Informationen sind gegeben:\n",
"* der 1. Januar 1900 war ein Montag\n",
"* 30 Tage haben folgende Monate: April, Juni, September und November\n",
"* der Februar hat 28 Tage, in Schaltjahren 29 Tage\n",
"* alle anderen Monate haben 31 Tage\n",
"\n",
"## Teilaufgabe 1:\n",
"Programmiere eine Funktion `istSchaltjahr`, die als Parameter eine Jahreszahl bekommt und `true` oder `false` zurückgibt.\n",
"\n",
"## Teilaufgabe 2:\n",
"Programmiere eine Funktion `tageImMonat`, die als Parameter Monat und Jahr übergeben bekommt und die Anzahl der Tage in diesem Monat zurückgibt\n",
"\n",
"## Teilaufgabe 3:\n",
"* Programmiere eine Methode `ausgabe`, die mithilfe von Schleifen zunächst alle Datumsangaben vom 1.1.1900 bis zum 31.12.2000 ausgibt, z.B.\n",
"```\n",
"1.1.1900\n",
"2.1.1900\n",
"3.1.1900\n",
"[...]\n",
"30.12.1900\n",
"31.12.1900\n",
"```\n",
"\n",
"Ergänze die Ausgabe anschließend um den Wochentag, z.B.\n",
"```\n",
"1.1.1900 Montag\n",
"2.1.1900 Dienstag\n",
"[...]\n",
"```\n",
"\n",
"#### Hinweis:\n",
"Das Ergebnis dieser Methode wird nicht überprüft!\n",
"\n",
"## Teilaufgabe 4:\n",
"Programmiere eine Funktion `sonntage`, die als Parameter eine Jahreszahl übergeben bekommt und die Sonntage vom 1.1.1900 bis zum 31.12. des als Parameter angegebenen Jahres **zählt** und die Anzahl zurückgibt.\n",
"\n",
"#### Beispiel:\n",
"* `sonntage(1900)` zählt die Sonntage zwischen dem 1.1.1900 und 31.12.1900 und gibt als Ergebnis `52` zurück\n",
"* `sonntage(2000)` gibt als Ergebnis `5270` zurück"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "19f1f81e-fb48-4fee-a2a3-e047a254e521",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"function istSchaltjahr(jahr) {\n",
" if (jahr % 400 === 0) return true\n",
" if (jahr % 100 === 0) return false\n",
" if (jahr % 4 === 0) return true\n",
" return false\n",
"}\n",
"\n",
"function tageImMonat(monat,jahr) {\n",
" if (monat === 4 || monat === 6 || monat === 9 || monat === 11) return 30\n",
" if (monat === 2) {\n",
" if (istSchaltjahr(jahr)) return 29\n",
" return 28\n",
" }\n",
" return 31\n",
"}\n",
"\n",
"/*\n",
"function ausgabe(jahr) {\n",
" let tag = 0 // 0: Montag, 1: Dienstag, ..., 6: Sonntag\n",
" for (let y = 1900; y <= jahr; y++) {\n",
" for (let m = 1; m <= 12; m++) {\n",
" for (let d = 1; d <= tageImMonat(m,y); d++) {\n",
" console.log(`${d}.${m}.${y}: ${tag}`)\n",
" tag = (tag + 1) % 7\n",
" }\n",
" }\n",
" }\n",
" return anzahl\n",
"}\n",
"*/\n",
"\n",
"function sonntage(jahr) {\n",
" let anzahl = 0\n",
" let tag = 0 // 0: Montag, 1: Dienstag, ..., 6: Sonntag\n",
" for (let y = 1900; y <= jahr; y++) {\n",
" for (let m = 1; m <= 12; m++) {\n",
" for (let d = 1; d <= tageImMonat(m,y); d++) {\n",
" if (tag === 6) anzahl++;\n",
" tag = (tag + 1) % 7\n",
" }\n",
" }\n",
" }\n",
" return anzahl\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "bb3c5d55-fe18-4445-8cb7-734a9e19768b",
"metadata": {
"editable": false,
"jupyter": {
"source_hidden": true
},
"scrolled": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01.05.6.1: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.1: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.1: istSchaltjahr ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.2: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.2: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.2: tageImMonat ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.4: function ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.4: Parameter ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(0ms)\u001b[0m\n",
"01.05.6.4: sonntage ... \u001b[0m\u001b[32mok\u001b[0m \u001b[0m\u001b[38;5;245m(10ms)\u001b[0m\n",
"\n",
"\u001b[0m\u001b[32mok\u001b[0m | 9 passed | 0 failed \u001b[0m\u001b[38;5;245m(11ms)\u001b[0m\n"
]
}
],
"source": [
"let _nr = \"01.05.6.1\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof istSchaltjahr, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(istSchaltjahr.length, 1)\n",
"})\n",
"Deno.test(`${_nr}: istSchaltjahr`, () => {\n",
" assertEquals(istSchaltjahr(0), true)\n",
" assertEquals(istSchaltjahr(2024), true)\n",
" assertEquals(istSchaltjahr(2025), false)\n",
" assertEquals(istSchaltjahr(1900), false)\n",
" assertEquals(istSchaltjahr(2000), true)\n",
"})\n",
"_nr = \"01.05.6.2\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof tageImMonat, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(tageImMonat.length, 2)\n",
"})\n",
"Deno.test(`${_nr}: tageImMonat`, () => {\n",
" assertEquals(tageImMonat(1,1900), 31)\n",
" assertEquals(tageImMonat(2,1900), 28)\n",
" assertEquals(tageImMonat(2,2000), 29)\n",
" assertEquals(tageImMonat(3,1964), 31)\n",
" assertEquals(tageImMonat(4,1786), 30)\n",
"})\n",
"_nr = \"01.05.6.4\"\n",
"Deno.test(`${_nr}: function`, () => {\n",
" assertEquals(typeof sonntage, 'function')\n",
"})\n",
"Deno.test(`${_nr}: Parameter`, () => {\n",
" assertEquals(sonntage.length, 1)\n",
"})\n",
"Deno.test(`${_nr}: sonntage`, () => {\n",
" assertEquals(sonntage(1900), 52)\n",
" \n",
" const a = (new Date(\"1900-01-01\")).getTime()\n",
" for (let i = 0; i < 100; i++) {\n",
" const y = Math.round(1900 + Math.random()*125)\n",
" const b = (new Date(`${y+1}-01-01`)).getTime()\n",
" const c = b-a\n",
" const s = Math.floor(c/3600000/24/7)\n",
"\n",
" assertEquals(sonntage(y), s)\n",
" }\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ed3355f-0181-47f6-9a5b-13d0ee473dc8",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}