مقارنة عامة
جزء من قسم Object Oriented Programming في رحلة 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.
يجب أن تقارن دالتك بين القيمتين وتعيد نتيجة تشير إلى علاقة الترتيب بينهما.
اصطلاح قيمة الإرجاع:
- أعد قيمة سالبة إذا كان العدد الصحيح الأول يأتي قبل الثاني (الأول < الثاني)
- أعد صفراً إذا كان كلا العددين متساويين
- أعد قيمة موجبة إذا كان العدد الصحيح الأول يأتي بعد الثاني (الأول > الثاني)
المعاملات:
a(int): العدد الصحيح الأول للمقارنةb(int): العدد الصحيح الثاني للمقارنة
القيمة المرجعة: عدد صحيح يشير إلى الترتيب: سالب إذا كان a < b، صفر إذا كان a == b، موجب إذا كان a > b.
تلميح: توفر خدعة الطرح من الدرس حلاً أنيقاً في سطر واحد.
ورقة مرجعية
تمكن دوال المقارنة الخوارزميات العامة مثل qsort و bsearch من مقارنة العناصر دون معرفة أنواعها.
التوقيع القياسي لدوال المقارنة:
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 أصغر، تكون النتيجة سالبة؛ وإذا كان متساوياً، تكون صفراً؛ وإذا كان أكبر، تكون موجبة.
جرّب بنفسك
int compare_ints(int a, int b) {
// اكتب الكود هنا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة