الدرس 27 من دورة Python للمبتدئين

قائمة أوامر البرنامج: اجعل المستخدم يختار ماذا يريد

في الدرس السابق رتبنا مشروع المشتريات في ملف منظم. الآن سنضيف قائمة أوامر تجعل المستخدم يختار بين إضافة منتج، عرض التقرير، أو الخروج من البرنامج.

المستوى: مبتدئ جدًا النتيجة: برنامج تفاعلي بقائمة أوامر مدة التطبيق: 40 - 45 دقيقة
طريقة CIT للتعلم الهادئ: لا تنظر للقائمة كطباعة نص فقط. القائمة هي طريقة تجعل البرنامج ينتظر قرار المستخدم ويتصرف بناءً عليه.
مهم قبل البداية: سنستخدم while True مرة أخرى، لكن هذه المرة لتكرار عرض القائمة حتى يختار المستخدم الخروج.

ما النتيجة التي يجب أن تخرج بها؟

في نهاية الدرس سيعرض البرنامج قائمة مثل:

----- قائمة البرنامج -----
1. إضافة منتج
2. عرض التقرير
3. خروج

ثم يقرأ اختيار المستخدم:

choice = input("اختر رقم الأمر: ").strip()
1 إضافة منتج جديد.
2 عرض التقرير الحالي.
3 الخروج من البرنامج.
خريطة درس قائمة أوامر البرنامج في Python
مفهوم قائمة أوامر البرنامج في Python
1

لماذا نحتاج قائمة أوامر؟

في النسخ السابقة كان البرنامج يتبع مسارًا واحدًا: أدخل منتجات، ثم اكتب done، ثم يظهر التقرير.

لكن في البرامج الحقيقية، المستخدم غالبًا يحتاج أن يختار:

أضيف منتجًا الآن؟
أعرض التقرير؟
أخرج من البرنامج؟
الفكرة ببساطة: قائمة الأوامر تجعل البرنامج تفاعليًا، وليس مجرد خطوات ثابتة من البداية إلى النهاية.
تحقق قبل الانتقال ✅ هل فهمت أن القائمة تعطي المستخدم حرية اختيار الأمر التالي؟
2

أنشئ ملف الدرس السابع والعشرين

افتح مجلد الدورة داخل VS Code:

python_course

ثم أنشئ ملفًا جديدًا باسم:

lesson_27.py

افتح الملف داخل Editor.

توقف لحظة ✅ هل ظهر ملف lesson_27.py داخل Explorer؟ إذا نعم، انتقل للخطوة التالية.
3

اكتب دالة عرض القائمة

سنجعل عرض القائمة داخل دالة مستقلة:

def print_menu():
    print()
    print("----- قائمة البرنامج -----")
    print("1. إضافة منتج")
    print("2. عرض التقرير")
    print("3. خروج")

هذه الدالة لا تحسب ولا تحفظ بيانات. وظيفتها فقط عرض القائمة.

قاعدة مهمة: عندما تكون المهمة واضحة ومتكررة، غالبًا يناسبها أن تكون داخل دالة.
سؤال سريع 🧠 هل print_menu تضيف منتجًا؟ لا، فقط تعرض القائمة.
4

افهم اختيارات المستخدم

بعد عرض القائمة، نقرأ اختيار المستخدم:

menu_prompt = "اختر رقم الأمر: "
choice = input(menu_prompt).strip()

ثم نفحص الاختيار:

if choice == "1":
    print("إضافة منتج")
elif choice == "2":
    print("عرض التقرير")
elif choice == "3":
    print("خروج")
else:
    print("اختيار غير صحيح")
تدفق اختيارات قائمة البرنامج في Python
تحقق قبل الانتقال ✅ هل فهمت أن البرنامج سيختار مسارًا مختلفًا حسب قيمة choice؟
5

اكتب دالة إضافة المنتج

حتى لا تصبح main طويلة، سنضع إدخال المنتج داخل دالة:

أولًا: عرّف الدالة وجهز رسائل الإدخال:

def add_product(products):
    name_prompt = "اسم المنتج: "
    price_prompt = "سعر المنتج: "

ثانيًا: اقرأ اسم المنتج والسعر كنص:

    product_name = input(name_prompt).strip()
    price_text = input(price_prompt).strip()

ثالثًا: حاول تحويل السعر إلى رقم:

    try:
        price = float(price_text)
    except ValueError:
        print("السعر غير صحيح، اكتب رقمًا فقط")
        return 0

