Analyse du programme de l'agenda électronique fugace

ENONCE : Le programme permet de gérer un agenda électronique (en mémoire vive : tout son contenu diparaîtra dès que l'on sortira du programme, d'où son qualificatif "fugace". Nous verrons plus tard comment le gérer sur disque). Le programme se déroule en 2 phases :
  1. L'utilisateur peut compléter l'agenda en y introduisant au maximum X correspondant(e)s (ce nombre maximum sera donné en constante et modifiable à chaque compilation). Pour chaque correspondant(e), l'utilisateur introduit le prénom, le nom et le numéro de téléphone.
  2. Dans la seconde phase, l'utilisateur doit pouvoir, autant qu'il le désire, rechercher un(e) correspondant(e) sur base de son prénom ou de son nom. Le programme affiche alors soit toutes les personnes correspondant à ce critére, soit qu'il n'a trouvé personne répondant à ces critères dans l'agenda.

Phase 1

La première chose à faire est de relire l'énoncé afin de bien en capter toutes les finesses et les éléments cachés (Quoi Faire Faire)

Il faut ensuite mettre au point la stratégie globale et définir les variables qui y seront associées.

Le premier point est le nombre maximum de correspondant(e)s. L'utilisateur doit introduire une valeur inférieure à un nombre X déclaré en constante. Ceci n'est pas fondamentalement un problème. S'il y avait un maximum de 20 correspondant(e)s (voir élections), on signalerait à l'utilisateur qu'il ne peut remplir plus de 20 fiches et on testerait sa réponse pour voir s'il donne une valeur inférieure ou égale à 20. Ici, si l'on déclare la constante MAX_CORRESP, il suffira de signaler la limite se situe à MAX_CORRESP et de tester la valeur entrée par l'utilisateur pour vérifier si elle est bien inférieure ou égale à MAX_CORRESP.

Un second point est de savoir comment l'utilisateur va signaler le nombre de fiches qu'il va utiliser. On pourrait soit:

C'est cette seconde solution qui sera retenue. Elle exige d'avoir un compteur qui comptabilise le nombre de correspondant(e)s introduit(e)s et qui jouera le rôle de variable signalant dant toutes les procédres suivantes le nombre de fiches réellement utilisées (voir élections).

Un autre point à élucider est le stockage des données. Les prénoms et noms sont des chaînes de caractères. Qu'en est-il des numéros de téléphone? Dois-je pouvoir téléphoner aujourd'hui aux personnes dont l'arrondi de la racine cubique du numéro de téléphone est égale à la date du jour? Autrement dit, dois-je pouvoir faire des calculs avec les numéros de téléphone? La réponse est bien entendu non. Ils seront donc traités comme des chaînes de caractères. Je pourrais ainsi y introduire des signes spéciaux tels que: + 32 (0) 12 / 34.56.78

Tous les éléments à stocker étant de type chaînes de caractères, nous pourrons déclarer une matrice de trois lignes (prénom, nom et téléphone) et de X colonnes, X étant la valeur déclarée en constante.


Cette matrice risque d'être trop grande, et l'utilisateur peut fixer une limite d'utilisation inférieure à sa dimension réelle, par exemple 10 correspondant(e)s. Dans ce cas, les colonnes inutiles ne seront jamais utilisées durant tout le programme. La matrice sera toujours traitée jusqu'à la valeur MAX donnée implicitement par l'utilisateur quand il tapera le signal de fin de remplissage lors de l'introduction des données.


Dans la seconde partie du programme, le problème de la recherche des fiches contenant un prénom OU un nom précis va se poser.

Une personne peut s'appeler Philippe CATHERINE et une autre Catherine PHILIPPE. Si l'utilisateur recherche Catherine en tant que prénom, il ne devra pas recevoir en retour la fiche de Philippe CATHERINE. Il faudra donc demander deux renseignements à l'utilisateur:

  1. sur quel critère la recherche se fera-t-elle (sur base du prénom OU du nom)?
  2. quelle est la chaîne de caractères proprement dite qui est à rechercher?

Au moment où l'ordinateur parcourera la matrice de fiche en fiche (de la fiche 1 à la fiche MAX) afin de trouver les correspondant(e)s répondant aux critères introduits, il devra effectuer la comparaison de la façon suivante:


Dans ces conditions, il n'y aura pas de "mélange" entre les prénoms ou les noms en fonction de ce que l'utilisateur recherche.

Cette recherche fonctionne de la façon suivante:

  1. la variable booléenne ON_A_TROUVé est mise à FAUX (puisqu'on n'a encore rien trouvé)
  2. à chaque fiche correspondant à la recherche (il peut y en avoir une ou plusieurs), on affiche le contenu de la fiche et la variable ON_A_TROUVé est mise à VRAI
  3. en fin de procédure, on vérifie l'état de ON_A_TROUVé. Si cette variable est toujours à FAUX, c'est qu'aucune fiche correspondant à la recherche n'a été trouvée. On le signale alors à l'utilisateur.

Phase 2

Il faut maintenant découper le programme en procédures (modules) et déterminer quelles informations transitent de la procédure appelante (dans ce cas-ci, le programme principal) aux procédures appelées. Ces informations en transit sont les paramètres qui sont soit des paramètres Valeurs (informations en "aller simple") soit des paramètres Variables (informations en "aller-retour").

Les différentes procédures qui composent le programme peuvent correspondre aux grandes étapes de celui-ci, à savoir:


Phase 3

Nous allons maintenant développer chaque procédure et définir les différents paramètres nécessaires à leur bon fonctionnement.


Avertit l'utilisateur de ce que va faire le programme et de la manière dont il va se dérouler.

