요약 - 학생 기록 시스템
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 32번째.
챌린지
중급이 챌린지에서는 완전한 학생 기록 관리 시스템을 구현하게 됩니다.
이 챌린지를 완료하려면 두 개의 파일을 수정해야 합니다:
student.py- 적절한 캡슐화를 갖춘Student클래스 구현studentregistry.py- 학생들을 관리하는StudentRegistry클래스 구현
단계별 안내를 위해 각 파일에 있는 상세한 TODO 주석을 따르세요. 여러분의 구현은 다음 사항을 확인하는 포괄적인 테스트 케이스를 통해 검증됩니다:
- 적절한 속성 유효성 검사 및 오류 처리
- 정확한 성적 평균 계산
- 다양한 학생 시나리오에 따른 레지스트리 기능
- 경계 조건 및 예외 케이스
치트 시트
이 챌린지는 적절한 캡슐화와 유효성 검사를 갖춘 객체 지향 프로그래밍 원칙을 사용하여 완전한 학생 기록 관리 시스템을 구현하는 데 중점을 둡니다.
시스템은 두 개의 주요 구성 요소로 이루어져 있습니다:
- Student class - 적절한 캡슐화를 통해 개별 학생 데이터를 관리합니다
- StudentRegistry class - 학생 컬렉션을 관리합니다
주요 구현 요구 사항은 다음과 같습니다:
- 적절한 속성 유효성 검사 및 오류 처리
- 성적 평균의 정확한 계산
- 여러 학생을 관리하기 위한 레지스트리 기능
- 경계 조건 및 예외 상황(edge cases) 처리
직접 해보기
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}")