تحليل أخطاء برمجية: عد الظهورات وحساب النسبة المئوية في C++
البرنامج الذي قدمته يحاول عد الظهورات لكل قيمة في القائمة وحساب النسبة المئوية. ومع ذلك، يبدو أن هناك خطأ في الشيفرة البرمجية يؤدي إلى النتائج الفعلية التي تختلف عن التوقعات المتوقعة. دعونا نلقي نظرة على الشيفرة البرمجية ونحللها لنجد الخطأ.
أولاً، يجب التنويه إلى أنه يتم تعيين قيمة counter
داخل الحلقة الرئيسية وبعد طباعة الناتج. هذا قد يؤدي إلى تعطيل عملية الطباعة بشكل صحيح. لذا، قد يكون من الأفضل إعادة هيكلة الحلقة الرئيسية.
-
كيفية قراءة وطباعة أطول سطر في C05/03/2024
-
Java: قوة التطوير والابتكار في عالم البرمجة18/01/2024
ثانيًا، يجب معالجة الحالة عندما يكون العنصر الوسطي في البحث هو نفس القيمة المطلوبة. في هذه الحالة، يجب تحديث العداد بشكل صحيح.
سأقوم بتعديل الشيفرة البرمجية بناءً على الملاحظات السابقة:
cpp#include
#include
#include
using namespace std;
int counter = 0;
double percentage;
int val = 0;
vectorint, int>> list = { make_tuple(2, 3), make_tuple(0, 8), make_tuple(2, 3), make_tuple(8, 9), make_tuple(9, 5), make_tuple(9, 5), make_tuple(2, 3) };
int binarysearch(vectorint , int>> list, int low, int high, tuple<int, int> number) {
int index = low;
int mid = 0;
// loop till the condition is true
while (low <= high) {
// divide the array for search
mid = (low + high) / 2;
if (list.at(mid) >= number) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
return (high - index + 1);
}
int main() {
while (counter < list.size()) {
val = binarysearch(list, counter, list.size() - 1, list.at(counter));
percentage = val * 100.0 / list.size();
cout << "Value: " << get<0>(list.at(counter)) << ":" << get<1>(list.at(counter)) << " Occurs: " << val << " Time(s)" << " %" << percentage << endl;
counter += val;
}
return 0;
}
هذه التعديلات يجب أن تساعد في الحصول على النتائج المتوقعة. تأكد من تجربة هذا الكود المعدل وإخباري إذا كان هناك أي تعليق إضافي أو إذا كنت بحاجة إلى مساعدة إضافية.
المزيد من المعلومات
في هذا السياق، يبدو أن البرنامج يعتمد على خوارزمية البحث الثنائي لعد الظهورات، حيث يتم تقسيم القائمة إلى نصفين ويتم البحث في النصف الذي يحتمل وجود القيمة المطلوبة فيه. تتكرر هذه العملية حتى يتم العثور على القيمة المستهدفة.
تستخدم الدالة binarysearch
لتنفيذ هذا البحث الثنائي، حيث يتم تحديد النطاق الذي يجب البحث فيه (من low
إلى high
). البرنامج يقوم بحساب عدد الظهور باستخدام هذه الدالة ويحسب النسبة المئوية للظهور بالنسبة إلى حجم القائمة الكلي.
عند تحليل الشيفرة، يجب الانتباه إلى الحالات الحدودية وضمان أن تكون القائمة مرتبة بشكل صحيح لضمان نجاح البحث الثنائي.
بعد التعديلات المقترحة، يتوقع أن يكون البرنامج قادرًا على عد الظهورات بشكل صحيح. يمكن أيضًا تحسين الكود بإضافة تعليقات لشرح الخطوات المنطقية وزيادة قابلية الفهم للمستخدمين المحتملين أو المطورين الآخرين.