2. [TD]: المشكلة
الكلمات المفتاحية: علم الخوارزميات، أساسيات لغة جافا: المصفوفات، الإدخال/الإخراج، الحلقات، الاختبارات، معالجة الاستثناءات
قراءات موصى بها: الفصل 1 من [ref1]: أساسيات لغة جافا
2.1. Support
يحتوي الملف [support / chap-02] على الخوارزمية التي يجب ترجمتها إلى C# و Java.
2.2. المشكلة المطلوب حلها
نرغب في كتابة برنامج يمكنه، في مساء يوم الانتخابات، حساب عدد المقاعد التي حصلت عليها القوائم المختلفة المشاركة. سنجد لاحقًا طريقة حساب المقاعد في انتخابات النسبة التناسبية للأعلى متوسط، كما هو موضح في مقال نشرته صحيفة Ouest-France في 15 مارس 1986.
سنكتب تطبيق Java "console"، c.a.d. وهو تطبيق يستخدم لوحة المفاتيح والشاشة للتواصل مع المستخدم. سيطلب التطبيق من المستخدم المعلومات التالية (التي يتم إدخالها عبر لوحة المفاتيح):
- عدد المقاعد الشاغرة
- عدد القوائم المتنافسة
- لكل قائمة: اسمها وعدد الأصوات التي حصلت عليها
باستخدام هذه المعلومات، يحسب التطبيق المقاعد التي حصلت عليها كل قائمة ويعرضها على الشاشة بالشكل التالي:
حيث [Xi] هو اسم القائمة رقم i و [Ni] هو عدد المقاعد التي حصلت عليها.
مقال في صحيفة Ouest-France بتاريخ 15 مارس 1986:


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]
قد يكون مثال التنفيذ كما يلي:
