Exercice — dans l'esprit des sujets du bac
On considère le programme suivant :
```
Variables globales : x, y : entier
Procédure Echanger(a : entier, var b : entier)
Variables temp : entier
Début
temp ← a ; a ← b ; b ← temp
Fin
Fonction Double(n : entier) : entier
Début
Retourner 2 * n
Fin
{ Programme principal }
Début
x ← 5 ; y ← 10
Echanger(x, y)
Écrire(x, y)
x ← Double(x)
Écrire(x)
Fin
```
- Dans la procédure `Echanger`, expliquer la différence entre le paramètre `a` (par valeur) et le paramètre `b` (par adresse).
- Donner les valeurs affichées par `Écrire(x, y)` après l'appel `Echanger(x, y)`. Justifier.
- Pour que l'échange fonctionne correctement sur les deux variables, que faut-il modifier dans l'en-tête de la procédure ?
- La variable `temp` est-elle locale ou globale ? Quel est son rôle ?
- Donner la valeur affichée par le dernier `Écrire(x)` après `x ← Double(x)`, sachant que l'échange n'a pas modifié x.
- Que se passe-t-il si l'on déclare `n` comme paramètre `var` dans `Double` et que l'on écrit `n ← 2*n` sans retourner ?
Voir la correction commentéeAprès avoir posé votre démarche
Passage par valeur vs adresse — trace d'exécution.
Instruction à exécuter et Valeur finale de la variable :
- État initial : x ← 5 ; y ← 10.
- Appel Echanger(x, y) avec signature `Echanger(a : entier, var b : entier)` : a reçoit une copie de x (=5) ; b est une référence à y.
- Corps : temp ← a (=5) ; a ← b (=10) (seul le local a change) ; b ← temp (=5) → y devient 5. x n'est pas modifié.
- Affichage Écrire(x, y) : x = 5, y = 5. L'échange est incomplet car x reste 5.
Puis x ← Double(x) : Double(n) calcule 2*n. On retourne 10 ; x contient la valeur 10. Affichage : 10.
Pour un échange complet : `DEF PROC Echanger(var a : entier ; var b : entier)` — les deux paramètres par adresse.
Rôle. Cette séquence permet de déterminer l'effet du mode de passage sur les variables appelantes : seul un paramètre `var` propage la modification. Q contient les couples (x,y) successifs : (5,10) → (5,5) → (10,5).
Portée : `temp` est local à Echanger (détruit à la fin de l'appel) ; x, y sont globaux dans le programme principal.