Lire et écrire du pseudo-code
Ce que ce chapitre apporte6 points
- Dire ce qu'est le pseudo-code et à quoi il sert par rapport au français et à un langage de programmation.
- Connaître la convention d'écriture utilisée dans ce cours : squelette, affectation, entrées et sorties.
- Lire l'indentation comme une information, et non comme une décoration.
- Reconnaître les trois seules structures dont tout algorithme est fait.
- Dérouler un algorithme à la main dans un tableau de trace, et prédire ce qu'il affiche.
- Repérer les erreurs de lecture les plus fréquentes.
Entre « je vois comment faire » et « le programme marche », il y a une étape que tout le monde saute et que tout le monde paie. Le pseudo-code est cette étape : une façon d'écrire un raisonnement assez précise pour qu'une autre personne l'exécute sans avoir à interroger son auteur, mais assez souple pour ne pas se battre avec des points-virgules. Ce chapitre fixe la convention utilisée dans tout le parcours, puis apprend à faire tourner un algorithme dans la tête.
Pourquoi ne pas écrire directement en français ?
Écrivons une recette en français : « fais chauffer l'eau, ajoute les pâtes, égoutte quand c'est cuit ». Tout le monde comprend, et pourtant rien n'est exécutable. Combien de temps ? À quelle température ? « Quand c'est cuit » veut dire quoi, exactement ?
Le français est ambigu par nature, et c'est sa qualité entre humains. Une machine, elle, n'a aucun moyen de deviner ce qu'on voulait dire.
Le pseudo-code est une écriture intermédiaire : la structure et la rigueur d'un programme, avec le vocabulaire du français. Il ne s'exécute sur aucune machine, et c'est volontaire. On y réfléchit au raisonnement sans se préoccuper de la syntaxe d'un langage particulier.
Trois façons d'écrire la même chose :
| Écriture | Ambigu ? | Exécutable ? | |
|---|---|---|---|
| Français | « Affiche le plus grand des deux nombres » | oui | non |
| Pseudo-code | Si a > b Alors Écrire a Sinon Écrire b FinSi | non | non |
| Python | print(a if a > b else b) | non | oui |
La colonne du milieu est celle qui compte pour apprendre : elle est précise sans être technique. C'est aussi celle qu'on écrit au tableau, ou sur un coin de table avec un collègue.
Le pseudo-code n'est pas un langage au rabais : c'est un langage pour les humains, qui impose la rigueur sans imposer la syntaxe. Un algorithme juste en pseudo-code se traduit ensuite dans n'importe quel langage. Un algorithme faux ne devient pas juste parce qu'on l'a écrit en Python.
La convention de ce cours
Il n'existe pas de pseudo-code officiel : chaque école a le sien. Voici celui utilisé dans tous les chapitres qui suivent. L'apprendre une fois, il ne changera plus.
Le squelette
Tout algorithme est encadré par Début et Fin. Ce qui est entre les deux est le corps de l'algorithme, décalé d'un cran vers la droite.
Une ligne qui commence par // est un commentaire : elle explique, elle ne fait rien.
Ce qu'est une variable, en une minute
Un algorithme a besoin de retenir des choses au fur et à mesure : la valeur qu'on vient de demander, un total en cours de constitution, le plus grand nombre rencontré jusqu'ici.
Une variable est l'endroit où l'on range une de ces choses. C'est une boîte munie d'une étiquette : l'étiquette est le nom, et l'on peut à tout moment regarder ce qu'il y a dedans, ou remplacer le contenu par autre chose.
Trois mots suffisent pour la suite de ce chapitre : une variable porte un nom, elle contient une valeur, et cette valeur peut changer. Le chapitre suivant lui est consacré tout entier et reviendra sur ce qu'elle peut contenir, et sur les erreurs qu'elle provoque.
Ranger une valeur : la flèche
programme principal
age ← 20 ne dit pas « age est égal à 20 », mais « mets 20 dans la boîte nommée age ». C'est une action, orientée de droite à gauche. On peut donc écrire total ← total + 1, qui serait absurde comme égalité mathématique et qui veut simplement dire « remplace le contenu de total par son contenu augmenté de 1 ».
Le signe = est réservé aux comparaisons, dans les conditions.
Faire entrer et sortir des données
Lire demande une valeur à l'utilisateur et la range dans une variable. Écrire affiche.
programme principal
aucune variable
Ce que Écrire a affiché
Quel est ton prénom ?Ce qui est entre guillemets est du texte affiché tel quel. Ce qui n'y est pas est le contenu d'une variable. La différence est la source d'erreur numéro un des débutants :
programme principal
L'indentation dit ce qui est à l'intérieur de quoi
Décaler une ligne vers la droite n'est pas de la mise en page : c'est une information. Le décalage dit à quel bloc appartient l'instruction.
programme principal
Les deux Écrire décalés sont dans le Si : ils ne s'exécutent que si la note est suffisante. Le dernier Écrire, revenu au niveau du Si, s'exécute dans tous les cas. Le déplacer d'un cran et l'algorithme change de sens.
Dans ce cours, les algorithmes affichent des filets verticaux à chaque niveau d'imbrication, et les lignes sont numérotées. Suivre un filet du regard : il montre exactement où un bloc commence et où il finit. C'est le réflexe à prendre avant de lire le détail des instructions.
Les trois seules structures
C'est le résultat le plus surprenant de l'algorithmique : tout programme, quelle que soit sa taille, se construit avec trois structures et rien d'autre.
1. La séquence : les unes après les autres
programme principal
L'ordre compte. Inverser les deux premières lignes ne change rien ici, mais déplacer le calcul avant les lectures donnerait un résultat vide de sens.
2. Le choix : selon le cas
programme principal
Une seule des deux branches s'exécute, jamais les deux. FinSi referme le bloc : sans lui, on ne saurait pas où s'arrête le choix.
Le même choix, dans l'autre notation. Le losange correspond au Si, les deux chemins aux deux branches, et le point où ils se rejoignent correspond au FinSi. Les deux écritures disent la même chose.
3. La répétition : plusieurs fois
Quand on sait combien de fois :
programme principal
Quand on sait seulement jusqu'à quand :
programme principal
Séquence, choix, répétition. Un algorithme de trois lignes et un logiciel de trois millions de lignes sont faits des mêmes trois briques, emboîtées. Quand un algorithme paraît compliqué, chercher d'abord ces trois briques : une structure apparaît là où l'on ne voyait qu'un mur de texte.
Faire tourner un algorithme à la main
Lire un algorithme ne suffit pas : il faut savoir le dérouler, c'est-à-dire jouer le rôle de la machine, une ligne à la fois, en notant ce que devient chaque variable. C'est ce qu'on appelle une trace d'exécution, et c'est l'outil qui règle 90 % des « je ne comprends pas pourquoi ça ne marche pas ».
programme principal
On construit un tableau avec une colonne par variable, une ligne par passage :
| Étape | i | somme | Commentaire |
|---|---|---|---|
| avant la boucle | (vide) | 0 | initialisation |
| tour 1 | 1 | 1 | 0 + 1 |
| tour 2 | 2 | 3 | 1 + 2 |
| tour 3 | 3 | 6 | 3 + 3 |
| tour 4 | 4 | 10 | 6 + 4 |
| après la boucle | (vide) | 10 | affiché : 10 |
Le tableau ci-dessus a été construit à la main. Celui-ci se construit tout seul, sur le même algorithme : avancer pas à pas et comparer avec ce qu'on avait prévu. Un désaccord entre les deux tableaux est toujours instructif.
programme principal
Une colonne par variable, une ligne par instruction exécutée. Ne rien anticiper : ne sauter aucun tour sous prétexte qu'« on voit bien ce que ça fait ». C'est justement dans le tour sauté que se cache l'erreur.
Les erreurs de lecture les plus fréquentes
Écrire "total" affiche le mot total. Écrire total affiche son contenu. Les guillemets changent tout.
Dans Pour i de 1 à 5, la variable i avance d'elle-même à chaque tour. Ajouter un i ← i + 1 dans le corps de la boucle la fait avancer deux fois, et la moitié des valeurs sont sautées.
programme principal
x ne bouge pas : la condition reste vraie pour toujours et l'algorithme n'en sort jamais. Avant d'écrire un TantQue, une question se pose : qu'est-ce qui, dans le corps de la boucle, finira par rendre la condition fausse ?
Du pseudo-code au vrai langage
Une fois l'algorithme juste, la traduction est mécanique. Voici la correspondance avec Python, le langage vers lequel mène le parcours, après le passage par Flowgorithm :
| Pseudo-code | Python |
|---|---|
x ← 5 | x = 5 |
Lire x | x = input() |
Écrire x | print(x) |
Si c Alors … FinSi | if c: … |
Sinon | else: |
Pour i de 1 à n | for i in range(1, n+1): |
TantQue c … FinTantQue | while c: … |
Fonction f(a) … FinFonction | def f(a): … |
| indentation | indentation (obligatoire en Python) |
Notons la dernière ligne : ce que le pseudo-code fait par convention, Python l'impose. Les habitudes prises ici se paieront directement là-bas.
Exercices type
Que produit cet algorithme ?
programme principal
Traçons d'exécution :
| Étape | a | b |
|---|---|---|
| après ligne 2 | 3 | (vide) |
| après ligne 3 | 3 | 4 |
| après ligne 4 | 7 | 4 |
| après ligne 5 | 7 | 3 |
Affichage : 7 3. L'algorithme échange presque les deux valeurs : il faudrait une troisième affectation a ← a - b pour terminer l'échange.
Combien de fois « Bonjour » est-il affiché ?
programme principal
La boucle intérieure fait 2 tours, et elle est relancée à chaque tour de la boucle extérieure, qui en fait 3.
3 × 2 = 6 affichages. Les filets verticaux montrent que le second Pour est bien à l'intérieur du premier.
Corriger cet algorithme
programme principal
Deux défauts :
in'est jamais initialisée : la condition compare une variable qui n'a pas de valeur.in'est jamais modifiée dans la boucle : même initialisée, la boucle ne s'arrêterait pas.
Version corrigée :
programme principal
Traduire en pseudo-code : afficher si un nombre est pair
programme principal
MOD donne le reste de la division entière. Un nombre est pair si son reste dans la division par 2 vaut 0.
Vérification
1.total ← total + 1 serait absurde comme égalité mathématique. Que veut dire cette ligne ?
2.Écrire "total" et Écrire total affichent quoi ?
3.À quoi sert l'indentation dans un algorithme ?
4.Quand employer un Pour plutôt qu'un TantQue ?
5.Dans un tableau de trace, que met-on en colonnes ?
La méthode
- Repérer les trois structures avant de lire le détail : ce qui s'enchaîne, ce qui choisit, ce qui se répète. Tout pseudo-code se ramène à ces trois-là.
- Lire l'indentation en premier. Elle dit ce qui est à l'intérieur de quoi, et une erreur de lecture vient presque toujours de là.
- Dérouler à la main en tenant un tableau : une colonne par variable, une ligne par instruction exécutée.
- Noter la valeur après chaque affectation, sans sauter de ligne. Sauter une ligne est exactement ce qui fait manquer l'erreur.
- Contrôler le nombre de tours d'une répétition en comptant les bornes, avant de conclure sur le résultat.
- Traduire en dernier, une fois l'algorithme déroulé et vérifié.
Synthèse
- Le pseudo-code est précis comme un programme, lisible comme du français, et ne s'exécute nulle part. C'est fait exprès.
- Il n'y a pas de norme universelle : c'est la convention de ce cours qu'il faut connaître.
←range une valeur dans une variable, de droite à gauche.=compare.- Les guillemets distinguent le texte affiché tel quel du contenu d'une variable.
- L'indentation dit ce qui est à l'intérieur de quoi. Ce n'est pas de la mise en page.
- Tout algorithme se construit avec trois structures : séquence, choix, répétition.
- La trace d'exécution (une colonne par variable, une ligne par passage) est l'outil qui répond à « pourquoi ça ne fait pas ce que je veux ».
- Avant d'écrire un
TantQue, se demander ce qui rendra la condition fausse.
Mettre en pratique
Passer du pseudo-code au Python, ligne à ligne.
- Traduire une séquence1 · Débuter
- Traduire une lecture et un calcul1 · Débuter
- Traduire une condition2 · Fonctions
- Traduire trois cas2 · Fonctions
- Traduire une boucle Pour2 · Fonctions
- Traduire un accumulateur3 · Confirmé
- Traduire une boucle TantQue3 · Confirmé
- Traduire une fonction3 · Confirmé
Remettre les instructions d'un algorithme dans le bon ordre.
- Un message en trois temps1 · Débuter
- Majeur ou mineur2 · Fonctions
- La somme de 1 à n2 · Fonctions
- Redemander jusqu'à une saisie valide3 · Confirmé
- Une fonction et son appel3 · Confirmé
- Compter les notes suffisantes4 · Avancé