Aller au contenu
Topos Uranos

Résumé

Cette leçon ouvre la cinquième unité du cours, consacrée aux fonctions. Elle explique à quoi sert l’unité : enseigner à décomposer un problème en parties nommées, chacune avec une interface et un contrat, et à résoudre certains problèmes en les ramenant à une instance plus petite d’eux-mêmes, par récursivité ; elle présente ses quatre leçons et le fil qui les relie ; elle rappelle ce que l’unité tient pour acquis, surtout les boucles de l’unité 4 et leurs invariants ; elle formule le problème que l’unité résout, celui d’un programme qui répète le même calcul copié et qui, à cause d’une inattention dans la copie, répond faux sans que le compilateur dise rien ; elle anticipe le contrat (la précondition et la postcondition) comme la forme sous laquelle l’unité spécifiera chaque partie ; 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 algorithmes de l’unité 4 (la trace d’une boucle, son invariant et son variant) et les revoir si nécessaire.
  3. Anticiper, sur un exemple, l’idée de contrat : ce qu’une partie du programme exige de celui qui l’utilise et ce qu’elle lui garantit en échange.
  4. Reconnaître ce que l’on attend de savoir faire à la fin de l’unité, et le distinguer de ce qui s’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 cinq premières questions vérifient ce que l’unité tient pour acquis : la trace d’une boucle, son invariant, la précondition d’une spécification, la copie d’une valeur lors de l’initialisation et la recherche, dans un programme de l’unité 4, d’un calcul qui a ses propres entrées et sorties. Les cinq suivantes touchent, dans l’ordre des leçons, aux idées centrales de l’unité : la pile d’appels, le passage d’un argument, la séparation entre le calcul et la présentation, la définition récursive de la factorielle et l’exécution d’une fonction qui s’appelle elle-même. 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édentesQu’écrit int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c); ?

  2. Question 2Des unités précédentesDans la boucle int total{0}; int k{1}; while (k <= n) { total += k; ++k; }, avec n≥0n \geq 0, quelle relation est vraie chaque fois qu’on évalue la condition ?

  3. Question 3Des unités précédentesLa spécification de la division dit : « étant donné des entiers a≥0a \geq 0 et b>0b > 0, obtenir qq et rr avec a=b⋅q+ra = b \cdot q + r et 0≤r<b0 \leq r < b ». Quelle est sa précondition ?

  4. Question 4Des unités précédentesAprès int a{3}; int b{a}; b = 7;, que vaut a ?

  5. Question 5Des unités précédentesLe programme de la leçon 4.4 qui écrit les nombres premiers inférieurs à 100 a une boucle qui parcourt les candidats et, à l’intérieur, une autre qui essaie leurs diviseurs. Quelle partie est un calcul qui a ses propres entrées et sorties, qu’il conviendrait de nommer ?

  6. Question 6Un programme commence dans main ; main appelle une fonction g, et g appelle une autre fonction h. Pendant que h s’exécute, quels appels sont en cours ?

  7. Question 7Avec la fonction int f(int x) { x = x + 1; return x; }, qu’écrit int a{3}; int b{f(a)}; std::println("{} {}", a, b); ?

  8. Question 8Un programme lit une date et doit écrire son jour de la semaine. Quelle décomposition sépare le calcul de la présentation ?

  9. Question 9Laquelle des définitions suivantes définit n!n! pour tout entier naturel nn ?

  10. Question 10Avec int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }, qu’écrit std::println("{}", f(3)); ?