Séance 1 — Variables et affectation

Nommer, ranger, calculer, lire et écrire

Dr. El Hadji Bassirou TOURÉ

Département de Mathématiques et Informatique, Faculté des Sciences et Techniques, Université Cheikh Anta Diop de Dakar

Objectifs de la séance

Ce que la séance construit

La variable, case nommée qui garde une valeur d’un type donné : sa déclaration, l’affectation \(\leftarrow\) qui y range une valeur, Lire et Écrire qui relient l’algorithme au clavier et à l’écran, les expressions qui calculent avec \(+\), \(-\), \(\times\), \(/\), div et mod. Chaque algorithme est suivi pas à pas dans une trace d’exécution : la ligne exécutée, l’état des variables, ce qu’écrit Écrire.

  • Déclarer une variable avec son type : entier, réel, booléen, caractère, chaîne.
  • Lire une affectation de droite à gauche ; dire ce que devient l’ancienne valeur.
  • Prévoir ce qu’écrit Écrire et ce que range Lire.
  • Évaluer une expression selon les priorités ; distinguer \(/\) de div, et div de mod.
  • Dérouler un algorithme dans une trace complète : pas, ligne, variables, écrit.
  • Échanger deux variables ; repérer une variable sans valeur, une flèche inversée, un type faux.

Les conventions du pseudo-code : les variables

écriture sens
Algorithme Nom / Variables / Début / Fin en-tête (nom à initiale majuscule, sans accent : Duree), déclarations (absentes s’il n’y a pas de variable), instructions
x : entier ; a, b : réel déclaration : nom et type ; un type par ligne
650 ; 12,5 ; vrai ; 'B' ; "Awa" entier, réel (virgule), booléen, caractère, chaîne
\(x\leftarrow e\) \(x\) reçoit la valeur de \(e\) (lire « \(x\) reçoit \(e\) ») ; l’ancienne valeur est perdue
Lire n n reçoit la valeur tapée au clavier, une valeur par ligne
Écrire "prix :", p écrit les valeurs séparées par une espace, puis passe à la ligne : prix : 650
réel lu ou écrit ; booléen écrit virgule, au moins une décimale (13,5, 12,0) ; écrit : la plus courte écriture de la valeur rangée en machine (au plus 17 chiffres significatifs) ; entier tapé pour un réel : 20 devient 20,0 ; vrai ou faux
// texte commentaire jusqu’à la fin de la ligne ; ignoré à l’exécution
retrait de 2 espaces sous Variables et entre Début et Fin

Un nom de variable commence par une lettre, suivie de lettres ou de chiffres, sans espace ni accent : prix, n1, b5000.

Les conventions du pseudo-code : les calculs

écriture sens
\(+\ -\ \times\ /\) opérations ; \(/\) donne toujours un réel : \(6/3\) donne 2,0
div, mod quotient et reste de la division entière de deux entiers : \(7\) div \(2=3\), \(7\) mod \(2=1\)
priorités \(\times\), \(/\), div, mod avant \(+\), \(-\) ; à égalité, de gauche à droite ; parenthèses d’abord
type d’un résultat entier si tous les opérandes sont entiers (sauf \(/\)), réel sinon ; un entier rangé dans un réel devient un réel (5 donne 5,0)
erreur : arrêt de l’exécution variable sans valeur utilisée ; division par zéro (\(/\), div, mod) ; valeur d’un autre type que la variable (un réel dans un entier)
trace une ligne par pas : ligne exécutée, valeurs après le pas ; en-tête, déclarations, Début, Fin : aucun pas
forme courte instructions seules, numérotées à partir de 1 ; en-tête, partie Variables, Début, Fin sous-entendus ; un tableau (Séance 4) se déclare parmi les instructions (un pas) ; Début et Fin reviennent en Séance 5 (programme principal)

Les deux formes donnent la même trace tant que chaque valeur est du type de sa variable. Sans déclarations, la forme courte n’a pas de contrôle de type ; dans les séances suivantes, chaque variable garde le type de sa première valeur.

La variable, une case nommée

