Environnement algorithmique et conventions

publicité
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
Téléchargement