البرمجة

فحص أعداد كولين في لغة C

في البداية، يجدر بي التنويه أن الكود الحالي يحتوي على بعض الأخطاء والتحسينات يمكن إجراؤها لتحسين أدائه. دعوني أقوم بشرح الكود وتوضيح بعض النقاط التي يمكن تحسينها.

تفحص الكود الحالي:

c
#define _CRT_SECURE_NO_WARNINGS #include int main(void) { int num, brojP, potency = 0, numRepeats = 0, endResult = 0, isCullen; printf("Unesite broj"); scanf("%d", &num); do { potency = potency + 1; // تهيئة "potency" وفي نفس الوقت زيادتها برقم واحد في كل تكرار للحلقة do { brojP = 2 * potency; numRepeats = numRepeats + 1; } while (numRepeats < potency); // هذه الحلقة بأكملها تستخدم لجزء "2^n" endResult = brojP * potency + 1; // حساب القيمة النهائية "2^n * n + 1" numRepeats = 0; if (endResult == num) { isCullen = 1; break; } } while (endResult < num); if (isCullen == 1) printf("Number inputted is Cullen's number\n"); else printf("Number inputted isn't Cullen't number\n"); return 0; }

الآن، سأقوم بتحسين الكود وشرح التغييرات:

c
#include int main(void) { int num, brojP, potency = 0, endResult = 0, isCullen = 0; // استخدام معرفات أفضل تعبر عن الغرض printf("Enter a number: "); scanf("%d", &num); do { potency = potency + 1; // زيادة "potency" في كل تكرار للحلقة // حساب "2^n" brojP = 2 * potency; // حساب "2^n * n + 1" endResult = brojP * potency + 1; // فحص إذا كانت النتيجة تساوي الرقم المدخل if (endResult == num) { isCullen = 1; break; } } while (endResult < num); // استخدام تنسيق أفضل للطباعة if (isCullen) printf("%d is a Cullen's number.\n", num); else printf("%d is not a Cullen's number.\n", num); return 0; }

التغييرات:

  1. قمت بتبسيط التعليمات والتعليقات لتكون أكثر وضوحًا.
  2. قمت بإزالة المتغير numRepeats واستخدمت متغير potency مباشرة.
  3. قمت بتعديل النص الذي يُطلب من المستخدم إدخال رقم ليكون أكثر وضوحًا.
  4. قمت بتعديل تنسيق الطباعة ليكون أكثر قراءة وفهمًا.
  5. استخدمت isCullen كمتغير للإشارة إذا كان الرقم هو “Cullen’s number” أو لا.

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

بالطبع، دعوني أوسع في شرح المفاهيم والتفاصيل المتعلقة بالكود ومفهوم أعداد كولين:

أعداد كولين:

أعداد كولين هي سلسلة من الأعداد الصحيحة التي يمكن حسابها باستخدام الصيغة “2^n * n + 1”. حيث يُرمز فيها بـ n لعدد صحيح إيجابي. النتائج الأولى لهذه السلسلة هي: 1, 2, 9, 16, 25، وهكذا فإن كل عدد في السلسلة يتمثل في هذه الصيغة.

تحسينات الكود:

  1. تجنب استخدام #define _CRT_SECURE_NO_WARNINGS: يُفضل عدم استخدام #define _CRT_SECURE_NO_WARNINGS، بدلاً من ذلك يمكنك استخدام #pragma warning(disable: 4996) قبل #include لتجنب رسائل التحذير المتعلقة بالدوال غير آمنة.

  2. التحقق من صحة الإدخال: يمكنك إضافة التحقق من صحة الإدخال للتأكد من أن المستخدم أدخل رقمًا صحيحًا.

  3. تجنب استخدام المتغيرات الغير ضرورية: يمكنك تجنب استخدام المتغيرات الزائدة، مثل numRepeats، حيث يمكن استخدام potency مباشرة.

  4. تحسين تنسيق الطباعة: قمت بتحسين تنسيق الطباعة لجعل الرسائل أكثر وضوحًا وسهولة قراءة.

  5. تجنب استخدام break في الحلقة: يُفضل تجنب استخدام break في الحلقات، يمكن تحقيق ذلك بتعيين قيمة لمتغير يُحدد متى يتوقف الدوران في الحلقة.

الكود المحسن:

c
#include #pragma warning(disable: 4996) int main(void) { int num, brojP, potency = 0, endResult = 0, isCullen = 0; printf("Enter a number: "); if (scanf("%d", &num) != 1) { printf("Invalid input. Please enter a valid integer.\n"); return 1; // إنهاء البرنامج بشكل غير طبيعي } do { potency = potency + 1; // زيادة "potency" في كل تكرار للحلقة // حساب "2^n" brojP = 2 * potency; // حساب "2^n * n + 1" endResult = brojP * potency + 1; // فحص إذا كانت النتيجة تساوي الرقم المدخل if (endResult == num) { isCullen = 1; // لا حاجة لاستخدام "break" هنا، يمكن إنهاء الحلقة بشكل طبيعي } } while (endResult < num); // استخدام تنسيق أفضل للطباعة if (isCullen) printf("%d is a Cullen's number.\n", num); else printf("%d is not a Cullen's number.\n", num); return 0; }

أتمنى أن يكون هذا الشرح قد ساعدك في فهم وتحسين الكود.

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