Au marché Tilène, pour payer 3 kg d’oignons à 650 F le kilo (prix illustratif), il faut retenir le prix du kilo, puis le multiplier : un algorithme range ce qu’il retient dans des variables.

Variable

Une variable est une case de la mémoire désignée par un nom ; elle contient une valeur d’un type fixé à la déclaration, et garde cette valeur jusqu’à ce qu’une instruction en range une autre.

Lecture. Cinq variables, cinq types. Une variable déclarée n’a pas encore de valeur : sa case est vide jusqu’à la première affectation ou au premier Lire.

Les cinq types

type valeurs exemples opérations de la séance
entier nombres sans partie décimale 650, 0, -15 \(+\), \(-\), \(\times\), div, mod ; \(/\) donne un réel
réel nombres à virgule 12,5, 0,03, 12,0 \(+\), \(-\), \(\times\), \(/\)
booléen deux valeurs vrai, faux rangées, écrites (calculées en Séance 2)
caractère un seul symbole, entre apostrophes 'B', '7' rangés, écrits
chaîne suite de caractères, entre guillemets "Awa", "à payer :" rangées, écrites

Même écriture, types différents

12 est un entier, 12,0 un réel : même nombre, deux types. '7' est un caractère et "650" une chaîne : ni l’un ni l’autre n’est un nombre, et aucun calcul ne s’y applique.

Lecture. Le type dit quelles valeurs la case accepte et quelles opérations ont un sens : on multiplie deux prix, on ne multiplie pas deux noms.

La structure d’un algorithme

Algorithme Marche
// prix d'un achat au marché
Variables
  prix, qte, total : entier   // prix en F, qte en kg
Début
  Lire prix
  Lire qte
  total ← prix × qte          // le prix à payer
  Écrire "à payer :", total
Fin

Trois parties

  • ligne 1 : l’en-tête, le nom ;
  • lignes 3–4 : la partie Variables, une déclaration par type ;
  • lignes 5–10 : les instructions, entre Début et Fin, une par ligne, dans l’ordre ;
  • après // : un commentaire, pour le lecteur, ignoré à l’exécution.

Lecture. Seules les lignes 6 à 9 s’exécutent : elles seules produisent un pas dans une trace. Le retrait de deux espaces montre ce qui appartient à Variables et au corps.

L’affectation

Une variable reçoit une valeur de deux façons : par une affectation, ou par Lire.

\(x\leftarrow e\)

Calculer la valeur de l’expression \(e\) avec les valeurs actuelles des variables, puis la ranger dans \(x\). L’ancienne valeur de \(x\) est perdue ; les variables de \(e\) ne changent pas.

Lecture. La flèche va de droite à gauche : la valeur calculée à droite entre dans la case nommée à gauche. À gauche de \(\leftarrow\), toujours une seule variable ; à droite, une expression : 5, b, a + 1, prix × qte.

Lire et Écrire

{Lire \(x\)}

L’exécution attend une valeur tapée au clavier et la range dans \(x\), comme une affectation. Une valeur par Lire, de la forme du type de \(x\) : 650, 12,5, Awa (une chaîne se tape sans guillemets).

{Écrire \(e_1\), \(e_2\), …}

Écrit les valeurs des expressions, séparées par une espace, puis passe à la ligne. Un texte entre guillemets est écrit tel quel, sans les guillemets ; Écrire ne modifie aucune variable.

instruction valeurs ligne écrite
Écrire “à payer :”, total total \(=\) 1950 à payer : 1950
Écrire “moyenne :”, moy moy \(=\) 12,0 moyenne : 12,0
Écrire nom, classe, prix, paye nom \(=\) "Awa", classe \(=\) 'B', prix \(=\) 3500, paye \(=\) faux Awa B 3500 faux
Écrire a, b a \(=\) 8, b \(=\) 3 8 3

Lecture. Un réel s’écrit avec une virgule et au moins une décimale, un booléen par vrai ou faux ; les espaces de la ligne écrite viennent des séparateurs et des textes.

Premier algorithme, pas à pas : le prix au marché

Entrée au clavier : 650 ; 3

Écrit par Écrire \(\rightarrow\)

à payer : 1950

