مقارنة عامة
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 52 من 61.
تحتاج الدوال العامة مثل qsort وbsearch في المكتبة القياسية للغة C إلى طريقة لمقارنة العناصر من دون معرفة أنواعها. والحل هو دالة مقارنة: دالة تكتبها وتستدعيها الخوارزمية العامة كلما احتاجت إلى مقارنة عنصرين.
التوقيع القياسي لدوال المقارنة هو:
int compare(const void* a, const void* b);المعاملان كلاهما const void* لأن الدالة العامة لا تعرف نوع البيانات الذي تقوم بترتيبه. تتبع القيمة المُعادة اصطلاحًا محددًا:
| القيمة المُعادة | المعنى |
|---|---|
| سالبة | يأتي a قبل b |
| صفر | يساوي a قيمة b |
| موجبة | يأتي a بعد b |
داخل دالة المقارنة، تحوّل مؤشري void* إلى النوع الفعلي وتقارن القيم. إليك كيفية مقارنة الأعداد الصحيحة:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}تعمل حيلة الطرح جيدًا مع الأعداد الصحيحة: إذا كانت a أصغر، تكون النتيجة سالبة؛ وإذا كانتا متساويتين، تكون صفرًا؛ وإذا كانت أكبر، تكون موجبة. يمكن الآن تمرير هذه الدالة إلى qsort لفرز مصفوفة من الأعداد الصحيحة بترتيب تصاعدي.
التحدي
سهلاكتب دالة compare_ints تقارن بين عددين صحيحين باتباع اصطلاح دالة المقارنة القياسي المستخدم في الخوارزميات العامة مثل qsort.
يجب أن تقارن دالتك بين القيمتين وتُرجع نتيجة تشير إلى العلاقة الترتيبية بينهما.
اصطلاح القيمة المُرجعة:
- أعد قيمة سالبة إذا كان العدد الصحيح الأول يأتي قبل الثاني (first < second)
- أعد صفرًا إذا كان العددان الصحيحان متساويين
- أعد قيمة موجبة إذا كان العدد الصحيح الأول يأتي بعد الثاني (first > second)
المعاملات:
a(int): العدد الصحيح الأول المراد مقارنتهb(int): العدد الصحيح الثاني المراد مقارنته
القيمة المُرجعة: عدد صحيح يشير إلى الترتيب: قيمة سالبة إذا كان a < b، وصفر إذا كان a == b، وقيمة موجبة إذا كان a > b.
تلميح: توفر حيلة الطرح من الدرس حلًا أنيقًا مكوّنًا من سطر واحد.
جرّب بنفسك
int compare_ints(int a, int b) {
// اكتب الكود هنا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت