On veut réaliser un programme gérant diverses structures de données. Ces données se composent d'éléments, qu'on souhaite voir triés selon un certain ordre. On doit pouvoir insérer, supprimer ou modifier ces éléments.
La condition de tri peut d'emblée suggérer l'emploi d'une table d'indirection pour l'accès aux éléments triés. Par ce moyen, on évite de recopier les éléments à chaque nouveau tri (ce qui serait coûteux en temps dans le cas général), et on se ramène à modifier la table d'indirection. On introduit donc :
Par exemple :
| rang physique | donnée |
1 | "PREMIER" |
2 | "DEUXIEME" |
5 | "CINQUIEME" |
8 | "HUITIEME" |
| rang logique | donnée |
RG(1)=5 | "CINQUIEME" |
RG(2)=2 | "DEUXIEME" |
RG(3)=8 | "HUITIEME" |
RG(4)=1 | "PREMIER" |
On utilisera généralement un tableau RG pour réaliser la table d'indirection :
RG( rang_logique ) = rang_physique
Une première analyse du problème vise à extraire de l'énoncé les propriétés des objets qu'on va définir, et de cette analyse déduire la spécification formelle de ces objets.
Dans le cas présent, on obtient (...) l'interface de l'objet construit :
TYPE type_element : ...; | ||
PROCEDURE Lire_Objet | ( | m : IN integer; x : OUT type_element ); |
PROCEDURE Ecrire_Objet | ( | m : IN integer; x : IN type_element ); |
PROCEDURE Inserer_Objet | ( | m : IN integer; x : IN type_element; men : OUT boolean ); |
PROCEDURE Supprimer_Objet | ( | m : IN integer; men : OUT boolean ); |
PROCEDURE Rechercher_Objet | ( | x : IN type_element; m : OUT integer; men : OUT boolean ); |
men retourne un compte-rendu d'erreur ;RG n'est pas passée en paramètre des procédures parce qu'on la considère comme globale au module.Il reste à réaliser toutes ces procédures définies comme propriétés du type des éléments.
Si l'on ne s'intéresse qu'à l'aspect méthodologique du problème, on met simplement quelques points de suspension, en indiquant par là que ce n'est pas l'objet de notre propos. Il faut cependant reconnaître que la spécification formelle telle qu'elle est décrite ci-dessus, si elle demande de la part du programmeur un effort de conception supplémentaire, ne représente en revanche en taille de code écrit qu'une petite partie, purement déclarative. De plus, le respect d'une cohérence d'ensemble dans les évolutions possibles de cette partie de code est en général assez bien assuré par un compilateur, puisqu'il s'agit justement de déclarations. Ceci serait en fait à moduler en fonction du choix du langage de programmation arrêté, mais on peut prétendre à l'emploi de langages ou d'outils suffisamment structurés pour réaliser dès la phase de compilation des contrôles de sémantique statique (exemple, avec le langage C, la commande : make).
C'est donc à cette zone de points de suspension qu'on s'attachera, puisqu'elle représente la majeure partie du texte source qu'on va écrire.
Remarque :
On peut distinguer deux catégories de procédures dans l'exemple :
Lire_Objet et Ecrire_Objet, qui travaillent uniquement sur les éléments ;Dans la suite on présente rapidement les deux premières, et on s'attardera davantage sur la dernière, à savoir la procédure de recherche Rechercher_Objet.