البرمجة

تحسين برنامج إدخال بيانات الطلاب والامتحانات في لغة C

في البداية، يظهر أن الشيفرة التي قدمتها تحتوي على بعض الأخطاء التي يمكن أن تؤثر على طباعة القيم من “stampaEsami”. لنقم أولاً بتحديد هذه الأخطاء ومن ثم سنتعمق في فهم الكود والتعديلات التي يمكن إجراؤها.

في دالة “acquisisciEsami”، يجب تمرير المؤشر على الطالب بدلاً من الطالب نفسه، حيث أنك تقوم بتعديل الهيكل داخل الدالة. يجب تحديث التوقيع لتأخذ مؤشرًا إلى “Studente” بدلاً من “Studente”:

c
void acquisisciEsami(Studente *studente, int n);

ثم، عند استدعاء الدالة “acquisisciEsami” في دالة “init”، قم بتمرير المؤشر بدلاً من القيمة:

c
acquisisciEsami(&archivio[i], nEsami);

والآن دعونا نقوم بإلقاء نظرة على الكود بشكل أوسع. يبدو أن لديك برنامجًا لإدخال وطباعة بيانات الطلاب والامتحانات. تستخدم هياكل البيانات بشكل صحيح، ولكن هناك بعض النقاط التي يمكن تحسينها:

  1. تحسين إدخال السلاسل:
    استخدم الدالة fgets لإدخال السلاسل بدلاً من scanf لتجنب مشاكل الانقطاع عند استخدام السلاسل. على سبيل المثال:

    c
    printf("Inserire nome: "); fgets(archivio[i].nome, MAXSTRINGA, stdin); archivio[i].nome[strcspn(archivio[i].nome, "\n")] = '\0'; // لإزالة السطر الجديد
  2. التحقق من الحد الأقصى:
    قم بالتحقق من الحد الأقصى للسلاسل عند استخدام fgets و scanf لتجنب تجاوز حجم السلسلة المحدد باستخدام MAXSTRINGA.

  3. التحقق من الحدود:
    تحقق من أنك لا تتجاوز حدود الصفوف والأعمدة عند قراءة وطباعة البيانات.

  4. توثيق الشيفرة:
    أضف تعليقات إلى الشيفرة لتوضيح كل قطعة من الشيفرة وتسهيل قراءتها للمطورين الآخرين أو لنفسك في المستقبل.

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

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

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

  1. التعامل مع أحجام متغيرة للسلاسل:
    يمكنك استخدام توجيهات malloc و free للتعامل مع السلاسل المتغيرة الحجم بدلاً من تعريف Stringa باستخدام #define. هذا يتيح لك التحكم في الذاكرة بشكل أكبر ويمنع تجاوز الحدود.

    c
    typedef char *Stringa; // تعريف نوع السلسلة

    وعند تحديد سلسلة:

    c
    archivio[i].nome = malloc(MAXSTRINGA * sizeof(char));

    ولا تنسَ تحرير الذاكرة بعد الانتهاء:

    c
    free(archivio[i].nome);
  2. التحقق من صحة الإدخال:
    يمكنك تضمين التحقق من صحة الإدخال عند استخدام scanf لضمان أن المستخدم قد أدخل قيمة صحيحة. على سبيل المثال:

    c
    if (scanf("%d", &archivio[i].matricola) != 1) { // تعامل مع إدخال غير صحيح هنا }
  3. تحسين التعامل مع الأخطاء:
    يمكنك استخدام ميزات إضافية للتحقق من حدوث أخطاء أثناء تشغيل البرنامج، مثل فحص نتائج الدوال مثل scanf للتحقق من نجاحها.

  4. تحسين عرض البيانات:
    يمكنك تنسيق طريقة طباعة البيانات لجعلها أكثر قراءة، على سبيل المثال، استخدم علامات التبويب لتنظيم الإخراج.

    c
    printf("Studente n. %d:\n", i + 1); printf("\tMatricola: %d\n", archivio[i].matricola); printf("\tNome: %s\n", archivio[i].nome); printf("\tCognome: %s\n", archivio[i].cognome);
  5. التعامل مع أحجام متغيرة للمصفوفات:
    يمكنك استخدام توجيهات malloc و free أيضًا للتعامل مع المصفوفات التي تحتوي على عدد متغير من العناصر.

    c
    typedef struct { Esame *listaEsami; int numeroEsami; } ListaEsame;

    عند التعيين:

    c
    archivio[i].esami.listaEsami = malloc(nEsami * sizeof(Esame));

    وعند الحرر:

    c
    free(archivio[i].esami.listaEsami);

    ولا تنس تحقيق الحد الأقصى لعدد الامتحانات وحجم الأسماء.

  6. تجنب الاستخدام الزائد للتوقف عند تشغيل البرنامج:
    يمكنك التخلص من أوامر system("pause") أو getch() بعد انتهاء البرنامج، حيث أنها ليست ضرورية وتجنب استخدامها يجعل البرنامج يعمل بشكل أفضل عبر مختلف الأنظمة.

  7. تنظيم الكود:
    يمكن تقسيم الشيفرة إلى وحدات (functions) صغيرة تؤدي وظائف محددة. هذا يجعل الشيفرة أكثر قراءة وإدارة.

  8. التوثيق:
    يفضل إضافة توثيق (تعليقات) للشيفرة لشرح وظيفة كل دالة وهيكل بيانات.

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

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