Lecture. Ligne 5 : Lire prix ; l’entrée au clavier donne prix \(=\) 650.

Lecture. Ligne 6 : Lire qte ; l’entrée au clavier donne qte \(=\) 3.

Lecture. Ligne 7 : total reçoit prix × qte, soit 650 × 3 \(=\) 1950.

Lecture. Ligne 8 : Écrire écrit « à payer : 1950 » ; l’algorithme est terminé. Les lignes 1 à 4 et la ligne 9 ne produisent aucun pas : l’en-tête, les déclarations, Début et Fin ne s’exécutent pas.

Affectations successives, pas à pas

Écrit par Écrire \(\rightarrow\)

17 9

Lecture. Ligne 5 : a reçoit 5.

Lecture. Ligne 6 : b reçoit a + 3, soit 5 + 3 \(=\) 8.

Lecture. Ligne 7 : a ← b × 2, soit 8 × 2 \(=\) 16 ; a passe de 5 à 16. b garde 8 : la ligne 6 a rangé une valeur dans b, pas un lien avec a.

Lecture. Ligne 8 : a ← a + 1, soit 16 + 1 \(=\) 17 ; a passe de 16 à 17. a figure des deux côtés : la droite est calculée avec l’ancienne valeur, 16, puis rangée dans a.

Lecture. Ligne 9 : b ← a - b, soit 17 - 8 \(=\) 9 ; b passe de 8 à 9.

Lecture. Ligne 10 : Écrire écrit « 17 9 » ; l’algorithme est terminé. a a reçu trois valeurs, 5, 16 et 17 : seule la dernière reste.

Exercice : affectations successives

Algorithme Calcul
Variables
  x, y, z : entier
Début
  x ← 4
  y ← x × 3
  z ← y - x
  x ← z + y
  y ← y + 1
  z ← x mod y
  Écrire x, y, z
Fin

Trois variables, six affectations

  1. Donner les valeurs de x, y et z après chaque ligne de 5 à 10.
  2. Qu’écrit l’algorithme ?
  3. Quelle valeur de x est perdue, et à quelle ligne ?
  4. On échange les lignes 9 et 10. Qu’écrit l’algorithme ?

Exercice : affectations successives, correction

Algorithme Calcul
Variables
  x, y, z : entier
Début
  x ← 4
  y ← x × 3
  z ← y - x
  x ← z + y
  y ← y + 1
  z ← x mod y
  Écrire x, y, z
Fin

Correction

ligne x y z
5 4
6 4 12
7 4 12 8
8 20 12 8
9 20 13 8
10 20 13 7
  1. Une ligne, une variable modifiée (case verte) ; les autres gardent leur valeur.
  2. 20 13 7 : \(20\) mod \(13=7\).
  3. 4, à la ligne 8, qui range \(8+12=20\) dans x.
  4. 20 13 8 : z reçoit \(20\) mod \(12=8\), y valant encore 12 ; l’ordre compte.

L’échange de deux variables : une version fautive

Entrée au clavier : 3 ; 8

Écrit par Écrire \(\rightarrow\)

8 8

Lecture. Ligne 5 : Lire a ; l’entrée au clavier donne a \(=\) 3.

Lecture. Ligne 6 : Lire b ; l’entrée au clavier donne b \(=\) 8.

Lecture. Ligne 7 : a ← b ; a passe de 3 à 8, la valeur de b.

Lecture. Ligne 8 : b ← a ; b reçoit la valeur de a, 8, qu’elle avait déjà. La valeur 3 a disparu au pas 3 : plus aucune variable ne la contient.

Lecture. Ligne 9 : Écrire écrit « 8 8 » ; l’algorithme est terminé. Les deux variables valent 8 : l’échange a échoué.

L’échange par une variable temporaire, pas à pas

Entrée au clavier : 3 ; 8

Écrit par Écrire \(\rightarrow\)

8 3

Lecture. Ligne 5 : Lire a ; l’entrée au clavier donne a \(=\) 3.

Lecture. Ligne 6 : Lire b ; l’entrée au clavier donne b \(=\) 8.

