Parcours
/
C++
C++
/
Exercices
/
Jour d'élection
Jour d'élection

Jour d'élection

Exercice d'apprentissage

Introduction

Références

Copies et références

Avec nos connaissances actuelles, mettre à jour une variable à l'aide d'une fonction est un peu fastidieux. Chaque argument de fonction est traité comme une copie et ne modifie pas la valeur d'origine. Selon la taille du type, cela peut avoir de sérieuses conséquences sur les performances du code.

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

On peut voir les References comme des alias : les modifier a un effet sur la variable d'origine. Les References utilisent une esperluette (&) dans la déclaration du type.

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

Il n'est pas possible de réattribuer une reference (changer sa liaison). On ne peut pas avoir une reference non initialisée. Les References doivent être initialisées avec une variable existante.

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

Avec la puissance des references, on n'a parfois pas besoin de renvoyer de valeur depuis une fonction. Dans ce cas, void est utilisé comme type de retour.

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

Instructions

Une école près de chez toi possède une association d'élèves très active. Cette association est dirigée par un président et, tous les deux ans, des élections sont organisées pour élire un nouveau président.

Pour l'élection de cette année, il a été décidé qu'un nouveau système numérique de comptage des votes était nécessaire. L'école a besoin de ton aide pour construire ce nouveau système.

1. Récupère le nombre de votes d'un ElectionResult

Le nouveau système aura besoin d'un moyen de récupérer le nombre de votes d'un compteur.

La structure ElectionResult est déjà créée pour toi et elle est définie ainsi :

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

Comme tous les membres de la structure sont publics, tu n'as pas besoin d'écrire un constructor pour initialiser un objet ElectionResult. Tu peux à la place utiliser une initializer list :

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

Crée une fonction vote_count qui prend en argument une référence vers un ElectionResult et qui renvoie le nombre de votes de cet ElectionResult.

vote_count(hamilton);
// => 1804

2. Incrémente les votes d'un ElectionResult

Il est enfin temps de traiter les votes ! Il te faut maintenant un moyen d'incrémenter les votes d'un ElectionResult.

Crée une fonction void increment_vote_count qui prend en argument une référence vers un ElectionResult ainsi qu'un nombre de votes, et qui incrémente de ce nombre les votes de l'ElectionResult.

ElectionResult burr{"Aaron " 1801};

increment_vote_count(burr, 3);

vote_count(burr);
// => 1804

3. Comptage des votes et présidence

L'école a rendu ses votes et il est maintenant temps de vérifier les résultats pour connaître le vainqueur.

Crée une fonction determine_result qui reçoit une référence vers un décompte final et qui renvoie une référence vers l'struct du nouveau président. Elle doit aussi modifier le nom du vainqueur en le préfixant par « President ». Le décompte final est fourni sous la forme d'une reference vers un std::vector<ElectionResult>, un vecteur contenant les ElectionResults de tous les candidats participants.

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"

Pour simplifier, tu peux partir des hypothèses suivantes :

  • Le vector contient au moins un élément.
  • Il n'y aura pas d'égalité pour la première place.
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
C++ Exercism

Prêt à commencer Jour d'élection ?

Inscris-toi sur Exercism pour apprendre et maîtriser C++ avec 19 concepts100 exercices, et un vrai mentorat humain, le tout gratuitement.