Menu
Coddy logo textTech

Récapitulatif - Système de Gestion d'Étudiants

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 32 sur 64.

challenge icon

Défi

Moyen

Dans ce défi, vous allez implémenter un système complet de gestion des dossiers d'étudiants.

Vous devez modifier deux fichiers pour relever ce défi :

  • student.py - Implémentez la classe Student avec une encapsulation appropriée
  • studentregistry.py - Implémentez la classe StudentRegistry pour gérer les étudiants

Suivez les commentaires TODO détaillés dans chaque fichier pour un guidage étape par étape. Votre implémentation sera testée par des cas de test complets qui vérifient :

  • La validation correcte des attributs et la gestion des erreurs
  • Le calcul correct des moyennes de notes
  • La fonctionnalité du registre avec divers scénarios d'étudiants
  • Les conditions limites et les cas particuliers

Aide-mémoire

Ce défi se concentre sur la mise en œuvre d'un système complet de gestion des dossiers d'étudiants en utilisant les principes de la programmation orientée objet avec une encapsulation et une validation appropriées.

Le système se compose de deux éléments principaux :

  • Classe Student - Gère les données individuelles des étudiants avec une encapsulation appropriée
  • Classe StudentRegistry - Gère des collections d'étudiants

Les principales exigences de mise en œuvre comprennent :

  • Validation appropriée des attributs et gestion des erreurs
  • Calcul correct des moyennes de notes
  • Fonctionnalité de registre pour la gestion de plusieurs étudiants
  • Gestion des conditions limites et des cas particuliers

Essayez vous-même

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

# Gestionnaire de cas de test pour des tests complets
test_case = input()

if test_case == "default_test":
    # Créer des étudiants
    student1 = Student(1001, "Alice Smith")
    student2 = Student(1002, "Bob Johnson")
    student3 = Student(1003, "Charlie Brown")

    # Ajouter des notes
    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)

    # Afficher les dossiers des étudiants
    print("Student Records:")
    student1.display_record()
    print()
    student2.display_record()
    print()
    student3.display_record()
    print()

    # Tester la validation du nom
    try:
        student1.name = "J"  # Trop court
    except ValueError as e:
        print(f"Name validation error: {e}")
    print()

    # Créer le registre et ajouter les étudiants
    registry = StudentRegistry()
    registry.add_student(student1)
    registry.add_student(student2)
    registry.add_student(student3)

    # Afficher tous les étudiants
    print("All Students in Registry:")
    registry.display_all()
    print()

    # Obtenir le meilleur étudiant
    top_student = registry.get_top_student()
    print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")

    # Supprimer un étudiant
    registry.remove_student(1002)  # Supprimer Bob
    print("\
After removing student 1002:")
    registry.display_all()

elif test_case == "empty_registry":
    # Tester un registre vide
    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()  # Ne devrait rien afficher

elif test_case == "validation_tests":
    # Tester toutes les règles de validation
    student = Student(1001, "Valid Name")
    print(f"Created student with name: {student.name}")
    
    # Tester un nom vide
    try:
        student.name = ""
    except ValueError as e:
        print(f"Empty name test: {e}")
    
    # Tester un nom à un seul caractère
    try:
        student.name = "A"
    except ValueError as e:
        print(f"Single character name test: {e}")
    
    # Tester une valeur d'inscription non-booléenne
    try:
        student.enrolled = "yes"
    except ValueError as e:
        print(f"Non-boolean enrolled test: {e}")
    
    # Tester les modifications valides
    student.name = "New Valid Name"
    student.enrolled = False
    print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")

elif test_case == "grade_calculation":
    # Tester le calcul de la moyenne des notes
    student = Student(1001, "Test Student")
    print(f"Student with no grades - Average: {student.grade_average}")
    
    # Ajouter une note
    student.add_grade("Math", 85)
    print(f"Student with one grade - Average: {student.grade_average}")
    
    # Ajouter d'autres notes
    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":
    # Tester toutes les opérations du registre
    registry = StudentRegistry()
    
    # Créer des étudiants
    student1 = Student(101, "Student One")
    student2 = Student(102, "Student Two")
    
    # Ajouter des étudiants
    registry.add_student(student1)
    registry.add_student(student2)
    print("After adding students:")
    registry.display_all()
    
    # Récupérer un étudiant
    retrieved_student = registry.get_student(101)
    print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
    
    # Récupérer un étudiant inexistant
    non_existent = registry.get_student(999)
    print(f"Retrieved student 999: {non_existent}")
    
    # Supprimer un étudiant
    registry.remove_student(101)
    print("\
After removing student 101:")
    registry.display_all()
    
    # Supprimer un étudiant inexistant (ne devrait pas lever d'erreur)
    registry.remove_student(999)
    print("\
After attempting to remove non-existent student 999:")
    registry.display_all()

elif test_case == "large_registry":
    # Tester la performance avec de nombreux étudiants
    start_time = time.time()
    registry = StudentRegistry()
    
    # Créer 100 étudiants avec des notes aléatoires
    for i in range(1, 101):
        student = Student(1000 + i, f"Student {i}")
        # Ajouter 5 notes aléatoires
        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")
    
    # Trouver le meilleur étudiant
    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}")
    
    # Trouver manuellement les 5 meilleurs étudiants
    print("\
Top 5 students:")
    students_list = []
    for i in range(1, 101):
        student = registry.get_student(1000 + i)
        students_list.append(student)
    
    # Trier par moyenne de notes par ordre décroissant
    students_list.sort(key=lambda s: s.grade_average, reverse=True)
    
    # Afficher les 5 premiers
    for i in range(5):
        student = students_list[i]
        print(f"{i+1}. {student.name}: {student.grade_average:.2f}")

Toutes les leçons de Object Oriented Programming