Aller au contenu
Topos Uranos

Résumé

Cette leçon ouvre la huitième et dernière unité du cours, consacrée aux programmes plus grands. Elle en explique le but : organiser, vérifier et déboguer des programmes qui ne tiennent plus dans un fichier ni dans la tête ; elle présente ses trois leçons et le fil qui les unit, qui ferme le cercle ouvert dans la première leçon du cours (spécifier, construire, vérifier) ; elle rappelle ce que l’unité tient pour acquis, c’est-à-dire le cours entier ; elle formule le problème que l’unité résout, celui d’un programme d’un seul fichier qui fonctionne avec les données avec lesquelles on l’a testé et tait un défaut à la frontière de sa spécification ; elle anticipe la différence entre tester et démontrer ; et elle montre où elle mène, dans le projet final et dans 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, avec un exemple, la différence entre déclarer et définir une fonction, le contrat qui la spécifie et les étapes (compilation et édition de liens) qui transforment plusieurs fichiers en un programme.
  3. Anticiper, avec un exemple, la différence entre tester un programme sur quelques cas et démontrer qu’il est correct pour tous les cas admissibles.
  4. Reconnaître ce que l’on attend de savoir faire à la fin de l’unité et du cours, et le distinguer de ce que l’on apprendra dans Programmation en C++ II.

Évaluation d’entrée

Avant de parcourir l’unité, il convient de mesurer le point de départ. Cette évaluation n’est pas notée : elle oriente l’étude. Les sept premières questions vérifient ce que l’unité tient pour acquis (déclarer et définir, la précondition, le contrat d’une fonction de l’unité 6, les messages de l’éditeur de liens, les cas d’une recherche dichotomique, le tableau de suivi et la lecture hors d’un vecteur) ; les trois suivantes touchent, dans l’ordre des leçons, aux idées centrales de l’unité, et pour elles « je ne le sais pas encore » est une réponse honnête. Chaque réponse explique le point et nomme la leçon qui le traite ; les mêmes compétences sont mesurées de nouveau 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édentesQue fait la ligne int gcd(int a, int b); écrite avant main ?

  2. Question 2Des unités précédentesLa fonction toBase(n, base) a pour précondition « n >= 0 et 2 <= base <= 10 ». Qui doit la garantir ?

  3. Question 3Des unités précédentesLa fonction binarySearch(values, target) de la leçon 6.4 renvoie une position de target, ou values.size() s’il n’y est pas. Quelle est sa précondition ?

  4. Question 4Des unités précédentesUn programme compile sans erreurs et, à la construction de l’exécutable, apparaît undefined reference to `tetrahedral(int)'. Quelle étape a échoué ?

  5. Question 5Des unités précédentesLequel de ces ensembles de cas met le mieux à l’épreuve une recherche dichotomique ?

  6. Question 6Des unités précédentesQue valent a et b après int a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; } ?

  7. Question 7Des unités précédentesPourquoi std::vector<int> v{1, 2}; std::println("{}", v[2]); s’arrête-t-il avec les options du cours et, compilé seulement avec -O2, sans les détecteurs (sanitizers), peut-il écrire un nombre quelconque ?

  8. Question 8Un en-tête muni de gardes d’inclusion définit (et ne fait pas que déclarer) double scale(double x), sans inline, et main.cpp et report.cpp l’incluent. Que se passe-t-il à la construction du programme ?

  9. Question 9Une fonction réussit cinq cents tests automatisés choisis avec soin. Que peut-on affirmer ?

  10. Question 10Un point d’arrêt se trouve sur la ligne total += k;, dans une boucle, et le programme s’y arrête pour la troisième fois. Qu’indique la ligne mise en évidence ?