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ètrea(par valeur) et le paramètreb(par adresse).- Donner les valeurs affichées par
Écrire(x, y)après l'appelEchanger(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 ?
- Donner les valeurs affichées par
- La variable
tempest-elle locale ou globale ? Quel est son rôle ? - Donner la valeur affichée par le dernier
Écrire(x)aprèsx ← Double(x), sachant que l'échange n'a pas modifié x.- Que se passe-t-il si l'on déclare
ncomme paramètrevardansDoubleet que l'on écritn ← 2*nsans retourner ?
- Que se passe-t-il si l'on déclare
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.
2. Rôle de temp. temp est une variable locale à Echanger : elle naît à l'appel et disparaît au retour. Son rôle est de sauvegarder la valeur de a avant qu'elle ne soit écrasée par b, sans quoi l'une des deux valeurs serait perdue.
3.(a) var n dans Double. Si n est déclaré var et que l'on écrit n ← 2*n sans Retourner, c'est la variable effective x elle-même qui est doublée (passage par adresse) : x vaut 10 après l'appel, mais Double n'est plus une fonction (rien à retourner) et l'écriture x ← Double(x) devient incorrecte ; il faudrait l'appeler comme une procédure Double(x). Une fonction ne doit pas modifier ses arguments : on garde le passage par valeur et le Retourner.