1 e r t i p a h C c Environnement algorithmique et conventions Un algorithme est un maillon de la chaîne de développement d’une application. Il est le lien indispensable entre l’analyse et le développement final. Ce chapitre présente le rôle d’un algorithme dans cette chaîne de production, et les conventions syntaxiques utilisées pour son écriture. Il aborde également les notions de performances et de génie logiciel, qui servent souvent de guides dans la phase de conception algorithmique. 1 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 1 16/08/10 17:00 Algorithmique 1. LLes étapes de développement d’une d application L’écriture d’un programme dans un langage de programmation n’est que l’étape finale d’un développement qui se déroule en trois phases : l’analyse, l’algorithme et la programmation. 1.1. L’analyse Le but de tout développement est de fournir une solution informatique à un problème donné. La première étape est l’analyse du problème. Elle consiste, à explorer le domaine d’application pour en déduire les contraintes et les limites de l’étude, à définir les principales fonctionnalités qui devront être couvertes par le logiciel, à mettre en évidence les problèmes connexes, à faire l’inventaire des acteurs (utilisateurs, gestionnaires, etc.) et à en déduire l’interface d’exploitation du produit, etc. L’analyse tend à cerner complètement le sujet et à apporter des solutions aux problèmes dévoilés par l’étude. L’analyse se termine généralement sur des considérations plus techniques qui font le lien avec l’algorithme. Il s’agit de l’analyse des données qui aboutit à leur modélisation, de la définition des modules de traitement, ainsi que leurs interactions réciproques qui débouchent sur la création des sous-programmes. L’analyse conditionne le développement futur, car ce sont les solutions proposées à cette étape qui seront programmées. Une mauvaise analyse produira un logiciel médiocre ou qui ne répondra pas aux attentes initiales, quelle que soit la qualité de l’algorithme ou de la programmation. Voici deux exemples d’analyses partielles. Le premier montre l’incidence de l’étude du domaine d’application sur le résultat de l’analyse. Le second propose une analyse des données et montre comment les structurer en fonction des traitements à effectuer. L’analyse du premier exemple va évoluer au fur et à mesure que les bonnes questions seront soulevées. Elle produira au final un programme très différent dans sa complexité. Prenons le problème de l’interprétation du numéro de Sécurité sociale (sans la clé finale). La signification des champs de ce numéro est indiquée à la figure 1.1. Figure 1.1 L’interprétation d’un numéro de Sécurité sociale. Année de naissance Département de naissance Numéro d'ordre 2 60 07 75 028 090 Sexe 2 Mois de naissance Commune de naissance Une première analyse de ce numéro montre qu’il s’agit d’une femme, née en 1960, au mois de juillet, à Paris. Or, l’interprétation du quatrième élément de cet exemple est fausse ! Cette personne est née dans le département de la Seine qui, en 1960, regroupait Paris et les départements limitrophes (Val-de-Marne, Val d’Oise, etc.). Cette remarque soulève d’autres questions qui vont compliquer l’analyse, en intégrant un volet historique : • Comment le découpage des départements a-t-il évolué (Ile-de-France, Corse, etc.) ? © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 2 16/08/10 17:00 • Comment le problème des centenaires est-il réglé ? L’analyse simpliste du début aurait conduit à écrire un programme ne traitant qu’une partie de la problématique. Le problème est en réalité beaucoup plus complexe qu’il n’y paraît. L’erreur qu’il ne faut pas faire pendant la phase d’analyse est d’apporter des solutions basées sur ses certitudes, au lieu de se poser d’abord des questions. Le second exemple montre comment, à partir de l’analyse des données, on peut aboutir à leur modélisation. L’exemple étudié est celui d’une course hippique. La première question à se poser est « qu’est-ce qu’un cheval ? ». La réponse n’est pas liée à la nature de l’animal, mais aux actions à entreprendre pour gérer une course. On peut les résumer à : • indiquer la liste des chevaux au départ de la course ; • affecter le temps de chaque cheval à la fin de la course ; • afficher l’ordre d’arrivée. On peut déduire qu’une donnée représentant un cheval doit contenir : • le nom du cheval ; • le numéro du dossard ; • le temps d’arrivée ; • le classement. On peut également ajouter le nom du jockey, celui du propriétaire, et le montant des gains si on désire ajouter un volet financier à la gestion de la course. La figure 1.2 présente une modélisation des données de la course hippique. Les chevaux sont gérés comme une liste, où chaque élément est une structure contenant le nom du cheval, le numéro du dossard, le temps effectué durant la course et le classement final. La liste peut être représentée sous la forme d’un tableau, où chaque case contient toute l’information d’un cheval, ou bien sous la forme d’éléments distincts liés entre eux par la connaissance de l’élément précédent et suivant (liste chaînée de structures). La modélisation des données est ensuite suivie par la description de leurs traitements, ce qui est le but de l’algorithme. Figure 1.2 Modélisation des données d’une course hippique. Chapitre 1 Environnement algorithmique et conventions • Qu’en est-il des personnes nées dans les colonies françaises avant leur indépendance ? Liste des chevaux Structure Cheval Nom Dossard Temps Classement Flèche d'argent 21 1' 32" 5 3 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 3 16/08/10 17:00 Algorithmique 1.2. L’algorithme Le rôle de l’algorithme est avant tout d’organiser et de structurer l’ensemble des solutions apportées par l’analyse pour aboutir à la solution globale. Il doit surtout présenter la logique aboutissant au résultat final et être dissocié de l’aspect technique des langages informatiques. Il est généralement présenté en pseudo-langage (langage simplifié), ce qui facilite sa traduction dans un langage de programmation. Voici l’algorithme interprétant le numéro de Sécurité sociale, correspondant à une analyse (sans l’aspect historique). Programme Num_Sec_Soc Déclarations Variables Num_Sec, Dépt, Libellé, Nom_Mois en Chaînes_de_Caractères Variables Sexe, Année, Mois, Commune, Num_Ordre en Entier Début Écrire (“Entrez votre numéro de Sécurité sociale :“) Lire(Num_Sec) Sexe ← Conversion_En_Entier(sous_chaîne(Num_Sec,1,1) Si (Sexe = 1) alors Libellé ← "Monsieur" Sinon Libellé ← "Madame" Finsi Année ← Conversion_En_Entier(sous_chaîne(Num_Sec,2,2)) Année ← Année + 1900 Mois ← Conversion_En_Entier(sous_chaîne(Num_Sec,4,2)) Selon Mois Faire Cas 1 : Nom_Mois ← "Janvier" Cas 2 : Nom_Mois ← "Février" Cas 3 : Nom_Mois ← "Mars" Cas 4 : Nom_Mois ← "Avril" Cas 5 : Nom_Mois ← "Mai" Cas 6 : Nom_Mois ← "Juin" Cas 7 : Nom_Mois ← "Juillet" Cas 8 : Nom_Mois ← "Août" Cas 9 : Nom_Mois ← "Septembre" Cas 10 : Nom_Mois ← "Octobre" Cas 11 : Nom_Mois ← "Novembre" Cas 12 : Nom_Mois ← "Décembre" FinSelon Dépt ← sous_chaîne(Num_Sec,6,2) Commune ← Conversion_En_Entier(sous_chaîne(Num_Sec,8,3)) Num-Ordre ← Conversion_En_Entier(sous_chaîne(Num_Sec,11,3)) Écrire ("Bonjour : ", Libellé) Écrire ("Vous êtes né en : ", Année) Écrire ("Au mois de : ", Nom_Mois) Écrire ("Dans le département : ", Dépt) Écrire ("Dans la commune : ", Commune) Écrire ("Avec le numéro d'ordre : ", Num_Ordre) Fin La syntaxe du pseudo-langage est librement choisie par le développeur. Cependant, elle respecte certaines règles et conventions usuelles qui sont décrites dans ce chapitre. 4 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 4 16/08/10 17:00 Une fois l’algorithme écrit, il faut le traduire en un programme source. Cela consiste à écrire un fichier texte contenant la traduction de l’algorithme dans un langage de programmation. Le programme source est ensuite traduit en langage binaire du processeur grâce au compilateur. Le fichier résultat de cette opération est le programme exécutable. Dans l’absolu, le développeur doit choisir le langage de programmation le plus adapté au domaine d’application et aux contraintes liées à l’algorithme. En effet, les langages de programmation ont été créés pour répondre à des besoins spécifiques. Par exemple, le langage Fortran est dédié au calcul scientifique, le langage C est polyvalent et il excelle dans les applications systèmes et réseaux, le langage Java est conçu pour les développements liés au Web, etc. En réalité, le développeur choisit le langage qu’il connaît le mieux ou, de manière plus pragmatique, pour lequel il possède un compilateur. Ce n’est donc pas toujours le langage le mieux adapté aux spécificités du développement qui est utilisé. Voici le programme source numsecsoc.c écrit en langage C qui correspond à l’algorithme du numéro de Sécurité sociale. La syntaxe du langage C n’admet aucun caractère accentué dans le nom des variables. La variable Libellé de l’algorithmique est ainsi écrite Libelle dans le programme C. Chapitre 1 Environnement algorithmique et conventions 1.3. L’écriture du programme dans un langage de programmation «C» /* numsecsoc.c */ #include <stdio.h> main() {/* --- déclarations des variables --- */ char Num_Sec[14], Libelle[9], Nom_Mois[10], Dept[3] ; int Sexe, Annee, Mois, Commune, Num_Ordre ; /* --- instructions --- */ /* saisie du numéro sous la forme d’une chaîne */ printf(“Entrez votre numéro de Sécurité sociale : “) ; scanf(“%s“,Num_Sec) ; /* récupération du numéro 1 ou 2 du Sexe */ Sexe = Num_Sec[0]-48 ; /* Affectation du Libellé */ if (Sexe == 1) strcpy(Libelle,“Monsieur“) ; else strcpy(Libelle,“Madame“) ; /* récupération de l’année de naissance */ Annee = ((Num_Sec[1]-48)*10) + (Num_Sec[2]-48) ; Annee = Annee + 1900 ; /* récupération du mois de naissance */ Mois = ((Num_Sec[3]-48)*10) + (Num_Sec[4]-48) ; switch (Mois) { case 1 : strcpy(Nom_Mois,“Janvier“) ; break ; case 2 : strcpy(Nom_Mois,“Février“) ; break ; case 3 : strcpy(Nom_Mois,“Mars“) ; break ; case 4 : strcpy(Nom_Mois,“Avril“) ; break ; case 5 : strcpy(Nom_Mois,“Mai“) ; break ; 5 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 5 16/08/10 17:00 Algorithmique case 6 : strcpy(Nom_Mois,“Juin“) ; break ; case 7 : strcpy(Nom_Mois,“Juillet“) ; break ; case 8 : strcpy(Nom_Mois,“Août“) ; break ; case 9 : strcpy(Nom_Mois,“Septembre“) ; break ; case 10 : strcpy(Nom_Mois,“Octobre“) ; break ; case 11 : strcpy(Nom_Mois,“Novembre“) ; break ; case 12 : strcpy(Nom_Mois,“Décembre“) ; break ; } /* récupération du département */ Dept[0]=Num_Sec[5] ; Dept[1]=Num_Sec[6] ; Dept[2]=’\0’ ; /* récupération de la Commune */ Commune=((Num_Sec[7]-48)*100)+((Num_Sec[8]-48)*10)+(Num_Sec[9]-48) ; /* récupération du numéro d’ordre */ Num_Ordre=((Num_Sec[10]-48)*100)+((Num_Sec[11]-48)*10)+(Num_Sec[12]-48); /* Affichage des résultats */ printf(“Bonjour %s\n“,Libelle) ; printf(“Vous êtes né en : %d\n“,Annee) ; printf(“Au mois de : %s\n“,Nom_Mois) ; printf(“Dans le département : %s\n“,Dept) ; printf(“Dans la commune : %d\n“,Commune) ; printf(“Avec le numéro d’ordre : %d\n“,Num_Ordre) ; } La compilation de ce programme est obtenue par la commande suivante : $ make numsecsoc Voici l’exécution du logiciel (fichier exécutable) numsecsoc produit par la compilation précédente (le caractère $ représente le prompt du système UNIX) : $ numsecsoc Entrez votre numéro de Bonjour Vous êtes né en Au mois de Dans le département Dans la commune Avec le numéro d’ordre Sécurité sociale : 1650475110019 Monsieur : 1965 : Avril : 75 : 110 : 19 2. Le L pseudo-langage 6 Le pseudo-la pseudo-langage n’est pas un langage normalisé. Chaque développeur peut définir son propre langage et ses conventions syntaxiques. Il est important de préciser son rôle et les conventions habituellement rencontrées. © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 6 16/08/10 17:00 Le but de ce langage est de simplifier l’écriture du programme en s’affranchissant des contraintes syntaxiques liées aux langages de programmation, et d’en souligner sa logique. Si le pseudo-langage, par sa simplicité, aide à présenter l’algorithme, il sert aussi à formaliser plus clairement la structure du programme. Le pseudo-langage doit refléter, le plus possible, les instructions couramment rencontrées dans les différents langages de programmation. Sans être l’image d’un langage spécifique, il doit néanmoins être facilement traduisible dans différents langages, ce qui suppose l’utilisation d’une syntaxe proche de ce que les langages de programmation proposent généralement. 2.2. Conventions syntaxiques Même si chaque développeur définit son propre pseudo-langage, certaines conventions sont couramment employées. Nous en détaillons quelques-unes, à partir de l’exemple présenté précédemment. Les autres conventions utilisées dans cet ouvrage seront décrites au fur et à mesure de leur emploi. Chapitre 1 Environnement algorithmique et conventions 2.1. Son rôle La structure du programme Un programme est structuré en une partie déclaration et une partie instruction. Même si tous les langages ne proposent pas une structure rigoureuse, il est préférable de la présenter dans l’algorithme. Les mots clés sont « Programme » pour le début du programme, « Déclarations » pour la déclaration des variables, et « Début » puis « Fin » pour la partie instruction. Programme Num_Sec_Soc Déclarations Variables Num_Sec, Dépt, Libellé, Nom_Mois en Chaînes_de_Caractères Variables Sexe, Année, Mois, Commune, Num_Ordre en Entier Début Écrire (“Entrez votre numéro de Sécurité sociale :“) ... Fin Les entrées/sorties Les instructions qui effectuent l’affichage à l’écran et la saisie au clavier sont respectivement « Écrire() » et « Lire() ». La première instruction affiche un message à l’écran, la seconde saisit une valeur qu’elle range dans la variable Num_Sec. Écrire (“Entrez votre numéro de Sécurité sociale :“) Lire(Num_Sec) L’affectation L’affectation d’une valeur ou du résultat d’un calcul dans une variable est représentée par la flèche « ← ». Le calcul à droite de la flèche est affecté à la variable située à gauche. Année ← Année + 1900 Les instructions composées Les instructions composées se terminent généralement par un mot clé qui dépend de l’instruction. Ainsi, le test « Si » se termine par « FinSi », et la boucle « Tant que » par « FinTantQue ». 7 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 7 16/08/10 17:00 Algorithmique Si (Sexe = 1) alors Libellé ← "Monsieur" Sinon Libellé ← "Madame" FinSi Les sous-programmes Les sous-programmes sont les modules de traitement. Leur nom reflète généralement leur rôle, et leurs arguments indiquent sur quelles données ils travaillent. La fonction sous_chaîne() donnée en exemple extrait une partie de la chaîne Num_sec, à partir du caractère 1, sur 1 caractère. La fonction Conversion_En_Entier() convertit un caractère (par exemple ‘2’) en son équivalent entier (2). Sexe ← Conversion_En_Entier(sous_chaîne(Num_Sec,1,1) 3. Le L génie logiciel Le génie logi logiciel est un concept complexe qui regroupe des notions et des méthodes permettant de concevoir un logiciel de qualité. Nous n’allons pas détailler ici ses concepts, mais rappeler quelques règles de bon sens qui en guident la pratique. 3.1. La modélisation des données Tout développement doit commencer par l’étude des données. C’est le rôle de l’analyse des données. La gestion d’une base de noms de personnes dépend, par exemple, de la nature des noms et de leur taille maximale. Une étude qui porterait uniquement sur des noms simples comme « Dupont » déboucherait sur un logiciel incapable de gérer les noms composés comme « De la Fontaine » (l’espace est un séparateur générique entre les mots). D’autre part, la structure des données est souvent déduite des traitements. C’est l’exemple de la course hippique, où la modélisation d’un cheval dépend des actions à effectuer pour gérer la course (voir figure 1.2). Une mauvaise analyse des données aboutit à un logiciel incomplet, ou à sa réécriture partielle si la structure des données doit être modifiée. 3.2. La modularité du programme 8 Un programme doit organiser le traitement global en s’appuyant sur des modules de traitement autonomes. Chaque module est une boîte noire ; son fonctionnement interne est invisible aux autres modules. Il travaille sur les données fournies au moment de l’appel, et retourne le résultat du traitement. L’avantage de cette modularité est la possibilité de modifier le traitement interne d’un des modules par un algorithme plus performant, sans intervenir sur le reste du programme. Ainsi, les différents modules de traitement possibles dans le cas de la course hippique sont par exemple : saisie_chevaux() qui met à jour le nom et le dossard des chevaux, saisie_des_temps() qui renseigne le champ Temps de chaque cheval à l’arrivée, tri_chevaux() qui établit le classement, et affichage_chevaux() qui affiche les informations des chevaux. © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 8 16/08/10 17:00 Un programme doit être lisible pour vous, mais aussi pour les autres. Il n’est pas rare qu’un développement initial soit modifié par d’autres personnes. Un moyen simple d’assurer une bonne lisibilité est d’utiliser abondamment les commentaires, et de choisir avec soin les noms des variables et des procédures afin qu’ils reflètent leur rôle. Indiquez également en haut du programme les différentes évolutions du logiciel avec le nom du programmeur, la date de modification et la modification apportée. Enfin, la structure du programme doit être visible au premier coup d’œil. Il faut présenter le programme avec indentation, c’est-à-dire décaler de quelques espaces le début des instructions internes à une boucle ou à un test pour faire apparaître leur niveau d’imbrication. 3.4. Privilégier les solutions simples Chapitre 1 Environnement algorithmique et conventions 3.3. La lisibilité du programme Les solutions les plus simples sont les meilleures. Nous aurons l’occasion dans cet ouvrage de démontrer qu’en réfléchissant plus longtemps sur les données, on trouve souvent un algorithme plus simple et plus efficace. Malheureusement, les solutions simples sont plus difficiles à trouver car elles nécessitent une réflexion approfondie. Ce n’est qu’une fois trouvées qu’elles deviennent simples voire même évidentes. Le principal défaut des programmeurs débutants est de se jeter sur des solutions basées sur des techniques de programmation, plutôt que de privilégier la réflexion, et donc l’algorithmique. 3.5. L’utilisation de conventions d’écriture Le développement d’un programme peut devenir fastidieux si aucune méthode n’est utilisée. Pour gagner du temps et obtenir une meilleure lisibilité, il faut définir des conventions d’écriture. On peut par exemple écrire les noms des constantes en majuscules, comme PI, ou utiliser des libellés de variables plus clairs, comme nombre_de_mois ou NombreDeMois. 4. La L performance algorithmique Un algorithme algorithm doit proposer une solution logique à un problème donné, mais ce n’est pas sa seule finalité. Il doit également fournir le résultat rapidement. Il est possible de concevoir une solution qui s’avère catastrophique en temps de calcul. Or, à quoi sert un algorithme qui donne le résultat au bout d’un temps interminable ? C’est l’une des principales différences entre les mathématiques et l’informatique ; en informatique, on effectue réellement les calculs, d’où l’importance de contrôler leur nombre et leur temps d’exécution. Cet aspect performance est l’objectif principal des algorithmes présentés en deuxième partie de cet ouvrage : trouver des traitements optimisés. La performance d’un algorithme porte sur deux aspects, le temps de calcul et l’espace mémoire. Dans les deux cas, on tente de minimiser le volume du traitement. Malheureusement, ces deux points s’opposent. Il faut souvent utiliser plus de mémoire 9 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 9 16/08/10 17:00 Algorithmique pour gagner en temps de calcul, ou écrire plus d’instructions, et donc faire plus de calculs, pour aboutir à une gestion mémoire optimale. Résumé Un algorithme organise les solutions préconisées dans la phase d’analyse. Il est souvent écrit en pseudo-langage car il doit présenter la logique du programme sans intégrer les aspects techniques des langages de programmation. L’analyse, est primordiale, car ce sont les solutions préconisées à ce niveau qui seront programmées. La modélisation des données débouche sur le début de l’algorithme qui formalise les données et les traitements associés. La phase finale d’écriture dans un langage spécifique n’est qu’une étape technique. L’écriture de l’algorithme requiert une méthodologie que l’on retrouve dans le concept de génie logiciel. Il faut définir clairement les modules de traitement et s’astreindre à une certaine rigueur de développement pour aboutir à un programme lisible et évolutif. D’autre part, la conception d’algorithmes doit tendre à optimiser le temps de calcul, ou l’espace mémoire, pour produire des programmes performants. 10 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 10 16/08/10 17:00 Problèmes et exercices Le premier exercice montre comment utiliser le pseudo-langage. Le second exercice porte sur la modélisation des données et sur la conception de modules autonomes. Exercice 1 : Syntaxe algorithmique 1. Écrivez l’algorithme qui calcule la mensualité d’un crédit immobilier à taux fixe. Il demandera le montant du capital emprunté, le nombre d’années et le taux annuel. La formule de calcul est la suivante : N (1 + T) M = C× T × N (1 + T) − 1 Où M est la mensualité, C, le capital emprunté, T, le taux mensuel/(taux annuel/12), N, le nombre de mois/(nombre d’années/12). 2. Écrivez le programme C qui implémente cet algorithme. Solution 11. L’ L’algorithme l ith emprunt montre comment utiliser le pseudo-langage pour écrire un programme. Le calcul de la mensualité le décompose en trois calculs plus simples. Calcul1 = C×T Calcul2 = (1+T)N Calcul3 = (1+T)N –1 La syntaxe « ** » représente le calcul de la puissance. Les commentaires sont notés comme dans le langage C « /* … */ ». Programme emprunt Déclarations Variables Mensualité, Capital en Variables TauxMensuel, TauxAnnuel en Variables Calcul1, Calcul2, Calcul3 en Variables NbAN, NbMois en Début /* Saisie des données initiales */ Écrire (“Montant du capital emprunté :“) Lire(Capital) Écrire (“Nombre d’années :“) Lire(NbAn) Écrire (“Taux Annuel (exemple 5,5 %):“) Lire(TauxAnnuel) /* Calculs */ NbMois ← NbAn*12 TauxMensuel ← (TauxAnnuel/100)/12 Réel Réel Réel Entier 11 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 11 16/08/10 17:00 calcul1 ← Capital*TauxMensuel calcul2 ← (1+TauxMensuel)**NbMois calcul3 ← calcul2-1 Mensualité ← calcul1*(calcul2/calcul3) /* Affichage du résultat */ Écrire ("Mensualité :",Mensualité) Fin 2. Le programme emprunt.c utilise la fonction pow() qui calcule la puissance, ce qui implique l’utilisation du fichier d’en-tête « math.h » et la compilation avec l’option –lm. «C» /* emprunt.c */ #include <stdio.h> #include <math.h> main() { float Mensualite,Capital ; int NbAn,NbMois ; float TauxMensuel,TauxAnnuel ; float calcul1,calcul2,calcul3 ; /* Saisie des données initiales */ printf(“Capital :“) ; scanf(“%f“,&Capital) ; printf(“Nombre d’années :“) ; scanf(“%d“,&NbAn) ; printf(“Taux Annuel (5.5) :“) ; scanf(“%f“,&TauxAnnuel) ; /* Calculs */ NbMois = NbAn*12 ; TauxMensuel = (TauxAnnuel/100)/12 ; calcul1 = Capital*TauxMensuel ; calcul2 = pow((1+TauxMensuel),NbMois); calcul3 = calcul2-1; Mensualite = calcul1*(calcul2/calcul3) ; /* Affichage du résultat */ printf(“Mensualité : %8.2f\n“,Mensualite); } La commande de compilation est : $ cc -o emprunt emprunt.c -lm Le résultat de ce programme est : $ emprunt Capital :100000 Nombre d’années :10 Taux Annuel (5.5) :4.65 Mensualité : 1043.63 12 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 12 16/08/10 17:00 Exercice 2 : Modélisation de données Faites la modélisation des données d’un programme de gestion du stock d’un magasin d’articles de sport. 1. Faites l’inventaire des actions courantes de gestion. 2. Déduisez-en la structure d’un article de sport. Solution C t exercice Cet i n’a ’ pas pour objet de résoudre le problème complexe de la gestion de stock dans sa totalité, mais de montrer comment faire une modélisation des données selon une liste d’actions à entreprendre. La modélisation présentée peut donc être complétée. 1. Résumons la gestion d’un stock d’articles de sport à six grandes actions : l’ajout d’un nouvel article, la suppression d’un article, la modification d’un article, la vente d’un article, la commande d’un article, l’affichage du stock. La première action correspond au référencement d’un nouvel article au catalogue du magasin. La deuxième action correspond à son retrait. La troisième action permet de modifier les informations de l’article, soit son libellé s’il est erroné, son prix de vente pour les périodes de soldes, ou le nombre d’exemplaires de cet article. Cette dernière action correspond à l’inventaire. La modification d’un article suppose de pouvoir le trouver grâce à sa référence, donc de disposer d’un module de recherche qui travaille à partir du numéro de l’article, et qui retourne l’adresse en mémoire où est rangé l’article. La vente d’un article consiste à trouver l’article dans le stock, à extraire son prix de vente, et à diminuer le stock du nombre d’exemplaires vendus. La commande d’un article peut être manuelle ou automatique. La commande manuelle est calquée sur le module de modification appliqué à la quantité. La commande automatique est déclenchée quand la quantité en stock est inférieure à un certain seuil prédéfini. Enfin, l’affichage du stock peut être sélectif (par article recherché), ou selon un critère comme un prix minimal ou maximal. Dans cette étude, certaines informations connexes ne sont pas traitées, comme la base des fournisseurs ou la gestion des vendeurs. Enfin, le stock est conservé dans un fichier, ce qui suppose qu’au lancement du logiciel, le fichier contenant le stock est totalement chargé en mémoire, et qu’à l’arrêt du logiciel, le stock qui se trouve en mémoire est sauvegardé dans le fichier d’origine. Les modules de chargement et de sauvegarde ne sont pas présentés, car ils n’ont pas d’incidence sur la modélisation de la donnée « article ». La figure 1.3 présente l’organisation des différents modules de traitement, autour du stock du magasin. Le module recherche_article() est utilisé par la majorité des modules, il doit être optimisé. Les algorithmes de tris et de recherches sont étudiés 13 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 13 16/08/10 17:00 aux chapitres 6 et 7. Tous les modules partagent une même donnée, le stock du magasin, mais chaque module travaille de manière autonome. Figure 1.3 Gestion du stock d’un magasin. Poste de gestion commande_article() Commande d'un article ajout_articles() Boucle de saisie des nouveaux articles retrait_articles() Boucle de retrait des articles modif_article() Modification d'un article affichage() Affichage d'un article. Affichage du stock Stock des articles vente_article() Boucle de vente d'articles recherche_article() Recherche d'un article Caisse 2. Selon les actions qui viennent d’être présentées, la structure d’un article de sport doit contenir au minimum les éléments (champs) suivants : référence de l’article (numéro), libellé de l’article (chaîne de caractères), prix d’achat (réel), prix de vente (réel), quantité en stock (entier), seuil de commande automatique (entier), quantité prédéfinie pour une commande automatique (entier), référence du fournisseur (entier). Le stock sera une collection d’articles gérés en mémoire sous la forme d’un tableau ou d’une liste d’éléments. Ces types de données sont étudiés au chapitre 3. 14 © 2010 Pearson Education France – Algorithmique en C, 2e éd – Jean-Michel Léry 7479.indb 14 16/08/10 17:00