Une bonne programmation est celle qui fait naître des programmes faciles à maintenir. Si l'analyse d'un algorithme a été élaborée avec soin, selon des normes précises, avant d'être traduite en un programme ce dernier pourra facilement être modifié par son concepteur, ou par quelqu'un d'autre.
La méthodologie de la programmation enseigne une démarche permettant de passer d'un problème concret, issu du monde réel, à sa résolution (nous appelons problème toute situation dont la résolution peut être confiée à un ordinateur).
Le problème que nous allons analyser et résoudre dans cet alinéa illustre les principes de base utilisés dans une analyse structurelle descendante, allant du général au particulier.
Nous allons analyser l'enchaînement des actions nécessaires pour qu'un robot domestique puisse préparer du café à l'aide d'une cafetière électrique.
Précisons et délimitons le problème: l'état initial de la cafetière est "prête à fonctionner", seuls manquent l'eau, le café et le filtre: c'est le champ des données. Le café liquide est le résultat cherché.
Figure 2.6 Schéma global
Ce schéma global reste vague: en effet, l'ordre des actions (mettre de l'eau, du café, un filtre) n'est pas sans importance.
L'essence du problème apparaît un peu mieux dans le schéma suivant:
Figure 2.7 Schéma
L'élaboration de l'analyse structurelle du problème se fait en plusieurs étapes, d'une vue globale du problème jusqu'à une analyse détaillée et ordonnée des différentes actions. Cette approche est connue sous le nom analyse descendante ou affinement progressif. Elle consiste à décomposer l'ensemble du traitement à effectuer et à établir un nombre fini d'actions dont chacune peut être facilement décrite par un algorithme plus simple que celui qui concerne l'ensemble du traitement.
Dans une première étape, il s'agit de déterminer la succession des actions à effectuer pour faire du café:
(1) mettre de l'eau dans la cafetière;
(2) mettre un filtre;
(3) mettre le café dans le filtre;
(4) appuyer sur le bouton de mise en route.
A ce niveau, nous avons établi la liste des actions et l'ordre chronologique dans lequel elles doivent se réaliser. Elles sont dites séquentielles parce qu'elles sont exécutées l'une après l'autre dans l'ordre où elles sont écrites.
Nous pouvons remarquer que seulement certaines de ces actions peuvent être permutées sans introduire un changement dans le déroulement de la fabrication du café:
(1) < ¾ > (2)
La deuxième étape consiste à détailler une action particulière. Prenons à titre d'exemple l'action (3). "mettre le café dans le filtre". Nous constatons immédiatement l'imprécision de cette description: comment se présente le café, en grains ou moulu? Il est évident que les actions à effectuer sont différentes dans chacun de ces deux cas. Ainsi, afin que l'ordinateur soit capable de l'interpréter, nous devons affiner l'action (3) en une séquence d'actions plus élémentaires et plus détaillées. L'action
(3) mettre le café dans le filtre;
peut être affinée par exemple en:
(3) SI le café est en grains
ALORS (3.1)
SINON (3.2)
où les actions (3.1) et (3.2) pourraient être affinées comme suit:
(3.1.1) prendre le moulin à café;
(3.1.2) prendre du café dans le pot à café en grains;
(3.1.3) moudre le café;
(3.1.4) mettre le café moulu dans le filtre;
(3.2.1) prendre le pot à café moulu;
(3.2.2) mettre le café moulu dans le filtre;
Nous constatons dans l'analyse précédente la présence d'une même action dans les deux alternatives envisagées, "mettre le café moulu dans le filtre". Que le café moulu provienne du pot à café moulu ou du moulin à café, cette action n'est réalisée qu'une seule fois; nous pouvons donc simplifier l'écriture de l'analyse de la manière suivante:
(3) SI le café est en grains
ALORS (3.1.1) prendre le moulin à café;
(3.1.2) prendre du café dans le pot à café en grains;
(3.1.3) moudre le café
SINON (3.2.1) prendre le pot à café moulu;
(3.3) mettre le café moulu dans le filtre;
Ainsi, lorsque une des deux alternatives (3.1) ou (3.2) a été exécutée, l'action (3.3) qui suit la structure alternative, est à son tour exécutée.
Si à ce niveau, le robot est capable d'interpréter toutes les actions, le processus d'affinement peut être arrêté: la conception de l'algorithme est complète. Evidemment le concepteur d'un algorithme doit connaître les capacités d'interprétation du robot (du processeur) non seulement pour savoir arrêter le robot mais aussi pour diriger le processus d'affinement lui-même. Les capacités d'interprétation d'un ordinateur sont définies avec beaucoup plus de précision que celles des hommes: un ordinateur peut interpréter tout ce qui est exprimé d'une manière appropriée dans un langage de programmation déterminé. Le concepteur d'un algorithme peut donc arrêter l'analyse descendante quand chaque action est suffisamment élémentaire de façon qu'elle puisse être traduite dans un langage de programmation donné. Cependant, certaines actions peuvent encore être trop complexes pour les capacités d'interprétation du robot. Il faut alors les affiner d'avantage. Ainsi par exemple, l'action
(3.3) mettre le café moulu dans le filtre;
peut nécessiter les affinements suivants:
(3.3.1) remplir une mesure de café;
(3.3.2) verser son contenu dans le filtre;
Cependant, si une seule mesure de café ne suffit pas, le robot doit reproduire plusieurs fois ces deux mêmes actions. L'analyse devient alors:
(3.3.1) remplir une mesure de café;
(3.3.2) verser son contenu dans le filtre;
(3.3.3) TANT QUE le nombre de mesures est insuffisant
REPETER (3.3.3.1) remplir une mesure de café;
(3.3.3.2) verser son contenu dans le filtre;
Lorsque les deux actions (3.3.3.1) et (3.3.3.2) contrôlées par la structure répétitive cesseront d'être exécutées (assez de café dans le filtre), l'action (4) qui suit la structure répétitive sera à son tour exécutée. Il est facile de voir que l'analyse précédente permet au robot de faire une seule tasse de café. En effet, si l'utilisateur ne désire qu'une seule tasse de café, la réponse à la question "le nombre de mesures est insuffisant?" est négative et la répétition des actions (3.3.3.1) et (3.3.3.2) n'a pas lieu (on suppose ici qu'une tasse exige une mesure de café).
La troisième étape de notre analyse consistait donc à détailler une ou plusieurs actions de l'étape précédente. A ce stade, il peut être utile de faire le point sur l'analyse obtenue:
(1) mettre de l'eau dans la cafetière;
(2) mettre un filtre;
(3) SI le café est en grains
ALORS (3.1.1) prendre le moulin à café;
(3.1.2) prendre du café dans le pot à café en grains;
(3.1.3) moudre le café
SINON (3.2.1) prendre le pot à café moulu;
(3.3.1) remplir une mesure de café;
(3.3.2) verser son contenu dans le filtre;
(3.3.3) TANT QUE le nombre de mesures est insuffisant
REPETER (3.3.3.1) remplir une mesure de café;
(3.3.3.2) verser son contenu dans le filtre;
(4) appuyer sur le bouton de mise en route.
Dans la quatrième étape de l'analyse nous nous préoccupons du nombre de tasses de café désirées par l'utilisateur du robot. Or, si l'utilisateur désire plusieurs tasses de café, il est impossible de répondre précisément à la question "le nombre de mesures est insuffisant?" car il manque une donnée essentielle, à savoir le nombre de tasses désirées. Si à présent nous connaissons le nombre de tasses désirées, la réponse à la question sera positive autant de fois que nécessaire pour atteindre la quantité voulue de café.
Remarquons que plus nous affinons l'analyse, plus nous mesurons l'imprécision de l'énoncé initial. Ainsi par exemple, nous avons aussi oublié de préciser la capacité maximale de la cafetière. Il est indispensable de vérifier que le nombre de tasses demandées est compatible avec la capacité maximale de la cafetière.
En supposant que la capacité maximale de la cafetière soit de dix tasses, l'analyse est complétée par les actions (0) et (-1):
(-1) Indiquer le nombre de tasses désirées;
(0) TANT QUE le nombre de tasses désirées est supérieur à 10;
REPETER (0.1) impossible, la cafetière va déborder;
(0.2) choisir un nouveau nombre de tasses;
(1) mettre de l'eau dans la cafetière;
(2) mettre un filtre;
(3) SI le café est en grains
ALORS (3.1.1) prendre le moulin à café;
(3.1.2) prendre du café dans le pot à café en grains;
(3.1.3) moudre le café
SINON (3.2.1) prendre le pot à café moulu;
(3.3.1) remplir une mesure de café;
(3.3.2) verser son contenu dans le filtre;
(3.3.3) TANT QUE le nombre de mesures est insuffisant
REPETER (3.3.3.1) remplir une mesure de café;
(3.3.3.2) verser son contenu dans le filtre;
(4) appuyer sur le bouton de mise en route.
Pour les besoins de nos considérations, nous supposons que ces actions sont sans ambiguïté et définies de manière à pouvoir être interprétées par le robot domestique, c'est-à-dire qu'une décomposition en actions encore plus élémentaires n'est pas nécessaire.
En résumé, l'énoncé du problème peut être formulé comme suit: donner l'enchaînement des différentes actions à réaliser pour permettre à un robot domestique de faire du café à l'aide d'une cafetière électrique de capacité maximale dix tasses en état de fonctionnement à partir de café moulu ou de café en grains.
Remarquons pour conclure que la technique de l'affinement progressif n'augmente pas le nombre d'actions de l'algorithme, mais exprime simplement d'une manière plus détaillée une action déjà présente.
Conclusion
Le problème que nous venons d'analyser illustre les principes de base de la mE9thodologie de la programmation:
l'analyse descendante du problème.
la vérification de la cohérence du champ de données avec l'énoncé du problème.
Une analyse peut se dérouler avec des données erronées ou incomplètes, auquel cas elle risque de conduire à des résultats imprévisibles voire complètement aberrants.
l'utilisation des structures de contrôle (séquence, alternative, répétitive).
Ces structures sont les outils de base suffisants pour exprimer toute analyse.
l'assurance de la précision suffisante de l'énoncé du problème.
Il est conseillé au concepteur d'un algorithme de préciser, autant que faire se peut, l'énoncé du problème à résoudre et ses limites avant de commencer son analyse. On évitera en tout cas de formuler un énoncé précis et clair après l'analyse détaillée.
TERMES TECHNIQUES
affinement progressif
analyse descendante
champ des données
structures de contrôle
© Aflo Informatique , 2003-2004