004_Choix conditionnel

Les sélections :  choisir c’est exclure

L’algorithme linéaire correspond à un schéma très simple : les actions s’enchaînent dans un ordre figé. La réalité est plus souvent construite suivant un schéma conditionnel. La mise en œuvre d’algorithmes conditionnels permet de supprimer le déterminisme lié aux algorithmes linéaires. En programmant la prise de décision, nous donnerons à l’ordinateur la capacité de raisonner, c’est-à-dire de suivre une démarche logique (exemple jouer aux échecs) donnant au profane l’impression que l’ordinateur est capable de penser.

La puissance de calcul d’un ordinateur est mise en œuvre lorsqu’il évalue les expressions contenues dans les lignes de programme. Le pouvoir de décision est utilisé pour déterminer l’ordre d’exécution de ces lignes.

Pour bien saisir le concept de prise de décision d’un ordinateur, il faut  savoir ce qu’est un compteur programme. Le compteur programme est la partie du système interne de l’ordinateur capable d’indiquer à l’ordinateur la prochaine ligne à exécuter. À moins d’indication contraire, le compteur programme s’incrémente à la fin de chaque ligne afin d’indiquer la prochaine ligne du programme.

Prenons comme exemple un laboratoire de chimie. Un ordinateur n’y sera pas d’une grande utilité si sa fonction se limite à ouvrir une valve lorsqu’un technicien appuie sur le bouton \fbox{\sc start}. Dans ce cas, le technicien ferait tout aussi bien de l’ouvrir lui-même. Toutefois, l’ordinateur exécutera une tâche beaucoup plus utile s’il ouvre la valve lorsqu’on appuie sur \fbox{\sc start} et la ferme lorsqu’on atteint la valeur donnée du pH. Il peut surpasser le technicien par exemple dans l’utilisation de valves télécommandées et des dispositifs de mesure électroniques du pH. Dans cet exemple, le côté utilise de l’ordinateur demeure sa capacité de décider de la fermeture de la valve. En fait, c’est le programmeur qui spécifie les critères de décision. Ces critères sont ensuite communiqués à l’ordinateur grâce aux structures d’exécution conditionnelle du programme. En conséquence, l’ordinateur est capable d’interprêter la décision du programmeur à une vitesse et une précision plus grandes que celles d’un être humain.

Il existe diverses applications d’instruction conditionnelle :

  1. choix d’un segment parmi deux,
  2. exécution conditionnelle d’un segment (schéma conditionnel simplifié),
  3. choix conditionnel d’un segment parmi plusieurs.

L’alternative

Grâce à l’instruction if \ldots else , vous pouvez exécuter ou sauter un segment de programme. Cette instruction contient une expression qui peut être vraie ou fausse. Si elle est vraie (différente de zéro), le segment conditionnel est exécuté. Si elle est fausse (égale à zéro), le segment conditionnel est ignoré. Le segment conditionnel peut être soit une seule instruction, soit une partie de programme comprenant un nombre quelconque d’instructions.

if   (condition)
        { action(s) 1 ; }
else 
        { action(s) 2 ; }

La condition ou prédicat  est une fonction propositionnelle dont le  résultat est booléen c’est-à-dire a 2 valeurs : vrai, faux.
Il existe un schéma conditionnel simplifié  qui omet le deuxième terme de  l’alternative.

Les actions internes 1 et 2 du schéma conditionnel peuvent être elles-mêmes conditionnelles. On obtient alors des structures conditionnelles emboîtées.

Propriété de l’alternative

 

La succession d’instructions poursuit un objectif : se rapprocher d’un résultat prévu. Avec la structure de contrôle if … else, il y a 2 chemins possibles pour se rapprocher du même objectif, il y a 2 possibilités de modifier les relations entre les variables.

Supposons

  • les relations P et C entre les variables, et qu’une action A conduise à une nouvelle relation Q,
  • les relations P et C entre les variables, et qu’une action B conduise à la même  Q.

 

La propriété de la structure de contrôle if … else, s’écrit :

/* P */ if (C) A ; else B ; /* Q */

 

Exemple : Pour expliciter

/* x < y */
if (x < -2)  {      y = x * x ;       x = -x     ;  } else  y = x + y + 3 ;  /* y > x + 1 */

Il suffit, d’après les propriétés de l’alternative de montrer séparément deux choses :

  1. /* x < y   et   x < -2 */ y = x * x ;  x = -x     ;  /* y > x + 1 */
  2. /* x < y    et  x >= -2 */
    y = x + Y + 3 ; 
    /* y > x + 1 */

Pour montrer la première partie, il faut appliquer les règles de l’affectation et de l’enchaînement. Raisonnant de droite à gauche, nous sommes ramenés à montrer que :

/* x < y   et   x < -2 */ y = x*x ;  /* y > -x +1 */

Ce qui vrai puisque x < -2 \Rightarrow x^2 > -x +1 */

Pour montrer la deuxième partie, il suffit de montrer que :  /* x < y   et x >= -2 */ /* x + y + 3 > x + 1 */,
ce qui est vrai puisque : /* x < y   et x >= -2 */ /* y > -2  */

Schémas conditionnels emboîtés et ventilation

Le shéma conditionnel permet de régler l’alternative ou choix d’un ensemble d’actions parmi 2 ensembles possibles.

Lorsque l’on doit réaliser le choix d’un ensemble d’actions parmi n ( n > 2 ) on peut :

  • soit utiliser les structures conditionnelles imbriquées, mais la lisibilité de la définition algorithmique devient rapidement malaisée dés que n devient important.
    if (condition_1) 
    {
         action(s) 2 ; 
    }
    else 
    {
         if (condition_2 
         {
               action(s) 2 ; 
         }
         else 
         {
               action(s) 3 ; 
         }
    }
  • soit utiliser la ventilation qui généralise de manière beaucoup plus satifaisante le choix de 1 parmi n :
    switch (expression) 
    {
        case constante_1 : actions(s) 1 ; 
        case constante_2 : actions(s) 2 ; 
        ...
        default : action(s) n ; 
    }

Exemple : Soit à écrire un programme qui fournit le nombre de jours écoulés depuis le premier janvier jusqu’au début du mois. Cet algorithme sera utilisé dans le calenrier perpétuel page XX.

switch (mois) 
{
    case  1 : ecoules =   0 ; break ; 
    case  2 : ecoules =  31 ; break ; 
    case  3 : ecoules =  59 ; break ; 
    case  4 : ecoules =  90 ; break ; 
    case  5 : ecoules = 120 ; break ; 
    cas   6 : ecoules = 151 ; break ; 
    case  7 : ecoules = 181 ; break ; 
    case  8 : ecoules = 212 ; break ; 
    case  9 : ecoules = 243 ; break ; 
    case 10 : ecoules = 273 ; break ; 
    case 11 : ecoules = 304 ; break ; 
    case 12 : ecoules = 334 ; break ; 
}