Lecture. Ligne 7 : tmp reçoit la valeur de a, soit 3. tmp garde une copie de a avant que la ligne 8 ne l’écrase.

Lecture. Ligne 8 : a ← b ; a passe de 3 à 8, la valeur de b.

Lecture. Ligne 9 : b ← tmp ; b passe de 8 à 3, la valeur de tmp.

Lecture. Ligne 10 : Écrire écrit « 8 3 » ; l’algorithme est terminé. Trois affectations et une variable de plus : a et b ont échangé leurs valeurs.

Les expressions et leurs priorités

À droite de \(\leftarrow\), une expression combine des valeurs et des variables par des opérateurs ; son évaluation suit des priorités, comme en calcul.

opérateurs priorité exemple (\(a=7\), \(b=2\))
( … ) d’abord (a + b) × 3 donne 27
\(\times\)  \(/\)  div  mod puis, de gauche à droite a + b × 3 donne 13 ; a × b div 3 donne 4
\(+\)  \(-\) enfin, de gauche à droite a - b - 1 donne 4

La division réelle donne toujours un réel

a / b donne 3,5 ; 6 / 3 donne 2,0, et non 2. Pour un résultat entier, il faut div : a div b donne 3. Un réel rangé dans une variable entière arrête l’exécution.

Lecture. Dans le doute, des parenthèses : elles ne coûtent rien et disent l’ordre voulu.

La division entière : div et mod

{\(a\) div \(b\) et \(a\) mod \(b\), pour deux entiers \(a\geq0\) et \(b>0\)}

\(q=a\) div \(b\) est le nombre de fois que \(b\) tient entièrement dans \(a\) ; \(r=a\) mod \(b\) est ce qui reste : \(a=b\times q+r\), avec \(0\leq r<b\).

Une durée en minutes devient des heures et des minutes ; une somme devient des billets et un reste ; n mod 10 donne le chiffre des unités de \(n\), n div 10 le nombre sans ce chiffre.

Lecture. div et mod s’appliquent à deux entiers ; un diviseur nul arrête l’exécution, comme pour \(/\).

Conversion d’une durée, pas à pas

Entrée au clavier : 263

Écrit par Écrire \(\rightarrow\)

263 min = 4 h 23 min

Lecture. Ligne 5 : Lire duree ; l’entrée au clavier donne duree \(=\) 263.

Lecture. Ligne 6 : h reçoit duree div 60, soit 263 div 60 \(=\) 4.

Lecture. Ligne 7 : mn reçoit duree mod 60, soit 263 mod 60 \(=\) 23.

Lecture. Ligne 8 : Écrire écrit « 263 min = 4 h 23 min » ; l’algorithme est terminé. Vérification : \(60\times4+23=263\).

Rendu de monnaie, pas à pas

Entrée au clavier : 17500

Écrit par Écrire \(\rightarrow\)

3 1 0 500

Lecture. Ligne 5 : Lire r ; l’entrée au clavier donne r \(=\) 17500. r : la somme qui reste à rendre ; chaque mod la remplace par un reste.

Lecture. Ligne 6 : b5000 reçoit r div 5000, soit 17500 div 5000 \(=\) 3.

Lecture. Ligne 7 : r ← r mod 5000, soit 17500 mod 5000 \(=\) 2500 ; r passe de 17500 à 2500.

Lecture. Ligne 8 : b2000 reçoit r div 2000, soit 2500 div 2000 \(=\) 1.

Lecture. Ligne 9 : r ← r mod 2000, soit 2500 mod 2000 \(=\) 500 ; r passe de 2500 à 500.

Lecture. Ligne 10 : b1000 reçoit r div 1000, soit 500 div 1000 \(=\) 0.

Lecture. Ligne 11 : r ← r mod 1000, soit 500 mod 1000 \(=\) 500 ; r reçoit 500, la valeur qu’elle avait déjà.

Lecture. Ligne 12 : Écrire écrit « 3 1 0 500 » ; l’algorithme est terminé. 3 billets de 5000 F, 1 de 2000 F, aucun de 1000 F, 500 F en pièces ou en billet de 500 F : \(15000+2000+500=17500\).

