Aller au contenu principal

Module 03 · Leçon 3

Modes de transfert : par valeur et par variable

180 minanalyse · pascal
Affichage du code

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)

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)

Sortie : Après proc y = 10. Cette fois, y a été modifié.


4. Choix du mode

IntentionMode
Lire une donnée, ne pas la modifierPar valeur
Modifier la variable de l'appelantVAR
Retourner plusieurs valeursVAR (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

Exercice 1facile
Incrémenter

É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.
Exercice 2moyen
Min et max d'un tableau (type bac courant)

É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.

Exercice 3difficile
Rotation circulaire de 3 variables (hors bac, bonus)

É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 VAR quand on veut modifier une variable de l'appelant.
  • Mettre VAR partout (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)

1

Sans VAR, modifier `x` dans une procédure :

2

Pour échanger deux variables `x` et `y` via une procédure, les paramètres formels doivent être :

3

Une procédure peut retourner plusieurs valeurs via :

4

`Echanger(3, 5);` est :

5

Pour passer un grand tableau efficacement à une procédure de lecture seule :

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.