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.
Défi
MoyenDans 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 classeStudentavec une encapsulation appropriéestudentregistry.py- Implémentez la classeStudentRegistrypour 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
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Membres Publics, Protégés, PrivésModificateurs d'accèsMasquage d'informationsDécorateurs Property AvancésRécapitulatif - Système de Gestion d'Étudiants