Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - نظام سجلات الطلاب

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 32 من 64.

challenge icon

التحدي

متوسط

في هذا التحدي، ستقوم بتنفيذ نظام كامل لإدارة سجلات الطلاب.

تحتاج إلى تعديل ملفين لإكمال هذا التحدي:

  • student.py - قم بتنفيذ فئة Student مع التغليف (encapsulation) المناسب
  • 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}")
    
    # اختبار قيمة تسجيل غير منطقية (ليست Boolean)
    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