Sunteți pe pagina 1din 306

Algorithmique

Raisonner pour concevoir

ChristopheHARO

Rsum
Ce livre sur lalgorithmique est destin toute personne qui sintresse au dveloppement dapplications informatiques et qui souhaite sinitier ou retrouver les bases fondamentales de la programmation. Il ne sagit pas ici de programmer avec un langage ou un autre, mais bien de raisonner sur un problme pour concevoir une solution abstraite. Ce travail de rflexion et de conception prpare le stade ultime de limplmentation et du cycle de vie du programme concret. Le lecteur ne trouvera pas dans ce livre un recueil dalgorithmes quil devra ensuite adapter pour rsoudre des problmes mais au contraire une introduction originale et efficace lalgorithmique pour apprendre analyser un problme. Le livre est divis en deux parties. Dans la premire partie sont dtailles les notions dalgorithmique de base et la mthode de construction raisonne dun algorithme impratif : lauteur y prcise notamment la distinction entre la spcification et la ralisation dun algorithme et montre que lalgorithmique proprement dite sarrte l o commence la programmation. Dans la deuxime partie lauteur propose cette fois des solutions des problmes plus labors dans divers domaines du calcul automatique, comme la simulation de phnomnes alatoires ou le cryptage des donnes. Toutes les activits proposes restent lmentaires avec le souci constant de privilgier le raisonnement qui conduit llaboration des algorithmes.

L'auteur
Ingnieur et docteur en informatique, Christophe Haro a enseign l'informatique l'universit et en cole d'ingnieurs pendant 22 ans. Depuis prs de 10 ans il enseigne le gnie logiciel, le dveloppement d'applications informatiques et les architectures logicielles en BTS Informatique de Gestion. C'est toute cette exprience pdagogique qui donne ce livre son efficacit pour aborder l'algorithmique.

Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

ENI Editions - All rigths reserved - Jonifar lina

- 1-

Questcequelalgorithmique?
On sintresse lactivit de programmation dun ordinateur qui permet de rsoudre des problmes dune faon automatique. On se place un niveau conceptuel dans lequel un problme quelconque, informatique ou non, est caractris par un ensemble de donnes dentre et des rsultats attendus. On peut donc reprsenter ce niveau danalyseparleschmadelafigurecidessous.

Exemple Ondonnelesingrdientssuivants : Thym laurier persil ail huile vinaigre sel poivre citron et un brochet de trois livres. Prparer une marinade de brochet. Dans cet exemple, le problme est reprsent par les donnes : le thym, le laurier, ..., le brochet dont on connat le poids et par le rsultat attendu qui est un plat cuisin : une marinade de brochet. Ce nest pas (pas encore) un problmequiseposehabituellementeninformatique,maisilseposedanslesmmestermes. Exemple Ondemandedecalculer,pouruneannedontondonnelemillsime,lejourdelasemaineotombelepremiermai. Ici, les donnes sont constitues dun millsime, comme 2005 par exemple. Le rsultat attendu est un jour de la semaine,commedimancheparexemple. Dans ces exemples, le problme est constitu dun jeu de donnes. Le rsultat attendu doit tre obtenu par des transformationsfairesubirauxdonnes cestcequereprsentelafigurecidessus. Lesproblmesauxquelsonsintressedanscelivresontrsoluslaidedunordinateur.Unordinateurestconstitu dune machine matrielle complte dun ensemble de composants priphriques, comme un clavier, une souris, une table traante... La machine matrielle est constitue, en premire approximation, dune unit centrale, charge deffectuer les calculs, complte dune mmoire, permettant denregistrer les donnes, les rsultats des calculs intermdiairesetlesrsultatsattendus.Pourrsoudreunproblmeaveclaidedunordinateur,ilfautenregistrerdans sa mmoire, dune part les donnes du problme, quil devra transformer pour obtenir le rsultat attendu et, dautre part,lasuitedesinstructionsquelunitcentraleducalculateurdevraexcuterpoureffectuerlestransformationsdes donnes.Lersultattantobtenu,ilseradabordenregistr,commelesdonnes,danslammoire.Lafiguresuivante reprsenteceslments.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

Unpriphriquedentrepermetdecommuniquerauprogrammelesdonnestransformer.Unprogramme,constitu dinstructions en langage machine excutes par lunit centrale, les transforme et produit des rsultats qui sont envoysaupriphriquedesortie. Un premier lment, remarquable ici, est larchitecture mise en uvre. Les instructions machine excutes par lunit centraleetlesdonnessurlesquellesellesagissentsontrangesetcohabitentdanslammemmoirecentrale.Une tellearchitectureestcelledesordinateursdepuisleurtoutdbut,danslapremiremoitiduvingtimesicle.Elleat invente et thorise par John VON NEUMANN et Alan THRING. Dans cette architecture, lunit centrale nexcute quuneseuleinstructionlafoisetcesinstructionssontexcutessquentiellement,luneaprslautre,dansunordre prtabli et dfinitivement fix. On dit quil sagitdune machinesquentielle pour caractriser un tel comportement. Il existedautrestypesdemachinesquinenousintressentpasdanscelivre. Une deuxime proprit importante de telles machines est que les mmes donnes, communiques au mme programme, produisent les mmes rsultats, indpendamment de lenvironnement et du moment de lexcution des instructions. On dit alors que ce type de machine est dterministe. L encore, ce nest pas la seule architecture matriellepossible,maiscelivreserestreintcecas. Pour obtenir un programme et les instructions qui le composent, on le prpare en utilisant un langage de programmationlaideduqueloncritlesinstructionsquitransformentlesdonnes.Ilexistedenombreuxlangagesde programmation de haut niveau, certains ddis des tches spcifiques, comme les tableurs par exemple, dautres destinscriredesprogrammesplusgnraux,commeJAVA,PHP,C...Lafigurecidessousreprsentelesrelations entreunprogrammedehautniveauetlecalculateurauquelilestdestin.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

Pourpasserdesdonnesdunproblmeauxrsultatsattendus,onconsidreunemachinefictivecaractriseparun comportementquiluipermetderaliserlesoprations.Cettemachinefictive,commesonmodle,lordinateurdeVON NEUMANN, neffectue quune seule opration la fois pour raliser un traitement prcisment dfini. Les oprations sorganisent en une suite ordonnes dinstructions qui oprent sur de linformation symbolique, cestdire sur une suitedesignesalphabtiques,numriques,lexicaux.Cettemachinefictiveestdoncunemachinesquentielle,comme sonmodle.Onappellecalculunesuitedetraitementsralissparcettemachine,machineabstraitelecalculateurfictif etprogramme abstraitlasuitedinstructionsprparespourunetellemachine.Cependant,alorsquelesprogrammes critsdansunlangagedeprogrammationetdestinsuncalculateurconcretdoiventrespecterunesyntaxeprciseet rigide,lesprogrammesabstraitsnesontcontraintsparaucunerglede grammaire ,aucunesyntaxeimpose.Ence sens, un programme abstrait nest pas un programme et nutilise pas un langage diffrent du langage naturel. On appellealgorithmeunprogrammecritpourlamachineabstraite.Lafigurecidessousreprsentelesrelationsentrela machineabstraiteetsonmodle,lecalculateurconcret.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

Toutordinateuretsonlangagesontdonclaralisationparticuliredune machine abstraite. Cependant, alors que le programmeconcret,destinuncalculateurconcret,appartientlespacedelasolutionduproblmequenousvoulons rsoudre,lamachineabstraiteetsonlangage,lalgorithme,appartiennentlespaceduproblmersoudre.Lafigure cidessus montre les diffrents espaces dintervention. Lalgorithme est le langage de la machine fictive. On y reconnatdeuxdomainesindpendantsetbiendistincts :
q

la spcification du problme qui le dfinit entirement et dune faon non ambigu. Cest le domaine des Mathmatiquesetdelalogique. Lesinstructionsdelamachinefictiveestundomainequiassurelatransitionverslesinstructionsenlangagede hautniveaudestineslamachineeffective.

Danslespacedelasolution,lelangagedehautniveauetlelangagemachineralisentlesinstructionsdelamachine effective. Pour tre plus prcis, il faudrait considrer que le langage de haut niveau introduit une machine fictive intermdiaire,maiscelaneserapasfaiticipoursimplifier.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

Structuredulivre
Celivrenesintressequlamachineabstraite,danslespaceduproblme,pourlaquelleiltudieunealgorithmique particulire : lalgorithmique imprative ou procdurale. Il est divis en deux parties. La premire regroupe les chapitres 2 7. Cest dans cette partie que sont abordes les notions dalgorithmique de base et la mthode de constructionraisonnedunalgorithmeimpratif.Ladeuximepartiestenddeschapitres812.Onycherche,cette fois,dessolutionsdesproblmespluslaborsdansdiversdomainesducalculautomatique. Le chapitre 2, Programmes directs montre quelques exemples dalgorithmes, emprunts au quotidien, et tente de dfinir la nature des algorithmes tudis dans cet ouvrage. On y prcise, notamment, la distinction entre la spcificationetlaralisationdunalgorithmeetonmontrequelalgorithmiqueproprementditesarrtelocommence laprogrammation.Enparticulier,rsoudreunproblmeconsistepasserdesdonnesauxrsultatsattendusparla suite squentielle des transformations faire subir aux donnes. Cependant, la description de ces oprations peut sexprimerdediffrentesfaonset,encesens,lalgorithmiquenest pas la programmation. On aborde les notations quiserontutilisespourexprimerdestransformationssanscontrleduflotdinstructions. Lechapitre 3,Lalternative tudie lunedesconstructionsfondamentalesdelalgorithmique :lalternative.Ellepermet dechoisirlestraitementsraliserenfonctiondeconditionssurlesdonnes,exprimeslaide de prdicats de la logique boolenne. Cest la premire structure tudie pour contrler le flot dinstructions. De nombreux exercices permettentdelamettreenpratique. Le chapitre 4 Structures lmentaires dbute ltude des chanes de caractres et des tableaux statiques simples (vecteurs).Oncommenceprpareretutiliserquelquesdfinitionsdalgorithmeslaborsquiinterviennentsurces structuresdedonnes.Lechapitremontreensuitecommentdfinirdenouveauxtypesdedonnespartirdestypes debaseetproposequelquesexercicesdapplication.Cependant,celivrenetraitepasdesstructuresdedonnes.On ny trouve pas dtude des listes, files, arbres... De nombreux livres, certains excellents, tudient ces domaines en dtail.Ici,seulsleschanesdecaractresetlestableauxstatiquessontutiliss,maiscommesupport,commeprtexte ladfinitionraisonnedalgorithmeslmentaires.Lobjectifdulivreestleraisonnementlabasedelaconstruction dalgorithmesetnonpaslasolutionauxproblmesgnriquesdelaprogrammationinformatique. Nous verrons dans le chapitre 5 Rcursivit que lon peut ainsi spcifier un algorithme dune faon opratoire, sans formalismemathmatiqueexcessif.Deplus,onpeutalorsdistinguerplusclairementspcificationetralisation. Lechapitre 6Itrationestfondamental.Onyapprendunemthodesystmatiquedeconstructiondesitrations.On montre laide dexemples varis quune itration est lexpression algorithmique dune rcurrence mathmatique. Lhypothse de rcurrence permet de construire le corps de litration et de dfinir sa proprit invariante. La rcursivitestutilisepourlaspcificationdesalgorithmesitratifs. Lechapitre 7RcursivitouItration?complteleschapitresRcursivitetItration. Lechapitre 8Trierabordeunvastesujet,letridedonnescomparables,parquelquesexemplesusuelsdudomaine. Ontudieavecsoinlaspcificationduntri.Cestunproblmegnraldifficile,maislesalgorithmesdetriprsents sontceuxhabituellementtudisdansuneinitiationlalgorithmique. Leschapitresprcdentsontintroduitplusieursreprisesleproblmedelditiondunnombrequiconsisteobtenir unechanedecaractresreprsentantsavaleurdansunebasequelconque.Lechapitre 9ditiondunnombreralise une synthse de ce sujet en rsolvant entirement les problmes dj rencontrs dans les chapitres prcdents. Il tudie galement un petit cas de gestion concernant lidentification des entreprises et de leurs tablissements. Il proposeaussilarsolutiondeproblmesdemmenature,commelidentificationISBNpourleslivresparexemple. Les premires notions sur les fichiers sont abordes au chapitre 10 Introduction aux fichiers. Ltude reste lmentaire.Elleprsentelesorganisationssquentiellesetadressablespuislesmodesdaccsassocis.Laccentest missurlestraitementsdesfichiersaccssquentiel. Le chapitre 11 Simuler montre comment simuler le hasard . Des exemples simples permettent dintroduire la simulationdephnomnesdterministesaussibienqualatoires. Lechapitre 12Crypterestencoreunprtextelcrituredalgorithmessimples,maissurdesexemplesempruntsla cryptographiecettefois.Lencore,lesujetconcernelesraisonnementstudisdansleschapitresprcdentsetles notionsabordesrestenttriviales. Onnetrouveraquasimentjamais,danscelivre,decodecritdansunlangagedeprogrammation.Encoreunefois,il ne sagit pas ici de programmer, mais bien de raisonner sur un problme pour en concevoir une solution abstraite. Cependant,ilconvientdenejamaisperdredevuequelobjectifestbiendobtenir,infine,unprogrammeexcutable suruncalculateurconcret.Mmesi,danscelivre,onsarrtelocommencelaprogrammation,cetravailderflexion etdeconceptionprparelestadeultimedelimplmentationetducycledevieduprogrammeconcret.Redescendre ainsi surTerre imposeraparfoisdesajustementspouradapterlalgorithme,cestdireleprogrammequiciblela machineabstraite,auxcontingencesmatriellesdesmachinesconcrtesetdeslangagesdeprogrammationconcrets quisontladispositiondudveloppeur.Anticiponsdoncpourillustrercepointdunexemplesimple. Enalgorithmique,lecalculdelamoyennearithmtiquemdedeuxentiersaetbscritcommeenMathmatique :m< (a+b)/2(danslequel<selit prendlavaleur ).Ainsi,mprendlavaleurdelademisommedeaetb.Cependant,le problmeinformatiqueconcretnesersoutpassifacilement.Eneffet,lareprsentationdesentiersdanslammoire des calculateurs concrets contraint ces entiers un domaine restreint de valeurs. Sur un calculateur qui utilise des mots mmoire de 32 bits par exemple, les entiers positifs suprieurs strictement 231 1 ne peuvent pas tre reprsents(enarithmtiquesigneetensimpleprcision,maisignoronscesdtailspourrestersimple).Ainsi,onne
ENI Editions - All rigths reserved - Jonifar lina - 1-

peutpastransposerdirectementcecalculsurunordinateurconcretsanssinterrogersurledomainedesvaleursdes oprandesaetb.Etsilasommea+bpeutdpasserlavaleurmaximumdunentierreprsentableenmachine,ilfaudra bien,unmomentouunautre,tudierplusprcismentleproblmedimplmentationentenantcomptelafoisdu calculateur cible et du langage de programmation utiliss pour rsoudre le problme. Cest pourquoi on trouvera parfoisunexempledimplmentationdansunlangageparticulierdeteloutelalgorithme.Leslangagesutilissseront toujourslelangageCoulundesesdrivs,commePHP.Cesexemplesneserontquedesdigressionsquipourront treignoresenpremirelecture.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

Publicvis
Celivresadressedabordauxdbutantsenprogrammation.cetitre,ilestpluttdestinauxfiliresquienseignent encorelaprogrammationimprativeprocdurale,commelesSectionsdeTechniciensSuprieurseninformatique(STS) ou les formations aux Diplmes Universitaires de Technologie (DUT). Cependant, les mthodes abordes et les exemplestudispeuventintressertouttudiantquiaconnatreoupratiquerlaprogrammationengnral.Les lvesingnieurstrouverontcertainementdemultiplessujetsdanalyseleurniveau,peuttreentendantcertains desexercicesproposs. Lestudiantsdjavancspourrontabordercelivreenpiochant,icioul,desexercicesrsoudre.Cependant,ils devront commencer par rafrachir leurs connaissances en revoyant dabord attentivement le chapitre Programmes directsquitraitedelaspcificationetlechapitreItrationquitraitedelaconstructionduneitration.Lesdbutants devrontprobablementtudierlelivrelinairement,ensuivantlordredeschapitres,aumoinsdanslapremirepartie quistenddeschapitresProgrammesdirectsRcursivitouItration?Leschapitresdeladeuximepartiepeuvent treabordsdansunordrequelconque,maisilsemblejudicieuxdecommencerltudedecettepartieparlechapitre Trierquitraitedesalgorithmesdetrilmentaires. Quelquesoitleniveaudulecteurquientreprendlaventure,ilconvientdegarderlespritquecelivreneselitpas commeunroman.Lesujetabordestdifficileetcettedifficultnestpaslaconsquencedeschoixadopts,maisbien plutt une difficult inhrente au domaine tudi. Par consquent, il semble ncessaire daborder les diffrentes notions avec un papier, un crayon et une bonne gomme. Les exercices devraient tre rsolus avant den lire la solution,neseraitcequepourbienseconvaincrequilnexistepasquuneseulesolutionunproblmedonn,mais aussiquelesnotationsadoptesnesontpaslesseulesetquelalgorithmiqueneserduitpasaulangageutilispour exprimerunalgorithme.Accessoirement,ilserapeuttreutile,danscertainscas,dallerjusqulimplmentationdun algorithme dans un langage de programmation particulier pour une machine concrte donne. Cependant, il faudra toujours garder lesprit que si limplmentation peut nous convaincre de ce quune solution est incorrecte, elle ne permetjamaisdeprouverquunesolutionestcorrecte.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

Conventionsadoptes
Letexteestrdigseloncertainesconventionstypographiquesquisontprsentesici. Signaleuneremarqueimportanteouunpointparticuliernoter. Uneremarquepeutapparatrepartoutdansletexte,saufdanslesinstructionsdesalgorithmesprsents. Exemple estutilispourintroduireunexemplequiillustreunenotionouunconcept. Lesalgorithmesetlesexercicessontdistingusparuneprsentationencadre,commececi: Algorithme1:Divisioneuclidiennededeuxentiers:version2 Textededfinitiondelalgorithme Suitedutextededfinition Lesextraitsdecodesontmisenvaleurdanscette policedecaractres. Les rfrences bibliographiques sont prcises dans le texte par des abrviations entre crochets, exemple [ARS80]. Pourlesinterprter,vouspouvezvousreporterautitreBibliographieenfindechaquechapitre. Ilesttempsdecommencer.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

Introduction
Cechapitreprsentelanotiondalgorithmecommeladescriptiondunprocdcomposdunesuccessiondoprations. partir dexemples simples tirs de lexprience quotidienne de chacun et pas ncessairement dans le domaine de linformatique, on dgage une ide intuitive de ce quest un algorithme et on commence en crire dune faon informelle.Unesriedexercicespermetensuitedesentranerlaborerdesdescriptionsdansdesdomainesvaris. La section Premiers exemples introduit quelques exemples. La section suivante dfinit informellement un algorithme comme une suite dinstructions destines la machine abstraite. On peut alors commencer introduire les spcifications dans la section Dfinition informelle dun algorithme et crire les premiers algorithmes la section Spcifications.Lesdeuxsectionssuivantessontdesexercices.Ilssontaccompagnsdunesolutiondveloppedans lasectionExercicesrsolusetsontnoncssanssolutiondanslasectionExercice.Onterminelechapitreparquelques notesbibliographiques.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

10

Premiersexemples
Exemple1 Dansunvieuxlivredecuisine,jelislarecettesuivante,enpage41 : MARINADE Thymlaurierpersilailhuilevinaigreselpoivre. Mettezdansunplat2volumesdhuile,pour1devinaigre,lethym,laurier,persil,lailhachfinement,salez,poivrezetfaites baignerdanscetteprparationlaviandequevousvoulezfairemariner.Vouspouvezlaissermariner26jours,maischaque jourajouterdelhuileetduvinaigre.Pourlepoisson,vouspouvezremplacerlevinaigrepardujusdecitron. Cette recette dcrit un algorithme : comment raliser une marinade ? partir dingrdients prciss, il dcrit une successiondoprationsquilesutilisentpourobtenirunrsultat.Ilpourraitnumrerlesdiffrentesoprationsenles ordonnant : 1.mlangerdansunplat2volumesdhuile1volumedevinaigre pourdupoisson,remplacerlevinaigrepardujusde citron 2.hacherfinementlail 3.ajouterlavinaigrettelethym,lelaurier,lepersiletlailhach 4.saleretpoivrer 5.placerlaviandefairemarinerdanscetteprparation 6.pendant26jours,ajouterchaquejourdelhuileetduvinaigre. Exemple2 Toutlveapprendadditionnerdeuxnombresentierspositifsenclasseprimaire.Pourcalculerlasommede127et35,il apprend poser laddition,enplaantencolonnesleschiffresdesdeuxnombres,lesunitsdusecondsouslesunitsdu premier,lesdizainesdusecondsouslesdizainesdupremier,etc.Cecifait,ilutiliseunrpertoiredeconnaissancesacquises pralablement, pour additionner les deux nombres chiffre chiffre. Il doit donc savoir que 7+5 font 12, 2+3 font 5, etc. Il apprendaussireporterlaretenuelorsqueladditiondedeuxchiffresdonneunesommesuprieure9.Ilestaussipossible dedtaillerlestapesducalculdelafaonsuivante : 1.poser127 2.poser35sous127,avec5sous7,3sous2 3.additionner7et5quifont12 :poser2pourlesunitsdursultatet1deretenuepourlesdizaines 4.additionner2et3quifont5pourlesdizainesetaugmenterlersultatdelaretenueprcdente :poser6 5.additionnerlescentaines10 :poser1 6.lersultatest162. Cette description est comparable la recette prcdente. On considre les ingrdients que sont les nombres additionner,127et35.partirdestablesdaddition,dontlaconnaissanceestunpralable,onappliqueunensemble derglesquitransformelesdonnes,pourobtenirunrsultat,icileursomme162. Exemple3 Voici,toujoursdanslelivredecuisinedupremierexemplecidessus,lapage303cettefois,cequelonpeutylire : SAINTHONOR Ptebrise(page290)ptechoux(page289)caramel(page265)crmeChantilly(page267). tendez la pte brise en forme de galette de 20 cm environ de diamtre. Posezla sur une tle beurre. Faire cuire 30 minutesfourchaud. Avec de la pte choux faites une dizaine de petits choux que vous faites cuire four modr 20 minutes. Aprs parfaite cuisson,glacezceschouxavecuncaramelblond.Laissezrefroidir.Cetteprparationterminegarnissezvotregaletteavecles petitschouxquevouscollezaveclecaramelchaud.Enfin,remplissezvotregteauavecunecrmeChantilly. Ontrouvealors,auxpagesindiquesenttederecette,lesrecettesparticulirespourlaptebrise,laptechoux... Exemple4

ENI Editions - All rigths reserved - Jonifar lina

- 1-

11

Leservicedumagasinduneentreprisesouhaitecalculerautomatiquementdespropositionsderapprovisionnementpourles articlesallantbienttmanquer.Pourcela,ondisposepourchaquearticledesinformationssuivantes :
q

laquantitactuelleenstock ledlaimoyenderapprovisionnement desstatistiquesdeventesurles12derniersmois.

Ondemandededcrirelescalculseffectuerpourdterminerdansquelscaslerapprovisionnementdunproduitdoittre propos. On appelle niveau de dclenchement la quantit dun produit en de de laquelle le rapprovisionnement doit tre propos.Cestcettequantitquilsagitdecalculerpartirdesdonnesnumresprcdemment.Soientalorsq s la

quantitdeproduitactuellementenstock,v1 ,v2 ,...,v12 lesventesralisessurceproduitlorsdes12derniersmois,d r le dlai moyen de rapprovisionnement et q d le niveau de dclenchement calculer. Ce calcul sorganise selon les tapessuivantes : 1.rcuprerlesdonnesq s ,dretv1 ,v2 ,...,v12 2.calculerlamoyennearithmtiquemvdesventesquotidiennesdeceproduit 3.calculerleniveaudedclenchementqd 4.comparerqs q d :
q

q s qd =>proposerderapprovisionner q s >qd =>nerienfaire.

Lestapesprcdentesdcriventleprocddecalculdeq d .Ellesconstituentunalgorithmepourlecalculduniveaude

dclenchement du rapprovisionnement. partir des donnes du problme, ici qs , dr et v1 , v2 , ..., v12 , des rgles opratoires permettent dobtenir un rsultat dfini. Mais pour accder ce rsultat, il faut passer par un ensemble dtapesintermdiaires :rcuprerlesdonnes,calculerunemoyenne... delammefaonquilfallaitprparerdabord une crme Chantilly pour raliser un SaintHonor. Ces tapes intermdiaires ne sont pas dcrites : on ne dit pas commentcalculerunemoyenne,commentcalculerleniveaudedclenchementqd laidedecettemoyenne,comment

prparer une crme Chantilly... Ces calculs intermdiaires, indispensables lobtention du rsultat, ne sont pas explicits. Lapprenti cuisinier sait prparer une crme Chantilly, car cest un pralable la ralisation dun Saint Honor alors,ildisposedetousleslmentspourraliserlarecettecomplte.Linformaticien,oulechefmagasinier, sait calculer la moyenne ncessaire et qd pour dterminer quand rapprovisionner. Dans le cas contraire, il faudra tudier lalgorithme de calcul de la moyenne. Le cuisinier se reportera la page 267 du livre de cuisine qui donne la recettequilnesaitpasencoreprparer.Danstouslescas,leproblmeestrsolugrceunsousalgorithmequiest unesolutionunsousproblmeduproblmeinitial. Exercice1:tapesdetchesquotidiennes numrerlestapeslmentairesordonnespourraliserlestchesquotidiennessuivantes : 1.prparerducaf 2.sortirlavoituredugarage.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

12

Dfinitioninformelledunalgorithme
Un algorithme est la description dun procd. Il dcrit une succession doprations lmentaires, exprimes dans un langage donn, excuter dans un certain ordre. Lexcution nest possible que lorsque certaines conditions sont remplies.Lailnestajoutquelorsquilathach onnepeutcalculerleniveaudedclenchementqd quelorsquela moyennemvdesventesquotidiennesatobtenue.Lexcutiondesoprationslmentairesdontilsagitpermetde fairepasserlesystmeconsidr,duntatinitialI,reprsentparlesvaleursdesattributsdonns,untatfinalF, reprsentparlesnouvellesvaleursdesattributsetlesrsultatsobtenir.Pourladdition,lesattributsdonnssont les deux entiers a et b dont les valeurs sont respectivement 127 et 35. Ltat initial est reprsent par ces deux valeurs. Le rsultat est 162 et ltat final est reprsent par les trois valeurs 127, 35 et 162. La figure cidessous reprsentelesdeuxtatsetlatransitionquifaitpasserdelunlautre.

Ltat initial I ou e1 est caractris par les valeurs 127 et 35 de a et b, respectivement. Ltat final F ou e 2 est caractrisparcesmmesvaleurs127et35etparlavaleur162delasommedeaetb. Demme,ltatinitialIdelexempledegestiondestockestconstitudesattributsq s ,dretv1 ,v2 ,...,v12 .LtatfinalF estreprsentparlesvaleursdeq s ,v1 ,v2 ,...,v12 etlavaleurdunattributrsultat,disonsr,dontlavaleurVRAIou FAUXindiquesilyalieuderapprovisionnerounon.

Unalgorithmecorresponddoncunprocessusdcomposentapesdontlenchanement permet datteindre un but fix.Dounedfinitioninformelledunalgorithme : Dfinition On appelle algorithme un ensemble de rgles opratoires et de procds dfinis en vue dobtenir un rsultat dtermin au moyendunnombrefinidoprationssquentiellementordonnes. Lesexemplesdesparagraphesprcdentsmontrentquetoutalgorithmeestcaractrisparleslmentssuivants :
q

lesoprationsraliserchaquetape lordredesuccessiondesdiffrentestapes lexistencedeconditionsdterminantounoncertainestapes undbutetunefin.

Lesoprationsdontilsagitsontdestinestreexcutesparunemachinefictiveafinderaliserlestransformations desdonnesquiproduirontlesrsultatsattendus.Onpeutschmatisercepointcommesurlafiguresuivante :

Commenousavonscommenclevoirsurlexempledeladditioncidessus,lestransformationssubiesparlesdonnes font voyager le systme logiciel entre des tats caractriss par les valeurs de certaines donnes. Nous y reviendrons. Cependant, il nexiste pas dalgorithmeausensproprequandonutiliseun langage suffisamment expressif. Ainsi, considronslexemplesuivant :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

13

Exemple5 Ondonnedeuxentiersaetb.Calculerleursomme. Cestleproblmedeladdition,djabordcidessus,maiscettefois,supposonsquenousdisposionsdunlangagequi connat laddition.Autrementdit,lesimplefaitdedemanderladdition,enexhibantlesnombresaetbadditionner, suffit produire le rsultat attendu. La situation est alors schmatise par le dessin de la figure cidessous, dans laquelleleblocdestransformationsfairesubirauxdonnesestvide.

Le langage utilisesthabituellementsuffisammentexpressif.Ilsuffitdexprimerlersultatpourobtenirlasolution. Ici, le rsultat est la somme de deux entiers. Il ny a pas dalgorithme dfinir quand il est possible dadditionneret dcriredirectement : Le R s u l t a t est a+b PourlarecetteduSaintHonor,silaprparationdelacrmeChantillyfaitpartiedescomptencesducuisinier,ilesten mesurederaliserlesobjectifsdelarecetteetilestinutilededtaillerlesoprationsncessairespourobtenircette crme.Demmelorsquelecalculdelamoyennearithmtiquefaitpartiedesoprationsdebasedelenvironnement,il estpossibledefaireappelcecalculpourobtenirleniveaudedclenchementpuisendduireladcisionprendreen cequiconcernelerapprovisionnement. Cependant,imaginonslasituationsuivante,danslaquelleonnedisposepas,dansltatactueldenosconnaissances, de lopration dadditions des entiers. On fait lhypothse que la seule opration connue est lincrmentation, par laquelle on ne sait quajouter 1 un entier. Comment alors additionner deux entiers ? Cette fois, le cadre des transformationsdelafigureprcdentenestplusvide.Ildevientncessairedeprciserlestapesdestransformations pourfairepasserlesystmedeltatinitialI,danslequelondonnelesvaleursdedeuxentiersaetb,ltatfinalF danslequelonobtientlasommea+b. Les deux figures prcdentes ne dcrivent pas compltement la ralit de lenvironnement dans lequel on tudie la rsolution dun problme par un algorithme. Les donnes sont habituellement accompagnes dunrpertoire dactions conditionn par lexpressivitdulangageutilispourtudieretexprimerlalgorithme.Danslexempleprcdent,sice rpertoirecontientladditiondesentiers,ilnestpasncessairedtudierunalgorithmepourrsoudreleproblme.Si, aucontraire,ladditionnestpasuneoprationdecerpertoire,ltudealgorithmiqueduproblmedevientncessaire. Ctait le cas, par exemple, pour la multiplication des entiers sur les premiers microprocesseurs. Le rpertoire des instructionsmicroprogrammesdecescomposantsnedisposaitpasdelamultiplicationetcellecidevaittretudieet implmentepartir,parexemple,deladdition. Ainsi, si le rpertoire dactions du langage utilis dispose du calcul de la moyenne arithmtique, on lutilise comme oprateurdebase sinon,ildevientncessairedtudierlesousalgorithmequicalculeracettemoyenne. Exemple6 Dansuneentreprise,deuxservicesemploientchacununequipedereprsentants.Certainsreprsentantsappartiennentaux deux services, mais pas tous. On veut attribuer une prime au seul reprsentant appartenant aux deux quipes et ayant ralislemeilleurchiffredaffairessurlanne.Leproblmeconsistedterminerlereprsentantquiseraprim. Ilestpossibledereprsenterlasituationcommesurlafigurecidessous.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

14

Lalgorithme consiste donc calculer lintersection des deux ensembles de reprsentants, puis dterminer, dans lensemble rsultat, celui des reprsentants qui a le meilleur chiffre daffaires sur lanne. Un langage qui dispose de loprationdintersectiondedeuxensemblesdedonnes,commeSQLparexemple,nencessitepasdautrepralable ce calcul et permet dobtenir immdiatement le meilleur commun aux deux ensembles sinon, il faudra tudier un algorithmeducalculdecetteintersection.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

15

Spcifications
Unetcheimportante,quandoncherchecrireunalgorithme,consistele spcifier.Ilsagitdedire,delafaonla plus prcise possible, ce que fait lalgorithme et, cela, sans exprimer comment il le fait. En ce sens, spcifier un algorithme,cestposerformellementleproblmequilrsout,commelamontrlechapitreprcdent.Cestunetape difficile, mais indispensable pour clairement dfinir lalgorithme et ses effets. Cette section introduit, par quelques exemplesetexercicesrsolus,cettetapedespcification.Elleestcompltedanslasuitedulivre,mesurequenous construironslesoutilsncessaires. Exercicersolu1:Feuxdecirculation Onconsidreunfeuquirglelacirculationuncarrefour. crirelalgorithmequidterminelacouleurdufeulorsduprochainchangement. Solution Untelfeusignaleltatdelacirculationquilrglepartroiscouleurs :vert,orangeetrouge.Lescouleurssenchanent dans cet ordre une cadence fixe. Lorsque la couleur est rouge, le changement refait passer le feu au vert. On ne sintresse quau changement de couleur, autrement dit, lopration qui fait passer de lune lautre, dans lordre prcis. Supposons que nous disposons dune opration, dsigne par successeur, qui prend en entre une couleur de lensembleC={rougevertorange}etquiretournesonsuccesseurdanslasuiteordonne(vertorangerouge). Avecceshypothses,lalgorithmescrit: Algorithme1:Changementdelacouleurdunfeuuncarrefour:version0.1

algorithme : changer la couleur Entre c : une COULEUR de lensemble {vert ; orange ; rouge} Effet c = successeur de ancienne valeur de c Cette notation prcise le nom de lalgorithme :changer la couleur. Elle indique aussi que cet algorithme utilise une donne,dontletypeestCOULEURetdsigneparlalettrec,pourralisersoncalcul.Cestlobjetduparagraphequi dbuteaveclemotEntrequededonnercetteprcision.Ledomainedesvaleursdecestclairementprcis:cest lensemble{vert orange rouge}.Cequiprcdedtaillelesprrequispourlefonctionnementdelalgorithme. Lorsquelalgorithmesetermineetproduitlesrsultatsdesontravail,onobtientunnouveltatdufeudecirculation. Ce nouvel tat est entirement dcrit, au moins pour cet exercice simplifi, par la couleur du feu cest ce que dit le paragrapheEffet.Onylitquelanouvellevaleurdec,cestdirelanouvellecouleurdufeu,estlavaleurquisuccde lancienne valeur de cette couleur. La construction ancienne valeur de c est mise pour indiquer que la valeur de c avant modification par lalgorithme est utilise. On voit donc que deux valeurs distinctes dec sont concernes : celle avant lexcution de lalgorithme, reprsente par la construction ancienne valeur de c, et la nouvelle valeur, celle calculeparlalgorithme,dsigneparc.Ilconvientdenoterquelanciennevaleurdecdisparatlorsquelalgorithmese termine.Ainsi,cettevaleurestmodifieparlalgorithme.Cestlaresponsabilitdechangerlacouleurdemodifiercette valeur.Commelavaleurdeccaptureltatdusystmelogiciel,lamodificationdecettevaleurmodifiecettat. Pourspcifierleffetdelalgorithme,onutiliselaconstructionc = successeur de ancienne valeur de c.Ilfautencore direcequefait successeur,autrementdit,lersultatqueproduitcetoprateur.Ceserafaitplusbas.Pourlinstant, restonsenlideintuitivesousjacente. Cette faon dcrirelalgorithmenestpasobligatoire.Ainsi,parexemple,onauraitpuutiliserdautres notations pour exprimerlammeide.Envoiciuneautre : Algorithme2:Changementdelacouleurdunfeuuncarrefour:version0.2

changer la couleur Donne c : une COULEUR de lensemble {vert ; orange ; rouge} Effet (ancien c = vert => c = orange) ou sinon (ancien c = orange => c = rouge) ou sinon

ENI Editions - All rigths reserved - Jonifar lina

- 1-

16

(ancien c = rouge

=> c = vert)

Lesexpressionsutilisesexprimentlammeconditionqueprcdemment :lacouleurorangesuccdeauvert,rouge succde orange et vert succde rouge. Accessoirement, il nest plus indiqu sur la premire ligne quil sagitdun algorithme : cest vident. Entre a t remplac par Donne. Toute autre mthode pour prciser les donnes sur lesquellestravaillelalgorithmeauraittlgitime. La diffrence essentielle qui distingue cette description de la prcdente est la faon dont elle exprime leffet de lalgorithme.Aulieudefaireappelunsousalgorithmesuccesseurquilfaudraplustarddfinir,icilalgorithmeprcise, pourchacunedesvaleurspossiblesdeladonnedentre,lavaleurqueprendracensortie.Cestuneexpressionqui estunedisjonctiondeclausesboolennes.Lanotation : a n c i e n c = vert => c = orange exprimeque,lorsquelavaleurdecenentreestvert,elleestorangeensortie.Autrementdit,lecalculdelalgorithme consiste remplacer la couleur vert par la couleur orange. Le symbole = > est le symbole de limplication en Mathmatique. Prcisonsdavantage.Aulieudutiliserdesnombres,nousutilisonsdesdonnesduntypeparticulier:desCOULEURs dontlesvaleurssontassujettiesvoluerdansunensembledonn.Cetensembleestdfiniiciparnumration.Ilest possibleaussidedonnerunedfinitiondecetype,pourprciserentirementlesdonnesquienrelvent. type COULEUR contrainte de domaine {vert ; orange ; rouge} fin COULEUR Lexpression contraintededomaine exprimequetoutedonnedetypeCOULEURestassujettieprendresavaleur danslensembleprcis.Lencore,cenestpaslaseulefaondedfinircetype.Envoiciuneautre : type COULEUR dfini par lnumration {vert ; orange ; rouge} fin COULEUR Ayantposcettedfinition,onconsidrequenousdisposonsduntypeCOULEURcommeilexistedesnombresentiers oudesnombresdcimaux.Onpeutalorssimplifierlexpressiondelalgorithme1aveclesconventionssuivantes.Lenom de lalgorithme est fait dune chane de caractres unique : changer_couleur, ou changerCouleur, ou ce que lon voudra comme convention, pourvu quelle soit claire, sans ambigut. On prcise ensuite le type des donnes sur lesquelles il travaille en entre, cestdire les donnes quil doit recevoir et sur lesquelles il opre pour raliser lobjectifquiluiestassign :Entre c : COULEUR.Onindiquegalementquecetalgorithmeapourobjectifdemodifier la donne quil reoit en entre et que cette modification est sa raison dtre, sa responsabilit. Il sagit donc de prciser clairement que la donne c est la fois une donne dentre, partir de laquelle lalgorithmevatablirson calcul, mais aussi une donne de sortie, dont la nouvelle valeur est le but du calcul effectu. Il existe diffrentes conventionsquipeuventtreadoptespourprcisersimplementcespoints.Envoiciune : Entre Sortie c : COULEUR Laconventionquiserautilisedanscelivreestunementionpardfaut.Lorsquelalgorithmemodifiecertainesdonnes quil reoit en entre, on ne prcise rien de particulier. Ainsi donc, cest lorsquil nen modifie aucune quune mention expliciteserautilise.Ceserafaitplusbas.Pourcequiconcernelalgorithmeparticulierdechangementdecouleur,le lecteursaitquilmodifieladonneenentreparcequeriennevientinfirmercefait.Cependant,unautresigneindique cetteparticularit. Lalgorithme retient la valeur de la donne dentre. Il restitue cette valeur lorsquil sagit de prciser leffet de lalgorithme.Pourobtenircettevaleur,laconstructionancienne valeur de couancien catutiliseprcdemment. Cette construction signifie que lalgorithme utilise un oprateur, not ici ancien par exemple, et que cet oprateur permet de dterminer la valeur de c avant lexcution du calcul. Ainsi donc, dune valeur c donne, cet oprateur en dtermine une autre. Pour cette raison, la notation fonctionnelle sera utilise dans la suite et justifie plus tard. Par consquent,lavaleurdecavantlexcutiondelalgorithmeseraobtenueparancien(c). Il reste dire clairement ce que fait lalgorithme.Cest le paragraphe introduit parEffet qui lexprime. Au lieu du mot effet,cestlemotpostconditionquiserautilis : postcondition c = s u c c e s s e u r (a n c i e n (c)) Cette clause exprime que la nouvelle valeur de c calcule par lalgorithme est gale au successeur de la valeur que possdaitcavantlexcutiondelalgorithme.Onneditpascommentcersultatestcalcul,maisseulementcequefait lalgorithme :ilcalculelesuccesseurdec et lutilisepourmodifierc.Ainsi,lexpressiondsigneparpostconditionest uneexpressionquiestsoitVRAIEsichanger_couleurfaitcorrectementsontravail,soitFAUSSEsinon.Cestdoncune

- 2-

ENI Editions - All rigths reserved - Jonifar lina

17

expressiondontlersultatestBOOLEN.Onparledanscecasdeprdicat. Onpeutdoncprsentdonnerunedfinitiondechanger_couleurutilisantcesconventions : Algorithme3:Changementdelacouleurdunfeuuncarrefourversion1.0

algorithme : changer_couleur Entre c : COULEUR postcondition c = successeur ( ancien ( c ) ) fin changer_couleur LorsqueloprateursuccesseurfaitpartiedurpertoiredebasedulangageetqueletypeCOULEURatdfini,cet algorithme est entirement spcifi. Cependant, le type COULEUR ayant t construit pour les besoins du problme particulierrsoudre,loprateursuccesseurnestpasencoredfini.Parconsquent,lalgorithmechanger_couleurne prendratoutsonsensquelorsqueloprateurseracompltementspcifi.Ceserafaitplusbas. Cette dfinition de changer_couleur peut encore scrire de plusieurs faons quivalentes, utilisant des conventions lgrementdiffrentes.Envoicidautres. Algorithme4:Changementdelacouleurdunfeuuncarrefourversion1.0

changer_couleur(c : COULEUR) postcondition c = successeur ( ancien ( c ) ) fin changer_couleur Cettefois,lesdonnesdentre,cellespartirdesquelleslalgorithmeralisesoncalcul,sontprcisesderrirelenom de lalgorithme. Cest cette notation quutilisent tous les langages impratifs, avec parfois quelques variations syntaxiquesdanslapositiondeslments.Lapremireligneestalorsappelelasignaturedelalgorithme. Revenonsaufonctionnement.changer_couleurfaitpasserlesystmeduntatinitialIdanslequellefeuaunecouleur cquelconquedudomainedutypeCOULEUR,untatfinalFdanslequellacouleurcdufeuestdevenuelesuccesseur delanciennecouleur.Lafigurecidessousreprsentelvolutiondelasituationparundiagrammedtats.

La transition de ltat initial ltat final est assure par lopration changer_couleur. Finalement, le calcul du changementdecouleurpeutscrirecommecidessous : Algorithme5:Changementdelacouleurdunfeuuncarrefourversion2.0

changer_couleur(c : COULEUR) # Modifier la couleur du feu qui rgle la circulation dun # carrefour. prcondition aucune postcondition c = successeur ( ancien ( c ) ) fin changer_couleur Leslignes : # Modifier la couleur du feu qui r le la circulation dun g # carrefour. formentuncommentaire.Ilnintervientpasdanslalogiquedesoprationsdelalgorithme.Sonbutestdeclarifierune situationenapportantuneprcisionsupplmentaireparrapportauxinstructionsoprationnelles.Laclauseintroduite parprconditionindiquelesconditionsquedoiventsatisfairelesdonnespourquelalgorithmefassecorrectementson

ENI Editions - All rigths reserved - Jonifar lina

- 3-

18

travail.Ici,aucuneconditionparticulirenestimposeauxdonnesdentre. Il est important de bien se convaincre que cet algorithme ne dit rien sur la faon dont il calcule la couleur que doit prendrelefeu.Ilneditpascommentilralisececalcul.Ilneditquecequilfait :calculerlaprochainecouleurdufeuen utilisantlesuccesseurdelacouleuractuellecquilareueenentre.Cestlanouvellecouleur,quiremplacelancienne dansc,quirsulteducalculdechanger_couleur. Pour que cette dfinition soit complte, il sagit, prsent, de prciser ce que fait lopration successeur. Cette prcisionnestncessairequesilnestpasunoprateurdurpertoiredinstructionsdenotre langage .Ainsi,siune COULEURtaitunnombreentierparexemple,ilneseraitpeuttrepasncessairededfinircetoprateur. Pour le dfinir, il suffit de prciser sa signature et la valeur du rsultat quil calcule cest ce que fait lalgorithme ci dessous. Algorithme6:Oprateursuccesseurversion1.0

Algorithme successeur # Le successeur de c dans la liste (rouge ; vert ; orange). Entre c : COULEUR Rsultat : COULEUR prcondition aucune postcondition # c nest pas modifi. ancien(c) = c # Dfinition du rsultat calcul. (c = vert => Rsultat = orange) ou sinon (c = orange => Rsultat = rouge) ou sinon (c = rouge => Rsultat = vert) fin successeur Lapostconditionestconstituededeuxclauses.Lapremireprcisequelacouleurcreueenentreparlalgorithme successeurnestpasmodifie.Lasecondeexprimecequefaitlalgorithme. Il existe une diffrence essentielle, fondamentale, entre cette opration et lalgorithme prcdent. Lalgorithme changer_couleurapourbutdemodifierltatdusystme.Ilprendunecouleur,valeurdec,etillamodifie.Lavaleur decnestpluslammequecellequelleavaitenentrelorsquelalgorithmesetermine.Aucontraire,successeurne modifierien cestcequexprimelapremireclausedelapostcondition : a n c i e n (c) = c La valeur de c la fin de lexcution de lalgorithme est la mme que celle de c lorsque lalgorithme commence son calcul.Ilnefaitquecalculerunenouvellevaleurpartirdunedonnecquirestecequelleest,immuable.Loprateur successeurestdelammenaturequuneopration,comme2+3parexemple.Cetteoprationprenddeuxnombresen entre,2et3etcalculeunrsultat,5,sansmodifierlesnombres2et3.Cestcequefaitloprationsuccesseur :elle prendunecouleurcetcalculeunrsultat,lesuccesseurdec,sansmodifierc.Cestaussicequexprimelanotation : Rsultat : COULEUR EllesignifiequesuccesseurretourneunrsultatdetypeCOULEUR,comme2+3retourneunrsultatdetypeENTIER, sansmodifierloprande,cestdireladonnedentrec,ellemmedetypeCOULEUR.Leffetdelalgorithme,prcis parlesclausesdelapostcondition,utiliseencoreletermeRsultat,quiexprimebienquunenouvellevaleurvientdtre obtenue. Lanotationfonctionnelleintroduiteplushautmontremieuxencorecettediffrencedenatureentrechanger_couleuret successeur: Algorithme7:Changementdelacouleurdunfeuuncarrefourversion2.1

successeur(c : COULEUR) : COULEUR # Le successeur de c dans la liste (rouge ; vert ; orange). prcondition aucune postcondition # c nest pas modifi.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

19

ancien(c) = c # Dfinition du rsultat calcul. (c = vert => Rsultat = orange) ou sinon (c = orange => Rsultat = rouge) ou sinon (c = rouge => Rsultat = vert) fin successeur Cettefois,lesdonnesdentressontprcisesdanslasignature.Lamentioncomplmentaireindiquequelalgorithme calculeunrsultatetquecersultatestdetypeCOULEUR.Ainsi,troislmentsdelanotationdecetypedalgorithme concourentindiquerquilnemodifiepaslesdonnesquilreoitenentrepoureffectuersescalculs :
q

lasignatureportementiondutypedursultatcalculet retourn lutilisateurlogicieldesesservices une pseudovariable note Rsultat reoit la valeur calcule par lalgorithme. Cest cette valeur qui est retourne au client logiciel lorsque lalgorithme se termine. Ainsi, la valeur rendue au client est celle que possdecettepseudovariablelorsquelinstructionfinestatteinte lapostconditioncontientuneclausequiindiquequelavaleurdechacunedesdonnesdentreresteconstante pendantlescalculsdelalgorithme.

Letypedursultat,indiqudanslasignaturedelalgorithme,estletypedelapseudovariableRsultatquinestdonc pasdclareentantquetelle. On peut remarquer, cependant, que la conjonction de ces trois conventions est redondante. En effet, les deux premiressuffisentqualifierlalgorithmepourlequelonpeutaccepterimplicitementquilnemodifiepaslesdonnes en entre, ds lors que la pseudovariable Rsultat apparat. Le simple fait de donner la signature de lalgorithme montrequilestdelaclassedesoprationsquicalculentunrsultatsansmodifierlesdonnessurlesquellesilopre, commeuneadditionnemodifiepaslesoprandespourcalculerleursomme.Ainsi,lamentionancien(c) = cnestpas ncessaireet,pourlalgorithmedeloprationsuccesseur,onpeutaffirmerquecestunprdicatimplicitequiparticipe sapostcondition.Onsautoriseradoncnepasleprciserlorsquaucuneambigutnestcraindre. Enfin,iciencore,onneditquecequefaitlalgorithme,sansdirecommentillefait.Cestquedirecommentilfaitson travailestplusdifficile.Ceseratudiplustard. Finalement,nouspouvonsrsumercequenousavonsapprisdanscetexemple. Unalgorithmeestcritsanscontraintedesyntaxeautrequecellequipermetdelexprimersansambigut.Ainsi,les conventionsdcritureexposesdanscettesectionnesontpasobligatoires.Ilestpossibledenadopterdautresetle seulcritrequidoitguiderlauteurdelalgorithmeestsacorrectionetsalisibilit. Nous avons mis en vidence deux classes dalgorithmes. Les uns prennent des donnes en entre pour calculer un nouveau rsultat et ce calcul ne modifie pas les donnes utilises. La signature dun tel algorithme fait apparatre le typedursultatcalcul.Deplus,cersultatestsymbolisparlexpressionRsultatquiestdonclavaleurproduitepar lalgorithme au bnfice des logiciels clients de ses services. Ce rsultat devient disponible ds que lalgorithme se termine, cestdire juste avant lexpression de la fin annonce. Un tel algorithme sera appel une fonction dans la suitedulivre.Ilressembleunefonctionmathmatiquequicalculeunrsultatpartirdeparamtressanslesmodifier. Iladonclestatutdune requtequi interroge lesystmelogicielpourobteniruneinformationquidpenddeson tatsansmodifiercettat. Dfinition Unefonction(requte)estunalgorithmequirendunrsultatsansmodifierltatdusystmelogiciel. Lautre classe dalgorithmesregroupeceuxquinecalculentpasunrsultat,maisquimodifientcertainesdonnesqui leur sont communiques. Ils modifient donc ltat du systme logiciel. Un tel algorithme ressemble une commande envoye au systme logiciel pour lui demander de modifier son tat actuel : cest une procdure. La signature dune procdure prcise quelles sont les donnes en entre et, parmi ces donnes, celles qui sont modifies, cestdire celles destines recevoir de nouvelles valeurs ralisant ainsi un nouvel tat du systme. Lorsquune donne en entre voit sa valeur modifie par lalgorithme, celuici retient la valeur initiale et cette valeur initiale peut tre utilisedanslapostconditionlaidedelaconstructionancien. Dfinition Uneprocdure(commande)estunalgorithmedontlecalculmodifieltatdusystmelogiciel. Lasuitedecettesectiontudiedesexemplesmoinstriviaux. Exercicersolu2:Divisioneuclidiennededeuxentiers
ENI Editions - All rigths reserved - Jonifar lina - 5-

20

On suppose que la division euclidienne de deux entiers nest pas une opration du rpertoire de notre langage dimplmentation. 1.Donnerlesspcificationsdelalgorithmequicalculelequotiententierdedeuxentierspositifs. 2.Donnerlesspcificationsdelalgorithmequicalculelerestedeladivisionentirededeuxentierspositifs. Solution Letextedelnoncestclair :ondemandelesspcificationsdesalgorithmes,autrementditcequefontcesalgorithmes etnonpascommentilsfontleurscalculs.Danscecas,leproblmeestsimple. Soientaetbdeuxentiers,positifounulpouraquiseraledividende,strictementpositifpourbquiseralediviseur.Le quotiententieretlerestedeladivisioneuclidiennedeaparbsontrespectivementlesentiersqetrtelsque : a = b x q + r avec 0 r < b Lequotientest,pardfinition,luniqueentierqtelque : b x q a < b x (q+1) (quation 1)

Deplus,tantdonnsa,betq,onobtientrpar : r = a - b x q (quation 2)

Onendduitlesspcificationsdemandes. Algorithme8:Calculduquotienteuclidiendedeuxentiers

Algorithme quotient # Le quotient euclidien de a par b. Entre : a, b : ENTIER Rsultat : ENTIER prcondition a0 b>0 postcondition bxRsultata<bx(Rsultat+1) fin quotient Lalgorithmecalculeunrsultat :lequotiententierdeaparb.Ilutilisepourceladesdonnes,aetbdetypeENTIER, sans les modifier : cest une fonction. Le rsultat calcul est un ENTIER : cest dit dans la signature de lalgorithme. Cettesignatureauraitpuscrireaussi : q u o t i e n t (a, b : E N T I E R ) : E N T I E R # Le quotient euclidien de a par b. Cependant, la situation est nouvelle cette fois. Cet algorithme exige des conditions sur les donnes pour pouvoir assurersesresponsabilits.Ilestclairementditqueadoittrepositifounuletbstrictementpositif.Laconjonctionde cesdeuxcontraintesimposesauxdonnesenentreformentlaprcondition.Ainsi,lalgorithmeannoncequilnefera correctementsontravailqucesconditionsetquilestdelaresponsabilitduclientlogicieldesassurerquellessont remplies avant de demander lalgorithme de calculer le quotient. Lalgorithme, quant lui, assure que lorsque ces conditionssontsatisfaites,ilrendunRsultatvrifiantlesassertionsnoncesdanslapostcondition. Laspcificationdelalgorithmedecalculduresteconsisteutiliserlaformuledecalculdelquation(2)cidessus. Algorithme9:Calculdurestedeladivisioneuclidiennededeuxentiers Algorithmereste # Le reste de la division euclidienne de a par b. Entre: a,b:ENTIER Rsultat:ENTIER prcondition

- 6-

ENI Editions - All rigths reserved - Jonifar lina

21

ab b>0 postcondition Rsultat=abxquotient(a,b) fin reste Remarquez que ce dernier algorithme utilise le rsultat calcul par le prcdent pour exprimer ce quil fait. Cela ne signifie pas quil utilisequotient pour calculer son propre rsultat. En effet, cette spcification ne dit rien sur la faon dont reste calcule son rsultat. Il dit seulement que son calcul consiste tablir un rsultat gal ce quannoncela postcondition.Encesens,cettespcificationnefaitquedonnerunedfinitiondurestedeladivision. Exercicersolu3:Calculdunemoyennearithmtique Vous tes professeur et vous voulez calculer la moyenne arithmtique des notes obtenues dans votre matire par Alain DUPONT. 1.Quelslmentssontncessairespourcecalcul? 2.Commentspcifiercecalcullaidedeslmentsrecensslaquestionprcdente? Solution La moyenne arithmtique est le rsultat du quotient de la somme des notes par le nombre de notes. Les lments ncessairescecalculsontlenombredenotesetlesnotesproprementdites.Posonsk > 0lenombredenotesetn 1 , n 2 ,...,nk lesnotes. Laspcificationducalculpeutscrirealors: Entre n1,n2,...,nk:REL # Les notes dont on veut la moyenne. k:ENTIER # Rsultat : REL # prcondition # Une note est comprise ( 1 i k) (0 n i i, Le nombre de notes. La moyenne arithmtique des notes. entre 0 et 20. 20)

# Le nombre de notes nest pas nul. k 1 postcondition

La spcification de ce problme met en uvre avantageusement le symbolisme mathmatique dont la prcision et la concisionsontincomparables.Cependant,cettenotationnestpasobligatoireettoutenotation,quidfinitclairementet sansambigutleproblmersoudre,estacceptable.Ainsi,parexemple,lexpressiondelapostconditionpeuttre : postcondition Le quotient par k de la somme des notes n 1 , n 2 , ..., n k

Exercicersolu4:Calculdesintrtsduncomptedpargne MonsieurJeanPaulDURANDpossdeunlivretlaCaissedpargne.Enfindanne,ilsouhaitecalculerluimmelemontant desintrtsrapportsenunanparsoncapital. 1.Quelssontleslmentsncessairescecalcul? 2.Spcifierlecalculdumontantdesintrts. Solution Lemontantdesintrtsannuelsestobtenuenmultipliantlemontantducapitalparletauxdeplacementetendivisant leproduitpar100.Lesdonnesenentresontdonclemontantducapitalplacetletauxdeplacement. Entre c a p i t a l : REL # Montant du capital.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

22

taux : REL # Taux de placement. Rsultat : REL prcondition capital 0 taux > 0 postcondition Rsultat = capital x taux x 0,01 Lasectionsuivantecommencetudierdesalgorithmescomplets.

- 8-

ENI Editions - All rigths reserved - Jonifar lina

23

Premiersalgorithmes
Cette section complte la prcdente en montrant, sur quelques exemples lmentaires, les notations utilises pour direcomment un algorithme effectue son calcul, autrement dit, comment assurer la transition de ltatinitialIltat final F du systme logiciel. On en reste encore, comme dans tout ce chapitre, des ides intuitives, non formalises, maispourtantrigoureuses.Iciaussi,lamthodeestexposepartirdexercicesrsolus. Exercicersolu5:Rapprovisionnementdestock Cetexercicereprendltudedelexemple4commenceaudbutdelasectionPremiersexemples. crirelesinstructionsquirsolventleproblmepos. IlsagitdoncdtudierquellessontlestransitionsquiferontpasserlesystmelogicieldesontatinitialI,danslequel sontconnueslesvaleursdesdonnesdentreduproblme,ltatfinalFdanslequelonsaitsilfautounonlancerun rapprovisionnement.Nousavonsvu,lorsdeltudeprliminairedecetexemple,quelestapesducalculsorganisent selonleplansuivant :
q

rcuprerlesdonnesqs,dretv1,v2,...,v12 calculerlamoyennearithmtiquemvdesventesquotidiennesdeceproduit calculerleniveaudedclenchementqd comparerqsqd :


q

qsqd=>proposerderapprovisionner qs<qd=>nerienfaire.

Cetalgorithmersoutleproblmeetilestcompletsionsaitcalculerunemoyenne.Pourrussirprsenterlasolution deproblmespluscomplexes,pourlesquelscetteformesimpledcritureenlangagenaturelnestpasadapte,nous allonscrirelasolutiontrouveenutilisantunformalismeunpeuplusrestrictifquelelangagenaturel. Ilsagitdonc,prsent,dedirecommentsonteffectuslescalculsdechaquetapepourprendreladcision. Onobtientlamoyenne mvdesventesquotidiennesendivisantletotaldesventessurlanneparlenombredejours ouvrables.Sionadmet25joursouvrablesparmois,ona:

Leniveaudedclenchementqdestleproduitdecettemoyenneparledlaidrderapprovisionnement :qd = mv x dr

Commelesvi,dretq s sontdesdonnesduproblme,nousdisposonsdetoutcequiestncessairepourorganiserle

calculcomplet.Unepremireversionestdonnecidessousendeuxparties.Lapremirereprendlesspcificationsdu problme. La seconde dtaille les oprations raliser pour obtenir un rsultat qui exprime sil convient ou non de rapprovisionner. Algorithme9.1:Spcificationsduproblmederapprovisionnement

Algorithme dclenchement # Faut-il rapprovisionner ? Entre v1, v2, ..., v12 : ENTIER # Volumes des ventes mensuelles. dr : ENTIER # Dlai de rapprovisionnement. qs : ENTIER # Seuil de dclenchement. Rsultat : BOOLEN prcondition toutes les donnes en entre sont positives ou nulles.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

24

Postcondition Rsultat = fin dclenchement LasignatureexprimequelecalculproduitunrsultatBOOLEN.Autrementdit,lalgorithmecalculeunrsultatgal soit VRAI, soit FAUX, sans modifier les donnes utilises pour raliser ce calcul. Ces donnes sont des ENTIERsdj prsentsprcdemmentetellesnesontsoumisesaucuneconditionparticulire,sicenestquelalgorithmeattend en entre des entiers non ngatifs. Cette condition est exprime ici en franais, mais elle aurait pu tout aussi simplementutiliserlessymbolesmathmatiquesusuelsdanscecas. Lapostconditionestunpeudlicateetellemritequelquesexplications.Elleestexprimesouslaformedunegalit. gauche,ontrouvelapseudovariableRsultatdontlavaleurestcellerendueparlalgorithmelorsquilsetermine. droitedusignegal,ontrouveuneexpressionboolenne.ElleprendlavaleurVRAIlorsqueq s estinfrieurougalau

membrededroitedelacomparaison.ElleprendlavaleurFAUXsinon.Danstouslescas,cestcettevaleur,soitVRAI, soit FAUX, que doit prendre Rsultat et que vrifie la postcondition. Il faut bien comprendre que le rsultat de lvaluation du membre de droite de lgalit est une valeur dans lensemble {VRAI FAUX} et que cest lgalit de Rsultataveccettevaleurquexprimelapostcondition. Passons la deuxime partie de cette analyse. Il sagit de dire comment passer de ltat dans lequel les donnes dentre vrifient la prcondition ltat qui vrifie la postcondition. Cest lalgorithme suivant qui exprime cette ralisation. Algorithme9.2:Calculdeladcisionderapprovisionner(versionprovisoire)

Algorithme dclenchement Ralisation # Calcul de la moyenne quotidienne des ventes. mv = (v1 + v2 + ... + v12) / 300 # Calcul du niveau de dclenchement. qd <- mv x dr # Calcul de la dcision. Rsultat = (qsqd) fin dclenchement Le calcul de la moyenne mv et du niveau de dclenchement q d utilisent le symbole < (flche dirige vers la gauche) distinguerdusignedgalitquiexprimeuneconditionboolennedontlavaleurestsoitVRAIsoitFAUX.Lesigne<est appelsymboledaffectation.Ilexprimequelavariableplacegaucheprendlavaleurplacedroite.Ainsi,mvprend lavaleur(v1 +v2 +...+v12 )/300etqd prendlavaleurmv x dr.

pour exprimer que, par exemple, mv prend la valeur calcule droite de la flche. Ce symbole est utilis pour le

Lorsque la quantit actuelle en stock q s est infrieure ou gale au niveau de dclenchement, il faut mettre une proposition de rapprovisionnement. La responsabilit de lalgorithme consiste simplement renvoyer VRAI comme rsultatdanscecas,ouFAUXdanslecascontraire.Cestcequefaitlinstructionannonceparlecommentaire# Calcul de la dcision.Lavaleurdroitedusymboledaffectationestcalcule.ElleprendlavaleurVRAIlorsquelestockactuel est infrieur ou gal au niveau de dclenchement. Cest la valeur affecte Rsultat dans ce cas. Lorsque le stock actueleststrictementsuprieurauniveaudedclenchement,(qs >qd )estVRAIetparconsquent(qs qd )estFAUX. CestalorscettevaleurquiestaffecteRsultat.Ainsi,danstouslescas,Rsultatprendbienunvaleurboolenne quipermettradeprendreladcisionderapprovisionnerounon.

Souscetteforme,lalgorithmenestpasassezprcis :ilneditriensurlessymbolesmvetq d .Ildoitprciserquecesont deuxnombresrels,utilisslocalementpoureffectuerlescalculsintermdiaires.Cesdeuxsymbolesnontdexistence que dans la fonction. On les dclare en donnant leur type, en dbut dalgorithme. On obtient alors la version plus dtaillecidessous. Algorithme9.3:Calculdeladcisionderapprovisionner:version1.0 Algorithmedclenchement variables mv:REL # Moyenne quotidienne des ventes. qd:REL # Seuil de dclenchement du rapprovisionnement. Ralisation # Calcul de la moyenne quotidienne des ventes. mv=(v1+v2+...+v12)/300

- 2-

ENI Editions - All rigths reserved - Jonifar lina

25

# Calcul du niveau de dclenchement. qd<mvxdr # Calcul de la dcision. Rsultat=qsqd fin dclenchement Laconstructionnotelaidedelexpressionvariablesprcisequecessymbolessontdestinsrecevoirdesvaleurs quiparticipentaucalculdursultat.Ilseraitlgitimedinsistersurlefaitquecessymbolessontlocauxlafonctionet quilsnontpasdexistenceendehorsdelleencrivant :variableslocales.Cependant,celanesemblepasncessaire ds lors quil est convenu que tout ce qui napparat pas dans la signature est local. De mme, il serait possible dinsister sur la nature de lalgorithme en prcisant devant son nom fonction ou procdure, comme le font certains auteurs : f o n c t i o n d c l e n c h e m e n t ( liste des donnes en entre) : B O O L E N Lencore,celanesemblepasncessaireaveclesconventionsadoptes. Exercicersolu6:Airedundisque Onconsidreundisquederayondonn. crirelalgorithmequicalculesonaire. Lalgorithmedemandcalculeunrsultatquildterminepartirdurayondudisque,sansmodifiercerayon :cestune fonction.LesMathmatiquesindiquent,enappelantRlerayonetSlairedudisque :S = 2 x x R.Cettefois,lenombre estuneconstante.Ensupposantcetteconstanteconnue,ilestpossibledcrire : Algorithme10:Airedudisqueversion1.0 Algorithmeaire_du_disque # Aire du disque de rayon donn. Entre rayon:REL # Le rayon du disque. Rsultat:REL prcondition rayon0 ralisation Rsultat<2xxrayon postcondition Rsultat=2xxrayon fin aire_du_disque Cette solution calque directement la formule mathmatique. Elle utilise le nombre PI dont la valeur est connue pour calculer un rsultat lmentaire. Ce qui est nouveau ici, cest lexpression de la postcondition compare celle de la ralisation du calcul. La ralisation du calcul exprime commentestobtenulersultat.Cenest peuttrepaslaseule faon de lobtenir. La postcondition est une expression boolenne, dont la valeur est donc soit VRAI soit FAUX, qui exprime ce que fait lalgorithme : il rend un rsultat gal la valeur de lexpression droite du signe dgalit. La postconditionrestelamme,mmesilaralisationchangepouruneautreversionducalcul. Cette fonction est ainsi entirement dfinie. Cependant, si on sintresse son implmentation informatique, il faut choisir un langage de programmation et dterminer sil propose une valeur pour la constante . Selon le problme particulierquilsagitdersoudre,ilserapossible,parexemple,dechoisirunevaleurapprochepourcetteconstante oudutiliserunevaleurplusprcisesilelangagelapropose.EnlangagePHPparexemple,ilestpossiblededfinirla fonctionainsi : <?php define(PI,3.141592) function aire_du_disque($rayon) { assert($rayon>=0)# Prcondition. $s=($rayon+$rayon)*PI# Calcul de laire. assert($s==2*$rayon*PI)# Postcondition. return$s } ?> Pourcomprendrecesinstructions,ilfautpeuttrequelquesprcisionssurlasyntaxedulangage.
ENI Editions - All rigths reserved - Jonifar lina - 3-

26

La clause define permet de dfinir une constante. La procdure assert provoque une erreur lexcution lorsque le prdicatquellereoitenentreprendlavaleurFAUXlexcution.Cetteprocdurepermetdimplmenterdunefaon partielleetpluttrustiquelaprconditionetlapostconditionafinquellessoientvrifieslexcution. EnlangagePHP,commedailleursenlangageCouenlangageJAVA,lesymboledelaffectationestlesignedgalit.Le signedgalitutilisdanslesexpressionsboolennesestledoublesigne==ouletriplesigne===.Parconsquent, x < yscritx = yenPHP.Demme,lgalitx = ysenotex == youx===yenPHP.Commelesclaviersdordinateurs ne permettent pas dcrire certains symboles mathmatiques, comme dans a b par exemple, on crit a >= b. De mme,a bscrita != benCetdansleslangagesdrivs. Il est important de bien cerner les diffrences entre lanalyse algorithmique du problme et limplmentation de la solution. Lanalyse algorithmique exhibe la formule mathmatique pour rsoudre entirement le problme. Limplmentationdelasolutionajustelaprogrammationdecetteformulesurdeuxpoints.Elledoitdaborddfinirune valeurutilisablepourlaconstante.Elleremplaceensuitelamultiplicationdurayonparlaconstante 2enluisubstituant uneaddition.Cependant,cesvariationsnaffectentpaslaspcificationetlapostcondition,enparticulier,restelamme. Cet exemple montre donc que la simple analyse algorithmique dun problme ne suffit pas toujours llaboration complte de la solution du problme informatique rsoudre. Il faut pourtant garder lesprit que les variations particulires imposes par les langages de programmation, notamment les variations syntaxiques, comme = pour laffectation ou >= pour comparer deux valeurs, ne sont que des dtails et quils ne concernent pas lalgorithmique. Cellecinimpose aucune syntaxe et il semble prfrable dutiliserlasyntaxedesMathmatiquesquisontunlangage universellementaccept. Lasectionsuivantedveloppelasolutiondequelquesproblmespourmettreenvidencecertainesrglesdudomaine.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

27

Exercicesrsolus
Cettesectionproposequelquesexercicesquidemandentunpeuplusderflexion.Ilsagitdeprparerdessolutions compltes et dfinitivement prtes pour ltape dimplmentation, mme si un mme problme peut donner lieu diffrentessolutionstoutescorrectes.Cespropositionsdesolutionssontlaboreslasuitedechaquenonc.Pour chacunedelles,lesnotationssontcompltesparlesnotionsncessairesleurexpression.Cependant,lelecteurest invitrflchircesproblmes,lesspcifieret,ventuellement,lesrsoudredunefaoninformelle,parexemple enrdigeantlessolutions enfranais avantdtudierlessolutionsproposes. Exercicersolu7:changerlesvaleursdedeuxvariables Ondonnedeuxvariablesquelconques,duntypeTquinestpasprcis. 1.crirelalgorithmequichangelesvaleursdecesdeuxvariables. Soient V1 la valeur de la donne contenue dans la variable v1 et V2 la valeur dans v2. Lorsque lalgorithme se termine, la donnecontenuedanslavariablev1doitavoirlavaleurV2etcellecontenuedansv2doitavoirlavaleurV1. Indication:ondonneunebouteillerempliedeauetuneautrebouteillerempliedevin.Commentchangerlescontenusdes deuxbouteillessanslesmlanger? Lindication qui prcde suggre dutiliser une variable intermdiaire pour rsoudre le problme. Peuton faire autrement ? Cestlobjetdelaquestionsuivante. OnsupposequelesobjetsdetypeTauxquelsappartiennentlesvaleursdesvariablesv1 et v2peuventtreadditionnsou soustraits.Cestlecasdesnombresentiersourelsparexemple. 2.Mmequestionquelaprcdente,maislalgorithmeproposnefaitquedesadditionsetdessoustractions,sansutiliser dautrevariablequev1etv2. Solution On peut commencer par spcifier lalgorithme. Cest ce qui est fait cidessous. Remarquez quil sagit de modifier les donnes reues en entre. Les valeurs changer sont portes par des variables qui doivent tre modifies par lalgorithme :cestdoncuneprocdure. Algorithme11.1:Spcificationsdelchangededeuxvariables

Algorithme changer # changer les valeurs de a et b. Entre a, b : T # Variables dont les valeurs seront changes. prcondition aucune postcondition a = ancien(b) b = ancien(a) fin changer Cet algorithme ne prcise pas de rsultat. Cest donc une procdure, qui modifie ltatdusystmelogiciel.Dequelle faon ? La postcondition lexprime clairement : la valeur dea est celle de lancienne valeur de b,cestdire la valeur quepossdaitbavantquelalgorithmenefassesestransformations.Lavaleurdebestcelledelanciennevaleurdea. Encoreunefois,ancien(x)faitrfrencelavaleurdexavantlecalculdelalgorithmeetnonpaslavaleuracquiseen coursdecalcul. LetypeTnestpasprcis.Parconsquent,lesvariablespeuventtreduntypequelconque.Cetypenecontraintpas laprocdurequi travaille delammefaon,quelquesoitcetype.Ceciterminelaspcificationetonpeutenvisager dtudiercommentlalgorithmepeutfairecetravail. Lnonc suggre une solution qui indique clairement la mthode utiliser : pour changer les contenus de deux bouteilles,ilsuffitdutiliserunebouteillesupplmentairedanslaquelleontransvaselundesdeuxliquides,disonslevin. Ainsi,labouteilledevindevientlibrepourrecevoirleau.Cetteoprationlibrelabouteilledeaudanslaquelleonpeut prsenttransvaserlevincontenudanslabouteillesupplmentaire. Pourleproblmeinformatique,onutiliseraunevariablesupplmentairequirecevralavaleurdelunedesdeuxvariables changer, disons a. On peut alors copier la valeur que contient b dans a puis copier la valeur de la variable supplmentairedansb.Soittempcettenouvellevariable.ElleestdestinerecevoirunevaleurdetypeTetdoitdonc tredclarecommetelle.Onobtientlasolutiondelalgorithmeciaprs.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

28

Algorithme11.2:changerdeuxvariablesversion1.0

Algorithme changer # changer les valeurs de a et b. Entre a, b : T # Variables dont les valeurs seront changes. prcondition aucune variable temp : T ralisation temp <- a # Copier a dans temp. Commentaires revoir. a <- b # Copier b dans a. b <- temp # Copier temp dans b. postcondition a = ancien(b) b = ancien(a) fin changer Le c ur de lalgorithme est constitu du paragraphe introduit par ralisation qui ralise effectivement lchange des valeurs. Ce paragraphe illustre une mauvaise faon dutiliser les commentaires. Ici, les commentaires ne font que paraphraserlesinstructionsdetransformationsdesdonnes.Cestunemauvaisepratiquepuisquecescommentaires napportentrien.Voyonscommentjustifiercetalgorithme,cequisuggreracommentlecommenter.Danslasuite,on note par une lettre minuscule un contenant , cestdire un nom de variable. Une lettre majuscule dsigne un contenu ,cestdirelavaleurdelavariable. Avanttouteexcutiondinstructionderalisation,ltatdusystmeest : # at avant l hange. t c temp = ??? ; a = A ; b = B Linstructiontemp <- acopielavaleurdeadanstemp.Lenouveltatestalors : # at apr copie de a dans temp : temp <- a. t s temp = A ; a = A ; b = B Il est important de remarquer que cette instruction ralise une copie de la valeur de a dans temp. Cette copie ne modifie pas la valeur A contenue dans a, plus forte raison celle de b. Cependant la valeur inconnue dans temp, symboliseparles???deltatprcdent,estdfinitivementperdue. Linstructiona <- bconduitunnouveltat : # at apr copie de b dans a : a <- b. t s temp = A ; a = B ; b = B Ainsi,lavaleurcontenuedansaestperdue,remplaceparBquiestcopiedeb.Lencore,ilsagitdunecopieetdonc bnestpasmodifie.Cesticiquelutilisationdetempapparatplusclairement.Sanselle,lavaleurAseraitperdue. Enfin,linstructionb <- tempconduitunnouveltat : # tat aprs copie de temp dans b : b <- temp. temp = A ; a = B ; b = A Lavaleur A contenue dans temp a remplac la valeur Bdansb par copie, sans modifier temp.Finalement,lasituation obtenuelaisseB dansaetA dansbetcest ce quaffirmelapostconditiondechanger.Cetteanalysemontrequele paragrapheintroduitparralisationseraitplusclairsiltaitrdigainsi : ralisation # tat initial temp <- a # a <- b # b <- temp # # tat final :

: a = A ; b = B. temp = A ; a = A ; b = B. temp = A ; a = B ; b = B. temp = A ; a = B ; b = A. a = B ; b = A.

Cequipermetdeseconvaincredelacorrectiondecetalgorithme,cestledtaildessituationsobtenuesaprschaque instruction.Cestunpointimportant,fondamental.Lesinstructionsdunalgorithmedisent cequefait lalgorithmeou comment illefait.Ellesnedisentriensurlessituationsobtenuescestdiresurltatatteintaprslexcutionde

- 2-

ENI Editions - All rigths reserved - Jonifar lina

29

linstruction.Cettatestreprsentparlesvaleursdesvariables,leurcontenu.Cestendtaillantcessituations,cest direenanalysantetendcrivantltatdusystme,quelonpeutvrifierlalgorithme. Lvolutiondestatspeutaussitrereprsenteparlediagrammedtatsdelafigurecidessous.

Finalement, nous disposons ainsi dune mthode danalyse qui peut tre utilise pour rsoudre la question suivante. AdditionneraetbdonneunrsultatgalA+B.EnretranchantBcersultatonobtientAcommenouveaursultat : a <- a + b => a = A + B et b = B b <- a - b => b = A et a = A + B Ainsi,bcontientAetacontientA+B.EnretranchantA,cestdirelecontenudeba,onobtienta = B. a <- a - b => a = B et b = A Finalement,lalgorithmescrit : Algorithme11.3:changerdeuxvariablesversion2.0

Algorithme changer # changer les valeurs de a et b. Entre a, b : T # Variables dont les valeurs seront changes. prcondition (T,+) et (T,-) sont dfinies ralisation a <- a + b # a = A + B ; b = B. b <- a - b # a = A + B ; b = A. a <- a - b # a = B ; b = A. postcondition a = ancien(b) b = ancien(a) fin changer Laprconditionprciseque Testuntypededonnessurlequelsontdfinieslesdeuxoprationsapplicables+et, dadditionetdesoustraction. Comme pour la version prcdente, lanalyse de la solution consiste suivre lvolution de ltat du systme. Le diagrammedtatspeutencoretreutilisici.tablircediagrammeestlaissenexercice. Exercice2:Diagrammedtatsdelaversion2dechanger Construirelediagrammedtatsdecettedernireversiondelalgorithmedchangededeuxvariables.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

30

Remarquezquelesdeuxversionsdelalgorithmesontradicalementdiffrentesdanslafaonquellesontdchangerles valeurs des deux variables. Les deux algorithmes sont pourtant identiques dans leurs spcifications lorsqueT est un typenumriqueusuelparexemple.Ilsfontexactement lammechose :changerlesvaleursdedeuxdonnesde mmetype T.Ilslefontdedeuxfaonsdiffrentesetquinontpaslesmmesconsquences :lepremierutiliseune variable intermdiaire. Le second fait des calculs. On peut penser que le premier occupera plus de place dans la mmoiredelordinateurutilispourlimplmenter,alorsquelesecondprendraplusdetempspourmettrelesystme dansltatfinal.Cependant,unutilisateurquineseraitpasconcernparlafaonderaliserlestransformations,naura connatrequelesspcificationspourpouvoirmettreen uvrechanger.Bienentendu,lesdeuxalgorithmesnesont interchangeables que sur des donnes dun type T sur lequel sont dfinies les oprations dadditions et de soustractions. Cest ce que prcise la prcondition de la seconde version. Par consquent, seule la version 1 est gnraleetdoncutilisabledanstouslescas. ce stade, ces deux algorithmes sont complets. Ils peuvent servir coder une solution dans un langage de programmationdordinateur.EssayonsenlangagePHPparexemple. Lescriptprincipalquiutiliselaprocdurechangerest,parexemple : <?php require_once(echanger.php) ; # change les valeurs de ses paramtres. require_once(ecrire.php) ; # crit les valeurs des paramtres. $a = 17 ; $b = 21 ; ecrire(Principal avant change, $a, $b) echanger($a, $b); ecrire(Principal aprs change, $a, $b) exit(0) ; ?> Le fichier echanger.php est un lien sur le fichier echanger1.php qui contient la dfinition dune premire version de la procdure : <?php /** * changer les valeurs de "$a" et "$b". * * @param mixed $a * @param mixed $b */ function echanger($a, $b) { $temp = $a ; $a = $b ; $b = $temp ; } ?> Remarquezque,pourPHP,toutestfonction.Cetteprocdureestdoncdclarelaidedumotfunction. Lexcutionduscriptprincipalquiappellecetteprocdureetlaprocdureecriredonnelesrsultatssuivants : Principal avant change : A = 17 Principal aprs change : A = 17 B = 21 B = 21

; ;

ce qui, manifestement, nest pas ce qui est attendu. Pour comprendre ce qui se passe, ajoutons dans la procdure echangerlesmmesinstructionsdetrace : function echanger($a, $b) { ecrire(changer , $a, $b) ; $temp = $a ; $a = $b ; $b = $temp ; ecrire(changer , $a, $b) ; } Cettefois,lersultatdelexcutionest :

- 4-

ENI Editions - All rigths reserved - Jonifar lina

31

Principal changer changer Principal

avant avant aprs aprs

change change change change

: : : :

A A A A

= = = =

17 17 21 17

B B B B

= = = =

21 21 17 21

Ainsi,onconstatequelaprocduredchangesacquittecorrectementdesatcheetralisebiencequiatprouv plus haut. Par contre, le script principal ne reporte pas les changements. Pour le script principal, les deux variables gardentlesmmesvaleursetlestransformationsralisesparlaprocdurenontaucuneinfluencesurlesvaleursdes variablesdanslescriptprincipal. Laprocdureechangertravaillesurdescopieslocalesdesparamtres$aet$b.Lesnomsdesvariablesnechangent rienlaffaire.Danslescriptprincipal,lutilisationdelaprocduresefaitparlinstructionechanger($a, $b)parlaquelle ondemandechangerlesvaleursdesvariables$aet$b.Ici,$aet$bsontlesparamtreseffectifsdelappel.Dansla procdure, $a et $b sont des paramtres formels, cestdire des marqueplaces qui indiquent simplement que la procdurereoitenentredeuxparamtres,lepremiertantdsignpar$aetlesecondpar$b.Ilauraittlgitime de les appeler $x et $y ou $premier et $second par exemple. De plus, la rgle essentielle ici est que, partout o apparat $a ou $b, cest une copielocale quutilisera la procdure et non le paramtre effectif. Ainsi, la sortie de la procdure, le contexte du script principal est restaur et $a et $b retrouvent les valeurs quelles avaient dans ce contexte. Poursortirdecettesituation,ilfautunmoyendeforcerlaprocdureutiliserlesvariableseffectivesetnonpasdes copies locales. C et les langages drivs adoptent pour cela une convention syntaxique qui consiste, par exemple, faireprcderdun&chacundesparamtresformelsdelaprocdure.Lasignaturedelaprocduredevientainsi : f u n c t i o n e c h a n g e r (&$a, &$b) ; Aprs cette modification dune copie de la procdure dans un nouveau fichier echanger2.php et la redfinition du lien echanger.phpverscettecopie,onobtientlexcutionduscriptprincipal: Principal changer changer Principal avant avant aprs aprs change change change change : : : : A A A A = = = = 17 17 21 21 B B B B = = = = 21 21 17 17

cequiestexactementcequenousattendons. Cette tude montre que, mme aprs une tude soigne dun problme, il est encore ncessaire de procder ladaptationdelalgorithmeauxparticularitsdeslangagesdeprogrammation.Laconventionmiseenvidencepourle langagePHPneluiestpasparticulire.Toutmodulelogiciel,procdureoufonction,utilisedescopieslocalesdesvaleurs des paramtres effectifs. Cest une convention syntaxique particulire qui contraindra le module utiliser les valeurs desparamtreseffectifsaulieudecopieslocales.Bienentendu,lalgorithmiquenapassesoucierdecesrglesde syntaxe.Lesspcificationssontlpourdfinirprcismentlecontexte,lesconditionsdusageetleseffetsdumoduleet ilnyapaslieudintroduiredesrglesdegrammairesupplmentairespourprciserdavantage. Envisageons,prsent,limplmentationdansunlangageparticulierdelasecondeversiondelalgorithmedchange. Laprconditionimposeauxvaleurschangerdtreduntypesurlequelestdfinieladdition.Pourlasuitedecette tude, supposons que ce type est le type ENTIER et que le langage de programmation est C. En langage C, comme danstoutlangagedeprogrammationdailleurs,ledomainedesvaleursdunentierestcontraintparlareprsentation desnombresenmachine.Ainsi,parexemplesurtelordinateurcourant,celuiutilispourcrirecetexte,unentierest reprsent sur 32 chiffres binaires (bits), cestdire sur 4 octets. Ainsi, sa valeur, lorsquil est positif, est limite INT_MAX=231 1soit2147483647.Toutdpassementdecettelimiteengendreuneerreurdecalculetparfoismme une erreur ds la phase de compilation du programme. Considrons alors notre version de changer. La premire instructiondelaralisationcalculelasommea+betrangelersultatdansa.Supposonsalorsdesvaleurstellesque a > INT_MAX / 2etb > INT_MAX / 2.Leursommeestalorsa+b > INT_MAXetlersultatnepeuttrecalcul.Entoute rigueur,laprconditiondevraitdoncimposerlescontraintesassociessurledomainedesvaleursdeaetb : prcondition aINT_MAX bINT_MAX aINT_MAXb IlnestpasdifficilededmontrerquecetteprconditionassurequelasommeresteinfrieureougaleINT_MAX.Il restecomplterpourimposerlasommederestersuprieureougaleINT_MINdelammefaon. Ces considrations dimplmentation concernentelleslalgorithmique ? Ce livre prtend que non. Lalgorithme restedanslespaceduproblme.LadditionetlasoustractiondesENTIERssontbiendfinies,leursproprits sont connues et il ne semble pas ncessaire de sattarder sur des particularits qui viennent nier ou amender ces proprits.Bienentendu,programmerimposedautrescontraintesquiviennentmodulerlanalysepralable.Ilfaudra bienentenircomptepourprogrammer,maisonseraalorsdanslespacedelasolutionetlescontraintesdedomaine neserontpaslesplusdifficilessatisfaire.Parconsquent,lasuitedecelivrenetiendrapascomptedescontraintes imposesparleslangagesdeprogrammation.Certainesdifficultsserontsignalesparfoislorsquelasolutionnest pastriviale,maisnousenresteronshabituellementdesproblmessimples.
ENI Editions - All rigths reserved - Jonifar lina - 5-

32

Les rudiments tudis dans les sections prcdentes sont insuffisants pour tudier des problmes plus complexes. Il nous faut encore prciser quelques rgles fondamentales sur lutilisation des mots du langage qui nous servent reprerlesdonnesetlesrsultats. Chaquedonneoursultatestreprsentparunevariabledontonsupposequelleoccupeunensembledepositions dans la mmoire du calculateur utilis pour coder la solution du problme. Appelons une case lensemble des positionsoccupesparunevariable.Ainsi,lavaleurdeaoccupeunecase,lavaleurplacedanstempenoccupeune autre...LutilisationdelammoiredunemachinedeVONNEUMANNestrgleparlestroisaxiomessuivants : (A1) :onnepeutplacerquuneseuledonnelafoisdansunecase (A2) :onpeututilisertoutmomentlecontenudunecasesansledtruire (A3) :onpeuttoujoursremplacerlecontenudunecaseparunenouvelledonnedummetype. Laxiome(A3)seradornavantunaxiomedela thorie decelivre,maisnestpasunaxiomedetousleslangages de programmation. Ainsi, par exemple pour un langage comme PHP, il est possible dcrire $a = 55 puis, plus tard, $a = Bonjour ce qui fait que lentier 55 a t remplac par une chane de caractres, qui nest trivialement pas du mmetype.Cetaxiomeditaussiquunedonneplacedansunecasenestjamaisdfinitivementprsenteetquilest toujourspossibledelaremplacerparuneautrevaleur. Laxiome(A2)estlaxiomedecopie.Ilditquelacopieducontenudunecaseversuneautrecase,lorsduneaffectation parexemple,nedtruitpaslecontenudelacasesource. Maisquestcequunevariableprcisment ? Dfinition Onappellevariableuneinstanceduntypededonnes. Untypeprciseledomainedesvaleursdelavariable,cestdirelensembledesvaleurspossiblespourcettevariable, et les oprations applicables des donnes de ce type. Ainsi, par exemple, le type ENTIER dfinit les donnes de lensemble des entiers sur lesquels on peut effectuer les oprations usuelles daddition, multiplication... Le type COULEUR dfinit les valeurs possibles des instances de couleurs : ctait rouge, orange et vert. La seule opration actuellementdfiniesurlesdonnesdecetypeestsuccesseur.Dfinirunevariablecest,enalgorithmique,luidonner un nom et dire quel type elle appartient, cestdire de quel type elle est une instance. Cette seule mention suffit pour prciser les valeurs quelle peut prendre et les oprations qui lui sont applicables. On peut toujours dfinir un nouveau type de donnes. Cette dfinition devra clairement prciser les valeurs possibles de ses instances et les oprationsapplicables. Lexercice suivant illustre la cration et lutilisation dun nouveau type de donnes. Il est instructif dans la faon de rutiliserdesalgorithmespourendfinirdautres. Exercicersolu12:Rservoirs Unrservoirestunconteneurdeliquide.Onpeutraliserdiffrentesoprationssurunrservoir,commeleremplir,levider, ajouterduliquidesoncontenu... 1.tablirlalistedesoprationspertinentesapplicablesunrservoir.Distinguerclairementlesfonctionsdesprocdures. 2.crirelesspcificationspuislesdfinitionsdesalgorithmesdechacunedecesoprations. Solution Les oprations pertinentes sur un rservoir, comme dailleurs sur tout objet informatique, se rpartissent en deux familles,commenousavonscommenclevoirprcdemment.
q

Les requtes permettent dinterrogerlobjet sur son tat : ce rservoir estil vide ? Estil plein ? Quelle est sa capacit ?... lescommandespermettentdemodifiercettat :remplircerservoir,levider,luiajouterunequantitdonne deliquide...

Une requte est implmente par une fonction : elle calcule un rsultat quelle retourne au client du service quelle reprsente. Une commande est ralise par une procdure qui va modifier les valeurs de certaines variables dtat. Dtaillonslesmembresdechaquefamillepourunrservoir. Lesrequtessurunrservoirsont :
q

estVidequidterminesiunrservoirestvide

- 6-

ENI Editions - All rigths reserved - Jonifar lina

33

estPleinquidterminesilestplein.

Lescommandessont :
q

viderpourramenersacontenance0 remplirpourajustersacontenancesacapacit ajouterunequantitdonnedeliquidepouraugmentersacontenanceactuelle enleverunequantitdonnedeliquide.

Ltatdunrservoirestentirementcaractrispardeuxnombres.Sacapacitdonneenlitreslaquantitdeliquide quilpeutcontenir.Cestunnombredcimalpositif,ventuellementnulpourunrservoirquinepeutriencontenir.Sa contenance donne en litres la quantit actuelle de liquide que contient le rservoir. Cest aussi un nombre dcimal positif, ventuellement nul si le rservoir ne contient rien. Par consquent, un RSERVOIR informatique est une structure de donnes qui rassemble indissociablement ces deux nombres pour en faire un rservoir. Elle est dfinie ainsi : type RSERVOIR structure capacit:REL contenance:REL fin RSERVOIR LorsquenousauronsbesoindedfinirunevariabledetypeRSERVOIR,nouscrirons : # D laration dun variable de type R E R V O I R. c S r : RSERVOIR cequiauralemmeeffetquunedclarationusuellepourunnombreentierouunnombrerel.Ildevientalorspossible dinitialiserlacapacitetlacontenancedurservoirr : r.capacit <- 1000 r.contenance <- 0 # Initialise la capacit de r 1000 litres. # Sa contenance est nulle (r ervoir vide). s

Pour interroger lerservoirrainsidfinietobtenirsacapacitparexemple,oncrira: variable c:REL ... # Copier la valeur de la capacit du rservoir r dans c. c<r.capacit Ainsi,tantdonneunevariable rdetype RSERVOIR,onaccdelunedesescaractristiques,sacapacitousa contenance,enutilisantlanotationpointe : r.capacitour.contenance. Accessoirement, ces conventions montrent que deux nouvelles requtes permettent dinterroger un rservoir sur son tat:
q

c <- r.contenancecopiedansclacontenancedurservoirr c <- r.capacitcopiedemmesacapacit.

Nousdisposonsprsentdetoutcequiestncessairepourdfinirlesoprationssurunrservoir.Commenonspar lesrequtes. La fonction estVide interroge un rservoir r quelle reoit en entre. Elle rend le rsultat VRAI si et seulement si le rservoir est vide, autrement dit, si et seulement si sa contenance est nulle. Lalgorithme cidessous dfinit cette fonction. Algorithme12:FonctionestVidepourunrservoirversion1.0

ENI Editions - All rigths reserved - Jonifar lina

- 7-

34

AlgorithmeestVide # r est-il vide ? Entre r:RSERVOIR Rsultat:BOOLEN prcondition 0r.contenancer.capacit ralisation Rsultat<(r.contenance=0) postcondition Rsultat=(r.contenance=0) 0r.contenancer.capacit fin estVide (r.contenance = 0)estunprdicat :ilprendlavaleurVRAIouFAUXselonquelerservoiraunecontenancenulleou non.CettevaleursertinitialiserlavariableRsultatcalculeparlafonction.Ainsi,cersultatestVRAIsietseulement si la contenance actuelle du rservoir est nulle et alors le rservoir est vide. Lorsque la contenance nest pas nulle, RsultatprendlavaleurFAUX,cequiindiquequelerservoirnestpasvide. LafonctionestPleinestdfiniedelammefaon. Algorithme13:FonctionestPleinpourunrservoirversion1.0 AlgorithmeestPlein # r est-il plein ? Entre r:RSERVOIR Rsultat:BOOLEN prcondition 0r.contenancer.capacit ralisation Rsultat<(r.contenance=r.capacit) postcondition Rsultat=(r.contenance=r.capacit) 0r.contenancer.capacit fin estPlein Lerservoirestpleinsietseulementsisacontenanceestgalesacapacit.Cestcequexprime laffectationdela variableRsultatquiprendpourvaleurcelleduprdicatdroitedusymboledaffectation. Remarquezaussidanscesdeuxfonctionslapremireclausedelapostcondition.CetteclauseprendlavaleurVRAIou FAUXselonqueRsultatalavaleurdelexpressionboolennedroitedusignedgalit.LorsqueRsultatalamme valeurquelexpression,cestquelalgorithmerendunevaleurcorrecte.Sinon,cestquelalgorithmenefaitpasuncalcul correctetilconvientalorsdelecorriger.Encoreunefois,lasignaturedelafonction,compltedelaprconditionetde lapostconditionsuffitladfinir. Les deux fonctions estVide etestPlein sont deux prdicats qui admettent la mme prcondition. On peut remarquer quecetteprconditioncaractriseunrservoirengnraletnonpasseulementlesdonnesenentreoulersultat decesprdicats.Enparticulier,laconditionquelleexprimeestencorevraielorsquelalgorithmesetermineetretourne son rsultat. Cest ce qui est dit dans la postcondition o on retrouve la clause 0 r.contenance r.capacit. En effet,pourtoutrservoirona : 0 contenance capacit et cette condition doit rester toujours vraie, dans tous les tats du systme logiciel. Cest ce que lon appelle un invariantdetype.Cetinvariantcaractriseunrservoir,quelquilsoitettoutinstantdesoncycledevie,pourtout tat du systme. Pour marquer quilsagit l dune proprit permanente, qui ne dpend pas de ltat dunrservoir particulier,maisquicaractriseletypeRSERVOIR,onlaprcisedansladfinitiondutype,commececi : type RSERVOIR structure capacit:REL contenance:REL invariant 0contenancecapacit fin RSERVOIR
- 8 ENI Editions - All rigths reserved - Jonifar lina

35

Cette condition doit toujours tre vrifie, dans la prcondition, pendant lexcution de lalgorithme et dans la postcondition. Il est alors inutile de la prciser dans la prcondition et la postcondition. Il est implicite que linvariant tantunecaractristiqueintrinsquedesdonnesdutypedfini,ilrestetoujoursvraietdoittrevrifidanstousles tatsdusystme.OnpeutreprendreladfinitionduprdicatestVidecommedanslalgorithmesuivant : Algorithme14:FonctionestVidepourunrservoirversion2.0 AlgorithmeestVide # r est-il vide ? Entre r:RSERVOIR Rsultat:BOOLEN prcondition aucune ralisation Rsultat<(r.contenance=0) postcondition Rsultat=(r.contenance=0) fin estVide Bienentendu,laprconditionetlapostconditioncompltessontcellesdelaversion1.0tudieplushaut. Lescommandes ajouterou enleverajouteouenlveunequantitdonnedeliquideaucontenuactueldurservoir pour augmenter ou diminuer respectivement sa contenance. On peut remarquer que ajouter consiste augmenter positivementlacontenancealorsqueenleverconsistelaugmenterngativement.Onadonc : a j o u t e r (r,quantit:R E L )::=a u g m e n t e r (r, quantit) avec quantit 0 e n l e v e r (r,quantit:R E L )::=a u g m e n t e r (r, -quantit) avec quantit 0 Cetteremarquepermetdedfinirlaprocdureajouter : Algorithme15:Procdureajouterunrservoir Algorithmeajouter # Ajouter quantit la contenance du rservoir r. Entre r:RSERVOIR quantit:REL prcondition 0quantitr.capacitr.contenance ralisation augmenter(r,quantit) postcondition r.contenance=ancien(r.contenance)+quantit fin ajouter Lesousalgorithme augmenterestuneprocdurequifactoriselesinstructionscommunesauxalgorithmes ajouteret enlever.Ilestdfinicidessous. Algorithme16:Augmenterlacontenancedurservoir Algorithmeaugmenter # Augmenter la contenance du rservoir r de quantit. Entre r:RSERVOIR quantit:REL ralisation r.contenance<r.contenance+quantit postcondition r.contenance=ancien(r.contenance)+quantit fin augmenter Ilny a pas de prcondition cette procdure, si ce nest la clause dinvariant, bien entendu. En particulier,quantit

ENI Editions - All rigths reserved - Jonifar lina

- 9-

36

nestplusassujettietrepositive.Eneffet,enleverunequantitpositivedeliquide,cestaugmenterlacontenancede lopposdecettequantit.Laprocdureenleverestdoncdfiniepar : Algorithme17:Procdureenleverunrservoir Algorithmeenlever # Enlever quantit la contenance du rservoir r. Entre r:RSERVOIR quantit:REL prcondition 0quantitr.contenance ralisation augmenter(r,quantit) postcondition r.contenance=ancien(r.contenance)quantit fin enlever Comme cela a dj t dit plusieurs fois, la responsabilit dune commande est de modifier ltat du systme. La procdureajouter, par exemple, modifie la contenance du rservoir. Il faut alors sassurerquelenouveltatobtenu restecohrentavecladfinitiondunrservoir.Ici,ilconvientdesassurerquelinvariantdetypeestrespect.Voyons cela. Initialementona : (0quantitr.capacitr.contenance)et(0r.contenancer.capacit) Cest la prcondition, dont on exige quelle soit vrifie avant lexcution de lalgorithme. Cette prcondition est un prdicatsurltatdurservoircaractrisparlesvaleursdesvariablesenentre.Lorsquelaralisationdelalgorithme estfaite,ona : (r.contenance=ancien(r.contenance)+quantit) et (0quantitr.capacitancien(r.contenance)) Enajoutantancien(r.contenance)auxdeuxmembresdeladeuximeingalit,onobtient : a n c i e n (r.contenance) + quantit a n c i e n (r.contenance) + r.capacit - a n c i e n (r.contenance) + quantit

Do,finalement : a n c i e n (r.contenance) + quantit = r.contenance r.capacit Cequiterminelapreuvequelalgorithmemaintientlinvariant. La commande enlever ralise lopration duale de ajouter et on dmontre de la mme faon quelle maintient linvariant. Exercice3:enlevermaintientlinvariantdetype DmontrerquelaprocdureenlevermaintientlinvariantdutypeRSERVOIR. Lesoprationsrempliretviderutilisentlesalgorithmesprcdents.Voyonscela. Viderunrservoirconsisteenleversacontenance.Doladfinitiondelalgorithmedecetteprocdure : Algorithme18:viderunrservoir Algorithmevider # Vider le rservoir r Entre r:RSERVOIR prcondition aucune ralisation enlever(r,r.contenance)

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

37

postcondition estVide(r) fin vider La ralisation utilise lalgorithme enlever dfini prcdemment. Il convient de remarquer surtout que la postcondition utilise le prdicat estVide. Plus gnralement, la prcondition ou la postcondition dun algorithme peut utiliser toute instructionquinemodifiepasltatdusystmelogiciel.Parconsquent,lesparamtressontutilisables,commecelaa dj t vu, mais aussi toute fonction dfinie qui ne fait appel quaux ressources locales au module ( quelques rservesprsquiseronttudiesplustard)dontonveutexprimerlesspcifications. Remplirunrservoir,cestluiajouterunequantitgaleladiffrenceentresacapacitetsacontenance.Lerservoir estalorsplein.Ilnestdoncpasdifficiledcrirecetalgorithme. Exercice4:Dfinitiondelaprocdureremplir crireladfinitioncompltedelalgorithmeremplir. Pourtrecomplet,ilrestedmontrerquecesalgorithmessontcorrects.Cettecorrectionsupposeessentiellementle maintiendelinvariantdetype,maisellenestpasplusdifficiletablirquecelledeajouter. Exercice5:Correctiondesalgorithmesprcdents DmontrerquelesalgorithmesrempliretvidermaintiennentlinvariantdutypeRSERVOIR. Lediagrammedtatsdunrservoirnestpasdifficileobtenir.Ilestfaitdetroistatsfondamentaux:VIDE,PLEINet untatdanslequellerservoirnestnivideniplein. Exercice6:Diagrammedtatsdunrservoir Construirelediagrammedtatsdunrservoir. Ledernierexercicersoludecettesectionestdaborddroutant.Ilsembledifficile,maisillestmoinsquilnyparat.Il nestpasentirementrsolu,maiscechapitreadjabordquasimenttouteslesconnaissancesncessairespouren donnerunesolutioncomplte. Exercicersolu13:LejourdupremierMai crireunalgorithmecalculant,pouruneannedontondonnelemillsime,lejourdelasemaineotombelepremierMai. Ainsi,parexemple,le1erMai2005tombaitundimanche.Le1erMai1983taitaussiundimanche.Le1erMai2001taitun mardi. Solutionpartielle Lasolutionprsenteestpartielle.Elleseracompltedansleschapitressuivants. Lesdonnesduproblmesontconstitues,dunepart,dunmillsimeet,dautrepart,dunedateinvariable :le1erMai. Lemillsimepeut,entoutegnralit,treunentierrelatifquelconque,puisquilestpossibledefairerfrenceune anneavantJC.Cependant,celanapasbeaucoupdesens,neseraitcequeparcequeladatedu1erMaiclbreun vnementrcent,dudixneuvimesicle.Ilfautdoncprciserdavantageleproblme.Ceserafaitplusbas. Lersultatducalculdemandestlejourdelasemaineotombele1erMaiduneannedonne.Cersultatasept valeurspossibles :lundi,mardi, ...,dimanche.Lnoncdonnequele1erMai1983taitundimanche.Commeunana 365 jours, mais 52 semaines qui font 52 x 7 = 364 jours, chaque anne qui passe introduit un dcalage de 1 jour supplmentaireparrapportlanneprcdente.Ainsi,ennotantsuccesseur(j)lejourdelasemainequisuitunjourj quelconque,ona : 1erMai1983:dimanche 1erMai1984:successeur(dimanche)=lundi Envrifiantsurunvieuxcalendrier,onconstatequele1erMai1984taitunmardietnonpasunlundi.Cestque1984 estuneannebissextile,quiintroduitundcalagesupplmentairede1jourpourle29fvrier.Onadonc : 1erMai1983:dimanche 1erMai1984:successeur(successeur(dimanche))=mardi Nousdisposonsdoncdunmoyendatteindrelersultat : 1.onsedonneuneannederfrencedontonconnatlejourdu1erMai 2. pour une anne donne, on calcule le nombre de jours de dcalage par rapport au jour du 1er Mai de lannede rfrence.
ENI Editions - All rigths reserved - Jonifar lina - 11 -

38

Nous choisirons une anne recule, qui constituera la borne infrieure du domaine des millsimes et permettra donc dexprimerlaprconditionsurcettedonne. Pouruneannereculedansletemps,onpeutavoirundcalagedeplusieursjours.Ilfautdoncpouvoircumulerles dcalages. Pour simplifier, notons s(j) le successeur dun jour j quelconque de la semaine et sk (j) lapplication de loprationsuccesseurkreprises.Ainsi,pourlexemplequiprcde,onobtient : 1erMai1983:dimanche 1erMai1984:s2 (dimanche)=mardi

Danslasuite,sk (j)seraaussinots(j,k),commedanss(dimanche,2)pours2 (dimanche).


q

Posons travail(millsime) le jour du 1er Mai de lanne millsime. Ainsi, travail(1983) = dimanche. lanne millsime + 1ona :

travail(millsime+1)=s(travail(millsime),1)simillsime+1nest pasbissextile travail(millsime+1)=s(travail(millsime),2)simillsime+1est bissextile Pourundcalagedunnombredannesgalan,onaura : t r a v a i l (millsime + an) = s (t r a v a i l (millsime), an+bis) formuledanslaquellebisdsignelenombredannesbissextilespendantanannes.
q

Commeilyauneannebissextiletouslesquatreans,ondevraittrouver :

bis = q u o t i e n t (an, 4) Cependant,enreprenantlexemplede1983,onobtientpour1984 : an = 1 bis = q u o t i e n t (1, 4) = 0 Or,1984tantbissextile,ondevraitobtenirbis=1.Ainsi,bis = quotient(an, 4)uniquementsiundcalagede1,2ou 3 jours ne donne pas danne bissextile, donc si les annes millsime+1, millsime+2 et millsime+3 ne sont pas bissextiles. Comme il y a une anne bissextile tous les quatre ans quelque chose prs , il suffit de choisir une annederfrencebissextile. Larpartitiondesannesbissextilesprsentedesirrgularits.Lesannesquimarquentunelimitedesicle,comme 2100parexemple,nesontpasbissextiles,mais2000ltait.2000nintroduisaitpasdirrgularit.Enfait,lesannes quimarquentlalimitedunsiclenesontpasbissextiles,saufcellesdontlesdeuxpremierschiffresformentunnombre multiple de 4. Autrement dit un millsime multiple de 400 est une anne bissextile. Ainsi, 1900 et 2100 ne sont pas bissextilescar19et21nesontpasdesmultiplesde4,ouencore1900et2100nesontpasdesmultiplesde400,alors que2000estbissextilepuisque2000estunmultiplede400ouencore20estunmultiplede4. On peut pourtant choisir 1900 comme anne de rfrence puisque lanne bissextile suivante sera 1904 sans irrgularitdanslasuccessionduneannebissextiletousles4ansjusquen2100.Convenonsdonc,poursimplifier :
q

1900seralannederfrence 2100seralalimitesuprieuredesmillsimesacceptables.

Ildevientalorspossiblededonnerunespcificationpartielledelalgorithme : Entre millsime:ENTIER Rsultat:??? prcondition 1900millsime<2100 postcondition Rsultat=lejourdelasemaineotombele1erMai delannemillsime Ilnousfautconnatrelejourdu1erMai1900 :ctaitunmardi.Dounepremireversiondelalgorithmedemand,qui

- 12 -

ENI Editions - All rigths reserved - Jonifar lina

39

utiliseunnouveautypededonnesdfinipar : type JOUR (lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche) fin JOUR Algorithme19:Jourdu1erMaiversion1.0 Algorithmetravail Entre millsime:ENTIER Rsultat:JOUR prcondition 1900millsime<2100 variable an:ENTIER # dcalage depuis 1900. bis:ENTIER # nombre dannes bissextiles depuis 1900. ralisation an<millsime1900 bis<quotient(an,4) Rsultat<s(mardi,an+bis) postcondition Rsultat=lejourdelasemaineotombele1erMai delannemillsime fin travail Essayonssurunexempleavecmillsime = 1983 : an=19831900=83 bis=quotient(an,4)=quotient(83,4)=20 Rsultat=s(mardi,83+20)=s(mardi,103) Ilrestedfinirloprateursuccesseurou s.Lalgorithmesuivantspcifiecetoprateur.Sadfinitioncomplteetsa ralisationseronttudiesauchapitrequitraitedelitration. Algorithme20:Spcificationdeloprateursuccesseurversion1.0 Algorithmesuccesseur,s # Le dcalage -me successeur du jour j. Entre dcalage:ENTIER prcondition dcalage0 postcondition Rsultat=lejourdelasemainegaljdcal dunnombredejoursgaldcalage fin successeur Remarquezquecettespcificationdfinitaussiscommealiaspourlenomsuccesseurdelaprocdure.Cenestquune facilitpourrduirelalongueurdunomendfinissantunsubstitutpluscourt. Pour obtenir une solution complte avec ce que nous savons, on peut reconsidrer la reprsentation des donnes. Ainsi,parexemple,aulieudutiliseruntypeJOURpourlesjoursdelasemaine,ilestpossiblededfiniruncodagedes joursennombresentiers,commececi: (lundi=1, mardi=2, mercredi=3, jeudi=4, vendredi=5, samedi=6, dimanche=7) Comme le successeur de dimanche est lundi, on doit modifier notre arithmtique de sorte ques(dimanche, 1) = lundi, ou,puisquenousutilisonsdesnombresentiers,dimanche+1=lundi.Commelundi=1parconvention,cecinousconduit poserdimanche=0 : (lundi=1, mardi=2, mercredi=3, jeudi=4, vendredi=5, samedi=6, dimanche=0) Notrearithmtiquedoitdoncdonnersamedi + 1 = dimanche.Orsamedi = 6etdimanche = 0.Larithmtiqueutilisedoit doncdonner6 + 1 = 0,cestdirelerestedeladivisionde6 + 1par7.Ainsi,endsignantparjourunjourquelconque

ENI Editions - All rigths reserved - Jonifar lina

- 13 -

40

delasemaine,onaura : s u c c e s s e u r (jour, 1) = r e s t e (jour + 1, 7) Pour1983,lejourdu1erMaisestdcaldeplusieurssemainesdepuisle1erMai1900.Lenombredesemainesestle quotiententierdeladivisiondedcalagepar7.Lerestedecettedivisiondonnelejourdelasemainecorrespondant. Pour 1983, le dcalage total est 2+103= 105 puisque mardi= 2. On obtientreste(105, 7) = 0. Par consquent, le jour cherch est le jour de code 0, soit un dimanche. Lexercice suivant propose dutiliser ce codage pour reprendre la solutionduproblme.Onobtientainsilasolutionprsenteparlarfrence[ARS80]. Exercice7:Jourdu1erMaiversion2.0 Lafonctionsuccesseurnestpasncessairepourrsoudreleproblme. Refairelaversion1.0decetalgorithmeenreprsentantlesjoursdelasemaineparleurcodenumrique. Lasectionsuivanteproposequelquesexercicespourmettreenpratiquecequiatvudanslessectionsprcdentes.

- 14 -

ENI Editions - All rigths reserved - Jonifar lina

41

Exercices
Lessolutionsdesexercicespropossnefontinterveniraucunenotionnouvelle.Seuleslesquelquesnotionstudies dans ce chapitre sont ncessaires pour donner une solution complte ces exercices, mme si, parfois, il existe une solution meilleure que celle actuellement accessible. Chaque exercice doit tre entirement spcifi, la ralisation de lalgorithme propos doit tre complte et, sil y a lieu, dmontre. Certains noncs sont volontairement imprcis et donc permettent, parfois, diffrentes interprtations. Les algorithmes, pour les rsoudre, doivent tre parfaitement dfinisetnelaissersubsisteraucuneambigut.Ilfaudradoncfairedeschoixquisontlaisssladiscrtiondulecteur, maisquidoiventtreclairementnoncs,sicenestjustifis. Exercice8:Taux,TVAetplacements 1.crireunalgorithmequicalculeleprixtoutestaxescomprises(TTC)pourunprixhorstaxeetuntauxdeTVAdonn. 2.crireunalgorithmequicalculelemontantdesintrtsrapportsparuncapitalplacuntauxdonnpendantunedure donne,exprimeenmois. Exercice9:Moyennearithmtiquepondre 1.crireunalgorithmequicalculelamoyennearithmtiquedetroisnombresdonns. 2.Mmequestionpourunemoyennepondrequandondonnelesnombresetlescoefficientsdepondration. Exercice10:Airedutriangle 1.crireunalgorithmequicalculelaireduntriangledontondonnelamesuredunctetcelledelahauteurrelativece ct. 2.Cetalgorithmeestilutilisablepouruntrianglerectangledontondonnelesmesuresdesdeuxctsperpendiculaires? Exercice11:Salaireetheuressupplmentaires Lecalculdunbulletindesalaireprendencomptelesalairebrutassociauxheures normales duesparlesalarietles heures supplmentaires travailles dans le mois. Les heures supplmentaires sont rmunres selon les rgles de gestionsuivantes :
q

tauxhorairemajorde125%pourlesheuresdela36mela43me tauxhorairemajorde150%pourlesheurespartirdela44me.

Lamajorationintervientsurletauxhorairenormal,calculpartirdusalairemensuelbrutpouruneannede52semaines rpartiessur12mois,surlabasede35heurestravailleshebdomadaires. crire lalgorithme qui calcule le montant des heures supplmentaires rmunrer, partir du salaire mensuel brut et du nombredheuressupplmentaires. Onpourrasupposerquelecalculesttoujoursutilispourunnombredheuressuprieur8.Leproblmegnralsuppose ltudepralableduchapitresuivantquitraitedelalternative. Exercice12:Comptededpt Onconsidrelescomptesdedptshbergsparunebanquepoursesclients.Unretraitnestautorisquesilesoldedu compterestenonngatif. 1.DfinirletypededonnesCOMPTE. 2.Dfinirlesoprationsapplicables. Danscertainescirconstancesetpourcertainsclients,labanqueautoriseundcouvertlimitettemporaire. 3.Refairelesdfinitionsprcdentespourpermettrecesdcouverts.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

42

Notesbibliographiques
La dfinition dun algorithme est difficile quand on veut rester un niveau lmentaire. Une excellente rfrence, anciennemaisdontlalectureresteunvraibonheurest[ARS80].LesexercicesdelasectionExercicesrsolus,except celui sur les rservoirs, sont inspirs de ce petit livre. La spcification dunalgorithme,tellequelleestprsenteici, vientdelaprogrammationparcontratinventeparBertrandMEYER.Lesrfrencessurcesujetsontnombreuses.Le livre[MEY00]decetauteurtraitedelaconceptionetdelaprogrammationobjetetfournitunebibliographiecomplte surlaprogrammationparcontrat.Lesrecettesdecuisinedudbutduchapitresontextraitesde[MAR74].

ENI Editions - All rigths reserved - Jonifar lina

- 1-

43

Rsum
Ce chapitre a abord lcriture dalgorithmes. Un algorithme est la description dunprocddecalculcomposdune succession doprations. Une fonction calcule un rsultat partir de donnes quelle ne modifie pas. Une procdure modifieuntatencalculantlesnouvellesvaleursdesdonnes. Llaboration dun algorithme se dcompose en deux phases qui ne doivent pas tre confondues. La spcification prcise ce que fait lalgorithme sans dire comment il le fait. La spcification dun algorithme fait partie de sa documentation. Elle est compose de la signature du module logiciel, de la prcondition et de la postcondition. La dfinitiondelalgorithmeexprimepardesinstructionscommentilralisesoncalcul. Laprconditionregroupelesconditionsquedoiventsatisfairelesdonnesenentrepourquelalgorithmecalculeses rsultats.EllesdoiventtresimultanmentVRAIEspourquelalgorithmeeffectueuncalcul juste pourproduireles rsultats attendus. Cestdelaresponsabilitduclientlogicieldesservicesdelalgorithmedassurerlaralisationde cesconditions.Lapostconditionexprimelesgarantiesquapportelalgorithmesurletravailquilraliseetlesrsultats quilproduit,dslorsquelaprconditionestsatisfaite. Lasyntaxepourcrireunalgorithmenestpascontrainte.Ilnexistepasde langagealgorithmique etlauteurdun algorithmeestentirementlibredutiliserla grammaire quiluiconvient.Lesseulesexigencesdudomainesontune lisibilitimmdiatedesinstructions,uneexpressionsansambigutdesoprationsutilisesetuneformedexpression quipermettedeseconvaincrequelalgorithmefaitbiencequilannonceetseulementcela.Enparticulier,ilnestpas ncessairedimiterlagrammairedun langage de programmation des ordinateurs mme si,infine, lalgorithmiquene sest dveloppe que pour et par le traitement automatique de linformation que permettent les calculateurs programmables.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

44

Bibliographie
[ARS77] Jacques ARSAC : La construction de programmes structurs DUNOD Informatique Phase formation, PARIS, 1977. [ARS80]JacquesARSAC:PremiresleonsdeprogrammationCEDRIC/NATHAN,PARIS,1980. [CB84]G.CLAVEL,J.BIONDI:IntroductionlaprogrammationTome2:StructuresdedonnesMASSON,1984. [MAR74]TanteMarie:LavritablecuisinedefamilleditionsA.TARIDE,1974. [MEY00]BertrandMEYER:ConceptionetprogrammationorientesobjetEYROLLES,PARIS,2000.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

45

Introduction
Ce chapitre prsente lune des constructions fondamentales de lalgorithmique : la structure de choix ou encore lalternative .Commesonnomlindique,ellepermetdeprocderauchoixduntraitement,parmiplusieurspossibles, selondesconditionstabliesenfonctionducontexteetdesdonnestraiter. La deuxime section prsente lalternative, laide dun exemple trivial dclin en plusieurs versions. Le but est dexposer lutilisation de la nouvelle construction en prcisant le vocabulaire. La troisime section prsente des exercicesrsolusetladerniredesexercicesdapplication.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

46

Dfinitiondelalternative
Cettesectionneproposepasdedfinitionformelledelalternative.Ellenefaitquelaprsenter,laidedunexemple dontlesdiffrentesversionspermettentdeprciserquelquespointsdemthode. Exemple OnconsidredeuxdonnesaetbduntypeTquelconque,maisCOMPARABLES.Autrementdit,lesdonnesdetypeT sont mutuellement comparables. Il existe donc une relation dordre total, note , sur les donnes de type T. Cela signifieque,tantdonnsdeuxlmentsaetbdetypeT,ilesttoujourspossibledelescomparer,parexemplepour dsignerceluiquiestinfrieurougallautre.aetbpeuventtredesnombres,commedesentiersparexemple,mais pas seulement. Ils peuvent aussi tre des caractres ou des chanes de caractres, comme des phrases du langage courantparexemple,puisquelordrealphabtique,entreautres,permetdelescomparer.PourindiquerqueletypeT estquelconque,maisquelesdonnesdetypeTsonttoutescomparablesmutuellement,onnotera,parconvention : a, b : T -> C O M P A R A B L E On indique ainsi que le type Tdrive du type COMPARABLE, ou que toute donne de type T est aussi de type COMPARABLE.Uneautrefaondenoterlammeideestdeprciserqueaetbappartiennentautype(T,) : a, b : (T , ) Onveutcrireunalgorithmequiclasseaetbenordrecroissant. Ilsagitdcrireladfinitiondune suite dinstructionsquilaissentaetbtelsqueab.Onpeutdoncdjdonnerla spcification de lalgorithme avec ce que nous avons appris au chapitre Programmes directs. Lalgorithme cidessous donnecettespcification. Algorithme1:Spcificationduclassementdedeuxdonnescomparables

Algorithme classer # Classe a et b en ordre croissant. Entre a, b : T -> COMPARABLE prcondition aucune postcondition ab fin classer Dans la ralisation de cet algorithme, seule lopration de classement des deux nombres apporte quelque chose de nouveau.Dtaillonsla : # Classement de deux donnes comparables en ordre croissant. si a>b alors # a > b : replacer a et b en ordre. changer(a,b) #ab:aetbsontenordre. sinon rien fin si Cetteformeestsimple :silapremiredonne,a,eststrictementsuprieurelaseconde,b,ellessontreplacesen ordreenchangeantleurvaleur.Cestcequefaitlinstructionquicommencealorsetsetermineaveclemotsinon. Danslecascontraire,lesdonnessontdjenordreetilnyarienfaire.Cestcequiestindiquparlinstructionqui commencesinonetquisetermineparlexpressionfinsi. Lorsque la condition boolenne exprime par le bloc qui commence au mot si prend la valeur VRAI, ce sont les instructions du bloc qui commencent au motalorsetquiseterminentavant sinonquisontexcutes.Lorsquecette conditionprendlavaleurFAUX,cesontlesinstructionsdublocquicommencentaumotsinonetquiseterminentavec lexpressionfinsiquisontexcutes.Danstouslescas,seuleslesinstructionsdelundesdeuxblocssontexcutes : ilsagitbiendunealternative. Cequiestnouveauici,cestlaconstruction :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

47

si <expressionboolenne> alors <traitements1> sinon <traitements2> fin si <expressionboolenne>estuneexpressionprenantsesvaleursdanslensemble{VRAIFAUX}.Lorsque<expression boolenne>prendlavaleurVRAI,seuleslesinstructionsdelalternantdcritentrealorsetsinonsontexcutes.Ici,ce sontlesinstructionsquiconstituentlebloc<traitements1>.Lorsque<expressionboolenne>prendlavaleurFAUX,ce sont les instructions dcrites entre sinon et fin si, cestdire les instructions du bloc <traitements 2>, qui sont excutes.Danstouslescas,lestraitementsreprennentensuiteensquenceauxinstructionsquisuiventfinsi. Lapremireversioncompltedecetalgorithmedevient : Algorithme2:Classerdeuxdonnescomparablesenordrecroissantversion1.0 Algorithmeclasser #Classeaetbenordrecroissant. Entre a,b:TCOMPARABLE prcondition aucune ralisation si a>b alors #a>b:replaceraetbenordre. changer(a,b) #ab:aetbsontenordre. sinon rien fin si postcondition ab fin classer Lorsquunalternantnecontientaucuneinstruction,commeleblocsinoncidessus,ilnestpasncessairedeledtailler. Ainsi,oncrirapluttlalgorithmesuivant : Algorithme3:Classerdeuxdonnescomparablesenordrecroissantversion2.0 Algorithmeclasser #Classeaetbenordrecroissant. Entre a,b:T>COMPARABLE prcondition aucune ralisation si a>b alors #a>b:replaceraetbenordre. changer(a,b) #ab:aetbsontenordre. fin si postcondition ab fin classer Cetalgorithmeraliseletridedeuxdonnescomparablesenordrecroissant.Ilestfaciledesenconvaincreensuivant lvolutiondestatssuccessifsdusystmeconstitudesvaleursdesvariablesaetb.Cestatssontdcrits,dansle textedelalgorithme,parlescommentairesquiaccompagnentlesinstructionsquilesmodifient.Ilestaussipossiblede dcrirelasuccessiondestatsparundiagramme.Cestfaitsurlafiguresuivante :

- 2-

ENI Editions - All rigths reserved - Jonifar lina

48

Les transitions entre tats sont reprsentes par des flches. Chacune porte une tiquette de la forme vnement [garde]/action. Lorsque lvnement se produit, lexpression boolenne garde est value. Si le rsultat de cette valuation est VRAI, laction est excute et elle provoque la transition entre les deux tats concerns. Sur le diagrammedelafigurecidessus,lvnementassocichacunedesdeuxtransitionsestvideet,parconsquent,cest lentre dans ltat I= e1 qui provoque immdiatement lvaluation de la garde sur la premire transition. Pour la deuxime transition, seule la garde est dfinie. Dans ce cas, aucune action particulire nest entreprise lors de la transitionlorsquelagardeestvalueVRAI. Exemple Soitnunnombredunensemblequelconque.Quelestlesignedecenombre ? Onpeutspcifiersimplementceproblme.Cestfaitparlalgorithmesuivant : Algorithme4:Spcificationdusignedunnombreversion1.0 Algorithmesigne1 #Calculelesigneden. Entre n:REL Rsultat : ENTIER prcondition aucune postcondition n<0=>Rsultat=1 n=0=>Rsultat=0 n>0=>Rsultat=+1 fin signe1 Ainsi,cettefonctionrend1sileparamtreneststrictementngatif,0silestnulou+1sileststrictementpositif.Ces valeurs sont choisies par convention. On peut en choisir dautres et ce serait lgitime. 1, 0 et +1 sont les valeurs habituellementutilisesdanscecas. Remarquezaussilapostcondition.ElleestfaitedetroisclausesdontlaconjonctiondoitprendrelavaleurVRAIlorsque lalgorithme est correct. Autrement dit, la postcondition est lexpression boolenne constitue des trois clauses connectesparloprateuretlogiquequireste,ici,implicite : n<0=>Rsultat=1 et n=0=>Rsultat=0 et n>0=>Rsultat=+1 Lexpression de la postcondition dans lalgorithme prcdent est droutante au premier abord et il nest pas immdiatement clair quuneconjonctiondestroisclausesexprimecequefaitcetalgorithme.Lajustificationfaitappel aux Mathmatiques et lalgbre de Boole. Les lecteurs qui ne seraient pas intresss par la justification de cette postconditionpeuventpasserdirectementlasuitedeladescriptiondelalgorithme. Lapremireclauseestuneimplication:n<0=>Rsultat=1.Limplication(a=>b)estdfiniepar(nonaoub).La clause(n<0=>Rsultat=1)estdoncquivalente(n0ouRsultat=1).Parconsquent,cettepremire clauserendtoujourslersultatVRAI,sauflorsque(n<0etRsultat1).Lemmeraisonnementmontrequela secondeclausedelapostconditionrendtoujoursVRAI,sauflorsque(n=0etRsultat0).Enfin,latroisimeclause rendtoujoursVRAI,saufdanslecas(n>0etRsultat+1).Ainsi,pourles12combinaisonspossiblesdevaleurs surlesignedenetdeRsultat,seuleladisjonctiondestroisclausesexhibesicirendunrsultatFAUX.Autrement dit,lapostconditionprendlavaleurFAUXlorsque : (n<0etRsultat1)ou(n=0etRsultat0)ou(n>0etRsultat+1)

ENI Editions - All rigths reserved - Jonifar lina

- 3-

49

etelleprendlavaleurVRAIdanstouslesautrescas : (n<0=>Rsultat=1)et(n=0=>Rsultat=0)et(n>0=>Rsultat=+1) Revenons lalgorithme. Le rsultat sera obtenu en comparant n 0. Lalgorithme consiste donc comparer deux nombres,icinet0.Onobtientunalgorithmeplusgnralencomparantdeuxdonnescomparablesquelconquesnetm. Algorithme5:Spcificationdelacomparaisondedeuxdonnescomparablesversion1.0 Algorithmecomparer #Comparernm. Entre n,m:T>COMPARABLE Rsultat : ENTIER prcondition aucune postcondition n<m=>Rsultat=1 n=m=>Rsultat=0 n>m=>Rsultat=+1 fin comparer Obtenir le signe dun nombre selon signe1 consistera utiliser comparer avec m = 0. Il est donc possible dcrire compltementlafonctionsigne : Algorithme6:Signedunnombreversion2.0 Algorithmesigne #Calculelesigneden. Entre n:REL Rsultat : ENTIER prcondition aucune ralisation Rsultat<comparer(n,0) postcondition n<0=>Rsultat=1 n=0=>Rsultat=0 n>0=>Rsultat=+1 fin signe Cetteversiondusignedunnombreutiliselalgorithmecompareretilrestelcrire.Unepremireversionestcellede lalgorithmesuivant : Algorithme7:Ralisationdelacomparaisondedeuxdonnescomparablesversion1.0

ralisation si n<m alors #n<m:rendre1. Rsultat<1 sinon #nm:discriminerlesdeuxcaspossibles. si n=m alors #galit:rendre0 Rsultat<0 sinon #n>m:rendre+1 Rsultat<+1 fin si
- 4 ENI Editions - All rigths reserved - Jonifar lina

50

fin si Cetteralisationestfacilecomprendre.Quandn<m,lersultatest1.Sinon,cestquenm.Ilfautalorsdistinguer lecasn=mducasn>m.Cestlobjetdelanouvellealternativeimbriquedanslalternantsinondelapremire.Ilest aussipossibledcrirecetalgorithmecommececi : Algorithme8:Ralisationdelacomparaisondedeuxdonnescomparablesversion2.0

sin<malors Rsultat<1fin si sin=malors Rsultat<0fin si sin>malors Rsultat<+1fin si Dans cette version, les trois tests sont raliss. Mme quand lalgorithme a reconnu que n < m par exemple et que Rsultataprislavaleur1,iltesteencorelgalitn=metchoue,puisiltesten>metchoue.Ainsi,cettesolution, certainement correcte, fait le travail de dtermination du signe dune faon inefficace. Quelle solution de la ralisation convientilderetenir ?Celledelaversion1.0faitmoinsdecomparaisonsmais,touteproportiongarde,estmoinslisible quelaversion2.0.Cellelaucontraireestfacilelireetcomprendredemble,maisellefaitplusdecomparaisonset les deux tiers dentre elles sont inutiles. Quelle que soit le solution retenue, elle est spcifie de la mme faon par lalgorithme4. Laralisationdelalgorithme7peutencoretrecritedunefaonunpeudiffrentedanslesdtailsafindamliorersa lisibilit.Lalgorithmecidessousreprendlasolutioncomplteduproblme. Algorithme9:Comparaisondedeuxdonnescomparablesversion3.0 Algorithmecomparer #Comparernm. Entre n,m:T>COMPARABLE Rsultat : ENTIER prcondition aucune ralisation sin<malors #n<m:rendre1. Rsultat<1 sinon sin=malors #galit:rendre0 Rsultat<0 sinon #n>m:rendre+1 Rsultat<+1 fin si postcondition n<m=>Rsultat=1 n=m=>Rsultat=0 n>m=>Rsultat=+1 fin comparer Laconstruction: si<expression1>alors <traitements1> sinon si<expression2>alors <traitements2> sinon si<...>alors <...> sinon <traitementsn> fin si permetderaliserlestraitementsassocisdiffrentesexpressionsboolennes<expression i>.Lorsque<expression i>, i= 1, 2, ..., n1, prend la valeur VRAI, le bloc des instructions <traitementsi> est excut puis le flot de contrle passe linstruction qui suit fin si. Si aucun des prdicats <expression i> ne prend la valeur VRAI, ce sont les instructionsdubloc<traitements n>delalternantsinonquisontexcutes.

ENI Editions - All rigths reserved - Jonifar lina

- 5-

51

- 6-

ENI Editions - All rigths reserved - Jonifar lina

52

Exercicesrsolus
Exercicersolu1:Tridetroiscomparables OndonnetroisdonnesdetypeTquidriventdeCOMPARABLE. crirelalgorithmequiclassecestroisdonnesenordrecroissant. Solution Lesspcificationssontsimplesetressemblentcellesdutridedeuxlments. Algorithme10:TridetroiscomparablesSpcification

Algorithme classer3 # Classe a, b et c en ordre croissant. Entre a, b, c : T -> COMPARABLE prcondition aucune postcondition abc fin classer3 Laralisationestcependantmoinsvidentequecelleduclassementdedeuxlments.Commenonsparremettreen ordreaetb : si a>b alors # a > b ; c est placer. changer(a,b)#abcplacer. Placercparrapportaetb sinon #abcplacer. Placercparrapportaetb fin si Ainsi,aetbtantremisenordre,ilresteplacercparrapportcesdeuxvaleurs.Loprationdcriteparlaphrase Placer c par rapport a et b est donc indpendante de la valeur que prend lexpression boolenne a > b, conditiondupremiertestralissurcesvaleurs.Quelonaita > bouab,ilfaudraraliser Placercparrapport aetb .Ceciestrvlparlefaitquecetteoprationdeplacementdoittreralisedanslesdeuxalternants.Par consquent,cetteoprationdeplacementnedpendpasdelavaleurdelexpressionboolenne a<betpeuttre sortie de lalternative. Cela revient factoriser lopration de placement de c par rapport aux valeurs de a et b. On obtientalors : si a>b alors #a>bcestplacer. changer(a,b)#abcestplacer. sinon #abcestplaceraetbsontenordre. fin si Placercparrapportaetb. Ilrestedoncraliserlopration Placercparrapportaetb lorsqueab.Cetteoprationscrit : #ab:placerc. si b>c alors #abetc<b.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

53

changer(b,c)#ac,b<c. Vrifierqueleplacementdecnapasmodifilordredeaetb sinon #abc rien fin si Lalternant alorsplace b et c en bon ordre puis sassure quaprs lchange des valeurs de bet c, a et la nouvelle valeurdebsontenordre.Lalternantsinonestvidepuisqualors,lestroisdonnessontenordre.Ilseraitpossiblede rdiger une version dfinitive de lalgorithme, mais on peut remarquer que placer lopration Vrifier que le placementdecnapasmodifilordredeaetb danslalternantsinonnechangerienpuisquelesdonnessont en ordre dans cet alternant. En ralisant cet amnagement inutile, on impose des traitements sans effet, mais lopration apparat alors dans les deux alternants. Alors et comme prcdemment pour lopration Placer c par rapportaetb ,cetteoprationpeuttrefactorise: #ab:placerc. si b>c alors #abetc<b. changer(b,c)#ac,bc. sinon #abc rien fin si Vrifierqueleplacementdecnapasmodifilordredeaetb Enfin,cettedernireoprationestralisepar : si a>b alors #b<aetacetbc. changer(a,b)#abc. sinon #abc. rien fin si Finalement,lalgorithmedfinitifestlesuivant : Algorithme11:Tridetroiscomparablesversion2.0 Algorithmeclasser3 #Classea,betcenordrecroissant. Entre a,b,c:T>COMPARABLE prcondition aucune ralisation sia>balors changer(a,b)fin si#ab,cresteplacer. sib>calors changer(b,c)fin si#ac,bc. sia>balors changer(a,b)fin si#abc. postcondition abc fin classer3 Insistonsencoresurunpointfondamentalquiestlathsedecelivre.Cestledtaildestatsatteintsaprschaque instruction qui permet de dterminer les actions entreprendre et de sassurer de la correction de lalgorithme. Ce dtailestexplicitpardescommentairesquidcriventlestatspardesprdicatssurlesvariablesquilescapturent. Nousprocderonsautrementdansleschapitressuivants.Lediagrammedelafigurecidessousreprsentecestats etlestransitionsquipermettentdelesparcourir.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

54

Dans cette version, certains tests sont inutiles pour certaines configurations de valeurs des variables a, b et c. Cependant,ongagnebeaucoupenlisibilitcequelonperdraventuellementenefficacit,plustard,lexcutionde limplmentation. Cest souvent le cas en algorithmique et en programmation : il faut faire des choix qui sont des compromis entre lisibilit, efficacit, cot en ressources... Quoi quil en soit, le premier objectif de lanalyse algorithmiquerestelacorrection.Ilserabientempsdeprogrammerefficacementlorsquunesolutioncorrecteaurat obtenue. Exercicersolu2:Reconnatreuneannebissextile Dfinirunalgorithmequireconnatsiunmillsimeestceluiduneannebissextile. Solution Reconnatre une anne bissextile cest, par exemple, produire le rsultat VRAI si le millsime donn est celui dune anne bissextile, ou FAUX sinon. Il sagitdoncdcrire un prdicat estBissextilequirendVRAIouFAUXselonquele millsime,quilreoitenparamtreformel,estceluiduneannebissextileounon maisilfautprciserdavantage. Ceprdicatreoitenentreunmillsime.Quelestledomainedesvaleursdecenombre ?Cestvidemmentunnombre entier naturel, mais nous savons que le calendrier que nous connaissons date du 16me sicle. Considrons, cependant, que parler dune anne bissextile a un sens depuis lanne 1500 et pour tout millsime jusquen 2100. Avant,celanapasdesens.Aprs,ilpourraityavoirdesperturbationsdanslasuccessiondesannesbissextilesdues larotationdelaTerreautourduSoleil. Onadjvuauchapitreprcdentcommentreconnatreuneannebissextile.Cestuneannedontlemillsimeest divisiblepar4, quelquechoseprs .Leslimitesdesiclenesontpasbissextiles,saufcellesdontlemillsimeest divisiblepar400,comme2000parexemple.Ainsi,1984et2000sontdesannesbissextiles,alorsque1983,2005et 2100nensontpas.Lecalculconsistedoncdterminerdabordsiuneanneestunelimitedesicle.Cestlecassi lesdeuxdernierschiffresdumillsimesontnuls.Onobtientlenombreconstitudesdeuxdernierschiffres,encalculant lerestedeladivisiondumillsimepar100.Ainsi,parexemple,reste(1983,100)=83.Onobtientdonc : si reste(millsime,100)=0 alors millsimeestunefrontiredesicle sinon millsimeestuneannenormale fin si Lorsque millsime est celui dune frontire de sicle, on calcule le nombre form des deux premiers chiffres. Cest le
ENI Editions - All rigths reserved - Jonifar lina - 3-

55

quotientdemillsimepar100.Cemillsimeestceluiduneannebissextilelorsquelequotientobtenuestdivisiblepar 4,cestdirelorsquelerestedeladivisiondecenombrepar4estnul.Ainsi : reste(quotient(1900,100),4)=3#=>1900nestpasbissextile. reste(quotient(2000,100),4)=0#=>2000estbissextile. Onobtientdonc : si reste(millsime,100)=0 alors #Millsimeestunefrontiredesicle. #Estceuneannebissextile? Rsultat<(reste(quotient(millsime,100),4)=0) sinon millsimeestuneannenormale fin si On calcule bien un rsultat boolen puisque lexpression droite du symbole daffectation est une expression boolenne. Uneanne normale ,cestdirequinestpasunelimitedesicle,estbissextilelorsquelemillsimeestunmultiple de4.Ainsi,parexemple,2004estuneannebissextile.Onreconnatunetelleanneparcequelerestedeladivision par4dumillsimeestnul :reste(2004,4)=0,cequidonne : sinon #Millsimeestuneanne normale . Rsultat<(reste(millsime,4)=0) fin si Ilresteexprimerlapostconditionpourdirecequefaitlalgorithme.Ona : postcondition Rsultat= ( ( #Millsimeestunefrontiredesicle. reste(millsime,100)=0 et alors reste(quotient(millsime,100),4)=0 ) ou sinon ( #Millsimeestuneanne normale . reste(millsime,4)=0 ) ) Cettepostconditionexprimeunprdicatsurlersultatrenduparlalgorithme.Lexpressionousinonvaluelemembre dedroitelorsquelemembredegaucheprendlavaleurFAUX.Lexpressionetalorsvaluelemembrededroitelorsque le membre de gauche prend la valeur VRAI. Ainsi, Rsultat est gal VRAI lorsque le millsime est une frontire de sicledivisiblepar400ousinonlorsquilestdivisiblepar4. Ilresterassemblertoutcelapourobtenirlalgorithmecompletduprdicat. Algorithme12:ReconnatreuneannebissextileVersion1.0 AlgorithmeestBissextile #Millsimeestillemillsimeduneannebissextile? Entre millsime:ENTIER Rsultat : BOOLEN prcondition 1500millsime2100 variable anne:ENTIER sicle:ENTIER
- 4 ENI Editions - All rigths reserved - Jonifar lina

56

ralisation anne<reste(millsime,100) si anne=0 alors #Millsimeestunefrontiredesicle. sicle<quotient(millsime,100) Rsultat<(reste(sicle,4)=0) sinon #Millsimeestuneanne normale . Rsultat<(reste(millsime,4)=0) fin si postcondition Rsultat= ( ( #Millsimeestunefrontiredesicle. reste(millsime,100)=0 et alors reste(quotient(millsime,100),4)=0 ) ou sinon ( #Millsimeestuneanne normale . reste(millsime,4)=0 ) ) fin estBissextile Deux nouvelles variables, anne et sicle, sont utilises ici. Elles sont initialises par les rsultats de calculs intermdiaires. La premire reoit pour valeur le nombre form des deux derniers chiffres du millsime. La seconde reoit le nombre form des deux premiers chiffres. Ces variables supplmentaires ne sont pas strictement indispensables, comme la montr lanalyseduproblme.Ellespermettentdcriredesinstructionsplussimplespour exprimer la ralisation de lalgorithme et le rendent ainsi plus lisible. Cependant, il nest pas possible de les utiliser danslexpressiondelapostcondition.Eneffet,nousavonsdjditquetoutcequinapparatpasdanslasignaturede lalgorithme est local au module. Or, la prcondition et la postcondition font partie, avec la signature, de la documentationpubliquedumodule.Cesontdoncdeslmentspubliques,communiqustous.Toutleresteestpriv, local au module et ne peut pas tre utilis dans la partie publique. Ce point apparat plus clairement quand on se restreintlapartiepublique.Elleestdonnecidessous. Algorithme13:SpcificationspubliquesdeestBissextile AlgorithmeestBissextile #Millsimeestillemillsimeduneannebissextile? Entre millsime:ENTIER Rsultat : BOOLEN prcondition 1500millsime2100 postcondition Rsultat= ( ( #Millsimeestunefrontiredesicle. reste(millsime,100)=0 et alors reste(quotient(millsime,100),4)=0 ) ou sinon ( #Millsimeestuneanne normale . reste(millsime,4)=0 ) ) fin estBissextile

ENI Editions - All rigths reserved - Jonifar lina

- 5-

57

Exprimer la postcondition en utilisant les variables intermdiaires anne etsicle introduirait des lments privs au module dans la partie publique, ce qui rendrait cette partie publique incomprhensible sans la connaissance des valeursdecesdeuxvariables. Exercicersolu3:Signedunproduitoudunesomme 1.crireunalgorithmequicalculelesigneduproduitdedeuxnombressanscalculerleproduit. 2.Mmequestionpourlasommededeuxnombres. Solution Nousavonsdjtudilesignedunnombre.Leproblmeestsimplequandonpeutcalculerleproduitoulasomme : #Signedunproduit. Rsultat<signe(axb) etdemmepourlasomme.Maislnoncestclair: [...]sanscalculerleproduit. nilasommedailleurs. Pourleproduit,lasolutionrestesimplemalgrcettecontrainte.Ilsuffitdemultiplierlessignesdesdeuxnombres : #Signedunproduit. Rsultat<signe(a)xsigne(b) Lorsquelesdeuxnombressontnonnuls,maisdemmesigne,lafonctionsignerendlemmenombrepourlesdeux, soit1,soit+1,dontleproduitvaut+1,indiquantainsiunproduitpositif.Lorsquelundesdeuxnombresestnul,la fonctionsignerend0etleproduitdessignesestnul,indiquantqueleproduitdesnombresestnul.Enfin,lorsqueles deuxnombressontdesignescontraires,onobtientunrsultatgal1. Sans la possibilit de calculer le produit des deux nombres, il faut discriminer les diffrents cas. Cest ce que fait lalgorithmequisuit. Algorithme14:SignedunproduitVersion1.0 AlgorithmesigneProduit #Lesigneduproduitdeaparb. Entre a,b:REL Rsultat : ENTIER prcondition aucune ralisation si (a<0etb<0) ou (a>0etb>0) alors #Deuxnombresdemmesigne=>produitpositif. Rsultat<+1 sinon si a=0oub=0 alors #Aumoinsunnombrenul=>produitnul. Rsultat<0 sinon #Deuxnombresdesignescontraires=>produitngatif. Rsultat<1 fin si postcondition Rsultat=signe(a)xsigne(b) fin signeProduit Remarquezdabordlexpressiondelapostcondition.Elleditlersultatcalculetrenduparlalgorithme,maisilestclair ici quelle ne dit pas comment ce rsultat est obtenu. Dailleurs, la ralisation montre cette fois clairement que le rsultatnestpasobtenuparleproduitdessignesdesdeuxnombres.Encoreunefois,laspcificationexprimeceque faitlalgorithmeetnoncommentillefait.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

58

Il faut encore prouver que la ralisation de cet algorithme fait bien ce quannonce la spcification. Montrons, par exemple, que dans le bloc sinon, les deux nombres sont bien de signes contraires, comme lindique le commentaire denttedubloc. Lorsquelesinstructionsdeceblocsontexcutes,cestquelesprdicatsquiprcdentonttoustvalusFAUX daprsladfinitiondelaconstructionalgorithmiqueutilise.Onadonc : n o n [ (a < 0 e t b < 0) o u (a > 0 e t b > 0)] e t n o n [a = 0 o u b = 0] Cetteexpressionboolenneestquivalente : n o n (a < 0 e t b < 0) e t n o n (a > 0 e t b > 0) e t n o n (a = 0 o u b = 0) ouencore : (a 0 o u b 0) e t (a 0 o u b 0) e t (a 0 e t b 0) Do,finalement, (a < 0 e t b > 0) o u (a > 0 e t b < 0) cequitablitbienqueaetbsontdesignescontraires. Le signe dune somme de deux nombres est le signe du nombre qui a la plus grande valeur absolue. Lorsque les valeurs absolues sont gales, la somme est nulle si les nombres ont des signes diffrents, comme 15 et +15 par exemple.Sinon,cestlesignecommun.Onobtientlalgorithmesuivant : Algorithme15:SignedunesommeVersion1.0 AlgorithmesigneSomme #Lesignedelasommedeaavecb. Entre a,b:REL Rsultat : ENTIER prcondition aucune ralisation si abs(a)>abs(b) alors Rsultat<signe(a) sinon si abs(a)<abs(b) alors Rsultat<signe(b) sinon si signe(a)=signe(b) alors Rsultat<0 sinon Rsultat<signe(a) fin si postcondition Rsultat=signe(a+b) fin signeSomme Cet algorithme fait appel aux services du sousalgorithmeabs. Cest une fonction qui rend la valeur absolue de son paramtre.CettefonctiondoitvidemmenttredfiniepourquelafonctionsigneSommeaitunsens.Ceserafaitplus bas.PourtermineravecsigneSomme,montronsquelorsdelexcutiondusecondblocsinonsi,lesvaleursabsolues desdeuxnombressontgales.Ona : n o n [a b s (a) > a b s (b)] e t n o n [a b s (a) < a b s (b)] Cequidonne : [a b s (a) a b s (b)] e t [a b s (a) a b s (b)] <=> a b s (a) = a b s (b)
ENI Editions - All rigths reserved - Jonifar lina - 7-

59

aetbontbienlammevaleurabsoluedanscebloc. Ilrestedfinirabs.Cestfaitparlalgorithmesuivant,quiexprimedirectementladfinitionmathmatiquedelavaleur absoluedunnombre :cestlenombresilestpositifousonoppos,sinon. Algorithme16:ValeurabsoluedunnombreVersion1.0 Algorithmeabs #Lavaleurabsoluedea. Entre a:REL Rsultat : REL prcondition aucune ralisation sia0alors Rsultat<asinon Rsultat<afin si postcondition a0=>Rsultat=a a<0=>Rsultat=a fin abs Remarquezquelapostconditionestunefoisdeplusuneconjonctiondeclauses.Ilestimportantdenoterquelesdeux conditionsdoiventprendrelavaleurVRAIlorsquelalgorithmesetermine. Cettesolutionparaphraseladfinitionmathmatiquedelavaleurabsolue.Elleestdonccorrecteetlafaondontelle obtient la valeur absolue est claire. Ce nest pas la seule faon de faire. Lexercice suivant propose dcrire deux nouvellesversionsdecettefonction. Exercice1:Valeurabsoluedunnombre Remarquezdabordquelavaleurabsoluedunnombresedduitdelavaleurdesonsigne. 1.Utiliserlavaleurrendueparlafonctionsignepourdterminerlavaleurabsoluedunnombre. Lavaleurdusigneetlavaleurdunombrepermettentaussidecalculersavaleurabsolue. 2.Utiliserlavaleurrendueparlafonctionsigneetlavaleurdunombrepourdterminersavaleurabsolue. Nous avons vu, au chapitre Programmes directs, la fonction successeur pour une couleur dans le problme du changement de couleur dun feu qui rgle la circulation dun carrefour. Cette fonction a t spcifie, mais na pas encoretdfinie.Nousdisposonsprsentdetouslesoutilsncessairespourendonnerunepremireversionpour saralisation. Algorithme17:OprationsuccesseurdunecouleurVersion2.0 Algorithmesuccesseur #Lesuccesseurdecdans(rougeorangevert). Entre c:COULEUR Rsultat : COULEUR prcondition aucune ralisation si c=rouge alors Rsultat<vert sinon si c=vert alors Rsultat<orange sinon Rsultat<rouge fin si postcondition c=rouge=>Rsultat=vert
- 8 ENI Editions - All rigths reserved - Jonifar lina

60

c=orange=>Rsultat=rouge c=vert=>Rsultat=orange fin successeur

ENI Editions - All rigths reserved - Jonifar lina

- 9-

61

Exercices
Exercice2:SuccesseurdunJOURdelasemaine Letype JOURdfinitparnumrationunjourdelasemaine.Danslexercicequidterminelejourdu1erMaiduneanne donne, on a aussi spcifi une fonction successeur pour un jour de la semaine. Il reste donner une dfinition de cette fonction. Donnerunedfinitioncompltedelafonctionsuccesseurpourunjourdelasemaine. Nousnedisposonspasencoredesoutilspermettantdedonnerunedfinition lgante decettefonction.Cesera faitplustard. Exercice3:Nombres,sommeetproduit Ondonnedeuxnombresquelconques. Classercesdeuxnombresparrapportleursommeetleurproduit. Ainsi,parexemple,tantdonnsa=15etb=6,onobtientaxb<a<a+b<bdontlesvaleurssont,danslordre: 90,15,9et6. Exercice4:Remise Uncommerantaccordeuneremisede5 %pourtoutachatdunmontantcomprisentre100et500 et8 %audel. crirelalgorithmedecalculdumontantdelaremisesurunachatdonn. Exercice5:Encoreunemoyenne Unprofesseursouhaitecrireunprogrammequicalculelamoyennedesquatrenotesobtenuesparseslvesauxdevoirsdu mois. Le programme devra, en plus, calculer une apprciation automatique selon la moyenne de llve. Il donnera lve dou silamoyenneestsuprieure15, Descapacits sielleestcompriseentre12et15etenfin Doitserorienter sielleestinfrieure12. crire un algorithme qui prend en entre les quatre notes dun lve et qui calcule la moyenne et lapprciation correspondante. Le problme prcdent peut tre rsolu en dfinissant une structure de donnes qui, pour un lve, regroupe sa moyenneetlapprciation.Cestunlmentdecetypequecalculelalgorithmedemand. Exercice6:AveclaSNCF,cestpossible LaSNCFaccordeunerductionauxfamillesquiserendentauFuturoscope,enfonctiondunombredenfantsdanslafamille. Cetterductionestde10%pour2enfants,15%pour3enfantset18%pour4enfants.partirde5enfants,larduction estde18%,augmentede1%parenfantaudessusde4. tablirlalgorithmequicalculelemontantdelarductionaccordeunefamilledonne. Exercice7:Rductionsurlesmicroprocesseurs LasocitUNTELaccordedesrductionspourlachatenmassedesesmicroprocesseurs.Cesrductionssontfonctiondu nombredecomposantscommandsetduclientquilescommande. Larductionconsentieestde10%silenombredecomposantscommandsestcomprisentre10000et20000,15%sice nombreestcomprisentre20001et40000et20%pourplusde40000composants. Deplus,sileclientestCOMMAQ,larductionestrduitede2%.Enfin,BELbnficiedunerductionmajorede1%. tablirlalgorithmeducalculdutauxdelarductionconsentieunclientdonnpourunecommandedonne. Exercice8:Voyagescolaire Unprofesseurenvisagedorganiserunvoyagescolaire.Lecotduvoyageestfonctiondunombredlvesquiyparticipe. Lecotdutrajetestde67,30 parlvejusqu25lvesetde61,00 audessusde25lves.Lecotdelanourritureest de3,50 parjouretparlve.Lhbergement,enfin,estde4,75 parjouretparlvesilenombredlvesestinfrieur 30,4,00 sicenombreestcomprisentre31et35et3,50 audel.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

62

tablirlalgorithmedecalculduprixderevientparlveetducotglobalduvoyageenfonctiondunombredlves. Exercice9:Primeannuelle LentrepriseBOURDONattribueenfindanneuneprimeannuelleauxchauffeursroutiersquelleemploie. La prime annuelle est entirement attribue au chauffeur, condition quil nait pas eu daccident avec une responsabilit suprieure ou gale 20 % pendant lanne coule. Audel de 20 % de responsabilit, le chauffeur est considr par lentreprisecommeresponsabledelaccident.Silechauffeuratresponsabledunaccident,ilneperoitquelamoitidela prime.Pourdeuxaccidents,ilnen peroit que le tiers. Pour trois accidents, elle est rduite au quart. Audel,laprimeest annule. Cetteprimeestlasommeduneprimededistanceetduneprimedanciennet.
q

Laprimededistanceslveuncentimeparkilomtreparcourupendantlanneavecunplafondde400 laprimedanciennetnestattribuequpartirdequatreannesdanciennetrvolues,soit200 danscecas.Elle estensuiteaugmentede20,00 parannesupplmentaire.

crirelalgorithmedecalculdelaprimeannuelleaccordechaquechauffeur.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

63

Rsum
Ce chapitre a prsent lalternative. Cest une construction algorithmique qui permet de choisir un traitement parmi plusieurs, selon les valeurs dun ensemble de prdicats. Ces valeurs sont obtenues partir de ltat du systme logiciel.Lestraitementsquienrsultentinduisentleplussouventunchangementdecettat.Lalternativesenotede diffrentesfaonsquinesontcontraintesqueparlexigencedelisibilitetdecorrectiondesalgorithmesobtenus. Lesinstructionsoprationnellesdunalgorithme,commecellesdunprogrammeinformatiquedailleurs,nedisentrien surlestatsintermdiairesdusystmeobtenulasuitedelexcutiondecesinstructions.Explicitercestatsestde premire importance pour assurer la correction de lalgorithme. Cependant, lalternative est une exception dans la mesureolechoixquelleprparersultedelavaleurdeprdicatsqui,eux,exprimentunepropritdeltatdans lequelsetrouvelesystmelogiciel.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

64

Introduction
Leschapitresprcdentsontmontrquelalgorithmiquetraitedelatransformationdedonnes.Danscechapitre,on sintresselafaondedfiniretdorganiserlesdonnesutilisesparnosalgorithmes. LasectionLeschanesdecaractresintroduitlescaractresetleschanesdecaractres.Onpeutainsicommencer tudierlestransformationsdedonnestextuellesou,plusgnralement,dedonnesnonnumriques.LasectionLe tableau dfinit les tableaux et les premires oprations lmentaires sur ces structures. Tous les langages de programmationdesordinateursproposentcestypesquisontprdfinisetdirectementutilisables.Cependant,ilsne couvrent pas toutes les possibilits de traitement et tous les besoins des programmeurs. On doit donc introduire la possibilitdedfinirdenouveauxtypesdedonnes,commeletypeRSERVOIRduchapitreProgrammesdirects.Cest cequiestfaitensectionDfinirunnouveautypededonnesquitudiecommentlutilisateurpeutdfiniretutiliserses proprestypespartirdestypesdebase.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

65

Leschanesdecaractres
Cette section tudie le type CHANE qui permet de dclarer des donnes qui ne sont pas numriques. Ainsi, les oprationsusuellessurlesnombresnesontplusdudomainedeschanesdecaractresetnousdevronsprciserles oprationsapplicablesauxdonnesdecetype. Une chane est compose de caractres. Le CARACTRE est lunit lmentaire dinformation considre dans cette section.Lapremirepartieintroduitlescaractres,lesnotationsetlespremiresoprationsapplicables.Laseconde section compose les caractres pour former les chanes et commence ltude des oprations du domaine. Enfin, la derniresectionproposeunesriedexercicesdapplication.

1.Lescaractres
Un caractre est une donne textuelle de base. A, 4, ! sont des caractres. Cependant, un caractre nest pas ncessairement imprimable, cestdire humainement reprsentable. Ainsi, par exemple, un caractre particulier destin marquer la fin dun enregistrement dans un fichier, bien que non reprsentable sur une feuille de papier, nenestpasmoinsuncaractrecommeunautre. Pourutiliserunevariabledestinerecevoiruncaractre,unalgorithmedecelivreladclareainsi : car : C A R A C T R E etluiaffecteunevaleurcommetouteautrevariable : car <- * La dfinition dune constante de type CARACTRE utilisera un sparateur pour dlimiter le caractre et lisoler du reste des instructions. Dans lexemple cidessus, une apostrophe a t place juste avant et juste aprs la valeur dinitialisationdecar,desortequilnyaitpasdambigut.Lebutestdedistinguerclairementlavaleurattribuerla variable du contexte dans lequel elle apparat. Il est possible, de cette faon, dutiliser un sparateur quelconque, pourvuquecesparateurapparaisseclairemententantquetel.Ainsi,ilauraittpossibledcrireindiffremment : car_1, car_2, car_3 : CARACTRE car_1 <- * car_2 <- "*" car_3 <- /*/ Cesinstructionsinitialisentainsicar_1,car_2etcar_3aveclecaractre*. IlestpossiblededclarerunevariabledetypeCARACTREetelleestalorsdfinie :elleauneexistence.Cependant, ellenepossdepasencoredevaleur.Onconvientque,danscecas,lavariablealavaleur NUL.Cest un caractre particulier qui signe ltat dun caractre non initialis. tant donn un caractre car quelconque, il est toujours possibledeluidonnerlavaleurNULparuneaffectation : car <- NUL Cefaisant,lavaleurquilcontenaitavantcetteinstructionestperdue. Les donnes de type CARACTRE sont des donnes COMPARABLEs. Autrement dit, CARACTRE drive de COMPARABLE et il existe une relation dordre total dfinie sur lensemble des donnes de typeCARACTRE. Ainsi, tantdonnsdeuxcaractresquelconquesc1etc2,leurcomparaisonatoujoursunsensetunprdicatconstruitsur leurvaleurnestjamaisindfinidslorsquelescaractresc1etc2surlesquelsilportesontdfinis.Danslasuite,on suppose que lordre des caractres est lordre alphabtique usuel pour les lettres. Comme un caractre nest pas ncessairementunelettre,ilfautprciserlasignificationdelacomparaisondedeuxcaractresquelconques.Cestfait plusbasdanscettesection. Nousadmettronsquetoutcaractre,humainementreprsentableounon,possdeunentieruniquequilidentifie.On nesupposeriensurcetidentifiant,saufquilestentieretquetoutcaractreenpossdeun.Deplus,lesidentifiants sontattribusensquence,entredeuxvaleursdfiniespar : constante CODE_CAR_MIN : ENTIER <- ??? CODE_CAR_MAX : ENTIER <- ??? Les valeurs effectives de ces deux constantes ne nous intressent pas. Il nous suffit dadmettre que toute valeur entire comprise entre CODE_CAR_MIN et CODE_CAR_MAX est lidentifiant dun caractre et que tout caractre possdeunidentifiantentrecesdeuxvaleurs.Ilnyadoncpasde trou entreelles.Cestcequexprimelefaitque lesidentifiantsdecaractressontattribusensquenceentrecesdeuxvaleurs.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

66

Onmetlhypothsequeleschiffres0,1,...,9ontdesidentifiantsconscutifs.Cesontdescaractresquilnefaut pasconfondreaveclesnombresentiers0,1,...,9.Demme,lescaractresalphabtiquesmajusculesetminuscules ontdesidentifiantsconscutifsdanslordrealphabtique.Cependant,lesmajusculesetlesminusculesnesesuivent pasncessairement.Demme,leschiffresetleslettresnesesuiventpasncessairement.Onadoncquelidentifiant deBparexempleestlesuccesseurdelidentifiantdeAetceluidebestlesuccesseurdelidentifiantdea,maisil nexisteaucunerelationconnueentrelidentifiantdeAetceluidea.Onpeutpourtantentrouverunesimple : Exercice1:Relationentrelesidentifiantsdescaractres Dmontrerquelamajusculeetlaminusculedunmmecaractrepossdentdesidentifiantsdontladiffrenceestlamme, quelquesoitlecaractre. Onaccdelavaleurdelidentifiantduncaractrecarquelconquelaidedunerequtecodedontlesspcifications sont : Algorithme1:Spcificationsdelafonctioncodeduncaractre

Algorithme code # Identifiant numrique de car. Entre car : CARACTRE Rsultat : ENTIER prcondition carNUL postcondition Rsultat=(identifiantnumriquedecar) CODE_CAR_MINRsultatCODE_CAR_MAX fin code Dautrepart,onobtientlecaractreassociunidentifiantdonnenutilisantlafonctioncaractredontlalgorithme cidessousdonnelesspcifications. Algorithme2:Spcificationsdelafonctioncaractre Algorithmecaractre # Le caractre didentifiant n. Entre n:ENTIER Rsultat : CARACTRE prcondition CODE_CAR_MINnCODE_CAR_MAX postcondition code(Rsultat)=n fin caractre Un caractre nestdoncpasncessairementuncaractrealphabtique.Ainsi, !,, 5...sontaussidescaractres. Considronsalorslesvaleursnumriquesentiresquiscriventenbasedixlaidedunseulcaractre:0,1, ...,9. UnevariablecontenantunnombreestdclaredetypeENTIER.Cependant,onpeutvouloirtraiterlareprsentation textuelledecettevaleur.IlsagiraalorsdobtenirleCARACTREquilareprsente.Ainsi,parexemple,tantdonnle nombredeuxcentseizeexprimenbasedix,cestdire lobjetnumriquedontlavaleurestreprsentepar216, cettereprsentationenbasedixutilisetroiscaractres:2,1et6alorsquesareprsentationtextuelleutilise15 caractres :deuxcentseizedanslesquelsilnefautpasoublierdecompterlesdeuxespaces,entredeuxetcent pourlun,entrecentetseizepourlautre. Leproblmeestalorslesuivant :tantdonnunnombreentierccomprisentre0et9,commentcalculerlecaractrequi lereprsenteenbasedix ? Soitchiffreunefonctionquiprendenentreunentierpositifounul,maisstrictementinfrieur10etquiretournele caractrequilereprsenteenbasedix.Onaainsi,parexemple : c h i f f r e (5) = 5 Lecalculconsisteretournerlecaractredontlidentifiantestlecodede0augmentde cpuisquelesidentifiants deschiffressontconscutifsparhypothse : c o d e (9) = c o d e (8) + 1 = c o d e (7) + 2 = ...

- 2-

ENI Editions - All rigths reserved - Jonifar lina

67

Algorithme3:Dfinitiondelafonctionchiffre Algorithmechiffre # Le caractre de code c en base dix. Entre c:ENTIER Rsultat : CARACTRE prcondition 0c9 ralisation Rsultat<caractre(code(0)+c) postcondition Rsultat=caractre(code(0)+c) fin chiffre Lesoprationsdfiniessurlesentiersnesontpasapplicablesauxcaractresquireprsententcesentiersenbase dix.Ainsi,parexemple,ladditionnestpasdfiniesurlescaractresetonnepeutpascrire5+3quinapasde sens.Danscecas,ilfautpouvoirtransformeruncaractrereprsentantunchiffredelabasedixenunentier.Cest loprateur dual du prcdent qui ralise cette conversion. Il est dfini par lalgorithme cidessousquiutiliseencore lhypothsequelesidentifiantsdeschiffressontconscutifsetordonnsselonlordrenaturel. Algorithme4:Dfinitiondeloprateurnombre Algorithmenombre # Lentier reprsent par car en base dix. Entre car:CARACTRE Rsultat : ENTIER prcondition carNUL 0car9 ralisation Rsultat<code(car)code(0) postcondition Rsultat=code(car)code(0) fin nombre Remarquez la deuxime clause de la prcondition. Elle utilise la proprit des caractres dtre comparables. La comparaisonemploielesignecommesil sagissaitdenombres.Cetteclausesuppose,enoutre,quelordredfini surlescaractresestlemmequesurlesnombres,aumoinsencequiconcerneleschiffresde09. Exercicersolu1:Transformationdunnombreenchiffres Ondonneunnombre:435. crirelesinstructionsquitransformentcenombreencaractres. Le problme gnral consiste transformer un nombre quelconque en la suite des caractres qui reprsentent ce nombreenbasedix.CestleproblmedelditiondunnombrequiseratraitcompltementauxchapitresRcursivit etItration.Ici,cequenoussavonsnenouspermetquedetraiterdescasparticuliers. Solution Lenombreest435.Ilestfaitdetroischiffres.Latransformationdonneradonctroiscaractres.Soientcar_1,car_2et car_3 les trois variables de type CARACTRE qui recevront les rsultats. Comment, tant donn le nombre 435, obtenirlalistedeseschiffres ?Lechiffredesunits,5,estlerestedeladivisionde435par10 : variable car_1,car_2,car_3:CARACTRE ch:ENTIER n:ENTIER ralisation n<435 ch<reste(n,10)

ENI Editions - All rigths reserved - Jonifar lina

- 3-

68

Lorsquecenombreestobtenu,ilfautletransformerencaractre : car_3 <- c h i f f r e (ch) Ilsuffitalorsderpterlemmeprocdsur43,cestdiresurlequotientde435par10 : n <- q u o t i e n t (n, 10) Appliquer les oprations prcdentes sur 43 donnera le chiffre 3, puis le quotient 4, ce qui terminera la conversion demande.Enregroupantlesoprations,onobtientlalgorithmesuivant : Algorithme5:Transformationde435encaractres

variable car_1,car_2,car_3:CARACTRE n:ENTIER<435# Le nombre convertir. ch:ENTIER # Un chiffre de n. ralisation # Calcul du chiffre des units. Ch<reste(n,10) car_3<chiffre(ch) # Calcul du chiffre des dizaines. n<quotient(n,10) ch<reste(n,10) car_2<chiffre(ch) # Calcul du chiffre des centaines. n<quotient(n,10) car_1<chiffre(n)

2.Leschanesdecaractres
Unechanedecaractresesttoutesuitedecaractres,imprimablesounon,reprsentablesdanslesystme.Ainsi, parexemplelasuitedecaractres : Lesarbresperdentleursfeuillesenautomne. est une chane de caractres, indpendamment de la valeur de vrit de ce quelle nonce. De mme, Abracadabra , A345cde! ou #toto!/ sontdeschanesdecaractres.Lapremireestfaitede11caractres alphabtiquesdont5sontdesaouA,2sontdesb...Lasecondeestconstituede8caractresetlatroisimede 7caractres. Quand un algorithme doit utiliser une chane de caractres, il est possible de dclarer la variable qui la contiendra ainsi : variable phrase : C H A N E Onluiaffecteraunevaleurcommetouteautrevariable,enutilisantlesymboledaffectation : phrase <- Il fera beau demain. Comme CARACTRE, CHANE drive de COMPARABLE. La comparaison naturelle des chanes de caractres utilise lordrealphabtiqueusuel,tendupourtenircomptedescaractresquinesontpasalphabtiques.Bienentendu,il existedautresrelationsdordrepossibles. Pournoteruneconstantedetypechanedecaractres,onnumrelescaractresquilacomposentenlencadrant par un caractre particulier, utilis comme dlimiteur de dbut et de fin de chane. Dans lexemple prcdent, cest lapostrophe qui a t utilise pour dlimiter la chane Il fera beau demain.. On convient dutiliser nimporte quel caractrecommedlimiteurenrespectantlesdeuxconventionssuivantes :
q

lecaractredlimiteurestlemmeavantlepremiercaractredelachaneetaprslederniercaractre ilnedoitpastreuncaractredelachane.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

69

Onpeutainsicrire,dunefaonquivalente : phrase <- Il fera beau demain. phrase <- "Il fera beau demain." phrase <- (Il fera beau demain.( Le premier exemple utilise lapostrophe, le second le guillemet double et le troisime la parenthse ouvrante. Lapostrophe simple ne sera pas utilise pour dlimiter la chane "aujourdhui" pour des raisons videntes : elle contientellemmeuneapostrophe.Bienentendu,cesnotationssontdesconventionsetilesttoutfaitlgitimeden changer.Ilnesagitpasdedfinirunnouveaulangageavecunegrammairerigideetcontraignante,maispluttde fixeruncadredetravailrigoureux,quinelaissepasdeplaceauxambigutsdulangagecourant. Lorsquunechaneestdclaresansavoirtinitialise,ellenecontientaucuncaractre.Commepouruncaractre, elle a alors la valeurNUL. Cette valeur ne doit pas tre confondue avec la valeur dunechanevide,quinecontient aucuncaractre : CHANE_VIDE = OnpeuttoujoursaffecterunevariabledetypeCHANElavaleurdelachanevide : variable phrase:CHANE # phrase contient NUL. ... phrase<CHANE_VIDE# phrase est une chane sans caractre. Ce faisant, la chane vide est copie dans phrase qui ne contient alors aucun caractre. Ceux quelle contenait ventuellementavantcetteinstructionsontperdus.Ilconvientdebiendistinguerlachanevide,quinecontientaucun caractre,dunechanequinareuaucunevaleur,cestdirequinapasencoretinitialise.Onaainsi: variable ch_1,ch_2:CHANE ... ch_2< Dans cet exemple, ch_2 est une chane de caractres vide. Elle a t initialise par une chane constante qui ne contientaucuncaractre.Lavariablech_1nestpasencoreinitialise.Parconsquent,ellenapasencoredevaleur etellecontientdoncNUL,quinestpaslachanevide : NUL CHANE_VIDE Nousconvenonsenfinquelescaractresdunechanequinestpasvidesontnumrots.Habituellement,lepremier caractre portera le numro 1, le second le numro 2... mais ce nest pas obligatoire. Il nous arrivera de faire des conventionsdiffrentes,parexempledesupposerquelescaractressontnumrotspartirde15oude+10oude toute autre valeur entire quon voudra. La convention de numrotation des caractres est dcide et prcise lorsque la chane est dclare. Sans autre prcision, on suppose que cest la numrotation usuelle. Mais alors, un algorithme qui reoit en paramtre une chane de caractres doit connatre la convention adopte. Un prdicat, qui appartientaurpertoiredesoprationsapplicablesauxchanesdecaractres,permetdevrifierquunnombredonn estunnumrodecaractrevalidepourunechanedonne.Cestindex_valide,dontlesspcificationssontdonnes parlalgorithmesuivant : Algorithme6:Spcificationsduprdicatindex_valide Algorithmeindex_valide # i est-il un numro de caractre valide pour ch ? Entre i:ENTIER ch:CHANE Rsultat : BOOLEN prcondition chNUL postcondition Rsultat=(index_min(ch)iindex_max(ch)) fin index_valide Lachanechdoitdoncavoirtinitialise,mmeCHANE_VIDE. Un index est correct lorsquil est compris entre les numros du premier et du dernier caractre. Les fonctions

ENI Editions - All rigths reserved - Jonifar lina

- 5-

70

index_minetindex_maxsontdualeslunedelautre.Lapremirerendlavaleurdclarepourlenumrodupremier caractre de la chane quellereoitenparamtre.Laseconderenddemmelavaleurdclarepourlenumrodu derniercaractre.Lesspcificationsdeindex_minsont : Algorithme7:Spcificationsdeindex_min Algorithmeindex_min # Le numro du premier caractre de ch. Entre ch:CHANE Rsultat : ENTIER prcondition chNUL postcondition ch=CHANE_VIDE=>Rsultat=0 chCHANE_VIDE=>Rsultat= (lenumrodupremiercaractredech) fin index_min Ainsi,lenumrodupremiercaractredunechanevideest0.Cequidistingueunechanevidedunechanenonvide dont on a dcid de numroter les caractres partir de 0 est que, pour une chane vide, le dernier caractre est aussidenumro0 : i n d e x _ m i n (CHANE_VIDE) = i n d e x _ m a x (CHANE_VIDE) = 0 De plus, il est toujours possible de comparer une chane de caractres ch CHANE_VIDE pour dterminer si elle contientounondescaractres. Laspcificationdeindex_maxestidentiquecelledeindex_min.Elleestlaisseenexercice. Exercice2:Spcificationdeindex_max crirelesspcificationsdelafonctionindex_max. Pour prciser le numro du premier caractre dune chane, lorsque ce nest pas 1, on peut, par exemple, lindiquer entrecrochetsdansladclarationdelavariable,commececi : variable ch : C H A N E [5] Ici,chestunechanedontlepremiercaractreporteralenumro5,lesecondlenumro6...Lachanentantpas encoreinitialise,lesfonctionsindex_minetindex_maxnesontpasapplicables.Commedhabitude,ilesttoutfait possibledadopterdautresconventions. tantdonnech,unechanedecaractresquelconque,ilexisteunaccesseuritemquipermetderaliserunecopie duncaractredechdsignparsonnumro. Algorithme8:Spcificationsdelaccesseuritem Algorithmeitem # Le caractre dans ch de numro rang. Entre ch:CHANE rang:ENTIER Rsultat : CARACTRE prcondition chNUL index_valide(ch,rang) postcondition ch=CHANE_VIDE=>Rsultat=NUL chCHANE_VIDE=>Rsultat= (lecaractredanschdenumrorang) fin item Laccesseurdistingueunechanevidedunechanenonvide.Unechanevidenaaucuncaractre,maisrang = 0est unindexvalide.Danscecas,itemrendNUL.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

71

Commedhabitude, les paramtres en entre ne sont pas modifis. Autrement dit, la postcondition a pour valeur la conjonctiondequatrevaleursboolennes : postcondition ch=CHANE_VIDE=>Rsultat=NUL chCHANE_VIDE=>Rsultat= (lecaractredanschdenumrorang) ancien(ch)=ch ancien(rang)=rang cequiexprimebienqueitemrendunecopieducaractredelachanesanslamodifier. Arrivcepoint,ildevientpossibledersoudrequelquesexercicesquifontintervenirdeschanesdecaractres. Exercicersolu2:Longueurdunechanedecaractres La longueur dune chane de caractres est le nombre de caractres qui la composent. Ainsi, longueur(coucou) = 6 puisquecemotestcomposde6caractres. Spcifierpuisraliserlalgorithmedelafonctionlongueur. Solution Ilestpossiblededonnerplusieurssolutionsceproblme.Unsolutionimmdiateutilisecequenoussavonsdj : pourtoutechanedecaractresdfinie,lesfonctionsindex_minetindex_maxdonnentrespectivementlesnumros du premier et du dernier caractre. Leur diffrence, augmente dune unit donne alors le nombre de caractres demand. Algorithme9:CalculdelalongueurdunechaneVersion1.0 Algorithmelongueur # Le nombre de caractres de ch. Entre ch:CHANE Rsultat : ENTIER prcondition chNUL ralisation si ch=CHANE_VIDE alors Rsultat<0 sinon Rsultat<index_max(ch)index_min(ch)+1 fin si postcondition ch=CHANE_VIDE=>Rsultat=0 chCHANE_VIDE=>Rsultat=index_max(ch)index_min(ch)+1 fin longueur Uneautresolution,plussimplemaismoinsgnrale,convientpourleschanesquandonposeparconventionquele numro du premier caractre est toujours 1. On sinterdit ainsi de numroter les caractres partir dun nombre quelconque et on a toujours index_min(ch) = 1 pour toute chane ch. La longueur de la chane, son nombre de caractres,estalorsdonnparindex_max(ch).Ainsi,index_maxetlongueurdonnentlemmersultat :ellessont synonymes.Onpeutalorsadopterluneet oublier lautre.Leplussimpleestdadopterlongueuretdelaisserles fonctionssurlesindex. Lexercicesuivantestplusdifficileetnousnavonspasencoretousleslmentspourlersoudre.Ceserafait,pour unepremireversionrcursiveauchapitreRcursivitetpouruneversionitrativeauchapitreItration.Cependant, nouspouvonsdjdfinirleproblmeetlespcifierpartiellement. Ondonneunechanedecaractreschetuncaractrecar.carestiluncaractredech ? Il sagit de dterminer, pour une chane et un caractre dfinis, si le caractre compose la chane, cestdire si le caractreestuncomposantdenumrocomprisentreindex_min(ch)etindex_max(ch).Soitappartientleprdicat raliser.Lalgorithmecidessousdonneunepremireversiondelasolution. Algorithme10:Premireversiondeappartient

ENI Editions - All rigths reserved - Jonifar lina

- 7-

72

Algorithmeappartient # car est-il un caractre de ch ? Entre ch:CHANE car:CARACTRE Rsultat : BOOLEN prcondition chNUL carNUL ralisation Rsultat<estDans(ch,index_min(ch),index_max(ch),car) postcondition Rsultat=estDans(ch,index_min(ch),index_max(ch),car) fin appartient En fait, cette fonction utilise les services dun autre prdicat, estDans, qui dtermine si le caractre recherch est prsentdanslachaneentredeuxcaractresdenumrosdonns.Ainsi,estDansestplusgnralqueappartientetil doittredfinipourqueladfinitiondeappartientaitunsens.MaisvoyonsdabordcommentutiliserestDans. Soient,parexemple,lesdclarationssuivantes : variable phrase:CHANE<Ilfaitbeau. car:CARACTRE<a OndfinitainsiunechanephraseinitialiseIlfaitbeau.etuncaractrecarinitialislalettrea.Lescaractres dephrasesontnumrotspartirde1.Pourdterminersiphrasecontientunaentresoncaractredenumro4et lecaractredenumro10,oncritparexemple : ... si estDans(phrase,4,10,car) alors lachanephrasecontientcarentre lescaractresdenumro4et10 sinon lachanephrasenecontientpascarentre lescaractresdenumro4et10 fin si ... Lafonctionappartientutiliseceprdicat,maisentrelepremieretlederniercaractrepourexplorertoutelachane. Pourrpondrelammequestion,maispourtoutelachane,ilestpossibledcrire,parexemple : ... si appartient(phrase,car) alors lachanephrasecontientcar sinon lachanephrasenecontientpascar fin si ... IlseraitaussipossibledutiliserestDansdelammefaonqueappartientlutilise. IlrestecrireestDans.Commenonsparlesspcifications. Lasignatureduprdicatest : estDans ( ch:CHANE dbut,fin:ENTIER car:CARACTRE ):BOOLEN # car est-il un caractre

# La chane explorer. # Lintervalle dexploration. # Le caractre chercher. de ch de numro compris

- 8-

ENI Editions - All rigths reserved - Jonifar lina

73

entre dbut et fin ? Laprconditionimposequelesparamtressoientdfinisetquelesindexsoientvalides.Elleestlasuivante : prcondition chNUL carNUL index_valide(ch,dbut) index_valide(ch,fin) Cest dans lexpression de la postcondition que se trouve ce qui est nouveau. Ce sera trait dans les chapitres suivantsetcetexerciceestabandonnlpourcechapitre.Cependant,ilsembleimportantdenoter,dsprsent, quaucune autre condition nest impose aux indices dbut etfin. La fonction doit donc rendre un rsultat correct, mme lorsque dbut > fin, ce qui est contreintuitif puisque, la lecture de la prcondition, on sattend ce que dbut fin. En fait, la postcondition prcisera que, pour dbut > fin, la fonction estDans rend FAUX. Dautres spcificationssontvidemmentpossibles. Ilfautdistinguersoigneusementuncaractre,quiestlunit lmentaire dinformationsurleschanes,dunechane de caractres compose dun caractre unique. La fonction longueur par exemple, est applicable une chane de caractres quelconque, donc aussi une chane ne contenant quun seul caractre. Cependant, elle nest pas applicable une instance deCARACTRE : elle napasdesenspouruncaractre.Ilsembledoncutilededisposer dune fonction chane applicable un caractre quelconque et qui rend la chane rduite ce seul caractre. Le rsultat est donc de longueur 1. Les spcifications de cette fonction de conversion sont donnes dans lalgorithme suivant. Algorithme11:Spcificationsdelafonctionchane Algorithmechane # La chane dont le seul caractre est car. Entre car:CARACTRE Rsultat : CHANE prcondition carNUL postcondition car=item(Rsultat,index_min(Rsultat)) longueur(Rsultat)=1 fin chane LapremireclausedelapostconditionexprimequelepremiercaractredelachaneRsultatestcaretladeuxime quelersultatnaquunseulcaractre.

3.Exercicesdapplicationsurleschanesdecaractres
Exercice3:Additiondescaractres Nousavonsvuqueladditionnestpasuneoprationapplicableauxcaractres.Onveutdfiniruneoprationadditionqui prendenentredeuxcaractresreprsentantsdesentiersenbasedixcomprisentre0et9etquirendlecaractregalla reprsentationdeleursomme.Ainsi,parexemple,addition(3,2)rend5. 1.crirelesspcificationsdelafonctionaddition. 2.criresadfinitioncomplteetdonnerdesexemplesdutilisation Notezbienqueadditionopresurdescaractresetcalculeunrsultatquiestuncaractre.Soignerparticulirement laprcondition. Exercice4:Successeurduncaractre OndfinitletypeCHIFFREcommeuncaractrereprsentantunentiercomprisentre0et9enbasedix.Uneinstancede CHIFFREestdoncunlmentdelensemble{0,1,...,9}. 1.DfinirlalgorithmecompletdelafonctionsuccesseurquiopresurlesinstancesdutypeCHIFFRE. 2. Procder de mme pour dfinir la fonction successeur qui opre sur un caractre majuscule de lalphabet et celle qui opresuruneminuscule.

ENI Editions - All rigths reserved - Jonifar lina

- 9-

74

Leproblmedoittredfiniprcisment.Ilestpossibledeletraiteravantouaprsleproblmesuivant. Exercice5:Reconnatreunchiffre,unemajuscule,uneminuscule 1.crireunprdicatestChiffrequireconnatunchiffredelabasedix. 2.criredemmelesprdicatsestMajusculeetestMinusculequireconnaissent,respectivement,uncaractremajuscule ouminuscule. 3.crireleprdicatestAlphabtiquequireconnatsiuncaractreestuncaractredenotrealphabet.

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

75

Letableau
Untableauestunestructurequirassemble,sousunmmenom,unmultiensemblededonnes.Danslasuite,nous supposonsquetouteslesdonnesenregistresdansuntableausonthomognes,cestdiretoutesdemmetype. Onparlera,parexemple,duntableaudENTIERs,duntableaudePERSONNEs, duntableaudeRSERVOIRs...pour exprimerquechacunedesdonnesenregistresdansletableauestunENTIER,unePERSONNEouunRSERVOIR. La premire section traite des tableaux dont les lments sont des donnes, structures ou non, mais toujours en exemplaire unique. La section suivante tudie les tableaux dont les lments sont des tableaux. La dernire section proposequelquesexercicesdapplication.

1.Lestableauxsimples
Untableauestconstitudunensemblede cases numrotesensquence.Chaquecasepeuttrevide,cest dire non initialise, ou contenir une donne du type dans lequel le tableau a t dfini. La figure cidessous reprsenteuntableaudENTIERsdenomvde30casesnumrotesde130.

Lescasesnumrotesde110onttinitialises(remplies)avecdesentiers.Lacasenumro6contientlavaleur 14,lacasenumro1contientlentier5.Lescasesdontlesnumrosvontde1130nontpasencorereudevaleur. EllesnecontiennentriendesignificatifouNUL. Untableauestdfiniparsadclaration.Cettedclarationprciselenomdutableau,lenumrodelapremireetdela dernirecaseainsiqueletypededonnesquilcontiendra.Ainsi,pourletableaudelafigurecidessus,ladclaration est,parexemple : variable v : T A B L E A U [E N T I E R ][1,30] Cependant, cette forme nest pas obligatoire. Ainsi, par exemple, on trouve souvent, chez diffrents auteurs, la notationsuivante : variable v : T A B L E A U [1 .. 30] dE N T I E R CettenotationimitelesdclarationsdfiniesenlangagePASCAL,parexemple.Limportantestencorequelanotation utiliseprcisebienlesdiffrentslmentsdeladfinitiondutableau.Dailleurs,sicentaitpassiverbeux,ilserait toutaussilgitimedcrire : variable v : tableau de 30 cases numrotes de 1 30 et recevant des entiers. La dclaration prcise le nombre de cases en donnant les numros de la premire et de la dernire case. On peut aussi, par exemple, accepter la convention selon laquelle le numro de la premire case est toujours 1. Alors, le nombredecasesdutableauestlenumrodeladernirecaseetunedclarationdetableauaveccesconventionsse simplifieen : variable v : T A B L E A U [E N T I E R ][30] Certainesconventionsdonnentlapremirecasedutableaulenumro0.Danscecas,ladclarationquiprcdene donnepluslenumrodeladernirecase,maislenombredecases. Nousadmettonsquuntableauestunestructurededonnesstatique :aprsdclaration,letableaunepeutplustre redimensionn pendant lexcution de lalgorithme. Il est possible, l encore, de faire dautres conventions et dadmettrequelenombredecasesduntableaupeutvoluer,maiscelasemblecompliquerunpremierapprentissage. Commepourleschanesdecaractres,ilestpossiblededonnerlapremirecaseunnumroentierquelconque.La seulecontrainteestquelenumrodeladernirecasedoitluitresuprieur.Ladclaration :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

76

variable clients : T A B L E A U [P E R S O N N E ] [0, 5000] citernes : T A B L E A U [R S E R V O I R ][-2, +2] dfinitdeuxtableaux.Lepremier,denomclients,estuntableaude5001cases,chacunecontenantunedonnede type PERSONNE. Le second est un tableau appel citernes, fait de 5 cases numrotes de 2 +2 et contenant, chacune,unedonnedetypeRSERVOIR. Pouraccderaucontenudunecase,ilsuffitdindiquer,derrirelenomdutableau,lenumrodelacaselaquelleon veut accder. On a ainsi, pour le tableau v reprsent par la figure prcdente : v[3] = 21, v[7] = 0, v[9] = 28. Pourinitialiserlacasenumro15aveclavaleur156,oncrit : v[15] <- 156 Pourplacerdanslacase25lasommedescontenusdescases5et10,oncrit : v[25] <- v[5] + v[10] Lemembrededroitedelinstructionaccdeauxcasesv[5]etv[10],raliseunecopiedesvaleursquellescontiennent etlesadditionne.Lasommeobtenueestrangedanslacasenumro25dutableau.Lecomportementestdoncle mmequeceluidunevariablequelconque :lacopieralisedroitedusymboledaffectation<nemodifiepasles casesauxquellesaccdelinstruction.Lacasedestinationdursultat,iciv[25],nepeutcontenirquuneseulevaleur et,parconsquent,lavaleurquellecontenaitavantlinstructionestperdue. Lescasesdenumros11,...,14,16,...,24,26,...,30necontiennenttoujoursrien. Commepourleschanesdecaractres,leprdicatindex_valideetlesfonctionsindex_minetindex_maxpermettent dcrirelesspcificationsdesalgorithmesquiutilisentlestableaux. Exercicersolu3:Initialiseruntableau crirelapartiedunalgorithmequiinitialiseuntableaudenomneufaveclesrsultatsdelatabledemultiplicationpar9. Solution Unepremiresolution,nave,numrelesonzecasesdutableauenleurdonnantlersultatdunemultiplication.La case de numro 0 contiendra 9x0, celle de numro 1 contiendra 9x1... Le client logiciel de lalgorithmecrireaura pralablementdclarletableau : variable table : T A B L E A U [E N T I E R ][0, 10] Pourutiliserlalgorithmeinitialiserdfinir,leclientcrira,parexemple : i n i t i a l i s e r (table) Il appelle donc les services de initialiser en lui communiquant le tableau prparer. Il est clair que lalgorithme va modifierletableau.Enparticulierpourcetexemple,tablecontientNULdansses11casesavantlappelinitialiser.Il contiendralesrsultatsdelatabledemultiplicationpar9lorsqueinitialiserauraralissontravail. Algorithme12:Tabledemultiplicationpar9Version0.1

Algorithme initialiser # Table de multiplication par 9. Entre neuf : TABLEAU[ENTIER] prcondition index_valide(neuf, 0) index_valide(neuf, 10) ralisation neuf[0] <- 9 x 0 neuf[1] <- 9 x 1 ... neuf[10] <- 9 x 10 postcondition les cases neuf[0 .. 10] sont modifies et contiennent les rsultats de la table de multiplication par 9

- 2-

ENI Editions - All rigths reserved - Jonifar lina

77

fin initialiser neuf est donc le paramtre formel, le marqueplace pour le nom du tableau sur lequel opre lalgorithme. Celuici modifie le tableau en linitialisant avec les rsultats de la table de multiplication par 9. Lalgorithme est donc une procdure. Cettesolutionnestpasbiencrite.Ainsi,parexemple,laprconditionforceletableautredfinidesortequeses cases soient numrotes depuis 0 pour la premire. Ce nest pas une bonne pratique. La responsabilit de lalgorithme est seulement de calculer la table de multiplication par 9. Il devrait pouvoir raliser ces calculs sans imposerunedclarationcontraintedelastructurededonnesquilutilise.Nousverronsplustardcommentrglerce point. De mme, la ralisation nest pas ce qui se pratique habituellement, mais les outils logiciels pour dfinir un algorithme intelligent nontpasencoretmisenplace.Ceserafaitdansleschapitressuivants.Bienentendu,il fautremplacerlespointsdesuspensiondelaralisationparlesinstructionsquils cachent. Cestfacileicietcepetit travailestlaissenexercice.

2.Tableauxcomposs
On dsigne par lexpression tableau compos un tableau dont les cases contiennent des tableaux. Lorsque chaque casedutableaucontientuntableausimple,onparledematrice.Latablecidessousreprsenteunematrice. 1 1 2 3 12 2 26 2 8 4 89 3 14 113 18 4 9 6 9 5 0 10 0

Lapremirelignedecettereprsentationportelesnumrosdescolonnesdelamatrice.Lapremirecolonneporteles numrosdelignes.Chaqueligneestuntableausimple.Ainsi,laligne1estconstituedutableaudontleslments sont 12, 8, 14, 9 et 0. Par consquent, en appelant m cette matrice et v, w et z ses trois lignes, m[1] dsigne le tableauv,m[2]dsigneletableauwetm[3]dsigneletableauz.Llment113estdoncw[3]etcommew=m[2],on obtientm[2][3]=113. Ilestpossiblederpterceraisonnementpourchacundeslmentsdelamatrice.Ainsi,pouraccderunlment quelconque,ilsuffitdedonner,droitedunomdelamatrice,sonnumrodelignesuividesonnumrodecolonne : m[1][5]=0 ; m[3][1]=26 ; m[1][3]=14 ; m[3][2]=89 Pour dclarer un tableau compos, on dclare un tableau en prcisant dabordlesnumrosdelapremireetdela dernireligne,puislesnumrosdelapremireetdeladernirecolonne.Ainsi,lamatricemcidessus est dclare par : variable m : T A B L E A U [E N T I E R ][1,3][1,5] ouencore : variable m : M A T R I C E [E N T I E R ][1,3][1,5] cequidfinitunematricecomposede3tableauxsimplesde5composanteschacun,soitunematricede3ligneset de5colonnes.Ilestpossiblededclarerdemmeuntableaudematrices,unematricedematrices

3.Exercicesdapplicationsurlestableaux
Exercice6:TabledePythagore LatabledePythagoreestfaitede10lignesetde10colonnesnumrotesde09.Lacaselintersectiondelaligneietde lacolonnejcontientlersultatdeladditioni+joudelamultiplicationi x j. DclarerpuisremplirlatabledePythagorepourlamultiplication. Commenousnedisposonspasencoredesconnaissancesncessairespourremplircettetable intelligemment ,on peutsecontenterdemontrercommentremplirquelquescasessignificatives.
ENI Editions - All rigths reserved - Jonifar lina - 3-

78

Exercice7:Matriceetmoyennesdescases Lexercice reprend la matrice m dfinie par le tableau prcdent. On veut remplir un tableau simple l qui contient, dans chaquecase,lamoyennedeslmentsdunelignedem.Ainsi,l[1],parexemple,contiendralamoyennedeslmentsdez =m[1]. 1.crirelesinstructionsquidfinissentetcalculentleslmentsdel. 2.Mmequestionpouruntableauccontenantlesmoyennesdeslmentsdescolonnesdem.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

79

Dfinirunnouveautypededonnes
Cette section tudie comment dfinir et utiliser de nouveaux types de donnes, laide des types lmentaires de base.Cependant,alorsquepourlestypesdebase,commelesENTIERsparexemple,lesoprationsapplicablessont implicitement celles des Mathmatiques usuelles, pour ces nouveaux types, il faudra clairement et prcisment les dfinir.CestcequenousavonsdjcommencfairedanslechapitreProgrammesdirectsavecletypeRSERVOIR. Cettesectionproposedtudiercettequestiondunefaonplusapprofondie.

1.Dfiniruntypededonnes
Un type de donnes dfinit le domaine des valeurs que peuvent prendre les donnes qui sont les instances de ce type, mais aussi les oprations applicables ces instances. Ainsi, on peut dterminer la quantit de liquide pour remplirun RSERVOIR donn, mais remplir unENTIERna pas de sens, de mme que additionner deux rservoirs parexemple.remplirestuneoprationapplicableuneinstancedeRSERVOIRmaispasuneinstancedENTIER. Untypeestdfinipartirdestypesdebase,cestdiredestypesintuitivementvidentsetquifontpartiedenotre quotidien : les nombres entiers, les nombres rels, les boolens... Les oprations applicables aux instances de ces types de base sont habituellement les oprations mathmatiques du domaine : additionner, soustraire, multiplier... deux nombres, calculer a et b, a ou b, pour deux boolens a et b, calculer lintersection, la runion de deux ensembles...Oncomposealorsdesdonnesdecestypesdebasepourdfinirunnouveautypeparticulier.Cestce quiadjtfait,parexemple,pourdfinirRSERVOIRauchapitreProgrammesdirects.Lesoprationsapplicables ont t dfinies par des algorithmes complmentaires qui oprent sur des donnes du type. Les donnes qui composent un nouveau type sont les attributs du type. Ainsi, un RSERVOIR possde deux attributs rels : sa capacitetsacontenance. Danscelivre,onnoteladfinitiondunnouveautypeparladclaration : type <nom du nouveau type> structure ... invariant ... fin <nom du nouveau type> Lepremierblocdonnelenomquiserautilispourdsignerlenouveautype.Cenomesthabituellementprcisen majusculesetencassegrassedanscelivre.Cest ce nom qui sera utilis pour instancier des variables du type. Le second bloc donne la liste des clauses qui dfinissent les attributs du nouveau type. Le troisime bloc regroupe un ensemble, ventuellement vide, de clauses constitues de prdicats. La conjonction de ces prdicats reste toujours vraie,pourtouteinstancedutype,danstouslestatsdusystmeettoutinstant.Lexemplecidessousdfinitle typeFRACTION. Exemple Unefractionestdfinieparladonnededeuxattributsentiersdontlesecond,lednominateur,nestpasnul : type FRACTION structure numrateur : ENTIER dnominateur : ENTIER invariant dnominateur0 fin FRACTION Unefractiondednominateurnulnapasdesens. Les oprations applicables sur une instance de FRACTION sont les oprations mathmatiques usuelles : normaliser, simplifier,additionner... Exemple Un code postal est fait dun attribut entier sur deux chiffres au plus, qui donne le numro du dpartement Franais du bureaudepostequilrfrence,compltdunattributentierpositifsurtroischiffres,quiestlenumrodordredubureau dansledpartement.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

80

type CODE_POSTAL structure dpartement:ENTIER bureau:ENTIER invariant 1dpartement99 0bureau999 fin CODE_POSTAL UneinstancedeCODE_POSTALnestpasutilisableimmdiatement.Eneffet,uncodepostalscritsouslaformedun nombreentiercomprisentre1000et99999.Parconsquent,pourrendreutilisableuneinstancedecetype,ondoit fournir une oprationcodePostalquiprend,enentre,uneinstancede CODE_POSTALetquirenvoie,enrsultat, lentier qui est le code postal correspondant. Inversement, tant donn un entier, il faut disposer dune fonction code_postalquiprendcetentierenentreetquirendlinstancedeCODE_POSTALcorrespondante. Il est possible de reprsenter un nouveau type par un diagramme. Cest une bote rectangulaire qui est divise en quatre compartiments. Le premier donne le nom du nouveau type. Le second donne la liste des attributs qui le dfinissentenprcisant,pourchacundeux,letypededonnesdontilestuneinstance.Letroisimecompartiment donne les signatures des oprations applicables sur les instances du type. Le dernier compartiment numre les clausesquidfinissentlescontraintessurlesvaleursdesattributs.Lafigurecidessousreprsenteparundiagramme lestypesFRACTIONetCODE_POSTAL.

Ilesttoujourspossibledereprsenteruntypeparundiagrammeincomplet,parexempleavecunblocdoprations vide parce quelles nont pas encore t dfinies. Cest ce qui est symbolis par les points de suspension dans les compartimentsdesoprationssurlafigureprcdente. Onnoteraladfinitiondunevariablequiinstancieuntypecommeonlefaitpouruntypedebase : variable v_1, v_2 : <NOM DU TYPE> et laccs un attribut particulier dune variable se note en utilisant loprateur point ( notation pointe ) pour sparerlenomdelavariabledunomdelattributauquelonveutaccder : v_1.attribut <- <valeur> Voici,parexemple,ladfinitiondetroisfractionsf1,f2etsetquelquesinstructionsquilesutilisent : variable f1,f2,s:FRACTION ... # Initialiser f1 4/5. f1.numrateur<4# Le numrateur prend la valeur 4. f1.dnominateur<5# Le dnominateur prend la valeur 5. # Initialiser f2 3/2. f2.numrateur<3 f2.dnominateur<2

- 2-

ENI Editions - All rigths reserved - Jonifar lina

81

# Calculer la somme de f1 et f2. s<addition(f1,f2) ... La section suivante discute la notion dinvariant. Elle peut tre ignore en premire lecture. Les dbutants en algorithmiquepeuventdoncpasserdirectementlarsolutiondesexercicesquisuiventcettesection.

2.Discussionsurlesinvariants
Le bloc invariant de la dfinition des types prcdents masque une ralit complexe dont cette section prsente quelquesaspects.Cesontdesconsidrationsthoriques,inspiresde[LIS01]et[MEY00],auximplicationsdifficiles apprhenderlorsduneinitiation.Ilestpossibledyrevenirplustard. ReprenonsladfinitiondutypeFRACTIONobtenueprcdemment : type FRACTION structure numrateur:ENTIER dnominateur:ENTIER invariant dnominateur0 fin FRACTION Lapropritinvarianteestunepropritdetoutobjetmathmatiquequiestunefraction.Pourraliserunefraction mathmatique,unereprsentationalgorithmique,quellequellesoit,doitassurerlemaintiendecetteproprit.Une fractiondednominateurnulnaaucunsens :ellenestpasdfinie.Appelonsinvariantabstraituntelinvariant.Ilest indissociablementattachlabstractionraliseparletypealgorithmiquedfini.Cependant,cenestpasleseultype dinvariantpossible. Supposons, par exemple, que lon exige dune fraction concrte, celle implmente par lalgorithme, davoir un dnominateurpositif.Autrementdit,oninterditunefractioncomme5/4etondevratoujourslaremplacerpar5/4qui luiestmathmatiquementquivalente.Linvariantdevientalors : invariant dnominateur0 non(dnominateur<0) cequipeutaussiscrireplussimplement : invariant dnominateur>0 Cette fois, linvariant nexprime plus une proprit dune fraction abstraite. Cest une proprit supplmentaire, imposeparlasolutionalgorithmiqueadopte.Onparlealorsduninvariantdimplmentation.Ainsi,onnepourraplus crire : f:FRACTION ... f.numrateur<5 f.dnominateur<4 Appelons fraction normalise une fraction soumise cet invariant dimplmentation. Supposons, prsent, quune fraction,enplusdtrenormalise,doitaussitreirrductible.Cettefois,linvariantdimplmentationdevient : invariant dnominateur>0 pgcd(numrateur,dnominateur)=1 danslequelpgcddsignelafonctionquirendleplusgranddiviseurcommundesesparamtres.Ainsi,ilneseraplus possibledcrire : f:FRACTION ... f.numrateur<20 f.dnominateur<30 puisquepgcd(20,30)=101.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

82

3.Exercicesdapplicationsurlestypesdedonnes
Une personne est une entit dont les attributs sont le prnom, le nom, lge et ladresse. Ladresse complte est dabordconsidrecommeunedonnelmentaire. Exercicersolu4.1:Dclarationetutilisationduntype 1.DessinerlediagrammepuisdfinirletypePERSONNE. 2.Dfinir(dclarer)deuxvariablesp_1etp_2detypePERSONNE. 3. Dclarer une variable clients comme un tableau permettant denregistrer 200 personnes. Paramtrer le nombre maximumdeclientsquepeutenregistrerletableau. 4.Faireunschmareprsentantcetableauavecquelquesdonnes. 5.crirelesinstructionsquiinitialisentle56meclientdutableaucommetantMonsieurJeanDUPONT,quihabiteau36 ruedelaPlancheClous,auMANS,dontlecodepostalest72000. Solution LetypePERSONNEpeuttredfiniainsi : type PERSONNE structure prnom:CHANE nom:CHANE ge:ENTIER adresse:CHANE fin PERSONNE etdeuxvariablesdecetype,ainsi : variable p_1,p_2:PERSONNE ouencore,endissociantlesdeuxdclarations : variable p_1:PERSONNE p_2:PERSONNE Ilestaussipossibledcrire : p_1 et p_2 sont des P E R S O N N E s Pour paramtrer le nombre de clients, il suffit dutiliser une constante. Les dclarations sont, par exemple, les suivantes : constante MAX_CLIENTS:ENTIER<200 variable clients:TABLEAU[PERSONNE][1,MAX_CLIENTS] MAX_CLIENTSestdoncuneconstantemanifestequiremplace,partoutoelleapparat,lentier200dontelleestun substitut. Letableaucidessousdonneunexempledereprsentationdelatabledesclients. Numro Prnom 17 Marcel 212 Henri Nom MARTIN DUPONT ge Adresse 27 25ruedesLilas72700ALLONNES 50 57rueBlanche72000LEMANS

- 4-

ENI Editions - All rigths reserved - Jonifar lina

83

Lacolonne numro porteunnumrodeclientetnonpasunnumrodecase. Le56meclientestMonsieurJeanDUPONT,quihabiteau36ruedelaPlancheClous,auMANS.Pourinitialiserla casedenumro56dutableauclients,ilsuffitdutiliserlesinstructionssuivantes : client[56].prnom<Jean client[56].nom<DUPONT client[56].ge<53 client[56].adresse<36ruedelaPlancheClous72000LEMANS Entrecrochetsfigurelenumrodelacaseinitialise.Cenumrodecasenedoitpastreconfonduaveclenumrode clientquifiguredanslapremirecolonnedutableau.Ici,cenumrodeclientnestpasinitialisparlesinstructions prcdentes. La procdure crire permet dcrire sur un priphrique donn, cestdire denvoyer des donnes vers ce priphrique. Une telle procdure ralise donc ce quil est convenu dappeler, en informatique, une opration dentre/sortie. Ce type dopration nest pas, quelques exceptions prs qui seront discutes dans un chapitre ultrieur,delaresponsabilitdelalgorithmique. Cestdelaprogrammationetilnesemblepasncessairedutiliser dautre langage quun langage de programmation pour indiquer une opration dentre/sortie. Cependant, certains auteursdudomaineveulenttouteforce crire et lire .Aussi,cdonslamodepourquelquesparagrapheset voyonscequenouspouvonsfairedeloprationdcriture. Laprocdurecrireprendenparamtresunnominternedefichierpriphrique,cestdireunnumrologiquequi dsigne un priphrique de sortie, et une chane de caractres par exemple. Son effet est denvoyer la chane de caractres au priphrique de sortie. On suppose que les numros de priphrique de lcran, du clavier et de limprimantesontprdfinis.IlssontdsignsparlesconstantesCRAN,CLAVIER... PourenvoyerversuneimprimantelachanedecaractresIlfaitbeau.,ilsuffitdcrire,dansunalgorithme : c r i r e (IMPRIMANTE, Il fait beau.) Lhypothseestque,alors,limprimante correctementconnecte (lalgorithme ?)crira,surlafeuilledepapierde sonmagasin,laphrasetellequelleseprsenteensecondparamtre. Exercicersolu4.2:Quelquesoprationsdentre/sortie 1.crire,lcran,lesattributsduclientenregistrdanslacase67dutableau. 2.Saisirauclavierlesattributsdunepersonneetlesenregistrerdanslespositionsrservesauclientdelacase186. Solution Pour envoyer lcran les attributs du client enregistr dans la case numro 67 du tableau, il est possible, par exemple,dcrirelesinstructions : crire(CRAN,clients[67].prnom) crire(CRAN,clients[67].nom) crire(CRAN,clients[67].ge) crire(CRAN,clients[67].adresse) Maisencoreunefois,cenestplusdelalgorithmique :cestdelaprogrammation,lapirequisoitdailleurs,puisqueces instructionsnefontquimiterimparfaitementdesinstructionsdeteloutellangage.Pourquoinepascrire,danscecas parexemple : ( v o i d ) s p r i n t f ("%s\n",clients[67].prenom) ; Voicienfinlasaisieinteractivedespropritsdunnouveauclient : ... crire(CRAN,Quelestlenomduclient?) clients[186].nom<lire(CLAVIER) crire(CRAN,Quelestsonprnom?) clients[186].prnom<lire(CLAVIER) ... Onprocderaitdemmepoursaisirlgeetladressedunouveauclient. Cesinstructionsdistinguentlescomportementsdesoprationsdentre/sortieetdonclafaondutilisercrireetlire. La premire est une procdure alors que lautre est une fonction. La seconde, lire, est une fonction qui rend un rsultat :elle interroge lesystmeetretournelarponseobtenuelalgorithmequilutilise.Loprationcrireest

ENI Editions - All rigths reserved - Jonifar lina

- 5-

84

denaturediffrente.Ellecommandeausystmedemodifiersontatet,enprincipe,ellenerenvoieaucunrsultat. Exercice8:FonctionsapplicablesuneinstancedeCODE_POSTAL crirelesalgorithmesdesfonctionscodePostaletcode_postal. Exercice9:TypeCARACTRE FaireundiagrammereprsentantletypeCARACTREenplaantlesoprationstudiesdanslessectionsprcdentes. Lexercicesuivantestunevariationsurlemmethmequelexercicedfinissantlesrservoirs. Exercice10:Compteenbanqueetoprationsapplicables On considre le type de donnes COMPTE dont les instances sont les comptes courants des clients dune banque. On supposedabordquelabanquenautoriseaucundcouvert.Touteoprationconduisantundcouvertestillgaleetnest pasaccepte. 1.DfinirletypeCOMPTEenprcisantlesattributsetlesoprationsapplicables. On suppose ensuite que certains clients ont un dcouvert autoris, mais limit une somme fixe par la banque louvertureducompte.Uneoprationsurlecomptenestlgalequesilesoldeducompterestesuprieurougallalimite infrieurefixe. 2.Redfinirletypeprcdentetlesoprations. OnreprendprsentladfinitiondutypePERSONNE.Cetypeutiliseuneadressedfinieprcdemmentcommeune chanedecaractres.Ilsagitdenfaireuneinstancedunnouveautypededonnesdfinir. Ladressedunepersonneestuntypedontlesattributssont,poursimplifier,unnumrodansunerue,unerue,un codepostaletuneville.Onsupposequunepersonnedonnenepossdequuneseuleadresse soitsarsidence principale.IlexistedoncuneassociationentreunePERSONNEetuneADRESSE.Cetteassociationestnotecomme surlediagrammedelafigurecidessous.

Lediagrammeneportenilesoprations,nilesclausesdinvariant.Lassociationestreprsenteparletraitquirelie lesdeuxentits.Lenomdelassociationestindiqusurletrait.Ici,ilestindiququetouteinstancedePERSONNE habiteuneADRESSE.Le1portauniveaudeADRESSEsignifiequunepersonnequelconquehabiteuneadresse unique. Ltoile porte au niveau de lentit PERSONNE indique quune adresse est associe aucune, une ou plusieurspersonnes.Ainsi,unemmeadressepeuventhabiterplusieurspersonnes,maisuneadressepeutntre associeaucunepersonne.Cepeuttreunlogementinoccupparexemple. Cediagramme,videmmentincomplet,indiqueainsiqueletypePERSONNEestdfinipar : type PERSONNE structure ge:ENTIER adresse:ADRESSE fin PERSONNE RemarquezbienquelenometleprnomnefigurentpasdanscettedfinitiondutypePERSONNE.Bienentendu,le typeADRESSEdoitaussitredfini.Cesdfinitionssontdoncincompltes,maisellestraduisentlediagrammedela figurecidessus.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

85

Exercice11:Dclarationetutilisationduntypecompos 1.ReprsenteretdfinirletypeIDENTITdontlesattributssontunprnometunnom. 2.ReprsentercompltementpuisdfinirletypeADRESSE. 3.RefaireundiagrammecompletenmettantenvidencelassociationentrePERSONNEetIDENTIT. Tenircomptedecequeplusieurspersonnespeuventavoirlammeidentit,mmequandellesnhabitentpaslamme adresse.IlsuffitdeconsulterunannuairetlphoniquedelavilledeParisetderechercherlesJacquesMARTINpoursen convaincre. 4.RedfiniralorsletypePERSONNE. UnclientestunePERSONNEidentifieparunnumroentierstrictementpositif. 5.DfinirletypeCLIENT. 6.DclarerlavariableclientscommeuntableaudeCLIENTspouvantenregistrerjusqu1000clients. 7.crirelesinstructionsdinitialisationdeladressedeJeanDUPONT. OnveutdterminerlenometleprnomdetouslesclientsdenomDUPONT. 8.DonnerlasignatureetmontrercommentutiliserunalgorithmechercherNompourrsoudreceproblme. Ondoitpouvoirenregistrermoinsde1000clientsdansletableau. 9.Commentmarquerlafindesdonnesvalides ? Desclientssontrgulirementajoutsoueffacsdutableau. 10.Commentindiquerdansletableauquunecasetaitoccupeparunclientquiateffac ? Danslesquestionssuivantes,ondemandeseulementlasignaturedelalgorithmersolvantleproblmeetlesinstructions quimontrentcommentlutiliser. 11.RechercherlapositiondupremierclientenregistrhabitantLEMANS. 12.diter(cestdirecrirelcran)lenumro,lenometleprnomdetouslesclientshabitantLEMANSetprnomms Alain. Lexercicesuivantproposequelquesdveloppementsdalgorithmesdansledomainedugraphique.Bienentendu,tout celarestemodeste,maisonpeutimaginerquelactivitproposeestenrelationdirecteaveclesalgorithmestudis pourprsenterdesgraphiquesetdesdessins. Exercice12:Dessins Unpointgomtriqueestreprsentparunestructurededonnesquipermetdedfinirsonabscisseetsonordonnedans unreprecartsienduplan.Unsegmentestdfinipardeuxpointsquisontsesextrmits. 1.DfinirlestypesPOINTetSEGMENT. Un vecteur gomtrique est aussi dfini par ses deux composantes, lune correspondant son abscisse, lautre son ordonne. 2.DfinirletypeVECTEUR. 3.crirelaprocdurequipermetdefairesubirunpointdonnunetranslationdevecteurdonn. 4.crirelafonctionquirendladistancedunpointloriginedurepre. 5.Gnraliserlafonctionprcdenteencrivantlafonctionquiretournelalongueurdunsegment. Un polygone est dfini par les points qui forment ses sommets. On peut, par exemple, dfinir un polygone laide dun tableaudepoints.Cenestpaslameilleurefaondedfinirunpolygone,maiscelasuffitpourunepremireapproche. 6.DfinirlestypesPOLYGONE,RECTANGLE,LOSANGE,CARR,TRIANGLE. Remarquezquun rectangle, un losange et un triangle sont aussi des polygones. Un carr est un losange, mais aussi un rectangle... Ondonneunpolygone. 7.crirelafonctionquiretournesonprimtre.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

86

Notesbibliographiques
Denombreuxlivresetarticlestraitentdesstructuresdedonnes.Cestmmelaproccupationcentraledesouvrages dontlesujetestlalgorithmique.Onpeutciter,parexemple,[BM83],[CB84],[CV75]...pourunpointdevuestrictement algorithmique, ou [CAR97] pour des exemples rsolus et programms dans diffrents langages, comme JAVA, ADA, C++... Peu douvrages rcents, abordables pour une premire initiation, sintressent aux raisonnements de lalgorithmique.Lelivrequevousliseznesintressepasauxstructuresdedonnes,maisbienauxraisonnementsqui permettentdeconstruiredesalgorithmessimples.Lesstructureslmentairesnapparaissenticiquecommesupport, commeprtextelanalysedalgorithmes.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

87

Rsum
Cechapitreaprsentquelquesnotionslmentairessurladfinitionalgorithmiquedestructuresdedonnes.Une structurededonnespermetdedclareretdutiliserdesvariablesdontlesvaleurssontdesinstancesdutypedfini par la structure. Une telle instance est faite dattributs, qui sont des instances des types de base ou dautres structures,etdoprationsapplicables.Nousavonsgalementtudiplusparticulirementlachanedecaractresqui permetdedfiniretdoprersurdesdonnestextuellesetletableauquipermetdedfinirdesvariablesregroupant sousunmmenomunmultiensembledevariablesdemmetype.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

88

Bibliographie
[BM83] JeanClaude BOUSSARD, Robert MAHL : Programmation avance Algorithmique et structure de donnes EYROLLES,1983. [CB84]G.CLAVEL,J.BIONDI :Introductionlaprogrammation Tome2 :Structuresdedonnes MASSON,1984. [CV75] Jacques COURTIN, Jacques VOIRON : Introduction lalgorithmique et aux structures de donnes 2 tomes InstitutUniversitairedeGrenoble,Dpartementdinformatique,1975. [CAR97]ChristianCARREZ :StructuresdedonnesenJava,C++etAda95 InterEditions,1997. [LIS01]BarbaraLISKOV ProgramDevelopmentinJava ADDISONWESLEY,2001. [MEY00]BertrandMEYER :Conceptionetprogrammationorientesobjet EYROLLES,PARIS,2000.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

89

Introduction
Cechapitreestlepremierquiintroduitlanotionderptitiondanslestraitementsdesdonnes.Cependant,alorsque dans les chapitres prcdents, les changements dtats du systme sobtenaient par des instructions qui disaient explicitement les modifications faire subir aux donnes, ils sobtiennent ici en donnant une dfinition de ces changements.Enparticulier,lestraitementsnutilisentpaslinstructiondaffectation,saufmarginalement,pourdonner unevaleurlapseudovariableRsultatafindeprcisercequecalculeetretournelafonction. La deuxime section introduit la rcursivit dans les traitements sur les chanes de caractres. On montre ce quest une dfinition rcursive et on applique ce type de dfinition la spcification dalgorithmes sur les chanes de caractres. La section suivante donne quelques exemples de spcifications ou de traitements rcursifs sur les nombres. La quatrime section, enfin, traite dun problme que lon rencontre souvent : ldition dun nombre o il sagit de transformer un nombre donn pour obtenir les caractres qui reprsentent sa valeur dans une base de numrationdonne.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

90

Introductionlarcursivit:leschanesdecaractres
La rcursivit est introduite dans cette section comme une mthode gnrale de spcification algorithmique des algorithmes. Cette phrase est dj, en soi, une phrase qui nonce une proprit rcursive : la spcification dun algorithmeestunalgorithme. Lapremirepartieprsentelarcursivitsurunexemplesimple :ladfinitiondunmotdulangage.Ladeuximepartie tudiedesexemplesdespcificationsrcursivesdalgorithmesdetraitementsurleschanesdecaractres.Latroisime partie donne la solution complte de quelques exercices instructifs et la dernire, enfin, propose de rsoudre divers exercicesdontlasolutionnestpasdveloppe.

1.Prsentationdelarcursivit
Considronsunmot.Unmotestunechanedecaractresdelongueurfinie.Poursimplifiercetexpos,onserestreint auxmots,delalangueoupas,critsenminusculesetsanscaractreaccentu:maison,poisson,voituresontdes exemples de mots qui nous intressent. cole,Maison, lection sont exclus, du fait des caractres accentus ou desmajusculesquilscontiennent. Commentdonnerunedfinitionformelledunmot ? Ilsagitdedonnerunedfinitionquisappliqueunmotquelconque,sansaccentnimajuscule,commeonladit.Ilest possibledendonnerladfinitionsuivante : Dfinition1 Unmotestsoituncaractre,soituncaractresuividunmot. Autrementdit,unmot,choisiparmiceuxauxquelsonserestreint,estsoitunechanedecaractresrduiteunseul caractre ou sinon, une chane de caractres constitue dun premier caractre suivi dun autre mot. Ainsi, par exemple,lemotmaisonestconstituducaractremsuividumotaison.Lemotaisonestformdeasuividumot ison...Ilsuffitdedire,prsent,cequestuncaractre.Onpeutdfiniruncaractreparunenumration : Dfinition2 Uncaractreestunlmentdelensemble{a,b,...,z}. Cequiestremarquabledansladfinitiondunmot,cestquelleutilise motpourledfinir.Cettedfinitionnestpas circulaire : tant donne une chane de caractres ch de longueur finie, il est toujours possible de dcider, en appliquantcettedfinition,sichestunmotounon. Exemple Appliquer cette dfinition la chane de caractres lvre pour dterminer si elle est un mot au sens de la dfinition ci dessus. lvreestconstitueducaractrelsuividelachanevre. Lachanevreestconstituede suividelachane vre,maisnestpasuncaractredaprsladfinition2donneparnumration,plushaut.Parconsquent,lvre nestpasunmotdaprsladfinition1. Exemple Lachanedecaractrespasestelleunmot ? Elleestconstituedepquiestuncaractreselonladfinition2,suividelachaneas.Celleciestfaiteducaractre asuividelachanesetsestaussiuncaractreselonladfinition2.Parconsquent,pasestunmot. Remarquezaussiquelachanecandidatedoitavoiraumoinsuncaractre :CHANE_VIDEnestdoncpasunmot.De mme,NULnestpasuncaractre. tant donne cette dfinition, peuton crire un prdicat qui reconnat si une chane donne est un mot ? Cest possibleen copiant ladfinitionprcdente. Onobservedabordlepremiercaractredelachaneet,silestleseul,onpeutconclure : l o n g u e u r (ch) = 1 => R s u l t a t = e s t C a r a c t r e (p r e m i e r (ch)) Lafonctionpremierretournelepremiercaractredelachanequellereoitenparamtre.Elleseradfinieplustard.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

91

LeprdicatestCaractrerendVRAIsietseulementsileparamtreestuncaractreautoris.Ainsi,lorsquelepremier caractredelachane,quiestaussileseul,estuncaractreausensdeladfinition2,estCaractrerendVRAIet cestcettevaleurquedoitprendreRsultat. Lorsquelachaneestfaitedeplusieurscaractres,onvrifiequelepremiercaractreestautorispuisquelereste delachaneestunmot : longueur(ch) > 1 => Rsultat = ( estCaractre(premier(ch)) et alors estMot(fin(ch)) ) Lafonctionfinretournelachane,quellereoitenparamtre,privedesonpremiercaractre.Elleaussiseradfinie prcismentplustard. Ladfinition1ditquuncaractreautorisestunmot.Nousnepouvonspascriredirectement : # DBUT DE SOLUTION INCORRECTE !!! longueur(ch) > 1 => Rsultat = ( estMot(premier(ch)) et alors estMot(fin(ch)) ) # FIN DE SOLUTION INCORRECTE puisque estMot attend une chane de caractres en paramtre, mais premier rend unCARACTRE. Lutilisation de estMotaveclersultatdepremiercommeparamtreestincorrectecarellenerespectepaslesconditionsdusagede estMotprcisesdanssesspcifications.Finalement,onobtientlalgorithmesuivant : Algorithme1:Reconnatreunmot:estMotVersion1.0

Algorithme estMot # ch est-il un mot ? Entre ch : CHANE Rsultat : BOOLEN prcondition chNUL longueur(ch)1 postcondition longueur(ch)=1=>Rsultat=estCaractre(premier(ch)) longueur(ch)>1=>Rsultat= ( estCaractre(premier(ch)) et alors estMot(fin(ch)) ) fin estMot Il ny aura pas daffectation dans la ralisation, cestdire pas dordre excuter, sauf peuttre, dune faon marginale,causedesconventionsdenotation,laffectationdunevaleurlapseudovariableRsultatpourindiquer lersultatcalculetrenduparlafonction. La ralisation de lalgorithme est simple : elle ne fait que copier la spcification qui, ellemme, ne fait que traduire dunefaonalgorithmiquelesdfinitionsdonnesplushaut.Cetteralisationestlasuivante : ralisation si longueur(ch)=1 alors Rsultat<estCaractre(premier(ch)) sinon Rsultat< ( estCaractre(premier(ch))

- 2-

ENI Editions - All rigths reserved - Jonifar lina

92

et alors estMot(fin(ch)) ) fin si Ainsi, cet algorithme ne dit pas comment calculer le rsultat, mme dans sa ralisation. Il ne fait quen donner une dfinition.Pourcela,ilutilisesespropresservices,surlammechanedecaractres,maispartirduncaractrede numro suprieur. Une dfinition qui fait appel un concept pour le dfinir, comme la dfinition 1 dfinit mot en utilisantmot,estunedfinitionrcursive.Demme,unalgorithmequiappellesespropresservicesestunalgorithme rcursif. Dfinition3 Onditdunalgorithmequilestsimplementrcursiflorsquilsappelleluimmepourralisersescalculs. Ilexistedesformespluscomplexesdercursivitquenousaborderonsultrieurement. RemarquezcommentestconstruitelapostconditiondeestMot.Ellecommencepardonnerlersultatlorsquelachane decaractresestfaiteduncaractreunique.Lachaneestunmot,selonladfinition1,sisonuniquecaractreest un caractre dfini dans lnumration de la dfinition 2. Ce cas de chane de longueur 1 est le cas particulier qui permetderendreimmdiatementlersultat.Lorsquelachaneestfaitedeplusieurscaractres,lersultatprendla valeurVRAIsilepremiercaractreestuncaractreacceptable,ausensdeladfinition2,etsilachane,privedece premiercaractre,estaussiunmot.Cestexactementladfinition1.chaqueessaideestMot,lachaneestampute desonpremiercaractre.Lalongueurdeschanesanalysesdcrotstrictementduneunit.Parconsquent,comme unechaneest,pardfinition,delongueurfinie,unnombrefinidoprationsconduitunechanedelongueur1cequi terminelalgorithme.Ilestmmepossiblededonnerunmajorantexactdunombredoprationsautermedesquelles lalgorithmeproduitsonrsultat :cestlongueur(ch).Ainsi,lalgorithmesetermineavecunechanedelongueur1et tout instant, cestdire dans chaque tat du systme logiciel, le nombre dtats qui reste parcourir est gal, au plus,lalongueurdelachanersiduelle. Rsumons :lalongueurdelachaneestunentierfini,quidcrotstrictementduneunitchaqueappeldelafonction et qui est minor par une longueur gale 1. Cette analyse prouve que lalgorithme se termine en un nombre fini dtapes. Ainsi, lalgorithme converge vers le rsultat, mais nous avons appris quelque chose dessentiel ici : nous savons mesurer le nombre maximum dtats visiter avant dobtenir le rsultat. Cest, au plus, la longueur de la chane rsiduelledansltatconsidr. Exercice1:Nouvelledfinitiondunmot Onmodifieladfinition1dunmotenacceptantCAR_VIDEparmilescaractresautoriss. 1.Redfiniruncaractre. 2.Estilncessairederedfinirunmot? 3.RefaireestMot. Exercice2:Dfinitiondunnombreenlettres Onveutcrireunprdicatquireconnatsiunechanedecaractresestlareprsentationenbasedixdunnombreentier positifounul. 1.crireladfinitionduntelnombre. 2.Donnerlaspcificationdunalgorithmequireconnatunnombreseloncettedfinition. Remarquezquunnombreiciestunechanedecaractres.Ilestdoncpossiblededfinirunnombreensinspirantde la dfinition 1 : un nombre est un caractre ou un caractre suivi dun nombre. Il reste alors prciser la dfinition duncaractre :cestunlmentde{0, 1, ..., 9}.

2.Quelquesexemplesdespcificationsrcursives
Le chapitre Structures lmentaires a commenc ltude de la dfinition du prdicat estDans qui dtermine si un caractre compose une chane donne. Dans cette section, nous tudions une version de la ralisation de cette fonction.Lechapitresuivanttudieraunenouvelleversion.Lasectionsuivantedveloppedesexemplescompletset laderniresectionproposedesexercicesdapplication. LasignaturedeestDanstaitlasuivante : AlgorithmeestDans

ENI Editions - All rigths reserved - Jonifar lina

- 3-

93

# car est-il un caractre qui compose ch entre les caractres # de numros dbut et fin ? Entre ch:CHANE # La chane explorer. dbut,fin:ENTIER # Les numros des caractres de lintervalle # dexploration. car:CARACTRE # Le caractre chercher. Rsultat : BOOLEN prcondition chNUL carNUL index_valide(ch,dbut) index_valide(ch,fin) On peut dabord remarquer que, lorsque dbut > fin, le domaine de recherche est vide et, par consquent, le prdicatrendFAUX : dbut > fin => R s u l t a t = FAUX Lorsquelintervalledexplorationestrduitunseulcaractre,ilsuffitdevrifierquececaractreestgalounonau caractrecherch.Lintervalleestrduitunseulcaractrelorsquedbut = fin.Pourdterminersicarestceseul caractre,ilsuffitdelecomparerunecopieobtenuelaidedelafonctionitem : si car=item(ch,dbut) alors carestlecaractredenumrodbutdansch. sinon carnestpaslecaractredenumrodbutdansch. fin si Commelersultatestunboolen,VRAIsietseulementsicarestdansch,cecisesimplifieen : dbut = fin => R s u l t a t = (car = i t e m (ch, dbut)) Lorsquedbut<fin,lersultatestVRAIsicarestlecaractredenumrodbutousinon,sicarestdanslerestede lachane,entrelescaractresdenumrosdbut+1etfin. dbut<fin=>Rsultat= ( (car=item(ch,dbut)) ou sinon (estDans(ch,dbut+1,fin,car)) ) Cettedfinitionutiliseleprdicatpourledfinir.LapostconditionutiliseestDanspourdirecequilfait :onregardesi carestlepremiercaractredudomaineexplorer.Sicenestpaslecas,onregardesilestdansledomaine,mais priv du premier caractre, en utilisant encore estDans. chaque appel, le domaine explorer est rduit de son premiercaractre.Parconsquent,lenumrodupremiercaractreobserverdanschaugmenteenserapprochant delavaleurdefin.Cetteexplorationterminerapuisquelaclause : dbut = fin => R s u l t a t = (car = i t e m (ch, dbut)) terminelexplorationsicarnestpastrouvavant.Lexpressionentreparenthses : (car = i t e m (ch, dbut)) est une expression boolenne qui prend la valeur VRAI si et seulement si le caractre car est gal au caractre numrodbutdechdontitemraliseunecopie.Lexpression : R s u l t a t = ... estaussiuneexpressionboolennequirendVRAIsietseulementsilapseudovariableRsultatestgalelavaleur rendueparlexpressionprcdente. Pourcomprendrelefonctionnementdecettespcification,dtaillonslexempleprsentplushaut,oloncherchea danslaphraseIlfaitbeau.,entrelescaractresdenumro4et10.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

94

Premierappel: estDans(Ilfaitbeau.,4,10,a) dbut=4<fin=10=>Rsultat= ( (a=item(Ilfaitbeau.,4)) ou sinon (estDans(Ilfaitbeau.,5,10,a) ) Onadonc: i t e m (Il fait beau., 4) = f a. Deuximeappel: estDans(Ilfaitbeau.,5,10,a) dbut=5<fin=10=>Rsultat= ( (a=item(Ilfaitbeau.,5)) ou sinon (estDans(Ilfaitbeau.,6,10,a) ) Onadonc: i t e m (Il fait beau., 5) =a et,parconsquent,lesecondappel:estDans(Ilfaitbeau.,5,10,a)retourneVRAI.Enreportantcequivient dtreobtenudanslepremierappel,nousobtenons : dbut=4 < fin=10 => R s u l t a t = (FAUX o u s i n o n VRAI) Ainsi,lersultatrenduparlalgorithmeestVRAI,signifiantqueaattrouvdansIlfaitbeau.entrelecaractrede numro4etlecaractredenumro10. Cependant, nous navons rien dit dune recherche dans une chane vide.Que se passetil si ch est la chane vide ? Cettequestionestellesansobjet,autrementdit,leraisonnementprcdentinclutilcecasoudoitonseproccuper dececasmarginal? Lorsquelachanecibledelarechercheestvide,onadbut=fin=0puisquelaprconditionestsatisfaiteousinonla fonctionnestpasexcute.Onsetrouvedoncdanslecasdunarrtducalculetlersultatobtenuest : car = i t e m (CHANE_VIDE, 0) = CAR_VIDE Parconsquent,lafonctionrendVRAIlorsquelleestappeleaveccar=CAR_VIDEsurunechanevideetFAUXsinon. Finalement,enrassemblantcequenousavonsmisaupoint,onobtientlalgorithmecidessous : Algorithme2:estDansVersion1.0 AlgorithmeestDans # car est-il un caractre de ch entre les caractres de numros # dbut et fin ? Entre ch:CHANE # La cible de la recherche. dbut,fin:ENTIER # Lintervalle de recherche. car:CARACTRE # Le caractre cherch. Rsultat : BOOLEN prcondition carNUL chNUL index_valide(ch,dbut) index_valide(ch,fin) postcondition

ENI Editions - All rigths reserved - Jonifar lina

- 5-

95

dbut>fin=>Rsultat=FAUX dbut=fin=>Rsultat=(car=item(ch,dbut)) dbut<fin=>Rsultat= ( (car=item(ch,dbut)) ou sinon (estDans(ch,dbut+1,fin,car)) ) fin estDans Laralisationestclaire : ralisation si dbut>fin alors Rsultat<FAUX sinon si dbut=fin alors Rsultat<(car=item(ch,dbut)) sinon Rsultat<estDans(ch,dbut+1,fin,car) fin si Onregardesilecaractrecherchestceluidenumrodbut.Sinon,onlechercheentredbut + 1etfin. Remarquezlesdeuxderniresclausesdelapostcondition.Lapremiredonnelersultatcalcullorsquedbut = fin. Lasecondeindiquelersultatcalcullorsquedbut<fin.Cependant,danscedeuximecas,onobservedenouveau lepremiercaractre,celuidenumrodbut.Peutonsimplifieretcriredanscecas : # SOLUTION FAUSSE ! postcondition Rsultat=estDans(ch,dbut+1,fin,car) # FIN DE LA SOLUTION FAUSSE. Lide, ici, est que, comme dbut fin pour les deux dernires clauses de la postcondition, il suffit dobserver le premiercaractre,celuidenumrodbut,puisceuxquirestentlorsquelepremiertestchoue. Pouvezvousexpliquerpourquoicettesolutionestfausse ? Cetteclausemodifiecorrespondaucasdbut<fin.Silecaractrecherch,cestdirecar,estlepremiercaractre delachane,lapostconditionnele dcouvre paslorsquedbut<fin.

3.Exercicesrsolus
Exercicersolu1:Inverserunechanedecaractres Inverser une chane de caractres, cest construire la chane de caractres gale limage miroir de la chane de dpart. Autrementdit,onveutobtenirlachanedecaractresquiestgalelachanededpartquandonlalitdedroitegauche. Ainsi,parexemple,linversiondebilledonneellib. Dfinirunalgorithmequiinverseunechanedecaractres. Solution Ondonneunechanech.Onveutconstruirelachanegalesonimagemiroir.Ainsi,parexemple,lorsquech = Nol onobtientRsultat=loN. Onremarquedabordque,lorsquelachaneinitialechestvide,oulorsquelleestrduiteunseulcaractre,elleest galesoninverse.Cestlaconditiondeterminaisondelarcursion: s i l o n g u e u r (ch) < 2 a l o r s R s u l t a t <- ch s i n o n ? ? ? f i n s i Le bloc de lalternant qui commence sinon indique comment inverser une chane qui comporte au moins deux caractres.Commentfaire ?Nousdisposonsdedeuxstratgiesquivalentes :

- 6-

ENI Editions - All rigths reserved - Jonifar lina

96

(s1): (i) :extrairelepremiercaractre:Nol (ii) :inverserlerestedelachane:lo (iii) :recomposerunechaneenplaantlepremiercaractredroite:loN. (s2): (i) :extrairelederniercaractre:Nol (ii) :inverserlerestedelachane:oN (iii) :recomposerunechaneenplaantlederniercaractregauche:loN. Pourchacunedecesmthodes,ladeuximetapeconsisteinverserunechanequiauncaractredemoinsquech. Ilsuffitdoncdutiliserlesservicesdummealgorithmeetainsi,chaqueappeldelalgorithmedinversion,lalongueur de la chane traiter diminue strictement dune unit. Comme la chane traiter est de longueur finie, la longueur atteindra 1 et lalgorithme se terminera. ce stade, nous avons une stratgie complte de rsolution du problme pos : inverser(ch:CHANE):CHANE # Limage miroir de ch. prcondition chNUL ralisation si longueur<2 alors Rsultat<ch sinon Rsultat<(limagemiroirdechprivedesonpremier caractre,augmentedroitedupremiercaractredech) fin si postcondition Rsultat=(limagemiroirdech) fin inverser Notons fin la fonction qui rend une chane gale son argument, mais prive de son premier caractre. Ainsi, par exemple,fin(Nol)=ol. Sasignatureest : Algorithmefin # la copie de ch sans son premier caractre. Entre ch:CHANE Rsultat:CHANE Onaccdeunecopiedupremiercaractredunechaneenutilisantlafonctionitem : premier <- i t e m (ch, i n d e x _ m i n (ch)) Pour simplifier les notations, on peut appeler premier la fonction qui rend une copie du premier caractre de son argument.Ona : Algorithme3:Dfinitiondepremier Algorithmepremier # Le premier caractre de ch. Entre ch:CHANE Rsultat:CHANE prcondition chNUL postcondition Rsultat=item(ch,index_min(ch)) fin premier

ENI Editions - All rigths reserved - Jonifar lina

- 7-

97

Cependant, nos stratgies de calcul prvoient, ltape (iii), la recomposition de deux chanes de caractres, alors quepremierrendunCARACTRE.Ilfautdoncconvertirenunechanelepremiercaractreobtenultape(ii)avant de raliser la recomposition. Soit chane la fonction qui prend un caractre en argument et qui rend la chane ne contenantquececaractre.Cettefonctionadjtdfinieauchapitreprcdent. Dans chaque stratgie, le rsultat est recompos, ltape (iii), en plaant deux chanes de caractres bout bout ,luneaprslautre.Unetelleoprationestappelelaconcatnationdeschanesdecaractres.Pournoterla concatnationdedeuxchanesch_1etch_2,onpeututiliserlanotationfonctionnelle : R s u l t a t <- c o n c a t n e r (ch_1, ch_2) Cependant,lesnotationssontmoinslourdesetpluslisiblesenutilisantunoprateurinfixe,disons,commepourune addition : R s u l t a t <- ch_1 ch_2 Ainsi,parexemple, Bon jour = Bonjour Ladfinitiondelalgorithmedeconcatnationestlasuivante : Algorithme4:Dfinitiondelaconcatnationdeschanesdecaractres Algorithmeconcatner,infixe # La chane faite des caractres de ch_1 suivis de ceux de ch_2. Entre ch_1, ch_2 : CHANE Rsultat : CHANE prcondition ch_1 NUL ch_2 NUL postcondition longueur(ch_2) = 0 = > Rsultat = ch_1 longueur(ch_2) 0 = > Rsultat = ( ch_1 gauche de chane( premier( c h _ 2 ) ) fin(ch_2) ) fin concatner Autrement dit, le rsultat est ch_1 lorsque ch_2 est vide. Cest ch_1 augmente du premier caractre de ch_2, concatneaveclafindech_2.Chaqueinvocationdelalgorithmeapoureffetdeplacerunnouveaucaractredroite dursultatpartielobtenulappel prcdent. Ce nouveau caractre est une copie du premier caractre du second argument. Cette imbrication dappels se termine puisque la longueur des chanes en second argument diminue chaqueappel. Il est aussi possible dtendre le type CARACTRE en lui donnant lopration de concatnation. Concatner deux caractres, cest former la chane faite des deux caractres concerns. Ainsi, par exemple, c_1 c_2 = ab lorsque c_1=a et c_2= b. Cest une opration externe en ce sens quelle rend un rsultat, une chane de caractres, qui nappartient pas au domaine de c_1 et c_2 qui sont des caractres. Cependant, cette nouvelle opration nestpas strictementncessairepuisquilestprsenttoujourspossibledetransformerdaborduncaractreenchane,donc de transformer dabord c_1 et c_2 en deux chanes de caractres, puis de les concatner en utilisant lopration applicableauxchanes: variable c_1, c_2 : CARACTRE ch_1, ch_2, ch : CHANE ... # Transformer c_1 et c_2 en chanes. ch_1 <- chane(c_1) ; ch_2 <- chane( c _ 2 ) # Former la chane rsultat de la concatnation. ch <- ch_1 ch_2 ... Nous disposons prsent de tout ce dont nous avons besoin pour dfinir compltement la fonction inverse. Cest lalgorithme5.

- 8-

ENI Editions - All rigths reserved - Jonifar lina

98

Algorithme5:DfinitiondeinverseVersion1.0 Algorithm inverse e # Limage miroir de ch. Entre c h : CHANE Rsultat : CHANE prcondition ch NUL postcondition longueur(ch) < 2 = > Rsultat = ch longueur(ch) 2 = > Rsultat = ( inverse( fin( c h ) ) chane( premier( c h ) ) ) fin inverse tudionsle fonctionnement decetalgorithmesurunexemple. inverse( abc ) inverse( abc ) inverse( abc ) inverse( abc ) inverse( abc ) = = = = = inverse( bc ) a ( inverse( c ) b ) a ( c b ) a cb a cba

Laralisationdeinverseestsimple : ralisation si longueur(ch) < 2 alors Rsultat <- ch sinon Rsultat <- inverse( fin( c h ) ) chane( premier( c h ) ) fin si Exercicersolu2:Positionduncaractredansunechane Ondonneunechanedecaractreschetuncaractrecarquelconque. Quelleestlapositiondecardansch? Solution Lapositionducaractreestsonnumrodanslachane.Ainsi,parexemple,aveclesdclarations : variable phrase : CHANE[5] <- I l f a i t b e a u . car_1 : CARACTRE <- f car_2 : CARACTRE <- z onobtientlesrsultats : position(phrase, car_1) = 8 position(phrase, car_2) = ??? Lafonctionrend8pourlecaractrefpuisquelescaractresdephrasesontnumrotspartirde5.Ilfautconvenir dunrsultatlorsquelecaractredontoncherchelapositionnestpasunconstituantdelachane.Ilestpossiblede commencerparunefonctionquinestdfiniequepourdescaractresdontonsaitquilscomposentlachane : ... prcondition ch NUL
ENI Editions - All rigths reserved - Jonifar lina - 9-

99

car NUL appartient( c h , c a r ) LesousalgorithmeappartientestunprdicatquirendVRAIsietseulementsilecaractrecarestunconstituantde lachanech.IlatdfiniauchapitreStructureslmentaires.Ainsi,ledeuximecasdelexempleprcdentnepeut plus se produire, mais il faut tre certain que car compose la chane ch et donc sen assurer indpendamment de position,avantdutilisersesservices. Soit alors rang le fonction qui donne la position dun caractre dans une chane, mais recherche partir dun caractrequinestpasncessairementlepremier.Nousavonsdjtudiunemthodesimilaireaveclesfonctions appartientetestDans.Lafonctionpositionscrit : Algorithme6:FonctionpositionVersion1.0 Algorithm position e # Le numro de car dans ch. Entre c h : CHANE c a r : CARACTRE Rsultat : ENTIER prcondition ch NUL car NUL appartient( c h , c a r ) ralisation Rsultat <- rang( c h , index_min( c h ) , index_max( c h ) , c a r ) postcondition car = item( c h , Rsultat) fin position La postcondition prcise que le caractre recherch, car, est le caractre obtenu par copie de celui en position Rsultatdansch.tudionsprsentlafonctionrang. Lasignatureetlaprconditiondecettefonctionsont : rang( c h : CHANE ; d b u t , f i n : ENTIER ; c a r : CARACTRE) : ENTIER # Le numro de car prsent dans ch entre les caractres # de numros dbut et fin. prcondition ch NUL car NUL estDans( c h , d b u t , f i n , c a r ) index_valide(ch, dbut) index_valide( c h , f i n ) dbut fin Avecceshypothses,lerangdecarestdbutlorsquilestlepremiercaractredelapartiedelachaneobserve : postcondition car = item(ch, dbut) = > Rsultat = dbut ... Lorsquil nest pas le premier caractre, il est donc prsent dans la chane constitue des caractres de numros comprisentredbut + 1etf i n : car i t e m (ch, dbut) => R s u l t a t = r a n g (ch, dbut+1, fin, car) Lenombredtatsvisitslorsdecetterechercheestmajorparf i n - dbut + 1,quiestlenombredecaractresde la partie de la chane observer. Chaque appel de rang rduit cette distance la solution dune unit. Par consquent, lalgorithme termine avec un rsultat tel que dbut Rsultat fin. Les spcifications compltes de lalgorithmerangsont: Algorithme7:SpcificationsderangVersion1.0 Algorithm rang e

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

100

# Le numro de car prsent dans ch entre les caractres # de numros dbut et fin. Entre c h : CHANE c a r : CARACTRE d b u t , f i n : ENTIER Rsultat : ENTIER prcondition ch NUL car NUL estDans( c h , d b u t , f i n , c a r ) index_valide(ch, dbut) index_valide( c h , f i n ) dbut fin postcondition car = item(ch, dbut) = > Rsultat = dbut car item(ch, dbut) = > Rsultat = rang(ch, dbut+1, fin, car) fin rang Il est possible de relcher la contrainte impose par la troisime clause de la prcondition. Dans ce cas, on veut dterminer le rang dun caractre dont on ne sait pas sil compose la partie de la chane cible de la recherche. Sil composecettepartiedelachane,noussommesramensaucasprcdent sinon,ilfautconvenirdunrsultatqui signeralabsenceducaractre.Unranginvalidepouruncaractredunechanechestunrangstrictementinfrieurou strictementsuprieurauxindexminimumetmaximumrespectivement.Convenonsquelafonctionrenvoielavaleurde laconstantegaleindex_min(ch)1lorsquelecaractrenestpastrouv. Lorsquelecaractrecherchestlepremier,leraisonnementestlemmequeprcdemment sinon,ilfautsparer les cas et dterminer sil est prsent ou non dans la chane. Silappartientlachanesanstrelepremier,onest revenuaucasprcdent.Silnappartientpaslachane,lafonctionrendlavaleurconvenue.Ilestdoncpossiblede donnerlesspcificationsdeladeuximeversionderang : Algorithme8:SpcificationsderangVersion2.0 Algorithm rang e # Le numro de car sil est prsent dans ch entre les caractres # de numros dbut et fin. ABSENT sil ny est pas. Entre c h : CHANE c a r : CARACTRE d b u t , f i n : ENTIER Rsultat : ENTIER constante ABSENT : ENTIER <- index_min( c h ) - 1 prcondition ch NUL car NUL index_valide(ch, dbut) index_valide( c h , f i n ) postcondition non estDans(ch, dbut, fin, car) = > Rsultat = ABSENT estDans( c h , d b u t , f i n , c a r ) et alors ( item(ch, dbut) = car = > Rsultat = dbut ou sinon item(ch, dbut) car = > Rsultat = rang(ch, dbut+1, fin, car) ) fin rang IlnestpasncessairedutiliserleprdicatestDanspourspcifiercetalgorithme.Lapostconditiondevientalors : ... postcondition dbut = fin = > ( item(ch, dbut) = car = > Rsultat = dbut ou sinon

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

101

...

item(ch, dbut) car = > Rsultat = ABSENT ) dbut < fin = > ( item(ch, dbut) = car = > Rsultat = dbut ou sinon Rsultat = rang(ch, dbut+1, fin, car) )

Cette fonction permet donc de dterminer la position dune occurrence quelconque dun caractre dans une chane. Cestsouventutile,commedanslexercicesuivant : Exercice3:Nombredemots On donne une phrase. Compter les mots de cette phrase. Pour simplifier le problme, on suppose quune espace unique sparedeuxmotsetquecestleseulsparateurquidistinguelesmots. crireunalgorithmequicomptelesmotsdunephrase. Les hypothses proposes simplifient beaucoup le problme. Ainsi, par exemple, on suppose que lon ne rencontre pasdephrasecommeVoicideuxexemples :lepremier...danslaquellelestroiscaractres : sparentdeuxmots. Simplifions encore le problme, en supposant que la phrase tudie est bien forme , cestdire quelle ne comporte pas despace en dbut et en fin et quelle na pas despace redouble. Avec ces hypothses, compter le nombredemots,cestcompterlenombredespaces : nombreDeMots <- nombreEspaces + 1 Leproblmesimplifiseramnedonccompterlesespacesdunephrasebienforme. # Compter les mots dune phrase bien forme. nom breDeMots <- nombreEspaces ( phrase, # La cible du comptage index_min( p h r a s e ) , # Numro du premier caractre observ. index_max(phrase) # Numro du dernier caractre observ. ) + 1 Cependant,compterlesespacesestlemmeproblmequecompteruncaractrequelconque.Onobtientdoncune solutionplusgnraleenremplaantlafonctionnombreEspacesparunefonctionnombreDeCaractres qui compte lesoccurrencesduncaractrequelconque. # Compter les mots dune phrase bien forme. constante ESPACE : CARACTRE <- nom breDeMots <- nombreDeCaractres ( phrase, # La cible du comptage index_min( p h r a s e ) , # Numro du premier caractre observ. index_max( p h r a s e ) , # Numro du dernier caractre observ. ESPACE # le caractre compter. ) + 1 Le dernier paramtre est le caractre dont on compte les occurrences dans la phrase. Oublions alors le problme initial.Onchercheunesolutionauproblmeplusgnralsuivant : Ondonneunechanedecaractreschetuncaractrecar.Faireunalgorithmequidterminelenombredoccurrencesdecar dansch. Noussavonsdjtrouverlapremireoccurrenceduncaractredonndansunechane,laidedelafonctionrang. Lorsque la fonction rend un numro de caractre invalide, cest que le caractre cherch nest pas prsent dans la chane.Onobtientdonc : ... si rang(ch, dbut, fin, car) = ABSENT alors # Pas de car dans ch entre dbut et fin. Rsultat <- 0

- 12 -

ENI Editions - All rigths reserved - Jonifar lina

102

sinon ??? fin si Danslecascontraire,onvientdetrouveruneoccurrencedecarenpositionrang.Lenombretotaldoccurrencesde carestdonccellequelonvientdetrouver,augmentedunombredoccurrences entre rang + 1 et fin. La figure ci dessousillustrecettesituation.

Onvientdedcouvrirunexemplaireducaractrecarcherchenpositionrang.Lapartiequiresteobserverstend depuislecaractredenumrorang+1jusquaucaractredenumrofin.CettepartiecontientnombreDeCaractres (ch,rang+1,fin,car)caractrescherchs.Onobtientdonc : ... sinon Rsultat <- 1 + nombreDeCaractres( c h , r a n g + 1 , f i n , c a r ) fin si ... DoladfinitiondelafonctionnombreDeCaractres: Algorithme9:CompterlesoccurrencesduncaractredansunechaneVersion1.0 Algorithm nombreDeCaractres e # Le nombre doccurrences de car dans ch entre les caractres de # numros dbut et fin. Entre c h : CHANE c a r : CARACTRE d b u t , f i n : ENTIER Rsultat : ENTIER prcondition ch NUL car NUL index_valide(ch, dbut) index_valide( c h , f i n ) constante ABSENT : ENTIER <- index_min( c h ) - 1 ralisation si rang(ch, dbut, fin, car) = ABSENT alors # Pas de car dans ch entre dbut et fin. Rsultat <- 0 sinon Rsultat <- 1 + nombreDeCaractres( c h , r a n g + 1 , f i n , c a r ) fin si postcondition rang(ch, dbut, fin, car) = ABSENT = > Rsultat = 0 rang(ch, dbut, fin, car) ABSENT = > Rsultat = 1 + nombreDeCaractres( c h , r a n g ( c h , d b u t , f i n , c a r ) + 1, fin, car) fin nombreDeCaractres

ENI Editions - All rigths reserved - Jonifar lina

- 13 -

103

4.Exercices
Exercice4:Transformationdesminusculesenmajuscules On donne un texte dont certains caractres sont des majuscules, dautres sont des minuscules, dautres enfin des caractresquinesontpasalphabtiques,commedeschiffres,dessignesdeponctuation... 1.crireunalgorithmequitransformetouslescaractresminusculesenmajuscules. On pourra supposer que lexercice ne concerne que le parcours du texte. Ainsi, on accepte que les modules logiciels ncessaireslareconnaissancedestypesdecaractresetlatransformationduneminusculeenmajusculesontconnus etfontpartiedurpertoiredinstructions.Ilsontdailleursdjtpropossenexercicesauchapitreprcdent.Peuttre estiltempsdtudierlessolutionsdecesexercicessicelanapasencoretfait,ousinon : 2.Donneraumoinslesspcificationsdesmodulesutiliss. Danslexercicesuivant,onchangelesconventionsadoptesprcdemment.Ilfautdoncbienveillernepasutiliser, pourlersoudre,deshypothsespropresaucontexteprcdent. Uncaractreest,prsent,unnombreentierpositifounul.Danslasuite,uncaractreestdoncconfonduavecson codenumrique.Ledomainedesvaleursduntelentiernestpasprcisdavantage.Onpeutypenserensupposant, parexemple,queledomainedpenddelamachineutilise.LetypededonnesCARACTREpermetdedfinirune variabledetypecaractre. Lun de ces caractres est un code particulier. Il est dsign par FIN_CH. Ce caractre nest jamais un caractre significatifdansunechane.Ilnestutilisquepourmarquerlaterminaisondunechane.Ainsi,toutedonnedetype CHANE contient, comme dernier caractre, celui de code FIN_CH qui en marque la fin. Les caractres dunechane sontnumrotsensquencepartirde1pourlepremieretnousnedisposonspasdesfacilitsdenumrotationdes sectionsprcdentes. Laccesseuritemdfiniprcdemmentrestedisponibledanslerpertoiredinstructions.Cestunefonctionquiprend enentreunechanedecaractresbienforme,cestdiretermineparFIN_CH,etunentiernaturelrang.Ellerend lecaractredelachanequioccupelerangdonn,commedanslessectionsprcdentes. Exercice5:Longueurdunechanedecaractres Onsintresseaucalculdunombredecaractresdunechanedecaractres. 1.Dfinirlasignatureetdonnerlesspcificationsdelafonctionlongueurquiprendenentreunechanedecaractresbien formeetquiretournelenombredecaractresdecettechane. 2.crirelalgorithmercursifdecettefonction. LecaractreFIN_CHnestpascomptcommeuncaractredelachane. Remarquez quil na pas t dit quune chane de caractres est un tableau dentiers, comme en langage C par exemple.Enfait,onneditrienetvousnedevezfaireaucunehypothsesupplmentairesurlimplmentationdune chanedecaractres. Exercice6:Normalisationdunechanedecaractres Normaliserunechanedecaractres,cestladbarrasserdesesespacesinutiles.Uneespaceestinutilelorsquelleestle premier ou le dernier caractre de la chane, ou quelle est redouble dans le corps de la chane. Ainsi, par exemple, la chane : Ilfaitbeauaujourdhui. estnormaliseenIlfaitbeauaujourdhui.. Faireunalgorithmequinormaliseunechanedecaractres. On appelle palindrome un texte qui est le mme que son image miroir. Ainsi, par exemple, les mots LAVAL, non, 26762sontdespalindromes.Autrementdit,unpalindromeselitdedroitegauchecommedegauchedroite. Aveccettedfinition, Lavalounon!nesontplusdespalindromes.Pourlepremier,lamajusculeinitialeetpourle secondlespaceetlepointdexclamationviennentperturberlimagemiroirdumot.Demme,laphraseluparcette crapule serait un palindrome si la majuscule accentue au dbut de la phrase tait la lettre e et si les espaces taientsupprimes.Existetildesphrasespalindromes ?Leproblmeestcompliquparlescaractressparateurs, commelespace,lessignesdeponctuation...Deplus,unephrasebienformeseterminetoujoursparunpoint,mais sonpremiercaractrenestjamaisunpoint,cequirpondlaquestion. Gnralisons donc cette dfinition en ltendant pour simplifier le problme. Un palindrome est recherch parmi les chanes de caractres alphanumriques dont les caractres alphabtiques sont en majuscules, ou en minuscules, commeonvoudra,etdanslesquelleslescaractresaccentusonttremplacsparleursquivalentssansaccent.

- 14 -

ENI Editions - All rigths reserved - Jonifar lina

104

luparcettecrapuledevientELUPARCETTECRAPULEoueluparcettecrapuleetcestunpalindrome. Reconnatreunpalindromeconsistedoncraliserquatretraitementssurletexteanalyser :
q

filtrerletexteafindeneconserverquedescaractresalphanumriques remplacerlescaractresaccentusparleurquivalentsansaccent remplacerchaquecaractrealphabtiqueparsamajusculeousaminuscule vrifierqueletextefiltrestgalsonimagemiroir.

Voiciquelquesexemplesde phrases quisontdespalindromesaprsfiltrage. Exemples


q

soperesteicietserepose luparcettecrapule Laval 1754571 10000000000000000001 Non.

Exercice7:Reconnatreunpalindrome Faireunalgorithmequireconnatunpalindrome.

ENI Editions - All rigths reserved - Jonifar lina

- 15 -

105

Lesnombresetlarcursivit
Les nombres fournissent de nombreux exemples simples de rcursivit. En fait, les dfinitions mathmatiques sont souventrcursives.Cettesectionvousproposequelquesexercicessurcesujet.Ceuxquinepeuventserconcilieravec lesMathmatiquespeuventpasserlasectionsuivante.

1.Arithmtique
Soit lensemble des entiers : = { ..., 2, 1, 0, 1, 2, ...}. On suppose que les seules oprations actuellement dfinies sur sont successeur, qui rend le successeur dun entier dans la liste ordonne de ses lments et prdcesseurlafonctiondualedelaprcdente. Exercice8:Arithmtiquesurlesentiers 1.crirelalgorithmedeladditiondedeuxentiers. 2.crirelalgorithmequirendlopposdunentier. Ladiffrencededeuxentiersestlasommedupremieraveclopposdudeuxime. 3.crirelalgorithmequicalculeladiffrencededeuxentiers. Leproduitdedeuxentierssecalculeeneffectuantuneadditionrpte.Ainsi,parexemple,7x5estlasommede5termes gaux7. 4.crirelesalgorithmesdelamultiplicationetdeladivision. Lexercicesuivantestplusdifficileetpeuttreignorenphasedapprentissage. La fonction de ACKERMANN gnralise est une fonction permettant de calculer, suivant la valeur de lun de ses paramtres,lasomme,leproduitouunepuissancededeuxentiers.Elleestdfinieainsi: A(0, A(1, A(2, A(3, A(n, A(n, a, a, a, a, a, a, b) 0) 0) 0) 0) b) = = = = = = a+1 ; a ; 0 ; 1 ; 2 pour tout n>3 ; A(n-1, A(n, a, b-1), a) sinon.

Ilestalorspossibledevrifierque : A(1, a, b) = a+b ; A(2, a, b) = axb ; A(3, a, b) = ab ; A(4, a, b)= .

Exercice9:FonctiondeACKERMANN crirelalgorithmequicalculelavaleurrendueparlafonctiondeACKERMANN.

2.Factorielleetautresexercicesuss
Sivousavezcruychapper,cestrataveccettesection. Exercice10:Factorielledunentierpositif Soitnunentiernaturel,cestdirepositifounul.Onappellefactorielledelentiern,quelonnoten!,lentierdfinipar : 0! = 1! = 1 ; n! = n x(n-1)x(n-2)x...x2 pour tout n > 1 crirelalgorithmedelafonctionfactoriellequirendn!pourtoutnpositif.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

106

Exercice11:SuitesdeLUCAS LasuitedeFIBONACCIestdfiniepar : u0 = u 1 = 1 ; un = un-1 + un-2 pour tout n > 1 1.crirelalgorithmedecalculdutermedindicen0decettesuite. Lesdeuxpremierstermesdelasuitesontgaux1.Endonnantdeuxvaleursconscutivesauxdeuxpremierstermes,on obtientunesuitedeLUCAS. 2.crirelalgorithmedelafonctionquicalculeletermederangndunesuitedeLUCAS.

3.Fractions
LetypeFRACTIONadjtdfiniauchapitreStructureslmentairesdelafaonsuivante : type FRACTION structure numrateur : ENTIER dnominateur : ENTIER invariant dnominateur0 fin FRACTION Exercice12:Calculssurlesfractions Onditquunefractionestnormaliselorsquesondnominateureststrictementpositif.Ainsi,parexemple,lafraction(5 7)nestpasnormalise,maislafractionnormalisequivalenteest(57). 1.crireunefonctionquiprendenentreunefractionetquirendlafractionnormalisequivalente. 2. crire lalgorithme de la fonction qui prend en entre une fraction et qui rend la fraction normalise irrductible quivalente. 3.crirelafonctionadditionquiprendenentredeuxfractionsetquirendlafractionirrductiblenormalisequivalente leursomme. Ladiffrencededeuxnombresestlasommedupremieraveclopposdusecond. 4. crire la fonction soustraction qui prend en entre deux fractions et qui retourne la fraction irrductible normalise quivalenteleurdiffrence. 5.criredemmelafonctionmultiplicationdedeuxfractions. Lequotientdedeuxnombresestleproduitdupremierparlinversedusecond. 6. crire la fonction division qui prend en entre deux fractions et qui retourne la fraction irrductible normalise quivalenteleurquotient. Larcursivitnintervientpasdunefaonapparentedanscetexercice.Enfait,ellesimposeaveccequenoussavons, pourrduireunefraction.Eneffet,ilestncessairedecalculerlePlusGrandCommunDiviseur(pgcd)dedeuxentiers pour simplifier une fraction. Le pgcd de deux entiers sobtient, par exemple, par lalgorithme de EUCLIDE. Voici un exempledecalculdupgcddedeuxentiersdovousaurezdduirelamthodedersolutiondelasimplificationde deuxfractions. Exemple Soitcalculerlepgcdde125et15.Ondivisedabord125par15.Lequotiententierest8etlereste5.Ondivisealors lediviseur15parlereste5.Lenouveauquotientest3etleresteestnul.Onendduitquelepgcdde125etde15 est5.Cestledernierrestenonnuldanslasuitedesdivisionso,danschacune,lediviseurdeladivisionprcdente devientledividendeetlerestedeladivisionprcdentedevientlediviseur.

4.Fonctionrelle

- 2-

ENI Editions - All rigths reserved - Jonifar lina

107

Exercice13:Puissancedunnombrerel crirelalgorithmedunefonctionquirendxnpourtoutxreletnentier. 0 0napasdesens.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

108

Nombresetchanesdecaractres:ditiondunentier
On rencontre souvent le problme de ldition dun entier dans diffrents contextes. Nous aurons loccasion de le retrouverdansleschapitresultrieurs.Cettesectioncommenceltudedeceproblme. Il ne faut pas confondre la valeurdun nombre et sa reprsentation.Ilexistediffrentesreprsentationsdune mme valeur.Envoicideux :
q

centvingtcinq 125

Danslapremireforme,lavaleurdontilsagitestreprsenteparunechanedecaractresquinoncedesmotsdela langue franaise. On dira plus simplement que la valeur est reprsente en lettres. La seconde forme reprsente la mmevaleurparunechanedetroiscaractresquisontdeschiffresdelanumrationenbasedix.Ondiraquelavaleur est reprsente en chiffres. Il est aussi possible dutiliser dautres suites de caractres pour reprsenter la mme valeur :
q

175 huit

7Dseize 1111101 deux .

Lapremireformereprsentelavaleurdummenombreexprimepardeschiffresdelanumrationenbasehuit.La deuximeformelareprsenteenbaseseizeetladernireformeenbasedeux. Dfinition diterunentiercestconstruireunechanedecaractresquireprsentelavaleurdelentierdansunebasedenumrationB donne. Ainsi,diterlavaleurprcdenteenbaseB = dix,cestconstruirelachanedetroiscaractres125.LditerenbaseB =seize,cestconstruirelachanedecaractres7D. Exercice14:ditiondunentier crirelalgorithmequiditeunentierpositifenbaseB.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

109

Rsum
Ce chapitre a introduit la notion de traitements rpts. On labore une dfinition des changements des tats du logicielaulieudedireexplicitementlestransformationsfairesubirauxdonnes.Onpeutainsidfinirlesalgorithmes en nonant des clauses sans effet de bord pour prciser les prcondition, postcondition et invariant de leur spcification. Les chapitres suivants utiliseront intensivement la rcursivit. Cest certainement une notion difficile aborder pour une initiation. Il est tout fait possible de senpasseretdexprimer les spcifications en utilisant des formulesempruntesauxMathmatiquesoulalanguefranaise.Ilfautalorsveillerresterrigoureux.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

110

Introduction
Un traitement itratif est un traitement fait ou rpt plusieurs fois selon le PETIT LAROUSSE . Ce terme est synonymedefrquentatif quiseditdunverbequimarqueuneactionfrquemmentrpte,commeclignoter(...).Nous avonsdjvucommentconstruiredesalgorithmesquidfinissentuntraitementrptauchapitreRcursivit,quia tudilarcursivit.Ici,nousretrouvonslinstructiondaffectationpourconstruiredesalgorithmesdetransformation aucoursdesquelslesystmepassedeltatinitialltatfinalentraversantunesuccessionfiniedtatscaractriss par une proprit commune. Nous montrons comment construire ce type dalgorithmes dune faon raisonne et systmatique. La section Premiers exemples de construction ditrations introduit la mthode par quelques exemples simples. La sectionItrerdansuntableautudiediffrentessituationsdanslesquelleslitrationestutilisesurlescomposantes duntableau.LasectionAlgorithmeouprogramme?proposedesexercicesdapplicationaucoursdesquelsildevient possible de donner des solutions itratives des exercices dj rsolus rcursivement. Le chapitre se conclut par quelquesnotesbibliographiquesetunrsum.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

111

Premiersexemplesdeconstructionditrations
Cesexemplessontsimples.Lepremier,laconstructiondunetabledemultiplication,estmmetrivial.Cestquilsagit dun premier expos pour introduire les raisonnements permettant de construire une itration : il faut viter de multiplier les difficults. Cest pourquoi on commence par se concentrer sur les tapes de la construction et du raisonnementsurunproblmelmentaire,djabordnavementauchapitreprcdent.Lesecondexempleexplore un tableau dont les donnes sont des instances dun type structur. La section se termine ensuite par quelques exercicesdapplicationdemmenature.

1.Latabledemultiplication
a.Leproblme
Onveutprparerunalgorithmequiremplituntableauaveclesrsultatsdelatabledemultiplicationparunentiern positifounul.Lersultatobtenirestsemblableceluiprsentpourlatabledemultiplicationpar9,auchapitre prcdent.Ilsagit,cettefois,deprparerunesolutionquiprsentelestapesducalculdeslmentsdutableau. Cetableauestencorelimit11cases,numrotesde010,maisilpourraitcomporterbienplusdecases,sans quelalgorithmeproposnesentrouvemodifi.Voyonscela. Letableaudesrsultatsobtenirest : ... constante MIN : ENTIER <- 0 # Numro de la premire case du tableau. MAX : ENTIER <- 10 # Numro de la dernire case. variable table : TABLEAU[ENTIER][MIN, MAX] ... CesinstructionsdclarentuntableauappeltablequicontiendraMAXMIN+1entiers,entrelescasesdenumros MINetMAX.Pourremplirtableaveclatabledemultiplicationpar4,parexemple,nouscrirons : ... tableDe(table, 4) ... Il reste dfinir lalgorithme de la procdure tableDe qui initialise cette table. Cest une procdure qui prend en entreunentiernaturelnetquiinitialiseuntableaucontenantlesrsultatsdelatabledemultiplicationparn.Elle estdfiniepar : Algorithme1:TabledemultiplicationVersion1.0

Algorithme tableDe # La table de multiplication par n. Entre n : ENTIER # Lentier dont on veut la table. t : TABLEAU[ENTIER] # La table initialiser. prcondition n0 postcondition ancien(n)=n# n nest pas modifi. ( , 0 i 1 0 ) ( t [ i ] = i x n ) i fin tableDe Lexpression de la postcondition dfinit prcisment le comportement de la procdure. La premire clause indique quelaprocdurenemodifiepasleparamtren.Lasecondeclauseexprimeleffetdelaprocduresurlatablepar uneexpressionmathmatique.Danscecas,iestunevariablemathmatiquemuette.Ilestclairquellenestpasune variableausensalgorithmiqueduterme.Ellenestquelemarqueplacedunevaleurquimodifieuntat.Laclause exprimeque,pourtoutevaleurdeicompriseentrelesnumrosextrmesdescasesdutableau,lacasedenumroi contientlavaleurixn.Ainsi,lacasedenumro0contient0xn=0,lacasesuivantecontient1xn=netainside suite jusqu la case de numro 10. Une autre solution exprime la postcondition laide dun nouveau prdicat, estTableDe,quirendVRAIsietseulementsiletableauquilreoitenparamtrecontient,entredeuxdesescases dsignes,lesrsultatsdelatabledemultiplicationparunentierdsign :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

112

postcondition ancien(n) = n # n nest pas modifi. estTableDe( t , index_min( t ) , index_max( t ) , n ) Onexprimeainsiqueletableautcontient,entresescasesdenumrosrendusparindex_minet index_max,les rsultats de la table de multiplication par n. Bien entendu, ce nouveau prdicat doit tre dfini. Cest fait par lalgorithmecidessous. Algorithme2:SpcificationsduprdicatestTableDe Algorithm estTableDe e # t[dbut .. fin] contient-il la table de n ? Entre t : TABLEAU[ ENTIER] d b u t , f i n , n : ENTIER Rsultat : BOOLEN prcondition t NUL index_valide( t , d b u t ) index_valide( t , f i n ) n 0 postcondition dbut > fin = > Rsultat = FAUX dbut = fin = > Rsultat = (t[dbut] = (dbut - index_min( t ) ) x n ) dbut < fin = > Rsultat = ( (t[dbut] = (dbut - index_min( t ) ) x n ) et alors ( estTableDe( t , d b u t + 1 , f i n , n ) ) ) fin estTableDe Lalgorithme dfinit cette fois une fonction dont le rsultat est BOOLEN. La postcondition nutilise plus le symbolismemathmatique,maisunedfinitionrcursivedursultat.Lorsquelesbornesdbutetfinducalculsont gales, le rsultat est la valeur boolenne de lexpression (dbut index_min(t)) x n. Cest 0 pour dbut = index_min(t), n pour la valeur suivante et ainsi de suite. Lorsque les bornes ne sont pas gales, cestla mmevaleurdanslapremirecaseetlescasessuivantescontiennentlerestedelatabledemultiplicationparn. Cet algorithme est remarquable par sa gnralit. Il exprime que les cases de numros dbut, dbut+1, ..., fin contiennent respectivement les valeurs (dbutindex_min(t))xn, (dbutindex_min(t)+1)xn... Autrement dit, ces cases contiennent bien lextrait de la table de multiplication par n qui correspond la table complte lorsque dbut=index_min(t)etfin=index_max(t). La preuve de correction nest pas difficile tablir par un raisonnement identique ceux pratiqus au chapitre prcdent.Enparticulier,ilnestpasdifficiledecalculerladistancelasolution,autrementditlenombredappels rcursifsavantlaterminaisondelalgorithme. Ilnestpascertainquelexpressiondelapostconditiondelalgorithme1soitpluscompliqueouabsconsequecelle qui utilise lalgorithme2.Pourcequimeconcerne,jeprfreetdeloinlapremireformedespcification.Elleest comprhensibledemble,sanseffortavecuneculturemathmatiquedeniveaulmentaire.Ladeuximeformeme semblebienplusdifficileetincomparablementmoinsvidente.Pourtant,ilFAUTspcifierprcismentetclairement nosalgorithmes :nousnepouvonsychapper.Ilfautdoncchoisir :lesMathmatiquesou...lalgorithmique.Lasuite decechapitrevalemontrer. IlresteraliserlalgorithmetableDe. Si nous savons remplir la case de numro i 1 du tableau t, nous savons aussi remplir la case de numro i en remplaanti1pari.Soit(1)cetteassertion : Onsaitinitialiserlacasenumroiquandonsaitinitialiserlacasenumroi1. Peuimportepourlinstantlavaleurdinitialisation. Or,noussavonsinitialiserlapremirecase,celledenumroMIN :savaleurestv0 =0.Voyonspourquoicecirsoutle problme.
q

connaissantlavaleurv0 placerdansletableaudanslacasedenumroi1=MIN,onconnatlavaleurv1 placerdanslacasedenumroi=MIN+1daprslassertion(1)

- 2-

ENI Editions - All rigths reserved - Jonifar lina

113

connaissantlavaleurv1 placerdansletableaudanslacasedenumroi1=MIN+1,onconnatlavaleur v2 placerdanslacasedenumroi=MIN+2daprslassertion(1)

connaissantlavaleurv2 placerdansletableaudanslacasedenumroi1=MIN+2,onconnatlavaleur v3 placerdanslacasedenumroi=MIN+3daprslassertion(1).

Cette suite est une itration. Les mmes instructions sont renouveles, rptes plusieurs fois, sur des jeux de donnesdiffrentsmaislis.Lavaleurv0 =0estconnue.Lesvaleursv1 ,v2 ... sendduisent.chaquetape,la

valeurdeiavancepourquelapositionquilrepraitavantsonchangementdevaleurrecule.Toutececiestobtenu laide de lassertion (1) qui exprime que la connaissance des traitements ltape numro i se dduit de la connaissancedestraitementsltapei 1.Ainsi,commenoussavonsrsoudreleproblmeltapei=0,nous savonslersoudreltapesuivantei = 1.Ilrestecomprendrecommentcalculerlavaleurviquandonconnatla valeurprcdente,vi1 . Danslacasedenumroi10dutableaut,ontrouvelavaleurvi1 =(i1)xnparhypothse.Lacasedenumro idoitcontenirvi=ixn.Ona : v i - 1 = (i-1) x n v = i x n - n
i-1

vi - 1 = vi - n Do : vi = vi - 1 + n Parconsquent,v i,i>0,estlavaleurprcdenteaugmenteden : oncomptedenenn .Ainsi,onobtient : v0 = 0 v i = v i - 1 + n lorsque 0 < i 10 Pourpasserdelavaleurdunecaselasuivante,ilsuffitdajoutern.Ainsi,chaquetapeona,endsignantpar valeurlavaleurdelanouvellecaseremplir : valeur <- valeur + n Nousvenonsderedcouvrirquerciterlatabledemultiplicationparn,cestcompterdenenn.Toutceciestassez videntpourquiconnatsestablesdemultiplication,maispatience.

b.Constructiondelitration
Litrationseconstruitencinqtapesordonnes,toujourslesmmes. Faireunehypothsesurltatactuel Leschapitresprcdentsontdjinsistsurlefaitquunalgorithmedcritunesuitedetransformationsfairesubir auxdonnespourobtenirunrsultatattendu.Cestransformationsfontvoluerltatdusystmereprsentparles valeursdesvariables.Cependant,lesnotationsdestransformationsdcritesparlalgorithmenedisentpasltatqui en rsulte. Il est donc ncessaire dapporter, dans la description, les lments indispensables la caractrisation complte des tats parcourus par le systme depuis ltat initial jusqu ltat final dans lequel le rsultat est obtenu. Dans la premire tape de construction de litration, on fait une hypothse sur un tat intermdiaire du systme. On suppose que le travail a dj t partiellement ralis. Le systme a volu, depuis ltat initial I jusquuntatintermdiaireei1 quilsagitdecaractriser.Lafigurecidessousillustrecepoint.

Pour caractriser ltat intermdiaire ei1 dj atteint, on se rfre ce qui a t dcouvert au paragraphe prcdentetlassertion(1)quiapermisdeconstruirelanalyse.
ENI Editions - All rigths reserved - Jonifar lina - 3-

114

Hypothse(H):lescasesdetjusqulacasedenumroi1,comprise,ontdjtinitialises.Lavaleurdans lacasedenumroi1est(i1)xn.Lavariablevaleurcontientlaprochainevaleuri x nranger.

Voirsicestfini Dansquellescirconstanceslasituationdcriteparcettehypothsersoutelleentirementleproblmepos ?Cest finilorsqueltatintermdiaireei1 estltatfinalF.Ona11casesnumrotesde010initialiseretlescasesde numros 0 i 1 ont dj t initialises daprs lhypothse(H). Cest fini silnexiste plus de case initialiser, donclorsquei1=10.Ilestdoncpossibledcrire : # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n si i - 1 = 10 alors c e s t f i n i sinon ... Serapprocherdeltatfinal Sinon,ilfautchercherunnouveltatintermdiaireplus proche deltatfinalF.Cependant,nousnepouvonspas lefairesansprcaution.Ilnousfauttrouverunnouveltatintermdiairequivrifielhypothse(H),maisavecune plusgrandevaleurdei.Nousavonslasolutionpourilments,numrotsde0i - 1etnouslacherchonspour i + 1 lments. Ceci revient initialiser une nouvelle case, celle de numroi, dans le tableau t. Actuellement, la variablevaleurcontientlaprochainevaleurdposerdanst,danslacasenumroi.Onadonc : sinon t[i] <- valeur Ainsi,lesvaleursdesvariablesquireprsententltatdusystmeviennentdtremodifies.Parconsquent,ltat du systme logiciel vient de changer. Il est pass de ltat e i1 bien caractris par lanalyse du paragraphe prcdent,untate idontonnesaitencorerien.Dcrivonsle :

# On a initialis les cases de t jusqu la case de num o i r # comprise. valeur = i x n Ce nest pas tout fait ltat dcrit par lhypothse (H). Elle fait rfrence la case de numro i 1. Nous en sommeslacasei.Elledcritlasituationreprsenteparlafigureprcdente.Noussommesdansunenouvelle situation,reprsenteparlafiguresuivante:

Pourretrouverlasituationdcriteparlhypothse(H),ilsuffitdechangerlavaleurdei.Silavaleurdeiavance,la positionquilrepraitrecule : ... sinon t [ i ] < - valeur # On a initialis les cases de t jusqu la case de numro i # comprise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = (i-1) x n Ce nest pas encore(H) puisque, dans cet tat intermdiaire, valeur = (i 1) x n alors que (H) prvoit que valeur=ixn.Reprenonsdoncladescriptiondeltatetcorrigeonscettesituation :
- 4 ENI Editions - All rigths reserved - Jonifar lina

115

# On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n ... Lederniercommentairedcritlasituationobtenue,danslaquelleilestclairquelhypothse(H)estredevenuevraie encesensquelledcrit,denouveau,ltatcourantdanslequelsetrouvelesystme.Puisquelesystmesetrouve prsent dans ltat dcrit par(H), on peut reprendre exactement les mmes instructions qui vont oprer de la mmefaonsurlesmmesdonnes.Onpeutitrer,rpterlesmmestraitements.Onobtientdonc : # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n si i - 1 = 10 alors c e s t f i n i sinon t [ i ] < - valeur # On a initialis les cases de t jusqu la case de numro i # comprise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n recommencer au dbut fin si Les traitements recommencent donc, identiques mot pour mot pour obtenir un nouvel tat intermdiaire dcrit par (H), mais cette rptition sarrteratelle ? chaque tape, on initialise une nouvelle case et la valeur de i augmentelinstructiondincrmentationi<i+1.Sicettevaleurestinitialementinfrieure11audbutducalcul, elle finira par atteindre 11 et alors, lexpression boolenne i 1 = 10 prendra la valeur VRAI ce qui terminera litration.Siinestpasinitialementinfrieurougal11,savaleuraugmenteraindfinimentsansquecelledei 1atteigne10etlitrationnesarrterapas.Ilnousfautdoncdterminerlavaleurinitialedei. Initialiserlecalcul Initialiserlecalcul,cestplacerlesystmedansuntatinitialIquirendvraielhypothse(H).Cettehypothsedit que la dernire case dj initialise est celle de numro i1. Par consquent, la prochaine case initialiser est celledenumroi.Avantdecommencer,aucunecasenaencoretinitialiseetdonc,laprochainecaseremplir estcelledenumro0 : initialisation i <- 0 Lhypothseprcisealorsquevaleurvautixn.Aveci=0pourvaleurinitialedei,onobtientvaleur = 0xn = 0 pourvaleurinitialedevaleur : initialisation i <- 0 valeur <- 0 Ilrestearrangerlcrituredecetalgorithme.Commenonsparlaconditiondeterminaison.Nousavonscrit : # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n si i - 1 = 10 alors c e s t f i n i sinon ...

ENI Editions - All rigths reserved - Jonifar lina

- 5-

116

Nouspouvonscrirequecestfinisii1=10estquivalentcestfinisii=11.Autrementdit,cestfinidsquei 11puisqueiestcroissant.Langationdecetteassertionest : ce nest pas fini t a n t q u e i < 11 Nousobtenonsainsiunepremireformeoprationnelledelalgorithmecherch : initialisation i <- 0 valeur <- 0 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n tant que i < 11 rpter t [ i ] < - valeur # On a initialis les cases de t jusqu la case de numro i # comprise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n fin rpter Laconstructiontantque...rpter...finrpterrptelestraitementsimpossparlesinstructionsentrerpter et finrpter. Ces traitements ne sont jamais raliss si la condition de contrle du bloctant queestfausse.Ils cessentdsquecetteconditionestvalueFAUX.Elleestvalueavantlapremireexcutiondublocrpter puischaqueexcutiondefinrpter.Cenestpaslaseuleconstructionpossiblepourexprimercetteide.Enfait, elle a t obtenue par le raisonnement men sur la condition darrt de litration. Reprenons ce raisonnement autrement : # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n si i - 1 = 10 alors c e s t f i n i sinon ... Nouspouvonscrirequecestfinisii1=10estquivalentcestfinisii=11.Autrementdit,cestfinidsquei 11puisqueiestcroissant.Parconsquent,lestraitementssontrpterjusqucequei11ouencorejusqu cequei>10.Laformeoprationnelledelalgorithmedevient : initialisation i <- 0 valeur <- 0 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n jusqu i > 10 rpter t [ i ] < - valeur # On a initialis les cases de t jusqu la case de numro i # comprise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de numro i-1 # comprise. valeur = i x n fin rpter Le fonctionnement decetteconstructionestrigoureusementidentiqueceluidelaconstructionprcdente.Le prdicat du bloc jusqu est valu avant la premire excution du bloc rpter et chaque excution de fin

- 6-

ENI Editions - All rigths reserved - Jonifar lina

117

rpter.LitrationcessedsquecetteconditionestvalueFAUX. Ilresteterminerparlacinquimetape. Rdigerlalgorithmedfinitif cestade,nousavonsunalgorithmepresquecomplet.Lasignaturedelaprocdure,compltedelaprcondition et de la postcondition, exprime clairement ce que fait lalgorithme. Cest la documentation communique tout utilisateurdesesservices.Unutilisateurnapasconnatrelesdtailsinternesdelalgorithme.Ladocumentation estsuffisantepourlutiliser,cestdirepoursavoirprcismentltatinitialdanslequeldoitsetrouverlesystme logicielclientpourutiliserlalgorithme et ltatfinalobtenuaprssonexcution.Cependant,pourleprogrammeur, celanesuffitpas.Ilfautencorefournir,aveclalgorithme,lesmoyenspourencontrlerlefonctionnement.Ondoit pouvoir disposer de tout ce qui est ncessaire pour se convaincre quil est correct et mme pour prouver quilest correct.Voyonscelaencommenantparlhypothse(H). Hypothse(H):lescasesdetjusqulacasedenumroi1,comprise,ontdjtinitialises.Lavaleurdans lacasedenumroi 1est(i 1)xn.Lavariablevaleurcontientlaprochainevaleuri x nranger. Toutleraisonnementquimnedecettehypothselalgorithmeobtenuconsistefaireensortequellenonceune assertionquiestvraiedansltatinitialetquellerestevraiedanstouslestatsintermdiaires.Quandonconstate quedesinstructionsplacentlesystmedansuntatintermdiairedanslequelelledevientfausse,on corrige cet tatpourquelleredeviennevraie.Dansltapeintitule Serapprocherdeltatfinal ,onconstateque,aprsavoir rempli une nouvelle case de t, (H) devient fausse et on corrige en incrmentant i. Mais alors, lhypothse nest toujours pas vrifie en ce qui concerne la valeur placer dans la prochaine case visiter et on la corrige en laugmentantden.Dansltape Initialiserlecalcul ,onchercherendre(H)vraieltatinitial.Parconsquent, cettehypothseexprimeunepropritquidoitrestervraiedanstouslestatsdusystme.Cestcequelonappelle unepropritinvarianteouplussimplementuninvariant.Cestunprdicatfondamental :
q

ilnonceunepropritpermanentedusystmeetmaintenircettepropritestncessairelacorrectionde lalgorithme cestceprdicatquiguidelanalysedelalgorithmepourconstruirelitration.

Nous verrons plus loin que la modification de cette hypothse conduit un algorithme dont lexpression est sensiblementdiffrentedecelledelalgorithmequivientdtreobtenu. Revenonsencore(H).Nousdevonspouvoirexprimercettehypothsedunefaonplusformelle.Ilexisteplusieurs faons de le faire. Comme elle nonce une proprit en langage naturel, on souhaite dabord lexprimer mathmatiquement.Danscecas,ellepeutscrire,parexemple : ( k, 0 k i-1) (valeur = k x n et t[k] = valeur) On exprime bien ainsi que toutes les cases, jusqu la case de numro i - 1 comprise, ont t remplies avec la valeur k x n dans laquelle k est le numro de la case. Cette expression est un lment important de la documentationinternedelalgorithme et participe former notre conviction que lalgorithme est correct. On aurait pourtant apprci dexprimer cette hypothse dune faon plus algorithmique , comme nous le faisons pour la prconditionoulapostcondition.Ilsagitdcrirequet contientlesrsultatsdelatabledemultiplicationparndans touteslescasesdontlesnumrossontstrictementinfrieursi .NousdisposonspourceladuprdicatestTableDe quiatprparexactementdanscebut.(H)scritalors : invariant i > 0 => e s t T a b l e D e (t, 0, i-1, n) Lexpression de la proprit invariante suffitelle assurer la correction de lalgorithme ? La proprit tant vraie pour toutevaleurdekentre0et i - 1, elle reste vraie sii naugmentepas.Ainsi,lexpressionprcdentede (H)ne suffitpaspourseprmunircontreloublidelinstructionquiincrmentei etcetoubliestgrave,caralors,lalgorithme entredansuneitrationinfinie,quineseterminepas.Revenonsdonclaconditiondarrtdelitration : cest fini ds que i - 1 = 10 avecinitialement,i = 0 i - 1 = 10 10 - (i - 1) = 0 11 - i = 0 Ainsi,lorsquei augmentede011,11 - i dcrotde110.Nousavonslunmoyendevrifierquelitrationse terminera : sassurer, chaque reprise de litration, que la valeur 11 - i dcrot strictement. Appelonsvariant de contrlelaquantitdontlavaleurentirepositive,dansuneitration,dcrotstrictementvers0.Remarquezque, pourceproblme,lavaleurde11 - i est,pourtouti ,lenombredecasesdetquinesontpasencoreinitialises.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

118

Onpeutypensercommeunemesuredela distance quispareltatintermdiaireactueldeltatfinal.Pour que litration soit correcte, il faut quelle se termine et elle se terminera si la distance ltat final dcrot strictement.Cestuneconditionncessairedecorrection,maisvidemmentpassuffisante,commecelaadjtvu plushaut. Finalement,lalgorithmedevient : Algorithme3:TabledemultiplicationVersion2.1 Algorithm tableDe e # Construire la table de multiplication par n. Entre n : ENTIER # Lentier dont on veut la table. t : TABLEAU[ ENTIER] # La table initialiser. prcondition n 0 variable i : ENTIER # Le numro de la prochaine case initialiser. v a l e u r : ENTIER # La valeur dinitialisation de la case. initialisation i <- 0 valeur <- 0 jusqu i > 10 invariant # On a initialis les cases de t jusqu la case de numro # i-1 comprise. valeur = i x n # ( 0 k i-1) (valeur = k x n et t[k] = valeur) k, i > 0 = > estTableDe( t , 0 , i -1 , n ) variant de contrle # Nom bre de cases pas encore initialises. 11 - i rpter t [ i ] < - valeur # On a initialis les cases de t jusqu la case de num ro i # com prise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de num ro i-1 # com prise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de num ro i-1 # com prise. valeur = i x n fin rpter postcondition ancien(n) = n # n n e s t p a s m d i f i . o # (, 0 i 10)(t[i] = i x n) i estTableDe( t , 0 , 1 0 , n ) fin tableDe La postcondition reprend, en commentaire, lexpression mathmatique obtenue plus haut. Bien entendu, cet algorithmedoittrecompltparlesspcificationsdelalgorithmeestTableDe. Toutcetravailpeutparatrelong,compliquetvain :estilvraimentncessairededvelopperunetelleanalysepour un petit problme comme la table de multiplication ? videmment non ! Tout apprenti programmeur sait produire, aprsquelquesheuresdapprentissageetdansunlangageprocduralquelconque,unprogrammequicritlcran latabledemultiplicationparunentierquelconque.Cependant,ilfautgarderlespritquelobjectifdecettesection nest pas dobtenir la table de multiplication. Il sagit de comprendre litration et une mthode danalyse systmatique pour construire dune faon sre des itrations. Lobjectif ici est le raisonnement et son contrle. Et pourbieninsistersurcepoint,tudionsuneautreversiondummealgorithme.

c.Uneautreversion
Nousvoulonsinsistersurplusieurspointset,notamment,surlefaitquelitrationnesestpasconstruitenimporte comment. En particulier, cest le calcul et un raisonnement rigoureux qui imposent les diffrentes composantes de lalgorithme.Reprenonslhypothse(H)dedpartduraisonnementetmodifionslalgrement :

- 8-

ENI Editions - All rigths reserved - Jonifar lina

119

Hypothse(H):lescasesdetjusqulacasedenumroi,comprise,ontdjtinitialises.Lavaleurdansla casedenumroiestixn.Lavariablevaleurcontientlaprochainevaleur(i+1) x nranger. Danscettenouvellehypothse,iatremplacpari+1danstoutessesoccurrences.Reprenonsuneuneles tapesdelaconstructiondelitrationpartirdecettenouvellehypothse. Voirsicestfini Cestfinidsquei=10,doncdsquei10puisqueiestcroissant.Parconsquent,cenestpasfinitantquei< 10. Serapprocherdeltatfinal Onavanceverslasolutioneninitialisantlacasesuivante,celledenumroi+1.Onobtientdonc : tant que i < 10 rpter i <- i + 1 valeur <- valeur + n t [ i ] < - valeur fin rpter ... Initialiserlecalcul Pourraliserlesconditionsquedcritlhypothse(H)dansltatinitial,ondoitinitialiseridesortequesavaleur soitlenumrodeladernirecaseremplie.Siiestlenumrodeladernirecaseremplie,alorsi + 1estlenumro delaprochainecaseremplir.Or,initialement,aucunecasenestencoreremplieet,parconsquent,lenumrode laprochainecaseremplirestindex_min(t).Ainsi,initialement : i + 1 = 0 i = 0 - 1 = -1 Demme: valeur = i x n valeur = -1 x n = -n Lesinitialisationsdeviennent : initialisation i <- -1 # Num o derni e case initialis . r r e valeur <- -n # Valeur initialiser. Rdigerlalgorithmedfinitif Pourrdigerlalgorithme,ilresteexprimerlinvariantetlevariantdecontrle.Linvariantestdduitdirectementde cequei estlenumrodeladernirecaseremplie,dsquei 0 : invariant i 0 e s t T a b l e D e (t, 0, i, n) Le variant de contrle est dduit du prdicat de contrle de litration. Celleci termine lorsque i = 1 0 et donc lorsque10-i = 0parvaleurdcroissante.Parconsquent,levariantdecontrleest10- i : variant de contrle 10 - i Ildevientpossible,prsent,derdigerlalgorithmedfinitif : Algorithme4:TabledemultiplicationVersion2.2 Algorithm tableDe e # Construire la table de m ultiplication par n.

ENI Editions - All rigths reserved - Jonifar lina

- 9-

120

Entre n : ENTIER # L entier dont on veut la table. t : TABLEAU[ ENTIER] # L a t a b l e i n i t i a l i s e r . prcondition n 0 variable i : ENTIER # Le num ro de la dernire case initialise. v a l e u r : ENTIER # La valeur d i n i t i a l i s a t i o n d e l a c a s e . initialisation i <- -1 valeur <- -n tant que i < 10 invariant # On a initialis les cases de t jusqu la case de num ro i # com prise. valeur = i x n # ( 0 k i-1) (valeur = k x n et t[k] = valeur) k, i 0 = > estTableDe( t , 0 , i , n ) variant de contrle # Nom bre de cases pas encore initialises. 10 - i rpter # On a initialis les cases de t jusqu la case de num ro i # com prise. valeur = i x n i <- i+1 # On a initialis les cases de t jusqu la case de num ro i-1 # com prise. valeur = (i-1) x n valeur <- valeur + n # On a initialis les cases de t jusqu la case de num ro i-1 # com prise. valeur = i x n t [ i ] < - valeur # On a initialis les cases de t jusqu la case de num ro i # com prise. valeur = i x n fin rpter postcondition ancien(n) = n # n n e s t p a s m d i f i . o # (, 0 i 10)(t[i] = i x n) i estTableDe( t , 0 , 1 0 , n ) fin tableDe Ce nest plus le mme algorithme que celui de la version 2.1. La modification de lhypothse, derrire laquelle se cachelapropritinvariantedelitration,aimpos :
q

denouvellesinitialisationspourplacerlesystmedansltatinitial :
q

i = -1aulieudei = 0 valeur = -naulieudevaleur = 0

unenouvelleconditiondefinditration :i < 10aulieudei < 11 unenouvellepositionpourlesdiffrentesinstructionsquirtablissentlinvariant :nouvellesvaleursdei et delavariablevaleur lexpressiondunnouvelinvariantetdunnouveauvariantdecontrle.

Encore une fois, toutes ces modifications ne sont pas obtenues par lintuition et le bricolage, mais par un raisonnement rigoureux. Cest lenseignement essentiel de ce livre. Bien entendu, comme dans toute activit humaine,nousrestonslamerciduneerreurderaisonnementoudinattention.Peuttresubsistetildailleursde telleserreursdanscequiprcde.Lalgorithmiqueestuneactivitdifficile.Raisondepluspourmettreen uvredes mthodes de raisonnement qui aident construire des algorithmes srs. Cette faon de procder vaut infiniment mieuxqueces bidouillages infinisdevantunclavierdordinateur,larecherchedsespredelasolution qui marche etlaquelleonnepourrajamaisfaireconfiance,saufpeuttrepourdesproblmestriviaux.Ilenestde mmedesnotations.Nousyreviendrons.

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

121

Exercice1:Versionsitrativesdalgorithmesrcursifs CetexerciceproposedereprendreladfinitiondalgorithmestudisauchapitreRcursivit. 1.crireuneversionitrativedelafonctionrangdfinieauchapitreprcdent. 2.Mmequestionpourlafonctionlongueurquicalculelenombredecaractresdunechane. Lessectionssuivantestudientcompltementdautresexemples.

2.Exploreruntableau
Un CLIENT est une PERSONNE identifie par un numro entier. Une PERSONNE possde une ADRESSE et une IDENTIT.Lediagrammecidessousreprsentecesentitsetleursassociationsmutuelles.

RemarquezlanatureparticuliredelassociationentreCLIENTetPERSONNEouentrePERSONNEetIDENTIT.On indiqueainsiquuneinstancedeCLIENTestcomposeduneetduneseuleinstancedePERSONNE.Entouterigueur, ilfaudraitutilisericilassociationdhritage,maisnousnesommespasenalgorithmiqueobjet.Deplus,lacouleurdu losangeductCLIENTindiqueque,lorsqueleclientdisparat,lapersonnedisparataveclui. LetypeCLIENTestdfiniparladclaration : type CLIENT structure num ro : ENTIER p : PERSONNE fin CLIENT LadclarationdutypePERSONNEestdemme : type PERSONNE structure i d e n t i t : IDENTIT ge : ENTIER adresse : ADRESSE fin PERSONNE Enfin,letypeADRESSEadjtutilisauchapitreStructureslmentaires. Untableau,quipeutcontenirjusqu1000CLIENTsatdclaretinitialis : constante MAX_CLIENTS : ENTIER <- 1000 MIN_CLIENTS : ENTIER <- 1 VIDE : ENTIER <- ? ? ? # Num ro d un client qui n existe pas. EFFAC : ENTIER <- ? ? ? # Num ro d u n c l i e n t e f f a c . ... variable

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

122

...

c l i e n t s : TABLEAU[ CLIENT][MIN_CLIENTS, MAX_CLIENTS]

Actuellement,touteslescasesnontpasncessairementtinitialisespardesclients.Lentreprisenapeuttrepas encore1000clients.Lapremirecasequinapasencoretinitialiseporteunnumrodeclientinitialislavaleur delaconstanteVIDE.Cestuneconstantequelconque,maisquinepeuttreunnumrodeclientvalide.Danslavie delentreprise,unclient nat,vitetmeurt .Autrementdit,denouveauxclientssontinscrits,dautressonteffacs dutableau.Lorsquelundeuxesteffac,onsecontentedindiquerquesonnumroprendlavaleurEFFAC.Voici,par exemple,commentilestpossiblededfinircesvaleursparticulires : constante MAX_CLIENTS : ENTIER <- 1000 MIN_CLIENTS : ENTIER <- 1 # Num ro d un client qui n existe pas. VIDE : ENTIER <- MIN_CLIENTS - 1 # Num ro d u n c l i e n t e f f a c . EFFAC : ENTIER <- VIDE - 1

a.Rechercheruneidentit:leproblme
Ondonnelidentitdunclientparticulier : variable i d : IDENTIT ... id.prnom <- Jacques id.nom <- MARTIN ... RemarquezcommentestutiliseunedonnedutypeIDENTIT.Uneinstancedecetypeestfaitededeuxchanes de caractres : un prnom et un nom. Loprateur point (.)est utilis pour slectionner un champ particulier, un attribut,delinstance.Ainsi,pourinitialiserleprnomdelidentitid,oncrit : id.prnom <- Jacques Faire un algorithme qui dtermine le numro de la case du tableau des clients qui contient les donnes de ce client particulier. Ilsagitdoncdeparcourirletableaudesclientspourychercherlapositiondelundeuxdontondonnelidentit.On veutconnatrelenumrodelacasequilecontient.Letableaucidessousreprsenteunexempledunteltableau. 1 2 3 ... 28 ... 85 86 ... 1000 212 36 2 ... 76 ... 177 1 ... 1 Jacques MARTIN 25 32 47 ... 33 ... 56 ... ... ... 17 ... ... ... 26 ... 1 ... ... ... Squaredeslilas ... ... ... Ruedesbois ... 75210 ... ... ... ... ... OIS ... ... ... ... ... ... ... ... ...

Raimond ZITTON Alain ... Jacques ... Marcel ... ... ... DUPONT ... MARTIN ... DUCHAMP ... ... ...

Alledesoiseaux ... ... ... ... ... ... ...

Lespointillsremplacentsoitdesdonnesnoninitialises,commeendernireligneparexemple,oudesvaleursqui nesontpasprcises,commedansladeuximeligneparexemple.

- 12 -

ENI Editions - All rigths reserved - Jonifar lina

123

La premire colonne prcise le numro de la case du tableau. Cest MIN_CLIENTS pour la premire case et MAX_CLIENTSpourladernire.Ici,cesvaleurssontrespectivement1et1000.Lesautrescolonnescontiennentles valeurs des attributs de clients enregistrs. Remarquez quil existe plusieurs clients dont lidentit est la mme. Cependant, le numro est un identifiant qui ne peut apparatre quen un seul exemplaire. La dfinition de lalgorithme doit prciser quel rang il renvoie dans ce cas. Convenons que, dans le cas didentits multiples, on attendlenumrodecaselepluspetit,autrementditlenumrodelapremirecasecontenantlidentitcherche. Ici,ceserait1pourJacquesMARTIN.Danscetableau,AlainDUPONTateffac :lenumrodeclientvaut2.Les casesentrelesnumros86et1000sontvides :ellesonttinitialisesparunnumrodeclientquivaut1. Pourtrouveruneidentitdonne,lalgorithmeobservelecontenudelapremirecasedutableauclientsetregarde dabordsileclientexiste.Sicestlecas,ilcomparelidentitenregistrecellecherche.Silacomparaisonrussit,il renvoie1 sinon,ilobservelecontenudeladeuximecaseetainsidesuite.Larecherchesetermine,soitparceque lidentitchercheesttrouveetalorslalgorithmerendlenumrodelacasequilacontient,soitparcelenumrode client dans cette case a la valeur VIDE lorsque tout le tableau initialis a t parcouru sans trouver dinstancede lidentitcherche.Danscecas,ilfautconvenirdunevaleurqueretourneralalgorithme.SoitABSENTcettevaleur. constante MAX_CLIENTS : ENTIER <- 1000 MIN_CLIENTS : ENTIER <- 1 # Num ro d un client qui n existe pas. VIDE : ENTIER <- MIN_CLIENTS - 1 # Num ro d u n c l i e n t e f f a c . EFFAC : ENTIER <- VIDE - 1 # Rsultat d une recherche qui choue. ABSENT : ENTIER <- VIDE - 2

b.Lalgorithmecrire:chercherIdentit
SoitchercherIdentit, lalgorithmecrire.Commenousenavonslhabitudeprsent,saresponsabilitserade chercher une identit dans les cases du tableau clients situes entre deux cases extrmes dont on donne les numros. Il est possible de spcifier cet algorithme. Ainsi, il deviendra possible de lutiliser sans avoir besoin den connatrelesdtailsderalisation. Algorithme5:SpcificationsdechercherIdentit Algorithm chercherIdentit e # Le num ro de la case de t entre dbut et fin qui contient # identit ou ABSENT sinon. Entre t : TABLEAU[ CLIENT] d b u t , f i n : ENTIER identit : IDENTIT Rsultat : ENTIER prcondition t NUL index_valide( t , d b u t ) index_valide( t , f i n ) postcondition dbut > fin = > Rsultat = ABSENT dbut Rsultat fin ( t [ Rsultat] . p . i d e n t i t = i d e n t i t et t [ Rsultat].num ro EFFAC et t [ Rsultat].num ro VIDE ) # Rend ABSENT si identit n e s t p a s d a n s t [ d b u t . . f i n ] . non estDans( t , d b u t , f i n , i d e n t i t ) Rsultat = ABSENT # Rend la prem ire valeur rencontre. dbut < Rsultat non estDans( t , d b u t , Rsultat-1 , i d e n t i t ) fin chercherIdentit Remarquez,lencore,laccsauxchampsduneinstancedetypestructur.LetableautcontientdesCLIENTsdans sescases.Pourslectionnerleclientenregistrdanslacasedenumro5parexemple,onutiliselanotationt[5].Un client est fait dun numro et dune personne dsigne par p dans la dfinition de CLIENT. Pour accder aux

ENI Editions - All rigths reserved - Jonifar lina

- 13 -

124

lments qui dfinissent la personne associe au numro 5, on utilise la notation t[5].p. Puis, pour accder lidentit de cette personne, on utilise t[5].p.identit puisque cette identit est dsigne par identit dans la dfinition de PERSONNE. Enfin, quand on aura besoin daccder, par exemple, au nom du client, on utilisera la notationt[5].p.identit.nom. Remarquez aussi comment sont compares deux identits. La postcondition fait appel au prdicat t [Rsultat].p.identit = identitquiutiliselesignedgalithabituelpoursassurerquelesdeuxidentitssont gales.Ilnyapasdeprcautionparticulireprendreicipuisquenoussommesenalgorithmiqueetquelanotation est claire. En programmation, il faudrait sassurer que loprateur = est bien dfini sur les types de donnes concerns. Remarquezenfinlesdiffrentesclausesdelapostcondition.Lapremiresassurequedbut finetquelafonction rendABSENTlorsquecenestpaslecas.Ladeuximeditquelersultatentredbutetfinestunnumrodecasequi contient ladresse cherche et que le client concern existe, cestdire na pas t effac et que la case correspondante nest pas vide. Pour une identit qui nest pas prsente dans le tableau, le rsultat est ABSENT. Enfin, lorsque le rsultat est un numro de case strictement suprieur dbut, aucune case de numro compris entre dbut et Rsultat1 ne contient un client ayant lidentit cherche. On prcise bien ainsi que la fonction retournelenumrodelacasequicontientlapremireoccurrencerencontrepourcetteidentit. LeprdicatestDansrendVRAIsietseulementsileparamtreidentitestdansunecasedetdenumrocompris entredbutetfin.Sesspcificationssont : Algorithme6:SpcificationsdeestDanspouruneidentit Algorithm estDans e # i d e n t i t e s t -elle dans t, entre les cases de num ros dbut et # fin ? Entre t : TABLEAU[ CLIENT] d b u t , f i n : ENTIER identit : IDENTIT Rsultat : BOOLEN prcondition t NUL index_valide( t , d b u t ) index_valide( t , f i n ) postcondition dbut > fin = > Rsultat = FAUX dbut = fin = > Rsultat = ( t[dbut].p.identit = identit et t[dbut].num ro EFFAC et t[dbut].num ro VIDE ) dbut < fin Rsultat = ( ( t[dbut].p.identit = identit et t[dbut].num ro EFFAC et t[dbut].num ro VIDE ) ou sinon estDans( t , d b u t + 1 , f i n i d e n t i t ) ) fin estDans Onchercheuneidentitdonneencrivant,parexemple : variable ... id : IDENTIT rang : ENTIER ... id.prnom <- Jacques

- 14 -

ENI Editions - All rigths reserved - Jonifar lina

125

id.nom <- MARTIN ... rang <- chercherIdentit(clients, MIN_CLIENTS, MAX_CLIENTS, id) si rang ABSENT alors Jacques MARTIN trouv dans la case de num ro rang. sinon Pas de Jacques MARTIN p a r m l e s c l i e n t s e n r e g i s t r s . i fin si ... Supposons dabord que chercherIdentit fait partie de notre bibliothque de composants logiciels et utilisonsla pourrsoudrequelquesproblmessimplesointervientlitration.

c.Utilisation:effacertouslesclientsdidentitdonne
Exercicersolu1:Effacerlesclientsdontondonnelidentit Ondonneuneidentitid. Effacertouslesclientsayantcetteidentit. Solution Nousavonsvucommentprocderplushaut.Onobserveunecaseetonpasselasuivanteencasdchec.Dansun tatintermdiairedelarecherche,onadjparcouruettraitquelquescasesdutableau.Reprenonslestapesde constructionduneitration. Faireunehypothsesurltatactuel Hypothse(H):lidentitidatcherchedansclients.Lederniernumrodecasereuenrsultatetnon encoretraitestrang. Lavariablerangcontientdoncunnumrodecaseetcenumrodecasenapasencorettrait.Autrementdit,si lacasedenumrorangcontientunclientvalide,ceclientnestpasencoreeffac. Voirsicestfini Cestfinilorsquerang=ABSENTquiestlavaleurconvenuerendueparchercherIdentit,quandilnetrouvepasde rponse.LorsquerangABSENT,onadansranglenumrodunecasedutableauclientsquicontientunclientvalide dontlidentitestcellecherche.Ilestalorspossibledetraiterceclient. si rang = ABSENT alors c e s t f i n i sinon traiter le client de la case rang. ... Serapprocherdeltatfinal Pourserapprocherdeltatfinal,ondoiteffacerceclient.Onobtientalors : ... sinon # clients[rang] contient un client effacer. effacer le client dans la case rang calculer le rang du client suivant de m e id m ... Lopration effacer le client dans la case rang consiste placer la valeur de la constante EFFAC dans le

ENI Editions - All rigths reserved - Jonifar lina

- 15 -

126

numrodeclientdelacasedenumrorang : ... ...

clients[rang].num ro <- EFFAC # rang est le dernier num ro de case reu et trait.

Ltat dcrit par le dernier commentaire nest pas un tat intermdiaire dcrit par(H). Pour obtenir un tel tat, il suffitdecalculerlerangsuivantdansletableauclients.Maisalorsquelapremirerecherchesefaitpartirdela premirecasedeclients,ilfautprsentchercherleclientsuivant,doncunclientdenumrosuprieurrang : ...

...

# rang est le dernier num ro de case reu et trait. rang <- chercherIdentit(clients, rang+1, MAX_CLIENTS, id) # rang est le dernier num ro de case reu et non encore trait.

Onretrouvealors(H)etildevientpossibleditrer,derefairelescalculs.Onsaitquelalgorithmetermineparceque lenumrodelacaseocommenceunenouvellerechercheeststrictementsuprieuraunumrodelacasersultat de litration prcdente. Chaque appel nous rapproche de la fin du tableau et on finira par atteindre la dernire case valide. Lalgorithme rendra alors ABSENT qui terminera litration. Bien entendu, ceci suppose que chercherIdentit est correct, mais ce nest pas actuellement notre responsabilit dassurer la correction de cette fonction.Onseconformesaprconditionetonreoitleserviceattendusilapostconditionnoussatisfait sinon,il fautallervoirailleurs. Initialiserlecalcul Initialiserlecalcul,cest placer le systme logiciel dans un tat dans lequel(H) est ralise. Il suffit donc de faire appelchercherIdentitpourobtenirunepremirevaleurderang : ... ...

rang <- chercherIdentit(clients, MIN_CLIENTS, MAX_CLIENTS, id) # rang est le dernier num ro de case reu et non encore trait.

Rdigerlalgorithmedfinitif Commenons par arranger la condition de terminaison de lalgorithme. Cest fini lorsque rang = ABSENT et, par consquent,cenestpasfinitantquerangABSENT.Commerangcontientlenumrodelaprochainecasetraiter lorsquecenestpasfini,ilneresteplusqurdigerlaversiondfinitive. Linvariantestplusdifficileobtenir.Dansuntatintermdiaire,(H)prcisequelesclientsdontlidentitestidont teffacsdanstouteslespositionsquiprcdentrang.Soit,alorsleprdicatestEffacdontlasignatureest : estEffac ( t : TABLEAU[ CLIENT] # Tableau traiter. d b u t , f i n : ENTIER # Num ros des case extrm concernes. es identit : IDENTIT # I d e n t i t e f f a c e r . ) : BOOLEN # Les clients d identit identit enregistrs dans # t [ d b u t . . f i n ] o n t -i l s t e f f a c s ? La prcondition est classique. La postcondition exprime que tous les clients enregistrs dans les cases entre t [dbut]ett[fin]didentitidentitontteffacs,maisaussiquaucunautreclientnatmodifi.Poursassurer quaucun autre client na t modifi, il faut pouvoir comparer lenregistrement qui correspond un client donn avantetaprseffacement.Or,unefonctionnepeutpasutiliserlaconstructionanciensurlundesesparamtres : pourunefonction,lavaleurdunparamtreenentrerestegalesavaleurensortiepuisquilsagitdunerequte, quinemodifiepasltatdusystme.Parconsquent,onmodifielasignatureduprdicatestEffacpourquilassure aussilavrificationdelinvariancedesenregistrementsdutableautdanslespositionsquinecorrespondentpas lidentitcherche.Laprocdurequieffaceutiliseraleprdicatainsi : ... estEffac( ancien(clients), clients, MIN_CLIENTS, MAX_CLIENTS, id) ... CeprdicatretourneVRAIsietseulementsitouslesclientsdidentitidenregistrsdans ancien(clients),entre lescomposantesdenumrosMIN_CLIENTSetMAX_CLIENTS,ontteffacsetaucuneautrecomposantedutableau

- 16 -

ENI Editions - All rigths reserved - Jonifar lina

127

natmodifie.Lcrituredelaprconditiontantlaisseenexercice,onobtientlalgorithmesuivant : Algorithme7:SpcificationsdeestEffacpouruneidentitdonne Algorithm estEffac e # Les clients d identit identit enregistrs dans # t [ d b u t . . f i n ] o n t -i l s t e f f a c s ? Entre a t , t : TABLEAU[CLIENT] # Tableaux traiter. d b u t , f i n : ENTIER # Num ros des case extrm concernes. es identit : IDENTIT # Identit effacer. Rsultat : BOOLEN prcondition ... laisse en exercice ... postcondition dbut > fin = > Rsultat = FAUX dbut = fin = > Rsultat = ( ( at[dbut].p.identit = identit et at[dbut].num ro EFFAC et at[dbut].num ro VIDE et t[dbut].num ro = EFFAC et at[dbut]. p.identit = t[dbut].p.identit ) ou sinon ( at[dbut].p.identit identit et at[dbut] = t[dbut] ) ) dbut < fin = > Rsultat = ( ( at[dbut].p.identit = identit et at[dbut].num ro EFFAC et at[dbut].num ro VIDE et t[dbut].num ro = EFFAC et at[dbut]. p.identit = t[dbut].p.identit ) ou sinon ( at[dbut].p.identit identit et at[dbut] = t[dbut] ) et alors estEffac( a t , t , d b u t + 1 , f i n , i d e n t i t ) ) fin estEffac Revenonsalorslaprocdurequiefface.LeprdicatestEffacpermetdexprimerlinvariantdelitration : invariant rang > MIN_CLIENTS = > estEffac( ancien(clients), clients, MIN_CLIENTS, rang-1 , i d )

ENI Editions - All rigths reserved - Jonifar lina

- 17 -

128

Dans un tat intermdiaire quelconque, la distance la solution est majore par le nombre de cases qui reste explorer.Cest : variant de contrle MAX_CLIENTS - rang + 1 Dolaversioncompltedelalgorithmequieffacelesclients. Algorithme8:Effacerlesclientsdidentitdonne

constante MAX_CLIENTS : ENTIER <- 1000 MIN_CLIENTS : ENTIER <- 1 VIDE : ENTIER <- index_min( c l i e n t s ) - 1 EFFAC : ENTIER <- VIDE - 1 ABSENT : ENTIER <- VIDE - 2 variable c l i e n t s : TABLEAU[CLIENT][MIN_CLIENTS, MAX_CLIENTS] id : CHANE # L i d e n t i t c i b l e d e s e f f a c e m n t s . e ... id <- ( l identit chercher pour effacem ent) # Le tableau contient dj les donnes traiter. Effacer tous les # clients d identit donne. rang <- chercherIdentit(clients, MIN_CLIENTS, MAX_CLIENTS, id) # Le tableau clients a dj t parcouru la recherche de id. # rang est le dernier num ro de case obtenu en rsultat et pas # encore trait. invariant rang > MIN_CLIENTS = > estEffac ( ancien(clients), clients, MIN_CLIENTS, rang-1 , i d ) variant de contrle MAX_CLIENTS - rang + 1 tant que rang ABSENT rpter clients[rang].num ro <- EFFAC # Le tableau clients a dj t parcouru la recherche de id. # rang est le dernier num ro de case obtenu en rsultat est # trait. rang <- chercherIdentit(clients, rang + 1, MAX_CLIENTS, id) fin rpter AyantainsitudicommentutiliserlafonctionchercherIdentit,voyonsprsentcommentladfinir.

d.DfinitiondechercherIdentit
Lafonctionimplmenteuneitrationquipermetdexplorerletableaucaseparcase.Dsquellerencontreunecase contenantlidentitcherche,elleretournelenumrodecettecase,nepasconfondreaveclenumrodeclient. Lanalysesuitencorelestapesintroduitesprcdemment. Faireunehypothsesurltatactuel Onsupposequeletableauadjtpartiellementexplor.Sionchercheencore,cestquelidentitcherchena pasencorettrouve. Hypothse(H):letableauatobservjusqulacasenumroi 1incluseetriennattrouv. Voirsicestfini Cestfinietalorslidentitcherchenestpastrouvedsquei1=fin. Serapprocherdeltatfinal

- 18 -

ENI Editions - All rigths reserved - Jonifar lina

129

Onserapprochedeltatfinalenobservantunecasedeplus,doncenobservantlaprochainecase,celledenumro i. Cependant, cette case ne contient pas ncessairement une donne valide. Ainsi, lidentit quelle contient peut trecellecherchealorsqueleclientconcernadjteffaclorsduneoprationantrieure.Demme,lacase peuttrevidesiellenajamaistinitialiseaveclescaractristiquesdunclient.Ilsagitdediscriminercescas : si table[i].num ro = VIDE alors c e s t f i n i : t o u t e l a t a b l e e s t e x p l o r e e t l i d e n t i t n est pas trouve. sinon si table[i].num ro= EFFAC alors # observer la case suivante. i <- i + 1 sinon si table[i].p.identit = identit alors c e s t f i n i : i d e n t i t c h e r c h e t r o u v e e n i . sinon ... Sinon,unecasedeplusvientdtreobserve.Ltatintermdiaireatteintsecaractriseparlapropritsuivante : ... sinon # le tableau a t observ jusqu la case num ro i incluse # et rien n a t trouv. Cenestpastoutfait(H).Onlaretrouveenavanantlavaleurdei : i <- i + 1 # le tableau a t observ jusqu la case num ro i - 1 incluse # et rien n a t trouv. Ildevientalorspossiblederecommencerlesmmestraitements.Ilrestedmarrerlecalcul.Cestfaitenralisant ltatinitialdanslequel(H)estvraielorsquaucunecasenaencoretobserve : Initialiserlecalcul La prochaine case observer est celle de numro i daprs (H). Initialement, cest celle de numro dbut. Par consquent,iestinitialispar : initialisation i <- dbut ... Dautrepart,initialement,riennaencorettrouvetdiffrentescirconstancesterminentlecalcul.Soitalorsfini, unevariableboolennevraiesietseulementsilitrationesttermine : variable f i n i : BOOLEN ... initialisation i <- dbut f i n i < - FAUX ... CettevariableprendlavaleurVRAIlorsqueletableauestpuisouquelidentitchercheesttrouveet,dansce cas,RsultatprendunevaleurdiffrentedeABSENT.Onpeutalorsrdigerlalgorithmedfinitif. Rdigerlalgorithmedfinitif CestfinidsquefiniprendlavaleurVRAI.Cestlecaslorsquei>finousinonlorsquetable[i].numro=VIDE ousinonlorsqueRsultatABSENT.Lavariablefinidevientdoncinutile : f i n i = i > f i n ou sinon table[i].num ro = VIDE
ENI Editions - All rigths reserved - Jonifar lina - 19 -

130

ou sinon Rsultat ABSENT Dautrepart,linvariantexprime(H) : invariant i > dbut = > non estDans( t a b l e , d b u t , i - 1 , i d e n t i t ) ... Enfin,lenombredecasesquinontpasencoretexploresest : variant de contrle fin - i + 1 Dolalgorithme : Algorithme9:DfinitiondechercherIdentit Algorithm chercherIdentit e # Le num ro de la case de t[dbut .. fin] qui contient identit # ou sinon ABSENT. Entre t : TABLEAU[ CLIENT] # Le tableau explorer. Dbut, fin : ENTIER # Num ros cases extrm de l exploration. es identit : IDENTIT # Identit cherche. Rsultat : BOOLEN prcondition ... variable i : ENTIER # Num ro de la prochaine case observer. initialisation i <- dbut Rsultat <- ABSENT jusqu i > fin ou sinon table[i].num ro = VIDE ou sinon Rsultat = ABSENT invariant # ( dbut k i - 1 ) ( t [ k ] . p . i d e n t i t i d e n t i t ) k, i > dbut = > non estDans( t , d b u t , i - 1 , i d e n t i t ) variant de contrle fin - i + 1 rpter si t[i].num ro EFFAC et alors t[i].p.identit = identit alors Rsultat <- i sinon i <- i + 1 fin si fin rpter postcondition ... fin chercherIdentit Peutoncrire : ... si t[i].p.identit = identit alors Rsultat <- i

- 20 -

ENI Editions - All rigths reserved - Jonifar lina

131

fin si i <- i + 1 ... Danscettesolution,onconsidreque,quoiquilensoitdursultatdutestsurlidentitdelacaseactuelle,onpeut toujours incrmenter i. Si lidentit a t trouve, lincrmentation de i ne sert rien, mais comme litration se termine,cetteoprationnapasdeconsquence sinon,ilfautincrmenterietcestcequefaitcetteinstruction. Cettesolutionestfausse,maiselledonneunrsultatcorrect !Elleestfausseparceque,danslecasolersultat estdanslacasedenumroi,incrmenterirendfauxlinvariant :ilnestplusVRAIquenonestDans()pourtoutes lescases,jusqulacasedenumroi1puisque,aprslincrmentation,lersultatestdanslacasei1.Ce nestdoncpasune bonnesolution .

e.Vieillirlesclients
Lgedunclientestenregistrdansletableau.Ongagneainsiencalcul :enregistrerladatedenaissanceimpose de recalculer lge chaque fois quil est ncessaire un traitement, par exemple pour une campagne de publicit ciblesurunetranchedges.Encontrepartie,enregistrerlgeaulieudeladatedenaissanceimposeunemise jourdecettepropritchaquechangementdanne.Onsupposequelannevientdechanger.Faireunalgorithme quiajustelgedesclients. Cest encore un algorithme de parcours du tableau des clients, mais cette fois, toutes les cases doivent tre explores et, ventuellement, modifies. On visite chaque case et, pour chacune, on ajoute 1 p.ge si elle ne contientniVIDEniEFFAC. Faireunehypothsesurltatactuel Dansuntatintermdiaireduparcours,descasesdutableauonttvisites.Disonsqueladernirecasevisite estcelledenumroi+1pourchanger. Hypothse(H):lesgesonttajustsdanstouteslescases,jusqucelledenumroi+1inclus. Voirsicestfini CestfinilorsquelaprochainecasevisiterestunecasequicontientVIDEpourlenumroduclient,oulorsquela dernirecasevisiteestcelledenumroindex_max(clients).Ilestdoncpossibledcrire,provisoirement :

# les ges ont t ajusts dans toutes les cases, jusqu celle de # num ro i + 1 inclus. si i + 1 = MAX_CLIENTS ou sinon clients[i + 2].num ro = VIDE alors c e s t f i n i sinon ...
Remarquezque,ici,laconstructionousinonsimpose.Ilnestpaspossibledutiliserouseul.Eneffet,nousdevons supposer que ou value les deux membres du prdicat. Or, lorsque i + 1 = MAX_CLIENTS, laccs la case de numro i + 2 pour vrifier quelle nest pas vide est illgal puisque, dans ce cas, cette case nexiste pas. La constructionou sinon est telle que son deuxime membre nest valu que lorsque son premier membre prend la valeurFAUX. Sinon,ilfautserapprocherdelasolution. Serapprocherdeltatfinal Ilsagitalorsdetraiterlacasesuivante,denumroi+2.Cependant,cettecasepeutcontenirunclientquiat effac : sinon si clients[i+2].num ro EFFAC alors # Vieillir ce client. clients[i + 2].p.ge <- clients[i + 2].p.ge + 1

ENI Editions - All rigths reserved - Jonifar lina

- 21 -

132

sinon # ce client est effac : ne rien faire. Rien fin si # les ges ont t ajusts dans toutes les cases, jusqu c e l l e # de num ro i + 2 inclus. i <- i + 1 # les ges ont t ajusts dans toutes les cases, jusqu c e l l e # de num ro i + 1 inclus. Recom encer m fin si ... Initialiserlecalcul Ladernirecasevisiteestcelledenumroi+1daprs(H).Laprochaineestcelledenumroi + 2.Initialement, laprochainecasevisiterestcelledenumroMIN_CLIENTS.Parconsquent,lavaleurinitialedeiesttellequei+2 =MIN_CLIENTS,soiti=MIN_CLIENTS2. initialisation i <- MIN_CLIENTS - 2 Ilresterdigerlalgorithme. Rdigerlalgorithmedfinitif Arrangeonsdabordlaconditiondeterminaison.Cestfinilorsque : i + 1 = MAX_CLIENTS ou sinon clients[i+2].num ro = VIDE i = MAX_CLIENTS - 1 ou sinon clients[i+2].num ro = VIDE doncdsque : i MAX_CLIENTS - 1 ou sinon clients[i+2].num ro = VIDE i > MAX_CLIENTS - 2 ou sinon clients[i+2].num ro = VIDE Dounepremireversiondelalgorithmecherch : Algorithme10:Vieillirtouslesclientsde1anVersion1.0 Algorithm vieillir e # Augm enter l ge de tous les clients de 1 an. Entre c l i e n t s : TABLEAU[ CLIENT] prcondition # Le tableau a t initialis. ( MIN_CLIENTS i MAX_CLIENTS)(clients[i] NUL) i, constante MIN_CLIENTS <- index_min( c l i e n t s ) VIDE : ENTIER <- MIN_CLIENTS - 1 EFFAC : ENTIER <- MIN_CLIENTS - 2 ABSENT : ENTIER <- MIN_CLIENTS - 3 variable i : ENTIER # Num ro de la prochaine case traiter. initialisation i <- MIN_CLIENTS - 2 jusqu i > MAX_CLIENTS - 2 ou sinon clients[i+2].num ro = VIDE rpter si clients[i+2].num ro EFFAC alors # Vieillir ce client.
- 22 ENI Editions - All rigths reserved - Jonifar lina

133

clients[i+2].p.ge <- clients[i+2].p.ge + 1 sinon # Ce client est effac : ne rien faire. Rien fin si i <- i + 1 fin rpter postcondition # Ne m odifie pas une case VIDE ou EFFACE. ( MIN_CLIENTS i MAX_CLIENTS) i, ( ancien( c l i e n t s ) [ i ] . n u m r o = V I D E ou ancien(clients)[i].num ro = EFFAC ) = > ancien( c l i e n t s ) [ i ] = c l i e n t s [ i ] # Vieillit tous les autres. ( MIN_CLIENTS i MAX_CLIENTS) i, ( ancien( c l i e n t s ) [ i ] . n u m r o V I D E ou ancien(clients)[i].num ro EFFAC ) = > clients[i].p.ge = ancien( c l i e n t s ) [ i ] . p . g e + 1 # le reste du tableau n e s t p a s m d i f i . o Seul l ge est m difi. o fin vieillir Cetalgorithmenestpas lgant .Onytrouvebeaucoupdecalculsdei+2quilerendentdifficilecomprendre. Cest le signe que lhypothse de dpart est mal choisie. Ces calculs inutiles sont limins en modifiant (H). Un second dfaut, plus grave, est que cette version ne dit rien de linvariant ou du variant de contrle. Vrifier cet algorithmedevientalorsdifficiledanscesconditions. Lamodificationdelhypothsepermetdecorrigercettesituation. Hypothse(H):lesgesonttajustsdanstouteslescases,jusqucelledenumroi 1inclus. Ontrouvealorsunalgorithmediffrentduprcdent,maisbienplusfacilecomprendreetmaintenir.Lanalyse dtailledecettenouvelleversionestlaisseenexercice.Ontrouvelalgorithmecidessousdanslequelnapast rptledbut,identiqueaudbutdelaversionprcdente. Algorithme11:Vieillirtouslesclientsde1anVersion2.0 Algorithm vieillir e ... initialisation i <- MIN_CLIENTS jusqu i > MAX_CLIENTS ou sinon clients[i].num ro = VIDE invariant i > MIN_CLIENTS = > estVieilli ( ancien( c l i e n t s ) , c l i e n t s , M I N _ C L I E N T S , i - 1 ) variant de contrle MAX_CLIENTS - i + 1 rpter si clients[i].num ro EFFAC alors # Vieillir ce client. clients[i].p.ge <- clients[i].p.ge + 1 sinon # Ce client est effac : ne rien faire. rien fin si i <- i + 1 fin rpter postcondition ...
ENI Editions - All rigths reserved - Jonifar lina - 23 -

134

IlrestecrireleprdicatestVieillietlutiliserpourexprimerlapostconditiondunefaonplusalgorithmique.Ce travailcomplmentaireestlaissenexercice. Onpeutcontinuerrsoudredesexercicesdanslemmecontexte.Envoiciquelquesexemples.

f.Exercices
Exercice2:TrouverlesclientshabitantLEMANS OnveuttablirlalistedesclientsdomicilisdanslavilleduMANSpourleurenvoyerunprospectus. 1.crirelalgorithmequidterminetouslesclientsquihabitentLEMANS. Unepromotionestprogrammepourlesclientsquihabitentdansle75etgsentre4050ans. 2.crirelalgorithmequislectionnecesclients.

- 24 -

ENI Editions - All rigths reserved - Jonifar lina

135

Itrerdansuntableau
Cette section prsente dautres exemples ditrations. Ce que nous savons dj permet dcrire des solutions compltes.Lapremirepartietudieendtailleproblmedeladterminationdurangdelacomposanteminimumdun vecteur.Onillustreainsi,unefoisdeplus,larecherchelinairedansuntableau.Ladeuximepartiedveloppelanalyse dun algorithme efficace de recherche dans un tableau tri. Il ne sagit plus dune recherche linaire et lanalyse est, cettefois,moinsimmdiate.

1.Rangdelacomposanteminimumduntableau
Ondonneuntableautdontlescomposantes,cestdirelescontenusdescases,sontduntypeTquelconquemais COMPARABLE.Lunedecescomposantes,aumoins,aunevaleurinfrieureougalelavaleurdetouteslesautres composantes :cestlacomposanteminimum.Onsintressesonnumrodecomposante,sonrang,dansletableau. Faireunalgorithmequicalculelerangdelacomposanteminimumduntableau. Ainsi, pour lexemple illustr par le dessin de la figure cidessous, la fonction retourne 7 puisque table[7] = 9 est la pluspetitevaleurdetable[5]table[11].

Lesspcificationsdelafonctionsontdonnescidessous. Algorithme12:SpcificationsdelafonctionrangDuMin

Algorithme rangDuMin # Le numro de case de la composante minimum de # table[dbut..fin]. Entre table : TABLEAU[TCOMPARABLE]# La table cible. dbut,fin:ENTIER # Lintervalle de recherche. Rsultat : ENTIER prcondition # Le tableau table[dbut .. fin] a t initialis. ( dbut i fin)(table[i] NUL) i, # dbut et fin sont des index valides sur table. index_valide( t a b l e , d b u t ) index_valide( t a b l e , f i n ) dbut fin postcondition min( t a b l e , d b u t , f i n ) = t a b l e [ Rsultat] fin rangDuMin LapostconditionexprimequelacomposantedenumroRsultatestleminimumdetable[dbut .. fin]enutilisant lalgorithmeminquilsagitprsentdespcifier.Cestfaitparlalgorithmesuivant. Algorithme13:Spcificationsdelafonctionmin Algorithm min e # La composante minimum de table[dbut .. fin]. Entre t a b l e : TABLEAU[ T COMPARABLE] # La table cible. d b u t , f i n : ENTIER # Lintervalle de recherche. Rsultat : ENTIER prcondition

ENI Editions - All rigths reserved - Jonifar lina

- 1-

136

# Le tableau table[dbut .. fin] a t initialis. ( dbut i fin)(table[i] NUL) i, # dbut et fin sont des index valides sur table. index_valide( t a b l e , d b u t ) index_valide( t a b l e , f i n ) dbut fin postcondition dbut = fin = > Rsultat = table[dbut] dbut < fin = > Rsultat = inf( t a b l e [ d b u t ] , min( t a b l e , d b u t + 1 , f i n ) ) fin min Ainsi, la fonctionmin rend cette fois la valeur de la composante minimum et non plus le numro de la case quelle occupe.Encoreunefois,ladeuximeclausedelapostconditiondecettefonctionutiliseunnouvelalgorithmeinf.En paraphrasantcetteclause,onaque,lorsquedbut < fin,lacomposanteminimumestlapluspetitedesdeuxvaleurs entrelapremirecomposanteetlacomposanteminimumdutableauprivdesapremirecase.Ilrestedoncencore spcifierinf. Algorithme14:Spcificationsdelafonctioninf Algorithm inf e # La valeur du plus petit des deux paramtres. Entre a , b : T COMPARABLE # Les valeurs comparer. Rsultat : T prcondition aucune postcondition a b = > Rsultat = a a > b = > Rsultat = b fin inf tudionslaralisationderangDuMin. Supposonsquenoussachionsdterminerlepluspetitlmentduntableaudeilments.Peutontrouverlepluspetit duntableaudei+1lments ?
q

si le (i + 1) m e lment est infrieur au minimum des i premiers lments, cest lui qui devient le nouveau minimum sinon,leminimumdjtrouvresteleminimumdesi+1lments.

Noussavonsdonctrouverleminimumdei + 1lmentsquandnousconnaissonsceluideilments.Posonsdonc : assertion(A):noussavonstrouverleminimumdei + 1lmentsquandnousconnaissonsceluideilments. Or, nous savons trouver le minimum dun tableau qui na quune seule composante. Dans le cas dune composante unique,cestellelacomposanteminimum.Voyonspourquoicecirsoutleproblme :
q

connaissant le minimum pour i = 1 lment, nous savons dterminer le minimum pour i + 1 = 2 lments daprslassertion(A) connaissant le minimum pour i = 2 lments, nous savons dterminer le minimum pour i + 1 = 3 lments daprs(A) connaissant le minimum pour i = 3 lments, nous savons dterminer le minimum pour i + 1 = 4 lments daprs(A) ... connaissant le minimum pour i = n 1 lments, nous savons dterminer le minimum pour i = n lments daprslassertion(A).

Faireunehypothsesurltatactuel

- 2-

ENI Editions - All rigths reserved - Jonifar lina

137

Hypothse(H):Rsultatestlerangduminimumdescomposantesdetabledepuiscelledenumrodbutjusqu celledenumroi 1inclus. Onobtientdonc : ... table[R s u l t a t ] = m i n (table, dbut, i - 1) Dansquellescirconstancesleproblmeestilalorsrsolu ? Voirsicestfini i - 1estlenumrodeladernirecomposanteobserve.Cestfinisilnexisteplusdecomposanteobserver,donc sii - 1 = fin,cestdiresii = fin + 1.Commeiaugmente,cestfinidsquei fin + 1etdoncdsquei> fin. Serapprocherdeltatfinal Dans le cas contraire, il faut observer la case suivante pour avancer vers la solution. La prochaine composante observerestcelledenumroi : ... si t a b l e [ i ] < t a b l e [ Rsultat] alors Rsultat <- i # Nouveau minimum. ... Danstouslescas,lasituationachang :unecomposantedeplusatobserve. # Rsultat est le rang du minimum des composantes de table depuis # celle de numro dbut jusqu celle de numro i inclus. Pourretrouverlasituationdcriteparlhypothseinitiale,ilsuffitdavanceri : ... i <- i + 1 # Rsultat est le rang du minimum des composantes de table depuis # celle de numro dbut jusqu celle de numro i - 1 inclus. Nous retrouvons ainsi un tat dans lequel lhypothse initiale est vraie et il est alors possible ditrer les mmes traitements.Litrationseterminecariestunentierquiaugmentechaqueitrationdepuisdbut.Parconsquent, fini+1diminuepouratteindre0lorsquei1=fin.Levariantdecontrledelitrationestdoncfini+1. Initialiserlecalcul Ilresteinitialiserlecalcul.Ilsagitderaliseruntatdanslequellhypothseestvrifie.Commei 1reprela dernire position observe dans la table, cest que i repre la prochaine position observer. Initialement, la prochainepositionobserverestcelledenumrodbut : ... initialisation i <- dbut ... IlfautaussidonnerunevaleurinitialeRsultatconformmentlhypothsededpart.Rsultatestlenumrodela casequicontientladernirevaleurminimumobserve.Dansuntableauduneseulecase,cettevaleurestcelledela premirecase.Ainsi,onpeutposer : ... initialisation i <- dbut Rsultat <- dbut ... Maisalors,onai1=dbutpuisquecesti1quirepreladernirecaseobserveetdonci = dbut + 1.Do
ENI Editions - All rigths reserved - Jonifar lina - 3-

138

lesinitialisationsdfinitives : ... initialisation i <- dbut + 1 Rsultat <- dbut ... Rdigerlalgorithmedfinitif Nousavonsvuquelestraitementsdoiventtrerptsjusqui > fin.Nouspouvonsaussiremarquerquecenest pasfinitantquei finetdoncrpterlestraitementstant quei fin.Lalgorithmeestdonc : Algorithme15:Recherchedurangdelacomposanteminimumduntableau Algorithm rangDuMin e # Le numro de case de la composante minimum de table. Entre t a b l e : TABLEAU[ T COMPARABLE] # La table cible. d b u t , f i n : ENTIER # Lintervalle de recherche. Rsultat : ENTIER prcondition # Le tableau table[dbut .. fin] a t initialis. ( dbut i fin)(table[i] NUL) i, # dbut et fin sont des index valides sur table. index_valide( t a b l e , d b u t ) index_valide( t a b l e , f i n ) dbut fin variable i : ENTIER # Numro de la prochaine composante observer. initialisation i <- dbut + 1 Rsultat <- dbut jusqu i > fin invariant i > dbut = > min( t a b l e , d b u t , i - 1) = table[Rsultat] variant de contrle fin - i + 1 rpter si t a b l e [ i ] < t a b l e [ Rsultat] alors Rsultat <- i fin si i <- i + 1 fin rpter postcondition min( t a b l e , d b u t , f i n ) = t a b l e [ Rsultat] fin rangDuMin Cetalgorithmetermineltude de la recherche du rang de la composante minimum. La recherche de la valeur de la composanteestlemmeproblme,quelquesajustementsprs.Laralisationdelalgorithmedelafonctioninfne fait pas intervenir litration. De mme, le problme dual, qui sintresse la composante maximum du tableau, se rsoutdelammefaon.Toutcequiestncessairelarsolutiondelexercicesuivantestdoncdjenplace. Exercice3:ComposantesMINetMAXduntableau Compltonsdabordlasolutionduproblmeprcdent. 1.crirelasolutioncompltedelalgorithmedelafonctionmin. 2.Donnerdemmeunesolutioncompltepourlafonctioninf. Ondonneuntableauoplusieursoccurrencesdelacomposanteminimumapparaissentdansdiffrentescases.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

139

3.QuelestlerangrenvoyparlafonctionrangDuMin? Lesproblmesduauxdesprcdentssersolventdelammefaon. 4.criredemmelesalgorithmescompletspourlesfonctionsrangDuMax,maxetsup.

2.Rechercherdansuntableautri
Lesrecherchesprcdentesnesupposaientriensurlesrelationsmutuellesentrelesdonnesenregistresdansle tableau. Il tait parcouru squentiellement, case par case, depuis la premire jusquau rsultat. Considrons, par exemple,leproblmedelarecherchedurangdunecomposantedonne.Pouruntableaudencomposantes,ilfaut, en moyenne, n/2 accs au tableau pour dterminer le rsultat si on ne dispose daucun renseignement sur la rpartition des donnes. Cependant, il est possible de rpartir les donnes en tenant compte de lutilisation du tableauetdelanaturedesrecherches.Ainsi,parexemple,dansuntableaudeclients,ilestpossiblederegrouperen ttedutableaulescomposanteslesplussouventaccdes,cestdirelesrenseignementsquiconcernentlesclients les plus fidles par exemple. De mme, si le tableau regroupe les entres dun dictionnaire lectronique, on ne placerapasenttedesmotscomme wagonouendomorphisme, moinsqueledictionnairenait une destination particulire, comme un dictionnaire destin apporter une aide certains jeux qui valorisent les mots peu utiliss. Cependant, ces considrations concernent lorganisation des donnes dans le tableau et pas les traitements algorithmiquesquirestentlesmmes. Lorsquelescomposantessonttries,enordrecroissantparexemple,leproblmepeutsersoudreautrement,dune faonplusefficace,encesensquelarecherchedunecomposantedonnedemanderamoinsdaccsauxlmentsdu tableau. Bien entendu, la rduction du nombre daccs ncessite ltude dun algorithme adapt : la recherche squentiellesuruntableautrirestelammepuisquellenesupposeriensurlarpartitiondesdonnes.Lasection suivantetudieunalgorithmederecherchedansuntableautri.

a.Recherchepardichotomie
On considre un tableau t dont les composantes sont dun type T quelconque mais COMPARABLEs. Les composantes de t sont tries, par exemple en ordre croissant, au moins dans la zone de recherche dune composante c donne ou de son rang dans t. Pour rechercher c, on procde de la faon suivante. On regarde dabordsicsesituedanslacaseaumilieudutableau.Cestfiniavecsuccssielleyest.Sinon,cestcomparela composantemdanslacasedumilieu.Commeletableauesttrienordrecroissant,cnepeutsetrouverquedansle demitableausuprieursielleestsuprieuremoudansledemitableauinfrieurdanslecascontraire.Ilestalors possibleditrerlestraitementsdansledemitableauslectionn.Lafiguresuivanteillustreleprocd.

Cette stratgie de recherche est appele recherche par dichotomie (binary search). chaque tape du calcul, cestdirepourpasserduntatintermdiaireausuivant,lespacederechercheestrduitdemoiti.Cestungain considrableparrapportlarecherchelinaire.Alorsquepourcelleci,doublerlatailledutableaudoublelenombre moyen daccs au tableau, pour cellel, doubler la taille du tableau ne fait quaugmenter dune unit le nombre daccs. Soitdichotomieunefonctionquidterminelerangdunecomposantequelconquedonnedansuntableautrien ordrecroissant.Sesspcificationssontcellesdelalgorithmecidessous. Algorithme16:SpcificationsdelafonctiondichotomieVersion1.0 Algorithm dichotomie e # Rang de c dans t[dbut .. fin] ou ABSENT. Entre t : TABLEAU[ T -> COMPARABLE] # Cible de la recherche. d b u t , f i n : ENTIER # Intervalle de recherche. c : T # Composante chercher. Rsultat : ENTIER # Numro de case contenant c ou ABSENT. prcondition index_valide( t , d b u t ) index_valide( t , f i n )
ENI Editions - All rigths reserved - Jonifar lina - 5-

140

dbut fin # t[dbut .. fin] est initialis. ( dbut k fin) (t[k] NUL) k, # t[dbut .. fin] tri en ordre croissant. estTriAsc( t , d b u t , f i n ) postcondition ( Rsultat = ABSENT et ( dbut k fin) (t[k] c)) k, ou sinon (dbut Rsultat fin et t [ Rsultat] = c) fin dichotomie LaprconditionutiliseleprdicatestTriAscquirendVRAIsietseulementsiletableauenpremierparamtreest trienordrecroissantdanslazoneprciseparlesparamtresdbutetfin.Lesspcificationsdeceprdicatsont donnesplusbas. Lapostconditionestdelectureimmdiate.Ilestpossibledendonneruneexpressionpurementalgorithmique,mais quiserabeaucoupplusdifficilelireetdonc,comprendre. LesspcificationsduprdicatestTriAscsontdonnesparlalgorithmesuivant. Algorithme17:SpcificationsdelafonctionestTriAsc Algorithm estTriAsc e # t[dbut .. fin] est-il tri en ordre croissant ? Entre t : TABLEAU[ T -> COMPARABLE] d b u t , f i n : ENTIER Rsultat : BOOLEN prcondition index_valide( t , d b u t ) index_valide( t , f i n ) dbut fin # t[dbut .. fin] est initialis. ( dbut k fin) (t[k] NUL) k, postcondition dbut = fin = > Rsultat = VRAI dbut < fin = > Rsultat = ( t[dbut] t[dbut+1] et alors estTriAsc( t , d b u t + 1 , f i n ) ) fin estTriAsc Il reste crire la ralisation dedichotomie. Commenons par observer la composante au milieu du tableau. Son numromilieuestobtenuencalculantlequotiententierde(dbut + fin)dansladivisionpar2.Cenumroestle rsultatattendusilacasedenumromilieucontientc.Sinon,ilfautplacercparrapportaucontenudelacaseau milieudutableauetslectionnerainsiledemitableaudanslequelvasepoursuivrelarecherche.mesurequecette recherche avance et chaque tape, la longueur du tableau explorer est rduite de moiti. Dans un tat intermdiaire,lasituationestreprsenteparlafiguresuivante:

Cettefiguremontreuntatdanslequellespartiest[dbut .. i - 1]ett[j + 1 .. fin]onttliminesdela recherche.Lapartiet[i .. j]resteexplorer.Nouspouvonsdoncprciserlhypothsedetravail.Commenonspar uneversionincorrecte.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

141

Faireunehypothsesurltatactuel Hypothse(H):cnestnidanst[dbut..i1],nidanst[j+1..fin].Rsultat=ABSENT. Voyezvouspourquoicettehypothsenestpassatisfaisante ?Exploitonslapourvoiroellenousmne. Voirsicestfini Cestfinilorsqueleszonesdjexploresserejoignent,donclorsquei - 1 = j : ... Cest fini et c nest pas trouv lorsque i - 1 =j Onpeutaussicaractrisercettesituationpari=j+1.Lorsquecenestpasfini,cestquilresteencoredescases explorer. Serapprocherdeltatfinal Le tableau doit encore tre explor de la case de numro i jusqu la case de numro j. La stratgie adopte consistediviserletableauendeuxdemitableaux.Pourcela,ilsuffitdecalculerlenumrodelacasecentrale,puis desituerlavaleurcherchedanslesdeuxdemitableauxainsidfinis : ... # Numro de la case du milieu. m l i e u <- quotient( i + j , 2 ) i # milieu est-il le numro de case cherch ? si t[m lieu] = c i alors c e s t f i n i : t r o u v e n m l i e u i sinon # Placer c par rapport t[milieu] si t[m lieu] < c i alors c est dans le dem i-tableau droit sinon c est dans le dem i-tableau gauche fin si fin si ... Pour exprimer quec est dans le demitableaudroit,ilsuffitdefaireensortequeledemitableau infrieur soit limindelarecherche.Cesti1quidonnelalimitedudemitableaugauche.Onretrouvedonc(H)enajustanti 1pourquilsoitgalmilieu.Onaurai 1 = milieulorsquei = milieu + 1 : ... # c est dans le demi-tableau droit. i <- m ilieu + 1 ... Demme,cestdansledemitableaugauchesexprimeencrivant : ... # c est dans le demi-tableau gauche. j <- mi l i e u - 1 ... Initialiserlecalcul (H) prcise que toutes les cases jusqu celle de numro i 1 et depuis celle de numro j + 1 ont dj t observes. La prochaine case observer dans le demitableau gauche est celle de numro i. Initialement, cest dbut : ...
ENI Editions - All rigths reserved - Jonifar lina - 7-

142

initialisation i <- dbut ... Demme,laprochainecaseobserverdansledemitableaudroitestcelledenumroj.Initialementcestfin : ... initialisation j <- f i n ... Enfin,onchercheencoreetdonc,lacasecontenantcnapasencorettrouve : ... initialisation Rsultat <- ABSENT ... Lesinitialisationscompltessontdonclessuivantes : ... initialisation i <- dbut j <- f i n Rsultat <- ABSENT ... Rdigerlalgorithmedfinitif Ilresteexprimerlaconditiondarrtdelarecherche,linvariantetlevariantdecontrledelitration. Cestfinietcnapasttrouvlorsquei1=j,donclorsquei=j+1,soitdsquei j + 1ouencoreds que i > j. Ainsi, les traitements sont itrer jusqu ce que i > j ou alors lorsque c a t trouv, cestdire lorsquelersultatnestplusABSENT.Dansuntatintermdiairequelconque,lhypothse(H)maintenirscrit : invariant c < t[i] o u t[j] < c => R s u l t a t = ABSENT Larechercheestdoncenchecdanslesdeuxdemitableauxlorsqueietjsontentredbutetfin : invariant i > dbut et j < fin = > ( non estDans( t , d b u t , i - 1 , c ) et non estDans( t , j + 1 , f i n , c ) ) ... Enfin,iaugmenteetjdiminuejusqui1=jdaprslaconditiondarrt.Ainsi,ji+1diminuevers0.Cest levariantdecontrle.Ilmesurelenombredecasesquinontpasencoretobservesdanslargiont[i .. j]. Lalgorithmecidessousestuneversionprovisoiredanslaquelleonnerptepaslaprconditionetlapostcondition. Algorithme18:DfinitiondelafonctiondichotomieVersionprovisoire Algorithm dichotomie e # Le rang de c dans t[dbut .. fin]. Entre t : TABLEAU[ T COMPARABLE] # La cible de la recherche. d b u t , f i n : ENTIER # Numros des cases du domaine de recherche. c : T # La composante cherche. Rsultat : ENTIER # Le numro de la case de t[dbut .. fin ] # qui contient c ou sinon ABSENT. prcondition ... variable

- 8-

ENI Editions - All rigths reserved - Jonifar lina

143

i, j : ENTIER # Numros des cases entre lesquelles chercher. mi l i e u : ENTIER # Numro case milieu du domaine de recherche. initialisation i <- dbut j <- f i n Rsultat <- ABSENT invariant i > dbut et j < fin = > ( non estDans( t , d b u t , i - 1 , c ) et non estDans( t , j + 1 , f i n , c ) ) variant de contrle j - i + 1 jusqu i > j ou Rsultat ABSENT rpter # Numro de la case au milieu du domaine de recherche. m l i e u <- quotient( i + j , 2 ) i # milieu est-il le numro de la case cherche ? si t[m lieu] = c i alors # Cest fini : c trouv dans la case de numro milieu. Rsultat <- mi l i e u sinon # Situer c par rapport t[milieu]. si t[m lieu] < c i alors # c nest pas dans le demi-tableau gauche. i <- m ilieu + 1 sinon # c nest pas dans le demi-tableau droit. j <- mi l i e u - 1 fin si fin si fin rpter postcondition ... fin dichotomie Maisquesepassetillorsquecnestpasunecomposantedudomainederecherche,autrementditlorsquecnest pasunecomposantedet[dbut..fin] ?Lalgorithmeprcdentparcourtmalgrtoutletableaujusqucequei >jetsetermineavecRsultat=ABSENT.Cependant,lorsquec < t[dbut]ouquec > t[fin], lexplorationdet [dbut..fin]estinutilepuisquetesttrienordrecroissantparhypothse.Ona,eneffet : (c < t[dbut] o u c > t[fin]) => (( k, dbut k fin) (c t[k])) Appelons(1)cettequation.Elleexprimequecnestpasdanst lorsquec < t [ d b u t ] ouc > t [ f i n ] .Danscecas,le parcoursdet [ d b u t . . f i n ] estinutile,bienquelersultatobtenusoitcorrect.Doitonseproccuperdobtenirune solution mieux construite alors que celleci donne le bon rsultat ? Sans doute oui, car ce qui ne va pas dans cet algorithme,cestquilestconstruitsurunehypothse(H)quinedcritpascorrectementltatintermdiaire.Comme toutlerestesendduit,onnepeutpasfaireconfiancecettesolution. (H)noncequecnestpasencoretrouv,maissionchercheencore,cestquenousnesavonspassicestounon unecomposantedet .Or,lorsquec < t[dbut]ouquec > t [ f i n ] ,onsaitquecnestpasdanst [ d b u t . . f i n ] daprs lquation (1). Reformulons donc (H) : il est inutile de chercher si la prcondition exprime par (1) est satisfaite. Par consquent, si la recherche nest pas termine, cest que cette quation exprime une condition qui nestpassatisfaite : Hypothse(H):t[dbut]ct[fin]etcnestnidanst[dbut..i1],nidanst[j+1..fin].Rsultat = ABSENT. Ce qui change, ce sont les initialisations et linvariant. Pour raliser ltat initial, il faut dabord sassurer que t [ d b u t ] c t [ f i n ] :

ENI Editions - All rigths reserved - Jonifar lina

- 9-

144

... Rsultat <- ABSENT # Encore rien trouv. si t[dbut] c t[fin] alors # c ne satisfait pas la prcondition de lquation (1). . . . c o mme l algorithm prcdent. e sinon # c t[dbut .. fin]. rien fin si ... Linvariantexprimequet[dbut] c t[fin]quandoncherchedanst : ... invariant t[dbut] c t[fin] et . . . c o mme l algorithm prcdent. e ... Lalgorithmedfinitifestdonclesuivant,danslequelnesontpasrpteslasignatureetlesdclarations : Algorithme19:DfinitiondelafonctiondichotomieVersiondfinitive ... initialisation Rsultat <- ABSENT si t[dbut] c t[fin] alors i <- dbut j <- f i n invariant t[dbut] c t[fin] et ( i > dbut et j < fin = > ( non estDans( t , d b u t , i - 1 , c ) et non estDans( t , j + 1 , f i n , c ) ) ) jusqu i > j ou Rsultat ABSENT variant de contrle j - i + 1 rpter # Num ro de la case au m ilieu du dom aine de recherche. m l i e u <- quotient( i + j , 2 ) i # m l i e u e s t-il le num i ro de la case cherche ? si t[m lieu] = c i alors # C est fini : c trouv dans la case de num ro m ilieu. Rsultat <- mi l i e u sinon # Situer c par rapport t[m lieu]. i si t[m lieu] < c i alors # c n est pas dans le dem i-tableau gauche. i <- m ilieu + 1 sinon

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

145

# c n est pas dans le dem a b l e a u d r o i t . i-t j <- mi l i e u - 1 fin si fin si fin rpter fin si ...
Le problme algorithmique est rsolu. Linformaticien programmeur cherchera ensuite implmenter cette solution dans un langage particulier, pour une architecture matrielle particulire. Cestunautreproblme,quinentrepas dans le cadre des proccupations de ce livre. Cependant, nous pouvons faire quelques remarques au sujet de limplmentationdecetalgorithme. Lecalculdemi l i e uestexprimicipar : milieu <- q u o t i e n t (i + j, 2) qui indique que mi l i e u est le quotient entier dans la division euclidienne de i + j par 2. Il est clair que limplmentation de ce calcul nutilisera probablement pas une fonction quotient mais les oprations arithmtiques correspondantes.Ainsi,enlangageCparexemple,oncrirait : int i , j , mi l i e u ; ... m lieu = (i + j) / 2 ; i ... Lapremireinstructiondclaretroisentiers.Linstructionsuivanteaffectemi l i e ulademisommedesentiersi etj . Cependant, tout entier est reprsent en machine par une donne dont le domaine est restreint un sous ensembledesentiers.Cetterestrictionestimposeparlatechnologiedescalculateurs.Ainsi,ladditioni + j peut conduire un rsultat qui nest plus dans le domaine des entiers reprsentables en machine. Cest le cas, par exemple, ds quei etj sontdeuxnombresstrictementsuprieurslamoitidelabornesuprieuredesentiers reprsentables. Il en rsulte un dpassement de capacit et, au mieux, un diagnostic derreur du processeur du langageutilis,aupireuncalculquicontinueavecunrsultatfaux.Cetypedeproblmeseprsentefrquemment enimplmentation,avecdautresdifficultsplussubtilesetincomparablementplusdifficilesrsoudre.Cetexemple montreque,lalgorithmetantaupoint,leproblmeinformatiquenestpaspourautantrsolu. Revenons notre exemple. Il existe diffrentes solutions pour viter les dpassements de capacit dans ce cas. Lunedellesconsistecalculerlavaleurdemi l i e uenneralisantquedesoprationssres,cestdiredonton vrifiequellesneprovoquerontpasdedpassement.Ainsi,parexemple,ilestfaciledevrifierque : q u o t i e n t (i + j, 2) = i + q u o t i e n t (j - i, 2) Onprogrammeradonc: milieu = i + (j - i) / 2 ; ce qui garantit que les oprations ne conduisent aucun dpassement de capacit des entiers rsultats. La soustractionneprovoquerapasdedbordementpuisquei etj sontdeuxentierspositifsounulsetque,deplus,i jdansledomainedecalculdemi l i e u.Uneautresolutionconsisteexploiterlesoprateursbinairesfournispas certainslangages,dontlelangageC.Unedivisionpar2consisteraliserundcalagedunrangversladroitedes chiffresbinairesdunombrediviser.Cetleslangagesdrivsfournissentpourcelaloprateur>> : milieu = (i + j) >> 1 ; Danscecas,lespropritsdeloprationdedcalagedroitefontqueledpassementdecapacitsurlasomme,si elleneprovoquepasderreur,napasdeconsquencenfastesurlersultatducalculdemi l i e u.

b.Extensions
Exercice4:Complments 1.crireuneralisationitrativedeestTriAsc.Modifierlalgorithmepourladapteruntableautrienordredcroissant. 2.crireuneralisationrcursivedelafonctiondichotomie.

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

146

Algorithmeouprogramme?
Nous en savons suffisamment prsent pour revenir sur quelques notions qui ont dj t abordes dans les chapitres Questce que lalgorithmique ? et Programmes directs. Questce quun algorithme ? Questce qui le distinguedunprogrammedestinunordinateur ?Construireunprogrammeetdfinirunalgorithmesontellesdes activits distinctes, chacune dveloppant ses propres mthodes, ou ne constituentelles que les deux faces de la mmemdaille ?Cettesectionnecherchepasrpondredefaondfinitive.Onyexposeseulementquelquesides simplesquicompltentlavisionpartielledeschapitresprcdents.Lapremirepartiedveloppeunexemplerecopi dunlivrequitraitedalgorithmique.Lasecondepartieexposelunedessolutionsprconisespourleproblme.

1.Unexempledifiant
On a initialis un tableau t de 100 composantes relles positives avec n nombres, 0 n 100 dont on veut dterminerlamoyennearithmtique.Dansunlivrequejenauraipaslacruautdeciter,jelislasolutionsuivante : VAR marques : TABLEAU[1 .. 100] de REL ; nombres : ENTIER ; somme, i : ENTIER ; moyenne : REL ; DBUT (* Remplir le tableau *) i := 1 ; crire("Donner un entier : ") ; lire(marque[i]) ; TANT QUE(marques[i] < > - 1) DBUT i := i + 1 ; crire("Quel est lentier suivant ? ") ; lire(marques[i]) ; FIN ; (* Calculer la moyenne *) nombres := i ; i := 1 ; somme := 0 ; TANT QUE(i < > nombres) DBUT somme := somme + marques[i] ; i := i + 1 ; FIN ; moyenne := somme / nombres ; (* Afficher le rsultat *) crire("La moyenne est ", moyenne) ; FIN. Les constructions (* *) indiquent un commentaire. Loprateur := est loprateur daffectation qui initialise la variable gauche par le rsultat de lvaluation de lexpression droite. Les autres constructions syntaxiques ne devraientpasposerdeproblmedecomprhensiondecetexte.Laprsentationdutextedorigineatlgrement modifiepourenamliorerlalecture,maiscesmodificationsnaffectentpaslesconclusionsdeladiscussionquisuit. Bienentendu,vousavezdjreprleserreursessentiellesmajeuresdecettesolution.Cettesolutionressemble unecaricature,etpourtant Onpeutfaire,cettefaondenvisagerleproblme,deuxfamillesdereprochesquinesontpasdemmenature,ni surtoutdemmeimportance :lesmaladressesetlesfautes,cellesciexpliquantenpartiecellesl.

a.Quelquesmaladresses:lesnotations
Passonsrapidementsurquelquesmaladressesvnielles,commeparexemplelesformessyntaxiquesquisemblent obligatoires : le pointvirgule systmatique en fin de ligne, loprateur < > au lieu de , DBUT .. FIN pour dlimiterlesblocs. De mme que la recette de cuisine nest pas la prparation du plat, lalgorithmique se distingue de la programmationencequeleursobjectifs,leursexigences,leursmthodesetleursoutilsnesontpaslesmmes.La premirecibleunemachineabstraitedontle processeur seraitlecerveauhumain.Lautreconcerneunemachine

ENI Editions - All rigths reserved - Jonifar lina

- 1-

147

virtuelleinfinimentplusrudimentaire.Ainsi,parexemple,uncompilateurdelangageanalyseuntextedeprogramme danslequelonveutpouvoirutiliserlibrementlespacepourleprsenterlisiblement.Ilexigedonc,souventmaispas toujours,unsparateur,usuellementlepointvirgule,pourdistinguerlesinstructionslesunesdesautres.Pourquoi cettecomplicationdansletextedunalgorithmelorsquilnyapasdambigutpossiblepourle processeur dela machine abstraite auquel il est destin ? De mme, pourquoi utiliser < > au lieu du symbole usuel en Mathmatiques ?Maiscesontdesdtails.Aprstout,lunedesthsesdecelivreaffirmequelasyntaxeestlibre, alorspourquoipasa<>baulieudea b ?Leclavierdunordinateurnepermetpastoujoursdeprsenter lessymbolesmathmatiques,aussi,laissonsdectcesreproches. Undeuximetypedemaladressesestlanotationadoptequiestplus gnante . Letexteestrdigdansun langage qui ressemble beaucoup au langage de programmation PASCAL dont les motsclauraienttfranciss. Quelpeutbientrelintrtdecettepratique ?Lapauvretlexicaledunlangagedeprogrammationnestpasun frein insurmontable la comprhension de son texte. Ce nest pas cette distance aux pratiques grammaticales quotidiennesdulecteurquipeutlempcherdapprhenderimmdiatementletextedelalgorithmecritdirectement danslelangagecible.Pourlacomprhensiondelasolution,lanotationcidessousestrigoureusementquivalente laprcdente : VAR marques : ARRAY[1 .. 100] OF REAL ; nombres : INTEGER ; somme, i : INTEGER ; moyenne : REAL ; BEGINx (* Remplir le tableau *) i := 1 ; WRITE("Donner un entier : ") ; READ(marque[i]) ; WHILE(marques[i] < > - 1) DO BEGIN i := i + 1 ; WRITE("Quel est lentier suivant ? ") ; READ(marques[i]) ; END ; (* Calculer la moyenne *) nombres := i ; i := 1 ; somme := 0 ; WHILE(i < > nombres) DO BEGIN somme := somme + marques[i] ; i := i + 1 ; END ; moyenne := somme / nombres ; (* Afficher le rsultat *) WRITE("La moyenne est ", moyenne) ; END.

(* R1 *)

(* R2 *)

OnpeutalorsfairelconomiedecettecomplicationinutilequiconsistecriredabordunprogrammeenFranais pour ensuite en traduire les motscls en Anglais. L encore, ce nest pas lessentiel. La syntaxe dunalgorithme tant libre, pourquoi pas du FrenchPascal ? Sauf que, cette fois, une telle pratique fait des ravages chez les apprentisprogrammeurs.Ilsnetardentpascomprendrequonlesinviteunjeustrileetmmenuisibleence quildistraitdelessentiel :crireunprogrammejuste !Onleurdemandedcriredeuxfoislemmetexteetilsont raison :pourquoifairedabordunprogrammeenFranaisalorsquilestsisimpledelcrire dembledanslebon langage ? Pour crire un algorithme, il FAUT utiliser une notation libre, mais claire et concise, qui met bien en videncelesquencementdesactionsraliserenfonctiondesassertionsquidcriventlestatsintermdiaires dusystme.Nousyreviendronsplusbas. Unemaladressedummeordreestlemlange,danslecorpsdelalgorithme,declausesdestinescalculerune moyenne et dinstructionsdentre/sortie :crire,lire. Quel est la responsabilit de cet algorithme : calculer une moyenne ? Raliser les interfaces entre un utilisateur et un programme ? Les instructions dentre/sortie, quelquesraresexceptionsquiconcernentlaconceptiondinterfaces,sontdesinstructionsdeprogrammation :elles nontrienfairedansunalgorithmedecalcul !Ici,nousvoulonscalculerunemoyennearithmtique : moyenne(la structure de donnes en entre) : REL ... < clauses ralisant le calcul > ... Cest la fonction moyenne dinterroger un tableau, le rsultat dune requte une base de donnes pour effectuercecalcul.Changerlastructurededonnesenentrenemodifie,ventuellement,queladfinitiondecet

- 2-

ENI Editions - All rigths reserved - Jonifar lina

148

algorithmeetlaconstructiondecettestructureneleconcernepas. Lalgorithme, le programme destin la machine abstraite, exprime ce que fait le programme abstrait et, accessoirement,commentillefait.Leprogrammedestinlamachineconcrteneditquasimentriensurcequil fait : il ne dit que comment il ralise certaines transformations sur les donnes. Cest cette particularit de la programmation qui exige une tude pralable soigne de la dfinition des transformations faire subir aux donnes. Or, les valeurs de ces dernires caractrisent ltat dans lequel se trouve le systme logiciel et cestle contrledelasuccessiondecestatsquipermetdevrifierlacorrectiondunprogramme :convergetilversltat danslequellesvaleursdesvariablesreprsententltatfinalattendu ?Encoreunefois,lecommentestaccessoire dansunalgorithme :cestdelaprogrammationetleslangagesinventsdanscebutlexprimenttrsbien.Ilnya paslieudelesmodifierpourcela.Lalgorithme,lui,apourresponsabilitdemettreenvidencelestatssuccessifs dusystmelogiciel,depuisltatinitialIjusqultatfinalF,enexprimantlesassertionsconstruitessurlesvaleurs desvariablesquiralisentlestatssuccessifs. Reprenonsnotrealgorithmedecalcul.Ildoitdirecequilfait.Lasignatureexprimedabordquilsagitdunefonction. Cest la notation : REL place en fin de signature qui lindique : cet algorithme calcule un rsultat qui est un nombrerel.Ilnemodifiepaslesdonnesquilreoitpourralisercecalcul :cestunepropritimplicite,maisce nest pas la seule convention possible. De mme, au lieu des notations prcdentes, il est possible dcrire, par exemple : moyenne Entre un tableau marques de nombres rels positifs ou nuls unentiern0quiestlenombrederelsdansmarques Rsultat n>0=>lamoyennearithmtiquerelledescomposantesde numros1ndemarques n=0=>INFINI Que se passeratil si cet algorithme doit effectuer son calcul partir de donnes calcules et que les calculs pralablesontdonnn<0 ?Lescalculspralablesnesontpasdesaresponsabilit.Demme,cenestpaslui desavoirsiltatdusystmelogicielestuntatvalidepourfaireappelsesservices.Cestunalgorithmedecalcul dunemoyennearithmtique,quisaitfairececalculpourunnombredecomposantespositifounuldansuntableau de nombres rels. Il ne peut pas faire moins on ne peut pas lui en demander plus. Cependant, ces conditions doiventtreprcises.Cestlobjetdelaprcondition.Elleditdansqueltatdoitsetrouverlesystmepourque lalgorithmegarantisselesrsultatsquilproduit.Letableauderelsdoitexister,avoirtdclaretinitialisavec desnombresrelspositifsounuls,icientrelescomposantesdenumros1n : ... prcondition marquesNUL n0 index_valide(marques,1) index_valide(marques,n) ( i, 1 i n)(m arques[i] 0) ... Bienentendu,onprciseainsiuntatinitial.Ilestpossibledelefaireavecdautresnotations : tat initial n 0 m arques[1 .. n] est dfini (toutes les com posantes ont une valeur lgale) et chaque com posante est un rel positif ou nul ... Laprconditionestunprdicatquiestfait,saufmentioncontraire,delaconjonctiondeclausesdontlavaleurest soitVRAI,soitFAUX.Autrementdit,chaqueclausedelaprconditionestrelieauxautresclausesparunetlogique. La prcondition prend la valeur FAUX si lune au moins des clauses qui la composent prend la valeur FAUX. Alors, lalgorithmesautorisefaire cequilveut :renvoyerunrsultatnul,renvoyerunrsultatquelconquemaisnon nul, provoquer larrt brutal des calculs quand il sera implment, ne rien faire On ne sait pas : cest lui qui dcide . Cesconditionstantremplies,ilsagit,prsent,deprciserltatfinal.Cestfaitdanslapostcondition.Elleutilise, commelaprconditionetsaufmentioncontraire,uneconjonctiondeclausespourdcrireltatfinal. postcondition n > 0 = >Rsultat = m oyenne arithm tique des com posantes de num ros 1 n du tableau m arques n = 0 = >Rsultat = INFINI Lencore,onpeutfaireautrementetutiliser,parexemple,lesymbolismemathmatiquequiestbienplusfacile

ENI Editions - All rigths reserved - Jonifar lina

- 3-

149

lireetcomprendredemble,avecuneculturerduitedanscedomaine. Lasignaturedelalgorithmeetlecommentairequilaccompagne,laprconditionetlapostconditionconstituentla partiepubliquedumodulelogiciel.Nouslavonsdjsoulign :cestsadocumentation.Ilsagitdesrenseignements communiqus tout utilisateur de ses services. Ces renseignements sont ncessaires et suffisants un usage avertidelalgorithme.Cependant,lecorpsdelalgorithmenestpasncessairesadocumentation.Ondoitpouvoir senpassercarcequildit,pourlessentiel,cestcommentilfaitpourcalculerunemoyenne.Dailleurs,cecontenu nest pas ncessairement disponible lorsque cest limplmentation dun algorithme qui est utilise dans un dveloppement. Cette implmentation particulire est souvent un composant commercial dont le code source est protg et inaccessible. Cest ce qui explique que, parfois, la clause qui exprime une postcondition semble copier uneinstructionducorpsdelalgorithme : ... x <- a + b ... postcondition x = a + b ... Cest que, pour lutilisateur de lalgorithme, la seule partie visible est le bloc de la postcondition. Il nest pas ncessairedeluicommuniquercommentestobtenucettat.Dailleurs,ilestpossibleque,dansuneautreversion, cet tat soit obtenu autrement. Un chapitre ultrieur montrera diffrentes ralisations dun algorithme de tri des composantesduntableauqui,toutes,serontdfiniesparlammespcification. Pourrsumercequivientdtredveloppdanscettesection,voyezledessinsuivant.

Onyvoitreprsentstroisdomaines :unsystmelogicielquiraliseuncalculausensdonncemotauchapitre Questcequelalgorithmique ?,unutilisateur,cestdireunclient,logicielouhumain,desservicesdusystmeet des interfaces entre lutilisateur et le logiciel. Le domaine de lalgorithme, sauf cas particuliers certes importants maiscependantmarginaux,estceluidusystmelogicielpourlequelildoitexprimerclairementlesresponsabilits. Leresterelvedelaprogrammation. Pour revenir cet algorithme de calcul de moyenne, tout ce qui prcde relve du dtail compar aux fautes quilcontient :ceprogrammeestfauxdelapirefaonquisoit :ildonne presquetoujours unrsultatplausible. Lutiliser avec un grand nombre de composantes risque de ne jamais rvler les erreurs de programmation. Pourtant,uneanalysesoigneauraitpermisdliminerleserreurslesplusgrossires.Voyonsdabord pourquoi il estfaux.Lasectionsuivanteexposeracommentobtenirunesolutioncorrecte.

b.Quandlesfautesfontoublierlesmaladresses
Le programme propos est fait de trois segments. Il remplit un tableau de nombres rels en les comptant il explore ce tableau pour calculer la moyenne des nombres quil contient enfin, il crit la moyenne calcule, sans doutesuruncran.Pourremplirletableau,ilinitialisepuisitreunmmetraitement :
q

incrmenterlenumroidelaprochainecaseinitialiser crireunmessagedappel lireunevaleuretlarangerdanslacasedenumroidutableau.

Laconditiondarrtdelitrationestlavaleurrangedanslacasedenumroi :lasaisieseterminelorsquecette valeur est 1. Cest la faute majeure de ce programme. Par une hypothse implicite, qui aurait du tre formule clairement,iestlenumrodelaprochainecaseremplir.Eneffet,ilestinitialis1alorsquaucunevaleurna encoretplacedansletableau.Laconfusionentrecalculetentre/sortieralise,parunemmeinstruction,la lecturedunedonneetsontransfertdansletableau.Cestfaitlalignetiquete(* R1*)dabord,puislaligne (* R2 *)pourlesvaleurssuccessives.Ainsi,onobtient :

- 4-

ENI Editions - All rigths reserved - Jonifar lina

150

... (* marques[1 .. i - 1] a t initialis. La prochaine case remplir a le numro i *) crire( . . . ) lire( m r q u e s [ i ] ) a ... Mais lorsque loprateur termine la saisie, il entre 1 qui est compt comme toute autre valeur et rang dans le tableau.Onsattendalorscequeleprogrammecorrige,maiscenestpaslecas.Ainsi,lamoyenneestensuite calcule sur un nombre de valeurs trop lev dune unit et avec une valeur parasite gale 1 qui diminue dautant la somme des valeurs. Ce programme est dfinitivement faux et pour des raisons qui perdurent dans lapprentissage et les pratiques de la programmation depuis la prhistoire de linformatique, et cela, malgr les leonsdesmatresdudomaine :onprogrammeaulieudtudierleproblme.Onditcommentfaireaulieudedire quoi faire. Au passage, on remarque aussi que la confusion des rles est sans doute dicte par une confusion probablementplusprofondesurlesconcepts.Leslangagesdeprogrammationproposentdeuxfamillesdemodules logiciels : les procdures et les fonctions. Nous avons dj longuement prcis la distinction fondamentale entre eux au chapitre Programmes directs. La responsabilit de la procdure est de modifier des variables dtat.Celle dune fonction est de calculer un rsultat. Comme une opration mathmatique, une fonction ne modifie pas ses oprandes. Que dire du programme propos ? Le modulelire rcupre une valeur obtenue de lutilisateur. En ce sens, cest une fonction : elle interroge le systme externe et en obtient une valeur. Cependant, elle reoit en paramtre une variable quelle modifie, quelle initialise. En ce sens, cest une procdure. Que certains langages permettentousimplementsaccommodentdetellespratiquesdoitjustementnousrendrevigilants :ilfautdetoute ncessitdistinguerlesdiffrentesresponsabilitsjusquedansnotrefaondcrire les modules logiciels. Cestla seulefaondenousassurerquenouscontrlonsbienleschangementsdtats. Continuons sur les fautes. Lutilisateur peut demble saisir 1 pour la premire valeur. Aucune valeur pertinente naura alors t saisie et le programme calculera cependant une moyenne : cest lerreur mise en vidence prcdemment.Sinousmodifionsceprogrammepourliminercettevaleurparasite,alorsn=0etleprogrammese termineparunedivisionpar0.Bref,ilsemblebienquil nyaitriensauverdecettesolution.Quandbienmme quelques rustines rtabliraient un semblant de programme correct, quelle confiance pourraiton accorder au rsultat ?Lasectionsuivantetudieunesolutioncorrecte.Commenonsparlecalculdelamoyenne.

2.Unesolutionauproblmedelamoyenne
Lecalculdelamoyenneestralisparunefonction,djpartiellementdfinieprcdemment,quidiviselasomme descomposantesdutableaumarquesparlenombredecomposantesadditionnes.Ilnenfautpaspluspourcrire cettefonction.Cestfaitparlalgorithmecidessous. Algorithme20:Dfinitiondelafonctionmoyenne Algorithm moyenne e # La moyenne arithmtique de marques[1 .. n]. Entre m arques : TABLEAU[ REL] n : ENTIER # Nombre de composantes de marques. Rsultat : REL prcondition # Les composantes de marques sont numrotes de 1 n. index_valide(m arques, 1) index_valide(m arques, n) # Les composantes de marques[1 .. n] ont t initialises. ( 1 k n)(m k, arques[k] NUL) ralisation si n = 0 alors Rsultat <- I N F I N I sinon Rsultat <- somme(m arques, 1, n) / n fin si postcondition n = 0 = >Rsultat = INFINI n > 0 = >Rsultat = somme(m arques, 1, n) / n fin moyenne

ENI Editions - All rigths reserved - Jonifar lina

- 5-

151

Cest au programme de dfinir INFINI et donc de donner un sens au calcul de la moyenne lorsque le nombre de constituants de cette moyenne est nul. Remarquez aussi que la clause qui concerne le domaine des valeurs des composantes du tableau marques a disparu. Cestquun calcul de moyenne est valide pour des rels quelconques, pasncessairementpositifsounuls. Le calcul fait intervenir une fonction somme qui rend la somme des composantes du tableau quelle reoit en paramtre.Pourrestergnral,ellereoit,enplusdutableau,lesnumrosdelapremireetdeladernirecasesur lesquelleselleopre.Ilestpossibledeprcisersasignatureetlaprcondition : Algorithm somme e # Somme des composantes de t[dbut .. fin]. Entre t : TABLEAU[ REL] # La cible du calcul de la somme. d b u t , f i n : ENTIER # Num. composantes extrmes additionner. Rsultat : REL prcondition # dbut et fin sont des numros de cases valides. index_valide( t , d b u t ) index_valide( t , f i n ) dbut fin # Les composantes de t[dbut .. fin] ont t initialises. ( dbut k fin)(t[k] NUL) k, tudionsprsentcommentdfinircettefonction. Il sagit dajouter la valeur de la premire case, celle de numro dbut, la valeur de la case suivante puis de recommencer.Soit(H) lhypothsequidcrituntatintermdiairedanslequeluncertainnombredecasesontdj tadditionnes.Supposonsquecesoitlecasjusqulacasedenumroi 1incluse,desortequelaprochaine caseadditionner,sielleexiste,soitcelledenumroi. Faireunehypothsesurltatactuel Hypothse(H):Rsultatestlasommedescasesdemarques[dbut..i1]. Voirsicestfini Cest fini lorsque i 1 = fin, soit ds que i = fin + 1, ou encore ds que i > fin puisque i augmente. Par consquent,cenestpasfinitantqueifin. Sinon,ilnousfautrduireladistanceentreltatactueletltatfinal. Serapprocherdeltatfinal Onserapprochedeltatfinalenaugmentantlenombredecasesadditionnes.Pourcela,ilsuffitdenadditionner unedeplus.Onobtientdonc : ... # Rsultat = somme(t, dbut, i - 1) Rsultat <- Rsultat + t [ i ] # Rsultat = somme( t , d b u t , i ) i <- i + 1 # Rsultat = somme( t , d b u t , i - 1 ) ... Lescommentairesutilisentlafonctionsommepourprciserltatintermdiaireobtenu.

Initialiserlecalcul Initialiserlecalcul,cestplacerlesystmelogicieldansuntatdanslequel(H)estvraie.Ellenoncequetoutesles cases, jusqucelledenumro i 1 incluse, ont t additionnes. Par consquent, elle nonce que la prochaine caseadditionnerestcelledenumroi.Or,initialement,laprochainecaseadditionnerestcelledenumrodbut etlersultatestencorenul : variable

- 6-

ENI Editions - All rigths reserved - Jonifar lina

152

i : ENTIER # Numro de la prochaine case additionner. Initialisation i <- dbut Rsultat <- 0 # i = dbut => Rsultat = 0 # i > dbut => Rsultat = somme(t, dbut, i - 1) ... Ilrestearrangertoutcela. Rdigerlalgorithmedfinitif Lhypothse (H) sexprime de diffrentes faons. Choisissons une expression algorithmique. Cest lexpression de linvariantdelitration : ... invariant i = dbut = > Rsultat = 0 i > dbut = > Rsultat = somme( t , d b u t , i - 1 ) ... Dautrepart,nousdevonsaussivaluerladistancequispareuntatintermdiairequelconquedeltatfinal.Nous avons vu que cest fini ds que i = fin + 1 . Parconsquent, cest fini ds que fin i + 1 = 0 . Deplus, iest croissantet,parconsquent,fini+1estdcroissantstrictementvers0.Onobtient : ... variant de contrle fin - i + 1 ... Lalgorithmedfinitifestalorslesuivant : Algorithme21:Dfinitiondelafonctionsomme Algorithm somme e # La somme des composantes de t[dbut .. fin]. Entre t : TABLEAU[ REL] # La cible du calcul de la somme. d b u t , f i n : ENTIER # Num. composantes extrmes additionner. Rsultat : REL prcondition # dbut et fin sont des numros de cases valides. index_valide( t , d b u t ) index_valide( t , f i n ) dbut fin # Les composantes de t[dbut .. fin] ont t initialises. ( dbut k fin)(t[k] NUL) k, variable i : ENTIER # Numro de la prochaine case additionner. Initialisation i <- dbut Rsultat <- 0 # i = dbut => Rsultat = 0 # i > dbut => Rsultat = somme(t, dbut, i - 1) tant que i fin invariant i = dbut = > Rsultat = 0 i > dbut = > Rsultat = somme( t , d b u t , i - 1 ) variant de contrle fin - i + 1 rpter # i > dbut => Rsultat = somme(t, dbut, i - 1) Rsultat <- Rsultat + t [ i ] # i > dbut => Rsultat = somme(t, dbut, i)

ENI Editions - All rigths reserved - Jonifar lina

- 7-

153

i <- i + 1 # i > dbut = > Rsultat = somme( t , d b u t , i - 1 ) fin rpter fin somme Lescommentairesplacsentrerpter...fin rptermontrentbienquelinvariantestrtablietdoncmaintenudans le corps de litration. Les traitements reprennent au dbut de litration parce que la situation, dans laquelle se trouve alors le systme logiciel, est la mme qulentre de cette itration. Lexpression de linvariant permet de senassurer.Demme,onvrifiequelevariantdecontrlediminuechaquepas. Onvoitsouventexprimeunetelleconstruction,danslaquelletouteslescasessontparcourues,delapremirela derniresansexception,duneautrefaon : ... pour tout i de dbut f i n rpter additionner la com posante de num ro i ... Cetteexpressionpermetdexprimerdesitrations automatiques ,danslesquelleslapermanencedelinvariantest maintenueimplicitement.Ainsi,lamodificationdelindiceiquicontrlelitrationetletestdelaconditiondarrtsont implicites.Lexempleprcdentscriraitalors : ... pour tout i de dbut f i n rpter Rsultat <- Rsultat + t [ i ] ... Ce nest pas une bonne construction algorithmique car elle ne permet pas de suivre dune faon consciente, raisonneetexplicitetouslestatsdusystme.Elleimitelesconstructionsdecertainslangagesdeprogrammation maisellenoussembleplusnuisiblequutiledansunephasedapprentissage.Elleneserapasutilisedanscelivre. Iciencore,onpeutpenserquenousavonsfaitbeaucoupdeffortspourrsoudredesproblmesaussisimplesquele calculdelasommeoudelamoyennedescomposantsduntableau.Maisilfautsesouvenirquecettediscussionest motiveparunesolutionfaussecesproblmes"simples".Cequimontrequecesproblmesnesont,danslefond, pasaussisimplesquilsleparaissent.Leseffortsconsentissontdoncainsijustifis. Cette remarque termine ltude lorigine de cette discussion. Nous avons calcul la moyenne arithmtique des composantes dun tableau. Pour effectuer le calcul effectif de la moyenne des composantes du tableau marques, il suffiradefaireappelcetalgorithmeenveillantsatisfairelaprcondition : ... m < - moyenne(m arques, n) ... et cest tout. Le reste nest plus de lalgorithmique : cest de la programmation. Pourtant, supposons que lon souhaite, toute force, crire un algorithme qui remplit les cases dun tableau marques par des oprations dentre/sortie,encomptantlescomposantesintroduites.

3.Complterlexercice:lesspcificationsquimanquent
Letableauatdclaravecdeuxvaleursfixespourlesnumrosdescomposantesextrmes,parexemple : ... variable m arques : TABLEAU[ REL] [ -3, 96] ... Onaainsidclaruntableauquicontiendradesnombresrelsetdontlescasessontnumrotesde396.Ces valeurssontconnues.Lafonctionindex_minrend3avecmarquesenparamtre.Lafonctiondualeindex_maxrend 96.Leproblmeconsistedoncremplirmarques[3..96]pardesnombresrels.Soitdoncremplir lalgorithmequi auralaresponsabilitdecetteinitialisation.Estceuneprocdureouunefonction ?Cestunedcisionimportante : encore une fois, une fonction ne modifie pas ses paramtres. Elle reoit des oprandes. Elle calcule et retourne un rsultat :cest unerequte. Elle interroge le systme sans provoquer deffet de bord.Lalgorithme crire reoit en paramtre le tableau marquesquil initialise. Par consquent, il le modifie. De mme, il reoit un paramtre entiern quil initialisera avec le nombre de composantes quil aura places dansmarques. Ainsi, cet algorithme doit calculer deux rsultats : un tableau quil remplit et un entier quil initialise. Si on en reste aux structures simples, cet algorithmeestncessairementuneprocdure.Ilmodifieltatdusystmelogiciel :cestunecommande.Lencore, onnepeutpasobjecterquedansteloutellangagedeprogrammation,unefonctionpeutmodifiersesparamtres :

- 8-

ENI Editions - All rigths reserved - Jonifar lina

154

nousneprogrammonspas,nousanalysonsunproblme nousnedisposonspasdunlangagepourcela ce nest pas parce que tel ou tel langage permet nimporte quoi que nous sommes obligs de rpter les mmeserreurs nousnesommespastenusauxrespectsdimpratifsdictspardesmachines,commelesontleslangagesde programmationdesmachinesrelles.

Lalgorithme remplit le tableau marques entre les composantes de numros index_min(marques) et index_max (marques)pardesrelspositifs.Onpeutintroduiredeuxnouveauxparamtresentiers, dbutetfin,quirecevront respectivementlenumrodelapremirecaseetlenumrodeladernirecasedutableauinitialiser.Lasignature deremplirdevient : Algorithm remplir e # Initialiser des composantes de t[dbut .. fin] et les compter. Entre t : TABLEAU[ REL] # Tableau cible de linitialisation. d b u t , f i n : ENTIER # Numros des cases extrmes initialiser. n : ENTIER # Nombre de cases effectivement initialises. Lesparamtrestetnsontmodifisparlaprocdure.Silsontdjdesvaleursaudbut,ellesnesontpasutilises et elles sont perdues au retour. Les paramtres dbut et fin ont des valeurs utilises mais non modifies par lalgorithme. Laprconditionprciselesprrequispourutiliserlesservicesdelalgorithme : ... prcondition dbut fin index_valide( t , d b u t ) index_valide( t , f i n ) ... Pournoterlapostcondition,ondfinitunprdicatestRempliquipermettradexprimerqueremplirfaitbiencequilui est demand. Il est donc possible de spcifier compltement remplir et cette spcification aura un sens ds que estRemplienauraun.Lalgorithmesuivantdonnelesspcificationsderemplir. Algorithme22:Spcificationsderemplir Algorithm remplir e # Initialiser n rels positifs dans t[dbut .. fin]. Entre t : TABLEAU[ REL] # Le tableau initialiser. d b u t , f i n : ENTIER # Le domaine dinitialisation. n : ENTIER # Nombre de composantes effectivement initialises. prcondition dbut fin index_valide( t , d b u t ) index_valide( t , f i n ) postcondition # dbut et fin ne sont pas modifis. ancien(dbut) = dbut ancien( f i n ) = fin # n composantes sont initialises. dbut + n - 1 f i n # t[dbut .. dbut + n - 1] est initialis. estRempli(t, dbut, dbut + n - 1 ) # t[dbut .. dbut + n - 1] est initialis avec des rels # positifs. ( i, dbut i dbut + n - 1 ) ( t [ i ] 0 ) # Le reste du tableau nest pas modifi. ( , index_m i in in(t) i dbut, dbut + n i index_m t ) ) ax ax(

ENI Editions - All rigths reserved - Jonifar lina

- 9-

155

( ancien t [ i ] ) = t [ i ] ) ancien( f i n r e mp l i r Cette spcification prcise clairement que n contient le nombre de cases initialises et non pas le numro de la dernirecaseinitialise.Onauraitpuobteniruneautresolutionenchoisissantderenvoyer,dansn,lenumrodela dernirecaseinitialise.Cetteadaptationestlaisseenexercice. LapostconditionfaitappelauprdicatestRemplienluipassantenparamtreletableauetlesnumrosdescases extrmes vrifier. Pour que cette dfinition soit complte, il faut encore spcifier ce prdicat. Cest fait par lalgorithmesuivant,danslequellapostconditionestexprimeenfranaispournepascompliquerlexercice. Algorithme23:SpcificationsdeestRempli Algorithm e s t R e m l i e p # t[dbut .. fin] a-t-il t initialis ? Entre t : TABLEAU REL TABLEAU[ REL] # Le tableau initialis. d b u t , f i n : ENTIER # Le domaine dinitialisation. prcondition dbut fin index_valide t , d b u t ) index_valide( index_valide t , f i n ) index_valide( postcondition Rsultat = ( t [ d b u t . . f i n ] a t i n i t i a l i s p a r d e s r e l s positifs) fin estRem li p Ilneresteplusquraliserlalgorithmeremplir.Cettefois,ilfautanalysercompltementleproblme.Onnepeut pas sen sortir en crivant directement le corps de lalgorithme. Si ctait le cas, on pourrait passer directement au codagedanslelangagedeprogrammationdelamachinerelle.

4.Complterlexercice:remplirletableau
Ilsagitdinterrogerlutilisateurpourluidemanderunnombreetlerangerenbonneplace.Cederniersignalequila termin la saisie en introduisant un nombre convenu, qui ne fait pas partie du domaine des donnes valides. Le problmededparttait rsolu commeonlavuaveclavaleur1.Commeilsagitdenintroduirequedesrels positifs ou nuls, on peut choisir de terminer sur une valeur ngative mais non nulle quelconque. Continuons donc avec 1. Nous pouvons faire une hypothse sur un tat intermdiaire dans lequel certaines valeurs ont dj t saisies. Faireunhypothsesurltatactuel Hypothse(H):nestlenombredecasesdetdjinitialisesentredbuteti1.Leprochainrelrangerest nombre. Onpeutdjremarquerque lescasesdetentredbuteti 1sontdjinitialises scritestRempli(t, dbut,i 1)dsquei>dbut.Unedeuximeremarquepermettraitdesimplifier(H):inestpasncessairepuisquendonne le nombre de cases dj initialises. Oublions cette remarque pour linstant. Nous y reviendrons plus bas. Dans quellescirconstances(H)dcritelleltatfinal ? Voirsicestfini Cestfinidsquenombre<0.Maiscestaussifinisiletableauestplein,donclorsquei 1 = fin.Onobtient : ... Cest fini ds que nombre < 0 o u s i n o n ...

i - 1 = fin.

i - 1 = finscritaussifin - i + 1 = 0.fin - i + 1estdonclevariantdecontrledelitration.Cestfinidsque i = fin + 1,soitdsquei > fin.Sinon,ilfautserapprocherdeltatfinal. Serapprocherdeltatfinal

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

156

Onsenrapprocheenrangeantnombresaplace.Commei - 1estlenumrodeladernirecaseinitialisedaprs (H),nombredoittreplacdanslacasedenumroi : ... assertion i > dbut = > e s t R e m l i t , d b u t , i - 1 ) p i( nom bre est la prochaine valeur ranger n est le nom bre de cases dj initialises t [ i ] < - nom bre assertion i > dbut = > e s t R e m l i t , d b u t , i ) p i( nom bre est la dernire valeur range n + 1 est le nom bre de cases dj initialises ... Unblocintroduitparassertiondcrituntatparuneconjonctiondeclausesdevaleurboolennes.Ledernierbloc dcritltatintermdiaireobtenu.Cenestpasceluiquiestdcritpar(H).Onleretrouvepar : ... i <- i + 1 n <- n + 1 assertion i > dbut = > e s t R e m l i t , d b u t , i - 1 ) p i( nom bre est la dernire valeur range n est le nom bre de cases dj initialises Cenestpasencorecequenousvoulons.Ondoitobtenir,deplus : ... ... nom bre est la prochaine valeur ranger

Pourcela,ilsuffitdedemanderlutilisateurunnouveaunombre : ... ... crire e(CRAN, Donner le nom bre suivant : ) nom bre <- l i r e (CLAVIER)

Remarquez que, l encore, la distinction est faite entre une procdure, crire, qui est une commande envoye au systmeetunefonction,lire,quiestunerequterenvoyantunrsultat.Dautrepart,onaprcislesnomsinternes defichiersaccder,iciCRANensortieetCLAVIERenentre.Nouslessupposonsdfinis. Ilfautencoreinitialiserlecalcul,cestdireraliser(H)dansltatinitial. Initialiserlecalcul La prochaine case initialiser porte le numroi. Initialement, aucune case na encore t remplie et la prochaine caseinitialiserestdonclacasedenumrodbut.Lavariablencontientlenombredecasesdjinitialisesetdonc nestinitialis0.Enfin,nombrecontientleprochainnombrerangerdanst. ... initialisation i <- dbut n < 0 crire e(CRAN, Donner le prem ier nom bre : ) nom bre <- l i r e (CLAVIER) ... Rdigerlalgorithmedfinitif Ilsagitderassemblertoutcela.Onobtientlalgorithmesuivant,danslequellesspcificationsnesontpasrptes. Algorithme24:Ralisationderemplir
ENI Editions - All rigths reserved - Jonifar lina - 11 -

157

Algorithm r e mp l i r e ... variable i : ENTIER # Numro de la prochaine case initialiser. nom bre : REL # Prochaine valeur ranger dans t[i]. initialisation i <- dbut n < 0 crire e(CRAN, Donner le prem ier nom bre : ) nom bre <- l i r e (CLAVIER) jusqu jusqu nom bre < 0 ou sinon i > fin invariant i > dbut = > e s t R e m l i t , d b u t , i - 1 ) p i( variant de contrle fin - i + 1 rpter assertion i > dbut = > e s t R e m l i t , d b u t , i - 1 ) p i( nom bre est la prochaine valeur ranger n est le nom bre de cases dj initialises t [ i ] < - nom bre assertion i > dbut = > e s t R e m l i t , d b u t , i ) p i( nom bre est la dernire valeur range n + 1 est le nom bre de cases dj initialises i <- i + 1 n < n + 1 crire e(CRAN, Donner le nom bre suivant : ) nom bre <- l i r e (CLAVIER) assertion i > dbut = > e s t R e m l i t , d b u t , i - 1 ) p i( nom bre est la prochaine valeur ranger n est le nom bre de cases dj initialises fin rpter ... f i n r e mp l i r Cetalgorithmepeutencoretreamlior.Onremarque,parexemple,que,dunepart,nnestjamaisutilis.Dautre part,ietnprogressentensemble,parincrmentsde1,lepremierdepuisdbut,lautredepuis0.Cestsignequece sontdeuxvaleursfortementlies :lavaleurdelunedoitpermettredobtenirlavaleurdelautre. Initialement,i = dbut et n = 0. Par consquent, i - n = dbut. Comme les deux variables progressent ensemble, dune unit chaquepasdelitration,cettediffrenceresteconstante.Aprskpasdelitration,onobtient : (i + k) - (n + k) = dbut = i - n Cetteremarquepermetalorsdemodifierlalgorithmedediffrentesfaons : (i) supprimeripartoutoilapparatetremplacertoutessesoccurrencesparsavaleurdbut - n (ii) supprimerlavariablenpartoutetajouter,aprsfinrpter,linstructionquicalculesavaleur:n <- i - dbut. La solution (i) est correcte, mais elle fait trop de calculs inutiles. Elle ne sera pas retenue. Lcriture dfinitive de lalgorithmeaprsadoptiondelasolution(ii)estlaisseenexercice. Ilrestedirecommentutilisertoutcela,maiscestuneformalit :

- 12 -

ENI Editions - All rigths reserved - Jonifar lina

158

... variable m arques : TABLEAU REL [ - 3, 200] TABLEAU[ REL] m : REL n : ENTIER ... # Initialiser le tableau avec au plus 100 rels positifs. r e mp l i r arques, 1, 100, n) r(m # Calculer et crire la moyenne des nombres. m <- m oyenne arques, n) oyenne(m crire e(CRAN, La m oyenne est , m) ... Concluons cette section en prcisant quun chapitre ultrieur dfinit un type VECTEUR et calcule la moyenne des composantesdunvecteur.

ENI Editions - All rigths reserved - Jonifar lina

- 13 -

159

Exercicesdapplication
Cette section propose des exercices dapplication varis. Le premier exercice tend ltude commence au chapitre Structureslmentaires. Exercice5:Historiquesuruncomptecourant Onveutconserverlhistoiredesmouvementsmensuelssuruncomptecourant. 1.ModifierletypeCOMPTEdfiniauchapitreStructureslmentairespourgarderlatracedesmouvementssuruncompte pendantunmois. 2.tablirlesoldeenfindemoisduncomptedonn. Le solde nest plus un attribut du compte. Il est obtenu en parcourant lhistorique mensuel et lhistorique annuel qui enregistrelemontantdusoldeducomptepourchaquemois. 3.Refairelesdfinitionsprcdentes. Untableauclientscontientlescomptescourantsdunensembledeclients. 4.Dterminerlesclientspourlesquelslamoyennedesmontantsdesmouvementsestsuprieureunesommedonne. LeproblmedelditiondunentieradjtdfiniauchapitreRcursivit.Lexerciceseracompltementrsoludans unchapitreultrieur.Lexercicesuivantproposedallerunpeuplusloinquauchapitreprcdent. Exercice6:ditiondunentier 1.crireunalgorithmeitratifquitransformeunentiernquelconqueensareprsentationdansunebaseB 2quelconque. Lorsquelabaseestsuprieure36,onpeututiliserlareprsentationdeschiffresenutilisantlabasedix,maisensparant chaquechiffredelareprsentationdunombreenbaseBparunsparateurconvenu,parexempleunpoint.Cestcequiest pratiqupournoter,parexemple,ladresseIPdunhtesurunrseauenIPv4.Ainsi,parexemple,lareprsentationenbase 256de3000,exprimeicienbasedix,scrira : 11.184256=3000dix. Exercice7:Analysedunechanedecaractres OndonneunechanedecaractresdontdiffrentespartiessontsparesparuncaractreSPARATEURparticulier.Lexemple cidessousreprsenteunetellechane,danslaquellelecaractresparateurestlecaractredeuxpoints:. Voici un:exemple : de chane analyser: Onveutsparerlesdiffrentespartiesetlesrangerdansuntableaudechanesdecaractres.Pourlexemplecidessus,on veutobtenirletableausuivant : n 1 2 3 Chane Voiciun exemple dechaneanalyser

1.crirelemodulelogicielquiralisecettedcomposition. 2.UtilisercemoduledansunalgorithmederecherchedeschampsGCOSdufichier/etc/passwddunsystmeUNIX. Ilsagitdeconstruireuntableaudonnanttousleschampsobtenusassocisaulogindunutilisateur.Lalgorithmemetune alertelorsquelechampGCOSnestpasrenseignavecladescriptiondelutilisateur. Exercice8:Recherchedemotsdansundictionnaire Ondonneuntableaude MOTsdelalanguefranaise.Lesmotssontenregistrsdansuntableauappeldictionnaire.Deux autrestableauxsontutilisspourparcourirledictionnaire.Untableauappelsuivantdonne,pourchaquemot,lenumrode lacaseoccupeparlemotquilesuitdanslordrealphabtiquedansledictionnaire.Letableauprcdentdonnedemme, pourchaquemot,lenumrodelacasedudictionnairequicontientlemotquileprcdedanslordrealphabtique.Aupremier motdelalistetriecorrespondunnumrodecaseduprcdentgalindex_min(dictionnaire) 1.Demme,audernier mot de la liste trie correspond un numro de case du suivant gal la mme valeur. Le tableau cidessous montre un

ENI Editions - All rigths reserved - Jonifar lina

- 1-

160

exempledecestroistableaux. i 1 2 3 4 5 dictionnaire avion train auto camion ... prcdent 3 4 0 1 ... suivant 4 ... 1 2 ...

Onvoitque,pourcamiondanslacase4,lemotquilesuitdanslordrealphabtiqueoccupelacase2etceluiquileprcde occupelacase1.Lordrealphabtiquedecestroismotsestdoncavion,camionettrain. 1.crirelalgorithmequidonnelalistedesmotsenregistrscommenantparunelettredonne. Ainsi,parexemple,lalgorithmeappliqulalisteprcdentedonnera(avion,auto)pourlalettrea. Ilestaussipossiblededfinirunnouveautypededonnes,MOT,formdunechanedecaractrespourlemotproprement ditetdedeuxentierspourreprerlemotquileprcdeetlemotquilesuitdansledictionnaire.Danscecas,ledictionnaire devientunsimpletableaudeMOTs. 2.DfinirletypeMOTetrefairelalgorithmeprcdentpourlutiliser. 3.crirelalgorithmequipermetdajouterunnouveaumotaudictionnaire. 4.crirelalgorithmedesuppressiondunmot. Exercice9:Reprsenterlesmembresdunefamille Onaconstituuntableaufamillesde1000composantesnumrotespartirde1.Chaquecomposantecontientunedonne detypePERSONNEselonlediagrammesuivant:

Lassociation rflexive entre PERSONNE et ellemme, dsigne sur le diagramme par est le fils de signifie quune instancedePERSONNEestfille(fils)daucune,duneoudedeuxinstancesdePERSONNE. 1.DfinirletypePERSONNE.Commentdclarerletableaufamilles? Lorsquune personne enregistre dans le tableau na pas de pre ou de mre enregistr, lattribut correspondant est ORPHELIN.Lorsquunecaseestinoccupeparcequelapersonnequellecontenaitatefface,sonidentifiantestEFFAC. Lescasesquinontjamaisreudevaleur,lorsquilyamoinsde1000personnesenregistres,ontunidentifiantgalVIDE. 2.Donnerlalistedetouteslespersonnesenregistres,gesde2030ans. 3.Vieillirtouteslespersonnesenregistresde1an. 4.tablirlalistedetouslesorphelinsdemoinsde15ans. 5.FaireunalgorithmequidterminelidentitdupredeJacquesMARTIN. 6.FaireunalgorithmequitablitlalistedesfrresetsursdeJacquesMARTIN. Exercice10:PGCDdedeuxentiers Lalgorithme qui permet de dterminer le Plus Grand Commun Diviseur de deux entiers a dj t envisag au chapitre

- 2-

ENI Editions - All rigths reserved - Jonifar lina

161

Rcursivit,lorsdeltudesurletypeFRACTION. 1.DonneruneversionitrativedelalgorithmedEuclidepourlecalculduPGCDdedeuxentiers. 2.tudieruneversionitrativequicalculelePGCDennefaisantquedesadditionsoudessoustractions. Exercice11:Carrsparfaitsetracinecarreentire Un entier naturel est un carr parfait, sil est le carr dun entier. Ainsi, 0 = 02, 1 = 12, 4 = 22, 16 = 42 sont des carrs parfaits. 1.Faireunalgorithmequitablitlalistedescarrsparfaitsinfrieursunelimitedonne.Lalgorithmenedoitpasfairede multiplication. Laracinecarreentiredunentiern0estluniqueentierr0dfinipar : r2n<(r+1)2 2.crirelalgorithmedecalculdelaracinecarreentiredunentier.Fairedeuxversions :rcursiveetitrative.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

162

Notesbibliographiques
Lamthodedeconstructionduneitrationpartape,toujourslesmmes,commeelleestexposeicidoitbeaucoup [ARS80]. Le livre [ARS77] est de la mme veine, mais adopte un point de vue plus mathmatique et plus formel. Prciser linvariant et le variant de contrle dune itration sous une forme algorithmique a t systmatis par BertrandMEYERdontlarfrence[MEY00],quitraitedeconceptionetprogrammationobjet,estunpointdentrepour allerplusloin.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

163

Rsum
Cechapitreaprsentlaconstructionraisonneduneitration.Uneitrationestuntraitementrptsurunjeude donnesquivoluent,maisquirestentliespardesconditionsstrictes.Construirelitration,cestnoncerclairement lhypothse de rcurrence sousjacente pour en dduire les traitements qui assurent les changements dtat du systme, les initialisations qui ralisent ltat initial, la condition de terminaison qui dcrit ltat final, linvariant qui nonceunepropritdontlestraitements,danstouslestatsdusystme,assurentlapermanenceetlevariantde contrlequiestunemesuredeladistanceltatfinal.Lesexemplespropossontmontrcommentconstruireune itrationselonce modle .Ilssontempruntsdiffrentsdomainesmaisnefontjamaisappeldautresstructures dedonnesqueletableausimple. Leschapitressuivantsnesontquedesvariationssurlethmedelaconstructionduneitrationetdelaspcification rcursivedunalgorithme.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

164

Bibliographie
[ARS80]JacquesARSAC :Premiresleonsdeprogrammation CEDIC/NATHAN,1980. [ARS77]JacquesARSAC :Laconstructiondeprogrammesstructurs DUNOD,1977. [MEY00]BertrandMEYER :Conceptionetprogrammationorientesobjet EYROLLES,2000.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

165

Introduction
LechapitreRcursivitacommencmontrercommentdfinirunmodulequiraliseuntraitementrpt,enutilisant ses propres services. Nous avons aperu que la ralisation dun tel module exprime une dfinition, au sens mathmatique du terme, plutt quune suite de transformations appliquer aux donnes. Le chapitre Itration a tudi,endtail,commentraisonnersurunproblmequitransformelesdonnesparuntraitementrpt.Cecourt chapitreraliseunesynthsesurlestraitementsrptsencomparantlesdeuxmthodes. La section Retour sur la rcursivit revient sur la rcursivit en prsentant plusieurs exemples lmentaires mais significatifs de rcursivit simple. La section Rcursivit ou itration ? donne quelques lments pour comparer rcursivit et itration et met en vidence les raisons pour lesquelles litration est prfre la rcursivit pour la programmationdetraitementsrpts.LasectionExercices,enfin,proposequelquesexercices.Lechapitresetermine parunrsum.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

166

Retoursurlarcursivit
Unalgorithmercursifexprimedoncunedfinitionaulieudedirecommentraliserlestransformationssurlesdonnes. Revoyonscepointsurunexemplelmentaire,djrsoluauchapitreRcursivit.

1.Premierexemple
Rappelonsdabordleproblme. Un caractre est un nombre entier positif ou nul. Dans la suite, un caractre est donc confondu avec son code numrique.Ledomainedesvaleursduntelentiernestpasprcisdavantage.Onpeutypenserensupposant,par exemple, que le domaine dpend de la machine utilise. Le type de donnes CARACTRE permet de dfinir une variabledetypecaractre. Lun de ces caractres est un code particulier. Il est dsign par FIN_CH. Ce caractre nest jamais un caractre significatifdansunechane.Ilnestutilisquepourmarquerlaterminaisondunechane.Ainsi,toutedonnedetype CHANE contient, comme dernier caractre, celui de code FIN_CH qui en marque la fin. Les caractres dunechane sontnumrotsensquencepartirde1pourlepremier. Laccesseuritem,dfiniprcdemment,restedisponibledanslerpertoiredinstructions.Cestunefonctionquiprend enentreunechanedecaractresbienforme,cestdiretermineparFIN_CH,etunentiernaturelrang.Ellerend le caractre de la chane qui occupe le rang donn, comme dans les chapitres prcdents. De mme, les fonctions premier et fin dfinies dans les chapitres prcdents restent disponibles. La fonction premier rend une copie du premiercaractredelachanequellereoitenparamtre.Lafonctionfinretourneunecopiedelachanequellereoit enparamtre,maisprivedesonpremiercaractre. Onsintresseaucalculdunombredecaractresdunechane.LecaractreFIN_CHnestpascompt. Leproblmeestdoncdedfinirunalgorithmequirendlenombredecaractresquicomposentunechanebienforme.Il existeplusieursfaonsdersoudreceproblme. Laplussimpleetimmdiateconsistedonnerunedfinitiondelalongueurdelachane.Commelachaneestbien forme par hypothse, nous sommes certains dy trouver le caractre FIN_CH. La longueur dune chane rduite au seulcaractreFIN_CHestnulle : l o n g u e u r (FIN_CH) = 0 Autrementdit,lachaneestdelongueurnullesisonpremiercaractreestlamarquedefindechane.Soitchlachane decaractresbienformedontoncalculelalongueur.Onobtient : p r e m i e r (ch) = FIN_CH => l o n g u e u r (ch) = 0 Danslecascontraire,cettelongueurestcelledelachane,privedesonpremiercaractre,maisaugmentedune unit : p r e m i e r (ch) FIN_CH => l o n g u e u r (ch) = 1 + l o n g u e u r (f i n (ch)) Ladfinitiondelalongueurdunetellechanedecaractresbienformeestdonc : p r e m i e r (ch) = FIN_CH => l o n g u e u r (ch) = 0 p r e m i e r (ch) FIN_CH => l o n g u e u r (ch) = 1 + l o n g u e u r (f i n (ch)) Lexpressionalgorithmiquedecettedfinitiondevient : Algorithme1:longueurdunechanedecaractresVersion1.0

Algorithme longueur # Le nombre de caractres de ch. Entre ch : CHANE Rsultat : ENTIER prcondition chNUL chestbienforme postcondition premier(ch)=FIN_CH=>Rsultat=0

ENI Editions - All rigths reserved - Jonifar lina

- 1-

167

premier(ch)FIN_CH=>Rsultat=1+longueur(fin(ch)) fin longueur La ralisation de lalgorithme dtaille les instructions programmer dans un langage informatique donn. Avec les conventionsdeschapitresprcdents,oncrirait : ralisation si premier(ch)=FIN_CH alors Rsultat<0 sinon Rsultat<1+longueur(fin(ch))fin si Ilestimportantdebienseconvaincrequecetteralisationnapporteriendeplusquelalgorithmeprcdent,dustrict point de vue algorithmique. Elle ne fait quexprimer, dans un langage particulier, les instructions quil faudrait programmerdansunlangageinformatique,aubesoinenlesadaptant,pourimplanterlalgorithme. Le chapitre Itration a tudi comment construire une itration dune faon raisonne. Une itration dtaille les transformationsfairesubirauxdonnespourfaireparcourir,ausystmelogiciel,unespacedtatsjusquuntat finalbiendfini.Lunedesparticularitsduneitrationestderaliserdestransitionsentretatscaractrissparune proprit invariante. La ralisation de la version itrative du calcul de la longueur dune chane de caractres bien formescrirait,parexemple : ralisation Rsultat<0# Longueur actuelle de la chane. i<1# Prochain caractre observer. tant que item(ch,i)FIN_CH rpter Rsultat<Rsultat+1 i<i+1 fin rpter Onpeutremarquerquei=Rsultat+1etquilestdoncpossibledlimineridecettesolution,maiscestundtail. Cetteversion,bienquepluttsimple,estbienmoinsvidentecomprendrequelaversionrcursive.Ilfautfaireun effort,mmepourunproblmeaussisimple,pourcomprendrecommentlalgorithmecalculesonrsultatetcommentil atteintltatfinal.Laversionrcursiveestincomparablementplusexpressivequelaversionitrativeetcesttoujours lecas.Cestquelaversionrcursiveneditpascommentatteindreltatfinal.Ellenefaitquedonnerunedfinitiondu rsultat. La version itrative, au contraire, sattache aux dtails des transformations qui vont faire parcourir au systmelogicieltouslestatsintermdiairesjusqu ltatfinal,danslequellapseudovariableRsultat contient la valeurcherche.tudionsundeuximeexemple.

2.Deuximeexemple
VoiciladfinitiondunalgorithmeA.Quefaitil ? AlgorithmeA # ? Entre ch:CHANE car:CARACTRE Rsultat : BOOLEN prcondition carNUL chNULetchestbienforme ralisation Rsultat<FAUX tant que chCHANE_VIDEet Rsultat=FAUX rpter Rsultat<(premier(ch)=car) ch<fin(ch) fin tant que postcondition ... fin A Ladfinitiondursultatcalculest :

- 2-

ENI Editions - All rigths reserved - Jonifar lina

168

ch=CHANE_VIDE=>Rsultat=FAUX chCHANE_VIDE=>Rsultat= ( premier(ch)=car ou sinon A(fin(ch),car) ) LersultatestdoncFAUXpourunechanevide.IlestVRAIlorsquecarestlepremiercaractredelachaneoudune souschanequiterminech.Parconsquent,ilestVRAIlorsquecarestuncaractredech. Ladfinitionestimmdiatementcomprhensible.Laversionitrativedemandeplusdetravailetdintuition.

3.Troisimeexemple
Considronslaralisationsuivante : Entre n:ENTIER Rsultat:ENTIER prcondition n0 ralisation Rsultat<1 tant que n>1 rpter Rsultat<Rsultatxn n<n1 fin rpter postcondition ... Ladfinitioncorrespondanteest : n1=>Rsultat=1 n>1=>Rsultat=nxf(n1) cequirvleimmdiatementlafonctionfactorielle. Puisquelarcursivitestsiexpressiveetimmdiatementcomprhensible,pourquoifaireencoreleffortdtudierdes solutionsitratives ?Leslangagesinformatiquesappels langagesfonctionnels nepratiquentpaslitrationetne connaissentpaslinstructiondaffectation.Lessolutionsnesontexprimesquercursivement.Pourquoi,danscecas, utiliserencoredeslangagesimpratifsetdesalgorithmesitratifs ?Lasectionsuivantedonneunerponsepartielle cettequestion.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

169

Rcursivitouitration?
Pour comprendre la diffrence essentielle qui fait prfrer un algorithme itratif un algorithme rcursif, tudions le fonctionnement desdeuxversionsducalculdelalongueurdunechanedecaractres,commeilatprsentla sectionprcdente. Lestapesducalculrcursifsontlessuivantes : (i) : abc CHANE_VIDE=>longueur(abc)=1+longueur(bc) (ii):bcCHANE_VIDE=>longueur(bc)=1+longueur(c) (iii):cCHANE_VIDE=>longueur(c)=1+longueur() (iv):=CHANE_VIDE=>longueur()=0 (j):longueur()=0=>longueur(c)=1+0=1 (jj):longueur(c)=1=>longueur(bc)=1+1=2 (jjj):longueur(bc)=2=>longueur(ab)=1+2=3 Leslmentssuccessifsducalcul,cestdireleschanesdecaractressurlesquellesoprentlalgorithme,sontplacs en attente du rsultat intermdiaire pour terminer le calcul. Le calcul de la longueur de abcest mis en attente du rsultat de la longueur debc. Cecalculestmisenattentedursultatducalculdelalongueurdec. Cedernier calculestmisenattentedursultatducalculdelalongueurdequiest0.Alors,lalongueurdecestcalculeen ajoutant1aursultatdjobtenu,cequidonneunelongueurdecgale1.Lalongueurdebcestalorscalcule enajoutant1celledec,cequidonne2.Enfin,lalongueurdeabcestobtenueenajoutant1celledebcce quidonnelersultatattendu. Ce qui est remarquable ici, cest que les calculs en attente imposent une sauvegarde de ltat intermdiaire du systme logiciel qui doit tre rutilis ensuite pour terminer les calculs. Cette sauvegarde ncessite un espace de stockageetdenouveauxcalculsintermdiairespoursagestion.Laprofondeurdelespacedestockageetlescalculs ncessaireslagestiondecetespacemobilisentdesressourcessupplmentairesproportionnellementlalongueur de la chane. Le schma de la figure cidessous montre comment volue cet espace avec les diffrents tats intermdiairesdusystme.

La partie gauche symbolise la pile qui sauvegarde les contextes temporaires pour mettre en attente les calculs. La partiecentralemontrelvolutiondelavaleurdeRsultat.Lescontextessontensuitedpilspourcalculerlersultat dfinitif. Cequirendncessairelempilementdescontextes,cestquelersultatestobtenuparuncalculquifaitintervenirun appellafonction : R s u l t a t <- 1 + l o n g u e u r (f i n (ch)) Pour calculer le rsultat, il faut dabord calculer la longueur de fin(ch), ce qui ncessite la sauvegarde provisoire de ltatactuel. Cestlasauvegardedescontextesintermdiairessuccessifsquifaitparfoisconsidrerlarcursivitcommeinefficaceet cest la raison pour laquelle litration lui est prfre. Pourtant, les spcialistes de la thorie des langages et les informaticiens ont dvelopp des mthodes de transformations automatiques qui permettent de rduire les pnalisationsinduitesparlarcursivit.Lasauvegardeducontexterestencessaire,aumoinspartiellement,maisil
ENI Editions - All rigths reserved - Jonifar lina - 1-

170

estpossibledeprocderautrementquecidessus. Supposonsquesoitempil,aveclachanedecaractres,lavaleuractuelledursultat.Lapilevolueraalorscommele montreledessindelafiguresuivante :

Lapartiegauchedudessinmontrelapileetlescontextesaveclesquelssontsauvegardeslesvaleursprovisoiresdu rsultat. La partie droite montre les lments de pile dans les diffrents tats. Comme seule importe la dernire position de pile qui contient le rsultat dfinitif, il nest pas ncessaire de maintenir les valeurs intermdiaires. Par consquent,chacunedespositionsintermdiairespeuttrecraseparlanouvelleposition,cequimontrequelapile est,cettefois,restreinteuneseuleposition.Lentre(ii)craselentre(i)etelleestsontourcraseparlentre (iii).Lorsquelachaneestvide,commeicilentre(iv),lersultatdfinitifestobtenu. Notons alors, en second paramtre de la fonction longueur, le rsultat provisoire obtenu dans chaque tat. On obtient : l o n g u e u r (abc, 0) = l o n g u e u r (bc, 1) = l o n g u e u r (c, 2) = l o n g u e u r (, 3) cequiterminelecalcul. Lesecondparamtreestappelunaccumulateur.Lafonctionlongueurscrit : Algorithme2:longueurdunechanedecaractresVersion2 Algorithmelongueur # Nombre de caractres de ch. Entre ch:CHANE # La chane dont on veut la longueur. ACC:ENTIER # Laccumulateur. Rsultat : ENTIER prcondition chNUL ralisation si ch=CHANE_VIDE alors Rsultat<ACC sinon Rsultat<longueur(fin(ch),ACC+1) fin si postcondition ... fin longueur Pour utiliser les services de cet algorithme, il suffit de lappeler avec la chane de caractres tudier et un accumulateurinitialis0. ...

- 2-

ENI Editions - All rigths reserved - Jonifar lina

171

phrase:CHANE nbCar:ENTIER ... initialiserphrase nbCar<longueur(phrase,0) ... Bien entendu, toute erreur dans linitialisation de laccumulateur provoque une erreur de calcul et un rsultat faux renvoyparlafonction. Ladiffrencedecomportementdesdeuxfonctionsvientdecequelapremirefaitappelsespropresservicesdans une expression arithmtique. Lappel rcursif participe cette expression en tant quoprande. On parle alors de rcursivit non terminale.Danslasecondefonction,lappelrcursifintervienttoujours,maispasentantquoprande dune instruction de calcul. On parle alors de rcursivit terminale. Lorsque la rcursivit est terminale, il nest pas ncessaire de sauvegarder les tats intermdiaires du systme puisque les valeurs intermdiaires de cet tat ne participeplusaucalculdursultat. Lorsquelarcursivitterminaleestexploiteenprogrammation,lescompilateursdelangagesinformatiquesmodernes savent la reconnatre et la transformer automatiquement en itration. Autrement dit, ltude de la solution algorithmiquepeutsesatisfairedunesolutionrcursiveterminaledontnousavonsvuquelleestplusexpressiveet plusfacilementobtenuequunesolutionitrative.Onlaissera,aucompilateurdulangagedimplmentation,lesoinde latransformerenitrationpourgagnersurlesperformances. Lasuitedecechapitreproposequelquesexercicespoursentranerpratiquerlanalysealgorithmiqueetlarcursivit pourdessolutionsoelleestterminale.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

172

Exercices
Exercicersolu1:Fonctionfactorielle Transformer lalgorithme de la fonction factorielle tudie au chapitre Rcursivit pour en faire un algorithme dont la rcursivitestterminale. Solution Ilsuffitdutiliserunaccumulateurinitialis1puisquefactorielle(0) = factorielle(1) = 1. Algorithme3:Fonctionfactorielle(rcursivitterminale)

Algorithme factorielle # n! Entre n : ENTIER ACC : ENTIER prcondition n0 ralisation si n<2 alors Rsultat<ACC sinon Rsultat<factorielle(n1,ACCxn) fin si postcondition Rsultat=n! fin factorielle Lafonctionestutiliseainsi : k <- f a c t o r i e l l e (10, 1) # calcule 10!

Exercicersolu2:Fonctionappartient 1.crireunefonctionappartientquirendVRAIsietseulementsilecaractrequellereoitensecondparamtrecomposela chanequellereoitenpremierparamtre. 2.Lasolutionproposeestelleunercursivitterminale ? Solution LersultatestvidemmentFAUXlorsquelachanedecaractresestvide : ch = CHANE_VIDE => R s u l t a t = FAUX LersultatestVRAIsilecaractrecherchestlepremierdelachanequandellenestpasvide : ch CHANE_VIDE => R s u l t a t = (p r e m i e r (ch) = car) ... Lorsquecenestpaslepremier,lersultatestVRAIsilecaractreappartientaurestedelachane : ... o u s i n o n R s u l t a t = a p p a r t i e n t (f i n (ch), car)) Lalgorithmedemandestdonc : Algorithme4:Fonctionappartient

ENI Editions - All rigths reserved - Jonifar lina

- 1-

173

Algorithmeappartient # car appartient-il ch? Entre ch:CHANE car:CARACTRE prcondition chNUL carNUL ralisation si ch=CHANE_VIDE alors Rsultat<FAUX sinon Rsultat<( premier(ch)=car ou sinon appartient(fin(ch),car)) ) fin si postcondition ... fin appartient Exprime ainsi, la rcursivit nest pas terminale puisque lappel rcursif appartient compose une expression boolenne.Maisilnestpasncessairedutiliserunaccumulateurici,enrefactorisantlesinstructionsdelalternative : ralisation si ch=CHANE_VIDE alors Rsultat<FAUX sinon si premier(ch)=car alors Rsultat<VRAI sinon Rsultat<appartient(fin(ch),car)) fin si Lexercicesuivantestmoinstrivial. Exercicersolu3:Fonctionfibonacci crireunefonctionrcursivequicalculellmentderangndelasuitedeFibonacci. Solution NousavonsdjvudansunchapitreantrieurquelasuitedeFibonacciestdfiniepar : f i b o n a c c i (0) = f i b o n a c c i (1) = 1 f i b o n a c c i (n) = f i b o n a c c i (n - 1) + f i b o n a c c i (n - 2), n 2 Unepremiresolutionconsisteparaphrasercettedfinition : si n<2 alors Rsultat<1 sinon Rsultat<fibonacci(n1)+fibonacci(n2) fin si Cependant, les appels rcursifs sont les deux oprandes dune addition. Pour rendre terminale la rcursivit, le contextedoitsauvegarderainsideuxvaleurs.UnesolutionconsistedoncutiliserdeuxaccumulateursF1etF2 :

- 2-

ENI Editions - All rigths reserved - Jonifar lina

174

Entre n,F1,F2:ENTIER Rsultat : ENTIER prcondition n0 ralisation si n<2 alors Rsultat<F1 sinon Rsultat<fibonacci(n1,F1+F2,F1) fin si postcondition ... Lafonctionestappelepar : v <- f i b o n a c c i (50, 1, 1) # calcul du 50 e terme. m

Exercice1:Additiondedeuxentiers Ondonnedeuxentiers. Calculerrcursivementleursommeenneralisantquedesincrmentations. Lasoustractionnestpasautorise.Seulesladditionde1etlalternativesontautorises. Exercice2:Puissancedunrelparunentier 1.Calculerrcursivementxn.

Larcursivitdoittreterminale. 2.Transformerenunalgorithmeitratifpuisprogrammereffectivementlessolutionspourcomparerlesduresdexcution surdesjeuxdedonnesidentiques. Dune faon gnrale, tous les exercices traits dans les chapitres Rcursivit et Itration peuvent tre repris pour obtenirunesolutionrcursiveourcursiveterminale.numrerlesnoncsdecesexercicesnapporteraitriendeplus ici.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

175

Rsum
Cechapitreestunecourteintroductionauxproblmessoulevsparlarcursivit.Nousavonsvuquelqueslments permettant dtre sensibilis aux inconvnients de la rcursivit, mais aussi les avantages incomparables que prsentent ces solutions, notamment dans la puissance dexpressivit quelles permettent. Nous avons introduit la rcursivitterminaleetprcislesraisonsquifontquecessolutionspeuventtreutilises,enprogrammation,sans inconvnient majeur avec un compilateur de langage moderne. Il faudrait aussi montrer comment transformer les algorithmes rcursifs en algorithmes itratifs et comment prouver un algorithme rcursif, mais ces problmes dpassentlecadredecetteinitiation.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

176

Introduction
Ce chapitre prsente le tri de donnes comparables. On considre une collection C de donnes de mme type T, quelconque mais COMPARABLEs. On veut obtenir une reprsentation ordonne des lments de la collection. Les donnesserontorganisesleplussouvententableau.Onnecherchedoncpasicidestrisdequalit,valusselon leursperformances,maispluttunprtextelaconstructionraisonnedalgorithmes. LasectionSpcifierunalgorithmedetricommenceparposerleproblme.Cestlapartiedifficileduchapitreetellepeut treignoreenpremirelecture.Enparticulier,laspcificationalgorithmiquecompltedunalgorithmedetriimposela dfinition des multiensembles invariables et de certaines oprations applicables difficiles spcifier. La section suivante tudie quelques algorithmes usuellement dfinis dans une initiation lalgorithmique. La section Fusionner deuxtableauxtrismontrecommentfusionnerdeuxtableauxtris.LasectionExercices,enfin,proposedesexercices plusdifficiles.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

177

Spcifierunalgorithmedetri
Cettesectionestfaitededeuxparties.Lapremireprsenteleproblmedutridedonnescomparables.Laseconde tudie la postcondition dun tri. Cest la partie vraiment difficile du chapitre et elle peut tre ignore en premire lecture.

1.Prsentationduproblmedutri
SoittuntableaudontlescomposantessontduntypeTdrivdeCOMPARABLE.Onveutunalgorithmequireplace danstsescomposantesenordre,parexemple,croissant.Lafiguresuivantereprsenteuntableaudentiersavant etaprsletri.

Commedhabitude, lalgorithmedfinirintervientsurunepartieprcisedutableau,entrelescasesdenumros dbutetfin.Lesdonnessontreplacesenordrecroissantdanslemmetableau,quisetrouvedoncmodifipar lalgorithme.Parconsquent,ilsagitdcrireuneprocdure.Lesdonnesenentresontletableautetlesnumros des composantes extrmes dbut et fin. La signature de la procdure et sa prcondition peuvent donc tre prcises : Algorithme trierAsc # Trier t[dbut .. fin] en ordre croissant. Entre t : TABLEAU[T -> COMPARABLE] # Le tableau trier. dbut, fin : ENTIER # Numros des composantes extrmes trier. prcondition # dbut et fin sont des index valides de t. index_valide(t, dbut) index_valide(t, fin) # t[dbut .. fin] est dfini. estDfini(t, dbut, fin) LalgorithmeestDfiniestunprdicatVRAIsietseulementsilapartiet[dbut .. fin]atinitialise. Algorithme1:SpcificationsdeestDfini

Algorithme estDfini # t[dbut .. fin] a-t-il t initialis ? Entre t : TABLEAU[T -> COMPARABLE] # Le tableau explorer. dbut, fin : ENTIER # Numros composantes extrmes vrifier. Rsultat : BOOLEN prcondition # dbut et fin sont des index valides de t. index_valide(t, dbut) index_valide(t, fin) postcondition # FAUX lorsque les indices ne sont pas en ordre. dbut > fin => Rsultat = FAUX # VRAI si et seulement si les composantes de t[dbut .. fin] # sont non nulles.
ENI Editions - All rigths reserved - Jonifar lina - 1-

178

dbut = fin => Rsultat=(t[dbut]NUL) dbut<fin=>Rsultat= ( (t[dbut]NUL) et alors estDfini(t,dbut+1,fin) ) Lapostconditiondutriestplusdifficileobtenir.Cestellequiesttudiedanslasectionsuivante.

2.tudedelapostconditiondutri
Lapostconditionprcisedabordquelapartiet[dbut .. fin]dutableautesttrie,icienordrecroissant.Laclause quiexprimecettatadjtcriteauchapitreItration.ElleutiliseleprdicatestTriAscdontlechapitreItration atudiuneversionitrative.Onobtientdonc : ... postcondition # dbut et fin ne sont pas modifis. ancien(dbut)=dbut ancien(fin)=fin # t[dbut .. fin] est tri en ordre croissant. estTriAsc(t,dbut,fin) ... Cependant, nous devons exprimer que la partie t[dbut .. fin] a certes t modifie, mais que les mmes lments restent prsents. Ainsi, les tableaux t et ancien(t) ont les mmes lments, dans les mmes sous tableaux, entre les cases de numros dbut et fin, mais quils ne sont pas ncessairement identiques puisque certainescomposantesontpeuttretdplaces.Nousnepouvonspascrirelacondition(c1) : ( k, dbut k fin)(i, dbut i fin)(t[k] = a n c i e n (t)[i]) carilpeutexisterdescomposantesdet enplusieursexemplairesentredbutetf i n.Considrons,parexemple,les tableauxdelafiguresuivante :

Lersultatt esttrienordrecroissantetilpasseletestexprimparlacondition(c1).Pourtant,letriralisnest pas correct puisquon ne retrouve pas dans t [ d b u t . . f i n ] tous les lments de ancien( t ) [ d b u t . . f i n ] . Le secondexemplairedellmentaatremplacparunnouvelexemplairedellmentb.Nousdevonspouvoirnous assurer quet et ancien( t ) possdent exactement le mme nombre dexemplaires des mmes composantes. Pour dfinir un prdicat qui permettra de les comparer, on peut liminer , chaque tape de la comparaison, les composantestrouvesdanslesdeuxtableaux.Poursimplifierlesnotations,crivonslescomposantesdestableaux enutilisantlanotationensembliste.Pourlestableauxdelafigurecidessus,ona,initialement : E = {a, b, c, a} F = {a, b, b, c} EetFsontappelsdesmultiensembles.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

179

Dfinition Onappellemultiensembleunensembledanslequelleslmentspeuventapparatreenplusieursexemplaires. Pour vrifier que les deux multiensembles sont gaux, on compare les deux premiers lments et on les trouve gaux. Ils sont limins et on obtient alors les deux multiensembles : {b, c, a} et {b, b, c}. Une nouvelle comparaison permet de constater que les premiers lments de chacun deux sont gaux. Aprs limination, on obtient {c, a} et {b, c}. Le premier lment du premier multiensemble est alors gal au deuxime lment du second multiensemble et on obtient {a} et {b}. La dernire comparaison tablit que les deux multiensembles initiauxntaientpasgaux.Commepourdeuxensemblesquelconques,lgalitdedeuxmultiensemblesestdfinie laidedelinclusion : Dfinition SoientEetFdeuxmultiensembles.Ona:(E=F) FetFE) (E Autrement dit, comme pour deux ensembles quelconques, deux multiensembles sont gaux lorsque lun est inclus danslautreetrciproquement.Soitalorsestgalleprdicatquitablitlgalitdedeuxtableauxconsidrscomme desmultiensembles.Saspcificationest : Algorithme2:Spcificationdelgalitdedeuxmultiensembles Algorithmeestgal # t[dbut_t .. fin_t] et u[dbut_u .. fin_u] sont-ils gaux ? Entre t,u:TABLEAU[TCOMPARABLE] dbut_t,fin_t,dbut_u,fin_u:ENTIER Rsultat : BOOLEN prcondition index_valide(t,dbut_t) index_valide(t,fin_t) estDfini(t,dbut_t,fin_t) index_valide(u,dbut_u) index_valide(u,fin_u) estDfini(u,dbut_u,fin_u) postcondition Rsultat= ( estInclus(t,dbut_t,fin_t,u,dbut_u,fin_u) et alors estInclus(u,dbut_u,fin_u,t,dbut_t,fin_t) ) Il reste dfinir le prdicatestInclus. Cest une autre difficult de cette spcification. Comme pour les ensembles, linclusion sera dfinie laide de lappartenance. Soit appartient le prdicat qui rend VRAI si et seulement si un lmentappartientuntableau. Algorithme3:Spcificationdeappartientdansuntableau. Algorithmeappartient # e appartient-il t[dbut .. fin] ? Entre t:TABLEAU[T] dbut,fin:ENTIER e:T Rsultat:BOOLEN prcondition index_valide(t,dbut) index_valide(t,fin) estDfini(t,dbut,fin) postcondition Rsultat=(rang(t,dbut,fin,e)ABSENT) Pour sassurer quun lment donn appartient au tableau, on calcule son rang, cestdire le numro de la composantedecetlmentdansletableau.CerangdoittrediffrentdeABSENT.
ENI Editions - All rigths reserved - Jonifar lina - 3-

180

Pour vrifier quun multiensemble E est inclus dans le multiensemble F, nous devons construire un algorithme capable de vrifier lappartenance de chacun des exemplaires dun mme lment de E F. Pour cela, lorsquun lmentde Eattrouvdans F,onconstruitunecopiedeFdanslaquellellment commun occupe la premire composante. Mais cette copie laisse F invariable. La figure cidessous illustre les oprations raliser lorsque llmentadutableaut atreconnucommeunlmentdutableauu.

Commelepremierlmentdet etdelacopiedeusontlesmmes,onpeutpoursuivrelammecomparaisonsurles mmesensembles,maisprivsdeleurpremierlment.Autrementdit,ilsuffitderaliserlammecomparaisonsur lestableauxt dans[ d b u t _ t + 1 . . f i n _ t ] etcopiedeudans[dbut_u+1 .. fin_u].Lacopiedeuestraliseparla fonctioncopie,dontlesspcificationssont : Algorithme4:Spcificationdelafonctioncopieduntableau Algorithmecopie # Ralise une copie de t[dbut .. fin] Entre t:TABLEAU[T] dbut,fin:ENTIER Rsultat:TABLEAU[T] prcondition index_valide(t,dbut) index_valide(t,fin) dbutfin estDfini(t,dbut,fin) postcondition sontIdentiques(Rsultat,dbut,fin,t,dbut,fin) fin copie LeprdicatsontIdentiquesrendVRAIsietseulementsilesdeuxtableauxcontiennentlesmmesdonnesdansles composantesdemmerang.Ilseradfiniprcismentplusbas.Conformmentlasituationprsentesurlafigure prcdente,onaindex_min(Rsultat)=dbutetindex_max(Rsultat)=fin. Cest dans cette copie quest ralis lchange de llment commun t et u. On utilise pour cela la procdure changer dj dfinie au chapitre Programmes directs. Soit alorschangeInvariable lopration qui, partant de u, raliselacopiedanslaquellellmentderangkestpermutavecllmentderangdbut.Cetchangeestqualifi dinvariable parce quilraliselchangesurunecopiede u,doncsansmodifier u.Cetchangeinvariableestdfini parlalgorithmesuivant : Algorithme5:Spcificationdelchangeinvariable AlgorithmechangeInvariable # La copie de t dans laquelle t[dbut] et t[k] sont changes. Entre t:TABLEAU[T]# La cible de lchange. dbut,fin:ENTIER # Numros des composantes extrmes copier. k:ENTIER # Numro de la composante changer avec
- 4 ENI Editions - All rigths reserved - Jonifar lina

181

# t[dbut]. Rsultat:TABLEAU[T] prcondition dbutkfin index_valide(t,dbut) index_valide(t,fin) est_dfini(t,dbut,fin) postcondition dbut=fin=>Rsultat= (dbut=ketRsultat[dbut]=t[dbut]) dbut<fin=> ( Rsultat[dbut]=t[k] et Rsultat[k]=t[dbut] et sontIdentiques(Rsultat,dbut+1,k1,t,dbut+1,k1) et sontIdentiques(Rsultat,k+1,fin,t,k+1,fin) ) fin changeInvariable Lesdeuxderniresclausesdelapostconditionexprimentquelescasesdontlesnumrosnesontpasdbutetksont recopiessansmodification.Ellessexprimentplussimplementpar : ( i, dbut i fin e t i k)(R s u l t a t [i] = t[i]) Admettezquecetteformuleestbienplusfacilecomprendrequelexpressionalgorithmiquedelinvariancedescases correspondantes. OnpeutalorsdonnerlesspcificationsdeestInclus. Algorithme6:SpcificationduprdicatestInclus AlgorithmeestInclus # t[dbut_t .. fin_t] u[dbut_u .. fin_u] ? Entre dbut_tfin_t index_valide(t,dbut_t) index_valide(t,fin_t) est_dfini(t,dbut_t,fin_t) dbut_ufin_u index_valide(u,dbut_u) index_valide(u,fin_u) est_dfini(t,dbut_u,fin_u) postcondition dbut_t=fin_t=>Rsultat= appartient(u,dbut_u,fin_u,t[dbut_t]) dbut_t<fin_t=>Rsultat= ( appartient(u,dbut_u,fin_u,t[dbut_t]) et alors estInclus ( t,dbut_t,fin_t, changeInvariable ( u,dbut_u,fin_u, rang(u,dbut_u,fin_u,t[dbut_t]) ), dbut_u+1,fin_u ) ) fin estInclus Ilresteprciserlidentitdedeuxtableaux.Cestfaitparladfinitionsuivante :
ENI Editions - All rigths reserved - Jonifar lina - 5-

182

Dfinition Deuxtableauxsontidentiqueslorsquilscontiennentlesmmeslmentsdanslescomposantesdemmerang. LeprdicatsontIdentiquesrendVRAIsietseulementsilestableauxenparamtressontidentiquesausensdecette dfinition.Sesspcificationssontcellesdelalgorithmecidessous. Algorithme7:SpcificationduprdicatsontIdentiques AlgorithmesontIdentiques # t[dbut_t .. fin_t] = u[dbut_u .. fin_u] ? Entre t,u:TABLEAU[T] dbut_t,fin_t,dbut_u,fin_u:ENTIER prcondition dbut_tfin_t index_valide(t,dbut_t) index_valide(t,fin_t) est_dfini(t,dbut_t,fin_t) dbut_ufin_u index_valide(u,dbut_u) index_valide(u,fin_u) est_dfini(t,dbut_u,fin_u) postcondition dbut_t=fin_t=>Rsultat= ( dbut_u=fin_u et alors t[dbut_t]=u[dbut_u] ) dbut_t<fin_t=>Rsultat= ( t[dbut_t]=u[dbut_u] et alors sontIdentiques (t,dbut_t+1,fin_t,u,dbut_u+1,fin_u) ) fin sontIdentiques Lidentitdedeuxtableauxsurtoutesleurscomposantes,depuisindex_minjusquindex_maxseranoteavecle signe = .Ainsi,pourdeuxtableauxt etu : t=usontIdentiques ( t , index_min( t ) , index_max( t ) , u , index_min( u ) , index_max( u ) ) Ilestalorspossibledecomplterlapostconditiondunalgorithmedetriparlesclausesquiprcisentquelesparties quinesontpasconcernesparletrirestentidentiquesleuranciennevaleur : sontIdentiques ( t , index_min( t ) , d b u t -1 , ancien( t ) , index_min( t ) , d b u t -1 ) sontIdentiques ( t , f i n + 1 , index_max( t ) , ancien( t ) , f i n + 1 , index_max( t ) ) Ainsi, les valeurs non modifies par le tri appartiennent deux soustableaux : les composantes de numros infrieursdbutetsuprieursf i n.Cescomposantesnexistentquesiindex_min(t) < dbutpourlepremiersous tableauetfin<index_max(t)pourlesecond.Finalement,lesclausescompltesdelapostconditionquiprcisentles partiesnonconcernesparletrisont : ... index_min(t) < dbut = > sontIdentiques

- 6-

ENI Editions - All rigths reserved - Jonifar lina

183

( t , index_min( t ) , d b u t -1 , ancien( t ) , index_min( t ) , d b u t -1 ) fin < index_max(t) = > sontIdentiques ( t , f i n + 1 , index_max( t ) , ancien( t ) , f i n + 1 , index_max( t ) ) ... Nousdisposonsainsidetousleslmentsncessairespourspcifieruntri.Cestfaitparlalgorithmecidessous. Algorithme8:SpcificationdetrierAsc Algorithm trierAsc e # Trier t[dbut .. fin] en ordre croissant. Entre t : TABLEAU[ T COMPARABLE] # L a c i b l e d u t r i . d b u t , f i n : ENTIER # Num ros des com posantes extrm trier. es prcondition index_valide( t , d b u t ) index_valide( t , f i n ) dbut fin estDfini( t , d b u t , f i n ) postcondition # La partie trie est gale l ancienne. estgal( t , d b u t , f i n , ancien( t ) , d b u t , f i n ) # Elle est trie en ordre croissant. estTriAsc( t , d b u t , f i n ) # Les parties non tries restent identiques. index_min(t) < dbut = > sontIdentiques ( t , index_min( t ) , d b u t -1 , ancien( t ) , index_min( t ) , d b u t -1 ) fin < index_max(t) = > sontIdentiques ( t , f i n + 1 , index_max( t ) , ancien( t ) , f i n + 1 , index_max( t ) ) fin trierAsc tudions,prsent,quelquesalgorithmesdetri.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

184

Quelquesalgorithmessimples
Cettesectionprsentequelquesalgorithmessimplespermettantdetrierleslmentsduntableau.Lapremirepartie introduitunestratgiegnralenaturelledetrideslmentsduntableau.Decettestratgie,lasecondepartiedcline unepremiresolutionentudiantunalgorithmequiestauxalgorithmesdetricequelecalculdunefactorielleest ltudedelarcursivit :unexerciceoblig.Dustrictpointdevueinformatique,lesperformancesdun tel algorithme sont si pauvres quaucun informaticien srieux na song, un seul instant, lutiliser en situation relle pour trier un volume important de donnes. Il ne continue tre tudi que pour ses qualits pdagogiques. La troisime partie tudieunesecondesolution.Cestunalgorithmedetriparpermutationsquieffectueunpeumoinsdoprationsquele prcdent.Iciencore,cesontlesraisonnementsmisen uvrequijustifientltudedecetalgorithme.Ladernirepartie prsentequelquesvariantesdutriparpermutations.

1.Triparpermutations:introduction
Soit t un tableau de composantes de typeTquidrivedeCOMPARABLE.Onveutletrierenordrecroissant.Cette oprationconsisteamenerlesgrandesvaleursversle haut dutableau,verslacasedenumrofin.Enfait,t[fin] contiendra la composante de t[dbut .. fin] de plus grande valeur. Une stratgie de tri consiste donc amener la valeur maximum de t[dbut .. fin] en t[fin] o elle aura alors rejoint sa place dfinitive. La plus grande valeur de t [dbut .. fin1] sera ensuite dplace en t[fin1] qui sera sa position dfinitive... Ainsi, chaque tape du calcul, le tableau est partitionn en deux soustableaux : la partie haute , qui contient les plus grands lments et qui nvolueraplus lapartie basse quinestpasencoretrie.Considrons,parexemple,lasituationreprsentepar lafigurecidessous.

La partie libelle Tri en place rassemble des composantes qui ont acquis leur place dfinitive et ne bougerons plusparlasuite.Ilestdoncinutiledexplorercettepartiedutableaulorsdesprochainesphasesdetri.Ilsuffirade faire remonter la plus grande composante de la partie trier pour augmenter la partie trie et en place. Cette remarquesuggreunehypothse : Faireunehypothsesurltatintermdiaire Hypothse(H):Lapartiet[i+1..fin]esttrieetenplace. Chaquetapeducalculajouteunecomposantedepluslapartietrieetenplaceet,parconsquent,lavaleurdei diminue. Voirsicestfini Cestfinilorsquetoutletableauesttrietenplace,donclorsquei + 1 = dbut.Ainsi,letriesttermindsquei = dbut - 1,doncdsquei dbut1,soitdsquei<dbut.Onpeutrduirelgrementcetespace.Lorsquela partietrieetenplacestenddedbut+1fin,letableauesttri.Eneffet,ilnerestealorsquelacomposantede numrodbutetellenepeutplusbougerpuisquesondplacementdplaceraitaussilunedesautrescomposantes, cequicontrediraitlhypothse.Onadonc : i + 1 = dbut + 1 i = dbut Parconsquent,cestfinidsquei dbut. Serapprocherdeltatfinal Onserapprochedeltatfinalenajoutantunecomposantedepluslapartietrieetenplace.Commecettepartie nebougeraplus,lacomposantesupplmentaireestlaplusgrandevaleurdelapartiequinestpasencoretrieetelle prendlaplacedeladernirecomposantedecettepartie.Onobtient :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

185

... Amener la plus grande composante de t[dbut .. i] la place de t[i] ... Lapartietrieetenplacepossdealorsunecasedeplusetstend,prsent,delacasedenumroi jusqula casedenumrof i n.Ilsuffitalorsdereculeri pourretrouver(H). Initialiserlecalcul Initialement,aucunepartiedet nestenplace.Laprochainecasequirejoindralapartietrieenplaceportelenumro i .Initialement,cestf i net,parconsquent,i estinitialisf i n. Rdigerlalgorithmedfinitif Cest fini lorsque i = dbut. Par consquent, cest fini lorsquei - dbut = dbutquiestbiendcroissantpuisquei dcrotdef i ndbut + 1. Dautrepart,direquet [ i + 1 . . f i n ] esttrisexprimepar : ... e s t T r i A s c (t, i + 1, fin) Cependant,cecinestvraiquelorsquei + 1 fin,soitdsquei < f i n .Linvariantestdonc : ... invariant i < fin => estTriAsc(t, i + 1, fin) ... Ilnefautpasseulementexprimerquecettepartiedutableauesttrie,maisaussiquellenebougeraplus.Cestce que montre la figure prcdente, dans laquelle toutes les composantes depuis celle de numro 12 jusqu celle de numrof i n=19sonttriesenordrecroissant.Maisseulelapartiedescomposantesdenumros16f i n=19esten place.Lacaractrisationprcdentedelinvariantestdoncinsuffisante.Pourprciserquelapartiedepuislacasede numroi + 1jusqu la case de numrof i n ne bougera plus, il suffit dexprimerquelapluspetitevaleurdecette partie, celle contenue dans la case de numro i + 1, est suprieure ou gale toute valeur dans lautre partie. Autrementdit,quecettevaleurestlavaleurmaximumdelapartiedutableaut [ d b u t . . i + 1 ] : ... invariant i < fin => estTriAsc(t, i+1, fin) et alors max(t,dbut,i)t[i+1] ... Il reste rdiger la solution dfinitive. Cest fait dans lalgorithme suivant, dans lequel la prcondition et la postconditionnontpastrptes. Algorithme9:Triparpermutations AlgorithmetriPermut # Trier t[dbut .. fin] en ordre croissant par permutations. Entre t:TABLEAU[TCOMPARABLE] dbut,fin:ENTIER prcondition ... variable i:ENTIER # Numro de la prochaine case placer. initialisation i<fin jusqu idbut invariant i<fin=> estTriAsc(t,i+1,fin)et alors max(t,dbut,i)t[i+1] variant de contrle idbut 0. Le variant de contrle est donci -

- 2-

ENI Editions - All rigths reserved - Jonifar lina

186

rpter Amenerlaplusgrandecomposantedet[dbut..i]ent[i] i<i1 fin rpter postcondition ... fin triPermut Il reste donner un sens lexpression Am ener la plus grande com posante de t[dbut..i] en t[i] . On obtientdiffrentessolutionsselonsaralisation.Lasectionsuivanteentudieunequivientnaturellementlesprit.

2.Triparpermutations
Il sagit donc damener la composante de t [ d b u t . . i ] de valeur maximum en t [ i ] . Nous savons dterminer la position de la composante maximum dun tableau. Il sagit dutiliser la fonction rangDuMax qui na pas encore t dfinie.UnchapitreantrieuratudilafonctiondualerangDuMinetlanouvellefonctionsedfinitdelammefaon. Cettedfinitionestlaisseenexercice.Onobtientdonc : ... rpter # Amener la plus grande valeur de t[dbut .. i] la place # de t[i]. k<rangDuMax(t,dbut,i) changer(t[i],t[k]) assertion i<fin=> estTriAsc(t,i,fin) et alors max(t,dbut,i1)t[i+1] i<i1 fin rpter ... Cesegmentdalgorithmefaitapparatreunparagrapheassertionquidcritltatintermdiaireatteintenutilisantles prdicats habituels. Il termine la premire solution au problme pos. Il reste rassembler les diffrentes parties tudiespourobtenirunalgorithmecomplet. Exercice1:Extensionsautriparpermutations Cetexerciceproposequelquesvariationssurlethmeprcdent. 1.Aulieuduntrienordrecroissant,dfiniruntrienordredcroissant. 2.Fairelhypothsequecestlapartiet[dbut..i1]quiesttrieenplaceetredfinirletrienordrecroissant. 3.Pourletridelaquestionprcdente,crireavantetaprschaqueinstructiondelitrationlassertionalgorithmiquequi dcrit ltat intermdiaire obtenu. Dfinir les prdicats ncessaires et mettre en vidence la conservation ou non de linvariant. Lasectionsuivantetudieuneautresolution,obtenueendrivantduneautrefaonlapartiedelalgorithmequifait remonterlacomposantemaximumverssaplacedfinitive.

3.Tri bulle (BubbleSort)


Letridelasectionprcdentefaitbeaucoupdetravailinutile.Ainsi,quandlemaximumdunepartiedutableauest dtermin,litrationsuivanterecommencepourdterminerlemaximumdelammepartie,maisprivedunlment. Ondcidedexploiteruneexplorationdutableauenprofitantdelarencontrededeuxlments,quinesontpasen ordre,pourlespermuter.Pourralisercetteexploration,onprocdeainsi :oncomparechaquelmenttousceux quileprcdent.Unepermutationesteffectuechaquefoisquedeuxlmentsnesontpasenordre.Ainsi,llment courant,celuiderangi + 1,estsuccessivementcomparauxlmentsderangsj = i ,j = i - 1jusquceluide rangdbut.Cettedescriptionsuggredoncunehypothse : Faireunehypothsesurltatactuel Hypothse(H):t[j+1..i]atexploretleslmentsquinesontpasenordreonttpermuts.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

187

Voirsicestfini Cest fini lorsque j + 1 = dbut, donc ds que j = dbut - 1, soit ds que j < dbut. Linvariant peut tre immdiatementprcis.Commelapermutationdeslmentsquintaientpasenordreateffectue,ona : ... invariant t[i]=max(t,j+1,i) ... Demme,levariantdecontrlesedduitimmdiatementdelaconditiondeterminaison: ... variant de contrle dbutj1 ... Serapprocherdeltatfinal On se rapproche de ltat final en comparant une case de plus la case courante, celle de numro i . La case comparerestcelledenumroj ,do : ... si t[j]>t[i] alors changer(t[j],t[i]) fin si j<j1 ... Initialiserlecalcul Pour raliser lhypothse,ilconvientdinitialiser j defaonque t [ j + 1 . . i ] aitdjttrait.Laprochainecase observer est celle de numro j . Initialement, aucune case na encore t observe et donc, la premire case observerestcelledenumroi .Onadonc : ... initialisation j<i ... Rdigerlalgorithmedfinitif Dolaralisationdfinitive: ... # Amener la plus grande valeur de t[dbut .. i] la place de t[i]. initialisation j<i jusqu j<dbut invariant j<i=>t[i]=max(t,j+1,i) variant de contrle dbutj1 rpter si t[j]>t[i] alors changer(t[i],t[j]) fin si j<j1

- 4-

ENI Editions - All rigths reserved - Jonifar lina

188

fin rpter ... Il ne reste plus qu rassembler les diffrentes parties pour obtenir lalgorithme dfinitif et complet appel tri bulle (bubble sort).Cetalgorithmetientsonnomdeceque,chaqueexploration,leplusgrandlmentquinest pasencoresaplaceremonteverssapositiondfinitive,commeunebulleremontelasurfacedunrcipientrempli deliquide.

4.Dautrestrisparpermutations
chaquefoisquelonrencontredeuxcomposantesquisesuiventetquinesontpasenordre,onleschange.On recommenceuneexplorationcompltedutableauchaquefoisqueladernireexplorationaprocdaumoinsun change. Le tableau est entirement tri lorsquuneexplorationcompltena provoqu aucun change. La table ci dessousmontreunexempledelvolution duntableau.Lapremirecolonneestlenumrodordredelexploration. Chaqueligneestuneexplorationdutableautrier. t 1 2 3 4 t 5 3 3 3 3 3 3 5 5 5 4 4 8 8 6 4 5 5 12 6 4 6 6 6 6 4 8 8 8 8 4 12 12 12 12 12

Lapremireexplorationrencontresuccessivement5et3puis12,6et4quinesontpasenordre.5et3,12et6puis 12et4sontpermutsetlaligne1dutableauestobtenue.Danscetteligne,12estremontdesapositioninitiale sapositiondfinitive.Lexplorationdelaligne2rencontre,danslaligne1,lesvaleurs8et6quinesontpasenordre etlespermute.Elletrouvealors8et4endsordreetlespermute.Ainsi,8estremontdesapositioninitiale,enligne 1, sa position dfinitive, en ligne 2. Les valeurs 8 et 12 sont alors dans leur position dfinitive et une nouvelle exploration est entreprise. En itrant ce procd, on arrive la ligne 4. Une nouvelle exploration ne provoque plus aucunepermutationdlmentetlalgorithmesetermine. Lalgorithme,pourtrieruntableauseloncettestratgie,consistedoncenunesuccessiondexplorationscompltesdu tableau.SoittriApermcetalgorithme soncritureestsimpleetnemritepasplusdedveloppementdanssaforme nave.Unevariableboolennet r i prendlavaleurFAUX,siaumoinsunepermutationdevaleursdanst aeulieulors deladernireexploration.Chaqueexplorationcommencelacasedenumrodbutetcomparetouteslespairesde composantes jusqu celle de numro f i n. On obtient lalgorithme suivant, dans lequel la prcondition et la postconditionnesontpasrptes. Algorithme10:Algorithmedutriparpermutations:versionprovisoire AlgorithmetriAperm # Tri de t[dbut .. fin] en ordre croissant par permutations. Entre t:TABLEAU[TCOMPARABLE] dbut,fin:ENTIER prcondition ... variable tri:BOOLEN initialisation tri<FAUX rpter explorer(t,dbut,fin,tri) jusqutri fin rpter postcondition ... fin triAperm

ENI Editions - All rigths reserved - Jonifar lina

- 5-

189

Cette expression traduit directement la description informelle du comportement de lalgorithme. Remarquer la constructionrpter...jusqu.Elleindiqueuneitration,maisdanslaquellelaconditiondeterminaisonestvalue justeavantlaclausehabituellefinrpter.Cestquelexplorationdoittreraliseaumoinsunefoisquellequesoit lavaleurinitialedelavariablet r i quicontrlelitration.Dailleurs,linitialisationdecettevariableestinutilepuisque cestlaresponsabilitdelexplorationquedeluidonnerunevaleur.Onpeutdoncsupprimercetteinitialisationsans consquence.Laversiondfinitiveestcelledelalgorithmequisuit. Algorithme11:Algorithmedutriparpermutationsversionnavedfinitive AlgorithmetriAperm # Tri de t[dbut .. fin] en ordre croissant par permutations. Entre t:TABLEAU[TCOMPARABLE] dbut,fin:ENTIER prcondition ... variable tri:BOOLEN rpter explorer(t,dbut,fin,tri) jusqutri fin rpter postcondition ... fin triAperm Bien entendu, moyennant quelques adaptations, il est possible de continuer utiliser la construction jusqu ... rpter ou tant que ... rpter pour dfinir cet algorithme. On voit ainsi quil existe diffrentes faons dexprimersansambigutlesinstructionsdunalgorithme. Cette version est facile comprendre, simple spcifier et crire, mais elle fait trop de travail inutile. Chaque exploration vrifie lordre des composantes jusqu la dernire. Or, nous avons vu dans lexemple de la table prcdenteque,chaquepassage,aumoinslavaleurmaximumdelapartienontrierejointsapositiondfinitive.Il est donc inutile de terminer un passage la composante de numrof i n : on peut sarrter avant. Lhypothseest doncencorequunepartiedutableauarejointsapositiondfinitive. Faireunehypothsesurltatactuel Dans un tat intermdiaire, on a dj ralis des explorations du tableau et on a procd un certain nombre de permutations. Elles ont amen des lments leur place, en haut du tableau. La figure cidessous reprsente une tellesituation.

Cettefigurereprsenteunesituationdanslaquellelespermutationsprcdentesontamenlescomposanteslesplus grandesdanst [ h a u t + 1 . . f i n ] .Lescomposantesenbasdutableau,depuiscelledenumrodbutjusqucellede numrohaut,siellesexistent,doiventencoretretries.Do,lhypothsedcrivantcettesituation : Hypothse(H):despermutationsontamenlapartiet[haut+1..fin]saplace. Direquecettepartieestsaplace,cestdiredabordquelleesttrie : ... invariant haut<fin=>estTrieAsc(t,haut+1,fin) ... Cest dire ensuite quelle ne bougera plus . Autrement dit, les lments de cette partie ont acquis leur position dfinitive. Or, un lment est dplac lorsque lon trouve, dans le tableau, un lment plus grand que lui. Par consquent,direquunlmentnebougeraplus,cestdirequetoutlmentquinestpasencoresaplaceluiest
- 6 ENI Editions - All rigths reserved - Jonifar lina

190

infrieurougal.Ainsi,laplusgrandevaleurdeslmentsquinontpasencorerejointleurplaceresteinfrieureou galetoutlmentquiarejointsaplacedfinitive.Parconsquent,lavaleurmaximum,dansletableaunontri,est infrieureougalelavaleurlapluspetitedeslmentsleurplace.Ceciscrit : ... invariant ... et max(t,dbut,haut)t[haut+1] ... Voirsicestfini Cestfinidsquelapartietrierecouvreletableau,doncdsquehaut = diffrencehaut - dbut. Serapprocherdeltatfinal On se rapproche de ltat final en ralisant une exploration de plus de la partie non trie. Au cours de cette exploration, on permute les valeurs conscutives rencontres lorsquelles ne sont pas en ordre. Cette exploration adresseletableaudepuislacasedenumrodbutjusqulacasedenumrohaut.Ellemett r i FAUXlorsquese produit une permutation, signe quunevaleurremonteverssapositiondfinitive.Onserapprochedeltat final en appelantlesservicesdelaprocdureexplorerentrecesdeuxvaleurs : ... rpter explorer(t,dbut,haut,tri) # t[haut .. fin] est sa place. ... Onretrouve(H)enreculanthaut : ... rpter explorer(t,dbut,haut,tri) # t[haut .. fin] est sa place. haut<haut1 # t[haut - 1 .. fin] est sa place. fin rpter ... Ilresteinitialiserlecalcul. Initialiserlecalcul Initialement,letableaunestpastrietlapremireexplorationobservetouteslescasesdutableau.Parconsquent, haut = fin.Ona : ... initialisation haut<fin tri<FAUX ... Rdigerlalgorithmedfinitif Ilneresteplusqurdigerlalgorithmedfinitif,cequiestuneformalitaveccequiatditplushaut.Onobtient : Algorithme12:AlgorithmedutriparpermutationsVersiondfinitive AlgorithmetriAperm # Trier t[dbut .. fin] en ordre croissant. Entre t:TABLEAU[TCOMPARABLE] dbut,fin:ENTIER prcondition dbut.Levariantdecontrleestdoncla

ENI Editions - All rigths reserved - Jonifar lina

- 7-

191

... variable tri:BOOLEN haut:ENTIER initialisation tri<FAUX haut<fin invariant haut<fin=> ( estTrieAsc(t,haut+1,fin) et max(t,dbut,haut)t[haut+1] ) variant de contrle hautdbut rpter explorer(t,debut,haut,tri) # t[haut .. fin] est sa place. haut<haut1 # t[haut - 1 .. fin] est sa place. jusqutri postcondition ... fin triAperm Ilrestespcifieretraliserlaprocdureexplorer.Laspcificationreprendlesclausesduntriquiprcisentquele tableau t nest pas modifi dans les intervalles externes [ d b u t . . f i n ] et que les mmes composantes restent danscetintervalle,peuttreaprsavoirchangdeplace.Onadonc : postcondition # La partie explore est gale lancienne. estgal(t,dbut,fin,ancien(t),dbut,fin) # Les parties non explores restent identiques. index_min(t)<dbut=> sontIdentiques ( t,index_min(t),dbut1, ancien(t),index_min(t),dbut1 ) fin<index_max(t)=> sontIdentiques ( t,fin+1,index_max(t), ancien(t),fin+1,index_max(t) ) ... Maisilfautencoredirecequefaitsubircetteprocdurelapartieexplore.Cestunespcificationdifficilecrire.On secontenteicidelexprimerenfranais : ... # Permutations sur la partie explore. Chaquecomposantedet[dbut .. fin]estplaceaprslaplus grandesuitedecomposantesdontelleestlemax. ... SoitestExplorleprdicatquiexprimecetteassertion.Saspcificationestlasuivante : Algorithme13:SpcificationdeestExplor AlgorithmeestExplor # VRAI ssi une exploration complte de t[dbut .. fin} a t # ralise. Entre t:TABLEAU[TCOMPARABLE]

- 8-

ENI Editions - All rigths reserved - Jonifar lina

192

dbut,fin:ENTIER Rsultat : BOOLEN prcondition dbutfin estDfini(t) index_valide(t,dbut) index_valide(t,fin) postcondition # La partie explore est gale lancienne. estgal(t,dbut,fin,ancien(t),dbut,fin) # Permutations sur la partie explore. Chaquecomposantedet[dbut .. fin]estplaceaprslaplus grandesuitedecomposantesdontelleestlemax. # Les parties non explores restent identiques. index_min(t)<dbut=> sontIdentiques ( t,index_min(t),dbut1, ancien(t),index_min(t),dbut1 ) fin<index_max(t)=> sontIdentiques ( t,fin+1,index_max(t), ancien(t),fin+1,index_max(t) ) fin estExplor On peut alors tudier la ralisation de lalgorithme. Il parcourt le tableau et, pour chaque composante strictement suprieure celle qui suit, il ralise un change dans un tat intermdiaire, on a dj ralis une partie du parcours : Faireunehypothsesurltatintermdiaire Hypothse (H) :tatexplorjusqulacomposantedenumro(i1).triestVRAIsilnyapaseudchange ralis. Lexpression t a t explor signifieque,lorsdecetteexploration,lescomposantesstrictementsuprieures cellesquilessuiventonttpermutes. Voirsicestfini Cest fini lorsque tout le tableau a t explor entre dbut et f i n. Comme lexploration est ralise jusqu la composantedenumro( i - 1 ) daprs(H),cestquecettedernireatcomparecellequilasuit,cestdire lacomposantedenumroi .Cestfinilorsquei = f i n : ... si i=fin alors cestfini sinon ... Sinon,ilfautcomparerlacomposantedenumroi cellequilasuit,denumro( i + 1 ) . Serapprocherdeltatfinal ... sinon si t[i]>t[i+1] alors changer(t[i],t[i+1]) tri<FAUX

ENI Editions - All rigths reserved - Jonifar lina

- 9-

193

fin si ... Lesystmeestalorsdansunenouvellesituationdanslaquelleunecasedeplusatexplore.Cenouveltatest dcritpar : ... assertion tatexplorjusqulacomposantedenumroi ... Onretrouveltatdcritpar(H)enavananti : ... assertion tatexplorjusqulacomposantedenumroi i<i+1 assertion tatexplorjusqulacomposantedenumroi1 ... etalors,lesmmescalculspeuventtreitrs. Initialiserlecalcul Il faut rendre lnonc de (H) vrai dans ltat initial. La prochaine case explorer est celle de numro i . Au commencement,cestlacasedenumrodbut.Parconsquent,onobtient : ... initialisation i<dbut ... Deplus,onaquelavariablet r i alavaleurVRAIsiaucunchangenatralisdaprs(H).Initialement,aucun changenaencoretralisetdonc : ... initialisation i<dbut tri<VRAI ... Rdigerlalgorithmedfinitif Lhypothse(H)exprimequeletableauatexplorjusqulacomposantedenumro( i - 1 ) etcestexactement cequeditestExplorlorsquef i n = ( i - 1 ) .Dolinvariant : ... invariant i>dbut=>estExplor(t,dbut,i1) ... Cestfinidsquei = f i n.Ainsi,ona : ... jusqu i fin variant de contrle fini ... Lalgorithmedfinitifestdonncidessous. Algorithme14:AlgorithmedelaprocdureexplorerVersion1.0 f i n ,doncdsquef i n - i = 0.Commei estcroissantdedbutf i n,cestfinidsquei

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

194

Algorithmeexplorer # Faire remonter chaque composante de t[dbut .. fin] la fin # de la plus grande suite dont elle est le max. Entre t:TABLEAU[TCOMPARABLE] dbut,fin:ENTIER tri:BOOLEN prcondition dbutfin estDfini(t) index_valide(t,dbut) index_valide(t,fin) variable i:ENTIER # Numro prochaine case explorer. initialisation i<dbut tri<VRAI jusqu ifin invariant i>dbut=>estExplor(i,dbut,i1) variant de contrle fini rpter si t[i]>t[i+1] alors changer(t[i],t[i+1]) tri<FAUX fin si i<i+1 fin rpter postcondition estExplor(t,dbut,fin) fin explorer Remarquezque,danscetalgorithmedelexploration,chaquelmentestcomparceluiquilesuitimmdiatement. Cestcequeralisentlesinstructions : ... si t[i]>t[i+1] alors changer(t[i],t[i+1]) ... Onpeutqualifiercetteexplorationendisantquelleexploreletableauavecun pas duneunit,cestdiredune case. Une ide difficile justifier mathmatiquement consiste explorer le tableau avec un pas suprieur 1, mais infrieurlademitailledutableau,cestdirelamoitidunombredecomposantes.Lalgorithmedelexploration devientceluiquisuit,danslequelunnouveauparamtre,pas,prciseavecquelpasdoittreraliselexploration. Algorithme15:AlgorithmedelaprocdureexplorerVersion2.0 Algorithmeexplorer # Faire remonter chaque composante de t[dbut .. fin] la fin # de la plus grande suite dont elle est le max. Entre t:TABLEAU[TCOMPARABLE] dbut,fin,pas:ENTIER tri:BOOLEN prcondition dbutfin 1pasquotient(findbut+1,2) estDfini(t) index_valide(t,dbut)

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

195

index_valide(t,fin) variable i:ENTIER initialisation i<dbut tri<VRAI jusqu i>finpas invariant i>dbut=>estExplor(i,dbut,i1,pas) variant de contrle finpasi+1 rpter si t[i]>t[i+pas] alors changer(t[i],t[i+pas]) tri<FAUX fin si i<i+1 fin rpter postcondition estExplor(t,dbut,fin) fin explorer Cetteprocdureestutilisecommeprcdemment,jusqucequelexplorationnepermuteplusaucunlment.Une nouvellecampagnedexplorationsestalorsentrepriseavecunpasrduitdemoiti.Letableauestalorstrilorsquele pasdevientnul.Onobtientlalgorithmesuivant : Algorithme16:Triparpermutationsavecunpasvariable Algorithmetrier # Trier t[dbut .. fin] en ordre croissant. Entre t:TABLEAU[TCOMPARABLE] dbut,fin,p:ENTIER prcondition ... variable tri:BOOLEN pas:ENTIER initialisation pas<p jusqu pas<1 rpter rpter explorer(t,dbut,fin,pas,tri) jusqu tri fin rpter pas<quotient(pas,2) fin rpter postcondition ... fin trier Lexplorationdelalgorithme14estobtenueenutilisantcedernieralgorithmeavecunpasde1 : ... # tri par permutations simple. trier(t,dbut,fin,1) ... Mais on peut dmontrer que les performances sont meilleures, en ce sens que le nombre de comparaisons/permutationsestmoindre,lorsquelepasinitialestgallademitailledutableautrier :
- 12 ENI Editions - All rigths reserved - Jonifar lina

196

... # tri par permutations shell . variable taille,pas:ENTIER initialisation taille<findbut+1 pas<quotient(taille,2) trier(t,dbut,fin,pas) ... Cetalgorithmeestappelle trideshell .

ENI Editions - All rigths reserved - Jonifar lina

- 13 -

197

Fusionnerdeuxtableauxtris
Ondonnedeuxtableaux,t1ett2trisenordrecroissant.OnveutobteniruntableauRsultatdemmetype,trien ordrecroissant,quiregroupeleslmentsdet1ett2.Lafigurecidessousillustreleffetdelalgorithmetudier.

Remarquezquelesdeuxtableauxnontpasncessairementlemmenombredlments.Letableaursultatauraun nombredecomposantesgallasommedesnombresdescomposantesdet1ett2.Leslmentsidentiquesdansles deux tableaux sont rpts dans le tableau rsultat. Dailleurs, un mme tableau peut contenir des lments en plusieursexemplaires. Sionfusionnet1entrelescasesdbut1etfin1avect2entrelescasesdbut2etfin2,onobtientuntableaursultat qui aura fin1 - dbut1 + 1 + fin2 - dbut2 + 1 composantes. Afin de rsoudre ce problme facilement, la section suivantecommenceparintroduireunnouveautypededonnes :levecteur. Cestuntableausurlequelsontdfinies desoprationsapplicablesparticulires.Lasectionquilasuivrapermettraalorsdersoudreleproblmedelafusionde deuxvecteurs.

1.Dfinitiondunvecteur
Unvecteurestuntableausurlequelestdfiniuncurseur.Cestunnumroquirepreunecaseparticulirequiserala casecourantedutableau,cestdirelacasesurlaquelleoprentimplicitementcertainesdesoprationsapplicables unvecteur.Desoprationsparticulirespermettentdedplacerlecurseuroudaccderlacomposantedutableau situe souslecurseur ,cestdirerepreparlecurseur.Unvecteurestdfinipar : type VECTEUR structure t : TABLEAU[T] # Donnes associes au vecteur. dbut : ENTIER# Premire case du vecteur dans t. fin : ENTIER # Dernire case du vecteur dans t. curseur : ENTIER # Numro de la case courante. invariant dbutfin dbut1curseurfin+1 index_valide(t,dbut) index_valide(t,fin) fin VECTEUR Unvecteurestdclarcommeuntableau,enprcisantletypeTdesdonnesquilcontientetlesnumrosdescases extrmes,commececi : ... variable v:VECTEUR[ENTIER][15,30] ... Cette instruction dclare un vecteur vdentiers, dont les cases seront numrotes de 1530.Pourutiliserun vecteur, il doit videmment avoir t initialis. Cette initialisation consiste donner une valeur dbut et fin, remplirletableauv.tdedonnes,aumoinsentredbutetfinet,enfin,positionnerlecurseursurlapremirecase utile. Cette initialisation tant ralise, le prdicat estDfini appliqu au vecteur retourne VRAI et les oprations dfiniesdanslesparagraphesquisuiventdeviennentutilisables. Lesoprationsapplicablesunvecteurfonttoutesintervenirlecurseur.Ellesserpartissententroisclasses :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

198

lesoprationsquipermettentdeconnatrelapositionactuelleducurseur,saufladernire :
q

estAvant (respectivement estAprs) est un prdicat qui rend VRAI si et seulement si le curseur est placavantlapremirecase(respectivementaprsladernirecase) estPremier (respectivement estDernier) rend VRAI si et seulement si le curseur est plac sous la premirecase(respectivementsousladernirecase) positionestunefonctionquirendlenumrodelacaserepreparlecurseur

lesoprationsquipermettentdaccderladonnecontenuedanslacaserepreparlecurseur :
q

lirerendunecopiedeladonnedanslacasesouslecurseur crire est une procdure qui place une donne prcise en paramtre dans la case repre par le curseur.Ladonnecontenuedanscettecaseavantlcritureestperdue

lesoprationspermettantdedplacerlecurseur :
q

premier (respectivement dernier) place le curseur sous la premire case (respectivement sous la dernirecase) avant (respectivement aprs) place le curseur avant la premire case (respectivement aprs la dernirecase) suivant (respectivement prcdent) avance (respectivement recule) la position du curseur dune case avancer (respectivement reculer) permet davancer (respectivement de reculer) le curseur dun nombredepositionsprcisenparamtre allerAplacelecurseursousunecasedontlenumroestprcisenparamtre

Larequtecardinalrendlenombredecomposantesduvecteur.

Ilsagit,prsent,dedfinircesoprations.Commenonsparlesutiliserpourrsoudreunproblmesimpleafinde montrercommentlesmettreen uvre. Exercicersolu2:Calculdelamoyennearithmtiquedescomposantesdunvecteur Ondonneunvecteurvdenombresrels. 1.Faireunalgorithmequicalculelamoyennearithmtiquedescomposantesdev. Solution Lalgorithmemoyenne prend en entre un vecteur dfini de nombres rels et retourne la moyenne arithmtique de ses composantes. Les spcifications sont donnes par lalgorithme cidessous qui traduit directement la dfinition dunemoyenne. Algorithme17:Dfinitiondelamoyennearithmtiquedunvecteurderels Algorithmemoyenne # La moyenne arithmtique des composantes de v. Entre v:VECTEUR[REL] Rsultat : REL prcondition estDfini(v) variable

- 2-

ENI Editions - All rigths reserved - Jonifar lina

199

n:ENTIER initialisation n<cardinal(v) ralisation si n=0 alors Rsultat<INFINI sinon Rsultat<somme(v)/n fin si postcondition cardinal(v)=0=>Rsultat=INFINI cardinal(v)>0=>Rsultat=somme(v)/n fin moyenne Lalgorithmecalculedabordlenombredlmentsduvecteuretnentreprendlecalculdelasommedescomposantes que si ce nombre nest pas nul. La somme des composantes est dtermine par une fonction somme qui reste dfinir. Remarquez que, en toute rigueur, il nest pas ncessaire de se proccuper de la valeur de n. En effet, linvariant dun vecteur dfini prcise que dbut fin. Par consquent, le vecteur nest dfini que sil possde au moinsunecomposanteutileetdonccardinal(v) > 0.Danslecascontraire,laprconditionestfausse.Cetteremarque permetdoncdesimplifierlaspcificationquiprcde.Cettesimplificationestlaisseenexercice. Lalgorithmesuivantdfinituneversionincorrectedelafonctionsomme. Algorithme18:Versionincorrectedelafonctionsomme Algorithmesomme # La somme des composantes de v. Entre v:VECTEUR[REL] Rsultat:REL prcondition estDefini(v) initialisation Rsultat<0 avant(v)# Place le curseur avant la premire composante. Jusqu estAprs(v) rpter Rsultat<Rsultat+lire(v) suivant(v) fin rpter postcondition Rsultat=

fin somme Cette solution nestpascorrecte.Lalgorithme parcours le vecteur pour dterminer la valeur demande. Leparcours modifie la valeur du curseur et, par consquent, le vecteur luimme puisque la valeur du curseur est un champ de la structurequiledfinit.Pourobtenirunefonctiondanscesconditions,nousdevonsraliserunecopieduvecteursur laquelle elle opre, afin de ne pas introduire deffet de bord. On obtient alors lalgorithme suivant qui utilise une fonctioncopiepourraliserunecopiedetravailduvecteuretainsilelaisserinvariable. Algorithme19:Versiondfinitivedelafonctionsomme Algorithmesomme # La somme des composantes de v. Entre v:VECTEUR[REL]
ENI Editions - All rigths reserved - Jonifar lina - 3-

200

Rsultat : REL prcondition estDefini(v) variable cv:VECTEUR[REL]# Copie de v. initialisation cv<copie(v,v.dbut,v.fin) Rsultat<0 avant(cv)# Place le curseur avant la premire composante. Jusqu estAprs(cv) rpter Rsultat<Rsultat+lire(cv) suivant(cv) fin rpter postcondition

Rsultat=

fin somme Ilrestedfinirloprationcardinalquirendlenombredecomposantesdunvecteur.Sadfinitionestsimpleetelle estlaisseenexercice. Lexercice suivant propose ltude des oprations applicables un vecteur et leur mise en uvre pour dfinir une fonction. Exercicersolu2:Dfinitiondesoprationsapplicablesunvecteur Cetexercicedemandedeprparerladfinitiondechacunedecesoprations. 1.Donnerlesspcificationsdechacunedesoprationsapplicablesunvecteur. 2.Utilisercesoprationspourrefairelalgorithmequidterminelavaleurdelacomposanteminimumdunvecteur. 3.Donneralorslaralisationdechaqueopration. Solution Dfinitiondesprdicatsetdelafonctionposition. Le prdicat estAvant rend VRAI si le curseur est plac avant la premire case du vecteur. Cest le cas lorsque curseur dbut 1.Ladfinitionduprdicatestdonc : Algorithme20:SpcificationduprdicatestAvant AlgorithmeestAvant # Le curseur est-il avant la premire case du vecteur ? Entre v:VECTEUR[T] Rsultat : BOOLEN prcondition estDfini(v) postcondition Rsultat=(v.curseur<dbut) fin estAvant OnsupposequeceprdicatrendVRAIdsquelevecteurestdfinietavanttoutepremireutilisation. estAprs est le prdicat dual du prcdent et il se dfinit de la mme faon. Ses spcifications sont laisses en exercice. De mme, estPremier rend VRAI si et seulement si le curseur est sous la premire case, cestdire si et seulementsiv.curseur=v.dbut. LeprdicatestDernierscritdelammefaon.Sesspcificationssontlaissesenexercice. Lafonctionpositionnefaitquerenvoyerlenumrodelacaserepreparlecurseur.Parconsquent,ellenefaitque renvoyerlavaleurducurseur :

- 4-

ENI Editions - All rigths reserved - Jonifar lina

201

Algorithme21:Spcificationdelafonctionposition Algorithmeposition # Valeur actuelle du curseur i.e numro de la case quil repre. Entre v:VECTEUR[T] Rsultat : ENTIER prcondition estDfini(v) postcondition Rsultat=v.curseur fin position Procduresdedplacementducurseur Laprocdurepremierpositionnelecurseursouslapremirecasedutableau : Algorithme22:Spcificationdelaprocdurepremier Algorithmepremier # Place le curseur sous la premire case de v. Entre v:VECTEUR[T] prcondition estDfini(v) postcondition estPremier(v) v.t=ancien(v).t v.dbut=ancien(v.dbut) v.fin=ancien(v.fin) fin premier Laprocdurederniersedfinitdelammefaon.Elleestlaisseenexercice. Laprocdureavantplacelecurseuravantlapremirecaseutile.Onadonc : Algorithme23:Spcificationdelaprocdureavant Algorithmeavant # Place le curseur avant la premire case de v. Entre v:VECTEUR[T] prcondition estDfini(v) postcondition estAvant(v) v.t=ancien(v).t v.dbut=ancien(v.dbut) v.fin=ancien(v.fin) fin avant Laprocdure aprsestdfiniedelammefaon.Lesprocduressuivantet prcdentnesontpasplusdifficiles spcifier : Algorithme24:Spcificationdelaprocduresuivant Algorithmesuivant # Avance le curseur dune case. Entre v:VECTEUR[T] prcondition estDfini(v) postcondition

ENI Editions - All rigths reserved - Jonifar lina

- 5-

202

v.t=ancien(v).t v.dbut=ancien(v).dbut v.fin=ancien(v).fin estAprs(ancien(v))=>v=ancien(v) non estAprs(ancien(v))=>position(v)=position(ancien(v))+1 fin premier Onnepeutdoncavancerlecurseurdunecaselorsquiladjdpassladernire.Demme,onnepeutlereculer quandilestdjavantlapremire. La procdureavancer permet davancer le curseur dun nombre de cases prcis. Lalgorithme suivant en donne la spcification. Algorithme25:Spcificationdeavancer Algorithmeavancer # Avance le curseur de p positions. Entre v:VECTEUR[T] p:ENTIER prcondition estDfini(v) position(v)+p<v.fin+1 postcondition position(v)=position(ancien(v))+p v.t=ancien(v).t v.dbut=ancien(v).dbut v.fin=ancien(v).fin fin avancer On spcifie de mme la procdure duale reculer. Remarquez aussi que, quelques adaptations prs de la prcondition,reculerdepcestavancerdep.Cetteremarquepermetdefactoriserunepartiedesinstructionsdeces deuxprocdures. Enfin, la procdure aller permet de prciser dune faon absolue le numro de la case placer face au curseur. Lalgorithmesuivantendonnelaspcification. Algorithme26:Spcificationdelaprocdurealler Algorithmealler # Place le curseur sous la case de numro p. Entre v:VECTEUR[T] p:ENTIER prcondition estDfini(v) v.dbutpv.fin postcondition position(v)=p v.t=ancien(v).t v.dbut=ancien(v).dbut v.fin=ancien(v).fin fin aller Accsauxcomposantesduvecteur On accde aux composantes en lecture avec lire ou en criture avec crire. La fonction lire rend une copie de la composanterepreparlecurseur.Saspcificationestdonneparlalgorithmesuivant. Algorithme27:Spcificationdelire Algorithmelire # La composante repre par le curseur. Entre v:VECTEUR[T]

- 6-

ENI Editions - All rigths reserved - Jonifar lina

203

Rsultat : T prcondition estDfini(v) non estAvant(v) non estAprs(v) postcondition Rsultat=v.t[position(v)] fin lire Laprocdurecrireplace,danslacaserepreparlecurseur,llmentprcisenparamtre.Lecontenudelacase avantcetteoprationestperdu.Laspcificationdecetteprocdureestlasuivante : Algorithme28:Spcificationdelaprocdurecrire Algorithmecrire # Placer e dans la case repre par le curseur. Entre v:VECTEUR[T] e:T prcondition estDfini(v) non estAvant(v) non estAprs(v) postcondition lire(v)=e (Lesautrescasesnesontpasmodifies) fin crire Onpeutalorspasserlasolutiondeladeuximequestion. Onveutdterminerlavaleurdelacomposanteminimumdunvecteur.Soitmincettefonction.Saspcificationestla suivante : Algorithme29:Spcificationdelafonctionmin Algorithmemin # La composante minimum de vecteur.t[dbut .. fin]. Entre vecteur:VECTEUR[TCOMPARABLE] Rsultat : T prcondition estDfini(vecteur) postcondition vecteur.dbut=vecteur.fin=>Rsultat= lire(allerinv(vecteur,vecteur.dbut)) vecteur.dbut<vecteur.fin=>Rsultat= inf ( lire(allerinv(vecteur,vecteur.dbut)), min(copie(vecteur,vecteur.dbut+1,vecteur.fin)) ) fin min La fonction allerinv rend une copie du vecteur, mais avec un curseur positionn sous la case dont on donne le numroendeuximeparamtre.LafonctioninfadjtdfinieauchapitreItration.Lafonctioncopieraliseune copie du vecteur entre les numros des cases indiqus. La spcification de min prcise que le rsultat est la composanteluedanslacasedenumrodbutsielleestlaseuleduvecteur.Siellenestpaslaseule,lersultatest la plus petite des composantes entre la premire et le minduresteduvecteur.Cestdonclammedfinition,aux notationsprs,quecelledelalgorithmedemmenaturetudiauchapitreItration. La ralisation utilise les oprations dfinies sur un vecteur. Comme dbut fin, le vecteur possde au moins une composante.Ilsuffitdoncdeleparcourirpartirdecettecomposante.Levariantdecontrlesedduitsimplementde laversiontudieauchapitreItration.Pourlinvariant,ilenestdemme,maisonnepeutpasutiliserlesprocdures dj dfinies cause des effets de bord : elles modifient le vecteur. Do lutilisation de prcdentInv, dans lalgorithmecidessous,quirendunecopieduvecteurdanslaquellelecurseurestplacsouslacasequiprcdecelle sous laquelle se trouve le curseur du vecteur dorigine. On obtient alors la solution suivante, dans laquelle on ne rptepaslapretlapostcondition.
ENI Editions - All rigths reserved - Jonifar lina - 7-

204

Algorithme30:Ralisationdelafonctionmin Algorithmemin # La composante minimum de vecteur.t[dbut .. fin]. ... variable e:T v:VECTEUR[TCOMPARABLE][vecteur.dbut,vecteur.fin] initialisation v<copie(vecteur,vecteur.dbut,vecteur.fin) aller(v,dbut) Rsultat<lire(v) suivant(v) jusqu position(v)>v.fin invariant position(v)>v.dbut=>Rsultat= min( copie ( vecteur, vecteur.dbut+1, prcdentInv(vecteur) ) ) variant de contrle v.finposition(v)+1 rpter e<lire(v) si Rsultat>e alors Rsultat<e fin si suivant(v) fin rpter ... fin min Lexercicesuivantcompltelesexercicesrsolusprcdemment. Exercice4:Oprationssurlesvecteursetlesvecteursinvariables 1.crirelafonctioncopiequiraliselacopiedunvecteurentrelescomposantesdenumrosprcissenparamtres. 2.crirelesoprationsprcdentInvetallerinvutilisesdanslesspcificationsprcdentes. 3.Complterparunjeuexhaustifdesversionsdesfonctions,maissurlesvecteursinvariables. 4.crirelesalgorithmesrangDuMin,maxetrangDuMaxpourlesvecteurs. La procdure crire dans un vecteur na pas t compltement spcifie. Il reste donner un sens algorithmique ou mathmatiquelexpression lesautrescomposantesnesontpasmodifies . 5.crirelesspcificationscompltesdelaprocdurecriredansunvecteur.

2.Fusiondedeuxvecteurstris
La fusion des vecteurs procde la lecture des composantes. Celles dun vecteur donn sont lues et enregistres danslevecteurrsultattantquellesrestentinfrieureslacomposantecourantedelautrevecteur.Ladifficultvient decequelesdeuxvecteursnontpasncessairementlammetaille.Unvecteurtantpuis,ilfautrecopierlautre. Soient vt1 et vt2, les deux vecteurs fusionner, et vr le vecteur rsultat. Une version difficile crire utilise deux itrationsdanslesalternantsdunealternativesurlacomparaisondescomposantescourantesdevt1etvt2.Cette versionestlaisseenexercice.Laversionquiestproposeiciestpluslisibleetplussimplecomprendre. Lalecturenepeutsefairequedansunvecteurolecurseurestplacentrelapremireetladernirecomposante.
- 8 ENI Editions - All rigths reserved - Jonifar lina

205

Lorsquelecurseurestavantlapremireouaprsladernire,lalecturenestpasdfinie.SoitlireMax,lafonctionde lecturedunvecteurquirendINFINIlorsdunetentativedelectureendehorsdeslimitesduvecteur.Laspcification decettefonctionestdonneparlalgorithmesuivant. Algorithme31:SpcificationdelireMax AlgorithmelireMax # La composante sous le curseur ou INFINI pour une lecture hors # limites. Entre v:VECTEUR[T] Rsultat : T prcondition estDfini(v) non estAvant(v) postcondition estAprs(v)=>Rsultat=INFINI non estAprs(v)=>Rsultat=lire(v) fin lireMax Ainsi,onpeuttoujoursavanceretliredansunvecteur.Pourfusionnerlesdeuxvecteursv1etv2,onlesparcourten appelantlireMaxsurceluidontlesvaleursdescomposantesluesrestentinfrieuresauxvaleursdescomposantesde lautrevecteur. Laspcificationdelalgorithmedefusionesttudiedanslasectionsuivante.

a.Spcificationdelalgorithmedefusion
Lalgorithmereoit,enentre,lesdeuxvecteursfusionneretlesnumrosdescomposantesextrmesdechacun deuxsurlesquellesportelafusion.Ilcalculelevecteurrsultatvrquilretourneenparamtredesortie.Onsuppose que le vecteur rsultat est dfini par lalgorithme qui appelle les services de lalgorithme de fusion. Nous pouvons doncprciserlasignaturedecetteprocdure. Algorithme32:Signaturedefusionner Algorithmefusionner # Fusionner v1 et v2 dans vr en ordre croissant. Entre v1,v2,vr:VECTEUR[TCOMPARABLE] ... Lesvecteursfusionnersontaussidesparamtresensortiecaronnegarantitpasquelescurseursneserontpas modifis. La prcondition nonce dabord les contraintes habituelles sur les vecteurs. De plus, les deux vecteurs en entre sont tris en ordre croissant et le nombre de composantes dclares pour le rsultat est au moins la somme des nombresdecomposantesdechacundesvecteursfusionner.Laprconditionscritalors : ... prcondition estDfini(v1)estDfini(v2)estDefini(vr) estTriAsc(v1)estTriAsc(v2) cardinal(vr)=cardinal(v1)+cardinal(v2) ... La postcondition exprime quevr est tri en ordre croissant. Les tableaux v1.t et v2.t ne sont pas modifis. Par contre,ondoitdireexplicitementquetousleslmentsdesvecteursenentreseretrouvent,sansexception,dans levecteurrsultat.Autrementdit,indpendammentdelordredeslmentsdansvr,letableauvr.testlarunion, ausensdelaruniondesmultiensembles,dev1.tetv2.t.Lapostconditionestalorslasuivante : ... postcondition estTriAsc(vr) estgal(vr,union(v1,v2)) v1.t=ancien(v1).t v1.dbut=ancien(v1.dbut)v1.fin=ancien(v1.fin)
ENI Editions - All rigths reserved - Jonifar lina - 9-

206

v2.t=ancien(v2).t v2.dbut=ancien(v2.dbut)v2.fin=ancien(v2.fin) ... Nouspouvonspasserltudedelafusion.

b.Analysedelafusion
Onlitdeuxvaleurs,V1depuisv1etV2depuisv2lapositionducurseurjusqucequelesdeuxvecteurssoient puiss.Onpeutdoncposerenhypothse : Faireunehypothsesurltatactuel Hypothse(H):onaluV1dev1etV2dev2. Voirsicestfini CestfinilorsqueleslecturesontobtenuINFINIpuisqualors,lesvecteurssontpuiss : ... Cest fini lorsque V1 = V2 = INFINI ... Sinon,cestqueluneaumoinsdecesvaleursestunecomposantevalideenregistrerdanslevecteurrsultatvr. Serapprocherdeltatfinal ... si V1V2 alors enregistrerV1dansvr relirev1 sinon enregistrerV2dansvr relirev2 fin si ... Onpeutalorspasserlapositionsuivantedevretrecommencer. Initialiserlecalcul Il sagit de placer le systme dans un tat o une valeur a dj t lue depuis chaque vecteur. Il faut donc positionnerlescurseursetraliserunelecture : ... initialisation # Placer les curseurs sous les premires composantes. premier(v1)premier(v2)premier(vr) # Effectuer une premire lecture des vecteurs fusionner. V1<lireMax(v1)V2<lireMax(v2) ... Onpeutalorsraliserlestraitementsjusqucequelesdeuxvecteurssoientpuiss. Rdigerlalgorithmedfinitif On obtient lalgorithme cidessous dans lequel on ne rpte ni la prcondition et la postcondition, ni les initialisations. Algorithme33:FusiondedeuxvecteurstrisRalisation

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

207

... variable V1,V2:T initialisation ... jusqu V1=INFINIetV2=INFINI rpter si V1V2 alors crire(vr,V1) suivant(v1) V1<lireMax(v1) sinon crire(vr,V2) suivant(v2) V2<lireMax(v2) fin si suivant(vr) fin rpter ... Lexercicesuivantproposeuneautreversiondecetalgorithme. Exercice5:FusiondedeuxvecteurstrisVersion2.0 Laversionprcdentenestpasentirementspcifie.Enparticulier,ilymanquelinvariantetlevariantdecontrle. 1.Spcifiercompltementlalgorithme. 2.tudieruneversionquinutilisepaslafonctionlireMax.

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

208

Exercices
1.Triparinsertiondichotomique
Les tris prsents dans la section Quelques algorithmes simples nont pas utilis le secours dun tableau supplmentaire pour construire le rsultat. Ils modifient le tableau trier pour rordonner ses composantes. Nous tudionsiciunesolutiondiffrente,quiconstruitunnouveautableausansmodifierletableautrier. Exercice6:Triparinsertiondichotomique Soit t un tableau de T trier. On dfinit dabord un nouveau tableau r de mme cardinal. Chaque composante de t est insresaplacedansr,enrecherchantlapositiondinsertionparlalgorithmedichotomietudiauchapitreItration. 1.criredabordlesspcificationsdelalgorithme. Soignertoutparticulirementlapretlapostcondition.Ellesnesontpasfacilesobtenir,maisellesfournissentunguide utilepourlaconstructiondelalgorithme. 2.crirelalgorithmedetriduntableauparinsertiondichotomique.

2.Untritopologique
Onconsidrentchest1,t2tnsoumisesdescontraintesdeprcdence.Autrementdit,certainestchesdoivent tre termines avant de pouvoir commencer dautres tches. Ainsi, par exemple, on doit dabord prparer les fondations dune maison avant de monter les murs et les cloisons. Lexercice suivant propose de calculer un ordonnancementdetchessoumisesdescontraintesdeprcdence. Exercice7:Tritopologique Unecontrainteestexprimelaidedun couple (i,j) dentierscomprisentre1etn,quiindiquequelatchetiprcdela tchetj.Autrementdit,latchetidoittretermineavantdecommencerlatchetj.Larelationbinaire ... prcde ... ainsidfiniesurlensembledesntchesestunerelationdordrepartiel :certainestchesnesontpascomparables. 1.Faireunalgorithmequicalculeunordonnancementdesntchessatisfaisantauxcontraintes. Il est clair que les contraintes peuvent ne pas tre toutes satisfaites. Dans ce cas, il nexiste pas dordonnancementdes tches.Lalgorithmedevratraitercorrectementcecas.

3.Complterlesspcifications
La section Quelques algorithmes simples a utilis un prdicat estExplor qui na pas t compltement spcifi. En particulier,nousavonscrit : chaquecomposantedet[dbut..fin]estplaceaprslaplusgrandesuitedecomposantes dontelleestlemax .Lexercicesuivantproposedecompltercettespcification.Cestunproblmedifficile. Exercice8:SpcificationdeestExplor crirelesspcificationsduprdicatestExplor. Lesspcificationssontexprimesenutilisantladfinitiondunsegmentdetableau.Cestunesuitedecomposantes quicommenceparlemaximumdelasuite. Dfinition OnappellesegmentdansuntableautdecomposantesdetypeT qui drive deCOMPARABLE,uneplusgrandesuitede composantesconscutivesdontlavaleurmaximumestlapremiredelasuite. Lafigurecidessousreprsenteuntableauetsessegments.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

209

Lapartie t[dbut..fin]contientdeuxsegments.Lepremieren t[5 .. 9]apourcomposantemaximum18dansla caset[5].Lesecondent[10 .. 11]apourcomposantemaximum21ent[10]. Letableaut[dbut .. fin]contientksegmentsS1, S2, , Sk.ChaquesegmentSiaunepremirecomposantede numrodietunedernirecomposantedenumrofiquivrifient : (1 i k ) (Si = t[di .. fi]) max 1 i k (Si) = t[di] max 1 i k (Si) t[fi + 1] Explorerconsiste,pourchaquesegmentSi, :
q

sauvegarderlemaxdusegment:mi<t[di] dcalerleslmentsdet[di+1..fi]dunecaseverslagauche placerleplusgrandlmentdusegment enhaut :t[fi]<mi.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

210

Notesbibliographiques
Ltude des algorithmes de tri est une tape oblige dans lapprentissage de la programmation. Tous les livres qui traitentdelalgorithmiqueetdesstructuresdedonnesabordentlesujet,dailleursavecplusoumoinsdebonheur.Le plus souvent, les algorithmes prsents dans les livres srieux sont accompagns dune tude de leur complexit algorithmique,cequiestunevaluationdeleursperformances.Larfrencesurcesujetreste[KNUTH73b].

ENI Editions - All rigths reserved - Jonifar lina

- 1-

211

Rsum
Ce chapitre a prsent la construction de quelques algorithmes dans le domaine du tri de donnes organises en tableaux. Nous avons dabord tudi la spcification gnrale dun algorithme de tri qui nutilise pas de tableau supplmentaire pour trier les donnes. Nous avons ensuite prsent la dfinition dune structure sur laquelle est dfinie un curseur, ce qui permet ditrer simplement sur les donnes. Cette structure a t utilise pour crire un algorithme de fusion en ordre croissant de deux tableaux tris. Des exercices ont permis daller plus loin dans la construction dalgorithmes, en abordant lordonnancement de tches soumises des contraintes de prcdence. Lambitiondecechapitrentaitpasltudedutridesdonnescommeproblmegnral.Toutetudesrieuse,mme restreinte quelques solutions types doit tre accompagne dune valuation de la complexit des algorithmes proposs,cequinestpaslecasici.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

212

Bibliographie
[KNUTH73b]DonaldKNUTH :TheArtofComputerProgrammingVol3 :SortingandSearching ADDISONWESLEY,1973.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

213

Introduction
Leproblmedeldition dun entier a dj t abord au chapitre Rcursivit qui a trait de la rcursivit. Ce court chapitre prsente des exercices qui utilisent les techniques dditiondun entier, pour rsoudre quelques problmes simples.Lasectionditiondunentierdansunebasequelconquecommenceparrsoudrecompltementunexercice pos au chapitre Itration. La section Conversion dun entier en chiffres romains tudie la conversion dun nombre entierenchiffresromains.LasectionVrificationdesidentifiantsdentreprisesprsentelesalgorithmesquipermettent devrifierlavaliditdunidentifiantdentrepriseetlasectionVrificationdesidentifiantsdelivresdunidentifiantde livre.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

214

ditiondunentierdansunebasequelconque
Ce problme a dj t pos au chapitre Rcursivit dans lequel la section Vrification des identifiants dentreprises prsentait le problme et un exercice en demandait une premire solution. Dans cette section, lexercice est rsolu compltement.LasectionNombredechiffresdunentiercalculelenombredechiffresdunentierexprimdansunebase Bquelconque.LasectionRsolutionduproblmedditionrsoutleproblmedditionproprementdit.

1.Nombredechiffresdunentier
Ondonneunentiern.CalculerlenombredechiffresdelareprsentationdenenbaseB = dix.Remarquerdabordque nouspouvonsnousrestreindreauxentierspositifs.Lenombredechiffresdunentierngatifestlenombredechiffres desavaleurabsolue. Obtenirleschiffresdunentierestunproblmequiserarsolulasectionsuivante.Cependant,nouspouvonsdj voirquilspeuventtresuccessivementobtenusparunesuitededivisionsparB = dix.Lenombrenestdivispuis, successivement,touslesquotientsobtenus,jusquunquotientnul.Lenombredechiffresestlenombrededivisions. Voyonscelasurunexemple. Exemple Calculerlenombredechiffresde325exprimenbasedix. Ilsuffitdediviser325par10 :
q

lapremiredivisiondonne32etilreste5 lasecondedivisiondonne3etilreste2 latroisimedivisiondonne0etilreste3.

Troisdivisionsontpermisdatteindreunquotientnul.Lenombredechiffrescherchest3. Remarqueraussiquilestpossibledarrterlitrationdsquelequotientdunedivisiondevientstrictementinfrieur audiviseur. crirecetalgorithmeestfacileetnouspouvonspasserdirectementlasolutiondfinitive. Algorithme1:NombredechiffresdunentierenbasedixVersion1

Algorithme nbChiffres1 # Nombre de chiffres de la reprsentation de n en base dix. Entre n : ENTIER Rsultat : ENTIER variable dividende : ENTIER <- abs(n) diviseur : ENTIER <- 10 initialisation Rsultat <- 1 # Au moins un chiffre par entier. Jusqu dividende < diviseur invariant n = 0 => Rsultat = 1 n0etdividende>0=> Rsultat= log(abs(n) - log(dividende) + 1 variant de contrle dividende rpter dividende <- quotient(dividende, diviseur) Rsultat <- Rsultat + 1 fin rpter postcondition n = 0 => Rsultat = 1
ENI Editions - All rigths reserved - Jonifar lina - 1-

215

n0=>Rsultat1log(abs(n))<Rsultat fin nbChiffres1 Lanotation x estmisepour leplusgrandentierinfrieurougal .Lorsquexestpositif,cestsapartieentire. Lafonctionlogarithmeutiliserendlelogarithmeenbasedixdesonargument.Ladistinctiondesdeuxcas,suivant que n est nul ou non, est ncessaire puisque le logarithme nest dfini que pour les valeurs positives de son paramtre. Exercice1:Nombredechiffresdunentiergnralisation Onpeutfairelconomiedesfonctionsmathmatiquesutilisespourspcifierendveloppantdaborduneversionrcursive decetalgorithme. 1.crireuneversionrcursivedelalgorithmenbChiffres1prcdent.Utiliseralorscettenouvelleversionpourspcifierla premireversion. 2.criredemmelalgorithmequicalculelenombredechiffresdunentierexprimdansunebaseBquelconque. LenombreBnepeutpastrequelconqueetilfaudradoncprciserleproblme.

2.Rsolutionduproblmeddition
La section prcdente a montr la voie pour diter un entier. Il sagit dobtenir ses chiffres et de les convertir en caractres.Obtenirleschiffresdunentierexprimdansunebasedonneconsisteeffectuerunesuitededivisions par la base. Les chiffres cherchs sont les restes des divisions, mais convertis en caractres. Litration termine lorsque le quotient devient strictement infrieur au diviseur. La seule difficult de principe qui subsiste est la conversion en caractres.Commeonnedisposequede26lettreset10chiffres,labasedenumrationdoitrester infrieure36. Cetteaffirmationnestpastoutfaitexacte.OnpeutreprsenterunchiffredunebaseB > 36parlexpressiondesa valeurenbasedix.Pensez,parexemple,lareprsentationdunentiersur32bitsenbasedeuxcentcinquantesix. Cestcettereprsentationquiestutilise,parexemple,pournoterlesadressesrseauenIPv4.Ainsi,uneadresse comme 172.10.23.5 par exemple reprsente, en base deux cent cinquantesix, le nombre 172x2563 + 10x2562 + 23x256+5=2886342405enbasedix. Pourassurerlaconversion,onutiliseuntableauquidonneleschiffresobtenuspardivisionet,pourchacundeux,le caractrequilereprsente.Voici,parexemple,letableaudeconversionenbaseseize. Entier Chiffre 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12 13 14 15 A B C D E F

Lapremirelignedonnelesnombresobtenuscommerestesdesdivisionsetlasecondedonnelescaractresquiles reprsententenbaseseize.Commentassurercetteconversion ? Nousavonsvu,auchapitreStructureslmentaires,lafonctioncodequiprendenparamtreuncaractreetquirend le code numrique qui le reprsente dans le jeu de caractres utiliss. La fonction caractre est la fonction rciproque. Elle prend en entre un code numrique et elle rend le caractre associ ce code dans le jeu de caractresutiliss.Pourobtenirlecaractredutableaucidessusquireprsenteunentiern > 9enbaseseize,ilsuffit doncdecalculer : c a r a c t r e (code(A) + n - 10) Lorsquelentierestinfrieur10,Aestremplacpar0(lecaractrezro)etn - 10parndanscetteformule.Soit chiffre la fonction dfinir qui ralise ces oprations. crire une premire version de lalgorithme qui calcule la reprsentationdunentierenbasedixestdoncsimple.Cestfaitparlalgorithmesuivant : Algorithme2:Conversiondunentierenbasedix Algorithmeconversion2 # La reprsentation en chiffres dun entier en base dix. Entre n:ENTIER# Lentier convertir. Rsultat : CHANE prcondition n0 constante

- 2-

ENI Editions - All rigths reserved - Jonifar lina

216

SPARATEUR:CHANE<:# Caractre sparateur des chiffres. BASE:ENTIER<10# La base de conversion. variable dividende:ENTIER<n r,q:ENTIER # Reste et quotient dans une division. initialisation Rsultat<CHANE_VIDE jusqu dividende<BASE invariant ... variant de contrle ... rpter q<quotient(dividende,BASE) r<reste(dividende,BASE) Rsultat<SPARATEUR chane( chiffre( r ) ) Rsultat dividende <- q fin rpter Rsultat <- chane( chiffre( d i v i d e n d e ) ) Rsultat postcondition ... fin conversion2 Lesparateurestutilispoursparerleschiffresdursultatetmettreainsienvidencelaconversionralise.On obtient de cette faon 3:2:5 pour la conversion de 325 et 0 pour la conversion de 0. Lalgorithme propos est volontairement incomplet. En particulier, le rsultat est donn sans en construire une analyse raisonne et certains dtailsderalisationnesontpastriviaux.Lexercicesuivantproposedecompltercetalgorithme. Exercice2:Conversiondunentierenbasedix 1.crireuneversionrcursivequipermettradeterminerlaspcificationdelalgorithme. 2.Dvelopperlanalysecompltedelalgorithme.Enparticulier,complteraveclinvariantetlevariantdecontrle. Il faut vrifier soigneusement chacune des tapes de la solution. Il nest pas rare de voir des solutions fausses pour cet exercice,notammentencequiconcernelescaslimites. 3.Modifiercetalgorithmepourrelcherlacontrainteimposeparlaprcondition. 4. crire un algorithme qui prend en entre le nombre n convertir et la base B de conversion. Prciser le problme et tudierlesstructuresdedonnesncessaires. 5.tendrelessolutionsaucasdesnombresentiersngatifs.

3.Rsolutionduproblmerciproque
Leproblmerciproquesnoncesimplement.Ondonneunechanedecaractresquireprsenteunnombreentier, disonspositifdansunpremiertemps,dansunebaseB.tudierunalgorithmequicalculelavaleurdecenombre. Exemple Convertirlachanedecaractres2753exprimeenbasehuit. Onsaitconvertirchacundescaractrespourobtenirlentierquilreprsenteenbasedix.Ainsi,oncrira : c <- n o m b r e (7) pour convertir le caractre 7 et obtenir le nombre c = 7, ici en base dix. Nous savons donc calculer la suite des nombresassocischacundescaractresdelachane.Pourobtenirlenombrequellereprsente,ilsuffitalorsde calculer : 2753 8 =(2x83 )+(7x82 )+(5x81 )+(3x80 )=151510 Plusgnralement,soitsunechanedecaractresquireprsenteunnombreentierpositifnexprimenbaseB > 1. Avecs = akak-1...a1a0olesaisontlescaractres,lenombrenestobtenupar :

ENI Editions - All rigths reserved - Jonifar lina

- 3-

217

n = n o m b r e (a k )xB k + n o m b r e (a k - 1 )xB k - 1 + ... + n o m b r e (a 0 )xB 0 Aulieudecalculerdesexponentiations(lvationunepuissance),onpeututiliserunefactorisationquipermetdene fairequedesmultiplicationsetdesadditions.Ainsi,pourlenombredelexempleprcdent,oncalculera : 2753 8 =8x(8x(8x2+7)+5)+3=151510 Ilestplussimpleetefficacedecommencerparlafindelachane : 2753 8 =3+8x(5+8x(7+8x2)))=151510 Cettefactorisationestappelela factorisationdeHRNER . Soitdoncdernierlafonctionquirendlederniercaractredelachanequellereoitenparamtre.Saspcificationest donnecidessous. Algorithme3:Spcificationdelafonctiondernier Algorithm dernier e # Le dernier caractre de ch ou CAR_VIDE. Entre c h : CHANE Rsultat : CARACTRE prcondition estDfinie( c h ) postcondition longueur(ch) = 0 = > Rsultat = CAR_VIDE longueur(ch) > 0 = > Rsultat = item( c h , index_max( c h ) ) fin dernier LafonctionitematdfinieauchapitreStructureslmentaires.Elleretournelecaractredesonpremierparamtre quioccupelerangayantpourvaleurcelledesonsecondparamtre. Lorsquelederniercaractreatconverti,ilresteconvertirledbutdelachane,cestdiretoutelachane,prive de son dernier caractre. Soit dbut la fonction qui rend une copie de la chane quelle reoit en paramtre, mais privedesonderniercaractre.Saspcificationestdonneparlalgorithmecidessous. Algorithme4:Spcificationdelafonctiondbut Algorithm dbut e # Copie de ch prive de son dernier caractre. Entre c h : CHANE Rsultat : CHANE prcondition estDefinie( c h ) postcondition longueur(ch) = 0 = > Rsultat = CHANE_VIDE longueur(ch) > 0 = > Rsultat = inverse( fin( inverse( c h ) ) ) fin dbut Cettespcificationexprimequeledbutdelachaneestlinversedelafindesoninverse.Lafonctionfinatdfinie auchapitreRcursivit.Elleretourneunecopiedelachanequellereoitenparamtre,maisprivedesonpremier caractre. Nous pouvons alors crire la spcification de la fonction de conversion dune chane en un entier. Cest lalgorithme suivant : Algorithme5:Spcificationdelafonctiondeconversiondunechaneenentier Algorithm conversion3 e # Lentier dont ch reprsente la valeur en base B. Entre c h : CHANE # La chane convertir. B : ENTIER # La base de numration. Rsultat : ENTIER

- 4-

ENI Editions - All rigths reserved - Jonifar lina

218

prcondition estDfinie( c h ) longueur(ch) > 0 1 < B < 37 Les caractres de ch exprim ent un nom bre en base B. postcondition longueur(ch) = 1 = > Rsultat = nombre( premier( c h ) ) longueur(ch) > 1 = > Rsultat = nombre( premier(ch)) + B x conversion3( dbut( c h ) ) fin conversion3 LappellafonctionpremierdanslapremireclausedelapostconditionestncessairepuisquechestuneCHANE alorsquenombreprendunCARACTREenparamtre. Exercice3:tudedelafonctionconversion3 1.crirelesralisationsitrativesdesfonctionsdernieretdbut. LaprconditionexprimeenFranaisquelescaractresdechdoiventtredescaractres valides pourexprimerunentier danslabaseB. 2.crirelaspcificationetlaralisationdunprdicatpermettantdcrirecetteclause. 3.tudieruneversionitrativedelafonctionconversion3. 4. Donner les spcifications et les ralisations compltes des prdicats ncessaires pour exprimer les invariants des itrations.

ENI Editions - All rigths reserved - Jonifar lina

- 5-

219

Conversiondunentierenchiffresromains
1.Conversionchiffresromainsnombreentier
Considrons dabord le problme rciproque : on donne un nombre entier exprim en chiffres romains. crire un algorithmequidonnelavaleurnumriquedecenombre.Commesouvent,leproblmedoittreprcis. La donne est un nombre entier exprim en chiffres romains. Cest donc une chane de caractres. Nous voulons obtenir sa valeur en base dix. Celleci peut tre exprime par une chane de caractres, la suite des chiffres qui reprsententcettevaleurenbasedix,ouparunnombreentier.Convenonsdabordquenoussouhaitonsobtenirle nombreentieretnonpassareprsentationenchiffres.Unexercicevenirproposedcriredautresversionsdecette conversionet,notamment,laconversionenchiffresdelabasedix. Soit romain la chane de caractres qui reprsente en chiffres romains le nombre convertir. La spcification de la fonctiondeconversionestlasuivante : Algorithme6:ConversionchiffresromainsnombreentierVersion1.0

Algorithme convertir1 # Lentier en base dix gal romain. Entre romain : CHANE Rsultat : ENTIER prcondition estDfinie(romain) romain est une reprsentation valide dun entier en chiffres romains postcondition Rsultat = (lentier gal romain) fin convertir1 Nousconnaissonslesvaleursassociesunchiffreromainisol.Ainsi,Ccorrespond100,Xcorrespond10,etc. Noussavonsaussique,quanduncaractreenprcdeunautredevaleursuprieure,ilestcomptngativement. Ainsi, IX vaut 9 alors que XI reprsente 11. De mme, XM reprsente 900 puisque M reprsente 1000. Par consquent,noussavonscalculerlavaleurdcimaledunentierreprsentparunchiffreromainrisol.Cettevaleur dcimaleestobtenueparlafonctionvaleur1dontlaspcificationest : Algorithme7:Spcificationdelafonctionvaleur1

Algorithme valeur1 # Valeur entire du chiffre romain r. Entre r : CARACTRE Rsultat : ENTIER prcondition # r est un chiffre romain valide. r { M , D , C , L , X , V , I } postcondition r = M => Rsultat = 1000 r = D => Rsultat = 500 r = C => Rsultat = 100 r = L => Rsultat = 50 r = X => Rsultat = 10 r = V => Rsultat = 5 r = I => Rsultat = 1 fin valeur1 Lorsquelavaleurduncaractreromainestobtenue,ilsuffitdajoutercettevaleuraursultatdjconstruitpuisde passeraucaractresuivant.Considrons,parexemple,lachanedecaractres : romain = MCDXII etltatdanslequelaucuncaractrenatconverti.Onadabord :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

220

R s u l t a t <- v a l e u r 1 (M) Maisalors,nousnepouvonspascrire : R s u l t a t <- R s u l t a t + v a l e u r 1 (C) # Instruction incorrecte. Eneffet,CprcdeDetdoncCDreprsente400puisquuncaractrequiprcdeuncaractrereprsentantune valeur suprieure doit tre retranch et non ajout au rsultat. Ainsi, ce qui est cumul dansRsultat nest pas la valeurentirereprsenteparlecaractre.Lavaleurrendueparlafonctionvaleur1estlavaleurabsoluedunombre quereprsentelecaractre.Largledepositiondeschiffresromainspermetensuitededterminerlavaleureffective signereprsenteparlecaractre.Lesignedunombredduitdecettevaleurestobtenuenobservantlecaractre quisuitceluiquiestanalys : ... v <- valeur1( c a r a c t r e a n a l y s ) si v < valeur1( c a r a c t r e s u i v a n t ) alors # Application de la rgle de position. v <- -v fin si Rsultat <- Rsultat + v ... cestade,uncaractrevientdtreconverti.Ilneresteplusquconvertirlerestedelachane : ... Rsultat <- Rsultat + convertir1( fin( r o ma i n ) ) ... Essayonscetalgorithmesurlachaneromain=MCDXII : ( 1a) v <- valeur1( M ) = > v <- 1000 (1b) v = 1000 > valeur1( C ) = > v = 1000 ( 1 c ) Rsultat <- Rsultat + v = > Rsultat = 1000 ( 1 d ) Rsultat <- 1000 + convertir( CDXII ) Lappelrcursifconvertir1alemmeeffet : (2a) v <- valeur1( C ) = > v <- 100 (2b) v = 100 < valeur1( D ) = > v = -100 ( 2 c ) Rsultat <- Rsultat + v = > Rsultat = 900 ( 2 d ) Rsultat <- 900 + convertir( DXII ) LenouvelappelconvertitalorsD : ( 3a) v <- valeur1( D ) = > v <- 500 (3b) v = 500 > valeur1( X ) = > v = 500 ( 3 c ) Rsultat <- Rsultat + v = > Rsultat = 1400 ( 3 d ) Rsultat <- 1400 + convertir( X I I ) Lerestedelachaneestconvertidelammefaonetnousobtenons1412.Nouspouvonsdonccrireunepremire versiondecetalgorithme : Algorithme8:ConversionchiffresromainnombreentierVersion1.0 Algorithm convertir1 e # Lentier en base dix gal romain. Entre r o m i n : CHANE a Rsultat : ENTIER prcondition estDfinie( r o m i n ) a longueur(rom ain) > 0 rom ain est une reprsentation valide d un entier en chiffres

- 2-

ENI Editions - All rigths reserved - Jonifar lina

221

rom ains ralisation si longueur(rom ain) = 1 alors Rsultat <- valeur1( premier( r o ma i n ) ) sinon si valeur1( premier( r o m i n ) ) < valeur1( item( r o m i n , 2 ) ) a a alors Rsultat <- convertir1( fin( r o ma i n ) ) valeur1( premier( r o ma i n ) ) sinon Rsultat <- convertir1( fin( r o m i n ) ) + a valeur1( premier( r o ma i n ) ) fin si postcondition Rsultat = ( l e n t i e r g a l r o m i n ) a fin convertir1 Lutilisation de la fonction premier, qui retourne le premier caractre de son argument, est ncessaire puisque valeur1prendenparamtreunCARACTREalorsqueromainestuneCHANE. tudionsprsentuneversionitrativedeconvertir1.Ceseraconvertir2. Lalgorithme prcdent consiste convertir le premier caractre en le comparant au second. Dans une version itrative,onconvertituncaractrequelconqueenlecomparantceluiquilesuit. Faireunehypothsesurltatactuel Le dernier caractre converti est le caractre de rang i - 1 de la chane romain. Le caractre qui le suit est item (romain,i). Hypothse(H):romain[1..i1]atconvertidansRsultat.Lavaleursuivanteestvs = valeur1(item(romain,i)). Voirsicestfini Cestfinilorsquei=longueur(romain).Maislorsquecest fini,vscontientunevaleurquinapasencoretcumule dansRsultat. ... si longueur( r o m i n ) = i a alors Rsultat <- Rsultat + vs c e s t f i n i sinon ... Serapprocherdeltatfinal On se rapproche de ltat final en calculant la valeur du caractre suivant. Sa valeur absolue est vs. On obtient sa valeurdfinitiveencomparantcettevaleurabsoluecelleducaractrequilesuit : ... sinon # Dterminer la valeur absolue du caractre suivant. v <- vs vs <- valeur1( item( r o m i n , i + 1 ) ) a # Appliquer la rgle de position des chiffres romains. si v < vs alors v < -v fin si Rsultat Rsultat + v ...
ENI Editions - All rigths reserved - Jonifar lina - 3-

222

Ltatobtenuestalorsdcritparlassertionsuivante : ... assertion Rsultat = ( r s u l t a t d e l a c o n v e r s i o n d e r o m i n [ 1 . . i ] ) a vs = valeur1( item( r o m i n , i + 1 ) ) a ... Onretrouveltatdcritpar(H)enavananti : ... i <- i + 1 ... Initialiserlecalcul Dansltatinitial,aucuncaractrenaencoretconvertietdoncRsultat=0.Leprochaincaractreobserverest celui de rang i et, initialement, cest le premier : i <- 1. Enfin, la valeur suivante est celle du premier caractre et donc : vs <- v a l e u r 1 (i t e m (romain, 1)) Doleblocdesinitialisations : ... variable i , v , v s : ENTIER initialisation Rsultat <- 0 i <- 1 vs <- valeur1( item( r o m i n , 1 ) ) a ... Rdigerlalgorithmedfinitif Nous devons pouvoir crire linvariant de litration en exprimant dune faon algorithmique les assertions de lhypothse(H). Cellecifaitintervenirlaconversionpartielledelachanejusquaucaractrederangi - 1.Posons alors convertir4, la fonction qui prend en paramtres la chane convertir et le rang entier donnant le numro du caractreosarrtelaconversion.Ainsi,parexemple : n <- c o n v e r t i r 4 (romain, 4) ne convertit que la chane faite des quatre premiers caractres deromain. Pour convertir toute la chane, on devra crire : n <- c o n v e r t i r 4 (romain, l o n g u e u r (romain)) Onpeutremarqueraussiquevaleur1calculelavaleurduncaractredelachaneromain,maispasncessairementle premier. Soit alors valeur2, la fonction qui prend en entre une chane et un rang entier et qui retourne la valeur absolueducaractrequioccupecerangdanslachane.Ainsi,pourobtenirlavaleurabsoluedusecondcaractre,on crira : vs <- v a l e u r 2 (romain, 2) Danslasuite,lesfonctionsconvertir4etvaleur2remplacentrespectivementlesfonctionsconvertir2etvaleur1dont lcritureestlaisseenexercice. Nouspouvonsalorsexprimerlinvariantetlevariantdecontrledelitration : ... invariant i = 1 = > Rsultat = 0 et vs = valeur2( r o m i n , 1 ) a i > 1 = > Rsultat = convertir4( r o ma i n , i - 1 ) et vs = valeur2( r o ma i n , i ) variant de contrle

- 4-

ENI Editions - All rigths reserved - Jonifar lina

223

...

longueur( r o m i n ) - i a

Laspcificationdelalgorithmeestlasuivante : Algorithm convertir4 e # Convertir romain en base dix. Entre r o m i n : CHANE a Rsultat : ENTIER prcondition estDfinie( r o m i n ) a rom ain est une reprsentation valide d un entier en chiffres rom ins. a postcondition longueur(rom ain) = 1 = > Rsultat = valeur2( r o m i n , 2 ) a longueur(rom ain) > 1 et valeur2(rom ain, 1) < valeur2( r o m i n , 2 ) a = > Rsultat = convertir4( fin( r o m i n , longueur( r o ma i n ) ) ) - valeur2( r o m i n , 1 ) a a longueur(rom ain) 1 et valeur2(rom ain, 1) < valeur2( r o m i n , 2 ) a = > Rsultat = convertir4( fin( romain, longueur( r o m i n ) ) ) + valeur2( r o m i n , 1 ) a a fin convertir4 Lalgorithmequisuitdonneuneversioncomplte,maispasencoredfinitive,decetalgorithme. Algorithme9:ConversionchiffresromainsnombreentierVersion2.0 ... variable i , v , v s : ENTIER initialisation Rsultat <- 0 i <- 1 vs <- valeur2( r o m i n , 1 ) a jusqu i longueur( r o m i n ) a invariant i = 1 = > Rsultat = 0 et vs = valeur2( r o m i n , 1 ) a i > 1 = > Rsultat = convertir4( r o ma i n , i - 1 ) et vs = valeur2( r o ma i n , i ) variant de contrle longueur( r o m i n ) - i a rpter v <- vs vs <- valeur2( r o m i n , i + 1 ) a si v < vs alors v < -v fin si Rsultat <- Rsultat + v assertion Rsultat = convertir4( r o ma i n , i ) et vs = valeur2( r o m i n , i + 1 ) a i <- i + 1 assertion Rsultat = convertir4( r o ma i n , i - 1 ) et vs = valeur2( r o ma i n , i ) fin rpter ... fin convertir4

ENI Editions - All rigths reserved - Jonifar lina

- 5-

224

Cetalgorithmepeuttrelgrementamliorenremarquantquecertainscalculspeuventtre conomiss .Cest lecasducalculdelalongueurdelachane,parexemple.Ilestaussipossibledviterlesmultiplescalculsdei + 1en dplaantlincrmentation.Onobtient : Algorithme10:ConversionchiffresromainsnombreentierVersion2.1 ... variable i , v , v s , l o n g : ENTIER initialisation Rsultat <- 0 i <- 1 vs <- valeur2( r o m i n , 1 ) a long <- longueur( r o m i n ) a jusqu i long invariant i = 1 = > Rsultat = 0 et vs = valeur2( r o m i n , 1 ) a i > 1 = > Rsultat = convertir4( r o ma i n , i - 1 ) et vs = valeur2( r o ma i n , i ) variant de contrle long - i rpter i <- i + 1 v <- vs vs <- valeur2( r o m i n , i + 1 ) a si v < vs alors v < -v fin si Rsultat <- Rsultat + v assertion Rsultat = convertir4( r o ma i n , i ) et vs = valeur2( r o m i n , i + 1 ) a assertion Rsultat = convertir4( r o ma i n , i - 1 ) et vs = valeur2( r o ma i n , i ) fin rpter ... fin convertir4 Lexercicesuivantproposequelquesextensionscetteactivit. Exercice4:Dautresversionsdelaconversionchiffresromainsnombreentier 1.Donnerlesspcificationsetlesralisationsdesfonctionsvaleur1etvaleur2. Ces deux fonctions peuvent tre ralises en utilisant une numration. Cest probablement ce que vous avez fait pour rsoudrelaquestionprcdente.Danscecas,rsoudrelaquestionsuivante. 2.crireuneversiondesralisationsdevaleur1etvaleur2quiexplorentuntableaupourconvertiruncaractre. 3.crireuneversiondelalgorithmedeconversionquirendlareprsentationdunombrepardeschiffresenbasedixaulieu decalculersavaleur. Laprconditiondelalgorithmedeconversionimposequelachanequireprsentelenombreenchiffresromainssoitvalide. 4.Commentsecomportelalgorithmeproposlorsquuncaractrequinestpasreconnucommeunchiffreromainvalideest prsentdanslachaneparamtre ?Modifiersilyalieupourrelchercettecontrainte. Ilestdoncpossibledcrireuneversiondecesalgorithmesquisecomportecorrectementetquirendlebonrsultat,mme silachanedecaractresquireprsentelentiercritenchiffresromainsestmalforme. 5.Discuterlesraisonspourlesquellescettesolutionnestpasrecommandemalgrsarobustesse. 6.Ilnestpasncessairequelaprconditionimposelongueur(romain) = 1.Modifiercetalgorithmepourquilaccepteune chanedelongueurnulledontlavaleurseraalors0.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

225

2.Conversionnombreentierchiffresromains
Il sagit, prsent, de traiter le problme direct. On donne un nombre entier. crire lalgorithme de la fonction qui retourne sa reprsentation en chiffres romains. Ce problme nest pas fondamentalement difficile, mais un peu plus dlicatqueleprcdent.Prcisonsledabord. Ondonneunnombreentiern,comprisentre0et3000 :0 n 3000.Ilsagitdcrireunefonctionquirendlachane decaractresreprsentantcenombreenchiffresromains.Laborne3000estchoisiepoursimplifierleproblmeen restreignant le nombre de caractres reprsentant les chiffres romains prendre en compte. Ce qui complique le problme,cestlargledeposition.Considrons,parexemple,lecasdunombre1912.Sanscettergle,ilsuffitde lditer parunesuitededivisionspar1000,500,100,50et10.Onobtientalors : 1912 = 1000 + 500 + 4x100 + 10 + 2 MDCCCCXII Mais500+4x100=900et900CMetnonpasDCCCC.Parconsquent,1912 MCMXII.Demme : 1999 = 1000 + (500 + 400) + (50 + 40) + (5 + 4) = 1000 + (1000 - 100) + (100 - 10) + (10 - 1) MCMXCIX Pourviterlesperturbationsintroduitesparlesreprsentationsdesnombres900,400,etc,onconvientdeconsidrer ces nombres comme des reprsentations en base dix de chiffres romains composs. La table cidessous donne la conversiondetousleschiffresconsidrsdanscettesection. Entier Chiffre 1000 M 900 CM 500 D 400 CD 100 C 90 XC 50 L 40 XL 10 X 9 IX 5 V 4 IV 1 I

Convenonsgalementquelenombre0serareprsentparunechanedecaractresvide.Lalgorithmeconsistealors divisersuccessivementlasuitedesrestesdesdivisionsparlasuitedesentiersdelatablecidessus.Voyonscela surlexempleden=1999. Exemple Convertir1999enchiffresromains. Lasuitedesdivisionsdonnelesrsultatssuivants :


q

ladivisionpar1000donne1=>Mreste999 ladivisionde999par900donne1=>CMreste99 lesdivisionssuccessivesde99par500,400et100donnenttoutes0etunrestegal99 ladivisionde99par90donne1=>XCreste9 lesdivisionssuccessivesde9par50,40et10donnenttoutes0etunrestegal9 ladivisionde9par9donne1=>IXavecunrestenul,cequiterminelecalcul.

Finalement, en rassemblant tout cela, on obtient MCMXCIXqui est le rsultat attendu. videmment, cette mthode faitbeaucoupdecalculsinutiles,maiselledevraitdonnerdesrsultatscorrectsetnousallonsnousencontenterdans unepremireversion.Cependant,leproblmenestpastoujoursaussisimple. Exemple Convertir203enchiffresromains. Le nombre 203 scrit CCIII en chiffres romains. Ce qui diffre ici, cest la rptition des chiffres. Les divisions donnent2pourlequotientpar100puis3pourlequotientpar1.NousdevonsdoncprparerlachaneCCdontle nombredecaractresestgalauquotientdeladivisionpar100.Demme,lenombredecaractresdeIIIestgal auquotientdansladivisionpar1.Ainsi,lequotientdechaquedivisiondonnelenombredecaractresidentiques concatnerdroitedelachaneRsultatdjobtenue.Soitcopie,unefonctioncapabledeprparerunetellechane.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

226

Lesspcificationsdecettefonctionsontdonnesparlalgorithmecidessous. Algorithme11:Spcificationdelafonctioncopie Algorithm copie e # La chane gale n occurrences de c. Entre c : CARACTRE n : ENTIER Rsultat : CHANE prcondition n 0 postcondition n = 0 = >Rsultat = CHANE_VIDE n > 0 = >Rsultat = chane( c ) copie( c , n - 1 ) fin copie Nouspouvonsalorsanalyserleproblmepos.Soitchiffreslamatricequiimplmentelatableprcdente. Faireunehypothsesurltatactuel Hypothse(H):onadjdivisparles(i1)premiersnombresdelamatricechiffres.Ledernierresteobtenuest r.LachaneactuelleestRsultat. Voirsicestfini Cestfinilorsqueles13positionsdelamatricechiffresonttutilisesou,mieux,lorsqueleresterestnul. Serapprocherdeltatfinal Onserapprochedeltatfinalenralisantunedivisionsupplmentaire : ... dividende <- r # Le dernier reste devient dividende. diviseur <- c h i f f r e s [ 1 ] [ i ] # Prochain diviseur. r <- reste( d i v i d e n d e , d i v i s e u r ) # Reste suivant. Rsultat <- Rsultat copie ( chiffres[2][i], quotient( d i v i d e n d e , d i v i s e u r ) ) i <- i + 1 ... Ici, le tableau chiffres[1] contient les nombres entiers et le tableau chiffres[2] contient les chiffres romains. Cependant,cecinestquunprincipedersolution.Eneffet,lesdonnesdansleslignesdecettematricenesontpas de mme type. Le tableau de la premire ligne contient des nombres qui seront des diviseurs. Le tableau de la deuxime ligne contient des chanes de caractres. Nous utiliserons donc deux tableaux diffrents au lieu dune matrice. Le tableau chiffres contiendra les chanes de caractres pour les chiffres romains composs. Le tableau nombrescontiendralesentiersdiviseurs. Initialiserlecalcul Nous devons raliser lhypothse (H) pour placer le systme logiciel dans ltat initial. On a divis par les (i 1) premiersnombres.Initialement,aucunedivisionnaencoretfaiteetdonc,leprochainnombreutiliserestceluide numroi=1.Leresteobtenudevientlenouveaudividende.Cedividendeestinitialementlenombreconvertiret donc :r<n.Enfin, Rsultatcontientlersultatobtenuparlesdivisionsprcdentes.Ilestdoncinitialementvide. Doleblocdesinitialisations : ... initialisation Rsultat <- CHANE_VIDE # Rsultat actuel. r <- n # Dernier reste obtenu. i <- 1 # Numro du prochain diviseur.

- 8-

ENI Editions - All rigths reserved - Jonifar lina

227

... Rdigerlalgorithmedfinitif Lalgorithmeestlesuivant : Algorithme12:ConversiondunentierenchiffresromainsVersion1.0 Algorithm convertir5 e # La reprsentation de n en chiffres romains. Entre n : ENTIER Rsultat : CHANE prcondition 0 n 3000 variable # Tableaux de conversion. c h i f f r e s : TABLEAU[ CHANE] [ 1 , 1 3 ] nom bres : TABLEAU[ ENTIER] [ 1 , 1 3 ] i : ENTIER # Prochaine case des tableaux chiffres et # nombres adresser. q u o t i e n t , r e s t e , d i v i d e n d e , d i v i s e u r : ENTIER initialisation Rsultat <- CHANE_VIDE # Rsultat actuel. reste <- n # Dernier reste obtenu. i <- 1 # Numro du prochain diviseur. Initialiser les tableaux chiffres et nom res. b jusqu reste = 0 rpter dividende <- r e s t e diviseur <- n o m r e s [ i ] b reste <- reste( d i v i d e n d e , d i v i s e u r ) quotient <- quotient( d i v i d e n d e , d i v i s e u r ) Rsultat < Rsultat copie( c h i f f r e s [ i ] , q u o t i e n t ) i <- i + 1 fin rpter postcondition n = 0 = >Rsultat = CHANE_VIDE n > 0 = >Rsultat = (la reprsentation de n en chiffres rom ains) fin convertir5 Lexercicesuivantproposedamliorercetalgorithme. Exercice5:Modificationdelalgorithmedeconvertir5 Cet algorithme fait beaucoup doprations inutiles. Mme si nous ne sommes pas proccups par les performances dans cetteinitiation,ilesttoujoursbondesinterrogersurlesamliorationspossiblesdunepremireversiondunalgorithme. Remarquerdabordquunedivisionestinutiledslorsqueleresteobtenuladivisionprcdenteeststrictementinfrieur audiviseur. 1.Modifierlalgorithmepourliminerlesdivisionsinutiles. Cefaisant,onnegagnepasseulementsurlesdivisions.Chaquedivision conomise permetaussidegagnerunappel lafonctioncopie.Cetappelnestncessairequelorsquelequotientdunedivisionestsuprieur1. 2.Modifierlalgorithmeenconsquence. 3.crireladfinitioncompltedecopie. Lapostconditionnestpasexprimecompltementdunefaonalgorithmique.Cestunespcificationdifficile. 4.Exprimerlapostconditiondunefaonalgorithmique. 5.tudierlexpressiondelinvariantetduvariantdecontrle.

ENI Editions - All rigths reserved - Jonifar lina

- 9-

228

Vrificationdesidentifiantsdentreprises
Chaque entreprise est identifie par un numro entier de 9 chiffres en base dix du Systme Informatique pour le RpertoiredeEntreprisesouSIREN.Chaquetablissementduneentrepriseestidentifi,relativementcetteentreprise, parunnumroentier5chiffresenbasedixappelleNumroInternedeClassementouNIC.Lenombrede14chiffres obtenuenregroupant,commesilsagissaitduneconcatnation,lenumroSIRENduneentrepriseetleNICdelunde sestablissementsconstituelenumroduSystmeInformatiquepourleRpertoiredesTablissementsouSIRET. Exemple LasocitPUBLITRONICestidentifieparlesnombressuivants : SIREN : 319 937 454 NIC : 000 35 SIRET : 319 937 454 000 35 Lesidentifiantssontcompossselondesrglesdontltudedpasselecadredecetteinitiation.Cependant,unergle decohrencepeuttreutilisepourvrifierlavaliditdunSIRENoudunSIRET.Lundecesnombresestunnumro validesilsatisfaitlargledecontrlesuivante : RgledecontrledunSIRENoudunSIRET Lasommedeschiffresderangimpairaugmentedelasommedesdoublesdeschiffresderangpairestunmultiplede10. Lesrangssontnumrots,danschaquecas,deladroiteverslagauche.Lepremierchiffredroite,autrementditle chiffredesunits,alerang1.Lorsqueledoubledunchiffrederangpairdonneunrsultatsuprieurougal10,ses chiffressontadditionns.PourlesidentifiantsdelasocitPUBLITRONIC,onobtient : SIREN : 319 937 454 CONTRLE = 4 + 2x5 + 4 + 2x7 + 3 + 2x9 + 9 = 4 + 10 + 4 + 14 + 3 + 18 + 9 = 4 + 1 + 4 + 5 + 3 + 9 + 9 = 40 qui est un multiple de 10 ; SIRET : 319 937 454 000 35 CONTRLE = 5 + 2x3 + 0 + 2x0 + 0 + 2x4 + 5 2x9 + 1 + 2x3 = 5 + 6 + 0 + 0 + 0 + 8 + 5 18 + 1 + 6 = 5 + 6 + 0 + 0 + 0 + 8 + 5 9 + 1 + 6 = 70 qui est un multiple de 10.

+ 2x1 + 3 + 2 + 3 + 2 + 3

+ 2x4 + 7 + 2x3 + 9 + + + 8 + 7 + 8 + 7 + 6 + 9 + 6 + 9 +

Cesdeuxidentifiantspassentdonclecontrle. Exercice6:Exemplesdevrificationsdidentifiantsdentreprises Lesidentifiantssuivantssontilsdesidentifiantsvalides?


q

307961722et30796172200013 420783680 347364570

Le but de cette section est de dfinir un algorithme capable de vrifier la validit dun numro SIREN ou SIRET. Soit contrle,leprdicatquiretourneVRAIsietseulementsilasommedecontrledunnombreentiercandidattreun numroSIRENestunmultiplede10.Lalgorithmecidessousdfinitceprdicat. Algorithme13:PrdicatdecontrledunSIREN

Algorithme contrle # n passe-t-il le contrle dun SIREN ? Entre

ENI Editions - All rigths reserved - Jonifar lina

- 1-

229

n : ENTIER Rsultat : BOOLEN prcondition n > 0 nbChiffres1(n) = 9 ralisation Rsultat <- (reste(sommeCtrl(n), 10) = 0) postcondition Rsultat = (reste(sommeCtrl(n), 10) = 0) fin contrle Cet algorithme utilise la fonction sommeCtrl qui calcule la somme de contrle associe son paramtre. Ce calcul dcomposelenombreenchacundeseschiffrespourluiappliquerlargledevrification.Laseuledifficultconsiste additionnerleschiffresdunrsultatquandledoubledunchiffredunombreestsuprieurougal10 maisledouble dunchiffreprendsesvaleursdans{10 12 14 16 18}.Danschaquecas,onobtientlasommedesdeuxchiffresen retranchant9.Ainsi,ona : 10=>1+0=109=1 12=>1+2=129=3 14=>1+4=149=5 16=>1+6=169=7 18=>1+8=189=9 Maisilexistedautresfaonsdeprocder.Bienentendu,cettefonctionprendenentreunnombreentierpositifmais quelconque.Saseuleresponsabilitestlecalculdelasommedecontrle.Saspcificationestlasuivante : Algorithme sommeCtrl # La somme de contrle de n. Entre n : ENTIER Rsultat : ENTIER prcondition n0 postcondition ... Exercice7:ContrlerunSIRENouunSIRET 1.crirelaspcificationcompltedesommeCtrl. 2.crirelaralisationrcursiveetlaralisationitrativedecettefonction. Lafonctioncontrleimposeunargumentde9chiffres.Or,ilseraitpossibledelutilisergalementpourcontrlerunSIRET. 3.ModifierlafonctioncontrlepourquellepermetteAUSSIlavrificationdunSIRET.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

230

Vrificationdesidentifiantsdelivres
Un livre est identifi par un numro appel un International Standard Book Number ou ISBN. Cest un nombre de 10 chiffresquireprelazonegographiqueoulinguistiqueddition, lditeurdanscettezoneet,bienentendu,lelivre chezcetditeur.Depuisquelquesannes,lintroductiondescodesbarresafaitvoluercetidentifiantenunnombre de13chiffres,leEuropeanArticleNumberingdusystmeglobaldidentificationunivoquedobjets. LastructuredunISBNestdonnedansletableaucidessoussurunexempledontlavaleurest0843610727. Numrodegroupe 0 Prfixedditeur 8436 Numrodetitre 1072 Contrle 7

Le contrle dun ISBN consiste raliser des calculs bass sur la position, cestdire sur le rang du chiffre dans le nombre,etsavaleur.LeschiffresdunISBNsontnumrotsde110encommenantparlechiffredesunits,cest direlechiffredecontrle.Chaquechiffreestmultipliparsonrangetlasommedesproduitsainsiobtenusestdivise par11.LISBNestvalidelorsquelerestedecettedivisionestnul. Exemple Vrifierlavaliditde0843610727. Chiffres Rang Produits Somme : 0 8 4 3 6 1 : 10 9 8 7 6 5 : 0 72 32 21 36 5 = 0 + 72 + 32 + 21 + 36 + 5 + = 198 Division par 11 : quotient = 18 ; reste 0 7 4 3 0 21 0 + 21 + = 0 2 2 4 4 + 7 1 7 7

Pour le numro EAN, lISBN est dabord dbarrass de son chiffre de contrle, 7 dans lexemple prcdent. Il est complt gauche par 978. Pour lexemple prcdent, lEAN devient : 978084361072? o le point dinterrogation remplace provisoirement le chiffre de contrle du nouvel identifiant. Pour calculer la nouvelle valeur du chiffre de contrle, chaque chiffre de lEAN est affect dun coefficient de pondration alternativement gal 1 ou 3 en commenant par la gauche. La somme des produits des chiffres de lEAN par leur coefficient est divise par 10 et le reste obtenu est retranch 10. Le rsultat de la soustraction est le nouveau contrle. Reprenons lexemple prcdent.Ilvient : EAN : 9 7 8 0 8 4 3 6 Coef : 1 3 1 3 1 3 1 3 Produit : 9 21 8 0 8 12 3 18 Somme = 9 + 21 + 8 + 0 + 8 + 12 + 3 + 18 = 93 Division par 10 : quotient = 9 ; reste = 3 Contrle : 10 - reste = 10 - 3 = 7 EAN = 978-0-8436-1072-7 Exercice8:VrifierdesEAN 1.LesEANsuivantssontilsvalides?
q

1 1 1 + 1

0 3 0 + 0

7 1 7 + 7

2 3 6 + 6

9782212121360 9782212110265 9782744015083

2.crirelesalgorithmesdevrificationdesISBNetEAN.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

231

Rsum
Cechapitreaproposdesactivitsautourduproblmedelditiondunnombre.diterunnombre,cestdterminersa reprsentation dans une base de numration donne. Nous avons successivement tudi le calcul du nombre de chiffresdunentier,sonditionetleproblmerciproque.Nousavonsensuitersoluleproblmedelareprsentation dunentierenchiffresromains.Lessolutionsauproblmerciproque,quiconsistetransformerunnombreexprimen chiffres romains en un entier, sont inspires des solutions exposes dans [ARS80]. Les deux dernires sections ont tudidesalgorithmesdevrifications,utilisseninformatiquedegestionpourcontrlerlacohrencedelasaisiedes identifiantsdentreprisesoudelivres.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

232

Bibliographie
[ARS80]JacquesARSAC :Premiresleonsdeprogrammation CEDIC/NATHAN,1980.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

233

Introduction
Un systme de traitement informatique des donnes ne peut pas toujours disposer, dans des variables dfinies, de toutes les entits sur lesquelles il intervient. Un ordinateur, par exemple, ne peut pas toujours placer toutes les donnes en mmoire centrale. Cest le cas lorsque le volume de donnes est important ou encore lorsquil est ncessaire dassurer la persistance des informations quelles reprsentent. Des units priphriques externes denregistrement sont alors utilises pour enregistrer et rcuprer les donnes. Ce chapitre tudie une forme particulire dorganisation et de structuration permettant la persistance des donnes impliques dans un traitement algorithmique : les fichiers. Le prtexte est que la forme que revt cette organisation impose des mthodes et des oprationsapplicablesspcifiques. La deuxime section donne quelques notions rapidement introduites sur lorganisation des supports externes dinformation dun systme informatique et sur les modes daccs ces informations. La troisime section dcrit un fichier organisation squentielle et les traitements de lecture et dcriture dans un tel fichier. La section suivante donnequelqueslmentssurlesfichiersorganisationdirecteetaccsslectif.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

234

Notionslmentaires
Cette section introduit rapidement quelques notions lmentaires sur lorganisation et laccs aux informations enregistresdansunfichierinformatique.Elleestdiviseentroisparties.Lapremireestuneintroductionquiprcise quelques lments du vocabulaire du domaine. La deuxime partie prsente les organisations usuelles. La troisime partiemontrecommentondfinituneassociation,entreunfichierenregistrsurunsupportexterneetunestructure algorithmiquededonnes,quipermettradedcrirelesoprationsdaccsauxinformationsenregistres.

1.Fichiersetarticles
Onconsidreunensembledentitsparticulires,commelesclientsduneentreprise,lesnombrespremiersinfrieurs unelimitedonne,unecollectiondeCDaudio...Chacunedesentitsdontilsagit,unclient,unCD...estcaractrise parunecollectiondinformations.Ainsi,parexemple,unCDseracaractrisparuntitre,desinterprtes,destitresde chansonssilsagitdunCDdemusiquedevarit...NousavonsvuauchapitreStructureslmentairesquunetelle caractristiqueesthabituellementappeleunattribut.Cestlunitdinformationsignifiantepouruneentit.Dansle contextedecechapitre,onappellearticlelogiqueunetellecollectiondattributs. Dfinition Onappellearticlelogiqueunecollectiondattributsrelatifsuneentitparticulire. Pour organiser la persistance dun ensemble darticles logiques ayant des caractristiques en commun, on les regroupe en fichier. Lorsque ce fichier est enregistr sur un support externe, souvent un support magntique ou optique,onparledefichierphysiqueetunarticleestalorsappelunarticlephysiqueouenregistrement. Dfinition Onappellefichierlogiqueunecollectiondarticleslogiquesetfichierphysiquelacopiedufichierlogiqueenregistresurun supportexterneassurantsapersistance. Onappellearticlephysiqueouenregistrementlacopiedelarticlelogiquedanslefichierphysique. Lorsquelarticlephysiqueestencause,onneparlepasdattributpourdsignersescomposants,maisdechampsou encorederubriques. Dfinition Unattributdunenregistrementestappelunerubriqueouencoreunchampdecetenregistrement. Finalement,unfichierlogiqueestcomposdarticles,euxmmescompossdattributs.Unfichierphysique,enregistr sur un support externe, est compos denregistrements, euxmmes composs de champs. La figure cidessous reprsentecesassociations.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

235

Ce schma conceptuel prcise que la famille des fichiers se dcline en deux classes : les fichiers physiques et les fichierslogiques.Unfichierlogique,parexemple,estcomposdaucun,dunoudeplusieursarticleslogiques.Lefichier peutdonctrevide.Chaquearticlelogiqueestcomposdaucun,dunoudeplusieursattributs.Ainsi,unarticledans unfichierpeutaussitrevide.Lapartieduschmaquiconcerneunfichierphysiqueselitdelammefaon. Les oprations applicables un fichier sont particulires du fait de lenregistrement des fichiers physiques sur un support externe persistant. La notion de variable na plus de sens et les axiomes tudis au chapitre Programmes directs ne sont plus adapts. Une opration qui met en jeu un ensemble denregistrements est appele une transaction. Dfinition Onappelletransactionuneoprationquiconcerneunensembledenregistrements. Ainsi considrons, par exemple, un fichier clients qui rassemble les renseignements associs aux clients dune entreprise.Lalistesuivantenumrequelquesexemplesdetransactions :
q

dterminerlalistedesclientsquinontriencommanddepuis6mois vieillirtouslesclientsde1an dterminerlesclientsquihabitentlargionCentre.

Ce sont les fichiers logiques et leurs articles qui sont concerns par lalgorithmique. Les oprations sur les fichiers physiquesetleursenregistrementssontdudomainedelaprogrammation.videmment,ilexisteunlienfortentreles deuxfamillesdefichiers.Onnepeutpastotalementsabstrairedelasignificationdesoprationssurunfichierlogique pourunfichierphysique.Danslesparagraphessuivants,onsintresseauxorganisationsdesfichiersphysiquessur leur support pour en dduire les oprations de base applicables un fichier logique. Ladaptation aux fichiers physiquesrestecependantduressortdelaprogrammation,cequidpasselesobjectifsdecelivre.

2.Organisationetaccsauxfichiers
Lesfichiersphysiquesserpartissentendeuxclasses : 1. Les fichiers dans lesquels les informations sont enregistres sous la forme dun flot de caractres, au sens algorithmiqueduterme,commecelaadjtdfiniauchapitreStructureslmentaires :onlesappelledesfichiers texte

- 2-

ENI Editions - All rigths reserved - Jonifar lina

236

2. Ceux dans lesquels les informations sont enregistres sous la forme de donnes binaires : on les appelle des fichiersbinaires. Dansunfichiertexte,touteinformationestenregistresousformetextuelledirectementditable,parexemplesurun craninformatique.Ainsi,lenombremilledeuxcentsoixantequinzeexprimenbasedixoccupera5caractressurle support, ventuellement augments des caractres de gestion propres au systme informatique utilis : les quatre caractres reprsentant ses chiffres 1, 2, 7, 5 et un caractre pour son signe. Par consquent, lespace de stockage ncessaire est directement fonction de la valeur du nombre. Dans un fichier binaire, au contraire, lespace ncessaireresteconstant.Ilestindpendantdelavaleurdunombre,dansleslimitesdelareprsentationdutype auquelilappartient.Cependant,quellequesoitlaclassedufichier,ilestenregistrsurunsupportinformatiquedont ondistinguedeuxcatgories:
q

Les supportssquentiels reoivent les informations enregistres les unes la suite des autres.Laccs une informationncessitelaccspralabletouteslesinformationsquilaprcdentsurlesupport.Cestlecas, parexemple,delabandemagntique Les supports adressables sont structurs en surfaces denregistrement individuellement adressables. Les informationsquiysontenregistrespeuventtreretrouvesdirectementgrceleuradresse.

Selonlorganisationetlesimpratifsdutraitementraliser,onutilisedeuxtechniquesdaccsauxenregistrements dunfichier :
q

Laccssquentielaccdeauxenregistrementsdufichierdanslordredesenregistrementssurlesupport Laccsslectifaccdeunenregistrementparticuliersanspasserparlesenregistrementsintermdiaires.Cet accsnestpossiblequesurlessupportsadressables.

Lorganisation dun fichier dfinit la manire dont les enregistrements du fichier sont disposs sur le support. On distinguetroisorganisationsprincipales :
q

Lorganisationsquentielle,quipermetlaccssquentiel Lorganisationdirecteconuepourlaccsslectif Lorganisationsquentielleindexequipermetlafoislaccssquentieletlaccsslectif.

Cetteintroductionauxtraitementsdesfichierssintresselorganisationetlaccssquentielainsiququelques notionssurlaccsslectifauxenregistrementsdefichiersorganisationdirecte.Autrementdit,nousntudions,dans cechapitre,quelesmthodesalgorithmiquesrelativesaufichierlogiquedontlesenregistrementsdumodlephysique sontorganisssquentiellementoudirectement.

3.Associationdunfichierphysiqueunprogramme
Un fichier physique F est identifi de manire unique par un nom externe qui lui est attach. Le nom externe dun fichier physique est le nom sous lequel il est connu du systme dexploitation ou, plus prcisment, du systme de gestiondefichiers(SGF)delhtequilhberge.Ainsi,parexemple,lefichierquicontientletextequevoustesen train de lire sappelle fichiers.tex. Son nom externe complet est : /home/mon-login/livres/algorithmique/ch10/fichiers.tex Il peut exister plusieurs programmes de traitement qui accdent aux informations du fichier F. De mme, un unique programme peut accder au mme fichier physique pour raliser plusieurs transactions distinctes. Dans lenvironnementdechacundeux,F,lefichierphysique,estassocidunefaonuniqueunfichierlogiquedontFest lemodle.Lafigurecidessousreprsenteconceptuellementcetteassociation.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

237

Le fichier logique, celui de lalgorithmique, est identifi par un nom interne, gnralement sans rapport avec le nom externedufichierphysique. Afindepouvoiroprersurlefichierphysique,unprogrammedoitsassurerlecontrledecefichier.Ilutilisepourcela uneoprationdouverturedufichierexterne.Cetteoprationluipermet :
q

dtablirunecorrespondanceentrelenomexterneetunnominternepourdsignerlefichierlogique deprciserlanaturedesoprationsquiserontralisessurlefichier :lecture,criture... dassurerauprogrammelecontrleexclusifdufichierphysique.

Ainsi, un mme fichier physique ne possde quun et un seul nom externe. Cependant, plusieurs noms internes peuvent lui associer diffrents fichiers logiques. Lopration douverture du fichier physique ralise lune de ces associations.Unmmefichierphysiquepeuttreassociplusieursfichierslogiques,maisunmmefichierlogique nest associ qu un fichier physique unique. Cest ce quexpriment les multiplicits. Chaque lment de lensemble OUVRIR[FICHIER_PHYSIQUE, FICHIER_LOGIQUE], autrement dit, chaque couple constitu dun fichier logique et du fichierphysiquequiluicorrespond,estobtenuparuneoprationdouverturespcifique. Dans la suite, ouvrir(F, mode) notera lopration douverture qui ralise les actions dcrites cidessus, permettant ainsi de traiter le fichier de nom externe F. Lorsque louverture russit, le nom externe F est associ un fichier logiqueparlesystmedegestiondefichiersdusystmedexploitationetlafonctiondescripteurretourneenrsultat le nom interne du fichier logique. Cette correspondance permet daccder au fichier lors des oprations ultrieures. Cettefonctionsutilisecommececi : ... variable nom_interne : NOM_INTERNE # dclare un nom de fichier logique. nom_externe : NOM_EXTERNE # dclare le nom externe dans le SGF. mode : MODE # Nature des oprations appliquer : # LECTURE, CRITURE, ... ... initialisation initialiser nom_externe et mode ... # Ouverture du fichier et initialisation du nom interne. ouvrir(nom_externe, mode) nom_interne <- descripteur(nom_externe) ... Les types de donnes NOM_EXTERNEet NOM_INTERNE ne sont pas prciss pour linstant. On peut anticiper en remarquant quun nom externe est le nom complet dun fichier. Cest donc une chane de caractres. Le mode douverture prcise la nature des transactions valides sur ce fichier logique. Cependant, ce mode est contraint par lorganisationdufichierphysiqueetlemodedaccsauxinformations.Ainsi,parexemple,lorsquelesupportphysique estunebandemagntique,onnepeutpasouvrirlefichierenlectureetencriture.Autrementdit,unmmefichier physique ne peut tre simultanment un fichier de sortie et un fichier dentre. Mais ce sont l des considrations relativesauxaccsphysiques.Nousenreparleronsplusbas. MODEestuntypestructur : type MODE structure dfini par numration {LECTURE, CRITURE, LECTURE_BINAIRE, CRITURE_BINAIRE} fin MODE La modlisation prcdente montre bien lassociation dun nom interne un nom externe, mais elle nexprime pas toutelaralitdufonctionnementdunSGF.Cecomportementdpenddelorganisationetdumodedaccsaufichier. Lasectionsuivantetudieplusendtaillorganisationetlaccssquentiel.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

238

Organisationsquentielle
Cettesectionprsentelesalgorithmeslmentairespermettantdedfinirlesoprationsdebasesurunfichierlogique dontlemodleestunfichierphysiqueorganisationsquentielle.Lapremirepartieestuneintroductionquiprcisele contexte. La deuxime partie montre comment parcourir un fichier pour lire les informations quil contient. La partie suivanteenfaitautantpourlcrituredanslefichier.Ladernirepartiemontrecommentlemettrejour.

1.Introduction
Un fichier physique organisation squentielle est constitu dune suite denregistrements placs conscutivement sur un support externe. Ils sont tels que, pour accder un enregistrement donn e, il est ncessaire daccder dabord et successivement tous les enregistrements qui prcdent e sur le support. La figure suivante illustre ce typedorganisation.

Lesenregistrementsdunfichiersonthabituellementcomposs.Surlafigurecidessus,chaqueenregistrementestfait decinqchamps:NUMRO,NOMPRNOM,ADRESSE,CODEPOSTAL,VILLE.Onpeutdoncdfinirunarticlecomposantle fichier logique associ aprs ouverture. Ainsi, par exemple pour le fichier clients de la figure prcdente, le type correspondantpourraittre : type CLIENT structure numro identit adresse codePostal ville fin CLIENT

: : : : :

ENTIER # Identifiant du client. IDENTIT CHANE CODE_POSTAL CHANE

LestypesIDENTITetCODE_POSTALontdjtdfinisauchapitreStructureslmentaires.Danscequiprcde, cestlarticlequiestlunitlmentairedaccsunfichierlogique. Un fichier vide, qui ne contient aucun enregistrement, mais qui existe en tant que tel sur le support externe est un fichierrduitlamarquedefindefichier. Un fichier organisation squentielle peut tre enregistr sur un support accs squentiel ou adressable. Loprationdouverturedunfichierphysiqueluiassocieunnominterneutilispourlesaccsaufichierselonlemode prcis. Leffet de lopration douverture est de dfinir un curseur daccs aux articles. Pour toute opration de lecture,undplacementrelatifpralabledececurseurpermetderaliserlopration.Lafigurecidessousreprsente lasituationimmdiatementaprslarussitedeloprationdouverture.

Cettefigurereprsentetroisarticlesa,betc,lesmarquesdefindenregistrementetlapositionducurseuravantle premier article du fichier logique, cestdire en position 0. On suppose donc que la position du premier article, sil existe, est 1. Lorsque le fichier est vide, son seul enregistrement est la marque de fin de fichier. Dans ce cas, le curseurestplacjusteavantcettemarque. Pouroprersurunfichier,lacommandeouvrircrelefichierlogiqueetlassocieaufichierphysiquedontellereoitle nom externe en paramtre. Cest elle qui cre aussi le curseur daccs aux articles du fichier. Cette commande est spcifieparlalgorithmecidessous.
ENI Editions - All rigths reserved - Jonifar lina - 1-

239

Algorithme1:Spcificationsdelacommandeouvrir

Algorithme ouvrir # Crer un fichier logique associ fichier dans le mode m. Entre fichier : NOM_EXTERNE # Le fichier ouvrir. m : MODE # Nature des transactions raliser sur le fichier. prcondition # Pour une ouverture en LECTURE, le fichier existe dans le SGF. m = LECTURE => existe(fichier) # Il ne doit pas tre dj ouvert en CRITURE. non est_en_criture(fichier) # Pour une ouverture en CRITURE, il ne doit pas tre dj # ouvert. m = CRITURE => non est_en_lecture(fichier) et non est_en_criture(fichier) postcondition # Le fichier logique est dans ltat OUVERT. est_ouvert(descripteur(fichier)) # Le fichier physique est verrouill dans le mode m. m = LECTURE => est_en_lecture(fichier) m = CRITURE => est_en_criture(fichier) # Les paramtres nont pas t modifis. ancien(m) = m ancien(fichier) = fichier fin ouvrir Lorsque le fichier est ouvert, il est verrouill dans le mode choisi. Les prdicatsest_en_lecture etest_en_criture permettent dinterroger le systme logiciel pour dterminer ce mode. Les raisons pour lesquelles louverture dun fichierencrituresupposequelefichiernestpasdjouvertserontexposesplusbas.Cettespcificationestdonc claire,saufpeuttrepourcequiconcernelafonctiondescripteur.Cetterequterendlenominternedufichierdont ellereoitenparamtrelenomexterne.Commeunmmefichierpeuttreouvertplusieursfois,commelamontrla sectionprcdente,descripteurrendlederniernominterneassociaufichier,doncceluiobtenulorsdeladernire ouverture. En fin de traitement, les ressources mobilises par louverture sont libres en fermant le fichier. Lopration correspondanteestlaprocdurefermer.Elleraliselesoprationssuivantes :
q

elle complte le fichier physique par une marque de fin de fichier lorsque le traitement ralis tait une cration,donclorsquelefichiertaitouvertencriture ellelibretouteslesressourcesmobilisespourletraitementdufichieret,enparticulier,ellelibrelaccsau fichierphysiquequidevientdisponiblepourlesautrestraitements.Lenominterneparticulierutilispourles traitements prcdents na plus de signification et peut, par exemple, tre rutilis par le systme dexploitationpourunautrefichier.

Lacommande fermerterminedonclassociationentreunfichierphysiqueetunfichierlogique.Lesspcificationsde lalgorithmefermersontlessuivantes : Algorithme2:Spcificationsdeloprationfermer

Algorithme fermer # Ferme fichier et libre les ressources. Entre fichier : NOM_INTERNE # Le fichier logique fermer. prcondition # Le fichier logique est ouvert. est_ouvert(fichier) postcondition # Le fichier est ferm et dverrouill par le SGF. non est_ouvert(fichier) # Le paramtre nest pas modifi. ancien(fichier) = fichier fin fermer

- 2-

ENI Editions - All rigths reserved - Jonifar lina

240

Uneoprationquelconquesurunfichier,commeouvrir,fermerinduitdesaccsaupriphriquedestockageetau supportexterne.Cesaccsnesontpastoujourspossibles,parexemplequandlepriphriqueestenpanne.Dansce cas, une erreur se produit et le programme informatique doit assurer les traitements de toutes les situations dans lesquelles surviennent ces cas exceptionnels. Dans la suite, nous ignorons des erreurs, pannes, dfauts qui rsultent du fonctionnement de la machine physique et nous supposons quelles sont systmatiquement reportes vers les modules logiciels qui utilisent les services des algorithmes que nous crivons. Cette simplification nestpas satisfaisante quand on tudie les algorithmes de solutions des problmes industriels rels, mais nous nous en contenteronsdanscetteinitiation. Noussommesprtstudiercommentliredansunfichierorganisationetaccssquentiels.

2.Traitementdunfichiersquentielenlecture
Cette section prsente des algorithmes lmentaires permettant de dfinir les oprations de base sur un fichier logiquedontlemodleestunfichierphysiqueorganisationetaccssquentiels. Pourunelecturedufichier,laprocdurepremierapoureffetdeplacerlecurseurdelectureimmdiatementsousle premierarticle.Cestlamarquedefindefichierlorsquelefichierestvide.Lafonctionpositionrendalors1.Lafigure prcdenteaillustrlasituationimmdiatementaprsouverturedufichier.Lafiguresuivantelillustreaprslappel laprocdurepremier.

Lalgorithmequiprciselesspcificationsdecetteprocdureestlesuivant : Algorithme3:Spcificationsdepremier

Algorithme premier, dbut # Place le curseur de lecture sous le premier article. Entre fichier : NOM_INTERNE prcondition # Le fichier est ouvert en lecture. est_en_lecture(fichier) postcondition # Le curseur est plac en premire position. position(fichier) = 1 # Fichier nest pas modifi. ancien(fichier) = fichier fin premier Cetalgorithmedfinitaussidbutcommeunaliasdepremierpourdesraisonsdecommodit. Leffet de la fonction lire est de renvoyer larticle qui se trouve en face du curseur. Des appels successifs lire retournent systmatiquement la mme valeur du mme article. Autrement dit, lire ne modifie pas la position du curseur.Considrons,parexemple,lesinstructionssuivantes : ... fichier : NOM_EXTERNE # Le fichier traiter. f : NOM_INTERNE # Lidentifiant interne du fichier. article : ARTICLE # Un article du fichier. ... ouvrir(fichier, LECTURE) # Ouvre le fichier en lecture. f <- descripteur(fichier) # Identifiant attribu louverture. premier(f) # Placer le curseur sous le premier article. articlelire(f)# Rcuprer larticle sous le curseur. Lavariable article contient alors la valeur de larticle en face du curseur. Cet article peut tre la marque de fin de fichiersilefichierestvide.Ledessinsuivantreprsentecettesituationaprslappel premier,suividelappella fonctionlire.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

241

lireralisedoncunecopiedelarticlesouslequelestplaclecurseur. Algorithme4:Spcificationsdelafonctionlire Algorithmelire # Larticle de fichier la position du curseur. Entre fichier:NOM_INTERNE # Le fichier lire. Rsultat : ARTICLE prcondition # Fichier est ouvert en lecture. est_en_lecture(fichier) # La position du curseur est au moins celle du premier article. position(fichier)>0 postcondition Rsultat=(larticlelapositionducurseur) fin lire Cetalgorithmeestunefonction.Ilestdoncinutiledeprciserquelapositionducurseurnestpasmodifie.Ainsi,une nouvellelecturedufichierrendlemmearticle.Pouraccderlarticlesuivantetobtenirsavaleur,ilestncessairede commencerparavancerlecurseur.Soitavancerlaprocdurequiralisecettemodification.Sesspcificationssont : Algorithme5:Spcificationsdeavancer Algorithmeavancer # Dplacer le curseur sous larticle suivant. Entre fichier:NOM_INTERNE prcondition # Le fichier est ouvert. est_ouvert(fichier) # En lecture, le curseur est avant la marque de fin de fichier. est_en_lecture(fichier)=>non estAprs(fichier) postcondition # Le curseur navance pas aprs la fin de fichier. finDeFichier(ancien(fichier))=> position(fichier)=ancien(position(fichier)) # Le curseur avance dune position si non fin de fichier. non finDeFichier(ancien(fichier))=> position(fichier)=ancien(position(fichier))+1 fin avancer LeprdicatestOuvertnestquunraccourcipourladisjonctionest_en_lecture()ouest_en_criture(). LeprdicatestAprsrendVRAIsietseulementsilecurseurestpassaprslapositiondelamarquedefindefichier. Ainsi,cettecommandenaaucuneffetlorsquelecurseurestpasssouscettemarque.Lafigurecidessousillustrela situationaprsexcutiondelacommandeavancer.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

242

Lorsquelafindefichierestrencontre,lavariablearticlecontientFIN_FICHIER.Cestuneconstantemanifestedont lavaleurestcelleducaractrespcialquimarquelafindufichier.Pourreconnatrecettesituation,ondisposedune fonctionboolennefinDeFichierquiretourneFAUXlouverturedufichierettantquuneoprationdelecturenapas rencontroudpasslamarquedefindefichier.EllerendVRAIlorsquelecurseurestpositionnsouscettemarque et que la fonction de lecture a t appele dans cette position. Ainsi, mme si le fichier est vide, cette fonction ne renvoieVRAIquaprsunepremirelectureouaprsavoiravanclecurseuraudeldelamarque.Lafiguresuivante illustrecettesituation.

La partie (a) du dessin illustre la situation aprs ouverture dun fichier vide et appel la procdure premier. Le curseurestplacalorssouslamarquedefindefichier.Lavaleurdelavariablearticlenestpasencoresignificative etleprdicatfinDeFichierrendraFAUXsilestappeldanscettepositionducurseur.Lapartie(b)montrelasituation aprs lecture depuis la situation illustre par (a). Cette fois, la variable article a pris la valeur FIN_FICHIER et la fonctionfinDeFichierrendraVRAIauprochainappel. LalgorithmedesspcificationsdefinDeFichierestlesuivant : Algorithme6:SpcificationsdefinDeFichier AlgorithmefinDeFichier # La marque de fin de fichier a-t-elle t rencontre ? Entre fichier:NOM_INTERNE Rsultat : BOOLEN prcondition # Le fichier est ouvert en lecture. est_en_lecture(fichier) postcondition position(fichier)=0=>Rsultat=FAUX# Aprs ouverture. position(fichier)>0=>Rsultat= ( estAprs(fichier) ou sinon (lire(fichier)=FIN_FICHIER) ) fin finDeFichier Onexprimeainsiquelafindefichierestatteintesietseulementsiunelecturerendlamarquedefindefichierousile curseurestplacaprscettemarque. Ildevientpossibledecommencerrsoudrequelquesexercices.

ENI Editions - All rigths reserved - Jonifar lina

- 5-

243

Exercice1:Quelquesspcificationscomplmentaires Soitavancer(fichier,p)quiavancelecurseurdunnombredepositionsgalp. 1.Donnerlesspcificationsdecettenouvelleprocdure. 2.Vrifierquecesspcificationssontcohrentesaveclefonctionnementdcritprcdemment. Enparticulier,commentsecomportecetteprocduresurunfichiervide ?Plusgnralement,commentsecomportetelle lorsquelenombrepesttelquelavanceducurseurluifaitdpasserlapositiondelamarquedefindefichier? Quelquesprdicatsutilissnontpasencoretdfinis. 3.crirelesspcificationsdesprdicatsest_en_lectureetest_en_criture. 4.Utiliserlesspcificationsobtenueslaquestionprcdentepourspcifierest_ouvert. 5.Utilisercesspcificationspourdfinirunefonctionmodequirendlemodedanslequelatouvertunfichier.

3.Parcoursdunfichier
Parcourirunfichiersquentielestuneoprationfrquente.Lexercicesuivantdonnedesindicationspourralisercette opration. Exercicersolu1:Parcoursdunfichierorganisationsquentielle UnfichierdenomexterneFdoittreparcourupourfairesubirchacundesesenregistrementsuntraitementquinestpas prcis. 1.crirelalgorithmegnraldeparcoursdufichier. 2.Commentrepositionnerlecurseuraudbutdufichierpourunnouveauparcours ? On recherche un article particulier parmi les n articles du fichier. Pour le trouver, il est ncessaire de parcourir le fichier depuislepremierarticle,jusqurencontrerlarticlecherchoujusqulamarquedefindefichiersicetarticleestabsentdu fichier. 3.crirelalgorithmederecherchedunarticledansunfichiersquentiel. Solution Voici, titre dexemple, le squelette dun algorithme qui rpond partiellement la premire question. Il nest pas difficiledenfaireunalgorithmecompletetcettetcheestlaisseenexercice. ... # Ouvrir le fichier F en lecture et rcuprer le nom interne obtenu. ouvrir(F,LECTURE) fichier<descripteur(F) # Positionner le curseur sous le premier article. premier(fichier)# ou dbut(fichier). # Lire le premier article. article<lire(fichier) jusqu finDeFichier(fichier) rpter Raliserlestraitementssurarticle # Placer le curseur sous larticle suivant. avancer(fichier) # Lire larticle suivant. article<lire(fichier) fin rpter fermer(fichier) ... Cettedfinitionestvidemmentincomplte,maisilymanqueaussilinvariantetlevariantdecontrledelitration. Linvariantnestpasdifficilecrire.Ilnenestpasdemmeduvariantdecontrlequipeuttreignor. RemarqueraussiquelappelauprdicatfinDeFichierestquivalentauprdicatlire(fichier) = FIN_FICHIER. Pourrepositionnerlecurseursouslepremierarticle,ilsuffitdefermerpuisderouvrirlemmefichier :

- 6-

ENI Editions - All rigths reserved - Jonifar lina

244

... fermer(fichier) # Ouvrir le fichier F en lecture et rcuprer le nom interne obtenu. ouvrir(F,LECTURE) fichier<descripteur(F) # Positionner le curseur sous le premier article. premier(fichier) ... Ilestpossiblededfinirpourcelauneprocdurequiencapsulecesinstructions : Algorithme7:Replacerlecurseursouslepremierarticle Algorithmedbut2 # Reculer le curseur sous le premier article. Entre fichier:NOM_INTERNE prcondition est_en_lecture(fichier) ralisation fermer(fichier) # Ouvrir le fichier F en lecture et rcuprer le nom interne # obtenu. ouvrir(F,LECTURE) fichier<descripteur(F) # Positionner le curseur sous le premier article. premier(fichier) postcondition ancien(fichier)=fichier est_en_lecture(fichier) position(fichier)=1 fin dbut2 Lapremireclausedelapostconditionexprimequelenominternefichiernestpasmodifi.Ensituationrelle,cene serapaslecas.NousnepouvonspassupposerqueleSGFrendralemmenominternepuisquelenomprcdentest libr par lopration de fermeture et que beaucoup dvnements peuvent se passer entre cette fermeture et la rouverture du mme fichier. Cependant, les langages de programmation, comme C par exemple, fournissent une procdurerewindquiaexactementlecomportementdcritpardbut2etnouspouvonsenresterl. Ladernirequestionposeunproblmemoinsimmdiat.SoitCLIENTletypedfiniparladclaration : type CLIENT numro:ENTIER nom:CHANE fin CLIENT Un client est donc une entit dfinie par deux attributs : un numro entier, que nous supposerons positif et qui identifieleclient unnomquireprsentesonidentit. Un fichier physique F organisation et accs squentiel contient jusqu 1000 clients enregistrs dans lordre croissantdeleurnumro.Cesnumrosnesontpasncessairementconscutifs. Ondemandelalgorithmequirendle nomdunclientdontondonnelenumro. Algorithme8:FonctionunClient AlgorithmeunClient # Le nom du client de numro numro ou ABSENT. Entre F:NOM_EXTERNE # Fichier des clients. numro:ENTIER # Numro du client chercher. Rsultat : CHANE # Le nom cherch ou ABSENT. prcondition existe(F)# Le fichier existe dans le SGF. non est_ouvert(F)# Il nest pas dj verrouill. constante

ENI Editions - All rigths reserved - Jonifar lina

- 7-

245

MAX_CLIENTS:ENTIER<1000 ABSENT:CHANE<CHANE_VIDE variable clients:NOM_INTERNE # Nom interne de F aprs ouverture. nom:CHANE # Le nom du client cherch. ralisation # Crer le fichier logique. ouvrir(F,LECTURE) clients<descripteur(F) # Dterminer le nom du client de numro numro. Rsultat<identit(clients,numro).nom # Librer les ressources. fermer(fichier) postcondition Rsultat=nomduclientdenumroou sinonABSENT fin unClient Cestlafonctionidentitquiraliseleparcourseffectifdufichier. Algorithme9:Fonctionidentit Algorithmeidentit # Le client associ numro. Entre clients:NOM_INTERNE # Le fichier explorer. numro:ENTIER # Numro du client cherch. client:CLIENT # Le prochain client observer. Rsultat : CLIENT prcondition est_en_lecture(clients) 1numroMAX_CLIENTS ralisation Rsultat<ABSENT# Encore rien trouv. premier(clients)# Curseur sous le premier article. client<lire(clients)# Lecture du premier client. tant que non finDeFichier(clients)et Rsultat=ABSENT invariant ... variant de contrle ... rpter si client.numro=numro alors # Trouv. Rsultat<client sinon # Pas encore trouv. Curseur sous larticle suivant. avancer(clients) # Lire le client suivant. client<lire(clients) fin si fin rpter postcondition Rsultat=ABSENTou sinon Rsultat.numro=numro fin identit criredansunfichierorganisationetaccssquentielestuneoprationessentiellementdiffrentedelalecture.La sectionsuivantetudiecetteopration.

4.Traitementencriture

- 8-

ENI Editions - All rigths reserved - Jonifar lina

246

Commepourlalecturedunfichierorganisationetaccssquentiel,lcrituresupposequelefichieradabordt ouvertdanslemodecorrespondant.Cestencorelopration ouvrirquiassurelacrationdunominterne,rcupr ensuiteparlafonction descripteur. Cependant, alors que la fermeture du fichier ouvert en lecture navait que pour effetdelibrerlesressourcesmobilises,notammentlenominterne,elleacettefoisuneffetplusdfinitif :cestcette opration qui appose la marque de fin de fichier aprs la marque de fin du dernier enregistrement. Ainsi, toute ouvertureduntelfichierencritureaurapourconsquencequesafermeturemarqueralafindufichierlaposition du curseur. Par consquent, le simple fait douvrir le fichier en criture le cre initialement vide et, donc, si le fichier physiquecontenaitdesdonnesavantlouverture en criture, ces donnes sont perdues. En effet, la fermeture du fichier apposera la marque de fin de fichier et tout enregistrement plac aprs la marque de fin de fichier est invisible et donc perdu sil existait avant louverture. Une premire consquence importante est quil devient ncessairedexprimerquunfichierouvertenlecturenepeuttreouvertencritureetque,rciproquement,unfichier ouvert en criture ne peut ltre ensuite et en mme temps en lecture. Ainsi, le modle conceptuel suivant prcise mieuxcetteralit :

Lacontraintedepartition,note{Partition},exprimequunfichiernepeuttreouvertsimultanmentenlectureeten criture,maisquillestsoitenlecturesoitencriture.Ainsi,unfichierpeuttreouvertaucune,uneouplusieursfois enlectureetalors,ilnepeuttreouvertencriture.Demme,unfichierpeuttreouvertauplusunefoisencriture etalors,ilnepeuttreouvertenlecture. Lopration : o u v r i r (nom_externe, CRITURE) nom_interne <- d e s c r i p t e u r (nom_externe) crelefichierdenomnom_externesurlesupport,louvreencritureetretournelenominternepouraccderaufichier logique. Lopration crire(nom_interne, valeur) crit larticle dsign par la variable valeur dans la position du curseur et termine par lapposition de la marque de fin denregistrement. Loprationavancer(nom_interne) avance alors le curseur aprs la marque de fin denregistrement qui vient dtre crite et, enfin, lopration fermer (nom_interne)apposelamarquedefindefichieretlibrelenominterne. ConsidronsuntatinitialdanslequelonveutcrerunfichierdenomexterneFpouryenregistrerdeuxvaleursv_1 etv_2detypeT.Lafiguresuivanteillustrecinqtatsdufichier.Lapartie(a)montreltatinitial,aprslouverturedu fichier.Lapartie(b)reprsentelasituationaprslcrituredelavaleurv_1.

ENI Editions - All rigths reserved - Jonifar lina

- 9-

247

Pourcrireunenouvellevaleurv_2,onavancedabordlecurseuraprslamarquedefindenregistrementdelcriture prcdente.Cestcequillustrelafigure(c)cidessusquimontrelanouvellesituationaprsledplacementducurseur. Lafigure(d)lamontreaprscrituredelavaleurv_2danslanouvellepositionducurseur.Enfin,lafigure(e)montre leffetdelafermeturedufichieraprsavanceducurseurlapositionquisuitladernirecriture. Lorsque les oprations douverture et de fermeture se succdent sans opration dcriture intermdiaire, le fichier crestunfichiervide,danslequelnefigurequelamarquedefindefichierapposeparloprationdefermeture.La figuresuivanteillustrecettesituation.

Exercicersolu2:Crationdunfichierorganisationsquentielle Onconsidreuntraitementgnralnonprcisquicredesvaleursv_ilorsduneitration.Cesvaleursdoiventtoutestre enregistresdansunfichierorganisationsquentielledenomexterneF. crirelalgorithmedecrationdufichier. Solution Lesquelettedunalgorithmedecrationestlesuivant : ... variable F:NOM_EXTERNE # Nom du fichier dans le SGF. f:NOM_INTERNE # Nom du fichier logique aprs ouverture. mode:MODE # Mode (type) douverture. valeur:ARTICLE # Un article crire. ... initialisation F<(lenomexternedufichiercrer) mode<CRITURE
- 10 ENI Editions - All rigths reserved - Jonifar lina

248

ouvrir(F,mode) f<descripteur(F) valeur<(calculerunarticleenregistrer) jusqu plusdautrearticleenregistrer rpter crire(f,valeur)# Enregistrer cette valeur et poser la marque # de fin denregistrement. avancer(f)# Position dcriture suivante. valeur<(calculerlavaleurdelarticlesuivant) fin rpter fermer(f)# Poser la marque de fin de fichier et librer les # ressources. ...

5.Misejourdunfichierorganisationsquentielle
Lamisejourdunfichierestloprationquiconsistemodifierlesinformationsquilcontientpour :
q

supprimerdesarticlesdontlesinformationssontprimes crerdenouveauxarticles modifierdesarticlesexistants.

Comme nous lavons vu dans les sections prcdentes, il nest pas possible dcrire dans un fichier organisation squentiellesanslecrer.Parconsquent,toutecrituredansuntelfichiercommencepardtruirelesinformations quilcontient.Cestlecomportementdcritprcdemmentpuisquelafermeturedufichierouvertencritureapposela marquedefindefichierdanslapositionducurseur.Parconsquent,lamisejourdunfichierorganisationetaccs squentiel seffectue toujours en cration ! Soit, par exemple, fAncien le nom externe du fichier mettre jour. Les oprations de mise jour sont enregistres dans un fichier de nom fMouvements. Ce fichier contient des enregistrementscompltsduncodequiprcise,pourchacundeux,silsagitdelamodificationdunenregistrement existantdansfAncien,delasuppressiondunenregistrementexistantoudelacrationdunnouvelenregistrement. LesenregistrementsdesfichiersfAncienetfMouvementssontutilisspourcrerunfichierfNouveauquiserafAncien, misjouraveclesinformationsdefMouvements.lissuedelamisejour,fAncienestarchivoudtruitetfNouveau estrenommenfAncienpourleremplacer. Considronslafigurecidessous.EllereprsentelesenregistrementsdesdeuxfichiersfAncienetfMouvements,ainsi queceuxdufichierfNouveauobtenuaprsmisejourdefAncienlaidedesenregistrementsdefMouvements.

Cettefigurereprsentelefichiermettrejouretlefichierdesmouvementsraliser.Cedernierfichierrassemble desenregistrementscompossdetroischamps :
q

uncodedemouvementraliserappartenantlensemble{MSC} uneclnumrique

ENI Editions - All rigths reserved - Jonifar lina

- 11 -

249

lapartiedesdonnes utiles delenregistrement,reprsenteiciparunelettreunique.

Ainsi,parexemple,lepremierenregistrementC3xestlacrationdecodeC,dunarticledecl3dontlesdonnes sontreprsentesparlalettrex. Exercice2:Misejourdunfichierorganisationetaccssquentiel. Onsupposequelesenregistrementsdesfichierssonttrisenordrecroissantdesclsnumriques.Ici,elleestreprsente parlenombreentierenpremirepositiondechaqueenregistrementdefAncien. 1.crirelalgorithmedemisejourdufichierpartirdufichierdesmouvements. Onsintresseprsentlafusiondedeuxfichiers. Deux fichiers organisation squentielle F1 et F2 sont constitus denregistrements ordonns sur la valeur de lun des champsK.Onaccdelavaleurdecechampenutilisantlanotationpointe.Ainsi,parexemple,aprslalecturedunarticle dsignparValeurLue,onaccdelarubriqueKdecetarticleencrivantValeurLue.K. 2.crirelalgorithmequiraliselafusiondesdeuxfichiersenunfichierunique. Certainesoprationsutilesnontpasencorettudies.Ainsi,parexemple,laprocduredernier,quipositionnele curseursousledernierarticledunfichierouvertenlecture,napasencoretdfinie. Exercice3:Gnralisationdesspcifications 1.tablirlalistedesoprationsutilesetendonnerlesspcificationsavec,ventuellement,lesdfinitionscorrespondantes. La dsignation des positions des articles utilise la fonction position. Au lieu de considrer que cette fonction retourne 1 lorsquelecurseurestplacsouslepremierarticledunfichierouvertenlecture,onsupposequecenombreestquelconque maisentier.Savaleurestobtenueparlafonctionposition_min. 2.Reprendrelesspcificationsdesoprationsetlesalgorithmesdjtudisaveccesnouvellesconventions.

- 12 -

ENI Editions - All rigths reserved - Jonifar lina

250

Lorganisationdirecteetlaccsslectif
Dans certaines applications, chaque article contient un attribut particulier qui lidentifie dune manire unique dans lensembledesarticlesquicomposentunfichier.Onappelleclouidentifiantuntelattribut. Dfinition Onappellecldunarticledunfichierunattributquiidentifiedunemanireuniquecetarticledanslefichier. Ainsi, deux articles distincts ont des cls diffrentes et, inversement, deux cls distinctes identifient deux articles distincts. Cette situation est essentiellement diffrente de celle qui fait dun attribut K dun fichier organisation squentielleuneclpermettantdordonnerlesarticles.Eneffet,danscecas,ilpourraitexisterplusieursarticlesayant lammevaleurpourlattributKquinestdoncpasuneclidentifianteausensdeladfinitionprcdente. Lorsque le fichier est implant sur un support adressable et que, de plus, une fonction permet dtablir une correspondance entre la cl dun article et ladresse de lenregistrement associ cet article, on peut accder aux enregistrements dun fichier directement, sans avoir parcourir tous ceux qui le prcdent sur le support. Sur un supportadressable,chaqueemplacementestlocalisparuneadresse.Cependant,enalgorithmique,onconsidreque chaque article est repr par une adresserelative au dbut du fichier et non pas par rapport un support physique programmable.Lacorrespondanceentreuneadresserelativeaudbutdufichieretladresserellesurlesupportest tablie par les primitives daccsausupport.Cesprimitivessontfourniesparlesystmedexploitation et son SGF et nousnavonspasnousenproccuper.Lavantagedunetelleabstractionestquunerorganisationdeladistribution desfichiersdanslesystmenapasdeconsquencesurlesalgorithmesetlesprogrammesdaccsauxdonnes. La suite de cette section ne traite que de deux formes de correspondances entre la cl et ladresse dun article. La premiresectiontudielatechniquedelatabledaccspourdesfichiersstables.Lasectionsuivantetudielamthode desfonctionsderpartition.

1.Correspondancelaidedunetabledaccs
Onconsidreunfichierdefaiblevolume,comprenantpeudarticlesetstable,cestdirevoluantpeu.Ainsi,lesmises jourysontpeufrquentesetlesaccssefontpourlaplupartenlecture.Danscecas,lacorrespondanceentreles clsetlesadressesdesenregistrementsidentifisparcesclsesttablielaidedunetabledaccs.Cestuntableau ordonn selon la valeur des cls quil contient. Ce tableau est enregistr sur le support, avec le fichier quil permet dadresser.Endbutdetraitementsurlefichier,latabledaccsestchargeenmmoirecentrale.Autrementdit,on constituedansunevariabledetypetableaulatabledaccs.Pourchaqueaccsunenregistrement,ondtermine dabordsonadresseeneffectuantunerecherchepardichotomiedanslatabledaccs. Exercice4:Organisationdirecteettabledaccs On considre un fichier clients.txt dont les enregistrements sont structurs par le type CLIENT dfini au chapitre prcdent.Laclidentifiantunenregistrementestlattributnumro. Lefichierestdabordconsidrcommeunfichieraccssquentiel. 1.crirelalgorithmequicalculelatabledaccsetlatrieenordrecroissantdescls. Ladresse dun article sera la position du curseur de lecture lorsquil est plac sous cet article. Dans le fichier, les enregistrementsnesontpasncessairementenregistrsdansunordreparticulierdescls. 2.crirelalgorithmequienregistrelatabledaccscalculedansunfichiersquentielsecondaire. 3.crirelalgorithmequilitlatabledaccsdepuislefichiersecondaireetlareconstituedansunevariabletableau. 4.crirelalgorithmedeparcoursdufichierclients.txtdanslordrecroissantdescls. 5.crirelalgorithmederecherchedichotomiqueduneadressepartirdesacl.

2.Correspondancelaidedunefonctionderpartition
Danslasolutionprcdente,toutemisejourdufichierimposeunerorganisationcompltedelatabledaccs.Cest ce qui explique que cette mthode ne soit adapte qu des fichiers stables, subissant peu de modifications. Une mthode plus efficace, mieux adapte aux diffrents types de fichiers, utilise un adressage associatif, encore appel adressage par table de hachage ou adressage calcul. Cette technique est bien adapte aux recherches dans des lments non ordonns. Cette section prsente une forme simplifie dadressage associatif sur un exemple lmentaire.Ladressagecalculestprsentdanslexercicesuivant. Exercice5:Prsentationdeladressagecalcul

ENI Editions - All rigths reserved - Jonifar lina

- 1-

251

SoitMlensembledesmots{bijou caillou chou genou hibou joujou pou}.Cesontlesmotsdelalanguefranaise quiprennentun x terminalaupluriel.SoitHlafonctiondfiniedeMdanspar:

Cetteexpressionsignifieque,pourunmotmdonn,onadditionnelescodesdescaractresquilecomposentetoncalculele restedeladivisiondecettesommepar10. 1. Crer le tableau H pour y enregistrer les mots de M. Chaque mot occupe la composante dont le numro est la valeur renvoyeparlafonctionH. 2.Commentretrouver,danscetableau,lapositiondunmotdonn?Letempsderecherchedpendildunombredemots delatable? 3. Complter la table en ajoutant les mots coucou, bignou, poux et ventou. Que remarquezvous ? Comment viter ce problme? LafonctionH condense lesclsdetouslesmotssurdixvaleursdiffrentes.Lescollisionssontdonccertaineset invitables ds que le nombre de mots est suprieur 10. En fait, il est impossible de dfinir une fonction de rpartition qui ralise une bijection entre les ensembles considrs. Les notes bibliographiques donnent des rfrencesquitudientdunefaonapprofondielestechniquesdehachage. Soitnlenombredenregistrementsdunfichier.Lafonctionderpartitiondtermine,pourchacunedesvaleursdesn cls,ladresserelativedelenregistrement.Bienentendu,lesystmelogicieldoitrsoudrelescollisionsenproposant unmcanismedegestionadapt.Cestechniquesdpassentlecadredecetteinitiationsimple.Nousnouscontentons delexercicesuivant,quivacueleproblmeenenregistrantlesclsconduisantunecollision. Exercice6:Fichieretfonctionderpartition On considre encore le fichier clients.txt de lexercice prcdent dont on suppose quil contiendra au plus n = 10000 enregistrements.LafonctionHutilise,pourlecalculdureste,undividendedchoisidefaonquelespacelibredanslatable dehachagerestetablienviron30%delespacetotal.Cettepropritestobtenueenchoisissantledividendedesorteque n/d0,7etdpremier. 1.Dterminerunevaleurded. 2.crirelalgorithmedeparcoursdufichierquitablitlacorrespondanceentrelacletlenomdunclient. 3.crirelalgorithmequipermetderechercherlarticleassociunclientenutilisantsonnom.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

252

Problmes
Cettesectionprsentedesproblmesfaisantintervenirdesfichiers.Onproposedaborddeformateruntextequiestla dfinition dun algorithme. La section suivante pose un exercice de calcul sur des statistiques dimport/export. La troisime section montre comment exploiter les rponses un questionnaire dattitude et la section suivante en fait autantpourlesrponsesuneenqutedutilitpublique.Touscesproblmesnesontenfaitquedesprtextespour crire des algorithmes. Mais alors que prcdemment, les algorithmes taient indpendants, ici, ils doivent tre composspourobteniruneanalysecomplteduproblmepos.Deplus,lesproblmesnesontpaspossdunefaon acadmique.Ilsncessitentsouventdtreprcissoucomplts.Ainsi,aucundesexercicesnedonnedindicationsur lesstructuresmettreenplaceettousrestentvaguessurlaformedesdonnestraiter.Enparticulier,onneprcise jamaisletypedefichierutilis.Ilfautdoncfaireuneffortdanalyseetderflexionpourobtenirunesolutionutilisable ensuiteenprogrammation.

1.Formaterunfichiersource
Ondonneunfichiernecontenantquedutexte.Cefichierestunfichierquidfinitunalgorithme.Autrementdit,ilsagit dun fichier source en langage algorithmique . Ainsi, chacun des enregistrements du fichier est une ligne dinstructionsdunalgorithme.Lexercicedemandedeproduireunnouveaufichier,imprimable,contenantlescodesde miseenformedecertaineslignesdelalgorithme. Exercice7:Mettreenformeunfichiersourcepourlimpression Soit un fichier texte dextension.algo par exemple. Il contient les instructions dunalgorithmequelconque,prpardans unesyntaxequelconquelaidedunditeurdetexte.Lditeurproduitunfichiernecontenantquedescaractresstandard dujeudecaractresdelordinateurutilis.Enparticulier,ilnecontientaucunenrichissementdutexte. Onveutcrireunalgorithmequiproduitensortieunfichierdextension.prnmaisquicontient,enplusdutextedufichier source, les codes destins limprimante utilise et qui permettent denrichir le texte pour le prsenter dune faon plus agrablesicenestpluslisible.Ainsi,parexemple,lescommentairesserontimprimsencaractresitaliques,lesmotscls dupseudolangageutilisserontimprimsencaractresbleusetencassegrasse Lorsquelimprimantedoitditerdescaractresparticuliers,commedescaractresitaliquesparexemple,elledoitrecevoir, avantlescaractresconcerns,unesquencedecodesquilabasculedanslemodedimpressioncorrespondant.Uneautre squencedecodeslareplacedanslemodestandard.Ainsi,pourtellepetiteimprimantedebureau,ilfautenvoyerlasuitede codes <ESC>R<DC3> pour quelle imprime en caractres italiques et <ESC>R<VT> pour quelle reprenne la police des caractres normaux. <ESC> est un caractre de code particulier, par exemple 27. De mme, <DC3> et <VT> sont respectivementlescaractresdecode19et11,maiscenesontquedesexemples. 1.Prparerlalistedesenrichissementsquevousenvisagezpourletextesourcedesalgorithmes. Ilfautpeuttreselimiterdansunpremiertempsuneseuletransformation,parexemplecelledescommentaires.Onpeut supposer,parexemple,quuncommentaireestuntextesignalparlunedessuitesdecaractres#,ou//,ou lorsquil tient sur une seule ligne. Il est signal par (* *) ou/* ... */ lorsquil peut stendre sur plusieurs lignes. On peut se limiteraucasouncommentaireestseulsursaligneetolasuitedescaractresquilidentifie est toujours place en dbutdeligne. 2.crirelalgorithmedetraitementdufichiersource.

2.Statistiquesdimport/export
On dispose dinformations relatives aux importations et exportations dun ensemble de pays et on dsire dpouiller cesinformationspourenextraireuncertainnombredindicateurs.Lesinformationsquiconcernentchaquepayssont lesmontantsdesesimportationsetdesesexportations,selon5secteursconomiquesauplus,exprimsenmillions dEuro. Les pays et les secteurs conomiques sont identifis par des nombres entiers. Le schma conceptuel de la figurecidessousmontrelesassociationsentrelespaysconcernsetlessecteursconomiquestudis.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

253

Ceschmaselitdelafaonsuivante.Unpaysimportedans05secteursconomiquestudis.Pourchaquepaire (pays secteur),lassociationIMPORTERdonnelemontantdesimportations.Chaquesecteurconomiquedonnelieu desimportationspour1plusieurspays.Lapartieduschmaquiconcernelesexportationsselitdelammefaon. Lesinformationsrecueilliesonttenregistresdansquatrefichiers.Lepremierestunetabledespays.Lesecond estunetabledessecteursconomiques.Letroisimeetlequatrimesont,respectivement,lefichierdesimportations et celui des exportations contenant, pour chacun et dans chaque enregistrement, les identifiants du pays et du secteur,suividumontantcorrespondant. Exercice8:Exploitationdestatistiquesconomiques 1. crire un algorithme qui cre un fichier dont chaque enregistrement donne, pour un pays, les importations et les exportationsparsecteur. Chaqueenregistrementcomporte,enplus,letotaletlamoyennearithmtiquepourlesimportationsetlesexportations.Un enregistrementsupplmentairedonnelestotauxetlesmoyennespourchaquesecteurconomique,touspaysconfondus. 2.crireunalgorithmequicreunfichierexprimantlesbilanspourchaquepaysparsecteur.Lebilanestladiffrencedes montantsentreexportationsetimportations,ycomprislestotaux. 3.crirelalgorithmequiprendenentrelenomdunpaysetquiretournelesidentifiantsdessecteursconomiquesole montantdesimportationsetdesexportationssontlespluslevspourcepays. 4.Dterminerpourchaquesecteurlepaysquiraliselesmeilleuresperformanceslexportation.

3.Exploiterunquestionnairedattitude
On a soumis des sujets un questionnaire dattitude. Ce questionnaire comporte six items. Les sujets devaient rpondreunequestionparitemetncessairementparOUIouparNON.Chaqueitemtaitformuldesortequune rponse positive exprime toujours un accord avec lattitude mesure. Les rponses ont t rassembles dans un fichierdontchaqueenregistrementcontientunidentifiantnumriquedusujetinterrogetlesrponsesdecesujet chacunedesquestionsposes. Exercice9:Questionnairedattitude 1.crireunalgorithmequiconstitueuntableaudesfrquencescroisesdesrponsesauxitemsprisdeuxdeux. 2.crireunalgorithmequireclasselesdonnesenfonctiondunombrederponsespositivesparsujetetparitem. Pourcela,oncalculeralescoreparindividueneffectuantlasommedesrsultatsparenregistrement.Lesenregistrements serontensuitereclasssparscoredcroissant.Lescoreparitemseraalorscalculetcesscoresserontreclasssparscore croissant.

4.Exploiterlesrponsesuneenqutedutilitpublique
Dans le cadre dune enqute dutilit publique, des sujets ont t soumis un questionnaire comportant huit questions relatives limplantationdune centrale nuclaire. Les rponses positives, cestdire favorables, ont t codes1etlesrponsesdfavorablesonttcodes0.Chaquepersonneinterrogeestrepreparunidentifiant
- 2 ENI Editions - All rigths reserved - Jonifar lina

254

numrique. Exercice10:Enqutedutilitpublique Ondsireraliseruneprexploitationdesrsultatssurlescinquantepremiersenregistrements. 1.crirelalgorithmequiconstitueenmmoireuntableaudesrponsesauxquestionsdattitude. Dans ce tableau, chaque ligne correspond une personne interroge et chaque colonne une rponse une question dattitude. 2.Dnombrerlesrponsesfavorableschaquequestion. 3.crirelalgorithmequiaffichelcranlhistogrammedesfrquencesassociesauxrsultatsdelaquestionprcdente. 4.Calculer,pourchaquepersonne,unenoteglobaledattitudegaleaunombrederponsesfavorablesquelleadonnes. 5.Dnombrerlespersonnesayantobtenuunenoteglobaledonnepuisafficherlhistogrammedesfrquencesassocies chacunedesnotesglobalesobtenues. Ondfinitladistanceentredeuxpersonnescommelenombrederponsesdiffrentesquellesontdonnesauxquestions poses. 6.crirelalgorithmequicalculeladistanceentredeuxpersonnesquelconques.Dterminerladistanceminimumreleveet lalistedescouplesdontladistanceestminimum.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

255

Notesbibliographiques
Commedansdautresdomaines,[KNUTH73]estencoreunerfrenceencequiconcernelesfichiers.Leslivres[CB84], [SED91] et [MB84] sont un peu anciens mais ils restent des livres intressants pour ltude des mthodes algorithmiquesetdeprogrammationdudomaine. LesexercicesdelasectionProblmessontinspirsdunesourcedontjeneretrouvepaslesrfrences.Dixietsalvavi animammeam.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

256

Rsum
Les fichiers permettent dassurer la persistance des donnes. Pour cela, elles sont enregistres sur des supports externesdoellespeuventtrercupres.Cechapitreaprsentlorganisationetlaccssquentielpuisquelques lments concernant lorganisation et laccs slectif. Quelques problmes permettent de sexercer lalgorithmique quiutilisecesfichiers.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

257

Bibliographie
[CB84]G.CLAVEL,J.BIONDI :Introductionlaprogrammation Tome2 :Structuresdedonnes MASSON,1984. [KNUTH73]DonaldKNUTH :TheArtofComputerProgramming,Vol3 SortingandSearching ADDISONWESLEY,1973. [MB84]BertrandMEYER,ClaudeBAUDOIN :Mthodesdeprogrammation EYROLLES,1984. [SED91]RobertSEDGEWICK :AlgorithmesenlangageC INTERDITIONS,1991.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

258

Introduction
Cechapitresintressedestechniquesquipermettentdefairedesprvisions.Bienquelesnotionsabordesrestent lmentaires, le contenu est essentiellement mathmatique. Les lecteurs qui nont pas le got de pratiquer ces activitspeuventpasserauchapitresuivant. Ilexistedesprvisionsdenatureetdeportediffrentes.Onpeutsintresserdesvnementsquiseproduiront invitablement dans le futur. Cest le domaine, par exemple, des prvisions mtorologiques ou des mthodes de calculquicherchentdterminerleparcoursdunastresursatrajectoire.Ondisposedunmodlemathmatiquequi dcrit,plusoumoinsbien,laralitdesphnomnesetquipermetdeconnatrelavance,dansunecertainemesure, leur volution. On peut alors prendre des dcisions qui rgleront notre comportement. On peut vouloir faire des prvisionssurlvolutiondunphnomnequilestimpossibledemettrerellementen uvre.Commentsecomportera lafaunedetelcoursdeauencasdepollutionmassivepardeshydrocarbures ?Quellessontlesconsquencesdun accident davion sur tel quartier de telle ville ? Les phnomnes dont il sagit sontdestructifs et ils ne peuvent tre provoqus volontairement. Lvolution au cours du temps dun processus dynamique, mais qui se droule sur une chelle de longue dure par rapport la dure de vie humaine, fait aussi lobjet de mthodes de prvisions. Elles consistent acclrer le droulement du temps. Cest le cas, par exemple, quand on veut prvoir comment voluera un cosystme, quelles seront les consquences dune activit humaine sur un biotope ? La ralisation de calculs prdictifs sur des phnomnes statistiques ou chaotiques ou, tout simplement, la ralisation des estimations statistiquesdersultatsdterministesmaistropdifficilescalculerfontaussipartieduchampdesproccupationsde ces prvisions. Finalement, nous pouvons, en premire approximation et surtout pour simplifier, classer les phnomnesdontonveutprvoirlesvolutionsendeuxcatgories :
q

les processus dterministes dynamiques dont lvolution est dcrite par des lois physiques connues. La programmationdecesloispermetdentudierlvolution :
q

prvisionsmtorologiques trajectoiredunastre calculdintgralesenphysiqueatomique etc.

lesprocessusalatoiresquivoluentdunefaonstatistique.Ilsagitalorsdepouvoir imiterlehasard pour pouvoirprdire.

Cechapitreprsenteunensembledeproblmesquiillustrentcesdeuxcatgoriesdesimulations.Onmetdaborden place, en section Gnrer des nombres pseudoalatoires, les outils logiciels qui permettront ensuite de rentrer danslevifdusujet.LasectionJeuxdehasardabordelasimulationdequelquesjeuxdehasardsimples.Lasimulation de processus dynamiques est envisage en section Simulation de processus dynamiques. Nous tudions ainsi des exemples simples de courses poursuites, de propagation dune rumeur dans une population, etc. La simulation de processusalatoiresregroupedeuxtypesdeproblmes.NousmontronsdabordensectionSimulationstatistiquede phnomnes dterministes comment obtenir une estimation statistique du rsultat de problmes dterministes, commelecalculde,lecalculdintgralesdfinies,etc.NousmontronsensuiteensectionSimulationdephnomnes alatoires comment simuler des processus totalement alatoires, comme la propagation dune rumeur dans une population ou linfluence de la dispersion des caractristiques des composants dun circuit lectronique sur le fonctionnementdececircuit.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

259

Gnrerdesnombrespseudoalatoires
Dans cette section, nous tudions la gnration de nombres pseudoalatoires qui seront ensuite utiliss dans les autressections.Nousvoulonsdisposerdunesuitedenombresobtenue auhasard .Pourlinstant,cetteexpression signifiequelaconnaissancedetouslesexemplairesdesnombresdjobtenusnepermetpasdedterminerlavaleur du prochain nombre obtenir. Ainsi, par exemple, quand on dispose dune pice de monnaie bien quilibre et que nouslutilisonspourjouer pileouface ,lasuitedesissuesdjobtenuesnepermetpasdeconnatrelersultat du prochain jet. Tout ce que nous pouvons dire est que ce rsultat sera PILE avec la probabilit 0,5 et FACE avec la mmeprobabilit.Lasuitedesissuesobtenuesestalatoire. Prparer un gnrateur automatique de nombres alatoires est impossible. Cependant, il existe des techniques de calcul qui permettent dobtenir des suites qui imitent des nombres obtenus au hasard , au sens dfini prcdemment.Commecesgnrateursengendrentlesnombreslaidedunefonctiondterministe,ilssontqualifis de pseudoalatoires . Lapremiresectiontudiequelquesexemplessimplesdegnrateurs.Cependant,obtenir unesuiteautomatiquedenombresnesuffitpas.Ilfautdisposerdetestsquipermettentdesassurerquelessuites obtenues imitentbienlehasard ,autrement dit quellesontlesqualitsrequisespoursesubstituerauxsuitesde nombres parfaitement alatoires. La deuxime section montre comment raliser quelques tests simples sur de telles suites.

1.Quelquesgnrateurs
Pour gnrer des nombres au hasard , on engendre une suite de nombres (x n )n>0 partir dun nombre initial donnx 0 .Unefonctionmathmatiquefpermetdecalculerxn = f(xn1 ).Onobtientdoncunesuitedenombrespseudo alatoirespuisquelaconnaissancedunlmentxiquelconquedecettesuitepermetdedterminertoutlmentdela

suite.Quelquestestsdelaprochainesectionmontrerontpourquoietquandonpeutaccepterquedetellessuitesse substituent des nombres au hasard. Suivant la fonction f et la racine x0 de la suite, on obtiendra des rsultats videmmentdiffrents,maisdeplusoumoins bonnesqualits .Ilexisteunegrandevaritdechoixpossibleset gnrer des nombres pseudoalatoires de qualit est encore un domaine de recherche. Cette section propose quelquesexemplessimples.

Danstouslescas,legnrateurutiliseunegraine.Cestlenombrex0 quicommencelasuite.Cenombreconditionnela

valeurdeslmentssuivantsetdonc,enpartie,lesqualitsdugnrateur.Ildoittrechoisi auhasard ,cequiest impossible. Cependant, l encore, nous pouvons utiliser des artefacts qui permettent de simuler un tel choix. Nous pouvons, par exemple, utiliser une source naturelle de nombres alatoires, comme une source radioactive ou une suitedejetsdunepicedemonnaieparexemple.Onsaitpourtantquelaplupartdessourcesnaturellesfournissent des donnes biaises ou corrles. Cela signifie soit que la suite obtenue est priodique, soit que certaines issues sontplusfrquentesquedautres.Danslasuite,noussupposonsquunefonctionrelleracinesansparamtrenous fournit en rsultat un nombre alatoire qui nous servira de graine pour le gnrateur. Sa spcification est celle de lalgorithmecidessous. Algorithme1:Spcificationdelafonctionracine

Algorithme racine # Un rel alatoire de ]0, 1[. Rsultat : REL postcondition 0 < Rsultat < 1 Rsultat est un nombre alatoire. fin racine Lappeldecettefonctionpermetdoncdobtenirunegraineetlegnrateurpermetdengendrerlasuitedesnombres pseudoalatoires attendus. Lutilisationdelammegraineaveclemmegnrateurredonnesystmatiquementla mmesuite,cequipermet,enprogrammation,deprocderauxtestsdesapplicationsquiutilisentlesnombresdela suite. Cettesectiontudiedesgnrateursquiengendrentunesuitedenombresuniformmentrpartissurlintervalle]0,1 [.Ici,nousnouscontenteronsdelideintuitivequiexpliquecetteexpression :chacundesrelsdelintervalle ala mmeprobabilit ,quechacundesautresnombresdelintervalle,dtreobtenuparlegnrateur.

a.Le147gnrateur
Le147gnrateurestuneidede[RAD77].tantdonnunrelxi1 quelconquedelasuite,llmentsuivantxiest obtenuenmultipliantxi1 parlenombre147etenextrayantlapartiedcimaleduproduit.Lenombre147estchoisi empiriquementpartirdesqualitsdessuitesobtenuespourdiffrentesvaleurs.Lasuiteestdoncdfiniepar :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

260

La fonction fraction rend la partie dcimale (fractionnaire) du rel quelle reoit en paramtre. La fonction racine permetdobtenir auhasard lagrainedugnrateur. Voiciquelquesexemplesdenombresobtenusaveccegnrateur : x 0 = 0, 141 592 654 => 147 . x 0 = 20, 814 120 14 x = 0, 814 120 14 => 147 . x = 119, 675 660 6
1 1

x 2 = 0, 675 660 6 ... ... Laspcificationdelafonctionfractionestlasuivante : Algorithme2:Spcificationdefraction

Algorithme fraction # La partie dcimale de x. Entre x : REL Rsultat : REL prcondition x0 postconditionRsultat=x[x] fin fraction tant donn un lment x quelconque de la suite engendre partir de la graine, on obtient llment suivant laidedelafonctionhasarddfiniepar : Algorithme3:Fonctiondu147gnrateur Algorithmehasard# lment qui suit x dans la suite alatoire. Entre x:REL Rsultat:REL prcondition Rsultat<fraction(147xx) postcondition Rsultat=fraction(147xx) fin hasard Cette fonction est ensuite appele itrativement pour obtenir les lments successifs de la suite. Voici, titre dexemple,commentengendrer100nombresrelspseudoalatoiresuniformmentrpartissur]0,1[ : ... constante MAX:ENTIER<100# Longueur de la suite produire. variable graine:REL # La graine du gnrateur. ala:REL# Le nombre alatoire obtenu. i:ENTIER # Numro dernier nombre obtenu dans la suite. initialisation graine<racine()# Initialise la suite. ala<hasard(graine)# Gnre le premier nombre. i<1 jusqu i>MAX rpter fairequelquechoseaveclenombreobtenu. ala<hasard(ala)# Nombre alatoire suivant. i<i+1

- 2-

ENI Editions - All rigths reserved - Jonifar lina

261

fin rpter ... Les sections qui traitent des simulations montreront comment transformer et utiliser les suites produites pour en faire quelquechosedutile . Le gnrateur qui vient dtre prsent a surtout le mrite dtre simple implmenter et utiliser. Il ne faut pourtant pas en attendre des miracles. Les qualits des suites obtenues sont plutt moyennes et elles sont sensibles la graine. En particulier, la suite est toujours priodique, parfois avec une priode si faible quelle en devientinutilisable.Legnrateursuivantestbienmeilleur,sanstreparfait.

b.GnrateursdeHamming
Ces gnrateurs forment une famille. Ils obtiennent tous leurs suites partir dune formule de rcurrence de la forme :

dans laquelle les nombres utiliss sont tous des entiers etmodulo est loprateur qui rend le reste de la division euclidiennedesonpremierargumentparlesecond.Lesrelsuniformmentrpartissur]0,1[sontalorsobtenuspar ladivisionrelledeeiparunentiercbienchoisi.LafonctionracineEntirejouelemmerlequelafonctionracine maisenretournantunentieralatoiredansledomainedesentiersreprsentablesparlamachineutilise. Cestlechoixdesvaleurse0,a,b,cetmquiconditionnelesqualitspropresdelasuite.Onpeutmontrerquunbon gnrateurestobtenupour m = 2n - 1 dans lequeln est le nombre de bits par mot du calculateur utilis. Ainsi,m nestautrequeleplusgrandentierreprsentableenmachine.Onchoisitalorsadelaformea = 8 x k 3okest unentierquelconque,b = 0etc = m - 1.Deplus,lenombree0initialdoittreunentierpositifimpair,infrieurm. Onpeutalorsdmontrerqueeiestobtenupar : ... ei<axxi1 si ei<0 alors ei<eim fin si ... Lescalculscidessussupposentquelarithmtiquesefaitmodulomenmachine.Laprocdurehasarddduitedeces formulesestdonneparlalgorithmecidessous.Elleutiliseunestructurededonnesdfiniepar : type HASARD structure e:ENTIER # Racine de Hamming. x:REL # Ala gnr. invariant 0<x<1 fin hasard LavariableecontientladernirevaleurobtenuedanslasuitedesentiersdeHamming.Lenombrexestlenombre alatoireattendu. Algorithme4:DfinitiondelaprocduredugnrateurdeHamming Algorithmehasard # lment suivant x dans la suite alatoire de Hamming de base # ala.e. Entre ala:HASARD constante

ENI Editions - All rigths reserved - Jonifar lina

- 3-

262

k:ENTIER<valeurchoisiepourk a:ENTIER<8xk+3 n:ENTIER<nombredebitsdumotmachine m:ENTIER<2n - 1 # Plus grand entier reprsentable en machine. ralisation ala.e<axala.e si ala.e<0 alors ala.e<ala.em fin si ala.x<ala.e/(m1) postcondition ala.eestlanouvellevaleurdelaracinedeHamming ala.xestlenombrealatoiregnr fin hasard Cependant, cette mthode utilise une arithmtique modulo m. Autrement dit, on suppose que lorsquun nombre atteintlavaleurduplusgrandentierreprsentableenmachine,luiajouter1neprovoquepasderreur,cequinest pasvraiquandonutiliseunlangagedeprogrammationmoderne.Prparerungnrateurutilisabledanscecontexte nousconduiraittroploin.Lesconnaissancesrequisesdpassentdetoutefaonlesobjectifsetlesambitionsdece livre. Pour ceux qui voudraient exprimenter et programmer effectivement les algorithmes proposs, on peut leur conseiller de lire le manuel du langage de programmation adopt. Tous les langages modernes proposent une fonctionquipermetdegnrerdesnombresalatoires. Revenonsnosgnrateurs. Il existe ainsi de nombreuses faons de gnrer des nombres pseudoalatoires. Dans la suite, nous utilisons un typededonnesALAdfinipar : type ALA structure ... x:REL ... invariant 0<x<1 fin ALA LesoprationsapplicablessurunedonneadetypeALAsont :
q

initialiser(a:ALA)estuneprocdurequignrelagraineetinitialiselegnrateur suivant(a : ALA) est une procdure qui gnre le nombre suivant dans la suite engendre par le gnrateur item(a:ALA)estunefonctionquirendlerelalatoiregnrde]0,1[.

Des appels rpts item sans appeler dabord suivant retournent systmatiquement le mme nombre. Pour gnrer100relsalatoires,oncritalors : ... constante MAX:ENTIER<100# Longueur de la suite. variable hasard:ALA nombre:REL # Le nombre alatoire obtenu. i:ENTIER # Nombre de rels dj engendrs. initialisation initialiser(hasard)# Initialise la suite. i<1# Un nombre gnr. jusqu i>MAX rpter suivant(hasard)# lment suivant de la suite. nombre<item(hasard)
- 4 ENI Editions - All rigths reserved - Jonifar lina

263

utilisernombrepourenfairequelquechose i<i+1 fin rpter ... Pourexprimenterenprogrammant,onpeututiliserdecettefaonlundesgnrateursdfinisprcdemmentou celuiquiestimplmentdanstoutcalculateurmoderne.Ainsi,parexemple,lafonctionurandomdunemachinequi excuteUNIXpermetdobtenirdessuitesdenombresalatoiresdequalitsatisfaisante. Exercice1 :Primitivesdegnrationdenombresalatoires 1.crirelesprimitivesdegnrationdenombresalatoiresutilisantle147gnrateur. 2.MmequestionaveclegnrateurdeHamming.

2.Testerunesuitedenombrespseudoalatoires
On donne un gnrateur de nombres alatoires. Ce gnrateur simuletil le hasard dune faon acceptable ? Considronsungnrateurquiapermisdobtenirunesuitedechiffresbinaires,0et1,poursimulerlelancerdune picebienquilibreetsansbiais.Onsattendcequelasuitecontienneautantde0quede1,maiscelanesuffit pas. Ainsi, par exemple, si ce gnrateur donne, pour dix lancers, la suite 0000011111, nous ne pouvons pas prtendre que cette suite est alatoire. Nous devons donc disposer de tests qui vrifient que la suite obtenue possde les mmes proprits quune suite de nombres obtenue au hasard . Voici quelques tests pour un gnrateurquiengendredesnombresuniformmentrpartissur]0,1[ :
q

testdelamoyenne:lamoyennedesnombresobtenusdoittregale0,5 testdelavariance:lavariancedoittregale1/120,083333 testdelhistogramme:lhistogrammedoittreplat testdu2 (Khideux).

Le test de lhistogramme consiste dterminer, pour chaque chiffre de 0 9, la frquence absolue et la frquence relative. La frquence relative doit videmment tre gale 0,1. Pour obtenir les chiffres, il suffit, par exemple, de multiplierchaquenombrealatoirede]0,1[par10etdextrairelapartieentireduproduit : ... suivant(hasard)# Gnrer llment suivant. nombre<item(hasard)# Rcuprer le nombre alatoire. chiffre<entier(10xnombre)# Calculer le chiffre correspondant. ... Lavariablechiffrecontientainsiunentierentre0et9.Ilpeutserviradresserlacasecorrespondanteduntableau quicontientlesfrquencesabsoluesdesdiffrentschiffres. Onpeutaussiengendrerlesnombresdans]0,1[etneretenir,pourchaquenombre,quecertainschiffresdelapartie dcimale.Ainsi,parexemple,onpeutretenirlescinqpremierschiffresdelapartiedcimaledechaquenombreobtenu laidedu147gnrateur.Reprenonsnotreexemple : x
0

= 0, 141 592 654 => 147 x x

20, 814 120 14

x 1 = 0, 814 120 14 => 147 x x 1 = 119, 675 660 6 x 2 = 0, 675 660 6 ... ... Onneretiendraalorsqueleschiffres81412 67566commesuitedechiffresalatoires. Soitnlenombredpreuves,cestdirelenombredentiersalatoiresobtenus.Sionsintresseauxchiffresenbase dix, par exemple, la suite prcdente a permis dobtenir n = 10 chiffres en deux blocs de cinq chiffres. Chacun des nombresobtenusprendunevaleurventre0etm - 1 :0 v < m.Pournotreexemple,m=10etdonc,chaquechiffre prendunevaleurentre0et9. On dispose ainsi, pour chaque tirage alatoire, de m issues possibles de valeurs 0, 1, 2, , m 1. Chaque issue i parmilesmissuespossiblesestapparueunnombredefoisgalfiappelelafrquenceabsoluedelissuei.Ainsi,par exemple,surn = 1000tiragesalatoiresdenombresdans[0,10[,onauraobtenupeuttre97foislechiffre6etalors

ENI Editions - All rigths reserved - Jonifar lina

- 5-

264

f6 = 97. LetestduKhideuxconsistevrifierqueladistributiondesrsultatsest raliste , cestdirequelleimitebien unedistributiondersultatsalatoires.Ainsi,danslexempleprcdent,nousdevrionsobtenirunefrquencef igale

100pourchacunedesissuesi maissinousvoulonsquelasuiteaitlespropritsdunesuitealatoire,nousne devonspasobtenirdesfrquencestoutesexactementgaleslavaleurthorique100.Lobtentionduntelrsultat parfaitdevraitfairesuspecterungnrateurbiais.Pourraliserletest,oncalcule :

La valeur obtenir doit tre proche de m. Il faut encore donner un sens lexpression proche de m. En pratique,onadmetquelasuiteestacceptablelorsque2estunedistancedeminfrieureaudoubledelaracine carredem,soit :

Ainsi,toujourspourlemmeexemple,nousdevonsobtenir :

soit3,68 < 2 < 16,32. Exercicersolu1:Testsdungnrateurdenombrespseudoalatoires crirelesalgorithmespermettantderaliserlespremierstestsdungnrateur. Solution Cette solution ne prsente que lalgorithme permettant dobtenir le nombre 2 car cest le seul calcul qui soulve quelquesdifficults. Onpeutmontrerfacilementquelaformuledecalculsemetsouslaforme :

Lecalculestralisparlalgorithmesuivant : Algorithme5:Calculdu2 Algorithmekhi2 # Le khi2 des composantes de f. Entre f:TABLEAU[REL]# Tableau des frquences absolues. n:ENTIER # Nombre de valeurs (issues) des tirages. m:ENTIER # Nombre dissues. Rsultat : REL ... variable somme:ENTIER # La somme des carrs des frquences. i:ENTIER # Le numro de la prochaine case additionner. produit:REL# khi2 x n. rn:REL# n converti en rel. initialisation

- 6-

ENI Editions - All rigths reserved - Jonifar lina

265

somme<0 i<0 jusqu im invariant i=0=>somme=0 i>0=>somme=(f[0]2+f[1]2+f[i1]2) variant de contrle mi rpter somme<somme+f[i]xf[i] i<i+1 fin rpter produit<rel(sommexn) rn<rel(n) Rsultat<(produit1)/rn ... fin khi2 La fonction rel est une fonction de conversion de type. Elle transforme un entier en nombre rel de sorte que la divisionsoitladivisiondesrelsetnonladivisioneuclidienne. Ilexistedenombreuxtestsdegnrateursetceuxquiprcdentsontparmilesplussimples.Ilnestvidemmentpas question dtudier ce domaine ici, mais un dernier test, le test du poker, permettra de dterminer dautres caractristiquesdugnrateurchoisi. Letestconsisteregrouperleschiffresgnrsparblocsde5.Latablecidessousdonnelesprobabilitsthoriques desdiffrentesfiguresobtenueslorsquelegnrateurestparfait. Figure Probabilit 0,3024 0,5040 0,1080 0,0720 0,0090 0,0045 0,0001

5chiffresdiffrents 1paire 2paires brelan full carr 5chiffresidentiques

Lebrelanestconstitudetroischiffresidentiques.Lefullestconstitudunbrelanetdunepaire.Enbasedix,ilexiste 10 5 tranchesdecinqchiffresetchacunealaprobabilit105 dapparatre. Exercice2:Testdupoker crire les algorithmes permettant de remplir un tableau donnant, pour chaque figure du test du poker appliqu un gnrateur,laprobabilitthoriquedelafigure,lafrquenceabsolueetlafrquencerelativedesonapparition. La solution de lexercice prcdent nest pas simple, notamment parce que les motifs rechercher dans chaque tranchedecinqchiffresnesontpasfixs.Onpeutpasserdirectementlexercicesuivantpouruneinitiation. Exercice3:Unautregnrateur Onobtientdesnombrespseudoalatoiresenengendrantlesnombresdelasuitedfiniepar :

ENI Editions - All rigths reserved - Jonifar lina

- 7-

266

1.crirelesalgorithmesquiimplmententcegnrateur. 2.crirelesalgorithmesdetests.

- 8-

ENI Editions - All rigths reserved - Jonifar lina

267

Jeuxdehasard
1.Simuleruneroulette
Considronslarouletteschmatiseparledessindelafigurecidessous.

Elle symbolise le fait que les deux issues {0,1} ont la mme probabilit 0,5 de sortir. On sait obtenir des nombres alatoires uniformment rpartis sur lintervalle ]0,1[ depuis la section prcdente. Comment obtenir des nombres entiers alatoires dans {0,1}, chaque issue ayant la mme probabilit que toute autre ? Les rels x que nous savons obtenirsonttelsque0<x<1.Ilsuffitdoncdesortir0pourtoutevaleurdexentre0et0,5ou1pourtoutevaleurde xentre0,5et1.Lafigurecidessousschmatisecequenousvoulonsobtenir.

Lesnombresgnrssontquiprobables.Parconsquent,xappartientlintervalle]0 0,5]aveclaprobabilit0,5et lintervalle[0,5 1[aveclammeprobabilit.Sionajoute0,5x,lersultatappartientlintervalle]0,5 1,5[etla partieentiredursultatvaut0ou1aveclaprobabilit0,5.Cestcequenousvoulons.Lafiguresuivantereprsente cettesituation.

Soitentierlafonctionquiretournelapartieentiredesonargument.Leprincipealgorithmiquedesimulationdune roulettequitableestdoncsimple : ... variable a : ALA# La structure maintenue par le gnrateur. x : REL # Un exemplaire du rel alatoire gnr. issue : ENTIER # Une valeur entire gnre. ... # Initialiser le gnrateur. initialiser(a) # Gnrer un rel alatoire dans ]0, 1[. suivant(a) # obtenir un exemplaire du rel gnr. x <- item(a) # Faire tourner la roulette quitable. issue <- entier(x + 0,5) ... Uneroulettenestpasquitablelorsquelesissuesnontpaslammeprobabilit.Considronslafiguresuivante :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

268

Elledonnelissue1aveclaprobabilitpetlissue0aveclaprobabilit1 p.Pourobtenirlissue1aveclaprobabilit p,ilsuffitdecalculerlapartieentiredex + p,avec0 < p < 1. Exercice4:Estimationduneprobabilitparsimulation Onconsidrelesdeuxroulettesprcdentes. 1.crirelesalgorithmesdestestsdesroulettes. Ceuxquiprogrammenteffectivementpourrontessayerp=0,4puisp=0,1pourlaroulettedelafigurecidessus. Onfaittournercesdeuxroulettesautantdefoisquilestncessairepourestimerlaprobabilitquelapremiredonneun1 avantlaseconde,cestdirequelapremiredonne1alorsquelautredonne0.Pourcela,onfaittournerchaqueroulette, tour de rle, 1000 fois et on note les rsultats : lestimation de la probabilit cherche et le rapport nombre dissues favorables divis par le nombre dessais (ici 1000). Ainsi, par exemple, si jai obtenu que la premire donne 1 alors que lautredonne0dans32cas,laprobabilitchercheest0,032. 2.crirelalgorithmedecettesimulation. Pourobtenirdesnombresrelsalatoiresuniformmentrpartissurunintervalle]a, b[,oncalcule(b a) x x + a.On parlealorsdedistributionrectangulaire. Exercice5:Simulationduneroulettetroisissues. Onveutsimulerlesroulettesdesfigurescidessous.

[roulettedegauche][roulettededroite] 1.crirepourchacunedelleslalgorithmequipermetdesimuleruntirage. 2.crirelalgorithmedunesimulationdechacunedellespourobtenirlesfrquencesdesdiffrentesissues. Remarquezque,pourlaroulettedegauche,ilsagitdengendrerdesnombresdanslintervalle]0, 3[.Ilsuffitdoncde calculerlapartieentirede3 x xpuisque,ici,b = 3eta = 0.Pourlaroulettededroite,oncalculelasommedesparties entiresdesnombresx + 0,5etx + 0,25.

2.Simulerund
Exercice6:Jeudedsdeuxjoueurs Ilsagitdejouercontreunemachine.MestlamachineetellejouecontreN.Mlanceundbienquilibr.Cestalorsautour
- 2 ENI Editions - All rigths reserved - Jonifar lina

269

deNdejouer.Maisavantdelancersond,NdoitprdiresilferamieuxoumoinsbienqueM.SiNfaitunebonneprdiction, ilmarqueunpoint sinon,cestMquimarquelepoint. 1.ExistetilunestratgieoptimalepourlejoueurN ? Njoueselonlastratgieoptimalereconnuelaquestionprcdente. 2.EstimerparsimulationlaprobabilitquaNdegagner. Lalgorithmedoitdonnerlenombredepointsgagnsparchaquejoueurchaquetour. 3.(Questionhorscontextepourcelivre)Fairejouerdeuxmachineslunecontrelautre.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

270

Simulationdeprocessusdynamiques
Cettesectiontudiedeuxexemplesdontlanaturedevraitpermettredecomprendreenquoilesmthodesdessections suivantessontoriginales.Cesdeuxexemplesnapparaissentdoncquecomme fairevaloir des sections suivantes. Lepremierexempletudielapropagationdunerumeurdansunepopulation.Lesecondmontrecommentreprsenter uncassimpledecoursepoursuite.

1.Propagationdunerumeur
Soitunepopulationhumainehomognedenindividusdanslaquelleunerumeursepropagedeboucheoreille.On supposequetoutepersonneayantconnaissancedelarumeurlapropagejusqucequellerencontreunepersonne quilaconnatdj.Ellecessealorsdelapropager.Nousnousintressonslvolutiondeseffectifsdesdiffrentes classes dindividus dans la population. La rumeur steindra, mais atteintelle tout le monde ? Quel pourcentage de la populationrestetrangercetterumeur ? Pourraliserunesimulationdynamiquedelapropagation,onfaitdeshypothsessurlafrquencedesrencontresde chaque type dindividu. Posons ignore(t) leffectif de la population qui ignore la rumeur linstant t. On note, de mme,connat(t) leffectifdeceuxquilaconnaissentmaisnelarpandentplusetrpand(t)leffectifdeceuxquila rpandent.toutinstantt,ona : connat(t) = n - (ignore(t) + rpand(t)) Pendant un intervalle de temps (une dure) t, les effectifs ignore(t) et rpand(t) voluent en ignore(t+t) et rpand(t+t). Les contagions se produisent lors de rencontres de type ignore <> rpand qui sont au nombre de ignore(t) x rpand(t)etlavariationdeseffectifscorrespondantspourunpetittestproportionnelleceproduit. Nouspouvonsdonccrire : ignore(t+t) = ignore(t) - a x ignore(t) x rpand(t) oaestuncoefficientdeproportionnalitconstant,fixdavance. Les immunisations se produisent lors de rencontres de type (rpand <> rpand) ou (rpand <> connat). Les nombres de telles rencontres sont, respectivement, de rpand(t) x 0,5 x (rpand(t) 1)et rpand(t) x connat (t).Dansunerencontredetype(rpand <> rpand),deuxpersonnespassentsimultanmentdanslecampconnat. Lavariationdunombredimmunisationsestdoncproportionnelle : I = rpand(t) x connat(t) + 2 x rpand(t) x 0,5 x (rpand(t) - 1) OnpeutfacilementdmontrerqueIestdonnpar : I = rpand(t) x (n - ignore(t) - 1) Pendantuneduret,lefluxprovenantdeignorefaitaugmenter rpand(t)dea x ignore(t) x rpand(t).Leflux provenantdeconnatlefaitdiminuerdea x rpand(t) x (n ignore(t) 1).Ilenrsulteque,toutcalculfait : rpand(t+t) = rpand(t) - a x rpand(t) x (n - ignore(t) - 1) Unetudesimplemontreque,pourignore(t)variantden0,5 x (n 2),rpandaugmenteetdiminueensuitepour atteindrelavaleur0. Exercice7:Simulationdynamique:propagationdunerumeur Onsupposeque,initialement,ignore(0) = n - 1etconnat(0) = 0.Onchoisit auhasard lapersonnedelapopulation quicommencerpandrelarumeur. 1. crire un algorithme qui calcule priodiquement les effectifs de chaque classe de la population et le rapport ignore / rpand. Pourceuxquiprogrammentunordinateur : 2.Raliserlessimulationsaveclesdonnessuivantes : n = 100 ; a = 10 - 4 ;

n = 1000 ; a = 10 - 4 ;

ENI Editions - All rigths reserved - Jonifar lina

- 1-

271

n = n =

100 ; a = 10 - 3 ; 10 ; a = 10
-3

Onconsidrecettefoislesindividusrpartisdansunefiledattentedanslaquellelesseulesrencontrespossiblessontcelles entrepersonnessuffisammentproches.Ondiraquunerencontreestpossibleentrelesindividusxetylorsque|x - y| eoeestleseuilderencontresfixdavance. 3.crirelalgorithmequiralisecettesimulation. Les individus dune population de n x n personnes sont rpartis dans un carr. Les seules rencontres qui peuvent se produiresontcellesentredeuxpersonnes(x1, y1)et(x2, y2)dontladistancevrifie : |x1 - x2| + |y1 - y2| e Ondcideaussidunombredepersonnesrpandantinitialementlarumeuretdeleurpositiondanslapopulation. 4.crirelalgorithmequiralisecettesimulation.

2.Coursepoursuite
Unrenardpoursuitunlapinquitentedeluichapper.Ilssedplacentparbondssuccessifsdelongueurconstante.On simplifieencorelasimulationensupposantquechacunbonditsontour,enalternance.Deplus,leschangementsde directionnesefontquelorsdelafindunbond. Le lapin suit une trajectoire rectiligne, sur laxe des ordonnes du repre cartsien du plan dont lorigine est sa positioninitiale,t=0.Lesseulespositionsintressantessontcellesdesdeuxanimauxavantouaprsunbond.La positiondulapinaprslesautnumroi,pouri = 0, 1, 2estlepointL(i)decoordonnesL(i) = (0 zi).Celledu renard est le point R(i) = (xi yi). En chaque point R(i) depuis sa position initiale R(0), le renard bondit dune longueurconstantel(R)endirectiondulapin.Lelapinbonditdunelongueurconstantel(L)surlaxedesordonnes. Lafigurecidessousreprsentequelquespasdelasimulation.

Lasimulationconsistetracerlestrajectoiresrespectivesdulapinetdurenardjusqucequeceluicicaptureceluil. Exercicersolu2:Coursepoursuiterenardlapin

- 2-

ENI Editions - All rigths reserved - Jonifar lina

272

crirelasimulationdelacoursepoursuiteentrelerenardetlelapin. Solutionpartielle LechapitreStructureslmentairesadjabordlesalgorithmesdedessin.LestypesPOINTetSEGMENTyontt dfinis.Ilspermettentdestracslmentaires.Ici,ilrestemontrercommentcalculerlespositionsrespectivesdes deuxanimauxaprschaquesaut.ChaquepointL(i)i 0apourcoordonnes(0 z i) i 0etchaquepointR(i)i 0a pourcoordonnes(x i yi)i0.Aprslesauti 1,ladistancequisparelelapindurenardestdonnepar :

Ilnestpasdifficilededmontrerlesformulessuivantes :

Soitpoursuitelaprocdurequiraliselestracsdecettesimulation.Sasignatureest : poursuite ( R, L : POINT # Positions initiales du renard et du lapin. LR, LL : REL # Longueur de leurs sauts respectifs. ) Lanalysedepremierniveauconduitlalgorithmesuivant : Algorithme6:PoursuitedurenardetdulapinVersion1.0

... Calculer la distance d entre R et L. # R et L sont les positions courantes du renard et du lapin # respectivement. # Le renard fait un bond de R R1 puis occupe R1. Calculer R1 Tracer segment(R, R1) R <- R1 # Le lapin fait un bond de L L1 puis occupe L1. Calculer L1 Tracer segment(L, L1) L <- L1 ... Cettesuitedecalculsestrpterjusqucequelerenardrejoignelelapin,ouquilesttabliquilnelerejoindra jamais.Lerenardlattrapelorsqueladistancequilesspareestinfrieurelalongueurdunsaut :d < l(R).Ilnele rejoindrajamaissiladistancequilesspareaugmente.Lerestenestpasdifficile. Une simulation sur le mme principe, moins cruelle mais bien plus belliqueuse, consiste tracer les trajectoires respectivesdunavionetdunmissile. Exercice8:Poursuitemissileavion Unavionvolehorizontalementvitesseconstantev_aunealtitudeh.linstantt = 0,unmissileesttirloriginedu repreendirectiondelavion.Ilvoleunevitesseconstantev_m.Lavionesttouchlorsquelemissilepntredansune sphrederayonrcentresurlavion.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

273

On suppose dabord que la trajectoire du missile est rectiligne, selon un angle par rapport lhorizontale et que cette trajectoirenepeutplustrecorrigelorsquelemissileestparti. 1.crirelesalgorithmesquipermettentdetracerlestrajectoiresdelavionetdumissile. Onsuppose,prsent,quelemissileestcapabledecorrigerautomatiquementsatrajectoirepoursedirigerverslavion. 2.Modifierlasolutionprcdenteenconsquence.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

274

Simulationstatistiquedephnomnesdterministes
Danscettesection,nousproposonsdesexercicesdcrituresdalgorithmesquimontrentcommentestimerdesrsultats parfaitementdterministesenutilisantdesnombrespseudoalatoires.Nouscherchonsdoncobteniruneestimation statistiquedersultatsquinedpendentpasduhasard.Lesmthodesmisesen uvrerelventdemthodesditesde MonteCarlo en rfrence lunivers des jeux de hasard qui ont fait la rputation de la ville du mme nom. Ces mthodes sont apparues comme outils de recherche pendant la seconde guerre mondiale afin de simuler le comportementdesneutronsdanslesmatriauxfissiles.Ellessontemployes,parexemple,pourcalculerdesintgrales multiplesditesintgralesdeconfiguration. LasectionCalculermontrecommentcalculeruneestimationdunombre.Lamthodeutiliseestuncasparticulierde calculdintgralesdfinies,prsentlasectionvalueruneintgraledfinie.

1.Calculer
On donne un disque (D) de rayon r. Nous savons calculer son aire. CestA(D) = x r2 . Maiscombien vaut ? Cette sectionmontrecommentobtenirunevaluationstatistiquedelavaleurde. estlairedundisquederayonr = 1.Cedisqueestinscritdansuncarr(C)dectc = 2etdontlaireestA(C) = 4. Lafigurecidessousreprsenteledisqueetlecarrdanslequelilestinscrit.

On choisit au hasard un grand nombre de points, disons N = 10000, dans le carr. Parmi ces N points, n tombent dansledisque.Commelespointssontquiprobables,onaquelenombredepointsdansledisqueest proportionnellairedudisque.Autrementdit,ona : A(D) / A(C) = n / N => A(D) = (n / N) x A(C) Posons<>lestimationde.CommeA(D) = etA(C) = 4,onobtient : <> = 4 x (n / N) Parconsquent,lerapportn / Nestuneestimationde/4.Mais/4estlaireduquartdedisquederayonr = 1, commelemontrelafiguresuivante :

ENI Editions - All rigths reserved - Jonifar lina

- 1-

275

Ilestdoncquivalentdechoisirlespoints auhasard danslecarrdectc=1pourobteniruneestimationde /4.Lestimation<>estalorsobtenuepar : <> = n / (N / 4) Ainsi,pourN = 10000points,onobtient<> = n / 2500. Exercice9:Estimationstatistiquede Choisir un point M auhasard dans le carr de ct c = 1 consiste gnrer deux rels alatoires de [0, 1] pour ses coordonnesxety.Lepointobtenuestdansledisquesietseulementsix2 + y2 1. 1.crirelesalgorithmesquipermettentdestimerstatistiquement. RemarquezqueMestdanslequartdedisquelorsqueentier(x2 + y2) = 0.Ilestlextrieurduquartdedisquelorsquela partieentirevaut1.OnpeutviterlestestsenremarquantquepourchaquepointMgnrona : n <- n + 1 - e n t i e r ( x 2 + y 2 ) 2.Modifierlesalgorithmesobtenuslaquestionprcdentepourtenircomptedecetteremarque.

2.valueruneintgraledfinie
Cettesectionestlargementinspirede[PEL97]. On donne une fonction f dfinie sur un intervalle [a, b]. On demande destimer statistiquement le nombre I donn par :

Onsaitqueceproblmerevientvalueruneaire.Lafigurecidessousillustrelasituation.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

276

Iestdonclairedontlafrontireestlapartiedugraphedefentref(a)et f(b),lesdroitesx = aetx = betenfin laxedesabscisses.Soitalors(x i)1inunesuitederelsalatoiresuniformmentrpartissurlintervalle[a, b].On dmontreque,lorsquenestsuffisammentgrand :

Nous savons gnrer des nombres alatoires distribus uniformment sur un intervalle donn. Par consquent, valuerneprsentepasdedifficult.Lalgorithmedeprincipeestlesuivant : ... i <- 1 # Rang de la prochaine valuation. somme <- 0 # f(x1)+f(x2)+...+f(xi). jusqu i > n rpter gnrer un rel alatoire x dans [a, b] somme <- somme + f(x) i <- i + 1 fin rpter <- (b - a)/n x somme ... Exercice10:valuationstatistiquedintgrales Utiliserlamthodeexposecidessuspourvaluer :

LecalculdeI1estenfaitceluide / 4.I2estgal0,5etI3 0,729 635 856.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

277

Simulationdephnomnesalatoires
1.lachasseauxmouches
Cettesectionpourraitsintituler :lehasardauservicedunenvrose ! Onveutattraperdesmouchespourlesenfermerdansunbocal.Lesraisonsduntelcomportementneconcernentpas ce livre : dressage, exprimentation scientifique, etc. chaque capture, il faut ouvrir le couvercle du bocal pour enfermerlanouvellemouche.Maisalors,chacunedesmouchesprisonnires,ycomprislanouvelle,peutschapper, disons avec la probabilit p. Combien de mouches fautil attraper, en moyenne, pour obtenir un nombre n de prisonnires ? Il sagit de simuler un certain nombre de telles parties de chasses pour obtenir une estimation statistiquedunombremoyendemouchesattraperpourconstituerunecollectiondenexemplaires. Il est clair que la simulation, dans la mesure o elle fournit une estimation fiable du rsultat attendu, est la seule pratiqueexprimentalepossible.Bienentendu,leproblmeestsuffisammentsimplepourtrersoluexactementpar lecalcul,maiscenestpasnotrepropos :nousvoulonscriredesalgorithmesdesimulations. Exercicersolu3:Simulerunechasseauxmouches Poursimulerunecapture,ilsuffitdefairetournerlaroulettedeuxissuesquisortlissue1aveclaprobabilitpetlissue0 avec la probabilit (1 p). La roulette est lance pour chaque mouche prisonnire afin de dterminer si elle schappeou non.videmment,elleschappelorsquelaroulettesort1. SimulerNchassespourcapturernmouchesaucoursdechacunedelles.Estimerlenombremoyendemouchescapturer. Solution Onveutsimulerlacapturedenmouches.Soitchasselalgorithmequisimuleunepartiedechasse.Ildoitconnatrele nombrendemouchescaptureretlaprobabilitpdvasiondunemouchecapture.Ilretournelenombretotalde mouches captures pour en obtenir n. Cest donc une fonction dont la spcification est donne par lalgorithme suivant. Algorithme7:Spcificationdelafonctionchasse

Algorithme chasse # Une chasse pour capturer n mouches. Chacune peut svader avec # la probabilit p. Rend le nombre total de mouches captures. Entre n : ENTIER # Le nombre de mouches attendues. p : REL # La probabilit dvasion dune mouche. Rsultat : ENTIER prcondition n0 0p<1 postcondition Rsultat=nombretotaldecaptures fin chasse Laprconditionimposequeprestestrictementinfrieur1.Eneffet,uneprobabilitdvasionde1conduiraitune simulationdedureinfinie. Lanalysedelitrationestsimple. Faireunehypothsesuruntatintermdiaire Dansuntatintermdiaire,uncertainnombredemouches,disonsi,sontenfermesdanslebocal.Pourenarriverl, ilafallucapturerdesmouchesdontcertainesontrussischapper.SoitRsultatlenombredemouchescaptures pourfaireiprisonnires. Hypothse(H) :imouchessontenfermesdanslebocal.Rsultatestlenombredecapturesralises. RemarquezquilnestpaspossibledcrireRsultat = chasse(i, p).Eneffet,lersultatrenvoyparlafonctionchasse est alatoire et rien ne dit quun appel cette fonction avec les arguments i et p donnera la valeur actuelle de Rsultat.Cettevaleurestobtenue au hasard .

ENI Editions - All rigths reserved - Jonifar lina

- 1-

278

Voirsicestfini Cest fini lorsque i = n. L encore, on ne peut pas utiliser n - i, le nombre de mouches qui doivent encore tre captures,commevariantdecontrle.Cenombreestbienladistancelasolution,maiscenestpasunvariantde contrledelitrationcarilnedcrotpasvers0dunefaonmonotonecausedesvasions.Enfait,cettedistance prenddesvaleursalatoiresetelleconvergevers0statistiquement.tudierleproblmesrieusementdpasseles objectifsdecelivre. Serapprocherdeltatfinal Lorsquecenestpasfini,onserapprochedeltatfinalencapturantunenouvellemoucheetenlenfermantdansle bocal : capturerunenouvellemouche:Rsultat<Rsultat+1 introduirelamouchedanslebocaletajusteri recommencer Initialiserlecalcul Ltatinitialcorrespondunbocalvideetaucunemouchenaencoretenferme : ... initialisation Rsultat<0# Nombre de captures ralises. i<0# Nombre de mouches dans le bocal. ... Rdigerlalgorithmedfinitif Nousobtenonslalgorithmecidessous. Algorithme8:Dfinitiondelafonctionchasse Algorithmechasse # Une chasse pour capturer n mouches. Chacune peut svader # avec la probabilit p. Rend le nombre total de mouches # captures. Entre n:ENTIER # Le nombre de mouches attendues. p:REL # La probabilit dvasion dune mouche. Rsultat:ENTIER prcondition n0 0p<1 variable i:ENTIER initialisation Rsultat<0# Nombre de captures ralises. i<0# Nombre de mouches dans le bocal. jusqu i=n rpter # Capturer une nouvelle mouche.Rsultat<Rsultat+1 # Lintroduire dans le bocal. i<iintroduction(i+1,p)+1 fin rpter postcondition Rsultat=nombretotaldecaptures fin chasse La fonction introduction simule lintroduction dune mouche dans le bocal. Elle calcule et retourne le nombre de mouchesquiparviennentschapper.Pourcela,elleutiliselarouletteadeuxissuesdjprsente.Pourchaque mouche prisonnire, lalgorithme fait tourner la roulette. La mouche svade lorsque la roulette sort lissue 1 soit ROULETTE le type de donnes permettant dimplanter le gnrateur. Lalgorithme suivant dfinit la fonction

- 2-

ENI Editions - All rigths reserved - Jonifar lina

279

introduction. Algorithme9:Introductiondunemouchedanslebocal Algorithmeintroduction # Introduit un mouche dans le bocal qui en contient dj n - 1. # Chacune schappe avec la probabilit p. Retourne le nombre # de mouches qui schappent. Entre n:ENTIER # Nombre de mouches obtenir. p:REL # Probabilit dvasion dune mouche. Rsultat:ENTIER# Nombre dvasions prcondition n0 0p<1 variable i:ENTIER # Nombre de mouches traites. r:ROULETTE initialisationRsultat<0# Nombre dvasions. i<0# Nombre de mouches traites. # Initialiser le gnrateur de la roulette. r.p<p initialiser(r) jusqu i>n invariant ... variant de contrle ni+1 rpter suivant(r) Rsultat<Rsultat+item(r) i<i+1 fin rpter postcondition Rsultat=nombredvasions fin introduction Cettefonctioncalcule,pourchaquemouche,sielleschappeounon.Elleretournelenombredvasions,cestdire le nombre dissues gales 1 dans une suite de n essais. Lorsque n est exactement le nombre de captures attendues,cestdirelorsquelebocalcontientdjn - 1mouches,lachasseseterminesiintroductionretourneun rsultat nul, donc si la roulette utilise produit n issues toutes gales 0. Ceci suggre un autre exercice de simulation :quelleestlalongueurmoyennedunesuitedissuesidentiquesdansunensembledetiragesdelaroulette ?En fait,cestceproblmequiest habill enunechasseauxmouches. Le problme suivant, appel problme de Banach, met en jeu un fumeur de cigarettes (fumer tue, mais nous simulons !).Ceproblmesersoutcommeleprcdent. Exercice11:LesallumettesdeBanach Unfumeurpossdedeuxbotesdedallumettes,lunedanslapochedroiteetlautredanslapochegauchedesaveste.La bote dans la poche droite contient d allumettes et celle dans la poche gauche en contient g. Lorsquil veut allumer une cigarette,ilchoisitunepoche auhasard etallumesacigarette.Combienrestetildallumettesdanslautrebotelorsquil constatequelabotequilachoisieestvide ? 1.crirelesalgorithmesdesimulationlorsquilchoisitluneoulautrepocheaveclammeprobabilit. 2.Mmequestion,maislefumeurestgaucheretchoisitdonclapochegaucheplussouventquelapochedroite. La deuxime question doit tre prcise et il faut dabord donner un sens lexpression [il] choisit donc la poche gaucheplussouventquelapochedroite .

2.Propagationdunerumeur
La section Simulation de processus dynamiques a montr comment tudier lvolution dune population dindividus danslaquellecirculeunerumeur.Onconnaissaitlesloisquirgissentlacirculationdelinformationdanslapopulation.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

280

La simulation a consist appliquer mcaniquement ces rgles dvolution pour obtenir les tats successifs de la population. Le mcanisme dvolution tait parfaitement dtermin par les rgles appliques et la simulation a consistacclrerladiffusiondelarumeur.Danscettesection,nousreprenonslammetude,maiscettefoisen appliquantlesrglesdvolution des individus qui entrent en interaction au hasard .Concrtement, on gnre deux entiers alatoires qui identifient deux individus de la population et on applique les rgles dvolution de la simulationdynamique. Exercicersolu4:PropagationdunerumeurSimulationalatoire Onsintresseaunombrederencontresncessairespourquelarumeursteigneetauxeffectifsdesdiffrentsgroupesde populationlorsquelledisparat. crirelesalgorithmespermettantderalisercettesimulation. Solution On considre donc une population compose dindividus identiques. Chaque individu est caractris par un tat capturparlavaleurdunevariabletatdutypeTAT,dfiniparlnumration : type TAT dfiniparlnumration {ignore,rpand,connat} fin TAT Ltat global de la population est captur par trois compteurs entiers dont la valeur est le nombre dindividus de la population dans chacun des tats du type TAT. La figure cidessous est un schma conceptuel qui montre lassociationentreunepopulationetlesindividusquilacomposent.

Une population nexistepasindpendammentdesindividusquilacomposent dolelosangenoirquenousavons dj rencontr. Une population est compose dun ou de plusieurs individus. Les instances dINDIVIDUs qui composentunepopulationdonneformentunensemble,unecollection,personnesdePERSONNEs.Unindividudonn participelacompositiondunepopulationunique,dumoinsdanscetexemple.Lamultiplicit1ductpopulationest implicite. Cependant, ce schma ne caractrise pas encore entirement les proprits de cette population. En effet, ltat de la population est reprsent par les valeurs des variables du schma, mais ces variables ne sont pas quelconques.Entoutescirconstances,toutinstant,lasommedeseffectifsdestroisgroupesdindividusestgale latailledelapopulation,cestdireaunombrede personnesquilacomposent.Soitcardinallafonctionentirequi rendlenombredlmentsdelacollectionquellereoitenparamtre.Ici,ceserapersonnes.LentitPOPULATION estcaractriseparlinvariant : invariant ignore + rpand + connat = c a r d i n a l (personnes) Onsupposedoncqueleffectifdelapopulationresteinvariablependantladuredelasimulation.Linvariantdevrait treprcisdansladernirecaseduschmaquireprsentelentitPOPULATION. NouspouvonsdjdfinirletypeINDIVIDU : type INDIVIDU structure tat:TAT fin INDIVIDU PourdfinirletypePOPULATION,ilfautdciderdelastructurededonnesutiliserpourimplanterlespersonnes. Nous navons pas le choix : nous nen connaissons que deux, la chane de caractres et le tableau. Utilisons un tableau :

- 4-

ENI Editions - All rigths reserved - Jonifar lina

281

type POPULATION structure personnes:TABLEAU[INDIVIDU][1,n] ignore:ENTIER rpand:ENTIER connat:ENTIER invariant ignore+rpand+connat=cardinal(personnes) cardinal(personnes)n fin POPULATION La simulation consiste initialiser la population en choisissant une personne qui commence rpandre la rumeur. Noussimulonsalorsdesrencontresentredeuxpersonnesengnrantalatoirementdeuxentiersentre1etcardinal (personnes).Cesentierssontlesnumrosdescasesdespersonnesquiserencontrentdansletableaudesindividus. Onappliquealorslesrglesdvolutionutiliseslorsdelasimulationdynamique. Lalgorithmeprincipalinitialiselasimulationpuisorganiselesrencontresensurveillantlenombredespersonnesqui rpandentlarumeur. Initialiserlasimulation jusqu unnombrenuldepersonnesrpandantlarumeur rpter calculerunerencontre mettrejourltatdelapopulation compterunerencontredeplus fin rpter ... SoitALA_ENTIER,letypededonnesutilisesparlegnrateurdenombresalatoirespourproduiredesentiers uniformmentrpartissurunintervalledonn[a, b].Autrementdit,chacundesentiersdelintervallealaprobabilit 1 / (b a+1)dtretir.Legnrateurestinitialisenluicommuniquantlesbornesaetb.Onobtientlalgorithmeci dessous. Algorithme10:PropagationdunerumeurSimulationalatoire Algorithmepropagation_rumeur # Simule la propagation jusqu lextinction de la rumeur. constante n:ENTIER<10000# Taille de la population. variable p:POPULATION i,j:ENTIER# Indices des individus qui se rencontrent. nbRencontres:ENTIER# Nombre de rencontres simules. a:ALA_ENTIER # Structure utilise par le gnrateur. initialisation # Ralisation de linvariant. p.rpand<1p.ignore<n1p.connat<0 # Cration du gnrateur dentiers dans [1, n]. initialiser(a,1,n) # Initialement, personne ne connat la rumeur. Initialiserlapopulationltatignore # Dterminer la personne qui commence rpandre la rumeur. suivant(a)i<item(a)p.personnes[i].tat<rpand # Encore aucune rencontre. nbRencontres<0 jusqu p.rpand=0 rpter# Indices des personnes qui se rencontrent. suivant(a)i<item(a) suivant(a)j<item(a) # Calcul de la rencontre. rencontre(p,cardinal(p.personnes),i,j) nbRencontres<nbRencontres+1 fin rpter

ENI Editions - All rigths reserved - Jonifar lina

- 5-

282

... fin propagation_rumeur Laprocdurerencontreappliquelesrglesdvolutionutilisesdanslasimulationdynamiquepourmettrejourltat delapopulation.Elleestdfinieparlalgorithmecidessous. Algorithme11:Dfinitiondelaprocdurerencontre Algorithmerencontre # Organiser la rencontre des individus de numros i et j. Entre p:POPULATION n:ENTIER # Leffectif de la population. i,j:ENTIER # Les numros des individus qui se rencontrent. prcondition index_min(p.personnes)iindex_min(p.personnes)+n1 index_min(p.personnes)jindex_min(p.personnes)+n1 index_min(p.personnes)+n1index_max(p.personnes) ralisation si ( p.personnes[i].tat=ignore et p.personnes[j].tat=rpand ) ou ( p.personnes[i].tat=rpand et p.personnes[j].tat=ignore ) alors # Rencontre rpand -- ignore => les deux rpandent. p.ignore<p.ignore1 p.rpand<p.rpand+1 p.personnes[i].tat<rpand p.personnes[j].tat<rpand sinon si ( p.personnes[i].tat=rpand et p.personnes[j].tat=connat ) ou ( p.personnes[i].tat=connat et p.personnes[j].tat=rpand ) alors # Rencontre rpand -- connat => les deux connaissent. p.rpand<p.rpand1 p.connat<p.connat+1 p.personnes[i].tat<connat p.personnes[j].tat<connat sinon si ( p.personnes[i].tat=rpand et p.personnes[j].tat=rpand ) alors # Rencontre rpand -- rpand => les deux connaissent et # aucun ne rpand plus. p.rpand<p.rpand2 p.connat<p.connat+2 p.personnes[i].tat<connat
- 6 ENI Editions - All rigths reserved - Jonifar lina

283

p.personnes[j].tat<connat fin si postcondition # n, i et j ne sont pas modifis. n=ancien(n) i=ancien(i) j=ancien(j) # Rgles appliques lors des rencontres. ignorerpand=>rpandrpand rpandrpand=>connatconnat rpandconnat=>connatconnat fin rencontre Lapostconditionestrdigerapidement.Sonexpressioncomplteestdifficile.Elleestlaisseenexercice. Exercice12:PropagationdunerumeurAutreversion Lasolutionprcdenteautilisuntableaupourimplanterlensembledespersonnesquicomposentlapopulation.Onpeut, laplace,utiliserunechanedecaractres.Lapopulationestunechanedanslaquellechaquecaractrereprsenteltatdun individu.IlrpandlarumeurlorsquelecaractreestR illignoresilecaractreestI illaconnatquandlecaractreestC. LachaneestdonccomposedesseulscaractresR,IetC. crirelesalgorithmesenutilisantunechanedecaractrespourreprsenterlapopulationdanslaquellecirculelarumeur. Lexercicesuivantnestpasdiffrentdelapropagationdunerumeur. Exercice13:Propagationdunincendie Lexercice consiste simuler la propagation dun incendie dans une fort. On suppose que les arbres sont rpartis aux nuds dun rseau rectangulaire. linstant initial, un arbre prend feu, par exemple la suite dune imprudence. Il communiquelefeusesvoisinsselondesrglesdepropagationprciser. 1.crirelesalgorithmesdesimulationdelapropagationdufeu. Onchercherpondredesquestionssimples :
q

combiendarbressontbrlslorsquelefeusteint ? commentfaireintervenirdanslasimulationladistanceentrelesarbres ? existetilunerpartitiondesarbresquiminimiselenombredesujetsbrls ?

2.Reprendrelasimulationentenantcomptedeladirectionetdelaforceduvent. 3.Reprendrelasimulationenrpartissantlesarbres auhasard danslerectangle.

3.Fiabilitdessystmes
Uncomposantlectroniqueestfaitdecinqlmentsinterconnectsselonleschmadelafigurecidessous.

ENI Editions - All rigths reserved - Jonifar lina

- 7-

284

ChacundeslmentsE ipeuttomberenpanne,indpendammentdesautreslments.Onveutestimerlaprobabilit sanspanne.

debonfonctionnementducomposantquandonconnatlaprobabilitp idunlmentEidefonctionner1000heures Soientpietp j,lesprobabilitsdebonfonctionnementdeslmentsE ietE japrs1000heures.Laprobabilitdebon fonctionnementdunassemblagedecesdeuxlmentsdpenddutypedassemblage :


q

E i et E j sont monts en parallle, comme sur la figure (b) cidessous. La probabilit que les deux lments tombent en panne simultanment est p i x pj et la probabilit de bon fonctionnement de lensemble est p = pi + pj - pi x pj

E i et E j sont monts en srie, comme sur la figure (a) cidessous. La probabilit de bon fonctionnement est p = pi x pj.

Exercice14:Fiabilitduncomposantlectronique crirelesalgorithmespermettantdestimerparsimulationlaprobabilitdebonfonctionnementducomposantdelafigure prcdenteaprs1000heures. Onutiliseencorelarouletteintroduitedansunesectionprcdentepourobteniruneissueei {0, 1}pourchaquelment E iducircuit.Lecircuitfonctionneencoreaprs1000heuressiC = 1avec : C = {[(e 2 + e 3 ) x e 4 ] + e 1 } x e 5 On simule ainsi n circuits C1 , C2 , , C n . La probabilit cherche est estime par la formule : p = (C1 + C2 + + Cn) / n.Lecalculexactdecetteprobabilitdonnep 0,62avecp = 0,7,i = 1, 2, , 5.

4.Dispersiondesvaleursdescomposantsduncircuitlectronique
Lescaractristiques,cestdirelesvaleursdelarponse,duncircuitlectroniquesontdterminesparlavaleurdes composantsquiralisentlecircuit.Cescaractristiquessontcalculesenattribuantchaquecomposantunevaleur prciseetfixe,cequenegarantissentpaslesfabricants.Enfait,lefabriquantduncomposantgarantitunetolrance surlavaleurnominaleducomposant.Ainsi,parexemple,tellersistanceaucarboneaunevaleurnominaledeR = 3 k avec une tolrance de 10 % sur cette valeur, soit une rsistance R telle que 2700 R 3300 . Ainsi, le domaine des valeurs possibles de R est lintervalle [2700, 3300] en. La ralisation industrielle dun circuit se fait doncpartirdecomposantsdontlavaleurrellescartedelavaleurthoriqueprvueparlecalcul.Ilsagitalorsde sassurer que cette dispersion des caractristiques des composants na pas de consquences qui rendraient les circuitsfabriqusinutilisables. Lebutdecettesectionestdtudierlinfluencedeladispersiondescaractristiquesdescomposantssurlarponse duncircuitpartirdunexemplelmentaire. Exercicersolu5:Rponsedundiviseurdetension Considronslecircuitdelafiguresuivante.

- 8-

ENI Editions - All rigths reserved - Jonifar lina

285

LesrsistancesR1etR2sontmontesendiviseurdetension.OndmontrequelatensionUauxbornesdelarsistanceR1 estdonneparlaformule :U = V x (R1 / (R1+R2)). crirelesalgorithmespermettantdedonnerunevaluationstatistiquedelarponseentensiondudiviseurenfonctionde ladispersiondesvaleursdesrsistances. OnsintresselavaleurmoyennedeU,lcarttypeetlhistogramme. Solution La simulation consiste choisir alatoirement les valeurs des rsistances R1et R2 pour calculer U en supposant un gnrateur parfait dlivrant une tension V fixe et prcise. On procde n simulations pour en dduire les rsultats demands.LhistogrammeconsistediviserlintervalledanslequelserpartissentlesvaleursdeUenunnombrefix kdintervallesetdnombrerlesvaleursdeUquiappartiennentchacundecesintervalleslmentaires. Exemple Posons V = 1,5 V, R1 = R2 = 3 k. Comme les deux rsistances ont des valeurs nominales gales, la formule prcdente donne U = 0,75 V. Supposons que la tolrance sur les valeurs des rsistances est de 10 %. Chacune dellesadoncunevaleurcompriseentre2700 et3300 .UncalculsimplemontrealorsqueUprendsavaleurdans unintervalledelongueurL = 0,15 VcentrsurlavaleurnominaleU = 0,75 V. Soitk = 10lenombredintervalleslmentairespourreprsenterladistributiondesvaleursdeUparunhistogramme de10intervalles.Cesintervallesontunelargeurdel / 10 = 0,015 V.Lesbornesdecesintervallessontdonc : 0,675 0,690 0,705 0,720 0,735 0,750 0,765 0,780 0,795 0,810 0,825 Lafabricationdelotsproduitdescomposantsdontlesvaleursserpartissentautourdelavaleurnominalesuivant uneloinormale(courbe encloche ).Poursimplifier,onconsidreiciquecetterpartitionestrectangulaire,cest direuniformedanslintervalledetolranceindiquparlefabricant.LesinstructionsquipermettentlecalculdeUsont alors : ... r1<hasard(r1,r1min,r1max) r2<hasard(r2,r2min,r2max) u<vx(1+r2/r1) ... Ici, hasard est une fonction qui gnre un rel alatoire partir de son premier argument selon une distribution rectangulaire entre les valeurs de ses deux derniers arguments. Ces derniers sont les valeurs extrmes des rsistancescalculespartirdelavaleurnominaleetdelatolrancesurcettevaleur. CettebasepermetdesimulerncircuitspourobteniruneestimationdeUetlesindicateursstatistiquesdemands. Chaquersistanceaunevaleurnominale Ri qui vrifie :Rimin Ri Rimax.Ondmontrequelatension Uvrifie UminUUmaxavec : Umin = V x (R1min / (R1max+R2max)) Umax = V x (R1max / (R1min+R2min)) LamplitudeLestdonc :L = UmaxUmin. La tensionU va prendre des valeurs dans lintervalle [Umin, Umax]. On les rpartit dansk > 0 classes pour raliser lhistogramme.Chaqueclasseaunelongueurl = L / k.Lesfrontiresdecesclassessont : U1=Umin U2=U1+l=Umin+l U3=U2+l=Umin+2xl

ENI Editions - All rigths reserved - Jonifar lina

- 9-

286

... Uk=Umin+(k1)xl Lesfrontiresdesclassessontdoncdonnespar : U1=Umin Uj=Umin+(j1)xlpour2jk+1 IlrestecomprendrecommentplacerunevaleurdeUobtenueparsimulation.Soithistogrammeuntableaudontles cases reoivent les frquences absolues des valeurs de selon les classes prcalcules. Ainsi, par exemple, histogramme[3]reoitlafrquencedesvaleursdecomprisesdans[U3, U4].tantdonneunevaleur,lenumro delacasedehistogrammequidoittreincrmenteest : numCase <- e n t i e r (( - U) / l) + 1 OnobtientainsiunevaleurdelintervalledontlafrquenceestenregistredanslacasedenumronumCase.Lamise jourdecettefrquenceconsistecrire : histogramme[numCase] <- histogramme[numCase] + 1 Lessentieldescalculsestdonctabliparlesformulesquiprcdent.Ilrestechoisirlesstructuresdedonnesqui permettrontcescalculs.OndfinitdaborduntypeDIVISEURquiregroupelesparamtresdundiviseurdetension : type DIVISEUR structure V:REL # Diffrence de potentiel aux bornes du gnrateur. R1,R2:REL # Valeurs nominales des rsistances. tR1,tR2:REL # Tolrances en % sur valeurs des rsistances. fin DIVISEUR Lesrsultatssontlamoyennedesvaleursobtenuespour,lcarttypeetletableaudesfrquencesabsoluesdeces valeursrpartiesenkclasses.Cependant,lutilisateurdesservicesdecetalgorithmedoitaussiconnatrelesvaleurs des frontires des classes calcules. Tous ces rsultats sont regroups dans une structure de donnes de type RSULTATSdfinipar : type RSULTATS structure moyenne:REL # Moyenne des valeurs de . cart_type:REL # cart type sur les valeurs de . nbClasses:ENTIER # Nombre de classes. # Frontires des classes. classes:TABLEAU[REL][1,nbClasses+1] # Frquences de chaque classe. histogramme:TABLEAU[REL][1,nbClasses] fin RSULTATS SoitdiviseurDeTensionlafonctionquiraliselescalculsdemands.Sasignatureest : diviseurDeTension ( d:DIVISEUR # paramtres du diviseur. N:# Nombre de simulations. ):RSULTATS Pourlereste,lescalculssontlmentairesetilssontlaisssenexercices.

- 10 -

ENI Editions - All rigths reserved - Jonifar lina

287

Notesbibliographiques
Le147gnrateuretletestdupokersontinspirsdupetitlivre[RAD77]quiproposeprsde150exercicesparfois passionnantsetdontlessolutionssontcommentes.Lestestsdesgnrateurssonttudisdunefaonapprofondie par[KNU73a].

ENI Editions - All rigths reserved - Jonifar lina

- 1-

288

Rsum
Cechapitreaproposquelquesactivitssimplespermettantdesimulerdesprocessusdterministesoualatoires.Les formules utilises peuvent paratre parfois impressionnantes, mais le contenu mathmatique reste dun niveau lmentaire.Parcontre,lesalgorithmesproposssontsouventdifficilesspcifierformellementetlesvrificationset les tests sont dautant plus difficiles que les rsultats sont imprvisibles. Tous les problmes poss se rsolvent aismentparlecalculetilestainsipossibledevrifierlacohrencedesrsultatsobtenusinformatiquementavecceux donnsparlescalculsmathmatiques.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

289

Bibliographie
[RAD77]LennartRADE :Tentezvotrechanceavecvotrecalculateurprogrammable CEDIC,1977. [KNU73a]DonaldKNUTH :TheArtofComputerProgramming Vol.1 ADDISONWESLEY,1973.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

290

Introduction
On sintresse la scurit des donnes dun systme informatique. Cest un problme vaste, difficile, qui revt de multiplesaspects.Ici,noustudionsetmettonsenpratiquedunefaonsimplifiequelquesunsdecesaspects. La deuxime section tudie comment assurer lintgrit des donnes. Il sagit de vrifier que les donnes mises en uvre nont pas subi de modification. La section suivante aborde les techniques qui assurent la confidentialit des donnes. On veut ainsi ne permettre laccs aux donnes qu un nombre restreint dentits utilisatrices bien caractrises.Nousdevrionsensuitenousintresserauxmthodespouridentifier,authentifieretautoriserlesentits quiaccdentauxdonnesmaiscelivrenabordepascesaspectsduproblme.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

291

Intgrit
1.Prsentation
Lesdonnesauxquellesnousnousintressons contiennent unecertaine information .Touteperturbationdes donnesvamodifiercetteinformation. Les perturbations peuvent tre de diffrentes natures. Ainsi, par exemple, lors dcritures ou de lectures vers ou depuisundisque,lenvironnementlectromagntiquedusystmepeutmodifierlesdonnesdunefaonimprvisible pendantleurtransfert.Demme,pendantunchangededonnessurunrseau,unutilisateurpeutintercepteret modifierlesmessagesdunefaonillgitimeouinattendue.Uneapplicationpeutcorromprelesdonnessurlesquelles elletravaille,lasuitedunincidentdefonctionnementparexemple. Lesmthodesusuellesauxquellesnousnousintressonsdanscettesectionpermettentdesassurerquelesdonnes conservent linformationquellescontiennent .Nousvoulonsainsinousconvaincrequelesdonnesnontpassubi demodification.Ilsagitdoncdesassurerdelintgritdesdonnesutilises.Leprincipegnraldunetellemthode estillustrparlafigurecidessous.

Unalgorithmecalculeuncondensouempreinte (hash)dumessage.Quellequesoitlatailledumessage,lecondens auraunelongueurfixe,parexemplede32octets(256bits).Ainsi,toutelinformationcontenuedanslemessagesera comprime, condense en32octets. Pour sassurer que les donnes nont pas t perturbes, on recalcule, avec le mme algorithme, le condens du messagevrifieretonlecompareaucondensoriginal.Ledtaildesoprationsestdonc :
q

recalculerlenouveaucondens comparerlenouveaucondensaucondensoriginal silssontdiffrents,cestquelesdonnesoulecondensoriginalontsubidesmodifications.

Cettemthodeestillustreparlafiguresuivante.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

292

Sur cette figure, le condens original est le condens envoy par lmetteur et reu par son destinataire avec le message.Lenouveaucondensestlempreintecalculeparlercepteurdumessage.Onprtendquelemessagena passubidemodificationlorsquelenouveaucondenscalculestidentiqueaucondensreu.Cependant,ilestclair que le nombre dempreintes distinctes est fini, exactement de 2256 pour une empreinte de 32 octets, alors que le nombredemessagescondenserestpotentiellementillimit.Ilexistedoncdenombreuxmessagesayantlamme empreinte.Ainsi,alorsquelempreinteanthropomtriqueidentifieunindividudunemanireunique,ilnenestpasde mme de lempreinte informatique. Par consquent, la quantitdinformations dun condens nestpaslamme quecelledutextequilcondense.Onappelle collision lefaitdobtenirlammeempreintepourplusieursmessages distincts.Ondiminuelaprobabilitdecollisionenaugmentantlenombredebitsdelempreinte. Ilexistedenombreuxalgorithmesdehachage.LesplusconnussontMD5etSHA1.Ilnestpasquestiondentrerdans lesdtailsalgorithmiquesdesfonctionsquipermettentdecalculeruneempreinte.Danslasuite,nousconsidronsque nous disposons dune fonction hachage qui permet de calculer lempreinte dune chane de caractres selon une fonction mathmatique et un algorithme qui ne sont pas prciss. Cette fonction rend une chane de caractres de longueurfixe,indpendantedelatailledesonargument.Saspcificationestdonneparlalgorithmecidessous. Algorithme1:Spcificationdelafonctionhachage

Algorithme hachage # Lempreinte de ch. Entre ch : CHANE # La chane de caractres condenser. Rsultat : CHANE prcondition estDfinie(ch) postcondition Rsultat est le condens de ch longueur(Rsultat) est une constante donne quelle que soit ch fin hachage

2.Comparerdeuxempreintes
- 2 ENI Editions - All rigths reserved - Jonifar lina

293

Commenonsparunexercicesimple. Exercicersolu1:Comparaisondedeuxempreintes Soientdeuxempreintese1ete2,obtenuesparlafonctionhachagedfiniecidessus. 1.crireunalgorithmequidterminelenombredecaractresdiffrentsdemmerangdanscesdeuxcondenss. 2.Montrercommentutilisercesfonctionspoursassurerdelintgritdunmessage. Solution Onveutcompterlenombredecaractresdiffrentsauxmmesrangsdesdeuxempreintes.Lalgorithmerenvoieun entieretcestdoncunefonction.Lesdeuxcondensscomparersontncessairementdemmelongueuretcestune prcondition. La dfinition de cette fonction est simple analyser et crire. Lanalyse complte est laisse en exercice.Lalgorithmecidessousendonnelaspcificationetlalgorithmesuivantdonnelaversiondfinitivedecette dfinitiondanslaquelleonsupposequelescaractresdunechanesontnumrotspartirde1. Algorithme2:Spcificationdelafonctiondiffrences

Algorithme diffrences # Nombre de caractres distincts dans les mmes positions de # e1 et e2. Entre e1, e2 : CHANE # Les chanes comparer. Rsultat : ENTIER prcondition estDfinie(e1) estDfinie(e2) longueur(e1) = longueur(e2) postcondition longueur(e1) = 0 => Rsultat = 0 longueur(e1) > 0 et premier(e1)premier(e2)=> Rsultat=1+diffrences(fin(e1),fin(e2)) longueur(e1)>0et premier(e1)=premier(e2)=> Rsultat=diffrences(fin(e1),fin(e2)) fin diffrences Ladfinitioncomplteestdonclasuivante : Algorithme2:Spcificationdelafonctiondiffrences Algorithmediffrences # Nombre de caractres distincts dans les mmes positions de # e1 et e2. ... variable lgr:ENTIER# Nombre de caractres dun empreinte. i:ENTIER # Numro du prochain caractre observer. initialisation lgr<longueur(e1) Rsultat<0 i<1 jusqu i>lgr invariant i=1=>Rsultat=0 i>1=>Rsultat=diffrences ( sousChane(e1,1,i1), sousChane(e2,1,i1) ) variant de contrle lgri+1
ENI Editions - All rigths reserved - Jonifar lina - 3-

294

rpter si item(e1,i)item(e2,i) alors Rsultat<Rsultat+1 fin si assertion Rsultat=diffrences ( sousChane(e1,1,i), sousChane(e2,1,i) ) i<i+1 assertion Rsultat=diffrences ( sousChane(e1,1,i1), sousChane(e2,1,i1) ) fin rpter ... fin diffrences LafonctionsousChaneretourneunecopiedesonpremierargumentquicommenceaucaractredontlenumroestla valeurdusecondargumentetquitermineaucaractredontlenumroestlavaleurdutroisimeargument. On a reu un messagemessage et son empreinte empreinte dont on veut sassurer de lintgrit. Les oprations ralisersont : ... # calcul du condens du message reu. condens<hachage(message) # Calcul du nombre de caractres diffrents. d<diffrences(empreinte,condens) # Message intgre ssi diffrences = 0. si d0 alors lemessageousonempreintea(ont)tmodifi(s) sinon pasdemodification,nidumessagenidelempreinte fin si ... Remarquez que le calcul du nombre de caractres diffrents nest pas ncessaire ici. En effet, il suffit que les deux chanes empreinteet condens soient diffrentes au sens de la non galit des chanes de caractres. Il suffit donc dcrire : si empreintecondens alors lemessageousonempreintea(ont)tmodifi(s) sinon pasdemodification,nidumessagenidelempreinte fin si ... puisqueloprateurestapplicableauxchanesdecaractres.Sinon,ilsuffiraitdeledfinir. Unmessagenestpastoujourslavaleurdunevariable.Enfait, message estprendreausenslargede chane de caractres dont la longueur est quelconque, arbitrairement grande, et dont chaque caractre nest pas ncessairementditable.Nousdevonsdoncconsidrer,danslecasgnral,quemessageestunedonnebinaireet, leplussouvent,cette donne estenregistredansunfichier.Lasectionsuivantetraiteducalculducondensdun fichier.

3.Condenserlecontenudunfichier

- 4-

ENI Editions - All rigths reserved - Jonifar lina

295

Soitunmessageenvoyeruncorrespondant.Ilsagitdunfichieraccssquentiel,enregistrsurunsupportqui nestpasadressable,contenantdescaractresditables.Nousvoulonsjoindrecefichierunnouveaufichierbinaire prparerquicontiendralempreintedufichiertexte.Cequidistinguecetexercicedesprcdents,cestquelefichier condenserestarbitrairementgrand.Nousnepouvonsdoncpaslirelatotalitducontenudufichierdansunechane decaractresuniquechpourcrireensuite : empreinte <- h a c h a g e (ch) Noussupposonsdoncquelafonctiondehachagenepeuttraiterdeschanesdecaractresdelongueurarbitraire. Exercicersolu2:Condenserunfichier crirelalgorithmequicondenseunfichiertexteorganisationetaccssquentiel. Solutionpartielle Pour russir calculer une empreinte dun fichier de longueur arbitraire, nous pouvons le condenser par bloc. La mthodeconsistedcouperlecontenudufichierenblocsdetaillefixeetcondenserchaquebloc.Cependant,nous nepouvonspastransmettrelesempreintesdetouslesblocs.Enfait,onexigedobteniruneempreinteunique,dela taillehabituelleduneempreinteretourneparlafonctiondehachage.Prcisonsleproblme. On se donne un fichier lettre.txt qui est un fichier organisation et accs squentiel, contenant des caractres ditables.Nousvoulonscalculeruncondens,pourlenregistrerensuitedansunfichierbinairelettre.hach.Lefichier est dcoup en blocs de taille fixe puis chaque bloc, augment du condens du bloc prcdent, est luimme condens.Cependant,pourquelesblocsrestentdetaillefixe,onconcatnelecondensobtenupourunblocavecle bloc suivant dont la taille est ajuste pour que le bloc obtenu soit de la taille fixe choisie. Ainsi, par exemple, supposonsquelataillechoisiepourlesblocssoitde4Ko,soit4096octets.Lorsquelatailleduneempreinteestde32 octets,ona : ... liredanslefichierlettre.txtunblocde4064octets concatnerceblocaveclempreinteobtenuepourleblocprcdent calculerlempreintedecenouveaubloc ... Lempreinte dfinitive sera la dernire empreinte calcule. Remarquer que la taille du bloc qui est condens est 4064 + 32 = 4096octets.Parconsquent,latailledunblocludepuislefichierestdonnepar : TAILLE_LUE = TAILLE_BLOC - TAILLE_EMPREINTE Soit donc condenserFichier, la fonction qui retourne le condens dun fichier dont elle reoit, en argument, le nom interne.Lanalysedepremierniveaudecettefonctionestlasuivante : Algorithme4:AnalysedepremierniveaudecondenserFichier AlgorithmecondenserFichier # Condenser le contenu dun fichier. ... OuvrirlefichiercondenserenmodeLECTUREBINAIRE Positionnerlecurseurdevantlepremierbloc InitialiserlecondensCHANE_VIDE LireunblocdelongueurLdepuislefichier tant que lafindufichiernestpasatteinte rpter Concatnerleblocluaveclecondensactuel # On obtient ainsi un nouveau bloc de longueur L. Condenserlenouveaublocobtenu Avanceraublocsuivantdanslefichier LireunblocdelongueurLTAILLE_EMPREINTE fin rpter si latailledudernierbloclu>0 alors Concatnerleblocluaveclecondensactuel Condenserlenouveaublocobtenu fin si
ENI Editions - All rigths reserved - Jonifar lina - 5-

296

Fermerlefichierdentre ... Remarquezletraitementparticulierpourledernierbloc.Eneffet,unedernirelecturetenteunelectureaudeldela marquedefindefichier.Parconsquent,lafonction finDeFichierretournealorsVRAIetledernierbloclu,peuttre de taille infrieure la taille standard dun bloc, nest pas trait dans litration. Il doit donc tre trait indpendamment des autres blocs. Cependant, lavant dernire lecture peut avoir amen un bloc de la bonne longueur,dontlederniercaractreseraitexactementlecaractrequiprcdelamarquedefindefichier.Danscecas, aprslavantdernirelecture,finDeFichierrendencoreFAUXetlalecturesuivanterenvoieunblocvide cestcequi justifieletestsurlalongueurdudernierbloclu. Cettefonctionestalorsutilisedelafaonsuivante : ... constante # Nombre doctets dun bloc condenser et du condens. TAILLE_BLOC:ENTIER<4096 TAILLE_EMPREINTE:ENTIER<32 # Taille dun bloc lu depuis le fichier. TAILLE_LUE:ENTIER<TAILLE_BLOCTAILLE_EMPREINTE # Nom des fichiers dans le SGF. nom:NOM_EXTERNE<lettre.txt hachage:NOM_EXTERNE<lettre.hach variable empreinte:CHANE # Le condens calcul. fichier:NOM_INTERNE # Descripteur du fichier hacher. ralisation empreinte<condenserFichier(nom) ouvrir(hachage,CRITURE_BINAIRE) fichier<descripteur(hachage) dbut(fichier) crire(fichier,empreinte) fermer(fichier) ... Le c ur de la fonction condenserFichier consiste lire un bloc dans le fichier, le concatner lempreinte dj obtenueetcondenserlersultatdecetteconcatnation.Lesinstructionsdebasesontdonc : ... bloc<bloc em preinte # Concatnation. em preinte <- hachage( b l o c ) bloc <- lire( f i c h i e r , T A I L L E _ L U E ) ... LalecturedinitialisationdoitcopierdepuislefichierunblocdeTAILLE_BLOCoctetspuisque,danscettat,lempreinte estvideetsalongueurestnulle. Ilrestecrirelaversiondfinitiveetcompltedelafonction.Elleneprsenteplusdedifficultetsaralisationest laisseenexercice. Exercice1:Condenserunfichier 1.crirelaversiondfinitivedelalgorithmedelafonctioncondenserFichier. 2. crire lalgorithme qui prend en entre un fichier et son empreinte. Il recalcule le condens du fichier et le compare lempreintereue.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

297

Confidentialit
Oncherche,cettefois,sassurerquelesseulesentitsquipourrontprendreconnaissancedesdonnessontcelles prvues.Leprincipeconsistemasquerlesdonnesafinquellesnesoientplusdirectementcomprhensiblespartoute autreentitquelentitdestinataire.Onparlealorsdecryptagedesdonnes.

1.Principesmathmatiquesdelaconfidentialit
Soient M lensemble des messages en clair, C lensemble des messages crypts et K lensemble des cls de chiffrement.LoprationdechiffrementestunefonctionSdeM x KdansC :

LedchiffrementestunefonctionDdeC x KdansM :

Les cls de chiffrement/dchiffrement sont ks et kd respectivement. Les deux fonctions vrifient : Dkd (Sks (m)) = m. Cetteformuleexprimequelechiffrementestrversible.Onpeutreprsentercesoprationscommesurledessindela figurecidessous.

Lesalgorithmesdechiffrementutilisentdiffrentesrelationsmutuellesentreks etkd .

2.Cryptographieclsecrte
Lorsquil existe un moyen simple dobtenir kd partir de ks , par exemple lorsque kd = ks , on parle de chiffrement symtriqueouencoredechiffrementclsecrte.Danscecas,lesdeuxextrmitspartagentunsecretcommun.Ce peuttre,parexemple,lammevaleurdeclk = ks = kd .Touteentitquiconnatkpeutalorsdchiffrerlemessagec pourobtenirlemessagem. On sait, en thorie, assurer une confidentialit parfaite avec ce type de cryptage o les entits qui communiquent partagent un secret commun. Lalgorithme de VERNAM est particulirement simple et assure le secret parfait des changes. SoientAetB,commeAliceetBobparexemple,lesdeuxentitsquipartagentuneclcommunek.Cetteclestune suitealatoiredebitsdemmelongueurquelemessagemenvoyer.Pourcrypterlemessage,AutiliselafonctionSk = m k, dans laquelle dsigne loprateur boolen OU EXCLUSIF. Cet oprateur est usuellement not, mais nous avonsutiliscederniersymbolepournoterlaconcatnationdeschanesdecaractresetnouscontinueronslefaire. CommelafonctionSk estuneinvolution,ButiliseDk = c kpourretrouverm .Lesecretparfaitexigequelenombre de cls soit aussi grand que le nombre de messages en clair possibles, ce qui explique que la cl doit tre aussi longue, en nombre de bits, que le message. De plus, elle doit tre parfaitement alatoire, ce qui est une condition difficilesatisfaire.Enfin,AetBdoiventchangercettecldunefaonsre,paruncanalfiable.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

298

3.Cryptographieclsymtrique
Cestlamthodedduitedesconsidrationsdelasectionprcdente.Onutiliseunedonneparticulireappelela cldecryptagepourcrypterlesdonnesdumessage.Lacldecryptageestconnuedelmetteuretdudestinataire du message et on parle alors de cryptage cl symtrique. Le cryptage fait subir aux donnes une modification laide dun algorithme qui utilise la cl. Lalgorithme applique une fonction qui est rversible. Par consquent, lapplicationdecettemmefonctionauxdonnescryptespermetderetrouverlemessageoriginal.Laconfidentialit recherche nest donc obtenue que si la cl nest connue que des entits prvues. La principe de la mthode est rsumparleschmadelafigurecidessous.

Les paragraphes suivants demandent de mettre en pratique quelques algorithmes lmentaires de cryptage cl symtrique.

4.Codagelmentaire:XOR
La cl est une chane de caractres de longueur l arbitraire. Les donnes crypter sont dcoupes en blocs de longueurl.Chaqueblocestcryptenluifaisantsubiruneopration ouexclusif (XOR)aveclacl. Exercicersolu3:CryptagesymtriqueXOR OnnoteloprateurXOR. 1.Rappelerlatabledevritde.MontrerqueXORestuneoprationinvolutive. Soitlettre.txt,unfichiertexteorganisationetaccssquentiels. 2.crirelalgorithmequiprendenentrelenomdufichiercrypteretlacldecryptageetquicritsurledisquelefichier crypt. 3.Justifierlutilisationdelammeclpourcrypteretdcrypterlefichier.Endduirequelemmealgorithmesertaussi dcrypterlefichier. 4.Quelssontlesprincipauxinconvnientsdecettemthode ? Onsupposequelemessagecrypternestplusdelongueurarbitraire,maisdelongueurassezrduitepourtenirtoutentier dansunevariable. 5.Refairecetalgorithme,maiscettefois,ilgnrealatoirementuneclaussilonguequelemessagecrypter. Solutionpartielle Onnersouticiquelaquestion2encequiconcernelescalculsdindicesdescaractrespourunmessagenotphrase delongueurL.Supposonsdabordquelescaractresdelaphraseetdelaclsontnumrotspartirde0.Lafigure cidessousreprsentelamiseencorrespondancedunephrasedeLcaractresetdunecldel = 6caractres.

- 2-

ENI Editions - All rigths reserved - Jonifar lina

299

Soiti lenumroduncaractrequelconquedelaphraseetj lecaractrequiluicorresponddanslacl.Quellerelation existetilentreietj ? Lacl dcoupe laphraseenunensembledeblocs,tousdemmelongueurl ,saufpeuttreledernier.Soitqle numro du bloc qui contient i avec q=0 le numro du premier bloc. Il nest pas difficile de constater que i = q x l + j avec0 j < l .Parconsquent,j estlerestedeladivisiondei parl alorsquelenumrodublocqui contient i est le quotientq de cette division. Les caractres dune chane sont numrots conscutivement, mais partir dun numro quelconque pour le premier caractre. Soit alorsdbut le numro du premier caractre crypter danslaphraseet index_min(cl)lenumrodupremiercaractredelacl.Laformuleprcdentedoittreutilise avecunetranslationdei etj pourtenircomptedecettenumrotation.Onadonc : dbut i fin => (i - dbut) 0 Do : 0 (i - dbut) fin - dbut Parconsquent : (i - dbut) = q x l + (j - i n d e x _ m i n (cl)) Finalement,onobtientpourlecalculdej : j = r e s t e (i - dbut, l) + i n d e x _ m i n (cl) Exemple Soient l = 6, i = 13, dbut = 1 et index_min(cl) = 1. On a alors i dbut = 12 et reste (12, 6) = 0. Par consquent, j = 0 + 1 = 1. Lecryptageduncaractresorganisealorsdelafaonsuivante : ... # Rcuprer un caractre de phrase. carP <- item(phrase, i) # Calculer le numro du caractre correspondant de la cl. j <- reste(i - dbut, l) + index_min(cl) # Rcuprer le caractre de la cl. carC <- item(cl, j) # Calculer le caractre crypt. c <- carP carC ... Lerestedelexerciceneposeplusdedifficult.

5.CodagedeVERNAM
Cest encore la mthode prcdente, mais cette fois la cl est aussi longue que le message crypter. Pour chaque blocdufichiercrypter,ongnrealatoirementunecldecryptagedemmelongueur.Lefichierestcryptetle rsultat du chiffrement est enregistr sur disque. Paralllement, la cl du bloc est aussi enregistre dans un autre fichierbinaire.Lefichiercryptpeutemprunteruncanalnonfiable,maisilestclairquelacl,elle,doitemprunterun canalfiable.Ellenepeutpastreretrouveparcalculpuisquelleest,enthorie,parfaitementalatoire.Cependant, utiliserettransmettreuneclaussilonguequelemessageestfortementpnalisant.Comme,deplus,onnepeutpas gnrer une cl parfaitement alatoire, cette mthode nest pas utilise. Nous allons cependant lanalyser pour prparerunalgorithmequichiffreunfichier.

ENI Editions - All rigths reserved - Jonifar lina

- 3-

300

Exercicersolu4:CodagedeVERNAM Ondonneunfichiertexteorganisationetaccssquentiels. 1. crire lalgorithme qui chiffre ce fichier dans un fichier binaire et qui sauvegarde la cl alatoire dans un second fichier binaire. 2.crirelalgorithmequidchiffreunfichier. Solutionpartielle Leprincipeestidentiqueceluiutilispourlecalculdelempreintedun gros fichier,partiellementrsoluplushaut dans ce chapitre. Comme pour cet algorithme, on ne donne ici que lanalyse de premier niveau. Les choix algorithmiquestantarrts,lcrituredeladfinitioncomplteneprsenteplusdedifficult. Algorithme5:ProcdurevernamAnalysedepremierniveau Algorithm vernam e ... O u v r i r l e f i c h i e r c r y p t e r ( f i c h i e r d entre) en m ode LECTURE BINAIRE Ouvrir le fichier de la cl en m ode CRITURE BINAIRE Ouvrir le fichier rsultat en m ode CRITURE BINAIRE Positionner le curseur devant le prem ier bloc Lire un bloc de longueur TAILLE_BLOC depuis le fichier d entre tant que l a f i n d u f i c h i e r d entre n est pas atteinte rpter Gnrer une cl alatoire de la longueur du bloc Crypter le bloc avec la cl Enregistrer le bloc crypt avec la cl dans leurs fichiers respectifs Avancer au bloc suivant dans les fichiers Lire un bloc de longueur TAILLE_BLOC depuis le fichier d entre fin rpter si la taille du dernier bloc lu > 0 alors Gnrer une cl alatoire de la taille du dernier bloc lu Crypter le dernier bloc lu Enregistrer le bloc crypt et la cl fin si Ferm r les trois fichiers e ... Il est indispensable denregistrer la cl pour pouvoir dcrypter le message en la rutilisant. Dautre part, les deux entitsquischangentlemessagecryptnontpasbesoindesentendresurlalongueurdublocpuisquelopration estuneadditionbitbitsansretenue(XOR).Maiscommelaclestaussilonguequelemessagecrypter,changer des messages sur un canal fiable nest pas plus compliqu quchanger les cls et, par consquent, cette mthode nestpaspraticable.Onpeut,cependant,lutilisersanschangerlescls.Lamthodeconsisteraliser,chaque extrmit, un double cryptage altern en utilisant chaque fois la mme cl, mais qui reste prive et seulement connuedelextrmitquilutilise.Lexercicesuivantmontrecommentprocder. VoyonsdabordpourquoilchangedelaclknestpasncessairepourlechiffrageXOR. Exercice2:CodageXORetchangedelacl LeprotocoledmissiondumessagemdeABestlesuivant : a.AcryptelemessagemlaidedesaclkaquilestleseulconnatreetenvoielemessagecryptckaB

b.BcryptelemessageckaquilreoitdeAavecsaclkb,quilestleseulconnatre,etenvoielersultatCkakbA c.ArecrypteCkakbavecsaclkaetenvoielemessagecobtenuB d.Bcryptecavecsaclkbetobtientainsim

1.Faireundiagrammepourrsumercesoprations. 2.DmontrerquelemessageenclairobtenuparBladernireoprationestlemessagemenvoyparA.

- 4-

ENI Editions - All rigths reserved - Jonifar lina

301

Onvoitqueceprotocolepermetdesaffranchirdelacontraintedelchangedesclssuruncanalquinadoncpas trefiable.Parcontre,chaquemessagefaitunallerretourcompletsupplmentaire.

6.Codagelmentairesubstitutionmonoalphabtiquesimple
Ilsagit,cettefois,decrypterchaquecaractredufichier,individuellement.Parconsquent,lesblocssont,prsent, de longueur L = 1. La cl est ellemme de longueur 1, mais la cl de dcodage nest plus la mme que la cl de cryptage.Cependant,ellesendduitparuncalcullmentaire.Ilsagitdoncencoredunalgorithmedelafamilledes algorithmesdecryptageclsymtrique. Exercice3:Substitutionmonoalphabtiquesimple Laclestuncaractredecodecl.Pourchaquecaractrecrypter,decodecodeCar,oncalcule : r e s t e (codeCar + cl, 256) Pourdcrypteruncaractre,onutiliselacl(256cl)etonappliquelemmealgorithme. Exemple SoientAdecodeASCII65lecaractrecrypteretlecaractreH,decodeASCII72,lacldecryptage.Lecaractrecrypt auralecodeASCII65 + 72 = 137.Pourledcoder,onutiliselacl256 72 = 184.Ledcodagedonne : r e s t e (137 + 184, 256) = r e s t e (321, 256) = 65 soit A 1.crirelalgorithmequiraliselecryptagedunfichiertexteseloncetalgorithme. 2.Appliquercetalgorithmepourdcoderlefichierobtenulaquestionprcdente.

7.LamthodedeVIGENRE
LecryptageselonlamthodedeVIGENREutiliseunetabledecorrespondancedescaractresetunecldecryptage secrte.Chaquecaractredumessagesertreprerunelignedelatabledecorrespondance.Chaquecaractrede mmerangdelaclpermetdereprerunecolonnedecettetable.lintersectiondelaligneetdelacolonneainsi repres,ontrouvelecaractredesubstitutionducaractredumessage. Exemple Considronslemessagem = BABAetlaclk = CACA.Latabledecorrespondanceestarbitraire.Envoiciune : A A B C Lecryptageprocdeainsi :
q

B R Z X

C T F S

K E I

caractre1dem=B caractre1dek=C ligneB,colonneCdonneF caractre2dem=A caractre2dek=A ligneA,colonneAdonneK mmecodagepourlesdeuxautrescaractres.

LemessagecodestdoncFKFK. Lorsque la taille de la cl est infrieure celle du message, on rpte la mme cl autant de fois que cest ncessaire :

ENI Editions - All rigths reserved - Jonifar lina

- 5-

302

m = Papa, maman, la bonne et moi. k = CACACACACACACACACACACACACACAC

Exercice4:CryptagedeVIGENRE Pour simplifier, on considre des messages uniquement constitus de majuscules de lalphabet, mais sans accent ni ponctuation.Laclestdelongueurquelconqueetlescaractresquilaconstituentsontaussidescaractressansaccent. Dansunpremiertemps,latabledecorrespondanceestunematricede26ligneset26colonnes.Lapremireligneporteles caractresdeAZ.Laseconde,lescaractresdeBZetledernierestunA.LatroisimeportelescaractresdeC ZetlesdeuxdernierssontAetB.Ainsi,chaqueligneestunepermutationcirculairedelaprcdente,lapremiretant faitedes26majusculesdelalphabet. 1.crirelalgorithmedinitialisationdelatabledecorrespondance. 2.crirelesalgorithmespermettantdecoderetdedcoderunmessage. Comme chaque ligne est une permutation circulaire de la ligne qui la prcde, la table de correspondance nest pas ncessaire. Pour chaque couple de caractres (m, k) extraits du message et de la cl, un calcul partir de leurs codes permetdobtenirlecodepuislecaractrecorrespondantdumessagecrypt. 3.crirelesalgorithmesquisedduisentdecesformules. 4.Refairecesalgorithmeslorsquelatabledecorrespondanceestobtenue auhasard .Mmescontraintespourlacl. 5.tudierleproblmelorsquonautoriseuncaractrequelconque,majuscule,minuscule,ponctuation,accent,etc.dansle messagecoderetdanslacldecryptage. 6.tendreleproblmeaucryptagedunfichierquelconque. Lesexercicesprcdentsontmisenvidencelasensibilitdelacl.Elledoittredisponiblepourlentitquicryptele messageetpourcellequiledcrypte.Elleestlemaillonfaibledecesmthodes.Ilfautdoncsassurerquellereste secrteentoutecirconstance.Ilexistedesmthodesquipermettentauxdeuxentitsdecalculeruneclcommune sanschangerdedonnesconfidentielles,maiscesmthodesdpassentlecadredecetteinitiation.

- 6-

ENI Editions - All rigths reserved - Jonifar lina

303

Notesbibliographiques
Lessentiel de ce chapitre est inspir de [MAR04]. Cest un livre difficile pour une initiation mais une rfrence rigoureusepouruneintroductionauxtechniquesdechiffrement.Leprotocoledchangedelexercice2estextraitdun cours personnel. Lexercice sur le codage monoalphabtique simple est inspir dun exercice publi par le CERTA. Lexercice sur le codage de VIGENRE est inspir dun ancien article paru dans la revue MICROSYSTMES disparue depuisdjdenombreusesannes.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

304

Conclusion
La scurit des donnes doit assurer leur intgrit, la confidentialit des changes et lidentification/authentification desentitsquiralisentceschanges.Cechapitreaexposquelquesidessimplespourvrifierlintgrit ou pour assurerlaconfidentialitdeschanges.Lesprincipesonttprsentspartirdemthodeslmentairesquinesont pasutilisablesenltat,maisquidonnentuneidejustedelaralit.Ledomaineestcependantbienplusvasteet difficilequenepeutlelaisserpensercetteprsentation,dontleseulobjectiftaitdefourniruncontextepourtudier quelquesalgorithmes.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

305

Bibliographie
[MAR04]BrunoMARTIN :Codage,cryptologieetapplications PRESSESPOLYTECHNIQUESETUNIVERSITAIRESROMANDES, 2004.

ENI Editions - All rigths reserved - Jonifar lina

- 1-

306

S-ar putea să vă placă și