Académique Documents
Professionnel Documents
Culture Documents
Algorithmique
1.1. Lanalyse
Le but de tout dveloppement est de fournir une solution informatique un problme donn. La premire tape est lanalyse du problme. Elle consiste, explorer le domaine dapplication pour en dduire les contraintes et les limites de ltude, dfinir les principales fonctionnalits qui devront tre couvertes par le logiciel, mettre en vidence les problmes connexes, faire linventaire des acteurs (utilisateurs, gestionnaires, etc.) et en dduire linterface dexploitation du produit, etc. Lanalyse tend cerner compltement le sujet et apporter des solutions aux problmes dvoils par ltude. Lanalyse se termine gnralement sur des considrations plus techniques qui font le lien avec lalgorithme. Il sagit de lanalyse des donnes qui aboutit leur modlisation, de la dfinition des modules de traitement, ainsi que leurs interactions rciproques qui dbouchent sur la cration des sous-programmes. Lanalyse conditionne le dveloppement futur, car ce sont les solutions proposes cette tape qui seront programmes. Une mauvaise analyse produira un logiciel mdiocre ou qui ne rpondra pas aux attentes initiales, quelle que soit la qualit de lalgorithme ou de la programmation. Voici deux exemples danalyses partielles. Le premier montre lincidence de ltude du domaine dapplication sur le rsultat de lanalyse. Le second propose une analyse des donnes et montre comment les structurer en fonction des traitements effectuer. Lanalyse du premier exemple va voluer au fur et mesure que les bonnes questions seront souleves. Elle produira au final un programme trs diffrent dans sa complexit. Prenons le problme de linterprtation du numro de Scurit sociale (sans la cl finale). La signification des champs de ce numro est indique la figure 1.1.
Figure 1.1 Linterprtation dun numro de Scurit sociale. Anne de naissance Dpartement de naissance Numro d'ordre
2 60 07 75 028 090
Sexe Mois de naissance Commune de naissance
Une premire analyse de ce numro montre quil sagit dune femme, ne en 1960, au mois de juillet, Paris. Or, linterprtation du quatrime lment de cet exemple est fausse ! Cette personne est ne dans le dpartement de la Seine qui, en 1960, regroupait Paris et les dpartements limitrophes (Val-de-Marne, Val dOise, etc.). Cette remarque soulve dautres questions qui vont compliquer lanalyse, en intgrant un volet historique : Comment le dcoupage des dpartements a-t-il volu (Ile-de-France, Corse, etc.) ?
2010 Pearson Education France Algorithmique en C, 2e d Jean-Michel Lry
Lanalyse simpliste du dbut aurait conduit crire un programme ne traitant quune partie de la problmatique. Le problme est en ralit beaucoup plus complexe quil ny parat. Lerreur quil ne faut pas faire pendant la phase danalyse est dapporter des solutions bases sur ses certitudes, au lieu de se poser dabord des questions. Le second exemple montre comment, partir de lanalyse des donnes, on peut aboutir leur modlisation. Lexemple tudi est celui dune course hippique. La premire question se poser est quest-ce quun cheval ? . La rponse nest pas lie la nature de lanimal, mais aux actions entreprendre pour grer une course. On peut les rsumer : indiquer la liste des chevaux au dpart de la course ; affecter le temps de chaque cheval la fin de la course ; afficher lordre darrive. On peut dduire quune donne reprsentant un cheval doit contenir : le nom du cheval ; le numro du dossard ; le temps darrive ; le classement. On peut galement ajouter le nom du jockey, celui du propritaire, et le montant des gains si on dsire ajouter un volet financier la gestion de la course. La figure 1.2 prsente une modlisation des donnes de la course hippique. Les chevaux sont grs comme une liste, o chaque lment est une structure contenant le nom du cheval, le numro du dossard, le temps effectu durant la course et le classement final. La liste peut tre reprsente sous la forme dun tableau, o chaque case contient toute linformation dun cheval, ou bien sous la forme dlments distincts lis entre eux par la connaissance de llment prcdent et suivant (liste chane de structures). La modlisation des donnes est ensuite suivie par la description de leurs traitements, ce qui est le but de lalgorithme.
Figure 1.2 Modlisation des donnes dune course hippique.
Liste des chevaux
Quen est-il des personnes nes dans les colonies franaises avant leur indpendance ?
Algorithmique
1.2. Lalgorithme
Le rle de lalgorithme est avant tout dorganiser et de structurer lensemble des solutions apportes par lanalyse pour aboutir la solution globale. Il doit surtout prsenter la logique aboutissant au rsultat final et tre dissoci de laspect technique des langages informatiques. Il est gnralement prsent en pseudo-langage (langage simplifi), ce qui facilite sa traduction dans un langage de programmation. Voici lalgorithme interprtant le numro de Scurit sociale, correspondant une analyse (sans laspect historique).
Programme Num_Sec_Soc Dclarations Variables Num_Sec, Dpt, Libell, Nom_Mois en Chanes_de_Caractres Variables Sexe, Anne, Mois, Commune, Num_Ordre en Entier Dbut crire (Entrez votre numro de Scurit sociale :) Lire(Num_Sec) Sexe Conversion_En_Entier(sous_chane(Num_Sec,1,1) Si (Sexe = 1) alors Libell "Monsieur" Sinon Libell "Madame" Finsi Anne Conversion_En_Entier(sous_chane(Num_Sec,2,2)) Anne Anne + 1900 Mois Conversion_En_Entier(sous_chane(Num_Sec,4,2)) Selon Mois Faire Cas 1 : Nom_Mois "Janvier" Cas 2 : Nom_Mois "Fvrier" 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 "Aot" Cas 9 : Nom_Mois "Septembre" Cas 10 : Nom_Mois "Octobre" Cas 11 : Nom_Mois "Novembre" Cas 12 : Nom_Mois "Dcembre" FinSelon Dpt sous_chane(Num_Sec,6,2) Commune Conversion_En_Entier(sous_chane(Num_Sec,8,3)) Num-Ordre Conversion_En_Entier(sous_chane(Num_Sec,11,3)) crire ("Bonjour : ", Libell) crire ("Vous tes n en : ", Anne) crire ("Au mois de : ", Nom_Mois) crire ("Dans le dpartement : ", Dpt) crire ("Dans la commune : ", Commune) crire ("Avec le numro d'ordre : ", Num_Ordre) Fin
La syntaxe du pseudo-langage est librement choisie par le dveloppeur. Cependant, elle respecte certaines rgles et conventions usuelles qui sont dcrites dans ce chapitre.
C
/* numsecsoc.c */ #include <stdio.h> main() {/* --- dclarations des variables --- */ char Num_Sec[14], Libelle[9], Nom_Mois[10], Dept[3] ; int Sexe, Annee, Mois, Commune, Num_Ordre ; /* --- instructions --- */ /* saisie du numro sous la forme dune chane */ printf(Entrez votre numro de Scurit sociale : ) ; scanf(%s,Num_Sec) ; /* rcupration du numro 1 ou 2 du Sexe */ Sexe = Num_Sec[0]-48 ; /* Affectation du Libell */ if (Sexe == 1) strcpy(Libelle,Monsieur) ; else strcpy(Libelle,Madame) ; /* rcupration de lanne de naissance */ Annee = ((Num_Sec[1]-48)*10) + (Num_Sec[2]-48) ; Annee = Annee + 1900 ; /* rcupration 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,Fvrier) ; break ; case 3 : strcpy(Nom_Mois,Mars) ; break ; case 4 : strcpy(Nom_Mois,Avril) ; break ; case 5 : strcpy(Nom_Mois,Mai) ; break ;
Algorithmique
case 6
: strcpy(Nom_Mois,Juin) ; break ; case 7 : strcpy(Nom_Mois,Juillet) ; break ; case 8 : strcpy(Nom_Mois,Aot) ; 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,Dcembre) ; break ; } /* rcupration du dpartement */ Dept[0]=Num_Sec[5] ; Dept[1]=Num_Sec[6] ; Dept[2]=\0 ; /* rcupration de la Commune */ Commune=((Num_Sec[7]-48)*100)+((Num_Sec[8]-48)*10)+(Num_Sec[9]-48) ; /* rcupration du numro dordre */ Num_Ordre=((Num_Sec[10]-48)*100)+((Num_Sec[11]-48)*10)+(Num_Sec[12]-48); /* Afchage des rsultats */ printf(Bonjour %s\n,Libelle) ; printf(Vous tes n en : %d\n,Annee) ; printf(Au mois de : %s\n,Nom_Mois) ; printf(Dans le dpartement : %s\n,Dept) ; printf(Dans la commune : %d\n,Commune) ; printf(Avec le numro dordre : %d\n,Num_Ordre) ; }
Voici lexcution du logiciel (fichier excutable) numsecsoc produit par la compilation prcdente (le caractre $ reprsente le prompt du systme UNIX) :
$ numsecsoc Entrez votre numro de Bonjour Vous tes n en Au mois de Dans le dpartement Dans la commune Avec le numro dordre Scurit sociale : 1650475110019 Monsieur : 1965 : Avril : 75 : 110 : 19
2. Le pseudo-langage L
6
Le pseudo-la pseudo-langage nest pas un langage normalis. Chaque dveloppeur peut dfinir son propre langage et ses conventions syntaxiques. Il est important de prciser son rle et les conventions habituellement rencontres.
La structure du programme
Un programme est structur en une partie dclaration et une partie instruction. Mme si tous les langages ne proposent pas une structure rigoureuse, il est prfrable de la prsenter dans lalgorithme. Les mots cls sont Programme pour le dbut du programme, Dclarations pour la dclaration des variables, et Dbut puis Fin pour la partie instruction.
Programme Num_Sec_Soc Dclarations Variables Num_Sec, Dpt, Libell, Nom_Mois en Chanes_de_Caractres Variables Sexe, Anne, Mois, Commune, Num_Ordre en Entier Dbut crire (Entrez votre numro de Scurit sociale :) ... Fin
Les entres/sorties
Les instructions qui effectuent laffichage lcran et la saisie au clavier sont respectivement crire() et Lire() . La premire instruction affiche un message lcran, la seconde saisit une valeur quelle range dans la variable Num_Sec.
crire (Entrez votre numro de Scurit sociale :) Lire(Num_Sec)
Laffectation
Laffectation dune valeur ou du rsultat dun calcul dans une variable est reprsente par la flche . Le calcul droite de la flche est affect la variable situe gauche.
Anne Anne + 1900
Algorithmique
Les sous-programmes
Les sous-programmes sont les modules de traitement. Leur nom reflte gnralement leur rle, et leurs arguments indiquent sur quelles donnes ils travaillent. La fonction sous_chane() donne en exemple extrait une partie de la chane Num_sec, partir du caractre 1, sur 1 caractre. La fonction Conversion_En_Entier() convertit un caractre (par exemple 2) en son quivalent entier (2).
Sexe Conversion_En_Entier(sous_chane(Num_Sec,1,1)
3. Le gnie logiciel L
Le gnie logi logiciel est un concept complexe qui regroupe des notions et des mthodes permettant de concevoir un logiciel de qualit. Nous nallons pas dtailler ici ses concepts, mais rappeler quelques rgles de bon sens qui en guident la pratique.
4. La performance algorithmique L
Un algorithme doit proposer une solution logique un problme donn, mais ce nest algorithm pas sa seule finalit. Il doit galement fournir le rsultat rapidement. Il est possible de concevoir une solution qui savre catastrophique en temps de calcul. Or, quoi sert un algorithme qui donne le rsultat au bout dun temps interminable ? Cest lune des principales diffrences entre les mathmatiques et linformatique ; en informatique, on effectue rellement les calculs, do limportance de contrler leur nombre et leur temps dexcution. Cet aspect performance est lobjectif principal des algorithmes prsents en deuxime partie de cet ouvrage : trouver des traitements optimiss. La performance dun algorithme porte sur deux aspects, le temps de calcul et lespace mmoire. Dans les deux cas, on tente de minimiser le volume du traitement. Malheureusement, ces deux points sopposent. Il faut souvent utiliser plus de mmoire
Algorithmique
pour gagner en temps de calcul, ou crire plus dinstructions, et donc faire plus de calculs, pour aboutir une gestion mmoire optimale.
Rsum
Un algorithme organise les solutions prconises dans la phase danalyse. Il est souvent crit en pseudo-langage car il doit prsenter la logique du programme sans intgrer les aspects techniques des langages de programmation. Lanalyse, est primordiale, car ce sont les solutions prconises ce niveau qui seront programmes. La modlisation des donnes dbouche sur le dbut de lalgorithme qui formalise les donnes et les traitements associs. La phase finale dcriture dans un langage spcifique nest quune tape technique. Lcriture de lalgorithme requiert une mthodologie que lon retrouve dans le concept de gnie logiciel. Il faut dfinir clairement les modules de traitement et sastreindre une certaine rigueur de dveloppement pour aboutir un programme lisible et volutif. Dautre part, la conception dalgorithmes doit tendre optimiser le temps de calcul, ou lespace mmoire, pour produire des programmes performants.
10
Problmes et exercices
Le premier exercice montre comment utiliser le pseudo-langage. Le second exercice porte sur la modlisation des donnes et sur la conception de modules autonomes.
Solution
1 L l ith emprunt montre comment utiliser le pseudo-langage pour crire un pro1. Lalgorithme gramme. Le calcul de la mensualit le dcompose en trois calculs plus simples.
Calcul1 = CT Calcul2 = (1+T)N Calcul3 = (1+T)N 1
La syntaxe ** reprsente le calcul de la puissance. Les commentaires sont nots comme dans le langage C /* */ .
Programme emprunt Dclarations Variables Mensualit, Capital en Variables TauxMensuel, TauxAnnuel en Variables Calcul1, Calcul2, Calcul3 en Variables NbAN, NbMois en Dbut /* Saisie des donnes initiales */ crire (Montant du capital emprunt :) Lire(Capital) crire (Nombre dannes :) Lire(NbAn) crire (Taux Annuel (exemple 5,5 %):) Lire(TauxAnnuel) /* Calculs */ NbMois NbAn*12 TauxMensuel (TauxAnnuel/100)/12 Rel Rel Rel Entier
11
calcul1 Capital*TauxMensuel calcul2 (1+TauxMensuel)**NbMois calcul3 calcul2-1 Mensualit calcul1*(calcul2/calcul3) /* Afchage du rsultat */ crire ("Mensualit :",Mensualit) Fin
2. Le programme emprunt.c utilise la fonction pow() qui calcule la puissance, ce qui implique lutilisation du fichier den-tte math.h et la compilation avec loption lm.
C
/* emprunt.c */ #include <stdio.h> #include <math.h> main() { oat Mensualite,Capital ; int NbAn,NbMois ; oat TauxMensuel,TauxAnnuel ; oat calcul1,calcul2,calcul3 ; /* Saisie des donnes initiales */ printf(Capital :) ; scanf(%f,&Capital) ; printf(Nombre dannes :) ; 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) ; /* Afchage du rsultat */ printf(Mensualit : %8.2f\n,Mensualite); }
12
Solution
C t Cet exercice na pas pour objet de rsoudre le problme complexe de la gestion de stock i dans sa totalit, mais de montrer comment faire une modlisation des donnes selon une liste dactions entreprendre. La modlisation prsente peut donc tre complte. 1. Rsumons la gestion dun stock darticles de sport six grandes actions : lajout dun nouvel article, la suppression dun article, la modification dun article, la vente dun article, la commande dun article, laffichage du stock. La premire action correspond au rfrencement dun nouvel article au catalogue du magasin. La deuxime action correspond son retrait. La troisime action permet de modifier les informations de larticle, soit son libell sil est erron, son prix de vente pour les priodes de soldes, ou le nombre dexemplaires de cet article. Cette dernire action correspond linventaire. La modification dun article suppose de pouvoir le trouver grce sa rfrence, donc de disposer dun module de recherche qui travaille partir du numro de larticle, et qui retourne ladresse en mmoire o est rang larticle. La vente dun article consiste trouver larticle dans le stock, extraire son prix de vente, et diminuer le stock du nombre dexemplaires vendus. La commande dun article peut tre manuelle ou automatique. La commande manuelle est calque sur le module de modification appliqu la quantit. La commande automatique est dclenche quand la quantit en stock est infrieure un certain seuil prdfini. Enfin, laffichage du stock peut tre slectif (par article recherch), ou selon un critre comme un prix minimal ou maximal. Dans cette tude, certaines informations connexes ne sont pas traites, comme la base des fournisseurs ou la gestion des vendeurs. Enfin, le stock est conserv dans un fichier, ce qui suppose quau lancement du logiciel, le fichier contenant le stock est totalement charg en mmoire, et qu larrt du logiciel, le stock qui se trouve en mmoire est sauvegard dans le fichier dorigine. Les modules de chargement et de sauvegarde ne sont pas prsents, car ils nont pas dincidence sur la modlisation de la donne article . La figure 1.3 prsente lorganisation des diffrents 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 tudis
2010 Pearson Education France Algorithmique en C, 2e d Jean-Michel Lry
13
aux chapitres 6 et 7. Tous les modules partagent une mme donne, le stock du magasin, mais chaque module travaille de manire autonome.
Figure 1.3 Gestion du stock dun magasin.
Poste de gestion
Caisse
2. Selon les actions qui viennent dtre prsentes, la structure dun article de sport doit contenir au minimum les lments (champs) suivants : rfrence de larticle (numro), libell de larticle (chane de caractres), prix dachat (rel), prix de vente (rel), quantit en stock (entier), seuil de commande automatique (entier), quantit prdfinie pour une commande automatique (entier), rfrence du fournisseur (entier). Le stock sera une collection darticles grs en mmoire sous la forme dun tableau ou dune liste dlments. Ces types de donnes sont tudis au chapitre 3.
14