Skip to content

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

  1. Erweitere den Taschenrechner: Füge weitere Funktionen hinzu (z.B. Wurzel, Logarithmus)
  2. Erweitere die Studentenverwaltung: Füge Funktionen zum Ändern von Studentendaten hinzu
  3. Erweitere die Textanalyse: Füge Funktionen zur Suche nach bestimmten Wörtern hinzu
  4. 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!

Frei für alle Anfänger