Aller au contenu
Topos Uranos

Résumé

Un programme transforme des entrées en sorties, et cette leçon étudie les deux extrémités de cette transformation et ce qui peut échouer entre elles. Elle enseigne à écrire avec std::print et std::println, avec des marqueurs et des spécifications de format qui fixent la largeur, l’alignement et les décimales ; à lire des nombres avec std::cin ; à prévoir ce qui se passe quand l’utilisateur saisit autre chose que ce qui est demandé, ce qui, avec un système d’entrée comme celui de C++, ne produit pas un avertissement, mais un flux dans un état d’erreur et une variable qui contient un zéro ; et à classer les erreurs d’un programme en quatre natures, selon le moment où elles se manifestent : erreurs de compilation, d’édition de liens, d’exécution et de logique. Elle se termine par la lecture méthodique des messages du compilateur.

Objectifs d’apprentissage

  1. Écrire des programmes qui lisent des données avec std::cin et écrivent des résultats avec std::println, en utilisant des spécifications de format pour la largeur et les décimales.
  2. Prédire la sortie exacte d’un programme comportant plusieurs appels à std::print et std::println, sauts de ligne compris.
  3. Décrire ce qui se passe quand l’entrée n’a pas la forme attendue (des lettres au lieu d’un nombre) et vérifier l’état de la lecture.
  4. Classer une erreur comme erreur de compilation, d’édition de liens, d’exécution ou de logique, et la localiser à partir de sa manifestation.

Le programme et sa frontière

Dans la leçon Du problème à l’algorithme, chaque problème a été spécifié par ce qui entre et ce qui sort. Un programme réalise cette spécification : il reçoit des données, les transforme et livre des résultats. Or les données ne naissent pas à l’intérieur du programme, mais en dehors, au clavier de celui qui l’utilise, dans un fichier ou dans un autre programme ; et les résultats ne restent pas non plus à l’intérieur, mais vont vers un écran, vers un fichier ou vers un autre programme. La communication avec cet extérieur se fait par deux canaux que le système d’exploitation ouvre pour tout programme au moment de le lancer : l’entrée standard, qui dans un terminal est ce que l’on tape au clavier, et la sortie standard, qui est ce que le terminal affiche. C++ les représente comme des flux : des suites de caractères que l’on consomme ou que l’on produit dans l’ordre, l’un après l’autre.

Les deux extrémités ne sont pas symétriques. La sortie, c’est le programme qui la décide, et c’est pourquoi on peut l’écrire avec exactitude : chaque caractère qui apparaît à l’écran est celui que le programme a fait écrire. L’entrée, en revanche, c’est un autre qui la décide : le programme demande un nombre, mais la personne devant le clavier peut taper un mot, un nombre avec une virgule décimale, un nombre trop grand ou rien du tout. S’il en est ainsi, l’entrée est une frontière non fiable, et tout programme qui lit des données doit prévoir ce qu’il fera quand ce qu’il reçoit n’a pas la forme attendue. Cette leçon enseigne d’abord à écrire, puis à lire, puis ce qui se passe quand la lecture échoue, et enfin à reconnaître les erreurs, celles du programme et non celles de l’utilisateur, selon le moment où elles se manifestent.