Cette procédure ne contient aucune variable, elle ne possédera donc aucun paramètres.



Cette procédure va permettre à l'utilisateur d'introduire les coordonnées de ses différent(e)s correspondant(e)s.

La procédure signale d'abord le maximum de fiches qui sont disponibles (défini par la constante MAX_CORRESP).

La variable COMPTEUR est initialisée à 1. Cette variable va pointer, au fur et à mesure de l'introduction des corespondant(e)s, sur le numéro de la fiche que l'utilisateur est en train de remplir.

Une manière de procéder est de lire la variable PTIT_NOM avant l'entrée dans la boucle TANT QUE. La boucle ne sera effectuée que si le contenu de PTIT_NOM est différent de "0" ET qu'il reste au moins une fiche disponible, càd si COMPTEUR est inférieur ou égal au contenu de la contante MAX_CORRESP.

Si toutes les conditions sont réunies pour remplir une nouvelle fiche, PTIT_NOM est copié dans la case PRENOM de la fiche qu'on est en train de remplir. Le nom et le numéro de téléphone de cette personne sont alors demandés.

COMPTEUR est alors incrémenté (on y ajoute 1) de façon à ce qu'il pointe sur la fiche suivante. Si on pointe sur une fiche inexistante (valeur supérieure à MAX_CORRESP), il est inutile de demander le PTIT_NOM suivant et la boucle s'arrêtera de tourner.

Si la valeur de COMPTEUR pointe sur une fiche qui existe, le contenu de PTIT_NOM est à nouveau demandé. L'utilisateur a alors le loisir d'entrer le prénom suivant ou de clôturer la liste en tapant la valeur "0".

Quand la boucle TANT QUE s'arrête, COMPTEUR pointe d'office vers la fiche qui suit la dernière fiche remplie. Il suffira donc de décrémenter COMPTEUR (soustraire 1) afin de savoir combien de fiches ont été remplies. La variable MAX est alors affectée avec cette valeur qui représente la limite à ne jamais dépasser dans les traitements ultérieurs.

Le moment est venu de relire la procédure afin de se poser la question de savoir, pour chaque variable utilisée, s'il s'agit d'une variable locale, d'un paramètre valeur ou d'un paramètre variable (se référer au point 22 des feuilles de syntaxe).

PTIT_NOM et COMPTEUR sont des variables locales car leurs contenus ne viennent pas d'ailleurs et elles ne sont pas nécessaires à la poursuite du programme après la fin de la procédure. AGENDA et MAX ont eu leurs contenus modifiés et ces modifications sont nécessaires dans les autres procédures, ce sont donc des paramètres variables.



La procédure commence par le choix de la recherche sur le prénom OU sur le nom (et également le choix d'arrêter la recherche quand l'utilisateur tapera une donnée autre que 1 OU 2).

Le second critère de recherche est alors lu, il s'agit de la chaîne de caractères proprement dite à rechercher.

Dans la boucle, on met alors le signal ON_A_TROUVé à FAUX (voir plus haut) et on effectue le balayage complet de la matrice (de 1 à MAX) avec la boucle POUR.

Dans le cas où la condition du SI donne un résultat VRAI (le prenom recherché est découvert OU le nom recherché est découvert), on affiche tout le contenu de la fiche et la variable ON_A_TROUVé est mise à VRAI.

Après la fin de boucle POUR, on teste l'état du signal ON_A_TROUVé et s'il est toujours à FAUX, c'est qu'aucune fiche n'a été trouvée. La procédure l'affiche alors.

Après ce test, les coordonnées d'une nouvelle recherche sont lues dans la variable CHOIX (afin que la condition du TANT QUE puisse être testée) et, éventuellement, l'utilisateur peut procéder à la fin des recherches en tapant "0".

A part MAX et AGENDA, toutes les autres variables ne reçoivent aucune donnée d'ailleurs et leurs nouveaux contenus ne sont pas nécessaires à la poursuite du programme après la fin de la procédure. Ces variables sont donc des variables locales.

En revanche, MAX et AGENDA reçoivent leurs données d'autre(s) procédure(s). Toutefois, leurs contenus ne sont pas modifiés dans cette procédure, ce seront donc des paramètres valeurs.


Phase 4

Afin de déclarer toutes les variables et les paramètres aux bons endroits, il est pratique de représenter l'organigramme du programme et d'y adjoindre les mouvements des différents paramètres. Chaque paramètre sera déclaré "au niveau le plus haut où il passe" (voir point 23 des feuilles de syntaxe).


Les variables locales ne "sortent" pas de leurs procédures, elles y sont donc déclarées.


Phase 5

Il s'agit maintenant de tout traduire en Pascal, ce qui n'est pas une difficulté majeure sauf peut-être en ce qui concerne la syntaxe pour les paramètres. Il faut pour cela se référer aux points 24 et 25 des feuilles de syntaxe.

Un programme dont la syntaxe est correcte (compilé avec succès) n'est pas nécessairement un programme correct. Il faut encore le valider.


Phase 6

Il faut maintenant valider le programme, càd le tester pour toutes les possibilités d'entrées et voir s'il se comporte correctement et fournit les réactions escomptées.

Le programme se comportera-t-il correctement...

Ce sont les réponses à toutes ces questions qui permettront de déterminer le degré de fiabilité et de robustesse du programme réalisé.


Phase 7

Et voilà, il n'y a plus qu'à essayer de refaire le programme seul afin de voir si tu as intégré toutes les finesses de programmation et à le tester en Pascal.

Bon travail.





© 2000 Rupert Meurice de Dormale
Toute utilisation autre que personnelle interdite sans accord écrit de l'auteur.