next up previous contents
Next: Factorisation dans une conditionnelle Up: Cours d'Algorithmique Programmation A0 Previous: Le typage ou cohérence

Instruction conditionelle


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:

$
abs(x) = \left \{
\begin{array}{cl}
x & \mbox{si } x \geq 0 \\
-x & \mbox{sinon}\\
\end{array}\right .
$


Un algorithme de calcul dans la variable abs est:

si $x \geq 0$ alors 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;




 
next up previous contents
Next: Factorisation dans une conditionnelle Up: Cours d'Algorithmique Programmation A0 Previous: Le typage ou cohérence
Maria-Viginia Aponte
2001-11-21