Algorithmique 1 · C1 Notions de base · Chapitre 2 · 20 min
Variables et affectation
Comprendre l'affectation comme un remplacement, et échanger le contenu de deux variables.
Une variable est un casier nommé dans la mémoire. Le nom sert à le désigner, le casier contient une valeur, et cette valeur peut changer au cours de l'exécution — d'où le nom.
Trois choses à ne jamais confondre : le nom (somme), le contenu (42), et le
type (entier). Le nom ne change jamais. Le contenu change à chaque affectation. Le type
est fixé à la déclaration et engage tout le reste.
Variables age : entier taille : réel nom : chaîne majeur : booléenUn casier peut être vide au départ : déclarer réserve la place, cela ne met rien dedans. Utiliser une variable jamais affectée, c'est lire un casier dont on ne sait pas ce qu'il contient — une des sources d'erreur les plus pénibles à diagnostiquer, parce que le programme ne plante pas forcément, il donne juste un résultat faux.
L'affectation est un remplacement, pas une équation
x ← 5 ne signifie pas « x égale 5 » mais « mets 5 dans x ». La nuance est décisive :
x ← 5x ← 8Après ces deux lignes, x vaut 8. Le 5 n'est plus nulle part. L'affectation écrase :
elle ne cohabite pas avec l'ancienne valeur, elle la détruit. Un casier ne contient qu'une
chose à la fois.
C'est ce qui rend possible une ligne comme celle-ci, qui n'a aucun sens en mathématiques :
x ← x + 1Appliquez la règle de la leçon 1 — la droite d'abord. Si x vaut 7 : on évalue 7 + 1,
ce qui donne 8, puis on range 8 dans x. La ligne se lit « augmente x de 1 ». Sans la règle
de la droite d'abord, elle ressemble à l'équation absurde ; avec elle, elle est
limpide.
Quiz · 1 question
Après x ← 5, puis y ← x, puis x ← 8, que vaut y ?
- 8, car y suit les changements de x
- 5, car y a reçu une copie de la valeur
- Rien : y n'a jamais été déclarée
Réponse : y ← x copie la VALEUR de x au moment de l'exécution. Les deux casiers restent indépendants : modifier x ensuite ne touche pas y. Il n'y a aucun lien permanent entre deux variables.
Échanger deux variables
Voici le problème le plus instructif de toute la leçon. On a a = 5 et b = 9, on veut
finir avec a = 9 et b = 5. La solution qui vient naturellement est fausse — et la
raison de son échec est exactement la propriété d'écrasement qu'on vient de voir.
Animation · 5 étapes
Échanger a et b… sans variable temporaire
- a reçoit 5 — Objectif de l'algorithme : finir avec a = 9 et b = 5.
- b reçoit 9 — État initial en place. Les deux valeurs à échanger sont 5 et 9.
- a ← b : le 5 vient d'être écrasé — L'affectation REMPLACE le contenu du casier. La valeur 5 n'existe plus nulle part, dans aucune variable. Le mal est déjà fait, même si l'erreur ne se verra qu'à l'étape suivante.
- b ← a : b reçoit… 9 — On voulait donner à b l'ancien a. Mais a ne vaut plus 5, il vaut 9. Rien ne bouge à l'écran, et c'est précisément le problème.
- Résultat : 9 et 9 — L'échange a échoué et une donnée a été perdue. On attendait 9 et 5.
Regardez bien l'étape 3. Au moment où a ← b s'exécute, la valeur 5 disparaît de la
mémoire. Elle n'est nulle part ailleurs : elle est perdue. L'étape 4 essaie de la rendre à
b, mais elle n'existe plus. On finit avec deux fois 9.
La solution demande un troisième casier, dont le seul rôle est de garder la valeur menacée le temps de l'opération.
Animation · 6 étapes
Échanger a et b avec une variable temporaire
- a reçoit 5 — Même point de départ que la version ratée, avec un casier de plus.
- b reçoit 9 — tmp existe mais ne sert pas encore.
- tmp ← a : on met 5 à l'abri — C'est toute l'astuce. Avant d'écraser a, on en garde une copie ailleurs. Copier ne vide pas la source : a vaut toujours 5.
- a ← b : a devient 9 — Le 5 de a est écrasé, exactement comme dans la version ratée — mais cette fois il est en sécurité dans tmp.
- b ← tmp : b récupère l'ancien a — tmp était le seul endroit où subsistait le 5. On le rend à b.
- Résultat : 9 et 5 — échange réussi — Trois affectations, jamais moins. Retenir l'ordre : sauvegarder, écraser, restituer.
Retenez le schéma en trois temps, il resservira au chapitre sur les tris : sauvegarder — écraser — restituer.
tmp ← aa ← bb ← tmpTrois affectations, jamais moins, et l'ordre n'est pas négociable : intervertir deux de ces lignes ramène le bug de la version ratée.
Quiz · 1 question
Pourquoi la version sans variable temporaire échoue-t-elle ?
- Parce qu'il manque une déclaration de variable
- Parce que la première affectation détruit la valeur dont la seconde a besoin
- Parce qu'on ne peut pas affecter une variable à une autre variable
Réponse : a ← b écrase le 5 avant que b ait pu le recevoir. La variable temporaire n'est pas une astuce d'écriture : c'est le seul endroit où la valeur menacée peut survivre à l'écrasement.
Quiz · 1 question
Que vaut somme après : somme ← 0 ; somme ← somme + 3 ; somme ← somme + 4 ?
- 7 — les deux ajouts cumulés
- 0 — l'initialisation seule
- 34 — les chiffres mis bout à bout
Réponse : À chaque ligne, on relit le contenu actuel de somme, on ajoute, on range le total. 0 puis 3 puis 7. C'est le mécanisme de l'accumulateur, la brique centrale de la leçon 4.
Les types
Le type d'une variable détermine les valeurs qu'elle peut contenir et les opérations qui ont un sens sur elle.
| Type | Contient | Opérations typiques |
|---|---|---|
| entier | 0, 42, −7 | +, −, ×, division entière, modulo |
| réel | 3.14, −0.5 | +, −, ×, / |
| chaîne | "bonjour" | concaténation, longueur |
| booléen | VRAI, FAUX | ET, OU, NON |
Deux pièges valent le détour. D'abord, + ne veut pas dire la même chose partout :
3 + 4 vaut 7, mais "3" + "4" vaut "34" — la même opération sur des chaînes colle les
morceaux bout à bout. Ensuite, la division entière n'est pas la division : 7 / 2 vaut 3.5
en réels, et 7 ÷ 2 vaut 3 en entiers. Cette division entière n'est pas un détail
technique ; c'est elle qui fera fonctionner la recherche dichotomique à la leçon 6.
À vous
Exercice de code
Échangez a et b avec une variable temporaire. Sans l'échange simultané de JavaScript.
Point de départ
// Échangez le contenu de a et b. // Interdit : l'écriture [a, b] = [b, a], qui masque justement le mécanisme // qu'on cherche à comprendre. Trois affectations, pas une de moins. let a = 5; let b = 9; // à compléter console.log(a, b); // attendu : 9 5
Solution
let a = 5; let b = 9; // Sauvegarder — écraser — restituer. const tmp = a; a = b; b = tmp; console.log(a, b); // 9 5
À retenir
Flashcards · 2 cartes
- Quelle est la seule façon d'échanger deux variables sans rien perdre ?
- Passer par une troisième variable : tmp ← a, puis a ← b, puis b ← tmp. Sauvegarder, écraser, restituer.
- Comment se lit x ← x + 1 ?
- On évalue la droite avec la valeur actuelle de x, puis on range le résultat dans x. Autrement dit : augmente x de 1.