Zusammenfassung - Studentenverwaltungssystem
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 32 von 64.
Aufgabe
MittelIn 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 KlasseStudentmit ordnungsgemäßer Kapselungstudentregistry.py– Implementieren Sie die KlasseStudentRegistryzur 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
Spickzettel
Diese Herausforderung konzentriert sich auf die Implementierung eines vollständigen Studentenverwaltungssystems unter Verwendung objektorientierter Programmierprinzipien mit ordnungsgemäßer Kapselung und Validierung.
Das System besteht aus zwei Hauptkomponenten:
- Student class - Verwaltet einzelne Studentendaten mit ordnungsgemäßer Kapselung
- StudentRegistry class - Verwaltet Sammlungen von Studenten
Wichtige Implementierungsanforderungen umfassen:
- Ordnungsgemäße Attributvalidierung und Fehlerbehandlung
- Korrekte Berechnung von Notendurchschnitten
- Registry-Funktionalität zur Verwaltung mehrerer Studenten
- Umgang mit Randbedingungen und Grenzfällen
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
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen