diff --git a/.gamification.json b/.gamification.json index 1db9ac9..8ef0d9a 100644 --- a/.gamification.json +++ b/.gamification.json @@ -10,5 +10,5 @@ "streak_tage": 1, "letzter_aktiver_tag": "2026-08-29", "historie": [], - "zuletzt_aktualisiert": "2026-08-29T15:07:09.451191" + "zuletzt_aktualisiert": "2026-08-29T15:40:02.637013" } \ No newline at end of file diff --git a/assets/certificate.js b/assets/certificate.js new file mode 100644 index 0000000..f8da915 --- /dev/null +++ b/assets/certificate.js @@ -0,0 +1,59 @@ +/** + * 🎓 OFFIZIELLES LEISTUNGS-ZERTIFIKAT 🎓 + * ======================================= + * Generiert ein ausdruckbares Abschlusszertifikat nach Abschluss eines Lehrpfads. + */ + +(function () { + window.zeigeZertifikatModal = function (lehrpfadNummer) { + const data = window.GAMIFICATION_DATA || { spieler_name: "Python-Entwicklerin", level: 1 }; + const dateStr = new Date().toLocaleDateString("de-DE", { day: "2-digit", month: "long", year: "numeric" }); + + let titel = "Grundlagen der Python-Programmierung"; + let moduleDesc = "10 Module: Zahlen & Rechnen, Datentypen, f-Strings, Kontrollstrukturen, Funktionen, Listen, Strings, Dictionaries, Sets & Comprehensions"; + + if (lehrpfadNummer === 2) { + titel = "Einstieg in die Objektorientierung (OOP) & Entwickler-Tools"; + moduleDesc = "9 Module: Klassen, Konstruktor __init__, self, Methoden, UML-Diagramme, VS Code, Git-Versionskontrolle, Komposition & Tamagotchi-Projekt"; + } else if (lehrpfadNummer === 3) { + titel = "Fortgeschrittenes OOP, Softwarequalität & Desktop-GUIs"; + moduleDesc = "10 Module: Speicher-Referenzen, Dunder-Methoden, TDD Unit Testing, Vererbung, Polymorphie, Exceptions, JSON-Persistenz, Tkinter GUIs, Container & Masterprojekt"; + } else if (lehrpfadNummer === "master") { + titel = "Master of Python Software Engineering"; + moduleDesc = "Vollständiger Abschluss aller 3 Lehrpfade (27 Module, 188 bestandene automatisierte Unittests, Model-View-Controller Desktop-App)"; + } + + const modal = document.createElement("div"); + modal.className = "certificate-overlay"; + modal.innerHTML = ` +
+
+
+
🎓 OFFIZIELLES ZERTIFIKAT 🎓
+

Erfolgreicher Abschluss

+

Hiermit wird bescheinigt, dass

+
${data.spieler_name || "Python-Entwicklerin"}
+

den anspruchsvollen Lehrpfad

+

${titel}

+

${moduleDesc}

+
+
+ Erreichtes Level: Level ${data.level || 1} (${data.titel || "Entwicklerin"}) +
+
+ Datum: ${dateStr} +
+
+
🏆 EXZELLENZ-SIEGEL
+
+
+
+ + +
+
+ `; + + document.body.appendChild(modal); + }; +})(); diff --git a/assets/gamification_data.js b/assets/gamification_data.js index fb17f95..d46c4b7 100644 --- a/assets/gamification_data.js +++ b/assets/gamification_data.js @@ -11,7 +11,7 @@ window.GAMIFICATION_DATA = { "streak_tage": 1, "letzter_aktiver_tag": "2026-08-29", "historie": [], - "zuletzt_aktualisiert": "2026-08-29T15:07:09.451191" + "zuletzt_aktualisiert": "2026-08-29T15:40:02.637013" }; window.GAMIFICATION_BADGES_KATALOG = { "rechenkonegin": { diff --git a/assets/interpreter.js b/assets/interpreter.js new file mode 100644 index 0000000..6eb7323 --- /dev/null +++ b/assets/interpreter.js @@ -0,0 +1,170 @@ +/** + * 🩺 PYTHON TRACEBACK & FEHLER-DOLMETSCHER 🩺 + * ============================================ + * Basiert auf der didaktischen Fehlerforschung (Brett Becker et al., SIGCSE). + * Übersetzt kryptische Python-Fehlermeldungen in einfühlsames, klares Deutsch + * mit konkreten Handlungsanweisungen für Schülerinnen und Schüler. + */ + +(function () { + const ERROR_RULES = [ + { + type: "IndentationError", + pattern: /IndentationError: (expected an indented block|unindent does not match)/i, + title: "📐 Einrückungsfehler (IndentationError)", + explanation: "Python nutzt Einrückungen (Standard: genau 4 Leerzeichen), um zu erkennen, welcher Code zu einer Funktion, `if`-Bedingung oder Schleife gehört.", + causes: [ + "Nach einem Doppelpunkt (def ...:, if ...:, for ...:) fehlt die Einrückung.", + "Leerzeichen und Tabulatoren wurden versehentlich gemischt." + ], + fix: "Drücke nach dem Doppelpunkt Enter und rücke die Zeile mit Tab oder 4 Leerzeichen ein. Mit Umschalt + Tab kannst du Zeilen wieder nach links rücken." + }, + { + type: "TypeError NoneType", + pattern: /TypeError: 'NoneType' object is not (subscriptable|iterable|callable)/i, + title: "🕳️ Zugriff auf 'None' (TypeError)", + explanation: "Du versuchst auf ein Objekt zuzugreifen, das gar nicht existiert oder den Wert None hat.", + causes: [ + "Eine aufgerufene Funktion hat vergessen, ihr Ergebnis mit return zurückzugeben.", + "Eine Listen-Methode wie liste.sort() oder liste.append() gibt immer None zurück (sie verändert die Liste direkt!)." + ], + fix: "Prüfe in deinen Funktionen, ob am Ende ein return ergebnis steht. Schreibe niemals x = liste.sort(), sondern nur liste.sort()." + }, + { + type: "AttributeError", + pattern: /AttributeError: '([^']+)' object has no attribute '([^']+)'/i, + title: "🔍 Unbekanntes Attribut oder Methode (AttributeError)", + explanation: "Python konnte an dem Objekt die gewünschte Methode oder Eigenschaft nicht finden.", + causes: [ + "Tippfehler im Namen der Methode oder Variable (z.B. anhängen statt append).", + "Groß- und Kleinschreibung nicht beachtet (z.B. .Name statt .name).", + "In der Klassen-Methode wurde self. vergessen (z.B. alter statt self.alter)." + ], + fix: "Überprüfe die Schreibweise des Attributs exakt Buchstabe für Buchstabe. Nutze in Klassen immer self.attributname." + }, + { + type: "TypeError self missing", + pattern: /TypeError: ([^\(]+)\(\) takes \d+ positional arguments? but \d+ were given/i, + title: "🧩 Fehlendes 'self' in Methoden-Definition (TypeError)", + explanation: "Eine Methode in einer Klasse erwartet weniger oder mehr Parameter als übergeben wurden.", + causes: [ + "Der klassische Anfängerfehler: Du hast im Methodenkopf das self als ersten Parameter vergessen! (z.B. def fahren(): statt def fahren(self):)." + ], + fix: "Schreibe in jeder Methode deiner Klasse als allerersten Parameter immer self: z.B. def beschleunigen(self, kmh):." + }, + { + type: "IndexError", + pattern: /IndexError: (list index out of range|string index out of range)/i, + title: "🎯 Index außerhalb des gültigen Bereichs (IndexError)", + explanation: "Du greifst auf eine Position (Index) in einer Liste oder einem String zu, die gar nicht existiert.", + causes: [ + "Off-by-One Fehler: In Python beginnt die Zählung bei 0! Eine Liste mit 3 Elementen hat nur die Indizes 0, 1, 2 (nicht 3).", + "Die Liste ist noch leer." + ], + fix: "Prüfe die Länge der Liste mit len(liste). Das letzte Element erreichst du immer sicher mit liste[-1]." + }, + { + type: "KeyError", + pattern: /KeyError: (.+)/i, + title: "🔑 Schlüssel nicht im Dictionary gefunden (KeyError)", + explanation: "Du hast versucht, aus einem Dictionary dict[schluessel] einen Eintrag abzufragen, der nicht existiert.", + causes: [ + "Der gesuchte Key ist nicht im Dictionary vorhanden oder falsch geschrieben." + ], + fix: "Nutze die sichere Abfrage mit dict.get(key, standardwert) statt der eckigen Klammern, um Abstürze zu vermeiden!" + }, + { + type: "NameError", + pattern: /NameError: name '([^']+)' is not defined/i, + title: "❓ Name nicht definiert (NameError)", + explanation: "Python kennt das Wort oder die Variable an dieser Stelle nicht.", + causes: [ + "Die Variable wurde weiter unten oder in einer anderen Funktion definiert (Gültigkeitsbereich/Scope).", + "Ein Tippfehler im Variablennamen.", + "Ein Modul wie import math wurde noch nicht importiert." + ], + fix: "Prüfe, ob du die Variable vor ihrer Benutzung angelegt hast und ob alle benötigten Module oben mit import ... eingebunden sind." + }, + { + type: "ZeroDivisionError", + pattern: /ZeroDivisionError: division by zero/i, + title: "➗ Division durch Null (ZeroDivisionError)", + explanation: "In der Mathematik und in Python ist das Teilen durch 0 nicht erlaubt.", + causes: [ + "Der Nenner / Teiler hat den Wert 0." + ], + fix: "Sichere die Division mit einer if teiler != 0: Bedingung oder fange sie mit try-except ZeroDivisionError: ab." + } + ]; + + window.interpretiereTraceback = function (errorText) { + if (!errorText || !errorText.trim()) { + return { + matched: false, + title: "💡 Bitte füge eine Fehlermeldung ein", + explanation: "Kopiere deinen Traceback aus dem Terminal und füge ihn hier ein.", + fix: "Starte dein Skript im Terminal mit python3 test_aufgabe.py" + }; + } + + for (let rule of ERROR_RULES) { + if (rule.pattern.test(errorText)) { + return { + matched: true, + type: rule.type, + title: rule.title, + explanation: rule.explanation, + causes: rule.causes, + fix: rule.fix + }; + } + } + + return { + matched: false, + title: "🔍 Allgemeiner Python-Fehler", + explanation: "Lies den Traceback immer von ganz unten nach oben: In der allerletzten Zeile nennt Python die genaue Fehlerart und Zeilennummer.", + causes: ["Syntax- oder Logikfehler in deinem Code."], + fix: "Überprüfe die in der letzten Zeile genannte Zeilennummer in deiner aufgabe.py Datei." + }; + }; + + // Widget rendern, falls Container vorhanden + document.addEventListener("DOMContentLoaded", () => { + const interpreterEl = document.getElementById("error-interpreter-widget"); + if (!interpreterEl) return; + + interpreterEl.innerHTML = ` +
+

🩺 Interaktiver Python-Fehler-Dolmetscher

+

Du verstehst eine Fehlermeldung aus dem Terminal nicht? Füge sie hier ein und erhalte sofort eine schülerfreundliche deutsche Erklärung mit Reparatur-Anleitung!

+ + + + + + +
+ `; + + const input = document.getElementById("traceback-input"); + const btn = document.getElementById("btn-interpret"); + const result = document.getElementById("interpreter-result"); + + btn.addEventListener("click", () => { + const res = window.interpretiereTraceback(input.value); + result.innerHTML = ` +
+
${res.title}
+

Was bedeutet das? ${res.explanation}

+ ${res.causes ? `

Mögliche Ursachen:

` : ''} +
+ 🔧 So behebst du den Fehler: +

${res.fix}

+
+
+ `; + result.style.display = "block"; + }); + }); +})(); diff --git a/assets/parsons.js b/assets/parsons.js new file mode 100644 index 0000000..f486b9a --- /dev/null +++ b/assets/parsons.js @@ -0,0 +1,182 @@ +/** + * 🧩 INTERAKTIVES PARSONS-PUZZLE & PRIMM WIDGET 🧩 + * ================================================= + * Basiert auf der Forschung von Dale Parsons & Barbara Ericson. + * Ermöglicht Schülerinnen und Schülern das Sortieren von Code-Blöcken + * mit sofortigem Feedback und Gamification-XP. + */ + +(function () { + class ParsonsWidget { + constructor(container) { + this.container = container; + this.puzzleId = container.dataset.puzzleId || "puzzle_" + Math.random().toString(36).substr(2, 9); + this.initialLines = JSON.parse(container.dataset.lines || "[]"); + this.solution = JSON.parse(container.dataset.solution || "[]"); + this.explanation = container.dataset.explanation || "Sehr gut! Du hast die Logik fehlerfrei aufgebaut."; + this.xpReward = parseInt(container.dataset.xp || "25", 10); + + this.currentLines = [...this.initialLines]; + this.isSolved = this.loadSolvedState(); + this.render(); + } + + loadSolvedState() { + try { + const solved = JSON.parse(localStorage.getItem("parsons_solved") || "{}"); + return !!solved[this.puzzleId]; + } catch (e) { + return false; + } + } + + saveSolvedState() { + try { + const solved = JSON.parse(localStorage.getItem("parsons_solved") || "{}"); + solved[this.puzzleId] = true; + localStorage.setItem("parsons_solved", JSON.stringify(solved)); + + // Gamification XP Bonus gutschreiben + if (window.GAMIFICATION_DATA) { + window.GAMIFICATION_DATA.xp = (window.GAMIFICATION_DATA.xp || 0) + this.xpReward; + if (typeof renderGamificationHUD === "function") { + renderGamificationHUD(); + } + } + } catch (e) { + console.error("Fehler beim Speichern des Puzzle-Status:", e); + } + } + + render() { + this.container.classList.add("parsons-box"); + this.container.innerHTML = ` +
+
+ 🧩 Code-Puzzle (Parsons Problem) + ${this.isSolved ? '✅ Gelöst (+'+this.xpReward+' XP)' : '⭐ +'+this.xpReward+' XP'} +
+

+ Bringe die Code-Blöcke in die richtige logische Reihenfolge, bevor du selbst programmierst: +

+
+ +
+ ${this.currentLines.map((line, idx) => ` +
+
☰
+
${this.escapeHtml(line)}
+
+ + +
+
+ `).join("")} +
+ +
+ + +
+ +
+ ${this.isSolved ? `
🎉 Perfekt gelöst!
${this.explanation}
` : ''} +
+ `; + + this.attachEvents(); + } + + escapeHtml(text) { + const div = document.createElement("div"); + div.textContent = text; + return div.innerHTML; + } + + attachEvents() { + const board = document.getElementById(`board-${this.puzzleId}`); + const checkBtn = document.getElementById(`check-${this.puzzleId}`); + const hintBtn = document.getElementById(`hint-${this.puzzleId}`); + + // Up / Down Buttons + board.querySelectorAll(".btn-parsons-move").forEach(btn => { + btn.addEventListener("click", (e) => { + const lineEl = e.target.closest(".parsons-line"); + const idx = parseInt(lineEl.dataset.index, 10); + const dir = parseInt(e.target.dataset.dir, 10); + const targetIdx = idx + dir; + + if (targetIdx >= 0 && targetIdx < this.currentLines.length) { + const temp = this.currentLines[idx]; + this.currentLines[idx] = this.currentLines[targetIdx]; + this.currentLines[targetIdx] = temp; + this.render(); + } + }); + }); + + // Check Button + checkBtn.addEventListener("click", () => this.checkSolution()); + + // Hint Button + hintBtn.addEventListener("click", () => { + const correctFirst = this.solution[0]; + const currentFirstIdx = this.currentLines.indexOf(correctFirst); + if (currentFirstIdx > 0) { + this.currentLines.splice(currentFirstIdx, 1); + this.currentLines.unshift(correctFirst); + this.render(); + const feedback = document.getElementById(`feedback-${this.puzzleId}`); + feedback.innerHTML = `
💡 Tipp:
Der erste Block ${this.escapeHtml(correctFirst)} wurde an den Anfang gesetzt!
`; + feedback.style.display = "block"; + } + }); + } + + checkSolution() { + const feedback = document.getElementById(`feedback-${this.puzzleId}`); + let correct = true; + + for (let i = 0; i < this.solution.length; i++) { + if (this.currentLines[i] !== this.solution[i]) { + correct = false; + break; + } + } + + if (correct) { + feedback.innerHTML = ` +
+
🎉 Bravo! Alle Blöcke sind in der perfekten Reihenfolge!
+

${this.explanation}

+

+ ⭐ Du hast +${this.xpReward} XP für deinen Entwickler-Pass freigeschaltet! +

+
+ `; + feedback.style.display = "block"; + this.saveSolvedState(); + this.isSolved = true; + } else { + feedback.innerHTML = ` +
+
🤔 Noch nicht ganz...
+

Einige Zeilen stehen noch an der falschen Stelle. Überlege Schritt für Schritt: Was muss zuerst initialisiert oder berechnet werden, bevor der nächste Schritt ausgeführt werden kann?

+
+ `; + feedback.style.display = "block"; + } + } + } + + // Initialisiere alle Puzzle-Widgets auf der Seite + document.addEventListener("DOMContentLoaded", () => { + document.querySelectorAll(".parsons-puzzle").forEach(el => { + new ParsonsWidget(el); + }); + }); +})(); diff --git a/assets/style.css b/assets/style.css index d10bdc1..0ce0128 100644 --- a/assets/style.css +++ b/assets/style.css @@ -283,7 +283,7 @@ kbd { margin: 0 2px; } -/* Extension Cards (for VS Code Guide) */ +/* Extension Cards */ .extension-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); @@ -402,7 +402,7 @@ summary:hover { flex: 1; } -/* Grid & Roadmap Cards (for Overview) */ +/* Grid & Roadmap Cards */ .roadmap-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); @@ -735,6 +735,242 @@ summary:hover { color: #64748b; } +/* ========================================================================== + PARSONS PUZZLES & PRIMM WIDGETS + ========================================================================== */ + +.parsons-box { + background: #ffffff; + border: 2px solid var(--primary-light); + border-radius: var(--radius-md); + padding: 20px; + margin: 25px 0; + box-shadow: var(--shadow-sm); +} + +.parsons-header { + margin-bottom: 15px; +} + +.parsons-title { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 1.15rem; + font-weight: 800; + color: var(--primary); + margin-bottom: 6px; +} + +.parsons-badge { + background: var(--warning-light); + color: #b45309; + padding: 3px 10px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 700; +} + +.parsons-instruction { + font-size: 0.92rem; + color: var(--text-muted); + margin: 0; +} + +.parsons-board { + display: flex; + flex-direction: column; + gap: 8px; + margin: 15px 0; +} + +.parsons-line { + display: flex; + align-items: center; + gap: 12px; + background: #f8fafc; + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + padding: 10px 14px; + cursor: grab; + transition: all 0.2s; +} + +.parsons-line:hover { + border-color: var(--primary); + background: var(--primary-light); +} + +.parsons-handle { + color: var(--text-muted); + font-size: 1.1rem; + cursor: grab; + user-select: none; +} + +.parsons-code { + flex: 1; +} + +.parsons-code code { + background: transparent; + color: var(--text-main); + font-size: 0.95rem; + padding: 0; +} + +.parsons-actions { + display: flex; + gap: 4px; +} + +.btn-parsons-move { + background: #ffffff; + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 2px 8px; + font-size: 0.75rem; + cursor: pointer; + color: var(--text-muted); +} + +.btn-parsons-move:hover:not(:disabled) { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +.btn-parsons-move:disabled { + opacity: 0.3; + cursor: not-allowed; +} + +.parsons-controls { + display: flex; + gap: 10px; + margin-top: 15px; + flex-wrap: wrap; +} + +/* ========================================================================== + OFFICIAL CERTIFICATE MODAL + ========================================================================== */ + +.certificate-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(15, 23, 42, 0.85); + backdrop-filter: blur(4px); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.certificate-container { + background: #ffffff; + border-radius: var(--radius-md); + padding: 20px; + max-width: 750px; + width: 100%; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); +} + +.certificate-border { + border: 6px double #d97706; + border-radius: var(--radius-sm); + padding: 30px; + text-align: center; + background: #fffdfa; +} + +.certificate-badge { + font-size: 0.85rem; + font-weight: 800; + letter-spacing: 2px; + color: #b45309; + margin-bottom: 10px; +} + +.certificate-headline { + font-size: 2rem; + color: #1e293b; + margin-bottom: 8px; +} + +.certificate-sub { + color: var(--text-muted); + font-size: 0.95rem; + margin-bottom: 12px; +} + +.certificate-student-name { + font-size: 1.8rem; + font-weight: 800; + color: var(--primary); + text-decoration: underline; + text-decoration-color: #fbbf24; + text-underline-offset: 6px; + margin: 15px 0; +} + +.certificate-text { + color: var(--text-muted); + font-size: 0.95rem; +} + +.certificate-track-title { + font-size: 1.35rem; + color: #0f172a; + margin: 8px 0; +} + +.certificate-desc { + font-size: 0.88rem; + color: #64748b; + max-width: 550px; + margin: 0 auto 20px auto; + line-height: 1.45; +} + +.certificate-meta { + display: flex; + justify-content: space-around; + font-size: 0.9rem; + color: #334155; + margin: 20px 0; + padding: 12px 0; + border-top: 1px solid #e2e8f0; + border-bottom: 1px solid #e2e8f0; +} + +.certificate-seal { + font-size: 1rem; + font-weight: 800; + color: #b45309; + letter-spacing: 1px; +} + +.certificate-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 20px; +} + +@media print { + body * { visibility: hidden; } + .certificate-container, .certificate-container * { visibility: visible; } + .certificate-overlay { position: static; background: transparent; padding: 0; } + .certificate-actions { display: none; } +} + /* Responsive */ @media (max-width: 600px) { header h1 { font-size: 1.6rem; } diff --git a/index.html b/index.html index a0d3f29..7ff0891 100644 --- a/index.html +++ b/index.html @@ -486,6 +486,32 @@ object has no attribute 'gang' + +
+ + +
+

🏆 Offizielle Lehrpfad-Abschlusszertifikate

+

+ Sobald du einen Lehrpfad oder das gesamte Portal abgeschlossen hast, kannst du dir hier dein persönliches, ausdruckbares Abschluss-Zertifikat mit deinen freigeschalteten Leistungsnachweisen generieren! +

+ +
+ + + + +
+
+

🩺 Häufige Fragen & Troubleshooting

@@ -509,7 +535,7 @@ object has no attribute 'gang'
❌ Wie wechsle ich im Terminal zwischen den Ordnern hin und her?
-

In einen Unterordner hinein: cd g01_erste_schritte_taschenrechner

+

In einen Unterordner hinein: cd lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner

Einen Ordner nach oben zurück: cd ..

Inhalt des aktuellen Ordners auflisten: ls (oder dir auf Windows)

@@ -518,8 +544,11 @@ object has no attribute 'gang' - + + + + diff --git a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html index 7ef0c58..f57ec2e 100644 --- a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html +++ b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html @@ -305,5 +305,7 @@ + + diff --git a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html index 7f0c665..21ded64 100644 --- a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html +++ b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html @@ -256,5 +256,7 @@ + + diff --git a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html index e218e2b..c6cb303 100644 --- a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html +++ b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html @@ -259,5 +259,7 @@ return f"Steckbrief: {name} | Größe: {groesse_m:.2f} m | Gewicht: {gewicht_kg: + + diff --git a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html index 5a69680..1c32aab 100644 --- a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html +++ b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html @@ -291,5 +291,7 @@ return False + + diff --git a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html index c782b95..7687786 100644 --- a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html +++ b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html @@ -332,5 +332,7 @@ + + diff --git a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html index 199a552..e225ce8 100644 --- a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html +++ b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html @@ -285,5 +285,7 @@ + + diff --git a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html index b43b00d..032fcf9 100644 --- a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html +++ b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html @@ -276,5 +276,7 @@ + + diff --git a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html index 4dad936..523450b 100644 --- a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html +++ b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html @@ -231,5 +231,7 @@ + + diff --git a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html index 759d75d..2b9a916 100644 --- a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html +++ b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html @@ -305,5 +305,7 @@ + + diff --git a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html index facaa8e..ded0f97 100644 --- a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html +++ b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html @@ -255,5 +255,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html index fa1f742..553811a 100644 --- a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html +++ b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html @@ -209,5 +209,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html index e200751..cb387f5 100644 --- a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html +++ b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html @@ -291,5 +291,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html index d01f042..1162853 100644 --- a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html +++ b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html @@ -218,5 +218,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html index 70de633..2cb72b2 100644 --- a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html +++ b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html @@ -198,5 +198,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html index 375b3fa..25f71fc 100644 --- a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html +++ b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html @@ -205,5 +205,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html index 30daf0e..d97146a 100644 --- a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html +++ b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html @@ -318,5 +318,7 @@ sudo snap install --classic code + + diff --git a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html index 8de498d..8b46f53 100644 --- a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html +++ b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html @@ -214,5 +214,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html index 13dcc2e..81b920f 100644 --- a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html +++ b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html @@ -201,5 +201,7 @@ + + diff --git a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html index 7e62632..8834ec7 100644 --- a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html +++ b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html @@ -179,5 +179,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html index 7001a22..1bae18a 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html @@ -215,5 +215,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html index bbfd078..94d102d 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html @@ -280,5 +280,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html index 320f3fd..5d820d2 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html @@ -299,5 +299,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html index 411521e..5422767 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html @@ -359,5 +359,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html index 11355cc..75eef9b 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html @@ -392,5 +392,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html index bdde29f..1863674 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html @@ -259,5 +259,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html index 2768a0b..0a5709b 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html @@ -247,5 +247,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html index 0625f48..20fdc6a 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html @@ -352,5 +352,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html index aa44e26..b7f2b05 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html @@ -316,5 +316,7 @@ + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html index 47a1e3f..d1310fc 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html @@ -327,5 +327,7 @@ + +