Appearance
Kapitel 16: Basis-Praxisprojekte
🎯 Lernziele
In diesem Kapitel wirst du:
- Dein Wissen in echten Projekten anwenden
- Einen Taschenrechner programmieren
- Ein Studentenverwaltungssystem erstellen
- Textdateien analysieren
- Einen Passwort-Generator bauen
🚀 Praxis 1: Einfacher Taschenrechner
📋 Anforderungsanalyse
Funktionalitäten:
- ✅ Grundrechenarten (+, -, *, /, %, **)
- ✅ Wiederholte Eingabe
- ✅ Fehlerbehandlung (Division durch 0, ungültige Eingabe)
- ✅ Beenden-Option
💻 Vollständiger Code
python
def taschenrechner():
"""Einfacher Taschenrechner mit Fehlerbehandlung"""
print("=== Einfacher Taschenrechner ===")
print("Befehle: +, -, *, /, %, **, exit")
print("-" * 30)
while True:
# Eingabe
befehl = input("\nGib einen Befehl ein (oder 'exit' zum Beenden): ")
if befehl.lower() == "exit":
print("Auf Wiedersehen!")
break
if befehl not in ["+", "-", "*", "/", "%", "**"]:
print("Ungültiger Befehl! Bitte verwende: +, -, *, /, %, **")
continue
try:
a = float(input("Gib die erste Zahl ein: "))
b = float(input("Gib die zweite Zahl ein: "))
# Berechnung
if befehl == "+":
ergebnis = a + b
operator = "+"
elif befehl == "-":
ergebnis = a - b
operator = "-"
elif befehl == "*":
ergebnis = a * b
operator = "*"
elif befehl == "/":
if b == 0:
print("Fehler: Division durch 0 ist nicht erlaubt!")
continue
ergebnis = a / b
operator = "/"
elif befehl == "%":
ergebnis = a % b
operator = "%"
elif befehl == "**":
ergebnis = a ** b
operator = "**"
print(f"Ergebnis: {a} {operator} {b} = {ergebnis}")
except ValueError:
print("Fehler: Bitte gib gültige Zahlen ein!")
except Exception as e:
print(f"Ein unerwarteter Fehler ist aufgetreten: {e}")
# Hauptprogramm
if __name__ == "__main__":
taschenrechner()🧪 Testlauf
=== Einfacher Taschenrechner ===
Befehle: +, -, *, /, %, **, exit
------------------------------
Gib einen Befehl ein (oder 'exit' zum Beenden): +
Gib die erste Zahl ein: 10
Gib die zweite Zahl ein: 5
Ergebnis: 10 + 5 = 15
Gib einen Befehl ein (oder 'exit' zum Beenden): exit
Auf Wiedersehen!🎓 Praxis 2: Studentenverwaltungssystem
📋 Anforderungsanalyse
Funktionalitäten:
- ✅ Studenten hinzufügen
- ✅ Studenten anzeigen
- ✅ Studenten löschen
- ✅ Studenten suchen
- ✅ Daten in Datei speichern
💻 Vollständiger Code
python
import json
import os
class StudentenVerwaltung:
def __init__(self, dateiname="studenten.json"):
self.dateiname = dateiname
self.studenten = self.laden()
def laden(self):
"""Lädt Studentendaten aus Datei"""
if os.path.exists(self.dateiname):
try:
with open(self.dateiname, "r", encoding="utf-8") as f:
return json.load(f)
except:
return {}
return {}
def speichern(self):
"""Speichert Studentendaten in Datei"""
with open(self.dateiname, "w", encoding="utf-8") as f:
json.dump(self.studenten, f, ensure_ascii=False, indent=2)
def hinzufügen(self, matrikelnummer, name, alter, fach):
"""Fügt einen neuen Studenten hinzu"""
if matrikelnummer in self.studenten:
print(f"Fehler: Matrikelnummer {matrikelnummer} existiert bereits!")
return False
self.studenten[matrikelnummer] = {
"name": name,
"alter": alter,
"fach": fach
}
self.speichern()
print(f"Student {name} erfolgreich hinzugefügt!")
return True
def anzeigen(self, matrikelnummer=None):
"""Zeigt Studenten an"""
if matrikelnummer:
if matrikelnummer in self.studenten:
s = self.studenten[matrikelnummer]
print(f"\nMatrikelnummer: {matrikelnummer}")
print(f" Name: {s['name']}")
print(f" Alter: {s['alter']}")
print(f" Fach: {s['fach']}")
else:
print(f"Fehler: Student mit Matrikelnummer {matrikelnummer} nicht gefunden!")
else:
if not self.studenten:
print("Keine Studenten vorhanden.")
return
print("\n=== Alle Studenten ===")
for mn, s in self.studenten.items():
print(f" {mn}: {s['name']} ({s['fach']})")
def löschen(self, matrikelnummer):
"""Löscht einen Studenten"""
if matrikelnummer in self.studenten:
name = self.studenten[matrikelnummer]["name"]
del self.studenten[matrikelnummer]
self.speichern()
print(f"Student {name} erfolgreich gelöscht!")
return True
else:
print(f"Fehler: Student mit Matrikelnummer {matrikelnummer} nicht gefunden!")
return False
def suchen(self, suchbegriff):
"""Sucht nach Studenten (Name oder Fach)"""
gefunden = []
for mn, s in self.studenten.items():
if suchbegriff.lower() in s["name"].lower() or suchbegriff.lower() in s["fach"].lower():
gefunden.append((mn, s))
if gefunden:
print(f"\n=== Suchergebnisse für '{suchbegriff}' ===")
for mn, s in gefunden:
print(f" {mn}: {s['name']} ({s['fach']})")
else:
print(f"Keine Ergebnisse für '{suchbegriff}' gefunden.")
def hauptmenu():
"""Hauptmenü"""
v = StudentenVerwaltung()
while True:
print("\n=== Studentenverwaltung ===")
print("1. Student hinzufügen")
print("2. Alle Studenten anzeigen")
print("3. Student suchen")
print("4. Student löschen")
print("5. Beenden")
wahl = input("\nWähle eine Option (1-5): ")
if wahl == "1":
mn = input("Matrikelnummer: ")
name = input("Name: ")
alter = input("Alter: ")
fach = input("Fach: ")
v.hinzufügen(mn, name, alter, fach)
elif wahl == "2":
v.anzeigen()
elif wahl == "3":
suchbegriff = input("Suchbegriff (Name oder Fach): ")
v.suchen(suchbegriff)
elif wahl == "4":
mn = input("Matrikelnummer des zu löschenden Studenten: ")
bestätigung = input(f"Sind Sie sicher, dass Sie den Studenten mit Matrikelnummer {mn} löschen möchten? (j/n): ")
if bestätigung.lower() == "j":
v.löschen(mn)
elif wahl == "5":
print("Auf Wiedersehen!")
break
else:
print("Ungültige Eingabe! Bitte wähle eine Zahl von 1 bis 5.")
# Hauptprogramm
if __name__ == "__main__":
hauptmenu()🧪 Testlauf
=== Studentenverwaltung ===
1. Student hinzufügen
2. Alle Studenten anzeigen
3. Student suchen
4. Student löschen
5. Beenden
Wähle eine Option (1-5): 1
Matrikelnummer: S001
Name: Max Mustermann
Alter: 20
Fach: Informatik
Student Max Mustermann erfolgreich hinzugefügt!📄 Praxis 3: Textdatei-Analyse
📋 Anforderungsanalyse
Funktionalitäten:
- ✅ Textdatei einlesen
- ✅ Anzahl Zeichen zählen
- ✅ Anzahl Wörter zählen
- ✅ Anzahl Zeilen zählen
- ✅ Häufigkeit von Wörtern analysieren
💻 Vollständiger Code
python
import string
def text_analyse(dateiname):
"""Analysiert eine Textdatei"""
try:
with open(dateiname, "r", encoding="utf-8") as f:
text = f.read()
# Statistiken
anzahl_zeichen = len(text)
anzahl_zeilen = text.count("\n") + 1
# Wörter (Satzzeichen entfernen)
übersetzungstabelle = str.maketrans("", "", string.punctuation)
text_bereinigt = text.translate(übersetzungstabelle)
wörter = text_bereinigt.lower().split()
anzahl_wörter = len(wörter)
# Häufigkeit der Wörter
wörter_häufigkeit = {}
for wort in wörter:
wörter_häufigkeit[wort] = wörter_häufigkeit.get(wort, 0) + 1
# Top 5 Wörter
top_wörter = sorted(wörter_häufigkeit.items(), key=lambda x: x[1], reverse=True)[:5]
# Ergebnisse anzeigen
print(f"=== Analyse von '{dateiname}' ===")
print(f"Anzahl Zeichen: {anzahl_zeichen}")
print(f"Anzahl Wörter: {anzahl_wörter}")
print(f"Anzahl Zeilen: {anzahl_zeilen}")
print("\nTop 5 Wörter:")
for wort, häufigkeit in top_wörter:
print(f" {wort}: {häufigkeit}")
# Ergebnisse in Datei speichern
with open("analyse_ergebnis.txt", "w", encoding="utf-8") as f:
f.write(f"=== Analyse von '{dateiname}' ===\n")
f.write(f"Anzahl Zeichen: {anzahl_zeichen}\n")
f.write(f"Anzahl Wörter: {anzahl_wörter}\n")
f.write(f"Anzahl Zeilen: {anzahl_zeilen}\n")
f.write("\nTop 5 Wörter:\n")
for wort, häufigkeit in top_wörter:
f.write(f" {wort}: {häufigkeit}\n")
print("\nErgebnisse wurden in 'analyse_ergebnis.txt' gespeichert.")
except FileNotFoundError:
print(f"Fehler: Datei '{dateiname}' nicht gefunden!")
except Exception as e:
print(f"Ein Fehler ist aufgetreten: {e}")
# Hauptprogramm
if __name__ == "__main__":
dateiname = input("Gib den Dateinamen ein: ")
text_analyse(dateiname)🧪 Testlauf
Gib den Dateinamen ein: test.txt
=== Analyse von 'test.txt' ===
Anzahl Zeichen: 256
Anzahl Wörter: 45
Anzahl Zeilen: 8
Top 5 Wörter:
python: 5
ist: 4
toll: 3
programmieren: 2
lernen: 2
Ergebnisse wurden in 'analyse_ergebnis.txt' gespeichert.🔐 Praxis 4: Passwort-Generator
📋 Anforderungsanalyse
Funktionalitäten:
- ✅ Zufälliges Passwort generieren
- ✅ Verschiedene Zeichensätze (Kleinbuchstaben, Großbuchstaben, Zahlen, Sonderzeichen)
- ✅ Passwortlänge festlegen
- ✅ Sicherheitsbewertung
💻 Vollständiger Code
python
import random
import string
def passwort_generieren(länge=12, großbuchstaben=True, zahlen=True, sonderzeichen=True):
"""Generiert ein sicheres Passwort"""
zeichen = string.ascii_lowercase
if großbuchstaben:
zeichen += string.ascii_uppercase
if zahlen:
zeichen += string.digits
if sonderzeichen:
zeichen += string.punctuation
# Sicherstellen, dass mindestens ein Zeichen aus jeder Kategorie enthalten ist
passwort = []
if großbuchstaben:
passwort.append(random.choice(string.ascii_uppercase))
if zahlen:
passwort.append(random.choice(string.digits))
if sonderzeichen:
passwort.append(random.choice(string.punctuation))
# Rest mit zufälligen Zeichen auffüllen
while len(passwort) < länge:
passwort.append(random.choice(zeichen))
# Passwort mischen
random.shuffle(passwort)
return "".join(passwort)
def passwort_bewerten(passwort):
"""Bewertet die Sicherheit eines Passworts"""
punkte = 0
# Länge
if len(passwort) >= 8:
punkte += 1
if len(passwort) >= 12:
punkte += 1
if len(passwort) >= 16:
punkte += 1
# Zeichentypen
if any(c.islower() for c in passwort):
punkte += 1
if any(c.isupper() for c in passwort):
punkte += 1
if any(c.isdigit() for c in passwort):
punkte += 1
if any(c in string.punctuation for c in passwort):
punkte += 1
# Bewertung
if punkte <= 3:
return "Schwach", "🔴"
elif punkte <= 5:
return "Mittel", "🟡"
else:
return "Stark", "🟢"
def passwort_generator_app():
"""Passwort-Generator-Anwendung"""
print("=== Passwort-Generator ===")
while True:
try:
länge = int(input("\nGib die Passwortlänge ein (mindestens 8): "))
if länge < 8:
print("Die Länge muss mindestens 8 Zeichen betragen!")
continue
except ValueError:
print("Fehler: Bitte gib eine gültige Zahl ein!")
continue
großbuchstaben = input("Großbuchstaben einschließen? (j/n): ").lower() == "j"
zahlen = input("Zahlen einschließen? (j/n): ").lower() == "j"
sonderzeichen = input("Sonderzeichen einschließen? (j/n): ").lower() == "j"
# Passwort generieren
passwort = passwort_generieren(länge, großbuchstaben, zahlen, sonderzeichen)
# Passwort anzeigen
print(f"\nGeneriertes Passwort: {passwort}")
# Sicherheitsbewertung
bewertung, emoji = passwort_bewerten(passwort)
print(f"Sicherheit: {bewertung} {emoji}")
# Option zum erneuten Generieren
erneut = input("\nMöchtest du ein neues Passwort generieren? (j/n): ").lower()
if erneut != "j":
print("Auf Wiedersehen!")
break
# Hauptprogramm
if __name__ == "__main__":
passwort_generator_app()🧪 Testlauf
=== Passwort-Generator ===
Gib die Passwortlänge ein (mindestens 8): 12
Großbuchstaben einschließen? (j/n): j
Zahlen einschließen? (j/n): j
Sonderzeichen einschließen? (j/n): j
Generiertes Passwort: A3b$K9mP@2!
Sicherheit: Stark 🟢
Möchtest du ein neues Passwort generieren? (j/n): n
Auf Wiedersehen!📝 Zusammenfassung
In diesem Kapitel hast du gelernt:
- ✅ Einen vollständigen Taschenrechner zu programmieren
- ✅ Ein Studentenverwaltungssystem mit JSON-Speicherung zu erstellen
- ✅ Eine Textdatei zu analysieren (Zeichen, Wörter, Zeilen)
- ✅ Einen sicheren Passwort-Generator zu bauen
- ✅ Fehlerbehandlung in Praxisprojekten anzuwenden
🎯 Übung
- Erweitere den Taschenrechner: Füge weitere Funktionen hinzu (z.B. Wurzel, Logarithmus)
- Erweitere die Studentenverwaltung: Füge Funktionen zum Ändern von Studentendaten hinzu
- Erweitere die Textanalyse: Füge Funktionen zur Suche nach bestimmten Wörtern hinzu
- Erweitere den Passwort-Generator: Füge eine Option zum Speichern von Passwörtern in einer Datei hinzu
⏭️ Nächstes Kapitel
In Kapitel 17 werden wir fortgeschrittene Praxisprojekte durchführen - Web-Crawler, GUI-Entwicklung, Datenbankoperationen!
