2. [TD]: مشکل
واژگان کلیدی: الگوریتمها، مبانی جاوا: آرایهها، ورودی/خروجی، حلقهها، شرطها، مدیریت استثناها
مطالعهٔ پیشنهادی: فصل ۱ از [ref1]: مبانی زبان جاوا
2.1. Support
پوشه [support / chap-02] شامل الگوریتمی است که باید در C# و جاوا پیادهسازی شود.
2.2. مسئلهای که باید حل شود
ما میخواهیم برنامهای بنویسیم که در شب انتخابات، بتواند تعداد کرسیهای کسبشده توسط فهرستهای نامزدهای مختلف را محاسبه کند. در ادامه، روش محاسبه کرسیها برای یک انتخابات نمایندگی تناسبی را با استفاده از سیستم میانگین بالاترین، همانطور که در مقالهای در روزنامه *Ouest-France* به تاریخ ۱۵ مارس ۱۹۸۶ توضیح داده شده است، پیدا خواهیم کرد.
ما یک برنامه کنسول جاوا به نام c.a.d خواهیم نوشت – برنامهای که از صفحهکلید و صفحه نمایش برای تعامل با کاربر استفاده میکند. این برنامه اطلاعات زیر را از کاربر درخواست خواهد کرد (که از طریق صفحهکلید وارد میشوند):
- تعداد کرسیهای مورد نظر برای تعیین
- تعداد فهرستهای شرکتکننده در انتخابات
- برای هر فهرست: نام آن و تعداد آرایی که دریافت کرده است
برنامه با استفاده از این اطلاعات، تعداد کرسیهای کسبشده توسط هر فهرست را محاسبه کرده و آنها را به شکل زیر روی صفحه نمایش میدهد:
که در آن [Xi] نام فهرست شماره i و [Ni] تعداد کرسیهای کسبشده توسط آن است.
مقاله اوست-فرانس مورخ ۱۵ مارس ۱۹۸۶:


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# ترجمه کنید. آن را با استفاده از ویژوال استودیو پیادهسازی کنید.
Q2: الگوریتم را در جاوا پیادهسازی کنید و از کد C# الهام بگیرید. برنامه جاوا را در محیطی مشابه اکلیپس به شکل زیر پیادهسازی کنید:
- [1]: پروژه با نام [elections-01] نامگذاری میشود
- [2]: برنامه در یک بسته قرار داده خواهد شد، در این مورد [istia.st.elections]
- [3]: [MainElections.java] کد منبع برنامهای است که در بخش قبلی نوشته شده است
- [4]: کلاس [MainElections] اجرا میشود
یک مثال از اجرا ممکن است به شرح زیر باشد:
