Skip to content

2. [الواجب]: المشكلة

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

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

2.1. الدعم

  

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

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

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

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

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

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

  • فازت القائمة [X1] بـ [N1] مقعدًا

  • فازت القائمة [X2] بـ [N2] مقعدًا

  • ...

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

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

Image

Image

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

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

début-programme
    // données
    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

    // code
    // nbre de sièges à pourvoir
    saisieOK<-faux
    tant que non saisieOK
        écrire "Nombre de sièges à pourvoir : "
        lire nbSiègesAPourvoir
        si nbSiègesAPourvoir n'is not an integer >0 then
            écrire "Erreur : tapez un nombre entier >0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque
    // nbre de listes en compétition
    saisieOK<-faux
    tant que non saisieOK
        écrire "Nombre de listes en compétition : "
        lire nbListes
        si nbListes n'is not an integer >0 then
            écrire "Erreur : tapez un nombre entier >0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque

    // dimensionnement des tableaux
    dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments

    // saisie des noms et voix des listes
    totalVoix<-0
    pour i variant de 0 à nbListes-1
        // saisie du nom de la liste 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
    // saisie du nombre de voix de la liste i
    saisieOK<-faux
    tantque non saisieOK
        écrire "Nombre de voix de la liste ", nomListe[i] , " : "
        lire voixListe[i]
        si voixListe[i] n'is not an integer >=0 then
            écrire "Erreur : tapez un nombre entier >=0"
        sinon
            saisieOK<-vrai
        finsi
    fintantque

    // on incrémente le total des voix
    totalVoix<- totalVoix+voixListe[i]79.finpour 80.
    // calcul des voix utiles
    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
    // y-a-t-il des listes non éliminées ?
    si nbVoixUtiles=0 alors
        écrire "Erreur : toutes les listes ont été éliminées"
        arrêt du programme
    finsi
    // répartition des sièges au quotient
    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
    // répartition des sièges restants à la plus forte moyenne
    // 1 siège est attribué à chaque tour de boucle
    pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
        // recherche de la liste ayant la + forte moyenne
        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
        // on attribue 1 siège à la liste de + forte moyenne
        siegeListe[iMax] <- siegeListe[iMax]+1
        // et on change sa moyenne
        moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
    finpour
    // affichage résultats sans tri
    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. المهام المطلوبة

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

السؤال 2: ترجم الخوارزمية إلى لغة Java، مستوحياً من كود C#. قم بتنفيذ برنامج Java في بيئة Eclipse مشابهة لما يلي:

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

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

Image