Você está na página 1de 8

20/06/2022 10:52 Fundação Estudar

 
Voltar


Anterior
Próximo

Exercício 2: Runoff

Implemente um programa que execute uma eleição de segundo turno, conforme a seguir.

./runoff Alice Bob Charlie

Número de eleitores: 5

Rank 1: Alice

Rank 2: Bob

Rank 3: Charlie

Rank 1: Alice

Rank 2: Charlie

Rank 3: Bob

Rank 1: Bob

Rank 2: Charlie

Rank 3: Alice

Rank 1: Bob

Rank 2: Alice

Rank 3: Charlie

Rank 1: Charlie

Rank 2: Alice

Rank 3: Bob

Alice

Background

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 1/8
20/06/2022 10:52 Fundação Estudar

Você já conhece as eleições pluralistas, que seguem um algoritmo muito simples para determinar o
vencedor de uma eleição: cada eleitor ganha um voto e o candidato com mais votos vence.

Mas o voto de pluralidade tem algumas desvantagens. O que acontece, por exemplo, em uma eleição
com três candidatos, e as cédulas abaixo são lançadas?

Uma votação de pluralidade declararia aqui um empate entre Alice e Bob, uma vez que cada um tem
dois votos. Mas esse é o resultado certo?

Existe outro tipo de sistema de votação conhecido como sistema de votação por escolha ranqueada. Em
um sistema de escolha ranqueada, os eleitores podem votar em mais de um candidato. Em vez de
apenas votar na primeira escolha, eles podem classificar os candidatos em ordem de preferência. As
cédulas resultantes podem, portanto, ser semelhantes às apresentadas a seguir.

Aqui, cada eleitor, além de especificar seu primeiro candidato preferencial, também indicou sua segunda
e terceira opções. E agora, o que antes era uma eleição empatada, agora pode ter um vencedor. A
corrida foi originalmente empatada entre Alice e Bob, então Charlie estava fora da corrida. Mas o eleitor
que escolheu Charlie preferiu Alice a Bob, então Alice poderia ser declarada vencedora.

A votação por escolha ranqueada também pode resolver outra desvantagem potencial da votação por
pluralidade. Dê uma olhada nas seguintes cédulas.

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 2/8
20/06/2022 10:52 Fundação Estudar

Quem deve ganhar esta eleição? Em uma votação de pluralidade em que cada eleitor escolhe apenas
sua primeira preferência, Charlie vence esta eleição com quatro votos, em comparação com apenas três
para Bob e dois para Alice. Mas a maioria dos eleitores (5 de 9) ficaria mais feliz com Alice ou Bob em
vez de Charlie. Ao considerar as preferências ranqueadas, um sistema de votação pode ser capaz de
escolher um vencedor que reflita melhor as preferências dos eleitores.

Uma dessas opções de sistema de votação por classificação é o sistema de runoff instantâneo (ou uma
eleição com turnos). Em uma eleição de runoff instantâneo, os eleitores podem rankear quantos
candidatos quiserem. Se algum candidato tiver a maioria (mais de 50%) dos votos da primeira
preferência, esse candidato é declarado vencedor da eleição.

Se nenhum candidato tiver mais de 50% dos votos, ocorre um “runoff instantaneo”. O candidato que
recebeu o menor número de votos é eliminado da eleição, e quem originalmente escolheu esse
candidato como sua primeira preferência agora tem sua segunda preferência considerada. Por que fazer
assim? Efetivamente, isso simula o que teria acontecido se o candidato menos popular não tivesse
estado na eleição para começar.

O processo repete-se: se nenhum candidato obtiver a maioria dos votos, o último candidato colocado é
eliminado e quem votou nele votará na sua próxima preferência (os que ainda não foram eliminados).
Uma vez que um candidato tenha a maioria, ele é declarado o vencedor.

Vamos considerar as nove cédulas acima e examinar como ocorreria uma eleição com turnos.

Alice tem dois votos, Bob tem três votos e Charlie tem quatro votos. Para ganhar uma eleição com nove
pessoas, é necessária uma maioria (cinco votos). Como ninguém tem maioria, é necessário realizar um
segundo turno. Alice tem o menor número de votos (com apenas dois), então Alice é eliminada. Os
eleitores que votaram originalmente em Alice listaram Bob como segunda preferência, então Bob obtém
os dois votos extras. Bob agora tem cinco votos e Charlie ainda tem quatro votos. Bob agora tem a
maioria e Bob é declarado o vencedor.

Que casos extremos precisamos considerar aqui?

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 3/8
20/06/2022 10:52 Fundação Estudar

