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

التصريح عن مؤشرات الدوال

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

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

مؤشر الدالة هو متغير يخزن عنوان دالة. وكما يحتفظ المؤشر العادي بعنوان البيانات، يحتفظ مؤشر الدالة بعنوان التعليمات البرمجية القابلة للتنفيذ.

قد تبدو الصياغة النحوية مخيفة في البداية. للإعلان عن مؤشر function، تحدد نوع return، ثم اسم pointer بين قوسين مع علامة النجمة، متبوعًا بأنواع parameters:

int (*operation)(int, int);

يُصرّح هذا عن متغيّر يُسمّى operation يمكنه الإشارة إلى أي function تأخذ two int parameters وتُعيد قيمة من نوع int. الأقواس المحيطة بـ *operation بالغة الأهمية؛ فمن دونها، ستُصرّح عن function تُعيد مؤشّرًا.

لتعيين function إلى هذا pointer، استخدم ببساطة اسم function (من دون أقواس):

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

int (*operation)(int, int);
operation = add;  // الآن operation يشير إلى add

يعمل اسم function باعتباره عنوانها. يمكنك أيضًا استخدام &add بشكل صريح، لكن ذلك اختياري: كلا الشكلين متكافئان في C.

challenge icon

التحدي

سهل

لنتدرّب على إعلان مؤشرات function وإسناد functions إليها. ستنشئ نظامًا بسيطًا للعمليات الحسابية حيث يمكن لمؤشر function أن يحتفظ بدوال حسابية مختلفة.

اكتب برنامجًا يقوم بما يلي:

  1. يعرّف functions اثنتين:
    • multiply: taking معاملين من النوع int ويعيد حاصل ضربهما
    • subtract: taking معاملين من النوع int ويعيد ناتج طرح الثاني من الأول
  2. داخل main، يعلن متغير مؤشر function يسمى operation ويمكنه الإشارة إلى functions taking معاملين من النوع int وreturning قيمة من النوع int
  3. يقرأ three inputs: العدد الأول، والعدد الثاني، وشفرة العملية (1 من أجل multiply، و2 من أجل subtract)
  4. استنادًا إلى شفرة العملية، يعيّن function appropriate إلى مؤشر operation الخاص بك
  5. يطبع اسم العملية المعيّنة، ثم يطبع نتيجة استدعاء function عبر المؤشر

ستتلقى three inputs: العدد الأول، والعدد الثاني، وشفرة العملية (1 أو 2).

ينبغي أن تبدو مخرجاتك بهذا الشكل:

Operation: multiply
Result: 35

حيث إن multiply هو اسم العملية (أو subtract إذا كانت الشفرة 2)، و35 هي نتيجة استدعاء function عبر المؤشر الخاص بك (في هذه الحالة، 5 × 7).

تذكّر: لإعلان مؤشر function، تحتاج إلى نوع return، واسم المؤشر بين قوسين مع علامة النجمة، وأنواع parameters. ولإسناد function، استخدم اسم function فقط من دون أقواس.

جرّب بنفسك

#include <stdio.h>

// TODO: عرّف الدالة multiply هنا


// TODO: عرّف الدالة subtract هنا


int main() {
    int num1, num2, code;
    
    // اقرأ الإدخال
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: صرّح عن مؤشر دالة يسمى 'operation' يمكنه أن يشير إلى
    // دوال تأخذ معاملين من نوع int وتُرجع int
    
    
    // TODO: بناءً على رمز العملية (1 لـ multiply، 2 لـ subtract)،
    // عيّن الدالة المناسبة إلى مؤشر operation الخاص بك
    
    
    // TODO: اطبع اسم العملية والنتيجة
    // التنسيق:
    // Operation: <name>
    // Result: <result>
    
    return 0;
}
quiz iconاختبر نفسك

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

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

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