Итоги: Система учета студентов
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 32 из 64.
Задание
СреднеВ этом испытании вам предстоит реализовать полноценную систему управления записями студентов.
Для выполнения этого задания вам необходимо отредактировать два файла:
student.py— реализуйте классStudentс использованием правильной инкапсуляцииstudentregistry.py— реализуйте классStudentRegistryдля управления студентами
Следуйте подробным комментариям TODO в каждом файле для пошагового руководства. Ваша реализация будет проверена с помощью комплексных тест-кейсов, которые проверяют:
- Правильную валидацию атрибутов и обработку ошибок
- Корректный расчет среднего балла
- Функциональность реестра в различных сценариях со студентами
- Граничные условия и исключительные ситуации
Шпаргалка
Этот челлендж посвящен реализации полноценной системы управления записями студентов с использованием принципов объектно-ориентированного программирования с надлежащей инкапсуляцией и валидацией.
Система состоит из двух основных компонентов:
- Student class — управляет данными отдельных студентов с надлежащей инкапсуляцией
- StudentRegistry class — управляет коллекциями студентов
Ключевые требования к реализации включают:
- Надлежащая валидация атрибутов и обработка ошибок
- Корректный расчет среднего балла
- Функциональность реестра для управления несколькими студентами
- Обработка граничных условий и крайних случаев
Попробуйте сами
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Обработчик тестовых случаев для комплексного тестирования
test_case = input()
if test_case == "default_test":
# Создание студентов
student1 = Student(1001, "Alice Smith")
student2 = Student(1002, "Bob Johnson")
student3 = Student(1003, "Charlie Brown")
# Добавление оценок
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)
# Отображение записей студентов
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# Тестирование валидации имени
try:
student1.name = "J" # Слишком короткое
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Создание реестра и добавление студентов
registry = StudentRegistry()
registry.add_student(student1)
registry.add_student(student2)
registry.add_student(student3)
# Отображение всех студентов
print("All Students in Registry:")
registry.display_all()
print()
# Получение лучшего студента
top_student = registry.get_top_student()
print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")
# Удаление студента
registry.remove_student(1002) # Удаление Bob
print("\
After removing student 1002:")
registry.display_all()
elif test_case == "empty_registry":
# Тестирование пустого реестра
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() # Ничего не должно отображаться
elif test_case == "validation_tests":
# Тестирование всех правил валидации
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Тестирование пустого имени
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Тестирование имени из одного символа
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Тестирование небулевого значения зачисления
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Тестирование корректных изменений
student.name = "New Valid Name"
student.enrolled = False
print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")
elif test_case == "grade_calculation":
# Тестирование расчета среднего балла
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Добавление одной оценки
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Добавление дополнительных оценок
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":
# Тестирование всех операций реестра
registry = StudentRegistry()
# Создание студентов
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Добавление студентов
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Получение студента
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Получение несуществующего студента
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Удаление студента
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Удаление несуществующего студента (не должно вызывать ошибку)
registry.remove_student(999)
print("\
After attempting to remove non-existent student 999:")
registry.display_all()
elif test_case == "large_registry":
# Тестирование производительности с большим количеством студентов
start_time = time.time()
registry = StudentRegistry()
# Создание 100 студентов со случайными оценками
for i in range(1, 101):
student = Student(1000 + i, f"Student {i}")
# Добавление 5 случайных оценок
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")
# Поиск лучшего студента
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}")
# Поиск 5 лучших студентов вручную
print("\
Top 5 students:")
students_list = []
for i in range(1, 101):
student = registry.get_student(1000 + i)
students_list.append(student)
# Сортировка по среднему баллу в порядке убывания
students_list.sort(key=lambda s: s.grade_average, reverse=True)
# Отображение топ-5
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User