Menu
Coddy logo textTech

Zusammenfassung - Studentenverwaltungssystem

Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy. Lektion 32 von 64.

challenge icon

Aufgabe

Mittel

In dieser Herausforderung implementieren Sie ein vollständiges System zur Verwaltung von Schülerdatensätzen.

Sie müssen zwei Dateien bearbeiten, um diese Herausforderung abzuschließen:

  • student.py – Implementieren Sie die Klasse Student mit ordnungsgemäßer Kapselung
  • studentregistry.py – Implementieren Sie die Klasse StudentRegistry zur Verwaltung von Schülern

Folgen Sie den detaillierten TODO-Kommentaren in jeder Datei für eine schrittweise Anleitung. Ihre Implementierung wird mit umfassenden Testfällen geprüft, die Folgendes verifizieren:

  • Ordnungsgemäße Attributvalidierung und Fehlerbehandlung
  • Korrekte Berechnung von Notendurchschnitten
  • Registry-Funktionalität mit verschiedenen Schülerszenarien
  • Grenzbedingungen und Sonderfälle

Probier es selbst

from student import Student
from studentregistry import StudentRegistry
import time
import random

# Testfall-Handler für umfassende Tests
test_case = input()

if test_case == "default_test":
    # Studenten erstellen
    student1 = Student(1001, "Alice Smith")
    student2 = Student(1002, "Bob Johnson")
    student3 = Student(1003, "Charlie Brown")

    # Noten hinzufügen
    student1.add_grade("Math", 90)
    student1.add_grade("Science", 85)
    student1.add_grade("English", 92)

    student2.add_grade("Math", 78)
    student2.add_grade("Science", 80)
    student2.add_grade("English", 85)

    student3.add_grade("Math", 95)
    student3.add_grade("Science", 91)
    student3.add_grade("English", 89)

    # Datensätze der Studenten anzeigen
    print("Student Records:")
    student1.display_record()
    print()
    student2.display_record()
    print()
    student3.display_record()
    print()

    # Namensvalidierung testen
    try:
        student1.name = "J"  # Zu kurz
    except ValueError as e:
        print(f"Name validation error: {e}")
    print()

    # Register erstellen und Studenten hinzufügen
    registry = StudentRegistry()
    registry.add_student(student1)
    registry.add_student(student2)
    registry.add_student(student3)

    # Alle Studenten anzeigen
    print("All Students in Registry:")
    registry.display_all()
    print()

    # Besten Studenten ermitteln
    top_student = registry.get_top_student()
    print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")

    # Einen Studenten entfernen
    registry.remove_student(1002)  # Bob entfernen
    print("\
After removing student 1002:")
    registry.display_all()

elif test_case == "empty_registry":
    # Ein leeres Register testen
    registry = StudentRegistry()
    top_student = registry.get_top_student()
    if top_student is None:
        print("Top student in empty registry: None")
    print("Displaying all students in empty registry:")
    registry.display_all()  # Sollte nichts anzeigen

elif test_case == "validation_tests":
    # Alle Validierungsregeln testen
    student = Student(1001, "Valid Name")
    print(f"Created student with name: {student.name}")
    
    # Leeren Namen testen
    try:
        student.name = ""
    except ValueError as e:
        print(f"Empty name test: {e}")
    
    # Namen mit nur einem Zeichen testen
    try:
        student.name = "A"
    except ValueError as e:
        print(f"Single character name test: {e}")
    
    # Nicht-booleschen Wert für 'enrolled' testen
    try:
        student.enrolled = "yes"
    except ValueError as e:
        print(f"Non-boolean enrolled test: {e}")
    
    # Gültige Änderungen testen
    student.name = "New Valid Name"
    student.enrolled = False
    print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")

elif test_case == "grade_calculation":
    # Berechnung des Notendurchschnitts testen
    student = Student(1001, "Test Student")
    print(f"Student with no grades - Average: {student.grade_average}")
    
    # Eine Note hinzufügen
    student.add_grade("Math", 85)
    print(f"Student with one grade - Average: {student.grade_average}")
    
    # Weitere Noten hinzufügen
    student.add_grade("Science", 90)
    student.add_grade("English", 95)
    print(f"Student with multiple grades - Average: {student.grade_average}")

elif test_case == "registry_operations":
    # Alle Register-Operationen testen
    registry = StudentRegistry()
    
    # Studenten erstellen
    student1 = Student(101, "Student One")
    student2 = Student(102, "Student Two")
    
    # Studenten hinzufügen
    registry.add_student(student1)
    registry.add_student(student2)
    print("After adding students:")
    registry.display_all()
    
    # Student abrufen
    retrieved_student = registry.get_student(101)
    print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
    
    # Nicht existierenden Studenten abrufen
    non_existent = registry.get_student(999)
    print(f"Retrieved student 999: {non_existent}")
    
    # Student entfernen
    registry.remove_student(101)
    print("\
After removing student 101:")
    registry.display_all()
    
    # Nicht existierenden Studenten entfernen (sollte keinen Fehler auslösen)
    registry.remove_student(999)
    print("\
After attempting to remove non-existent student 999:")
    registry.display_all()

elif test_case == "large_registry":
    # Performance mit vielen Studenten testen
    start_time = time.time()
    registry = StudentRegistry()
    
    # 100 Studenten mit zufälligen Noten erstellen
    for i in range(1, 101):
        student = Student(1000 + i, f"Student {i}")
        # 5 zufällige Noten hinzufügen
        for j in range(5):
            student.add_grade(f"Course {j+1}", random.randint(60, 100))
        registry.add_student(student)
    
    creation_time = time.time() - start_time
    print(f"Time to create 100 students: {creation_time:.4f} seconds")
    
    # Besten Studenten finden
    start_time = time.time()
    top_student = registry.get_top_student()
    top_time = time.time() - start_time
    print(f"Time to find top student: {top_time:.4f} seconds")
    print(f"Top student: {top_student.name} with average {top_student.grade_average:.2f}")
    
    # Die besten 5 Studenten manuell finden
    print("\
Top 5 students:")
    students_list = []
    for i in range(1, 101):
        student = registry.get_student(1000 + i)
        students_list.append(student)
    
    # Nach Notendurchschnitt in absteigender Reihenfolge sortieren
    students_list.sort(key=lambda s: s.grade_average, reverse=True)
    
    # Die besten 5 anzeigen
    for i in range(5):
        student = students_list[i]
        print(f"{i+1}. {student.name}: {student.grade_average:.2f}")

Alle Lektionen in Object Oriented Programming

Übe selbstständig: Online-Python-Compiler