Skip to content

2. [TD]: مشکل

واژگان کلیدی: الگوریتم‌ها، مبانی جاوا: آرایه‌ها، ورودی/خروجی، حلقه‌ها، شرط‌ها، مدیریت استثناها

مطالعهٔ پیشنهادی: فصل ۱ از [ref1]: مبانی زبان جاوا

2.1. Support

  

پوشه [support / chap-02] شامل الگوریتمی است که باید در C# و جاوا پیاده‌سازی شود.

2.2. مسئله‌ای که باید حل شود

ما می‌خواهیم برنامه‌ای بنویسیم که در شب انتخابات، بتواند تعداد کرسی‌های کسب‌شده توسط فهرست‌های نامزدهای مختلف را محاسبه کند. در ادامه، روش محاسبه کرسی‌ها برای یک انتخابات نمایندگی تناسبی را با استفاده از سیستم میانگین بالاترین، همان‌طور که در مقاله‌ای در روزنامه *Ouest-France* به تاریخ ۱۵ مارس ۱۹۸۶ توضیح داده شده است، پیدا خواهیم کرد.

ما یک برنامه کنسول جاوا به نام c.a.d خواهیم نوشت – برنامه‌ای که از صفحه‌کلید و صفحه نمایش برای تعامل با کاربر استفاده می‌کند. این برنامه اطلاعات زیر را از کاربر درخواست خواهد کرد (که از طریق صفحه‌کلید وارد می‌شوند):

  • تعداد کرسی‌های مورد نظر برای تعیین
  • تعداد فهرست‌های شرکت‌کننده در انتخابات
  • برای هر فهرست: نام آن و تعداد آرایی که دریافت کرده است

برنامه با استفاده از این اطلاعات، تعداد کرسی‌های کسب‌شده توسط هر فهرست را محاسبه کرده و آن‌ها را به شکل زیر روی صفحه نمایش می‌دهد:

  • فهرست [X1] موفق به کسب [N1] کرسی شده است

  • فهرست [X2] موفق به کسب [N2] کرسی شد

  • ...

که در آن [Xi] نام فهرست شماره i و [Ni] تعداد کرسی‌های کسب‌شده توسط آن است.

مقاله اوست-فرانس مورخ ۱۵ مارس ۱۹۸۶:

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# ترجمه کنید. آن را با استفاده از ویژوال استودیو پیاده‌سازی کنید.

Q2: الگوریتم را در جاوا پیاده‌سازی کنید و از کد C# الهام بگیرید. برنامه جاوا را در محیطی مشابه اکلیپس به شکل زیر پیاده‌سازی کنید:

  • [1]: پروژه با نام [elections-01] نامگذاری می‌شود
  • [2]: برنامه در یک بسته قرار داده خواهد شد، در این مورد [istia.st.elections]
  • [3]: [MainElections.java] کد منبع برنامه‌ای است که در بخش قبلی نوشته شده است
  • [4]: کلاس [MainElections] اجرا می‌شود

یک مثال از اجرا ممکن است به شرح زیر باشد:

Image