2. [Aufgabe]: Das Problem
Stichworte: Algorithmen, Java-Grundlagen: Arrays, E/A, Schleifen, Testen, Ausnahmebehandlung
Literaturempfehlung: Kapitel 1 von [ref1]: Die Grundlagen der Programmiersprache Java
2.1. Support
Der Ordner [support / chap-02] enthält den Algorithmus, der in C# und Java implementiert werden soll.
2.2. Die zu lösende Aufgabe
Wir möchten ein Programm schreiben, das am Wahlabend die Anzahl der Sitze berechnen kann, die die verschiedenen Kandidatenlisten gewonnen haben. Im Folgenden werden wir die Methode zur Berechnung der Sitze für eine Verhältniswahl nach dem Verfahren des höchsten Durchschnitts finden, wie sie in einem Artikel der Zeitung Ouest-France vom 15. März 1986 erläutert wurde.
Wir werden eine Java-„Konsolen“-Anwendung schreiben, d. h. eine Anwendung, die über Tastatur und Bildschirm mit dem Benutzer interagiert. Sie wird den Benutzer um die folgenden Informationen bitten (die über die Tastatur eingegeben werden):
- Anzahl der zu besetzenden Sitze
- Anzahl der konkurrierenden Listen
- für jede Liste: deren Name und Anzahl der Stimmen
Anhand dieser Informationen berechnet die Anwendung die Anzahl der von jeder Liste gewonnenen Sitze und zeigt sie auf dem Bildschirm im folgenden Format an:
wobei [Xi] der Name der Liste Nr. i und [Ni] die Anzahl der gewonnenen Sitze ist.
Der Artikel in der Ouest-France vom 15. März 1986:


2.3. Die algorithmische Lösung
Eine algorithmische Lösung könnte wie folgt aussehen:
| début-programme
// données
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
// code
// nbre de sièges à pourvoir
saisieOK<-faux
tant que non saisieOK
écrire "Nombre de sièges à pourvoir : "
lire nbSiègesAPourvoir
si nbSiègesAPourvoir n'is not an integer >0 then
écrire "Erreur : tapez un nombre entier >0"
sinon
saisieOK<-vrai
finsi
fintantque
// nbre de listes en compétition
saisieOK<-faux
tant que non saisieOK
écrire "Nombre de listes en compétition : "
lire nbListes
si nbListes n'is not an integer >0 then
écrire "Erreur : tapez un nombre entier >0"
sinon
saisieOK<-vrai
finsi
fintantque
// dimensionnement des tableaux
dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments
// saisie des noms et voix des listes
totalVoix<-0
pour i variant de 0 à nbListes-1
// saisie du nom de la liste 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
// saisie du nombre de voix de la liste i
saisieOK<-faux
tantque non saisieOK
écrire "Nombre de voix de la liste ", nomListe[i] , " : "
lire voixListe[i]
si voixListe[i] n'is not an integer >=0 then
écrire "Erreur : tapez un nombre entier >=0"
sinon
saisieOK<-vrai
finsi
fintantque
// on incrémente le total des voix
totalVoix<- totalVoix+voixListe[i]79.finpour 80.
// calcul des voix utiles
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
// y-a-t-il des listes non éliminées ?
si nbVoixUtiles=0 alors
écrire "Erreur : toutes les listes ont été éliminées"
arrêt du programme
finsi
// répartition des sièges au quotient
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
// répartition des sièges restants à la plus forte moyenne
// 1 siège est attribué à chaque tour de boucle
pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
// recherche de la liste ayant la + forte moyenne
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
// on attribue 1 siège à la liste de + forte moyenne
siegeListe[iMax] <- siegeListe[iMax]+1
// et on change sa moyenne
moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
finpour
// affichage résultats sans tri
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. Zu erledigende Aufgaben
Q1: Übersetzen Sie den Algorithmus in C#. Implementieren Sie ihn mit Visual Studio.
Aufgabe 2: Setzen Sie den Algorithmus in Java um und orientieren Sie sich dabei am C#-Code. Implementieren Sie das Java-Programm in einer Eclipse-Umgebung ähnlich der folgenden:
- [1]: Das Projekt heißt [elections-01]
- [2]: Die Anwendung wird in einem Paket abgelegt, hier [istia.st.elections]
- [3]: [MainElections.java] ist der Quellcode für die im vorherigen Abschnitt geschriebene Anwendung
- [4]: Die Klasse [MainElections] wird ausgeführt
Ein Beispiel für die Ausführung könnte wie folgt aussehen:
