Skip to content

2. [TD]: المشكلة

الكلمات المفتاحية: علم الخوارزميات، أساسيات لغة جافا: المصفوفات، الإدخال/الإخراج، الحلقات، الاختبارات، معالجة الاستثناءات

قراءات موصى بها: الفصل 1 من [ref1]: أساسيات لغة جافا

2.1. Support

  

يحتوي الملف [support / chap-02] على الخوارزمية التي يجب ترجمتها إلى C# و Java.

2.2. المشكلة المطلوب حلها

نرغب في كتابة برنامج يمكنه، في مساء يوم الانتخابات، حساب عدد المقاعد التي حصلت عليها القوائم المختلفة المشاركة. سنجد لاحقًا طريقة حساب المقاعد في انتخابات النسبة التناسبية للأعلى متوسط، كما هو موضح في مقال نشرته صحيفة Ouest-France في 15 مارس 1986.

سنكتب تطبيق Java "consolec.a.d. وهو تطبيق يستخدم لوحة المفاتيح والشاشة للتواصل مع المستخدم. سيطلب التطبيق من المستخدم المعلومات التالية (التي يتم إدخالها عبر لوحة المفاتيح):

  • عدد المقاعد الشاغرة
  • عدد القوائم المتنافسة
  • لكل قائمة: اسمها وعدد الأصوات التي حصلت عليها

باستخدام هذه المعلومات، يحسب التطبيق المقاعد التي حصلت عليها كل قائمة ويعرضها على الشاشة بالشكل التالي:

  • حصلت القائمة [X1] على [N1] مقعدًا

  • حصلت القائمة [X2] على [N2] مقعدًا

  • ...

حيث [Xi] هو اسم القائمة رقم i و [Ni] هو عدد المقاعد التي حصلت عليها.

مقال في صحيفة Ouest-France بتاريخ 15 مارس 1986:

Image

Image

2.3. الحل الخوارزمي

قد يكون الحل الخوارزمي كما يلي:

début-programme
     // البيانات
    saisieOK : booléen
    nbSiègesAPourvoir : entier
    nbListes : entier
    nomListe[] : chaînes de caractères
    voixListe[] : entier
    elimineListe[] : booléen
    siegesListe[] : entier
    moyenneListe[] : réel
    i : entier
    nbVoixUtiles : entier
    quotientElectoral : réel
    nbSiègesPourvus : entier
    moyenneMax : réel
    Max : entier iSiège : entier

     // الرمز
     // عدد المقاعد الشاغرة
    saisieOK<-faux
    tant que non saisieOK
        écrire "Nombre de sièges à pourvoir : "
        lire nbSiègesAPourvoir
        si nbSiègesAPourvoir n'est pas un entier >0 alors
            écrire "Erreur : tapez un nombre entier >0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque
     // عدد القوائم المتنافسة
    saisieOK<-faux
    tant que non saisieOK
        écrire "Nombre de listes en compétition : "
        lire nbListes
        si nbListes n'est pas un entier >0 alors
            écrire "Erreur : tapez un nombre entier >0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque

     // حجم الجداول
    dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments

     // إدخال أسماء القوائم والأصوات
    totalVoix<-0
    pour i variant de 0 à nbListes-1
         // إدخال اسم القائمة i
        saisieOK<-faux
        tantque non saisieOK
        écrire "Nom de la liste n° ", i, " : "
        lire nomListe[i]
        si nomListe[i] est vide alors
            écrire "Erreur : Tapez un nom non vide"
        sinon
            saisieOK<-vrai
        finsi
    fintantque
     // إدخال عدد الأصوات للقائمة i
    saisieOK<-faux
    tantque non saisieOK
        écrire "Nombre de voix de la liste ", nomListe[i] , " : "
        lire voixListe[i]
        si voixListe[i] n'est pas un nombre entier >=0 alors
            écrire "Erreur : tapez un nombre entier >=0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque

     // يتم زيادة إجمالي الأصوات
    totalVoix<- totalVoix+voixListe[i]79.finpour 80.
     // حساب الأصوات الصالحة
    nbVoixUtiles<-0
    pour i variant de 0 à nbListes-1
        si (voixListe[i]/totalVoix)<0.05 alors
            elimineListe[i]<-vrai
        sinon
            elimineListe[i]<-faux
            nbVoixUtiles<-nbVoixUtiles+voixListe[i]
        finsi
    finpour
     // هل توجد قوائم لم يتم استبعادها؟
    si nbVoixUtiles=0 alors
        écrire "Erreur : toutes les listes ont été éliminées"
        arrêt du programme
    finsi
     // توزيع المقاعد حسب الحصص
    quotientElectoral <- nbVoixUtiles / nbSiègesAPourvoir
    nbSiègesPourvus<- 0
    pour i variant de 0 à nbListes-1
        si non elimineListe[i] alors
            siegesListe[i]<- partie entière de (voixListe[i]/quotientElectoral)
            moyenneListe[i] <- voixListe[i] / (siegesListe[i]+1)
            nbSiègesPourvus<-nbSiègesPourvus+siegesListe[i]
        sinon
            siegesListe[i]<-0
        finsi
    finpour
     // توزيع المقاعد المتبقية على أساس أعلى متوسط
     // يُخصص مقعد واحد لكل دورة
    pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
         // البحث عن القائمة ذات المتوسط الأعلى
        moyenneMax<- (-1)
        pour i variant de 0 à nbListes-1
            si non elimineListe[i] alors
                si moyenneListe[i] > moyenneMax alors
                    moyenneMax <- moyenneListe[i]
                    iMax <- i
                finsi
            finsi
        finpour
         // يُخصص مقعد واحد للقائمة ذات المتوسط الأعلى
        siegeListe[iMax] <- siegeListe[iMax]+1
         // ويتم تغيير متوسطها
        moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
    finpour
     // عرض النتائج دون فرز
    pour i variant de 0 à nbListes-1
        si elimineListe[i] alors
            écrire "La liste ", nomListe[i], " a été éliminée"
        sinon
            écrire "La liste ", nomListe[i], " a obtenu ",
            siegesListe[i], " siège(s)"
        finsi
    finpour
fin-programme

2.4. المهمة المطلوبة

Q1: ترجمة الخوارزمية إلى لغة C#. تنفيذها باستخدام Visual Studio.

Q2: ترجمة الخوارزمية إلى لغة Java بالاستعانة برمز C#. تنفيذ برنامج Java في بيئة Eclipse مشابهة لما يلي:

  • [1]: اسم المشروع هو [elections-01]
  • [2]: سيتم وضع التطبيق في حزمة، هنا [istia.st.elections]
  • [3]: [MainElections.java] هو كود المصدر للتطبيق المكتوب في الجزء السابق
  • [4]: يتم تنفيذ الفئة [MainElections]

قد يكون مثال التنفيذ كما يلي:

Image