Plurality
Retornando com os desafios do CS50x (versão online), seguimos para a semana 3.
Neste desafio, é pedido que completemos duas funções, sendo estas função vote
e a função print_winner
Função vote
Ao baixarmos os arquivos, temos a função desta maneira:
// Update vote totals given a new vote
bool vote(string name)
{
// TODO
return false;
}
-
vote
recebe apenas um argumento do tipostring
, representando o nome do candidato. - Se o nome for o mesmo de um dos candidatos na eleição, então seu valor de número de votos será incrementado com um novo voto. Assim, a função retornará
true
para indicar que o voto teve sucesso.
Aqui, temos que nos atentar a estrutura já criada pelo código que baixamos, temos este struct
que define que cada candidato, terá um name
e um votes
, sendo estes caractéristicas desta estrutura da dados.
// Candidates have name and vote count
typedef struct
{
string name;
int votes;
}
candidate;
E analisando o código, também temos essa importante informação, indicando que teremos um vetor (array) com o nome de candidates
do tipo candidate
, ou seja, caso seja criado um vetor com três (3) espaços, cada espaço deste tipo de dado, terá uma estrutura envolvendo um name
e um vote
particular de cada candidato.
// Array of candidates
candidate candidates[MAX];
Então teremos que percorrer essa lista, e procurar se para cada candidato há uma "match" com o nome inserido para a votação.
for(int i = 0; i < candidate_count; i++) {
if(strcmp(name, candidates[i].name) == 0) {
candidates[i].votes += 1;
return true;
}
}
- Percorremos essa lista do index inicial (lembrando que é baseado no número 0 como posição inicial), até ao número de candidatos existentes.
- Em C, precisamos utilizar desta função
strcmp()
para comparar valores destrings
. Igualamos a zero, pois a documentação nos diz que:
This function returns
an int less than 0 if s1 comes before s2,
0 if s1 is the same as s2,
an int greater than 0 if s1 comes after s2.
Então se o name
for igual ao candidates[i].name
retornará o valor zero (0).
- Encontrando, incrementa-se o valor do candidato em 1.
- Retorne
true
- Se o
name
não der match com o nome de nenhum candidato na eleição, então o valor total de votos não se altera, e a função retornafalse
para indicar que o voto não foi computado.
Temos então, a função vote
final.
// Update vote totals given a new vote
bool vote(string name)
{
for(int i = 0; i < candidate_count; i++) {
if(strcmp(name, candidates[i].name) == 0) {
candidates[i].votes += 1;
return true;
}
}
return false;
}
Função print_winner
- A função deve retornar o nome do candidato com o maior número de votos, e então imprimir uma nova linha.
Primeira vamos procurar o número total de votos que existe nesse vetor candidates. E vamos utilizar do loop e criar uma variável para armazenar o maior valor total de votos que existe entre os candidatos.
// Print the winner (or winners) of the election
void print_winner(void)
{
int max_votes = 0;
for(int i = 0; i < candidate_count; i++) {
if(candidates[i].votes > max_votes) {
max_votes = candidates[i].votes;
}
}
}
- Criei uma várivel do tipo
int
para registrar o maior número de votos existente entre os candidatos. - Percorro a lista de candidatos e comparo cada o número de
votes
de cada candidato ao valor da minha variável. - Se o valor de votos do candidato seja maior que da minha variável original, então o número de votos do candidato é atribuído a variável
max_votes
.
- É possível que uma eleição termine em empate, onde múltiplos candidatos possuem o mesmo número de votos. Neste caso, imprima o nome de cada candidato em linhas separadas.
Aqui, optei por percorrer de novo a lista e agora, comparar quais candidatos possuem o mesmo número de votos da variável max_votes
. Desta maneira, seja um ou multíplos candidatos, sempre será imprimido em tela aqueles que tiverem a mesma quantidade de votos que a variável preenchida anteriormente.
// Print the winner (or winners) of the election
void print_winner(void)
{
int max_votes = 0;
for(int i = 0; i < candidate_count; i++) {
if(candidates[i].votes > max_votes) {
max_votes = candidates[i].votes;
}
}
for(int i = 0; i < candidate_count; i++) {
if(candidates[i].votes == max_votes) {
printf("%s\n", candidates[i].name);
}
}
}
- Percorro a lista, e vou comparando o número de votos de cada candidato com o número máximo de votos computados anteriormente.
- Se for igual, será impresso em tela o nome em tela, e junto com o marcador
\n
para pular a próxima linha.
É isso, pessoal!
Termina por aqui, o PSET da semana 3.
Top comments (0)