Aller au contenu
Topos Uranos

Résumé

Cette leçon ouvre la sixième unité du cours, consacrée aux données composées. Elle explique à quoi sert l’unité : enseigner à représenter des collections de données (séquences de taille fixe et de taille variable, tableaux à deux dimensions et enregistrements) et à les traiter avec les algorithmes de base, écrits à la main et tirés de la bibliothèque, en estimant ce qu’ils coûtent ; elle présente ses six leçons et le fil qui les relie ; elle rappelle ce que l’unité tient pour acquis, surtout les boucles avec invariant et le passage par référence constante ; elle formule le problème que l’unité résout, celui d’un programme qui doit conserver des données dont il ne connaît pas la quantité et qui, écrit avec des variables isolées, tait en silence celles qui sont en trop ; elle anticipe le coût comme seconde mesure d’un algorithme, à côté de sa correction ; et elle montre où elle mène, dans les unités suivantes et dans le cours Programmation en C++ II.

Objectifs d’apprentissage

  1. Décrire la séquence des contenus de l’unité et expliquer ce que chaque leçon apporte à la suivante.
  2. Rappeler les boucles, leurs invariants et le passage de paramètres (par valeur, par référence et par référence constante), et les revoir si nécessaire.
  3. Anticiper, sur un exemple, le coût d’un algorithme comme seconde mesure de sa qualité, à côté de sa correction.
  4. Reconnaître ce qu’on est censé savoir faire à la fin de l’unité, et le distinguer de ce qu’on apprendra dans les unités suivantes.

Évaluation d’entrée

Avant de parcourir l’unité, il convient de mesurer le point de départ. Cette évaluation est une autoévaluation : elle n’est pas notée, et son seul but est d’orienter l’étude. Les quatre premières questions vérifient ce que l’unité tient pour acquis : l’invariant de la boucle qui cherche un maximum, le mode de passage d’un paramètre volumineux, le nombre d’itérations de deux boucles imbriquées et l’arithmétique non signée. Les six suivantes touchent, dans l’ordre des leçons, aux idées centrales de l’unité : les indices valides d’une séquence, la création d’un vecteur, le nombre de fois qu’une taille peut être divisée par deux, la recherche dans des données triées, le double indice d’un tableau à deux dimensions et le danger de ranger dans des collections séparées les données d’une même entité. Personne n’est tenu de les réussir déjà, et pour certaines d’entre elles « je ne le sais pas encore » est une réponse honnête : chaque réponse, juste ou non, explique le point et nomme la leçon qui le traite. Les mêmes compétences sont mesurées de nouveau à la fin, dans la leçon de synthèse.

Évaluation d’entrée

Avant de commencer l’unité, mesurez votre point de départ. C’est une autoévaluation brève : elle n’est pas notée et son résultat n’est conservé que dans votre navigateur.

  1. Question 1Des unités précédentesLe fragment int largest{0}; int t{}; while (std::cin >> t) { if (t > largest) { largest = t; } } doit laisser dans largest la plus élevée des températures lues. Avec quelle entrée échoue-t-il ?

  2. Question 2Des unités précédentesUne fonction calcule combien de voyelles contient un texte d’un million de caractères, rangé dans un std::string, et ne le modifie pas. Comment convient-il de déclarer son paramètre ?

  3. Question 3Des unités précédentesCombien de fois ++count est-il exécuté dans for (int i{0}; i < 6; ++i) { for (int j{0}; j < i; ++j) { ++count; } } ?

  4. Question 4Des unités précédentesQu’écrit std::println("{}", 0u - 1); sur un système où unsigned int a 32 bits ?

  5. Question 5Dans une séquence de nn éléments numérotés comme en C++, quels indices ii désignent un élément ?

  6. Question 6Que contient v après std::vector<int> v(3, 7); ?

  7. Question 7Combien d’itérations fait for (int m{1024}; m > 1; m /= 2) { ... } ?

  8. Question 8Un annuaire contient un million de noms dans l’ordre alphabétique. Pour en trouver un, on l’ouvre au milieu, on écarte la moitié où le nom ne peut pas être, et on recommence avec l’autre. Combien de fois, au plus, faut-il l’ouvrir ?

  9. Question 9Avec std::vector<std::vector<int>> t{{1, 2, 3}, {4, 5, 6}};, que valent t[1][0] et t.size() ?

  10. Question 10Un programme range les noms d’un groupe dans un vecteur et leurs notes dans un autre, de sorte que la note grades[i] est celle de names[i]. S’il ne trie que le vecteur des notes, que se passe-t-il ?