Utilisation des alternatives imbriquées: un exemple

énoncé du problème: « Décider si une date jour + mois + année est valide ou non en tenant compte des années bissextiles. Les années bissextiles sont divisibles par 4 sauf les années divisibles par 100 qui ne le sont pas sauf les années divisibles par 400 qui le sont » (a%b est égal à 0 si a est divisible par b, m est la variable qui contient le numéro de mois, j le numéro du jour et a l' année)

if (m < 1) || (m > 12)
  afficher( "Date Invalide");
else if (m ==2)
         if (a % 400 == 0)
           if (j < 1) || (j > 29)
              afficher ("Date Invalide");
           else
              afficher( "Date Valide");
         else if (a % 100 == 0)
                   if (j < 1) || (j > 28)
                      afficher("Date Invalide");
                   else afficher("Date Valide");
               else if (a % 4 == 0)
                           if (j < 1) || (j > 28)
                             afficher("Date Invalide");
                          else afficher("Date Valide");
                     else
                             if (j < 1) || (j > 28)
                                   afficher("Date Invalide");
                             else afficher("Date Valide");
       else if (m == 4) || (m == 6) || (m == 9) || (m == 11)
                if (j < 1) || (j > 30)
                    afficher("Date Invalide");
                else
                    afficher("Date Valide");
              else
                 if (j < 1) || (j > 31)
                   afficher("Date Invalide");
                 else
                     afficher ("Date Valide");

b = ((a % 4 == 0) && !(a % 100 == 0)) || (a % 400 == 0);
k1 = (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) && (j>=1 && j=<31);
k2 =(m==4 || m==6 || m==9 || m==11) && (j>=1 && j=<30);
k3= (m==2) && b && (j>=1) && (j=<29);
k4 = (m==2) && (j>=1) && (j=<28);
if (k1 || k2 || k3 || k4)
      afficher("Date valide");
else
       afficher("Date Invalide");

Solution qui marche mais peu lisible car il y a beaucoup de répétitions.  

L'utilisation de variables booléennes intermédiaires augmentent la lisibilité de l algorithme

suivant          plan