Exercice 1 : Variables et trace d'exécution
On considère le programme suivant. Répondez sans machine : savoir suivre une exécution à la main est exactement ce qui est évalué.
a = 5
b = 3
a = a + b
b = a - b
a = a - b
print(a, b)- a) Dressez le tableau des valeurs successives de a et de b, ligne par ligne, et donnez ce qui est affiché.
- b) Que réalise ce programme, quelles que soient les valeurs initiales ?
- c) Écrivez le programme qui réalise la même chose en utilisant une troisième variable.
- d) Que va afficher le programme suivant : x = 7, puis y = x, puis x = 10, puis print(y) ? Expliquez.
Voir la correction
Réponses
- a) : , , , ; : , , , ; affiche `3 5`
- b) Il échange et
- c) `c = a`, `a = b`, `b = c`
- d) Affiche
a) On suit l'exécution LIGNE PAR LIGNE, en notant après chaque instruction la valeur de chaque variable. Après les deux premières lignes, vaut et vaut . La ligne `a = a + b` donne , restant à . La ligne `b = a - b` utilise le NOUVEAU : , restant à . La ligne `a = a - b` utilise le nouveau : . Le programme affiche donc `3 5`.
b) Il ÉCHANGE le contenu des deux variables, sans utiliser de variable supplémentaire. On est parti de et , on arrive à et . Le mécanisme est général : la somme est stockée dans et sert de mémoire temporaire, dont on extrait successivement l'ancien puis l'ancien .
c) Avec une variable auxiliaire, on écrit `c = a` puis `a = b` puis `b = c`. C'est la version que l'on écrit en pratique, pour deux raisons : elle se lit immédiatement, et elle fonctionne avec n'importe quel type de données, alors que la version de l'énoncé n'a de sens que pour des NOMBRES. On ne peut pas additionner deux chaînes de caractères et espérer les séparer ensuite.
d) Il affiche . Au moment de l'affectation `y = x`, Python range dans la VALEUR que contient alors, c'est-à-dire . Modifier ensuite ne modifie pas : une affectation copie une valeur à l'instant où elle s'exécute, elle ne crée aucun lien permanent entre les deux variables.
Les questions a) et d) portent sur le même point, et c'est le plus important du chapitre : le signe de Python n'est PAS l'égalité mathématique, c'est une AFFECTATION. En mathématiques, écrire serait absurde et forcerait à être nul ; en Python cela signifie calculer avec les valeurs actuelles, puis ranger le résultat dans , en écrasant l'ancienne valeur. Une affectation se lit donc toujours de DROITE à GAUCHE, et le seul moyen fiable de suivre un programme est de tenir un tableau des valeurs successives, comme en a). C'est exactement ce que l'épreuve évalue, et c'est aussi ce qui permet de repérer une erreur sans machine.
c = a
a = b
b = c