Module 03 · Leçon 3
Modes de transfert : par valeur et par variable
Ce que vous saurez faire
- Distinguer passage par valeur et passage par variable
- Choisir le bon mode selon l'intention
- Repérer le mot-clé VAR en Pascal
Avant de commencer
Vous écrivez une procédure Echanger(a, b). Vous testez : Echanger(x, y),
puis vous affichez x et y — elles n'ont pas été échangées ! Pourquoi ?
1. Deux modes de transfert
En Pascal, le mode par défaut est par valeur. Pour passer par variable,
on préfixe le paramètre par VAR.
2. Exemple : par valeur (par défaut)
DEF PROC Doubler(x : entier)
Début
x ← x * 2
Ecrire("Dans proc x = ", x)
Fin Doubler
{ Programme principal }
y ← 5
Doubler(y)
Ecrire("Après proc y = ", y)
DEF PROC Doubler(x : entier)
Début
x ← x * 2
Ecrire("Dans proc x = ", x)
Fin Doubler
{ Programme principal }
y ← 5
Doubler(y)
Ecrire("Après proc y = ", y)
PROCEDURE Doubler(x : integer);
BEGIN
x := x * 2;
Writeln('Dans proc x = ', x);
END;
BEGIN
y := 5;
Doubler(y);
Writeln('Après proc y = ', y);
END.
Sortie :
Dans proc x = 10
Après proc y = 5
y n'a pas changé : la modification de x était locale à la procédure.
3. Exemple : par variable (mode VAR)
DEF PROC Doubler(VAR x : entier)
Début
x ← x * 2
Fin Doubler
{ Programme principal }
y ← 5
Doubler(y)
Ecrire("Après proc y = ", y)
DEF PROC Doubler(VAR x : entier)
Début
x ← x * 2
Fin Doubler
{ Programme principal }
y ← 5
Doubler(y)
Ecrire("Après proc y = ", y)
PROCEDURE Doubler(VAR x : integer);
BEGIN
x := x * 2;
END;
BEGIN
y := 5;
Doubler(y);
Writeln('Après proc y = ', y);
END.
Sortie : Après proc y = 10. Cette fois, y a été modifié.
4. Choix du mode
| Intention | Mode |
|---|---|
| Lire une donnée, ne pas la modifier | Par valeur |
| Modifier la variable de l'appelant | VAR |
| Retourner plusieurs valeurs | VAR (sur chacune) |
| Tableau / chaîne / enregistrement (perf) | VAR (évite la copie) |
| Fichier (toujours) | VAR obligatoire |
5. Échange : la procédure classique
PROCEDURE Echanger(VAR a, b : integer);
VAR
temp : integer;
BEGIN
temp := a;
a := b;
b := temp;
END;
BEGIN
x := 3; y := 7;
Echanger(x, y);
Writeln(x, ' ', y); { affiche : 7 3 }
END.
Sans VAR, l'échange n'aurait été visible que dans la procédure.
6. Retourner plusieurs valeurs
Une fonction ne retourne qu'une valeur. Pour en retourner plusieurs,
on utilise une procédure avec plusieurs paramètres VAR.
PROCEDURE DiviserAvecReste(a, b : integer; VAR q, r : integer);
BEGIN
q := a DIV b;
r := a MOD b;
END;
BEGIN
DiviserAvecReste(17, 5, quotient, reste);
Writeln(quotient, ' reste ', reste); { 3 reste 2 }
END.
a, b en par valeur (entrées) ; q, r en VAR (sorties).
7. Exercices
Écrire une procédure Incrementer(VAR n : entier) qui ajoute 1 à n.
Tester en l'appelant 3 fois sur la même variable.
Voir le corrigé
PROCEDURE Incrementer(VAR n : integer);
BEGIN
n := n + 1;
END;
BEGIN
x := 0;
Incrementer(x);
Incrementer(x);
Incrementer(x);
Writeln(x); { 3 }
END.
Écrire une procédure MinMax(T : Tableau; n : entier; VAR min, max : entier)
qui détermine le minimum et le maximum d'un tableau de n entiers.
Voir le corrigé
PROCEDURE MinMax(T : Tab; n : integer; VAR min, max : integer);
VAR
i : integer;
BEGIN
min := T[1];
max := T[1];
FOR i := 2 TO n DO
BEGIN
IF T[i] < min THEN min := T[i];
IF T[i] > max THEN max := T[i];
END;
END;
Le tableau peut être passé par VAR aussi pour la performance, mais ici
on ne le modifie pas — par valeur est sémantiquement plus clair.
Écrire Rotation(VAR a, b, c : entier) qui effectue : la valeur de a
va dans b, l'ancienne valeur de b va dans c, l'ancienne valeur de
c va dans a.
Voir le corrigé
PROCEDURE Rotation(VAR a, b, c : integer);
VAR
temp : integer;
BEGIN
temp := c;
c := b;
b := a;
a := temp;
END;
{ Test : a=1, b=2, c=3 → après : a=3, b=1, c=2 }
8. Erreurs fréquentes au bac
- Oublier
VARquand on veut modifier une variable de l'appelant. - Mettre
VARpartout (même quand par valeur suffit) : code peu sûr. - Passer un littéral à un paramètre
VAR:Echanger(3, 5);est interdit (3 et 5 ne sont pas des variables).
9. Quiz
Quiz (5 questions)
Sans VAR, modifier `x` dans une procédure :
Pour échanger deux variables `x` et `y` via une procédure, les paramètres formels doivent être :
Une procédure peut retourner plusieurs valeurs via :
`Echanger(3, 5);` est :
Pour passer un grand tableau efficacement à une procédure de lecture seule :