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.zipPara baixar um arquivo ZIP chamado plurality.zip em seu codespace.
Em seguida, execute
unzip plurality.zippara criar uma pasta chamada plurality. Você não precisa mais do arquivo ZIP, então pode executar
rm plurality.zipe responda com "y" seguido de Enter no prompt para remover o arquivo ZIP que você baixou.
Agora digite
cd pluralityseguido 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:
lse 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.voterecebe um único argumento, umastringchamadaname, representando o nome do candidato que foi votado.- Se
namecorresponder a um dos nomes dos candidatos na eleição, atualize o total de votos desse candidato para contar com o novo voto. A funçãovotenesse caso deve retornartruepara indicar uma cédula bem-sucedida. - Se
namenão corresponder ao nome de nenhum dos candidatos na eleição, nenhum total de votos deve ser alterado e a funçãovotedeve retornarfalsepara 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
MAXde9) - 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/pluralityExecute o código abaixo para avaliar o estilo do seu código usando style50.
style50 plurality.cComo Submeter
No seu terminal, execute o comando abaixo para submeter o seu trabalho.
submit50 cs50/problems/2024/x/plurality