Ôn tập: Hệ thống hồ sơ học sinh
Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 32 trên 64.
Thử thách
Trung bìnhTrong thử thách này, bạn sẽ triển khai một hệ thống quản lý hồ sơ học sinh hoàn chỉnh.
Bạn cần chỉnh sửa hai tệp để hoàn thành thử thách này:
student.py- Triển khai lớpStudentvới tính đóng gói phù hợpstudentregistry.py- Triển khai lớpStudentRegistryđể quản lý học sinh
Làm theo các chú thích TODO chi tiết trong từng tệp để được hướng dẫn từng bước. Phần triển khai của bạn sẽ được kiểm tra bằng nhiều test case toàn diện nhằm xác minh:
- Việc kiểm tra thuộc tính và xử lý lỗi phù hợp
- Cách tính điểm trung bình chính xác
- Chức năng của danh sách quản lý trong nhiều tình huống học sinh khác nhau
- Các điều kiện biên và trường hợp ngoại lệ
Tự làm thử
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Xử lý test case để kiểm tra toàn diện
test_case = input()
if test_case == "default_test":
# Tạo các sinh viên
student1 = Student(1001, "Alice Smith")
student2 = Student(1002, "Bob Johnson")
student3 = Student(1003, "Charlie Brown")
# Thêm điểm
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)
# Hiển thị hồ sơ sinh viên
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# Kiểm tra tính hợp lệ của tên
try:
student1.name = "J" # Quá ngắn
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Tạo danh sách quản lý và thêm sinh viên
registry = StudentRegistry()
registry.add_student(student1)
registry.add_student(student2)
registry.add_student(student3)
# Hiển thị tất cả sinh viên
print("All Students in Registry:")
registry.display_all()
print()
# Lấy sinh viên có điểm cao nhất
top_student = registry.get_top_student()
print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")
# Xóa một sinh viên
registry.remove_student(1002) # Xóa Bob
print("\
After removing student 1002:")
registry.display_all()
elif test_case == "empty_registry":
# Kiểm tra danh sách quản lý trống
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() # Không nên hiển thị gì
elif test_case == "validation_tests":
# Kiểm tra tất cả quy tắc xác thực
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Kiểm tra tên trống
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Kiểm tra tên chỉ có một ký tự
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Kiểm tra giá trị enrolled không phải kiểu boolean
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Kiểm tra các thay đổi hợp lệ
student.name = "New Valid Name"
student.enrolled = False
print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")
elif test_case == "grade_calculation":
# Kiểm tra cách tính điểm trung bình
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Thêm một điểm
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Thêm nhiều điểm
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":
# Kiểm tra tất cả thao tác với danh sách học sinh
registry = StudentRegistry()
# Tạo các sinh viên
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Thêm học sinh
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Lấy thông tin học sinh
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Tìm học sinh không tồn tại
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Xóa học sinh
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Xóa học sinh không tồn tại (không gây ra lỗi)
registry.remove_student(999)
print("\
After attempting to remove non-existent student 999:")
registry.display_all()
elif test_case == "large_registry":
# Kiểm tra hiệu năng khi có nhiều học sinh
start_time = time.time()
registry = StudentRegistry()
# Tạo 100 học sinh với điểm ngẫu nhiên
for i in range(1, 101):
student = Student(1000 + i, f"Student {i}")
# Thêm 5 điểm ngẫu nhiên
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")
# Tìm học sinh có điểm trung bình cao nhất
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}")
# Tự tìm 5 học sinh có điểm trung bình cao nhất
print("\
Top 5 students:")
students_list = []
for i in range(1, 101):
student = registry.get_student(1000 + i)
students_list.append(student)
# Sắp xếp theo điểm trung bình giảm dần
students_list.sort(key=lambda s: s.grade_average, reverse=True)
# Hiển thị 5 học sinh có điểm trung bình cao nhất
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnh3Thuộc tính của lớp
Biến của instance và biến của lớpDecorator thuộc tínhThuộc tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng6Đóng gói
Thành viên public, protected, privateBộ điều chỉnh quyền truy cậpẨn thông tinDecorator thuộc tính nâng caoÔn tập: Hệ thống hồ sơ học sinhTự luyện tập: Trình biên dịch Python online