Trilhas
/
C++
C++
/
Exercícios
/
Dia da eleição
Dia da eleição

Dia da eleição

Exercício de aprendizagem

Introdução

Referências

Cópias e referências

Com o que sabemos até agora, é um pouco complicado atualizar uma variável com a ajuda de uma função. Todo argumento de função é tratado como uma cópia e não altera o valor original. Dependendo do tamanho do seu tipo, isso pode ter consequências sérias para o desempenho do seu código.

int adjust_salary(int base, int kids) {
    return base + kids * 500;
}
int now_a_mother_of_twins{2500};
adjust_salary(now_a_mother_of_twins, 2);

// now_a_mother_of_twins is still 2500
now_a_mother_of_twins = adjust_salary(now_a_mother_of_twins, 2);
// now_a_mother_of_twins is now 3500

Dá para pensar em References como apelidos: mudanças nelas têm efeito sobre a variável original. References usam um e comercial (&) na declaração de tipo.

int balance{1000};
int& budget{balance};
int pro_computer_wheels{699};
budget -= pro_computer_wheels;
// budget is now 301;
// balance is also 301;

Não é possível reassentar (mudar a ligação de uma reference). Você não pode ter uma reference não inicializada. É preciso inicializar References com uma variável existente.

int main_acc{1'000'000};
int side_acc{-20};
int& savings{main_acc};
// => main_acc and savings are 1'000'000

// try to reseat savings to use main account
savings = side_acc;
// savings and main_acc are now -20
// as this uses the **value** of side_acc
savings += 20;
// savings and main_acc are now 0, side_acc is still -20

int& future_budget;
// => compiler error, reference must be bound!

void

Com o poder das references, você pode nem precisar retornar um valor de uma função. void é usado como tipo de retorno nesse cenário.

void increase_power(int& level) {
    level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!

Instruções

Uma escola local perto de você tem uma associação de estudantes muito ativa. A associação de estudantes é administrada por um presidente e, a cada 2 anos, são realizadas eleições para eleger um novo presidente.

Na eleição deste ano, foi decidido que era necessário um novo sistema digital para contar os votos. A escola precisa da sua ajuda para construir esse novo sistema.

1. Obtenha o número de votos de um ElectionResult

O novo sistema vai precisar de uma forma de obter o número de votos de um contador.

A struct de resultado da eleição já foi criada para você e está definida assim:

struct ElectionResult {
    // Name of the candidate
    std::string name{};
    // Number of votes the candidate has
    int votes{};
};

Como todos os membros da struct são públicos, você não precisa escrever um constructor para inicializar um objeto ElectionResult. Você pode usar uma initializer list em vez disso:

ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.

Crie uma função vote_count que receba uma referência a um ElectionResult como argumento e retorne o número de votos no ElectionResult.

vote_count(hamilton);
// => 1804

2. Incremente os votos de um ElectionResult

Finalmente chegou a hora de processar os votos! Agora você precisa de uma forma de incrementar os votos em um ElectionResult.

Crie uma função void increment_vote_count que receba uma referência a um ElectionResult como argumento e um número de votos, e incremente o ElectionResult com esse número de votos.

ElectionResult burr{"Aaron " 1801};

increment_vote_count(burr, 3);

vote_count(burr);
// => 1804

3. Contagem de votos e presidência

A escola entregou os votos e agora chegou a hora de verificar os resultados para saber quem venceu.

Crie uma função determine_result que recebe uma referência a uma contagem final e retorna uma referência ao ElectionResult do novo presidente. Ela também deve mudar o nome do vencedor, adicionando o prefixo "President" a ele. A contagem final é dada na forma de uma reference para std::vector<ElectionResult>, um vetor com os ElectionResults de todos os candidatos participantes.

ElectionResult sanchez{"Pedro", 471};
ElectionResult wheatley{"Summer", 340};
std::vector<ElectionResult> final_count{sanchez, wheatley};

ElectionResult& winner = determine_result(final_count);

winner.name;
// => "President Pedro"

Para simplificar, você pode assumir o seguinte:

  • O vector tem pelo menos um elemento.
  • Não haverá empate em primeiro lugar.
Editar via GitHub O link abre em uma nova janela ou aba
C++ Exercism

Tudo pronto para começar Dia da eleição?

Crie sua conta no Exercism para aprender e dominar C++ com 19 conceitos100 exercícios e mentoria humana de verdade, tudo de graça.