Moyenne de trois notes, pas à pas

Entrée au clavier : 12 ; 15 ; 9

Écrit par Écrire \(\rightarrow\)

moyenne : 12,0

Lecture. Ligne 6 : Lire n1 ; l’entrée au clavier donne n1 \(=\) 12.

Lecture. Ligne 7 : Lire n2 ; l’entrée au clavier donne n2 \(=\) 15.

Lecture. Ligne 8 : Lire n3 ; l’entrée au clavier donne n3 \(=\) 9.

Lecture. Ligne 9 : moy reçoit (n1 + n2 + n3) / 3, soit (12 + 15 + 9) / 3 \(=\) 12,0. / donne un réel, même quand la division tombe juste : 12,0 et non 12.

Lecture. Ligne 10 : Écrire écrit « moyenne : 12,0 » ; l’algorithme est terminé.

Exercice : une durée en secondes

Algorithme Chrono
Variables
  t, h, mn, s : entier
Début
  Lire t
  h ← t div 3600
  t ← t mod 3600
  mn ← t div 60
  s ← t mod 60
  Écrire h, "h", mn, "min", s, "s"
Fin

Temps d’une course, en secondes (illustratif)

  1. Pour l’entrée 8125, donner les valeurs de t, h, mn et s après chaque ligne.
  2. Qu’écrit l’algorithme pour 3600 ? Pour 59 ?
  3. On supprime la ligne 7. Qu’écrit l’algorithme pour 8125 et pour 3600 ?
  4. Quelle expression redonne la durée lue à partir de h, mn et s ?

Exercice : une durée en secondes, correction

Algorithme Chrono
Variables
  t, h, mn, s : entier
Début
  Lire t
  h ← t div 3600
  t ← t mod 3600
  mn ← t div 60
  s ← t mod 60
  Écrire h, "h", mn, "min", s, "s"
Fin

Correction

t lu h mn s sans la ligne 7
8125 2 15 25 2 h 135 min 25 s
3600 1 0 0 1 h 60 min 0 s
59 0 0 59 0 h 0 min 59 s
  1. \(8125\) div \(3600=2\) ; la ligne 7 range dans t le reste, 925 ; \(925\) div \(60=15\), \(925\) mod \(60=25\).
  2. 1 h 0 min 0 s et 0 h 0 min 59 s : un quotient nul est un résultat.
  3. Sans la ligne 7, mn compte toutes les minutes, heures comprises (case orange).
  4. h × 3600 + mn × 60 + s : \(7200+900+25=8125\).

Quoi, pourquoi, quand ça échoue : l’affectation

Les erreurs de la séance viennent presque toutes d’une lecture fausse de la flèche.

Quoi

\(x\leftarrow e\) est un ordre, exécuté une fois, de droite à gauche : calculer \(e\), puis ranger le résultat dans \(x\). Ce n’est pas une égalité : a \(\leftarrow\) b et b \(\leftarrow\) a sont deux instructions différentes, et n \(\leftarrow\) n + 1 augmente n de 1.

Pourquoi les types et les valeurs initiales

Une expression n’est calculable que si chacune de ses variables a une valeur ; le résultat doit être du type de la variable qui le reçoit.

Quand ça échoue

total \(\leftarrow\) total + achat sans valeur initiale de total : arrêt. part \(\leftarrow\) somme / 4 avec part entière : arrêt, il faut div. (n1 + n2 + n3) / 3 sans parenthèses : seule n3 est divisée. a \(\leftarrow\) b, puis b \(\leftarrow\) a : deux copies de b, pas un échange.

Une variable sans valeur, pas à pas

Entrée au clavier : 2500

Écrit par Écrire \(\rightarrow\)

arrêt : total sans valeur

Lecture. Ligne 5 : Lire achat ; l’entrée au clavier donne achat \(=\) 2500.

Lecture. Ligne 6 : total + achat demande la valeur de total, qui n’en a reçu aucune : arrêt de l’exécution. Déclarer une variable ne lui donne pas de valeur : il fallait total \(\leftarrow\) 0 avant la ligne 6.

Exercice : types et priorités

