Kodax

مشروع ختامي: دفتر درجات الطلاب — أساسيات Python

مشروع ختامي: دفتر درجات الطلاب

ستبني برنامجاً صغيراً متكاملاً يستخدم كل ما تعلمته في هذه الدورة: المتغيرات، النصوص، الشروط، الحلقات، القوائم، القواميس، الدوال، والتحقق من الإدخال.

وصف البرنامج

قائمة أوامر تتكرر حتى يختار المستخدم الخروج:

1. إضافة طالب ودرجته.

2. عرض كل الطلاب مع تقدير كل منهم.

3. البحث عن طالب.

4. عرض الإحصائيات: المتوسط، الأعلى، الأقل، عدد الناجحين.

5. خروج.

تصميم البيانات

أبسط تمثيل مناسب: قاموس مفتاحه اسم الطالب وقيمته الدرجة.

grades = {"أحمد": 88, "منى": 95}

لماذا قاموس وليس قائمة؟ لأننا نبحث بالاسم كثيراً، والبحث بالمفتاح مباشر.

تقسيم البرنامج إلى دوال

كل مهمة في دالة صغيرة لها هدف واحد:

- read_score(): تطلب درجة وتتحقق أنها رقم بين 0 و 100.

- letter_grade(score): ترجع التقدير.

- show_all(grades)، search(grades)، show_stats(grades).

- main(): الحلقة الرئيسية وقائمة الأوامر.

هذا التقسيم يجعل كل جزء سهل الفهم والاختبار وحده، ويمكنك تعديل طريقة حساب التقدير دون لمس بقية البرنامج.

حالات يجب أن تتعامل معها

- إدخال درجة غير رقمية أو خارج المدى.

- طلب الإحصائيات والدفتر فارغ (القسمة على صفر!).

- البحث عن اسم غير موجود.

- إدخال رقم أمر غير موجود في القائمة.

معايير نجاح المشروع

- البرنامج لا يتوقف بخطأ مهما أدخل المستخدم.

- لا يوجد كود مكرر؛ كل منطق في دالة.

- لا متغيرات global تُعدَّل داخل الدوال (الدفتر يُمرَّر كمعامل).

أفكار للتوسعة

- تعديل درجة أو حذف طالب.

- عدة مواد لكل طالب (قاموس داخل قاموس).

- حفظ الدفتر في ملف وقراءته عند التشغيل (ستتعلم الملفات في الدورة التالية).

بعد هذه الدورة

أنت الآن تعرف أساسيات البرمجة. الدورة التالية "هياكل البيانات في Python" تتعمق في الـ tuples والمجموعات، والنصوص المتقدمة، والملفات، ومعالجة الأخطاء باحتراف.

def read_score():
    """تطلب درجة صحيحة بين 0 و 100 وتكرر الطلب حتى يُدخلها المستخدم."""
    while True:
        text = input("الدرجة (0-100): ").strip()
        if text.isdigit() and 0 <= int(text) <= 100:
            return int(text)
        print("درجة غير صالحة، حاول مرة أخرى")

def letter_grade(score):
    if score >= 90:
        return "ممتاز"
    elif score >= 75:
        return "جيد جداً"
    elif score >= 50:
        return "ناجح"
    return "راسب"

def add_student(grades):
    name = input("اسم الطالب: ").strip()
    if not name:
        print("الاسم فارغ")
        return
    grades[name] = read_score()
    print(f"تمت إضافة {name}")

def show_all(grades):
    if not grades:
        print("الدفتر فارغ")
        return
    for name, score in sorted(grades.items()):
        print(f"{name:<10} {score:>3}  {letter_grade(score)}")

def search(grades):
    name = input("ابحث عن: ").strip()
    if name in grades:
        print(f"{name}: {grades[name]} ({letter_grade(grades[name])})")
    else:
        print("غير موجود")

def show_stats(grades):
    if not grades:
        print("لا توجد بيانات")
        return
    scores = list(grades.values())
    passed = sum(1 for s in scores if s >= 50)
    print(f"المتوسط: {sum(scores) / len(scores):.1f}")
    print(f"الأعلى: {max(scores)}  الأقل: {min(scores)}")
    print(f"الناجحون: {passed} من {len(scores)}")

def main():
    grades = {"أحمد": 88, "منى": 95, "علي": 47}
    actions = {"1": add_student, "2": show_all, "3": search, "4": show_stats}
    while True:
        print("\n1) إضافة  2) عرض  3) بحث  4) إحصائيات  5) خروج")
        choice = input("اختر: ").strip()
        if choice == "5":
            print("إلى اللقاء")
            break
        action = actions.get(choice)
        if action:
            action(grades)
        else:
            print("اختيار غير صالح")

main()
اختبر فهمك