Итоги: Система учета студентов
Часть раздела Object Oriented Programming путешествия по Python на Coddy. Урок 32 из 64.
Задание
СреднеВ этом испытании вам предстоит реализовать полноценную систему управления записями студентов.
Для выполнения этого задания вам необходимо отредактировать два файла:
student.py— реализуйте классStudentс использованием правильной инкапсуляцииstudentregistry.py— реализуйте классStudentRegistryдля управления студентами
Следуйте подробным комментариям TODO в каждом файле для пошагового руководства. Ваша реализация будет проверена с помощью комплексных тест-кейсов, которые проверяют:
- Правильную валидацию атрибутов и обработку ошибок
- Корректный расчет среднего балла
- Функциональность реестра в различных сценариях со студентами
- Граничные условия и исключительные ситуации
Попробуйте сами
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Система выдачи книгФункционал поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python