البرمجة

تصنيف السباحين حسب الفئات العمرية

في البداية، يجدر بي أن أشير إلى أن لغة البرمجة C تتميز بسياسة صرامة في تعاملها مع الأنواع المختلفة. عند استخدام دالة scanf لقراءة الإدخال من المستخدم باستخدام "%d"، فإنها تتوقع أن تكون القيمة المدخلة هي عدد صحيح.

في الشيفرة التي قدمتها، عندما تقوم بإدخال سلسلة نصية بدلاً من عدد صحيح، يحدث ما يعرف بظاهرة “buffer overflow” حيث يتم قراءة الجزء الأول من السلسلة كرقم صحيح والأجزاء الباقية تظل في الذاكرة، مما يؤدي إلى نتائج غير متوقعة.

لتجنب هذا السلوك، يمكنك استخدام دالة fgets لقراءة السلسلة النصية ثم استخدام دالة sscanf لتحويل السلسلة إلى عدد صحيح. هذا يسمح لك بالتحكم في الإدخال وتفادي مشكلة تدفق الذاكرة.

فيما يلي مثال على كيفية تعديل الشيفرة:

c
#include int main() { char input[100]; // تحديد حجم السلسلة النصية المقروءة printf("Write the age of the swimmer\n"); fgets(input, sizeof(input), stdin); // استخدام fgets لقراءة السلسلة int age; if (sscanf(input, "%d", &age) == 1) { // استخدام sscanf لتحويل السلسلة إلى عدد صحيح if (age < 5) printf("minimum age is five years old\n"); else if (age >= 5 && age <= 7) printf("Category: child A\n"); else if (age >= 8 && age <= 11) printf("Category: child B\n"); else if (age >= 12 && age <= 13) printf("Category: Juvenile A\n"); else if (age >= 14 && age <= 17) printf("Category: Juvenile A\n"); else if (age >= 18) printf("Category: Adult\n"); else printf("Invalid age\n"); } else { printf("Write only numbers\n"); } // system("PAUSE"); // يمكنك تعليق هذا الجزء إذا كنت تستخدم نظاماً آخر غير Windows return 0; }

هذا التعديل يجعل البرنامج أكثر مرونة في التعامل مع إدخال المستخدم ويتجنب مشكلة تحويل السلسلة إلى عدد صحيح بطريقة غير صحيحة.

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

بالطبع، دعنا نقوم بتوسيع المحتوى ليكون أكثر غنى بالمعلومات. يبدو أن البرنامج الذي قدمته يقوم بتصنيف السباحين حسب الفئات العمرية، ولكن هناك بعض النقاط التي يمكن تحسينها أو التعميق فيها.

1. التحقق من صحة الإدخال:
يفضل دائمًا التحقق من صحة الإدخال الذي يقوم المستخدم بإدخاله. في الشيفرة الحالية، إذا قام المستخدم بإدخال قيمة غير صحيحة، فإن البرنامج سيقوم بطباعة “Write only numbers” دون توضيح أكثر. يمكنك استخدام دالة strtol لفحص صحة الإدخال بشكل أفضل.

2. تحسين رسائل الإخطار:
يمكنك تحسين رسائل الإخطار لتكون أكثر وضوحًا وإرشادًا للمستخدم. على سبيل المثال، يمكنك توضيح أكثر حول الفئات العمرية.

3. التفاعل مع المستخدم:
يمكنك زيادة تفاعل البرنامج مع المستخدم، مثل طلب إعادة المحاولة في حالة إدخال غير صحيح أو تقديم نصائح إضافية حول كيفية إدخال البيانات بشكل صحيح.

4. إضافة وحدات زمنية:
قد يكون من المفيد إضافة وحدات زمنية للإخطارات، مثل استخدام دالة sleep لتأخير الإغلاق في حالة عدم وجود إدخال صحيح.

فيما يلي نموذج مع تحسينات مقترحة:

c
#include #include int main() { char input[100]; printf("Write the age of the swimmer\n"); if (fgets(input, sizeof(input), stdin) != NULL) { // استخدام strtol لفحص صحة الإدخال char *endptr; long age = strtol(input, &endptr, 10); // التحقق من صحة الإدخال if (*endptr == '\n' || *endptr == '\0') { if (age < 5) printf("The minimum age is five years old\n"); else if (age >= 5 && age <= 7) printf("Category: Child A\n"); else if (age >= 8 && age <= 11) printf("Category: Child B\n"); else if (age >= 12 && age <= 13) printf("Category: Juvenile A\n"); else if (age >= 14 && age <= 17) printf("Category: Juvenile B\n"); else if (age >= 18) printf("Category: Adult\n"); else printf("Invalid age\n"); } else { printf("Invalid input. Please write only numbers\n"); } } else { printf("Error reading input\n"); } // إضافة تأخير قبل الإغلاق // sleep(2); return 0; }

هذا النموذج يعتبر تحسينًا على الشيفرة السابقة، مما يجعل البرنامج أكثر صحة وتفاعلاً مع المستخدم.

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