diff options
72 files changed, 1699 insertions, 30 deletions
@@ -15,6 +15,8 @@ test_loesung.pdf sequence.pdf *print.pdf *_printout.pdf +moodle-quiz.xml +!pandoc/templates/moodle-quiz.xml .build/ .owncloudsync.log* .sync_journal.db* diff --git a/.gitmodules b/.gitmodules index 2befda25..f6bfc511 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@ [submodule "Info/7/4/gallery"] path = Info/7/4/gallery url = https://git.muhq.space/schule/scratch-gallery +[submodule "Info/11/NTG/4/Perzeptron-Implementierung/BlueJ_Projekt"] + path = Info/11/NTG/4/Perzeptron-Implementierung/BlueJ_Projekt + url = https://git.muhq.space/schule/perzeptron diff --git a/.vis-lspc-settings.json b/.vis-lspc-settings.json index 78a7a59c..e79b5313 100644 --- a/.vis-lspc-settings.json +++ b/.vis-lspc-settings.json @@ -1,9 +1,23 @@ -{"ltex": - {"latex": - { - "commands": {"\\mintinline{}//": "dummy", "\\faIcon{}": "ignore"}, - "environments": {"minted": "ignore"} +{ + "ltex": { + "latex": { + "commands": { + "\\mintinline{}//": "dummy", + "\\faIcon{}": "ignore" + }, + "environments": { + "minted": "ignore" + } + "dictionary": { + "de-DE": [] + }, } }, - "dictionary": {"de-DE": []} + "Lua": { + "diagnostics": { + "globals": [ + "pandoc" + ] + } + } } diff --git a/Info/10/2/JumpNRun/.vis-lspc-settings.json b/Info/10/2/JumpNRun/.vis-lspc-settings.json index 9408be41..51bc4d61 100644 --- a/Info/10/2/JumpNRun/.vis-lspc-settings.json +++ b/Info/10/2/JumpNRun/.vis-lspc-settings.json @@ -5,6 +5,6 @@ { "commands": {"\\texttt{}": "dummy"} }, - "dictionary": {"de-DE": ["Snake"]} + "dictionary": {"de-DE": ["JumpNRun"]} } } diff --git a/Info/11/MUG_SWG_SG/1/Bedingte_Anweisungen/slides.md b/Info/11/MUG_SWG_SG/1/Bedingte_Anweisungen/slides.md index 91cd8646..7945783b 100644 --- a/Info/11/MUG_SWG_SG/1/Bedingte_Anweisungen/slides.md +++ b/Info/11/MUG_SWG_SG/1/Bedingte_Anweisungen/slides.md @@ -127,10 +127,10 @@ Botty hat die Aufgabe Müll einzusammeln. Dazu irrt er durch dunkle Gänge solange bis er den **Müll** [berührt]{.underline}. \pause -Damit sein Leben nicht so traurig ist sammelt er alle **Blumen** ein die er auf dem Weg findet. +Damit sein Leben nicht so traurig ist sammelt er alle **Blumen** ein, die er auf dem Weg findet. \pause -Nur leider hat Botty vergessen wie er sich fortbewegen soll. +Nur leider hat Botty vergessen, wie er sich fortbewegen soll. Hilf ihm indem du seine Bewegung programmierst! ## \faIcon{desktop} Arbeitsauftrag @@ -142,11 +142,11 @@ Hilf ihm indem du seine Bewegung programmierst! ## Laufen oder nicht Laufen? -Wenn Botty gegen eine Wand rumpelt wird er zurückgesetzt und muss von Vorne anfangen. +Wenn Botty gegen eine Wand rumpelt, wird er zurückgesetzt und muss von Vorne anfangen. -Was muss Botty machen um die Kurve zu kriegen und wann? +Was muss Botty machen, um die Kurve zu kriegen und wann? -## Bedingte Anweisungen +## Bedingte Anweisungen {.t} Mit einer **bedingten Anweisung** kann man Sequenzen in Abhängigkeit einer Bedingung ausführen. @@ -175,7 +175,7 @@ Mit einer **bedingten Anweisung** kann man Sequenzen in Abhängigkeit einer Bedi :::: :::: {.column width=50%} -\only<5->{ Anweisungen die nur ausgeführt werden wenn eine Bedingung erfüllt ist nennt man \boldred{einseitig bedingte Anweisung}. } +\only<5->{ Anweisungen die nur ausgeführt werden, wenn eine Bedingung erfüllt ist, nennt man \boldred{einseitig bedingte Anweisung}. } :::: ::: @@ -192,7 +192,7 @@ Mit einer **bedingten Anweisung** kann man Sequenzen in Abhängigkeit einer Bedi :::: ::: -## \faIcon{desktop} Arbeitsauftrag: Level 1 - 10 min +## \faIcon{desktop} Arbeitsauftrag: Level 1 \hfill 10 min ::: {.columns align=center} :::: {.column width=70%} @@ -215,7 +215,7 @@ verwendest. \vspace{0.5cm} Schaffst du auch beide Kurven in Level 2? -## \faIcon{desktop} Arbeitsauftrag: Level 3 - 15 min +## \faIcon{desktop} Arbeitsauftrag: Level 3 \hfill 15 min ::: {.columns align=center} :::: {.column width=70%} diff --git a/Info/11/MUG_SWG_SG/1/LogischeOperationen/slides.md b/Info/11/MUG_SWG_SG/1/LogischeOperationen/slides.md index 9a370237..9bf977ae 100644 --- a/Info/11/MUG_SWG_SG/1/LogischeOperationen/slides.md +++ b/Info/11/MUG_SWG_SG/1/LogischeOperationen/slides.md @@ -61,7 +61,7 @@ Anweisungen die nur ausgeführt werden, wenn eine Bedingung erfüllt ist, nennt ## \faIcon{pencil-alt} Arbeitsauftrag: Ampelschaltung \hfill 7 min -Entwerfe einen Algorithmus auf Papier der eine Ampelschaltung realisiert. +Entwerfe einen Algorithmus auf Papier, der eine Ampelschaltung realisiert. * Welche Phasen hat eine Ampel? * Von welcher Phase wird in welche andere gewechselt? @@ -93,7 +93,7 @@ slides-operationen.md Parkgebühren sind in der Regel zeitabhängig. \faIcon{pencil-alt} Entwerfe einen Algorithmus, der abhängig von der **Parkdauer** den **Preis** ausgibt. \faIcon{desktop} Übertrage deinen Algorithmus in ein Snap! Programm. -Verwende logische Operationen um die Ausgabe zu bestimmen. +Verwende logische Operationen, um die Ausgabe zu bestimmen. Folgende Preisstaffelung gilt: @@ -105,7 +105,7 @@ bis zu 4 Stunden & 5€ \\ Tageskarte & 8€ \\ \end{tabular} -[**Zusatz:**]{.underline} Wenn die Eingabe keine Zahl ist gib "Ungültige Parkdauer!" aus. +[**Zusatz:**]{.underline} Wenn die Eingabe keine Zahl ist, gib "Ungültige Parkdauer!" aus. \begin{tikzpicture}[overlay, remember picture] \node[anchor=west, xshift=8cm, yshift=3cm, rotate=7.5] at (current page.south west) {\includegraphics[keepaspectratio, width=4cm]{img/ask_block.png}}; diff --git a/Info/11/NTG/4/Perzeptron-Implementierung/BlueJ_Projekt b/Info/11/NTG/4/Perzeptron-Implementierung/BlueJ_Projekt new file mode 160000 +Subproject 3336d3a0f6b63cc5abe50ad130d067ca16b2b71 diff --git a/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron Vorlage b/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron Vorlage new file mode 120000 index 00000000..e19fe1e2 --- /dev/null +++ b/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron Vorlage @@ -0,0 +1 @@ +../../../4/Copyrighted/5.3 Perzeptron/5.3.3/ImplementierungPerzeptron Vorlage/
\ No newline at end of file diff --git a/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron.mp4 b/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron.mp4 Binary files differnew file mode 100644 index 00000000..e69ae507 --- /dev/null +++ b/Info/11/NTG/4/Perzeptron-Implementierung/ImplementierungPerzeptron.mp4 diff --git a/Info/11/NTG/4/Perzeptron-Implementierung/slides.md b/Info/11/NTG/4/Perzeptron-Implementierung/slides.md new file mode 100644 index 00000000..65cef057 --- /dev/null +++ b/Info/11/NTG/4/Perzeptron-Implementierung/slides.md @@ -0,0 +1,23 @@ +## \faIcon{desktop} Arbeitsauftrag: Implementierung künstliches Neuron \hfill 25min + +Lade die Perzeptron Vorlage herunter, [entpacke]{.underline} sie und öffne das Projekt in BlueJ. + +\let\tightlist\relax +1. Attribute des Perzeptrons + 1. Ergänze die Attribute der Klasse `Perzeptron`, die zur Berechnung der Ausgabe benötigt werden. + 2. Implementiere einen Konstruktor, mit dem die Attributwerte festgelegt werden können +2. Vervollständige die Methode `berechne(...)`{.java} +3. Teste deine Implementierung mit der Methode `visualisiere` der Klasse `Labor` und den in der Vorlage enthaltenen Daten (`daten.csv`). + +\begin{tcolorbox}[title=Tipp] +Die Vorlage entält ein Video, das die Benutzung der Klasse `Labor` zeigt. +\end{tcolorbox}[title=Tipp] + +## \faIcon{desktop} Arbeitsauftrag: Implementierung Perzeptron \hfill 25min + +\let\tightlist\relax +4. Implementierung der Delta-Lernregel + 1. Ergänze das Attribute der Klasse `Perzeptron`, das zum Lernen benötigt wird. + 2. Implementiere einen Konstruktor, der nur den Attributwert des neuen Attributs festlegt. + 3. Vervollständige die Methode `lerne(...)`{.java}. +5. Teste deine Implementierung mit der Klasse `Labor` und den in der Vorlage enthaltenen Daten (`daten.csv`). diff --git a/Info/12/Listen/Kompositum/.gitignore b/Info/12/Listen/Kompositum/.gitignore new file mode 100644 index 00000000..dd6b8c3d --- /dev/null +++ b/Info/12/Listen/Kompositum/.gitignore @@ -0,0 +1,2 @@ +slides-wiederholung.pdf +slides-wiederholung.pptx diff --git a/Info/12/Listen/Kompositum/slides-wiederholung.md b/Info/12/Listen/Kompositum/slides-wiederholung.md new file mode 100644 index 00000000..68e6c5c2 --- /dev/null +++ b/Info/12/Listen/Kompositum/slides-wiederholung.md @@ -0,0 +1,91 @@ +--- +author: Florian Fischer +theme: metropolis +aspectratio: 169 +--- + +## \faIcon{comments} Wiederholung: Allgemeine Liste \hfill 1/3 + +Nimm Stellung zu folgender Aussage: \vspace{0.25cm} + +> Bei jeder Listen-Implementierung, müssen immer die Klassen für die Daten-Objekte im Code angepasst werden. + +::: {.columns} +:::: {.column width=50%} +```java +class Praxis { + ... + Patient find(...) {} +} +class Knoten { + Knoten next; + Patient daten; + ... +} +``` +:::: + +:::: {.column width=50%} +```java +class CallCenter { + ... + Kunde find(...) {} +} +class Knoten { + Knoten next; + Kunde daten; + ... +} +``` +:::: +::: + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (4, 4.3) {\large \boldred{Falsch}}; +\end{tikzpicture} + +Generics! + +## \faIcon{comments} Wiederholung: Find-Aufruf \hfill 2/3 + +Nimm Stellung zu folgender Aussage: \vspace{0.5cm} + +> Folgende Meldung ist normal, beim Versuch ein Element in einer leeren Liste zu finden. +> `NullPointerException in thread main thread: Auf ein Attribut/eine Methode von null kann nicht zugegriffen werden.` + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (4, 0.3) {\large \boldred{Falsch}}; +\end{tikzpicture} + +\pause + +Eine **NullPointerException** ist ein \boldred{Programmabsturz}, da nicht auf ein nicht vorhandenes Objekt zugegriffen werden kann. + +## \faIcon{comments} Wiederholung: Find \hfill 3/3 + +Nimm Stellung zu folgender Aussage: \vspace{0.5cm} + +> Folgender Code implementiert die rekursive Methode, um einen Eintrag in einer Liste zu finden. + +```java +Entry find(Data tofind) { + if (data == tofind) // Ich bin gesucht + return this.data; + + return next.find(tofind); // Ich frage den Nächsten + } +``` + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (4, 0.3) {\large \boldred{Falsch}}; +\end{tikzpicture} + +\pause + +Wenn es keinen Nächsten mehr gibt, stürzt das Programm ab. diff --git a/Info/12/Listen/Kompositum/slides.md b/Info/12/Listen/Kompositum/slides.md new file mode 100644 index 00000000..e06cedb3 --- /dev/null +++ b/Info/12/Listen/Kompositum/slides.md @@ -0,0 +1,486 @@ +--- +author: Florian Fischer +theme: metropolis +aspectratio: 169 +--- + +```{.include} +slides-wiederholung.md +``` + +## {.standout} + +Je weniger benötigte Bedingungen, desto einfacher ist der Code und desto weniger Fehler sind möglich. + +## Listenabschluss + +Wie werden wir die Überprüfung des Listenendes los? + +::: {.columns} +:::: {.column width=50%} +```java +if (first == null) ... +``` +:::: + +:::: {.column width=50%} +```java +if (next == null) ... +``` +:::: +::: + +### \faIcon{lightbulb} Idee + +\pause + +Wir nutzen ein besonderes Abschluss-Objekt, das immer am Ende steht. + +## Listenabschluss: Objektdiagramm + +\begin{tikzpicture} + \begin{object}[text width=3cm]{liste}{0,0} + \attribute{anfang} + \end{object} + + \begin{object}[text width=3.5cm]{node1}{-5,-2.5} + \attribute{next} + \attribute{daten} + \end{object} + + \begin{object}[text width=3.5cm]{daten1}{-5,-4.5} + \attribute{inhalt} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (d1) at (-5.7, -3.85) {}; + \draw[line width=2pt, draw=blue!80] (d1) edge [bend left=15, -latex] (daten1); + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-5.8, -3.3) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (-2, -2.75); + + \begin{object}[text width=3.5cm]{node2}{0,-2.5} + \attribute{next} + \attribute{daten} + \end{object} + + \begin{object}[text width=3.5cm]{daten2}{0,-4.5} + \attribute{inhalt} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (d2) at (-0.7, -3.85) {}; + \draw[line width=2pt, draw=blue!80] (d2) edge [bend left=15, -latex] (daten2); + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-0.8, -3.3) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (3, -2.75); + + \begin{object}[fill=white!30!blue, text width=3.5cm]{abschluss}{5,-2.5} + \end{object} + + \only<2->{ + \node[text width=4cm, below=of abschluss] {Jetzt hat jeder Knoten immer einen Nachfolger.}; + } + + % Anfang + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (anfang) at (-1.6, -0.81) {}; + \draw[line width=2pt, -latex, draw=blue!80] (anfang) edge [bend right=25] (-5.1, -2.45); +\end{tikzpicture} + +## Listenabschluss: Klassendiagramm + +::: {.columns} +:::: {.column width=50%} +\begin{tikzpicture} + \node[draw] (list) {\large Liste}; + \node[draw] (leaf) at (-1.5, -2) {\large Abschluss}; + \node[draw] (node) at (1.5, -2) {\large Knoten}; + + \draw[red] (list) edge[sloped, above] node {anfang} (leaf); + \draw[red] (list) edge[sloped, below] node {anfang} (node); + \draw (node.north) |- ($(node.north) + (0, 0.5cm)$) edge[above] node {\textcolor{red}{0,1 < Nachfolger}} ($(node.north) + (2.5cm, 0.5cm)$); + \draw ($(node.north) + (2.5cm, 0.5cm)$) |- (node.east); +\end{tikzpicture} +:::: + +:::: {.column width=50%} +```java +class Liste { + // Kann keinen Abschluss speichern! + Knoten first; + // Kann keinen Knoten speichern! + Abschluss first; +} +``` +:::: +::: + +Ein Referenzattribut kann nicht mehrere Datentypen haben! + +## Listenabschluss: Klassendiagramm Polymorphismus + +### \faIcon{lightbulb} Idee + +Eine gemeinsame Oberklasse! + +::: {.columns} +:::: {.column width=50%} +\begin{tikzpicture} + \node[draw] (list) {\large Liste}; + \node[draw, text width=2.5cm, align=center] (abstract) at (0, -1.5) {\large ListenElement \newline <abstract>}; + \node[draw] (leaf) at (-1.5, -3) {\large Abschluss}; + \node[draw] (node) at (1.5, -3) {\large Knoten}; + + \draw (list) edge[left] node {anfang} (abstract); + \draw[-{Triangle[open, scale=1.5]}] (leaf) -- (abstract); + \draw[-{Triangle[open, scale=1.5]}] (node) -- (abstract); + \draw ($(node.north) + (0.5cm, 0)$) |- (abstract.east); +\end{tikzpicture} +:::: + +:::: {.column width=50%} +```java +class Liste { + // Abschluss oder Knoten + ListenElement first; +} +``` +:::: +::: + +\vspace{0.25cm} +Ein Referenzattribut auf eine Oberklasse kann Objekte aller Unterklassen speichern. + +## Kompositum + +:::{.env .merke} +Das \boldred{Kompositum}, ist ein **Entwurfsmuster** (bewährte Lösung), bei dem primitive Objekte sowie ihre **Komposition** von einer gemeinsamen abstrakten Klasse erben. +Die Vererbung ermöglicht, alle Objekte gleich zu behandeln. +::: + +::: {.columns} +:::: {.column width=50%} +**Beispiel: Liste** `\\[0.25cm]`{=latex} + +\begin{tikzpicture} + \node[draw, text width=2.5cm, align=center] (abstract) at (0, -1.5) {\large Listeneintrag \newline <abstract>}; + \node[draw] (leaf) at (-1.5, -3) {\large Abschluss}; + \node[draw] (node) at (1.5, -3) {\large Eintrag}; + + \draw[-{Triangle[open, scale=1.5]}] (leaf) -- (abstract); + \draw[-{Triangle[open, scale=1.5]}] (node) -- (abstract); + \draw ($(node.north) + (0.5cm, 0)$) |- (abstract.east); +\end{tikzpicture} +:::: + +:::: {.column width=50%} +**Beispiel: Dateisystem** `\\[0.25cm]`{=latex} + +\begin{tikzpicture} + \node[draw, text width=3cm, align=center] (abstract) at (0, -1.5) {\large Verzeichniseintrag \newline <abstract>}; + \node[draw] (leaf) at (-1.5, -3) {\large Datei}; + \node[draw] (node) at (1.5, -3) {\large Verzeichnis}; + + \draw[-{Triangle[open, scale=1.5]}] (leaf) -- (abstract); + \draw[-{Triangle[open, scale=1.5]}] (node) -- (abstract); + \draw ($(node.north) + (0.5cm, 0)$) |- (abstract.east); +\end{tikzpicture} +:::: +::: + + +## Liste mit Kompositum +::: {.columns} +:::: {.column width=40%} +\begin{tikzpicture} +\begin{abstractclass}[text width=5cm]{Listenelement}{0,0} + \operation{naechsterSetzen(Listenelement)} + \operation{naechsterGeben(): Listenelement} + \operation{datenGeben(): Daten} +\end{abstractclass} +\end{tikzpicture} +:::: + +:::: {.column width=60%} +### \faIcon{desktop} Arbeitsauftrag: Neue Liste \hfill 10 min + +Erstelle in einem **neuen** Workspace, die fünf Klassen: + +* `Liste` +* `Listenelement` +* `Eintrag` +* `Abschluss` +* `Daten` + +... mit den dir bekannten Attributen, Methoden und Vererbung. + +\textit{Welche Daten die Liste verwaltet, ist dir überlassen.} + +:::: +::: + +## Liste mit Kompositum: Minimal Version \hfill 1/2 + +```java +class Liste { + Listenelement anfang; +} +abstract class Listenelement { + abstract void naechsterSetzen(ListenElement n); + abstract ListenElement naechsterGeben(); + abstract Daten datenGeben(); +} +class Abschluss extends Listenelement { + void naechsterSetzen(ListenElement n) {} + ListenElement naechsterGeben() { return this; } + Daten datenGeben() { return null; } +} +``` + +## Liste mit Kompositum: Minimal Version \hfill 2/2 + +```java +class Eintrag extends Listenelement { + Listenelement nachfolger; + Daten daten; + + Eintrag(Daten d) { daten = d; } + + void naechsterSetzen(ListenElement n) { nachfolger = n; } + ListenElement naechsterGeben() { return nachfolger; } + Daten datenGeben() { return daten; } +} +class Daten {} +``` + +## {.standout} + +Ist das jetzt wirklich besser? + +## Vergleich: `getLength()` + +::: {.columns align=center} +:::: {.column width=47.5%} +```java +class Liste { // [...] + int getLength() { + if (first == null) return 0; + return first.getLength(); + } +} +class Eintrag { // [...] + int getLength() { + if (next == null) return 0; + return next.getLength() + 1; + } +} +``` +:::: + +:::: {.column width=5%} +\boldred{vs.} +:::: + +:::: {.column width=47.5%} +```java +class Liste { // [...] + int getLength() { + return first.getLength(); + } +} +class Eintrag { // [...] + int getLength() { + return next.getLength() + 1; + } +} +class Abschluss { + int getLength() { + return 0; + } +} +``` +:::: +::: + +## \faIcon{hands-helping} Arbeitsauftrag: Methoden mit Kompositum \hfill 15 min + +Sucht euch zu zweit eine Methode aus. + +* `void vorneEinfuegen(Daten)` +* `void hintenEinfuegen(Daten)` +* `Daten vorneEntfernen()` +* `Daten endeGeben()` +* `void elementEntfernen(Daten)` +* `Daten hintenEntfernen()` + +Erarbeitet einen Algorithmus für eure Liste mit Kompositum: + +1. Visualisiert euren Algorithmus mit Sequenz-/ oder Objektdiagrammen. +2. Implementiert euren Algorithmus in Java oder Pseudocode. + +## \faIcon{desktop} Arbeitsauftrag: Kompositum implementieren + +Implementiere eine Liste mit dem Entwurfsmuster **Kompositum**. + +Deine Liste sollte die folgenden Methoden rekursiv implementieren: + +* `int laengeGeben()` +* `void vorneEinfuegen(Daten)` +* `void hintenEinfuegen(Daten)` +* `Daten vorneEntfernen()` +* `Daten endeGeben()` +* `Daten elementEntfernen(Daten)` +* `Daten hintenEntfernen()` + +### \faIcon{earlybirds} Für Schnelle: + +Implementiere eine allgemeine Liste, die mit Hilfe von **Generics** ohne Code-Änderungen, Objekte beliebiger Klassen verwalten kann. + +## \faIcon{desktop} Implementierung: `int laengeGeben()` + +```java +class Liste { // [...] + int laengeGeben() { + return anfang.getLength(); + } +} +class Eintrag { // [...] + int laengeGeben() { + return nachfolger.getLength() + 1; + } +} +class Abschluss { + int laengeGeben() { + return 0; + } +} +``` + +## Implementierung: `void vorneEinfuegen(daten)` + +```java +class Liste { // [...] + void vorneEinfuegen(daten) { + Eintrag n = new Eintrag(daten); + n.naechsterSetzen(first); + anfang = n; + } +} +class Eintrag { // [...] + void naechsterSetzen(Listeneintrag n) { + nachfolger = n; + } +} +class Abschluss { + void naechsterSetzen(Listeneintrag n) {} +} +``` + +## Implementierung: `void hintenEinfuegen(daten)` + +```java +class Liste { // [...] + void hintenEinfuegen(Daten daten) { + anfang = anfang.hintenEinfuegen(daten); +}} +class Eintrag { // [...] + Listeneintrag hintenEinfuegen(Daten daten) { + nachfolger = nachfolger.hintenEinfuegen(daten); + return this; +}} +class Abschluss { + Listeneintrag hintenEinfuegen(Daten daten) { + Eintrag n = new Eintrag(daten); + n.naechsterSetzen(this); + return n; + } +} +``` + +## Implementierung: `Daten vorneEntfernen()` + +```java +class Liste { // [...] + Daten vorneEntfernen() { + Daten d = anfang.datenGeben(); + anfang = anfang.naechsterGeben(); + return d; + } +} +class Abschluss { + ListenElement naechsterGeben() { return this; } +} +``` + +## Implementierung: `Daten endeGeben()` +```java +class Liste { // [...] + Daten endeGeben() { + return anfang.endeGeben(null); + } +} +class Eintrag { + Daten endeGeben(Daten prev) { + return nachfolger.endeGeben(this.daten); + } +} +class Abschluss { + Daten endeGeben(Daten prev) { + return prev; + } +} +``` + +## Implementierung: `Daten elementEntfernen(daten)` + +```java +class Liste { // [...] + void elementEntfernen(Daten daten) { + if (anfang.datenGeben() == daten) { vorneEntfernen(); } + else { anfang.elementEntfernen(daten); } + } +} +class Eintrag { + void elementEntfernen(Daten daten) { + if (nachfolger.datenGeben() == daten) { + nachfolger = nachfolger.naechsterGeben(); + } else { + nachfolger.elementEntfernen(daten); + } + } +} +class Abschluss { + void elementEntfernen(Daten daten) { } +} +``` + +## Implementierung: `Daten elementEntfernen(daten)` v2 + +```java +class Liste { // [...] + void elementEntfernen(Daten daten) { + anfang = anfang.elementEntfernen(daten); + } +} +class Eintrag { + void elementEntfernen(Daten daten) { + if (this.datenGeben() == daten) { + return naechsterGeben(); + } + nachfolger = nachfolger.elementEntfernen(daten); + return this; + } +} +class Abschluss { + void elementEntfernen(Daten daten) { return this; } +} +``` + +## Implementierung: `Daten hintenEntfernen()` +```java +class Liste { // [...] + Daten hintenEntfernen() { + Daten ende = anfang.endeGeben(null); + anfang.elementEntfernen(ende); + return ende; + } +} +``` diff --git a/Info/12/Listen/Trennung_Strukur_Daten/.gitignore b/Info/12/Listen/Trennung_Strukur_Daten/.gitignore new file mode 100644 index 00000000..dd6b8c3d --- /dev/null +++ b/Info/12/Listen/Trennung_Strukur_Daten/.gitignore @@ -0,0 +1,2 @@ +slides-wiederholung.pdf +slides-wiederholung.pptx diff --git a/Info/12/Listen/Trennung_Strukur_Daten/slides-wiederholung.md b/Info/12/Listen/Trennung_Strukur_Daten/slides-wiederholung.md new file mode 100644 index 00000000..2b8c0d89 --- /dev/null +++ b/Info/12/Listen/Trennung_Strukur_Daten/slides-wiederholung.md @@ -0,0 +1,60 @@ +--- +author: Florian Fischer +theme: metropolis +aspectratio: 169 +header-includes: + \usepackage{pgf-umlsd} +--- + +## \faIcon{comments} Wiederholung: Sonderfälle \hfill 1/3 + +Nimm Stellung zu folgender Aussage: \vspace{1cm} + +> Alle Sonderfälle: leere Liste, gesuchtes Element ist das Erste/Letzte müssen in der Liste behandelt werden. + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (0.75\textwidth, 2) {\large \textbf{\textcolor{green!80!black}{Korrekt}}}; +\end{tikzpicture} + +## \faIcon{comments} Wiederholung: Sequenzdiagramm \hfill 2/3 {.t} + +Nimm Stellung zu folgender Aussage: \vspace{0.5cm} + +> Das Sequenzdiagramm zeigt einen Ablauf der rekursiven Methode `getLength()`. + +\centering +\begin{sequencediagram} + \newthread{A}{playlist}{} + \newinst[1.5]{B}{s1}{} + \newinst[1.5]{C}{s2}{} + \newinst[1.5]{D}{s3}{} + \begin{call}{A}{?}{B}{null} + \begin{call}{B}{?}{C}{null} + \begin{call}{C}{?}{D}{null} + \end{call} + \end{call} + \end{call} +\end{sequencediagram} + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (5, 3.5) {\large \boldred{Falsch}}; +\end{tikzpicture} + +## \faIcon{comments} Wiederholung: Arten von Listen \hfill 3/3 {.t} + +Nimm Stellung zu folgender Aussage: \vspace{0.75cm} + +> Eine rekursiver Methodenaufruf bedeutet, dass das Objekt eine Methode der eigenen Klasse aufruft. + +\pause + +\begin{tikzpicture}[overlay, remember picture] + \node[rotate=5,scale=2] at (4, 0.3) {\large \boldred{Falsch}}; +\end{tikzpicture} + +\vspace{0.25cm} +> Eine rekursiver Methodenaufruf bedeutet, dass das Objekt die \boldred{gleiche} Methode der Klasse aufruft. diff --git a/Info/12/Listen/Trennung_Strukur_Daten/slides.md b/Info/12/Listen/Trennung_Strukur_Daten/slides.md new file mode 100644 index 00000000..1e24602d --- /dev/null +++ b/Info/12/Listen/Trennung_Strukur_Daten/slides.md @@ -0,0 +1,174 @@ +--- +author: Florian Fischer +theme: metropolis +aspectratio: 169 +header-includes: + \usepackage{pgf-umlsd} +--- + +```{.include} +slides-wiederholung.md +``` + +## \faIcon{chalkboard-teacher} Wiederholung: Die Liste + +\centering +\begin{tikzpicture} + \begin{object}[text width=3cm]{liste}{0,0} + \attribute{anfang} + \attribute{ende} + \end{object} + + \begin{object}[text width=3.5cm]{lied1}{-5,-2.5} + \attribute{name = "foo"} + \attribute{next} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-5.8, -3.9) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (-2, -2.75); + + \begin{object}[text width=3.5cm]{lied2}{0,-2.5} + \attribute{name = "bar"} + \attribute{next} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-0.8, -3.9) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (3, -2.75); + + \begin{object}[text width=3.5cm]{lied3}{5,-2.5} + \attribute{name = "baz"} + \attribute{next} + \end{object} + + % Anfang + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (anfang) at (-1.6, -0.81) {}; + \draw[line width=2pt, -latex, draw=blue!80] (anfang) edge [bend right=25] (-5.1, -2.45); + + % Ende + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (ende) at (-0.35, -1.4) {}; + \draw[line width=2pt, -latex, draw=blue!80] (ende) edge [bend left=20] (5.1, -2.45); +\end{tikzpicture} + +## {.standout} + +Könnten wir mit unserer Playlist nicht auch Kurzvideos verwalten? + +## Problem + +### Daten und Verwaltung + +In unserer Implementierung ist der Code für die Daten und die Verwaltung der Liste vermischt. + +\pause + +### \faIcon{lightbulb} Trennung von Struktur und Daten + +Wie bekommen wir den Code zur Verwaltung von dem Code für die Daten (Songs, Videos, Kund*innen) getrennt? + +## + +\begin{tikzpicture} + \begin{object}[text width=3cm]{liste}{0,0} + \attribute{anfang} + \attribute{ende} + \end{object} + + \begin{object}[text width=3.5cm]{node1}{-5,-2.5} + \attribute{next} + \attribute{daten} + \end{object} + + \begin{object}[text width=3.5cm]{daten1}{-5,-4.5} + \attribute{inhalt} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (d1) at (-5.7, -3.85) {}; + \draw[line width=2pt, draw=blue!80] (d1) edge [bend left=15, -latex] (daten1); + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-5.8, -3.3) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (-2, -2.75); + + \begin{object}[text width=3.5cm]{node2}{0,-2.5} + \attribute{next} + \attribute{daten} + \end{object} + + \begin{object}[text width=3.5cm]{daten2}{0,-4.5} + \attribute{inhalt} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (d2) at (-0.7, -3.85) {}; + \draw[line width=2pt, draw=blue!80] (d2) edge [bend left=15, -latex] (daten2); + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (n1) at (-0.8, -3.3) {}; + \draw[line width=2pt, -latex, draw=blue!80] (n1) edge [bend right=15] (3, -2.75); + + \begin{object}[text width=3.5cm]{node3}{5,-2.5} + \attribute{next} + \attribute{daten} + \end{object} + + \begin{object}[text width=3.5cm]{daten3}{5,-4.5} + \attribute{inhalt} + \end{object} + + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (d3) at (4.3, -3.85) {}; + \draw[line width=2pt, draw=blue!80] (d3) edge [bend left=15, -latex] (daten3); + + % Anfang + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (anfang) at (-1.6, -0.81) {}; + \draw[line width=2pt, -latex, draw=blue!80] (anfang) edge [bend right=25] (-5.1, -2.45); + + % Ende + \node[fill=black, circle, minimum size=0.005cm, scale=0.5] (ende) at (-0.35, -1.4) {}; + \draw[line width=2pt, -latex, draw=blue!80] (ende) edge [bend left=20] (5.1, -2.45); +\end{tikzpicture} + +## \faIcon{pencil-alt} Arbeitsauftrag: Klassendiagramm \hfill 5min + +Erweitere das Klassendiagramm der Liste, sodass Daten-/ und Listenverwaltung von getrennten Klassen umgesetzt werden. + +### Einfaches Klassendiagramm {.tipp} + +\centering +\begin{tikzpicture} + \node[draw] (list) {\large Liste}; + \node[draw] (song) at (5, 0) {\large Lied}; + + \draw ($(list.east) + (0, 0.1cm)$) edge[above] node {hat als Anfang > 0,1} ($(song.west) + (0, 0.1cm)$); + \draw ($(list.east) - (0, 0.1cm)$) edge[below] node {hat als Ende > 0,1} ($(song.west) - (0, 0.1cm)$); + \draw (song.north) |- ($(song.north) + (0, 0.5cm)$) edge[above] node {0,1 < hat als Nachfolger} ($(song.north) + (3.5cm, 0.5cm)$); + \draw ($(song.north) + (3.5cm, 0.5cm)$) |- (song.east); +\end{tikzpicture} + +## Klassendiagramm mit Trennung zwischen Struktur und Inhalt + +\centering +\begin{tikzpicture} + \node[draw] (list) {\large Liste}; + \node[draw] (node) at (5, 0) {\large ListenElement}; + \node[draw] (song) at (5, -3) {\large Lied}; + + \draw ($(list.east) + (0, 0.1cm)$) edge[above] node {anfang > 0,1} ($(node.west) + (0, 0.1cm)$); + \draw ($(list.east) - (0, 0.1cm)$) edge[below] node {ende > 0,1} ($(node.west) - (0, 0.1cm)$); + \draw (node.north) |- ($(node.north) + (0, 0.5cm)$) edge[above] node {0,1 < nachfolger} ($(node.north) + (3.5cm, 0.5cm)$); + \draw ($(node.north) + (3.5cm, 0.5cm)$) |- (node.east); + + \draw (song.north) edge[above] node[rotate=-90] {verwaltet > 1} (node.south); +\end{tikzpicture} + +## \faIcon{desktop} Arbeitsauftrag: Trennung zwischen Struktur und Inhalt + +1. Dupliziere deinen Listen Workspace +2. Übertrage die Rekursiven Methoden aus der Klasse Song in eine Klasse `ListEntry`. +3. Passe die Methoden der Playlist entsprechend an, dass jeder Song von einem `ListEntry` Objekt verwaltet wird. + +### Beispiel: `void add(Song s)`{.java} {.example} +```java + void add(Song s) { + ListEntry e = new ListEntry(s); // Listenelement für s anlegen + if (last) + last.next = e; // e kommt nach dem aktuell Letzten + last = e; // Das Element wirdam Ende eingefügt + } +``` diff --git a/Info/26_27/09/15/9d/schedule.md b/Info/26_27/09/15/9d/schedule.md new file mode 100644 index 00000000..2b227a9a --- /dev/null +++ b/Info/26_27/09/15/9d/schedule.md @@ -0,0 +1,22 @@ +--- +lang: de +geometry: margin=2cm +--- +# Thema der Stunde + +* **Klasse**: 9d +* **Datum**: 15.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- + +## Feedback + +* Bisschen trocken +* Coolerer Einstieg diff --git a/Info/26_27/09/15/9d/topic b/Info/26_27/09/15/9d/topic new file mode 120000 index 00000000..3df9a004 --- /dev/null +++ b/Info/26_27/09/15/9d/topic @@ -0,0 +1 @@ +../../../../9/1/Intro
\ No newline at end of file diff --git a/Info/26_27/09/17/9c/schedule.md b/Info/26_27/09/17/9c/schedule.md new file mode 100644 index 00000000..26355768 --- /dev/null +++ b/Info/26_27/09/17/9c/schedule.md @@ -0,0 +1,17 @@ +--- +lang: de +geometry: margin=2cm +--- +# Thema der Stunde + +* **Klasse**: 9c +* **Datum**: 17.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/17/9c/topic b/Info/26_27/09/17/9c/topic new file mode 120000 index 00000000..3df9a004 --- /dev/null +++ b/Info/26_27/09/17/9c/topic @@ -0,0 +1 @@ +../../../../9/1/Intro
\ No newline at end of file diff --git a/Info/26_27/09/18/gA12/schedule.md b/Info/26_27/09/18/gA12/schedule.md new file mode 100644 index 00000000..9a9e379e --- /dev/null +++ b/Info/26_27/09/18/gA12/schedule.md @@ -0,0 +1,19 @@ +--- +lang: de +geometry: margin=2cm +--- +# Intro + +* **Klasse**: gA12 +* **Datum**: 18.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +10 Orga + +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/18/gA12/topic1 b/Info/26_27/09/18/gA12/topic1 new file mode 120000 index 00000000..cde08d21 --- /dev/null +++ b/Info/26_27/09/18/gA12/topic1 @@ -0,0 +1 @@ +../../../../12/gA/Intro
\ No newline at end of file diff --git a/Info/26_27/09/22/9d/schedule.md b/Info/26_27/09/22/9d/schedule.md new file mode 100644 index 00000000..092bbbb9 --- /dev/null +++ b/Info/26_27/09/22/9d/schedule.md @@ -0,0 +1,17 @@ +--- +lang: de +geometry: margin=2cm +--- +# Formerln / Datentypen \& Formatierung + +* **Klasse**: 9d +* **Datum**: 22.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/22/9d/topic b/Info/26_27/09/22/9d/topic new file mode 120000 index 00000000..0202d805 --- /dev/null +++ b/Info/26_27/09/22/9d/topic @@ -0,0 +1 @@ +../../../../9/1/Datentyp_Formatierung/
\ No newline at end of file diff --git a/Info/26_27/09/22/gA12/schedule.md b/Info/26_27/09/22/gA12/schedule.md new file mode 100644 index 00000000..c9df26f8 --- /dev/null +++ b/Info/26_27/09/22/gA12/schedule.md @@ -0,0 +1,39 @@ +--- +lang: de +geometry: margin=2cm +--- +# Intro Listen + +* **Klasse**: gA12 +* **Datum**: 22.09 + +## Lernziele +1. SuS modellieren eine verkettete Liste +2. SuS begründen den Unterschied zwischen FIFO und LIFO +3. Implementieren eine einfach verkettete Liste +4. Implementieren die Rekursive Methode length + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +7 Wdh Diskussion 2 + +10 Modellierung SuS entwerfen Klassendiagramm zu einer 1 PA + Playlist-Implementierung, die unbegrenzt + Lieder aufnehmen kann aber bei einer leeren + Liste so wenig wie moeglich Speicherplatz + verschwendet. + +15 Sicherung Warteschlange Klassendiagramm 1 + +30 Impl Warteschlange 3 + +10 Erarbeitung Warteschlange 4 + +10 Impl SuS implementieren rekursive Methode length 4 + + Puffer Übung Abi (2013) 1,2 + Regallager +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/29/9d/schedule.md b/Info/26_27/09/29/9d/schedule.md new file mode 100644 index 00000000..7892d53b --- /dev/null +++ b/Info/26_27/09/29/9d/schedule.md @@ -0,0 +1,17 @@ +--- +lang: de +geometry: margin=2cm +--- +# Zellbezuege + +* **Klasse**: 9d +* **Datum**: 29.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/29/9d/topic b/Info/26_27/09/29/9d/topic new file mode 120000 index 00000000..7d8ddecc --- /dev/null +++ b/Info/26_27/09/29/9d/topic @@ -0,0 +1 @@ +../../../../9/1/Zellbezuege
\ No newline at end of file diff --git a/Info/26_27/09/29/gA12/schedule.md b/Info/26_27/09/29/gA12/schedule.md new file mode 100644 index 00000000..faadec21 --- /dev/null +++ b/Info/26_27/09/29/gA12/schedule.md @@ -0,0 +1,20 @@ +--- +lang: de +geometry: margin=2cm +--- +# Funktionen der Liste + +* **Klasse**: gA12 +* **Datum**: 29.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +20 Widerholung + +70 Implementierung +--------------------------------------------------------------------------------------------------- diff --git a/Info/26_27/09/29/gA12/topic b/Info/26_27/09/29/gA12/topic new file mode 120000 index 00000000..1d071f95 --- /dev/null +++ b/Info/26_27/09/29/gA12/topic @@ -0,0 +1 @@ +../../../../12/Listen/Funktionen
\ No newline at end of file diff --git a/Info/9/1/Funktionen/slides.md b/Info/9/1/Funktionen/slides.md index 4ca1600d..613507d0 100644 --- a/Info/9/1/Funktionen/slides.md +++ b/Info/9/1/Funktionen/slides.md @@ -62,8 +62,8 @@ Erläutere die Formel um die *kleine Ein-mal-Eins* Matrix bequem zu befüllen? \begin{tikzpicture} \only<1> { \node {\includegraphics[keepaspectratio, width=0.8\textwidth]{img/ein_mal_eins.png}}; } \only<2-> { \node {\includegraphics[keepaspectratio, width=0.8\textwidth]{img/ein_mal_eins_formular.png}}; } -\only<3-> { \draw[line width=1pt, blue, -Triangle] (-3.7cm, 1.1cm) -- (-3.7cm, -2.2cm); } -\only<4-> { \draw[line width=1pt, red, -Triangle] (-2.4cm, 1.35cm) -- (5cm, 1.35cm); } +\only<3-> { \draw[line width=1pt, red, -Triangle] (-3.7cm, 1.1cm) -- (-3.7cm, -2.2cm); } +\only<4-> { \draw[line width=1pt, blue, -Triangle] (-2.4cm, 1.35cm) -- (5cm, 1.35cm); } \end{tikzpicture} \end{center} diff --git a/Info/9/1/Zellbezuege/slides.md b/Info/9/1/Zellbezuege/slides.md index 7943ac8b..ad6bc59c 100644 --- a/Info/9/1/Zellbezuege/slides.md +++ b/Info/9/1/Zellbezuege/slides.md @@ -96,7 +96,7 @@ Sie möchten die Eigentümerin Frau Kremig davon überzeugen, den Arbeitslohn in {.center height=50%} -## \faIcon{desktop} Arbeitsauftrag - 5 min +## \faIcon{desktop} Arbeitsauftrag \hfill 5 min {.center height=40%} @@ -138,7 +138,7 @@ Daher möchte sie diesen nur in einer Zelle erfassen: } \end{tikzpicture} -## \faIcon{desktop} Arbeitsauftrag - 5 min +## \faIcon{desktop} Arbeitsauftrag \hfill 5 min { .center width=80% } @@ -191,17 +191,17 @@ Um eine automatische Anpassung beim Kopieren zu verhindern, setzt man ein \textc } \end{tikzpicture} -## \faIcon{desktop} Arbeitsauftrag: Zellbezüge anwenden - 15 min +## \faIcon{desktop} Arbeitsauftrag: Zellbezüge anwenden \hfill 15 min **Kopiere** das Dokument `Zellbezuege.ods` (aus ByCS Drive) in dein eigenes Laufwerk. Bearbeite anschließend die ersten **3** Rechenblätter des Dokuments. -\vspace{2cm} +\vspace{1cm}  \begin{tikzpicture}[overlay, remember picture] -\node[draw=red, line width=1pt, minimum width=4.2cm, minimum height=0.5cm, anchor=west, xshift=3.9cm, yshift=2.7cm] at (current page.south west) {}; +\node[draw=red, line width=1pt, minimum width=4.2cm, minimum height=0.5cm, anchor=west, xshift=3.9cm, yshift=3.25cm] at (current page.south west) {}; \end{tikzpicture} ## \faIcon{pencil-alt} Relative und absolute Zellbezüge @@ -232,20 +232,20 @@ Zur Verhinderung dieser automatischen Anpassung wird ein **$-Zeichen** (Dollarze :::: ::: -## \faIcon{desktop} Arbeitsauftrag: Zellbezüge anwenden 2 - 15 min +## \faIcon{desktop} Arbeitsauftrag: Zellbezüge anwenden 2 \hfill 15 min Bearbeite die letzten **4** Rechenblätter des Dokuments. -\vspace{1cm} +\vspace{0.5cm}  \begin{tikzpicture}[overlay, remember picture] -\node[draw=red, line width=1pt, minimum width=7.2cm, minimum height=0.5cm, anchor=west, xshift=8cm, yshift=4.7cm] at (current page.south west) {}; +\node[draw=red, line width=1pt, minimum width=7.2cm, minimum height=0.5cm, anchor=west, xshift=8cm, yshift=5cm] at (current page.south west) {}; \end{tikzpicture} \begin{tcolorbox}[colframe=orange] \textbf{\faIcon{crown} King of the Zellbezüge} \\[0.1cm] -Wer als erster fertig, erhält eine Belohnung \faIcon{gift}. +Wer als erster fertig ist, erhält eine Belohnung \faIcon{gift}. \end{tcolorbox} ## \faIcon{desktop} Arbeitsauftrag diff --git a/Info/9/3/Planet/Readme.md b/Info/9/3/Planet/Readme.md index 529819a2..9e8c915d 100644 --- a/Info/9/3/Planet/Readme.md +++ b/Info/9/3/Planet/Readme.md @@ -46,6 +46,7 @@ Einige werden automatisch mit dem Abschließen mancher *TODO*-Aktivitäten verge * Ergänze mehr Begriffe * Vergebe einen Badge wenn alle Begriffe gefunden wurden. * Mache den Style von Glossar-Einträgen weniger aufdringlich + https://stackoverflow.com/questions/58700523/how-to-add-a-circle-on-the-top-right-corner-of-a-button-above-the-background-and * Tipps für bedingte Wiederholung (SuS) sollten Code mal gesehen haben oder Hilfe beim Erarbeiten bekommen. ## Entwicklung des Kurses diff --git a/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/-1.25(1.6)^x.png b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/-1.25(1.6)^x.png Binary files differnew file mode 100644 index 00000000..ae609629 --- /dev/null +++ b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/-1.25(1.6)^x.png diff --git a/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/32(\frac{1}{4})^x.png b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/32(\frac{1}{4})^x.png Binary files differnew file mode 100644 index 00000000..db48fde5 --- /dev/null +++ b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/img/32(\frac{1}{4})^x.png diff --git a/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/moodle-quiz.md b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/moodle-quiz.md new file mode 100644 index 00000000..5b16def3 --- /dev/null +++ b/Mathe/10/1/Quizzes/AnwendungExponentialFunktion/moodle-quiz.md @@ -0,0 +1,50 @@ +--- + title: "Anwendung Exponentialfunktion" +--- +## Parameter bestimmen {.shortanswer} + +:::{.question-text} +> Ein neuartiges Virus wurde bei einer Patient*in im Krankenhaus entdeckt. +> Wenn jede infizierte Person an einem Tag eine weitere Person ansteckt, sind nach drei Wochen bereits 2097152 Menschen erkrankt. + +Gib den Wert von $b$ an. +::: + +* 1 + +## Parameter bestimmen {.shortanswer} + +:::{.question-text} +^x.png) + +Gib den Wert von $b$ der zum Graphen passenden Exponentialfunktion an. +::: + +* -1,25 +* -1.25 + +## Parameter bestimmen {.shortanswer} + +:::{.question-text} +> Bei Conway's Game of Life bestimmt über Leben oder Sterben einer Zelle, wie viele ihrer Nachbarzellen lebendig sind. +> Bei einem Anfangszustand von 50000 lebendigen Zellen sind im nächsten Schritt nur noch 30000 lebendig und danach sogar nur noch 18000. +> Es liegt die Vermutung nahe, dass die Anzahl der lebendigen Zellen mit einer Exponentialfunktion beschrieben werden kann. + +Gib den Wert von $a$ der Exponentialfunktion an. +::: + +* 0,6 +* 0.6 +* 3/5 + +## Parameter bestimmen {.shortanswer} + +:::{.question-text} +^x.png) + +Gib den Wert von $a$ der zum Graphen passenden Exponentialfunktion an. +::: + +* 0,25 +* 0.25 +* 1/4 diff --git a/Mathe/26_27/09/16/10c/schedule.md b/Mathe/26_27/09/16/10c/schedule.md new file mode 100644 index 00000000..6901fa0d --- /dev/null +++ b/Mathe/26_27/09/16/10c/schedule.md @@ -0,0 +1,44 @@ +--- +lang: de +geometry: margin=2cm +--- +# Erste Stunde / Wiederholung / Exponentielles Wachstum + +* **Klasse**: 10c +* **Datum**: 16.09 + +## Lernziele + +1. SuS beschreiben lineares und exponentielles Wachstum (K6) +2. SuS unterscheiden lineares und exponentielles Wachstum begründet (K1) + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +10 Orga Noten Arbeitsweise + +5 Orga Spiel + +10 Wdh Quiz + +5 Erarbeitung Zahlenfolgenvergleich + +5 Erarbeitung Schach Video + +10 Erarbeitung Vergleich linear exponentiell (Fokus 10) + +5 Sicherung Exponentielle Zunahme + +10 Übung Gleichung aufstellen (Fokus 10) + +10 Übung Wasserlilien + +5 Erarbeitung Exponentielle Abnahme + +5 Sicherung + +10 Übung Bewohnerrückgang (Fokus 10) + +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/17/8e/.gitignore b/Mathe/26_27/09/17/8e/.gitignore new file mode 100644 index 00000000..fef8be01 --- /dev/null +++ b/Mathe/26_27/09/17/8e/.gitignore @@ -0,0 +1 @@ +personen_zuordnung.pdf diff --git a/Mathe/26_27/09/17/8e/personen_zuordnung.tex b/Mathe/26_27/09/17/8e/personen_zuordnung.tex new file mode 100644 index 00000000..e4522a5d --- /dev/null +++ b/Mathe/26_27/09/17/8e/personen_zuordnung.tex @@ -0,0 +1,12 @@ +\documentclass{arbeitsauftrag} +\begin{document} +\underline{\textbf{Arbeitsauftrag:}} Pair \faIcon{hands-helping} + +\begin{enumerate} + \item Suche dir aus der Klassenliste eine Person aus. + \item Sag deiner Partner*in den ersten Buchstaben, des Vornames deiner Person. + \item Kannst du rausfinden, welche Person gemeint ist? +\end{enumerate} + +\textbf{Begründet} gemeinsam, wann die Person gefunden werden kann und wann nicht. +\end{document} diff --git a/Mathe/26_27/09/17/8e/schedule.md b/Mathe/26_27/09/17/8e/schedule.md new file mode 100644 index 00000000..edca2973 --- /dev/null +++ b/Mathe/26_27/09/17/8e/schedule.md @@ -0,0 +1,31 @@ +--- +lang: de +geometry: margin=2cm +--- +# Erste Stunde / Funktionen + +* **Klasse**: 8e +* **Datum**: 17.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +20 Orga + +20 Wdh Fokus Wdh Terme + +20 Wdh/Reflexion Check-In I LBS S.188 EA + +5 Einstieg Autokennzeichen bestimmen UG + +7 Erarbeitung Zuordnung finden und umdrehen PA + +10 Sicherung + + + +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/21/10c/quiz/.gitignore b/Mathe/26_27/09/21/10c/quiz/.gitignore new file mode 100644 index 00000000..a33a5378 --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/.gitignore @@ -0,0 +1,3 @@ +*.png +*.jpg +q*.pdf diff --git a/Mathe/26_27/09/21/10c/quiz/Makefile b/Mathe/26_27/09/21/10c/quiz/Makefile new file mode 100644 index 00000000..1d424dec --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/Makefile @@ -0,0 +1,17 @@ +QUESTIONS:=$(wildcard *.tex) +PDFS:=$(QUESTIONS:.tex=.pdf) +PNGS:=$(QUESTIONS:.tex=.png) +JPGS:=$(QUESTIONS:.tex=.jpg) + +.PHONY: all +all: $(PDFS) $(PNGS) $(JPGS) + +%.jpg: %.pdf + convert -density 600 -quality 100 $< -flatten -sharpen 0x1.0 $@ + +%.png: %.pdf + convert -density 600 -quality 100 $< -flatten -sharpen 0x1.0 $@ + +COMMON_MK = $(shell bash -c 'upfind() { [[ -f "$$1" ]] && printf "$$1" || ([ "$$(realpath $$(dirname "$$1"))" == "/" ] || upfind "../$$1") }; upfind common.mk') +include $(COMMON_MK) + diff --git a/Mathe/26_27/09/21/10c/quiz/q1.tex b/Mathe/26_27/09/21/10c/quiz/q1.tex new file mode 100644 index 00000000..85f0b748 --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/q1.tex @@ -0,0 +1,13 @@ +\documentclass[margin=0.2cm, varwidth]{standalone} +\usepackage{graphicx} + +\begin{document} +\centering +\includegraphics[keepaspectratio, width=5cm]{q1_kreis.png}\newline +Welche Länge hat die grüne Strecke?\newline + +\begin{tabular}{c c c c} +a) & b) & c) & d) \\ +$cos(\alpha)$ & 1 & $sin(\alpha)$ & $1 -cos(\alpha)^2$ \\ +\end{tabular} +\end{document} diff --git a/Mathe/26_27/09/21/10c/quiz/q2.tex b/Mathe/26_27/09/21/10c/quiz/q2.tex new file mode 100644 index 00000000..fcbd9ed5 --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/q2.tex @@ -0,0 +1,11 @@ +\documentclass[margin=0.2cm, varwidth]{standalone} + +\begin{document} +\centering +Welcher der folgenden Terme beschreibt ein exponentielles Wachstum? \newline + +\begin{tabular}{c c c c} +a) & b) & c) & d) \\ +$3x^2$ & $n^2+3m^6$ & $\frac{1}{7}a^b$ & $mx+t$ \\ +\end{tabular} +\end{document} diff --git a/Mathe/26_27/09/21/10c/quiz/q3.tex b/Mathe/26_27/09/21/10c/quiz/q3.tex new file mode 100644 index 00000000..9184c8ec --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/q3.tex @@ -0,0 +1,14 @@ +\documentclass[margin=0.2cm, varwidth]{standalone} +\usepackage{graphicx} + +\begin{document} +\centering + +\includegraphics[keepaspectratio, height=5cm]{(x-1)^2-2} \newline +Welcher Term passt zum Graphen? \newline + +\begin{tabular}{c c c c} +a) & b) & c) & d) \\ +$-(x+1)^2-3$ & $(x+1)^2+3$ & $\frac{1}{2}(x-1)^2-3$ & $(x-1)^2-3$ \\ +\end{tabular} +\end{document} diff --git a/Mathe/26_27/09/21/10c/quiz/q4.tex b/Mathe/26_27/09/21/10c/quiz/q4.tex new file mode 100644 index 00000000..ac5592a1 --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/q4.tex @@ -0,0 +1,12 @@ +\documentclass[margin=0.2cm, varwidth]{standalone} + +\begin{document} +\centering + +Die Nullstelle(n) des Graphens der Funktion $f \mapsto x = 3x^2 + 9x$ sind? \newline + +\begin{tabular}{c c c c} +a) & b) & c) & d) \\ +$x_1=3;x_2=-3$ & $x_1=0$ & $x_1=0;x_2=-3$ & $x_1=0;x_2=9$ \\ +\end{tabular} +\end{document} diff --git a/Mathe/26_27/09/21/10c/quiz/solutions.csv b/Mathe/26_27/09/21/10c/quiz/solutions.csv new file mode 100644 index 00000000..312f6620 --- /dev/null +++ b/Mathe/26_27/09/21/10c/quiz/solutions.csv @@ -0,0 +1,4 @@ +q1,A +q2,C +q3,D +q4,C diff --git a/Mathe/26_27/09/21/10c/schedule.md b/Mathe/26_27/09/21/10c/schedule.md new file mode 100644 index 00000000..d373ad75 --- /dev/null +++ b/Mathe/26_27/09/21/10c/schedule.md @@ -0,0 +1,17 @@ +--- +lang: de +geometry: margin=2cm +--- +# BMT Wdh / Wachstumsgleichung aufstellen + +* **Klasse**: 10c +* **Datum**: 21.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/21/8e/quiz b/Mathe/26_27/09/21/8e/quiz new file mode 120000 index 00000000..72d1c2e0 --- /dev/null +++ b/Mathe/26_27/09/21/8e/quiz @@ -0,0 +1 @@ +../../../../23_24/06/04/7A/quiz
\ No newline at end of file diff --git a/Mathe/26_27/09/21/8e/schedule.md b/Mathe/26_27/09/21/8e/schedule.md new file mode 100644 index 00000000..e1f8a11a --- /dev/null +++ b/Mathe/26_27/09/21/8e/schedule.md @@ -0,0 +1,17 @@ +--- +lang: de +geometry: margin=2cm +--- +# BMT Wdh / Zuordnung + +* **Klasse**: 8e +* **Datum**: 21.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/23/10c/schedule.md b/Mathe/26_27/09/23/10c/schedule.md new file mode 100644 index 00000000..b7b9a5b5 --- /dev/null +++ b/Mathe/26_27/09/23/10c/schedule.md @@ -0,0 +1,36 @@ +--- +lang: de +geometry: margin=2cm +--- +# Wdh + +* **Klasse**: 10c +* **Datum**: 23.26_27 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +7 Quiz + +5 Wdh Sinus Kosinus am Einheitskreis alpha+90 + +25 Wdh BMT 2024 / Auserwählte Aufgaben + +15 Übung Gleichung aufstellen (Fokus 10) + +10 Übung Wasserlilien + +5 Erarbeitung Exponentielle Abnahme + +5 Sicherung + +10 Übung Bewohnerrückgang (Fokus 10) + + Puffer LS S9 A4, A7 S10 A11 + + HA LS S10 A12 +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/24/8e/quiz b/Mathe/26_27/09/24/8e/quiz new file mode 120000 index 00000000..76e62314 --- /dev/null +++ b/Mathe/26_27/09/24/8e/quiz @@ -0,0 +1 @@ +../../../../23_24/04/08/7A/quiz
\ No newline at end of file diff --git a/Mathe/26_27/09/28/10c/quiz b/Mathe/26_27/09/28/10c/quiz new file mode 120000 index 00000000..85af64f2 --- /dev/null +++ b/Mathe/26_27/09/28/10c/quiz @@ -0,0 +1 @@ +../../../../24_25/10/09/9E/quiz
\ No newline at end of file diff --git a/Mathe/26_27/09/28/10c/schedule.md b/Mathe/26_27/09/28/10c/schedule.md new file mode 100644 index 00000000..42041545 --- /dev/null +++ b/Mathe/26_27/09/28/10c/schedule.md @@ -0,0 +1,26 @@ +--- +lang: de +geometry: margin=2cm +--- +# Thema der Stunde + +* **Klasse**: 10c +* **Datum**: 28.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +5 Quiz Wurzeln + +20 Wdh BMT + +10 Wdh Einheitskreis + +10 Sicherung Exponentielle Abnahme + + Puffer Cornelson +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/28/8e/schedule.md b/Mathe/26_27/09/28/8e/schedule.md new file mode 100644 index 00000000..de8e346d --- /dev/null +++ b/Mathe/26_27/09/28/8e/schedule.md @@ -0,0 +1,24 @@ +--- +lang: de +geometry: margin=2cm +--- +# BMT / Übung Funktionen + +* **Klasse**: 8e +* **Datum**: 28.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +5 Quiz + +40 BMT + +10 Sicherung Zuordnung + +35 Übung +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/26_27/09/30/10c/.gitignore b/Mathe/26_27/09/30/10c/.gitignore new file mode 100644 index 00000000..342f7d6e --- /dev/null +++ b/Mathe/26_27/09/30/10c/.gitignore @@ -0,0 +1 @@ +exponentialfunktion.pdf diff --git a/Mathe/26_27/09/30/10c/exp_funktionen.png b/Mathe/26_27/09/30/10c/exp_funktionen.png Binary files differnew file mode 100644 index 00000000..56607193 --- /dev/null +++ b/Mathe/26_27/09/30/10c/exp_funktionen.png diff --git a/Mathe/26_27/09/30/10c/exponentialfunktion.tex b/Mathe/26_27/09/30/10c/exponentialfunktion.tex new file mode 100644 index 00000000..bb510252 --- /dev/null +++ b/Mathe/26_27/09/30/10c/exponentialfunktion.tex @@ -0,0 +1,20 @@ +\documentclass{arbeitsauftrag} +\usepackage{graphicx} +\begin{document} +\underline{\textbf{Arbeitsauftrag:}} Pair \faIcon{hands-helping} Untersucht die Funktion \hfill{} 5min \\[0.3cm] + +\begin{tabular}{p{4cm} p{6cm}} +\vspace{0px} \includegraphics[keepaspectratio, width=4cm]{geogebra_qrcode} & +Untersucht die Eigenschaften der dargestellten Funktion und ihres Graphens in +Abhängigkeit der Parameter $a$ und $b$. \newline + +Was könnt ihr über die folgenden \textbf{Eigenschaften} herausfinden? + +\begin{itemize} + \item Wertemenge / Definitionsmenge + \item Steigungsverhalten + \item Symmetrie + \item Asymptoten +\end{itemize} \\ +\end{tabular} +\end{document} diff --git a/Mathe/26_27/09/30/10c/geogebra_qrcode.png b/Mathe/26_27/09/30/10c/geogebra_qrcode.png Binary files differnew file mode 100644 index 00000000..f45facf1 --- /dev/null +++ b/Mathe/26_27/09/30/10c/geogebra_qrcode.png diff --git a/Mathe/26_27/09/30/10c/schedule.md b/Mathe/26_27/09/30/10c/schedule.md new file mode 100644 index 00000000..ae61b1b3 --- /dev/null +++ b/Mathe/26_27/09/30/10c/schedule.md @@ -0,0 +1,32 @@ +--- +lang: de +geometry: margin=2cm +--- +# Wdh Exponentialfunktion + +* **Klasse**: 10c +* **Datum**: 30.09 + +## Lernziele + +## Verlaufplan + +--------------------------------------------------------------------------------------------------- +Zeit Phase Unterrichtsgeschehen Ziel Methode Medien +----- --------------- -------------------------------------------- ----------- ---------- --------- +10 Quiz + +30 BMT + +10 Wdh Besprechung der HA + +10 Übung Abnahme + +5 Sicherung Abnahme + +10 Übung Lernampel + +5 Erarbeitung Exponentialfunktion + +10 Sicherung Exponentialfunktion +--------------------------------------------------------------------------------------------------- diff --git a/Mathe/8/1/Quizzes/Zuordnungen/img/maya.png b/Mathe/8/1/Quizzes/Zuordnungen/img/maya.png Binary files differnew file mode 100644 index 00000000..b4fe2511 --- /dev/null +++ b/Mathe/8/1/Quizzes/Zuordnungen/img/maya.png diff --git a/Mathe/8/1/Quizzes/Zuordnungen/moodle-quiz.md b/Mathe/8/1/Quizzes/Zuordnungen/moodle-quiz.md new file mode 100644 index 00000000..0de18fcd --- /dev/null +++ b/Mathe/8/1/Quizzes/Zuordnungen/moodle-quiz.md @@ -0,0 +1,25 @@ +## Funktion oder nicht? {.multichoice} + +:::{.question-text} +Wähle alle angegebenen Zuordnung , die auch Funktionen sind? +::: + ++ Datum $\mapsto$ Durchschnittstemperatur []{fraction=50} +- Uhrzeit $\mapsto$ Ist es bereits Hell ++ Schuljahr $\mapsto$ Besuchte Klasse []{fraction=50} +- Klasse $\mapsto$ Klassenleitung + +## Graphen interpretieren {.multichoice} + +:::{.question-text} +Der Graph zeigt einen Gassi-Gang mit der Hündin Maya. + + + +Wähle alle korrekten Aussagen aus? +::: + ++ Maya bleibt zwei mal stehen. []{fraction=50} ++ Insgesamt war Maya $\approx 12 Minuten$ unterwegs. []{fraction=50} +- Maya läuft die ganze Runde mit der gleichen Geschwindigkeit. +- Der Graph beweist, dass nicht der gleiche Weg zurück gelaufen wurde. diff --git a/Mathe/8/Elementare gebrochen-rationale Funktionen b/Mathe/8/Elementare gebrochen-rationale Funktionen new file mode 120000 index 00000000..e440e5c8 --- /dev/null +++ b/Mathe/8/Elementare gebrochen-rationale Funktionen @@ -0,0 +1 @@ +3
\ No newline at end of file diff --git a/Mathe/8/Funktion und Term b/Mathe/8/Funktion und Term new file mode 120000 index 00000000..56a6051c --- /dev/null +++ b/Mathe/8/Funktion und Term @@ -0,0 +1 @@ +1
\ No newline at end of file diff --git a/Mathe/8/Kreis und Zylinder b/Mathe/8/Kreis und Zylinder new file mode 120000 index 00000000..c7930257 --- /dev/null +++ b/Mathe/8/Kreis und Zylinder @@ -0,0 +1 @@ +7
\ No newline at end of file diff --git a/Mathe/8/Laplace-Experimente b/Mathe/8/Laplace-Experimente new file mode 120000 index 00000000..7813681f --- /dev/null +++ b/Mathe/8/Laplace-Experimente @@ -0,0 +1 @@ +5
\ No newline at end of file diff --git a/Mathe/8/Lineare Funktionen b/Mathe/8/Lineare Funktionen new file mode 120000 index 00000000..d8263ee9 --- /dev/null +++ b/Mathe/8/Lineare Funktionen @@ -0,0 +1 @@ +2
\ No newline at end of file diff --git a/Mathe/8/Lineare Gleichungssysteme b/Mathe/8/Lineare Gleichungssysteme new file mode 120000 index 00000000..62f94575 --- /dev/null +++ b/Mathe/8/Lineare Gleichungssysteme @@ -0,0 +1 @@ +6
\ No newline at end of file @@ -70,6 +70,10 @@ schedule.pdf: schedule.md $(MAKEFILE_LIST) @echo "building $@" $(VERBOSE)$(PANDOC) --pdf-engine-opt=--fmt=$(LATEX_FMT_BASE)/schedule.fmt -f markdown $< -o $@ +moodle-quiz.xml: moodle-quiz.md $(wildcard img/*) $(MAKEFILE_LIST) + @echo "building $@" + $(VERBOSE)$(PANDOC) --template=$(PANDOC_TEMPLATE_DIR)/moodle-quiz.xml -t $(PANDOC_FILTER_DIR)/moodle-quiz.lua --embed-resources $< -o $@ + %.pdf: %.md $(MAKEFILE_LIST) @echo "building $@" $(VERBOSE)$(PANDOC) -f markdown $< -o $@ diff --git a/pandoc/filters/moodle-quiz.lua b/pandoc/filters/moodle-quiz.lua new file mode 100644 index 00000000..92a4e893 --- /dev/null +++ b/pandoc/filters/moodle-quiz.lua @@ -0,0 +1,184 @@ +--- moodle-test.lua – filter to convert markdown questions into Moodle XML +--- +--- Copyright: © 2026 Florian Fischer +--- License: GPL-3.0-or-later + +-- Collected questions +local questions = {} +local cur_question = nil + +local concat = function(inlines) + local s = pandoc.write(pandoc.Pandoc(pandoc.Plain(inlines)), 'plain', {wrap_text='wrap-none'}) + if s:sub(-1) == '\n' then + s = s:sub(1, -2) + end + return s +end + +local function find_answer_attributes(answer) + local attributes = {} + answer:walk({Span=function(s) + if #s.classes > 0 then -- this is not the attribute span + return + end + for k, v in pairs(s.attributes) do + attributes[k] = v + end + end}) + return attributes +end + +local function detect_question_type(question) + local ret = "" + if question.header.classes:includes("shortanswer") then + ret = "shortanswer" + elseif question.header.classes:includes("multichoice") then + ret = "multichoice" + else + pandoc.warn("No question type found") + end + return ret +end + +local function write_answers(question, default_fraction, a) + for _, answer in ipairs(question.answers) do + local answer_attributes = find_answer_attributes(answer) + local frac = answer_attributes.fraction or default_fraction + a(' <answer fraction="'..frac..'" format="html">\n') + a(' <text><![CDATA['); + a(pandoc.write(pandoc.Pandoc(answer), "html")) + a(']]></text>\n') + + if answer.feedback then + a(' <feedback format="html"><text><![CDATA[') + a(pandoc.write(pandoc.Pandoc(answer.feedback), "html")) + a(']]></text></feedback>\n') + end + a(' </answer>\n') + end +end + +local function write_shortanwser(question, a) + a(' <usecase>0</usecase>\n') + write_answers(question, 100, a) +end + +local function write_multichoice(question, a) + local fractions = 0 + for _, answ in ipairs(question.answers) do + local answer_attributes = find_answer_attributes(answ) + if answer_attributes.fraction and tonumber(answer_attributes.fraction) > 0 then + fractions = fractions + 1 + end + end + + a(' <single>'..(fractions == 1 and "true" or "false")..'</single>') + a(' <shuffleanswers>true</shuffleanswers>') + a(' <answernumbering>none</answernumbering>') + a(' <showstandardinstruction>0</showstandardinstruction>') + a(' <correctfeedback format="html">') + a(' <text><![CDATA[<p>Die Antwort ist richtig.</p>]]></text>') + a(' </correctfeedback>') + a(' <partiallycorrectfeedback format="html">') + a(' <text><![CDATA[<p>Die Antwort ist teilweise richtig.</p>]]></text>') + a(' </partiallycorrectfeedback>') + a(' <incorrectfeedback format="html">') + a(' <text><![CDATA[<p>Die Antwort ist falsch.</p>]]></text>') + a(' </incorrectfeedback>') + a(' <shownumcorrect/>') + + write_answers(question, 0, a) +end + +local write_question_for = { + shortanswer = write_shortanwser, + multichoice = write_multichoice, +} + +local function write_questions() + local res = "" + local a = function(s) res = res .. s end + + for _, question in ipairs(questions) do + if not question then + pandoc.log.warn("nil question") + end + local question_type = detect_question_type(question) + -- Question type + a('<question type="' .. question_type .. '">\n') + + -- Question name + a(' <name><text>'); + a(concat(question.name)) + a('</text></name>\n') + + -- Question text + a(' <questiontext format="html">\n <text><![CDATA[') + for _, part in ipairs(question.text) do + a(pandoc.write(pandoc.Pandoc(part), "html")) + end + a(']]></text>\n </questiontext>\n') + a(' <generalfeedback format="html"><text></text></generalfeedback>\n') + a(' <defaultgrade>1.0000000</defaultgrade>\n') + a(' <penalty>0.3333333</penalty>\n') + a(' <hidden>0</hidden>\n') + a(' <idnumber></idnumber>\n') + + -- questiontype specific tags + local question_type_fn = write_question_for[question_type] + question_type_fn(question, a) + a('</question>\n') + end + + return res +end + +local function Header(h) + cur_question = { header=h, text={}} + table.insert(questions, cur_question) + + cur_question.name = h.content +end + +local function Image(i) + local datauri = pandoc.mediabag.make_data_uri(pandoc.mediabag.fetch(i.src)) + return pandoc.Image(i.caption, datauri) +end + +local function Div(d) + -- append question content + table.insert(cur_question.text, pandoc.walk_block(d, {Image=Image})) -- embed all images +end + +local function BulletList(l) + cur_question.answers = l.content +end + +local filter = { + -- Traverse the AST depth-first to reach the content of a question after + -- reaching its header + traverse = 'topdown', + Header = Header, -- Detect questions + Div = Div, -- Collect question content + BulletList = BulletList, -- Collect question answers +} + +Writer = function(doc, opts) + local ctx = pandoc.template.meta_to_context(doc.meta, concat, concat) + + -- collect questions + doc:walk(filter) + local body = write_questions() + + ctx['body'] = body + for k, v in pairs(opts.variables) do + ctx[k] = v + end + + if not opts.template then + pandoc.log.warn("No quiz template specified") + os.exit(1) + end + local complete = pandoc.template.apply(opts.template, ctx) + return complete:render() +end diff --git a/pandoc/templates/moodle-quiz.xml b/pandoc/templates/moodle-quiz.xml new file mode 100644 index 00000000..761c8669 --- /dev/null +++ b/pandoc/templates/moodle-quiz.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<quiz> +<!-- question: 0 --> + <question type="category"> + <category> + <text>$$module$$/top/Standard für ${title}</text> + </category> + <info format="moodle_auto_format"> + <text>Standardkategorie für Fragen, die im Kontext '${title}' freigegeben sind.</text> + </info> + <idnumber></idnumber> + </question> + +${body} +</quiz> diff --git a/scripts/lesson-make b/scripts/lesson-make index d5639b7a..3c6a4890 100755 --- a/scripts/lesson-make +++ b/scripts/lesson-make @@ -22,6 +22,9 @@ if [[ -z "${targets[*]}" ]]; then slides*.md) new_targets+=("${source_name/.md/.pdf}" "${source_name/.md/.pptx}") ;; + moodle-quiz.md) + new_targets+=("${source_name/.md/.xml}") + ;; *) mapfile -t new_targets < <(echo "${source}" | sed -e 's/\.tex$/.pdf/g' -e 's/\.md$/.pdf/g') ;; @@ -43,4 +46,3 @@ if [[ -z "${targets[*]}" ]]; then fi exec make -f "${MAKEFILE}" "${targets[@]}" - diff --git a/templates/moodle-quiz.md b/templates/moodle-quiz.md new file mode 100644 index 00000000..cb9041c6 --- /dev/null +++ b/templates/moodle-quiz.md @@ -0,0 +1,29 @@ +--- + title: Demo Quiz +--- + +## Good Question {.shortanswer} + +::: {.question-text} +This is a **good** question! + +Do you know the answer? +::: + +* yes +* no + +## Multiple Choice {.multichoice} + +::: {.question-text} +Look at all those answers! + +Select all primes +::: + +* 3 []{fraction=50} <!-- Weird hack using an empty span to specify the fraction --> +* 4 +* 5 []{fraction=50} +* 6 + +[foo]{.foobar} |
