لنقم بتحويل الكود من C++ إلى لغة البرمجة C. في الواقع، الفكرة العامة للكود هي مقارنة بين سلاسل النصوص (strings) a و b بحيث نقوم بدمجهما معًا بشكل مختلف ثم نقارن النتائج.
في البداية، يجب أن نعلم أن لغة البرمجة C لا تقدم نفس مستوى الدعم الجاهز للنصوص كما هو الحال في C++، لذا سنحتاج إلى استخدام مكتبة مخصصة لمعالجة النصوص، مثل مكتبة string.h
، ونستخدم نوع البيانات char*
لتمثيل النصوص.
نظرًا لأن لغة C لا تدعم مباشرة استخدام bool
كنوع بيانات، سنستخدم int
بدلاً من ذلك، حيث يكون قيمة الصحيحة 1 للـ true
و0 للـ false
.
الآن، لنقم بتحويل الدالة compare
:
c#include
int compare(const char* a, const char* b)
{
char concat1[strlen(a) + strlen(b) + 1]; // +1 لتخزين الحرف النهائي الخاص بنهاية النص
char concat2[strlen(b) + strlen(a) + 1]; // يجب أن تكون النهاية معرفة بوجود النص في C
strcpy(concat1, a);
strcat(concat1, b);
strcpy(concat2, b);
strcat(concat2, a);
return strcmp(concat1, concat2) > 0; // يعود 1 إذا كان concat1 أكبر، و 0 إذا كانت متساوية، و -1 إذا كانت concat2 أكبر
}
تم استبدال النوع string
بنوع البيانات const char*
الذي يُستخدم لتمثيل النصوص في لغة C. ثم تم استخدام دوال مكتبة string.h
مثل strlen
لحساب طول النصوص و strcpy
و strcat
لنسخ ودمج النصوص على التوالي. وأخيرًا، تم استخدام strcmp
لمقارنة النصوص المدموجة وإرجاع قيمة صحيحة تشير إلى نتيجة المقارنة.
بهذا، قمنا بتحويل الكود بنجاح من C++ إلى C مع الحفاظ على نفس المنطق.
المزيد من المعلومات
بالطبع، سأزيد من التفاصيل حول الكود والتغييرات التي تم إجراؤها لتحويله من C++ إلى C.
في الدالة الأصلية في C++:
cppbool compare(string a, string b)
{
return a + b > b + a;
}
- يستخدم نوع البيانات
string
المدمج في C++ لتمثيل النصوص. - يتم استخدام عامل الجمع
+
لدمج النصوص. - يتم استخدام نوع البيانات
bool
لإرجاع قيمة منطقيةtrue
أوfalse
.
أما في النسخة المحولة للغة C:
c#include
int compare(const char* a, const char* b)
{
char concat1[strlen(a) + strlen(b) + 1];
char concat2[strlen(b) + strlen(a) + 1];
strcpy(concat1, a);
strcat(concat1, b);
strcpy(concat2, b);
strcat(concat2, a);
return strcmp(concat1, concat2) > 0;
}
- تم استبدال نوع البيانات
string
بـconst char*
في C، والذي يُعرف على أنه مؤشر إلى تسلسل من الأحرف (نص). - تم استخدام دوال مكتبة
string.h
مثلstrlen
لحساب طول النصوص وstrcpy
وstrcat
للتعامل مع النصوص. - تم استخدام
strcmp
لمقارنة النصوص، حيث تعود الدالة بقيمة أكبر من صفر إذا كان النص الأول أكبر من النص الثاني، وتعود قيمة أقل من صفر إذا كان النص الثاني أكبر، وتعود صفر إذا كانت النصوص متساوية.
هذه التغييرات تعكس الفروق الرئيسية بين لغتي البرمجة C++ و C، حيث تحتاج C إلى معالجة يدوية أكثر للنصوص ولا تقدم نفس مستوى الدعم المدمج لها كما في C++.