Lorsqu'il y a repétition d'une même instruction
dans plusieurs branches d'une conditionnelle, on peut simplifier son
écriture en factorisant les instructions repétées vers l'extérieur
de tout ou une partie de la conditionnelle.
Cas 1:
Le cas le plus caricatural est donné par:
if c then I; else I; end if;
qui est bien sûr équivalent à
I;
en effet, I est toujours exécutée (une seule fois),
indépendament de la valeur de c.
Cas 2:
if c then A;C; else B;C; end if;
est équivalent à
if c then A; else B; end if; C;
Cas 3:
if x = y then b := true; else b := false; end if;
cet instruction est équivalente à:
b := x = y;
b reçoit true si la
branche then est exécutée, c.a.d., si
x=y est vrai. Inversément,
b reçoit false si la
branche else est exécutée, c.a.d., si
x=y est faux. Cette transformation ne dépend
pas bien sûr, de la condition employée. De manière générale,
on peut l'exprimer, pour une condition c quelconque par:
if c then b := true; else b := false; end if;
est équivalent à
b := c;
Exercice 1:
Pourquoi les factorisations suivantes ne sont pas correctes?
Donnez un exemple où elles donnent
lieu à des instructions non équivalentes:
if c then D;A if c then A; else D;B else B; end if; end if; D;
Donnez une formulation correcte de cette factorisation.
if c then A; A; end if; A;
Dans le premier de ces programmes, peut-on dire combien des fois
A est exécuté?
Exercice 2:
Donnez un algorithme puis écrivez un programme pour chacun des problèmes suivants. Les énoncés sont volontairement flous: