L'affectation



L'affectation est une instruction qui permet de modifier la valeur d'une variable. Plus précisement:

Affecter une valeur à une variable signifie enregistrer cette valeur dans la plage mémoire allouée à cette variable.

Affecter une valeur à une variable modifie donc l'état de la plage mémoire qui lui est allouée, ou autrement dit son "contenu".

Reprenons notre exemple avec les quatre variables Age, NombreEnfant, Nom et Prenom. Supposons qu'à un instant donné l'état de la mémoire soit le suivant:

Mem-Etat0.gif, 5,0kB

Si on affecte ensuite la valeur 33 à la variable Age, on obtient :

Mem-Etat1.gif, 5,1kB

et la zone mémoire allouée à la variable Age restera inchangée jusqu'à ce qu'une valeur différente lui soit affectée.

Ecriture d'une instruction d'affectation en Pascal

En pascal, on représente l'affectation par l'opérateur :=. Le nom de la variable figure à gauche de := et la valeur qu'on veut lui affecter, à droite

Par exemple, affecter la valeur 33 à la variable Age s'écrira :

   Age := 33 ;

De manière générale, ce qui figure à droite de := est une expression. Une affectation s'écrit donc sous la forme:

    Nom de variable := expression ;

Une affectation est toujours exécutée de droite à gauche. C'est à dire que l'expression figurant à droite du signe := est d'abord évaluée et que sa valeur est ensuite enregistrée dans la variable dont le nom figure à gauche du :=.

Exemple de code Pascal avec des affectations

Voilà un premier exemple de code Pascal, principalement composé d'affectations

 Var Age, MonAge  : Integer;
 begin
 Age := 20 ;
 MonAge := 47 ; 
 Age := Age+1 ;
 Age := Age*2 ;
 MonAge := Age ;
 end;

Ce code commence par la déclaration de deux variables de type entier (Age et MonAge). Après la partie déclaration, on a cinq instructions d'affectation.

Voilà comment se déroule l'exécution de ce code:

Après l'exécution de l'instruction Age vaut MonAge vaut
Age := 20 ; 20 ?
MonAge := 47 ; 20 47
Age := Age + 1 ; 21 47
Age := 2 * Age ; 42 47
MonAge := Age ; 42 42

Remarque: la première valeur de la variable MonAge est indéterminée. Tant que l'on a pas affecté de valeur à une variable, on ne sait pas ce qu'elle contient.

Affectation récursive

Dans une affectation, l'expression affectée à la variable peut elle même contenir la variable. On dit alors que l'affectation est récursive.

Exemple1

Ajouter le prix d'un article au prix total, se traduit par l'affectation récursive suivante:

 PrixTotal := PrixTotal + Prix ;
Exemple2

Augmenter une variable de 1, se dit incrémenter. C'est un cas particulier d'affectation récursive très fréquement utilisé en programmation.

Par exemple, pour incrémenter le nombre d'articles:

 NombreArticle := NombreArticle + 1 ;

Traitement Iteratif

Les affectations récursives sont en général utilisées dans des traitements itératifs, c'est à dire des traitements que l'on répète plusieurs fois. Chaque répétition d'un traitement itératif s'apelle une itération.

Illustrons ceci par un exemple.

Considérons un programme permettant de calculer la durée totale des morceaux d'un album. Voici son interface graphique:

Album.jpg, 31kB

Le bouton Ajouter, ajoute le nouveau titre saisi dans la zone de liste et augmente la durée totale de l'album par la durée de ce morceau.

Nous avons ici un exemple de traitement itératif, puisque les mêmes opérations vont être effectuées chaque fois que l'utilisateur ajoute un album. Ou autrement dit, chaque fois qu'il clique sur le bouton Ajouter.

Voici, le code de la procédure évènementielle de ce bouton:

procedure TForm1.BT_AjouterClick(Sender: TObject);
begin
  //--- Lecture des données
  Lire (Titre, ZT_Titre);
  LireEntier (Duree, ZT_Duree);

  //--- Traitement des données
  DureeT := DureeT + Duree;
  Numero := Numero + 1;

  //--- Affichage
  AfficherEntier (Numero, ZL_Num);
  Afficher (Titre, ZL_Titre);
  AfficherEntier (Duree, ZL_Duree);
  AfficherEntier (DureeT, ZT_DureeT);

end;  

Le traitement consiste à:

Mais que vaut la durée totale au départ ? quel est le numéro du premier morceau ?

Cela dépend de la valeur de ces variables avant la première itération, c'est à dire au démarrage du programme.

Il faudrait donc pouvoir affecter des valeurs de départ (on dit initialiser) aux variables DureeT et Numero. Sinon, on ne pourra pas connaitre leurs valeurs initiales.

Mais avec ce que nous avons vu jusqu'à présent, nous n'avons aucun moyen de faire exécuter des instructions à l'ordinateur avant le premier clic sur un bouton.

Heureusement, il existe une procédure évènementielle qui est appelée dès le démarrage du programme. Elle s'appelle Form_Create. Pour l'ajouter au code, il suffit de double-cliquer sur le fond du formulaire.

C'est donc dans la procédure Form_Create, qu'il faut initialiser les variables.

Voici, la procédure Form_Create de notre exemple:

procedure TForm1.FormCreate(Sender: TObject);
begin
  //--- Initialisation
  DureeT := 0;
  Numero := 0;
end;  

Comme cette procédure est déclenchée dès le démarrage du programme, nous saurons que la durée totale et le numéro seront nulles avant la première itération.