vendredi 7 novembre 2014

L’instruction d’affectation

1. Syntaxe et signification

En fait, la variable (la boîte) n'est pas un outil bien sorcier à manipuler. A la différence du couteau
suisse ou du superbe robot ménager vendu sur Télé Boutique Achat, on ne peut pas faire trente-six
mille choses avec une variable, mais seulement une et une seule.
Cette seule chose qu’on puisse faire avec une variable, c’est l’affecter, c’est-à-dire lui attribuer une
valeur. Pour poursuivre la superbe métaphore filée déjà employée, on peut remplir la boîte.
En pseudo-code, l'instruction d'affectation se note avec le signe :=


Ainsi :
Toto := 24
Attribue la valeur 24 à la variable Toto.

Ceci, soit dit en passant, sous-entend impérativement que Toto soit une variable de type numérique. Si Toto a été défini dans un autre type, il faut bien comprendre que cette instruction provoquera une
erreur. C’est un peu comme si, en donnant un ordre à quelqu’un, on accolait un verbe et un
complément incompatibles, du genre « Epluchez la casserole ». Même dotée de la meilleure volonté du monde, la ménagère lisant cette phrase ne pourrait qu’interrompre dubitativement sa tâche. Alors, un ordinateur, vous pensez bien…
On peut en revanche sans aucun problème attribuer à une variable la valeur d’une autre variable, telle
quelle ou modifiée. Par exemple :
Tutu := Toto

Signifie que la valeur de Tutu est maintenant celle de Toto.
Notez bien que cette instruction n’a en rien modifié la valeur de Toto : une instruction d’affectation ne modifie que ce qui est situé à gauche de la :=.
Tutu := Toto + 4
Si Toto contenait 12, Tutu vaut maintenant 16. De même que précédemment, Toto vaut toujours 12.
Tutu := Tutu + 1
Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifiée, puisque Tutu est la variable
située à gauche de la flèche.
Pour revenir à présent sur le rôle des guillemets dans les chaînes de caractères et sur la confusion
numéro 2 signalée plus haut, comparons maintenant deux algorithmes suivants :

Exemple n°1
begin
Riri := "Loulou"
Fifi := "Riri"
end.
Exemple n°2
begin
Riri := "Loulou"
Fifi := Riri
end.

La seule différence entre les deux algorithmes consiste dans la présence ou dans l’absence des
guillemets lors de la seconde affectation. Et l'on voit que cela change tout !
Dans l'exemple n°1, ce que l'on affecte à la variable Fifi, c'est la suite de caractères R – i – r - i. Et à la fin de l’algorithme, le contenu de la variable Fifi est donc « Riri ».
Dans l'exemple n°2, en revanche, Riri étant dépourvu de guillemets, n'est pas considéré comme une
suite de caractères, mais comme un nom de variable. Le sens de la ligne devient donc : « affecte à la
variable Fifi le contenu de la variable Riri ». A la fin de l’algorithme n°2, la valeur de la variable Fifi
est donc « Loulou ». Ici, l’oubli des guillemets conduit certes à un résultat, mais à un résultat
différent.
A noter, car c’est un cas très fréquent, que généralement, lorsqu’on oublie les guillemets lors d’une
affectation de chaîne, ce qui se trouve à droite du signe d’affectation ne correspond à aucune variable
précédemment déclarée et affectée. Dans ce cas, l’oubli des guillemets se solde immédiatement par une erreur d’exécution.
Ceci est une simple illustration. Mais elle résume l’ensemble des problèmes qui surviennent lorsqu’on
oublie la règle des guillemets aux chaînes de caractères.

2. Ordre des instructions

Il va de soi que l’ordre dans lequel les instructions sont écrites va jouer un rôle essentiel dans le résultat final. Considérons les deux algorithmes suivants :
Exemple 1
Var A : integer
begin
A := 34
A := 12
end.

Exemple 2
Var A : integer
begin
A := 12
A := 34
end.

Il est clair que dans le premier cas la valeur finale de A est 12, dans l’autre elle est 34 .
Il est tout aussi clair que ceci ne doit pas nous étonner. Lorsqu’on indique le chemin à quelqu’un, dire « prenez tout droit sur 1km, puis à droite » n’envoie pas les gens au même endroit que si l’on dit « prenez à droite puis tout droit pendant 1 km ».
Enfin, il est également clair que si l’on met de côté leur vertu pédagogique, les deux algorithmes cidessus
sont parfaitement idiots ; à tout le moins ils contiennent une incohérence. Il n’y a aucun intérêt à
affecter une variable pour l’affecter différemment juste après. En l’occurrence, on aurait tout aussi bien
atteint le même résultat en écrivant simplement :
-Exemple 1
Var A : integer ;
begin
A := 12 ;
end.

-Exemple 2
Var A : integer ;
begin
A := 34 ;
end.
Tous les éléments sont maintenant en votre possession pour que ce soit à vous de jouer !

Exercice :

-Exercice 1.1
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Program Ex1 ;
Var A, B : integer ;
begin
A := 1 ;
B := A + 3 ;
A := 3 ;
end.

-Exercice 1.2
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes ?
Program Ex2 ;
Var A, B, C : integer ;
begin
A := 5 ;
B := 3 ;
C := A + B ;
A := 2 ;
C := B – A ;
end.

-Exercice 1.3
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Program Ex3 ;
Var A, B : integer ;
begin
A := 5 ;
B := A + 4 ;
A := A + 1 ;
B :=A – 4 ;
end

-Exercice 1.4
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes ?
Program Ex4 ;
Var A, B, C :integer ;
begin
A := 3 ;
B := 10 ;
C := A + B ;
B := A + B ;
A := C ;
end.

-Exercice 1.5
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Program Ex5 ;
Var A, B : integer ;
begin
A := 5 ;
B := 2 ;
A := B ;
B := A ;
end.
Moralité : les deux dernières instructions permettent-elles d’échanger les deux valeurs de B et A ? Si
l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?

-Exercice 1.6
Plus difficile, mais c’est un classique absolu, qu’il faut absolument maîtriser : écrire un programme
permettant d’échanger les valeurs de deux variables A et B, et ce quel que soit leur contenu préalable.

-Exercice 1.7
Une variante du précédent : on dispose de trois variables A, B et C. Ecrivez un programme transférant
à B la valeur de A, à C la valeur de B et à A la valeur de C (toujours quels que soient les contenus
préalables de ces variables).

-Exercice 1.8
Que produit programme suivant ?
Program Ex8 ;
Var A, B, C : string ;
begin
A := "423" ;
B := "12" ;
C := A + B ;
end.

-Exercice 1.9
Que produit programme suivant ?
Program Ex9 ;
Var A, B, C : string
begin
A := "423" ;
B := "12" ;
C := A & B ;
end.

Categories:

0 commentaires:

Enregistrer un commentaire