Треки
/
C++
C++
/
Вправи
/
День виборів
День виборів

День виборів

Навчальна вправа

Вступ

Посилання

Копії та посилання

З огляду на наші поточні знання, оновлювати змінну за допомогою функції трохи незручно. Кожен аргумент функції обробляється як копія і не змінює початкове значення. Залежно від розміру типу це може серйозно позначитися на швидкодії коду.

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

References можна розуміти як псевдоніми: зміни в них впливають на початкову змінну. У References в оголошенні типу використовується амперсанд (&).

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

Перепривʼязати (змінити привʼязку reference) неможливо. Не можна мати неініціалізований reference. References потрібно ініціалізувати наявною змінною.

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

Завдяки можливостям references повертати значення з функції взагалі може не знадобитися. У цьому випадку void використовується як тип поверненого значення.

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

Вказівки

У місцевій школі неподалік дуже активна учнівська асоціація. Асоціацію учнів очолює президент, і раз на 2 роки проводять вибори, щоб обрати нового президента.

Цього року було вирішено, що для підрахунку голосів потрібна нова цифрова система. Школі потрібна наша допомога в її створенні.

1. Отримайте кількість голосів з ElectionResult

Новій системі знадобиться спосіб отримувати кількість голосів від лічильника.

Структуру результату виборів уже створено, і вона має такий вигляд:

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

Оскільки всі члени struct є відкритими, не потрібно писати constructor, щоб ініціалізувати обʼєкт ElectionResult. Натомість можна скористатися initializer list:

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

Створіть функцію vote_count, яка прийматиме посилання на ElectionResult як аргумент і повертатиме кількість голосів у ElectionResult.

vote_count(hamilton);
// => 1804

2. Збільште кількість голосів ElectionResult

Нарешті час обробити голоси! Тепер потрібен спосіб збільшувати кількість голосів в ElectionResult.

Створіть функцію increment_vote_count типу void, яка прийматиме посилання на ElectionResult як аргумент і число голосів, та збільшить ElectionResult на це число голосів.

ElectionResult burr{"Aaron " 1801};

increment_vote_count(burr, 3);

vote_count(burr);
// => 1804

3. Підрахунок голосів і президентство

Школа здала свої голоси, і тепер час перевірити результати, щоб визначити переможця.

Створіть функцію determine_result, яка приймає посилання на остаточний підрахунок і повертає посилання на ElectionResult нового президента. Вона також має змінити імʼя переможця, додавши на початку «President». Остаточний підрахунок подано у вигляді reference на std::vector<ElectionResult>, вектор із ElectionResults усіх кандидатів, які брали участь.

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"

Щоб спростити, можна припустити таке:

  • vector має щонайменше один елемент.
  • Нічиєї за перше місце не буде.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
C++ Exercism

Час розпочати День виборів?

Зареєструйтеся на Exercism, щоб вивчати й опановувати C++, а також 19 концепцій100 вправ та справжнє наставництво від людей, і все це безкоштовно.