Tracks
/
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, es un poco engorroso actualizar una variable con la ayuda de una función. Cada argumento de función se maneja como una copia y no cambia el valor original. Dependiendo del tamaño de tu tipo, esto puede tener consecuencias serias 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 se pueden ver 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;

Reasignar (cambiar el vínculo de una reference) no es posible. 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 un valor de una función en absoluto. 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 local cerca de ti tiene una asociación de estudiantes muy activa. La asociación de estudiantes es dirigida por un presidente y cada 2 años se realizan elecciones para elegir a un nuevo presidente.

En las elecciones de este año, se decidió que se necesitaba un nuevo sistema digital para contar los votos. La escuela necesita tu ayuda para construir este nuevo sistema.

1. Obtén el número de votos de un ElectionResult

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

El struct del resultado de la elección ya está creado 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. Incrementa los votos de un ElectionResult

¡Por fin es hora 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, y que incremente el ElectionResult en ese número de votos.

ElectionResult burr{"Aaron " 1801};

increment_vote_count(burr, 3);

vote_count(burr);
// => 1804

3. Conteo de votos y presidencia

La escuela entregó sus votos y ahora es momento de revisar los resultados para saber quién ganó.

Crea una función determine_result que reciba una referencia al conteo final y devuelva una referencia al ElectionResult del nuevo presidente. También debe cambiar el nombre del ganador agregándole el prefijo «President». El conteo final se da en forma de una 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 asumir lo siguiente:

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

¿Todo 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.