Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تمرير الدوال كوسطاء

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 36 من 61.

من أكثر استخدامات مؤشرات الدوال قوةً تمريرها كوسائط إلى دوال أخرى. يتيح لك ذلك حقن سلوك مخصّص في دالة دون تعديل شيفرتها: وهي تقنية تُسمّى أحيانًا استدعاءً عكسيًا.

تخيّل دالةً تُجري عملية حسابية على عددين. بدلاً من تضمين العملية بشكل ثابت، يمكنك قبول مؤشّر دالة يحدّد العملية التي يجب إجراؤها:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

لا تعرف الدالة compute ما إذا كانت ستجري عملية الجمع أو الطرح أو شيئًا آخر تمامًا. فهي تستدعي ببساطة أي دالة تُمرَّر إليها:

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // المخرجات: 8
    printf("%d\n", compute(5, 3, multiply));  // المخرجات: 15
    return 0;
}

لاحظ كيف تنتج الدالة compute نفسها نتائج مختلفة استنادًا إلى الدالة التي نمرّرها. يُعد هذا النمط أساسيًا لكتابة تعليمات برمجية مرنة وقابلة لإعادة الاستخدام. تكتب البنية مرة واحدة، ويزوّد مستخدمو دالتك بالمنطق المحدد الذي يحتاجون إليه.

challenge icon

التحدي

سهل

اكتب دالة apply_twice تأخذ عددين صحيحين ورمز عملية، وتطبّق العملية على العددين مرتين بالتسلسل، ثم تُرجع النتيجة النهائية.

ستتلقى دالتك رمز عملية يحدد العملية التي يجب استخدامها. يجب عليك تعريف دوال العمليات داخل حلك وتمريرها إلى دالة مساعدة compute تقبل مؤشراً إلى دالة.

ملاحظة: لا حاجة إلا إلى الدوال. تستدعي الاختبارات apply_twice مباشرةً وتتحقق من القيمة التي تُرجعها، لذا لا تقرأ المدخلات ولا تطبع أي شيء.

البنية المطلوبة:

  • عرّف typedef باسم Operation لمؤشر إلى دالة تأخذ معاملين من النوع int وتُرجع قيمة من النوع int
  • عرّف دالتي عمليات: add (تُرجع a + b) وmultiply (تُرجع a * b)
  • عرّف دالة compute تأخذ عددين صحيحين ومؤشر دالة من النوع Operation، ثم تُرجع نتيجة استدعاء العملية
  • في apply_twice، حدّد العملية المناسبة استناداً إلى الرمز، ثم استخدم compute مرتين: أولاً مع العددين الأصليين، ثم مع النتيجة والعدد الثاني مرة أخرى

المنطق:

  1. حدّد دالة العملية استناداً إلى op_code ‏(1 = add، و2 = multiply)
  2. استدعِ compute(a, b, operation) للحصول على نتيجة وسيطة
  3. استدعِ compute(intermediate, b, operation) للحصول على النتيجة النهائية
  4. أرجع النتيجة النهائية

المعاملات:

  • a ‏(int): العدد الأول
  • b ‏(int): العدد الثاني
  • op_code ‏(int): رمز العملية (1 من أجل add، و2 من أجل multiply)

القيمة المُرجعة: النتيجة بعد تطبيق العملية مرتين بالتسلسل (int)

مثال: عندما تكون a = 5 وb = 3 وop_code = 1 ‏(add):

  • الحساب الأول: 5 + 3 = 8
  • الحساب الثاني: 8 + 3 = 11
  • الإرجاع: 11

عندما تكون a = 2 وb = 4 وop_code = 2 ‏(multiply):

  • الحساب الأول: 2 × 4 = 8
  • الحساب الثاني: 8 × 4 = 32
  • الإرجاع: 32

جرّب بنفسك

int apply_twice(int a, int b, int op_code) {
    // اكتب الكود هنا
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت