Ripasso - Sistema di registri degli studenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 32 di 64.
Sfida
MedioIn questa sfida implementerai un sistema completo di gestione dei registri degli studenti.
Devi modificare due file per completare questa sfida:
student.py- Implementa la classeStudentcon un corretto incapsulamentostudentregistry.py- Implementa la classeStudentRegistryper gestire gli studenti
Segui i commenti TODO dettagliati in ciascun file per ricevere indicazioni passo dopo passo. La tua implementazione verrà verificata con casi di test completi che controllano:
- La corretta convalida degli attributi e la gestione degli errori
- Il calcolo corretto delle medie dei voti
- Le funzionalità del registro in vari scenari con gli studenti
- Le condizioni limite e i casi particolari
Provalo tu
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Gestore dei casi di test per verifiche approfondite
test_case = input()
if test_case == "default_test":
# Crea gli studenti
student1 = Student(1001, "Alice Smith")
student2 = Student(1002, "Bob Johnson")
student3 = Student(1003, "Charlie Brown")
# Aggiungi i voti
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)
# Mostra le schede degli studenti
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# Verifica la validità del nome
try:
student1.name = "J" # Troppo corto
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Crea il registro e aggiungi gli studenti
registry = StudentRegistry()
registry.add_student(student1)
registry.add_student(student2)
registry.add_student(student3)
# Mostra tutti gli studenti
print("All Students in Registry:")
registry.display_all()
print()
# Ottieni lo studente con la media più alta
top_student = registry.get_top_student()
print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")
# Rimuovi uno studente
registry.remove_student(1002) # Rimuovi Bob
print("\
After removing student 1002:")
registry.display_all()
elif test_case == "empty_registry":
# Verifica un registro vuoto
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() # Non dovrebbe visualizzare nulla
elif test_case == "validation_tests":
# Verifica tutte le regole di validazione
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Verifica un nome vuoto
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Verifica un nome di un solo carattere
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Verifica un valore non booleano per enrolled
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Verifica le modifiche valide
student.name = "New Valid Name"
student.enrolled = False
print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")
elif test_case == "grade_calculation":
# Verifica il calcolo della media dei voti
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Aggiungi un voto
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Aggiungi altri voti
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":
# Verifica tutte le operazioni del registro
registry = StudentRegistry()
# Crea gli studenti
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Aggiungi studenti
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Recupera uno studente
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Recupera uno studente inesistente
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Rimuovi uno studente
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Rimuovi uno studente inesistente (non dovrebbe generare un errore)
registry.remove_student(999)
print("\
After attempting to remove non-existent student 999:")
registry.display_all()
elif test_case == "large_registry":
# Verifica le prestazioni con molti studenti
start_time = time.time()
registry = StudentRegistry()
# Crea 100 studenti con voti casuali
for i in range(1, 101):
student = Student(1000 + i, f"Student {i}")
# Aggiungi 5 voti casuali
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")
# Trova lo studente migliore
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}")
# Trova manualmente i 5 studenti migliori
print("\
Top 5 students:")
students_list = []
for i in range(1, 101):
student = registry.get_student(1000 + i)
students_list.append(student)
# Ordina per media dei voti in ordine decrescente
students_list.sort(key=lambda s: s.grade_average, reverse=True)
# Mostra i 5 studenti migliori
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online