2. [TD]: Il problema
Parole chiave: algoritmi, nozioni di base su Java: array, I/O, cicli, test, gestione delle eccezioni
Letture consigliate: capitolo 1 di [ref1]: Le basi del linguaggio Java
2.1. Support
La cartella [support / chap-02] contiene l'algoritmo da tradurre in C# e Java.
2.2. Il problema da risolvere
Si desidera scrivere un programma che, la sera delle elezioni, sia in grado di calcolare il numero di seggi ottenuti dalle diverse liste in lizza. Più avanti verrà illustrato il metodo di calcolo dei seggi per un’elezione proporzionale con la media più alta, come spiegato in un articolo del quotidiano Ouest-France del 15 marzo 1986.
Scriveremo un'applicazione Java "da console", c.a.d, che utilizza la tastiera e lo schermo per comunicare con l'utente. L'applicazione richiederà all'utente le seguenti informazioni (digitate dalla tastiera):
- numero di seggi da assegnare
- numero di liste in lizza
- per ogni lista: il nome e il numero di voti
Con queste informazioni, l’applicazione calcola i seggi ottenuti da ciascuna lista e li visualizza sullo schermo nella forma seguente:
dove [Xi] è il nome della lista n. i e [Ni] il numero di seggi che ha ottenuto.
L'articolo di Ouest-France del 15 marzo 1986:


2.3. La soluzione algoritmica
Una soluzione algoritmica potrebbe essere la seguente:
| début-programme
// dati
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
// codice
// numero di seggi da assegnare
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
// numero di liste in lizza
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
// dimensioni delle tabelle
dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments
// inserimento dei nomi e dei voti delle liste
totalVoix<-0
pour i variant de 0 à nbListes-1
// inserimento del nome della lista 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
// inserimento del numero di voti della lista 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
// si incrementa il totale dei voti
totalVoix<- totalVoix+voixListe[i]79.finpour 80.
// calcolo dei voti validi
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
// ci sono liste non eliminate?
si nbVoixUtiles=0 alors
écrire "Erreur : toutes les listes ont été éliminées"
arrêt du programme
finsi
// ripartizione dei seggi in base al quoziente
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
// ripartizione dei seggi rimanenti in base alla media più alta
// A ogni ciclo viene assegnato 1 seggio
pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
// ricerca della lista con la media più alta
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
// si assegna 1 seggio alla lista con la media più alta
siegeListe[iMax] <- siegeListe[iMax]+1
// e si modifica la sua media
moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
finpour
// visualizzazione dei risultati senza ordinamento
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. Compiti da svolgere
Q1: tradurre l'algoritmo in C#. Implementarlo con Visual Studio.
Q2: tradurre l'algoritmo in Java ispirandosi al codice C#. Implementare il programma Java in un ambiente Eclipse simile al seguente:
- [1]: il progetto si chiama [elections-01]
- [2]: l'applicazione verrà inserita in un pacchetto, in questo caso [istia.st.elections]
- [3]: [MainElections.java] è il codice sorgente dell'applicazione scritta nella parte precedente
- [4]: viene eseguita la classe [MainElections]
Un esempio di esecuzione potrebbe essere il seguente:
