مراجعة - نظام سجلات الطلاب
جزء من قسم Object Oriented Programming في رحلة Python على Coddy. الدرس 32 من 64.
التحدي
متوسطفي هذا التحدي، ستقوم بتنفيذ نظام كامل لإدارة سجلات الطلاب.
تحتاج إلى تعديل ملفين لإكمال هذا التحدي:
student.py- قم بتنفيذ فئةStudentمع التغليف (encapsulation) المناسب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}")
# اختبار قيمة تسجيل غير منطقية (ليست 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
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال3خصائص الـ Class
متغيرات الـ Instance مقابل متغيرات الـ ClassProperty Decoratorsالسمات الخاصةمراجعة - مدير الحساب البنكي6التغليف (Encapsulation)
الأعضاء العامة والمحمية والخاصةمحددات الوصولإخفاء المعلوماتProperty Decorators متقدمةمراجعة - نظام سجلات الطلابتدرّب بنفسك: مترجم Python عبر الإنترنت