Jusqu'à là nous avons étudié un ensemble d'instructions bien adaptées au calculs linéaires: l'affectation, la séquence, les appels aux procédures et aux fonctions. Cependant, il y a des cas, où, par la nature du problème, on est obligé de choisir entre plusieurs manières de poursuivre les calculs dans un programme. Par exemple, supposons que l'on ait envie d'écrire un programme qui calcule la valeur absolue d'un nombre entier x. En mathématiques, on note abs(x) cette valeur, et elle est définie par:
Un algorithme de calcul dans la variable
abs est:
si ![]() |
abs reçoit la valeur de x |
sinon | abs reçoit la valeur de -x. |
Nous ne pouvons pas implanter cet algorithme à l'aide des seules instructions d'affectation, séquence et appel aux sous-programmes. Il nous faut une instruction pour discerner entre les deux cas de x: soit x est positif ou zéro (x >= 0), soit x est négatif (x < 0). L'instruction conditionelle permet l'exécution de plusieurs actions ``au choix'' selon la valeur d'une condition: ici, la condition est x >= 0. Les instructions qui autorisent la modification de la poursuite linéaire de l'exécution sont appelées structures de contrôle. Elles décrivent les changements dans le contrôle du programme. Nous étudions maintenent la structure de contrôle donnée par la conditionnelle:
Cas 1: if c then si; end if;
Dans sa forme la plus simple, l'instruction conditionnelle
débute par le mot-clé if, suivi d'une
condition booléenne c, puis du mot-clé
then. Ensuite vient une séquence d'instructions
si.
Toute instruction conditionelle finit par le mot-clé end if.
Sémantique:
Les instructions si sont exécutées seulement si la condition c
est vraie.
Dans le cas contraire, la séquence si n'est pas exécutée.
On lit: ``si c alors exécuter la séquence
d'instructions si''.
Exemple 1: if x >= 0 then x:= 1; y:= 2; end if;
Cas 2:
if c then |
s1; |
else |
s2; |
end if; |
Selon la valeur de la condition, on peut réaliser deux suites
d'instructions alternativement. Il suffit d'ajouter
le mot-clé else suivi d'une deuxième séquence d'instructions
s2. Sémantique: La séquence s1 est exécutée si c est vraie,
la séquence s2 est exécutée si c est fausse.
Exemple 2:
if x >= 0 then abs := x; else abs := -x; end if;
Notez la manière dont on indente les instructions conditionelles.
Cas 3:
Pour réaliser plusieurs tests de suite, on peut écrire
plusieurs conditionelles en cascade (en faisant bien attention
de terminer chacune d'entre elles par un end if):
if c1 then |
s1; |
else |
if c2 then |
s2; |
... |
else |
s3; |
end if; |
... |
end if; |
Une écriture plus compacte est possible
avec la construction
elsif (contraction pour else if). L'instruction
précedente s'écrit alors:
if c1 then |
s1; |
elsif c2 then |
s2; |
... |
else |
s3; |
end if; |
On peut repéter les elsif à souhait et la partie
else finale est optionnelle. Sémantique: Les conditions dans la
conditionnelle sont évaluées l'une après l'autre
dans l'ordre de leur apparition. La première évaluée
en vraie donne lieu à l'exécution de la séquence d'instructions
dans la partie then qui lui correspond.
Si aucune condition est vraie, on exécute alors
la partie else. S'il n'y a pas de partie else, aucune
séquence n'est exécutée.
Exemple 3:
if x > 0 then abs := x; put(z); elsif x < 0 then abs := -x; else abs := 0; end if;
Syntaxe BNF:
instruction_if | ::= | if condition then |
sequence_instructions | ||
{ elsif condition then | ||
sequence_instructions } | ||
[ else |
||
sequence_instructions ] |
||
end if; |
Des choses à ne pas écrire ...
if b = true then A ... end if;
cet instruction est parfaitement correcte, mais
elle met en évidence à quel point son auteur ne comprend pas
qu'une valeur booléene est en elle même une condition.
On préfère écrire:
if b then A... end if;
de manière analogue on n'écrira pas:
if b = false then A... end if;
mais plutôt
if not(b) then A... end if;