Rutas
/
C++
C++
/
Ejercicios
/
Día de las elecciones
Día de las elecciones

Día de las elecciones

Ejercicio de aprendizaje

Introducción

Referencias

Copias y referencias

Con nuestros conocimientos actuales, resulta un poco engorroso actualizar una variable con la ayuda de una función. Cada argumento de una función se trata como una copia y no modifica el valor original. Dependiendo del tamaño de tu tipo, esto puede tener graves consecuencias para el rendimiento de tu 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

Las References pueden verse como alias: los cambios en ellas afectan a la variable original. Las References usan un ampersand (&) en la declaración del tipo.

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

No es posible volver a enlazar (cambiar el vínculo de una reference). No puedes tener una reference sin inicializar. Las References deben inicializarse con una variable 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

Con el poder de las references, puede que no necesites devolver ningún valor de una función. void se usa como tipo de retorno en este escenario.

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

Instrucciones

Una escuela cercana tiene una asociación de estudiantes muy activa. La asociación de estudiantes está gestionada por un presidente y, cada 2 años, se celebran elecciones para elegir a un nuevo presidente.

En las elecciones de este año se ha decidido que hacía falta un nuevo sistema digital para contar los votos. La escuela necesita tu ayuda para construir este nuevo sistema.

1. Obtener el número de votos de un ElectionResult

El nuevo sistema necesitará una forma de obtener el número de votos de un contador.

La estructura de resultado electoral ya está creada para ti y se define así:

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

Como todos los miembros del struct son públicos, no necesitas escribir un constructor para inicializar un objeto ElectionResult. En su lugar, puedes usar una initializer list:

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

Crea una función vote_count que reciba una referencia a un ElectionResult como argumento y devuelva el número de votos del ElectionResult.

vote_count(hamilton);
// => 1804

2. Incrementar los votos de un ElectionResult

¡Por fin ha llegado el momento de procesar los votos! Ahora necesitas una forma de incrementar los votos de un ElectionResult.

Crea una función void increment_vote_count que reciba una referencia a un ElectionResult como argumento y un número de votos, e incremente el ElectionResult en ese número de votos.

ElectionResult burr{"Aaron " 1801};

increment_vote_count(burr, 3);

vote_count(burr);
// => 1804

3. Recuento de votos y presidencia

La escuela ha entregado sus votos y ahora toca comprobar los resultados para ver quién es el ganador.

Crea una función determine_result que reciba una referencia a un recuento final y devuelva una referencia al ElectionResult del nuevo presidente. También debe cambiar el nombre del ganador añadiéndole el prefijo «President». El recuento final se da en forma de reference a std::vector<ElectionResult>, un vector con los ElectionResults de todos los 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, puedes dar por sentado lo siguiente:

  • El vector tiene al menos un elemento.
  • No habrá empates en el primer puesto.
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
C++ Exercism

¿Listo para empezar Día de las elecciones?

Regístrate en Exercism para aprender y dominar C++ con 19 conceptos100 ejercicios y mentoría humana real, todo gratis.