PHP - Algorithmique - Techniques Fondamentales de Programmation
Embed Size (px)
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