DEV Community

Matheus 🇧🇷
Matheus 🇧🇷

Posted on

CS50 : S3 | Pluralidade

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;
}
Enter fullscreen mode Exit fullscreen mode
  • vote recebe apenas um argumento do tipo string, 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;
Enter fullscreen mode Exit fullscreen mode

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];
Enter fullscreen mode Exit fullscreen mode

Image description

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;
        }
    }
Enter fullscreen mode Exit fullscreen mode
  1. Percorremos essa lista do index inicial (lembrando que é baseado no número 0 como posição inicial), até ao número de candidatos existentes.
  2. Em C, precisamos utilizar desta função strcmp() para comparar valores de strings. 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.
Enter fullscreen mode Exit fullscreen mode

Então se o namefor igual ao candidates[i].name retornará o valor zero (0).

  1. Encontrando, incrementa-se o valor do candidato em 1.
  2. 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 retorna false 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;
}
Enter fullscreen mode Exit fullscreen mode

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;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Criei uma várivel do tipo int para registrar o maior número de votos existente entre os candidatos.
  2. Percorro a lista de candidatos e comparo cada o número de votes de cada candidato ao valor da minha variável.
  3. 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);
        }
    }

}
Enter fullscreen mode Exit fullscreen mode
  1. Percorro a lista, e vou comparando o número de votos de cada candidato com o número máximo de votos computados anteriormente.
  2. 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)