Lösungen: Teil 10 - Kombination aller Konzepte
Lösung 10.1: Temperaturumrechner
def celsius_zu_fahrenheit(celsius):
"""Rechnet Celsius in Fahrenheit um."""
return celsius * 9/5 + 32Erklärung:
- Formel: F = C × 9/5 + 32
- Beispiele:
- 0°C → 32°F (Gefrierpunkt)
- 100°C → 212°F (Siedepunkt)
- 37°C → 98.6°F (Körpertemperatur)
Lösung 10.2: Notenbewertung
def note_pruefen(note):
"""Prüft, ob eine Note ausreichend ist."""
if note >= 4.0:
return "bestanden"
else:
return "nicht bestanden"Erklärung: In der Schweiz ist eine Note von 4.0 oder höher eine bestandene Note. Wir verwenden >= um auch 4.0 einzuschließen.
Lösung 10.3: Einkaufspreis berechnen
def einkaufspreis(anzahl_hefte, anzahl_stifte):
"""Berechnet den Gesamtpreis eines Einkaufs."""
preis_heft = 2.50
preis_stift = 1.20
return anzahl_hefte * preis_heft + anzahl_stifte * preis_stiftAlternative (ohne Variablen):
def einkaufspreis(anzahl_hefte, anzahl_stifte):
"""Berechnet den Gesamtpreis eines Einkaufs."""
return anzahl_hefte * 2.50 + anzahl_stifte * 1.20Erklärung:
- 2 Hefte: 2 × 2.50 = 5.00 CHF
- 3 Stifte: 3 × 1.20 = 3.60 CHF
- Total: 5.00 + 3.60 = 8.60 CHF
Lösung 10.4: Zahlen filtern
def nur_positive(zahlen):
"""Filtert positive Zahlen aus einer Liste."""
ergebnis = []
for zahl in zahlen:
if zahl > 0:
ergebnis.append(zahl)
return ergebnisAlternative (List Comprehension):
def nur_positive(zahlen):
"""Filtert positive Zahlen aus einer Liste."""
return [zahl for zahl in zahlen if zahl > 0]Erklärung: Wir iterieren über alle Zahlen und behalten nur die, die größer als 0 sind.
Lösung 10.5: Multiplikationstabelle
def multiplikationstabelle(zahl):
"""Erstellt Multiplikationstabelle von 1 bis 10."""
ergebnis = []
for i in range(1, 11):
ergebnis.append(zahl * i)
return ergebnisAlternative (List Comprehension):
def multiplikationstabelle(zahl):
"""Erstellt Multiplikationstabelle von 1 bis 10."""
return [zahl * i for i in range(1, 11)]Erklärung:
- Für zahl=5: [5×1, 5×2, 5×3, ..., 5×10] = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
Lösung 10.6: Code Reading
Antworten:
Was macht die Funktion
bewerte_pruefung()?Sie berechnet die Prozentzahl aus erreichten Punkten und Maximalpunkten und ordnet dann basierend auf der Prozentzahl eine Schweizer Note zwischen 3.5 und 6.0 zu.
Wie viele Schüler werden bewertet?
3 Schüler (Anna, Ben, Clara)
Tabelle für die Schleife:
| Iteration | i | schueler[i] | punkte_liste[i] | prozent | note |
|---|---|---|---|---|---|
| 1 | 0 | "Anna" | 45 | 90.0 | 6.0 |
| 2 | 1 | "Ben" | 38 | 76.0 | 5.0 |
| 3 | 2 | "Clara" | 42 | 84.0 | 5.5 |
Berechnung:
- Anna: 45/50 = 0.9 = 90% → Note 6.0
- Ben: 38/50 = 0.76 = 76% → Note 5.0
- Clara: 42/50 = 0.84 = 84% → Note 5.5
- Welche Konzepte werden kombiniert?
- Funktionen (Definition und Aufruf)
- Parameter (punkte, max_punkte)
- If-elif-else Bedingungen (Notenvergabe)
- Listen (schueler, punkte_liste)
- Schleifen (for-Schleife mit range)
- Arithmetik (Prozentberechnung)
- F-Strings (Formatierte Ausgabe)
Lösung 10.7: Debugging
Fehler: In Zeile 6 steht if note > 4.0: statt if note >= 4.0:. Die Note 4.0 sollte als bestanden zählen, aber der Operator > schließt 4.0 aus.
Problem:
if note > 4.0: # 4.0 > 4.0 ist False!
bestanden = bestanden + 1Korrekte Lösung:
def analysiere_noten(noten):
"""Analysiert Noten einer Klasse."""
summe = 0
bestanden = 0
for note in noten:
summe = summe + note
if note >= 4.0: # >= statt >
bestanden = bestanden + 1
durchschnitt = summe / len(noten)
return durchschnitt, bestanden
# Test
klassen_noten = [5.5, 4.0, 3.5, 5.0, 4.5]
durchschnitt, anzahl_bestanden = analysiere_noten(klassen_noten)
print(f"Durchschnitt: {durchschnitt}") # 4.5
print(f"Bestanden: {anzahl_bestanden} von {len(klassen_noten)}") # 4 von 5Erklärung:
>bedeutet "größer als" (4.0 zählt NICHT)>=bedeutet "größer oder gleich" (4.0 zählt MIT)- Bei den Noten [5.5, 4.0, 3.5, 5.0, 4.5]:
- Bestanden (>= 4.0): 5.5, 4.0, 5.0, 4.5 = 4 Schüler
- Nicht bestanden (< 4.0): 3.5 = 1 Schüler
Bonus-Übungen
Lösung Bonus 11: FizzBuzz
def fizzbuzz(n):
"""FizzBuzz-Funktion."""
if n % 3 == 0 and n % 5 == 0:
return "FizzBuzz"
elif n % 3 == 0:
return "Fizz"
elif n % 5 == 0:
return "Buzz"
else:
return str(n)Wichtig: Die Reihenfolge der Bedingungen ist entscheidend! Die Prüfung auf "durch 3 UND 5 teilbar" muss ZUERST kommen.
Erklärung:
- Durch 3 und 5 teilbar (z.B. 15) → "FizzBuzz"
- Nur durch 3 teilbar (z.B. 3, 6, 9) → "Fizz"
- Nur durch 5 teilbar (z.B. 5, 10) → "Buzz"
- Sonst (z.B. 7) → Zahl als String
Lösung Bonus 18: Caesar-Verschlüsselung
def caesar_verschluesseln(text, verschiebung):
"""Caesar-Verschlüsselung für Kleinbuchstaben."""
ergebnis = ""
for zeichen in text:
# Konvertiere Buchstaben zu Nummer (a=0, b=1, ..., z=25)
alt_position = ord(zeichen) - ord('a')
# Verschiebe und wrap around mit Modulo
neu_position = (alt_position + verschiebung) % 26
# Konvertiere zurück zu Buchstaben
neu_zeichen = chr(neu_position + ord('a'))
ergebnis += neu_zeichen
return ergebnisErklärung:
ord()gibt den ASCII-Wert eines Zeichens zurückchr()konvertiert einen ASCII-Wert zu einem Zeichen% 26sorgt für Wrap-Around (z → a bei Verschiebung)- Beispiel: "abc" mit Verschiebung 1 → "bcd"
- Beispiel: "xyz" mit Verschiebung 3 → "abc" (Wrap-around)
Lösung Bonus 19: Stern-Pyramide
def stern_pyramide(hoehe):
"""Erstellt eine Stern-Pyramide."""
ergebnis = ""
for i in range(1, hoehe + 1):
ergebnis += "*" * i
if i < hoehe: # Kein Newline nach der letzten Zeile
ergebnis += "\n"
return ergebnisAlternative (mit join):
def stern_pyramide(hoehe):
"""Erstellt eine Stern-Pyramide."""
zeilen = []
for i in range(1, hoehe + 1):
zeilen.append("*" * i)
return "\n".join(zeilen)Erklärung:
- Für hoehe=3:
- Iteration 1: "*"
- Iteration 2: "**"
- Iteration 3: "***"
- Ergebnis: "\n**\n**"
Lösung Bonus 20: Taschenrechner
def rechne(zahl1, zahl2, operation):
"""Einfacher Taschenrechner."""
if operation == "+":
return zahl1 + zahl2
elif operation == "-":
return zahl1 - zahl2
elif operation == "*":
return zahl1 * zahl2
elif operation == "/":
if zahl2 == 0:
return "Fehler"
return zahl1 / zahl2
else:
return "Fehler"Erklärung:
- Wir prüfen die Operation mit if-elif-else
- Bei Division durch 0 geben wir "Fehler" zurück
- Bei ungültiger Operation (z.B. "%") geben wir "Fehler" zurück
- Beispiele:
rechne(10, 5, "+")→ 15rechne(10, 5, "/")→ 2rechne(10, 0, "/")→ "Fehler"