Menu
CoddyTech

Ô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.

challenge icon

Thử thách

Trung bình

Trong 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ớp Student với tính đóng gói phù hợp
  • studentregistry.py - Triển khai lớp StudentRegistry để 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

Tự luyện tập: Trình biên dịch Python online