Menu
Coddy logo textTech

Ripasso - Sistema di registri degli studenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 32 di 64.

challenge icon

Sfida

Medio

In questa sfida implementerai un sistema completo di gestione dei registri degli studenti.

Devi modificare due file per completare questa sfida:

  • student.py - Implementa la classe Student con un corretto incapsulamento
  • studentregistry.py - Implementa la classe StudentRegistry per 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

Esercitati da solo: Compilatore Python online