Algorithmique et Programmation A. Alikacem
Méthodologie de construction de programmes
Problème Concevoir un algorithme permettant de calculer les valeurs minimum et maximum, ainsi que l’écart-type d’une série de notes. L’utilisateur doit spécifier le nombre de notes à saisir et leur moyenne (connue d’avance), puis doit entrer les différentes notes en question, et afficher les différentes valeurs statistiques souhaitées. Une fois conçu, implanter un programme C.
Pré-Analyse Problème Reconnaissance du problème Au besoin, décomposition du problème en sous-problèmes Formulation du problème (spécification, contraintes, etc.) Résolution des ambiguïtés Spécification des différents objectifs Préciser les données en jeu À la fin de cette étape, les objectifs devraient être clairement identifiés, ainsi que la nature des données qui seront manipulées. Toute information pouvant être utile pour la phase suivante doit être mentionnée
Pré-Analyse Objectif: Étant donnés une liste de notes et leurs moyennes, calculer l’écart-type ainsi que les notes minimum et maximum. Les données en questions correspondent à des entiers ou des réels? les notes et la moyenne, ainsi que les différentes résultats correspondent à des nombres réels. Au fait, comment on calcul l’écart-type?
Analyse et Conception Pour chaque sous-problème identifié dans la tache 2.: Identification des besoins: en donner des noms appropriés, des types appropriés et une brève description de leur emploi Identification des tâches et des relations entre elles À ce niveau, on doit avoir les différents commentaires de spécification de chaque bloc qui sont conçus, ainsi que les différents étapes correspondant au corps du bloc. Reprendre les différentes étapes identifiées en 4.ii, et les décrire par des actions élémentaires et/ou des appels à d’autres blocs À la fin de cette étape, tous les blocs ont été conçus. Ces dernières doivent contenir: Des commentaires de spécifications Des assertions Idéalement, des commentaires généraux
Affichage de différents résultats Objectif Besoins n notes moyenne Algorithme Stat Affichage de différents résultats
Début d’analyse Bloc Principal (B1): Calcul de différentes statistiques { Objectif: Saisir des notes et une moyenne et afficher des stats } { Méthode: Utiliser la formule de calcul de l’écart-type } { Besoins: un entier n, des nombres réels, notes, correspondant aux notes ainsi qu’un nombre réel, moyenne, correspondant à la moyenne } { Connu: NOTE_MIN = 0, NOTE_MAX = 100 } { Entrée: Aucune } { Sortie: Aucune } { Résultats: Afficher les différentes statistiques souhaitées } { Hypothèses: n >= 2, notes et moyenne [NOTE_MIN .. NOTE_MAX] } Début { Saisie de la variable n, nombre de notes à saisir } { Saisie de la moyenne } { Initialisation des différentes variables temporaires qui contiendront les résultats } { Saisie et Traitement des différentes notes } { Calcul de l’écart-type } { Affichage des résultats } { A: Les différentes statistiques ont été calculées et affichées } Fin
Conception de l’algorithme Bloc Principal (B1): Calcul de différentes statistiques { Commentaires de spécification} Début { Saisie de la variable n, nombre de notes à saisir } Afficher "Entrez le nombre de notes à saisir " Demander n { A: n >= 2 } { Saisie de la moyenne } Afficher "Entrez la moyenne " Demander moyenne { A: moyenne [NOTE_MIN .. NOTE_MAX] } { Initialisation des différentes variables temporaires qui contiendront les résultats } Min NOTE_MAX { Min contiendra la valeur minimum } Max NOTE_MIN { Max contiendra la valeur maximum } Somme 0 { Somme permet de calculer la somme utilisée dans le calcul de l’écart type } …
Conception de l’algorithme { Saisie et Traitement des différentes notes } Répéter i [ 1 .. n ] Début { Saisir une note } Afficher "Entrez la ", i, "ème note : " Demander Note { A : note [NOTE_MIN .. NOTE_MAX] } Calcul du carré de (note - moy) (Bloc B2) { A : Carré contient le résultat de ( note – moy )2 } Somme Somme + Carré { Cumul des notes } Si ( Note > Max ) Alors { Mise à jour de la valeur maximum } Max Note Fin Si ( Note < Min ) Alors { Mise à jour de la valeur minimum } Min Note …
Conception de l’algorithme { Calcul de la variance } Variance Somme / ( n – 1 ) { Calcul de l’écart-type } Calcul de la racine carré de la variance (Bloc B3) { A : EcarType contient la racine carré de la variance, soit l’écart type } { Affichage des résultats } Afficher " La valeur minimum est : ", Min Afficher " La valeur maximum est : ", Max Afficher " L’écart type est : ", EcarType { A: Les différentes statistiques ont été calculées et affichées } Fin
Implantation En utilisant un langage de programmation approprié, traduire chaque bloc conçu dans la phase précédente (mis à part le bloc principal, il n’est pas nécessaire de traduire et de reproduire les différents commentaires de spécification). À ce niveau, certains choix d’implantation peuvent être fait. De plus: Transformer les entrées du bloc en paramètres de fonction. Si le bloc admet plusieurs sorties, il est alors nécessaire d’ajouter des paramètres à la fonction qui correspondront à des pointeurs. Si le bloc admet des pré-conditions, ajouter un paramètre, codeErr, à la fonction associée permettant de traiter le cas où les pré-conditions ne sont pas vérifiées au moment de l’exécution de la fonction. Toutes les variables manipulées doivent être déclarées, au début de la fonction, avec un type approprié et un commentaire précisant son rôle dans la fonction. Ré-écrire tous les commentaires de type Assertion dans la fonction. Créer un fichier .h dans lequel on met le prototype de chaque fonction définie ainsi que son interface: ce dernier est composé des pré-conditions, post-conditions et de la valeur retournée. À ce niveau, on doit avoir avoir: Un fichier Principal.c contenant la traduction du bloc principal en fonction main(), avec tous les commentaires de spécification et les commentaires généraux. Aussi, ne pas oublier d’inclure le fichier Interface.h (#include « Interface.h"). Un fichier Interface.h contenant les différents prototypes de fonctions accompagnés par leur interface. Un fichier Fonctions.c contenant la définition des différentes fonctions en jeu.
Tests et Vérification Grâce à un main bidon, il est possible de tester chaque fonction d’une manière individuelle. Encore une fois, le choix des données à tester doit être judicieux. Et à chaque fois, on vérifie que la post-condition de la fonction traitée est bien vérifiée. Une fois les fonctions individuelles testées, on peut alors compiler et faire l’édition de lien de tout notre programme, établir un jeu d’essai adéquat (cas désirables et cas indésirables) et tester le tout. Lors des tests, s’il y a des problèmes (bogues) qui sont détectés, il faut alors revenir à une étape précédente de notre méthodologie pour identifier clairement la source du problème et la corriger. Plus on le recul en arrière est grand, plus les bogues seront coûteux. Lorsque tout a été vérifié correctement, on est censé avoir en main 2 dossiers: Une documentation du problème et de sa résolution, à travers tous les algorithmes qui sont très bien documentés. Une implantation en C de la solution du problème: dans ce cas, le code n’est pas aussi documenté que les algorithmes, mais on garde l’essentiel (commentaires généraux, Interface des fonctions, etc.). De cette manière, la partie codée en C constitue le programme informatique, et la partie algorithmique correspond à sa documentation détaillée.
En résumé! La méthodologie de développement se compose de 4 grandes phases: Analyse et conception des blocs algorithmiques. Codification des blocs (en C). Test et vérification du programme réalisé. Correction, au besoin, du programme.