الفصل 4: الدوال
ما ستتعلم في هذا الفصل
- تعريف واستدعاء الدوال
- المعاملات والقيم المرجعة
- القيم الافتراضية للمعاملات
- الدوال المتداخلة والإغلاقات (Closures)
- التعاود (Recursion)
- دوال لامدا (المجهولة)
4.1 تعريف الدوال
sad
# دالة بسيطة بدون معاملات
دالة رحّب()
اطبع_سطر("مرحباً بالعالم! 🌍")
نهاية
رحّب() # استدعاء
# دالة بمعاملات
دالة رحّب_شخص(اسم)
اطبع_سطر("مرحباً يا " + اسم + "!")
نهاية
رحّب_شخص("أحمد")
رحّب_شخص("سارة")4.2 إرجاع القيم
sad
دالة مربع(ن)
ارجع ن * ن
نهاية
دالة جمع(أ، ب)
ارجع أ + ب
نهاية
متغير نتيجة = مربع(5)
اطبع_سطر("مربع 5 = " + نتيجة) # 25
اطبع_سطر("3 + 7 = " + جمع(3، 7)) # 10إرجاع قيم متعددة (عبر مصفوفة)
sad
دالة قسمة_مع_باقي(أ، ب)
متغير ناتج = (أ - أ % ب) / ب
متغير باقي = أ % ب
ارجع [ناتج، باقي]
نهاية
متغير نتيجة = قسمة_مع_باقي(17، 5)
اطبع_سطر("الناتج: " + نتيجة[0]) # 3
اطبع_سطر("الباقي: " + نتيجة[1]) # 24.3 القيم الافتراضية
sad
دالة تحية(اسم، لغة = "عربي")
إذا (لغة == "عربي")
اطبع_سطر("مرحباً يا " + اسم)
وإلا
اطبع_سطر("Hello " + اسم)
نهاية
نهاية
تحية("أحمد") # مرحباً يا أحمد
تحية("John"، "إنجليزي") # Hello John4.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 554.5 دوال لامدا (المجهولة)
sad
# دالة مجهولة مخزنة في متغير
متغير مربع = لامدا(ن) ارجع ن * ن نهاية
اطبع_سطر(مربع(6)) # 36
# استخدام لامدا مع دوال أخرى
متغير أرقام = [1، 2، 3، 4، 5]
متغير مربعات = []
لكل رقم في أرقام
متغير محسوب = لامدا(ن) ارجع ن * ن نهاية
أرقام.أضف(محسوب(رقم))
نهاية4.6 الدوال كمعاملات (Higher-Order Functions)
sad
دالة طبّق(دالة_عملية، قيمة)
ارجع دالة_عملية(قيمة)
نهاية
دالة ضعف(ن)
ارجع ن * 2
نهاية
دالة تربيع(ن)
ارجع ن * ن
نهاية
اطبع_سطر(طبّق(ضعف، 5)) # 10
اطبع_سطر(طبّق(تربيع، 5)) # 254.7 الإغلاقات (Closures)
دالة داخلية تحتفظ بمتغيرات الدالة الخارجية:
sad
دالة عدّاد_جديد()
متغير عدد = 0
دالة زِد()
عدد = عدد + 1
ارجع عدد
نهاية
ارجع زِد
نهاية
متغير عدّاد = عدّاد_جديد()
اطبع_سطر(عدّاد()) # 1
اطبع_سطر(عدّاد()) # 2
اطبع_سطر(عدّاد()) # 34.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 نهاية |
| تعاود | دالة تستدعي نفسها |
| إغلاق | دالة تحتفظ بمتغيرات خارجية |