Exemple 1: Valeur absolue
IF N<0 THEN BEGIN
ValAbs := -N;
END ELSE BEGIN
ValAbs := N;
END;
Exemple 2: Simulation de l'approche des feux de signalisation routière
Il s'agit de simuler l'approche des feux de signalisation.
IF < pas de signal > THEN BEGIN
< avancer prudemment >;
END ELSE BEGIN
IF < signal rouge ou orange > THEN BEGIN
< arrêter >;
END ELSE BEGIN
< continuer >;
END;
END;
L'algorithme précédent admet la possibilité que les feux ne soient pas en état de marche. Cet algorithme contient deux occurrences de l'instruction IF. La seconde est imbriquée dans la première et est exécutée uniquement si l'évaluation de la condition < pas de signal > donne la valeur False. Nous n'affinons pas plus l'analyse, le but de cet exemple étant de présenter deux structures alternatives imbriquées.
Exemple 3: Maximum de trois nombres
Un autre exemple de sélection imbriquée est l'algorithme suivant qui décrit comment déterminer le maximum de trois nombres A, B et C.Une première variante peut s'écrire:
IF A>B THEN BEGIN
< choisir entre A et C >;
END ELSE BEGIN
< choisir entre B et C >;
END;
Le choix entre A et C peut être affiné par:
< choisir entre A et C > ::=
IF A>C THEN BEGIN
Max := A;
END ELSE BEGIN
Max := C;
END;
Après avoir affiné le choix entre B et C de la même manière, on obtient l'algorithme suivant:
IF A>B THEN BEGIN
IF A>C THEN BEGIN
Max := A;
END ELSE BEGIN
Max := C;
END;
END ELSE BEGIN
IF B>C THEN BEGIN
Max := B;
END ELSE BEGIN
Max := C;
END;
END;
Nous avons eu besoin de trois comparaisons A>B, A>C et B>C ce qui rend la solution assez lourde. C'est pourquoi nous proposons la solution améliorée suivante:
< poser Max = A >;
< choisir entre B et Max >;
< choisir entre C et Max >;
Cet algorithme s'écrit, après avoir affiné les choix respectivement entre B et Max et entre C et Max:
Max := A;
IF B>Max THEN BEGIN
Max := B;
END;
IF C>Max THEN BEGIN
Max := C;
END;
Cette solution ne nécessite que deux comparaisons et évite les imbrications de structures alternatives. Nous tenons à préciser que les solutions utilisant des structures alternatives imbriquées n'offrent guère d'intérêt et sont à éviter, si possible.
Exemple 4: Jeu de cartes
Dans cet exemple, il s'agit de déterminer le nombre de points obtenus par un joueur qui tire une carte dans un jeu de cartes selon les attributions de points suivantes:
3 points pour un as de carreau ou un quatre de trèfle,
2 points pour un quatre de coeur,
1 point pour un quatre de pique ou de carreau,
1 point pour un as autre que l'as de carreau,
0 point pour toute autre carte.
L'analyse de ce problème peut être menée de différentes manières. La solution présentée ici n'est certainement pas unique et il est proposé au lecteur d'en chercher une autre.
En traitant les cas dans l'ordre fourni par l'énoncé du problème, nous avons la première étape de l'analyse sous forme d'un arbre programmatique:
Figure 9.4 Première étape de l'analyse
Un second niveau de l'analyse permet de traiter le cas ou aucune des deux conditions <c1> et <c2> n'est vérifiée (Autres dans la figure 9.5):
Cinq structures alternatives imbriquées ont été nécessaires pour résoudre le problème. Lorsque les imbrications sont nombreuses, l'oubli de certains cas particuliers est facile. Pour éviter des erreurs dues à la logique, il est conseillé de veiller particulièrement à la lisibilité de l'analyse.
Finalement nous obtenons la formulation suivante:
< tirer une carte >;
IF < carte est un as > THEN BEGIN
IF < la couleur est carreau > THEN BEGIN
< 3 points >;
END ELSE BEGIN
< 1 point >;
END;
END ELSE BEGIN
IF < la carte est un quatre > THEN BEGIN
IF < la couleur est trèfle > THEN BEGIN
< 3 points >;
END ELSE BEGIN
IF < la couleur est coeur > THEN BEGIN
< 2 points >;
END ELSE BEGIN
< 1 point >;
END;
END ELSE BEGIN
< 0 point >;
END;
END;
Figure 9.5 Deuxième étape de l'analyse
Nous remarquons que l'analyse du problème du jeu de cartes ne peut pas se passer de l'emploi de structures alternatives imbriquées car les conditions sont pour la plupart dépendantes les unes des autres. En effet, l'attribution des points pour un as dépend de sa couleur (carreau ou autre couleur). Nous pouvons cependant éliminer un niveau d'imbrication en introduisant une condition composée:
IF < la carte est un as > THEN BEGIN
IF...
END ELSE; { rien }
IF < la carte est un quatre > THEN BEGIN
IF...
END ELSE; { rien }
IF < la carte n'est ni un as ni un quatre > THEN BEGIN
< 0 point >
END ELSE { rien };
Nous verrons plus loin que l'utilisation de conditions composées peut parfois permettre d'éviter l'emploi de structures alternatives imbriquées.
Exemple 5: Résolution d'une équation du second degré à une inconnue
L'exemple suivant est tiré du domaine des mathématiques. Il s'agit d'écrire un programme permettant de calculer les racines de l'équation du second degré à une inconnue: Ax2 + Bx + C = 0, (A, B, C Î R)
PROGRAM Roots;
USES Crt;
VAR A, B, C: Integer; {coefficients}
Discriminant, {discriminant}
Re, Im: Real; {partie réelle, partie imaginaire}
BEGIN {main}
ClrScr;
Write( 'Entrer A, B, C: ' ); Readln( A, B, C );
IF ( A=0 ) AND ( B=0 ) THEN BEGIN
Writeln( 'Equation dégénérée!' );
END ELSE BEGIN{A<>0 ou B<>0}
IF A=0 {B<>0} THEN BEGIN
Writeln( 'Racine unique: ' , -C/B );
END ELSE BEGIN{A<>0}
IF C=0 THEN BEGIN
Writeln( 'Deux racines réelles: ', -B/A, ' et ', 0 );
END ELSE BEGIN {A<>0 et C<>0}
Re := -B/( 2*A );
Discriminant := Sqr( B ) - 4*A*C;
Im := Sqrt( Abs( Discriminant ) )/( 2*A );
IF Discriminant>=0 THEN BEGIN
Writeln( 'Deux racines réelles: ', Re+Im, ' et ', Re-Im); END ELSE BEGIN
Writeln( 'Deux racines complexes: ', Re, '+i*', Im, ' et ', Re, '-i*', Im );
END;
END;
END;
END;
END. {-- Roots}
Figure 9.6 Première étape d'analyse
Une première analyse des cas particuliers donne l'arbre programmatique de la figure 9.6. Nous remarquons ici que les conditions <c1>, <c2> et <c3> sont dépendantes les unes des autres. En effet, si par exemple <c1> donne False et <c2> donne True, il en résulte que B ne peut pas être nul. Si de plus l'évaluation de <c3> donne True, il en résulte que A et B sont tous les deux différent de zéro. Du fait de leur interdépendance, ces structures alternatives ne peuvent être écrites dans n'importe quel ordre. Ainsi, l'analyse de ce problème ne peut pas éviter l'emploi d'instructions alternatives imbriquées car les conditions ne sont pas indépendantes les unes des autres. Nous obtenons sans peine le programme ci-dessus.
© Aflo Informatique , 2003-2004