Uma possibilidade é que haja um empate para quem deve ser eliminado. Podemos lidar com esse
cenário dizendo que todos os candidatos que estão empatados no último lugar serão eliminados. Se
todos os candidatos restantes tiverem exatamente o mesmo número de votos, porém, eliminar os
candidatos empatados em último lugar significa eliminar todos! Então, nesse caso, teremos que ter
cuidado para não eliminar todos, e apenas declarar a eleição um empate entre todos os candidatos
restantes.

Algumas eleições de runoff instantâneo não exigem que os eleitores classifiquem todas as suas
preferências - portanto, pode haver cinco candidatos em uma eleição, mas um eleitor pode escolher
apenas dois. Para os fins deste problema, entretanto, vamos ignorar esse caso particular e presumir que
todos os eleitores classificarão todos os candidatos em sua ordem preferida.

Parece um pouco mais complicado do que uma votação plural, não é? Mas pode-se argumentar que tem
a vantagem de ser um sistema eleitoral em que o vencedor da eleição representa com mais precisão as
preferências dos eleitores.

Começando

Veja como baixar o “código de distribuição” desse problema (ou seja, código inicial) em seu próprio
CS50 IDE. Faça login no CS50 IDEe, em uma janela de terminal, execute cada um dos itens abaixo.

Navegue até o diretório pset3 que já deve existir.


Execute mkdir runoff de mkdir para criar (ou seja, criar) um diretório chamado runoff em seu
diretório pset3 .
Execute cd runoff para mudar para (ou seja, abrir) esse diretório.
Execute wget https://cdn.cs50.net/2020/fall/psets/3/runoff/runoff.c para baixar o código de
distribuição deste problema.
Execute ls . Você deve ver o código de distribuição deste problema, em um arquivo chamado
runoff.c.

Entendendo…

Este vídeo irá te ajudar a entender o problema ;)

Atenção: para adicionar legendas ao vídeo clique no botão CC localizado no Player e selecione a


opção "Português (Brasil)".

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 4/8
20/06/2022 10:52 Fundação Estudar

CC50: PSet 3 - Runoff

Vamos abrir runoff.c para dar uma olhada no que já está lá. Estamos definindo duas constantes:
MAX_CANDIDATES para o número máximo de candidatos na eleição e MAX_VOTERS para o número
máximo de eleitores na eleição.

Em seguida, estão as preferências de matriz bidimensional . A matriz de preferências [i] representará


todas as preferências para o eleitor número i , e as preferências de inteiros [i] [ j] aqui armazenarão o
índice do candidato que é a j ésima preferência do eleitor i .

O próximo é um struct chamado candidate . Cada candidate tem um campo de string para seu name e
int que representa o número de votes que eles têm atualmente, e um valor bool chamado eliminated
que indica se o candidato foi eliminado da eleição. Os candidates da matriz acompanharão todos os
candidatos na eleição.

O programa também possui duas variáveis ​globais: voter_count e candidate_count .

Agora em main . Observe que, após determinar o número de candidatos e eleitores, o ciclo de votação
principal começa, dando a cada eleitor a chance de votar. Conforme o eleitor insere suas preferências, a
função de voto é chamada para controlar todas as preferências. Se a qualquer momento a cédula for
considerada inválida, o programa é encerrado.

Uma vez que todos os votos foram alcançados, outro ciclo começa: este vai continuar repetindo o
processo de segundo turno para verificar se há um vencedor e eliminar o último candidato a lugar até
que haja um vencedor.

A primeira chamada aqui é para uma função chamada tabulate , que deve olhar para todas as
preferências dos eleitores e computar os totais de votos atuais, observando cada candidato eleito pela
primeira vez que ainda não foi eliminado. Em seguida, a função print_winner deve imprimir o vencedor,
caso aplicavel; se houver, o programa acabou. Mas, caso contrário, o programa precisa determinar o
menor número de votos que alguém ainda na eleição recebeu (por meio de uma chamada para find_min
). Se ficar claro que todos na eleição estão empatados com o mesmo número de votos (conforme
determinado pela função is_tie ), a eleição é declarada empatada; caso contrário, o candidato (ou
candidatos) em último lugar é eliminado da eleição por meio de uma chamada para a função de
eliminação .
https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 5/8
20/06/2022 10:52 Fundação Estudar

Se você olhar um pouco mais abaixo no arquivo, verá que essas funções - vote , tabulate , print_winner
, find_min , is_tie e eliminate - são todas deixadas para você concluir!

Especificações

Conclua a implementação de runoff.c de forma que simule uma eleição de turnos. Você deve completar
as implementações das funções vote , tabulate , print_winner , find_min , is_tie e eliminate , e não deve
modificar mais nada em runoff.c (e a inclusão de arquivos de cabeçalho adicionais, se desejar).

vote
A função leva os argumentos voter , rank e name . Se o name corresponder ao nome de um
candidato válido, você deve atualizar a matriz de preferências globais para indicar que o
eleitor voter tem aquele candidato como sua preferência de rank (onde 0 é a primeira
preferência, 1 é a segunda preferência, etc. )
Se a preferência for registrada com sucesso, a função deve retornar true ; caso contrário, a
função deve retornar false (se, por exemplo, nome não for o nome de um dos candidatos).
Você pode presumir que dois candidatos não terão o mesmo nome.
Lembre-se de que candidate_count armazena o número de candidatos na eleição.
Lembre-se de que você pode usar strcmp para comparar duas strings.
Lembre-se de que as preferences [i] [ j] armazenam o índice do candidato que é a j ésima
preferência classificada para o i ésimo eleitor.
tabulate
A função deve atualizar o número de votes que cada candidato possui nesta fase do
segundo turno.
Lembre-se de que em cada estágio do segundo turno, cada eleitor vota efetivamente em seu
candidato preferido que ainda não foi eliminado.
Lembre-se de que voter_count armazena o número de eleitores na eleição.
Lembre-se de que, para um eleitor i , seu candidato de primeira escolha é representado por
preferences [i][0] , seu candidato de segunda escolha por preferences [i][1] , etc.
Lembre-se de que a estrutura do candidato possui um campo denominado eliminado , o que
será true caso o candidato tenha sido eliminado da eleição.
Lembre-se de que a struct do candidate tem um campo chamado votes , que você
provavelmente desejará atualizar para o candidato preferido de cada eleitor.
print_winner
Se algum candidato tiver mais da metade dos votos, seu nome deve ser impresso em stdout
e a função deve retornar true .
Se ninguém ganhou a eleição ainda, a função deve retornar falso .
Lembre-se de que voter_count armazena o número de eleitores na eleição. Diante disso,
como você expressaria o número de votos necessários para vencer a eleição?
find_min
A função deve retornar o total mínimo de votos para qualquer candidato que ainda esteja na
eleição.

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 6/8
20/06/2022 10:52 Fundação Estudar

Você provavelmente vai querer percorrer os candidatos para encontrar aquele que ainda
está na eleição e tem o menor número de votos. Que informações você deve acompanhar
enquanto analisa os candidatos?
is_tie
A função leva um argumento min , que será o número mínimo de votos que alguém na
eleição tem atualmente.
A função deve retornar verdadeiro se todos os candidatos restantes na eleição tiverem o
mesmo número de votos, e deve retornar falso caso contrário.
Lembre-se de que o empate ocorre se todos os candidatos ainda na eleição tiverem o
mesmo número de votos. Observe também que a função is_tie leva um argumento min , que
é o menor número de votos que qualquer candidato possui atualmente. Como você pode
usar essas informações para determinar se a eleição é um empate (ou, inversamente, não um
empate)?
eliminate
A função leva um argumento min , que será o número mínimo de votos que alguém na
eleição tem atualmente.
A função deve eliminar o candidato (ou candidatos) com número mín de votos.

Uso
Seu programa deve se comportar conforme o exemplo abaixo:

./runoff Alice Bob Charlie

Número de eleitores: 5

Rank 1: Alice

Rank 2: Charlie

Rank 3: Bob

Rank 1: Alice

Rank 2: Charlie

Rank 3: Bob

Rank 1: Bob

Rank 2: Charlie

Rank 3: Alice

Rank 1: Bob

Rank 2: Charlie

Rank 3: Alice

Rank 1: Charlie

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 7/8
20/06/2022 10:52 Fundação Estudar

Rank 2: Alice

Rank 3: Bob

Alice

Como testar o código?


Certifique-se de testar seu código para ver como ele se comporta no caso de:

Uma eleição com qualquer número de candidatos (até o MAX 9)


Votar em um candidato pelo nome
Votos inválidos para candidatos que não estão na cédula
Imprimir o vencedor da eleição se houver apenas um
Não eliminando ninguém em caso de empate entre todos os candidatos restantes

Execute o seguinte comando para avaliar a exatidão do seu código usando check50 . Mas certifique-se
de compilar e testar você mesmo!

check50 cs50/problems/2021/x/runoff
Execute o seguinte comando para avaliar o estilo do seu código usando style50 .

style50 runoff.c


Anterior
Próximo

Em caso de dúvida, envie email para relacionamento@estudar.org.br

Plataforma de ensino por  

https://ead.napratica.org.br/enrollments/7235444/courses/84414/course_contents/2169392 8/8

Você também pode gostar