البرمجة

تصحيح خطأ في تطبيق دالة الفرز المدمجة في C++

عند تمرير متغير إلى دالة في C++، يتم تمرير قيمة المتغير نفسها وليس مجرد نسخة منه. لكن، في حالتك، تم تمرير المتغير n إلى دالة merges بالقيمة الصحيحة 15، وعندما قمت بطباعة قيمة n بعد استدعاء الدالة merges، كانت القيمة 677 بدلاً من 15. هذا يحدث لأن الدالة merges تقوم بتعديل المصفوفة a الممررة إليها، وبالتالي تغيير قيمة n في المصفوفة a وليس قيمة المتغير n الأصلية.

بمعنى آخر، الدالة merges تقوم بفرز ودمج العناصر في المصفوفة a، وعندما تقوم بطباعة قيمة n بعد الانتهاء من الدالة merges، فإن قيمة n في المصفوفة a تكون تغيرت بناءً على الفرز والدمج الذي حدث.

لحل هذه المشكلة، يجب تمرير n-1 بدلاً من n إلى الدالة merges، لأن الفهرس العلوي للمصفوفة في C++ يبدأ من الصفر، لذا يجب تمرير n-1 للحصول على المجموعة الصحيحة من العناصر.

بعد التعديل، يبدو الكود كالتالي:

cpp
int n=sizeof(a)/sizeof(a[0]); printf("n=%d\n",n); merges(a,0,n-1); // تم تصحيح الخطأ هنا printf("n=%d\n",n);

بعد هذا التغيير، يجب أن تحصل على النتائج المتوقعة، حيث سيتم تمرير قيمة 14 (بدلاً من 15) إلى الدالة merges وستظل قيمة n الأصلية 15 دون تغيير.

المزيد من المعلومات

بالتأكيد، هنا بعض المعلومات الإضافية حول الكود وكيفية عمله:

  1. دالة الفرز المدمجة (mergeit): هذه الدالة تقوم بدمج جزئين من المصفوفة الممررة إليها. تبدأ بإنشاء مصفوفتين مؤقتتين (ll و rr) لتخزين الأجزاء المنقسمة من المصفوفة. ثم، تقوم بالمقارنة بين القيمتين الأولى في كل مصفوفة وإضافة القيمة الأصغر إلى المصفوفة النهائية (a). تستمر هذه العملية حتى يتم استنفاد جميع العناصر من المصفوفتين المؤقتتين.

  2. دالة الفرز الرئيسية (merges): هذه الدالة تقوم بتقسيم المصفوفة إلى أجزاء أصغر باستخدام تقسيم ثنائي (باستخدام الوسيط mid) ثم تقوم بفرز هذه الأجزاء بشكل منفصل باستخدام دالة mergeit. تستمر في هذه العملية حتى لا تستطيع تقسيم المصفوفة إلى جزئين أصغر.

  3. الدالة الرئيسية (main): في هذه الدالة، يتم تعريف المصفوفة وحجمها ثم يتم طباعة الحجم الأصلي للمصفوفة (n). بعد ذلك، يتم استدعاء دالة الفرز الرئيسية (merges) لفرز المصفوفة. بعد الانتهاء من ذلك، يتم طباعة الحجم مرة أخرى، وهنا يُظهر الخطأ السابق حيث تم تمرير قيمة n بدلاً من n-1 إلى دالة merges.

  4. المشكلة الأساسية: المشكلة الأساسية في الكود هي تمرير قيمة n بدلاً من n-1 إلى دالة merges، مما أدى إلى تغيير المصفوفة الأصلية وبالتالي تغيير قيمة n في المصفوفة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر