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:
burada [Xi], i numaralı listenin adı; [Ni] ise bu listenin kazandığı koltuk sayısıdır.
15 Mart 1986 tarihli Ouest-France gazetesi haberi:


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:
