Skip to content

2. [TD]: O problema

Palavras-chave: algoritmos, noções básicas de Java: matrizes, E/S, loops, verificações, gerenciamento de exceções

Leituras recomendadas: capítulo 1 de [ref1]: Noções básicas da linguagem Java

2.1. Support

  

A pasta [support / chap-02] contém o algoritmo a ser traduzido para C# e Java.

2.2. O problema a ser resolvido

Deseja-se escrever um programa que, na noite das eleições, possa calcular o número de cadeiras obtidas pelas diferentes listas em disputa. Um pouco mais adiante, será apresentado o método de cálculo das cadeiras para uma eleição proporcional com a média mais alta, conforme explicado em um artigo do jornal Ouest-France de 15 de março de 1986.

Escreveremos um aplicativo Java de “console”, c.a.d, que utiliza o teclado e a tela para se comunicar com o usuário. Ele solicitará as seguintes informações ao usuário (digitadas no teclado):

  • número de cadeiras a serem preenchidas
  • número de listas concorrentes
  • para cada lista: seu nome e número de votos

Com essas informações, o aplicativo calcula os assentos obtidos por cada uma das listas e os exibe na tela da seguinte forma:

  • A lista [X1] obteve [N1] cadeiras

  • A lista [X2] obteve [N2] cadeiras

  • ...

onde [Xi] é o nome da lista nº i e [Ni] é o número de cadeiras que ela obteve.

Artigo do Ouest-France de 15 de março de 1986:

Image

Image

2.3. A solução algorítmica

Uma solução algorítmica poderia ser a seguinte:

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

     // código
     // número de vagas a serem preenchidas
    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
     // número de listas concorrentes
    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

     // dimensionamento das tabelas
    dimensionner les tableau nomListe, voixListe, elimineListe, siegesListe, moyenneListe à nbListes éléments

     // inserção dos nomes e votos das listas
    totalVoix<-0
    pour i variant de 0 à nbListes-1
         // inserção do nome da 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
     // inserção do número de votos da 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

     // incrementa-se o total de votos
    totalVoix<- totalVoix+voixListe[i]79.finpour 80.
     // cálculo dos votos válidos
    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
     // Existem listas que não foram eliminadas?
    si nbVoixUtiles=0 alors
        écrire "Erreur : toutes les listes ont été éliminées"
        arrêt du programme
    finsi
     // distribuição dos assentos pelo quociente
    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
     // distribuição dos assentos restantes pela média mais alta
     // 1 assento é atribuído a cada volta do ciclo
    pour iSiège variant de 0 à nbSiègesAPourvoir - nbSiègesPourvus - 1
         // busca da lista com a maior média
        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
         // atribui-se 1 assento à lista com a maior média
        siegeListe[iMax] <- siegeListe[iMax]+1
         // e altera-se sua média
        moyenneListe[iMax] <- voixListe[iMax]/(siegeListe[iMax]+1)
    finpour
     // exibição dos resultados sem ordenação
    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. Tarefa a ser realizada

Q1: traduzir o algoritmo para C#. Implementá-lo com o Visual Studio.

Q2: traduzir o algoritmo para Java, inspirando-se no código C#. Implementar o programa Java em um ambiente Eclipse semelhante ao seguinte:

  • [1]: o projeto se chama [elections-01]
  • [2]: o aplicativo será colocado em um pacote, neste caso, [istia.st.elections]
  • [3]: [MainElections.java] é o código-fonte do aplicativo escrito na parte anterior
  • [4]: a classe [MainElections] é executada

Um exemplo de execução poderia ser o seguinte:

Image