Algorithme Ponderee
Variables
  d, e : entier
  m : réel
Début
  Lire d
  Lire e
  m ← (d + 2 × e) / 3
  Écrire "moyenne :", m
Fin

Devoir d (coefficient 1), examen e (coefficient 2)

  1. Qu’écrit l’algorithme pour 12 et 15 ?
  2. Avec \(d=12\) et \(e=15\), valeur et type de d + 2 × e, puis de cette somme / 3, div 3 et mod 3.
  3. La ligne 8 devient m \(\leftarrow\) d + 2 × e / 3. Qu’écrit l’algorithme ?
  4. La partie Variables devient d, e, m : entier (une ligne). Que se passe-t-il à la ligne 7 ? Que faut-il écrire ?

Exercice : types et priorités, correction

Algorithme Ponderee
Variables
  d, e : entier
  m : réel
Début
  Lire d
  Lire e
  m ← (d + 2 × e) / 3
  Écrire "moyenne :", m
Fin

Correction

expression valeur type
d + 2 × e 42 entier
(d + 2 × e) / 3 14,0 réel
<code>(d + 2 × e) div 3</code> 14 entier
<code>(d + 2 × e) mod 3</code> 0 entier
d + 2 × e / 3 22,0 réel
  1. moyenne : 14,0 : \((12+30)/3\), un réel.
  2. Seule \(/\) donne un réel ; div et mod donnent des entiers.
  3. moyenne : 22,0 : \(2\times15/3\) est calculé d’abord, puis ajouté à 12 (case orange).
  4. Arrêt : 14,0 est un réel. Écrire (d + 2 × e) div 3 ; pour 13 et 15, div donne 14 et perd la partie décimale de \(43/3\).

À retenir

instruction effet pas arrêt possible
x : entier crée la case x, sans valeur aucun —
\(x\leftarrow e\) calcule \(e\), range la valeur dans \(x\) 1 variable sans valeur, division par zéro, type
Lire x range dans x la valeur tapée 1 valeur d’un autre type
Écrire \(e_1\), \(e_2\) écrit les valeurs, passe à la ligne 1 variable sans valeur, division par zéro

À retenir

  • Une variable : un nom, un type, une valeur ; une affectation remplace la valeur, l’ancienne est perdue.
  • \(x\leftarrow e\) se lit de droite à gauche ; n \(\leftarrow\) n + 1 n’est pas une équation.
  • Échanger deux variables demande une troisième : tmp \(\leftarrow\) a, a \(\leftarrow\) b, b \(\leftarrow\) tmp.
  • \(/\) donne un réel ; div et mod donnent quotient et reste : \(a=b\times q+r\), \(0\leq r<b\).
  • Une trace : une ligne par pas, la ligne exécutée, les valeurs après le pas, ce qui est écrit.

Prochaine séance

Séance 2 — Les conditions

Jusqu’ici, toutes les lignes s’exécutent, une fois chacune, dans l’ordre. Une condition, comparaison de valeurs dont le résultat est un booléen, décide des lignes à exécuter : Si … Alors … Sinon … FinSi ; les conditions se combinent par ET, OU, NON.

À préparer : pour un achat de 15000 F, puis de 25000 F, calculer à la main le prix à payer quand la livraison coûte 1000 F mais est offerte à partir de 20000 F d’achat ; relever ce qui change d’un cas à l’autre.

Références

  • Cormen — Algorithms Unlocked, MIT Press, 2013 (ch. 1, « What Are Algorithms and Why Should You Care? », et ch. 2, « How to Describe and Evaluate Computer Algorithms » : pseudo-code, variables et affectation).
  • Cormen, Leiserson, Rivest, Stein — Introduction to Algorithms, 4e éd., MIT Press, 2022 (ch. 2, « Getting Started », § 2.1 : conventions du pseudo-code, affectation, variables).
  • Bhargava — Grokking Algorithms, 2e éd., Manning, 2024 (ch. 1, « Introduction to Algorithms »).
  • Notes de cours en ligne : CS50 (Harvard), 6.100A (MIT), CS106A (Stanford), séances sur les variables, les types et les expressions.