CS50 : S3 | Pluralidade
Tags: braziliandevs, c
Published: 2022-09-01 23:54:47

# 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:
```c
// Update vote totals given a new vote
bool vote(string name)
{
    // TODO
    return false;
}
```
- `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.

```c
// 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.

```c
// Array of candidates
candidate candidates[MAX];
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9uedpbh4wxron8df10g7.png)


Então teremos que percorrer essa lista, e procurar se para cada candidato há uma "match" com o nome inserido para a votação.

```c
for(int i = 0; i < candidate_count; i++) {
        if(strcmp(name, candidates[i].name) == 0) {
            candidates[i].votes += 1;
            return true;
        }
    }
```

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:

```bash
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).

3. Encontrando, incrementa-se o valor do candidato em 1.
4. 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.

```c
// 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.

```c
// 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;
        }
    }
}
```
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.

```c
// 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);
        }
    }

}
```

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.