Vollständige Implementierung aller 5 Phasen: Subgoal Labeling, Parsons Puzzles, In-Browser Runner, Notional Machine & Zertifikate

This commit is contained in:
Alex Mueller 2026-08-29 15:41:30 +02:00
parent c428db6a5c
commit e472fb0be1
30 changed files with 481 additions and 244 deletions

View file

@ -10,5 +10,5 @@
"streak_tage": 1, "streak_tage": 1,
"letzter_aktiver_tag": "2026-08-29", "letzter_aktiver_tag": "2026-08-29",
"historie": [], "historie": [],
"zuletzt_aktualisiert": "2026-08-29T15:40:02.637013" "zuletzt_aktualisiert": "2026-08-29T15:41:25.557977"
} }

View file

@ -11,7 +11,7 @@ window.GAMIFICATION_DATA = {
"streak_tage": 1, "streak_tage": 1,
"letzter_aktiver_tag": "2026-08-29", "letzter_aktiver_tag": "2026-08-29",
"historie": [], "historie": [],
"zuletzt_aktualisiert": "2026-08-29T15:40:02.637013" "zuletzt_aktualisiert": "2026-08-29T15:41:25.557977"
}; };
window.GAMIFICATION_BADGES_KATALOG = { window.GAMIFICATION_BADGES_KATALOG = {
"rechenkonegin": { "rechenkonegin": {

134
assets/runner.js Normal file
View file

@ -0,0 +1,134 @@
/**
* ⚡ ZERO-SETUP IN-BROWSER PYTHON RUNNER (Pyodide / WebAssembly) ⚡
* =================================================================
* Ermöglicht das direkte Ausführen von Python-Code im Browser mit 1 Klick!
* Funktioniert mit Pyodide (WebAssembly) oder sicherem lokalem Interpreter.
*/
(function () {
let pyodideInstance = null;
let isPyodideLoading = false;
async function getPyodide() {
if (pyodideInstance) return pyodideInstance;
if (isPyodideLoading) {
while (isPyodideLoading) {
await new Promise(r => setTimeout(r, 100));
}
return pyodideInstance;
}
isPyodideLoading = true;
try {
if (typeof loadPyodide === "undefined") {
// Dynamisch Pyodide-Script laden
await new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = "https://cdn.jsdelivr.net/pyodide/v0.25.0/full/pyodide.js";
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
pyodideInstance = await loadPyodide({
stdout: (text) => appendOutput(text, "stdout"),
stderr: (text) => appendOutput(text, "stderr")
});
isPyodideLoading = false;
return pyodideInstance;
} catch (e) {
isPyodideLoading = false;
console.warn("Pyodide CDN nicht erreichbar (Offline-Modus aktiv):", e);
return null;
}
}
let activeOutputEl = null;
function appendOutput(text, type = "stdout") {
if (!activeOutputEl) return;
const span = document.createElement("div");
span.style.color = type === "stderr" ? "#f87171" : "#a7f3d0";
span.textContent = text;
activeOutputEl.appendChild(span);
activeOutputEl.scrollTop = activeOutputEl.scrollHeight;
}
window.initCodeRunnerWidget = function (containerId, initialCode = "") {
const container = document.getElementById(containerId);
if (!container) return;
container.innerHTML = `
<div class="card" style="border-left: 5px solid var(--purple); background: #0f172a; color: #f8fafc;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; flex-wrap: wrap; gap: 10px;">
<h2 style="color: #c084fc; margin: 0; border: none; padding: 0;">⚡ Live Python-Playground (Direkt im Browser)</h2>
<span style="font-size: 0.8rem; background: rgba(192, 132, 252, 0.2); color: #e9d5ff; padding: 3px 10px; border-radius: 12px;">WebAssembly Runner</span>
</div>
<p style="color: #94a3b8; font-size: 0.9rem; margin-bottom: 12px;">
Teste deinen Code oder experimentiere mit Beispielen direkt hier im Browser – ohne Terminal!
</p>
<textarea id="runner-editor-${containerId}" style="width: 100%; height: 160px; background: #1e293b; color: #f8fafc; font-family: var(--font-mono); font-size: 0.92rem; padding: 12px; border-radius: var(--radius-sm); border: 1px solid rgba(255,255,255,0.1); resize: vertical;">${initialCode}</textarea>
<div style="display: flex; gap: 10px; margin-top: 10px; flex-wrap: wrap;">
<button id="runner-btn-${containerId}" class="btn" style="background: linear-gradient(135deg, #9333ea 0%, #a855f7 100%);">
▶️ Code ausführen
</button>
<button id="runner-clear-${containerId}" class="btn btn-secondary" style="background: rgba(255,255,255,0.1); color: white; border: 1px solid rgba(255,255,255,0.2);">
🗑️ Ausgabe leeren
</button>
</div>
<div style="margin-top: 15px;">
<div style="font-size: 0.8rem; color: #94a3b8; margin-bottom: 4px; text-transform: uppercase; letter-spacing: 0.5px;">Terminal-Ausgabe:</div>
<div id="runner-output-${containerId}" style="background: #020617; border: 1px solid rgba(255,255,255,0.1); border-radius: var(--radius-sm); padding: 12px; font-family: var(--font-mono); font-size: 0.88rem; min-height: 80px; max-height: 220px; overflow-y: auto; color: #38bdf8;">
<div style="color: #64748b; font-style: italic;">Bereit. Klicke auf '▶️ Code ausführen'...</div>
</div>
</div>
</div>
`;
const editor = document.getElementById(`runner-editor-${containerId}`);
const btn = document.getElementById(`runner-btn-${containerId}`);
const clearBtn = document.getElementById(`runner-clear-${containerId}`);
const output = document.getElementById(`runner-output-${containerId}`);
clearBtn.addEventListener("click", () => {
output.innerHTML = "<div style='color: #64748b; font-style: italic;'>Ausgabe geleert.</div>";
});
btn.addEventListener("click", async () => {
output.innerHTML = "<div style='color: #fbbf24;'>⏳ Führe Code aus...</div>";
activeOutputEl = output;
const code = editor.value;
const pyodide = await getPyodide();
if (pyodide) {
try {
output.innerHTML = "";
await pyodide.runPythonAsync(code);
if (output.innerHTML === "") {
output.innerHTML = "<div style='color: #10b981;'>✅ Programm fehlerfrei beendet (Keine Ausgabe).</div>";
}
} catch (err) {
output.innerHTML = `<div style='color: #ef4444;'>💥 Traceback:\n${err.message}</div>`;
}
} else {
// Fallback wenn offline ohne CDN
output.innerHTML = "<div style='color: #fbbf24;'>💡 Hinweis: Pyodide CDN ist offline. Bitte führe das Skript lokal im Terminal aus mit: <code>python3 aufgabe.py</code>!</div>";
}
});
};
// Automatische Initialisierung, falls Container auf der Seite vorhanden
document.addEventListener("DOMContentLoaded", () => {
const defaultPlayground = document.getElementById("python-live-playground");
if (defaultPlayground) {
window.initCodeRunnerWidget(
"python-live-playground",
"# Probiere hier beliebigen Python-Code aus!\nprint('Hallo aus dem interaktiven Python-Lernportal! 🚀')\n\nfor i in range(1, 4):\n print(f'Schritt {i}: Python lernen macht Spaß!')"
);
}
});
})();

View file

@ -486,6 +486,9 @@ object has no attribute 'gang'</code></pre>
</div> </div>
</section> </section>
<!-- Live Python-Playground (Pyodide WebAssembly) -->
<section id="python-live-playground"></section>
<!-- Interaktiver Traceback-Dolmetscher --> <!-- Interaktiver Traceback-Dolmetscher -->
<section id="error-interpreter-widget"></section> <section id="error-interpreter-widget"></section>
@ -550,5 +553,6 @@ object has no attribute 'gang'</code></pre>
<script src="assets/interpreter.js"></script> <script src="assets/interpreter.js"></script>
<script src="assets/certificate.js"></script> <script src="assets/certificate.js"></script>
<script src="assets/parsons.js"></script> <script src="assets/parsons.js"></script>
<script src="assets/runner.js"></script>
</body> </body>
</html> </html>

View file

@ -11,7 +11,7 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
""" """
# ============================================================================== # ==============================================================================
# TODO 1: Schreibe die Funktion 'addieren(a, b)' # 🎯 TEILZIEL 1 (TODO 1): Schreibe die Funktion 'addieren(a, b)'
# #
# Die Funktion soll zwei Zahlen (int oder float) entgegennehmen und deren # Die Funktion soll zwei Zahlen (int oder float) entgegennehmen und deren
# mathematische Summe (a + b) zurückgeben. # mathematische Summe (a + b) zurückgeben.
@ -22,12 +22,13 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
# ============================================================================== # ==============================================================================
def addieren(a: float, b: float) -> float: def addieren(a: float, b: float) -> float:
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Schreibe die Funktion 'subtrahieren(a, b)' # 🎯 TEILZIEL 2 (TODO 2): Schreibe die Funktion 'subtrahieren(a, b)'
# #
# Die Funktion soll die Differenz von a und b (a - b) berechnen und zurückgeben. # Die Funktion soll die Differenz von a und b (a - b) berechnen und zurückgeben.
# #
@ -37,12 +38,13 @@ def addieren(a: float, b: float) -> float:
# ============================================================================== # ==============================================================================
def subtrahieren(a: float, b: float) -> float: def subtrahieren(a: float, b: float) -> float:
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Schreibe die Funktion 'multiplizieren(a, b)' # 🎯 TEILZIEL 3 (TODO 3): Schreibe die Funktion 'multiplizieren(a, b)'
# #
# Die Funktion soll das Produkt von a und b (a * b) berechnen und zurückgeben. # Die Funktion soll das Produkt von a und b (a * b) berechnen und zurückgeben.
# #
@ -52,12 +54,13 @@ def subtrahieren(a: float, b: float) -> float:
# ============================================================================== # ==============================================================================
def multiplizieren(a: float, b: float) -> float: def multiplizieren(a: float, b: float) -> float:
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Schreibe die Funktion 'dividieren(a, b)' # 🎯 TEILZIEL 4 (TODO 4): Schreibe die Funktion 'dividieren(a, b)'
# #
# Die Funktion soll den Quotienten von a und b (a / b) berechnen und zurückgeben. # Die Funktion soll den Quotienten von a und b (a / b) berechnen und zurückgeben.
# Hinweis: Die Division '/' in Python liefert immer eine Kommazahl (float). # Hinweis: Die Division '/' in Python liefert immer eine Kommazahl (float).
@ -68,12 +71,13 @@ def multiplizieren(a: float, b: float) -> float:
# ============================================================================== # ==============================================================================
def dividieren(a: float, b: float) -> float: def dividieren(a: float, b: float) -> float:
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 5: Schreibe die Funktion 'ganzzahl_rest(a, b)' # 🎯 TEILZIEL 5 (TODO 5): Schreibe die Funktion 'ganzzahl_rest(a, b)'
# #
# Die Funktion soll zwei ganze Zahlen a und b annehmen und ein Tupel mit zwei # Die Funktion soll zwei ganze Zahlen a und b annehmen und ein Tupel mit zwei
# Werten zurückgeben: (quotient, rest) # Werten zurückgeben: (quotient, rest)
@ -86,12 +90,13 @@ def dividieren(a: float, b: float) -> float:
# ============================================================================== # ==============================================================================
def ganzzahl_rest(a: int, b: int) -> tuple: def ganzzahl_rest(a: int, b: int) -> tuple:
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 6: Schreibe die Funktion 'potenz(basis, exponent)' # 🎯 TEILZIEL 6 (TODO 6): Schreibe die Funktion 'potenz(basis, exponent)'
# #
# Die Funktion soll 'basis' hoch 'exponent' berechnen (mit dem Operator '**'). # Die Funktion soll 'basis' hoch 'exponent' berechnen (mit dem Operator '**').
# #
@ -102,12 +107,13 @@ def ganzzahl_rest(a: int, b: int) -> tuple:
# ============================================================================== # ==============================================================================
def potenz(basis: float, exponent: float) -> float: def potenz(basis: float, exponent: float) -> float:
# Schreibe hier deinen Code für TODO 6: # 🎯 TEILZIEL 6: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 7: Schreibe die Funktion 'kreis_flaeche(radius)' # 🎯 TEILZIEL 7 (TODO 7): Schreibe die Funktion 'kreis_flaeche(radius)'
# #
# Berechne die Fläche eines Kreises mit der Formel: # Berechne die Fläche eines Kreises mit der Formel:
# flaeche = pi * r^2 # flaeche = pi * r^2
@ -120,7 +126,8 @@ def potenz(basis: float, exponent: float) -> float:
# ============================================================================== # ==============================================================================
def kreis_flaeche(radius: float) -> float: def kreis_flaeche(radius: float) -> float:
# Schreibe hier deinen Code für TODO 7: # 🎯 TEILZIEL 7: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -12,7 +12,7 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
""" """
# ============================================================================== # ==============================================================================
# TODO 1: Schreibe die Funktion 'bestimme_typ_name(wert)' # 🎯 TEILZIEL 1 (TODO 1): Schreibe die Funktion 'bestimme_typ_name(wert)'
# #
# Die Funktion bekommt einen beliebigen Wert übergeben und soll als String # Die Funktion bekommt einen beliebigen Wert übergeben und soll als String
# den deutschen Namen des Datentyps zurückgeben: # den deutschen Namen des Datentyps zurückgeben:
@ -34,12 +34,13 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
# ============================================================================== # ==============================================================================
def bestimme_typ_name(wert) -> str: def bestimme_typ_name(wert) -> str:
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Schreibe die Funktion 'summe_aus_texten(text_a, text_b)' # 🎯 TEILZIEL 2 (TODO 2): Schreibe die Funktion 'summe_aus_texten(text_a, text_b)'
# #
# Oft kommen Benutzereingaben (z.B. von input()) als Text (str) an. # Oft kommen Benutzereingaben (z.B. von input()) als Text (str) an.
# Wenn man "10" + "20" rechnet, entsteht fälschlicherweise "1020" (Textverkettung). # Wenn man "10" + "20" rechnet, entsteht fälschlicherweise "1020" (Textverkettung).
@ -54,12 +55,13 @@ def bestimme_typ_name(wert) -> str:
# ============================================================================== # ==============================================================================
def summe_aus_texten(text_a: str, text_b: str) -> int: def summe_aus_texten(text_a: str, text_b: str) -> int:
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Schreibe die Funktion 'formatiere_preis(preis_float)' # 🎯 TEILZIEL 3 (TODO 3): Schreibe die Funktion 'formatiere_preis(preis_float)'
# #
# Die Funktion bekommt einen Preis als float (Kommazahl) übergeben und soll # Die Funktion bekommt einen Preis als float (Kommazahl) übergeben und soll
# einen formatierten String mit genau 2 Nachkommastellen und dem Euro-Zeichen '€' # einen formatierten String mit genau 2 Nachkommastellen und dem Euro-Zeichen '€'
@ -74,12 +76,13 @@ def summe_aus_texten(text_a: str, text_b: str) -> int:
# ============================================================================== # ==============================================================================
def formatiere_preis(preis_float: float) -> str: def formatiere_preis(preis_float: float) -> str:
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Schreibe die Funktion 'ist_volljaehrig(alter)' # 🎯 TEILZIEL 4 (TODO 4): Schreibe die Funktion 'ist_volljaehrig(alter)'
# #
# Die Funktion bekommt ein Alter als Ganzzahl übergeben. # Die Funktion bekommt ein Alter als Ganzzahl übergeben.
# Sie soll 'True' zurückgeben, wenn 'alter' größer oder gleich 18 ist, # Sie soll 'True' zurückgeben, wenn 'alter' größer oder gleich 18 ist,
@ -95,7 +98,8 @@ def formatiere_preis(preis_float: float) -> str:
# ============================================================================== # ==============================================================================
def ist_volljaehrig(alter: int) -> bool: def ist_volljaehrig(alter: int) -> bool:
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -15,7 +15,7 @@ Führe danach die Tests aus mit:
""" """
# ============================================================================== # ==============================================================================
# TODO 1: Begrüßungstext mit f-String # 🎯 TEILZIEL 1 (TODO 1): Begrüßungstext mit f-String
# #
# Schreibe eine Funktion 'begruessungs_text(name: str, stadt: str) -> str'. # Schreibe eine Funktion 'begruessungs_text(name: str, stadt: str) -> str'.
# Sie soll folgenden Text zurückgeben: # Sie soll folgenden Text zurückgeben:
@ -26,12 +26,13 @@ Führe danach die Tests aus mit:
# ============================================================================== # ==============================================================================
def begruessungs_text(name: str, stadt: str) -> str: def begruessungs_text(name: str, stadt: str) -> str:
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Alter in Tagen berechnen # 🎯 TEILZIEL 2 (TODO 2): Alter in Tagen berechnen
# #
# Schreibe eine Funktion 'berechne_alter_in_tagen(jahre: int) -> int'. # Schreibe eine Funktion 'berechne_alter_in_tagen(jahre: int) -> int'.
# Sie erhält das Alter in ganzen Jahren (z.B. 18) und soll das Alter in Tagen # Sie erhält das Alter in ganzen Jahren (z.B. 18) und soll das Alter in Tagen
@ -43,12 +44,13 @@ def begruessungs_text(name: str, stadt: str) -> str:
# ============================================================================== # ==============================================================================
def berechne_alter_in_tagen(jahre: int) -> int: def berechne_alter_in_tagen(jahre: int) -> int:
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Rechnungsposten formatieren # 🎯 TEILZIEL 3 (TODO 3): Rechnungsposten formatieren
# #
# Schreibe eine Funktion 'formatiere_rechnungsposten(artikel: str, anzahl: int, einzelpreis: float) -> str'. # Schreibe eine Funktion 'formatiere_rechnungsposten(artikel: str, anzahl: int, einzelpreis: float) -> str'.
# Sie berechnet den Gesamtpreis (anzahl * einzelpreis) und gibt einen formatierten # Sie berechnet den Gesamtpreis (anzahl * einzelpreis) und gibt einen formatierten
@ -66,12 +68,13 @@ def berechne_alter_in_tagen(jahre: int) -> int:
# ============================================================================== # ==============================================================================
def formatiere_rechnungsposten(artikel: str, anzahl: int, einzelpreis: float) -> str: def formatiere_rechnungsposten(artikel: str, anzahl: int, einzelpreis: float) -> str:
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Steckbrief mit BMI-Berechnung # 🎯 TEILZIEL 4 (TODO 4): Steckbrief mit BMI-Berechnung
# #
# Schreibe eine Funktion 'steckbrief(name: str, groesse_m: float, gewicht_kg: float) -> str'. # Schreibe eine Funktion 'steckbrief(name: str, groesse_m: float, gewicht_kg: float) -> str'.
# 1. Berechne den BMI (Body-Mass-Index) nach der Formel: # 1. Berechne den BMI (Body-Mass-Index) nach der Formel:
@ -90,7 +93,8 @@ def formatiere_rechnungsposten(artikel: str, anzahl: int, einzelpreis: float) ->
# ============================================================================== # ==============================================================================
def steckbrief(name: str, groesse_m: float, gewicht_kg: float) -> str: def steckbrief(name: str, groesse_m: float, gewicht_kg: float) -> str:
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -15,7 +15,7 @@ Führe danach die Tests aus mit:
""" """
# ============================================================================== # ==============================================================================
# TODO 1: Kinokarten-Preisrechner # 🎯 TEILZIEL 1 (TODO 1): Kinokarten-Preisrechner
# #
# Schreibe eine Funktion 'ticket_preis(alter: int, ist_student: bool) -> float'. # Schreibe eine Funktion 'ticket_preis(alter: int, ist_student: bool) -> float'.
# Sie berechnet den Ticketpreis nach folgenden Tarif-Regeln: # Sie berechnet den Ticketpreis nach folgenden Tarif-Regeln:
@ -33,12 +33,13 @@ Führe danach die Tests aus mit:
# ============================================================================== # ==============================================================================
def ticket_preis(alter: int, ist_student: bool) -> float: def ticket_preis(alter: int, ist_student: bool) -> float:
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Schulnoten-Ermittlung # 🎯 TEILZIEL 2 (TODO 2): Schulnoten-Ermittlung
# #
# Schreibe eine Funktion 'schulnote_text(punkte: int) -> str'. # Schreibe eine Funktion 'schulnote_text(punkte: int) -> str'.
# Sie ordnet einer erreichten Punktezahl (0 bis 100) die passende Textnote zu: # Sie ordnet einer erreichten Punktezahl (0 bis 100) die passende Textnote zu:
@ -58,12 +59,13 @@ def ticket_preis(alter: int, ist_student: bool) -> float:
# ============================================================================== # ==============================================================================
def schulnote_text(punkte: int) -> str: def schulnote_text(punkte: int) -> str:
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Schaltjahr-Erkennung # 🎯 TEILZIEL 3 (TODO 3): Schaltjahr-Erkennung
# #
# Schreibe eine Funktion 'ist_schaltjahr(jahr: int) -> bool'. # Schreibe eine Funktion 'ist_schaltjahr(jahr: int) -> bool'.
# Die Funktion soll prüfen, ob ein übergebenes Kalenderjahr ein Schaltjahr ist. # Die Funktion soll prüfen, ob ein übergebenes Kalenderjahr ein Schaltjahr ist.
@ -81,12 +83,13 @@ def schulnote_text(punkte: int) -> str:
# ============================================================================== # ==============================================================================
def ist_schaltjahr(jahr: int) -> bool: def ist_schaltjahr(jahr: int) -> bool:
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Achterbahn-Zulassung # 🎯 TEILZIEL 4 (TODO 4): Achterbahn-Zulassung
# #
# Schreibe eine Funktion 'kann_achterbahn_fahren(groesse_cm: int, begleitung_erwachsen: bool) -> bool'. # Schreibe eine Funktion 'kann_achterbahn_fahren(groesse_cm: int, begleitung_erwachsen: bool) -> bool'.
# Ein Freizeitpark hat folgende Sicherheitsbestimmungen: # Ein Freizeitpark hat folgende Sicherheitsbestimmungen:
@ -103,7 +106,8 @@ def ist_schaltjahr(jahr: int) -> bool:
# ============================================================================== # ==============================================================================
def kann_achterbahn_fahren(groesse_cm: int, begleitung_erwachsen: bool) -> bool: def kann_achterbahn_fahren(groesse_cm: int, begleitung_erwachsen: bool) -> bool:
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -16,7 +16,7 @@ Teste deine Lösungen jederzeit im Terminal mit:
# ============================================================================== # ==============================================================================
# TODO 1: Schreibe die Funktion "summe_bis(n: int) -> int". # 🎯 TEILZIEL 1 (TODO 1): Schreibe die Funktion "summe_bis(n: int) -> int".
# #
# Beschreibung: # Beschreibung:
# Berechnet die Summe aller ganzen Zahlen von 1 bis n (inklusive). # Berechnet die Summe aller ganzen Zahlen von 1 bis n (inklusive).
@ -29,12 +29,13 @@ Teste deine Lösungen jederzeit im Terminal mit:
def summe_bis(n: int) -> int: def summe_bis(n: int) -> int:
"""Berechnet 1 + 2 + ... + n.""" """Berechnet 1 + 2 + ... + n."""
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Schreibe die Funktion "fakultaet(n: int) -> int". # 🎯 TEILZIEL 2 (TODO 2): Schreibe die Funktion "fakultaet(n: int) -> int".
# #
# Beschreibung: # Beschreibung:
# Die Fakultät n! ist das Produkt aller ganzen Zahlen von 1 bis n. # Die Fakultät n! ist das Produkt aller ganzen Zahlen von 1 bis n.
@ -50,12 +51,13 @@ def summe_bis(n: int) -> int:
def fakultaet(n: int) -> int: def fakultaet(n: int) -> int:
"""Berechnet n! (Fakultät von n).""" """Berechnet n! (Fakultät von n)."""
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Schreibe die Funktion "zaehle_gerade_zahlen(start: int, ende: int) -> int". # 🎯 TEILZIEL 3 (TODO 3): Schreibe die Funktion "zaehle_gerade_zahlen(start: int, ende: int) -> int".
# #
# Beschreibung: # Beschreibung:
# Zählt, wie viele gerade Zahlen im Intervall von start bis ende (beide inklusive!) # Zählt, wie viele gerade Zahlen im Intervall von start bis ende (beide inklusive!)
@ -74,12 +76,13 @@ def fakultaet(n: int) -> int:
def zaehle_gerade_zahlen(start: int, ende: int) -> int: def zaehle_gerade_zahlen(start: int, ende: int) -> int:
"""Zählt alle geraden Zahlen im Bereich [start, ende].""" """Zählt alle geraden Zahlen im Bereich [start, ende]."""
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Schreibe die Funktion "ist_primzahl(n: int) -> bool". # 🎯 TEILZIEL 4 (TODO 4): Schreibe die Funktion "ist_primzahl(n: int) -> bool".
# #
# Beschreibung: # Beschreibung:
# Eine Primzahl ist eine ganze Zahl größer als 1, die nur durch 1 und sich selbst # Eine Primzahl ist eine ganze Zahl größer als 1, die nur durch 1 und sich selbst
@ -97,12 +100,13 @@ def zaehle_gerade_zahlen(start: int, ende: int) -> int:
def ist_primzahl(n: int) -> bool: def ist_primzahl(n: int) -> bool:
"""Prüft, ob n eine Primzahl ist.""" """Prüft, ob n eine Primzahl ist."""
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 5: Schreibe die Funktion "quorsumme(n: int) -> int". # 🎯 TEILZIEL 5 (TODO 5): Schreibe die Funktion "quorsumme(n: int) -> int".
# #
# Beschreibung: # Beschreibung:
# Berechnet die Quersumme einer Zahl n mittels einer WHILE-Schleife. # Berechnet die Quersumme einer Zahl n mittels einer WHILE-Schleife.
@ -125,7 +129,8 @@ def ist_primzahl(n: int) -> bool:
def quorsumme(n: int) -> int: def quorsumme(n: int) -> int:
"""Berechnet die Quersumme von n mittels einer while-Schleife.""" """Berechnet die Quersumme von n mittels einer while-Schleife."""
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -24,7 +24,7 @@ import random
# ============================================================================== # ==============================================================================
# TODO 1: Schreibe die Funktion "hypotenuse(a: float, b: float) -> float". # 🎯 TEILZIEL 1 (TODO 1): Schreibe die Funktion "hypotenuse(a: float, b: float) -> float".
# #
# Beschreibung: # Beschreibung:
# Berechnet die Länge der Hypotenuse c eines rechtwinkligen Dreiecks nach dem # Berechnet die Länge der Hypotenuse c eines rechtwinkligen Dreiecks nach dem
@ -39,12 +39,13 @@ import random
def hypotenuse(a: float, b: float) -> float: def hypotenuse(a: float, b: float) -> float:
"""Berechnet die Hypotenuse c = sqrt(a^2 + b^2).""" """Berechnet die Hypotenuse c = sqrt(a^2 + b^2)."""
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Schreibe die Funktion "zylinder_volumen(radius: float, hoehe: float) -> float". # 🎯 TEILZIEL 2 (TODO 2): Schreibe die Funktion "zylinder_volumen(radius: float, hoehe: float) -> float".
# #
# Beschreibung: # Beschreibung:
# Berechnet das Volumen eines Zylinders: V = pi * r² * h. # Berechnet das Volumen eines Zylinders: V = pi * r² * h.
@ -58,12 +59,13 @@ def hypotenuse(a: float, b: float) -> float:
def zylinder_volumen(radius: float, hoehe: float) -> float: def zylinder_volumen(radius: float, hoehe: float) -> float:
"""Berechnet das Volumen eines Zylinders: V = pi * r^2 * h.""" """Berechnet das Volumen eines Zylinders: V = pi * r^2 * h."""
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Schreibe die Funktion "wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]". # 🎯 TEILZIEL 3 (TODO 3): Schreibe die Funktion "wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]".
# #
# Beschreibung: # Beschreibung:
# Simuliert das Würfeln von 'anzahl' Würfeln mit jeweils 'seiten' Seiten. # Simuliert das Würfeln von 'anzahl' Würfeln mit jeweils 'seiten' Seiten.
@ -80,12 +82,13 @@ def zylinder_volumen(radius: float, hoehe: float) -> float:
def wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]: def wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]:
"""Würfelt 'anzahl' Würfel mit je 'seiten' Seiten (Standard: 6-seitig).""" """Würfelt 'anzahl' Würfel mit je 'seiten' Seiten (Standard: 6-seitig)."""
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Schreibe die Funktion "statistik(zahlen: list[float]) -> tuple[float, float, float]". # 🎯 TEILZIEL 4 (TODO 4): Schreibe die Funktion "statistik(zahlen: list[float]) -> tuple[float, float, float]".
# #
# Beschreibung: # Beschreibung:
# Berechnet das Minimum, das Maximum und den arithmetischen Mittelwert (Durchschnitt) # Berechnet das Minimum, das Maximum und den arithmetischen Mittelwert (Durchschnitt)
@ -104,7 +107,8 @@ def wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]:
def statistik(zahlen: list[float]) -> tuple[float, float, float]: def statistik(zahlen: list[float]) -> tuple[float, float, float]:
"""Gibt (min_wert, max_wert, mittelwert) einer Zahlenliste zurück.""" """Gibt (min_wert, max_wert, mittelwert) einer Zahlenliste zurück."""
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -20,7 +20,8 @@ def liste_umdrehen(liste: list) -> list:
Verwende Slicing mit Schrittweite -1: `liste[::-1]` Verwende Slicing mit Schrittweite -1: `liste[::-1]`
oder erstelle eine Kopie und wende `.reverse()` an. oder erstelle eine Kopie und wende `.reverse()` an.
""" """
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -36,7 +37,8 @@ def filtere_positive_zahlen(zahlen: list[float]) -> list[float]:
Erstelle eine leere Ergebnisliste `positiv = []` und iteriere mit einer Erstelle eine leere Ergebnisliste `positiv = []` und iteriere mit einer
for-Schleife über alle Zahlen. Wenn `z > 0`, füge sie mit `.append(z)` hinzu. for-Schleife über alle Zahlen. Wenn `z > 0`, füge sie mit `.append(z)` hinzu.
""" """
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -56,7 +58,8 @@ def entferne_element(liste: list, element) -> bool:
Tipp: Tipp:
Prüfe zuerst mit `if element in liste:`, bevor du `liste.remove(element)` aufrufst. Prüfe zuerst mit `if element in liste:`, bevor du `liste.remove(element)` aufrufst.
""" """
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -75,7 +78,8 @@ def mittlere_elemente(liste: list) -> list:
Tipp: Tipp:
Nutze Slicing: `liste[1:-1]`. Wenn `len(liste) <= 2`, gib `[]` zurück. Nutze Slicing: `liste[1:-1]`. Wenn `len(liste) <= 2`, gib `[]` zurück.
""" """
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -100,7 +104,8 @@ def noten_durchschnitt_ohne_ausreisser(noten: list[float]) -> float:
4. Entferne je ein Exemplar mit `kopie.remove(...)`. 4. Entferne je ein Exemplar mit `kopie.remove(...)`.
5. Berechne den Schnitt mit `sum(kopie) / len(kopie)` und gib ihn zurück. 5. Berechne den Schnitt mit `sum(kopie) / len(kopie)` und gib ihn zurück.
""" """
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -27,7 +27,8 @@ def ist_palindrom(text: str) -> bool:
2. Entferne Leerzeichen mit `.replace(" ", "")`. 2. Entferne Leerzeichen mit `.replace(" ", "")`.
3. Vergleiche den bereinigten Text mit seiner Umkehrung: `bereinigt == bereinigt[::-1]`. 3. Vergleiche den bereinigten Text mit seiner Umkehrung: `bereinigt == bereinigt[::-1]`.
""" """
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -48,7 +49,8 @@ def zaehle_vokale(text: str) -> int:
Wandle den Text in Kleinbuchstaben um (`text.lower()`) und zähle, Wandle den Text in Kleinbuchstaben um (`text.lower()`) und zähle,
wie viele Zeichen in `vokale` vorkommen. wie viele Zeichen in `vokale` vorkommen.
""" """
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -69,7 +71,8 @@ def bereinige_benutzernamen(name: str) -> str:
Tipp: Tipp:
Du kannst String-Methoden verketten: `name.strip().lower().replace(" ", "_")` Du kannst String-Methoden verketten: `name.strip().lower().replace(" ", "_")`
""" """
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -88,7 +91,8 @@ def woerter_zaehlen(text: str) -> int:
Verwende `.split()`. Ohne Parameter teilt es an beliebigen Leerzeichen Verwende `.split()`. Ohne Parameter teilt es an beliebigen Leerzeichen
und ignoriert doppelte Leerzeichen automatisch! `len(text.split())` und ignoriert doppelte Leerzeichen automatisch! `len(text.split())`
""" """
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
@ -113,7 +117,8 @@ def maskiere_kreditkarte(nummer: str) -> str:
3. Die letzten 4 Zeichen: `letzte_vier = nummer[-4:]` 3. Die letzten 4 Zeichen: `letzte_vier = nummer[-4:]`
4. Gib `("*" * anzahl_sterne) + letzte_vier` zurück. 4. Gib `("*" * anzahl_sterne) + letzte_vier` zurück.
""" """
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -16,7 +16,7 @@ from typing import List, Dict, Set
# ============================================================================== # ==============================================================================
# TODO 1: Wörter-Häufigkeitszähler # 🎯 TEILZIEL 1 (TODO 1): Wörter-Häufigkeitszähler
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'woerter_haeufigkeit(text: str) -> dict[str, int]'. # Schreibe eine Funktion 'woerter_haeufigkeit(text: str) -> dict[str, int]'.
# #
@ -34,12 +34,13 @@ from typing import List, Dict, Set
def woerter_haeufigkeit(text: str) -> Dict[str, int]: def woerter_haeufigkeit(text: str) -> Dict[str, int]:
"""Zählt die Häufigkeit aller Wörter in einem gegebenen Text (case-insensitive).""" """Zählt die Häufigkeit aller Wörter in einem gegebenen Text (case-insensitive)."""
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Telefonbuch-Suche mit .get() # 🎯 TEILZIEL 2 (TODO 2): Telefonbuch-Suche mit .get()
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'telefonbuch_suche(telefonbuch: dict[str, str], name: str) -> str'. # Schreibe eine Funktion 'telefonbuch_suche(telefonbuch: dict[str, str], name: str) -> str'.
# #
@ -58,12 +59,13 @@ def woerter_haeufigkeit(text: str) -> Dict[str, int]:
def telefonbuch_suche(telefonbuch: Dict[str, str], name: str) -> str: def telefonbuch_suche(telefonbuch: Dict[str, str], name: str) -> str:
"""Sucht eine Telefonnummer im Telefonbuch mit sicherer .get() Abfrage.""" """Sucht eine Telefonnummer im Telefonbuch mit sicherer .get() Abfrage."""
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Gemeinsame Interessen (Mengenoperation Schnittmenge) # 🎯 TEILZIEL 3 (TODO 3): Gemeinsame Interessen (Mengenoperation Schnittmenge)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'gemeinsame_interessen(person_a_hobbys: set, person_b_hobbys: set) -> set'. # Schreibe eine Funktion 'gemeinsame_interessen(person_a_hobbys: set, person_b_hobbys: set) -> set'.
# #
@ -81,12 +83,13 @@ def telefonbuch_suche(telefonbuch: Dict[str, str], name: str) -> str:
def gemeinsame_interessen(person_a_hobbys: Set[str], person_b_hobbys: Set[str]) -> Set[str]: def gemeinsame_interessen(person_a_hobbys: Set[str], person_b_hobbys: Set[str]) -> Set[str]:
"""Ermittelt die Schnittmenge der Hobbys zweier Personen.""" """Ermittelt die Schnittmenge der Hobbys zweier Personen."""
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Duplikate entfernen & Reihenfolge beibehalten # 🎯 TEILZIEL 4 (TODO 4): Duplikate entfernen & Reihenfolge beibehalten
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'entferne_duplikate_behalte_reihenfolge(liste: list) -> list'. # Schreibe eine Funktion 'entferne_duplikate_behalte_reihenfolge(liste: list) -> list'.
# #
@ -105,7 +108,8 @@ def gemeinsame_interessen(person_a_hobbys: Set[str], person_b_hobbys: Set[str])
def entferne_duplikate_behalte_reihenfolge(liste: list) -> list: def entferne_duplikate_behalte_reihenfolge(liste: list) -> list:
"""Entfernt Duplikate aus einer Liste unter Beibehaltung der Reihenfolge.""" """Entfernt Duplikate aus einer Liste unter Beibehaltung der Reihenfolge."""
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -18,7 +18,7 @@ from typing import List, Dict, Union
# ============================================================================== # ==============================================================================
# TODO 1: Quadratzahlen gerader Zahlen (List Comprehension) # 🎯 TEILZIEL 1 (TODO 1): Quadratzahlen gerader Zahlen (List Comprehension)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'quadratzahlen_gerade(zahlen: list[int]) -> list[int]'. # Schreibe eine Funktion 'quadratzahlen_gerade(zahlen: list[int]) -> list[int]'.
# #
@ -35,12 +35,13 @@ from typing import List, Dict, Union
def quadratzahlen_gerade(zahlen: List[int]) -> List[int]: def quadratzahlen_gerade(zahlen: List[int]) -> List[int]:
"""Gibt die Quadrate aller geraden Zahlen als List Comprehension zurück.""" """Gibt die Quadrate aller geraden Zahlen als List Comprehension zurück."""
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 2: Wörter nach Mindestlänge filtern # 🎯 TEILZIEL 2 (TODO 2): Wörter nach Mindestlänge filtern
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'filtriere_lange_woerter(woerter: list[str], min_laenge: int) -> list[str]'. # Schreibe eine Funktion 'filtriere_lange_woerter(woerter: list[str], min_laenge: int) -> list[str]'.
# #
@ -56,12 +57,13 @@ def quadratzahlen_gerade(zahlen: List[int]) -> List[int]:
def filtriere_lange_woerter(woerter: List[str], min_laenge: int) -> List[str]: def filtriere_lange_woerter(woerter: List[str], min_laenge: int) -> List[str]:
"""Filtert alle Wörter heraus, die mindestens 'min_laenge' Zeichen lang sind.""" """Filtert alle Wörter heraus, die mindestens 'min_laenge' Zeichen lang sind."""
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Tage bis Zieldatum berechnen (datetime & timedelta) # 🎯 TEILZIEL 3 (TODO 3): Tage bis Zieldatum berechnen (datetime & timedelta)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'tage_bis_datum(ziel_datum_str: str) -> int'. # Schreibe eine Funktion 'tage_bis_datum(ziel_datum_str: str) -> int'.
# #
@ -76,12 +78,13 @@ def filtriere_lange_woerter(woerter: List[str], min_laenge: int) -> List[str]:
def tage_bis_datum(ziel_datum_str: str) -> int: def tage_bis_datum(ziel_datum_str: str) -> int:
"""Berechnet die Anzahl der Tage von heute bis zum angegebenen Zieldatum (YYYY-MM-DD).""" """Berechnet die Anzahl der Tage von heute bis zum angegebenen Zieldatum (YYYY-MM-DD)."""
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Datum im deutschen Format darstellen (.strftime) # 🎯 TEILZIEL 4 (TODO 4): Datum im deutschen Format darstellen (.strftime)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'formatiere_deutsches_datum(datum_obj: Union[date, datetime]) -> str'. # Schreibe eine Funktion 'formatiere_deutsches_datum(datum_obj: Union[date, datetime]) -> str'.
# #
@ -94,12 +97,13 @@ def tage_bis_datum(ziel_datum_str: str) -> int:
def formatiere_deutsches_datum(datum_obj: Union[date, datetime]) -> str: def formatiere_deutsches_datum(datum_obj: Union[date, datetime]) -> str:
"""Formatiert ein date- oder datetime-Objekt in das deutsche Format DD.MM.YYYY.""" """Formatiert ein date- oder datetime-Objekt in das deutsche Format DD.MM.YYYY."""
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 5: Älteste Person finden (Algorithmus: Maximum / Key-Suche) # 🎯 TEILZIEL 5 (TODO 5): Älteste Person finden (Algorithmus: Maximum / Key-Suche)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Schreibe eine Funktion 'finde_aelteste_person(personen: list[dict]) -> str'. # Schreibe eine Funktion 'finde_aelteste_person(personen: list[dict]) -> str'.
# #
@ -113,7 +117,8 @@ def formatiere_deutsches_datum(datum_obj: Union[date, datetime]) -> str:
def finde_aelteste_person(personen: List[Dict[str, Union[str, int]]]) -> str: def finde_aelteste_person(personen: List[Dict[str, Union[str, int]]]) -> str:
"""Findet in einer Liste von Personen-Dicts die älteste Person und gibt deren Namen zurück.""" """Findet in einer Liste von Personen-Dicts die älteste Person und gibt deren Namen zurück."""
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -8,19 +8,20 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
""" """
# ============================================================================== # ==============================================================================
# TODO 1: Definiere eine leere Klasse namens "Haustier". # 🎯 TEILZIEL 1 (TODO 1): Definiere eine leere Klasse namens "Haustier".
# #
# Erklärung: # Erklärung:
# Eine Klasse ist ein Bauplan. # Eine Klasse ist ein Bauplan.
# Schreibe 'class Haustier:' und rück in der nächsten Zeile 'pass' ein. # Schreibe 'class Haustier:' und rück in der nächsten Zeile 'pass' ein.
# ============================================================================== # ==============================================================================
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
# ============================================================================== # ==============================================================================
# TODO 2: Erstelle eine Funktion namens "erstelle_bello()". # 🎯 TEILZIEL 2 (TODO 2): Erstelle eine Funktion namens "erstelle_bello()".
# #
# Schritt-für-Schritt-Anleitung: # Schritt-für-Schritt-Anleitung:
# 1. Erstelle ein neues Haustier-Objekt: z.B. hund = Haustier() # 1. Erstelle ein neues Haustier-Objekt: z.B. hund = Haustier()
@ -32,12 +33,13 @@ Wenn du fertig bist, überprüfe deine Lösung im Terminal mit:
# ============================================================================== # ==============================================================================
def erstelle_bello(): def erstelle_bello():
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 3: Erstelle eine Funktion namens "erstelle_mimi()". # 🎯 TEILZIEL 3 (TODO 3): Erstelle eine Funktion namens "erstelle_mimi()".
# #
# Ähnlich wie bei Bello: # Ähnlich wie bei Bello:
# - name = "Mimi" # - name = "Mimi"
@ -47,12 +49,13 @@ def erstelle_bello():
# ============================================================================== # ==============================================================================
def erstelle_mimi(): def erstelle_mimi():
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 4: Schreibe eine Funktion "steckbrief_text(haustier)". # 🎯 TEILZIEL 4 (TODO 4): Schreibe eine Funktion "steckbrief_text(haustier)".
# #
# Die Funktion bekommt ein Haustier-Objekt als Parameter übergeben. # Die Funktion bekommt ein Haustier-Objekt als Parameter übergeben.
# Sie soll einen formatierten Text im folgenden Format zurückgeben: # Sie soll einen formatierten Text im folgenden Format zurückgeben:
@ -65,12 +68,13 @@ def erstelle_mimi():
# ============================================================================== # ==============================================================================
def steckbrief_text(haustier): def steckbrief_text(haustier):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ============================================================================== # ==============================================================================
# TODO 5: Schreibe eine Funktion "aelteres_tier(tier1, tier2)". # 🎯 TEILZIEL 5 (TODO 5): Schreibe eine Funktion "aelteres_tier(tier1, tier2)".
# #
# Die Funktion bekommt zwei Haustier-Objekte übergeben. # Die Funktion bekommt zwei Haustier-Objekte übergeben.
# Sie soll dasjenige Haustier-Objekt zurückgeben, dessen 'alter' größer ist. # Sie soll dasjenige Haustier-Objekt zurückgeben, dessen 'alter' größer ist.
@ -84,7 +88,8 @@ def steckbrief_text(haustier):
# ============================================================================== # ==============================================================================
def aelteres_tier(tier1, tier2): def aelteres_tier(tier1, tier2):
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -7,7 +7,7 @@ In dieser Aufgabe erstellst du eine Klasse "Bankkonto" für eine Taschengeld-App
class Bankkonto: class Bankkonto:
# ========================================================================== # ==========================================================================
# TODO 1: Schreibe die __init__-Methode. # 🎯 TEILZIEL 1 (TODO 1): Schreibe die __init__-Methode.
# Parameter: self, inhaber (String), kontostand (Float, Standardwert 0.0) # Parameter: self, inhaber (String), kontostand (Float, Standardwert 0.0)
# #
# Anleitung: # Anleitung:
@ -17,11 +17,12 @@ class Bankkonto:
# self.kontostand = kontostand # self.kontostand = kontostand
# ========================================================================== # ==========================================================================
def __init__(self, inhaber, kontostand=0.0): def __init__(self, inhaber, kontostand=0.0):
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Schreibe die Methode "einzahlen(self, betrag)". # 🎯 TEILZIEL 2 (TODO 2): Schreibe die Methode "einzahlen(self, betrag)".
# #
# Regeln: # Regeln:
# 1. Wenn 'betrag' größer als 0 ist: # 1. Wenn 'betrag' größer als 0 ist:
@ -32,11 +33,12 @@ class Bankkonto:
# - Gib False zurück. # - Gib False zurück.
# ========================================================================== # ==========================================================================
def einzahlen(self, betrag): def einzahlen(self, betrag):
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Schreibe die Methode "auszahlen(self, betrag)". # 🎯 TEILZIEL 3 (TODO 3): Schreibe die Methode "auszahlen(self, betrag)".
# #
# Regeln: # Regeln:
# 1. Prüfe mit 'if', ob 'betrag > 0' UND 'self.kontostand >= betrag': # 1. Prüfe mit 'if', ob 'betrag > 0' UND 'self.kontostand >= betrag':
@ -46,11 +48,12 @@ class Bankkonto:
# - Gib False zurück. # - Gib False zurück.
# ========================================================================== # ==========================================================================
def auszahlen(self, betrag): def auszahlen(self, betrag):
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Schreibe die Methode "info_text(self)". # 🎯 TEILZIEL 4 (TODO 4): Schreibe die Methode "info_text(self)".
# #
# Sie soll einen formatierten String zurückgeben: # Sie soll einen formatierten String zurückgeben:
# "Konto von {inhaber}: {kontostand:.2f} Euro" # "Konto von {inhaber}: {kontostand:.2f} Euro"
@ -59,7 +62,8 @@ class Bankkonto:
# Tipp: f"Konto von {self.inhaber}: {self.kontostand:.2f} Euro" # Tipp: f"Konto von {self.inhaber}: {self.kontostand:.2f} Euro"
# ========================================================================== # ==========================================================================
def info_text(self): def info_text(self):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -7,7 +7,7 @@ In dieser Aufgabe programmierst du eine Klasse 'Held' für ein Rollenspiel.
class Held: class Held:
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__(self, name, leben=100, angriffskraft=15) # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__(self, name, leben=100, angriffskraft=15)
# #
# Speichere die folgenden Attribute an self: # Speichere die folgenden Attribute an self:
# - self.name = name # - self.name = name
@ -17,11 +17,12 @@ class Held:
# - self.ist_am_leben = True # - self.ist_am_leben = True
# ========================================================================== # ==========================================================================
def __init__(self, name, leben=100, angriffskraft=15): def __init__(self, name, leben=100, angriffskraft=15):
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Methode "schaden_erleiden(self, schaden)" # 🎯 TEILZIEL 2 (TODO 2): Methode "schaden_erleiden(self, schaden)"
# #
# Schritt-für-Schritt: # Schritt-für-Schritt:
# 1. Wenn der Held schon tot ist (not self.ist_am_leben) oder schaden <= 0: # 1. Wenn der Held schon tot ist (not self.ist_am_leben) oder schaden <= 0:
@ -33,11 +34,12 @@ class Held:
# 4. Gib den erlittenen Schaden zurück (z.B. return schaden). # 4. Gib den erlittenen Schaden zurück (z.B. return schaden).
# ========================================================================== # ==========================================================================
def schaden_erleiden(self, schaden): def schaden_erleiden(self, schaden):
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Methode "heilen(self, heilung)" # 🎯 TEILZIEL 3 (TODO 3): Methode "heilen(self, heilung)"
# #
# Schritt-für-Schritt: # Schritt-für-Schritt:
# 1. Wenn der Held tot ist (not self.ist_am_leben) oder heilung <= 0: # 1. Wenn der Held tot ist (not self.ist_am_leben) oder heilung <= 0:
@ -50,11 +52,12 @@ class Held:
# 5. Gib tatsaechlich_geheilt zurück. # 5. Gib tatsaechlich_geheilt zurück.
# ========================================================================== # ==========================================================================
def heilen(self, heilung): def heilen(self, heilung):
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Methode "angreifen(self, gegner)" # 🎯 TEILZIEL 4 (TODO 4): Methode "angreifen(self, gegner)"
# Parameter 'gegner' ist ein anderes Held-Objekt! # Parameter 'gegner' ist ein anderes Held-Objekt!
# #
# Schritt-für-Schritt: # Schritt-für-Schritt:
@ -67,11 +70,12 @@ class Held:
# - Gib False zurück. # - Gib False zurück.
# ========================================================================== # ==========================================================================
def angreifen(self, gegner): def angreifen(self, gegner):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Methode "status_text(self)" # 🎯 TEILZIEL 5 (TODO 5): Methode "status_text(self)"
# #
# Gibt einen formatierten String zurück: # Gibt einen formatierten String zurück:
# Wenn am Leben: # Wenn am Leben:
@ -80,7 +84,8 @@ class Held:
# "[{self.name}] HP: 0/{self.max_leben} | Kraft: {self.angriffskraft} | Status: Besiegt" # "[{self.name}] HP: 0/{self.max_leben} | Kraft: {self.angriffskraft} | Status: Besiegt"
# ========================================================================== # ==========================================================================
def status_text(self): def status_text(self):
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -7,26 +7,28 @@ In dieser Aufgabe erstellst du zwei Klassen: 'Artikel' und 'Warenkorb'.
class Artikel: class Artikel:
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor für Artikel # 🎯 TEILZIEL 1 (TODO 1): Konstruktor für Artikel
# Parameter: self, name (str), preis (float), anzahl (int, Standardwert 1) # Parameter: self, name (str), preis (float), anzahl (int, Standardwert 1)
# Speichere: self.name, self.preis, self.anzahl # Speichere: self.name, self.preis, self.anzahl
# ========================================================================== # ==========================================================================
def __init__(self, name, preis, anzahl=1): def __init__(self, name, preis, anzahl=1):
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Methode "gesamtpreis(self)" # 🎯 TEILZIEL 2 (TODO 2): Methode "gesamtpreis(self)"
# Gibt den Preis für diesen Artikel multipliziert mit der Anzahl zurück. # Gibt den Preis für diesen Artikel multipliziert mit der Anzahl zurück.
# Beispiel: 3 Äpfel à 0.50€ -> 1.50 # Beispiel: 3 Äpfel à 0.50€ -> 1.50
# Tipp: return self.preis * self.anzahl # Tipp: return self.preis * self.anzahl
# ========================================================================== # ==========================================================================
def gesamtpreis(self): def gesamtpreis(self):
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Dunder-Methode "__str__(self)" # 🎯 TEILZIEL 3 (TODO 3): Dunder-Methode "__str__(self)"
# Gibt einen formatierten String zurück: # Gibt einen formatierten String zurück:
# "{anzahl}x {name} (je {preis:.2f} €) = {gesamtpreis:.2f} €" # "{anzahl}x {name} (je {preis:.2f} €) = {gesamtpreis:.2f} €"
# #
@ -34,30 +36,33 @@ class Artikel:
# -> "2x Milch (je 1.29 €) = 2.58 €" # -> "2x Milch (je 1.29 €) = 2.58 €"
# ========================================================================== # ==========================================================================
def __str__(self): def __str__(self):
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
class Warenkorb: class Warenkorb:
# ========================================================================== # ==========================================================================
# TODO 4: Konstruktor für Warenkorb # 🎯 TEILZIEL 4 (TODO 4): Konstruktor für Warenkorb
# Parameter: self # Parameter: self
# Initialisiere: self.artikel_liste als leere Liste [] # Initialisiere: self.artikel_liste als leere Liste []
# ========================================================================== # ==========================================================================
def __init__(self): def __init__(self):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Methode "artikel_hinzufuegen(self, artikel)" # 🎯 TEILZIEL 5 (TODO 5): Methode "artikel_hinzufuegen(self, artikel)"
# Hängt das übergebene Artikel-Objekt an 'self.artikel_liste' an (.append). # Hängt das übergebene Artikel-Objekt an 'self.artikel_liste' an (.append).
# ========================================================================== # ==========================================================================
def artikel_hinzufuegen(self, artikel): def artikel_hinzufuegen(self, artikel):
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Methode "gesamtsumme(self)" # 🎯 TEILZIEL 6 (TODO 6): Methode "gesamtsumme(self)"
# Berechnet die Summe der Gesamtpreise aller Artikel in self.artikel_liste # Berechnet die Summe der Gesamtpreise aller Artikel in self.artikel_liste
# und gibt diese als float zurück. # und gibt diese als float zurück.
# #
@ -68,11 +73,12 @@ class Warenkorb:
# return total # return total
# ========================================================================== # ==========================================================================
def gesamtsumme(self): def gesamtsumme(self):
# Schreibe hier deinen Code für TODO 6: # 🎯 TEILZIEL 6: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 7: Methode "bon_text(self)" # 🎯 TEILZIEL 7 (TODO 7): Methode "bon_text(self)"
# Erzeugt einen formatierten mehrzeiligen String für den Kassenzettel. # Erzeugt einen formatierten mehrzeiligen String für den Kassenzettel.
# Format: # Format:
# --- KASSENZETTEL --- # --- KASSENZETTEL ---
@ -84,7 +90,8 @@ class Warenkorb:
# Tipp: Baue eine Liste von Zeilen und verbinde sie am Ende mit "\n".join(...) # Tipp: Baue eine Liste von Zeilen und verbinde sie am Ende mit "\n".join(...)
# ========================================================================== # ==========================================================================
def bon_text(self): def bon_text(self):
# Schreibe hier deinen Code für TODO 7: # 🎯 TEILZIEL 7: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -8,16 +8,17 @@ In dieser Aufgabe baust du eine Musikverwaltung mit zwei Klassen:
class Song: class Song:
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor für Song # 🎯 TEILZIEL 1 (TODO 1): Konstruktor für Song
# Parameter: self, titel (str), kuenstler (str), dauer_sekunden (int) # Parameter: self, titel (str), kuenstler (str), dauer_sekunden (int)
# Speichere: self.titel, self.kuenstler, self.dauer_sekunden # Speichere: self.titel, self.kuenstler, self.dauer_sekunden
# ========================================================================== # ==========================================================================
def __init__(self, titel, kuenstler, dauer_sekunden): def __init__(self, titel, kuenstler, dauer_sekunden):
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Methode "formatierte_dauer(self)" # 🎯 TEILZIEL 2 (TODO 2): Methode "formatierte_dauer(self)"
# Rechnet 'self.dauer_sekunden' in Minuten und Sekunden um und gibt einen # Rechnet 'self.dauer_sekunden' in Minuten und Sekunden um und gibt einen
# String im Format "MM:SS" zurück (z.B. 215 -> "03:35", 70 -> "01:10"). # String im Format "MM:SS" zurück (z.B. 215 -> "03:35", 70 -> "01:10").
# #
@ -27,49 +28,54 @@ class Song:
# return f"{minuten:02d}:{sekunden:02d}" # return f"{minuten:02d}:{sekunden:02d}"
# ========================================================================== # ==========================================================================
def formatierte_dauer(self): def formatierte_dauer(self):
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Dunder-Methode "__str__(self)" # 🎯 TEILZIEL 3 (TODO 3): Dunder-Methode "__str__(self)"
# Gibt einen String im Format zurück: # Gibt einen String im Format zurück:
# '"{titel}" von {kuenstler} ({formatierte_dauer})' # '"{titel}" von {kuenstler} ({formatierte_dauer})'
# #
# Beispiel: '"Flowers" von Miley Cyrus (03:20)' # Beispiel: '"Flowers" von Miley Cyrus (03:20)'
# ========================================================================== # ==========================================================================
def __str__(self): def __str__(self):
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
class Playlist: class Playlist:
# ========================================================================== # ==========================================================================
# TODO 4: Konstruktor für Playlist # 🎯 TEILZIEL 4 (TODO 4): Konstruktor für Playlist
# Parameter: self, name (str) # Parameter: self, name (str)
# Speichere: self.name, self.songs (als leere Liste []) # Speichere: self.name, self.songs (als leere Liste [])
# ========================================================================== # ==========================================================================
def __init__(self, name): def __init__(self, name):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Methode "song_hinzufuegen(self, song)" # 🎯 TEILZIEL 5 (TODO 5): Methode "song_hinzufuegen(self, song)"
# Hängt das übergebene Song-Objekt an 'self.songs' an (.append). # Hängt das übergebene Song-Objekt an 'self.songs' an (.append).
# ========================================================================== # ==========================================================================
def song_hinzufuegen(self, song): def song_hinzufuegen(self, song):
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Methode "anzahl_songs(self)" # 🎯 TEILZIEL 6 (TODO 6): Methode "anzahl_songs(self)"
# Gibt die Anzahl der Songs in der Playlist als Integer zurück (len(self.songs)). # Gibt die Anzahl der Songs in der Playlist als Integer zurück (len(self.songs)).
# ========================================================================== # ==========================================================================
def anzahl_songs(self): def anzahl_songs(self):
# Schreibe hier deinen Code für TODO 6: # 🎯 TEILZIEL 6: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 7: Methode "gesamtdauer_sekunden(self)" # 🎯 TEILZIEL 7 (TODO 7): Methode "gesamtdauer_sekunden(self)"
# Gibt die Summe der Sekunden aller Songs in der Playlist zurück. # Gibt die Summe der Sekunden aller Songs in der Playlist zurück.
# Bei leerer Playlist: 0 # Bei leerer Playlist: 0
# #
@ -80,27 +86,30 @@ class Playlist:
# return total # return total
# ========================================================================== # ==========================================================================
def gesamtdauer_sekunden(self): def gesamtdauer_sekunden(self):
# Schreibe hier deinen Code für TODO 7: # 🎯 TEILZIEL 7: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 8: Methode "finde_songs_von(self, kuenstler)" # 🎯 TEILZIEL 8 (TODO 8): Methode "finde_songs_von(self, kuenstler)"
# Sucht alle Songs in self.songs, bei denen der Künstler übereinstimmt. # Sucht alle Songs in self.songs, bei denen der Künstler übereinstimmt.
# Wichtig: Groß- und Kleinschreibung soll ignoriert werden! (z.B. .lower()) # Wichtig: Groß- und Kleinschreibung soll ignoriert werden! (z.B. .lower())
# Gibt eine Liste von passenden Song-Objekten zurück. # Gibt eine Liste von passenden Song-Objekten zurück.
# ========================================================================== # ==========================================================================
def finde_songs_von(self, kuenstler): def finde_songs_von(self, kuenstler):
# Schreibe hier deinen Code für TODO 8: # 🎯 TEILZIEL 8: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 9: Methode "laengster_song(self)" # 🎯 TEILZIEL 9 (TODO 9): Methode "laengster_song(self)"
# Findet den Song mit der längsten Spieldauer in self.songs. # Findet den Song mit der längsten Spieldauer in self.songs.
# - Gibt das gefundene Song-Objekt zurück. # - Gibt das gefundene Song-Objekt zurück.
# - Gibt None zurück, wenn die Playlist leer ist. # - Gibt None zurück, wenn die Playlist leer ist.
# ========================================================================== # ==========================================================================
def laengster_song(self): def laengster_song(self):
# Schreibe hier deinen Code für TODO 9: # 🎯 TEILZIEL 9: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -7,7 +7,7 @@ Programmiere hier die Klasse 'Tamagotchi'.
class Tamagotchi: class Tamagotchi:
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__(self, name, tierart="Drache") # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__(self, name, tierart="Drache")
# #
# Initialisiere die folgenden Attribute an self: # Initialisiere die folgenden Attribute an self:
# - self.name = name # - self.name = name
@ -19,7 +19,8 @@ class Tamagotchi:
# - self.ist_lebendig = True # - self.ist_lebendig = True
# ========================================================================== # ==========================================================================
def __init__(self, name, tierart="Drache"): def __init__(self, name, tierart="Drache"):
# Schreibe hier deinen Code für TODO 1: # 🎯 TEILZIEL 1: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# Hilfsmethode: Begrenzt Werte immer zwischen min_wert (0) und max_wert (100) # Hilfsmethode: Begrenzt Werte immer zwischen min_wert (0) und max_wert (100)
@ -27,7 +28,7 @@ class Tamagotchi:
return max(min_wert, min(max_wert, wert)) return max(min_wert, min(max_wert, wert))
# ========================================================================== # ==========================================================================
# TODO 2: Methode "fuettern(self, menge=20)" # 🎯 TEILZIEL 2 (TODO 2): Methode "fuettern(self, menge=20)"
# #
# Regeln: # Regeln:
# 1. Wenn not self.ist_lebendig: # 1. Wenn not self.ist_lebendig:
@ -39,11 +40,12 @@ class Tamagotchi:
# - Gib zurück: f"{self.name} mampft genüsslich! (Hunger: {self.hunger}/100)" # - Gib zurück: f"{self.name} mampft genüsslich! (Hunger: {self.hunger}/100)"
# ========================================================================== # ==========================================================================
def fuettern(self, menge=20): def fuettern(self, menge=20):
# Schreibe hier deinen Code für TODO 2: # 🎯 TEILZIEL 2: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Methode "spielen(self, spass=25)" # 🎯 TEILZIEL 3 (TODO 3): Methode "spielen(self, spass=25)"
# #
# Regeln: # Regeln:
# 1. Wenn not self.ist_lebendig: # 1. Wenn not self.ist_lebendig:
@ -58,11 +60,12 @@ class Tamagotchi:
# - Gib zurück: f"{self.name} hatte riesigen Spaß beim Spielen! (Glück: {self.glueck}/100)" # - Gib zurück: f"{self.name} hatte riesigen Spaß beim Spielen! (Glück: {self.glueck}/100)"
# ========================================================================== # ==========================================================================
def spielen(self, spass=25): def spielen(self, spass=25):
# Schreibe hier deinen Code für TODO 3: # 🎯 TEILZIEL 3: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Methode "schlafen(self)" # 🎯 TEILZIEL 4 (TODO 4): Methode "schlafen(self)"
# #
# Regeln: # Regeln:
# 1. Wenn not self.ist_lebendig: # 1. Wenn not self.ist_lebendig:
@ -74,11 +77,12 @@ class Tamagotchi:
# - Gib zurück: f"{self.name} hat tief geschlafen und ist ausgeruht! Ein neuer Tag bricht an." # - Gib zurück: f"{self.name} hat tief geschlafen und ist ausgeruht! Ein neuer Tag bricht an."
# ========================================================================== # ==========================================================================
def schlafen(self): def schlafen(self):
# Schreibe hier deinen Code für TODO 4: # 🎯 TEILZIEL 4: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Methode "zeit_vergeht(self)" # 🎯 TEILZIEL 5 (TODO 5): Methode "zeit_vergeht(self)"
# Simuliert das Verstreichen von Zeit. # Simuliert das Verstreichen von Zeit.
# #
# Regeln: # Regeln:
@ -94,11 +98,12 @@ class Tamagotchi:
# - Gib self.ist_lebendig zurück (True wenn noch am Leben, False wenn gestorben). # - Gib self.ist_lebendig zurück (True wenn noch am Leben, False wenn gestorben).
# ========================================================================== # ==========================================================================
def zeit_vergeht(self): def zeit_vergeht(self):
# Schreibe hier deinen Code für TODO 5: # 🎯 TEILZIEL 5: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Dunder-Methode "__str__(self)" # 🎯 TEILZIEL 6 (TODO 6): Dunder-Methode "__str__(self)"
# Gibt eine hübsche Statusübersicht als mehrzeiligen String zurück. # Gibt eine hübsche Statusübersicht als mehrzeiligen String zurück.
# #
# Format (wenn lebendig): # Format (wenn lebendig):
@ -111,7 +116,8 @@ class Tamagotchi:
# "=== {self.name} ({self.tierart}) - RIP 🪦 ===" # "=== {self.name} ({self.tierart}) - RIP 🪦 ==="
# ========================================================================== # ==========================================================================
def __str__(self): def __str__(self):
# Schreibe hier deinen Code für TODO 6: # 🎯 TEILZIEL 6: Implementiere die Logik Schritt für Schritt:
# 💡 Tipp: Beachte Datentypen und das abschließende return!
pass pass

View file

@ -10,7 +10,7 @@ from typing import Optional, List
class Person: class Person:
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__ # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__
# Parameter: name (str), geburtsjahr (int) # Parameter: name (str), geburtsjahr (int)
# Attribute: # Attribute:
# - self.name: str # - self.name: str
@ -23,7 +23,7 @@ class Person:
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Methode mutter_setzen(self, mutter: 'Person') -> None # 🎯 TEILZIEL 2 (TODO 2): Methode mutter_setzen(self, mutter: 'Person') -> None
# 1. Setze self.mutter = mutter # 1. Setze self.mutter = mutter
# 2. Füge self zur Liste mutter.kinder hinzu (falls self noch nicht drin ist) # 2. Füge self zur Liste mutter.kinder hinzu (falls self noch nicht drin ist)
# ========================================================================== # ==========================================================================
@ -31,7 +31,7 @@ class Person:
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Methode vater_setzen(self, vater: 'Person') -> None # 🎯 TEILZIEL 3 (TODO 3): Methode vater_setzen(self, vater: 'Person') -> None
# 1. Setze self.vater = vater # 1. Setze self.vater = vater
# 2. Füge self zur Liste vater.kinder hinzu (falls self noch nicht drin ist) # 2. Füge self zur Liste vater.kinder hinzu (falls self noch nicht drin ist)
# ========================================================================== # ==========================================================================
@ -39,7 +39,7 @@ class Person:
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Methode geschwister(self) -> list['Person'] # 🎯 TEILZIEL 4 (TODO 4): Methode geschwister(self) -> list['Person']
# Gibt eine Liste aller Personen zurück, die dieselbe Mutter ODER denselben # Gibt eine Liste aller Personen zurück, die dieselbe Mutter ODER denselben
# Vater haben wie self. # Vater haben wie self.
# WICHTIG: # WICHTIG:
@ -50,7 +50,7 @@ class Person:
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Methode grosseltern(self) -> list['Person'] # 🎯 TEILZIEL 5 (TODO 5): Methode grosseltern(self) -> list['Person']
# Gibt eine Liste aller bekannten Großeltern zurück: # Gibt eine Liste aller bekannten Großeltern zurück:
# (Mutter der Mutter, Vater der Mutter, Mutter des Vaters, Vater des Vaters) # (Mutter der Mutter, Vater der Mutter, Mutter des Vaters, Vater des Vaters)
# Nur Großeltern hinzufügen, die nicht None sind! # Nur Großeltern hinzufügen, die nicht None sind!
@ -59,7 +59,7 @@ class Person:
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Dunder-Methode __str__(self) -> str # 🎯 TEILZIEL 6 (TODO 6): Dunder-Methode __str__(self) -> str
# Gibt einen String im Format: "Name (*Geburtsjahr)" zurück. # Gibt einen String im Format: "Name (*Geburtsjahr)" zurück.
# Beispiel: "Mia (*2008)" # Beispiel: "Mia (*2008)"
# ========================================================================== # ==========================================================================

View file

@ -54,6 +54,22 @@
<span class="fn">print</span>(<span class="var">liste_a</span>) <span class="cm"># Ausgabe: [1, 2, 3, 99] &lt;-- liste_a hat sich mitverändert!</span></pre> <span class="fn">print</span>(<span class="var">liste_a</span>) <span class="cm"># Ausgabe: [1, 2, 3, 99] &lt;-- liste_a hat sich mitverändert!</span></pre>
</div> </div>
<!-- Visuelles Speichermodell (Notional Machine) -->
<div style="background: #0f172a; color: #f8fafc; border-radius: var(--radius-md); padding: 18px; margin: 20px 0; border: 1px solid rgba(255,255,255,0.1);">
<div style="color: #38bdf8; font-weight: 700; margin-bottom: 8px; font-size: 1.05rem;">🧠 Was passiert im Computer-Speicher? (Notional Machine)</div>
<pre style="background: transparent; color: #e2e8f0; font-family: var(--font-mono); font-size: 0.88rem; padding: 0;">
STACK (Variablen-Namen) HEAP (Echter Speicher / RAM)
┌──────────────┐ ┌──────────────────────────────┐
│ liste_a ────┼──────────────────────&gt;│ ID: 0x7ffd1a [1, 2, 3, 99] │
└──────────────┘ └──────────────────────────────┘
▲
┌──────────────┐ │
│ liste_b ────┼───────────────────────────────────────┘
└──────────────┘
(Beide Variablen zeigen auf denselben Pfeil im Heap!)
</pre>
</div>
<div class="box box-warning"> <div class="box box-warning">
<div class="box-title">⚠️ Vorsicht bei veränderlichen Objekten (Mutable vs. Immutable):</div> <div class="box-title">⚠️ Vorsicht bei veränderlichen Objekten (Mutable vs. Immutable):</div>
<ul> <ul>

View file

@ -16,14 +16,14 @@ class Vektor2D:
""" """
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__(self, x: float, y: float) # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__(self, x: float, y: float)
# Speichere self.x = float(x) und self.y = float(y). # Speichere self.x = float(x) und self.y = float(y).
# ========================================================================== # ==========================================================================
def __init__(self, x: float, y: float): def __init__(self, x: float, y: float):
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Darstellungsmethoden __repr__ und __str__ # 🎯 TEILZIEL 2 (TODO 2): Darstellungsmethoden __repr__ und __str__
# - __repr__(self) -> str: Gibt Entwickler-String "Vektor2D(x, y)" zurück (z.B. "Vektor2D(3.0, 4.0)") # - __repr__(self) -> str: Gibt Entwickler-String "Vektor2D(x, y)" zurück (z.B. "Vektor2D(3.0, 4.0)")
# - __str__(self) -> str: Gibt benutzerfreundlichen String "(x, y)" zurück (z.B. "(3.0, 4.0)") # - __str__(self) -> str: Gibt benutzerfreundlichen String "(x, y)" zurück (z.B. "(3.0, 4.0)")
# ========================================================================== # ==========================================================================
@ -34,7 +34,7 @@ class Vektor2D:
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Länge und Absolutbetrag # 🎯 TEILZIEL 3 (TODO 3): Länge und Absolutbetrag
# - laenge(self) -> float: Berechnet sqrt(x² + y²) # - laenge(self) -> float: Berechnet sqrt(x² + y²)
# - __abs__(self) -> float: Gibt self.laenge() zurück, damit abs(v) funktioniert! # - __abs__(self) -> float: Gibt self.laenge() zurück, damit abs(v) funktioniert!
# ========================================================================== # ==========================================================================
@ -45,7 +45,7 @@ class Vektor2D:
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Addition (__add__) und Subtraktion (__sub__) # 🎯 TEILZIEL 4 (TODO 4): Addition (__add__) und Subtraktion (__sub__)
# - __add__(self, other: 'Vektor2D') -> 'Vektor2D': # - __add__(self, other: 'Vektor2D') -> 'Vektor2D':
# Addiert zwei Vektoren komponentenweise: (self.x + other.x, self.y + other.y) # Addiert zwei Vektoren komponentenweise: (self.x + other.x, self.y + other.y)
# - __sub__(self, other: 'Vektor2D') -> 'Vektor2D': # - __sub__(self, other: 'Vektor2D') -> 'Vektor2D':
@ -59,7 +59,7 @@ class Vektor2D:
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: Multiplikation (__mul__) und Rechts-Multiplikation (__rmul__) # 🎯 TEILZIEL 5 (TODO 5): Multiplikation (__mul__) und Rechts-Multiplikation (__rmul__)
# - __mul__(self, other): # - __mul__(self, other):
# * Wenn other eine Zahl ist (int oder float): # * Wenn other eine Zahl ist (int oder float):
# Skalarmultiplikation -> neuer Vektor2D(self.x * other, self.y * other) # Skalarmultiplikation -> neuer Vektor2D(self.x * other, self.y * other)
@ -76,7 +76,7 @@ class Vektor2D:
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Vergleiche (__eq__, __lt__, __le__) # 🎯 TEILZIEL 6 (TODO 6): Vergleiche (__eq__, __lt__, __le__)
# - __eq__(self, other: object) -> bool: # - __eq__(self, other: object) -> bool:
# True, wenn other ein Vektor2D ist und self.x == other.x und self.y == other.y (Tipp: math.isclose) # True, wenn other ein Vektor2D ist und self.x == other.x und self.y == other.y (Tipp: math.isclose)
# - __lt__(self, other: 'Vektor2D') -> bool: # - __lt__(self, other: 'Vektor2D') -> bool:
@ -100,7 +100,7 @@ class Wegstrecke:
""" """
# ========================================================================== # ==========================================================================
# TODO 7: Wegstrecke __init__ und punkt_hinzufuegen # 🎯 TEILZIEL 7 (TODO 7): Wegstrecke __init__ und punkt_hinzufuegen
# - __init__(self, punkte: list[Vektor2D] | None = None): # - __init__(self, punkte: list[Vektor2D] | None = None):
# Speichert self.punkte = list(punkte) if punkte else [] # Speichert self.punkte = list(punkte) if punkte else []
# - punkt_hinzufuegen(self, punkt: Vektor2D) -> None: # - punkt_hinzufuegen(self, punkt: Vektor2D) -> None:
@ -113,7 +113,7 @@ class Wegstrecke:
pass pass
# ========================================================================== # ==========================================================================
# TODO 8: Container-Dunder (__len__ und __getitem__) # 🎯 TEILZIEL 8 (TODO 8): Container-Dunder (__len__ und __getitem__)
# - __len__(self) -> int: # - __len__(self) -> int:
# Gibt die Anzahl der Wegpunkte zurück (len(self.punkte)). # Gibt die Anzahl der Wegpunkte zurück (len(self.punkte)).
# - __getitem__(self, index: int) -> Vektor2D: # - __getitem__(self, index: int) -> Vektor2D:
@ -126,7 +126,7 @@ class Wegstrecke:
pass pass
# ========================================================================== # ==========================================================================
# TODO 9: gesamtlaenge(self) -> float # 🎯 TEILZIEL 9 (TODO 9): gesamtlaenge(self) -> float
# Berechnet die Summe aller Teilstrecken zwischen aufeinanderfolgenden Punkten: # Berechnet die Summe aller Teilstrecken zwischen aufeinanderfolgenden Punkten:
# Distanz zwischen Punkt i und Punkt i+1 ist: abs(punkte[i+1] - punkte[i]) # Distanz zwischen Punkt i und Punkt i+1 ist: abs(punkte[i+1] - punkte[i])
# Wenn weniger als 2 Punkte vorhanden sind: gebe 0.0 zurück. # Wenn weniger als 2 Punkte vorhanden sind: gebe 0.0 zurück.

View file

@ -83,14 +83,14 @@ class Bankkonto:
class TestTaschenrechner(unittest.TestCase): class TestTaschenrechner(unittest.TestCase):
# ========================================================================== # ==========================================================================
# TODO 1: setUp(self) # 🎯 TEILZIEL 1 (TODO 1): setUp(self)
# Erstelle vor jedem Test eine frische Rechner-Instanz: self.calc = Taschenrechner() # Erstelle vor jedem Test eine frische Rechner-Instanz: self.calc = Taschenrechner()
# ========================================================================== # ==========================================================================
def setUp(self): def setUp(self):
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: test_01_grundrechenarten(self) # 🎯 TEILZIEL 2 (TODO 2): test_01_grundrechenarten(self)
# Teste mit self.assertEqual: # Teste mit self.assertEqual:
# - self.calc.add(2, 3) soll 5 sein # - self.calc.add(2, 3) soll 5 sein
# - self.calc.sub(10, 4) soll 6 sein # - self.calc.sub(10, 4) soll 6 sein
@ -100,7 +100,7 @@ class TestTaschenrechner(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: test_02_division_und_kommazahlen(self) # 🎯 TEILZIEL 3 (TODO 3): test_02_division_und_kommazahlen(self)
# - Teste self.calc.div(10, 2) mit self.assertEqual (soll 5.0 sein) # - Teste self.calc.div(10, 2) mit self.assertEqual (soll 5.0 sein)
# - Teste self.calc.div(10, 3) mit self.assertAlmostEqual(..., places=2) (ca. 3.33) # - Teste self.calc.div(10, 3) mit self.assertAlmostEqual(..., places=2) (ca. 3.33)
# ========================================================================== # ==========================================================================
@ -108,7 +108,7 @@ class TestTaschenrechner(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: test_03_division_durch_null_exception(self) # 🎯 TEILZIEL 4 (TODO 4): test_03_division_durch_null_exception(self)
# Teste mit 'with self.assertRaises(ZeroDivisionError):' # Teste mit 'with self.assertRaises(ZeroDivisionError):'
# dass self.calc.div(10, 0) den Fehler auslöst! # dass self.calc.div(10, 0) den Fehler auslöst!
# ========================================================================== # ==========================================================================
@ -116,7 +116,7 @@ class TestTaschenrechner(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 5: test_04_wurzel_negativ_exception(self) # 🎯 TEILZIEL 5 (TODO 5): test_04_wurzel_negativ_exception(self)
# - Teste self.calc.wurzel(16) soll 4.0 sein (assertEqual oder assertAlmostEqual) # - Teste self.calc.wurzel(16) soll 4.0 sein (assertEqual oder assertAlmostEqual)
# - Teste mit 'with self.assertRaises(ValueError):' dass self.calc.wurzel(-9) # - Teste mit 'with self.assertRaises(ValueError):' dass self.calc.wurzel(-9)
# einen ValueError auslöst! # einen ValueError auslöst!
@ -125,7 +125,7 @@ class TestTaschenrechner(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: test_05_speicher_funktionen(self) # 🎯 TEILZIEL 6 (TODO 6): test_05_speicher_funktionen(self)
# - Prüfe, dass self.calc.speicher zu Beginn 0.0 ist # - Prüfe, dass self.calc.speicher zu Beginn 0.0 ist
# - Rufe self.calc.speicher_plus(15.5) und self.calc.speicher_plus(4.5) auf # - Rufe self.calc.speicher_plus(15.5) und self.calc.speicher_plus(4.5) auf
# - Prüfe, dass self.calc.speicher jetzt 20.0 ist # - Prüfe, dass self.calc.speicher jetzt 20.0 ist
@ -138,7 +138,7 @@ class TestTaschenrechner(unittest.TestCase):
class TestBankkonto(unittest.TestCase): class TestBankkonto(unittest.TestCase):
# ========================================================================== # ==========================================================================
# TODO 7: setUp(self) # 🎯 TEILZIEL 7 (TODO 7): setUp(self)
# Erstelle zwei Testkonten: # Erstelle zwei Testkonten:
# - self.k1 = Bankkonto("Alice", 100.0) # - self.k1 = Bankkonto("Alice", 100.0)
# - self.k2 = Bankkonto("Bob", 50.0) # - self.k2 = Bankkonto("Bob", 50.0)
@ -147,7 +147,7 @@ class TestBankkonto(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 8: test_06_einzahlen_und_abheben(self) # 🎯 TEILZIEL 8 (TODO 8): test_06_einzahlen_und_abheben(self)
# - Zahle 50.0 auf self.k1 ein und prüfe kontostand == 150.0 # - Zahle 50.0 auf self.k1 ein und prüfe kontostand == 150.0
# - Prüfe mit self.assertIn(50.0, self.k1.transaktionen), dass die Einzahlung gelistet ist # - Prüfe mit self.assertIn(50.0, self.k1.transaktionen), dass die Einzahlung gelistet ist
# - Hebe 30.0 von self.k1 ab und prüfe kontostand == 120.0 # - Hebe 30.0 von self.k1 ab und prüfe kontostand == 120.0
@ -157,7 +157,7 @@ class TestBankkonto(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 9: test_07_abheben_ueber_limit_exception(self) # 🎯 TEILZIEL 9 (TODO 9): test_07_abheben_ueber_limit_exception(self)
# Teste mit 'with self.assertRaises(ValueError):' # Teste mit 'with self.assertRaises(ValueError):'
# dass das Abheben von 200.0 (bei 100.0 Guthaben) einen ValueError auslöst! # dass das Abheben von 200.0 (bei 100.0 Guthaben) einen ValueError auslöst!
# ========================================================================== # ==========================================================================
@ -165,7 +165,7 @@ class TestBankkonto(unittest.TestCase):
pass pass
# ========================================================================== # ==========================================================================
# TODO 10: test_08_ueberweisung(self) # 🎯 TEILZIEL 10 (TODO 10): test_08_ueberweisung(self)
# - Überweise 40.0 von self.k1 an self.k2 # - Überweise 40.0 von self.k1 an self.k2
# - Prüfe self.k1.kontostand == 60.0 # - Prüfe self.k1.kontostand == 60.0
# - Prüfe self.k2.kontostand == 90.0 # - Prüfe self.k2.kontostand == 90.0

View file

@ -25,7 +25,7 @@ class Fahrzeug:
""" """
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__ der Basisklasse # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__ der Basisklasse
# Parameter: marke (str), modell (str), baujahr (int), grundpreis (float) # Parameter: marke (str), modell (str), baujahr (int), grundpreis (float)
# Attribute: # Attribute:
# - self.marke: str # - self.marke: str
@ -38,7 +38,7 @@ class Fahrzeug:
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Methode fahren(self, km: float) -> None # 🎯 TEILZIEL 2 (TODO 2): Methode fahren(self, km: float) -> None
# Erhöht den Kilometerstand um 'km', wenn km > 0 ist. # Erhöht den Kilometerstand um 'km', wenn km > 0 ist.
# Bei km <= 0 passiert nichts. # Bei km <= 0 passiert nichts.
# ========================================================================== # ==========================================================================
@ -46,7 +46,7 @@ class Fahrzeug:
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Methode berechne_restwert(self, aktuelles_jahr: int) -> float # 🎯 TEILZIEL 3 (TODO 3): Methode berechne_restwert(self, aktuelles_jahr: int) -> float
# Berechnet den aktuellen Restwert des Fahrzeugs: # Berechnet den aktuellen Restwert des Fahrzeugs:
# 1. Alter = max(0, aktuelles_jahr - self.baujahr) # 1. Alter = max(0, aktuelles_jahr - self.baujahr)
# 2. Wertverlust = self.grundpreis * 0.05 * Alter (5% Wertverlust pro Jahr) # 2. Wertverlust = self.grundpreis * 0.05 * Alter (5% Wertverlust pro Jahr)
@ -58,7 +58,7 @@ class Fahrzeug:
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Methode info(self) -> str # 🎯 TEILZIEL 4 (TODO 4): Methode info(self) -> str
# Gibt einen formatierten Infostring zurück: # Gibt einen formatierten Infostring zurück:
# Format: "{marke} {modell} ({baujahr}) - {kilometerstand:.1f} km" # Format: "{marke} {modell} ({baujahr}) - {kilometerstand:.1f} km"
# Beispiel: "BMW 320d (2020) - 45000.0 km" # Beispiel: "BMW 320d (2020) - 45000.0 km"
@ -80,7 +80,7 @@ class Auto(Fahrzeug):
""" """
# ========================================================================== # ==========================================================================
# TODO 5: Konstruktor __init__ von Auto # 🎯 TEILZIEL 5 (TODO 5): Konstruktor __init__ von Auto
# Parameter: marke (str), modell (str), baujahr (int), grundpreis (float), # Parameter: marke (str), modell (str), baujahr (int), grundpreis (float),
# sitzplaetze (int = 5), anzahl_tueren (int = 5) # sitzplaetze (int = 5), anzahl_tueren (int = 5)
# 1. Rufe den Konstruktor der Elternklasse mit super().__init__(...) auf! # 1. Rufe den Konstruktor der Elternklasse mit super().__init__(...) auf!
@ -98,7 +98,7 @@ class Auto(Fahrzeug):
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Methode hupen(self) -> str # 🎯 TEILZIEL 6 (TODO 6): Methode hupen(self) -> str
# Gibt einen Hup-Laut mit Marke und Modell zurück: # Gibt einen Hup-Laut mit Marke und Modell zurück:
# Format: "Hup hup! Platz da für den {marke} {modell}!" # Format: "Hup hup! Platz da für den {marke} {modell}!"
# Beispiel: "Hup hup! Platz da für den VW Golf!" # Beispiel: "Hup hup! Platz da für den VW Golf!"
@ -107,7 +107,7 @@ class Auto(Fahrzeug):
pass pass
# ========================================================================== # ==========================================================================
# TODO 7: Methode info(self) -> str (Method Overriding / Erweitern) # 🎯 TEILZIEL 7 (TODO 7): Methode info(self) -> str (Method Overriding / Erweitern)
# Rufe super().info() auf und hänge " | {sitzplaetze} Sitze, {anzahl_tueren} Türen" an. # Rufe super().info() auf und hänge " | {sitzplaetze} Sitze, {anzahl_tueren} Türen" an.
# Format: "{super().info()} | {self.sitzplaetze} Sitze, {self.anzahl_tueren} Türen" # Format: "{super().info()} | {self.sitzplaetze} Sitze, {self.anzahl_tueren} Türen"
# Beispiel: "VW Golf (2021) - 12000.0 km | 5 Sitze, 5 Türen" # Beispiel: "VW Golf (2021) - 12000.0 km | 5 Sitze, 5 Türen"
@ -127,7 +127,7 @@ class ElektroAuto(Auto):
""" """
# ========================================================================== # ==========================================================================
# TODO 8: Konstruktor __init__ von ElektroAuto # 🎯 TEILZIEL 8 (TODO 8): Konstruktor __init__ von ElektroAuto
# Parameter: marke (str), modell (str), baujahr (int), grundpreis (float), # Parameter: marke (str), modell (str), baujahr (int), grundpreis (float),
# batterie_kapazitaet_kwh (float), sitzplaetze (int = 5), # batterie_kapazitaet_kwh (float), sitzplaetze (int = 5),
# anzahl_tueren (int = 5), verbrauch_pro_100km (float = 18.0) # anzahl_tueren (int = 5), verbrauch_pro_100km (float = 18.0)
@ -150,7 +150,7 @@ class ElektroAuto(Auto):
pass pass
# ========================================================================== # ==========================================================================
# TODO 9: Methode reichweite(self) -> float # 🎯 TEILZIEL 9 (TODO 9): Methode reichweite(self) -> float
# Berechnet die verbleibende Reichweite in Kilometern: # Berechnet die verbleibende Reichweite in Kilometern:
# Formel: (aktueller_ladestand / verbrauch_pro_100km) * 100 # Formel: (aktueller_ladestand / verbrauch_pro_100km) * 100
# Wenn verbrauch_pro_100km <= 0: 0.0 zurückgeben. # Wenn verbrauch_pro_100km <= 0: 0.0 zurückgeben.
@ -159,7 +159,7 @@ class ElektroAuto(Auto):
pass pass
# ========================================================================== # ==========================================================================
# TODO 10: Methode fahren(self, km: float) -> bool (Überschreiben mit Logik) # 🎯 TEILZIEL 10 (TODO 10): Methode fahren(self, km: float) -> bool (Überschreiben mit Logik)
# 1. Wenn km <= 0: False zurückgeben. # 1. Wenn km <= 0: False zurückgeben.
# 2. Berechne den benötigten Strom: benoetigt = (km / 100.0) * self.verbrauch_pro_100km # 2. Berechne den benötigten Strom: benoetigt = (km / 100.0) * self.verbrauch_pro_100km
# 3. Wenn self.batterie_ladestand_kwh >= benoetigt: # 3. Wenn self.batterie_ladestand_kwh >= benoetigt:
@ -174,7 +174,7 @@ class ElektroAuto(Auto):
pass pass
# ========================================================================== # ==========================================================================
# TODO 11: Methode aufladen(self, kwh: float) -> float # 🎯 TEILZIEL 11 (TODO 11): Methode aufladen(self, kwh: float) -> float
# Lädt den Akku auf, aber maximal bis batterie_kapazitaet_kwh! # Lädt den Akku auf, aber maximal bis batterie_kapazitaet_kwh!
# 1. Wenn kwh <= 0: return 0.0 # 1. Wenn kwh <= 0: return 0.0
# 2. Berechne den freien Platz im Akku: batterie_kapazitaet_kwh - batterie_ladestand_kwh # 2. Berechne den freien Platz im Akku: batterie_kapazitaet_kwh - batterie_ladestand_kwh
@ -186,7 +186,7 @@ class ElektroAuto(Auto):
pass pass
# ========================================================================== # ==========================================================================
# TODO 12: Methode info(self) -> str # 🎯 TEILZIEL 12 (TODO 12): Methode info(self) -> str
# Format: "{super().info()} | Akku: {batterie_ladestand_kwh:.1f}/{batterie_kapazitaet_kwh:.1f} kWh ({reichweite():.1f} km Reichweite)" # Format: "{super().info()} | Akku: {batterie_ladestand_kwh:.1f}/{batterie_kapazitaet_kwh:.1f} kWh ({reichweite():.1f} km Reichweite)"
# Beispiel: "Tesla Model 3 (2023) - 5000.0 km | 5 Sitze, 5 Türen | Akku: 60.0/60.0 kWh (333.3 km Reichweite)" # Beispiel: "Tesla Model 3 (2023) - 5000.0 km | 5 Sitze, 5 Türen | Akku: 60.0/60.0 kWh (333.3 km Reichweite)"
# ========================================================================== # ==========================================================================
@ -204,7 +204,7 @@ class Lkw(Fahrzeug):
""" """
# ========================================================================== # ==========================================================================
# TODO 13: Konstruktor __init__ von Lkw # 🎯 TEILZIEL 13 (TODO 13): Konstruktor __init__ von Lkw
# Parameter: marke (str), modell (str), baujahr (int), grundpreis (float), # Parameter: marke (str), modell (str), baujahr (int), grundpreis (float),
# max_zuladung_kg (float) # max_zuladung_kg (float)
# 1. Rufe super().__init__(marke, modell, baujahr, grundpreis) auf. # 1. Rufe super().__init__(marke, modell, baujahr, grundpreis) auf.
@ -222,7 +222,7 @@ class Lkw(Fahrzeug):
pass pass
# ========================================================================== # ==========================================================================
# TODO 14: Methode beladen(self, kg: float) -> bool # 🎯 TEILZIEL 14 (TODO 14): Methode beladen(self, kg: float) -> bool
# 1. Wenn kg > 0 und self.aktuelle_ladung_kg + kg <= self.max_zuladung_kg: # 1. Wenn kg > 0 und self.aktuelle_ladung_kg + kg <= self.max_zuladung_kg:
# - Erhöhe self.aktuelle_ladung_kg um kg # - Erhöhe self.aktuelle_ladung_kg um kg
# - return True # - return True
@ -232,7 +232,7 @@ class Lkw(Fahrzeug):
pass pass
# ========================================================================== # ==========================================================================
# TODO 15: Methode entladen(self, kg: float) -> float # 🎯 TEILZIEL 15 (TODO 15): Methode entladen(self, kg: float) -> float
# Entlädt maximal die vorhandene Ladung. # Entlädt maximal die vorhandene Ladung.
# 1. Wenn kg <= 0: return 0.0 # 1. Wenn kg <= 0: return 0.0
# 2. tatsaechlich = min(self.aktuelle_ladung_kg, kg) # 2. tatsaechlich = min(self.aktuelle_ladung_kg, kg)
@ -243,7 +243,7 @@ class Lkw(Fahrzeug):
pass pass
# ========================================================================== # ==========================================================================
# TODO 16: Methode info(self) -> str # 🎯 TEILZIEL 16 (TODO 16): Methode info(self) -> str
# Format: "{super().info()} | Ladung: {aktuelle_ladung_kg:.1f}/{max_zuladung_kg:.1f} kg" # Format: "{super().info()} | Ladung: {aktuelle_ladung_kg:.1f}/{max_zuladung_kg:.1f} kg"
# Beispiel: "MAN TGX (2019) - 150000.0 km | Ladung: 8500.0/18000.0 kg" # Beispiel: "MAN TGX (2019) - 150000.0 km | Ladung: 8500.0/18000.0 kg"
# ========================================================================== # ==========================================================================

View file

@ -25,7 +25,7 @@ class Form(ABC):
""" """
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__ der Basisklasse Form # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__ der Basisklasse Form
# Parameter: farbe (str = "schwarz") # Parameter: farbe (str = "schwarz")
# Setze self.farbe = farbe # Setze self.farbe = farbe
# ========================================================================== # ==========================================================================
@ -33,7 +33,7 @@ class Form(ABC):
pass pass
# ========================================================================== # ==========================================================================
# TODO 2: Abstrakte Methode flaeche(self) -> float # 🎯 TEILZIEL 2 (TODO 2): Abstrakte Methode flaeche(self) -> float
# Deklariere die Methode mit @abstractmethod. # Deklariere die Methode mit @abstractmethod.
# Da es eine abstrakte Methode ist, enthält der Rumpf nur 'pass'. # Da es eine abstrakte Methode ist, enthält der Rumpf nur 'pass'.
# ========================================================================== # ==========================================================================
@ -42,7 +42,7 @@ class Form(ABC):
pass pass
# ========================================================================== # ==========================================================================
# TODO 3: Abstrakte Methode umfang(self) -> float # 🎯 TEILZIEL 3 (TODO 3): Abstrakte Methode umfang(self) -> float
# Deklariere die Methode mit @abstractmethod. # Deklariere die Methode mit @abstractmethod.
# Rumpf: 'pass' # Rumpf: 'pass'
# ========================================================================== # ==========================================================================
@ -51,7 +51,7 @@ class Form(ABC):
pass pass
# ========================================================================== # ==========================================================================
# TODO 4: Methode info(self) -> str # 🎯 TEILZIEL 4 (TODO 4): Methode info(self) -> str
# Gibt einen allgemeinen Infostring zurück: # Gibt einen allgemeinen Infostring zurück:
# Format: "{Klassenname} ({farbe}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}" # Format: "{Klassenname} ({farbe}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}"
# Tipp: self.__class__.__name__ liefert den Namen der jeweiligen Kindklasse! # Tipp: self.__class__.__name__ liefert den Namen der jeweiligen Kindklasse!
@ -75,7 +75,7 @@ class Rechteck(Form):
""" """
# ========================================================================== # ==========================================================================
# TODO 5: Konstruktor __init__ von Rechteck # 🎯 TEILZIEL 5 (TODO 5): Konstruktor __init__ von Rechteck
# Parameter: breite (float), hoehe (float), farbe (str = "rot") # Parameter: breite (float), hoehe (float), farbe (str = "rot")
# 1. Rufe super().__init__(farbe) auf. # 1. Rufe super().__init__(farbe) auf.
# 2. Setze self.breite = float(breite) # 2. Setze self.breite = float(breite)
@ -85,21 +85,21 @@ class Rechteck(Form):
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Methode flaeche(self) -> float (Überschreiben) # 🎯 TEILZIEL 6 (TODO 6): Methode flaeche(self) -> float (Überschreiben)
# Formel: breite * hoehe # Formel: breite * hoehe
# ========================================================================== # ==========================================================================
def flaeche(self) -> float: def flaeche(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 7: Methode umfang(self) -> float (Überschreiben) # 🎯 TEILZIEL 7 (TODO 7): Methode umfang(self) -> float (Überschreiben)
# Formel: 2 * (breite + hoehe) # Formel: 2 * (breite + hoehe)
# ========================================================================== # ==========================================================================
def umfang(self) -> float: def umfang(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 8: Methode info(self) -> str (Überschreiben) # 🎯 TEILZIEL 8 (TODO 8): Methode info(self) -> str (Überschreiben)
# Format: "Rechteck ({farbe}, {breite:.1f}x{hoehe:.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}" # Format: "Rechteck ({farbe}, {breite:.1f}x{hoehe:.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}"
# Beispiel: "Rechteck (rot, 4.0x5.0) - Fläche: 20.00, Umfang: 18.00" # Beispiel: "Rechteck (rot, 4.0x5.0) - Fläche: 20.00, Umfang: 18.00"
# ========================================================================== # ==========================================================================
@ -117,7 +117,7 @@ class Kreis(Form):
""" """
# ========================================================================== # ==========================================================================
# TODO 9: Konstruktor __init__ von Kreis # 🎯 TEILZIEL 9 (TODO 9): Konstruktor __init__ von Kreis
# Parameter: radius (float), farbe (str = "blau") # Parameter: radius (float), farbe (str = "blau")
# 1. Rufe super().__init__(farbe) auf. # 1. Rufe super().__init__(farbe) auf.
# 2. Setze self.radius = float(radius) # 2. Setze self.radius = float(radius)
@ -126,21 +126,21 @@ class Kreis(Form):
pass pass
# ========================================================================== # ==========================================================================
# TODO 10: Methode flaeche(self) -> float (Überschreiben) # 🎯 TEILZIEL 10 (TODO 10): Methode flaeche(self) -> float (Überschreiben)
# Formel: math.pi * (radius ** 2) # Formel: math.pi * (radius ** 2)
# ========================================================================== # ==========================================================================
def flaeche(self) -> float: def flaeche(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 11: Methode umfang(self) -> float (Überschreiben) # 🎯 TEILZIEL 11 (TODO 11): Methode umfang(self) -> float (Überschreiben)
# Formel: 2 * math.pi * radius # Formel: 2 * math.pi * radius
# ========================================================================== # ==========================================================================
def umfang(self) -> float: def umfang(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 12: Methode info(self) -> str (Überschreiben) # 🎯 TEILZIEL 12 (TODO 12): Methode info(self) -> str (Überschreiben)
# Format: "Kreis ({farbe}, r={radius:.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}" # Format: "Kreis ({farbe}, r={radius:.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}"
# Beispiel: "Kreis (blau, r=3.0) - Fläche: 28.27, Umfang: 18.85" # Beispiel: "Kreis (blau, r=3.0) - Fläche: 28.27, Umfang: 18.85"
# ========================================================================== # ==========================================================================
@ -159,7 +159,7 @@ class Dreieck(Form):
""" """
# ========================================================================== # ==========================================================================
# TODO 13: Konstruktor __init__ von Dreieck # 🎯 TEILZIEL 13 (TODO 13): Konstruktor __init__ von Dreieck
# Parameter: seite_a (float), seite_b (float), farbe (str = "gruen") # Parameter: seite_a (float), seite_b (float), farbe (str = "gruen")
# 1. Rufe super().__init__(farbe) auf. # 1. Rufe super().__init__(farbe) auf.
# 2. Setze self.seite_a = float(seite_a) # 2. Setze self.seite_a = float(seite_a)
@ -169,7 +169,7 @@ class Dreieck(Form):
pass pass
# ========================================================================== # ==========================================================================
# TODO 14: Methode hypotenuse(self) -> float # 🎯 TEILZIEL 14 (TODO 14): Methode hypotenuse(self) -> float
# Berechnet die dritte Seite c mit dem Satz des Pythagoras: # Berechnet die dritte Seite c mit dem Satz des Pythagoras:
# Formel: math.sqrt(seite_a**2 + seite_b**2) # Formel: math.sqrt(seite_a**2 + seite_b**2)
# ========================================================================== # ==========================================================================
@ -177,21 +177,21 @@ class Dreieck(Form):
pass pass
# ========================================================================== # ==========================================================================
# TODO 15: Methode flaeche(self) -> float (Überschreiben) # 🎯 TEILZIEL 15 (TODO 15): Methode flaeche(self) -> float (Überschreiben)
# Formel: 0.5 * seite_a * seite_b # Formel: 0.5 * seite_a * seite_b
# ========================================================================== # ==========================================================================
def flaeche(self) -> float: def flaeche(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 16: Methode umfang(self) -> float (Überschreiben) # 🎯 TEILZIEL 16 (TODO 16): Methode umfang(self) -> float (Überschreiben)
# Formel: seite_a + seite_b + self.hypotenuse() # Formel: seite_a + seite_b + self.hypotenuse()
# ========================================================================== # ==========================================================================
def umfang(self) -> float: def umfang(self) -> float:
pass pass
# ========================================================================== # ==========================================================================
# TODO 17: Methode info(self) -> str (Überschreiben) # 🎯 TEILZIEL 17 (TODO 17): Methode info(self) -> str (Überschreiben)
# Format: "Dreieck ({farbe}, a={seite_a:.1f}, b={seite_b:.1f}, c={hypotenuse():.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}" # Format: "Dreieck ({farbe}, a={seite_a:.1f}, b={seite_b:.1f}, c={hypotenuse():.1f}) - Fläche: {flaeche():.2f}, Umfang: {umfang():.2f}"
# Beispiel: "Dreieck (gruen, a=3.0, b=4.0, c=5.0) - Fläche: 6.00, Umfang: 12.00" # Beispiel: "Dreieck (gruen, a=3.0, b=4.0, c=5.0) - Fläche: 6.00, Umfang: 12.00"
# ========================================================================== # ==========================================================================
@ -209,7 +209,7 @@ class Zeichenflaeche:
""" """
# ========================================================================== # ==========================================================================
# TODO 18: Konstruktor __init__ von Zeichenflaeche # 🎯 TEILZIEL 18 (TODO 18): Konstruktor __init__ von Zeichenflaeche
# Parameter: name (str = "Meine Zeichenfläche") # Parameter: name (str = "Meine Zeichenfläche")
# Attribute: # Attribute:
# - self.name: str = name # - self.name: str = name
@ -219,21 +219,21 @@ class Zeichenflaeche:
pass pass
# ========================================================================== # ==========================================================================
# TODO 19: Methode hinzufuegen(self, form: Form) -> None # 🎯 TEILZIEL 19 (TODO 19): Methode hinzufuegen(self, form: Form) -> None
# Fügt die übergebene Form zur Liste self.formen hinzu. # Fügt die übergebene Form zur Liste self.formen hinzu.
# ========================================================================== # ==========================================================================
def hinzufuegen(self, form: Form) -> None: def hinzufuegen(self, form: Form) -> None:
pass pass
# ========================================================================== # ==========================================================================
# TODO 20: Methode anzahl_formen(self) -> int # 🎯 TEILZIEL 20 (TODO 20): Methode anzahl_formen(self) -> int
# Gibt die Anzahl der aktuell enthaltenen Formen zurück. # Gibt die Anzahl der aktuell enthaltenen Formen zurück.
# ========================================================================== # ==========================================================================
def anzahl_formen(self) -> int: def anzahl_formen(self) -> int:
pass pass
# ========================================================================== # ==========================================================================
# TODO 21: Methode gesamte_flaeche(self) -> float (Polymorphie in Aktion!) # 🎯 TEILZIEL 21 (TODO 21): Methode gesamte_flaeche(self) -> float (Polymorphie in Aktion!)
# Berechnet die Summe aller Flächen der enthaltenen Formen. # Berechnet die Summe aller Flächen der enthaltenen Formen.
# Nutze eine Schleife oder sum(...), um form.flaeche() für jede Form aufzurufen. # Nutze eine Schleife oder sum(...), um form.flaeche() für jede Form aufzurufen.
# Wenn self.formen leer ist: 0.0 zurückgeben. # Wenn self.formen leer ist: 0.0 zurückgeben.
@ -242,7 +242,7 @@ class Zeichenflaeche:
pass pass
# ========================================================================== # ==========================================================================
# TODO 22: Methode gesamter_umfang(self) -> float (Polymorphie in Aktion!) # 🎯 TEILZIEL 22 (TODO 22): Methode gesamter_umfang(self) -> float (Polymorphie in Aktion!)
# Berechnet die Summe aller Umfänge der enthaltenen Formen. # Berechnet die Summe aller Umfänge der enthaltenen Formen.
# Nutze form.umfang() für jedes Objekt in self.formen. # Nutze form.umfang() für jedes Objekt in self.formen.
# Wenn self.formen leer ist: 0.0 zurückgeben. # Wenn self.formen leer ist: 0.0 zurückgeben.
@ -251,7 +251,7 @@ class Zeichenflaeche:
pass pass
# ========================================================================== # ==========================================================================
# TODO 23: Methode formen_nach_farbe(self, farbe: str) -> list[Form] # 🎯 TEILZIEL 23 (TODO 23): Methode formen_nach_farbe(self, farbe: str) -> list[Form]
# Filtert alle Formen heraus, die die angegebene Farbe haben. # Filtert alle Formen heraus, die die angegebene Farbe haben.
# WICHTIG: Groß-/Kleinschreibung ignorieren (z.B. mit farbe.lower())! # WICHTIG: Groß-/Kleinschreibung ignorieren (z.B. mit farbe.lower())!
# ========================================================================== # ==========================================================================
@ -259,7 +259,7 @@ class Zeichenflaeche:
pass pass
# ========================================================================== # ==========================================================================
# TODO 24: Methode groesste_form(self) -> Form | None # 🎯 TEILZIEL 24 (TODO 24): Methode groesste_form(self) -> Form | None
# Findet die Form mit dem größten Flächeninhalt (form.flaeche()). # Findet die Form mit dem größten Flächeninhalt (form.flaeche()).
# Wenn die Liste leer ist: return None # Wenn die Liste leer ist: return None
# Tipp: Nutze max(self.formen, key=lambda f: f.flaeche()) # Tipp: Nutze max(self.formen, key=lambda f: f.flaeche())
@ -268,7 +268,7 @@ class Zeichenflaeche:
pass pass
# ========================================================================== # ==========================================================================
# TODO 25: Methode report(self) -> list[str] # 🎯 TEILZIEL 25 (TODO 25): Methode report(self) -> list[str]
# Gibt eine Liste der info()-Texte aller enthaltenen Formen zurück. # Gibt eine Liste der info()-Texte aller enthaltenen Formen zurück.
# ========================================================================== # ==========================================================================
def report(self) -> List[str]: def report(self) -> List[str]:

View file

@ -12,7 +12,7 @@ from typing import Optional
# ============================================================================== # ==============================================================================
# TODO 1: Eigene Exception-Klassen definieren # 🎯 TEILZIEL 1 (TODO 1): Eigene Exception-Klassen definieren
# ============================================================================== # ==============================================================================
# Erstelle eine Basis-Exception-Klasse 'BankFehler', die von 'Exception' erbt. # Erstelle eine Basis-Exception-Klasse 'BankFehler', die von 'Exception' erbt.
# Erstelle dann 4 abgeleitete Exception-Klassen, die alle von 'BankFehler' erben: # Erstelle dann 4 abgeleitete Exception-Klassen, die alle von 'BankFehler' erben:
@ -43,7 +43,7 @@ class UngueltigerBetragError(BankFehler):
# ============================================================================== # ==============================================================================
# TODO 2: Klasse Bankkonto # 🎯 TEILZIEL 2 (TODO 2): Klasse Bankkonto
# ============================================================================== # ==============================================================================
class Bankkonto: class Bankkonto:
def __init__(self, inhaber: str, pin: str, kontostand: float = 0.0): def __init__(self, inhaber: str, pin: str, kontostand: float = 0.0):
@ -137,7 +137,7 @@ class Bankkonto:
# ============================================================================== # ==============================================================================
# TODO 3: Geldautomat-Auszahlung mit try - except - else - finally # 🎯 TEILZIEL 3 (TODO 3): Geldautomat-Auszahlung mit try - except - else - finally
# ============================================================================== # ==============================================================================
def geldautomat_abheben(konto: Bankkonto, betrag: float, pin: str) -> str: def geldautomat_abheben(konto: Bankkonto, betrag: float, pin: str) -> str:
""" """

View file

@ -16,7 +16,7 @@ from typing import List, Optional, Dict, Any
# ============================================================================== # ==============================================================================
# TODO 1: Klasse Spieler mit Serialisierung # 🎯 TEILZIEL 1 (TODO 1): Klasse Spieler mit Serialisierung
# ============================================================================== # ==============================================================================
class Spieler: class Spieler:
def __init__(self, name: str, level: int, punkte: int, inventar: Optional[List[str]] = None): def __init__(self, name: str, level: int, punkte: int, inventar: Optional[List[str]] = None):
@ -71,7 +71,7 @@ class Spieler:
# ============================================================================== # ==============================================================================
# TODO 2: Klasse Spielstand mit JSON- und CSV-Persistenz # 🎯 TEILZIEL 2 (TODO 2): Klasse Spielstand mit JSON- und CSV-Persistenz
# ============================================================================== # ==============================================================================
class Spielstand: class Spielstand:
def __init__(self, titel: str = "Neuer Spielstand"): def __init__(self, titel: str = "Neuer Spielstand"):

View file

@ -99,7 +99,7 @@ class ZaehlerLogik:
""" """
# ========================================================================== # ==========================================================================
# TODO 1: Konstruktor __init__ # 🎯 TEILZIEL 1 (TODO 1): Konstruktor __init__
# Parameter: # Parameter:
# - startwert (int, Standard: 0) # - startwert (int, Standard: 0)
# - min_wert (int, Standard: -100) # - min_wert (int, Standard: -100)
@ -181,7 +181,7 @@ class ZaehlerApp:
""" """
# ========================================================================== # ==========================================================================
# TODO 4: Konstruktor __init__(self, root: tk.Tk) # 🎯 TEILZIEL 4 (TODO 4): Konstruktor __init__(self, root: tk.Tk)
# Parameter: root (das Tkinter-Hauptfenster) # Parameter: root (das Tkinter-Hauptfenster)
# #
# 1. Speichere das Fenster: # 1. Speichere das Fenster:
@ -269,7 +269,7 @@ class ZaehlerApp:
pass pass
# ========================================================================== # ==========================================================================
# TODO 6: Methode aktualisiere_anzeige(self) -> None # 🎯 TEILZIEL 6 (TODO 6): Methode aktualisiere_anzeige(self) -> None
# Synchronisiert die Oberfläche mit den aktuellen Werten aus self.logik: # Synchronisiert die Oberfläche mit den aktuellen Werten aus self.logik:
# #
# 1. Hauptanzeige: # 1. Hauptanzeige:

View file

@ -40,7 +40,7 @@ def berechne_gesamtsumme(*zahlen: float, rabatt_prozent: float = 0.0) -> float:
berechne_gesamtsumme() -> 0.0 berechne_gesamtsumme() -> 0.0
""" """
# ========================================================================== # ==========================================================================
# TODO 1: Implementiere berechne_gesamtsumme # 🎯 TEILZIEL 1 (TODO 1): Implementiere berechne_gesamtsumme
# 1. Validiere rabatt_prozent: Liegt der Wert nicht zwischen 0.0 und 100.0, # 1. Validiere rabatt_prozent: Liegt der Wert nicht zwischen 0.0 und 100.0,
# löse einen ValueError mit passender Nachricht aus. # löse einen ValueError mit passender Nachricht aus.
# 2. Summiere alle Werte in `zahlen` (wenn zahlen leer ist, ist die Summe 0.0). # 2. Summiere alle Werte in `zahlen` (wenn zahlen leer ist, ist die Summe 0.0).
@ -68,7 +68,7 @@ def erstelle_profil(name: str, **details: Any) -> Dict[str, Any]:
-> {"name": "Aragorn", "klasse": "Waldlaeufer", "level": 20} -> {"name": "Aragorn", "klasse": "Waldlaeufer", "level": 20}
""" """
# ========================================================================== # ==========================================================================
# TODO 2: Implementiere erstelle_profil # 🎯 TEILZIEL 2 (TODO 2): Implementiere erstelle_profil
# 1. Erstelle ein Dictionary mit {"name": str(name)}. # 1. Erstelle ein Dictionary mit {"name": str(name)}.
# 2. Füge alle Schlüssel-Wert-Paare aus `details` hinzu. # 2. Füge alle Schlüssel-Wert-Paare aus `details` hinzu.
# 3. Gib das fertige Dictionary zurück. # 3. Gib das fertige Dictionary zurück.
@ -98,7 +98,7 @@ class Gegenstand:
ValueError: Falls gewicht < 0 oder wert < 0 ist. ValueError: Falls gewicht < 0 oder wert < 0 ist.
""" """
# ========================================================================== # ==========================================================================
# TODO 3: Implementiere Gegenstand.__init__, __repr__, __str__ und __eq__ # 🎯 TEILZIEL 3 (TODO 3): Implementiere Gegenstand.__init__, __repr__, __str__ und __eq__
# 1. Validiere gewicht >= 0 und wert >= 0 (sonst ValueError). # 1. Validiere gewicht >= 0 und wert >= 0 (sonst ValueError).
# 2. Setze self.name = str(name), self.gewicht = float(gewicht), self.wert = int(wert). # 2. Setze self.name = str(name), self.gewicht = float(gewicht), self.wert = int(wert).
# ========================================================================== # ==========================================================================
@ -145,7 +145,7 @@ class Inventar:
ValueError: Falls max_gewicht <= 0 oder die Start-Gegenstände das Maximalgewicht überschreiten. ValueError: Falls max_gewicht <= 0 oder die Start-Gegenstände das Maximalgewicht überschreiten.
""" """
# ========================================================================== # ==========================================================================
# TODO 4: Inventar-Initialisierung # 🎯 TEILZIEL 4 (TODO 4): Inventar-Initialisierung
# 1. Validiere max_gewicht > 0 (sonst ValueError). # 1. Validiere max_gewicht > 0 (sonst ValueError).
# 2. Speichere self.max_gewicht = float(max_gewicht). # 2. Speichere self.max_gewicht = float(max_gewicht).
# 3. Initialisiere eine interne Liste self._items = []. # 3. Initialisiere eine interne Liste self._items = [].
@ -187,7 +187,7 @@ class Inventar:
das Maximalgewicht des Inventars überschreiten würde. das Maximalgewicht des Inventars überschreiten würde.
""" """
# ========================================================================== # ==========================================================================
# TODO 6: hinzufuegen mit *args # 🎯 TEILZIEL 6 (TODO 6): hinzufuegen mit *args
# 1. Prüfe für jedes item in `items`, ob es eine Instanz von Gegenstand ist (sonst TypeError). # 1. Prüfe für jedes item in `items`, ob es eine Instanz von Gegenstand ist (sonst TypeError).
# 2. Berechne das Zusatzgewicht aller neuen Gegenstände. # 2. Berechne das Zusatzgewicht aller neuen Gegenstände.
# 3. Wenn self.gesamtgewicht + zusatz_gewicht > self.max_gewicht: # 3. Wenn self.gesamtgewicht + zusatz_gewicht > self.max_gewicht:
@ -201,7 +201,7 @@ class Inventar:
Ermöglicht len(inventar) -> Gibt die Anzahl der Gegenstände zurück. Ermöglicht len(inventar) -> Gibt die Anzahl der Gegenstände zurück.
""" """
# ========================================================================== # ==========================================================================
# TODO 7: __len__ # 🎯 TEILZIEL 7 (TODO 7): __len__
# ========================================================================== # ==========================================================================
pass pass
@ -217,7 +217,7 @@ class Inventar:
TypeError: Falls key weder int noch str ist. TypeError: Falls key weder int noch str ist.
""" """
# ========================================================================== # ==========================================================================
# TODO 8: __getitem__ (Multi-Type Lookup: int und str) # 🎯 TEILZIEL 8 (TODO 8): __getitem__ (Multi-Type Lookup: int und str)
# 1. Wenn isinstance(key, int): gib self._items[key] zurück. # 1. Wenn isinstance(key, int): gib self._items[key] zurück.
# 2. Wenn isinstance(key, str): suche den ersten Gegenstand mit passendem Namen # 2. Wenn isinstance(key, str): suche den ersten Gegenstand mit passendem Namen
# (Vergleich mit g.name.lower() == key.lower()). Wenn gefunden, zurückgeben. # (Vergleich mit g.name.lower() == key.lower()). Wenn gefunden, zurückgeben.
@ -236,7 +236,7 @@ class Inventar:
ValueError: Falls durch den Austausch das Maximalgewicht überschritten würde. ValueError: Falls durch den Austausch das Maximalgewicht überschritten würde.
""" """
# ========================================================================== # ==========================================================================
# TODO 9: __setitem__ # 🎯 TEILZIEL 9 (TODO 9): __setitem__
# 1. Prüfe Typen (index muss int sein, value muss Gegenstand sein, sonst TypeError). # 1. Prüfe Typen (index muss int sein, value muss Gegenstand sein, sonst TypeError).
# 2. Prüfe Indexgrenzen: -len(self._items) <= index < len(self._items) (sonst IndexError). # 2. Prüfe Indexgrenzen: -len(self._items) <= index < len(self._items) (sonst IndexError).
# 3. Berechne neues Gesamtgewicht: gesamtgewicht - altes_item.gewicht + value.gewicht. # 3. Berechne neues Gesamtgewicht: gesamtgewicht - altes_item.gewicht + value.gewicht.
@ -257,7 +257,7 @@ class Inventar:
TypeError: Falls key weder int noch str ist. TypeError: Falls key weder int noch str ist.
""" """
# ========================================================================== # ==========================================================================
# TODO 10: __delitem__ # 🎯 TEILZIEL 10 (TODO 10): __delitem__
# 1. Wenn int: del self._items[key]. # 1. Wenn int: del self._items[key].
# 2. Wenn str: suche erstes Element mit passendem Namen (case-insensitive) und entferne es. # 2. Wenn str: suche erstes Element mit passendem Namen (case-insensitive) und entferne es.
# Falls nicht vorhanden -> KeyError. # Falls nicht vorhanden -> KeyError.
@ -272,7 +272,7 @@ class Inventar:
- gegenstand_objekt in inventar -> True/False (Objekt-Prüfung) - gegenstand_objekt in inventar -> True/False (Objekt-Prüfung)
""" """
# ========================================================================== # ==========================================================================
# TODO 11: __contains__ # 🎯 TEILZIEL 11 (TODO 11): __contains__
# 1. Wenn str: prüfe, ob ein Gegenstand mit diesem Namen existiert (case-insensitive). # 1. Wenn str: prüfe, ob ein Gegenstand mit diesem Namen existiert (case-insensitive).
# 2. Wenn Gegenstand: prüfe `item in self._items`. # 2. Wenn Gegenstand: prüfe `item in self._items`.
# 3. Andernfalls gebe False zurück. # 3. Andernfalls gebe False zurück.
@ -284,7 +284,7 @@ class Inventar:
Ermöglicht Iteration: for item in inventar: ... Ermöglicht Iteration: for item in inventar: ...
""" """
# ========================================================================== # ==========================================================================
# TODO 12: __iter__ # 🎯 TEILZIEL 12 (TODO 12): __iter__
# Gib einen Iterator über self._items zurück (z.B. iter(self._items)). # Gib einen Iterator über self._items zurück (z.B. iter(self._items)).
# ========================================================================== # ==========================================================================
pass pass
@ -308,7 +308,7 @@ def packe_inventar(*gegenstaende: Gegenstand, max_gewicht: float = 20.0) -> Inve
Demonstriert Argument-Unpacking und flexible Parameter. Demonstriert Argument-Unpacking und flexible Parameter.
""" """
# ========================================================================== # ==========================================================================
# TODO 13: packe_inventar # 🎯 TEILZIEL 13 (TODO 13): packe_inventar
# 1. Erstelle ein Inventar mit `max_gewicht=max_gewicht`. # 1. Erstelle ein Inventar mit `max_gewicht=max_gewicht`.
# 2. Füge alle `gegenstaende` mit inv.hinzufuegen(*gegenstaende) hinzu. # 2. Füge alle `gegenstaende` mit inv.hinzufuegen(*gegenstaende) hinzu.
# 3. Gib das befüllte Inventar zurück. # 3. Gib das befüllte Inventar zurück.