PHP - Algorithmique - Techniques Fondamentales de Programmation

download PHP - Algorithmique - Techniques Fondamentales de Programmation

of 225

Transcript of PHP - Algorithmique - Techniques Fondamentales de Programmation

  • Ce livre sur lalgorithmique sadresse toute personne dsireuse de matriser les bases essentielles de la programmation. Pour apprendre programmer, il faut dabord comprendre ce quest vraiment un ordinateur, comment il fonctionne et surtout comment il peut faire fonctionner des programmes, comment il manipule et stocke les donnes et les instructions, quelle est sa logique. Alors, au fur et mesure, le reste devient vidence : variables, tests, conditions, boucles, tableaux, fonctions, fichiers, jusquaux notions avances comme les pointeurs et les objets. Dans ce livre, le langage algorithmique (ou la syntaxe du pseudo-code des algorithmes) reprend celui couramment utilis dans les coles dinformatique et dans les formations comme les BTS, DUT, classes prparatoires, premires annes dingnierie qui ce livre est en partie destin et conseill. Une fois les notions de base acquises, le lecteur trouvera dans ce livre de quoi voluer vers des notions plus avances : deux chapitres, lun sur les pointeurs et les rfrences, lautre sur les objets, ouvrent les portes de la programmation dans des langages volus et puissants comme le C, le C++, JAVA et PHP. La plupart des algorithmes de ce livre sont traduits en PHP et les sources, directement utilisables, sont disponibles en tlchargement sur cette page.

    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

    AlgorithmiqueTechniques fondamentales de programmation (exemples en PHP)

    SbastienROHAUT

    Rsum

    L'auteur Sbastien ROHAUT a dbut comme Ingnieur de dveloppement en C++. Aujourdhui Ingnieur Systme il intervient sur des missions rgulires pour de grands comptes et continue denseigner le dveloppement des classes dingnieur et masters MTIC.

    - 1 - ENI Editions - All rigths reserved

  • Introduction

    Pourquoi apprendre programmer ? Avezvous, comme lauteur, dispos au dbut de la microinformatique dunordinateur o il fallait programmer soimme des jeux ou outils, ou saisir des dizaines de pages de lignes deprogrammation?Avezvousbesoin,durantvostudes,dematriserlestechniquesfondamentalesdeprogrammationpour passer votre diplme? tesvous un professionnel ou un autodidacte passionn qui veut encore en savoirdavantage?Estceunenouvelletapedevotrecarrireprofessionnelleontantpasinformaticienvoustesamenprogrammerdesmacrosoudesscriptscomplexes?Quelleraisonencoretrouver?Sivousrpondezouilunedesces questions,mais aussi aux dizaines dautres quil serait possible de poser, alors oui, vous devez apprendre programmer.Apprendreprogrammer, cest enfin savoir comment font les autrespour crerde superbes logiciels,cestsavoirtermecommentlescrersoimmeetlesdvelopper.

    Commentapprendreprogrammer?Onnesimprovisepasprogrammeur.Cestunmtieretcommetoutmtier,celasapprend.Danslescoles,desprofesseursenseignantspourdesclassesdeBTS,DUT,DEUG,classesprparatoires,etc., sont spcialiss dans lapprentissage des notions fondamentales de programmation. Les autodidactes seplongent dans des livres, des sites Internet, dans la documentation en ligne des langages, pour apprendre cesnotions.Lensembledecesnotionscestlalgorithmique.

    Celivrereprendlesnotionsessentielles,fondamentales,delaprogrammation.Pourapprendreprogrammer,ilfautdabord comprendre ce quest vraiment un ordinateur, comment il fonctionne et surtout comment il peut fairefonctionner des programmes, comment ilmanipule et stocke les donnes et les instructions, quelle est sa logique.Alors, au fur et mesure, le reste coule de source comme une vidence : variables, tests, conditions, boucles,tableaux,fonctions,fichiers,jusquauxnotionsavancescommelespointeursetlesobjets.

    Leformalismealgorithmique,(lasyntaxedulangagealgorithmiqueoupseudocode)reprendceluicourammentutilisdanslescolesdinformatiqueetdanslesformationscommelesBTS,DUT,premiresannesdingnierie,quicelivreestenpartiedestinetconseill.Ilexisteplusieursvariantesutilises,selonleprofesseur,lelangagedorigine.Celuiprsent icia lavantagedtredansunfranaistrsexplicite"tantque,jusqu,pourchaque,afficher,saisir,etc.".Leurlecturenencessiteaucuneconnaissancepralabledetermestroptechniques.

    Celivrenefaitpasquaborderlesnotionsbasiques.Deuxchapitres,lunsurlespointeursetlesrfrences,lautresurlesobjets,ouvrentlesportesdelaprogrammationdansdeslangagesvolusetpuissantscommeleC,leC++,Javaet PHP. Dailleurs, presque tous les algorithmes de ce livre sont implments en PHP. Les sources directementutilisablessontdisponiblesentlchargementsurlesitedesditionsENI.

    - 1 - ENI Editions - All rigths reserved

  • Lalgorithmique

    1.Programmer,cestunart

    Pourobtenirunrsultatdonn,ilfautgnralementsuivreunemthode,unecertainelogique.Sauftreungrandptissier dont la science des mlanges des ingrdients est inne (ou le fruit dune longue pratique), vousnobtiendrezjamaisundlicieuxgteauauchocolatmmesivousdisposezdesmeilleursingrdientsetaccessoiresdecuisson,sivousneconnaissezpaslesbonnesproportions,lordredanslesquelsajouterlesingrdients,letempsde cuisson, la temprature : bref, la recette. Demme, sans formation demcanicien ou sans la documentationtechniquedumoteurdevotrevhicule,inutiledevouslancerdansunchangementdejointdeculasse:cestlacasseassure.

    Ilenestdemmedelaprogrammation.Ilexisteplusieurslangagesdeprogrammationtrssimples,extrmementsimplesparfois,quipeuventdonneruntemps lillusionquevoussavezprogrammer.Enentreprisemme,certainsemployssontbombardsdveloppeurspourleursquelquesconnaissancesconfusesdeVisualBasic,deDelphioude Windev. Le rsultat risque dtre catastrophique. Les publicits sont allchantes mais trompeuses. Les bonsprogrammeurs,ycomprislesautodidactes,onttousunmomentouunautreeuaffaireaveclesalgorithmes,carilexiste en programmation unemultitude demoyens darriver un rsultat,mais trs peu pour obtenir lemeilleurrsultatpossible, cequiexpliquepourquoibeaucoupdeprogrammesayant lamme fonction,se ressemblent (auniveau de la programmation) alors que ce ne sont pas les mmes programmeurs qui les ont dvelopps. Lesdbutantsquiselancentdansdesprojetsdeprogrammationaudacieuxseretrouventparfoisbloqus,nematrisantpasunetechniqueparticuliredelogiquedeprogrammation.Certainsabandonnent,dautrestrouventunmoyendecontournement (souventpeu reluisant). Lesderniers lirontpeuttreun livredalgorithmiquecommeceluici, qui dfautdedonnerunesolutioncomplteleurproblme,leurfourniralesbasesetlestechniquespouravancer.

    Les ordinateurs personnels du dbut des annes 1980 taient tous livrs soit avec un langage BASIC inclusdirectementdanslamachine(enROM),soitsurunecartouche,cassetteoudisquetteannexe.LeBasicdeMicrosoft(Qbasic,Quickbasic)taitlivravecleDOSduPC.LesAmstradavaientlebasicLocomotive,lesAtariSTlAtariBasicetsurtoutleGFABasic,unlangagedegrandeclasse,etc.Unegnrationcompltedutilisateurssestlancedanslaprogrammationlaidedeceslangagesetdeladocumentationfourniequibiensouventfournissaitnonseulementlesrfrencesdu langagemaisaussi lesmthodesdebasedeprogrammation.Avecplusoumoinsdesuccs.Lersultattaitsouventuninfmebidouillage,maisquimarchait.

    Orlebutnestpasqueleprogrammefonctionne,maisquilfonctionneviteetbien,breflemieuxpossible.Lemeilleurordinateuraumondeetlemeilleurlangageaumondenevousyaiderontpas.

    2.Dfinition:lalgorithmeestunerecette

    Avezvousdjeuloccasiondeprogrammerunmagntoscope(envoiededisparition)ouunenregistreurdedvd?Quavezvous fait la premire fois que vous avez allum votre poste de tlvision pour rgler la rception deschanes?Nuldoutequevousavezouvertlemodedemploietsuivilasquencedinstructionsindique:appuyersurlatoucheMenudelatlcommande,sedplacersurEnregistrementetappuyersurOK,sedplacersurunelignepuisindiquerlachane,lheure,etc.

    Avezvousdjeu loccasiondefaire lacuisine?Pourungteau,voustesvouslancdirectementouavezvousouvertun livrepourrcuprer la listeet laquantitdechaque ingrdient,poursuivre larecette: faites fondre lechocolatetlebeurredansunecasserolefeudoux,retirezlacasseroledufeu,incorporezlesjaunesduf,puislesucreetlafarine,battezlesufsenneigepuisincorporezdoucementdanslemlange,etc.

    Danslesdeuxcas,flicitations!Vousavezdroulvotrepremieralgorithme!

    Unedfinitionsimpledunalgorithme : cestunesuitedinstructionsqui,quandellessontexcutescorrectementaboutissent au rsultat attendu. Cest un nonc dans un langage clair, bien dfini et ordonn qui permet dersoudreunproblme,leplussouventparcalcul.Cettedfinitionestrapprocherdufonctionnementdelamachinede Turing qui avant lapparition de lordinateur utilisait cette dmarche pour rsoudre de nombreux problmes.Lalgorithmeestdoncunerecettepourquunordinateurpuissedonnerunrsultatdonn.

    LemotalgorithmevientdunomdumathmaticienAlKhuwarizmi(MuhammadibnMsalKhuwrizm),savantpersanduIXmesicle,auteurdunouvrageappel"Latranspositionetlarduction",Aljabrwalmuqbalah.LemotAljabrdeviendraalgbre,lenomdelauteurseralatinisenAlgoritmi,quiseralabasedumotalgorithme.

    3.Pourquoiutiliserunalgorithme?

    Lalgorithme dcrit formellement ce que doit faire lordinateur pour arriver un but bien prcis. Ce sont lesinstructionsquondoitluidonner.Cesinstructionssontsouventdcritesdansunlangageclairetcomprhensibleparltrehumain:fairececi,fairecelasilersultatatellevaleur,etainsidesuite.

    - 1 - ENI Editions - All rigths reserved

  • Un algorithme bien tabli et qui fonctionne (tout au moins en thorie) pourra tre directement rcrit dans unlangagedeprogrammationvolucommeleC,JavaouPHP.Malheureusement,enprogrammationcestsouventlhommedesemettreauniveaudelamachine.

    Delarflexionlaprogrammation

    Plus que cela, un algorithme dcrit une mthode de rsolution de problmes courants. Un algorithme est doncrutilisable, sauf casponctuelou trsprcis. Il existeplusieursmoyensdobtenirunmmersultat,maiscertainssontmeilleursquedautres.Cest lecasparexempledesmthodesdetrisdedonnesparordrealphabtique.Ilexiste divers algorithmes dcrivant ces mthodes, certaines tant adaptes des quantits plus ou moinsimportantesdedonnes.

    Lamatrisedelalgorithmiqueetlapprentissagedesalgorithmesdebasesontunedesconditionsdelarussitedunprojetenprogrammation,quilsoitpersonnelouprofessionnel.Lexprienceaidant,vousallezacquriraufuretmesuredesmcanismesdepensequivouspermettrontdoptimiser lestraitementsquevousdevezprogrammer,tantenvitessequenoccupationmmoireoummeenquantitdelignesdeprogrammation.Surcedernierpoint,ilexistedenombreuxcasodesalgorithmes longsetcomplexessontplusperformantsquedautressemblantpluspratiquesaupremierabord.

    Apprendre lalgorithmique (ou lalgorithmie, les deux sont autoriss) cest donc apprendre programmerdans lesrglesdelart.Toutaulongdecetouvrage,vousallezdcouvrirlesnotionslmentairesquivouspermettronttantdecomprendrelefonctionnementinternedunprogrammequedeleconcevoir,laideduneprogressionsimpleetconstanteetdexemplespratiquesetcomprhensibles.

    4.Leformalisme

    Le but dun algorithme tant de dcrire un traitement informatique dans quelque chose de comprhensible parlhumain(etfacilementtransposableverslamachine),pourquunalgorithmesoitcomprhensible,ilfautquilsoitclairetlisible.Danscecas,ilexistedeuxmoyensefficaces:

    l soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela),

    l soitdefaireunschmaexplicatifavecdessymboles.

    Dans lapratique, lesdeuxformessontpossibles.Maisundessinnevautilpasun longdiscours?Ilestdailleurscourantdecommencerparunschma,puisquandceluicidevienttropcomplexe,depasseruntexteexplicatif(larecette).

    Danslesdeuxcas,lasyntaxepourletexteoulessymbolespourlesschmasdoiventrpondredesrglesstrictes,voirenormalises.Ilfautquechacunconnaisseleursignificationetsachedonclesinterprter.Cestpourcelaquetoutes les reprsentationsalgorithmiquessuiventpeudechosesprs lemme formalisme.Si lesschmassontpossibles,ilssontcependantmoinsutilissquelesalgorithmessousformetextuelle.Cestquesivousconstruisezunalgorithme,ilestplusfaciledelecorrigerquandilestsaisiauclaviersousformedetextequelorsquilestdessinsousformedorganigrammedansunlogicieldedessinvectorieloudeprsentation.

    a.Lareprsentationgraphique

    Lesalgorithmespeuventtreconstruitslaidedesymbolesdorganigrammes.Lestudiantseninformatique(BTS,DUT) connaissent bien cette tablette en plastique permettant de dessiner des organigrammes. Ils lutilisent enalgorithmique,enbasededonnes,enmthodeMerise,etc(danschaquecaslasignificationestdiffrente).Voiciunexempledalgorithmesousformedorganigrammequisimuleunlancdedetquidemandeunepersonnededevinerlavaleur.

    - 2 - ENI Editions - All rigths reserved

  • Unformalismequioccupetropdeplace

    Danscetexemplesimplifi,lestraitementssontdansdesrectangles,lesprisesdedcisiondansdeslosanges,etles flches reprsentent lordre du droulement du programme. Si une valeur est prsente ct de la flche,lactiondpenddursultatdelaquestionposedanslelosange.Lesdcisionsetlesflchespeuventdcriredesboucles.Dansleschma,tantquelutilisateurnapassaisilabonnevaleur,laquestionluiestdenouveaupose.

    Cetalgorithmeesttrssimple,lorganigrammeaussi.Cependantvoyezdjlatailledeceluici(laplacequilprend)parrapportcequilfait.Imaginezmaintenantunalgorithmepluscomplexequidoitparexempledcriretouslescas de figure dans la gestion dune communication entre deux machines (description dun protocole decommunication):leschmancessiteraunefeuilledunegrandedimensionetseradifficiletudier.

    b.Lalgorithmesousformedetexte

    Prenezlemmenoncdulancded.Celuicipourraittrecritainsienfranaiscorrect:

    l 1retape:lancerled.

    l 2metape:saisirunevaleur.

    l 3metape : si la valeur saisie est diffrente de la valeur dud, retourner la troisimetape, sinoncontinuer.

    l 4metape:afficher"bravo".

    Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprendceque lalgorithmeest cens faire.Cependant, si lesalgorithmescomplexesdevaienttrecritsainsi, ceseraitencoreunefoisbientroplongetvousfiniriezsoitparvouslasserdunecrituretropcomplexe,soitcelaprendraittropdeplace.Cestpourquoiilfaututiliserunesyntaxeprciseetconcise.

    /* Commentaires : ce programme affiche bonjour */ PROGRAMME HelloWorld

    /* Dclarations : variables, constantes, types, etc */ VAR de:entier, valeur:entier

    - 3 - ENI Editions - All rigths reserved

  • /* Dbut du programme */ DEBUT dealatoire(6) valeur0 Tant que valeurde Faire Lire valeur FinTantQue Afficher "Bravo"FIN

    Sivouscomprenezdjleprogrammecidessusalorscetouvragevousseraencoreplusagrablelire.Sinon,lasuitevousdonneradetoutefaontouteslesexplicationsncessaireslacomprhensiondechaquelignedecetalgorithme.Ilreprenddemaniretrsdtailletouteslestapessuivre.Souscetteforme,ilestpresquepossibledimplmenterlalgorithmelignelignedansunlangagedeprogrammationvolu.

    Cest sous cette forme textuelle que les algorithmes seront reprsents dans ce livre. Ce texte, programmeoupseudocodealgorithmique,estdcomposenplusieursparties:

    l Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME".

    l Une zone de dclaration des donnes utilises par le programmes : variables, constantes, types,structures,tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuretmesuredesdiffrentschapitres.Cettezonecommenceparlemot"VAR".

    l Leprogrammeluimme,cestdirelesdiverstraitements.Lesinstructionsduprogrammesontencadrespar lesmots "DEBUT" et "FIN". Il vous est conseill, pour plus de clart et de lisibilit, dindenter lesdiverses lignes (de les dcaler les unes par rapport aux autres) laide des touches de tabulation. Leprogrammepeuttredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance.

    l Les commentaires : cest un texte libre qui peut tre tendu sur plusieurs lignes et encadr par lessquences de caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvezuniquementlacommencerparlescaractres"//".

    l Unedernirepartie,oupluttpremirecar lorsquelleestprsenteellesesitueavanttoutes lesautres,peuttreconstituedessousprogrammes,semblantsdeprogrammescompletsappelsparleprogrammeprincipal.Cessousprogrammes,appelsprocduresoufonctions,fontlobjetdunchapitrecomplet.

    5.Lacomplexit

    Lexemple du lanc de d est un algorithme trs simple, court, concis et rapide. Ce nest pas le cas de tous lesalgorithmes.Certainssontcomplexesetletraitementrsultantpeutncessiterbeaucoupdetempsetderessourcesdelamachine.Cestcequonappellele"cot"delalgorithme,etilestcalculable.Siunalgorithmeest"gourmand"soncotserapluslev.Ilexistecertainscasoilestpossibledutiliserplusieursalgorithmespoureffectuerunemme tche, comme pour trier les lments dun tableau de valeurs. Certains algorithmes se rvlent tre pluscoteuxquedautres,passuncertainnombredlmentstrier.Lecotdunalgorithmerefltesacomplexitouentermeplussimplesonefficacit.Lesmots"cot","complexit"et"efficacit"refltenticilammedfinition.Plusunalgorithmeestcomplexe,plusilestcoteuxetmoinsilestefficace.Lecalculdecettecomplexitacommersultatunequationmathmatiquequonrduitgnralementensuiteunenotiondordregnral.

    LacomplexitestnoteO(f(n))oleO(grandO)veutdire"dordre"etfestlafonctionmathmatiquedenquiestlaquantitdinformationsmanipuledanslalgorithme.Voiciunexemplepourmieuxcomprendre:soitunalgorithmequicomptede1netquiaffichelesvaleurscorrespondantes.Danslapratique,vousallezutiliseruneboucle(voirlechapitreLesboucles)allantde1n.Ilfaudrafairenpassagespourtoutafficheretdoncvousallermanipulernfoislinformation.Lafonctionmathmatiquedonnantlecotseraalorsf(n)=n.LacomplexitestalorslinaireetvouslanoterezO(n).

    Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexempleunetabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvousobtenezn fois n boucles, doncn2 boucles. La complexit est donc f(n)=n2, et vous la noterezO(n2). Le cot delalgorithmeaugmenteaucarrdunombredinformations.

    Sivousajoutezenplusunequelconqueoprationdanslapremireboucle,cetteoprationaaussiuncotquevouspouvez tenter de prendre en compte. Si vous ajoutez unemultiplication et que celleci a un cot de 1, alors lacomplexitfinaleestden*(n+1)soitn2+n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetquevouscomparezaveclacourbesimplen2,vousremarquerezquelerajoutdevientngligeable.Aufinal,lalgorithmeconserveunecomplexitO(n2).

    Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies" :

    - 4 - ENI Editions - All rigths reserved

  • l O(1) :complexitconstante

    l O(log(n)) :complexitlogarithmique

    l O(n) :complexitlinaire

    l O(n.log(n)) :complexitquasilinaire

    l O(n2) :complexitquadratique

    l O(n3) :complexitcubique

    l O(np):complexitpolynomiale

    l O(nlog(n)) :complexitquasipolynomiale

    l O(2n) :complexitexponentielle

    l O(n!) :complexitfactorielle

    Cescomplexitsnesontpasforcmentfacilesapprhender,aussivoiciungraphiquereprsentantquelquesunesde cellesci. En abscisse est indiqu le nombre de donnes traiter et en ordonne la complexit associe : lenombredoprationseffectuespourndonnes.PourdescomplexitsdordreO(2n) lalgorithmeeffectuedj1024oprationsetplusde3,5millionspourO(n!) !

    Courbesdecomplexit

    Commentsereprsenterrellementunecomplexitentermedetempspassparlordinateurtraiterlesdonnes ?Chaque microprocesseur est capable de traiter un certain nombre doprations par seconde. Le plus long tantgnralementlescalculssurlesrels(flottants),lecritresouventretenupourdterminerlapuissancebrutedunprocesseurestleFLOPS:FloatingPointOperationsPerSecond.UnIntelPentium43.2GHztourneunemoyennede3,1GFLOPS(GigaFlops)soit109FLOPS,ouencoreunmilliarddoprationssurrelsparseconde.Sivoustraitez20donnesdansunalgorithmedecomplexitO(n), lavitessedecalcul sechiffreenmillionimesdeseconde.LemmenombrededonnesdansunalgorithmedecomplexitO(n!)doiteffectuer2432902008176640000oprationscequiprendra784807099secondes,ouencoreunefoisconvertiautourde25ans!Bienentendu,unecomplexitO(n!)estlapirequipuisseexister.AvecunecomplexitinfrieureO(2n),letraitementprendraitundiximedesecondetoutdemme,cequiestnormeetrelativisefortementlapuissancedesprocesseurs

    - 5 - ENI Editions - All rigths reserved

  • Vouscomprenezmaintenantlutilitdeconnatrelacomplexitdesalgorithmesetdoptimiserceuxci

    Dans la suite, les complexits ne seront fournies que dans les cas o les traitements, plus compliqus quedhabitude, sonten concurrenceavecdiversesmthodes.Cest le casparexempledesmthodesde tris surdestableaux.Cecidansluniquebutdevousdonnerunsimpleordredide.

    - 6 - ENI Editions - All rigths reserved

  • Lesfondementsdelinformatique

    1.ArchitecturedeVonNeumann

    Un ordinateur est un ensemble de circuits lectroniques permettant demanipuler des informations quon appelle des donnes etcapable de faire "tourner" des programmes, cestdire une suite ou squence dinstructions programmes lavance et quil vadroulerdudbutlafindanslebutdobtenirdesrsultats.Pourcomprendrecommentunordinateurpeutdroulerunprogramme,ilfauttudierunpeuplusendtailsonfonctionnement.

    CestVon Neumann qui a dfini en1944 larchitecture des ordinateursmodernes encore largement utilise aujourdhui (avec desvariantes cependant). Larchitecture de Von Neumann (issue des travaux de Turing dont il sera question plus loin) dcomposelordinateurenquatrepartiesdistinctes:

    l LUnit Arithmtique et Logique UAL (ALU en anglais) est lorgane de lordinateur qui excute les calculs : additions,soustractions, multiplications, divisions, modulos, gestion des signes (positif, ngatif), oprations logiques (boolenne),comparaisons,parfoisrotationsetdcalagesdevaleurs(toujoursdanslecadredunelogiqueboolenne).IlexistedesUALspcialises dans les nombres virgule flottante, dautres dans des traitements complexes comme les logarithmes, lesinversions, les racines, les vecteurs, les calculs trigonomtriques, etc. Certaines documentations lui rajoutent quelquesregistres(petitescasesmmoiresintgreslUAL)etluidonnentlenomdeprocesseur(CPU).

    l LUnit de Contrle UC (CU en anglais), ne pas confondre avecUnit Centrale, contrle le squenage des oprations,autrementdit ledroulementduprogramme.Elleprendses instructionsdans lammoireetdonnesesordres lUAL. Lesrsultatsretournspeuventinfluersurlesquenage.LUCpassealorslinstructionsuivanteouuneautreinstructiontellequeleprogrammeluiordonnedeffectuer.

    l Lammoire peut tre dcrite comme une suite de petites cases numrotes, chaque case pouvant contenir une petiteinformation(petitedanslesensolatailledechaquecaseestfixe).Cetteinformationpeuttreuneinstructionouunmorceaudinstructionduprogramme(uneinstructionpeutoccuperplusieurscases)ouunedonne(nombre,caractre,oumorceaudeceuxci). Cest lUCqui a comme rle central de contrler laccs lammoirepour le programmeet les donnes.Chaquenumrodecaseestappeluneadresse.Pouraccder lammoire, ilsuffitdeconnatresonadresse.Les instructionsduprogrammepourlUCetlesdonnespourlUALsontplacesdansdeszonesdiffrentesdelammemmoirephysique.

    l LesEntres/SortiesE/S(I/Oenanglais)permettentdecommuniqueraveclemondeextrieuretdoncvous:cepeuttreunclavierpourentrerlesdonnes,etuncranpourafficherlesrsultats.Ilpermetlordinateurdtreinteractif.

    Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstructionduprogrammeetlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALdeprendrecesdeuxnombresenmmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvellecase.PuislUCpasselinstructionsuivante.Sielleconsisteaffichercersultat,alorslUCvalirelecontenudelammoireladresseoestplaclersultat,puisvaenvoyerlersultat via le composant dE/S adquat. Et ainsi de suite. Au final le droulement dun programmeau sein de lordinateur est lesuivant:

    l lUCextraituneinstructiondelammoire,

    l analyselinstruction,

    l rechercheenmmoirelesdonnesconcernesparlinstruction,

    l dclencheloprationadquatesurlALUoulE/S,

    l rangelersultatdanslammoire.

    VonNeumann,predesordinateursactuels

    Sivousouvrezlecapotdevotreordinateur,vousyverrezunegrandequantitdecartes,composants,cbles,etmmedesorganesmcaniques(lecteursdedisquesdurs,cdetdisquette).Unprogrammequevousallezcrireetdroulernesexcutepourtantquedansunseulendroit: lemicroprocesseur.Lemicroprocesseurdevotreordinateurestunepucefacilementreconnaissablecarcestsouventlaplusgrosse,cellequidisposeduplusdepattesetestgnralementsurmontedungrosblocdaluminiumoudecuivreaccompagndun ventilateur pour le refroidir. Il contient lUAL, lUCet divers autres organes : des registres spcialiss (donnes,compteurs,adresses,tats,etc),unsquenceurquisynchronisetouslescomposants,unehorlogeinterne,uneunitdentresortiequigrelacommunicationaveclammoire(nepasconfondreaveclE/Sdespriphriquesclavier,cran,etc).Lemicroprocesseurdisposeselonsonmodledunjeu(ensemble)dinstructionsprdfini.

    Sil tait tout seul, le microprocesseur ne pourrait pas faire grand chose. Au sein de larchitecture de Von Neumann seuls sont

    - 1 - ENI Editions - All rigths reserved

  • reprsentslescomposantslogiquesdebase.Autourdeceschmalogiqueseraccordentbiendautresorganeslectroniquescommelescontrleurs.Cespuceslectroniquesquonappelleaussiparfoischipsetssontaussidessortesdemicroprocesseursquidisposentsouventdunjeudinstructionspour lescontrler, justement.Ces instructionssontsouventmoinsnombreusesetpasgnralistes.Lescontrleursontunrleprcis,selonleurgenre:greruncertaintypedepriphrique(ex:uncontrleurdecartegraphique,uncontrleur pour les disques durs, etc), ou de transfert de donnes (ex : les contrleurs des bus demmoire et de donnes, lescontrleursUSB,PCI,etc).Touscescomposantssontintgrssuruncircuitimprimprincipalappellacartemre.

    ArchitecturedeVonNeumann

    Pourrsumer:larchitecturedeVonNeumannestsimplecomprendreetrpartitlesfonctionnalitsdunordinateurenquatreentitslogiques. Ces entits logiques se retrouvent pour deux dentre elles (UC et UAL) dans le microprocesseur. Les autres et lescomposantsadditionnelsseretrouventsurlacartemreousurlescartesdextension(lammoirenestplussoudesurunecartemre mais fournie sous forme de carte additionnelle appele barrette, le contrleur E/S graphique est sur une carte graphiqueadditionnellerelieunbusPCI,AGPouPCI/E).Lesprogrammessontexcutsparlemicroprocesseurquiestaid(danslesensoceluiciaccdeauxfonctionsproposes)pardiverscontrleurs.

    Lesmicroprocesseursactuelssonttrscomplexes.IlnestpasraredetrouverauseindeceuxciplusieursUALpouracclrerles traitements.Demme, on trouve souvent unemmoire intermdiaire appelemmoire cache ou antmmoire, celleci

    tantsouventspcialise:unemmoirecachepourlesinstructionsetuneautrepourlesdonnes.

    2.LamachinedeTuring

    Avantmmelapparitiondespremiersvraisordinateursprogrammables,AlanTuringavaitdfinien1936(le28maiexactement)cequonappellelaMachinedeTuring.Cettemachineabstraite(quinexistepasrellement)estenfaitunemthodedemodlisationdufonctionnementdun ordinateur ou plutt loriginedun calculateurmcanique.Comment faire pour, depuis un postulat de base,arriverunrsultatdonn?Enrespectantdesprocduresdonnes.Cestlundesprincipesdelalgorithmique.

    UnemachinedeTuringntantpasunevraiemachine(ausensmatriel),ilsuffitpoursenservirsoitdeseservirdesatte(rflexionetmmoire),soitduncrayonqui feraofficedettede lecture, dunelonguebandedepapierdcomposeencasesquonappelleruban,etdunetabledesymbolesetdeprocdureslieltatdelacaserespecterquandontombesurunecasecontenantunsymboledonn.On seplace sur la premire case, onvrifie son symbole et sontat associs, onexcute la procdureassocie(changementdevaleur/symbole,avancer, reculer)eton continuedrouler ce "programme" jusqu ceque laprocdurevrifiantquon a obtenu le rsultat final soit vrifie. On vient de drouler un programme, et lensemble symboles/procdure dcrit ceprogramme.Cestlanctredelalgorithme.

    AlanTuring,crateurdelamachineabstraitedummenom

    Ilexistedes livrescompletssur lamachinedeTuring,notammentundeAlanTuring luimmeetdeJeanYvesGirard,auxditionsSeuil,CollectionPointsSciences.Linformatiquenestpas leseuldomainedapplicationde lamachine.Ellepermetdedterminer lacomplexitdunalgorithme,siquelquechosepeutvraimenttrecalcul,adesdomainesdapplicationsdanslaphysiqueetnotammentloptique,etc.VouspouvezsimulerunemachinedeTuringsurvotreordinateurviaplusieurslangagesdontunappelBrainf*ck.

    - 2 - ENI Editions - All rigths reserved

  • ExempledemachinedeTuring

    3.Reprsentationinternedesinstructionsetdesdonnes

    a.Lebinaire

    quoi ressemblent les instructions et les donnes (valeurs) utilises rellement par lordinateur ? Celuici ne comprend quunechose:deschiffres.Siltrehumainainventdesreprsentationspratiquesdeschiffresaveclesystmedcimal(soitunenotationenbase10enallantdezroneuf),unordinateurnemanipulequedeuxvaleurs:0ou1.Eneffetsivouspouvieztrsfortementagrandiruncircuitintgr,vousverriezqueceluiciestcomposdenombreusespistesdanslesquellespasseuncourantlectrique.

    Danscescircuits ilnyaquedeuxpossibilits:soit lecourantpasseetdanscecascelaquivautunevaleurdeun(1),soit lecourantnepassepas,etdanscecascestlavaleurzro(0)quiestretenue.Cestdubinaire(quineprendquedeuxvaleurs).Uneunitbinairesappelleunbit(binarydigit).CemotatinventparClaudeShannonen1948.

    Commeilyaplusieurspistessurlescircuits,plusieursvaleurs0et1,doncplusieursbits,circulentenmmetemps.Enassociantcesvaleurs,onobtientdesvaleursplusgrandes.Enpassantdesdonnessurunfil,lavaleurmaximaleestde1.Sionprenddeuxfils,soitdeuxbits,lavaleurmaximaleenbinaireest11,soit3endcimal.Pourquoi?Voiciunedmonstrationpartapes:

    Une analogie fort ancienne (en informatique, ancien peut signifier un laps de temps trs court), des annes 1980, expliquait lefonctionnementdesnombresbinairesenassociantdes fils transportantducourantdesampouleslectriques.Chaqueampoulereprsenteunevaleur.Silecourantpasse,lampoulesallumeetprendlavaleurassocie.

    Lebinaire,commesonnomlindique,utiliseunebasedeux(2)toutcommeledcimalutiliseunebasedix(10).Endcimal,touslesnombrespeuventtrereprsentslaidedepuissancesde10.Prenezlenombre1234:

    1*103+2*102+3*101+4*100=1234

    Lunitest reprsentepar100, ladizainepar101, lacentainepar102,etainsidesuite.Pourconvertir lebinaireenunevaleurdcimalepluslisible,ilfaututiliserlespuissancesde2,lapluspetitevaleurtantlaplusdroiteetestappelebitdepoidsfaible,laplusgrandelaplusgaucheetestappelebitdepoidsfort.Danslexempleprcdent,lavaleurbinaire11peuttreconvertieainsi:

    1*21+1*20=21+20=2+1=3

    Les informaticiens et mathmaticiens utilisent une notation particulire en indice (nombres en retrait bas) pour indiquer desconversions:

    11(2)=3(10)

    Voiciundernierexempleavecunevaleurbinairecodesur8bits.Quelleestlaplusgrandevaleurdcimalequipeuttrecodeavec8bits?

    27+26+25+24+23+22+21+20=128+64+32+16+8+4+2+1=255

    Donc

    11111111(2)=255(10)

    Soit256valeurspossiblesde0 (zro)255, cequipeuttreplus simplement calculpar2n, soitdeuxpuissancen,ntant lenombredebitscontenusdanslavaleurbinaire.Laplusgrandevaleurconvertieendcimalestdonc:

    2n1

    Il est possible de convertir du dcimal en binaire avec des divisions successives : on divise les rsultats sans la virgulesuccessivementpardeux. Le rsultatbinaire sera la juxtapositiondes restes (0ou1) saufpour ledernier. Par exempleavec lenombre183:

    CourantFil1 CourantFil2 Binaire Dcimal

    Nepassepas Nepassepas 00 0

    Nepassepas Passe 01 1

    Passe Nepassepas 10 2

    Passe Passe 11 3

    - 3 - ENI Editions - All rigths reserved

  • l 183/2=91,reste1

    l 91/2=45,reste1

    l 45/2=22,reste1

    l 22/2=11,reste0

    l 11/2=5,reste1

    l 5/2=2,reste1

    l 2/2=1,reste0

    l Onremontedudernier:10110111

    Conversiondcimaleenbinaire

    Cest donc en binaire que sont reprsentes toutes les valeurs quun ordinateurmanipule. Cest valable tant pour les donnes(numriquesoutexte)quepourlesinstructionsdestinationdumicroprocesseur.Unnombrebinairecorrespondrauneinstruction.Parexemplesurunmicroprocesseurx86(IntelouAMD),01110100estlinstructionje(jumpifequal),ouencorelaligne1011000001100001quisignifiemov$0x61,%al(placerlavaleurhexadcimale0x61dansleregistreAL).

    Lesordinateursdudbutdesannes2000saventmanipulerdesnombressur64bitsor264estgal18446744073709551616soitplusde18milliardsdemilliards!

    Lide dutiliser deux valeurs pour encoder dautres valeurs remonte Francis Bacon. En 1623, il cherche une mthodestganographiquepourpouvoircrypteruntextecomposdeslettresdelalphabet.Ilremarquequunassemblagededeuxlettresgroupesparcinqpermetdecoderlensembledelalphabet.Ilappellecetalphabet"bilitre".Le"a"taitreprsentpar"AAAAA",le"B"par"AAAAB",jusquau"Z","BABBB".Lalphabetdelpoque,lelatin,contenaitvingtquatrelettres,le"j"seconfondantavecle"i"etle"u"avecle"v".

    b.Lesoctetsetlesmots

    Unordinateursaitmanipulerindividuellementchaquebitdunevaleur.Maislesbitsnesontpasstocksindividuellementdansunecase mmoire. Ils sont regroups, gnralement par multiples de huit (8). Ainsi un ensemble de 8 bits est appel un octet.Lavantagede loctetestquil suffit (ouen toutcasa longtempssuffi)pour reprsenter tous leschiffres, lettresetsymbolesdesalphabetsoccidentaux.Unoctetreprsentelesvaleursde0255.

    Aveclaugmentationdesespacesdestockages,delaquantitdemmoire,dubesoindereprsentationdenombresdeplusenplusgrands,dunaccsplusrapidelammoireouencoredeplusdinstructions,ilafalluaugmenterlatailledesvaleursmanipuler.De8, puis 16, puis 32, certains microprocesseurs peuvent manipuler des valeurs de 64 voire 128 bits, parfois plus.. Ces valeursdeviennent difficiles dcrire et reprsenter. Pour ces valeurs, on parle de mot mmoire (word en anglais). Certainsmicroprocesseursfontunediffrenceentrediverstypesdemots.CeuxdeMotorolacommeles68000(quiquipaientlesordinateursAtariST,Amiga,lesconsolesSegaMegadriveetplusrcemmentlesPalmPilot)utilisentdesmotsde16bits,etdesmotslongs(longword)de32bits.

    Lesinstructionsetlesdonnessontdonccodessousformedenombresbinairesquonappelledesmots.Cependantsuivantletypedemicroprocesseurlordredesmotsestdiffrententrelaralitetsonstockageenmmoire.Avecunmicroprocesseurx86enmoderel(16bits)lenombredcimal38457ncessite16bitssoitdeuxoctetsouunmotdeseizeoctetspourtrereprsent:

    38457(10)=1001011000111001(2)

    Pourstockercettevaleurenmmoire,les8premiersbitsdepoidsfaible,soitloctetdepoidsfaible,serontplacsdanslapremirecasemmoire,etles8derniersbitsdepoidsfort,soitloctetdepoidsfort,serontplacsdanslacasesuivante.Ladmarcheseraitlammeen32bitsou64bits.

    Casemmoire1 Casemmoire2

    00111001 10010110

    - 4 - ENI Editions - All rigths reserved

  • c.Lhexadcimal

    Sivousreprenezlexempledunevaleurbinairecodesur64bits,ilfaut640ou1pourladcrire :

    1111111111111111111111111111111111111111111111111111111111111111

    Endcimalilfautvingtchiffres:18446744073709551616

    Celaprendbeaucoupdeplaceetcestdifficilemanipuler.Puisquilexisteunebase10(dcimal)etunebase2(binaire),pourquoinepasprendreunebaseplusleve,multiplede2,pour rduire la longueuret lamanipulationdecesnombres?Cestainsiqueninformatiqueilestdusagedutiliserlabase16,appelehexadcimale.

    Unebasehexadcimalepermetdecoder lesvaleursde015.Side09onutilise lesvaleursdcimalescorrespondantes,audessusilfaututiliserdeslettresdelalphabet,deA(10)F(15).

    Commentpasserdubinairelhexadcimal?Cecirevientrpondrelaquestion"Combienfautildebitsdansunnombrebinairepourcoder16valeurs ?"24=16.Ilfautdonc4bits.Letableausuivantrsumelesconversions.

    Sivousreprenezlenombre183quincessite8bitssoitunoctet,saconversiondonneB7enhexadcimal.Onditdoncque:

    183(10)=B7(16)

    dudcimallhexadcimal

    Sivousprenezlavaleurmaximaleen64bits,celadonneFFFFFFFFFFFFFFFFsoit16caractres.Uninformaticienexercestquasimentcapabledeconvertirlavoledelhexadcimalendcimal.Prenezlavaleur8Csoit10001100enbinaire.LeCvaut12.

    8*16+12=140

    Sans aller plus loin, sachez que les bases 2, 10 et 16 ne sont pas les seules. Sur certaines machines et certains systmesdexploitation,ilestcourantdutiliserunebase8pourdesvaleursnencessitantquetroisbitspourtrereprsente.Sommetoute,tantquilresteassezdesymboles,riennempcheraitdavoirunebase30!

    Dcimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

    Hexa 0 1 2 3 4 5 6 7 8 9 A B C D E F

    Binaire 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

    - 5 - ENI Editions - All rigths reserved

  • Leslangagesdimplmentation

    1.Quellangage?

    Ilexisteplusieurscentainesdelangagesdeprogrammationsiontientcomptedetouteslesvariantespossiblesdunmmelangage.Commevousavezpulelireaudbutdecechapitre,lordinateurnecomprendnativementquunseullangage, le langage machine. Croyezvous vraiment que vous allez implmenter le programme de lancer de ddirectement en binaire (oumme en hexadcimal) ? Le choix du langagemrite une petite dmonstration. On acoutumedanslemilieudelinformatique,detesterunlangageenluifaisantafficherunmessagepourdirebonjour,enloccurrencelefameux"Helloworld!".Voicicommentaffichercetextedansdiverslangages:

    Cseg segment assume cs:cseg, ds:cseg org 100h main proc jmp debut mess db Hello world!$ debut: mov dx, offset mess mov ah, 9 int 21h ret main endp cseg ends end main

    echo "Hello world!"

    10 PRINT "Hello world!" 20 END

    IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. DISPLAY "Hello world!". STOP RUN.

    #include

    int main(int argc, char **argv) { printf("Hello world!\n"); return 0; }

    #include

    Enassembleurx86sousDOS

    EnshellUnix

    EnBasicoriginel

    EnCOBOL

    EnlangageC

    EnlangageC++

    - 1 - ENI Editions - All rigths reserved

  • int main() { std::cout
  • bote de dialogue prend une ligne de langage de haut niveau, mais des centaines en assembleur ! Parmi leslangages de trs haut niveau se trouvent Java, C#, le PHP, oumme le C (en faisant abstraction de certainsmcanismes). Linconvnient dun langage de haut niveau est quil nest pas toujours possible daller dans lesdtailslesplusfins.

    b.Diversesclassifications

    ctdesniveaux,tousleslangagesnontpaslemmebut.IlnestpaspossibledecomparerlelangageHTMLdontlerleestdeformaterdespageswebetleVisualBasicquipermetundveloppementrapidedapplicationsgraphiques.Cestpourquoiilexistedautresclassificationsdontvoiciunbrefchantillon:

    l gnralisteouspcialis

    l objetouprocdural

    l typounontyp(cf.chapitreLesvariablesetoprateurs)

    l interprtoucompil

    l etc

    Certains langages sont spcialiss. Le HTML est spcialis dans la conception de pages web statiques : sonexcutionacommersultatdirectlaffichagedunepageHTMLquilamisenforme.LeSQLestunlangagedebasede donnes : il permet de grer des enregistrements de donnes. Le Javascript est un langage qui permet deprogrammer des pages web dynamiques du ct du navigateur web, tandis que le PHP (bien que devenugnraliste) ou ASP permettent de programmer des sites web dynamiquesmais cette fois du ct du serveur.Certainslangagespeuventfaireappeldautreslangages.VouspouvezparfaitementfaireduSQLdansduPHP,sivotresitedoitaccderunebasededonnes...

    c.Compilouinterprt

    Uneautredistinctionprendreencompteestladiffrenceentreunlangageinterprtetunlangagecompil.Unlangageestditcompilquandleprogrammesourcesousformedetexteesttoutdabordluettraitparunautreprogrammeappel compilateurqui le convertit en langagemachinedirectement comprhensiblepar lordinateur.Voustapezvotreprogramme,vouslancezlacommandedecompilationetenfinvousobtenezunfichierexcutable(un .exe sous Windows par exemple) que vous pouvez le cas chant lancer comme nimporte quel autreprogrammeenlangagemachine.

    Unprogrammeen langage interprtncessitepour fonctionnerun interprte(ou interprteur)quiestunautreprogramme qui va traduire directement, au fur et mesure de son excution, votre programme en langagemachine,unpeucommeunvrai interprtequidansune interviewtraduitsimultanment langlaisenfranais.Leprogramme est souvent un fichier texte et linterprte analyse la syntaxe de celuici avant de le droulerdynamiquement.

    Unprogrammeinterprtserapluslentquunlangagecompilcausedelaconversiondynamiqueduprogramme,alorsquecettetapeestdjeffectuelavanceavecunlangagecompil.Aucontraire,lacorrectiondeserreursestplussimpleavecunlangageinterprt.Commelacorrectionetlersultatsontimmdiats,linterprtevavitevous indiquer au cours de lexcution o se trouve lerreur de syntaxe (mais pas de logique) lorsquil va larencontrer, quelle ligne, linstruction en cause, ventuellement une aide supplmentaire. Alors quavec uncompilateur, cest aumoment de la compilation, souvent longue, quapparaissent les erreurs. Une fois compil,dautres erreurs plus complexes comme les fuites mmoire peuvent apparatre mais il devient difficile dendterminerlorigine(ilfautalorsfaireappeldautresprogrammesspciauxappelsdbuggers).

    - 3 - ENI Editions - All rigths reserved

  • tapesdecompilationetdditiondesliensenC

    3.Lamachinevirtuelle

    Ilexisteunetapeintermdiaireentrelinterprtetlecompil :lamachinevirtuelleapplicative.Lamachinevirtuelleestunprogramme,gnralementuninterprteur,quipermetdisolerlapplicationquildoitfairetournerdumatrielet mme du systme dexploitation. Le programme na thoriquement aucun accs aux spcificits du matriel,lensembledesesbesoinsluitantfourniparlamachinevirtuelle.Ainsi,toutprogrammeconupourcettemachinevirtuelle pourra fonctionner sur nimportequel ordinateur, dumomentque laditemachinevirtuelle existepour cetordinateur.Cestenquelquesorteunecouchedabstractionultime.Gnralement,leprogrammefonctionnantdepuislamachinevirtuelleadjsubiunepremirephasedecompilationpourletransformernonpasenlangagemachinepropre lordinateur, mais dans un langage "machine virtuelle" pour ainsi dire, que lon nomme bytecode. Cebytecodepourratreinterprtparlamachinevirtuelle,oupluttetcecideplusenplusrgulirement,compillavolejusteaumomentdesonutilisation(technologieJIT,JustinTime).

    Ainsidanscertainescirconstances leprogrammefonctionnepresqueaussivitequunprogrammecompilpourunemachinecible!UnexempledelangageutilisantunemachinevirtuelleestJava.

    - 4 - ENI Editions - All rigths reserved

  • GnrationetexcutiondebytecodeJava

    Pour implmenter vos algorithmes, il vous faut trouver un langage simple, de haut niveau, gnralistemais vouspermettantdvoluerversdesapplicationscomplexesetcompltes.Ilnefautpasquevousayezpasserpardestapeslonguesetcomplexesdecompilationetilfautquelelangageproposeuneouvertureversdautreslangages.Dansunespritdouvertureetdecompatibilit,ilseraitintressantquecelangagenesoitpasdisponibleuniquementsousWindowsetque si possible leprogramme rsultantpuisse fonctionner surplusieurs systmesdexploitationsansavoirlemodifier,nilerecompiler.Plusieurslangagespourraientconvenir.Lemieuxestdechoisirunlangageinterprt :lePHP.

    4.PHP

    a.Lesavantages

    PHP, (PHPHypertextPreprocessor),disposedetoutes lesqualitsncessaires.Ilestdisponiblesur laplupartdesarchitecturesetsystmesdexploitation.PHPestlorigineunlangagedescriptHTMLexcutductduserveur,mais cestaussiun langagecompletdisposantdenombreuses fonctionnalits luipermettantde faire fonctionnerdesprogrammesdepuis la lignedecommandeoudepuisunbureau.Ilestnotammentpossibledeconcevoirdesapplications graphiques compltes en PHP, directement, sans passer par du HTML. Sa syntaxe est largementinspiredulangageC,deJavaetdePerl,avecdesamliorationsspcifiques.LebutinitialdulangagetaitdcrirerapidementdespagesHTMLdynamiques.

    b.Historique

    LoriginedePHPremonte1995quandRasmusLerdorfacrPHP/FI,unelibrairiedescriptsPerlutilisepourlapublicationdesonCVsursonsitepersonnel.Aufuretmesuredesvolutions,lalibrairieatporteenCetagrmente de nouvelles fonctionnalits pour crer des pages dynamiques simples pour le web et accder quelquessourcesdedonnes.PHP/FIsignifiePersonalHomePage/FormsInterpreter.

    PHP/FI2.0sorten1997,toujoursdveloppparuneseulepersonne.Cestlesuccs:50000sites(1%desnomsdedomaines)disentlutiliseroulesupporter.Lescontributeursaffluent.

    - 5 - ENI Editions - All rigths reserved

  • PHP3.0sortenjuin1998,cestlapremireversiondveloppeconjointementparRasmusLerdorf,AndiGutmansetZeev Suraski et entirement rcrite (les versions prcdentes taient trop lentes pour une applicationcommerciale).Outre ses performances, PHP3 estmodulaire et extensible il est possible de lui greffer desAPIsupplmentaires,cequinapasmanqudtrefaitaveclesupportdenombreusesbasesdedonnes,deformatsetdeprotocoles.Ildisposedunesyntaxepluscohrenteetdunsupportbasiquedelobjet.Ilatinstallsur10%duparcmondialdesserveurswebavecdesdizainesdemilliersdedveloppeursetdescentainesdemilliersdesites.

    Le moteur de PHP 4 a t repens afin den amliorer les performances pour des applications complexes etdaugmenterencoresamodularit.Unnouveaumoteuravulejour,appelZendEngine(contractiondeZeevetAndi).PHP4sortofficiellementenmai2000etapportedesperformancesaccrues,lesupportdeplusieursserveursweb,lessessions,unescuritaccrue.

    PHP 5, sorti en juillet 2004, propose, entre autres, une amlioration des performances dumoteur Zend (ZendEngine2),unmodleobjettenduettrsprocheduC++,unecompatibilitaccrueavecdenouveauxstandardsetlesanciens(RPC,XML,.NET...).Cestactuellementladernireversionstable.

    c.Informationspratiques

    PHPpeuttreutilispournimportequelprojet,dont :

    l lesforumsetmessageries

    l lecommercelectronique

    l labanque,lescomptesenligne,lespaiementsenligne

    l lapublicationenligne

    l lesmoteursderecherche

    Toutcequevousvoulez,enfindecompte !

    Voiciquelquessiglesetabrviationsconnatreetquiserontparfoisutilissparlasuitedanscelivre :

    l HTML:HypertextMarkupLanguage

    l PHP:PHP,HypertextPreProcessor

    l SQL:StructuredQueryLanguage

    l MySQL:Serveurdebasededonnesetlesoutilspouryaccder

    l LAMP:LinuxApacheMySQLPHP,lequatuorgagnantdesserveursweb.

    d.Pagesdynamiques

    UnepagestatiqueestunepagecritedirectementenHTML.EllepeutventuellementincorporerducodeJavascriptluidonnantunsemblantdedynamismemaisuniquementductdunavigateuretdesdonneslocales.

    Pourdestraitementspluslourdsncessitantlaccsunebasededonnes,unformatagedetableauenfonctiondersultats,unerecherchepousse,dugraphisme,ilfautpasserpardespagesdynamiquesetparunlangagequiseraexcutductduserveur:ASPsurlesserveursMicrosoft/IIS,Perl,PHP...

    PHPestunlangageServerSideouctserveur.LorsduchargementdunepagePHP,cestleserveurquivalire,interprter et excuter le code. Puis il renvoie le rsultat au navigateur sous la forme de code HTML. Ainsi lenavigateuretlutilisateurnevoientjamaislevritablecodePHPexcut.Deplus,lersultattantunepagewebclassiqueenHTML,pasbesoindinstaller sur le client des composants spcifiques (java...). Il nyadoncpasdenotiondevitessedexcutionductduclient,maiscelleduserveurestprpondrante.

    e.Installerlencessaire

    PHPnesertpasseulementfairedespagesdynamiques.CestunlangageinterprtquiaummetitrequePerl,

    - 6 - ENI Editions - All rigths reserved

  • Python ou TCL est capable de lancer des scripts interactifs ou non. On peutmme utiliser PHP pour crer desinterfacesgraphiques(extensionGTK).LeminimumncessaireetvitalpourapprendrePHPestdonclinterprteurPHPluimmesurunenvironnementsupport(Unix,Windows,Mac...).

    SionparledeLAMP,onvoitbienlarfrence.UnsystmeLinux,unserveurWebApache,unserveurdebasesdedonnesMySQLetuninterprteurPHP.Laversion5dePHPpermetdefonctionneravecIISetMySQLexisteaussipour Windows. On peut donc utiliser une architecture WIMP (Windows, IIS, MySQL, PHP) ou WAMP (Windows,Apache,MySQL,PHP).

    LesdistributionsLinuxdisposentdjduncessairepourlarchitectureLAMPetleparamtrageestassezsimple.De plus, lemode "user_mod" deApache permet chaque utilisateur de crer son siteweb dans un rpertoirespcifiquedesonrpertoirepersonnel.Vousvousreporterez ladocumentationspcifiquedevotre installationpoursavoiroplacervosscriptsPHPafindelestester.SousLinux,cestgnralementdans/var/www/htdocs,ou/srv/www/htdocs,ouencoredanslerpertoirepublic_htmldevotrerpertoirepersonnel.

    SousWindows,cestunpeupluscomplexemettreenuvremanuellement.Onemploiedoncdesdistributionstoutesfaites,lesmeilleuressenommentEasyPHPetXAMPP.Ellesproposentuneinterfacegraphiquepermettantdecontrlerledmarragedescomposants(PHP,Apache,etc.).OnpeutainsidveloppersonsitesousWindowsetleportertelquelsurunserveurUnix.NotezqueXAMPPexistepourWindows,Linux,MacOSetSolaris.

    Voustrouverezcesproduitsauxadressessuivantes :

    l XAMPP :http://www.apachefriends.org/fr/xampp.html

    l EasyPHP :http://www.easyphp.org/

    Pourdvelopper,ilsuffitdunsimplediteurdetextemaisilvautmieuxprfrerunditeurplusvolusupportantlacolorationsyntaxiqueetquelquesfonctionsvolues.SousWindows,lesditeursnotepad++ouHAPEdit3sontparfaitspourdvelopperenPHP.SousLinux,kwrite,gedit,bluefishouquantasontparfaits.

    Pourlestests,unsimplenavigateurweboulalignedecommandesuffisent.

    f.UnpremierprogrammePHP

    LepremierprogrammePHPquevousalleztaper,compileretlancerestlefameux"HelloWorld"dontlalgorithmenemritevidemmentpasdtreexpliqu,carleprogrammesecontentedunsimpleaffichage.LecodePHPrsultantestlesuivant.

    n TapezceprogrammeetplacezledansunfichierappelHelloWorld.php.

    n OuvrezunefentreMSDOS(cmd)sousWindows,ouuneconsole(outerminal)shellsousUnix/MacOSettapezlinstructionsuivantelovotreprogrammeestenregistr.Lesigne" > "indiquelinvitedecommandeoupromptdeMSDOSoudushell,neletapezpas.

    > php HelloWorld.php Hello world!

    Bravo,vousvenezdefairefonctionnervotrepremierprogrammePHP.

    LasyntaxedulangagePHPdecepremierprogrammeesttrssimple.Unepagephpporte lextension .php.Unepage PHP peut tre entirement programme en PHP ou mlange avec du code HTML. PHP est un langage"EmbeddedHTML",cestdirequilapparatnimportequelendroitdelapageHTML.Pourcela,onleplacedansdesbalisesparticulires.OncritdoncunepageHTMLdanslaquelleonintgreducodePHP.LecodePHPestencapsuldansleHTML:cestlencapsulation.

    Titre

    - 7 - ENI Editions - All rigths reserved

  • Vouspourrez,selonvotreconfiguration,accderlapageWebvialURLsuivante :

    http://localhost/HelloWorld.php

    LecodeHTMLgnrseralesuivant :

    Titre Hello World !

    Pourlasuitedecetouvrage,quandceserapossible,lesexemplesenPHPserontadaptsuneutilisationviaunnavigateurWeb.Autrement,etceciseraprcis,lesprogrammesserontexcutsvialalignedecommande.

    - 8 - ENI Editions - All rigths reserved

  • Lesstructuresitratives

    1.Dfinition

    Commeindiqudanslepremierchapitre,laboucleestlaquatrimegrandestructuredebasedelalgorithmiqueetdonc de la programmation. Pass ce chapitre, tout le reste est une application ou une drivation de ces quatrestructuresdebase.Lesbouclessontdesstructuresitratives.Uneitrationoustructureitrativeestunesquencedinstructionsdestinetreexcuteplusieursfois.Cestaussilactiondexcutercetteinstruction.Vousentendrezparlerparfoisdestructuresrptitives,cestlammechosediteautrement.Lebutduneboucleestderpterunblocdinstructionsplusieursfois.Selonletypedeboucle,ceblocvatrerptunnombrefixedefois(nfois)ouselon un certain nombre de critres (un test de une ou plusieurs conditions) que vous connaissez trs bienmaintenant.

    Laboucleestunlmenttrssimpleaupremierabord.Lespremiersexemplesquevousrencontrerezserontbiensouvent vidents. Pourtant elle devient rapidement lune des btes noires du programmeur en herbe causejustementdesfameuxcritresdesortie.Silestestsexcutentuneactiondonne(structureSI)encasderussiteounon,uneerreurdansuneconditiondesortiepeutameneraumauvaisnombredeboucles,nejamaisyrentreroummepire,nejamaisensortir.

    Laboucleestdautantmoinssimpleassimilerquilestprobablequevousnayezjamaisrencontrunestructuredecegenrehorsdelalgorithmiqueetdeslangagesdeprogrammation.Dansle langagecourant,onneparlepasdebouclequand ilsagitderciterune tabledemultiplication.Enalgorithmiquevousdevrezpourtantenutiliserunepourcalculercettetable.Demmedans lutilisationquotidiennede lordinateur,vousnutilisezpascettestructurepourtant,touslesprogrammeslefont.Commentlirelintgralitdunfichierdetraitementdetexte?Commentjouerunmp3ouunevido?laidedesbouclesbienentendu!

    2.Quelquesusagessimples

    Unexemple simple : le cas ounutilisateur doit rpondre unequestionparmiune liste de rponses imposescommeo(oui)oun(non).Silutilisateurrpondautrechose(nimportequoi),ilfautluireposerlaquestion,jusqucequilrpondevraimentooun.

    Pourcrerunetabledemultiplication,de3parexemple,vousallezprocdercommesivouslarcitiez :

    l 3*1=3

    l 3*2=6

    l 3*3=9

    l

    l 3*9=27

    l 3*10=30

    Vous allez donc multiplier 3 successivement par les nombres de 1 10. En algorithmique, vous connaissez lesvariables.Commentaffecterunevaleurde110successivementunevariable?Avecuneboucle!

    Etsimaintenantvousvouliezcrer lensembledes tablesdemultiplication: tablesde1,de2,etc, jusqu10ouplus?Ilvousfaudraimbriquerdeuxboucles!

    Sivousvoulezcalculerunepuissancequelconque,unefactorielle,sortirleplusgranddesnombresparmiunelistedenombressaisis(enattendantlestableaux),etc:ilfaudraencoreutiliserlesboucles.

    Danslechapitreprcdent,vousavezvucommentcalculerlessolutionsdunpolynmeduseconddegr.Etsivoussouhaitiez tracer sa courbe graphique via un programme (en PHP ou Java par exemple) ? Il vous faudra encoreutiliseruneboucle(etquelquesastuces).

    Vousverrezquaveclesboucles,vouspourrezmmeextrairelesracinescarres.

    Cesexemplessimplesmettentenvidenceaumoinstroischoses:

    l Il existe plusieurs types de boucles : certaines ont un nombre fixe ditrations, dautres dpendent de

    - 1 - ENI Editions - All rigths reserved

  • conditionsdesortiequevousaurezdfinir.

    l Ilestpossibledimbriquerplusieursniveauxdeboucles:vouspouvezfairedesbouclesdansdesboucles,autantdefoisquevouslevoulez.

    l Il existe une quantit infinie dutilisation des boucles qui en font une structure incontournable enprogrammationpourlamoindredesapplicationsuntantsoitpeucomplexe.

    - 2 - ENI Editions - All rigths reserved

  • PourFinPour

    1.Unestructurepourcompter

    Troisimeetdernire structure itrativede lalgorithmique, le"PourFinPour" estuneboucle lusagequasiexclusifdescompteurs.chaquepassagedanslaboucle,uncompteurestincrmentoudcrment,selonlecas.Onditalorsquilsagitdunestructureincrmentale.

    Sasyntaxeenpseudocodeestlasuivante:

    Pour variable De dbut fin [PAS pas] Faire Bloc dinstructions Fin Pour

    chaquepassagedanslaboucle,lavariableprendrasuccessivementchacunedesvaleursdanslintervalle[ab](aetbinclus).Lepasestoptionneletestde1pardfaut.Lepseudocodesuivantcomptede110:

    Variable cpt en Numrique Dbut Pour cpt De 1 10 Faire Ecrire cpt Fin Pour Fin

    Ilestpossibledetrouverdessyntaxeslgrementdiffrentes,ellessontcependanttoutesquivalentes:

    Pour variable Allant De dbut fin [PAS pas] Faire Bloc dinstructions Fin Pour

    Ouencore:

    Pour compteur dbut fin [Pas pas] Bloc dinstructionscompteur suivant

    Danscettedernireforme,ilestintressantdeconstaterquilestplussimple,danslecasdebouclescontenantungrosblocdinstructions, de sy retrouver, la variable tant rpte dans la syntaxe de fin de boucle. Enfin, il estpossibledetrouverdessyntaxesalternativesdrivantdecestroisdernires.

    2.maispasindispensable

    Vous aurez rapidement compris que cette boucle ne sert que pour des compteurs. Autrement dit, tout ce quelleproposeestdjintgralementpossibleaveclesstructures"TantQue"et"Rpter".Simplementavecle"Pour"vousnavezpasfairevousmmelecalculducompteur.Cestdoncunesimplification.

    Ilnexisteaucuncasolastructure"PourFinPour"eststrictementncessaire.Ellenefaitquesimplifierlesautresstructuresitrativeslorsdelutilisationdecompteurs.

    3.Quellestructurechoisir?

    Maisalorsquandutiliser telleou telle structure?Onemploieunestructure "Pour" lorsquon connat lavance lenombreditrationsncessairesautraitement.Cenombrepeuttrefixeoucalculparavanceavantlaboucle,peuimporte.Laboucle"Pour"estdterministe:sonnombreditrationsestfixunefoispourtoutesetestenprincipeinvariable(bienquilrestepossibledetricher).

    On emploie les structures "Tant Que" ou "Rpter" lorsquon ne connat pas forcment lavance le nombreditrationsquiserontncessaireslobtentiondursultatsouhait.Lexempleleplusconcretestreprsentparlasaisiedesnotes:onpeutensaisirune,200,aucune,maison lesaitpas lavance.Maiscelapeuttreaussi lalecture des lignes dun fichier (on nen connat pas le nombre par avance), denregistrements dans une base de

    - 1 - ENI Editions - All rigths reserved

  • donnes,uncalculcomplexedevantretourneruneprcisionparticulire,unnombredetoursdansunjeu(lepremierquigagnesortdelaboucle),etc.

    4.Unpigeviter

    Tout comme il faut viter les boucles infinies (sauf si cest parfaitement volontaire), il faut aussi viter quelqueserreursquipeuventservlertrssurprenantesselonlecas(rappelezvouslaLoideMurphy).Voiciunexempledecequilnefautpasfaire:

    Variable x en NumriqueDbut Pour x allant de 1 31 Faire Ecrire x xx*2 Fin PourFin

    Lerreur(saufsicestcequevousvouliezexplicitement,cequisappellejoueraveclefeu)estdemodifiervousmmelecompteurutilisparlaboucleauseinmmedecetteboucle.Quesepassetildanscetexemple?Vouspassezde12,puisQuoi?3?6?7?14?Cadevientnimportequoietaucunnombreditrationsnepeuttreprvu.Vousnesavezplusquandvousallezsortirdelaboucle,nimmelanouvellevaleurducompteurchaqueitration.Selonleslangages,vousaurezaumieuxunfonctionnementpeuprsconformecequevousattendiez,aupiredugrandnimportequoi.Oreninformatique,sauftravaillerpourunditeurpeuscrupuleuxsurlaqualit,un"peuprs"estinacceptable.

    Nemodifiez jamaisun compteurdeboucle "Pour"au seinde celleci.Si cela savrevraimentncessaire,modifiezvotrebouclepourutiliserunestructure"TantQue"ou"Rpter".

    5.Quelquesexemples

    a.Denouveautroisboucles

    Promisdevenirungrandclassique,puisquecestlatroisimefoisquevouslevoyezsoustroisformesdiffrentesdonc,voicilexempledestroisboucles,preuvesilenestquele"PourFinPour"estbienpratiquemaistotalementoptionnel.Lintrtestvidemmenticideproduireuncodeplussuccinctetencorepluslisible.

    Variables a,b,c,nb1,nb2 en NumriqueDbut Pour a de 1 10 Faire Pour b de 1 10 Faire Pour c de 1 10 Faire nb1a*100+b*10+c nb2a+b+c Si nb1=nb2 Alors Ecrire nb1,a,b,c FinSI Fin Pour Fin Pour Fin PourFin

    CequienPHPdonne:

    Trois boucles

  • $nb1=$x*100+$y*10+$z; $nb2=pow($x,3)+pow($y,3)+pow($z,3); if($nb1==$nb2) { echo "$nb1=$nb2, $x $y $z "; } } } } ?>

    b.Lafactorielle

    Encoreunclassique:avecunefactorielleden,voussavezlavancelenombreditrationsncessaire:n.Cestdoncuneapplicationdechoixpourlastructure"PourFinPour".

    Variables cpt, i, resultat en NumriqueDbut Ecrire "Quelle factorielle ?" Lire cpt resultat1 Pour i de 2 cpt resultati*resultat Fin Pour Ecrire resultatFin

    EnPHP:

    Factorielle 3 Factorielle de :

    c.Racinecarreavecprcision

    Voici une innovation : le calcul dune racine carre. Savezvous extraire une racine carre la main ? Avantlapparition des calculatrices, les lycens et tudiants utilisaient soit des tables ou des rgles calcul, soit lescalculaienteuxmmes. Il seraitpossiblededcrire lamthodeutilisemais ilmanqueencorequelquesnotions.Unemthodeplusmathmatiqueest lalgorithmedeHrondAlexandrie.CethommeaussiappelHron lAncientait un mathmaticien, mcanicien et ingnieur grec n Alexandrie au 1er sicle de notre re. Il a crit denombreuxtraitsetlaissquelquesformulesdontlunepermettantdecalculerlaireduntriangleenfonctiondelalongueurdesesctsetuneautrepermettantdapprocherlavaleurduneracinecarredemanirercursive.Voicicommenttrouverlaformule:

    - 3 - ENI Editions - All rigths reserved

  • FormuledeHrondAlexandrie

    Lasuitefinalepermetdecalculerlaracinecarreenfonctiondunevaleurinitialearbitrairex0.Enprincipe,onutiliselavaleurentireapprochedelaracinecarre,laformulepermettantinitialementdobtenirrapidementlesnombressitusaprslavirgule.Doncsivouscherchezlaracinecarrede40,sachantque6x6vaut36etque7*7vaut49,laracinecarreestcompriseentrelesdeux,vousdevriezmettre6.Cependantdanslapratique,nimportequellevaleurpeutconvenir,avecunnombreimportantditrationsvousobtiendrieztoujourslersultatattendu,autantenplaant1que10000.

    Ilestcependanttrs intressantdepouvoiroptimiser lecalculenrcuprant lentier leplusproche.Lalgorithmeseraextrmementprcis.Celuici contiendradeuxboucles.Lapremirede type"TantQue",chargedecalculerlentierx leplusprochede la racinecarredea.Lasecondede type"Pour"calculera lesdcimales.Lenombreditrationspermettradedtermineruneprcision.Dailleurs, inutiledexcutercettesecondebouclesilersultatdelapremirecorrespondlaracinerecherche.

    Variables i,x,a,cpt en NumriqueDbut x1 39 cpt5 Tant Que (x*x)

  • racine

    d.CalculdunombrePI

    Sachantmaintenant laide des boucles peu prs tout faire, notamment calculer une racine carre, il seraitintressantdetrouveruneapplicationencoreplusprcise.EtpourquoipastenterdapprocherlavaleurdePI?Ilexisteplusieursmoyensdapprochercettevaleur.PIest lacirconfrenceduncercledontlediamtreest1.Sansvousexposericilesdtailsdelamthode,sachezqueLeonhardEuler,grandsavantduXVIIImesicle,arsoluunproblmeconnudelonguedate:ladterminationdelasommedesinversesdescarrsdentier.Laformuleestlasuivante:

    Remarquezlaprsenceduneitrationsurlespuissancesdechaquednominateur(diviseur).Voiciuneapplicationdelaboucle"Pour".Demme,remarquezquePIestlevaucarr.Ilfaudradoncquevouseffectuiezuneracinecarrelafinpourobtenirlebonrsultat.Donc:

    l Effectuerndivisionssuccessivesde1/n.

    l Multipliercersultatpar6.

    l ExtrairelaracinecarredecersultatpourobtenirPI.

    Variables i,x,a,cpt en NumriqueDbut cpt100000 a2 Pour i de 2 cpt Faire aa+1/(i*i) Fin Pour aa*6 x1 Tant Que (x*x)

  • Question:Combienfautilditrationspourobtenirseptchiffrescorrectsaprslavirgule?VoicileprogrammePHPcorrespondant,quidevraitvousfournirunepetiteidedursultat:

    PI

    - 6 - ENI Editions - All rigths reserved

  • RpterJusqu

    1.Diffrencesfondamentales

    Malgrlabondancedexemplesvusjusquprsent,lastructureitrative"TantQue"nestpaslaseule.Mmesilestpossible de tout programmer avec ce type de boucle, il en manque encore deux, dont la structure "Rpter Jusqu".Sonpseudocodeestlesuivant:

    Rpter Bloc dinstructions Jusqu boolen

    Le"Rpter"ressemblefortementau"Tantque"aveccependantdeuximportantesdiffrences:

    l Quoiquilarrive,ilyauratoujoursaumoinsunpassagedanslaboucle:leblocdinstructionsseraexcutaumoinsunefois,

    l Lexpressionboolennefinaleestinverse.Un"tantquea!=1"devientun"jusqua=1".

    Le"jusqu"secomprendcomme"jusqucequelaconditionsoitvrifie".Pourfaireuneboucleinfinie,ilfautdoncfaire:

    Rpter Bloc dinstructions Jusqu FAUX

    Pourreprendrelalgorithmedesaisiedurelevdenotesquiavaitposquelquesproblmes,celuicidevientunpeuplussimple:

    PROGRAMME REPETE VAR Note:entier Dbut Rpter Ecrire "Saisissez une note" Lire note Si note20 Alors Rpter Ecrire "Erreur (0->20, -1 sortie) :" Lire note Jusqu note>=-1 ET note

  • echo "Erreur : nouvelle saisie..."; continue; } if($note>-1) echo $note; }while($note>-1); ?>

    Notezbienattentivementlaconditiondesortiecentrale:lanotedoittresuprieureougale1ETinfrieureougale20poursortirdelasaisie.Avecle"Tantque",labouclecontinuaittantquelanotetaitinfrieure1OUsuprieure20.Unenuance,maisdetaille.

    Cesnuancessontlunedesraisonsquifontquedestudiantsetdesprogrammeurs,pourtantparfoischevronns,syperdent.Cestaussilunedesraisonsquifaitquelaboucle"Rpterjusqu"nestpasprsentedanscertainslangagescommeleCouJava.EnJavaouenPHPcependant,voustrouvezunebouclequivalenteau"RpterTant Que", le "do while", qui reprend le fait dune itration obligatoire, mais avec les mmes expressionsboolennesquele"TantQue"initial.

    2.Quelquesexemplesadapts

    a.Lafactorielle

    Inutilededcrirenouveauleprincipe.Laboucledoittrequittequandlecompteurvaut2.

    Variables cpt, resultat en Numrique Dbut Ecrire "Quelle factorielle ?" Lire cpt resultatcpt Rpter cptcpt-1 resultatcpt*resultat Jusqu cpt=2 Ecrire resultatFin

    b.Lestroisboucles

    Lencore,mmeprogrammemaisstylediffrent.Notezqueicilescompteurspartentde0afindtreincrmentsendbutdeboucle,danslebutderendrelaconditiondesortiepluslisible(gale10).

    Variables a,b,c,nb1,nb2 en NumriqueDbut a0 b0 c0 Rpter aa+1 Rpter bb+1 Rpter cc+1 nb1a*100+b*10+c nb2a+b+c Si nb1=nb2 Alors Ecrire nb1,a,b,c FinSI Jusqu c=10 Jusqu b=10 Jusqu a=10Fin

    EnPHP:

    - 2 - ENI Editions - All rigths reserved

  • Trois boucles 2

    - 3 - ENI Editions - All rigths reserved

  • TantQue

    1.Structuregnrale

    Laboucledetype"TantQue"permetlarptitiondunblocdinstructionstantquelaconditiontesteestvrifie,doncvraie.Sasyntaxeestlasuivante:

    Tant Que boolen Faire Bloc dinstructions FinTantQue

    Lorsdelexcutionduprogramme,celuiciarrivesurlinstruction"Tantque".Ilvaluelexpressionboolenne(uneouplusieurs conditions, ou une seule variable). Si lexpression retourne VRAI, alors le programme excute lesinstructions suivantes jusqu ce quil arrive au "FinTantQue". Arriv ici, il remonte au "Tant Que" et value denouveaulexpressionboolenne,sicestVRAIalorsilexcutedenouveaulesinstructionsetainsidesuite,tantquelexpressionretourneVRAI.Silexpressiondevientfausse,alorsleprogrammesautelinstructionsituejusteaprsle"FinTantQue".Voiciunsimpleexemplequicomptede110:

    PROGRAMME TQUE1 VAR Cpt:entier DEBUT Cpt1 Tant que Cpt

    2.Bouclesinfinieset"break"

    Faitestoujoursbienattentioncequevotreboucledisposeduneconditiondesortie.Eneffetriennevousempchedefairedesbouclesinfinies.Danslecasdunestructureitrative"TantQue",ilsuffitquelaconditionsoittoujoursVRAIE,parexemple:

    - 1 - ENI Editions - All rigths reserved

  • Tant que VRAI Faire ...FinTantQue

    Ouencore,

    Tant que a=a ...FinTantQue

    EnPHPcelasetraduitpar:

    ...while(true) {...}

    Dans les deux cas, lexpressionboolenne est toujours vraie donc le programmene sort jamais de la boucle. Laplupartdes langages(C,C++,Java,PHP,etc)proposentdes instructionsspcialesquipermettentdesortirduneboucle depuis nimporte quel endroit du bloc dinstructions (instruction break) ou mme de relancer la boucle(remonter directement au Tant Que) sans excuter le reste des instructions (instruction continue). Lune despremires choses que vous devez apprendre en algorithmique avec les boucles cest que sans vouloir paratreexcessif,lutilisationdebreaketdelinstructioncontinueesttrsdconseille:denombreuxprogrammeursetpasforcmentenherbe,parsmentlintrieurdeleursbouclesdeconditionsdesortiessupplmentaires,quilsnommentsouvent des "cas spciaux" : "je nai pas prvu de grer cela dans un cas gnral, alors je place une sriedexceptions". Or lobjectif nest pas de multiplier ces conditions, mais de toutes les runir au sein de luniqueexpressionboolenneduTantQue.Ilfautdoncrunirtouteslesconditionsdarrtdelaboucleenunseulpoint.

    Le"break"existetelquelenPHP.Voicidoncunexempledeceque,thoriquement,ilnefautpasfaire :

    Break

    Enalgorithmique,ilesttoujourspossibledetrouveruneexpressionboolenne,mmesielleestlongueetcomplexe, permettant dviter lutilisation de "break" et de "continue". Si vous ntes pas daccord,votre

    professeurrisquedevousmettreaudfidetrouverunexemplecontradictoire.Peineperdue.

    Ilfautcependantmodrercespropos.Linterruptionduneboucleaumilieudecelleciestdconseille,certes.Maiscommepourtout,ilfautsemfierdesgnralisations.Ilyavidemmentdescasoildevientbientropcompliqudecrer des boucles uniquement pour respecter ce principe. Sil faut crer une expression boolenne rallonge etbidouiller(cestlemot,parfois)sonblocdinstructionsavecdesmthodestarabiscotes(desdrapeauxtoutvaparexemple),dautantplusqueceluiciprenddjungrandnombrede lignes,autantutiliserunbreak.Aucontraire,utiliserlesbreakstortettraversnestpasrecommandable.

    Letoutestdetrouverunquilibreentrelaconditiondesortieetlalisibilitdelalgorithme.

    Enfin,lebutnestpasdecrerdesbouclesdontleblocdinstructionsfaitdixpages(cestunefaondeparler).Dansce cas, il est certes intelligent de runir toutes les conditions de sortie en un point : cela amliore la lisibilit.Cependant,vousrisquezdevousperdredansvotrepropreprogramme(dolesindentations).Vousapprendrezplusloin dans ce livre la notion de fonctions et de procdures qui permettront un dcoupage fin de vos blocsdinstructions.

    3.Desexemples

    - 2 - ENI Editions - All rigths reserved

  • a.Unetabledemultiplication

    Pourquoinepassattaquerauxexemplescitscidessusetmmeplus,pourvousentraner?Commencezparlatabledemultiplication.Aprsavoirsaisilenumrodelatabledemande,uncompteurestinitialis1.Tantquececompteurestinfrieurougal10,onlemultiplieparlenumrodetable,puisaprsavoiraffichlersultat,onlincrmente.Dansladernireboucle,lecompteurpassede1011.UnefoisremontauTantQue,lexpressiondevientfausse:laboucleesttermineetleprogrammesetermine.

    PROGRAMME MUTLI1VAR table,cpt,resultat:entiersDEBUT Afficher "Quelle table de multiplication ?" Saisir table cpt1 Tant que cpt

    b.Unefactorielle

    Danslemmeordredide,voiciunpetitalgorithmequicalculeunefactorielle.Pourrappel,lafactorielledenscritn!etsecalculeenmultiplianttouteslesvaleursde1n.Ainsi10!=10*9*8*7*6*5*4*3*2*1,soit3628800.Danschaquepassagedans laboucle, il sagitdemultiplier lecompteurpar le rsultatde lamultiplicationprcdente.Notezquilestinutiledemultiplierparun:celanechangepaslersultatetleprogrammeeffectueuneboucledetrop.Demme,cettefoislalgorithmecompteralenvers:ilpartiradenpourdescendrejusqudeux.

    PROGRAMME FACTVAR cpt,resultat:entiersDEBUT Afficher "Quelle factorielle ?" Saisir cpt

    - 3 - ENI Editions - All rigths reserved

  • resultatcpt Tant que cpt>2 Faire cptcpt-1 resultatcpt*resultat FinTantQue Afficher resultatFIN

    CequidonneenPHP:

    Factorielle Factorielle de :

    c.xlapuissancey

    Ilsagitcettefoisdleverunevaleurunepuissancequelconque.Pourrappel,xnestgalx*x*x*xnfois.Cestdonc trs simple : une boucle Tant Que qui va compter de 1 n, dans laquelle le rsultat de lamultiplicationprcdentevatremultipliparx.

    PROGRAMME puissanceVAR x,n,cpt,resultat:entiersDEBUT Afficher "x,n ?" Saisir x,n cpt1 resultat1 Tant que cpt

  • Signe0 Ecrire "x,n ?" Lire x,n Si n

    d.Touteslestablesdemultiplication

    Toutcommelestests,ilesttoutfaitpossibledimbriquerlesboucles,cestdiredemettreuneboucledansuneautreboucle,surautantdeniveauxquevous lesouhaitez.Vouspouvezenvisager1,2,3,nniveaux,maiscelarisque de devenir difficilement lisible. Voici un exemple deux niveaux. Il sagit tout simplement de calculer etdaffichertouteslestablesdemultiplicationde110.Pourcela,deuxbouclesdoiventtreutilises.Lapremirevareprsenterlatablecalculer,de110.Lasecondelintrieurdelapremirevamultiplierlatabledonnede110.Vousavezdoncdeuxbouclesde110.Simulezcequilsepasse:

    l Premireboucle,tabledes1.Secondeboucle:excutionde1*1,1*2,1*31*10

    - 5 - ENI Editions - All rigths reserved

  • l Premireboucle,tabledes2.Secondeboucle:excutionde2*1,2*2,2*32*10

    l Premireboucle,tabledes3.Secondeboucle:excutionde3*1,3*2,3*33*10

    l

    l Premireboucle,tabledes10.Secondeboucle:excutionde10*1,10*2,10*3

    Voici lalgorithme correspondant. chaque passage dans la premire boucle, le compteur de la seconde bouclerepasseun.Cestdanslasecondebouclequalieulecalculetlaffichagedelatabledemultiplication.

    PROGRAMME MULTI2VAR table,cpt,resultat :entiersDEBUT table1 Tant Que table

    e.Saisiedenotesetcalculdemoyennes

    Lebutdelalgorithmesuivantestdinviterlutilisateursaisirdesnotesdtudiantsentre0et20,dedterminerlanote laplusbasse, lanote laplushauteetdecalculerunemoyenne.Tantque lutilisateurnapassaisi lanotengative 1, la saisie ne sarrte pas. Les rsultats sont ensuite affichs. Cet algorithme prsente un intrtcertain : il faut contrler la saisiedesnotes si lutilisateursaisitautrechosequunenoteallantde 120, laquestionluiestrepose,sachantque1correspondunefindesaisie.Procdezpartapes.

    Commenceztoutdabordparcettepartiedelalgorithme:lasaisiedesnotes.Ilfautpourcelautiliseruneboucledontluniqueconditiondesortieestunenotede1.

    PROGRAMME NOTEVAR

    - 6 - ENI Editions - All rigths reserved

  • note:entierDbut Afficher "Entrez une note" Saisir note Tant que note>-1 Faire Si note >20 Alors Tant que note20 Faire Afficher "Erreur (0->20, -1 sortie) :" Saisir note FinTantQue FinSi Si note-1 Alors Afficher "Entrez une note" Saisir note FinSiFinTantQueFin

    CequidonneenPHP,depuisuneconsole:

    Cet algorithme montre quune simple rptition de saisie est plus complexe quil ny parat. Au tout dbut,lutilisateursevoitposerunepremirefoislaquestion,silrpond"1"toutdesuite,ilnentremmepasdanslaboucle.Danslapremireboucle,unevrificationesteffectuesurlavaliditdelanotesaisie:estellesuprieure20 ? Si oui, alors il faut de nouveau effectuer une saisie et reposer en boucle la question autant de fois quencessaire,cestdiretantquelanotesaisienestpascompriseentre1et20.Sachantque1estuneconditiondesortie,aucuntraitement,ycomprislasaisiedunenouvellenote,nedoittreeffectudanscecas.Vousaveziciunetrsbelleapplicationduncasoun"break"auraitpueffectivementtreutilis.Voiciunexemple(incomplet)quiremplaceledernier"Si"delalgorithmeprcdent:

    ...Tant que note>-1 Faire ... Si note=-1 Alors break FinSi Ecrire "Entrez une note" Lire noteFinTantQue

    Laboucleprincipalepeuteneffettredirectementinterrompuedsquunenotede1estrencontre.Danscecas,il seraitmmepossibledallerplus loinenconsidrant lapremirebouclecomme infinieeteneffectuantdedanstouteslessaisiesetlaconditiondesortie:

    Variable note en NumriqueDbut Tant que VRAI Faire Ecrire "Entrez une note" Lire note

    - 7 - ENI Editions - All rigths reserved

  • Si note20 Alors Tant que note20 Faire Ecrire "Erreur (0->20, -1 sortie) :" Lire note FinTantQue FinSi Si note=-1 Alors break FinSi FinTantQueFin

    CequidonneenPHP,viauneconsole:

    IlestencorepossibledallerplusloinenPHPaveclinstruction"continue".Eneffetpluttquedecrerunenouvelleboucleencasderreurdesaisie,pourquoinepasrelancercelleciaudbut?

    Leprogrammedevientdonc:

    Commevouspouvezleconstater,cetalgorithmeestunpeupluscourtqueloriginal,avecnotammentunesaisieenmoins, une expression boolenne en moins (dans la condition de la premire boucle), un "sinon" en moins.Cependant fondamentalement cet algorithme estmoins propre. Comme indiqu prcdemment, le break est enprincipedconseilletilvautmieuxquelaboucleellemmeaituneconditiondesortieafindviterunecatastropheencasdemodificationdublocdinstructionsquellecontient.Ilfautmaintenantcomplterlalgorithmedoriginepouryajouternosvariables:

    l Uncompteurdunombredenotes.

    l Lanoteminimale.

    l Lanotemaximale.

    l Lasommedetouteslesnotes.

    l Lamoyenne.

    Lamoyenneseffectueensortiedelaboucleprincipale,unefoislensembledesnotessaisi.Ilfautveillercequaumoins une note ait t saisie, sinon lalgorithme effectuerait une division par zro, ce qui est videmmentimpossible.Auseinde laboucle,etseulementsi lanotesaisieestdiffrentede1, lalgorithmecompare laplus

    - 8 - ENI Editions - All rigths reserved

  • bassenoteaveclanoteactuelle,quidevientlaplusbasselecaschant,lammechoseestfaitepourlanotelaplushaute(vousprendrezsoindinitialisercorrectementcesvaleursdsledbut)etletotaldesnotesestcalcul.Ensortiedeboucle,ilneresteplusqufaireunedivision.

    Variables note,cpt,min,max,sum,moy en NumriqueDbut min20 max0 cpt0 sum0Ecrire "Entrez une note"Lire noteTant que note>-1 Faire Si note >20 Alors Tant que note20 Faire Ecrire "Erreur (0->20, -1 sortie) :" Lire note FinTantQue FinSi Si note-1 Alors cptcpt+1 sumsum+note Si notemax Alors maxnote FinSI Ecrire "Entrez une note" Lire note FinSiFinTantQueSi cpt>0 Alors moysum/cpt Ecrire "Nombre de notes : ",cpt Ecrire "Note la plus basse : ",min Ecrire "Note la plus haute : ",max Ecrire "Moyenne : ",moySinon Ecrire "Aucune note na t saisie."FinSIFin

    Leprogrammesuivant,enPHP,estuneadaptationduprogrammeprcdent.Vousnyvoyezpasdeboucle,oupluttellenestpasexplicite :vousbouclezenvalidantlasaisiedunenoteparleboutonOK.Ladifficult,enPHPetHTML,estdeconserverlesvaleursdunepagelautre.Ilexistediversesmthodes.Celleprsentedanscetexempleconsisteconserverlesvaleursdansdeschampscachsduformulaire.

    moyenne max 3

  • echo "Erreur : nouvelle saisie..."; $cpt--; } else if($note!=-1) { $sum=$sum+$note; if($note$max) $max=$note; echo $note; if($cpt!=0) { $moy=$sum/$cpt; echo "cpt:$cpt"; echo "min:$min"; echo "max:$max"; echo "moy:$moy"; } } ?> note (-1 = sortie) ? :
  • Autantlediretoutdesuite,cetalgorithmeestleparadisdesboucles.Ilenfaudrauneparvaleurfacialedebilletoudepice.Leprincipeesteneffettrssimple.Ilsagitdesoustraireauseindunebouclelavaleurfacialedubillet,parexemple500euros,aumontanttotal,tantquecemontantestsuprieurougallavaleurdubillet.chaquepassagedanslaboucle,oncompteunbillet.Puisonpasseaubilletsuivantetainsidesuite.Voiciunexemplepour1700eurosavecuniquementdesbilletsde500euros.

    Variables montant, nb500 en NumriqueDbut montant1700 nb5000 Tant Que montant>=500 Faire nb500nb500+1 montantmontant-500 FinTantQue Ecrire nb500, montantFin

    CequidonneenPHP:

    Factorielle 3

    Que se passetil la sortie de la boucle ? nb500 vaut 3 et montant vaut 200 : cest le reste. Aussi, il fautgnraliserlalgorithmepourtouteslesvaleurs.

    Variables montant,nb500,nb200,nb100,nb50,nb20,nb10,nb5 en NumriqueVariables nb2,nb1,nb05,nb02,nb01,nb005,nb002,nb001 en NumriqueDbut montant1700 nb5000 nb200=0 nb100=0 nb50=0 nb20=0 nb10=0 ... nb002=0 nb001=0 Tant Que montant>=500 Faire nb500nb500+1 montantmontant-500 FinTantQue Tant Que montant>=200 Faire nb200nb200+1 montantmontant-200 FinTantQue Tant Que montant>=100 Faire nb100nb100+1 montantmontant-100 FinTantQue Tant Que montant>=50 Faire nb50nb50+1

    - 11 - ENI Editions - All rigths reserved

  • montantmontant-50 FinTantQue Tant Que montant>=20 Faire nb20nb20+1 montantmontant-20 FinTantQue ... Tant Que montant>=0.02 Faire nb002nb002+1 montantmontant-0.02 FinTantQue Tant Que montant>=0.01 Faire nb001nb001+1 montantmontant-0.01 FinTantQue Si nb500>0 Alors Ecrire nb500," billets de 500 euros" FinSI Si nb200>0 Alors Ecrire nb200," billets de 200 euros" FinSI ... Si nb002>0 Alors Ecrire nb002," pices de 2 centimes" FinSI Si nb001>0 Alors Ecrire nb001," pices de 1 centime" FinSIFin

    Cet algorithme est dsesprant. Il est parfait en terme de fonctionnement et de logique, mais il estpouvantablement long, proportionnel au nombre de coupures disponibles dans chaque pays. Tellement longdailleursquecertainespartiestotalementvidentesonttremplacespardes"".Estilpossibledefairepluscourt ? Il est videmmentpossiblede faireplus court.Vousverrez comment faireauprochain chapitreavec lestableaux,puisdanslesuivantencoreaveclesfonctions.

    g.Troisboucles

    Undernierexempledeboucle"TantQue"vavousmontreruneintgrationavectroisboucles.LebutdecetanodinalgorithmeestdetrouverpourquellesvaleursdeA,BetC,ABC=A3+B3+C3,Areprsentant lescentaines,B lesdizainesetClesunits.Larechercheseralimitepourchaquevaleurentirecompriseentre1et10(bienentendu,vouspouvezaugmenterlintervallemaisceluicinapastchoisiauhasard).Lalgorithmencessitetroisbouclespourchacunedesvaleurs.Cestbienentenduauseindeladernirebouclequelesvaleurssontcalculesetlesrsultatsaffichsencasdgalit.

    Variables a,b,c,nb1,nb2 en NumriqueDbut a1 b1 c1 Tant que a

  • VoicileprogrammequivalentenPHP:

    Trois boucles

    - 13 - ENI Editions - All rigths reserved

  • Fichiertextesquentiel

    1.Ouvriretfermerunfichier

    Vousdeveztoutdaborddclarerlenomlogiquedufichier,lavariablequipermettra,associeaufichier,detravailleravec.CeciseplacecommedhabitudedanslasectionVar.Vousindiquezensuiteletypedaccs :squentiel,direct,index,etc.Notezquenaccsdirect,vouspouvezaussitravaillerenmodesquentiel.

    VAR fic:fichier squentiel

    Vousdevezensuiteouvrirlefichier,enassociantnomlogiqueetnomdufichier,aveclemodedouverturesouhait.CeciseffectueaveclinstructionOuvrir.

    Ouvrir "toto.txt" dans fic en lecture

    Voustrouverezaussiparfoiscettesyntaxesousformedefonction,plusprochedecertainslangages :

    ficOuvrir("toto.txt","lecture")

    La premire syntaxe est souvent prfrable en algorithmique. Pour fermer un fichier, utilisez linstructionFermersuiviedunomlogiquedufichier.

    Fermer fic

    Il existe aussi une syntaxe fonctionnelle,mais lesmmes remarques sappliquent : utilisez la premire en cas dedoute.

    Fermer(fic)

    Neplacezpaslenomdufichierdanslesinstructionsdelecture,critureetdefermeture.Leprogrammeneconnatpaslenomdufichier,maisseulementsonnomlogique.

    Aussiledbutdunventuelprogrammeressembleraitceci:

    Programme OUVREVar fic :fichier squentiel nom :chaneDbut nom"toto.txt" Ouvrir nom dans fic en lecture /* traitements */ Fermer ficFin

    2.Lireetcriredesenregistrements

    a.Lecture

    Poursimplerappel,lesenregistrementssonticileslignesdunfichiertexte,unenregistrementtantquivalentuneligne.LalecturedunelignesefaitvialinstructionLire.Lirelitlenregistrementprsentlapositionactuelledufichier,puisseplacesurlenregistrementsuivant.louverturedufichier,Lirelitlapremireligne.UnnouveauLireliraladeuximeetainsidesuitejusqulafin.Cestpourcelaquelalectureestditesquentielle.VoustrouverezaussilammeinstructionsouslenomLireFichier,cestlammechose.

    Lasyntaxeestlasuivante :

    Lire(nom_logique,variable)

    - 1 - ENI Editions - All rigths reserved

  • Lavariableensecondparamtrereoitlenregistrement,lalignelue.Danslexemplesuivant,unenregistrementdufichier des mots de passe de lexemple cidessus est lu, partant du principe que la largeur est fixe, puislenregistrementestdcouppourrcuprerleloginetluid,convertienentier.

    Programme OUVREVar fic :fichier squentiel nom :chane ligne,login :chane uid :entierDbut nom"passwd" Ouvrir nom dans fic en lecture /* traitements */ Lire(fic,ligne) logintrim(milieu(ligne,1,8)) uidchnum(milieu(ligne,10,5)) Afficher login,uid Fermer ficFin

    Quefairecependantquandonneconnatpaslavancelenombredelignesdufichier ?Commentsavoirsilafindufichieratatteinte ?

    Vousavezdeuxpossibilits :

    l Seloncertainsformalismesalgorithmiques,Lireestunefonctionquiretourneunboolen,doncvraioufaux.Sivoustentezdelireunenregistrementetquilnyenaplus,LireretourneFAUX.Autrementdit,tantqueLireestVRAI,onpeutcontinuerlireleslignessuivantes.

    l LafonctionEOF()parfoisappeleaussiFinFichier()retourneunboolenquiindiquesilafindufichieratatteinteounon.Cettefonctionprendenparamtrelenomlogiquedufichier.ElleretourneVRAIsilafindufichieratatteinte,doncsilneresteplusdenregistrementslire.

    La fonction algorithmique EOF() va retourner VRAI si le fichier que vous ouvrez ne contient pasdenregistrements, donc si la fin de fichier est atteinte ds louverture. Or dans quelques langages, le

    programme ne le sait pas tant quil na pas tent de lire un enregistrement et donc une fonction de ce typeretourneraitFAUXtantquaucunelecturenauraiteulieu.Prudence

    LeprogrammesuivantvaliretoutlefichierdesmotsdepasseetplacerlesloginsetUIDdansdestableaux.Commeonneconnatpaslavancelenombredlments,onselimiteraarbitrairement100lignes.

    Programme LIREFICVar fic :fichier squentiel nom :chane ligne:chane i:entier login :tableau[1..100] de chanes uid :tableau[1..100] dentiersDbut nom"passwd" i0 Ouvrir nom dans fic en lecture Tant que NON EOF(fic) Faire Lire(fic,ligne) ii+1 login[i] trim(milieu(ligne,1,8)) uid[i] chnum(milieu(ligne,10,5)) FinTantQue Afficher i," enregistrements lus" Fermer ficFin

    b.criture

    - 2 - ENI Editions - All rigths reserved

  • Lireestunechose,criredansun fichierenestuneautre.Lcritureutilise linstructionEcrire, une fonctionquiprendcommeparamtrelenomlogiquedufichieretlenregistrement(laligne)crire.Voustrouvereztoutcommelinstructiondelecture,uneinstructionEcrireFichierstrictementidentique :

    Ecrire(nom_logique,enregistrement)

    Commevousdevezcriredesenregistrementslargeurfixe,cestvousdevrifierquelesenregistrementssont la bonne longueur. Sils sont trop longs, vous avezmal dimensionn vos enregistrements lorigine (un casrgulierestuneadresserallongeouunnomdevillecompos).Silssonttropcourts,vousdevrezleurajouterdesespacesenfindechane.

    Parexemple,toujoursdanslexempledeslogins,quefairesiceluiciesttropcourt,parexemple"toto",doncquatrecaractres,alorsquildevraitenfairehuit ?Lastuceconsisterallongerleloginavecdesespaces.Cenestpasunproblmepourlerelire,puisquelafonctiontrim()restaurerasontatdorigine.Ilestprobablequevotrelangagedeprogrammationproposeunefonctionquiremplit touteseule lesmorceauxmanquants,des fois ilsagitmmedelinstructiondcriture(lefprintfduClefaittrsbien).

    En attendant, vous pouvez programmer vousmme cette fonction algorithmique. Elle ressemble fortement laprocdureRepeteCar().Appelezla Formate(). Elle prendra comme paramtre le champ de lenregistrementet lalongueurattendue.Elleretourneracemmechampmaisreformat :soitcouplabonnelongueur,soitavecdesespacesajoutslafin.

    Fonction Formate(champ :chane, longueur :entier) :entierVar nbspaces,len :entiersDbut len=longueur(champ) Si len>longueur Alors champ=gauche(chane,longueur) Sinon nbspaces=longueur-len Tant que nbspaces0 Faire champ=champ&" " nbspaces=nbspaces-1 FinTantQue FinSi Retourne champFinFonct

    Quelques formalismes algorithmiques autorisent parfois de prciser lavance une longueur de chane ladclarationdelavariable.

    Var login :chane de 8 caractres

    Celalaisseentendrequevousnavezplusvoussoucierquelachanesoittropcourteoutroplongue.Cestvraidans lalgorithme,maisattentiondansunvrai langage !Le langageCOBOLanciennementauprogrammeduBTStaitunrgalceniveaumaisenCouenJava,lataillenestpasprcise.

    LafonctionFormate()faitbienvotreaffaire.Vouspouvezreconstruirevotreenregistrement,puislcrire.

    Programme ECRITVar fic :fichier squentiel nom,ligne:chanes tlogin,tuid,tpwd,tgid,tcmt,thome,tshell:chanes uid,gid:entiersDbut nom"passwd" Ouvrir nom dans fic en Ajout login"toto" uid500 gid501 ... /* reconstitution */ tloginFormate(tlogin,8) tuidFormate(numch(uid),5) tgidFormate(numch(gid),5) tpwdFormate(tpwd,1) tcmtFormate(tcmt,15)

    - 3 - ENI Editions - All rigths reserved

  • thomeFormate(thome,15) tshellFormate(tshell,15) lignetlogin&tpwd&tuid&tgid&tcmt&thome&tshell /* Ecriture */ Ecrire(fic,ligne) Fermer ficFin

    LinstructionEcrireajoutelenregistrementdanslefichier,puisseplacelasuitedelenregistrementcr.Aussisivous excutez une nouvelle instruction Ecrire, le nouvel enregistrement se placera la suite du prcdent.Attentioncependantaumodedouverturedufichier !Enmodelecture/criture,lenregistrementneserapasajout la findu fichier (contrairementaumodeajout)mais laposition courante :vouscrasez lesenregistrementsexistants,lesunsaprslesautres.

    Unprogrammeassezsimpleconsisterecopierlesenregistrementsdunfichierdansunautre.Pourajouteruntoutpetitpeudepiment,pourquoinepasdirequesilechampmotdepassecontientun"d",lenregistrementdoittredtruit ?Ilsuffitdenepaslerecopierdanslenouveaufichier.

    Programme COPIEVar fic,fic2 :fichiers squentiels nom,nom2 :chanes ligne,pwd:chanesDbut nom"passwd" nom2"backup" Ouvrir nom dans fic en lecture Ouvrir nom2 dans fic2 en Ajout Tant que NON EOF(fic) Faire Lire(fic,ligne) pwd trim(milieu(ligne,9,1)) Si pwd"-" Alors Ecrire(fic2,ligne) FinSi FinTantQue Fermer fic Fermer fic2Fin

    Cettestratgiederecopieaunavantage :ellenutilisequetrspeudemmoire.Elleacependantuntrsgrosinconvnient,ellencessitelaprsenceunmomentdonndedeuxfichierssurledisquedur.Dansletraitementprcdent,lebuttaitdesupprimerleslignesinutilesdupremierfichier.Aufinalcegenredetraitementestentroistapes :

    l Recopiedesenregistrementsdepasswdversbackup.

    l Suppressiondufichierpasswd.

    l Renommagedebackupenpasswd.

    Cette mthode sera privilgier sur des fichiers trs imposants, plusieurs milliers (ou millions) de lignes, si lammoirenedoitpastretropcharge.

    Uneautremthodeconsistetouttraiterenmmoire.Ellesefaitendeuxtapes :

    l Lectureintgraledufichierpasswdetstockagedeslignesdansuntableau.

    l Rcrituredufichierpasswdaveclesbonslmentsdutableau.

    Certains langages font une distinction entre lemode dcriture, gnralement destructeur (le fichier estpurg vid avant lajout de donnes) et unmode dajout tendu, o le fichier peut aussi tre lu

    Prudence.

    Traitersurdisqueouenmmoire ?

    - 4 - ENI Editions - All rigths reserved

  • Cettemthodeestplusrapideetplussimple.Laccsetletraitementdesenregistrementsenmmoi