Skip to content

2. [TD]: Sorun

Anahtar kelimeler: algoritma, Java’nın temelleri: diziler, G/Ç, döngüler, koşul testleri, istisna yönetimi

Önerilen okumalar: [ref1] kitabının 1. bölümü: Java dilinin temelleri

2.1. Support

  

[support / chap-02] dosyası, C# ve Java'ya çevrilecek algoritmayı içerir.

2.2. Çözülmesi gereken problem

Seçim gecesi, yarışan farklı listelerin elde ettiği sandalye sayısını hesaplayabilen bir program yazmak istiyoruz. Biraz ileride, 15 Mart 1986 tarihli Ouest-France gazetesindeki bir makalede açıklandığı üzere, en yüksek ortalamaya dayalı nispi temsil seçiminde sandalye hesaplama yöntemi yer almaktadır.

Klavye ve ekranı kullanarak kullanıcıyla iletişim kuran bir Java "konsol" uygulaması, c.a.d yazacağız. Uygulama, kullanıcıdan (klavyeyle girilecek) aşağıdaki bilgileri isteyecektir:

  • doldurulacak koltuk sayısı
  • yarışan liste sayısı
  • her liste için: adı, aldığı oy sayısı

Bu bilgilerle uygulama, her listenin kazandığı koltuk sayısını hesaplayacak ve bunları ekranda şu şekilde gösterecektir:

  • [X1] listesi [N1] sandalye kazanmıştır

  • [X2] listesi, [N2] sandalye kazandı

  • ...

burada [Xi], i numaralı listenin adı; [Ni] ise bu listenin kazandığı koltuk sayısıdır.

15 Mart 1986 tarihli Ouest-France gazetesi haberi:

Image

Image

2.3. Algoritmik çözüm

Bir algoritmik çözüm şu şekilde olabilir:

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

     // kod
     // doldurulacak koltuk sayısı
    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
     // yarışan liste sayısı
    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

     // tabloların boyutlandırılması
    dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments

     // listelerin adlarının ve oylarının girilmesi
    totalVoix<-0
    pour i variant de 0 à nbListes-1
         // i numaralı listenin adının girilmesi
        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 numaralı listenin oy sayısının girilmesi
    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

     // toplam oy sayısı artırılır
    totalVoix<- totalVoix+voixListe[i]79.finpour 80.
     // geçerli oyların hesaplanması
    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
     // eleme aşamasından geçmemiş liste var mı?
    si nbVoixUtiles=0 alors
        écrire "Erreur : toutes les listes ont été éliminées"
        arrêt du programme
    finsi
     // koltukların bölüneçlere göre dağıtılması
    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
     // kalan sandalyelerin en yüksek ortalamaya göre dağıtılması
     // Her döngüde 1 sandalye tahsis edilir
    pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
         // en yüksek ortalamaya sahip listenin belirlenmesi
        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
         // ortalama puanı en yüksek listeye 1 sandalye tahsis edilir
        siegeListe[iMax] <- siegeListe[iMax]+1
         // ve ortalaması değiştirilir
        moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
    finpour
     // sonuçlar sıralanmadan görüntülenir
    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. Yapılması gerekenler

Q1: Algoritmayı C#'a çevirin. Visual Studio ile uygulayın.

Q2: C# kodundan esinlenerek algoritmayı Java'ya çevirin. Aşağıdakine benzer bir Eclipse ortamında Java programını uygulayın:

  • [1]: Projenin adı [elections-01]'tir
  • [2]: Uygulama bir pakete yerleştirilecektir; burada [istia.st.elections]
  • [3]: [MainElections.java], önceki bölümde yazılan uygulamanın kaynak kodudur
  • [4]: [MainElections] sınıfı çalıştırılır

Çalıştırma örneği şu şekilde olabilir:

Image