Skip to content

الفصل 4: الدوال

📖 المستوى: مبتدئ  |  ⏱ الوقت المقدّر: 55 دقيقة  |  📝 تمارين: 8

ما ستتعلم في هذا الفصل

  • تعريف واستدعاء الدوال
  • المعاملات والقيم المرجعة
  • القيم الافتراضية للمعاملات
  • الدوال المتداخلة والإغلاقات (Closures)
  • التعاود (Recursion)
  • دوال لامدا (المجهولة)

4.1 تعريف الدوال

sad
# دالة بسيطة بدون معاملات
دالة رحّب()
    اطبع_سطر("مرحباً بالعالم! 🌍")
نهاية

رحّب()  # استدعاء

# دالة بمعاملات
دالة رحّب_شخص(اسم)
    اطبع_سطر("مرحباً يا " + اسم + "!")
نهاية

رحّب_شخص("أحمد")
رحّب_شخص("سارة")

4.2 إرجاع القيم

sad
دالة مربع(ن)
    ارجع ن * ن
نهاية

دالة جمع(أ، ب)
    ارجع أ + ب
نهاية

متغير نتيجة = مربع(5)
اطبع_سطر("مربع 5 = " + نتيجة)    # 25

اطبع_سطر("3 + 7 = " + جمع(3، 7))  # 10

إرجاع قيم متعددة (عبر مصفوفة)

sad
دالة قسمة_مع_باقي(أ، ب)
    متغير ناتج = (أ - أ % ب) / ب
    متغير باقي = أ % ب
    ارجع [ناتج، باقي]
نهاية

متغير نتيجة = قسمة_مع_باقي(17، 5)
اطبع_سطر("الناتج: " + نتيجة[0])   # 3
اطبع_سطر("الباقي: " + نتيجة[1])   # 2

4.3 القيم الافتراضية

sad
دالة تحية(اسم، لغة = "عربي")
    إذا (لغة == "عربي")
        اطبع_سطر("مرحباً يا " + اسم)
    وإلا
        اطبع_سطر("Hello " + اسم)
    نهاية
نهاية

تحية("أحمد")               # مرحباً يا أحمد
تحية("John"، "إنجليزي")    # Hello John

4.4 التعاود (Recursion)

دالة تستدعي نفسها:

sad
# حساب المضروب (Factorial)
دالة مضروب(ن)
    إذا (ن <= 1)
        ارجع 1
    نهاية
    ارجع ن * مضروب(ن - 1)
نهاية

اطبع_سطر("5! = " + مضروب(5))   # 120
اطبع_سطر("10! = " + مضروب(10)) # 3628800

فيبوناتشي

sad
دالة فيبو(ن)
    إذا (ن <= 1)
        ارجع ن
    نهاية
    ارجع فيبو(ن - 1) + فيبو(ن - 2)
نهاية

لكل ي في 0..10
    اطبع(فيبو(ي) + " ")
نهاية
# 0 1 1 2 3 5 8 13 21 34 55

4.5 دوال لامدا (المجهولة)

sad
# دالة مجهولة مخزنة في متغير
متغير مربع = لامدا(ن) ارجع ن * ن نهاية

اطبع_سطر(مربع(6))   # 36

# استخدام لامدا مع دوال أخرى
متغير أرقام = [1، 2، 3، 4، 5]
متغير مربعات = []

لكل رقم في أرقام
    متغير محسوب = لامدا(ن) ارجع ن * ن نهاية
    أرقام.أضف(محسوب(رقم))
نهاية

4.6 الدوال كمعاملات (Higher-Order Functions)

sad
دالة طبّق(دالة_عملية، قيمة)
    ارجع دالة_عملية(قيمة)
نهاية

دالة ضعف(ن)
    ارجع ن * 2
نهاية

دالة تربيع(ن)
    ارجع ن * ن
نهاية

اطبع_سطر(طبّق(ضعف، 5))    # 10
اطبع_سطر(طبّق(تربيع، 5))  # 25

4.7 الإغلاقات (Closures)

دالة داخلية تحتفظ بمتغيرات الدالة الخارجية:

sad
دالة عدّاد_جديد()
    متغير عدد = 0
    دالة زِد()
        عدد = عدد + 1
        ارجع عدد
    نهاية
    ارجع زِد
نهاية

متغير عدّاد = عدّاد_جديد()
اطبع_سطر(عدّاد())  # 1
اطبع_سطر(عدّاد())  # 2
اطبع_سطر(عدّاد())  # 3

4.8 أنماط عملية

نمط التحقق (Validation)

sad
دالة تحقق_عمر(عمر)
    إذا (عمر < 0 أو عمر > 150)
        ارجع خطأ
    نهاية
    ارجع صحيح
نهاية

دالة تحقق_بريد(بريد)
    # فحص بسيط: يحتوي @
    متغير فهرس = 0
    بينما (فهرس < طول(بريد))
        إذا (بريد[فهرس] == "@")
            ارجع صحيح
        نهاية
        فهرس = فهرس + 1
    نهاية
    ارجع خطأ
نهاية

نمط المصنع (Factory)

sad
دالة أنشئ_حاسبة(عملية)
    إذا (عملية == "جمع")
        ارجع لامدا(أ، ب) ارجع أ + ب نهاية
    وإلا
        إذا (عملية == "ضرب")
            ارجع لامدا(أ، ب) ارجع أ * ب نهاية
        نهاية
    نهاية
نهاية

متغير جامع = أنشئ_حاسبة("جمع")
متغير ضارب = أنشئ_حاسبة("ضرب")

اطبع_سطر(جامع(3، 4))   # 7
اطبع_سطر(ضارب(3، 4))   # 12

تمارين

تمرين 1: دالة القوة

اكتب دالة قوة(أساس، أس) تحسب الأساس مرفوعاً للأس بدون استخدام **.

💡 الحل
sad
دالة قوة(أساس، أس)
    متغير نتيجة = 1
    لكل _ في 1..أس
        نتيجة = نتيجة * أساس
    نهاية
    ارجع نتيجة
نهاية

اطبع_سطر(قوة(2، 10))   # 1024
اطبع_سطر(قوة(3، 4))    # 81

تمرين 2: عكس نص

اكتب دالة تعكس نصاً معطى.

💡 الحل
sad
دالة اعكس(نص_أصلي)
    متغير معكوس = ""
    متغير ف = طول(نص_أصلي) - 1
    بينما (ف >= 0)
        معكوس = معكوس + نص_أصلي[ف]
        ف = ف - 1
    نهاية
    ارجع معكوس
نهاية

اطبع_سطر(اعكس("مرحبا"))   # "ابحرم"

ملخص الفصل

المفهومالصياغة
تعريف دالةدالة اسم(معاملات) ... نهاية
إرجاع قيمةارجع قيمة
قيمة افتراضيةدالة ف(أ، ب = 10)
لامدالامدا(أ) ارجع أ * 2 نهاية
تعاوددالة تستدعي نفسها
إغلاقدالة تحتفظ بمتغيرات خارجية

مُرخَّص بموجب رخصة MIT