رابعًا: امنع السعر السالب:

    if price < 0:
        print("السعر لا يمكن أن يكون سالبًا")
        return 0

خامسًا: أنشئ المنتج وأضفه إلى القائمة ثم أرجع السعر:

    product = create_product(
        product_name,
        price
    )

    products.append(product)

    print("تمت إضافة المنتج بنجاح")
    return price

لاحظ أن الدالة ترجع price إذا تمت الإضافة، وترجع 0 إذا فشل الإدخال.

لماذا ترجع price؟ لأن main ستضيف السعر إلى total بعد نجاح الإضافة.
تحقق قبل الانتقال ✅ هل فهمت أن add_product تضيف المنتج وترجع سعره؟
6

حدّث دالة التقرير إذا لم توجد منتجات

إذا اختار المستخدم عرض التقرير قبل إضافة أي منتج، نعرض رسالة واضحة:

def print_report(products, total, tax, final_total):
    if len(products) == 0:
        print("لا توجد منتجات حتى الآن")
        return

ثم نكمل بقية التقرير بعد هذا الفحص.

فائدة return هنا: إذا لم توجد منتجات، نطبع الرسالة ونخرج من الدالة فورًا بدون طباعة تقرير فارغ.
سؤال سريع 🧠 لماذا نستخدم return بعد رسالة لا توجد منتجات؟ حتى لا تكمل الدالة طباعة التقرير.
7

رتّب الكود النهائي على أجزاء

الجزء الأول: الإعدادات ودوال الحساب:

TAX_RATE = 0.15

def calculate_tax(total):
    return total * TAX_RATE

def calculate_final_total(total, tax):
    return total + tax

الجزء الثاني: دالة إنشاء المنتج:

def create_product(product_name, price):
    product = {
        "name": product_name,
        "price": price
    }

    return product

الجزء الثالث: دالة عرض القائمة:

def print_menu():
    print()
    print("----- قائمة البرنامج -----")
    print("1. إضافة منتج")
    print("2. عرض التقرير")
    print("3. خروج")

الجزء الرابع: دالة إضافة منتج:

أولًا: عرّف الدالة وجهز رسائل الإدخال:

def add_product(products):
    name_prompt = "اسم المنتج: "
    price_prompt = "سعر المنتج: "

ثانيًا: اقرأ اسم المنتج والسعر كنص:

    product_name = input(name_prompt).strip()
    price_text = input(price_prompt).strip()

ثالثًا: حاول تحويل السعر إلى رقم:

    try:
        price = float(price_text)
    except ValueError:
        print("السعر غير صحيح، اكتب رقمًا فقط")
        return 0

رابعًا: امنع السعر السالب:

    if price < 0:
        print("السعر لا يمكن أن يكون سالبًا")
        return 0

خامسًا: أنشئ المنتج وأضفه إلى القائمة ثم أرجع السعر:

    product = create_product(
        product_name,
        price
    )

    products.append(product)

    print("تمت إضافة المنتج بنجاح")
    return price

الجزء الخامس: دالة التقرير:

def print_report(products, total, tax, final_total):
    if len(products) == 0:
        print("لا توجد منتجات حتى الآن")
        return

    print("----- تقرير المنتجات -----")

    for product in products:
        name = product["name"]
        price = product["price"]

        print(f"{name}: {price:.2f} ريال")

    print(f"عدد المنتجات: {len(products)}")
    print(f"الإجمالي قبل الضريبة: {total:.2f} ريال")
    print(f"الضريبة: {tax:.2f} ريال")
    print(f"الإجمالي النهائي: {final_total:.2f} ريال")

الجزء السادس: بداية main:

def main():
    products = []
    total = 0
    menu_prompt = "اختر رقم الأمر: "

الجزء السابع: حلقة القائمة داخل main:

    while True:
        print_menu()
        choice = input(menu_prompt).strip()

        if choice == "1":
            added_price = add_product(products)
            total = total + added_price

الجزء الثامن: اختيار عرض التقرير:

        elif choice == "2":
            tax = calculate_tax(total)
            final_total = calculate_final_total(
                total,
                tax
            )

            print_report(
                products,
                total,
                tax,
                final_total
            )

الجزء التاسع: الخروج أو الاختيار الخاطئ:

        elif choice == "3":
            print("تم إنهاء البرنامج")
            break
        else:
            print("اختيار غير صحيح، حاول مرة أخرى")

الجزء العاشر والأخير: تشغيل البرنامج:

main()
النسخة التفاعلية من برنامج المشتريات
مهم جدًا: الأجزاء السابقة تُكتب في نفس ملف lesson_27.py بالترتيب. وانتبه للمسافات داخل main وداخل while.
تحقق قبل الانتقال ✅ هل فهمت أن while هنا تكرر القائمة، وليس إدخال المنتجات مباشرة؟
8

شغّل البرنامج

احفظ الملف:

Ctrl + S

ثم شغله:

python lesson_27.py

وإذا لم يعمل أمر python:

py lesson_27.py
تحقق قبل الانتقال ✅ هل ظهرت قائمة البرنامج وفيها 3 أوامر؟
9

اختبر البرنامج

جرّب هذا السيناريو:

أولًا: جرّب عرض التقرير قبل إضافة منتجات:

اختر رقم الأمر: 2
لا توجد منتجات حتى الآن

ثانيًا: أضف منتجًا صحيحًا:

اختر رقم الأمر: 1
اسم المنتج: Keyboard
سعر المنتج: 100
تمت إضافة المنتج بنجاح

ثالثًا: جرّب إدخال سعر خاطئ:

اختر رقم الأمر: 1
اسم المنتج: Mouse
سعر المنتج: abc
السعر غير صحيح، اكتب رقمًا فقط

رابعًا: أضف المنتج بسعر صحيح:

اختر رقم الأمر: 1
اسم المنتج: Mouse
سعر المنتج: 50
تمت إضافة المنتج بنجاح

خامسًا: اعرض التقرير ثم اخرج من البرنامج:

اختر رقم الأمر: 2
----- تقرير المنتجات -----
Keyboard: 100.00 ريال
Mouse: 50.00 ريال
عدد المنتجات: 2
الإجمالي قبل الضريبة: 150.00 ريال
الضريبة: 22.50 ريال
الإجمالي النهائي: 172.50 ريال

اختر رقم الأمر: 3
تم إنهاء البرنامج
ماذا تعلمت؟ المستخدم يستطيع الآن التحكم في البرنامج: يضيف، يعرض، ثم يخرج.
توقف لحظة ✅ هل اختبرت عرض التقرير قبل إضافة المنتجات؟ هذه حالة مهمة جدًا.
10

تحدي صغير: أضف أمرًا رابعًا

أضف في القائمة:

print("4. عدد المنتجات")

ثم داخل main أضف:

        elif choice == "4":
            print(f"عدد المنتجات الحالي: {len(products)}")
هدف التحدي: تتدرب على توسيع قائمة الأوامر بدون كسر البرنامج.
تحدي التفكير 🧠 لماذا أصبحت إضافة أمر جديد أسهل الآن؟ لأن كل اختيار له مكان واضح داخل if و elif.

اختبار نهاية الدرس

قبل الانتقال للدرس القادم، تأكد أنك فهمت هذه النقاط:

✅ فهمت لماذا نحتاج قائمة أوامر.
✅ كتبت دالة print_menu.
✅ قرأت اختيار المستخدم باستخدام input.
✅ استخدمت if و elif للتعامل مع الاختيارات.
✅ كتبت دالة add_product.
✅ عرضت رسالة عند عدم وجود منتجات.
✅ استخدمت break للخروج من البرنامج.
✅ أصبحت نسخة البرنامج أكثر تفاعلية.
إذا فهمت هذه النقاط: فأنت الآن لا تبني برنامجًا يعمل فقط، بل برنامجًا يعطي المستخدم اختيارات واضحة.

خلاصة الدرس

تعلمنا كيف نضيف قائمة أوامر للبرنامج. أصبح المستخدم يستطيع اختيار إضافة منتج، عرض التقرير، أو الخروج. استخدمنا while لتكرار القائمة، و if / elif لتحديد المسار المناسب.

تذكر القاعدة:

اعرض القائمة
اقرأ اختيار المستخدم
نفذ الأمر المناسب
كرر القائمة حتى يختار الخروج

في الدرس القادم سنحسن تجربة المستخدم أكثر بإضافة حذف منتج من القائمة قبل طباعة التقرير النهائي.

الدرس السابق الدرس التالي: حذف منتج قريبًا فهرس الدورة