Plurality
Problema a Resolver
Para este programa, você implementará um programa que realiza uma eleição de pluralidade (plurality election), conforme abaixo.
$ ./plurality Alice Bob Charlie
Number of voters: 4
Vote: Alice
Vote: Bob
Vote: Charlie
Vote: Alice
Alice
Começando
Passo a Passo
Eis aqui um passo a passo para a resolução do problema.
Contexto
As eleições assumem diversas formas e tamanhos. No Reino Unido, o Primeiro Ministro é oficialmente nomeado pelo monarca, que geralmente escolhe o líder do partido político que obtém a maioria dos assentos na Câmara dos Comuns. Nos Estados Unidos, é utilizado um processo de Colégio Eleitoral multi-etapas, no qual os cidadãos votam em como cada estado deve alocar eleitores que, posteriormente, elegem o Presidente.
Talvez a forma mais simples de realizar uma eleição seja por meio de um método comumente conhecido como "voto majoritário simples" (também conhecido como "primeiro-passo-o-posto" ou "vencedor leva tudo"). No voto majoritário simples, cada eleitor tem direito a votar em um candidato. Ao final da eleição, o candidato que obtiver o maior número de votos é declarado vencedor da eleição.
Começando
Acesse o cs50.dev, clique na sua janela do terminal e execute cd
sozinho. Você deve encontrar que o prompt da sua janela do terminal se assemelha ao abaixo:
$
Em seguida, execute
wget https://cdn.cs50.net/2023/fall/psets/3/plurality.zip
Para baixar um arquivo ZIP chamado plurality.zip
em seu codespace.
Em seguida, execute
unzip plurality.zip
para criar uma pasta chamada plurality
. Você não precisa mais do arquivo ZIP, então pode executar
rm plurality.zip
e responda com "y" seguido de Enter no prompt para remover o arquivo ZIP que você baixou.
Agora digite
cd plurality
seguido de Enter para mover-se para (ou seja, abrir) esse diretório. Seu prompt agora deve se parecer com o abaixo.
plurality/ $
Se tudo ocorreu com sucesso, você deve executar:
ls
e veja um arquivo chamado plurality.c
. Executando code plurality.c
deverá abrir o arquivo onde você irá digitar o seu código para este conjunto de problemas. Se não, refaça seus passos e veja se consegue determinar onde errou!
Entendimento
Vamos dar uma olhada no arquivo plurality.c
e ler o código de distribuição que foi fornecido.
A linha #define MAX 9
é uma sintaxe usada aqui para significar que MAX
é uma constante (igual a 9
) que pode ser usada em todo o programa. Aqui, representa o número máximo de candidatos que uma eleição pode ter.
O arquivo, em seguida, define uma struct
chamada de candidate
. Cada candidate
tem dois campos: uma string
chamada name
representando o nome do candidato e um int
chamado votes
representando o número de votos que o candidato tem. Em seguida, o arquivo define um array global de candidates
, onde cada elemento é em si um candidate
.
Agora, dê uma olhada na função main
em si. Veja se você consegue encontrar onde o programa define uma variável global candidate_count
representando o número de candidatos na eleição, copia argumentos de linha de comando para a matriz candidates
e pede ao usuário para digitar o número de eleitores. Em seguida, o programa permite que cada eleitor digite um voto (veja como?), chamando a função vote
em cada candidato votado. Finalmente, main
faz uma chamada à função print_winner
para imprimir o(s) vencedor(es) da eleição.
Se você olhar mais para baixo no arquivo, no entanto, notará que as funções vote
e print_winner
foram deixadas em branco. Essa parte cabe a você completar!
Especificação
Complete a implementação de plurality.c
de tal maneira que o programa simule uma eleição de voto plural.
- Complete a função
vote
.vote
recebe um único argumento, umastring
chamadaname
, representando o nome do candidato que foi votado.- Se
name
corresponder a um dos nomes dos candidatos na eleição, atualize o total de votos desse candidato para contar com o novo voto. A funçãovote
nesse caso deve retornartrue
para indicar uma cédula bem-sucedida. - Se
name
não corresponder ao nome de nenhum dos candidatos na eleição, nenhum total de votos deve ser alterado e a funçãovote
deve retornarfalse
para indicar uma cédula inválida. - Você pode assumir que nenhum candidato terá o mesmo nome.
- Complete a função
print_winner
.- A função deve imprimir o nome do candidato que recebeu a maioria dos votos na eleição e, em seguida, imprimir uma nova linha.
- É possível que a eleição termine em empate se vários candidatos receberem o número máximo de votos. Nesse caso, você deve imprimir os nomes de cada um dos candidatos vencedores, cada um em uma linha separada.
Você não deve modificar nada mais em plurality.c
além das implementações das funções vote
e print_winner
(e a inclusão de arquivos de cabeçalho adicionais, se desejar).
Uso
Seu programa deve se comportar conforme o exemplo abaixo:
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Bob
Vote: Alice
Alice
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Charlie
Invalid vote.
Vote: Alice
Alice
$ ./plurality Alice Bob Charlie
Number of voters: 5
Vote: Alice
Vote: Charlie
Vote: Bob
Vote: Bob
Vote: Alice
Alice
Bob
Testando
Certifique-se de testar seu código para garantir que ele lida com…
- Uma eleição com qualquer número de candidatos (até o
MAX
de9
) - Votação em um candidato por nome
- Votos inválidos para candidatos que não estão na cédula
- Imprimir o vencedor da eleição se houver apenas um
- Imprimir os vencedores da eleição se houver múltiplos vencedores
Execute o abaixo para avaliar a correção do seu código usando check50
. Mas certifique-se de compilar e testar também!
check50 cs50/problems/2024/x/plurality
Execute o código abaixo para avaliar o estilo do seu código usando style50
.
style50 plurality.c
Como Submeter
No seu terminal, execute o comando abaixo para submeter o seu trabalho.
submit50 cs50/problems/2024/x/plurality