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

مقارنة عامة

جزء من قسم 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 لفرز مصفوفة من الأعداد الصحيحة بترتيب تصاعدي.

challenge icon

التحدي

سهل

اكتب دالة 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) {
    // اكتب الكود هنا
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming