مراجعة: Calculator Dispatch
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 37 من 61.
التحدي
سهلقم ببناء آلة حاسبة باستخدام جدول التوزيع (dispatch table). ستقوم بإنشاء مصفوفة من مؤشرات الدوال (function pointers) التي تربط رموز العمليات بالدوال المقابلة لها، ثم تستخدمها لإجراء الحسابات.
اكتب برنامجاً يقوم بما يلي:
- إنشاء
typedefيسمىOperationلمؤشر دالة يأخذ معاملين من نوعintويعيد قيمة من نوعint - تعريف أربع دوال حسابية:
add— تعيد a + bsub— تعيد a - bmul— تعيد a * bdivide— تعيد a / b (قسمة الأعداد الصحيحة)
- في الدالة
main، قم بإنشاء جدول توزيع: مصفوفة مكونة من 4 مؤشرات دوال من نوعOperation، حيث الفهرس 0 هو add، والفهرس 1 هو sub، والفهرس 2 هو mul، والفهرس 3 هو divide - قراءة ثلاثة مدخلات: عددين صحيحين ورمز العملية (0-3)
- استخدام رمز العملية للوصول إلى الفهرس المناسب في جدول التوزيع واستدعاء الدالة المطلوبة
- طباعة النتيجة
ستتلقى ثلاثة مدخلات: الرقم الأول، الرقم الثاني، و رمز العملية (0 لـ add، و 1 لـ sub، و 2 لـ mul، و 3 لـ divide).
يجب أن يكون مخرجك عدداً صحيحاً واحداً — نتيجة العملية:
7في هذا المثال مع المدخلات 10، 3، 1: رمز العملية 1 يختار sub من جدول التوزيع، لذا نحسب 10 - 3 = 7.
المفتاح هنا هو استخدام فهرسة المصفوفة لاختيار الدالة — لا حاجة لاستخدام جمل if أو switch. يجب أن يبدو جدول التوزيع الخاص بك كما يلي:
Operation ops[4] = {add, sub, mul, divide};ثم استدعِ الدالة باستخدام: ops[code](a, b)
جرّب بنفسك
#include <stdio.h>
// TODO: إنشاء typedef يسمى 'Operation' لمؤشر دالة
// يأخذ معاملين من نوع int ويعيد قيمة من نوع int
// TODO: تعريف الدوال الحسابية الأربع: add، sub، mul، divide
int main() {
// قراءة المدخلات
int a, b, code;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &code);
// TODO: إنشاء جدول التوزيع (مصفوفة من 4 مؤشرات دوال من نوع Operation)
// Operation ops[4] = { ... };
// TODO: استخدام رمز العملية لاستدعاء الدالة المناسبة
// وتخزين النتيجة
int result;
// طباعة النتيجة
printf("%d\n", result);
return 0;
}جميع دروس Object Oriented Programming
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري7مؤشرات الدوال
التصريح عن مؤشرات الدوالاستدعاء مؤشرات الدوالاستخدام Typedef لمؤشرات الدوالتمرير الدوال كوسطاءمراجعة: Calculator Dispatch2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة