Skip to content

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:

  • La lista [X1] ha ottenuto [N1] seggi

  • La lista [X2] ha ottenuto [N2] seggi

  • ...

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:

Image

Image

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:

Image