Vous êtes sur la page 1sur 225

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
Algorithmique
Techniques 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 dun
ordinateur o il fallait programmer soimme des jeux ou outils, ou saisir des dizaines de pages de lignes de
programmation?Avezvousbesoin,durantvostudes,dematriserlestechniquesfondamentalesdeprogrammation
pour passer votre diplme? tesvous un professionnel ou un autodidacte passionn qui veut encore en savoir
davantage?Estceunenouvelletapedevotrecarrireprofessionnelleontantpasinformaticienvoustesamen
programmerdesmacrosoudesscriptscomplexes?Quelleraisonencoretrouver?Sivousrpondezouilunedes
ces questions, mais aussi aux dizaines dautres quil serait possible de poser, alors oui, vous devez apprendre
programmer. Apprendre programmer, cest enfin savoir comment font les autres pour crer de superbes logiciels,
cestsavoirtermecommentlescrersoimmeetlesdvelopper.
Commentapprendreprogrammer?Onnesimprovisepasprogrammeur.Cestunmtieretcommetoutmtier,cela
sapprend.Danslescoles,desprofesseursenseignantspourdesclassesdeBTS,DUT,DEUG,classesprparatoires,
etc., sont spcialiss dans lapprentissage des notions fondamentales de programmation. Les autodidactes se
plongent dans des livres, des sites Internet, dans la documentation en ligne des langages, pour apprendre ces
notions.Lensembledecesnotionscestlalgorithmique.
Celivrereprendlesnotionsessentielles,fondamentales,delaprogrammation.Pourapprendreprogrammer,ilfaut
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 coule de source comme une vidence : variables, tests, conditions, boucles,
tableaux,fonctions,fichiers,jusquauxnotionsavancescommelespointeursetlesobjets.
Le formalisme algorithmique, (la syntaxe du langage algorithmique ou pseudocode) reprend celui couramment utilis
danslescolesdinformatiqueetdanslesformationscommelesBTS,DUT,premiresannesdingnierie,quicelivre
estenpartiedestinetconseill.Ilexisteplusieursvariantesutilises,selonleprofesseur,lelangagedorigine.Celui
prsent ici a lavantagedtre dans un franais trs explicite "tant que, jusqu, pour chaque, afficher, saisir, etc.".
Leurlecturenencessiteaucuneconnaissancepralabledetermestroptechniques.
Celivrenefaitpasquaborderlesnotionsbasiques.Deuxchapitres,lunsurlespointeursetlesrfrences,lautresur
lesobjets,ouvrentlesportesdelaprogrammationdansdeslangagesvolusetpuissantscommeleC,leC++,Java
et PHP. Dailleurs, presque tous les algorithmes de ce livre sont implments en PHP. Les sources directement
utilisablessontdisponiblesentlchargementsurlesitedesditionsENI.
- 1 - ENI Editions - All rigths reserved
Lalgorithmique
1.Programmer,cestunart
Pourobtenirunrsultatdonn,ilfautgnralementsuivreunemthode,unecertainelogique.Sauftreungrand
ptissier dont la science des mlanges des ingrdients est inne (ou le fruit dune longue pratique), vous
nobtiendrezjamaisundlicieuxgteauauchocolatmmesivousdisposezdesmeilleursingrdientsetaccessoires
decuisson,sivousneconnaissezpaslesbonnesproportions,lordredanslesquelsajouterlesingrdients,letemps
de cuisson, la temprature : bref, la recette. De mme, sans formation de mcanicien ou sans la documentation
techniquedumoteurdevotrevhicule,inutiledevouslancerdansunchangementdejointdeculasse:cestlacasse
assure.
Ilenestdemmedelaprogrammation.Ilexisteplusieurslangagesdeprogrammationtrssimples,extrmement
simples parfois, qui peuvent donner un temps lillusion que vous savez programmer. En entreprise mme, certains
employssontbombardsdveloppeurspourleursquelquesconnaissancesconfusesdeVisualBasic,deDelphiou
de Windev. Le rsultat risque dtre catastrophique. Les publicits sont allchantes mais trompeuses. Les bons
programmeurs,ycomprislesautodidactes,onttousunmomentouunautreeuaffaireaveclesalgorithmes,caril
existe en programmation une multitude de moyens darriver un rsultat, mais trs peu pour obtenir le meilleur
rsultat possible, ce qui explique pourquoi beaucoup de programmes ayant la mme fonction, se ressemblent (au
niveau de la programmation) alors que ce ne sont pas les mmes programmeurs qui les ont dvelopps. Les
dbutantsquiselancentdansdesprojetsdeprogrammationaudacieuxseretrouventparfoisbloqus,nematrisant
pasunetechniqueparticuliredelogiquedeprogrammation.Certainsabandonnent,dautrestrouventunmoyende
contournement (souvent peu reluisant). Les derniers liront peuttre un livre dalgorithmique comme celuici, qui
dfautdedonnerunesolutioncomplteleurproblme,leurfourniralesbasesetlestechniquespouravancer.
Les ordinateurs personnels du dbut des annes 1980 taient tous livrs soit avec un langage BASIC inclus
directementdanslamachine(enROM),soitsurunecartouche,cassetteoudisquetteannexe.LeBasicdeMicrosoft
(Qbasic,Quickbasic)taitlivravecleDOSduPC.LesAmstradavaientlebasicLocomotive,lesAtariSTlAtariBasicet
surtoutleGFABasic,unlangagedegrandeclasse,etc.Unegnrationcompltedutilisateurssestlancedansla
programmationlaidedeceslangagesetdeladocumentationfourniequibiensouventfournissaitnonseulement
les rfrences du langage mais aussi les mthodes de base de programmation. Avec plus ou moins de succs. Le
rsultattaitsouventuninfmebidouillage,maisquimarchait.
Orlebutnestpasqueleprogrammefonctionne,maisquilfonctionneviteetbien,breflemieuxpossible.Lemeilleur
ordinateuraumondeetlemeilleurlangageaumondenevousyaiderontpas.
2.Dfinition:lalgorithmeestunerecette
Avezvousdjeuloccasiondeprogrammerunmagntoscope(envoiededisparition)ouunenregistreurdedvd?
Quavezvous fait la premire fois que vous avez allum votre poste de tlvision pour rgler la rception des
chanes?Nuldoutequevousavezouvertlemodedemploietsuivilasquencedinstructionsindique:appuyersur
latoucheMenudelatlcommande,sedplacersur EnregistrementetappuyersurOK,sedplacersuruneligne
puisindiquerlachane,lheure,etc.
Avezvous dj eu loccasion de faire la cuisine ? Pour un gteau, vous tesvous lanc directement ou avezvous
ouvert un livre pour rcuprer la liste et la quantit de chaque ingrdient, pour suivre la recette : faites fondre le
chocolatetlebeurredansunecasserolefeudoux,retirezlacasseroledufeu,incorporezlesjaunesduf,puisle
sucreetlafarine,battezlesufsenneigepuisincorporezdoucementdanslemlange,etc.
Danslesdeuxcas,flicitations!Vousavezdroulvotrepremieralgorithme!
Une dfinition simple dun algorithme : cest une suite dinstructions qui, quand elles sont excutes correctement
aboutissent au rsultat attendu. Cest un nonc dans un langage clair, bien dfini et ordonn qui permet de
rsoudreunproblme,leplussouventparcalcul.Cettedfinitionestrapprocherdufonctionnementdelamachine
de Turing qui avant lapparition de lordinateur utilisait cette dmarche pour rsoudre de nombreux problmes.
Lalgorithmeestdoncunerecettepourquunordinateurpuissedonnerunrsultatdonn.
LemotalgorithmevientdunomdumathmaticienAlKhuwarizmi(MuhammadibnMsalKhuwrizm),savantpersan
duIX
me
sicle,auteurdunouvrageappel"Latranspositionetlarduction",Aljabrwalmuqbalah.LemotAljabr
deviendraalgbre,lenomdelauteurseralatinisenAlgoritmi,quiseralabasedumotalgorithme.
3.Pourquoiutiliserunalgorithme?
Lalgorithme dcrit formellement ce que doit faire lordinateur pour arriver un but bien prcis. Ce sont les
instructionsquondoitluidonner.Cesinstructionssontsouventdcritesdansunlangageclairetcomprhensiblepar
ltrehumain: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 un
langagedeprogrammationvolucommeleC,JavaouPHP.Malheureusement,enprogrammationcest souvent
lhommedesemettreauniveaudelamachine.
Delarflexionlaprogrammation
Plus que cela, un algorithme dcrit une mthode de rsolution de problmes courants. Un algorithme est donc
rutilisable, sauf cas ponctuel ou trs prcis. Il existe plusieurs moyens dobtenir un mme rsultat, mais certains
sont meilleurs que dautres.Cest le cas par exemple des mthodes de tris de donnes par ordre alphabtique. Il
existe divers algorithmes dcrivant ces mthodes, certaines tant adaptes des quantits plus ou moins
importantesdedonnes.
Lamatrisedelalgorithmiqueetlapprentissagedesalgorithmesdebasesontunedesconditionsdelarussitedun
projet en programmation, quilsoitpersonnelouprofessionnel.Lexprience aidant, vous allez acqurir au fur et
mesure des mcanismes de pense qui vous permettront doptimiser les traitements que vous devez programmer,
tantenvitessequenoccupationmmoireoummeenquantitdelignesdeprogrammation.Surcedernierpoint,il
existe de nombreux cas o des algorithmes longs et complexes sont plus performants que dautres semblant plus
pratiquesaupremierabord.
Apprendre lalgorithmique (ou lalgorithmie, les deux sont autoriss) cest donc apprendre programmer dans les
rglesdelart.Toutaulongdecetouvrage,vousallezdcouvrirlesnotionslmentairesquivouspermettronttant
decomprendrelefonctionnementinternedunprogrammequedeleconcevoir,laideduneprogressionsimpleet
constanteetdexemplespratiquesetcomprhensibles.
4.Leformalisme
Le but dun algorithme tant de dcrire un traitement informatique dans quelque chose de comprhensible par
lhumain(etfacilementtransposableverslamachine),pourquunalgorithmesoitcomprhensible,ilfautquilsoitclair
etlisible.Danscecas,ilexistedeuxmoyensefficaces:
G soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela),
G soitdefaireunschmaexplicatifavecdessymboles.
Dans la pratique, les deux formes sont possibles. Mais un dessin ne vautil pas un long discours ? Il est dailleurs
courantdecommencerparunschma,puisquandceluicidevienttropcomplexe,depasseruntexteexplicatif(la
recette).
Danslesdeuxcas,lasyntaxepourletexteoulessymbolespourlesschmasdoiventrpondredesrglesstrictes,
voirenormalises.Ilfautquechacunconnaisseleursignificationetsachedonclesinterprter.Cestpourcelaque
toutes les reprsentations algorithmiques suivent peu de choses prs le mme formalisme. Si les schmas sont
possibles,ilssontcependantmoinsutilissquelesalgorithmessousformetextuelle.Cestquesivousconstruisezun
algorithme,ilestplusfaciledelecorrigerquandilestsaisiauclaviersousformedetextequelorsquilestdessin
sousformedorganigrammedansunlogicieldedessinvectorieloudeprsentation.
a.Lareprsentationgraphique
Lesalgorithmespeuventtreconstruitslaidedesymbolesdorganigrammes.Lestudiantseninformatique(BTS,
DUT) connaissent bien cette tablette en plastique permettant de dessiner des organigrammes. Ils lutilisent en
algorithmique,enbasededonnes,enmthodeMerise,etc(danschaquecaslasignificationestdiffrente).Voici
unexempledalgorithmesousformedorganigrammequisimuleunlancdedetquidemandeunepersonnede
devinerlavaleur.
- 2 - ENI Editions - All rigths reserved
Unformalismequioccupetropdeplace
Danscetexemplesimplifi,lestraitementssontdansdesrectangles,lesprisesdedcisiondansdeslosanges,et
les flches reprsentent lordre du droulement du programme. Si une valeur est prsente ct de la flche,
lactiondpenddursultatdelaquestionposedanslelosange.Lesdcisionsetlesflchespeuventdcriredes
boucles.Dansleschma,tantquelutilisateurnapassaisilabonnevaleur,laquestionluiestdenouveaupose.
Cetalgorithmeesttrssimple,lorganigrammeaussi.Cependantvoyezdjlatailledeceluici(laplacequilprend)
parrapportcequilfait.Imaginezmaintenantunalgorithmepluscomplexequidoitparexempledcriretousles
cas de figure dans la gestion dune communication entre deux machines (description dun protocole de
communication):leschmancessiteraunefeuilledunegrandedimensionetseradifficiletudier.
b.Lalgorithmesousformedetexte
Prenezlemmenoncdulancded.Celuicipourraittrecritainsienfranaiscorrect:
G 1retape:lancerled.
G 2metape:saisirunevaleur.
G 3me tape : si la valeur saisie est diffrente de la valeur du d, retourner la troisime tape, sinon
continuer.
G 4metape:afficher"bravo".
Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprend
ce que lalgorithme est cens faire. Cependant, si les algorithmes complexes devaient tre crits ainsi, ce serait
encoreunefoisbientroplongetvousfiniriezsoitparvouslasserdunecrituretropcomplexe,soitcelaprendrait
tropdeplace.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,la
suitevousdonneradetoutefaontouteslesexplicationsncessaireslacomprhensiondechaquelignedecet
algorithme.Ilreprenddemaniretrsdtailletouteslestapessuivre.Souscetteforme,ilestpresquepossible
dimplmenterlalgorithmelignelignedansunlangagedeprogrammationvolu.
Cest sous cette forme textuelle que les algorithmes seront reprsents dans ce livre. Ce texte, programme ou
pseudocodealgorithmique,estdcomposenplusieursparties:
G Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME".
G Une zone de dclaration des donnes utilises par le programmes : variables, constantes, types,
structures,tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuret
mesuredesdiffrentschapitres.Cettezonecommenceparlemot"VAR".
G Leprogrammeluimme,cestdirelesdiverstraitements.Lesinstructionsduprogrammesontencadres
par les mots "DEBUT" et "FIN". Il vous est conseill, pour plus de clart et de lisibilit, dindenter les
diverses lignes (de les dcaler les unes par rapport aux autres) laide des touches de tabulation. Le
programmepeuttredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance.
G Les commentaires : cest un texte libre qui peut tre tendu sur plusieurs lignes et encadr par les
squences de caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvez
uniquementlacommencerparlescaractres"//".
G Une dernire partie, ou plutt premire car lorsquelle est prsente elle se situe avant toutes les autres,
peuttreconstituedessousprogrammes,semblantsdeprogrammescompletsappelsparleprogramme
principal.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 les
algorithmes.Certainssontcomplexesetletraitementrsultantpeutncessiterbeaucoupdetempsetderessources
delamachine.Cestcequonappellele"cot"delalgorithme,etilestcalculable.Siunalgorithmeest"gourmand"
son cot sera plus lev. Il existe certains cas o il est possible dutiliserplusieursalgorithmespoureffectuerune
mme tche, comme pour trier les lments dun tableau de valeurs. Certains algorithmes se rvlent tre plus
coteuxquedautres,passuncertainnombredlmentstrier.Lecotdunalgorithmerefltesacomplexitouen
termeplussimplesonefficacit.Lesmots"cot","complexit"et"efficacit"refltenticilammedfinition.Plusun
algorithmeestcomplexe,plusilestcoteuxetmoinsilestefficace.Lecalculdecettecomplexitacommersultat
unequationmathmatiquequonrduitgnralementensuiteunenotiondordregnral.
LacomplexitestnoteO(f(n))oleO(grandO)veutdire"dordre"etfestlafonctionmathmatiquedenquiestla
quantitdinformationsmanipuledanslalgorithme.Voiciunexemplepourmieuxcomprendre:soitunalgorithmequi
comptede1netquiaffichelesvaleurscorrespondantes.Danslapratique,vousallezutiliseruneboucle(voirle
chapitreLesboucles)allantde1n.Ilfaudrafairenpassagespourtoutafficheretdoncvousallermanipulernfois
linformation.Lafonctionmathmatiquedonnantlecotseraalorsf(n)=n.Lacomplexitestalorslinaireetvousla
noterezO(n).
Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexemple
unetabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvous
obtenez n fois n boucles, donc n
2
boucles. La complexit est donc f(n)=n
2
, et vous la noterez O(n
2
). Le cot de
lalgorithmeaugmenteaucarrdunombredinformations.
Sivousajoutezenplusunequelconqueoprationdanslapremireboucle,cetteoprationaaussiuncotquevous
pouvez tenter de prendre en compte. Si vous ajoutez une multiplication et que celleci a un cot de 1, alors la
complexitfinaleestden*(n+1)soitn
2
+n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetque
vouscomparezaveclacourbesimplen
2
,vousremarquerezquelerajoutdevientngligeable.Aufinal,lalgorithme
conserveunecomplexitO(n
2
).

Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies" :
- 4 - ENI Editions - All rigths reserved
G O(1) :complexitconstante
G O(log(n)) :complexitlogarithmique
G O(n) :complexitlinaire
G O(n.log(n)) :complexitquasilinaire
G O(n
2
) :complexitquadratique

G O(n
3
) :complexitcubique

G O(n
p
):complexitpolynomiale

G O(n
log(n)
) :complexitquasipolynomiale

G O(2
n
) :complexitexponentielle

G O(n!) :complexitfactorielle
Cescomplexitsnesontpasforcmentfacilesapprhender,aussivoiciungraphiquereprsentantquelquesunes
de cellesci. En abscisse est indiqu le nombre de donnes traiter et en ordonne la complexit associe : le
nombredoprationseffectuespourndonnes.PourdescomplexitsdordreO(2
n
)lalgorithmeeffectuedj1024
oprationsetplusde3,5millionspourO(n!) !
Courbesdecomplexit
Commentsereprsenterrellementunecomplexitentermedetempspassparlordinateurtraiterlesdonnes ?
Chaque microprocesseur est capable de traiter un certain nombre doprations par seconde. Le plus long tant
gnralementlescalculssurlesrels(flottants),lecritresouventretenupourdterminerlapuissancebrutedun
processeurestleFLOPS:FloatingPointOperationsPerSecond.UnIntelPentium43.2GHztourneunemoyenne
de3,1GFLOPS(GigaFlops)soit10
9
FLOPS,ouencoreunmilliarddoprationssurrelsparseconde.Sivoustraitez
20 donnes dans un algorithme de complexit O(n), la vitesse de calcul se chiffre en millionimes de seconde. Le
mmenombrededonnesdansunalgorithmedecomplexitO(n!)doiteffectuer2432902008176640000oprations
cequiprendra784807099secondes,ouencoreunefoisconvertiautourde25ans!Bienentendu,unecomplexitO
(n!)estlapirequipuisseexister.AvecunecomplexitinfrieureO(2
n
),letraitementprendraitundiximedeseconde
toutdemme,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 que
dhabitude, sont en concurrence avec diverses mthodes. Cest le cas par exemple des mthodes de tris sur des
tableaux.Cecidansluniquebutdevousdonnerunsimpleordredide.
- 6 - ENI Editions - All rigths reserved
Lesfondementsdelinformatique
1.ArchitecturedeVonNeumann
Un ordinateur est un ensemble de circuits lectroniques permettant de manipuler des informations quon appelle des donnes et
capable de faire "tourner" des programmes, cestdire une suite ou squence dinstructions programmes lavance et quil va
droulerdudbutlafindanslebutdobtenirdesrsultats.Pourcomprendrecommentunordinateurpeutdroulerunprogramme,il
fauttudierunpeuplusendtailsonfonctionnement.
Cest Von Neumann qui a dfini en 1944 larchitecture des ordinateurs modernes encore largement utilise aujourdhui (avec des
variantes cependant). Larchitecture de Von Neumann (issue des travaux de Turing dont il sera question plus loin) dcompose
lordinateurenquatrepartiesdistinctes:
G 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).IlexistedesUAL
spcialises dans les nombres virgule flottante, dautres dans des traitements complexes comme les logarithmes, les
inversions, les racines, les vecteurs, les calculs trigonomtriques, etc. Certaines documentations lui rajoutent quelques
registres(petitescasesmmoiresintgreslUAL)etluidonnentlenomdeprocesseur(CPU).
G LUnit de Contrle UC (CU en anglais), ne pas confondre avec Unit Centrale, contrle le squenage des oprations,
autrement dit le droulement du programme. Elle prend ses instructions dans la mmoire et donne ses ordres lUAL. Les
rsultatsretournspeuventinfluersurlesquenage.LUCpassealorslinstructionsuivanteouuneautreinstructiontelle
queleprogrammeluiordonnedeffectuer.
G La mmoire peut tre dcrite comme une suite de petites cases numrotes, chaque case pouvant contenir une petite
information(petitedanslesensolatailledechaquecaseestfixe).Cetteinformationpeuttreuneinstructionouunmorceau
dinstructionduprogramme(uneinstructionpeutoccuperplusieurscases)ouunedonne(nombre,caractre,oumorceaude
ceuxci). Cest lUC qui a comme rle central de contrler laccs la mmoire pour le programme et les donnes. Chaque
numro de case est appel une adresse. Pour accder la mmoire, il suffit de connatre son adresse. Les instructions du
programmepourlUCetlesdonnespourlUALsontplacesdansdeszonesdiffrentesdelammemmoirephysique.
G LesEntres/SortiesE/S(I/Oenanglais)permettentdecommuniqueraveclemondeextrieuretdoncvous:cepeuttreun
clavierpourentrerlesdonnes,etuncranpourafficherlesrsultats.Ilpermetlordinateurdtreinteractif.
Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstructionduprogramme
etlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALdeprendrecesdeuxnombresen
mmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvellecase.PuislUCpasselinstructionsuivante.
Sielleconsisteaffichercersultat,alorslUCvalirelecontenudelammoireladresseoestplaclersultat,puisvaenvoyerle
rsultat via le composant dE/S adquat. Et ainsi de suite. Au final le droulement dun programme au sein de lordinateur est le
suivant:
G lUCextraituneinstructiondelammoire,
G analyselinstruction,
G rechercheenmmoirelesdonnesconcernesparlinstruction,
G dclencheloprationadquatesurlALUoulE/S,
G rangelersultatdanslammoire.
VonNeumann,predesordinateursactuels
Sivousouvrezlecapotdevotreordinateur,vousyverrezunegrandequantitdecartes,composants,cbles,etmmedesorganes
mcaniques(lecteursdedisquesdurs,cdetdisquette).Unprogrammequevousallezcrireetdroulernesexcute pourtant que
dans un seul endroit : le microprocesseur. Le microprocesseur de votre ordinateur est une puce facilement reconnaissable car cest
souventlaplusgrosse,cellequidisposeduplusdepattesetestgnralementsurmontedungrosblocdaluminiumoudecuivre
accompagn dun ventilateur pour le refroidir. Il contient lUAL, lUC et divers autres organes : des registres spcialiss (donnes,
compteurs,adresses,tats,etc),unsquenceurquisynchronisetouslescomposants,unehorlogeinterne,uneunitdentresortie
quigrelacommunicationaveclammoire(nepasconfondreaveclE/Sdespriphriquesclavier,cran,etc).Lemicroprocesseur
disposeselonsonmodledunjeu(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.Autourdeceschmalogiqueseraccordentbiendautresorganeslectroniquescomme
lescontrleurs.Cespuceslectroniquesquonappelleaussiparfoischipsetssontaussidessortesdemicroprocesseursquidisposent
souvent dun jeu dinstructions pour les contrler, justement. Ces instructions sont souvent moins nombreuses et pas gnralistes.
Lescontrleursontunrleprcis,selonleurgenre:greruncertaintypedepriphrique(ex:uncontrleurdecartegraphique,un
contrleur pour les disques durs, etc), ou de transfert de donnes (ex : les contrleurs des bus de mmoire et de donnes, les
contrleursUSB,PCI,etc).Touscescomposantssontintgrssuruncircuitimprimprincipalappellacartemre.
ArchitecturedeVonNeumann
Pourrsumer:larchitecturedeVonNeumannestsimplecomprendreetrpartitlesfonctionnalitsdunordinateurenquatreentits
logiques. Ces entits logiques se retrouvent pour deux dentre elles (UC et UAL) dans le microprocesseur. Les autres et les
composantsadditionnelsseretrouventsurlacartemreousurlescartesdextension (la mmoire nestplussoudesurunecarte
mre mais fournie sous forme de carte additionnelle appele barrette, le contrleur E/S graphique est sur une carte graphique
additionnellerelieunbusPCI,AGPouPCI/E).Lesprogrammessontexcutsparlemicroprocesseurquiestaid(danslesenso
celuiciaccdeauxfonctionsproposes)pardiverscontrleurs.
Lesmicroprocesseursactuelssonttrscomplexes.IlnestpasraredetrouverauseindeceuxciplusieursUALpouracclrer
les traitements. De mme, on trouve souvent une mmoire intermdiaire appele mmoire cache ou antmmoire, celleci
tantsouventspcialise:unemmoirecachepourlesinstructionsetuneautrepourlesdonnes.
2.LamachinedeTuring
Avant mme lapparition des premiers vrais ordinateurs programmables, Alan Turing avait dfini en 1936 (le 28 mai exactement) ce
quonappellelaMachinedeTuring.Cettemachineabstraite(quinexistepasrellement)estenfaitunemthodedemodlisationdu
fonctionnement dun ordinateur ou plutt lorigine dun calculateur mcanique. Comment faire pour, depuis un postulat de base,
arriverunrsultatdonn?Enrespectantdesprocduresdonnes.Cestlundesprincipesdelalgorithmique.
UnemachinedeTuringntantpasunevraiemachine(ausensmatriel),ilsuffitpoursenservirsoitdeseservirdesatte(rflexion
etmmoire),soitdun crayon qui fera office dette de lecture, dune longue bande de papier dcompose en cases quonappelle
ruban,etdunetabledesymbolesetdeprocdureslieltatdelacaserespecterquandontombesurunecasecontenantun
symbole donn. On se place sur la premire case, on vrifie son symbole et son tat associs, on excute la procdure associe
(changement de valeur/symbole, avancer, reculer) et on continue drouler ce "programme" jusqu ce que la procdure vrifiant
quon a obtenu le rsultat final soit vrifie. On vient de drouler un programme, et lensemble symboles/procdure dcrit ce
programme.Cestlanctredelalgorithme.
AlanTuring,crateurdelamachineabstraitedummenom
Il existe des livres complets sur la machine de Turing, notamment un de Alan Turing luimme et de JeanYves Girard, aux ditions
Seuil, Collection Points Sciences. Linformatique nest pas le seul domaine dapplication de la machine. Elle permet de dterminer la
complexitdunalgorithme,siquelquechosepeutvraimenttrecalcul,adesdomainesdapplicationsdanslaphysiqueetnotamment
loptique,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 quune
chose:deschiffres.Siltrehumainainventdesreprsentationspratiquesdeschiffresaveclesystmedcimal(soitunenotation
enbase10enallantdezroneuf),unordinateurnemanipulequedeuxvaleurs:0ou1.Eneffetsivouspouvieztrsfortement
agrandiruncircuitintgr,vousverriezqueceluiciestcomposdenombreusespistesdanslesquellespasseuncourantlectrique.
Dans ces circuits il ny a que deux possibilits : soit le courant passe et dans ce cas cela quivaut une valeur de un (1), soit le
courantnepassepas,etdanscecascestlavaleurzro(0)quiestretenue.Cestdubinaire(quineprendquedeuxvaleurs).Une
unitbinairesappelleunbit(binarydigit).CemotatinventparClaudeShannonen1948.
Commeilyaplusieurspistessurlescircuits,plusieursvaleurs0et1,doncplusieursbits,circulentenmmetemps.Enassociantces
valeurs,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 le
fonctionnement des nombres binaires en associant des fils transportant du courant des ampoules lectriques. Chaque ampoule
reprsenteunevaleur.Silecourantpasse,lampoulesallumeetprendlavaleurassocie.
Lebinaire,commesonnomlindique,utiliseunebasedeux(2)toutcommeledcimalutiliseunebasedix(10).Endcimal,tousles
nombrespeuventtrereprsentslaidedepuissancesde10.Prenezlenombre1234:
1*103+2*102+3*101+4*10
0
=1234

Lunit est reprsente par 10


0
, la dizaine par 10
1
, la centaine par 10
2
, et ainsi de suite. Pour convertir le binaire en une valeur
dcimalepluslisible,ilfaututiliserlespuissancesde2,lapluspetitevaleurtantlaplusdroiteetestappelebitdepoidsfaible,
laplusgrandelaplusgaucheetestappelebitdepoidsfort.Danslexempleprcdent,lavaleurbinaire11peuttreconvertie
ainsi:
1*2
1
+1*2
0
=2
1
+2
0
=2+1=3

Les informaticiens et mathmaticiens utilisent une notation particulire en indice (nombres en retrait bas) pour indiquer des
conversions:
11
(2)
=3
(10)

Voiciundernierexempleavecunevaleurbinairecodesur8bits.Quelleestlaplusgrandevaleurdcimalequipeuttrecodeavec
8bits?
2
7
+2
6
+2
5
+2
4
+2
3
+2
2
+2
1
+2
0
=128+64+32+16+8+4+2+1=255

Donc
11111111
(2)
=255
(10)

Soit 256 valeurs possibles de 0 (zro) 255, ce qui peut tre plus simplement calcul par 2
n
, soit deux puissance n, n tant le
nombredebitscontenusdanslavaleurbinaire.Laplusgrandevaleurconvertieendcimalestdonc:
2
n
1

Il est possible de convertir du dcimal en binaire avec des divisions successives : on divise les rsultats sans la virgule
successivement par deux. Le rsultat binaire sera la juxtaposition des restes (0 ou 1) sauf pour le dernier. Par exemple avec le
nombre183:
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
G 183/2=91,reste1
G 91/2=45,reste1
G 45/2=22,reste1
G 22/2=11,reste0
G 11/2=5,reste1
G 5/2=2,reste1
G 2/2=1,reste0
G Onremontedudernier:10110111
Conversiondcimaleenbinaire
Cest donc en binaire que sont reprsentes toutes les valeurs quun ordinateur manipule. Cest valable tant pour les donnes
(numriquesoutexte)quepourlesinstructionsdestinationdumicroprocesseur.Unnombrebinairecorrespondrauneinstruction.
Parexemplesurunmicroprocesseurx86(IntelouAMD),01110100estlinstructionje(jumpifequal),ouencorelaligne10110000
01100001quisignifiemov$0x61,%al(placerlavaleurhexadcimale0x61dansleregistreAL).
Lesordinateursdudbutdesannes2000saventmanipulerdesnombressur64bitsor2
64
estgal18446744073709551616
soitplusde18milliardsdemilliards!
Lide dutiliser deux valeurs pour encoder dautres valeurs remonte Francis Bacon. En 1623, il cherche une mthode
stganographiquepourpouvoircrypteruntextecomposdeslettresdelalphabet.Ilremarquequunassemblagededeuxlettres
groupesparcinqpermetdecoderlensembledelalphabet.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.Maislesbitsnesontpasstocksindividuellementdansune
case mmoire. Ils sont regroups, gnralement par multiples de huit (8). Ainsi un ensemble de 8 bits est appel un octet.
Lavantage de loctet est quil suffit (ou en tout cas a longtemps suffi) pour reprsenter tous les chiffres, lettres et symboles des
alphabetsoccidentaux.Unoctetreprsentelesvaleursde0255.
Aveclaugmentationdesespacesdestockages,delaquantitdemmoire,dubesoindereprsentationdenombresdeplusenplus
grands,dunaccsplusrapidelammoireouencoredeplusdinstructions,ilafalluaugmenterlatailledesvaleursmanipuler.De
8, puis 16, puis 32, certains microprocesseurs peuvent manipuler des valeurs de 64 voire 128 bits, parfois plus.. Ces valeurs
deviennent difficiles dcrire et reprsenter. Pour ces valeurs, on parle de mot mmoire (word en anglais). Certains
microprocesseursfontunediffrenceentrediverstypesdemots.CeuxdeMotorolacommeles68000(quiquipaientlesordinateurs
AtariST,Amiga,lesconsolesSegaMegadriveetplusrcemmentlesPalmPilot)utilisentdesmotsde16bits,etdesmotslongs(long
word)de32bits.
Lesinstructionsetlesdonnessontdonccodessousformedenombresbinairesquonappelledesmots.Cependantsuivantletype
demicroprocesseurlordredesmotsestdiffrententrelaralitetsonstockageenmmoire.Avecunmicroprocesseurx86enmode
rel(16bits)lenombredcimal38457ncessite16bitssoitdeuxoctetsouunmotdeseizeoctetspourtrereprsent:
38457
(10)
=1001011000111001
(2)

Pourstockercettevaleurenmmoire,les8premiersbitsdepoidsfaible,soitloctetdepoidsfaible,serontplacsdanslapremire
casemmoire,etles8derniersbitsdepoidsfort,soitloctetdepoidsfort,serontplacsdanslacasesuivante.Ladmarcheseraitla
mmeen32bitsou64bits.
Casemmoire1 Casemmoire2
00111001 10010110
- 4 - ENI Editions - All rigths reserved
c.Lhexadcimal
Sivousreprenezlexempledunevaleurbinairecodesur64bits,ilfaut640ou1pourladcrire :
1111111111111111111111111111111111111111111111111111111111111111
Endcimalilfautvingtchiffres:18446744073709551616
Celaprendbeaucoupdeplaceetcestdifficilemanipuler.Puisquilexisteunebase10(dcimal)etunebase2(binaire),pourquoine
pas prendre une base plus leve, multiple de 2, pour rduire la longueur et la manipulation de ces nombres ? Cest ainsi quen
informatiqueilestdusagedutiliserlabase16,appelehexadcimale.
Une base hexadcimale permet de coder les valeurs de 0 15. Si de 0 9 on utilise les valeurs dcimales correspondantes, au
dessusilfaututiliserdeslettresdelalphabet,deA(10)F(15).
Commentpasserdubinairelhexadcimal?Cecirevientrpondrelaquestion"Combienfautildebitsdansunnombrebinaire
pourcoder16valeurs ?"2
4
=16.Ilfautdonc4bits.Letableausuivantrsumelesconversions.

Sivousreprenezlenombre183quincessite8bitssoitunoctet,saconversiondonneB7enhexadcimal.Onditdoncque:
183
(10)
=B7
(16)

dudcimallhexadcimal
Sivousprenezlavaleurmaximaleen64bits,celadonneFFFFFFFFFFFFFFFFsoit16caractres.Uninformaticienexercestquasiment
capabledeconvertirlavoledelhexadcimalendcimal.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 systmes
dexploitation,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?
Ilexisteplusieurscentainesdelangagesdeprogrammationsiontientcomptedetouteslesvariantespossiblesdun
mmelangage.Commevousavezpulelireaudbutdecechapitre,lordinateurnecomprendnativementquunseul
langage, le langage machine. Croyezvous vraiment que vous allez implmenter le programme de lancer de d
directement en binaire (ou mme en hexadcimal) ? Le choix du langage mrite une petite dmonstration. On a
coutumedanslemilieudelinformatique,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 <stdio.h>

int main(int argc, char **argv)
{
printf("Hello world!\n");
return 0;
}
#include <iostream>
Enassembleurx86sousDOS
EnshellUnix
EnBasicoriginel
EnCOBOL
EnlangageC
EnlangageC++
- 1 - ENI Editions - All rigths reserved

int main()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
<?php
print ("Hello world!");
?>
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Sub Main()
MsgBox("Hello world!")
End Sub
program Bonjour;
begin
WriteLn(Hello world!);
end.
2.Classificationsdeslangages
Queremarquezvous?Ilyaautantdesyntaxesdiffrentesquilexistedelangages.Cependantvousconstatezque
leslangagesC,C++,JavaouPHPontdenombreusesressemblances,alorsquelassembleurouleCOBOLsemblent
sortisdouvrages de ScienceFiction. Cestquelespremiersontquelquesliensfamiliauxtandisquelesautressont
radicalementopposs.
a.Hautniveau,basniveau
Puisquilexistedescentainesdelangagesdeprogrammation,lequelchoisirpourimplmentervosalgorithmes?Il
ny a pas de rponse simple cette question. Chaque langage a t gnralement conu pour des usages
diffrentsetsouventspcifiques,bienquenvoluantlaplupartdeslangagesditsdehautniveausoientdevenus
deplusenplusgnralistes.Ilexisteplusieursclassificationsdeslangages.Laplusanciennedpenddelaffinitdu
langageparrapportlamachine.Onparlealorsduniveaudulangage.Ilestcourantdeparlerdunlangagedebas
niveauoudeniveauzro(0)quandceluicincessitedesconnaissancesapprofondiesdufonctionnementdevotre
ordinateur:mcanismesdegestiondelammoire,instructionsdumicroprocesseur,etc.Unexempledelangagede
trs bas niveau est le langage machine sous sa forme binaire, ou de le la programmation en assembleur o ces
mmesvaleursbinairessontreprsentespardesmots(mnmoniques)enanglais.Vuquelesprogrammessont
directement comprhensibles par le matriel, vos programmes seraient alors les plus rapides. Il est tout fait
possible de programmer de grosses applications en assembleur (et notamment des jeux), ctait dailleurs trs
courant jusqu lapparition des machines trs rapides o leur vitesse a compens une plus faible vitesse
dexcutiondunlangageplusvolucommeleC,maisaveclavantageduneprogrammationplussimple.
lopposdeslangagesdebasniveausetrouventleslangagesdehautniveau.Ilnyapasdchelleprcise.Vous
pourrez trouver dans quelques sources des niveaux allant de 0 4, mais les langages voluant tellement vite,
certainslangagesquitaientconsidrsdehautniveaucommeleCsesontvusdclasssverslebas!Unlangage
dehautniveaupermetdefaireuneabstractionpresquecompltedufonctionnementinternedevotreordinateur.
Le langage (ou plutt son compilateur ou son interprteur) se chargera de convertir vos ordres simples (en
apparence)enlangagedebasniveau(enlangagemachine).Nevousfiezpasauxapparences:laffichagedune
EnPHP
EnJava
EnVisualBasic
EnPascal
- 2 - ENI Editions - All rigths reserved
bote de dialogue prend une ligne de langage de haut niveau, mais des centaines en assembleur ! Parmi les
langages de trs haut niveau se trouvent Java, C#, le PHP, ou mme le C (en faisant abstraction de certains
mcanismes). Linconvnient dun langage de haut niveau est quil nest pas toujours possible daller dans les
dtailslesplusfins.
b.Diversesclassifications
ctdesniveaux,tousleslangagesnontpaslemmebut.IlnestpaspossibledecomparerlelangageHTML
dontlerleestdeformaterdespageswebetleVisualBasicquipermetundveloppementrapidedapplications
graphiques.Cestpourquoiilexistedautresclassificationsdontvoiciunbrefchantillon:
G gnralisteouspcialis
G objetouprocdural
G typounontyp(cf.chapitreLesvariablesetoprateurs)
G interprtoucompil
G etc
Certains langages sont spcialiss. Le HTML est spcialis dans la conception de pages web statiques : son
excutionacommersultatdirectlaffichagedunepageHTMLquilamisenforme.LeSQLestunlangagedebase
de donnes : il permet de grer des enregistrements de donnes. Le Javascript est un langage qui permet de
programmer des pages web dynamiques du ct du navigateur web, tandis que le PHP (bien que devenu
gnraliste) ou ASP permettent de programmer des sites web dynamiques mais cette fois du ct du serveur.
Certainslangagespeuventfaireappeldautreslangages.VouspouvezparfaitementfaireduSQLdansduPHP,si
votresitedoitaccderunebasededonnes...
c.Compilouinterprt
Uneautredistinctionprendreencompteestladiffrenceentreunlangageinterprtetunlangagecompil.Un
langageestditcompilquandleprogrammesourcesousformedetexteesttoutdabordluettraitparunautre
programme appel compilateur qui le convertit en langage machine directement comprhensible par lordinateur.
Voustapezvotreprogramme,vouslancezlacommandedecompilationetenfinvousobtenezunfichierexcutable
(un .exe sous Windows par exemple) que vous pouvez le cas chant lancer comme nimporte quel autre
programmeenlangagemachine.
Un programme en langage interprt ncessite pour fonctionner un interprte (ou interprteur) qui est un autre
programme qui va traduire directement, au fur et mesure de son excution, votre programme en langage
machine, un peu comme un vrai interprte qui dans une interview traduit simultanment langlais en franais. Le
programme est souvent un fichier texte et linterprte analyse la syntaxe de celuici avant de le drouler
dynamiquement.
Unprogrammeinterprtserapluslentquunlangagecompilcausedelaconversiondynamiqueduprogramme,
alorsquecettetapeestdjeffectuelavanceavecunlangagecompil.Aucontraire,lacorrectiondeserreurs
estplussimpleavecunlangageinterprt.Commelacorrectionetlersultatsontimmdiats,linterprte va vite
vous indiquer au cours de lexcution o se trouve lerreur de syntaxe (mais pas de logique) lorsquil va la
rencontrer, quelle ligne, linstruction en cause, ventuellement une aide supplmentaire. Alors quavec un
compilateur, cest au moment 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 den
dterminerlorigine(ilfautalorsfaireappeldautresprogrammesspciauxappelsdbuggers).
- 3 - ENI Editions - All rigths reserved
tapesdecompilationetdditiondesliensenC
3.Lamachinevirtuelle
Ilexisteunetapeintermdiaireentrelinterprtetlecompil :lamachinevirtuelleapplicative.Lamachinevirtuelle
estunprogramme,gnralementuninterprteur,quipermetdisolerlapplicationquildoitfairetournerdumatriel
et mme du systme dexploitation. Le programme na thoriquement aucun accs aux spcificits du matriel,
lensembledesesbesoinsluitantfourniparlamachinevirtuelle.Ainsi,toutprogrammeconupourcettemachine
virtuelle pourra fonctionner sur nimporte quel ordinateur, du moment que ladite machine virtuelle existe pour cet
ordinateur.Cestenquelquesorteunecouchedabstractionultime.Gnralement,leprogrammefonctionnantdepuis
lamachinevirtuelleadjsubiunepremirephasedecompilationpourletransformernonpasenlangagemachine
propre lordinateur, mais dans un langage "machine virtuelle" pour ainsi dire, que lon nomme bytecode. Ce
bytecodepourratreinterprtparlamachinevirtuelle,oupluttetcecideplusenplusrgulirement,compilla
volejusteaumomentdesonutilisation(technologieJIT,JustinTime).
Ainsi dans certaines circonstances le programme fonctionne presque aussi vite quun programme compil pour une
machinecible!UnexempledelangageutilisantunemachinevirtuelleestJava.
- 4 - ENI Editions - All rigths reserved
GnrationetexcutiondebytecodeJava
Pour implmenter vos algorithmes, il vous faut trouver un langage simple, de haut niveau, gnraliste mais vous
permettantdvoluerversdesapplicationscomplexesetcompltes.Ilnefautpasquevousayezpasserpardes
tapeslonguesetcomplexesdecompilationetilfautquelelangageproposeuneouvertureversdautreslangages.
Dansunespritdouvertureetdecompatibilit,ilseraitintressantquecelangagenesoitpasdisponibleuniquement
sous Windows et que si possible le programme rsultant puisse fonctionner sur plusieurs systmes dexploitation
sansavoirlemodifier,nilerecompiler.Plusieurslangagespourraientconvenir.Lemieuxestdechoisirunlangage
interprt :lePHP.
4.PHP
a.Lesavantages
PHP, (PHP Hypertext Preprocessor), dispose de toutes les qualits ncessaires. Il est disponible sur la plupart des
architecturesetsystmesdexploitation.PHPestlorigineunlangagedescriptHTMLexcutductduserveur,
mais cest aussi un langage complet disposant de nombreuses fonctionnalits lui permettant de faire fonctionner
desprogrammesdepuislalignedecommandeoudepuisunbureau.Ilestnotammentpossibledeconcevoirdes
applications graphiques compltes en PHP, directement, sans passer par du HTML. Sa syntaxe est largement
inspiredulangageC,deJavaetdePerl,avecdesamliorationsspcifiques.Lebutinitialdulangagetaitdcrire
rapidementdespagesHTMLdynamiques.
b.Historique
LoriginedePHPremonte1995quandRasmusLerdorfacrPHP/FI,unelibrairiedescriptsPerlutilisepourla
publicationdesonCVsursonsitepersonnel.Aufuretmesuredesvolutions,lalibrairieatporteenCet
agrmente 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%desnoms
dedomaines)disentlutiliseroulesupporter.Lescontributeursaffluent.
- 5 - ENI Editions - All rigths reserved
PHP3.0sortenjuin1998,cestlapremireversiondveloppeconjointementparRasmusLerdorf,AndiGutmanset
Zeev Suraski et entirement rcrite (les versions prcdentes taient trop lentes pour une application
commerciale). Outre ses performances, PHP 3 est modulaire et extensible il est possible de lui greffer des API
supplmentaires,cequinapasmanqudtrefaitaveclesupportdenombreusesbasesdedonnes,deformats
etdeprotocoles.Ildisposedune syntaxe plus cohrente et dun support basique de lobjet.Ilatinstallsur
10%duparcmondialdesserveurswebavecdesdizainesdemilliersdedveloppeursetdescentainesdemilliers
desites.
Le moteur de PHP 4 a t repens afin den amliorer les performances pour des applications complexes et
daugmenterencoresamodularit.Unnouveaumoteuravulejour,appelZendEngine(contractiondeZeevet
Andi).PHP4sortofficiellementenmai2000etapportedesperformancesaccrues,lesupportdeplusieursserveurs
web,lessessions,unescuritaccrue.
PHP 5, sorti en juillet 2004, propose, entre autres, une amlioration des performances du moteur Zend (Zend
Engine2),unmodleobjettenduettrsprocheduC++,unecompatibilitaccrueavecdenouveauxstandardset
lesanciens(RPC,XML,.NET...).Cestactuellementladernireversionstable.
c.Informationspratiques
PHPpeuttreutilispournimportequelprojet,dont :
G lesforumsetmessageries
G lecommercelectronique
G labanque,lescomptesenligne,lespaiementsenligne
G lapublicationenligne
G lesmoteursderecherche
Toutcequevousvoulez,enfindecompte !
Voiciquelquessiglesetabrviationsconnatreetquiserontparfoisutilissparlasuitedanscelivre :
G HTML:HypertextMarkupLanguage
G PHP:PHP,HypertextPreProcessor
G SQL:StructuredQueryLanguage
G MySQL:Serveurdebasededonnesetlesoutilspouryaccder
G LAMP:LinuxApacheMySQLPHP,lequatuorgagnantdesserveursweb.
d.Pagesdynamiques
UnepagestatiqueestunepagecritedirectementenHTML.EllepeutventuellementincorporerducodeJavascript
luidonnantunsemblantdedynamismemaisuniquementductdunavigateuretdesdonneslocales.
Pourdestraitementspluslourdsncessitantlaccsunebasededonnes,unformatagedetableauenfonction
dersultats,unerecherchepousse,dugraphisme,ilfautpasserpardespagesdynamiquesetparunlangagequi
seraexcutductduserveur: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 le
navigateuretlutilisateurnevoientjamaislevritablecodePHPexcut.Deplus,lersultattantunepageweb
classique en HTML, pas besoin dinstaller sur le client des composants spcifiques (java...). Il ny a donc pas de
notiondevitessedexcutionductduclient,maiscelleduserveurestprpondrante.
e.Installerlencessaire
PHPnesertpasseulementfairedespagesdynamiques.CestunlangageinterprtquiaummetitrequePerl,
- 6 - ENI Editions - All rigths reserved
Python ou TCL est capable de lancer des scripts interactifs ou non. On peut mme utiliser PHP pour crer des
interfacesgraphiques(extensionGTK).LeminimumncessaireetvitalpourapprendrePHPestdonclinterprteur
PHPluimmesurunenvironnementsupport(Unix,Windows,Mac...).
SionparledeLAMP,onvoitbienlarfrence.UnsystmeLinux,unserveurWebApache,unserveurdebasesde
donnesMySQLetuninterprteurPHP.Laversion5dePHPpermetdefonctionneravecIISetMySQLexisteaussi
pour Windows. On peut donc utiliser une architecture WIMP (Windows, IIS, MySQL, PHP) ou WAMP (Windows,
Apache,MySQL,PHP).
LesdistributionsLinuxdisposentdjduncessairepourlarchitectureLAMPetleparamtrageestassezsimple.
De plus, le mode "user_mod" de Apache permet chaque utilisateur de crer son site web dans un rpertoire
spcifique de son rpertoire personnel. Vous vous reporterez la documentation spcifique de votre installation
poursavoiroplacervosscriptsPHPafindelestester.SousLinux,cestgnralementdans/var/www/htdocs,
ou/srv/www/htdocs,ouencoredanslerpertoirepublic_htmldevotrerpertoirepersonnel.
Sous Windows, cest un peu plus complexe mettre enuvre manuellement. On emploie donc des distributions
toutesfaites,lesmeilleuressenommentEasyPHPetXAMPP.Ellesproposentuneinterfacegraphiquepermettantde
contrlerledmarragedescomposants(PHP,Apache,etc.).OnpeutainsidveloppersonsitesousWindowsetle
portertelquelsurunserveurUnix.NotezqueXAMPPexistepourWindows,Linux,MacOSetSolaris.
Voustrouverezcesproduitsauxadressessuivantes :
G XAMPP :http://www.apachefriends.org/fr/xampp.html
G EasyPHP :http://www.easyphp.org/
Pourdvelopper,ilsuffitdunsimplediteurdetextemaisilvautmieuxprfrerunditeurplusvolusupportant
lacolorationsyntaxiqueetquelquesfonctionsvolues.SousWindows,lesditeursnotepad++ouHAPEdit3sont
parfaitspourdvelopperenPHP.SousLinux,kwrite,gedit,bluefishouquantasontparfaits.
Pourlestests,unsimplenavigateurweboulalignedecommandesuffisent.
f.UnpremierprogrammePHP
LepremierprogrammePHPquevousalleztaper,compileretlancerestlefameux"HelloWorld"dontlalgorithmene
mritevidemmentpasdtreexpliqu,carleprogrammesecontentedunsimpleaffichage.LecodePHPrsultant
estlesuivant.
<?php
echo "Hello world !" ;
?>
I TapezceprogrammeetplacezledansunfichierappelHelloWorld.php.
I OuvrezunefentreMSDOS(cmd)sousWindows,ouuneconsole(outerminal)shellsousUnix/MacOSettapez
linstructionsuivantelovotreprogrammeestenregistr.Lesigne" > "indiquelinvitedecommandeouprompt
deMSDOSoudushell,neletapezpas.
> php HelloWorld.php
Hello world!
Bravo,vousvenezdefairefonctionnervotrepremierprogrammePHP.
La syntaxe du langage PHP de ce premier programme est trs simple. Une page php porte lextension .php.Une
page PHP peut tre entirement programme en PHP ou mlange avec du code HTML. PHP est un langage
"EmbeddedHTML",cestdirequilapparatnimportequelendroitdelapageHTML.Pourcela,onleplacedans
desbalisesparticulires<?phpet?>.OncritdoncunepageHTMLdanslaquelleonintgreducodePHP.Lecode
PHPestencapsuldansleHTML:cestlencapsulation.
<html>
<head>
<title>Titre</title>
</head>
<body>
<?php
echo "Hello World !";
?>
</body>
</html>
- 7 - ENI Editions - All rigths reserved
Vouspourrez,selonvotreconfiguration,accderlapageWebvialURLsuivante :
http://localhost/HelloWorld.php
LecodeHTMLgnrseralesuivant :
<html>
<head>
<title>Titre</title>
</head>
<body>
Hello World !
</body>
</html>
Pourlasuitedecetouvrage,quandceserapossible,lesexemplesenPHPserontadaptsuneutilisationviaun
navigateurWeb.Autrement,etceciseraprcis,lesprogrammesserontexcutsvialalignedecommande.
- 8 - ENI Editions - All rigths reserved
Lesstructuresitratives
1.Dfinition
Commeindiqudanslepremierchapitre,laboucleestlaquatrimegrandestructuredebasedelalgorithmiqueet
donc de la programmation. Pass ce chapitre, tout le reste est une application ou une drivation de ces quatre
structuresdebase.Lesbouclessontdesstructuresitratives.Uneitrationoustructureitrativeestunesquence
dinstructionsdestinetreexcuteplusieursfois.Cestaussilactiondexcutercetteinstruction.Vousentendrez
parlerparfoisdestructuresrptitives,cestlammechosediteautrement.Lebutduneboucleestderpterun
bloc dinstructions plusieurs fois. Selon le type de boucle, ce bloc va tre rpt un nombre fixe de fois (n fois) ou
selon un certain nombre de critres (un test de une ou plusieurs conditions) que vous connaissez trs bien
maintenant.
Laboucleestunlmenttrssimpleaupremierabord.Lespremiersexemplesquevousrencontrerezserontbien
souvent vidents. Pourtant elle devient rapidement lune des btes noires du programmeur en herbe cause
justementdesfameuxcritresdesortie.Silestestsexcutentuneactiondonne(structureSI)encasderussite
ounon,uneerreurdansuneconditiondesortiepeutameneraumauvaisnombredeboucles,nejamaisyrentrer
oummepire,nejamaisensortir.
Laboucleestdautantmoinssimpleassimilerquilestprobablequevousnayezjamaisrencontrunestructurede
ce genre hors de lalgorithmique et des langages de programmation. Dans le langage courant, on ne parle pas de
boucle quand il sagit de rciter une table de multiplication. En algorithmique vous devrez pourtant en utiliser une
pour calculer cette table. De mme dans lutilisation quotidienne de lordinateur, vous nutilisez pas cette structure
pourtant,touslesprogrammeslefont.Commentlirelintgralitdunfichierdetraitementdetexte?Commentjouer
unmp3ouunevido?laidedesbouclesbienentendu!
2.Quelquesusagessimples
Un exemple simple : le cas o un utilisateur doit rpondre une question parmi une liste de rponses imposes
commeo(oui)oun(non).Silutilisateurrpondautrechose(nimportequoi),ilfautluireposerlaquestion,jusquce
quilrpondevraimentooun.
Pourcrerunetabledemultiplication,de3parexemple,vousallezprocdercommesivouslarcitiez :
G 3*1=3
G 3*2=6
G 3*3=9
G
G 3*9=27
G 3*10=30
Vous allez donc multiplier 3 successivement par les nombres de 1 10. En algorithmique, vous connaissez les
variables.Commentaffecterunevaleurde110successivementunevariable?Avecuneboucle!
Et si maintenant vous vouliez crer lensemble des tables de multiplication : tables de 1, de 2, etc, jusqu 10 ou
plus?Ilvousfaudraimbriquerdeuxboucles!
Sivousvoulezcalculerunepuissancequelconque,unefactorielle,sortirleplusgranddesnombresparmiunelistede
nombressaisis(enattendantlestableaux),etc:ilfaudraencoreutiliserlesboucles.
Danslechapitreprcdent,vousavezvucommentcalculerlessolutionsdunpolynmeduseconddegr.Etsivous
souhaitiez tracer sa courbe graphique via un programme (en PHP ou Java par exemple) ? Il vous faudra encore
utiliseruneboucle(etquelquesastuces).
Vousverrezquaveclesboucles,vouspourrezmmeextrairelesracinescarres.
Cesexemplessimplesmettentenvidenceaumoinstroischoses:
G Il existe plusieurs types de boucles : certaines ont un nombre fixe ditrations, dautres dpendent de
- 1 - ENI Editions - All rigths reserved
conditionsdesortiequevousaurezdfinir.
G Il est possible dimbriquer plusieurs niveaux de boucles : vous pouvez faire des boucles dans des boucles,
autantdefoisquevouslevoulez.
G Il existe une quantit infinie dutilisation des boucles qui en font une structure incontournable en
programmationpourlamoindredesapplicationsuntantsoitpeucomplexe.
- 2 - ENI Editions - All rigths reserved
PourFinPour
1.Unestructurepourcompter
Troisime et dernire structure itrative de lalgorithmique, le "Pour Fin Pour" est une boucle lusage quasi
exclusifdescompteurs.chaquepassagedanslaboucle,uncompteurestincrmentoudcrment,selonlecas.
Onditalorsquilsagitdunestructureincrmentale.
Sasyntaxeenpseudocodeestlasuivante:
Pour variable De dbut fin [PAS pas] Faire
Bloc dinstructions
Fin Pour
chaquepassagedanslaboucle,lavariableprendrasuccessivementchacunedesvaleursdanslintervalle[ab](a
etbinclus).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 dinstructions
compteur suivant
Danscettedernireforme,ilestintressantdeconstaterquilestplussimple,danslecasdebouclescontenantun
gros bloc dinstructions, de sy retrouver, la variable tant rpte dans la syntaxe de fin de boucle. Enfin, il est
possibledetrouverdessyntaxesalternativesdrivantdecestroisdernires.
2.maispasindispensable
Vous aurez rapidement compris que cette boucle ne sert que pour des compteurs. Autrement dit, tout ce quelle
proposeestdjintgralementpossibleaveclesstructures"TantQue"et"Rpter".Simplementavecle"Pour"vous
navezpasfairevousmmelecalculducompteur.Cestdoncunesimplification.
Ilnexisteaucuncasolastructure"PourFinPour"eststrictementncessaire.Ellenefaitquesimplifierles
autresstructuresitrativeslorsdelutilisationdecompteurs.
3.Quellestructurechoisir?
Mais alors quand utiliser telle ou telle structure ? On emploie une structure "Pour" lorsquon connat lavance le
nombreditrationsncessairesautraitement.Cenombrepeuttrefixeoucalculparavanceavantlaboucle,peu
importe.Laboucle"Pour"estdterministe:sonnombreditrationsestfixunefoispourtoutesetestenprincipe
invariable(bienquilrestepossibledetricher).
On emploie les structures "Tant Que" ou "Rpter" lorsquon ne connat pas forcment lavance le nombre
ditrationsquiserontncessaireslobtentiondursultatsouhait.Lexempleleplusconcretestreprsentparla
saisie des notes : on peut en saisir une, 200, aucune, mais on le sait pas lavance. Mais cela peut tre aussi la
lecture 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(lepremier
quigagnesortdelaboucle),etc.
4.Unpigeviter
Tout comme il faut viter les boucles infinies (sauf si cest parfaitement volontaire), il faut aussi viter quelques
erreursquipeuventservlertrssurprenantesselonlecas(rappelezvouslaLoideMurphy).Voiciunexemplede
cequilnefautpasfaire:
Variable x en Numrique
Dbut
Pour x allant de 1 31 Faire
Ecrire x
xx*2
Fin Pour
Fin
Lerreur(saufsicestcequevousvouliezexplicitement,cequisappellejoueraveclefeu)estdemodifiervousmme
lecompteurutilisparlaboucleauseinmmedecetteboucle.Quesepassetildanscetexemple?Vouspassezde
12,puisQuoi?3?6?7?14?Cadevientnimportequoietaucunnombreditrationsnepeuttreprvu.Vous
nesavezplusquandvousallezsortirdelaboucle,nimmelanouvellevaleurducompteurchaqueitration.Selon
leslangages,vousaurezaumieuxunfonctionnementpeuprsconformecequevousattendiez,aupiredugrand
nimportequoi.Oreninformatique,sauftravaillerpourunditeurpeuscrupuleuxsurlaqualit,un"peuprs"est
inacceptable.
Ne modifiez jamais un compteur de boucle "Pour" au sein de celleci. Si cela savre vraiment ncessaire,
modifiezvotrebouclepourutiliserunestructure"TantQue"ou"Rpter".
5.Quelquesexemples
a.Denouveautroisboucles
Promisdevenirungrandclassique,puisquecestlatroisimefoisquevouslevoyezsoustroisformesdiffrentes
donc,voicilexempledestroisboucles,preuvesilenestquele"PourFinPour"estbienpratiquemaistotalement
optionnel.Lintrtestvidemmenticideproduireuncodeplussuccinctetencorepluslisible.
Variables a,b,c,nb1,nb2 en Numrique
Dbut
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 Pour
Fin
CequienPHPdonne:
<html>
<head><meta/>
<title>Trois boucles</title>
</head>
<body>
<?php
for($x=1;$x<=10;$x++) {
for($y=1;$y<=10;$y++) {
for($z=1;$z<=10;$z++) {
- 2 - ENI Editions - All rigths reserved
$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 <br />";
}
}
}
}
?>
</body>
</html>
b.Lafactorielle
Encoreunclassique:avecunefactorielleden,voussavezlavancelenombreditrationsncessaire:n.Cest
doncuneapplicationdechoixpourlastructure"PourFinPour".
Variables cpt, i, resultat en Numrique
Dbut
Ecrire "Quelle factorielle ?"
Lire cpt
resultat1
Pour i de 2 cpt
resultati*resultat
Fin Pour
Ecrire resultat
Fin
EnPHP:
<html>
<head><meta/>
<title>Factorielle 3</title>
</head>
<body>
<?php
if(!isset($_GET[cpt])) {
?>
<form method="GET">
Factorielle de : <input type="text" size="4" name="cpt" />
<input type="submit" name="OK" />
</form>
<?php
} else {
$cpt=$_GET[cpt];
$resultat=1;

for($i=2;$i<=$cpt;$i++) $resultat=$resultat*$i;

echo $resultat;
}
?>
</body>
</html>
c.Racinecarreavecprcision
Voici une innovation : le calcul dune racine carre. Savezvous extraire une racine carre la main ? Avant
lapparition des calculatrices, les lycens et tudiants utilisaient soit des tables ou des rgles calcul, soit les
calculaient euxmmes. Il serait possible de dcrire la mthode utilise mais il manque encore quelques notions.
Une mthode plus mathmatique est lalgorithme de Hron dAlexandrie. Cet homme aussi appel Hron lAncien
tait un mathmaticien, mcanicien et ingnieur grec n Alexandrie au 1er sicle de notre re. Il a crit de
nombreuxtraitsetlaissquelquesformulesdontlunepermettantdecalculerlaireduntriangleenfonctiondela
longueurdesesctsetuneautrepermettantdapprocherlavaleurduneracinecarredemanirercursive.Voici
commenttrouverlaformule:
- 3 - ENI Editions - All rigths reserved
FormuledeHrondAlexandrie
Lasuitefinalepermetdecalculerlaracinecarreenfonctiondunevaleurinitialearbitrairex
0
.Enprincipe,onutilise
lavaleurentireapprochedelaracinecarre,laformulepermettantinitialementdobtenirrapidementlesnombres
situsaprslavirgule.Doncsivouscherchezlaracinecarrede40,sachantque6x6vaut36etque7*7vaut49,
laracinecarreestcompriseentrelesdeux,vousdevriezmettre6.Cependantdanslapratique,nimportequelle
valeurpeutconvenir,avecunnombreimportantditrationsvousobtiendrieztoujourslersultatattendu,autant
enplaant1que10000.
Il est cependant trs intressant de pouvoir optimiser le calcul en rcuprant lentier le plus proche. Lalgorithme
sera extrmement prcis. Celuici contiendra deux boucles. La premire de type "Tant Que", charge de calculer
lentier x le plus proche de la racine carre de a. La seconde de type "Pour" calculera les dcimales. Le nombre
ditrationspermettradedtermineruneprcision.Dailleurs, inutile dexcutercettesecondebouclesilersultat
delapremirecorrespondlaracinerecherche.
Variables i,x,a,cpt en Numrique
Dbut
x1
39
cpt5
Tant Que (x*x)<a Faire
xx+1
Fin Tant Que
Si (x*x) !=a Alors
xx-1
Pour i de 1 cpt Faire
x0.5*(x+a/x)
Fin Pour
FinSi
Ecrire "La racine de ",a," est ",x
Fin
Vous allez tre tonn de la pertinence et de la prcision des rsultats. Ainsi en seulement trois ou quatre
itrations,laprcisionestsuffisantepourlaplupartdesapplications.Malheureusement,vousleverrezdanslasuite
de louvrage, cest beaucoup de travail pour pas grand chose : les langages sont fournis avec des instructions
particulires permettant deffectuer ces calculs, dautant plus que les fameux FPU (coprocesseurs arithmtiques)
disposentduneinstructionendurrienquepourcela(FSQRTparexemplesurunvieuxMotorolaMC68881).
Enattendant,voicilatranscriptiondececalculavancenPHP:
<html>
- 4 - ENI Editions - All rigths reserved
<head><meta/>
<title>racine</title>
</head>
<body>
<?php
$x=1;
$a=31;
$cpt=5;
while($x*$x<$a) {
$x++;
}
if($x*$x!=$a) {
$x--;
for($i=1;$i<=$cpt;$i++) {
$x=0.5*($x+($a/$x));
}
}
echo "$x<br />";
echo pow($x,2)."<br />";
?>
</body>
</html>
d.CalculdunombrePI
Sachant maintenant laide des boucles peu prs tout faire, notamment calculer une racine carre, il serait
intressantdetrouveruneapplicationencoreplusprcise.EtpourquoipastenterdapprocherlavaleurdePI?Il
existeplusieursmoyensdapprochercettevaleur.PIestlacirconfrenceduncercledontlediamtreest1.Sans
vousexposericilesdtailsdelamthode,sachezqueLeonhardEuler,grandsavantduXVIII
me
sicle,arsoluun
problmeconnudelonguedate:ladterminationdelasommedesinversesdescarrsdentier.Laformuleestla
suivante:

Remarquezlaprsenceduneitrationsurlespuissancesdechaquednominateur(diviseur).Voiciuneapplication
delaboucle"Pour".Demme,remarquezquePIestlevaucarr.Ilfaudradoncquevouseffectuiezuneracine
carrelafinpourobtenirlebonrsultat.Donc:
G Effectuerndivisionssuccessivesde1/n.
G Multipliercersultatpar6.
G ExtrairelaracinecarredecersultatpourobtenirPI.
Variables i,x,a,cpt en Numrique
Dbut
cpt100000
a2
Pour i de 2 cpt Faire
aa+1/(i*i)
Fin Pour
aa*6
x1
Tant Que (x*x)<a Faire
xx+1
Fin Tant Que
Si (x*x) !=a Alors
xx-1
cpt10
Pour i de 1 cpt Faire
x0.5*(x+a/x)
Fin Pour
FinSi
Ecrire "La valeur de PI est ",x
Fin
- 5 - ENI Editions - All rigths reserved
Question:Combienfautilditrationspourobtenirseptchiffrescorrectsaprslavirgule?VoicileprogrammePHP
correspondant,quidevraitvousfournirunepetiteidedursultat:
<html>
<head><meta/>
<title>PI</title>
</head>
<body>
<?php
$cpt=100000000;
$a=1;
for($i=2;$i<=$cpt;$i++) {
$a=$a+1/($i*$i);
}
$a=$a*6;
$x=1;
$cpt=10;
while($x*$x<$a) {
x++;
}
if($x*$x!=$a) {
$x--;
for($i=1;$i<=$cpt;$i++) {
$x=0.5*($x+($a/$x));
}
}
echo $x;
?>
</body>
</html>
- 6 - ENI Editions - All rigths reserved
RpterJusqu
1.Diffrencesfondamentales
Malgrlabondancedexemplesvusjusquprsent,lastructureitrative"TantQue"nestpaslaseule.Mmesilest
possible 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:
G Quoiquilarrive,ilyauratoujoursaumoinsunpassagedanslaboucle:leblocdinstructionsseraexcutau
moinsunefois,
G Lexpressionboolennefinaleestinverse.Un"tantquea!=1"devientun"jusqua=1".
Le"jusqu"secomprendcomme"jusqucequelaconditionsoitvrifie".Pourfaireuneboucleinfinie,ilfautdonc
faire:
Rpter
Bloc dinstructions
Jusqu FAUX
Pourreprendrelalgorithmedesaisiedurelevdenotesquiavaitposquelquesproblmes,celuicidevientunpeu
plussimple:
PROGRAMME REPETE
VAR
Note:entier
Dbut
Rpter
Ecrire "Saisissez une note"
Lire note
Si note<-1 OU note>20 Alors
Rpter
Ecrire "Erreur (0->20, -1 sortie) :"
Lire note
Jusqu note>=-1 ET note <=20
FinSI
Si note!=-1 Alors
...
FinSI
Jusqu note=-1
Fin
Le langage PHP propose une structure "rpter Tant Que". Il suffit donc uniquement dinverser la condition de
sortiedu"jusqu".
do {
/* bloc dinstructions */
}while(condition) ;
LeprogrammePHPavecquelquesfacilitspourraittre :
<?php

do{
echo "Note (<-1:sortie) ?";
$note=fgets(STDIN);
if($note>20) {
- 1 - ENI Editions - All rigths reserved
echo "Erreur : nouvelle saisie...";
continue;
}
if($note>-1) echo $note;
}while($note>-1);
?>
Notezbienattentivementlaconditiondesortiecentrale:lanotedoittresuprieureougale1ETinfrieureou
gale20poursortirdelasaisie.Avecle"Tantque",labouclecontinuaittantquelanotetaitinfrieure1OU
suprieure20.Unenuance,maisdetaille.
Cesnuancessontlunedesraisonsquifontquedestudiantsetdesprogrammeurs,pourtantparfoischevronns,
syperdent.Cestaussilunedesraisonsquifaitquelaboucle"Rpterjusqu"nestpasprsentedanscertains
langages comme le C ou Java. En Java ou en PHP cependant, vous trouvez une boucle quivalente au "Rpter
Tant Que", le "do while", qui reprend le fait dune itration obligatoire, mais avec les mmes expressions
boolennesquele"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 resultat
Fin
b.Lestroisboucles
Lencore,mmeprogrammemaisstylediffrent.Notezqueicilescompteurspartentde0afindtreincrments
endbutdeboucle,danslebutderendrelaconditiondesortiepluslisible(gale10).
Variables a,b,c,nb1,nb2 en Numrique
Dbut
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=10
Fin
EnPHP:
<html>
<head><meta/>
- 2 - ENI Editions - All rigths reserved
<title>Trois boucles 2</title>
</head>
<body>
<?php
$x=1;
do {
$y=1;
do {
$z=1;
do {
$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 <br />";
}
$z++;
}while($z<=10);
$y++;
}while($y<=10);
$x++;
}while($x<=10);
?>
</body>
</html>
- 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(uneou
plusieurs conditions, ou une seule variable). Si lexpression retourne VRAI, alors le programme excute les
instructions suivantes jusqu ce quil arrive au "FinTantQue". Arriv ici, il remonte au "Tant Que" et value de
nouveaulexpressionboolenne,sicestVRAIalorsilexcutedenouveaulesinstructionsetainsidesuite,tantque
lexpressionretourneVRAI.Silexpressiondevientfausse,alorsleprogrammesautelinstructionsituejusteaprs
le"FinTantQue".Voiciunsimpleexemplequicomptede110:
PROGRAMME TQUE1
VAR
Cpt:entier
DEBUT
Cpt1
Tant que Cpt<=10 Faire
Afficher Cpt
CptCpt+1
FinTantQue
FIN
EnPHP,laboucle"TantQue"estreprsentepar"while()",aveclexpressionboolenneentreparenthses.
while(booleen) {
/* bloc dinstructions */
}
Siuneseuleinstructionestprsenteauseindelaboucle,lesaccoladessontinutiles.
while(boolen) instruction ;
VoicilecodePHPcorrespondantlalgorithmeTQUE1:
<html>
<head><meta/>
<title>tque1</title>
</head>
<body>
<?php

$cpt=1;
while($cpt<=10) {
echo "$cpt<br />";
$cpt++;
}
?>
</body>
</html>
2.Bouclesinfinieset"break"
Faitestoujoursbienattentioncequevotreboucledisposeduneconditiondesortie.Eneffetriennevousempche
defairedesbouclesinfinies.Danslecasdunestructureitrative"TantQue",ilsuffitquelaconditionsoittoujours
VRAIE,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, lexpression boolenne est toujours vraie donc le programme ne sort jamais de la boucle. La
plupart des langages (C, C++, Java, PHP, etc) proposent des instructions spciales qui permettent de sortir dune
boucle 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 des
premires choses que vous devez apprendre en algorithmique avec les boucles cest que sans vouloir paratre
excessif,lutilisationdebreaketdelinstructioncontinueesttrsdconseille:denombreuxprogrammeursetpas
forcmentenherbe,parsmentlintrieurdeleursbouclesdeconditionsdesortiessupplmentaires,quilsnomment
souvent des "cas spciaux" : "je nai pas prvu de grer cela dans un cas gnral, alors je place une srie
dexceptions". Or lobjectif nest pas de multiplier ces conditions, mais de toutes les runir au sein de lunique
expressionboolenneduTantQue.Ilfautdoncrunirtouteslesconditionsdarrtdelaboucleenunseulpoint.
Le"break"existetelquelenPHP.Voicidoncunexempledeceque,thoriquement,ilnefautpasfaire :
<html>
<head><meta/>
<title>Break</title>
</head>
<body>
<?php

$cpt=1;
while(true) {
echo "$cpt <br />";
if($cpt==10) break;
$cpt++;
}
?>
</body>
</html>
Enalgorithmique,ilesttoujourspossibledetrouveruneexpressionboolenne,mmesielleestlongueet
complexe, permettant dviter lutilisation de "break" et de "continue". Si vous ntes pas daccord, votre
professeurrisquedevousmettreaudfidetrouverunexemplecontradictoire.Peineperdue.
Ilfautcependantmodrercespropos.Linterruptionduneboucleaumilieudecelleciestdconseille,certes.Mais
commepourtout,ilfautsemfierdesgnralisations.Ilyavidemmentdescasoildevientbientropcompliqude
crer des boucles uniquement pour respecter ce principe. Sil faut crer une expression boolenne rallonge et
bidouiller(cestlemot,parfois)sonblocdinstructionsavecdesmthodestarabiscotes(desdrapeauxtoutvapar
exemple), dautant plus que celuici prend dj un grand nombre de lignes, autant utiliser un break. Au contraire,
utiliserlesbreakstortettraversnestpasrecommandable.
Letoutestdetrouverunquilibreentrelaconditiondesortieetlalisibilitdelalgorithme.
Enfin,lebutnestpasdecrerdesbouclesdontleblocdinstructionsfaitdixpages(cestunefaondeparler).Dans
ce cas, il est certes intelligent de runir toutes les conditions de sortie en un point : cela amliore la lisibilit.
Cependant,vousrisquezdevousperdredansvotrepropreprogramme(dolesindentations).Vousapprendrezplus
loin dans ce livre la notion de fonctions et de procdures qui permettront un dcoupage fin de vos blocs
dinstructions.
3.Desexemples
- 2 - ENI Editions - All rigths reserved
a.Unetabledemultiplication
Pourquoinepassattaquer aux exemples cits cidessusetmmeplus,pourvousentraner?Commencezparla
tabledemultiplication.Aprsavoirsaisilenumrodelatabledemande,uncompteurestinitialis1.Tantquece
compteurestinfrieurougal10,onlemultiplieparlenumrodetable,puisaprsavoiraffichlersultat,on
lincrmente.Dansladernireboucle,lecompteurpassede1011.UnefoisremontauTantQue,lexpression
devientfausse:laboucleesttermineetleprogrammesetermine.
PROGRAMME MUTLI1
VAR
table,cpt,resultat:entiers
DEBUT
Afficher "Quelle table de multiplication ?"
Saisir table
cpt1
Tant que cpt<=10 Faire
resultatcpt*table
Afficher table,"x",cpt,"=",resultat
cptcpt+1
FinTantQue
FIN
CequidonneenPHP:
<html>
<head><meta/>
<title>Table de multiplication</title>
</head>
<body>
<?php
if(!isset($_GET[table])) {
?>
<form method="GET">
Table de multiplication : <input type="text"
size="4" name="table" />
input type="submit" name="OK" />
</form>
<?php
} else {
$table=$_GET[table];

$cpt=1;
while($cpt<=10) {
$resultat=$table*$cpt;
echo "${table}x${cpt}=$resultat <br />";
$cpt++;
}
}
?>
</body>
</html>
b.Unefactorielle
Danslemmeordredide,voiciunpetitalgorithmequicalculeunefactorielle.Pourrappel,lafactorielledenscrit
n!etsecalculeenmultiplianttouteslesvaleursde1n.Ainsi10!=10*9*8*7*6*5*4*3*2*1,soit3628800.Dans
chaque passage dans la boucle, il sagit de multiplier le compteur par le rsultat de la multiplication prcdente.
Notezquilestinutiledemultiplierparun:celanechangepaslersultatetleprogrammeeffectueunebouclede
trop.Demme,cettefoislalgorithmecompteralenvers:ilpartiradenpourdescendrejusqudeux.
PROGRAMME FACT
VAR
cpt,resultat:entiers
DEBUT
Afficher "Quelle factorielle ?"
Saisir cpt
- 3 - ENI Editions - All rigths reserved
resultatcpt
Tant que cpt>2 Faire
cptcpt-1
resultatcpt*resultat
FinTantQue
Afficher resultat
FIN
CequidonneenPHP:
<html>
<head><meta/>
<title>Factorielle</title>
</head>
<body>
<?php
if(!isset($_GET[cpt])) {
?>
<form method="GET">
Factorielle de : <input type="text" size="4" name="cpt" />
<input type="submit" name="OK" />
</form>
<?php
} else {
$cpt=$_GET[cpt];
$resultat=$cpt;

while($cpt>2) {
$cpt--;
$resultat=$resultat*$cpt;
}
echo $resultat;
}
?>
</body>
</html>
c.xlapuissancey
Ilsagitcettefoisdleverunevaleurunepuissancequelconque.Pourrappel,x
n
estgalx*x*x*xnfois.Cest
donc trs simple : une boucle Tant Que qui va compter de 1 n, dans laquelle le rsultat de la multiplication
prcdentevatremultipliparx.
PROGRAMME puissance
VAR
x,n,cpt,resultat:entiers
DEBUT
Afficher "x,n ?"
Saisir x,n
cpt1
resultat1
Tant que cpt<=n Faire
resultatresultat*x
cptcpt+1
FinTantQue
Afficher resultat
FIN
Cetalgorithmefonctionnebien,maisnegrepastouslescas.Enfait,ilfonctionneuniquementsilapuissanceest
suprieureougalezro.Sinvautzro,leprogrammenerentremmepasdanslaboucleetlersultatvaut1.
Sinvaut1,resultatvautx.Etpourlespuissancesngatives?x
n
estgal1/x
n
.

Ilsagitdoncdedterminerlesignedelapuissanceetdefaireunedivision.Ilfautaussircuprerlavaleurabsolue
delapuissance,cequevoussavezdjfaire.Danslalgorithmesuivant,undrapeau"signe"estutilispoursavoir
sinestngatifounon,afindeffectuerunedivisionlafin.
Variables x,n,signe,cpt,resultat en Numrique
Dbut
- 4 - ENI Editions - All rigths reserved
Signe0
Ecrire "x,n ?"
Lire x,n
Si n<0 Alors
Signe1
n-n
FinSI
cpt1
resultat1
Tant que cpt<=n Faire
resultatresultat*x
cptcpt+1
FinTantQue
Si signe=1 Alors
Resultat1/resultat
FinSi
Ecrire resultat
Fin
CequidonneenPHP:
<html>
<head><meta/>
<title>Factorielle</title>
</head>
<body>
<?php
if(!isset($_GET[x])) {
?>
<form method="GET">
x,y ? <input type="text" size="4" name="x"
/>&nbsp;<input type="text" size="4" name="y" />
<input type="submit" name="OK" />
</form>
<?php
} else {
$x=$_GET[x];
$n=$_GET[y];
if($n<0) {

$n=-$n;
$signe=true;
}
$cpt=1;
$resultat=1;

while($cpt<=$n) {
$resultat=$resultat*$x;
$cpt++;
}
if($signe) $resultat=1/$resultat;
echo $resultat;

}
?>
</body>
</html>
d.Touteslestablesdemultiplication
Toutcommelestests,ilesttoutfaitpossibledimbriquerlesboucles,cestdiredemettreuneboucledansune
autre boucle, sur autant de niveaux que vous le souhaitez. Vous pouvez envisager 1, 2, 3, n niveaux, mais cela
risque de devenir difficilement lisible. Voici un exemple deux niveaux. Il sagit tout simplement de calculer et
daffichertouteslestablesdemultiplicationde110.Pourcela,deuxbouclesdoiventtreutilises.Lapremireva
reprsenterlatablecalculer,de110.Lasecondelintrieurdelapremirevamultiplierlatabledonnede1
10.Vousavezdoncdeuxbouclesde110.Simulezcequilsepasse:
G Premireboucle,tabledes1.Secondeboucle:excutionde1*1,1*2,1*31*10
- 5 - ENI Editions - All rigths reserved
G Premireboucle,tabledes2.Secondeboucle:excutionde2*1,2*2,2*32*10
G Premireboucle,tabledes3.Secondeboucle:excutionde3*1,3*2,3*33*10
G
G Premireboucle,tabledes10.Secondeboucle:excutionde10*1,10*2,10*3
Voici lalgorithme correspondant. chaque passage dans la premire boucle, le compteur de la seconde boucle
repasseun.Cestdanslasecondebouclequalieulecalculetlaffichagedelatabledemultiplication.
PROGRAMME MULTI2
VAR
table,cpt,resultat :entiers
DEBUT
table1
Tant Que table<=10 Faire
Afficher "Table des ",table
cpt1
Tant que cpt<=10 Faire
resultatcpt*table
Afficher table,"x",cpt,"=",resultat
cptcpt+1
FinTantQue
Tabletable+1
FinTantQue
Fin
LammechoseenPHP:
<html>
<head><meta/>
<title>Factorielle</title>
</head>
<body>
<?php
$table=1;
while($table<=10) {
echo "table des $table <br />";
$cpt=1;
while($cpt<=10) {
$resultat=$table*$cpt;
echo "${table}x${cpt}=$resultat<br />";
$cpt++;
}
$table++;
}
?>
</body>
</html>
e.Saisiedenotesetcalculdemoyennes
Lebutdelalgorithmesuivantestdinviterlutilisateursaisirdesnotesdtudiantsentre0et20,dedterminerla
note la plus basse, la note la plus haute et de calculer une moyenne. Tant que lutilisateurna pas saisi la note
ngative 1, la saisie ne sarrte pas. Les rsultats sont ensuite affichs. Cet algorithme prsente un intrt
certain : il faut contrler la saisie des notes si lutilisateur saisit autre chose quune note allant de 1 20, la
questionluiestrepose,sachantque1correspondunefindesaisie.Procdezpartapes.
Commenceztoutdabordparcettepartiedelalgorithme:lasaisiedesnotes.Ilfautpourcelautiliseruneboucle
dontluniqueconditiondesortieestunenotede1.
PROGRAMME NOTE
VAR
- 6 - ENI Editions - All rigths reserved
note:entier
Dbut
Afficher "Entrez une note"
Saisir note
Tant que note>-1 Faire
Si note >20 Alors
Tant que note<-1 ou note>20 Faire
Afficher "Erreur (0->20, -1 sortie) :"
Saisir note
FinTantQue
FinSi
Si note<>-1 Alors
Afficher "Entrez une note"
Saisir note
FinSi
FinTantQue
Fin
CequidonneenPHP,depuisuneconsole:
<?php

echo "Note (-1:sortie) ?";

$note=fgets(STDIN);
while($note>-1) {
if($note>20) {
while($note <=-1 || $note>20) {
echo "Erreur ! Note (-1:sortie) ?";
$note=fgets(STDIN);
}
}
if($note>-1) {
echo "Note actuelle :$note";
echo "Note (-1:sortie) ?";
$note=fgets(STDIN);
}
}

?>
Cet algorithme montre quune simple rptition de saisie est plus complexe quil ny parat. Au tout dbut,
lutilisateursevoitposerunepremirefoislaquestion,sil rpond "1"toutdesuite,ilnentremmepasdansla
boucle.Danslapremireboucle,unevrificationesteffectuesurlavaliditdelanotesaisie:estellesuprieure
20 ? Si oui, alors il faut de nouveau effectuer une saisie et reposer en boucle la question autant de fois que
ncessaire,cestdiretantquelanotesaisienestpascompriseentre1et20.Sachantque1estunecondition
desortie,aucuntraitement,ycomprislasaisiedunenouvellenote,nedoittreeffectudanscecas.Vousavezici
unetrsbelleapplicationduncasoun"break"auraitpueffectivementtreutilis.Voiciunexemple(incomplet)
quiremplaceledernier"Si"delalgorithmeprcdent:
...
Tant que note>-1 Faire
...
Si note=-1 Alors
break
FinSi
Ecrire "Entrez une note"
Lire note
FinTantQue
Laboucleprincipalepeuteneffettredirectementinterrompuedsquunenotede1estrencontre.Danscecas,
il serait mme possible daller plus loin en considrant la premire boucle comme infinie et en effectuant dedans
touteslessaisiesetlaconditiondesortie:
Variable note en Numrique
Dbut
Tant que VRAI Faire
Ecrire "Entrez une note"
Lire note
- 7 - ENI Editions - All rigths reserved
Si note<-1 ou note>20 Alors
Tant que note<-1 ou note>20 Faire
Ecrire "Erreur (0->20, -1 sortie) :"
Lire note
FinTantQue
FinSi
Si note=-1 Alors
break
FinSi
FinTantQue
Fin
CequidonneenPHP,viauneconsole:
<?php
while(true) {
echo "Note (<-1:sortie) ?";
$note=fgets(STDIN);
if($note>20) {
while($note<-1 || $note>20) {
echo "Erreur ! Note (-1:sortie) ?";
$note=fgets(STDIN);
}
}
if($note==-1) break;
echo "$note";
}
?>
IlestencorepossibledallerplusloinenPHPaveclinstruction"continue".Eneffetpluttquedecrerunenouvelle
boucleencasderreurdesaisie,pourquoinepasrelancercelleciaudbut?
Leprogrammedevientdonc:
<?php
while(true) {
echo "Note (<-1:sortie) ?";
$note=fgets(STDIN);
if($note>20) {
echo "Erreur : nouvelle saisie...\n";
continue;
}
if($note==-1) break;
echo $note;
}
?>
Commevouspouvezleconstater,cetalgorithmeestunpeupluscourtqueloriginal,avecnotammentunesaisieen
moins, une expression boolenne en moins (dans la condition de la premire boucle), un "sinon" en moins.
Cependant fondamentalement cet algorithme est moins propre. Comme indiqu prcdemment, le break est en
principedconseilletilvautmieuxquelaboucleellemmeaituneconditiondesortieafindviterunecatastrophe
encasdemodificationdublocdinstructionsquellecontient.Ilfautmaintenantcomplterlalgorithmedoriginepour
yajouternosvariables:
G Uncompteurdunombredenotes.
G Lanoteminimale.
G Lanotemaximale.
G Lasommedetouteslesnotes.
G Lamoyenne.
Lamoyenneseffectueensortiedelaboucleprincipale,unefoislensembledesnotessaisi.Ilfautveillercequau
moins une note ait t saisie, sinon lalgorithme effectuerait une division par zro, ce qui est videmment
impossible. Au sein de la boucle, et seulement si la note saisie est diffrente de1, lalgorithme compare la plus
- 8 - ENI Editions - All rigths reserved
bassenoteaveclanoteactuelle,quidevientlaplusbasselecaschant,lammechoseestfaitepourlanotela
plushaute(vousprendrezsoindinitialisercorrectementcesvaleursdsledbut)etletotaldesnotesestcalcul.
Ensortiedeboucle,ilneresteplusqufaireunedivision.
Variables note,cpt,min,max,sum,moy en Numrique
Dbut
min20
max0
cpt0
sum0
Ecrire "Entrez une note"
Lire note
Tant que note>-1 Faire
Si note >20 Alors
Tant que note<-1 ou note>20 Faire
Ecrire "Erreur (0->20, -1 sortie) :"
Lire note
FinTantQue
FinSi
Si note<>-1 Alors
cptcpt+1
sumsum+note
Si note<min Alors
minnote
FinSI
Si note>max Alors
maxnote
FinSI
Ecrire "Entrez une note"
Lire note
FinSi
FinTantQue
Si cpt>0 Alors
moysum/cpt
Ecrire "Nombre de notes : ",cpt
Ecrire "Note la plus basse : ",min
Ecrire "Note la plus haute : ",max
Ecrire "Moyenne : ",moy
Sinon
Ecrire "Aucune note na t saisie."
FinSI
Fin
Le programme suivant, en PHP, est une adaptation du programme prcdent. Vous ny voyez pas de boucle, ou
pluttellenestpasexplicite :vousbouclezenvalidantlasaisiedunenoteparleboutonOK.Ladifficult,enPHP
etHTML,estdeconserverlesvaleursdunepagelautre.Ilexistediversesmthodes.Celleprsentedanscet
exempleconsisteconserverlesvaleursdansdeschampscachsduformulaire.
<html>
<head><meta/>
<title>moyenne max 3</title>
</head>
<body>
<?php
$min=20;
$max=0;
$cpt=0;
$sum=0;
$note=0;
if(isset($_GET[note])) {
$note=$_GET[note];
$cpt=$_GET[cpt];
$min=$_GET[min];
$max=$_GET[max];
$sum=$_GET[sum];
$cpt++;
}

if($note>20) {
- 9 - ENI Editions - All rigths reserved
echo "Erreur : nouvelle saisie...";
$cpt--;
}
else if($note!=-1) {
$sum=$sum+$note;
if($note<$min) $min=$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";
}
}
?>
<form method="GET">
note (-1 = sortie) ? : <input type="text" size="4" name="note" />
<input type="hidden" name="cpt" value="<?=$cpt ?>" />
<input type="hidden" name="sum" value="<?=$sum ?>" />
<input type="hidden" name="min" value="<?=$min ?>" />
<input type="hidden" name="max" value="<?=$max ?>" />

<input type="submit" name="OK" />


</form>

</body>
</html>
f.Rendezlamonnaie
Lebutdecetalgorithmeestdecalculerunrendudemonnaieenfonctiondelavaleurdespicesetdesbillets,en
dterminant combien de billets de telle valeur ou de pices de telle valeur il faut rendre. Il sagit donc de
transformerunesommeencoupurescorrespondantes.Parexemple1898,67eurospeuventsedcomposeren:
G 3billetsde500euros
G 1billetde200euros
G 1billetde100euros
G 1billetde50euros
G 2billetsde20euros
G 1billetde5euros
G 1picede2euros
G 1picede1euro
G 1picede50centimes
G 1picede10centimes
G 1picede5centimes
G 1picede2centimes
- 10 - ENI Editions - All rigths reserved
Autantlediretoutdesuite,cetalgorithmeestleparadisdesboucles.Ilenfaudrauneparvaleurfacialedebilletou
depice.Leprincipeesteneffettrssimple.Ilsagitdesoustraireauseindunebouclelavaleurfacialedubillet,
parexemple500euros,aumontanttotal,tantquecemontantestsuprieurougallavaleurdubillet.chaque
passagedanslaboucle,oncompteunbillet.Puisonpasseaubilletsuivantetainsidesuite.Voiciunexemplepour
1700eurosavecuniquementdesbilletsde500euros.
Variables montant, nb500 en Numrique
Dbut
montant1700
nb5000
Tant Que montant>=500 Faire
nb500nb500+1
montantmontant-500
FinTantQue
Ecrire nb500, montant
Fin
CequidonneenPHP:
<html>
<head><meta/>
<title>Factorielle 3</title>
</head>
<body>
<?php

$montant=1700;
$nb500=0;

while($montant>=500) {
$nb500++;
$montant=$montant-500;
}
echo "Nombre de billets de 500: $nb500 <br />";
echo "Reste : $montant";
?>
</body>
</html>
Que se passetil la sortie de la boucle ? nb500 vaut 3 et montant vaut 200 : cest le reste. Aussi, il faut
gnraliserlalgorithmepourtouteslesvaleurs.
Variables montant,nb500,nb200,nb100,nb50,nb20,nb10,nb5 en Numrique
Variables nb2,nb1,nb05,nb02,nb01,nb005,nb002,nb001 en Numrique
Dbut
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"
FinSI
Fin
Cet algorithme est dsesprant. Il est parfait en terme de fonctionnement et de logique, mais il est
pouvantablement long, proportionnel au nombre de coupures disponibles dans chaque pays. Tellement long
dailleursquecertainespartiestotalementvidentesonttremplacespardes"".Estilpossibledefaireplus
court ? Il est videmment possible de faire plus court. Vous verrez comment faire au prochain chapitre avec les
tableaux,puisdanslesuivantencoreaveclesfonctions.
g.Troisboucles
Undernierexempledeboucle"TantQue"vavousmontreruneintgrationavectroisboucles.Lebutdecetanodin
algorithme est de trouver pour quelles valeurs de A, B et C, ABC=A
3
+B
3
+C
3
, A reprsentant les centaines, B les
dizainesetClesunits.Larechercheseralimitepourchaquevaleurentirecompriseentre1et10(bienentendu,
vouspouvezaugmenterlintervallemaisceluicinapastchoisiauhasard).Lalgorithmencessitetroisboucles
pour chacune des valeurs. Cestbienentenduauseindeladernirebouclequelesvaleurssontcalculesetles
rsultatsaffichsencasdgalit.
Variables a,b,c,nb1,nb2 en Numrique
Dbut
a1
b1
c1
Tant que a<=10 Faire
Tant que b<=10 Faire
Tant que c<=10 Faire
nb1a*100+b*10+c
nb2a+b+c
Si nb1=nb2 Alors
Ecrire nb1,a,b,c
FinSI
cc+1
FinTantQue
bb+1
FinTantQue
aa+1
FinTantQue
Fin
SivousconvertissezceprogrammeenPHP,vousdevriezobtenirseulementdeuxpossibilits:153et371.Eneffet
3+7+1=27+343+1=371
- 12 - ENI Editions - All rigths reserved
VoicileprogrammequivalentenPHP:
<html>
<head><meta/>
<title>Trois boucles</title>
</head>
<body>
<?php
$x=1;
$y=1;
$z=1;
while($x<=10) {
while($y<=10) {
while($z<=10) {
$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 <br />";
}
$z++;
}
$y++;
}
$x++;
}
?>
</body>
</html>
- 13 - ENI Editions - All rigths reserved
Fichiertextesquentiel
1.Ouvriretfermerunfichier
Vousdeveztoutdaborddclarerlenomlogiquedufichier,lavariablequipermettra,associeaufichier,detravailler
avec.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 linstruction Fermer
suiviedunomlogiquedufichier.
Fermer fic
Il existe aussi une syntaxe fonctionnelle, mais les mmes remarques sappliquent : utilisez la premire en cas de
doute.
Fermer(fic)
Neplacezpaslenomdufichierdanslesinstructionsdelecture,critureetdefermeture.Leprogrammene
connatpaslenomdufichier,maisseulementsonnomlogique.
Aussiledbutdunventuelprogrammeressembleraitceci:
Programme OUVRE
Var
fic :fichier squentiel
nom :chane
Dbut
nom"toto.txt"
Ouvrir nom dans fic en lecture
/* traitements */
Fermer fic
Fin
2.Lireetcriredesenregistrements
a.Lecture
Poursimplerappel,lesenregistrementssonticileslignesdunfichiertexte,unenregistrementtantquivalent
uneligne.LalecturedunelignesefaitvialinstructionLire.Lirelitlenregistrementprsentlapositionactuelledu
fichier,puisseplacesurlenregistrementsuivant.louverturedufichier,Lirelitlapremireligne.UnnouveauLire
liraladeuximeetainsidesuitejusqulafin.Cestpourcelaquelalectureestditesquentielle.Voustrouverez
aussilammeinstructionsouslenomLireFichier,cestlammechose.
Lasyntaxeestlasuivante :
Lire(nom_logique,variable)
- 1 - ENI Editions - All rigths reserved
Lavariableensecondparamtrereoitlenregistrement,lalignelue.Danslexemplesuivant,unenregistrementdu
fichier des mots de passe de lexemple cidessus est lu, partant du principe que la largeur est fixe, puis
lenregistrementestdcouppourrcuprerleloginetluid,convertienentier.
Programme OUVRE
Var
fic :fichier squentiel
nom :chane
ligne,login :chane
uid :entier
Dbut
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 fic
Fin
Quefairecependantquandonneconnatpaslavancelenombredelignesdufichier ?Commentsavoirsilafindu
fichieratatteinte ?
Vousavezdeuxpossibilits :
G Seloncertainsformalismesalgorithmiques,Lireestunefonctionquiretourneunboolen,doncvraioufaux.
Sivoustentezdelireunenregistrementetquilnyenaplus,LireretourneFAUX.Autrementdit,tantque
LireestVRAI,onpeutcontinuerlireleslignessuivantes.
G LafonctionEOF()parfoisappeleaussiFinFichier()retourneunboolenquiindiquesilafindufichiera
tatteinteounon.Cettefonctionprendenparamtrelenomlogiquedufichier.ElleretourneVRAIsilafin
dufichieratatteinte,doncsilneresteplusdenregistrementslire.
La fonction algorithmique EOF() va retourner VRAI si le fichier que vous ouvrez ne contient pas
denregistrements, 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 type
retourneraitFAUXtantquaucunelecturenauraiteulieu.Prudence
LeprogrammesuivantvaliretoutlefichierdesmotsdepasseetplacerlesloginsetUIDdansdestableaux.Comme
onneconnatpaslavancelenombredlments,onselimiteraarbitrairement100lignes.
Programme LIREFIC
Var
fic :fichier squentiel
nom :chane
ligne:chane
i:entier
login :tableau[1..100] de chanes
uid :tableau[1..100] dentiers
Dbut
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 fic
Fin
b.criture
- 2 - ENI Editions - All rigths reserved
Lire est une chose, crire dans un fichier en est une autre. Lcriture utilise linstruction Ecrire, une fonction qui
prendcommeparamtrelenomlogiquedufichieretlenregistrement(laligne)crire.Voustrouvereztoutcomme
linstructiondelecture,uneinstructionEcrireFichierstrictementidentique :
Ecrire(nom_logique,enregistrement)
Commevousdevezcriredesenregistrementslargeurfixe,cestvousdevrifierquelesenregistrementssont
la bonne longueur. Sils sont trop longs, vous avez mal dimensionn vos enregistrements lorigine (un cas
rgulierestuneadresserallongeouunnomdevillecompos).Silssonttropcourts,vousdevrezleurajouterdes
espacesenfindechane.
Parexemple,toujoursdanslexempledeslogins,quefairesiceluiciesttropcourt,parexemple"toto",doncquatre
caractres,alorsquildevraitenfairehuit ?Lastuceconsisterallongerleloginavecdesespaces.Cenestpasun
problmepourlerelire,puisquelafonctiontrim()restaurerasontatdorigine.Ilestprobablequevotrelangagede
programmation propose une fonction qui remplit toute seule les morceaux manquants, des fois il sagit mme de
linstructiondcriture(lefprintfduClefaittrsbien).
En attendant, vous pouvez programmer vousmme cette fonction algorithmique. Elle ressemble fortement la
procdure RepeteCar(). Appelezla Formate(). Elle prendra comme paramtre le champ de lenregistrement et la
longueurattendue.Elleretourneracemmechampmaisreformat :soitcouplabonnelongueur,soitavecdes
espacesajoutslafin.
Fonction Formate(champ :chane, longueur :entier) :entier
Var
nbspaces,len :entiers
Dbut
len=longueur(champ)
Si len>longueur Alors
champ=gauche(chane,longueur)
Sinon
nbspaces=longueur-len
Tant que nbspaces<>0 Faire
champ=champ&" "
nbspaces=nbspaces-1
FinTantQue
FinSi
Retourne champ
FinFonct
Quelques formalismes algorithmiques autorisent parfois de prciser lavance une longueur de chane la
dclarationdelavariable.
Var
login :chane de 8 caractres
Celalaisseentendrequevousnavezplusvoussoucierquelachanesoittropcourteoutroplongue.Cestvrai
dans lalgorithme, mais attention dans un vrai langage ! Le langage COBOL anciennement au programme du BTS
taitunrgalceniveaumaisenCouenJava,lataillenestpasprcise.
LafonctionFormate()faitbienvotreaffaire.Vouspouvezreconstruirevotreenregistrement,puislcrire.
Programme ECRIT
Var
fic :fichier squentiel
nom,ligne:chanes
tlogin,tuid,tpwd,tgid,tcmt,thome,tshell:chanes
uid,gid:entiers
Dbut
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 fic
Fin
LinstructionEcrireajoutelenregistrementdanslefichier,puisseplacelasuitedelenregistrementcr.Aussisi
vous excutez une nouvelle instruction Ecrire, le nouvel enregistrement se placera la suite du prcdent.
Attentioncependantaumodedouverturedufichier !Enmodelecture/criture,lenregistrementneserapasajout
la fin du fichier (contrairement au mode ajout) mais la position courante : vous crasez les enregistrements
existants,lesunsaprslesautres.
Unprogrammeassezsimpleconsisterecopierlesenregistrementsdunfichierdansunautre.Pourajouteruntout
petitpeudepiment,pourquoinepasdirequesilechampmotdepassecontientun"d",lenregistrementdoittre
dtruit ?Ilsuffitdenepaslerecopierdanslenouveaufichier.
Programme COPIE
Var
fic,fic2 :fichiers squentiels
nom,nom2 :chanes
ligne,pwd:chanes
Dbut
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 fic2
Fin
Cette stratgie de recopie a un avantage : elle nutilise que trs peu de mmoire. Elle a cependant un trs gros
inconvnient,ellencessitelaprsenceunmomentdonndedeuxfichierssurledisquedur.Dansletraitement
prcdent,lebuttaitdesupprimerleslignesinutilesdupremierfichier.Aufinalcegenredetraitementestentrois
tapes :
G Recopiedesenregistrementsdepasswdversbackup.
G Suppressiondufichierpasswd.
G Renommagedebackupenpasswd.
Cette mthode sera privilgier sur des fichiers trs imposants, plusieurs milliers (ou millions) de lignes, si la
mmoirenedoitpastretropcharge.
Uneautremthodeconsistetouttraiterenmmoire.Ellesefaitendeuxtapes :
G Lectureintgraledufichierpasswdetstockagedeslignesdansuntableau.
G Rcrituredufichierpasswdaveclesbonslmentsdutableau.
Certains langages font une distinction entre le mode dcriture, gnralement destructeur (le fichier est
purg vid avant lajout de donnes) et un mode dajout tendu, o le fichier peut aussi tre lu
Prudence.
Traitersurdisqueouenmmoire ?
- 4 - ENI Editions - All rigths reserved
Cettemthodeestplusrapideetplussimple.Laccsetletraitementdesenregistrementsenmmoiresontplus
rapides que laccs un fichier du disque. Une fois en mmoire les donnes peuvent tre manipules volont,
sansavoirrelirelesenregistrements.Elleestprfrablesilacapacitmmoiredevotreordinateurlepermet.Les
groslogicielscommelesgestionnairesdebasesdedonnesrelationnelschargentsouventencacheplusieursblocs
defichierspouracclrerleurstraitements.
Tantquelessupportsdestockagenonvolatilesserontpluslentsquelammoire,cestainsiquilfaudraprocder.
3.Lesenregistrementsstructurs
Peuttrefaudraitildiredailleursenregistrementsdetypesstructurs,telsquevusdanslechapitreLestableauxet
structures. La mthode de lecture squentielle rencontre dans le point prcdent a mis en lumire un petit
problme. Quand vous rcuprez un enregistrement, vous le rcuprez en entier et cest vous de le dcouper
ensuite.Pourenrcuprerplusieurs,vousutilisezdestableaux,unpourchaquechampdelenregistrement.
OrdanslechapitreLestableauxetstructuresvousavezprisconnaissancedesenregistrementsdetypesstructurs.
Ces enregistrements sont euxmmes dcomposs en champs. Pourquoi ne pas lire et crire directement un
enregistrementdetypestructurdansunfichier ?
Attention :silanotationalgorithmiquepermetlalectureetlcrituredenregistrementsdetypesstructurs
dansunfichier,cenestpaslecasdetousleslangages.SileCOBOLlefaittrsbien,cenestpaslecasde
touslesautres,commeleCouJava,toutaumoinstelqueprsentici.Neseraitceparcequedansceslangages
leslongueursdeschanessontvariablesetlesnombresreprsentssousformebinaire,vousdevriezsoitutiliser
unfichierbinaire,soittouttransformerenchaneetjustifiercesdernireslalongueurvoulue.
Pourutiliserdesenregistrementsstructurs,vousdevezprciserlatailleexactedechaquechampcomposantletype
structur.
Type
Structure enrpwd
login :chane de 8 caractres
pwd :chane de 1 caractre
uid :chane de 5 caractres
gid :chane de 5 caractres
cmt :chane de 15 caractres
home :chane de 15 caractres
shell :chane de 15 caractres
FinStruct
La dclaration dun enregistrement ou dun tableau denregistrements et laffectation de valeurs aux champs sont
expliquesdanslapartieduchapitreLestableauxetstructuresquileurestconsacre.
Pour le reste, la lecture et lcriture dun enregistrement fonctionnent lidentique des enregistrements simples
composs"lamain".Lesmmesfonctionssontutilises.Lanuanceimportanteestquetousleschampssontcrits
duncoupetlusduncoup.
G Ecrire()vaajouterunenregistrementdanslefichier,quiseracomposdetousleschampsdutypestructur.
Commelatailleexacteestprcise,toutletexteestdjcorrectementformat.Dutravailenmoins.
G Lire() lit un enregistrement complet, soit tous les champs du type structur dun coup. Aprs la lecture,
chaquechampcontientlabonnevaleur.
Danslesdeuxcas,letypestructurdoitcorrespondreexactementaucontenudufichieretrciproquement,sinon,
gare aux mauvaises surprises. Lalgorithme suivant crit un enregistrement structur dans un fichier, puis relit ce
mmefichieretyrcuprelenregistrementdansuneautrevariabledemmetype.
Programme FicEnreg
Var
maligne,recup :enrpwd
fic :fichier squentiel
Dbut
maligne.login"toto"
pwd"x"
uid"1001"
gid"415"
...
/* Ecriture */
- 5 - ENI Editions - All rigths reserved
Ouvrir "passwd" dans fic en Ajout
Ecrire(fic,maligne)
Fermer fic
/* Relecture */
Ouvrir "passwd" dans fic en Lecture
Lire(fic,recup)
Fermer fic
/* On Obtient la mme chose */
Afficher recup.login
Afficher recup.uid
...
Fin
Danslemmeordredide,vouspouvezparfaitementutiliseruntableaudenregistrementspourliretoutlefichieret
placertouslesenregistrementsenmmoire.
Programme litout
Var
lignes :tableau[1..50] de enrpwd
fic :fichier squentiel
i :entier
Dbut
i1
Ouvrir "passwd" dans fic en Lecture
Tant que NON EOF(fic) Faire
Lire(fic,lignes[i])
ii+1
FinTantQue
Fermer fic
Fin
4.ExempleenPHP
PHPsaitmanipulerlestypesdefichiersbinairesoutexte,squentielsouenaccsdirect.Cenestpastrscompliqu.
LeprogrammePHPsuivantestunexempledelectureetdercrituredenregistrementsavecdlimiteurs,commele
fichierdesutilisateursdUnix.Ilpermet :
G Ouverturedufichierenlecture.
G Lecturedechaqueligne.
G Chaqueligneestplacedansuntableaudeuxdimensions :lapremireestlaligne,lasecondeleschamps
dcoupsvialamthodesplit().
G Uneplaceestrservepourdventuelstraitementssurlesenregistrements.
G Ouverturedufichierdesortieencriture.
G Recompositiondetoutesleslignesviaunefonctionrecolle()prenantenparamtreuntableaudechaneset
ledlimiteur.
G crituredelalignereconstruitedanslefichier,avecunretourchariot.
En ltat le programme ne fait quune simple copie. vous de crer les ventuels traitements entre la lecture et
lcriture.Aussi,leslignessontplacesdansuntableaudetaillefixe.Peuttreseraitilplusavantageuxdutiliserdes
listeschanes,commeexpliqudansleprochainchapitre.
Lesinstructionsdedclaration,douverture,lecture,critureetfermeturesontplacesengras.
<?php

function recolle($morceaux, $separateur) {

- 6 - ENI Editions - All rigths reserved


$l=count($morceaux);
$chaine="";

for($i=0;$i<$l;$i++) {
$chaine=$chaine.$morceaux[$i];
if($i!=($l-1)) $chaine=$chaine.$separateur;
}
return $chaine;
}

$cpt=0;
$ligne="x";

$Fichier=fopen("/etc/passwd",r);

while(!feof($Fichier)) {
// lit une ligne
$ligne=fgets($Fichier);
if($ligne) {
// Split de la ligne
$passwd[$cpt]=split(":",$ligne);
$cpt++;
}
}
fclose($Fichier);

// eventuel traitement ici sur le tableau

// Fichier de sortie
$FicSort=fopen("/home/seb/macopie","w+");

for($cpt=0;$cpt<count($passwd);$cpt++) {

// On recolle les morceaux


$ligne=recolle($passwd[$cpt],":");

// On enregistre la ligne
fwrite($FicSort,"$ligne");
}
fclose($FicSort);
?>
- 7 - ENI Editions - All rigths reserved
Lesdiffrentsfichiers
1.Prambule
Vouspermettrez,pourunefois,dtreunpeudirect :lesfichierssontunecalamitdcrireenalgorithmique.Durant
desannes,jusquaumilieudesannes1990,leCOBOLargnenmatrechezleslangagesdeprogrammationen
informatique de gestion. Ce langage tait aussi puissant dans ce domaine que sa syntaxe tait pratique. Ceux
dentrevousquiconnaissentunpeuleCOBOLsaventdequoiilestquestionici.Unedessourcesdesapuissance
taitsacapacitgrerlesfichiersetlesenregistrementsstructurs,danstouslessens,danstouteslesformes.
Seulement,leCOBOLestpassdemodepourlesnouveauxdveloppements.Lesmultitudesdefichiersdedonnes
diversesetvariesonttremplacespardautresstructures,notammentpardesbasesdedonnesrelationnelles,
rendantcaduqueltudedelaplupartdestypesdefichiersauprofitdelangagescommeleSQL.Pourtant,lesbases
dedonnesellesmmessontsouventstockesdansdesfichiers.
Aussi,cechapitreestpluscourtquelesautres.Ilseraitpossiblededcrireunefouledetypesdefichiers :deslivres
completsexistentsurcethme,deplusieurscentainesdepages.Lesbasesetdfinitionsthoriquesserontpeu
prs toutes couvertes, mais seuls seront traits les fichiers textes. PHP ne sachant pas directement (vous pouvez
bien entendu tout reprogrammer, cest son rle) grer des fichiers de type indexs, cela rsout singulirement le
problme.
2.Problmatique
Questcequunfichier ?Cestexactementlammechosequedanslaralit.Quandvousavezuneseuleinformation
retenirdansvotrette,cestfacile.Quandvousenavezdesmilliers,cestunemissionimpossible.Vousallezutiliser
un agenda, rempli de fiches. Le cerveau a certes des capacits incroyables, mais comment retenir toutes les
transactionsbancairesdemillionsdecomptespourunebanque ?
cela,ajoutezdeuxproblmes :
G Malgr la puissance de vos ordinateurs, la capacit mmoire reste souvent limite. Un ordinateur 32 bits
"standard"(bureau,jeu)estsouventlimit4Go.Parfoisdesmachinesvontbeaucoupplushaut,jusqu64
Go. Or, mme au modeste niveau de lordinateur personnel cela reste souvent trs insuffisant : il est
impossibledeconservertouteslesdonnesenmmoire.Parexemple,unfilmauformatDVduncamescope
numriqueoccupeprsde20Go,unDVDcompletplusde8Go,etc.
G Mme sil tait possible de conserver toutes les donnes en mmoire centrale, ce qui serait somme toute
lidalvulavitessedaccsauxinformations,cettedernireestvolatile.Cestdirequetantquelordinateur
estallum,quevosprogrammesneplantentpasetquellectricitfonctionne,ilnyaaucunproblme.Ds
quondbranche,toutdisparat.
Ilfautdonctrouverunesolutionprennepourconservervosdonnes.Unfichiercorrespondlunedespossibilits.
3.Dfinition
Unfichierestunensembledinformations,gnralementstructuresdunemanireouduneautre.Certeslammoire
contient aussi ce genre dinformations (vous avez vu les types structurs), mais on parle de fichiers quand ces
informationssontplacessurunsupportmoinsvolatilequelammoiredelordinateur.Aussiunfichierseplacesur
unedisquette(envoiededisparition),unebandemagntique(commelessauvegardessurbandeparexemple),une
clUSBetsurtout,surundisquedur.
4.Lesformats
a.Typesdecontenus
Unfichiersedistinguedesautresparquelquesattributsdontsonnometsacatgorie.Ilssedistinguentaussientre
euxparlorganisationdeleursdonnescequidfinitleurformat.Vousconnaissezprobablementplusieursformats
defichiers :
G lesfichierstexte
- 1 - ENI Editions - All rigths reserved
G lesdocumentsdestraitementsdetexte
G lesfichierssonMP3
G lesvidosDivX
G lesfichiersHTML
G lesimagesJPEG
G lesfichiersdevotregestiondecomptebancaire
G etc.
Comment sy retrouver ? Il existe autant dorganisations de donnes quil existe de logiciels ! Cest dailleurs
souventuntrsgrosproblme,cestcequonappelleunformatdefichierspropritaire :ilestsouventimpossiblede
relireunformatdonnavecunproduitconcurrent.
Celanapasforcmentderapportdirect,maisunpeudelobbyingdanscecas prcisnestpasdusuperflu :
il existe de nombreux formats de fichiers dit "ouverts", dont lorganisation des donnes qui y sont
contenues est connue et documente. Tout format de fichier "ouvert" est reconnu gnralement de la mme
manireparlesprogrammessachantlesutiliser.LePDF(pourcertainsdocuments)estunformatouvert,invent
parAdobe,leformatOGGVorbisenestunautre,concurrentduMP3.Ilexisteencoreunediffrenciationentreles
formats propritaires et les formats libres. Tous les formats libres sont ouverts, mais seulement trs peu de
propritaires le sont. Un format libre, ouvert et rpandu est un gage de prennit et de compatibilit de vos
donnes.OGGVorbisestlibre,PDFnelestpas.SidemainAdobeendveloppeunenouvelleversion,ellepourrait
treincompatibleaveclesprcdentesetpayante.OnavudesdocumentsWordnepluspouvoirtreouverts
duneversionuneautre
Tout ce qui peut tre formalis peut tre stock dans un fichier. Il y a cependant des diffrences videntes et
flagrantesentreunfichierquidoitstockerunephotoetunautrequistockeunepageHTMLdunsiteweb.
Deuxcatgoriesdefichierssontdistinguables :
G Lesfichiersorganisssousformedelignesdetextesuccessives,quisappellentdesfichierstexte.
G Les fichiers bruts, contenant des donnes varies dont des nombres reprsents sous forme binaire, ne
correspondantpeuoupasdutoutdutexte,quisappellentdesfichiersbinaires.
b.Lefichierbinaire
Commentreconnatrecesfichierslesunsdesautres ?Cesttrsfacile !Prenezunditeurdetextesimple(notepad
sousWindows)etouvrezlefichiersurlequelvousavezdesdoutes.Sivousobtenezceci(lditeurestkWritesous
Linux):
- 2 - ENI Editions - All rigths reserved
Rsultatdelouverturedunfichierbinairedansunditeur
Cest que vous tes en prsence dun fichier binaire, en loccurrence ici un programme compil. Cest illisible
directement, cest une suite dinstructions et de donnes comprhensibles par le microprocesseur. Pourtant, sorti
sousformehexadcimaleoubinaire,ilseraitpossibledeconvertirlessquenceseninstructionslisibles,cestlerle
dun dsassembleur. Mme principe pour un fichier au format MP3 : ce format ncessite un programme qui va
analyserleformatconnueteneffectuerlatransformationenondessonoresquipourronttreenvoyesversvotre
carteson,puisvosoreilles.
Il est intressant de noter que lditeur de texte kwrite ayant t utilis pour la capture cidessus a fourni un
avertissementintressant :
Risquedecorruptiondunfichierbinaire
UnfichierbinairenutilisepasdereprsentationASCIIouUnicodepourreprsenterlesnombres,dolescaractres
farfelusaffichs.Aussirenregistrerunfichierbinaireavecunditeurdetextecasseraleformatdufichier,rendant
cederniertotalementinutilisable.
La configuration complte de Windows est place dans un registre ou base de registre. Cette base est
stockedansdeuxfichiers,system.datetusers.dat,auformatbinaire.Silssontcorrompus,ilestfortement
probable de devoir tout rinstaller. Laccs ce registre ne vous est quindirectement possible via lditeur de
basederegistreregeditouregedt32,maispasenlouvrantsousnotepad.
c.Lefichiertexte
Unfichiertexteestcequilannonce :ilcontientdutextesousformedelignes.Chaqueligneestdistinctedesautres.
Poursavoirsildoitpasserlalignelordinateuroupluttlesystmedexploitationajoutedescaractresspciaux.
SousWindows,cesontlescaractresASCIICR(CarriageReturn,retourchariot)quivaut13etLF(LineFeed,Sautde
Ligne)quivaut10.CettesquenceCRLFpasselaligne.SousUnixetsesdrivs,dontMacOS,seullecaractre
LFestncessaire(uneconversionestncessairepourconvertirdutextedeWindowsversUnixetrciproquement).
Nulbesoinicidevousmontrerunecapturedunditeurouvrantunfichiertexte
Dounequalitessentielledufichiertexte :
- 3 - ENI Editions - All rigths reserved
Unfichiertexteestdirectementlisibleparlutilisateuretsonorganisationdevientvidente.
Dans un fichier texte, mme les nombres sont reprsents sous forme de caractres ASCII (ou unicode, selon le
cas). Le nombre 1234 sera reprsent exactement sous cette forme caractre, soit la suite ASCII 31323334
(hxadcimal),49505152(dcimal)ouencore0011001001101000110110011100enbinaire.Lemmenombre
dansunfichierbinaireseraitreprsenten04D2(hxadcimal)ou10011010010enbinaire :unegrossediffrence.
Celaveutdirequequandvousallezcriredesnombresdansunfichiertexte,vousdevrezutiliserdesfonctionsde
conversiondenombresversdeschanes.Rciproquement,vousdevrezutiliseruneautrefonctionquandvouslirez
ceschanespourlesconvertirennombres.Vouspouvezutiliserlesfonctionsprdfiniespourcela :
G x=chnum(txt) :convertitlachanetxtenvaleurnumrique
G txt=numch(x) :convertitlavaleurnumriquexenchane
VousavezpuvoirdansquelquesexemplesdeschapitresprcdentsquePHPdisposedunarsenalintressantde
fonctionspourconvertirdutexteenentier,rel,etc.Unsoucipeutseposeraveclesrels :lesanglosaxons(et
dautres) utilisent le point comme sparateur dcimal, alors que vous utilisez probablement la virgule en France.
Certes les langages de programmation utilisent principalement le point, mais les tableurs franciss utilisent la
virgule.Amiscanadiens,sivouslisezcelivre,voustespluschanceuxquelesfranais,quidevrontfaireattention
enconvertissantunechaneennombreetviceversa,causedelavirgule.Dansledoute,lisezlemanueldevotre
langage.
Quasiment tous les fichiers de configuration dunsystmedexploitation Unix sont des fichiers texte. Pour
modifiercetteconfiguration,ilsuffitdoncbiensouventdelouvriravecunditeurdetexte,demodifierou
dajouterdeslignes,desauveretcesttout.
d.Quelformatutiliser ?
Faites preuve de bon sens. Il serait ridicule dutiliser un fichier texte pour sauver une image, tout comme il serait
ridicule dutiliser un fichier binaire uniquement pour sauver du texte simple (un format de traitement de texte est
plus complexe quil ny parat). Des formats rputs ( la mode) comme le XML sont des fichiers la structure
pouvantdevenirtrscomplexeetpourtantcesontdesfichierstexte.
Lespropritsdunfichiertextesontlessuivantes :
G Lesfichierstextesontutilisspourstockerdesdonnesstructures.
G Cesdonnespeuventtredutexte,desnombres,dumomentquetoutestconvertientextelisible.
G Cesdonnesstructuressontdesenregistrements.
G Lesenregistrementsdunfichiertextesontreprsentssousformedelignes,spareslesunesdesautres
parunesquenceCRLF(Windows)ouLF(Unix/Mac).
G Chaquelignereprsenteunestructuredenregistrement,selonunformatprtabli(fixeoudlimit).
G Unfichiertexteestlisibleetmodifiableparnimportequelditeurdetexte.
G Linterprtationdesenregistrementsdpendbienentendudesafinalit.
G Unfichiertextenepeuttreluqueligneligne.
G Un enregistrement sajoute uniquement la fin du fichier. Pour modifier ou insrer un enregistrement, il
faudraprobablementtoutrcrire.
Commepourlesfichierstexte,voiciquelquespropritsdunfichierbinaire :
Fichiertexte
Fichierbinaire
- 4 - ENI Editions - All rigths reserved
G Unfichierbinairepeutstockernimportequoi,quecesoitstructurounon.
G Lesfichiersbinairesnontpasdestructureapparente,ilsreprsententunesuitededonnes(octets)crites
lesunesaprslesautres.
G Touteslesdonnessontreprsentessousformebinaire.Lesnombressontconvertisetsilyadutexte,il
apparatcommetelmaisnonstructur.Demmesionyvoituncaractre,ilsepeutquecesoituneffetde
bord : la conversion dun nombre donnant "par hasard" quelque chose de lisible via les codes ASCII ou
Unicode mais nayant aucun rapport. Pour rsumer : les donnes dun fichier binaire y sont crites
exactementcommesiellessortaientdelammoire :cestlammereprsentation.
G La structure des enregistrements est dpendante de linterprtation du programme. Les enregistrements
peuventtredelongueurfixe,maiscollslesunsaprslesautressansretourlaligne.
G Decefait,unfichierbinairenedoitpastreouvertouenregistrdepuisunditeurdetexte :ilestsouvent
illisible. Seul le programme sachant le manipuler est apte lutiliser. Vous pouvez cependant utiliser un
diteurhxadcimal.
G Lefichierpeuttreluoctetparoctet,ouparbloc,ouentirement,depuisnimportequelleposition,puisque
cestvousquidfinissezsastructure.Idempourlesenregistrements.
5.Lesaccsauxfichiers
a.Squentiel
Lefichiersquentielpermetdaccderauxdonnesdansleurordredcriture.Vousaccdezauxdonneslesunes
aprslesautres.Pourpouvoiraccderaumillimeenregistrement,vousdevezdabordlireles999premiers(cequi
ne veut pas dire que vous devez les interprter). Les fichiers texte sont gnralement des fichiers squentiels,
chaqueenregistrementtantreprsentparuneligne.
Un fichier binaire peut trs bien tre squentiel, puisque encore une fois cest vous qui dterminez sa structure.
Vouspouvezdcrterquelesnpremiersoctetssontladescriptiondunefiguregomtriquedenfaces,puisqueles
nautresenregistrementsreprsententlalongueurdesfaces,lesangles,etc.
Il nest pas possible de modifier directement lenregistrement dun fichier squentiel. Vous pouvez ajouter un
enregistrementlafin.Poursupprimer,vouspourrezutiliserunditeur.
b.Accsdirect
Laccsdirectestaussiappelalatoire.Ilnyariendespcialementalatoiredevotrect,maiscontrairement
laccssquentiel,vouspouvezsauterdirectementlendroitquevousdsirez.Pourunfichiertexte,celapourrait
trelenumrodenregistrement(deligne).Pourunfichierbinaire,cestlapositiondeloctetsouhait.
c.Index
Dans un fichier index, les enregistrements sont identifis par un index qui peut tre un numro ou une valeur
quelconque,unidentifiant.Laconnaissancedecetidentifiantpermetdaccderdirectementlenregistrementquil
rfrence. Les enregistrements sont souvent placs les uns la suite des autres dans le fichier, comme en
squentiel. Les index sont eux placs dans un tableau dindex, avec pour chaque index la position de
lenregistrementcorrespondantdanslefichier.Unfichierindexestdoncunsupermlangedesdeuxprcdents.
Les index peuvent tre totalement indpendants, auquel cas il ny a pas forcment de moyen de lire les
enregistrementssansconnatresonindex.Maisbiensouvent,vousentendrezparlerdesquentielindex :lefichier
est index, mais depuis un index, vous pouvez lire successivement tous les enregistrements suivants. Les index
peuvent tre chans dans un sens, dans les deux, voire tris, etc. La notion de chanage est lun des sujets du
prochainchapitre.
d.Autre ?
Un langage comme le COBOL est le roi de la manipulation des fichiers, notamment en squentiel index. Il serait
pluscomplexe,maispasinfaisablededcoderunfichierMP3danscelangage.
Vouspouvezfairecequevousvoulezdunfichier,cestvousquiendterminezlastructure.Mieux(oupire,selonle
- 5 - ENI Editions - All rigths reserved
cas) :lelangagedeprogrammationnaquefaireducontenudufichier.SivousdemandezaulangageCdouvriren
modetexteunfichierbinaireetquevousenlisezsuccessivementlesenregistrements,ilnebroncherapas :surun
grosfichier,iltrouveraprobablementquelquesretourslaligne.
De mme, vous pouvez sauter loctet de votre choix dans un fichier texte, en lire pile trois octets et cest tout.
Cestvousdimplmenterlinterprtationducontenudesfichiersdanslelangagevis.Quantlindex,cestune
catastrophe,PHP,C,C++etJavaneproposentriendeprdfini.Cestvousdetoutcreraveclesfonctionsde
basesexistantes.
- 6 - ENI Editions - All rigths reserved
Lesenregistrements
Cechapitreseconcentresurlesfichierstexte.Dansceuxci,vousdevezdfinirlastructuredevosenregistrements.
Bienquetoutsoitpossible,notammentavecdesstructuresenarborescencecommeleXML,vouspouvezinitialement
choisirentredeuxmthodesassezsimples :lesenregistrementsavecdlimiteursoulargeurfixe.
1.Lesdlimiteurs
Les enregistrements dlimits sont courants sous Unix. Dans chaque ligne, les valeurs individuelles sont appeles
deschampsetsontsparesentreellesparuncaractreparticulierappelcaractredesparationoucaractrede
dlimitation,ouenfindlimiteur.Nimportequelcaractrepeutconvenir,cependantilnedoitpasseretrouverdansla
valeurdunchamp,cequiauraitpoureffetdecasserlastructuredelenregistrement.Cesontsouventlepointvirgule
""oulesdeuxpoints":"quisontutiliss.
Les champs denregistrements sont gnralement encadrs par des guillemets lorsquil sagit de chanes de
caractres,rienpourdesvaleursnumriques.Cenestpasuneaffirmation :cenestpastoujourslecasetcest
vousdegrerletypedunevaleurdonne,auseindevotreprogramme.
VoiciunsimpleexempledecontenudefichierdlimitdetypecourantsousUnix :
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
Les plus perspicaces dentre vous auront reconnu un morceau du fichier /etc/passwd qui contient quelques
informationssurlescomptesdesutilisateursdusystmeUnix.Chaqueligneestunenregistrementdontlastructure
estlasuivante :
G Unsparateur":"dlimitelesdiffrentschamps.
G Ilyaseptchamps,numrots(parconvention)de17.
G 1
er
champ :nomdelutilisateur(sonlogin).

G 2
me
champ :indicateurdemotdepasse(icistockailleurs).

G 3
me
champ :UID,identifiantnumriqueuniquedelutilisateur.

G 4
me
champ :GID,identifiantdugroupedelutilisateur(stockailleurs).

G 5
me
champ :commentairelibre.

G 6
me
champ :dossierpersonneldelutilisateur.

G 7
me
champ :linterprteurdecommandes(shell)deconnexion.

Vousvoyezbienquilestpossibledeplacerdesinformationstrsimportantesdansunfichiertexte.
La manipulation dun tel fichier est assez vidente : il suffit de lire une ligne, puis de dcouper celleci champ par
champ,cequiestpluttsimplecarilsuffitdslorsdetrouverlesdlimiteurs.Laplupartdeslangagesproposentdes
fonctionsquipermettentdedcouperunechaneselondesdlimiteurs.Cetypedefichieraaussibiendesavantages
quedesinconvnients :
G Dufaitqueleschampssoientcollslesunsauxautresetquechaquechampneprendpasplusdespaceque
sadonneoccupe,fournitunrelavantageentermedoccupationdespacedisqueetdemmoire.
G Cependant, le traitement de dcoupage de la chane en fonction de la position forcment alatoire dun
- 1 - ENI Editions - All rigths reserved
dlimiteurestpluscomplexequilnyparat.Certesleslangagespeuventfournirdesfonctionsappropries,
maiscommentferiezvousvousmme ?
Sur ce dernier point cest assez facile formaliser sous forme dalgorithme. Une fonction "split" reoit trois
paramtres : une chane de caractres, le dlimiteur et une position de dpart. Elle retourne le champ partir de
cetteposition,quiestlenumrodecaractredelachane,dmarrantun.Silafonctionretourneunechanevide,
cestquilnyaplusrien.
Fonction split(txt :chane,delim :caractre,pos :entier) :chane
Var
l,i :entiers
tmp :chane ;
Dbut
l=longueur(delim)
tmp""
ipos
Tant que i<=l et milieu(txt,i,1)!=delim Faire
tmptmp&milieu(txt,i,1) // un seul caractre concatn
ii+1
FinTantQue
Retourne tmp
FinFonct
Pourexploitercettefonction,voiciunpetitprogrammequirecherchesuccessivementtousleschampsduneligne.Il
suffitdebouclertantquelafonctionsplitneretournepasdechanevide.chaquepassagedanslaboucle,ilfaut
incrmenter la position de la longueur de la chane trouve, plus 1 (le dlimiteur), pour se trouver sur lventuel
nouveauchamp
Programme decoupe
Var
ligne,result :chane
pos :entier
Dbut
pos1
ligne"root:x:0:0:root:/root:/bin/bash"
result"toto"
Tant que result!="" Faire
resultdecoupe(ligne," :",pos)
Si result!="" Alors
Afficher result
pospos+longueur(result)+1 //aprs le dlimiteur
FinSi
FinTantQue
Fin
Vousconstatezqueletraitementnestpasanodinetsurdesmilliersdenregistrementscelapeutcompter.
2.Largeurfixe
Dans des enregistrements largeur fixe, il ny a pas de dlimiteurs. Chaque champ a une longueur prdfinie et
occupetoutecettelongueur,quittetrecompltpardesespaces.Leschampssontainsicollslesunsauxautres,
enunseulgrosbloc.
Silfallaitconvertirunelignecidessusenenregistrementfixe,ilfaudraitsavoirque :
G Unloginfaitenprincipe8caractres.
G Unmotdepasse1seul(stockailleurs).
G LesUIDetGIDutilisentaumaximum5chiffres.
G Lecommentaireseraarbitrairement(pourlexemple)de15caractres.
G Lescheminsetshellsarbitrairementaussi15caractres.
- 2 - ENI Editions - All rigths reserved
|-----------------------------------------------------------------|
|root x0 0 Commentaire /root /bin/bash |
|bin x1 1 Commentaire /bin /bin/bash |
|daemon x2 4 Commentaire /sbin /bin/bash |
|rohaut x123 123 Compte Seb /home/seb /bin/ksh |
|-----------------------------------------------------------------|
|1 891 11 22 33 45 6|
| 0 45 01 56 90 4|
Deuxchosessautentauxyeux:
G Contrairementauformatdlimit,leformatlargeurfixeconsommebienplusdemmoire.Danscetexemple
64 octets sont utiliss pour chaque enregistrement. Dans le format dlimit, la taille est variable, mais la
premirelignenutilisaitque32octets.
G Cependant,larcuprationdetelsenregistrementsestbienplussimple,carvousconnaissezlavancela
tailledechaquechampetdonctouteslespositionspourdcoupervosenregistrements.Parcontre,ilfaudra
penser supprimer les ventuels espaces en trop, en supprimant les espaces finaux. Les langages
proposentsouventunefonctionappele"trim"quilefaitpourvous.Nulbesoindoncdefairedesrecherches
commeprcdemment.
Cette praticabilit compense lutilisation de la mmoire, dautant plus quelle concide fortement avec les types
structursabordsdanslechapitreLestableauxetstructures.Lalectureetlcrituredanslesfichierssetrouvent
ainsifacilites.
Unfichierformatfixeaaussiunautreavantage :ilestpossibledechoisirparmilesdeuxformats,texteoubinaire,
pour lenregistrer. Autrement dit soit ligne ligne, soit contigus. Comme vous connaissez la taille exacte dun
enregistrement,ilsuffitdedirequelesoctets164reprsententlepremier,65129ledeuxime,130194le
troisimeetainsidesuite.Vousdevrezcependantfaireattentionaveclesvaleursnumriques,unentieroccupant
gnralementquatreoctets,unreldoubleprcisionhuit,etc.
Connaissant lavance les positions de chaque champ, vous utiliserez les sousprogrammes prdfinis de chaque
langagepourdcouperunesouschanedecaractresquivalentlafonctionmilieuduchapitreprcdent.
3.Principesdaccs
a.tapesdebase
Pourtravailleravecdesfichiers,vousdevrezrespecteruncertainordre.Ilvousfaudra :
G Ouvrirlefichier,cestdireindiquerquelfichiervousvoulezaccderetcomment.
G Traiter le contenu du fichier : le lire, y crire, bref toutes les oprations souhaites pour accder et
manipulersoncontenu.
G Fermerlefichier,quandtouslestraitementssonttermins.
Ltapelaplusimportanteestlapremire.Commentouvrirunfichier ?Sivousaviezledroitdouvrirseulementun
seul fichier, ce serait assez simple, mais questce qui vous empcherait den ouvrir trois ou quatre en mme
temps ?
b.Identificateursdefichiersetcanaux
Leprogrammedoitpouvoirsavoirdansquelfichieriltravaillelorsquilsagitdylireoudycriredesdonnes.Ceci
passeparlutilisationdunidentifiantuniquepourchaquefichierouvert.
Danslapratique,tousleslangages,oupresque,eninterne,utilisentlammemthode.Laccsunfichierpasse
parlutilisationduncanal.Danslaralit,lavraievie(sousentendezparlquelinformatiquenestpaslavraievie,
oupluttunmoyenmaispasunefin),uncanalrelieentreeuxdeuxcoursdeau,oulamer,unlac,etc.
Danscecanaltransite,outredeleau,desbateaux,pniches,dansunsensetdanslautre.
Danslemondevirtuel,uncanalpermetdefairetransiterunfluxdinformation(lesdonnes)dunprogrammevers
unfichier,dunfichierversunprogramme,dunprogrammeunautre,entredeuxfichiers,entreunprogrammeet
un priphrique, etc. Par exemple, il existe un canal qui fait transiter ce que vous tapez au clavier vers le
- 3 - ENI Editions - All rigths reserved
programmequiattendunesaisie,unautrecanalpourtransfrerverslaffichagecequeleprogrammedoitafficher.
Certainscanauxfonctionnentdanslesdeuxsens,dautresnon.
Chaque canal porte un numro unique, certains ont des noms prdfinis. Celui rattach par dfaut au clavier,
appelcanaldentrestandard,portelenumro0(sitantestque0soitunnombre)etsappelleSTDIN.Celuiqui
faittransiterlesinformationsafficherverslcran(oupluttlepiloteousoussystmedaffichage),appelcanal
de sortie standard porte le numro 1 et sappelleSTDOUT.IlenexisteuntroisimeappelSTDERRetportantle
numro2,chargdevhiculerlesmessagesderreur.
La notion de canal est flagrante avec certains systmes dexploitation, surtout Unix qui en use et en abuse.
Windows hrite luimme de cette notion, exploitable simplement au travers de linterprteur de commandes
dorigineDOS.EnC,ilestpossibledutiliserlesfonctionsdelectureetdcrituredefichiersaveccestroiscanaux.
Vous disposez de tous les canaux audel du numro deux, donc 3 et suivants pour vos propres fichiers.
Louverturedunfichierconsistedonc,directementouindirectement,luirattacheruncanal.Lesdonnesquevous
crirez dans le fichier iront de votre programme vers le fichier par ce canal et celles que vous lirez du fichier au
programmetoujoursparcecanal.
Lesnotationsalgorithmiquespeuventvariersurcepoint.Certainesnotationsreprennentlasyntaxedunlangage
de type Basic ou Visual Basic, dans lequel vous devez indiquer vousmme quel numro de canal utiliser
louverturedufichier.DautresreprennentunesyntaxeissueduCocestlafonctionCouvrantlefichierquichoisit
un canal et vous rcuprez un identifiant de fichier sous forme de variable. Cet identifiant est lenom logiquedu
fichierauseinduprogramme.Cestcettenotationquiestgnralementprfrableenalgorithmique.
EnC,unefonctiondouverturedefichierretourneunevariabledetypeFILEquiestenfaituntypestructur
contenant diverses informations dont un entier contenant un numro qui se rvle tre le numro du
descripteurdefichiersauniveaudusystmedexploitation.Deslimitessontdfiniesauseindusystme.Sous
Linux, il ne peut y avoir par dfaut plus de 1024*1024 fichiers ouverts, mais en pratique 1024 par processus
(programme). Cela devrait suffire, cependant divers mcanismes permettent daller encore plus loin,
gnralement jusqu 8192. Audel, cela devient trs trs lourd. Un nom logique de fichier est donc un
enregistrementdetypestructur.
c.Lesmodesdouverture
En ouvrant un fichier, il faut indiquer comment vous souhaitez y accder. Souhaitezvous seulement lire son
contenu,ycrireovousvoulez,ouajouterdesligneslafin ?
G Enlecture,vousavezunaccsenlectureseuleaufichier.Vousnepouvezpasycrire.Vouspouvezvousy
dplacer,retourneraudbut,liretoutcequevousvoulez,maiscesttout.
G Encriture,parfoisnommlecture/criture,vouspouvezmodifiernimportequellepartiedufichier,crireo
vousvoulez,craservosanciennesdonnesquiserontdoncdfinitivementperdues.Attentionlacassesi
vos enregistrements sont de taille variable dans un fichier texte ! Vous pouvez aussi lire le contenu du
fichier.
G Enajout(append),vousnepouvezpaslirelefichier,maisuniquementajouterdesdonnesaprslafinde
celuici,commeajouterunenregistrementouquelquesoctetstoutaubout.Vousnepouvezpasmodifierles
donnesquiysontdjcrites.
Le problme principal que vous rencontrerez quand vous utiliserez des enregistrements dans un fichier,
cestquilnyaaucunmoyendeffacerunenregistrement,doncderduirelatailledeceluici.Vousdevrez
doncruser,utiliserunindicateurparticulierpourindiquerunenregistrementsupprimetprvoirdestraitements
de rorganisation des fichiers (rindexation, suppression des lignes, listes chanes, etc) en passant
probablement par des fichiers temporaires, ou tout charger en mmoire, puis rcrire seulement les bonnes
valeurs
- 4 - ENI Editions - All rigths reserved
Lessousprogrammesrcursifs
1.Principe
Unsousprogrammepeutappelerunautresousprogramme,quelquilsoit.Doncunsousprogrammepeutsappeler
luimme.Unsousprogrammeestditrcursifsilest,toutaumoinsenpartie,dfiniparluimme.Autrementdit,si
dans une fonction ou une procdure vous faites appel cette propre fonction ou procdure, cellesci sont dites
rcursives.Lexempleleplussimpleestlafactorielle:n!=n*(n1)!
Ilexistedeuxtypesdercursivit:
G Simpleourapide:lesousprogrammesappelleluimme.
G Croise ou indirecte : deux sousprogrammes sappellent lun lautre : le premier appelle le second, qui
appellelepremier,etc.
Larcursivitpeuttreappliquetantauxfonctionsquauxprocdures.
Pourunercursivitsimple:
Procdure recursive()
Dbut
/* instructions */
recursive()
/* instructions */
Fin
Pourunercursivitcroise:
Procdure recur1()
Dbut
/* instructions */
recur2()
/* instructions */
Fin
Procdure recur2()
Dbut
/* instructions */
recur1()
/* instructions */
Fin
Lasuitenevaexposerquelessousprogrammesrcursifssimples.
2.Unpremierexemple:lafactorielle
Une factorielle est lexemple rv dapplication dun algorithme rcursif. Cet exemple a dj t prsent dans les
chapitresprcdentsmaisunpetitrappelsimpose:
G 10!=10*9*8*7*6*5*4*3*2*1
G Donc10!=10*(9*8*7*6*5*4*3*2*1)
G Donc10!=10*9!
G Doncn!=n*(n1)!
Si vous crez une fonction (approprie dans ce cas) appele fact() et charge de calculer la factorielle de n, vous
auriezunraccourcidecegenre:
- 1 - ENI Editions - All rigths reserved
fact(n)=n*fact(n-1)
Del,ilvousdevienttrsfaciledcrireunefonctionfact()rcursive:
Fonction fact(n:entier) :entier
Dbut
nfact(n-1)
Retourne n
Fin
Cette fonction nest pas complte car elle va sexcuter linfini. Il ny a pas de condition darrt. Or, le calcul doit
continuertantquenestsuprieur1.Voicilespassessuccessivespourunefactoriellede5:
G 1
re
tape:5>1?Oui:fact(5)appelle5*fact(4)

G 2
me
tape:4>1?Oui:fact(4)appelle4*fact(3)

G 3
me
tape:3>1?Oui:fact(3)appelle3*fact(2)

G 4
me
tape:2>1?Oui:fact(2)appelle2*fact(1)

G 5
me
tape:1>1?Non:fact(1)sortenretournantlavaleur1fact(2).

Estce fini ? Non ! Chaque fonction appele se terminant retourne sa valeur au programme ou sousprogramme
layantappel.Donccelacontinue:
G 6
me
tape:fact(2):2*fact(1)=2,retourne2fact(3)

G 7
me
tape:fact(3):3*fact(2)=6,retourne6fact(4)

G 8
me
tape:fact(4):4*fact(3)=24,retourne24fact(5)

G 9
me
tape:fact(5):5*fact(4)=120,retourne120auprogrammeappelant.

Sivoussuivezlordredesappels<>retoursvousobtenezleschmasuivant:
Lesallersetretoursdunappelrcursif
Unalgorithmeunpeupluscorrectdefact()estdonc:
Fonction fact(n :entier) :entier
Dbut
Si n>1 Alors
nn*fact(n-1)
FinSi
Retourne n
Fin
- 2 - ENI Editions - All rigths reserved
Ilmanqueencorelecasdelafactorielledezro,quivautun.Aufinal,lafonctionrcursivefact()pourraitressembler
ceci,carunefactoriellenestpossiblequavecdesentierspositifs:
Font fact(n:entier):entier
Dbut
Si n=0 Alors
Retourne 1
Sinon
Retourne n*fact(n-1)
FinSi
Fin
LammefonctionenPHPavecsonprogrammedaccompagnement:
<html>
<head><meta/>
<title>Factorielle</title>
</head>
<body>
<?php
function fact($n) {
if($n==0) return 1;
else return $n*fact($n-1);
}

$n=fact(10);
echo "$n";
?>
</body>
</html>
3.Unexemplepratique:lestoursdeHanoi
LestoursdeHanoisontunjeuderflexionquiatinventen1883parN.ClausdeSiamprofesseuraucollgede
LiSouStian. Si la curiosit vous a pouss rechercher ces noms et villes, peuttre avezvous eu une surprise :
aucundesdeuxnexiste.Cesontenfaitdesanagrammesfaisantcroirequecejeuatinventparunasiatique.
Toutfaux!N.ClausdeSiamestlanagrammedeLucasDAmiens,(EdouardLucasenfait),nAmiensetLiSouStian
estlanagrammedeSaintLouis,nomduLyceoLucasenseignait.
Les tours de Hanoi drivent dune lgende Hindou qui dit quun temple dispose de trois poteaux sur lesquels
sempilent64disquesenordediamtresdiffrents.LesprtresdeBrahmadplacentcontinuellementlesdisquesdu
premierpoteauversletroisimeenpassantventuellementparunpoteauintermdiaireetenrespectantquelques
rglessimples:
G Ilsnepeuventdplacerquunseuldisquelafois.
G Ilsnepeuventdplacerundisquequedansunemplacementvideousurundisquedeplusgranddiamtre.
Lalgendeditaussiquelesdisquesonttempilsaudbutdestempsetquelorsquelesprtresaurontfinideles
dplacer,ceseralafindumonde.
Nul doute que si les prtres de la lgende avaient eu un ordinateur, nous serions tous dj morts
Quoique ! Avec 64 disques il faut 2
64
1 dplacements (18446744073709551615 et uniquement sans se
tromper),soitraisondeunparseconde584542046090ans(584milliardsdannes).Sachantqueluniversa
environ14milliardsdannes (cestthorique),ilnousreste570milliardsdannespourenprofiter.Enplus,les
disquesenordoiventtretrslourdsdplacer.
LejeufaitrfrenceHanocardanslacapitaleduVietnam,uneanciennecoloniefranaise,lestoitsdecertaines
pagodesontlaformedeplateauxempils.
Lalgorithme rcursif pour rsoudre ce problme est un grand classique ncessitant un peu de torture mentale.
Supposonsquevoussachiezdplacern1disques.Pourendplacern,ilsuffitdedplacer(n1)disquesdupiquet1
aupiquet3,puisdedplacerlegranddisquedupiquet1aupiquet2etdeterminerendplaantles(n1)autres
disquesdupiquet3verslepiquet2.
Soient:
- 3 - ENI Editions - All rigths reserved
G nlenombrededisques,
G alapositiondedpart,valant1,
G b,lapositiondarrive,valant2,
G c,lapositionintermdiaireutilisable,valant3,
G audpart,touslesdisquessontlapositiona,
G uneprocdure"dplacer"quidplaceundisquedunepositionuneautreviaunepositionintermdiaire.
Lalgorithmeestlesuivant:
Procdure dplacer(n,a,b,c :entiers)
Dbut
Si n>0 Alors
dplacer(n-1,a,c,b)
Afficher "De ",a, "vers ",b
dplacer(n-1,c,b,a);
FinSi
Fin
SoitenPHP:
<html>
<head><meta/>
<title>Tour de Hanoi</title>
</head>
<body>
<?php
function deplace($n, $a, $b, $c)
{
if($n>0) {
echo "deplace(".($n-1).",$a,$b,$c)<br />";
deplace($n-1,$a,$c,$b);
echo "De $a vers $b<br />";
echo "deplace(".($n-1).",$c,$b,$a)<br />";
deplace($n-1,$c,$b,$a);
}
}
deplace(3,1,2,3);

?>
</body>
</html>
- 4 - ENI Editions - All rigths reserved
Prsentation
1.Principe
Lorsdelaprsentationdelastructuredunalgorithme,ilatbrivementabordlapossibilitdajouterunepartie
supplmentaire en dbut de programme, avant les dclarations des variables. Cette partie navait pas encore t
aborde, alors qu ce niveau vous savez, si vous avez bien compris les chapitres prcdents, dj trs bien
programmer.Orpeuttreavezvousremarququelqueslimitationsfrustrantesetnotammentunecertainelourdeur
lorsque le programme est trs long et quil sagit de rpter certains blocs dinstructions pourtant dj prsents
ailleurs. Par exemple, rappelezvous un simple petit programme qui calcule la valeur absolue dune commande.
Lembtantestquchaquefoisquevousvoulezcalculercettevaleur,vousdevezrpterlastructureconditionnelle.
Nauraitil pas t plus simple de le faire une seule fois et de passer ce bloc dinstructions uniquement la valeur
dontonveutrcuprerlavaleurabsolue?
Vous pourriez pour cela envisager un second programme qui serait lanc par le programme principal avec comme
paramtrecettevaleur.Cesttechniquementfaisable,maisplacerunsecondprogrammepart(unexcutable)juste
pour ce genre de traitement, cest une perte de temps et despace. Lautre solution consiste ajouter le code
ncessaireceprogrammedansunestructurespcialeetpartduprogrammeprincipal.Cestcequonappelleun
sousprogramme. Les anciens langages BASIC utilisaient dailleurs des instructions en ce sens (gosub, sub xxx,
endsub,etc,subpoursousprogramme).
Lorsquun programme est trs long, il nest pas raliste de tout programmer dun seul tenant. Le programme est
dcomposendepluspetitesunitsoupartiesrutilisablesquisontensuiteappelesaumomentopportunparle
programmeprincipal.Unsousprogrammevitelarptitioninutiledecodeetpermetdeclarifierleprogramme.Une
fois tous les sousprogrammes raliss, il est mme possible de les enregistrer dans des bibliothques pour les
rutiliser dans dautres programmes, quels quilssoient,simplifiantainsifortementlcriture du code et permettant
aussidallerbeaucoupplusvite.
Un programme complet forme une application. Une application est, si vous avez correctement suivi, compose de
plusieurspartiesfonctionnelles:
G Leprogrammeprincipal,oublocprincipal,quicorrespondaublocprincipaldinstructionssituessouslemot
clPROGRAMMEetDEBUT.Cestceprogrammequiestexcutquandvouslancezlexcutablequirsultede
limplmentation de votre algorithme en Java, par exemple. En Java, le programme principal est ce qui est
situsouslalignecontenantlemot"main"quisignifiedepuislanglais"principal".
G Dessousprogrammes,chargsdediversrles,quipeuventallerducalculdunevaleurabsolueceluidune
puissancequelconque,uneconversiondedate,leformatagedunechanedecaractres,laffichagedunen
tte quelconque, bref tout ce que vous voudrez bien en faire. Suivant les langages, vous trouverez les
expressionssousprogrammes,maisaussietsurtoutlesmotsfonctionsetprocdurespourlesdcrire.Cest
le programme principal qui se charge dappeler les sousprogrammes. Ceuxci ne se lancent jamais deux
mmes.
Un sousprogramme ne se lance jamais tout seul, il doit tre appel depuis le programme principal.
Cependant,unsousprogrammepeutparfaitementfaireappelunautresousprogramme.Parexemple,un
sousprogramme charg de calculer une racine carre peut appeler le sousprogramme charg des valeurs
absolues
2.Dclarationetdfinition
a.Dansunalgorithme
Avant de pouvoir utiliser un sousprogramme, il faut le dfinir ou le dclarer, cestdire indiquer au programme
principal quil existe : son nom et son contenu (bloc dinstructions). En algorithmique, les sousprogrammes sont
dclars et entirement crits au tout dbut, avant le motcl PROGRAMME. Cest gnralement le cas dans les
langagesdeprogrammation,carleprogrammeprincipalnepeutpasutiliserunsousprogrammesilnesaitpasquil
existe.
<SOUS-PROGRAMME 1>
<SOUS-PROGRAMME 1>
...
PROGRAMME XYZ
- 1 - ENI Editions - All rigths reserved
VAR
...
DEBUT
...
FIN
Sidansvotrealgorithmevossousprogrammessontcritsendessousduprogrammeprincipal,ilestfort
probablequandvouspasserezlaprogrammation,quevousobteniezdeserreurs.UnlangagecommeleC
autorisecependantladclarationdunomdusousprogrammeenhautduprogrammeetsaprogrammationen
dessous.PourlePHP,peuimportelendroitolesousprogrammeestcrit.QuantJava,laproblmatiqueest
diffrentedufaitdesaconceptionobjet(dernierchapitre).
Lesousprogrammeaunestructureassezsimple,cestlammequepourleprogrammeprincipal:vousydclarez
vos variables, constantes, tableaux, etc. et vous placez vos instructions entre DEBUT et FIN. Voici un simple
exemple,pourlemomentayezuneconfianceaveugle,lestermescommeProcdureserontexpliqusunpeuplus
loin.Danscetexemple,vingttiretssontaffichs,enpartantduprincipequilslesontsurlammeligne.
Procdure RepeteCar()
Var
i:entier
Dbut
Pour i de 1 20 Faire
Afficher "-"
FinPour
FinProc
Vousconstatezquunsousprogrammeestconstitude:
G Unidentifiantsousformedenom:RepeteCar(),quiluiservirapourtreappel.
G Unezonededclarationdevariables.
G UnblocdinstructionsencadrentreDbutetFin.
G Letouttanticietdanslecadredecetexemple,prcismententrelesmotsclsProcdureetFinProc.
En algorithmique, un sousprogramme ne peut pas tre dclar dans un autre sousprogramme. La
possibilitexistecependantparfoisdanscertainslangagesdeprogrammation,commelePHP,maisalors,il
fautfairepreuvedunetrsgranderigueur:lesousprogrammeseraconnuduresteduprogrammeseulement
quandceluiquiledclareseraluimmeappelunepremirefois.
b.EnPHP
EnPHP,unsousprogrammesedclaresouscetteforme :
function nom_fonction(argument1, argument2, ..., argumentn) {
/* code du sous programme */
return valeur ; /* suivant le retour */
}
Vous navez pas encore rencontr ce quest un retour ni un argument. Ce nest pas gnant pour les petits
exemples.
VoicilepetitsousprogrammeRepeteCar()enPHP.
function RepeteCar() {
for($i=1 ;$i<=20 ;$i++) echo "*";
echo "<br />";
}
3.Appel
- 2 - ENI Editions - All rigths reserved
Unsousprogrammeestexcutdepuisleprogrammeprincipalouunautreprogramme.Pourcela,leprogrammefait
appel au sousprogramme.Lappelausousprogrammeestuneinstructionquivadclencherlexcution de celuici.
Cetappelpeutavoirlieunimporteo.Suivantlesdiversesconventions,lessousprogrammespeuventtreappels
depuisuneinstructionAppel,ouAppeler.Plussimplement,ilestdusagedappelerunsousprogrammeparsonnom.
Lusagepeutcependantchangerselonletypedesousprogramme,procdureoufonction,lesinstructionscidessus
tantsouventrservesauxprocdures.PourreprendrelesousprogrammeRepeteCar(),voiciunexempledappel:
Procdure RepeteCar()
VAR
i:entier
DEBUT
Pour i de 1 20 Faire
Afficher "-"
FinPour
FIN
FinProc
PROGRAMME LIGNES
VAR
i:entier
DEBUT
Afficher "Voici 10 lignes de 20 caractres"
Pour i de 1 10 Faire
RepeteCar()
FinPour
Afficher "Le programme est termin"
FIN
Lesplusperspicacesdentrevousaurontremarququelavariableiestdclaredeuxfois,unefoisdanslesous
programmeetunefoisdansleprogrammeprincipal.Cestnormal,lesexplicationsarriverontentempsvoulu.
Lorsquelesousprogrammesetermine,linstructionsituejusteendessousdesonappelestexcute.Onditquily
aretourdusousprogrammeverslinstructionsuivante,ouappelante.
Enfin,unsousprogrammepeuttreappelenluifournissantdesvaleurs,appelesparamtres.Cesvaleursseront
placesdansdesvariablesutilisablesauseindusousprogrammecommetouteautrevariable.
VoicilexemplecompletenPHPavecengraslappellamthode(sousprogramme).
<html>
<head><meta/>
<title>dclaration de fonction</title>
</head>
<body>
<?php
function RepeteCar() {
for($i=1 ;$i<=20 ;$i++) echo "*";
echo "<br />";
}

echo "Affichage de 10 lignes de 20 caractres<br />";
for($i=1;$i<=10;$i++) RepeteCar();
?>
</body>
</html>
4.Fonctionsetprocdures
LesousprogrammeRepeteCar()atdclaraveclemotclProcdureetilvousatindiquaussilexistencedu
motcl Fonction. Il y a donc deux types de sousprogrammes. Certains langages peuvent proposer ou lun, ou
lautre,parfoislesdeux.Vousentendrezparfoisparlerdelangagesprocduraux(commelePascal)oufonctionnels
(commeleC).
Avantdecontinuer,justeunpetitmotsurPHP.PHPnefaitpasdediffrencesentrelesfonctionsetlesprocdures
tellesqueprsentesici.EnPHP,lesprocduressontdesfonctionsquineretournentpasdevaleurs.
a.Lesprocdures
- 3 - ENI Editions - All rigths reserved
Lesprocduressontdessousprogrammesconstitusdunesuitedinstructionsindpendantes.Uneprocdurene
retournepasdersultatoudevaleurauprogrammequilaappel,toutcommelesvaleurspassesenparamtre
nesontpasforcmentmodifiesdemanireglobale.Uneprocdurepourraitfairelobjetdunprogrammepart.
Soncontenupeutcependantparfoisinfluersurledroulementglobalduprogramme,silmodifieunfichier,unebase
dedonnes,etc.
La procdure RepeteCar() est un exemple typique : le bloc de donnes rptitif influe sur laffichage, mais ne
retournerienentantquetel.
Ilexistecependantquelquesmoyensindirectspouruneprocdurederetournerunevaleur:
G en passant celleciparrfrence,selonlemmeprincipequecequiatexpliqupourlestableaux :le
sousprogrammereoitlarfrencedelavariableetpeutlamodifierverscellecontenantlanouvellevaleur.
Ceciestdailleursaussipossibleaveclesfonctions.
G Plus simplement, lalgorithmique effectue souvent une distinction entre les valeurs en entre de la
procdure (celles quon lui transmet) et les valeurs en sortie. Dans ce cas, autant utiliser les fonctions,
notammentsiuneseulevaleurdoittreretourne.
G En modifiant les contenus des variables globales, variables accessibles pour tous les programmes et les
sousprogrammestantenlecturequencriture(cf.section"Variableslocalesetglobales"decechapitre).
b.Lesfonctions
En mathmatique, vous avez probablement rencontr la notion de fonction. Dans le cadre de la rsolution dune
quationduseconddegr,lquationscritgnralementainsi:
f(x)=ax+bx+c
Lersultatdef(x)oufonctiondexestlersultatducontenudelafonction,cestdirelquation.Lavaleurdef(x)
est ce rsultat. Cest pareil en algorithmique : une fonction est un sousprogramme qui retourne une valeur. Un
fonctionsedcritainsi:
Fonction nom():type
Var
/* variables */
Dbut
/* bloc dinstructions */
Retourne valeur
FinFonc
G UnefonctionsedclareaveclemotclFonction,suividesonnometdutypedevaleurquelleretourne.Ce
peuttrenimportequeltype(entier,rel,chane).
G Unefonctionpeutcontenirunezonededclarationdevariablesetdetypesstructurs.
G LeblocdinstructionsestencadrparDbutetFinFonc.
G La valeur de la fonction est retourne par linstructionRetourne. La valeur retourne doit tre du mme
typequecelleattendueparladclarationdelafonction.
Fonction equation():rel
Var
a,b,c,x:rels
Dbut
xa*x*x+b*x+c
retourne x
FinFonc
Ilexisteunediffrencetrsimportanteentreuneprocdureetunefonction:
G Laprocdureestvuecommeuneinstruction.
G Lafonctionestvuecommeunevaleur.
- 4 - ENI Editions - All rigths reserved
Tout comme une variable retourne une valeur, une fonction retourne aussi une valeur, ce qui veut dire quune
fonctionpeuttreutilise(appele)partoutounevariablepourraitltre:dansuneexpression,dansuncalcul,
unaffichage,uneaffectation,etc.Dansunseulcas,lafonctionnepeutpastreutilise:unefonctionfournitune
valeur,ellenepeutpassevoiraffecteunevaleur.Ceciestinterdit:
equationx ; /* INTERDIT */
maisceciestautoris:
xequation()
xrecevraalorslavaleurretourneparlafonctionequation()vialinstructionRetourne.
PROGRAMME EQ1
Var
result:rel
Dbut
resultequation()
Afficher result
Fin
Linstruction Retourne ne retourne pas une variable, mais une valeur. Cette valeur peut tre le contenu
dunevariable,maisaussiuneautrefonction(auquelcascestlersultatdecetteautrefonctionquisera
retourn) ou nimporte quelle expression pouvant tre value. La fonction equation() peut donc tre crite
ainsi:
Fonction equation():rel
Var
a,b,c,x:rels
Dbut
Retourne a*x*x+b*x+c
FinFonc
Voici le mme exemple en PHP. Cette fois la mthode va retourner un entier, ce qui est prcis lors de sa
dclaration.
function equation() {

/* il faudrait initialiser les variables ici */


$x=$a*$x*$x+$b*$x+$c ;
return $x ;
}
5.Variableslocalesetglobales
a.Locales
Lexemple de la procdure RepeteCar() a soulev un petit problme pas si anodin que cela. Il met en vidence
lutilisationdedeuxvariablesdemmenom,lunedansleprogrammeprincipal,lautredanslesousprogramme.La
variableiapparatdeuxfois.
Lendroit o les variables sont dclares est trs important. Selon cet endroit, les variables ont une "porte"
diffrente.Laportedunevariableestsavisibilitauseindesdiffrentespartiesduprogramme.
Lecasgnralditquunevariablenestvisibleetaccessiblepardfautquedansleblocdinstructionsoelleat
dclare. Une variable dclare dans un sousprogramme sous les motscls Procdure ou Fonction ne pourra
danscecasqutrelisibleetmodifiableuniquementdanscesousprogramme.Idempourleprogrammeprincipal:
unevariabledclaresouslemotclProgrammeneseraaccessiblequeparceluici.
Les variables accessibles uniquement par le programme ou sousprogramme dans lesquels elles sont dclares,
sont appeles des variables locales. Toutes les variables que vous avez rencontres jusqu prsent sont des
variableslocales.
Lesvariableslocalesdemmenomnontaucunrapportentreelles.Ellessonttotalementindpendanteslesunes
- 5 - ENI Editions - All rigths reserved
desautresetaucuneinteractionentreellesnestpossible.Lesvariableslocalespeuventdoncparfaitementporter
unmmenom.LavariableideRepeteCar()nestpasdutoutlammequelavariableiduprogrammeLignes.Ilny
aaucunrisquedaccderlavaleuroudemodifiercelleciparaccidentdelunverslautreprogramme.Ductde
lammoire,lecontenudecesdeuxvariablesestcloisonnetdistinct,desadressesdiffrentes.
EnPHP,unevariabledclaredansleprogrammeprincipaloudansunemthodeestlocaleauprogramme
principal,cestdirenonvisibledepuislesautresfonctions,saufsicestexplicitementprcis.
b.Globales
Ilseraitpourtanttrspratiquedepouvoiraccderunevariabledepuisnimportequelendroitduprogramme,quil
soit principal ou un sousprogramme. Ce mcanisme permettrait dutiliser son contenu et den modifier la valeur
partoutdansleprogramme.Laportedunetellevariablestendraittoutlecode.Cetypedevariablesappelle
unevariableglobaleetelleexistetantenalgorithmiquequedanslaplupartdeslangages.
Unevariableglobaleestdclareendehorsdessousprogrammesetduprogrammeprincipal,avantceuxci,cest
direenpremierdanslalgorithme.tantglobale,elleestaccessibledepartout,tantenaccs(lectureducontenu)
quenmodification(affectationdunenouvellevaleur).Lesvariablesglobalessontdclaresdecettemanire:
Var globales
nbcar:entier
c:caractre
Procdure RepeteCar()
VAR
i:entier
Dbut
Pour i de 1 nbcar Faire
Afficher c
FinPour
FinProc

PROGRAMME LIGNES
VAR
i:entier
DEBUT
c"*"
Pour nbcar de 1 10 Faire
RepeteCar()
FinPour
FIN
Ceprogrammeunefoisexcutdevraitvousafficherquelquechosedecegenre:
*
**
***
****
*****
******
*******
********
*********
**********
Remarquez que les deux variables globales sont modifies dans le programme principal, tandis que le sous
programmeyaccde.
Lavariableglobaleamnetroisremarques:
G Elle nest dclare quune seule fois pour lintgralit du programme. Elle ne doit donc jamais tre
redclaretantdansleprogrammeprincipalquedansunsousprogramme.
G Ellepermetindirectementde"passer"desvaleursauxsousprogrammesquilutilisent.Cestun"dommage
collatral" et les variables globales ne devraient tre rserves que lorsque cellesci sont vraiment
communeslaplusgrandepartieducode.
- 6 - ENI Editions - All rigths reserved
G Il serait ridicule de dclarer toutes les variables en globales. La plupart des programmes et sous
programmesnelesutiliseraientpastoutesetenplusvousrisqueriezparaccident,pensantunevariable
locale,denmodifiercertainessansyprendregardeetainsidemettreenprillexcutionduprogramme.
G Comme corollaire, ne donnez jamais le mme nom une variable locale et globale. Cest interdit en
algorithmique et dans la plupart des langages qui ne manqueront pas de vous le faire remarquer la
compilationoulexcution.
c.VariablesglobalesetPHP
EnPHPlesvariablesnesontpasglobalespardfaut.Sivoussouhaitezaccderetmodifierunevariabledubloc
principalauseindunefonctionvousdevezlindiquerexplicitementauseindelafonctionenprcdantlavariabledu
motclglobal.
<html>
<head><meta/>
<title>portee des variables</title>
</head>
<body>
<?php
function RepeteCar() {
global $c;
for($i=1 ;$i<=20 ;$i++) echo "$c";
echo "<br />";
}
$c=*;
for($nbcar=1;$nbcar<=10;$nbcar++) RepeteCar();
?>
</body>
</html>
6.Lesparamtres
Maintenantquevousrservezlesvariablesglobalesdescasbienprcis,ilvousfauttrouverunautremoyende
passerdesvaleursauxprocduresetauxfonctions.Quandenmathmatiquesvouscalculezlavaleurdunefonctionf
(x),vousluidemandezenfaitdecalculerlavaleurdelafonctionselonlavaleurdex.Vouspassezdonclavaleurdex
lafonction.
Leprincipeestlemmeavecvosalgorithmes:vouspouveztransmettredesvaleursvosprocduresetfonctions,
toutcommevouspouvezenrecevoir.Lasyntaxediffrelgremententrelesfonctionsetlesprocdurespourcette
raison.Danslesdeuxcascependant,lesparamtresseplacententrelesparenthsessituesaprsleurnom.
Les paramtres passs un sousprogramme sont gnralement des variables locales au programme ou sous
programme lappelant, mais ils ne portent pas forcment le mme nom. Ils sont "rcuprs" au sein du sous
programmecommedesvariableslocalesausousprogramme.Ilestcependantpossibledepassercommeparamtre
toute expression retournant une valeur, que ce soit un scalaire, une variable, un tableau, un enregistrement, une
table,ouencoreunefonction(quiserasubstitueparsonrsultat).
a.Procdures
Lasyntaxedepassagedesparamtresestlasuivante:
Procdure nom_proc(E param1:type,ES param2:type,S param3:type)
Lesparamtresduneprocduresontdetroiscatgories:
G Ceuxenentre,quicorrespondentauxvaleursquevoussouhaiteztransmettrelaprocdure.Entreles
parenthses,ilssontprcdsdun"E",commeEntre,carcesontlesvaleursenentredelaprocdure.
G Ceux en sortie, qui correspondent aux valeurs retournes par la procdure au programme ou au sous
programmelayantappel.Ilssontprcdsdun"S",commeSortie,carcesontlesvaleursensortiedela
procdure. Ces paramtres sont des variables qui doivent tre dclares dans le programme ou sous
programmeappelant.
- 7 - ENI Editions - All rigths reserved
G Ceuxenentreetensortie,prcdsde"ES".
Quandvousavezplusieursparamtresenentre,ilsuffitdetouslesmettreaprsleEetmmedelesregrouper
selonleurtype.Cetteprocdureprendcinqparamtres:troisentiersetdeuxchanes.
Procdure proc(E p1,p2,p3:entiers,p4,p5:chanes)
La procdure RepeteCar() se prte bien un paramtre. Comment en effet utiliser une variable globale pour
spcifierlenombredecaractresrpter?Autantpassercenombreenparamtre.Voicileprogrammemodifien
consquence:
Procdure RepeteCar(E nbcar:entier, E c:caractre)
VAR
i:entier
DEBUT
Pour i de 1 nbcar Faire
Afficher c
FinPour
FinProc

PROGRAMME LIGNES
VAR
i:entier
DEBUT
Pour i de 1 10 Faire
RepeteCar(i,"*")
FinPour
FIN
VousrcuprezuneventuellevaleurensortievialaoulesvariablesEouES.Voiciuneprocdurequiconvertitun
nombredesecondesenheures,minutesetsecondes.Elleprendquatreparamtresdontunenentre(lenombre
desecondes)ettroisensortie(heuresminutesetsecondes).
Procdure sec_to_hms(E nbsec:entier, S h,m,s:entiers)
Dbut
hnbsec DIV 3600
nbsecnbsec%3600
mnbsec DIV 60
snbsec MOD 60
FinProcdure

PROGRAMME convert_sec
Var
nb_secondes :entier
heures,minutes,secondes:entiers
Dbut
nb_secondes3950
sec_to_hms(nb_secondes,heures,minutes,secondes)
Afficher heures,minutes,secondes
Fin
Laprocdureprcdentefonctionnecertesmerveille,maisavecunpeuplusderflexion,pourquoinepasutiliser
uneseulestructurepourreprsentertouteslescomposantesduneheure?
Struct hms
heures:entier
minutes:entier
secondes:entier
FinStruct
Unenregistrementpeuttrepassenparamtreduneprocduretoutcommeunevariable,enentreouensortie.
Laprocdureetleprogrammepeuventtreconvertiscommececi:
Types
Struct hms
Passerunenregistrementcommeparamtre
- 8 - ENI Editions - All rigths reserved
heures:entier
minutes:entier
secondes:entier
FinStruct

Procdure sec_to_hms(E nbsec:entier, S duree:hms)


Dbut
duree.heuresnbsec DIV 3600
nbsecnbsec%3600
duree.minutesnbsec DIV 60
duree.secondesnbsec%60
FinProcdure

PROGRAMME convert_sec
Var
nb_secondes:entier
heures:hms
Dbut
nb_secondes3950
sec_to_hms(nb_secondes,heures)
Afficher heures.heures,heures.minutes,heures.secondes
Fin
b.Lesfonctions
LesfonctionsneretournentquuneseulevaleurvialinstructionRetourne.Aussi,ilnyapasbesoindespcifiersi
lesparamtressontenentreouensortie.Ilssontforcmentenentre.Parcontre,lavaleurdelafonctionpeut
tredenimportequeltype.
Voiciunefonctionquifaitlinversedelaprocdureprcdente:ellereoitdesheures,minutesetsecondeeten
contrepartieelleretournelenombredesecondestotal.
Fonction hms_to_sec(heures,minutes,secondes :entiers):entier
Var
total:entier
Dbut
totalheures*3600+minutes*60+secondes
Retourne total
FinFonc
Une fonction peut parfaitement rcuprer un enregistrement comme paramtre. Voici une bonne occasion de
rutiliserletypestructurprcdemmentdfini:
Fonction hms_to_sec(duree:hms):entier
Var
total :entier
Dbut
totalduree.heures*3600+duree.minutes*60+duree.secondes
Retourne total
FinFonc
Enfin, une fonction peut aussi retourner un enregistrement. Ce qui veut dire que la procdure sec_to_hms est
inutile:unefonctionpeutlaremplacer:
Fonction sec_to_hms(nbsec :entier):hms
Var
duree:hms
Dbut
duree.heuresnbsec DIV 3600
nbsecnbsec%3600
duree.minutesnbsec DIV 60
duree.secondesnbsec%60
Retourne duree
FinFonc
Pourcettedernirefonction,lersultatdoittreaffectunenregistrementdemmetype.
PROGRAMME convert_sec2
- 9 - ENI Editions - All rigths reserved
Var
nb_secondes:entier
heures:hms
Dbut
nb_secondes3950
heuressec_to_hms(nb_secondes)
Afficher heures.heures,heures.minutes,heures.secondes
Fin
Une procdure ne retournant quune seule valeur et quel que soit son type est toujours convertible en
fonction. Une telle procdure doit dailleurs toujours tre convertie en ce sens : elle na pas dintrt
autrement.
Pour tester les fonctions sec_to_hms et hms_to_sec, vous pouvez appeler lune avec lautre. Une fonction
reprsentant son rsultat (la valeur de la fonction est le rsultat quelle retourne), elle peut tre utilise comme
paramtreuneautrefonctionsilestypesattendussontcompatibles.
PROGRAMME convert_sec3
Var
nb_secondes1:entier
nb_secondes2:entier
Dbut
nb_secondes13950
nb_secondes2hms_to_sec(sec_to_hms(nb_secondes1))
Si nb_secondes1!=nb_secondes2 Alors
Afficher "Erreur dans lune des fonctions ?"
Sinon
Afficher "Un programme parfait"
FinSi
Fin
c.ParamtresetPHP
LelangagePHPacceptenimportequeltypedeparamtreenargumentdunefonction :typesclassiquescommeles
entiers, ou tableaux, structures (enregistrements), objets. Dans certains cas, ces paramtres peuvent tre en
entreetensortie,quandilssontpasssentantquerfrenceousicesontdesobjets.Lesrfrencesseront
abordesunpeuplusprofondmentdanslechapitreconsacrauxnotionsavancesdontlespointeurs.
Enattendant,touslesexemplesprcdentssontralisablesenPHP,bienheureusement.LaprocdureRepeteCar
()estdonctransformeainsi :
<html>
<head><meta/>
<title>Parametres</title>
</head>
<body>
<?php
function RepeteCar($nbcar, $c) {
for($i=1 ;$i<=$nbcar ;$i++) echo "$c";
echo "<br />";
}
for($nb=1;$nb<=10;$nb++) RepeteCar($nb,*);
?>
</body>
</html>
VoicienPHPunereprisedesstructureshmsetdesfonctionshms_to_sec()etsec_to_hms().Ilnyapasdedifficult
danscetteimplmentation:
<html>
<head><meta/>
<title>fonctions hms</title>
</head>
<body>
<?php

- 10 - ENI Editions - All rigths reserved


class hms {
public $heures;
public $minutes;
public $secondes;
}

function hms_to_sec($duree) {
$total=$duree->heures*3600+$duree->minutes*60+$duree->secondes;
return $total;
}

function sec_to_hms($nbsec) {
$duree=new hms;
$duree->heures=(int)($nbsec/3600);
$nbsec=$nbsec%3600;
$duree->minutes=(int)($nbsec/60);
$duree->secondes=$nbsec%60;

return $duree;
}

// exemple 1
$nb_secondes=39450;
$heures=sec_to_hms($nb_secondes);
echo $heures->heures.":".$heures->minutes.":".$heures->secondes."<br />";

// exemple 2
$nb_secondes1=3950;
$nb_secondes2=hms_to_sec(sec_to_hms($nb_secondes1));
echo "$nb_secondes2<br />";
?>
</body>
</html>
d.Petiteapplicationfonctionnelle
Pourfinir,cesdeuxfonctionssontpluspratiquesquilnyparat.Grceelles,vouspouveztrsfacilementtrouver
letempscoulentreunepremireheureetunesecondeheure.Leprincipeestdesplussimples:
G Voussaisissezdeuxhorairesdansdesenregistrementshms.
G Vouslesconvertissezennombredesecondes.
G Vousfaitesladiffrenceentrecesdeuxnombres.
G Vousconvertissezlersultatenenregistrementhms.
Ditcommececi,celapourraitsemblerunpeucompliqusilesfonctionsnexistaientpas.Vousavezdoncbesoinde
la dfinition du type structur hms et des deux fonctions nbsec_to_hms et hms_to_nbsec. Vous navez mme pas
besoindevariablespouryplacerlesnombresdesecondes.Uneseuleligneaveclesbonsparamtressuffitsen
passer(voyezcelleengras).
Type
Struct hms
heures:entier
minutes:entier
secondes:entier
FinStruct

Fonction hms_to_sec(duree:hms):entier
Var
total:entier
Dbut
totalduree.heures*3600+duree.minutes*60+duree.secondes
Retourne total
FinFonc
- 11 - ENI Editions - All rigths reserved
Fonction sec_to_hms(nbsec :entier):hms
Var
duree:hms
Dbut
duree.heuresnbsec DIV 3600
nbsecnbsec%3600
duree.minutesnbsec DIV 60
duree.secondesnbsec%60
Retourne duree
FinFonc

Programme delta
Var
heure1,heure2,delta:hms
Dbut
Afficher "Saisir lheure de dpart"
Saisir heure1.heures,heure1.minutes,heure1.secondes
Afficher "Saisir lheure de fin"
Saisir heure2.heures,heure2.minutes,heure2.secondes
deltasec_to_hms(hms_to_nbsec(heure2)-hms_to_nbsec(heure1))
Afficher "Il sest coul :"
Afficher delta.heures,delta.minutes,delta.secondes
Fin
Pourquoinepasallerencoreplusloinencrantunefonctionquicalculeseuleladureenfaisantappelauxdeux
autres fonctions ? En effet, vous pouvez parfaitement appeler des sousprogrammes dans dautres sous
programmes,doncdesfonctionsdansdesfonctions,oudesprocduresdansdesfonctionsetrciproquement.Voici
unefonctionhms_deltaquivacalculertoutceci:
Fonction hms_delta(hms1,hms2:hms):hms
Var
delta:hms
Dbut
deltanbsec_to_hms(hms_to_nbsec(hms2)-hms_to_nbsec(hms1))
Retourne delta
FinFonc
Leprogrammeprincipalestmodificommececi:
Programme delta
Var
heure1,heure2,delta:hms
Dbut
Afficher "Saisir lheure de dpart"
Saisir heure1.heures,heure1.minutes,heure1.secondes
Afficher "Saisir lheure de fin"
Saisir heure2.heures,heure2.minutes,heure2.secondes
deltahms_delta(heure1,heure2)
Afficher "Il sest coul :"
Afficher delta.heures,delta.minutes,delta.secondes
Fin
VoicienfinuneimplmentationenPHPdelafonctionhms_delta()etducalculdecedernierexemple.
...
function hms_delta($hms1, $hms2) {
$delta=new hms;
$delta=sec_to_hms(hms_to_sec($hms2)-hms_to_sec($hms1));
return $delta;
}
...

// exemple 3
$heures->heures=10;
$heures->minutes=30;
$heures->secondes=45;
$heures2->heures=18;
$heures2->minutes=36;
- 12 - ENI Editions - All rigths reserved
$heures2->secondes=24;

$delta=hms_delta($heures,$heures2);
echo $delta->heures.":".$delta->minutes.":".$delta->
secondes."<br />";
...
7.Sousprogrammesprdfinis
a.Unchoiximportant
Presquetousleslangagesdeprogrammationproposentdunemanireouduneautrelapossibilitdecrerdes
sousprogrammes.CestlecasduC,duC++,deJava,deC#,PHP,etc.Vouspouvezetvousallezcrervospropres
sousprogrammes,selonlecas.
Cependant,cesmmeslangagessontsouventdjfournisavecunequantitplusoumoinsimportantedesous
programmes. Dans les exemples prcdents, vous en avez dj utiliss. En PHP, les instructions count ou fgets
sont des sousprogrammes, lun charg de compter le nombre dlments dans un tableau, lautre de saisir des
donnes (ou den lire dans un fichier). Le langage PHP propose une quantit impressionnante de sous
programmes:calculsmathmatiques,travauxgraphiques,manipulationsdebasesdedonnes:plusieursmilliers!
Autrement dit, les concepteurs du langage ou dautres personnes fournissent des bibliothques de sous
programmespourrduireautantquepossibleetsanstomberdanslexcs,letravaildesprogrammeurs.Avantde
crervospropressousprogrammes,vrifieztoutdaborddansladocumentationdulangagequevousutilisez,si
vouspouvezytrouvervotrebonheur.
Unsousprogrammeprdfiniporteunnomquirefltesouventcequilfait.Cestuneprocdureouunefonction(cf.
section"Variableslocalesetglobales"decechapitre),plussouventunefonction,quiretourneunrsultat.
b.Quelquesexemples
Vous pouvez obtenir la longueur dune chane de caractres avec la fonctionlongueur. Elle semploie en passant
entreparenthsesunechanedecaractresetretournecommersultatunevaleurentirequiestlenombrede
caractresdecettechane.
Programme len
Var
txt :chane
l :entier
Dbut
txt"Un petit texte"
llongueur(txt)
Afficher l /* affiche 14 */
Fin
Lesfonctions milieu,gauche etdroitepermettentdedcouperdesmorceauxdansunechanedecaractres.La
fonctionmilieuprendtroisvaleursentreparenthses:unechane,unepositiondedbutetunelongueur.Elleest
parfois nomme sschaine (souschane),sutilisant de la mme manire. Les deux autres ne prennent que deux
paramtres : une chane et une longueur. Dans le cas de gauche, cest le nombre de caractres dcouper en
partant de la gauche, pour droite depuis la droite et pour milieu depuis la position indique. Les positions
dmarrent1.Leprogrammesuivantvatoutdabordaffichertouslescaractresdunechane,lesunsaprsles
autres,puislepremiermot,puisledernier.
Programme decoupe
Var
txt :chane
result :chane
i :entier
Dbut
txt="Salut les amis"
Pour i de 1 longueur(txt) Faire
resultmilieu(txt,i,1)
Afficher result // les lettres une une
Fin
Fonctionssurchanes
- 13 - ENI Editions - All rigths reserved
Affiche gauche(txt,5) // Salut
Affiche droite(txt,4) // amis
Fin
La fonctionpos (position) dtermine la position dune chane de caractres dans une autre. Elle trouve donc une
souschanedecaractresdonneetretournesapositionlecaschant,zrosinon.
Programme trouve
Var
ch:chanes
position :entier
Dbut
txt"abcedefghik"
positionpos("def",txt)
Si pos=0 Alors
Afficher "Pas trouv"
sinon
Afficher "A la position",pos
FinSI
Fin
La fonction suppr permet de supprimer une souschane dune chane de caractres en fonction de sa position
initialeetdesalongueur.
Programme suppr
Var
txt :chane
Dbut
txt"abcdefgh"
txtsuppr(txt,4,len(txt)-3)
Affiche txt /* reste abc */
Fin
Tous les langages proposent souvent un grand nombre de fonctions mathmatiques. Dommage pour vous, la
plupartdesexemplesdesdernierschapitresontdesquivalentssousformedefonctions.Cestlecasdesracines
carres,despuissances,desfactorielles,desfonctionstrigonomtriquescommelessinus,cosinusettangente,etc.
G racine(x):donnelaracinecarredex
G puissance(x,y):donnexlapuissancey
G sin(x):sinusdex
G cos(x):cosinusdex
G tan(x):tangentedex
Certainesconventionsalgorithmiquesnereconnaissantpasles%ouMODcommeoprateursmodulos(alorsque
leslangages,eux,si),vouspouveztrouverparfoislafonctionmod(x,y),quiquivautxMODyetlafonctionentier
(x,y)quiquivautxDIVy.
Une fonction trs sympathique est la fonction alatoire(). Elle dtermine un nombre alatoire. Utilise sans
paramtre,elletrouveunrelentre0et1.Utiliseavecunparamtreentier,elletrouveunevaleurentre0etn.
Idalpourunlancerded.
Programme d
Var
d, saisie :entiers
Dbut
dalatoire(5)+1 // entre 1 et 6
Rpter
Afficher "Quelle est la valeur du d ?"
Saisir saisie
Si d<>saisie Alors
Fonctionsmathmatiques
- 14 - ENI Editions - All rigths reserved
Afficher "Rat, essayez encore"
FinSi
Jusqu d=saisie
Afficher "Bravo !"
Fin
Vous pouvez convertir une chane de caractres en valeur numrique laide de la fonction chnum, qui prend
commeparamtrelachanedecaractresetquiretournelavaleurenentierourel(selonlecas).Lachanedoit
treunereprsentationdunevaleurnumriqueetriendautre.
La fonction numch fait exactement le contraire : elle convertit un nombre en chane de caractres, lidal pour
sauvertoutcecidansunfichiertexte.Voiciunexemplesimple:
Programme conversion
Var
rPi :rel
cPi :chane
Dbut
rPi=3.1415927
cPi=numch(rPi)
Afficher cPi
cPi="3.14"
rPi=chnum(cPi)
Fin
Les fonctions prdfinies en PHP sont extrmement nombreuses. Dans les exemples prcdents vous avez eu
loccasion den rencontrer quelquesunes, notamment des conversions de chanes vers des entiers, par exemple.
Lesfonctionsprdfiniessontenfaitsouventassociesdestypesparticuliers,desobjetsparticuliers,etc.Le
mieux est de vous reporter la documentation en ligne de PHP ladresse http://www.php.net/manual/fr/. Voici
quelquescourtsexemplesquipeuventvousintresser:
G strlen():retournelalongueurdelachane.
G substr(chain,dbut[,fin]):dcoupeunmorceaudechane.
G trim():supprimetouslesespacesendbutetfindechane.
G isempty():retournevraioufauxselonquelachaneestvideounon.
Parexemple:
<html>
<head><meta/>
<title>fonctions internes</title>
</head>
<body>
<?php

$txt1=" Bonjour les amis ";


$txt1=trim($txt1);
$valeur=strlen($txt1);
echo "$txt1 de longueur $valeur<br />";

$txt2=substr($txt1,3,5);
echo "$txt2<br />";
?>
</body>
</html>
8.Derniercas:lestableaux
Fonctionsdeconversion
FonctionsprdfiniesenPHP
- 15 - ENI Editions - All rigths reserved
Une fonction peut retourner un tableau seulement si la variable qui la reoit est ellemme un tableau de mme
dimensionetdemmenombredindices.
Demme,ilestpossibledepasseruntableauenparamtredune fonction. Dans ce cas, vous ne connaissez pas
forcment par avance le nombre dlments du tableau, aussi vous pouvez ne rien prciser entre les crochets.
Cependant,silelangagedimplmentationneproposepasdinstructionsoudefonctionsprdfiniespourtrouverla
taille dun tableau, vous devriez passer celleci en paramtre. Quand vous passez un tableau en paramtre dun
sousprogramme,mettezuniquementsonnomsansutiliserlescrochets.
Denombreuxexemplessontpossibles.Parmieux,pourquoinepastrieruntableau?Reprenezlundesalgorithmes
detriduchapitreprcdent,commeletriparinsertionetadaptezlepourletransformerenfonction:
Fonction tri_tableau(t:tableau[] dentiers,nb:entier) :tableau[] dentiers
VAR
i,mem:entiers
DEBUT
Pour i de 1 nbelem faire
memtab[i]
posi-1
tant que tab[pos]>mem et pos>=0 Faire
tab[pos+1]tab[pos]
pospos-1

FinTantQue
tab[pos+1]mem
FinPour
FinFonc
Voiciunpetitprogrammepourlexploiter:
PROGRAMME TRITAB
CONST
INDICES=10
VAR
t :tableau[1..INDICES] {10,5,8,7,3,1,6,9,4,2} dentiers
i :entier
Dbut
t=tri_tableau(t,INDICES)
Pour i de 1 INDICES Faire
Afficher t[i]
FinPour
Fin
En PHP cest encore plus simple : la taille des tableaux passs en paramtres na pas dimportance. Vous pouvez
facilementobtenirlatailleduntableauaveclafonctioncount().Lafonctiontri_tableau()nereoitdoncquunseul
paramtre,letableautrieretnestmmepasobligederetournerletableaucarilestpassenrfrence.
<html>
<head><meta/>
<title>Fonction de tri de tableau</title>
</head>
<body>
<?php

// attention passage par rfrence


function tri_tableau(&$tab) {

$cpt=count($tab);

for($i=1;$i<$cpt;$i++) {
$mem=$tab[$i];
$pos=$i-1;
while(($pos>=0) && ($tab[$pos]>$mem)) {
$tab[$pos+1]=$tab[$pos];
$pos--;
}
$tab[$pos+1]=$mem;
}
}

- 16 - ENI Editions - All rigths reserved

$t=array(48,17,25,9,34);
$cpt=count($t);

echo "Avant :";


for($i=0;$i<$cpt;$i++) echo $t[$i]." ";
echo "<br />";

tri_tableau($t);

echo "Apres :";


for($i=0;$i<$cpt;$i++) echo $t[$i]." ";
echo "<br />";

?>
</body>
</html>
Lersultatestlesuivant:
Avant :
48 17 25 9 34
Aprs :
9 17 25 34 48
- 17 - ENI Editions - All rigths reserved
Algorithmesavancs
1.Lesalgorithmesdestris
a.Leprincipe
Vousavezpuvoirdanslesexemplesprcdentslintrtdestableauxpourlestockagedevaleursmultiples.Mais
suivant le cas, il peut tre utile davoir besoin dobtenir une liste ordonne de valeurs par ordre croissant ou
dcroissant.Autrementdit,vousvouleztrierlecontenudutableau.Prenezlecasdunprofesseursouhaitanttrierles
notesdeseslvesdelaplusbasselaplushaute,oudesrsultatsduntiragedulotopourlerendrepluslisible.
Imaginezuntiragedulotodecinqnumros,videmmenttousdiffrents,dontlesvaleursstalent entre 1 et 49.
Voiciltatinitialdutableausuiteautirageausort:
Il existe plusieurs mthodes permettant de trier ces diffrentes valeurs. Elles ont toutes leurs qualits et leurs
dfauts. Ainsi une mthode sera lente, lautre sera plus gourmande en mmoire et ainsi de suite. Cest leur
complexitquidtermineleurusagenotammentpourdegrandesplagesdevaleurs.
Danslesalgorithmessuivants,lavariableCptcontientlenombredlmentsdutableauinitialett[]estletableau.
Ilestintressantdeprendreencomptelacomplexitdecesdiversalgorithmes,bienquecettenotion,prsenteau
premierchapitre,nesoitgnralementpas(oupeu)abordedanslespremiresannesdtudeseninformatique.
Les algorithmes ont souvent une complexit proche. Pourtant lusage un tri shell est plus rapide quun tri par
slection,toutdpendantdunombredlmentsetlventuelordredeceuxciaudpart.
b.Letriparcration
Letriparcrationneseraabordquedupointdevuethorique.Eneffetsicettemthodesemblesimple,elleest
en fait lourde et complique. Si on demande un dbutant en programmation comment trier un tableau, il vous
proposeratrscertainementdecrerundeuximetableaudanslequelonplaceraaufuretmesureleslments
dupremiertableaudanslordrecroissant.
Cestunetrsmauvaiseidepourdemultiplesraisonsdont:
G Lajoutdunsecondtableaudoublelammoirencessaire.
G Larecherchedupluspetitlmentestpluscompliquequonnelepensecarchaquepassage,ilnefaut
pasreprendreceuxdjsortisetcestcompliqu.
G Le nombre de boucles et de recherches est important. La complexit de lalgorithme rsultant aussi,
suprieureauxautres.
Pourtoutescesraisons,letriparcrationnedoitabsolumentpastreutilis.
c.Letriparslection
Letriparslectionesttrssimple:ilconsisteslectionnerdansletableaulapluspetitevaleuretdelapermuter
avec le premier lment du tableau, puis la deuxime plus petite valeur (hors premier lment) et de la permuter
avecledeuximelmentdutableauetainsidesuite,etcelapourtousleslmentsdutableau.Voicilestapes
ncessairesdepuislexemplegnral:
G tape1:lapluspetitevaleurest9,onpermute9et48.
48 17 25 9 34
48 17 25 9 34
9 17 25 48 34
- 1 - ENI Editions - All rigths reserved
G tape2:lapluspetitevaleursuivanteest17,djlabonneposition,onpasselasuivante.
G tape3:lapluspetitevaleursuivanteest25,djlabonneposition,onpasselasuivante.
G tape4:lapluspetitevaleursuivanteest34,onpermute34et48.Letableauesttri.
Si le principe est simple, lalgorithme rsultant ncessite malheureusement la recherche dans tout ou partie du
tableau de la plus petite valeur possible et ce sans grande optimisation possible. On peut par contre viter de
permuterdesvaleurssiaucunevaleurinfrieurenattrouve.Voicilalgorithme:
PROGRAMME SELECTION
VAR
temp,i,j,min,Cpt:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Pour i de 1 Cpt-1 Faire
mini
Pour j de i+1 Cpt
Si t[j]<t[min] alors
minj
FinSi
FinPour
Si min<>j alors
tempt[min]
t[min] t[i]
t[i] temp
FinSi
FinPour
FIN
chaquepassagedanslaboucle,oneffectueunecomparaisondemoinsquelorsdupassageprcdent.Lenombre
totaldepassagesestdoncde(n1)+(n2)+(n3)etainsidesuitesoitunecomplexitdelalgorithmeden(n1)/2ce
quidveloppdonneunecomplexitdordreO(n).
VoicilecodePHPcorrespondant:
<html>
<head><meta/>
<title>tri par selection</title>
</head>
<body>
<?php

$t=array(27,44,12,18,23,19,101,54,29,77,52,88,10,32);

$cpt=count($t);
for($i=0;$i<$cpt-1;$i++) {
$min=$i;
for($j=$i+1;$j<$cpt;$j++) {
if($t[$j]<$t[$min]) $min=$j;
}
if($min!=$i) {
$temp=$t[$min];
$t[$min]=$t[$i];
$t[$i]=$temp;
}
for($j=0;$j<$cpt;$j++) echo $t[$j]." ";
9 17 25 48 34
9 17 25 48 34
9 17 25 34 48
- 2 - ENI Editions - All rigths reserved
echo "<br />";
}
?>
</body>
</html>

}
d.Letribulles
Letribullesaunlointainrapportaveclechampagneetlesboissonsgazeuses.Lebutestqueparpermutations
successivesdesvaleursvoisines,lesvaleurslespluslevesremontentverslesderniresplacesdutableau,tandis
que les valeurs les plus basses migrent vers les premires places. Pour trier dans un ordre croissant, il faut que
chaque valeur dun lment du tableau soit plus petite que celle de llment qui suit (sauf pour le dernier, bien
entendu).Voiciunesimulationpaspasdupremierpassage:
G tape1:48estsuprieur17,onpermute :
G tape2:48estsuprieur25,onpermute :
G tape3:48estsuprieur9,onpermute :
G tape4:48estsuprieur34,onpermute :
lissuedecepremierpassage,vousremarquezquelavaleurlaplusleveestdjendernireplacedutableau
mais que le tableau nest pas entirement tri. Aussi, il faut effectuer plusieurs passages en vrifiant chaque
passage si des permutations ont eu lieu. Quand au moins une permutation a eu lieu lors dun passage, il faut en
relancerunautre.Ainsi,ilfautmettreenplaceundrapeau(flag)indiquantsiunepermutationaeulieuounon.Voici
lesrsultatsaprslespassagessuccessifs:
G Passe1:
G Passe2:
G Passe3:
Lastructureglobaledelalgorithmeestdonc:
PROGRAMME TRIBULLE
VAR
17 48 25 9 34
17 25 48 9 34
17 25 9 48 34
17 25 9 34 48
17 25 9 34 48
17 9 25 34 48
9 17 25 34 48
- 3 - ENI Editions - All rigths reserved
Permut :boolen
temp,Cpt,i:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Permutvrai
TantQue Permut Faire
PermutFaux
Pour i de 1 Cpt-1 Faire
Si t[i]>t[i+1] alors
tempt[i]
t[i]t[i+1]
t[i+1]t[i]
PermutVrai
FinSi
FinPour
FinTantQue
FIN
Cependantsivousimplmentezcetalgorithmedansunquelconquelangage,vousallezvousapercevoirqueceluici
dansnotrecasprciseffectueunepassedetrop.Eneffet,dsletroisimepassage,letableauesttrietpourtant
leprogrammecontinue.Cestquelorsdecepassage,lalgorithmeaeffectuunepermutationdesdeuxpremires
valeurs 17 et 9. Partant de ce fait, lindicateur de permutation est pass Vrai et donc une nouvelle boucle est
relance. Comme il nest pas possible de prvoir lavance le nombre de permutations restantes, lalgorithme
montreseslimitesdanscecasprcis.
Sinestlenombredlmentsdutableau,lalgorithmeeffectuen1bouclesTantQue etn1bouclesPoursoit(n1)
boucles ce qui se dveloppe en n2n+1. La complexit est dordre O(n). Autrement dit la complexit de cet
algorithmeestleve.
Remarquezaussiquecetalgorithmebalaiequoiquilarrivetouteslesvaleursdutableaualorsquonsaitdjqula
premirepasseladernirevaleurestlaplusleve,qulasecondepasselesdeuxderniresvaleurssontlesplus
levesetainsidesuite.Ilestdoncpossibledoptimiserlalgorithmeendcrmentantde1labouclePourchaque
nouvellepasse.
...
DEBUT
...
Permutvrai
Cpt5
TantQue Permut Faire
...
Pour i de 1 Cpt-1
...
FinPour
CptCpt-1
FinTantQue
FIN
La complexit de cet algorithme est un peu moins leve. En effet on effectue une boucle de moins chaque
passage. La complexit est cependant toujours en O(n) : au premier passage il y a (n1) comparaisons, au
deuximepassage(n2),autroisime(n3)etainsidesuite.Onobtientdoncunecomplexitde(n1)+(n2)+(n3)+
+1soitn(n1)/2etdoncnn/2.Cestidentiqueautriparslection.
LecodePHPcorrespondantestlesuivant:
<html>
<head><meta/>
<title>tri bulle</title>
</head>
<body>
<?php

$t=array(14,13,12,11,10,9,8,7,6,5,4,3,2,1);

$Permut=true;

$cpt=count($t)-1;

while($Permut) {
for($i=0;$i<count($t);$i++) echo $t[$i]." ";
- 4 - ENI Editions - All rigths reserved
echo "<br />";
echo "->";
Permut=false;

for($i=0;$i<$cpt;$i++) {
if($t[$i]>$t[$i+1]) {
$temp=$t[$i];
$t[$i]=$t[$i+1];
$t[$i+1]=$temp;
$Permut=true;
}
}
$cpt--;
for($i=0;$i<count($t);$i++) echo $t[$i]." ";
echo "<br />";
}
?>
</body>
</html>
e.Letriparinsertion
Letriparinsertionconsisteslectionnerunlmentdutableauetlinsrerdirectementlabonnepositiondans
lapartiedutableaudjtrie.Onprocdeentroistapes:
G Onplacellmenttrierdansunevariabletemporaire.
G Tantqueleslmentsdutableauquiprcdentllmenttrierluisontsuprieurs,ondcaleceslments
dunepositionenrcuprantlespacevidelaissparllmenttrier.
G Oninsreensuitelavariabletemporairelanouvellepositionlaissevacanteparledcalage.
Voicilesdiffrentestapespourletableauexemple:
G tape1:ledeuximelment17estplacdansunevariabletemporairequiestcompareauxlmentsqui
leprcdent.Chacunestdcaltantquilestsuprieurllmenttrier.
G tape2:25estcomparauxlmentsquileprcdentetchacunestdcaljusqucequellmentne
soitplussuprieurautroisime.
G tape3:9estcomparauxlmentsquileprcdent.Icicommedansltape1onsarrteforcmentau
premierlment.
G tape4:34estcomparauxlmentsquileprcdent.Seul48luiestsuprieur.
48 17 25 9 34 48 25 9 34 17 48 25 9 34
17entemporaire Dcalagede48 17lanouvelleposition
17 48 25 9 34 17 48 9 34 17 25 48 9 34
25entemporaire Dcalagede48 25lanouvelleposition
17 25 48 9 34 17 25 48 34 9 17 25 48 34
9entemporaire Dcalagede17,25et48 9lanouvelleposition
- 5 - ENI Editions - All rigths reserved
Lalgorithme rsultant est assez simple. Seule la boucle de dcalage peut tre un peu plus ardue comprendre.
Chaquelmentestdcalversladroite(oulebasselonlareprsentationquonsenfait)dutableautantquilest
suprieurllmentrecherch.
PROGRAMME TRINSERTION
VAR
i,mem,pos:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Pour i de 1 Cpt faire
memt[i]
posi-1
tant que pos>=0 ET t[pos]>mem Faire
t[pos+1]t[pos]
pospos-1
FinTantQue
t[pos+1]mem
FinPour
FIN
Commesouvent,lacomplexitvarieselonlordreinitialdeslmentsdansletableautrier.Cependantdanslepire
descas,oneffectue(n1)bouclesdanslesquellesoneffectueunemoyennede(n2)/2changesetdoncuntotalde
(n1)(n2)/2.OnobtientunecomplexitdordreO(n). Cependantoneffectueenmoyenneseulementlamoitides
comparaisons (dans lexemple cidessus, six comparaisons sont effectues alors que dix auraient pu tre
effectues).Lacomplexitestalorsbienmoindre.Danslapratique,untriparinsertionestgnralementplusrapide
quelestrisbullesetparslection.
UnepetiteremarqueconcernantlecodePHP.Sivousfaites:
while($t[$pos]>$mem && $pos>=0)
Lexpressionestvaluedegauchedroite.Vousallezavoiruneerreurunmomentdonn:quandposvaut0,
labouclesuivanteilvaut1.OrsiunlangagecommeleCpermetdedborderlesindices(aucunevrificationnest
effectue),JavaetPHPnelepermettentpasetcausentuneexceptionquistoppeleprogrammeavecuneerreur.
Aussi,ilfautdabordtesterlavaleurdeposAVANTdevrifierlecontenudutableaucetindice.
while($pos>=0 && $t[$pos]>$mem)
LecodecorrespondantenPHPestlesuivant:
<html>
<head><meta/>
<title>tri par insertion</title>
</head>
<body>
<?php

$t=array(48,17,25,9,34);
$cpt=5;

for($i=1;$i<$cpt;$i++) {
$mem=$t[$i];
$pos=$i-1;
while(($pos>=0) && ($t[$pos]>$mem)) {
$t[$pos+1]=$t[$pos];
$pos--;
}
$t[$pos+1]=$mem;
for($j=0;$j<$cpt;$j++) echo $t[$j]." ";
echo "<br />";
}
?>
</body>
9 17 25 48 34 9 17 25 48 9 17 25 34 48
34entemporaire Dcalagede48 34lanouvelleposition
- 6 - ENI Editions - All rigths reserved
</html>
f.LetriShell
Le tri Shell est une variante du tri prcdent qui a t propos par Donald L. Shell en 1959 (il ny a donc aucun
rapportavecleshellUnixouWindows).Danscetypedetri,leslmentsnesontplusdcalsdeununmaispar
pasplusimportant.Lapermutationseffectueenfonctiondecepas.Unefoislespermutationsdecepaseffectues,
lepasestrduit.Quandlepasatteint1,letriShelldevientun"bte"triparinsertion.Aufinal,letriShellconsiste
dgrossirunmaximumletableautrierenplaantdslespremierspassagesleplusdlmentspossiblesdansles
bonnes parties du tableau. Dans un tableau dune dizaine dlments, la moyenne des lments de la premire
partiedutableauestplusbassequecelledeladeuximepartie,dslepremierpassage.
Au final, le tri Shell est dune complexit O(n
2
) mais se rvle tre plus rapide dans la majorit des cas. Cest
lalgorithmedetrileplusutilis.
Prenezuntableaudedixlments:
Etunpasde4:
G tape1:t[1]ett[5]sontcomparsetventuellementpermuts :
G tape2:t[2]ett[6]sontcomparsetventuellementpermuts :
G tape3:t[3]ett[7]sontcomparsetventuellementpermuts :
G tape4:t[4]ett[8]sontcomparsetventuellementpermuts :
G tape5:t[5]ett[9]sontcomparsetventuellementpermuts :

Lepasnedoitpastrecalculauhasardcarcestdeluiquedpendlefficacitdelalgorithme.Laformuleutilise
parlalgorithmeestgnralement:
U
(n+1)
=3
Un
+1avecU
0
=0

PROGRAMME TRISHELL
VAR
cpt,n,i,j,tmp:entiers
t:tableau[1..10] dentiers
DEBUT
cpt10
n0
TantQue n<cpt Faire
n3*n+1
FinTantQue

8 4 6 9 7 1 3 2 0 5
7 4 6 9 8 1 3 2 0 5
7 1 6 9 8 4 3 2 0 5
7 1 3 9 8 4 6 2 0 5
7 1 3 2 8 4 6 9 0 5
7 1 3 2 0 4 6 9 8 5
- 7 - ENI Editions - All rigths reserved
TanQue n<>0 Faire
nn/3
Pour i de n cpt-1 Faire
tmpt[i]
ji
TantQue j>n-1 ET t[j-n]>tmp
t[j] t[j-n]
jj-n
FinTantQue
t[j] tmp
FinPour
FinTantQue
FIN
SoitenPHP:
<html>
<head><meta/>
<title>tri shell</title>
</head>
<body>
<?php

$t=array(48,17,25,9,34,12,28,1,4,98,0,33,48,10,11,9,25);

$n=0;
$cpt=count($t);

while($n<$cpt) $n=3*$n+1;

while($n!=0) {
$n=(int)($n/3);
for($i=$n;$i<$cpt;$i++) {
$mem=$t[$i];
$j=$i;
while($j>($n-1) && $t[$j-$n]>$mem) {
$t[$j]=$t[$j-$n];
$j=$j-$n;
}
$t[$j]=$mem;
}
for($j=0;$j<$cpt;$j++) echo $t[$j]." ";
echo "<br />";
}
?>
</body>
</html>
2.Recherchepardichotomie
Larecherchepardichotomienesappliquequesurlestableauxdjtris.Vousavezdjrencontrunalgorithmede
recherchedlmentdansuntableaunontri.Maisceluiciposeunproblme:siletableaucontient10 000lments
etqueparpurhasardceluiquevouscherchezestle10000
me
,ilfautbalayerlintgralitdutableau.Cetterecherche
squentiellenestpasidale.
Dansuntableautri,laproblmatiqueestradicalementdiffrente.Rienquavecunerecherchesquentielle,ildevient
inutiledebalayertoutletableau:ilsuffitdesarrterdsquelavaleurdellmentdutableaudevientsuprieure
cequonrecherche,douneprobablecomplexitmoyenneplusbasse.Maisilresteunesolutionplusefficace.
Ladichotomieconsistediviserpardeuxlintervallederecherchetantquellmentrecherchnestpastrouv.Sur
untableautde10lmentstris:
Vousvoulezsavoirsilavaleur20estprsentedansletableau.
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
- 8 - ENI Editions - All rigths reserved
G tape1:Calculerlindicesituaumilieudutableau.Lindicededbutest1,lindicedefinest10,lemilieuvaut
dbut+fin/2.Commecettevaleurnestpasforcmententireonrcupreladivisionentire:(dbut+fin)DIV
2.Ici5.
G tape2:Comparerlavaleurt[5]avec20.tantinfrieure,celaveutdirequelavaleur20estforcmentau
deldelindice5.OnpositionneDbut6etonrecalcule(dbut+fin)DIV2.Ici8.
G tape 3 : Comparer la valeur t[8] avec 20. tant infrieure, cela veut dire que la valeur 20 est audel de
lindice8.OnpositionneDbut9etonrecalcule.Onobtient9.
G tape4:Comparert[9]avec20.Lesvaleurssontidentiques,larechercheesttermine.
LarecherchedoitcontinuertantqueDbutestinfrieurougalFinetquellmentrecherchnapasttrouv.
PROGRAMME DICHOTOMIE
VAR
t:tableau[1..10] dentiers
d,m,f,rech:entiers
DEBUT
rech18
d1
f10

Rpter
m(d+f) DIV 2
Si rech>t[m] Alors
dm+1
Sinon
fm-1
FinSi
TantQue d<=f ET rech<>t[m]
Si rech=t[m] Alors
Afficher "Trouv"
Sinon
Afficher "Absent"
FinSi
FIN
LecodecorrespondantenPHPestlesuivant:
<html>
<head><meta/>
<title>Recherche dichotomique</title>
</head>
<body>
<?php

$t=array(2,7,9,10,11,14,17,18,20,22);

Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
- 9 - ENI Editions - All rigths reserved
$rech=14;
$d=0;
$f=count($t)-1;

do {
$m=(int)(($d+$f)/2);
echo "d=$d, f=$f, m=$m t[m]={$t[$m]}<br />";
if($rech>$t[$m]) $d=$m+1;
else $f=$m-1;

} while($d<=$f && $rech!=$t[$m]);

if($rech==$t[$m]) echo "$rech trouv la position $m";


else echo "$rech na pas t trouv";
?>
</body>
</html>
- 10 - ENI Editions - All rigths reserved
Manipulationssimples
1.Recherchedunlment
Vousdisposezduntableaudenlmentscorrespondantauxprnomsdevosamisetvousvoulezsavoirsilunde
ceuxciestbienprsentdansvotretableau.Ilfautalorslerechercher.Leprincipeconsistebalayerlintgralitdu
tableau laide dune structure itrative et en sortir ds que llment a t trouv ou que le nombre maximal
dindiceatdpass.lasortiedelaboucle,ilfaudradenouveauvrifierpoursavoirsiouiounonllmentat
trouv:ilsepeuteneffetquetoutletableauaittparcouruetquecesoitlaraisondelasortiedelaboucle.
PROGRAMME RECHERCHE
VAR
Tableau noms:tableau[1..10] de chanes
rech:chane
i:entier
DEBUT
i1
Tant que i<=10 et noms[i]<>rech Faire
ii+1
FinTantQue
ii-1
Si nom[i]=Rech Alors
Afficher "Trouv"
Sinon
Afficher "Absent"
FinSi
FIN
Ilyalapossibilitdefairediffremmentavecundrapeau:
PROGRAMME RECHERCHE2
VAR
Tableau noms:tableau[1..10] de chanes
Rech:chane
i:entier
trouve:boolen
DEBUT
i1
trouveFAUX
Tant que i<=10 et trouve=FAUX Faire
Si nom[1]=rech Alors
trouveVRAI
FinSi
ii+1
FinTantQue
Si trouve Alors
Affiche "Trouv"
Sinon
Affiche "Absent"
FinSi
FIN
EnPHP:
<html>
<head><meta/>
<title>Recherche</title>
</head>
<body>
<?php

$t=array(10,20,14,25,17,8,10,12,15,5,41,19,2,6,21);
$i=0;
$trouve=false;
$rech=15;
- 1 - ENI Editions - All rigths reserved

while($i<count($t) && !$trouve) {


if($t[$i]==$rech) $trouve=true;
$i++;
}

if($trouve) echo "Trouv la position ".($i-1)."\n";


?>
</body>
</html>
2.Leplusgrand/petit,moyenne
Dans le chapitre prcdent, vous avez eu loccasion de dterminer la plus petite et la plus grande dune srie de
notessaisiesparlutilisateur. Il sagitcettefoisdefairelammechoseaveclestableaux.Leprincipeestlemme
saufqueladonnenevientpasdunesaisiedelutilisateurmaisdutableau.Voiciunexemplepouruntableaudedix
lments:
PROGRAMME MINMAXMOY
VAR
Notes:tableau[1..10] de rels
min,max,moy:rels
i:entier
DEBUT
minnotes[1]
maxnotes[1]
moy0
Pour i de 1 10 faire
Moy=moy+note[i]
Si note[i]>max Alors
Maxnote[i]
FinSi
Si note[i]<min Alors
Minnote[i]
FinSi
FinPour
Moymoy/10
Afficher min,max,moy
Fin
EnPHP:
<html>
<head><meta/>
<title>Min, max, moy</title>
</head>
<body>
<?php
$notes=array(10,20,14,11,17,8,10,12,15,5,16,19,2,6,0);
$min=$notes[0];
$max=$notes[0];
$moy=0;

for($i=0;$i<count($notes);$i++) {
$moy+=$notes[$i];
if($notes[$i]>$max) $max=$notes[$i];
if($notes[$i]<$min) $min=$notes[$i];
}
$moy/=count($notes);

echo "$min, $max, $moy";


?>
</body>
</html>
- 2 - ENI Editions - All rigths reserved
3.Lemorpion
Le jeu du morpion ou tictactoe consiste aligner des ronds ou des croix en ligne, colonne ou diagonale sur un
plateaude3x3cases.Lepremierjoueurquialignesespionsagagn.Sanscrericiuneintelligenceartificiellepour
jouer,lalgorithmevademanderchaquejoueurtourderledindiquerlescoordonnesx(ligne)ety(colonne)o
mettre son pion, puis va dterminer si le joueur gagne ou non. Cet algorithme est un peu plus compliqu quil ny
parat:
G Letableaudisposededeuxdimensions,3x3.
G Ilfautauseindunebouclepermuterlesjoueurs.
G Siunepositionestdjoccupe,ilfautdenouveauposerlaquestion.
G Aprschaquecoup,ilfautvrifiertoutesleslignes,colonnesetdiagonales.
G Siuneligne,colonne,diagonaleestcomplte,onsortdelaboucle.
G Encasdevictoire,ilfautindiquerquelpion(x,o)agagn.
G Ilfautgrerlematchnul:neuftoursetpersonnenagagn.
Leprogrammequisuitnestpasoptimis,demaniretoutfaitvolontaire,afindeforcerlamanipulationdesindices
detableauxdeuxdimensions:
PROGRAMME MORPION
VAR
p:tableau[1..3][1...3] de caractres
i,j,x,y,nbtours:entiers
pion :caractre
gagne:boolen
DEBUT
/* Initialisation du plateau : que des blancs */
Pour i allant de 1 3 Faire
Pour j allant de 1 3 Faire
p[i][j]" "
FinPour
FinPour

gagneFAUX
nbtour0
/* Boucle de jeu */
Rpter

/* Changement du pion (joueur) */


Si pion<>"o" Alors
Pion"o"
Sinon
Pion"x"
FinSi

/* Affichage du plateau */
Pour i allant de 1 3 Faire
Afficher p[i][1],p[i][2],p[i][3]
FinPour

/* Saisie des coordonnes */


Rpter
Afficher "Coordonnes ? (x,y)"
Saisir x,y
Jusqu x>=1 ET x<=3 ET y>=1 ET y<=3 ET p[x][y]=" "

/* Mise en place du pion */


p[x][y] pion

- 3 - ENI Editions - All rigths reserved


/* Vrification en ligne */
i1
Tant que i<=3 ET NON gagne
Si p[i][1]!=" " ET p[i][1]=p[i][2] ET p[i][1]=p[i][3] alors
gagneVRAI
FinSi
ii+1
FinTantQue

/* Vrification en colonne */
si NON gagne Alors
i1
Tant que i<=3 ET NON gagne
Si p[1][i]!=" " ET p[1][i]=p[2][i] ET p[1][i]=p[3][i] alors
gagneVRAI
FinSi
ii+1
FinTantQue
FinSi

/* Vrification des deux diagonales */


Si NON gagne Alors
Si p[1][1]!=" " ET ((p[1][1]=p[2][2] ET p[1][1]=p[3][3]) OU (p[1][3
]=p[2][2] ET p[1][3]=p[3][1])) Alors
GagneVRAI
FinSi
FinSi
nbtoursnbtours+1 ;
Jusqu gagne=VRAI OU nbtour=9
Si gagne Alors
Afficher pion," a gagn !"
Sinon
Afficher "Personne ne gagne."
FinSi
FIN
Comme indiqu, ce programme nest pas optimis. Ainsi les boucles et tests qui dterminent si les lignes et les
colonnes sont gagnantes font appel des indices statiques. Or si vous souhaitiez par exemple tendre cet
algorithmeun"Puissance4"quiestfondamentalementlammechose,vousauriezdestestsrallonge.
Voici le rsultat en PHP, laffichage ayant t lgrement amlior et les coordonnes adaptes en fonction des
indicesdestableauxdmarrant0.
<?php

$x=0; $y=0; $nbtours=0;


$pion= ;
$tx=""; $ty="";

/* initialisation du tableau */
for($i=0;$i<3;$i++) {
for($j=0;$j<3;$j++) {
$p[$i][$j]= ;
}
}
$gagne=false;

/* boucle principale */
do {
if($pion!=o) $pion=o; else $pion=x;

/* saisie des coordonnees */


do {
/* plateau */
echo " 1 2 3\n";
for($i=0;$i<3;$i++) {
echo ($i+1)."|".$p[$i][0]."|".$p[$i][1]."|".$p[$i][2]."|\n";
}
echo "Au tour de $pion\n";
echo "Coordonnees x";
- 4 - ENI Editions - All rigths reserved
$x=(int)fgets(STDIN)-1;
echo "Coordonnees y";
$y=(int)fgets(STDIN)-1;
}while($x<0 || $x>2 || $y<0 || $y>2 || $p[$x][$y]!= );

$p[$x][$y]=$pion;

/* ligne */
$i=0;
while($i<3 && !$gagne) {
if($p[$i][0]!= && $p[$i][0]==$p[$i][1] &&
$p[$i][0]==$p[$i][2]) $gagne=true;
$i++;
}

/* colonne */
$i=0;
while($i<3 && !$gagne) {
if($p[0][$i]!= && $p[0][$i]==$p[1][$i] &&
$p[0][$i]==$p[2][$i]) $gagne=true;
$i++;
}

/* deux diagonales */
if($p[1][1]!= &&
(($p[0][0]==$p[1][1] && $p[0][0]==$p[2][2]) ||
($p[0][2]==$p[1][1] && $p[0][2]==$p[2][0]))) $gagne=true;

$nbtours+=1;

}while(!$gagne && $nbtours!=9);

/* plateau */
echo " 1 2 3\n";
for($i=0;$i<3;$i++) {
echo ($i+1)."|".$p[$i][0]."|".$p[$i][1]."|".$p[$i][2]."|\n";
}

if($gagne) echo "$pion gagne !";


else echo "Personne ne gagne.";
?>
- 5 - ENI Editions - All rigths reserved
Prsentation
1.Principeetdfinition
a.Simplifierlesvariables
Jusqu prsent, les types de donnes que vous avez rencontrs sont des scalaires, sauf pour les chanes de
caractres. Pour rappel un scalaire est un type de donne qui ne reprsente quune seule variable la fois. Un
entier,uncaractre,unrel,unboolen,etc,sontdesscalaires.Unechanedecaractresnon:ilsagitdunesuite,
ouliste,decaractres,lesunsaprslesautres.Unechaneestdoncunelisteordonneparvossoinsdescalaires.
Leslangagesproposentsouventuntypepourleschanesdecaractres,maiscestunefacilitofferteparceuxci.
UnlangagecommeleCnenproposepas.Enalgorithmique,vousutilisezletype"Alphanumrique",ilvousfaudra
alorsfaireattentionlorsdelaconversionenC.
Maisalorscommentsereprsenterunechanedecaractresavecuntypescalaire?Ilfautpourcelaserappeler
comment sont places en mmoire les informations. La mmoire de lordinateur est compose de cases pouvant
contenir certaines informations. Ces cases sont numrotes (on parle dadresse de la case) et contiennent des
donnes. Ces donnes reprsentent ce que vous voulez selon le contexte de leur utilisation. Vous pouvez par
exemplepartirduprincipequellescontiennentdesscalaires.Siunecasemmoirecontientlenombre65,cepeut
trelavaleurentire65ouencorelecodeASCIIducaractre"A".Unecasemmoirepeutparfaitementcontenir
ladresseduneautrecasemmoire:cestunpeupluscompliququecelaenalairetceseralobjetdunpluslong
exposdanslasuitedecetouvrage.
UnechanedecaractresestdoncunesuitedescalairesdetypeCaractre,lesunsderrirelesautresdansdes
casesmmoiresenprincipescontigus.Selonlemmeprincipe,sivousreprenezlexempledelasaisiedesnotes
dtudiants, ne pensezvous pas quil serait plus pratique de pouvoir conserver ces notes pour la suite du
programme ? Il serait alors possible de les rutiliser volont pour de nouveaux calculs, voire mme pour les
sauverdansunfichier,lesimprimer,lesconsulter,etc.
Jusqu prsent, le seul moyen dont vous disposiez tait de faire une boucle de saisie de notes et dedans, de
tenterdefairelescalculsaufuretmesure.Lautrepossibilittaitdeposernfoislammequestionetdeplacer
lesrsultatsdansnvariablesdiffrentes.Imaginezceci:
...
Lire N1
Lire N2
...
Lire N20
Moy(N1+N2+...+N20)/20
...
Ridicule,nestcepas?Maintenant,sivoussavezquilyavingtlvesdansuneclasseetdoncvingtnotessaisir,
neseraitilpasplussimplederemplacertouteslesvariablesparuneseule,maisquipourraitcontenirtoutesles
notes?Lideseraitdoncdavoirunnomdevariablemaisquipourraitassocierunenoteunnumro.Prenezla
variable"note".Ilsuffiraitalorsdedireque"note1vaut15,note2vaut17,note3vaut8,etc.".
Unensembledevaleursreprsentparlemmenomdevariableetochaquevaleurestidentifieparunnumro
sappelle un tableau. Le numro qui sert identifier un lment (une valeur) du tableau sappelle un indice. En
reprsentation algorithmique, un lment du tableau est reprsent par le nom de la variable auquel on accole
lindiceentrecrochets:
Note[1]15
Un tableau nest pas un type de donnes, mais une liste dlments dun type donn. On parlera dun
tableaudenlmentsdetypenumrique,oualphanumrique,etc.
b.Lesdimensions
Faitescourirunpeuplusvotreimagination:maintenantvousaveztroisclassesdevingtlves.Devezvousutiliser
troistableaux?Cequilyadebienaveclestableaux,cestquelonpeutajouterdesindicesauxindices.Cesttrs
facileapprhenderavecdeuxindices.
Note[1][10]17
- 1 - ENI Editions - All rigths reserved
Ceci pourrait (au conditionnel car soumis aux contraintes de la numrotation des lments) se traduire par : la
10menotedela1reclasse.
Ajouterunindiceuntableausappelleajouterunedimensionuntableau.Avecunedimensionletableaupeut
trereprsentsuruneligne.Avecdeuxdimensions,letableaupeuttrereprsentenlignesetcolonnes,comme
dans un tableur ou une grille quelconque. Et avec trois dimensions ? Sous forme de cube, avec un axe de
profondeur.Audel,cestplusdifficilereprsenter,aussiilfautparfoisutiliserdesanalogiesavecdeschosesde
laviecourante.Ainsipourtroisdimensions,imaginezungrandcasieravecxcasesenlargeur,ycasesenhauteuret
dontchaquetiroirestdcomposenzpetitescases.Cesreprsentationsrestenttotalementvirtuelles,unevuede
lesprit. De nombreux tableaux nont absolument pas pour but de reprsenter des lignes et des colonnes. Un
tableaudeuxdimensionspeutparfaitementreprsenterunjeudemorpion,unematrice,uneclasseetlesnotes
destudiantsassocies
Lepigeaveclestableauxplusieursdimensions,cestlataillequilsoccupentenmmoire.Imaginezdixcoles,
disposant de dix classes chacune de vingt lves. Nous voulons placer les notes dans un tableau. Voici donc un
tableaudetroisdimensions:
Note[1..10][1..10][1..20]
Combiendenotespourraobtenirletableau?10x10x20:2000notes!Sillmentfaitunoctet,vousapprochezles
2 Ko. Mais si llment du tableau contient un rel sur 64 bits, cest16Koquisontutiliss!Pourtantlesindices
semblaientsipeulevs.
c.Lestypes
Un tableau nest pas un type de donnes mais un ensemble de valeurs, ellesmmes types, regroupes et
indicessousunnomdevariableunique.Pouvezvouscreruntableaucontenantnimportequeltypedevaleurs?
Attention linterprtation de cette question. Un tableau contientil n valeurs du mme type, ou au contraire n
valeursdetypesdiffrents?
Enalgorithmique,leprincipeestsimple:untableaucontientnlmentsdemmetype.Autrementdit,vousallez
dclareruntableaudevingtnotesennumrique,dixrels,cinqchanesdecaractres,etc.
Cependant en dehors du pseudocode algorithmique la dfinition, la dclaration et lutilisation des tableaux
dpendent fortement du langage. Les tableaux simples en Java ou en C par exemple ne contiennent quun seul
type possible de valeurs. Tandis quen PHP, vous pouvez mlanger tout ce que voulez, lindice 1 contenant un
entier,lindice2dutexte,etc.
Celapeuttreunpeudroutantlusage,maisceslangages,souventappelsnontyps(cestdiscutable)sont
dunesouplesseincomparable.
Enattendant,respectezenalgorithmiquelefaitquuntableauaenprincipeunnombredindicesfinietquilssont
typsunefoispourtoute.
d.Dclaration
Enpseudocodealgorithmique,lestableauxsedclarentaummeendroitquelesvariables,justeavantledbut
dutraitementluimme,souscetteforme:
VAR
MonTableau:tableau[1..nbelements] dentiers
MonTab2:tableau[1..dim1][1..dim2] de rels
Entrelescrochets,placezlenombredlmentsdutableau.
Ilestpossibledinitialiserlecontenudutableausacrationcommececi:
VAR
mois :tableau[1..12]<-{"janvier",...,"dcembre"} de chanes
CemmetableaupourraittreplacdanslasectionCONST,cequienferaituneconstante.
Commecelaserarevuunpeuplusloin,lesindicesdestableauxpeuventdmarrer0ou1,selonleslangages,les
usages,lesprofesseurs,etc.Ilnyamalheureusementpasdergleprciseencedomaine.Lvidence,visvisde
lorganisationdelammoiredelordinateur,voudraitquelanumrotationdmarrezro:celasimplifielescalculs
de la position des diffrents lments du tableau dans la mmoire. Cependant comment alors comprendre ce
tableau?
Valeurs:tableau[1..10] de rels
- 2 - ENI Editions - All rigths reserved
Selonlesusages,sicetableaureprsentedixvaleursalors:
G Silanumrotationcommence1,lesindicesvontdevaleur[1]valeur[10].
G Silanumrotationcommence0,lesindicesvontdevaleur[0]valeur[9].CestlecasdulangageC,du
JavaouduPHP.
Certainesnotationsalgorithmiquessontencoreplussurprenantes(pournepastremchant):lavaleurindique
entre crochets peut correspondre au nombre maximal dindices en partant de zro. Cest ainsi que le tableau
valeurscontiendraitonzelments!Ceneserapaslecasici.
Dans la suite, les indices commenceront 1 pour aller jusqu n, n tant le nombre dlments du tableau. Le
tableau valeurs[1..10] aura donc bien dix lments, numrots de 1 10. Comme il ne sagit pas dune rgle
absolue dans tous les langages vous prendrez bien soin de vrifier ce quil en est lorsque vous crirez vos
programmes.Sivoustestudiant,suivezlareprsentationfournieparvosprofesseurs,ventuellementprcisez
lesrglesquevousappliquezauxindices.Danstouslescas,naccusezpaslauteurdecetouvrage!
e.Utilisation
Un lment de tableau reoit une valeur comme une variable, se lit comme une variable et scrit comme une
variable.Cesontdanslesstructuresitrativesquelestableauxprennenttoutesleurssignifications.Eneffet,les
indicesdesdimensionspeuventtrereprsentslaidedevariables.
PROGRAMME UTIL
VAR
notes:tableau[1..10] de rels
i:entier
DEBUT
Pour i de 1 10 Faire
Ecrire "Note",i," ?"
Lire note[i]
FinPour
Pour i de 1 10 Faire
Ecrire note[i]
FinPour
FIN
f.Lestableauxdynamiques
Sivousneconnaissezpasparavancelenombredlmentsdevotretableau,vousavezdeuxpossibilits:
G Fixerunnombredlmentssuffisammentgrandlavancepourtresrdenavoirassez.
G Oualors,meilleuresolution,redimensionnervotretableaulabonnetailledsquelenombredlments
vousestconnu.
Ilexisteenpseudocodealgorithmiqueuneinstructionappele"Redim"quipermetderedimensionneruntableau
dontlenombredlmentsnestpasconnulavance.Cependant,ilestsouventconseilldviterdelutiliser.Cette
instruction trouve son utilit dans le fait quen pseudocode les variables et les tableaux sont dclars avant le
programme, ce qui induit limpossibilit dinitialiser le nombre dlments dun tableau suivant la valeur dune
variable.CependantleslangagescommeJavadisposentdemcanismespermettantdedclarerdestableauxsans
forcmentconnatreleurtaillelavance.
Sivousdevezutiliserdestableauxdynamiques,alorsvousnedevezpasindiquerdenombresdlmentsdansla
dclaration.Celaserafaitdanslinstructionderedimensionnement.
PROGRAMME REDIM
VAR
Elements :tableau[] dentiers
Nb:entier
DEBUT
Ecrire "Combien dlments ?"
Lire nb
Redim elements[1..nb-1]
FIN
- 3 - ENI Editions - All rigths reserved
Vous ne pouvez pas redimensionner un tableau dj correctement dimensionn, tout comme il est
impossiblededpasserlenombredlmentsdclars.Pourobteniruntableauplusgrand,ilfautalorsen
crerunautre,ouutiliserlemcanismedespointeurs,telquilseraprsentauchapitreNotionsavances.
2.PHPetlestableaux
a.Tableauxclassiquesndimensions
PHPsaitgrerdestableauxde1ndimensions.Leprincipeestpresquelemmequepourlesvariablesetvous
ntesdoncpasobligdedclareruntableau :siundeseslmentsestutilis,letableausemetexister.Les
indicesnedmarrentpas1mais0,ilfaudradoncadapterleprogrammeenconsquencelorsdupassagede
lalgorithmeenPHP.Vousdevezutiliserlescrochetslorsdelaffectationdesvaleursetlorsdelarcuprationde
cellesci.Ceuxciseplacentsoitaprslenomdutableau,soitavant,accolsautypedutableau.
Vous pouvez aussi affecter des valeurs un tableau avec une fonction (chapitre Les sousprogrammes) appele
array.
Vouspouvezdclareruntableauavecdesvaleursprdfiniescommececi :
$t=array(2,7,9,10,11,14,17,18,20,22);
ouencoreaffecterdesindexdiffrents :
$t=array(1=>2,2=>7,4=>9,6=>10,8=>"toto", "ref"=>"ref01");
oualorsdonnerunevaleurchaquelmentindpendammentlesunsdesautres.Vousaccdezaucontenude
chaquelmentexactementcommeprvu,savoirenmettantlenumrodelindiceentrelescrochets.
$t[2]=254;
$total=$total+$t[3];
Remarquezquenilindex,nilecontenuduntableaunesonttyps.Lindex (lment) duntableaupeuttreune
chanedecaractres.Cestcequonappelleuntableauassociatif.Cestunefonctionnalitpuissanteetpratiquedu
PHP trs utilise dans le dveloppement de sites Web dynamiques, notamment pour la rcupration de valeurs
dunepagelautre.
Vouspouvezobtenirlenombredlmentsduntableaulaidedunefonctionparticulireappelecount.
$nb=count($t);
Attention,iciilpeutyavoirunrisque,notammentsivousvenezdulangageJava.EnJavalacopiedetableausefait
parrfrence.IlestpossibleenJavadefairececi :
int[] t={2,7,9,10,11,14,17,18,20,22};
int[] copie;
copie=t ;
La dernire ligne donne limpression que le tableau t est copi dans le tableau copie. Or Java fonctionne par
rfrence.LeprincipeestexpliqudanslepointsuivantsurlareprsentationmmoireetdanslechapitreNotions
avances. Ici, ce nestpasletableauquiestcopimaiscopiequireoitlarfrencedutableaut. Lesvariables
copie et t rfrencent le mme tableau : si vous modifiez un lment de copie, vous modifiez llment
correspondantdetpuisquilsrfrencentlemmetableau,lemmeendroitdanslammoire.Cenestpaslecasen
PHP ou par dfaut laffectation de tableau se fait par copie. Lexemple suivant met ceci en lumire. La premire
affectation est par copie, la seconde par rfrence (force) : un lment de copie est modifi puis on affiche
llmentcorrespondantdet :cestlemme.
<html>
<head><meta/>
<title>tableaux et copies de tableaux</title>
Unedimension
Rfrencesdetableaux
- 4 - ENI Editions - All rigths reserved
</head>
<body>
<?php

$t=array(2,7,9,10,11,14,17,18,20,22);

// 1 par copie
$copie=$t;

echo "$t[2]<br />";


$copie[2]=5;
echo "$t[2]<br />";

// 2 par rfrence
$copie=&$t;

echo "$t[2]<br />";


$copie[2]=5;
echo "$t[2]<br />";

?>
</body>
</html>
PHPsaitmanipulerdestableauxplusieursdimensions.Selonleprincipeprcdent,lenomdutableaureprsente
unerfrencesurletableauenmmoire.Dansuntableaundimensions,chaquedimensionrfrencesonpropre
tableau indpendant en mmoire. Chaque indice de la premire dimension rfrence un tableau pour chaque
deuxime dimension. Cest ainsi quil est possible que le nombre dindices de la deuxime dimension (ou de la
troisime, quatrime, etc.) ne soit pas le mme selon lindice de la premire dimension. La suite vous prsente
quelqueslmentspratiques.
Pourindiquerlenombredlments,procdezcommepouruneseuledimension,placezlenombredindicesentre
lescrochets.
$t1[5][10]=254;
Pour initialiser le contenu dun tableau avec des valeurs prdfinies, comme pour un tableau une dimension,
utilisez la fonction array. Seulement ici vous devez imbriquer plusieurs niveaux, un niveau par dimension, comme
ceci:
$t1=array(0=>array(10,17,8,9,10,20,13,11,7,5), // 0,0 0,9
1=>(9,14,2,0,18,10,16,19,18,6), // 1,0 1,9
2=>(17,8,9,7,10,12,11,14,11)); // 2,0 2,8
Latailledechaquedimensionduntableaupeuttrercupreaveclafonctioncount.Cependantattention,vous
nobtiendrezpaslenombretotaldlmentsdetoutletableau,maispourchaquedimension.Lexemplesuivantmet
ceci en lumire pour un tableau deux dimensions. Pour obtenir le nombre dlments de chaque dimension,
rcuprez la fonction count pour chacune de ces dimensions. La seconde partie de lexemple fait appel a une
structureitrativepropreauPHP,foreach.Sonrleestdebouclersurchaquelmentdutableau,dupremierau
dernier et den isoler tant lindex que la valeur. Ici la valeur est un tableau, puisque la seconde dimension dun
lmentdonnduntableaudeuxdimensionsestellemmeuntableaudunedimension.
<html>
<head><meta/>
<title>2 dimensions</title>
</head>
<body>
<?php
$total=0;
$t=array(0 => array ("a","b","c","d"), 1 => array
("e","f","g","h","i"), 2 => array("j","k","l","m","n","o"));
echo count($t)."<br />";

for($i=0;$i<count($t);$i++) {
$total+=count($t[$i]); // calcul nb total delements
echo count($t[$i])."<br />";
}
Tableauxndimensions
- 5 - ENI Editions - All rigths reserved
echo $total;

echo "<br />";


// seconde possibilit
$total=0;
foreach($t as $key) {
$total+=count($key); // calcul nb total delements
echo count($key)."<br />";
}
echo $total;

?>
</body>
</html>
3.Reprsentationenmmoire
a.Reprsentationlinaire
Enprincipe,leslmentsduntableausontplacsdansdescasescontigusenmmoire.Sivousprenezuntableau
dedixnombres,ilpourraittrereprsentainsi:
Lacaseestlenumrodelacasemmoire,lindicelenumrodansletableauetlavaleurlanoteassocielindice.
Uneconstatationsimposedellemme:lesnumrosdescasesmmoire(lesadresses)nontpasderapportavec
lindice,mispartlefaitquilssontcontigus.
Autantsereprsenteruntableaudescalairesunedimension(unseulindice)enmmoireestsimple,autantse
reprsenterdeuxoundimensionsdevientunpeumoinsvident,dautantplusquecettereprsentationpeutvarier
dun langage un autre. Comme le nombre maximal dindices est connu lavance (dans le cas du pseudocode
algorithmique),untableaudeuxdimensionspeuttrefacilementtransposentableauuneseuledimension.
Soituntableaunote[1..3][1..5]:deuxdimensions,quireprsententquinzevaleurs.Voicicommentcecipourraittre
reprsentenmmoire:
Lapremirelignereprsenteladressedelacasemmoireassocieauxdiffrentsindicesdutableau.Cettevaleur
estbienentenduentirementarbitraireetestconnuedulangagemettantenuvreletableau.
La deuxime ligne reprsente les indices des diffrents lments du tableau. Remarquez que dans cette
reprsentation,oncommenceparlapremiredimension,puisparladeuxime,etc.Untableaundimensionspeut
donctrereprsentdemaniretotalementlinaire.Ilestpratiqueendbutantdesereprsenteruntableau
deuxdimensionsentermesdelignesetdecolonnes.Maiscettevuedelespritesttotalementfausse:lammoire
en tant que telle ne peut tre reprsente ainsi, elle est linaire (le fameux ruban). Un tableau stale donc
linairementdanslammoire,dunemanireouduneautre.Cettedernireremarqueestsujettecautioncomme
vousleverrezunpeuplusbas.
Dans le cas du tableau deux dimensions, comment un langage utilisant ce principe peut connatre la position
exactedunlmentenmmoire?Soit:
G mlapositionconnuedupremierlment,
G xlindicedelapremiredimensionmoins1,
G ylindicedelasecondedimensionmoins1,
Case 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 15 17 8 13 10 6 9 13 14 11
Adr 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
Ind 1,1 1,2 1,3 1,4 1,5 2,1 2,2 2,3 2,4 2,5 3,1 3,2 3,3 3,4 3,5
Val 10 7 14 8 12 11 5 12 13 18 20 2 0 17 16
- 6 - ENI Editions - All rigths reserved
G Mylataillemaximaledelapremiredimension.
Lapositionpenmmoireest:
p=m+(x*My)+y
Prenez,daprsletableaucidessus,llmentdindice3,4:xvaut2,yvaut3,Mxvaut5etmvaut143.
p=143+(2*5)+3=156
Soitunnouveautableaunote2[1..2][1..2][1..3],ilpourraittrereprsentainsi:
Pour calculer la position dun lment dindice x,y,z avec les mmes prrequis quaudessus, avec Mz la taille
maximaledeladimensionzetMylataillemaximaledeladimensiony,onobtientlaformulesuivante :
p=m+(x*My*Mz)+(y*Mz)+z
b.Reprsentationparrfrence
Lareprsentationlinairecidessusestbienpratiquepourvotreimagination,maismontreseslimitesdanscertains
cas.Notamment,quesepassetilaveclestypesquinesontpasdesscalaires?Prenezlexempleleplussimple:
untableaudechanesdecaractres.
Danslammoireetcommevuprcdemment,unechanedecaractresestreprsenteparunesuitedevaleurs
numriques:lescodesASCII(ouunicode,selonlecas).Lemot"Bonjour"estreprsentainsi:
Sachant quon ne connat pas forcment lavance la longueur dune chane de caractres, celleci se termine
souvent,suivantleslangages,paruncaractrenul.Aussienmmoire,vousobtiendrezceci :
Cettebrvetudemetenvidencedeuxproblmes:
G Dans un tableau une seule dimension, il nest pas vident de reprsenter les indices des chanes de
caractres. Une astuce pourrait consister rechercher les caractres nuls (0) pour retrouver les indices
suivants(lecaractresuivantestlepremierdelachanedindice+1).Mais:
G La longueur dune chane de caractres ntant pas fixe, comment rserver lavance lespace contigu
ncessaireaustockagedenchanesdansuntableaudenlments?
Vouspourriezvidemmentcontournerceproblmeendcrtantdemaniretotalementarbitrairequeleschanes
decaractresstockesdansvotretableauontunelongueurfixe.Maisquellepertedeplacesivotrechanenefait
quedeuxcaractrespourdeuxcentsrservs!Cenestpasunesolutionretenir.
Pourcrerdestableauxndimensionsquelqueslangagesetnondesmoindres,utilisentuneautremthode.Pour
plusdeclart,lemieuxestdecomprendreleprincipetoutdabordavecuntableauunedimension,puisdeux.
Une chane dunelongueurdencaractresestenfaitbiensouventuntableauunedimensioncomportantn+1
indices,sachantqueledernierindicecontiendrauncaractrenul.ChaquelmentdutableauestlecodeASCII(ou
unicode) correspondant au caractre de la position (indice) donne. Ainsi les variables de type Alphanumrique
sont, en fonction du langage, des artifices ou plutt des facilits censes simplifier la vie du dveloppeur. Quand
vous affectez une chane de caractres ce type de variable, le langage connat la longueur de cette chane
(a="Salut", la longueur de "Salut" est 5) et va allouer lespace mmoire contigu ncessaire au stockage de cette
chane.Quereprsentealorslavariable?Biensouventceseralapositionenmmoiredelachanedecaractres,
Adr 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523
Ind 1,1,1 1,1,2 1,1,3 1,2,1 1,2,2 1,2,3 2,1,1 2,1,2 2,1,3 2,2,1 2,2,2 2,2,3
Val 10 12 14 10 15 9 8 13 7 5 14 20
Lettre B o n j o u r
ASCII 66 111 110 106 111 117 114
Adresse 1616 1617 1618 1619 1620 1621 1622 1623
Contenu 66 111 110 106 111 117 114 0
- 7 - ENI Editions - All rigths reserved
autrementditsonadresse.
Pourreprendrelexempledelachanedecaractres"Bonjour"cidessus,elledbuteladressemmoire1616.Si
cest la variable "txt" qui "contient" cette chane, txt va en fait rfrencer le tableau de caractres prsent
ladresse1616.CestflagrantavecdeslangagescommeleCquipermettentdemanipulerdirectementlesadresses
mmoireetleurcontenu.
Prenezmaintenantuntableaudecinqchanesdecaractres:
PROGRAMME TABCHAINES
VAR
Messages:tableau[1..5] de chanes
DEBUT
Messages[1]"il"
Messages[2]"ne"
Messages[3]"fait"
Messages[4]"pas"
Messages[5]"beau"
FIN
Poursereprsentercecienmmoire,ilfautdabordsereprsenterlorganisationdeschanesdecaractres.Soitla
phrase"ilnefaitpasbeau",vousvoulezplacerchacundesmotsdansunlmentduntableau:
Notezdeuxchoses:
G Un octet est ajout pour le caractre nul en fin de chane et donc une chane de longueur n occupe n+1
octetsenmmoire.
G Ilsepeutqueleschanesnesesuiventpasenmmoiresiaumomentdelescrireilnexistepasassezde
positionslibrescontigusdisponibles.Aussilesadressesdonnesdanscetableaupeuventtretotalement
dcalesparrapportlaralit.
Le tableau de chane de caractres contiendrait donc les rfrences des adresses mmoires o sont rellement
stockesleschanesdecaractres:
Unastucieuxtourdepassepassequipermetdenombreuseschoses!
Adresses 2007>2009 2010>2012 2013>2017 2018>2021 2022>2026
Contenu Il Ne Fait Pas Beau
Indice 0 1 2 3 4
Rfrence 2007 2010 2013 2018 2022
- 8 - ENI Editions - All rigths reserved
Structuresetenregistrements
1.Principe
Les tableaux sont certes trs pratiques, mais ils ne permettent pas toujours de rpondre efficacement tous les
besoinsdestockage.Untableauestunestructurededonnesdonttousleslmentssontdemmetype.Quefaire
quandvousavezbesoindeplacerdansunestructuredetypetableaudesenregistrementsdetypesdiffrents?
Commeexempleconcret,prenezuncataloguedeproduitsdansunmagasinspcialis.Unarticleestdcritlaide
dunerfrence,unnom(libell)etunprix.Lesdeuxpremierssontdeschanesdecaractres,ledernierunnombre
rel.Commentsereprsentercelaavecdestableaux?Ilfaudraittroistableaux:unpourlesrfrences,unautre
pourleslibellsetuntroisimepourlesprix.Lindicedelarticledevraittreidentiquepourlestroistableaux.
Cestpossible,faisable,maisenpratiquetotalementingrabledsquilsagitdallerunpeuplusloinquedesimples
traitements. Quid des tri ? Quid des recherches ? Cela devient difficile. Il faudrait donc une sorte de mtatype
particulierquipourraitregrouperenunseulensembledesvariablesdetypesdiffrents.
Ces mtatypes existent. Ils sappellent des structures, ou types structurs et permettent de dcrire des
enregistrements. Les enregistrements sont en fait des structures de donnes composes dlments de types
diffrents ou non. Ces structures composes de plusieurs lments forment une entit unique qui est appele un
typestructur.
Autrementdit,vouspouvezcrervosproprestypesdedonnesencombinantdautreslmentsdetypesdiffrents
ou non et crer des variables de ce nouveau type, quon appelle des enregistrements. Les diffrents lments
contenusdansuntypestructursontappelsdeschamps.
2.Dclaration
a.Typestructur
Le type structur est opposable aux types dit primitifs vus jusqu prsent. Un type structur peut contenir des
lments de types primitifs (entiers, rels, chanes, caractres), des tableaux, mais aussi des lments dautres
typesstructurs.Cecipermetuneinfinitdenouveauxtypes,pourtouslescasdefigures.
Un type structur doit tre dclar et dfini avant les variables pour quil puisse tre utilis pour dfinir des
enregistrements.Letypestructursedclaredoncentrelesconstantesetlesvariables.Silalgorithmecontientdes
sousprogrammes,vousdclarerezlestypesstructurshorsduprogrammeetdessousprogrammes,cestdire
tout en haut de celuici. La structure est dclare dans une section particulire sous le motcl"Type", entre les
motsclsStructureetFinStruct.
Type
Structure nom_type
champ1:type_champ1
champ2:type_champ2
...
Champn :type_champn
FinStruct
G Chaquestructureporteunnom.Cenomserautilispourdclarerdesenregistrements.
G Unestructurepeutcontenir1nchamps,dummetypeoudetypesdiffrents.Unestructureunseul
champestensoitotalementinutile.
Lastructurepourdcrireunarticleseraitdoncquelquechosecomme:
Type
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct
b.Enregistrement
- 1 - ENI Editions - All rigths reserved
Unenregistrementestune"variable"duntypestructurdonn.Ilsedclareexactementcommeunevariable,au
mme endroit, sous le motcl VAR. Un enregistrement peut donc tre considr comme une variable, un peu
spcialecependant.
VAR
nom_enreg:nom_type
Danslecadredelexempleprcdent,vousdclarezdesarticlesainsi:
VAR
article1,article2,article3:tarticle
Enmmoire,lesdiverslmentsdun enregistrement peuvent gnralement tre reprsents comme tant dans
deszonescontigus.

Avec un enregistrement de ce type, il existe des ressemblances videntes avec lventuelle structure
denregistrements en base de donnes ou dans un fichier. Pour peu que le type structur de lenregistrement
reprennelemmeschma,lestraitementssentrouventgrandementsimplifis.
Cependant, particulirement pour la ressemblance avec un contenu de base de donnes relationnelle, lanalogie
nest pas complte. Un enregistrement ne contient pas didentifiant ou cl uniques et rien nempche que deux
enregistrementsdemmetypecontiennentlesmmesdonnes.Ceseraitvousauseindevotreprogrammede
grercescasdefigure.
Demme,lechampdapplicationdesenregistrementsestbeaucoupplusvastequilnyparat.Certainslangages
les utilisent pour des choses totalement diffrentes quune description de donnes de gestion. Ainsi un langage
commeleCdisposedetypesstructurspourgrerlesfichiers:ouverture,fermeture,position,typedaccs,etc.,
maisaussileurnom,leurrfrencesurledisque,leurspropritaires,leursdroitsDautrestypesstructurssont
utilespourlagestiondesdatesetheures,pourreprsenteruneconnexionrseau
3.Utiliserlesenregistrements
Les enregistrements sont composs de plusieurs lments appels champs. Quand vous manipulez un
enregistrement,vouslefaitesautraversdeseschamps:
G Ilnestpaspossibledaffecterunevaleurunenregistrementenpassantparsonnom.Pourluiaffecterdes
valeurs,ilfautlesaffecteruneuneauxchampscorrespondants.
G Cependant, il est possible daffecter un enregistrement un autre du mme type : chaque champ de
lenregistrementaffectreoitlavaleurduchampcorrespondantdelenregistrementaffecter.
a.Utiliserleschamps
Vous accdez aux champs dun enregistrement en passant par le nom de lenregistrement et le nom du champ
sparsparlecaractre".",lepoint,selonlaformesuivante:
nom_enreg.nom_champ
Cette syntaxe reprsente la valeur du champ nom_champ au sein de lenregistrement nom_enreg. Reprenons
lexempleprcdent:
article1.prix
- 2 - ENI Editions - All rigths reserved
reprsente le prix de larticle1.Dailleurs, pour plus de simplicit, lisez vos enregistrements de droite gauche :
article2.libellselit"libelldearticle2".
Comme il est interdit daffecter une valeur directement un enregistrement complet, vous devez passer par les
champs. videmment il est impossible, si vous mettez le nom du champ seul, de savoir quel enregistrement il
appartient.AussinoubliezjamaisdcrirelenomdelenregistrementETlenomduchamp.Demme,neconfondez
paslenomdutypestructuretlenomdelenregistrement:
tarticle.ref /* mauvaise ide */
nereprsenteriendutoutetnepeutrecevoiraucunevaleur.
Leschampsdunenregistrementsemanipulentexactementcommedesvariables,ilspeuventrecevoirdesvaleurs
et leur valeur peut tre affecte une autre variable. Les champs peuvent tre utiliss partout o les variables
sont utilises, y compris, vous le verrez dans le prochain chapitre, comme paramtres de sousprogrammes, en
saisie,enaffichage,etc.
Lexemplesuivantreprendtouscesprincipes:
PROGRAMME demo_enreg
Type
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct
Var
article1,article2:tarticle
reponse:chane
DEBUT
Afficher "Rfrence du premier article ?"
Saisir article1.ref
Afficher "Libell du premier article ?"
Saisir article1.libell
Afficher "Prix du premier article ?"
Saisir article1.prix
Afficher article1.ref,article1.libelle,article1.prix
Afficher "Copier le premier article dans le second ?"
Saisir reponse
Si reponse="oui" Alors
article2=article1
Afficher article2.ref,article2.libelle,article2.prix
FinSi
article2.prix15.25
Si article1.prix=article2.prix Alors
afficher "Les deux articles ont le mme prix"
FinSi
FIN
Voicilesconstatationsquipeuventtretiresdecetexemple:
G Le nom du champ seul ne reprsente rien, il est toujours associ son enregistrement sous la forme
enreg.champ.Cequiestappelchampreprsentecettepaire.
G Un champ sutilise exactement comme une variable indpendante. Cest ce quelle est puisquun type
structurestunensembledevariablesduntypedonn.
G Decefait,unchamppeutrecevoirunevaleurcommeuneautre.
G Enfin,leseulcasounenregistrementpeutrecevoirunevaleurenglobalitcestquandonluiaffecteun
autreenregistrementdummetype.
b.Unenregistrementdansunestructure
Untypestructurdfinitunnouveautypedevariableappelenregistrement.Unenregistrementestdclarcomme
une variable. Il semble donc logique quun enregistrement puisse faire luimme partie dun autre type structur.
- 3 - ENI Editions - All rigths reserved
Chaquearticledisposedunfabricant.Cefabricantpeuttredcritparunestructuretype:
Structure tfabricant
ref:chane
nom:chane
adresse:chane
tel:chane
FinStruct
Vous voulez maintenant associer un fabricant chacun de vos articles. Rien de plus simple : incorporez un
enregistrementdetypetfabricantvotretypestructurtarticle:
Structure tarticle
ref:chane
libelle:chane
prix:chane
fab:tfabricant
FinStruct
Maintenantdclarezunenregistrementdetypearticle:
VAR
art:article
Dansvotreprogramme,vousallezaccderauxchampsdelenregistrementartcommevucidessus,maisvousallez
aussiajouterlesinformationssurlefournisseur.Pourcela,ilsuffitderespecterlasyntaxeavecdespoints:
nom_enreg1.nom_enreg2.nom_champ
Soitcommeexemple:
Dbut
art.ref"art001_01"
art.libelle"Pelle tarte Inox Luxe"
art.prix35.50 /* cher pour une pelle tarte */
art.fab.ref"Fab1234"
art.fab.nom"Le roi de la tarte"
art.fab.adresse"12 rue Siflette 13248 Latruelle"
art.fab.tel"0404040404"
Fin
c.Untableaudansunestructure
Vousvoulezmaintenantconnatrelenombredarticlesvendussurlesdouzemoisdelanne.Pourcela,vousallez
crerunnouveautypestructurquivareprendreunenregistrementtarticleauquelvousallezajouterunmoyende
stocker douze valeurs relles. Le meilleur moyen que vous connaissez dj est le tableau. Vous pouvez
parfaitementajouteruntableaucommechampdestructure.
Structure bilanart
art:tarticle
vente:tableau[1..12] de rels
FinStruct
Soit dit en passant, dans une telle structure et un enregistrement bart1 associ, laccs aux divers champs peut
devenirunpeulong.Vousaccdezautableauventeainsi:
bart1.vente[indice]
Lalgorithmesuivantvademanderlasaisiesuccessivedesdouzequantitsdeventesmensuelles:
TYPES
// Le fabricant
Structure tfabricant
ref:chane
nom:chane
adresse:chane
- 4 - ENI Editions - All rigths reserved
tel:chane
FinStruct
// Larticle
Structure tarticle
ref:chane
libelle:chane
prix:chane
fab:tfabricant
FinStruct
// Les ventes mensuelles
Structure bilanart
art:tarticle
vente:tableau[1..12] de rels
FinStruct
VAR
bart01:bilanart
i,total=0:entiers
Dbut
bart01.art.ref"art001_01"
bart01.art.fab.ref"Fab1234"
Pour i de 1 12 Faire
Afficher "Ventes du mois",i," ?"
Saisir bart01.vente[i]
totaltotal+bart01.vente[i]
FinPour
Afficher "Total annuel :" ,total
Fin
4.Lestableauxdenregistrements
a.Lestables
Un article reprsente un enregistrement. Jusqu prsent pour reprsenter plusieurs articles, vous deviez crer
plusieursenregistrements,commedanslexempledearticle1,article2etarticle3.Lidalseraitdepouvoirtraitern
articlessansavoirdclarernenregistrementsindpendants.Unenregistrementtant(larptitionestlemeilleur
amidelammoire)dclarcommeunevariable,vousavezaussiledroitdecrerdestableauxdenregistrements.
Un tableau denregistrements se dclare comme nimporte quel autre tableau. Il est parfois appel table. Dans
cettetable,lescolonnessontleschampsetlesligneslesenregistrements.
Soitlastructuretarticlesimplifiedorigine:
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct
Vousvoulezcrerunetablededixenregistrements:
Var
articles :tableau[1..10] de tarticles
Poursaisirleslmentsdunenregistrementdecettetable,vousutilisezlesindices:
articles[1].ref="art001_01"
Pouraccderauxdixenregistrements,lemieuxestdutiliseruneboucle:
Dbut
Pour i de 1 10 Faire
Afficher "Saisir ref article",i
Saisir articles[i].ref
FinPour
Fin
- 5 - ENI Editions - All rigths reserved
b.Unetablecommechamp
Selonlemmeprincipequuntableaudansunestructure,vouspouvezutiliseruntableaudenregistrementscomme
typededonnesdansunestructure,puisquecenestquuntableau,aprstout.
Soitunegrandeenseignedisposantdedixmagasins.Vousdevezdcriredeuxstructures:unestructuremagasin
etunestructureenseigne.Lastructureenseignedoitcontenirlesenregistrementsdesdixmagasins.Voiciceque
vouspourriezfaire:
Structure tmagasin
adresse:chane
tel:chane
gerant:chane
FinStruct
Structure tenseigne
nom:chane
magasin :tableau[1..10] de tmagasins
FinStruct
Voicicommentexploiterunenregistrementdetypetenseigne:
Var
enseigne :tenseigne
i :entier
Dbut
Afficher "Nom de lenseigne ?"
Saisir enseigne.nom
pour i de 1 10 Faire
Afficher "adresse du magasin",i
Saisir enseigne.magasin[i].adresse
Afficher "tel du magasin",i
Saisir enseigne.magasin[i].tel
Afficher "grant du magasin",i
Saisir enseigne.magasin[i].gerant
FinPour
Fin
Ilnyaenfaitriendebiencomplexe.Vouspouvezencoreallerplusloinencrantdestablescontenantdautres
tablesetainsidesuite
5.EtPHP?
Ilyaiciunpetitproblme.PHPnedisposepas,toutaumoinsdirectement,demoyendedclarerunestructureen
tantquetelle,contrairementdeslangagescommeleC,C++oulePascal.PHPestunlangageditobjet.Lobjetest
aborddansledernierchapitre.PourcrerunobjetPHP,ilfautcrireuneclasse:cestladescriptionouunesorte
de"type"dobjet.Uneclassepeutcontenirdesvariables(lesattributs)etdesboutsdeprogramme(lesmthodes).
Par(mauvaise)analogieuneclassequinecontiendraitquedesvariablespourraittreapparenteunestructure.
Voiciunexemplesuccinct:
<html>
<head><meta/>
<title>Structures</title>
</head>
<body>
<?php

class tfabricant {
public $ref;
public $nom;
public $adresse;
public $tel;
}
class tarticle {
public $ref;
public $libelle;
public $prix;
public $fab;
- 6 - ENI Editions - All rigths reserved
}

$article[0]=new tarticle;
$article[1]=new tarticle;

$article[0]->fab=new tfabricant;
$article[1]->fab=new tfabricant;

$article[0]->ref="Art001_01";
$article[1]->ref="Art002_02";

$article[0]->fab->ref="Fab1234";
$article[1]->fab->ref="Fab4321";

echo $article[0]->ref;
echo "<br />";
echo $article[0]->fab->ref;
echo "<br />";
echo $article[1]->ref;
echo "<br />";
echo $article[1]->fab->ref;
?>
</body>
</html>
Il est fortement probable que vous ne compreniez pas certaines instructions comme public, new, pourquoi class et
passtruct,etc.Nevousinquitezpas,toutceciseraexpliquaudernierchapitreconsacrlobjet.Pourlinstant,
remarquez seulement que dans ce cas prcis, le motcl class peut tre utilis pour dclarer des sortes de
structures.Ilestaussipossibledecrerdestableauxdobjets :
<html>
<head><meta/>
<title>Structures 2</title>
</head>
<body>
<?php

class tfabricant {
public $ref;
public $nom;
public $adresse;
public $tel;
}
class tarticle {
public $ref;
public $libelle;
public $prix;
public $fab;
}

for($i=0;$i<3;$i++) {
$article[$i]=new tarticle;
$article[$i]->fab=new tfabricant;
}

$article[0]->ref="Art001_01";
$article[0]->fab->ref="Fab1234";
$article[1]->ref="Art002_02";
$article[1]->fab->ref="Fab4321";

echo $article[0]->ref;
echo "<br />";
echo $article[0]->fab->ref;
echo "<br />";
echo $article[1]->ref;
echo "<br />";
echo $article[1]->fab->ref;
?>
</body>
- 7 - ENI Editions - All rigths reserved
</html>
- 8 - ENI Editions - All rigths reserved
Lavariable
1.Principe
Voussavezgrceauchapitreprcdentcommentlordinateursereprsenteleschiffresetlesnombres :sousforme
debinaire.Demmelammoiredelordinateur,composedecases,peutcontenirdesinformations,notammentces
fameuxnombres.Enprogrammation,ilfautquelquechosedesimple,pratiqueetsouplemanipulerpourreprsenter
cesnombres.
Chaquecasedelammoireestnumrote.Silammoirefait256octetsetquechaquecasepeutcontenirunoctet,
alorsilya256casesnumrotesde0255.Onpeutdoncobtenirlavaleurdunecasedepuissonnumro,endisant
que la case 74 contient la valeur 212. L o cela se complique, cest que la mmoire de vos ordinateurs atteint un
nombretrsimportantdecases.Avec1Godemmoire,vousavez1073741824casespouvantcontenirchacuneun
octet.Commentvoulezvousvoussouvenirdechaquenumrodecase?Cestbienentenduimpossible.
Siparcontrevousdonnezunnomouunetiquettechaquevaleurcontenuedanslacase,ouunesuitedevaleurs
deplusieurscases,pourvousenrappelerplusfacilement,celadevientbienplusvident.Cestcequonappelleune
variable. En informatique, une variable est lassociation dune tiquette une valeur. Vous nommez la valeur. La
variablereprsentelavaleuretsesubstitueelle.Lavariableestdonclavaleur.Maiscommesonnomlindique,cette
valeurpeutchangerdansletemps,soitquelavariablenereprsenteplusla(oules)mme(s)case(s)mmoire,soit
quelavaleurdelacaseachang.
Unevariableestunnomoutiquettedonnunevaleur(nombre,texte,etc).Cettevaleurpeutvarierau
coursdutemps:onaffecteunenouvellevaleuraunom,dolenomdevariable.
Quelnomdonnerunevaleur?Lenomquevousvoulezetqui,sipossibleestenrapportaveccequereprsentela
valeur. Ce peut tre une lettre, une association de lettres et de chiffres, ou dautres symboles. Le formalisme des
nomsdesvariablesdpenddulangageutilis.Parfois,uncaractrespcifiqueindiqueletype(quevousrencontrerez
plusbas)delavariable :cequellepeutcontenir.
Certains langages acceptent des noms en lettres minuscules, majuscules, avec des chiffres dedans, des caractres
spciaux comme le soulign, etc. Quelques langages, dont Java, font la diffrence entre les minuscules et les
majuscules.Sivouspouvezgnralementutiliserunnomdegrandetaille,vitezpourdesraisonspurementpratiques
lesnomsrallonge.Voiciquelquesexemplesdenomsdevariables:
G a
G var
G titre
G Total
G Somme_globale
Quandvousprogrammerez,vousveillerezvousrenseignersurlesconventionsutilisesparlelangagepournommer
vosvariables:certainsutilisentdessyntaxestrsparticulires,dautressontbeaucoupmoinsstricts.
Lavariablenestquunoutilpourlesalgorithmesetleprogrammeur,afinquilpuissesereprsenter"danslerel"les
donnesquilmanipule.Sivousmodifiezlenom"Somme_globale"par"Pomme_frite"partoutdanslalgorithmeoule
programme,lavariablereprsenteratoujourslammedonne,leprogrammefonctionneralidentique,maiscesera
plus difficile pour vous de faire le rapprochement. De mme, la case mmoire ne porte pas rellement un nom ou
tiquette. Chaque case est plutt rfrence par une adresse, ellemme exprime par une valeur binaire. Cestle
compilateuroulinterprteurquiferalaconversiondesnomsverslesadressesdescasesmmoirevotreplace.
Sivoussouhaitezvous"amuser"manipulerdirectementdesadressesmmoirenonpasparleurnommaisparleur
adresse,quelqueslangageslepermettent.Directement,vouspouvezapprendrelassembleur(maisvousdevreztre
trscourageuxetpatient),sinondeslangagescommeleCouleC++permettentlamanipulationviades"pointeurs":
ce sont des tiquettes qui sont accoles ladresse de la case mmoire, contrairement aux noms des variables
classiques qui sont associes la valeur que la case contient. Comme en rgle gnrale le nom dune variable
reprsentetantladressequelavaleur(lavaleuratelleadressemmoire),cestsourcedebeaucoupdamusement(!)
pourleprogrammeur...
- 1 - ENI Editions - All rigths reserved
Lavariable:unetiquetteassocieunevaleurenmmoire
2.Dclaration
Pourexister,unevariabledoittredclare,cestdirequevousdevezindiqueraudbutdelalgorithmecomment
ellesappelleetcequelledoitcontenir.Eneffet,pourquelalgorithmeutilisevotrevariable,ildoitdjsavoirquelle
existeetcequelledoitcontenir.Ilnesagitpasicidedfinirlavaleurdelavariable,vouspourrezlefairedanslasuite
delalgorithmeenluiaffectantunevaleur.Ilsagitdedonnersonnometdeprciserletypedevaleurquellepeut
contenir.Lesvariablessedclarentaudbutdelalgorithme,avantleprogrammeluimmemaisaprslemot"VAR".
VAR
Variable1 :type
Variable2,variable3 :type
3.Lestypes
Une case mmoire contient gnralement un octet, cestdire une valeur de 0 255. Mais une variable peut trs
biencontenirlenombre214862,lerel3,1415926,letexte"bonjour",etc.Doncunevariablenestpasuniquement
dfinie par la valeur quelle contient, mais aussi par la place que cette valeur occupe et par la manire dont
lalgorithmevalareprsenteretlutiliser:nombre,texte,etc.Cestletypedelavariable.
Que pouvezvous mettre comme valeur dans une variable ? En principe, tout ce que vous voulez. Cependant, vous
deveztoutdemmeprciserqueltypelavaleurreprsente.Estceunnombre?
Sioui,unentier(sansvirgule)ouunrel(avecvirgule)?Estcedutexte?Estceuntableau?Etainsidesuite.Vous
entendrez parfois parler du "codage" de la variable : selon le type et la taille de la valeur, celleci est encode de
manirediffrentedanslammoire,utilisantplusdecases.
a.Lesnombres
Placerdesnombresdanslavariableestleplusvidentetsouventlepluscourant.Unecasemmoirepeutcontenir
unoctet,cestdireunevaleurcompriseentre0et255(2
8
1).Maissielledoitcontenirunevaleurngative?Alors
surles8bits,unserarservausigneetlacasemmoirepourracontenirdesvaleursde127+128.Onditalors
quelavariableest"signe":ellepeutcontenirdesvaleurspositivesetdesvaleursngatives.Seulement,8bitsne
sontpassuffisantspourdesgrandesvaleurs.Cestpourquoilesnombrespeuventtreplacsdansdeuxcases(16
bits),quatrecases(32bits)ouplus.
Silordinateurestbienpluslaiseetbienplusrapideavecdesnombresentiers,ilsaitaussimanipulerdesnombres
rels, bien que dans ce cas leur codage en binaire soit radicalement diffrent. Vous trouverez plus bas toutes les
explicationsncessairespourcomprendrecommentlordinateursereprsenteexactementlesnombresngatifset
rels:cenestpassivident!
Aufinal,lordinateurestcapabledegrerdesnombresdelongueurvariable,signsounon,entiersourels.Suivant
lelangagedeprogrammation,lestypesportentdesnomsdiffrents.CependantleCetsesdrivsproposentles
types suivants. Attention car Java fait la diffrence entre le type Byte de un octet et le type Char qui prend deux
octetscauseduformatdecodagedescaractresenUnicode.
Typenumrique Plagedevaleurspossibles
- 2 - ENI Editions - All rigths reserved
SousPHPcestencoreplussimple.PHPestunlangagenontyp.Unevariablepeutcontenirnimportequellevaleur,
denimportequeltype,puislammevariablepeutchangerdecontenu,dunautretype.Deplus,danslaplupartdes
caslavariablenapasbesoindtredclare.Ellesemetexistersapremireaffectation,voireutilisation(siPHP
est paramtr en ce sens). Dans ce dernier cas, laccs une variable qui na jamais eu de valeur retourne une
valeurnulle,vide,fausse,selonlecas.
EnPHP,ilnestpastoutfaitexactdedirequelesvariablesnesontpastypes.Elleslesontimplicitement
enfonctiondeleurcontenuetdeleurutilisation.Sivousaffectezlavaleur"32"unevariable,cepeuttre
unentier,maisaussilesdeuxcaractres"32",selonlecontexte.
Vousdevezchoisirqueltypenumriqueutiliserselonvosbesoins.Lavoiedelafacilitconsisteprendreletypele
pluslevcommeunentierlongoupire,unrelendoubleprcisionafindtretranquille.Eninformatiquecomme
dansbeaucoupdemtiers,ilfautchoisirlaformulelaplusconomique.Onparleicidconomiedemoyens.Quun
programmedonnelersultatattendunestpassuffisant,ilfautaussiquillefassevite,bienetenconsommantle
moins de ressources possibles. Le fait de disposer de plusieurs gigaoctets nest pas un critre suffisant pour
programmernimportecomment.Unelistedemillevaleurscomprisesentre0et100"cotera"1000octets(soitpas
loin de 1 ko) dans un type byte, mais 8000 octets (pas loin de 8 ko) soit 8 fois plus dans une type rel double
prcision.Celapeutsemblerfaible,maisnonseulementlordinateurdoitmanipuler8casesmmoireaulieudune,
maisenplusildoitenpermanenceconvertirunevaleurquilpensetreunnombrerelavecdeschiffresaprsla
virguleenentier,alorsquecestdjlecas!Quandvousverrezplusbaslaformulemathmatiquencessaire,vous
vousrendrezcomptedugchis!
Utilisezlestypesquivontbienaveclesvaleursquivontbien.Enalgorithmique,cestbienplussimple.Riennevous
empchedeprciserquevousmanipulezdesentiersoudesrels,maisvouspouvezaussiindiquertoutsimplement
que vous utilisez des variables contenant des valeurs numriques avec le pseudotype "numrique". Vous devrez
cependanttrepluscirconspectquandvousconvertirezvotrealgorithmeenvrailangagedeprogrammation.Dune
maniregnrale,deuxtypesnumriquessontutilissenalgorithmique:
G Lesentiers:nombressansvirgule,ngatifsoupositifs
G Lesrels:nombresvirgule,positifsoungatifs.
Les variables se dclarent toutes au dbut de lalgorithme. Si durant la rdaction de celuici vous remarquez que
vousenavezbesoindautres,vouslesajouterezaudbut.
VAR
montant:rel
somme,moyenne:rels
qte :entier
Pour les variables contenant des nombres rels, ces derniers scrivent avec une vraie virgule comme en franais
"3,14"ouaveclepointdcimal,cependantdansleslangagesdeprogrammation,ceserabiensouventlepointqui
serautilis"3.14".
En PHP, comme les variables ne sont pas explicitement types, il faut pouvoir dterminer autrement leur contenu.
Danslexemplesuivant,diversesvaleurssontaffectesdesvariables.PHPdisposedemthodes(desfonctions,
expliquesdanslechapitresurlessousprogrammes)permettantdeconnatreletypeactueloupossibleducontenu
de la variable. Si le programme affiche 1, alors la variable est du type test, sinon elle ne lestpas.Lesvariables
Byte(char) 0255
Entiersimplesign(int) 3276832767
Entiersimplenonsign 065535
Entierlongsign(long) 21474836482147483647
Entierlongnonsign 04294967295
Relsimpleprcision(float)
Ngatif:3,40x10
38
1,40x10
45

Positif:1,40x10
45
3,40x10
38

Reldoubleprcision(double)
Ngatif:1,79x10
308
4,94x10
324

Positif:4,94x10
324
1,79x10
308

- 3 - ENI Editions - All rigths reserved


commencenttoujoursparlecaractre$cequipermettrsfacilementdelesdistinguer.
<html>
<head><meta/>
<title>Types</title>
</head>
<body>
<?php
$entier8bits=127;
$entier16bits=32767;
$entier32bits=2147483647;
$entier64bits=9223372036854775807;
$reel32bits=3.1415927;
$reel64bits=3.1415926535897932384626433832795028841971;

echo is_int($entier8bits)."<br />";
echo is_int($entier16bits)."<br />";
echo is_float($entier16bits)."<br />";
echo is_long($entier32bits)."<br />";
echo is_long($entier32bits)."<br />";
echo is_float($reel32bits)."<br />";
echo is_int($reel32bits)."<br />";
echo is_double($reel64bits);
?>
</body>
</html>
b.Autrestypesnumriques
Il existe dautres types numriques moins utiliss, tout au moins sur les ordinateurs personnels ou dans des
langages de programmation classiques, mais bien plus sur des moyens ou gros systmes ou dans des bases de
donnes. Le systme BCD " binary coded decimal " pour dcimal cod en binaire est utilis principalement en
lectroniquecarilestassezsimplemettreenuvre.EnBCD,chaquechiffreestcodsur4bits:0000
(2)
=0
(10)
,
0001
(2)
=1
(10)
, 0010
(2)
=2
(10)
, 0011
(2)
=3
(10)
et ainsi de suite jusqu 1001
(2)
=9
(10)
. Comme un ordinateur ne
manipulequedesoctets(compossde8bits),ilexistedeuxmthodespourcoderdesnombresenBCD:
G soitnemettrequunchiffreparoctetetcomplterlerestequepardes1oudes0,"EBCDIC"
G soitmettredeuxchiffresparoctetetajouterunsignelafin,"packedBCD".
Parexemplelenombre237:
11110010 11110011 11110111 en EBCDIC
00100011 01111100 en Packed BCD (le 1100 final est le +, 1101 pour le -)
Vous rencontrerez peuttre un jour le type "montaire" pour grer les sommes de mme nom et notamment les
rgles darrondi, mais aussi et surtout une grande quantit de types permettant de grer les dates, couramment
exprimssouslenom"date".LordinateurdetypePCstockelesdatesdediversesmanires,lapluscommunetant
sous la forme dun timestamp, une valeur signifiant le temps coul depuis une date prcise. Ce timestamp est
souventceluidusystmeUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuit
UTC,exactement.Cestdoncunentieretlelangagedoitfournirdesinstructionspourconvertircettevaleurendate
relle.
c.Lescaractres
Siunordinateurnesavaitmanipulerquelesnombres,vousneseriezpasentraindelirecelivre,critlaidedun
traitement de texte (OpenOffice.org), qui lui manipule toute sorte de caractres : chiffres, lettres, caractres
spciaux,etc.Unevariablepeutaussicontenirdescaractres.SuivantleslivresetsitesInternet,voustrouverezles
types "Alphanumrique", "Caractre", "Chane", "String". Ainsi une variable peut stocker votre nom, une ligne
complte de texte, ou tout ce que vous voulez qui ncessite une reprsentation alphanumrique. On appelle
dailleursunesuitedecaractresalphanumriqueunechanedecaractres.
Sivousdevezreprsenterunseulcaractre,utilisezletype"caractre".Pourunechane,utilisezletype"chane".
VAR
texte:chane
- 4 - ENI Editions - All rigths reserved
car:caractre
Quelleplaceoccupeunechanedecaractre?Enprincipe,uncaractreoccupeunoctet.chaquevaleurcomprise
entre 0 et 255 est associ un caractre. Cest le principe de lASCII "American Standard Code for Information
Interchange", norme de codage des caractres la plus connue et la plus utilise. La table ASCII, invente par les
amricains, contient lorigineles128caractresutilespourcrireenanglais.Pardfautellenecontientpasles
accents. Or la table ASCII peut contenir 256 caractres. Les 128 autres (huitime bit un) contiennent des
caractres semigraphiques et des caractres spcifiques certaines langues, typiquement le franais, pour les
caractresaccentus.Onparlealorsdepagedecodeoudecharset.Cespagesfontlobjetdunenormalisation,par
exemplelanormeISO885915quiestlapagedEuropedelOuest,aveclecaractredeleuro"".Danslaplupart
deslangagescecodagesurunoctetsuffitetainsiunechanedecaractresde50caractresoccupe50octets.
Enpseudocodealgorithmique,leschanesdecaractressontplacesentreguillemetspourdeuxraisons :
EnPHP,unevariablentantpastype,vousluiaffectezunechanedirectement.Ilestintressantdesavoirquilest
possible de concatner deux chanes avec le ( . ). Cest un oprateur. Ils sont tudis la section Oprateurs et
Calculsdecechapitre.
Lexemplesuivantcontientdeuxaffectationsetaffichelersultatconcatn:
<html>
<head><meta/>
<title>Chaines de caractres</title>
</head>
<body>
<?php

$texte="Hello World !";
$text2="Bonjour les amis";

$texte=$texte.$text2;
echo $texte;
?>
</body>
</html>
d.Letypeboolen
Pourdterminersiuneaffirmationestvraieoufausse,lordinateurdoitsebasersurlersultatdecetteaffirmation.
En informatique, on emploie plus volontiers la notion dexpression et dvaluation de cette expression. Une
expression peut tre dcrite comme tant tout ce qui peut fournir une valeur que lordinateur peut dterminer,
stocker, valuer. Par exemple, laffirmation "a>b" selon laquelle a est suprieur b. Si a vaut 3 et b vaut 2,
laffirmationestvraie.Simaintenantavaut1etbvaut2,laffirmationestfausse.Danslesdeuxcas"a>b"estune
expression qui vaut soit vrai, soit faux. Cest le cas le plus simple, mais aussi le plus courant et le plus pratique
commevousleverrezlorsdestestsetdesconditions.
Commentlordinateur dterminetilcequiestvraietfaux?Cest le rle, dans larchitecture de Von Neumann, de
lUAL. Sous quelle forme lordinateur se reprsentetil ce qui est vrai ou faux ? Sous forme numrique, comme
toujours.Toutcequiretourneunrsultatdiffrentdezro(0)estconsidrcommetantvrai,doncsilersultat
vaut zro (0) alors il sera considr comme faux. Avant de considrer cette dfinition comme exacte, renseignez
voustoutdemmecarcertainslangages(commelinterprteurdecommandeUnix)fontlinverse!Cependantdans
deslangagescommeJavaouleC,1estvrai,0estfaux.
Pourreprsenterlesvaleursvraietfaux,ilsuffitdedeuxchiffres,0et1.Combienfautildeplacepourstockerces
deuxvaleurs?Unseulbit!Enpratique,leslangagesgrentlesboolensdeplusieursmanires.Certainscrent
des"champs"debitsdansunmmeoctet,dautresutilisentunoctetcomplet,etc.Cependant,plusieurslangages
1. viteruneambigutentrelesnombressousformedechanedecaractresetles
nombresauformatnumrique.Certainslangagesnefontcertespasdirectementla
diffrence(cestselonlecontextedutilisation)maisavecdautrescestcatastrophique.
Lasuitedecaractres1,2,3reprsentetellelenombre123etstockeainsienmmoire
sousformebinairedansunoctetdelammoire,oulachane"123"stockeainsien
mmoiresousformedecodesASCII,soitunpourchaquecaractre?Lesguillemets
vitentleserreursdinterprtation.
2. Nepasconfondrelenomdelavariableavecsoncontenu,notammentlorsdune
affectation.Ainsi,quandvousaffecterezunvaleurunevariable,sicelleciestentre
guillemets,vousluiaffecterezunechanedecaractres,sicestunnombre,ceserace
nombre(sachantquelenomdunevariablenepeutpastreconstituuniquementde
chiffres)etenfinsicenestniunechaneniunchiffre,cestunevariable.Danscecas,la
premirevariablerecevracommevaleurcelledelasecondequiluiestaffecte.Nepas
respecterceprincipeestunecausederreurgraveetnanmoinscommune.
- 5 - ENI Editions - All rigths reserved
proposentletypeboolen,trspratique.
Dans la pratique, ces langages proposent des constantes (des variables qui prennent une valeur une fois pour
toutes)spcialespourreprsenterlesvaleursvraietfaux:
G TRUEpourvrai
G FALSEpourfaux
Ces constantes peuvent mme tre utilises directement pour valuer une expression. Telle expression estelle
vraie,telleautreestellefausse?Suivantlelangage,ilfaudrafaireattentionsilesconstantesexistentetsonten
minusculesoumajuscules.
VAR

Test:boolen
PHPdisposenedisposevidemmentpasdetypespcialpourlesboolensmaisacceptecependantdeuxvaleurs :
trueetfalse.lexcution,lesvaleursassocies(1pourtrue,rienpourfalse)sontaffiches.
<html>
<head><meta/>
<title>PHP et booleens</title>
</head>
<body>
<?php
$b1=true;
$b2=false;
echo "Vrai : $b1<br />";
echo "Faux: $b2<br />";
?>
</body>
</html>
4.Affectation
a.Affectationdevaleurs
Pour donner une valeur une variable, il faut passer par un processus daffectation laide dun oprateur. En
pseudocode,onutiliselesymboledaffectation"".gauchedecesymbole,vousplacezlenomdelavariable,
droite la valeur. Vous trouverez aussi dans certaines reprsentations algorithmiques le " := " issu du Pascal. Les
deuxsontquivalentsetutilisables(maisvitezdelesmlanger,poursyretrouver).
Voiciquelquesexemplesdaffectationsenpseudocode.
PROGRAMME AFFECTATION
VAR
a:entier
b,c:rels
titre:chane
vrai:boolen
DEBUT
a10
b3,1415927
c12345
titre"ma premire affectation"
vraiTRUE
FIN
VousavezvidemmentrencontrdanslesprogrammesPHPprcdentscommentaffecterunevaleurunevariable.
Cestlesigne"="quiestutilis.Lemploidusigne"="enpseudocodenapaslammesignification,cequevous
verrezunpeuplusloindanslesoprateursdecomparaison.
Attentioncependantnepasvoustromperentreletypedelavariableetlavaleurquevousluiaffectez.Cestune
Dansleprogramme
- 6 - ENI Editions - All rigths reserved
cause derreur frquente, tant en pseudocode algorithmique que dans un vrai langage. Dans certains cas, cela
pourramarcher(danslesensolordinateurneretournerapasforcmentuneerreur)maislersultatneserapas
celuiattendu.Considrezlexemple,pascorrect,suivant:
PROGRAMME AFFECT2
VAR
a:entier
b:rel
c:chane
DEBUT
b3,1415927
a3,1415927
c12345
FIN
Lexcutiondecepseudocodeprovoquequelquessurprisesetdeserreurs.ToutdabordbreoitlavaleurdePIet,
commebestdclarenrel(pourlexemple,letypeclassiqueNumriquenauraitpastpertinent),cestcorrect.
Puisareoitlammechose.Oraestunentier!Suivantleslangagesdeprogrammation,vousobtiendrezsoitune
erreur,soitcelafonctionnera,maispasparfaitement.Lavariableatantunentier,ilsepeutqueanecontienneque
la valeur entire de b, soit 3. Notez que certains langages autorisent une conversion explicite dun type vers un
autre.Onparledetranstypage.Quantlavariablec,elledoitcontenirunechanedecaractres,dlimitepardes
guillemets,absentsici,cequiprovoqueraitprobablementuneerreur.
LecodePHPsuivantfonctionneparfaitement :letranstypageestaccept.Ilconsisteindiquerentreparenthses,
avant la valeur affecter, le type final de celleci. La valeur sera convertie, si possible, dans ce type avant dtre
affecte. Le transtypage vers le bas (dun type de grande taille vers une taille rduite) risque de provoquer une
pertedeprcision,voiremmedungrandnombredinformations.Danscetexemple,lavariablef_aestexplicitement
convertieenentier.PHPnevadoncconserverquelapartieentiredef_aeti_acontiendra3.
<html>
<head><meta/>
<title>Egalit avec transtypage</title>
</head>
<body>
<?php

$f_a=(float)(3.1415927);
$i_a=(int)3.1415927;

echo "$f_a $i_a";


?>
</body>
</html>
Cequiretourne :
3.1415927 3
Afindenepasvousfairetapersurlesdoigtsparvotreprofesseurdalgorithmique,prcisezlebontypedsledbut
etvitezlesaffectationsdouteuses.
Vous avez le droit de donner une valeur initiale ou par dfaut une variable lors de sa dclaration. Dans ce cas,
vousdevezutiliserloprateurdaffectationlorsdeladclaration.
PROGRAMME DECLARE2
VAR
a10:entier
b3.5,c8.2347:rels
titre"Mon titre":chane
vraiVRAI:boolen
DEBUT
Afficher a
FIN
Avec une valeur par dfaut, la variable dispose dj dun contenu ds son initialisation et peut tre directement
utilise.
Dansladclaration
- 7 - ENI Editions - All rigths reserved
b.Affectationdevariables
Le principe est exactement le mme sauf que cette fois vous ne mettez pas de valeur droite mais une autre
variable,cequiapoureffetdaffecterlavariabledegauchelavaleurdelavariablededroite.
PROGRAMME AFFECT3
VAR
a,b:entiers
DEBUT
a10
ba
FIN
L encore, vous prendrez bien soin de ne pas mlanger les torchons et les serviettes en naffectant pas des
variablesdetypesincompatibles.Lexemplesuivantestvidemmentfaux.
PROGRAMME AFFECT4
VAR
a:entier
b :rel
DEBUT
b3.1415927
ab
FIN
Lencore,noubliezpasuneventuelleconversiondansunvrailangageetdedclarercorrectementvosvariables
danslebontype.LexemplePHPsuivantnedevraitpasvousposerdeproblmesdecomprhension.
<html>
<head><meta/>
<title>Egalits varies</title>
</head>
<body>
<?php

$a=10;
$r1=3.1415927;
$txt1="Hello World";

$b=$a;
$r2=$r1;
$c=(int)($r2);
$txt2=$txt1;

echo "$r2<br />";


echo "$c<br />";
echo "$txt2<br />";

?>
</body>
</html>
5.Saisieetaffichage
Poursimulerlaffichageduntexteoudunevaleursurlcran,ilfaututiliserlapseudoinstruction"Afficher"quiprend
sasuiteunechanedetexteouunevariable.Sivousmlangezdutexteetdesvariables,sparezceuxcipardes
virgules.laffichage,lesvirgulesserontremplacespardesespaces.
PROGRAMME AFFICHE
VAR
a:entier
texte:chane
DEBUT
a10
texte"Hello World"
Afficher a
Afficher texte
- 8 - ENI Editions - All rigths reserved
Afficher "Bonjour les amis"
FIN
Pourinviterunutilisateurrentrerauclavierunevaleur,utilisezlemotSaisir.Lalgorithmeattendraalorsuneentre
auclavierquiseravalideaveclatouchedentre.Lavaleurquevoussaisissezseraplacedanslavariableindique
lasuitede"Saisir".
PROGRAMME SAISIE
VAR
reponse:chane
DEBUT
Afficher "Quel est votre nom ?"
Saisir reponse
Afficher "Vous vous appelez",reponse
FIN
Sivousdevezsaisirplusieursvaleursplacerchacunedansunevariable,vouspouvezutiliserplusieurs"Saisir",mais
plus simplement placez les diverses variables la suite dun unique Saisir, spares par des virgules. Lutilisateur
devraalorssaisirplusieursvaleurs(selonlelangagefinal:lesuneslasuitedesautressparespardesespaces,
ouenappuyantsurlatouche[Entre]aprschaquesaisie).
PROGRAMME SAISIE_MULTIPLE
VAR
nom,prenom:chanes
DEBUT
Afficher "Quels sont vos noms et prnoms ?"
Saisir nom,prenom
FIN
Vous avez dj remarqu depuis le premier chapitre quen PHP les exemples utilisent "echo" pour afficher quelque
chosedanslaconsoleMSDOS,dansleshellUnix/MacOSoudestinationdunepageHTMLpourunnavigateur.
Lasaisievialaconsole,silescriptPHPestlancdepuisunterminal,esttrssimple :
<?php

echo "Entrez un texte : ";


$saisie=fgets(STDIN);

echo $saisie;

?>
Vialenavigateurweb,lasaisieesttotalementdiffrente,puisquilfautpasserparlesformulaires.Lexemplesuivant,
dont les principes seront repris de nombreuses fois par la suite, partout o cela sera possible et cohrent, montre
commentutiliserdesformulairesenHTMLetrcuprerlesvaleurssaisiesenPHP.Cestlabasemmedelapuissance
decelangage.Lesstructuresdecontrle(if)sontexpliquesdansleprochainchapitre.Ceprogramme,excutune
premirefois,afficheleformulairedesaisie.Lasecondefois,ilaffichelersultat.
<html>
<head><meta/>
<title>Saisie en HTML</title>
</head>
<body>
<?php
if(!isset($_GET[txt])) {
?>
<form method="GET">
Votre saisie : <input type="text" size="15" name="txt" /><br />
<input type="submit" name="OK" /><br />
</form>
<?php
} else {
$txt=$_GET[txt];
echo "Vous avez saisi $txt<br />\n";
}

?>
</body>
- 9 - ENI Editions - All rigths reserved
</html>
6.Lesconstantes
Vouspouvezdciderdedonnerunevaleurunevariableetquecettevaleurnedoitpaschanger:elledoitresterfixe
dansletempsetinaltrable,pourtouteladureduprogramme.Savaleurdoitresterconstante.Dosonnom.
Une constante est une valeur, reprsente tout comme une variable par une valeur, qui ne peut pas tre modifie
aprssoninitialisation.Elleestimmuable.UnexempledeconstantepourraittrelavaleurdePI.
UneconstantesedclaregnralementavantlesvariablessouslemotclCONST.Elleestaussidun type donn.
Certainslangagesdeprogrammationpassentparfoisoutredutypedelaconstante.
PROGRAMME CONSTANTE
CONST
PI3.1415927:rel
VAR
R5:entier
Aire:rel
DEBUT
Aire2*PI*R
Afficher Aire
FIN
Une constante sutilise exactement comme une variable, sauf quelle ne peut pas recevoir de valeur. En PHP, une
constanteestdclareavecunsousprogramme" define ".Lapremirevaleurestlenomdelaconstante,laseconde
estlavaleurassocie.Notezquilnyapasde$devantlenomduneconstante,nisadclaration,nilorsdeson
utilisation.
<html>
<head><meta/>
<title>Cercle avec constante</title>
</head>
<body>
<?php
define("PI",3.1415927);
$r=5.2;

$surface=PI*$r*$r;
$perimetre=2*PI*$r;

echo "$surface $perimetre";


?>
</body>
</html>
- 10 - ENI Editions - All rigths reserved
Oprateursetcalculs
1.Lesaffectations
Le symbole daffectation "" fait partie dune grande famille, celle des oprateurs. Comme son nom lindique, un
oprateurestutilispouretdansdesoprations.Lesymbole""estunoprateurdaffectation.Ilexisteplusieurs
oprateursquiserventauxcalculs,affectations,comparaisons,rotations(debits),groupages,etc.
2.Lesoprateursarithmtiques
Pourquelesalgorithmespuissenteffectuerdescalculs,ilfautpouvoiraumoinsfairedesoprationssimples.Vous
utiliserezpourcelalessymbolessuivants:
G +:addition
G :soustraction
G * ou x:multiplication(ilestplusfaciledcrireunxpourfoisquunetoile)
G /:division
G %oumod:modulo
G DIV:ladivisionentire
Rappel:unmoduloestlerestedunedivisionentire.Parexemple15/2vaut7,maisilreste1.Onditque15
modulo2vaut1.
Ces oprateurs sont dits binaires car ils sutilisent avec deux valeurs : une avant le symbole et une aprs. Les
valeurs avant et aprs peuvent tre des donnes (de mme type que la variable qui reoit les rsultats) ou des
variables.Voiciunexempledoprationsdansunsimplealgorithmequicalculelasurfaceetleprimtreduncercle.
PROGRAMME CERCLE
VAR
r, PI, surface,perimetre:rels
DEBUT
PI3,1415927
r5,2
surfacePI * r * r
perimetre2 * PI * r
Afficher surface,perimetre
FIN
Iciilnyaquedesmultiplications.Vouspouvezdjremarquerquevousavezparfaitementledroitdechanervos
calculsetdemlangerlesdonnesetlesvariables.Simulezlesdeuxcalculs:
surfacePI * r * r
surface3,1415927 * 5,2 * 5,2
surface84.948666608

perimetre2 * PI * r
perimetre2 * 3,1415927 * 5,2
perimetre32.67256408
EnPHP :
<html>
<head><meta/>
- 1 - ENI Editions - All rigths reserved
<title>Cercle</title>
</head>
<body>
<?php
$pi=3.1415927;
$r=5.2;

$surface=$pi*$r*$r;
$perimetre=2*$pi*$r;

echo "$surface $perimetre";


?>
</body>
</html>
Ilestpossibledegrouperlescalculsavecdesparenthses"(...)".Cellesciinfluentsurlaprioritdescalculs.Vous
vous rendrez compte en effet que les oprateurs ont des degrs de priorit diffrents. Par exemple, une
multiplicationest"plusforte"quuneaddition.
Prenezlexemplesuivant:
PROGRAMME PRIORITE
VAR
x,y,z,total:entiers
DEBUT
x3
y4
z5
totalx + y * z
Afficher total
FIN
Quevaudratotal?Sivouseffectuezlecalculdegauchedroite,vousobtenez3+4=7,7*5=35.Sivousfaitesceci
avec votre calculatrice, vous nobtiendrez pas ce rsultat car la multiplication a un ordre de priorit plus lev que
laddition.Lordinateurvadabordfaire4*5=20,puis3+20=23.Lersultatestdonc23.Sivoussouhaitezindiquer
lalgorithme et donc ensuite, dans un vrai langage, une modification des priorits, vous devez utiliser les
parenthses.
PROGRAMME PRIO2
VAR
x,y,z,total:entier
DEBUT
x3
y4
z5
total(x + y) * z
Afficher total
FIN
Cettefoisvousobtenezlersultat(3+4)*5,cequivaut35.
VoicilquivalentenPHPquiregroupelesdeuxcas :
<html>
<head><meta/>
<title>Priorites</title>
</head>
<body>
<?php
$x=3;
$y=4;
$z=5;

$total=$x+$y*$z;
echo "$total<br />";

$total=($x+$y)*$z;
echo "$total<br />";
?>
- 2 - ENI Editions - All rigths reserved
</body>
</html>
Voiciunsimplealgorithmepourcalculerlesrsultatsdunequationduseconddegr.Unequationduseconddegr
estdelaforme:
ax+bx+c=0
Pourrsoudreunetellequation,ilfautcalculerun"discriminant"souslaforme:
=b-4ac
Suivantlavaleurdudiscriminant,lesrsultatsvarient:
G si>0,ilyadeuxsolutions
G si=0,ilnyaquuneseulesolution
G si<0,lquationnapasdesolution.
Pourlexemple,lalgorithmepartduprincipequelquationestvolontairementposecommeayantdeuxsolutions.Il
sera complt dans le prochain chapitre consacr aux tests. Les rsultats dune quation du second degr sont
appelslesracines.Pourlescalculer,ilfaututiliserlesoprationssuivantes:
et

Pourlaracinecarre,vousutiliserezdanslalgorithmelasyntaxe"racine(x)"oracineestunefonctionmathmatique
qui calcule la racine carre de x. Cest un peu lquivalent des fonctions dun tableur, vous verrez dans ce livre
commentcrervospropresfonctions.
PROGRAMME EQUATION
VAR
a,b,c,delta,x1,x2 :rels
DEBUT
a3
b6
c-10
delta( b * b ) - ( 4 * a * c )
x1( -b + racine(delta) ) / ( 2 * a )
x2( -b - racine(delta) ) / ( 2 * a )
Afficher "les rsultats sont :"
Afficher "x1=",x1
Afficher "x2=",x2
FIN
EnPHP,notezlutilisationdefonctionsmathmatiquesintgrescommesqrt(racinecarre) :
<html>
<head><meta/>
<title>Equation du second degr</title>
</head>
<body>
<?php

$a=3;
$b=6;
$c=-10;
$delta=($b*$b)-(4*$a*$c);
$x1=(-$b+sqrt($delta))/(2*$a);
$x2=(-$b-sqrt($delta))/(2*$a);
echo "les rsultats sont :";
echo "x1=$x1<br />";
echo "x2=$x2<br />";
?>
</body>
- 3 - ENI Editions - All rigths reserved
</html>
Quelqueslangagesadmettentdesoprateursarithmtiquesunaires,cestdirequineprennentquunevaleur:
G ++xincrmentede1lavariablex
G x++idemmaisaprslutilisationencours
G xdcrmentede1lavariablex
G xidemmaisaprslutilisationencours
PHPacceptecesoprateurs.Cettecriturepeutsurprendre.Voiciunexemple:
PROGRAMME UNAIRE
VAR
a:entier
DEBUT
a1
Ecrire ++a
Ecrire a++
Ecrire a
FIN
G Lepremieraffichageindique2,lavariableaestincrmenteavantsonutilisation.
G Ledeuximeindique2aussi,lavariableaestincrmenteaprssonutilisation.
G Ledernierindique3.
Lesoprateurs+etpeuventaussitreutilisscommeoprateursunaires:placsavantunscalaireouune
variable,lesigne""donneralopposdecettevaleur(1estgal1).
3.Lesoprateursboolens
Lesoprateursnepermettentpasquedefairedescalculs.Dansuneexpression,unoprateurpeutaussieffectuer
desvaluationsdeboolens.Vousavezvuquepourlordinateurtoutcequiestvraiestdiffrentde0,cequiest
fauxvalant0.Commentalorsfairesideuxexpressionssontlunevraie,lautrefausse,pourconnatrelavaleurdes
deuxconjugues?Ilfaututiliserdesoprateursboolenspourindiquercequidoittreconsidrcommevrai:lun
oulautre,lesdeuxenmmetemps,etc.
G LoprateurETindiquequelesdeuxexpressionssituesavantetaprsdoiventtretouteslesdeuxvraies
pourquelensemblelesoitaussi.
G LoprateurOUindiquequeseulelunedesdeuxexpressions,quecesoitcellesitueavantoucellesitue
aprs,doittrevraiepourquelexpressioncompltesoitvraieaussi.
G LeNONestlangation.Silexpressiontaitvraieelledevientfausseetviceversa.
Lesoprateursboolenssontrgisparlalogiqueboolenne,dunomdelinventeurnonpasdelalogiqueellemme,
maisdestravauxdeGeorgeBoolequiauXIXmesiclearestructurtoutelalogiqueenunsystmeformel(quelon
peutinterprteravecdesmots,desphrasescomprhensibles).Prenezlesdeuxexpressions:"Ilfaitbeauetlesoleil
brille".Lapremireexpression"ilfaitbeau"estvraiesilfaitvraimentbeau.Lasecondeexpression"lesoleilbrille"
est vraie si le soleil brille vraiment. Si les deux expressions sont vraies, alors lexpression globale est vraie. Par
contre:"Ilaneigetilfaitbeau".Silaneig,cettepremireexpressionestvraie.Cependantsilnefaitpasbeau,la
secondeexpressionestfausse.Lensembleestdoncfaux(danslecascontraire,chaussezvosskis).
Les trois oprateurs logiques ET, OU et NON peuvent tre simplement compris laide de petits tableaux appels
parfois "tables de vrit". Exp1 et Exp2 sont des expressions boolennes vraies ou fausses. Par exemple
lexpressiona=1estvraiesiavautvraiment1.
- 4 - ENI Editions - All rigths reserved
ET:
TabledevritET
Ce tableau est comprendre ainsi : si Exp1 est vraie et Exp2 est vraie, alors lensemble est vrai. On dit plus
gnralementqueExp1ETExp2estvrai.DanslecasduET,lensembleestvraiuniquementsilesdeuxexpressions
sontvraies:luneETlautre.Danslesautrescas,commeaumoinslunedesdeuxestfausse,alorslersultattotal
estfaux.
OU:
TabledevritOU
DanslecasduOU,aumoinslunedesdeuxexpressionsdoittrevraiepourquelensemblesoitvrai.Seuleuneseule
assertionestdoncfausse,danslecasolesdeuxexpressionssontfaussestouteslesdeux.
NON:
- 5 - ENI Editions - All rigths reserved
TabledevritNON
LeNONesttrsfacilecomprendre,puisquelexpressionboolenneestinverse:cequitaitvraidevientfauxet
viceversa.
Dansquelcaslesoprateursboolenssontilsutiles?Danslesexpressionsutilisesdansdesconditions(excuter
une action selon tel ou tel critre) quand ces conditions sont multiples. Par exemple, si vous voulez excuter une
actionuniquementsideuxvariablesaetbsontvraies(contiennentautrechoseque0).
PROGRAMME ET1
VAR
a,b:entiers
result:boolen
Dbut
a1
b2
resulta ET b
Afficher result
Fin
Notezquelalgorithmecidessusnevrifiepassiavaut1etbvaut2.Ileffectueloprationlogique"aETb".
Commelesvariablesaetbsonttouteslesdeuxdiffrentesde0,ellessontconsidrescommevraies.Donc
lavariableresultcontient"VRAI"etsafficheraainsisilelangagelepermet,ousousformedelavaleur1.
4.Lesoprateursdecomparaison
Lalgorithme cidessus ne vrifie pas les valeurs des variables. Il faut pour cela utiliser dautres oprateurs. Pour
valuer une expression, il faut parfois avoir besoin de comparer des valeurs. Comment savoir si un utilisateur de
votrelogicielarponduouiounonvotrequestion?Commentsavoirsilechiffresaisidanslejeudulancerded
correspond au bon rsultat ? Vous allez devoir utiliser les oprateurs de comparaison. Il y en a plusieurs. Ceuxci
sontdesoprateursbinaires:ilsprennentdeuxvaleurs,uneavantetuneaprs.Cesvaleurspeuventtresoitdes
scalaires (entiers, rels, chanes de caractre selon le langage utilis) directement, soit leur reprsentation sous
formedevariable.Lordinateurvalueralersultatdecettecomparaisonsousformeboolenne:lersultatseravrai
oufaux.
Les langages ragissent diffremment selon les comparaisons et les types des donnes compares. L
encore, prenez garde ne pas mlanger les types. Aussi, si en pseudocode algorithmique les chanes de
caractrespeuventtrecomparesavectouslesoprateurs,prenezgardelinterprtationquienestfaitepar
leslangages.EnCnotamment(etentreautres)ilfautpasserpardesfonctionsspcialises.
a.Lgalit
- 6 - ENI Editions - All rigths reserved
Loprateur dgalit scrit avec le signe "=" et sert vrifier si les deux valeurs droite et gauche sont
identiques, cestdire quelles ont la mme valeur. Dans cet exemple, lexpression a=b est vraie, mais a=c est
fausse.
PROGRAMME EGALE
VAR
a,b,c:entiers
DEBUT
a5
b5
c10
Afficher a=b
Afficher a=c
FIN
Il ne faut surtout pas confondre, tant en algorithmique que dans les langages de programmation, loprateur
daffectation "" et loprateur dgalit "=". En mathmatique et en langage courant, a=b peut avoir deux
significations:soitareoitlavaleurdeb,soitoncherchevrifiersiaetbsontgaux.Laquelleestlabonne?
DansunlangagecommeleBASIC,linterprtationdusigne"="dpendducontexte.Avecunevariableavantethors
contextedecondition,cestuneaffectation.Dansuneexpressionconditionnelle,cestunecomparaison.Durdesy
retrouver!CestpourcelaquecertainslangagescommeC,C++,JavaouencorePHPutilisentloprateurdgalit
"==",deuxfoisgal,pournepasleconfondreavecloprateurdaffectation"=".
Dansceslangages:
a=b=c
estuneexpressionvalablequisignifiequeareoitlavaleurdebquiellemmereoitlavaleurdec.Lavariableb
estaffecteenpremier,puisa.Lestroisvariablesdisposentdelammevaleurlafin.
a=b==c
estaussiuneexpressionvalable.Le"=="estprioritairesurle"="etb==cestfauxcar5et10sontdiffrents.Faux
vaut0.Lavariableareoitlersultatdelexpressionb==c,doncareoit0.Lexpressiontotaleestfausse,ellevaut
zro.Sivousaviezeu:
c=a==b
Lavaleurdeaestgalecelledeb,donclexpression"a==b"estvraieetvaut1.Donccvaut1etlexpressionest
vraie.Nuance...
b.Ladiffrence
Loprateurdediffrenceestdcritparlessymboles""ou"!="(pointdexclamationetgal)quilfautcomprendre
commelangation(voiroprateurboolen)delgalit.Voustrouverezparfois"<>",commequivalentdeinfrieur
ousuprieur:sicestinfrieurousuprieur,alorscenestpasgal.Attention,uneexpression"a!=b"estvraiesila
valeurdeaestdiffrentedeb.
PROGRAMME DIFF
VAR
a,b:entiers
DEBUT
a10
b20
Afficher a!=b
Afficher NON(a=b)
FIN
Lesrsultatsdecetalgorithmesontidentiques.Lesvaleursdeaetdebsontdiffrentes.Danslepremiercas,"a!
=b"estvrai.Danslesecondcas,"a=b"estfaux,maislangationdecersultatestvraie.
c.Infrieur,suprieur
Quatreoprateurspermettentdecomparerdesvaleursinfrieuresetsuprieures,avecousansgalit :
- 7 - ENI Editions - All rigths reserved
G <:infrieur
G ou<=:infrieurougal
G >:suprieur
G ou>=:suprieurougal
La comprhension de ces quatre oprateurs ne doit pas poser de problme. Le rsultat est vrai si la valeur de
gaucheestinfrieure,infrieureougale,suprieure,suprieureougalelavaleurdedroite.
PROGRAMME INFSUP
VAR
a,b,c:entier
DEBUT
a10
b10
c20
Afficher a<c
Afficher a<=b
Afficher c>b
Afficher c>=c

Afficher NON(c<=a)
Afficher c>a
FIN
Lesquatrepremiresexpressionsdcriventparfaitementlesrsultatsattendus:ellessonttoutesvraies.Lesdeux
derniressontfaussesetparfaitementquivalentes.Silavaleurdecnestpasinfrieureougalea,elleluiest
forcmentsuprieure.CestencoreiciunepropritdelalgbredeBoole.
5.Lecasdeschanesdecaractres
Vouspouvez,enpseudocodealgorithmique,utiliserlesoprateursdecomparaisonavecdeschanesdecaractres.
Lacomparaisonseffectuealorsenfonctiondelordrealphabtiquedeschanesdecaractres.Cetordreesttablien
fonction de la numrotation des caractres dans la table ASCII ou la page Unicode. Dans cet exemple, txt2 est
suprieurtxt1danslesensodansuntrialphabtiquedesdeux,lebestsituaprslea.
PROGRAMME TXT
VAR
txt1,txt2:chanes
DEBUT
txt1"a"
txt2"b"
Ecrire txt2>txt1
FIN
Cesoprateursappliqusdeschanesdecaractressontunbonexempledecequipeutsepassersiparhasard
vousvoustrompezdanslestypesetlesaffectations.Danslexemplesuivant,lesdeuxchanes"1111"et"2"sont
compares,ainsiquelesdeuxentiersdemmevaleur.Lesquellessontlesplusgrandes?
PROGRAMME TXTCOMP
VAR
x,y :entiers
txt1,txt2:chanes
DEBUT
x1111
y2
Afficher x>y

txt1"1111"
txt2"2"
Afficher txt1>txt2
FIN
- 8 - ENI Editions - All rigths reserved
Danslepremiercas,lexpressionestvraie.Danslesecond,elleestfausse.
Ilestpossibledadditionnerdeschanesdecaractres.Lersultatestlaconcatnationdesdeuxchanes.Ilnestpar
contrepaspossibledutiliserlesautresoprateursarithmtiques.Vouspouvezutiliserloprateur "&"ou"+"pour
concatner,cependantlepremierestprfrable.
PROGRAMME CONCAT
VAR
txt1,txt2:chanes
DEBUT
Afficher "Comment vous appelez-vous ?"
Saisir txt1
txt2"Vous vous appelez "&txt1
Afficher txt1
FIN
- 9 - ENI Editions - All rigths reserved
Pourallerplusloin
1.Lesnombresngatifs
Unnombresignparexemplesur8bits,contientunbitrservpourlesigne.Cestentoutcasainsiquonvousle
prsente pour plus de comprhension. Gnralement cest le bit de poids fort, le plus gauche, qui sert pour le
signe:0lenombreestpositif,1ilestngatif.Parexemple9
(10)
devraittrereprsentpar10001001
(2)
.Cette
reprsentation pratique pour le lecteur ne lest cependant absolument pas pour lordinateur.Additionnez 9 et 30,
vousobtenez21.
Enbinaire,30quivaut00011110.Lebinairesadditionnecommeledcimal:1+1=10doncretenuede1etainside
suite:
00011110 (30)
+10001001 (-9)
=10100111 (-39)
Il y a un problme ! Vous devriez obtenir 21 soit 00010101 ! Cest quen ralit un nombre ngatif nest pas
reprsent comme ceci. Lordinateur "ruse" avec les manipulations binaires. Lastuce consiste prendre le
complment un de la valeur binaire en valeur absolue (9 => 9) et de lui ajouter un (on obtient au final un
complmentdeux).Lecomplmentunconsisteremplacertousleszros(0)pardesun(1)ettousles1pardes
0.
11111111 (complment un)
00001001 (9)
=11110110 (tout est invers)
+00000001 (+1)
=11110111 (quivaut -9 reprsentation machine)
Sivousadditionnezunnombreavecsoncomplmentdeux,vousobtenez0(plusuneretenue).

Maintenant,additionnezcersultat30:
11110111 (quivaut -9 reprsentation machine)
+00011110 (30)
=00010101 (21 - plus une retenue)
Cest gagn ! En pratique, le microprocesseur neffectue pas tous ces calculs de conversion car il sait reprsenter
nativementeninternetoutescesvaleurs,matriellement.
2.Lareprsentationdesnombresrels
Silestsimpledesereprsenterunnombreentierenbinaire,celasemblepluscomplexeavecunnombrevirgule.En
effet,leprincipemmedubinaireveutquechaquevaleurreprsenteunepuissancede2enfonctiondesaposition
de0n,doncunevaleurentire.Enplus,lesnombresrelsnontjamaislammetaille:plusoumoinsdechiffres
avantlavirgule,plusoumoinsaprs.Ilfautprendreleproblmelenvers:neseraitcepaspluttlavirgulequise
dplace?
Ensuite, estce possible de reprsenter un nombre rel sous forme de rsultat dune manipulation de nombres
entiers?
Prenezunexemplesimple:1,2.
1,2=12x0,1=12x10
- 1
=12E-1

Envritablenotationscientifique,oncrit1,2E0soit1,2x10
0
.

Voilquiesttrsintressant.Lesnombres12,10et1pourraientparfaitementtrecodsdirectementenbinaire.
Certains ordinateurs spcialiss, dits calculateurs, fonctionnent de cette manire. Vrifiez avec une valeur plus
importante:182,1957:
182,195=182195x0,001=182195x10
- 3
=182195E-3

- 1 - ENI Editions - All rigths reserved


Envritablenotationscientifique,oncrit1,82195E2soit1,82195x10
2
.

Cestleprincipedelanotationscientifiquequilvafalloirretenirmaisenbinaire,pasendcimal.Lemicroprocesseur
ne manipule pas de puissances de 10, mais de 2. Aussi il faut trouver, selon le mme principe, un moyen de
transformertoutcecienbinaire.Danslapartieavantlavirgule,cesontdespuissancesde2positives(2
0
, 2
1
,2
2
,
etc). Aprs la virgule, il faut passer en puissances de 2 ngatives (2
1
, 2
2
, 2
3
, etc). La premire partie ne pose
aucunproblme.
182
( 1 0 )
=10110110
( 2 )

La seconde partie est plus dlicate. Elle se base sur les puissances ngatives de 2. Pour rappel mathmatique 2

1
=1/2
1
,2
2
=1/2
2
,etc.

0,195x2=0,390 <1, on pose 0, 0,0...


0,390x2=0,780 <1, on pose 0, 0,00...
0,780x2=1,560 >1, on pose 1, 0,001...
0,560x2=1,120 >1, on pose 1, 0,0011...
0,120x2=0,240 <1, on pose 0, 0,00110...
0,240x2=0,480 <1, on pose 0, 0,001100...
0,480x2=0,960 <1, on pose 0, 0,0011000...
0,960x2=1,920 >1, on pose 1, 0,00110001...
0,920x2=1,840 >1, on pose 1, 0,001100011...
0,840x2=1,680 >1, on pose 1, 0,0011000111...
0,680x2=1,360 >1, on pose 1, 0,00110001111...
0,360x2=0,720 <1, on pose 0, 0,001100011110...
0,720x2=1,440 >1, on pose 1, 0,0011000111101...
0,440x2=0,880 <1, on pose 0, 0,00110001111010...
0,880x2=1,760 >1, on pose 1, 0,001100011110101...
0,760x2=1,520 >1, on pose 1, 0,0011000111101011...
etainsidesuite!Icivousobtenezuneprcisionde2
16
.Sidailleursvousfaitesletotalendcimal(2
3
+2
4
+2
8
+2

9
+2
10
...) vous obtenez un total de 0,1949920654296875. Vous voyez quonnobtient pas la valeur exacte. Mme
avecplusdeplaceetplusdecalculs,lersultatapprocherait0,1949999999...sansjamaisatteindre0,195.
0,195
( 1 0 )
=0011000111101011
( 2 )
arrondi une prcision de 2
- 1 6
.
182,195
( 1 0 )
=10110110,0011000111101011
( 2 )
, en arrondi.
10110110,0011000111101011=1,01101100011000111101011x2
7
Enfin,puisquele1avantlesvirgulesestimplicite,onlesupprime.Onobtientcequonappelleunemantisse.
Mantisse=01101100011000111101011
Plusonsouhaitequelaprcisionsoitfine,plusondescenddanslespuissancesde2.Vousvoyezcependantquun
momentilfautsarrteretquilfautsecontenterduneprcisiondecompromis.Cesystmeestaussigourmanden
place. Il existe une norme pour reprsenter les nombres rels en binaire, elle a t dfinie par lIEEE, pour des
prcisionsditessimplesetdoubles.Enprcisionsimple,lenombrerelestcodsur32bits.Enprcisiondouble,il
lestsur64bits.Ilexisteaussiuneprcisionsur80bits.Leprincipeestlemmedanstouslescas.Ilestbassurla
reprsentationdusigne"S"dunombre,dunemantisse"M"etdunexposant"E".
Reprsentationbinaire32bitsdunrelsimpleprcision
Dansunnombrerelensimpleprcisionsur32bits,unbitestrservpourlesigne,8pourlexposantet23pourla
- 2 - ENI Editions - All rigths reserved
mantisse,danscetordre,lebitdepoidsforttantlesigne.Lexposantdoitsubirundcalagede2
n1
1,ntantle
nombre de bits utiliss. Le dcalage est donc de 127. Enfin, il ne faut pas conserver le 1 de la mantisse : il est
implicite.
Signe S:0
Exposant E: 7+127=134
( 1 0 )
, soit 10000111
( 2 )

Mantisse: 182,195
( 1 0 )
, sur 23 bits 01101100011000111101011
( 2 )

Aufinalvousobtenezlenombrecoden32bitssuivant:
Pourretrouverdepuiscenombre32bitslavaleurrelleendcimal,ilfautappliquerlaformulesuivante:
Formuledecalculdunreldepuissareprsentationbinaire
Reprenezlesvaleursprcdentes,convertiesendcimalpourplusdefacilit:
G S=0
G E=137
G M=3551723

Lecodagedunrelsur32bitsamnedeuxremarques:
G Latailledelamantisselimitelaprcisionpourdesnombresdegrandevaleur,carpluslenombreavantla
virgule occupe de la place, plus la taille restante dans la mantisse est rduite pour les chiffres aprs la
virgule.Cetteremarqueestaussidansunemoindremesurevalablepourunrelcodsur64bits.
G Laprcisionpeutservlerinsuffisantepourcertainesapplications.SivousenvoyezunefusesurJupiteren
calculantlatrajectoireensimpleprcisionpourchaquelmentdecalculintervenant,lafuserisquecette
chelledenepasarriveraubonendroitcausedessommesdimprcisions...
Leprincipedurelendoubleprcisionestexactementlemme,saufquelestaillesdelexposantetdelamantisse
sont agrandies. Lexposant fait 11 bits, la mantisse 52 bits. Si vous reprenez les calculs mais cette fois en double
prcision,vousarrivezuntotalde182,194999992847442626953125avecunarrondi2
24
!

Unexempleconcretetsimpledeserreursdarrondipeuttretoutfaitmisenvidenceavecunesimplecalculatrice
trsbasprix,neseraitcequendivisant1par3.Obtenezvous1,333333ou1,333334?Enrutilisantcettemme
valeurlescalculssuivantssontsouventfausss.
Vulenombredemanipulationspourarrivergrerlesnombresrels,leurmanipulationparlemicroprocesseurest
plus lente quavec des nombres entiers. Heureusement, ct, puis dans les microprocesseurs sont apparus des
composantssupplmentairesappelsFPU,FlottingPointUnit,dontlebutestdepouvoirmanipulerdirectementles
nombresetlesfonctionsmathmatiquesassocies,acclrantfortementletraitementdesdonnes.Peuttreavez
vous entendu parler des processeurs Intel 386 qui quipaient les PC vers 1990. Un coprocesseur mathmatique
appel80387pouvaitsouventtreajoutpouracclrerlesoprations.Mmelesordinateurspersonnelsdetype
S E E E E E E E E M M M M M M M M M M M M M M M M M M M M M M M
0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1
- 3 - ENI Editions - All rigths reserved
AtariSTpouvaientsevoirajouteruncoprocesseurdecetype(68881).Aujourdhuicescoprocesseursnensontplus:
ilssontdirectementintgrsdanslemicroprocesseur.LederniermicroprocesseurdevotrePCencontient.
3.Lesdates
Lesdatessontreprsentesdedeuxmaniresdanslordinateur.LapremireestleformatBCDvuprcdemmentet
cecipresqueexclusivementdanslebios(setup)devotreordinateur,pourdesraisonshistoriques.Lesecondestle
timestampUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuitpileUTC.Cette
date a t retenue car bien que lide dUnix soit apparue en 1969, lredUnix (arrive de la premire version et
expansion)dbutedanslesannes1970.
Le11avril200721heures,24minuteset43secondes,letimestampUnixestde1176319483secondes.
Letimestampestgnralementcodsurunentierde32bitssign.Silestngatif,ilreprsenteunedatedavant
1970,silestpositifunedatesuivante.Ilcouvreuneplagede136ans,du13dcembre190120heures45minutes
52 secondes jusquau 19 janvier 2038, 3 heures 14 minutes 8 secondes. Passe cette date, que se passeratil ?
Touslessystmesdexploitation ou les ordinateurs nayantpasprvuceproblmerencontrerontunmagistralbug
digne de celui de lan 2000, ou pire : le bug de lan 2000 (qui na pas eu lieu, ou peu, malgr les prdictions
catastrophiques)taitessentiellementlogiciel,letimestampestdfiniauseindusystmedexploitation.
Alorsquefaire?Dj,ilresteunetrentainedannespourmodifierlachoseetcestbiensouventdjfait.Unixat
conuilyabientt40ansetesttoujoursextrmementutilis.Ilestfortprobablequedici30ans,luioulundeses
drivs le soit encore. Cest un systme dexploitation qui a fait ses preuves. Or les technologies voluent et les
ordinateurs actuels manipulent sans difficult des nombres de 64 bits. Un timestamp sign sur 64 bits permet de
reprsenter des dates de lpoque o lunivers tel que nous le connaissons nexistait pas et, dans le futur, une
priodeonotreSoleilnexisteraplusdepuisbienlongtemps...Ilsuffitdoncdepasserletimestampsur64bitset,
sachant quilexisteuntypetimestampenprogrammation,derecompilertouslesprogrammes.Ilny a donc aucun
soucisefaire.
4.Lescaractres
Lescaractressonthabituellementcodssur8bits,soitunoctet,enutilisantlatableASCII.Danscettetable,les
128 premires valeurs ne reprsentent pas que les caractres pour les anglais mais aussi divers codes non
affichables utiliss pour contrler laffichage dun terminal. Les caractres de 0 31 vont contenir des lments
commeleretourchariot,lepassagelaligne,latabulation,etc.Lecaractre32estlespace,le127lecaractrede
suppression.Le"A"enmajusculedmarre65,enminuscule97,leschiffresenpartantde048.Leresteestla
ponctuation,diverssignescommelessymbolesmontaires,lesoprateursetcomparateursarithmtiquesetainside
suite.Typiquement,lachane"HelloWorld!"estreprsenteainsi.
Lescaractresdunemmechaneoccupenttousdescasesmmoirescontigus.Lordinateuroupluttleslangages
utilisantleschanesdecaractresdoiventsavoirocelleci commence (cestindiqueninterneparlavariableelle
mme) et o elle finit. Cest le caractre spcial de code 0, reprsentant un caractre vide, qui indique une fin de
chane. Quand lordinateur doit rcuprer une chane, il lit tous les caractres contigus jusqu ce quil trouve le
caractrevidedecode0.
Les 128 caractres suivants reprsentent lASCII tendu, permettant de coder les caractres semigraphiques qui
taient couramment utiliss sur les terminaux : traits horizontaux, verticaux, angles, etc, mais aussi les caractres
propreschaquepays.Ces128caractressontplacsauseindepagesdecodes,dontlaplupartsontnormalises.
Quandonchangedepays,onchangedepagedecode.Cesystmeprsentecependantdeuxinconvnients:
G Lesfichierstextesetlesnomsdefichierscritsdansdautreslanguesquelanglaisneserontpasinterprts
correctementsurlessystmesnutilisantpaslammepagedecode.Typiquement,sivousutilisezunepage
decodenorvgiennesurdesfichiersenfranais,vousobtiendrezdescaractressurprenants.
G Les128octetsnesuffisentpastoujourscodertouslescaractresdunelangueparticulire,parexemple
touslesidogrammeschinoisoujaponais.Danscecas,lalphabetdeceslanguesestrestreint,oulesgens
natifs de ces pays (et dautres) doivent utiliser plusieurs pages de code, ou passer par des logiciels et
systmesgrantspcifiquementleurlangue.
Pourpalliercesinconvnients,ilafallutrouverunautresystmedecodagedescaractres.Larrivedesordinateurs
avec une grande capacit mmoire et une gestion avance de laffichage des caractres permet de disposer de
polices de caractres (un fichier qui contient tous les dessins des caractres destination de lcran ou de
limprimante) qui peuvent contenir les alphabets de la plupart des langues. Par exemple dans la police Arial, on
CodeASCII 72 101 108 108 111 32 87 111 114 108 100 33
Caractre H e l l o W o r l d !
- 4 - ENI Editions - All rigths reserved
pourrait trouver les caractres europens, mais aussi hbreux, arabes, chinois, japonais et ainsi de suite. Mais
commentreprsentercesmilliersdecaractresdiffrentsenmmoire?
Une norme appeleUnicode,reconnueparlaplupartdessystmesdexploitationetdeslogicielsnotammentsous
Unix et Windows, fait sauter cette limitation. Chaque caractre dispose dun nom et dunidentifiantnumrique,de
manire unifie et quelque soit le systme cible. Cestdire que tout produit sachant interprter les caractres
unicodeafficheraleschanesdecaractrescritessouscettenormeaveclesbonscaractres.
Untexteunicodeenchinoissafficheraenchinoissivotretraitementdetextegrelunicodeetdisposedelapolicede
caractresunicodecontenantlesidogrammeschinois.Notezquevousnavezpasvoussoucierdelamaniredont
vous tapez le texte : le systme dexploitation et les logiciels le font votre place : vous continuez taper votre
textecommevouslaveztoujoursfait.
Unicodeestunenormedereprsentationinternedescaractresetproposediversformatsdestockageenmmoire.
Actuellement, unicode reprsente plus de 245000 chiffres, lettres, symboles, ponctuation, syllabes, rgles de
reprsentation, etc. Il faut de la place pour reprsenter ceci. La mthode la plus courante, utilise notamment par
dfautsousLinux,estlUTF8,UniversalTransformationFormat.Sontudedpasselecadredecelivreetprendrait
plusieurspages.Cependant,sachezquelemodleUnicodeestunmodleencouches.
Lapremirecoucheestlejeudecaractresabstrait,enfaitunelistedescaractresetleurnomprcis.Parexemple
le""correspond"Lettremajusculelatineccdille".
La seconde est lindex numrique du caractre cod, appel point de code, not U+XXXX o XXXX est en
hexadcimal.Sansrentrerdanslesdtails,le""estreprsentparlepointdecodageU+00C7.Ilexisteplusieurs
niveauxensuite.JavautiliseuncodagedescaractressousformeUnicodesur16bits.Lepremieroctetenpartantde
la gauche reprsente le jeu de caractre, le second le numro de caractre dans ce jeu. Cest pourquoi le type
caractreenJavautilisedeuxoctets,alorsquilnenutilisequunseulenC.
- 5 - ENI Editions - All rigths reserved
Typesetlangages
1.Langagestypsounon
Quelqueslangagessonttrssouplesaveclesvariables.Vouspouveztoutdabord y mettre des nombres, puis du
texte,puisdenouveaudesnombres.Ceslangagessontdits"nontyps".Certainspoussentleraisonnementassez
loin : une variable peut contenir le chiffre 3 et lautre le texte "3 petits cochons", il pourra les additionner (ce qui
devraitdonner6)!CestlecasduPHPparexemple:letypedelavariabledpendalorsdesoncontextedutilisation,
lelangagetentantdeconvertirsoncontenuquandcestpossible!
linverse, dautres langages sont de "typage fort" o toutes les variables doivent tre dclares de manire
extrmementprcise:type,signe,longueuretlesventuellesconversionsdoiventtreexplicites.
En algorithmique, vous vous contenterez de donner le nom, le type et ventuellement la taille de la variable, qui
garderasespropritstoutaulongdelalgorithme,savaleurpouvantbienentenduvoluer.
2.Lagestiondelammoire
La gestion de la mmoire est le calvaire des programmeurs en langages de bas niveau ou mme de haut niveau
quandceuxcilaissentauprogrammeurlatchedegrerlammoireluimme.CestlecasdelangagescommeleC
ouleC++.Imaginezunechanedecaractres"HelloWorld!".Celleciestcomposede12caractresencomptantla
ponctuationetlespace.Commeunechanesetermineparuncaractrenul,ilfaut,selonleprincipequuncaractre
estcodenASCII,13octetspourstockercettechaneenmmoire.
Enalgorithmique,vousnavezpasvoussoucierdeloccupationmmoiredevosvariablesetchanes.EnJava,ou
encoreenPHP,nonplus:ceslangagesdisposentdemcanismesappels"ramassemiettes"quilefontpourvous.
MaisenCparexemple,ceseraitvousdedclarervotrevariabledemanirecequesoncontenupuissecontenir
jusqu13octetsendclarant,enfait,13casesmmoiresdunoctet.Voicilamthodeditestatique:
char texte[13] ;
ouencorelamthodedynamique:
char *texte=malloc(13*sizeof(char));
Cenestpastout.Eneffet,aveccettederniresyntaxelemalheurveutqueoutrecettetchecomplexedallocation
mmoire,vousdeviezlibrervousmmelammoire,sinonvotreprogrammecontinueraconsommercellecijusqu
lafindesonexcution.Maiscesystmedegestiondelammoireestilvraimentuninconvnient?Prenezencompte
cesquelquesallgations:
G La gestion de la mmoire de manire dynamique ncessite une connaissance avance de la taille des
variablesutilises,delaquantitdemmoirencessaireetdelammoirephysiquedelamachine.
G Laccs la mmoire passe par lutilisation de variables particulires appeles pointeurs car elles ne
reprsentent pas une valeur mais ladresse dune case. Une fois matrises, cellesci se rvlent tre trs
puissantesetpratiques.
G Lallocationdynamiquepermetdutiliseruniquementlaquantitdemmoirencessaireuninstantdonn.
Cestcertesinsignifiantpourquelquesoctets,maissil sagitdemanipulerdegrossesimagesoudesfilms,
celacompte.
G Lammoireinutilisepeuttrelibredsquellenestplusncessaire.Aveclesmthodesditesstatiques,
ellelestuniquementlafinduprogramme(oudunblocdinstructions).
G Lallocationmmoireestlaplusgrandesourcederreursdansunprogramme,pouvantoccasionnerdusimple
dysfonctionnement au plantage complet du programme, voire mme de graves problmes de scurit
(piratage)dansdesapplicationscritiques.
Partantduprincipequunlangagedehautniveaunedoitpasembterleprogrammeuravecunequelconquegestion
du matriel, PHP gre la mmoire votre place et donc vous navez pas vous soucier de librer la mmoire de
maniresicomplexeenapparence.
- 1 - ENI Editions - All rigths reserved
Lesarbres
1.Principe
LimplmentationdesarbresenPHPreprenddesprincipesquasiidentiquesauxlistesvuesprcdemment.
Cette fois, le code PHP ne vous sera pas fourni ! vous dimplmenter ces algorithmes, ce nest pas trs
difficile.
Danslanature,lesvgtauxdcriventsouventdesstructuresditesarborescentes.Lexempleleplusvocateurest
larbre:letroncsedcomposeenplusieursbranches,sedcomposantellesmmesenbranchespluspetitesetainsi
desuitejusquauxextrmitsopoussentlesfeuilles.
Selon le cas, aprs les tableaux et les listes, vous pouvez vous aussi choisir de reprsenter lorganisation de vos
donnes sous forme darborescence en programmation. La notion darborescence est trs courante sur votre
ordinateur personnel, de nombreuses informations sont reprsentes, directement ou indirectement sous forme
darborescence : les dossiers des disques durs, la structure dune page web, la structure dun site web, la
dcomposition de lexcution dun programme et de ses appels aux sousprogrammes, bref tout ce qui peut
incorporerunenotiondehirarchiepeuttrereprsentsousformedunearborescence.
Lexempleleplussimplecomprendreestlagnalogie.Onparledarbregnalogique.Partantdevous(1),vous
placeztoutdabordvosparents(2),puislesparentsdevosparents(4),puislesparentsdecesderniers(8)etainsi
desuite.Toussontrelisparleursliensdeparent:vousavecvosparents,parentsavecgrandsparentsetainside
suite.Leschmapartdevous,maispourraitpartirdevosarriresgrandsparents,ayantxenfants,ypetitsenfants,
zarrirespetitsenfants(dontvous),chaqueindividutantlesuccesseurdesonparentetleprdcesseurdeses
enfants.
Unarbregnalogiqueestunarbrebinaire
Comment reprsenter un tel arbre gnalogique en programmation ? Vous disposez comme souvent de plusieurs
moyens,notammentaveclesbasesdedonnes,maisconnaissantleslisteschanes,vousdevezpenserquilexiste
unmoyenouunautredesensortirdirectementavecquelquesenregistrementsetpointeurs.Vousavezraison.
Dansunarbre,chaquelment(membredevotrefamille)disposedunpreetdunemre,quionteuxmmesdeux
parents.Unlmentpeutdonctredcritparplusieursinformationsmaisdeuxseulementvontvousintresserpour
la suite : un lment individu pointe sur son pre et sa mre. Un type structur pouvant reprsenter un individu
pourraitdonctre:
Structure individu
nom:chane
pnom :chane
...
pPre:pointeur sur individu
pMre:pointeur sur individu
FinStruct
Contrairement aux listes chanes simples ou doubles, il ne sagit pas ici de dfinir une liste, file ou pile mais une
notiondehirarchieentrelmentspresetfils.Cettehirarchieportelenomdarbre.
2.Dfinitions
a.Base
- 1 - ENI Editions - All rigths reserved
Un arbre est form dune racine qui est llment la base de larbre et dun nombre fini darbres qui lui sont
raccordsappelssousarbres.
Chaquelmentdunarbrepeutavoirplusieurssuccesseurs(vousavezdeuxparents)maisunseulprdcesseur.
Seulelaracinenapasdeprdcesseur.
b.Terminologie
Lesarbresutilisentuneterminologieparticulirequireprendengroscelledelanatureetdelagnalogie:
G Unnudousommetestunlmentquelconquedelarbre.Dansunarbregnalogique,chaqueindividu
reprsenteunnudousommet:ilaplusieurssuccesseursmaisunseulprdcesseur.
G Laracineestlepremierlmentdelarbre,nayantpasdeprdcesseurdanslahirarchie.
G Unefeuilleounudterminal,ounudfinalestunlmentquinapasdesuccesseur.
G Unnudinterneestunnudquinestniracine,nifeuille,quiadoncunprdcesseuretdessuccesseurs.
G Unarcreliedeuxnuds.
G Unebrancheestlecheminquirelielaracineunefeuille.
Ductdurapprochementgnalogiquelgrementsexiste,voustrouverezlestermessuivants:
G Lepreestleprdcesseuruniquedunnud.
G Lesfilssontlesnsuccesseursdunnud.
G Lesnudsdepreidentiquesontdesfrres.
G Lenudleplusgauchedelarbreestlan.
Unarbrepeuttredcrithorizontalementetverticalement.
c.Descriptionhorizontale
Horizontalement, un arbre naire est un arbre dont le nombre maximum de fils par nud est n. Les fils sont
regroupsparniveaux.Unniveauestlensembledesnudsgaledistancedelaracine.Lepremierniveauestla
racine, le deuxime les fils de la racine, le troisime les fils des fils et ainsi de suite. Quand chaque nud dun
niveauaexactementnfils,leniveauestditsatur.
Un arbre est strictement complet si tous les niveaux sont complets. Il est simplementcomplet au sens large si
touslesniveauxintermdiairessontcompletsmaisquilmanquedesfeuilles.Dansunarbrestrictementcomplet,la
racineettouslesnudsinternesontexactementnfils,niplusnimoins.
d.Descriptionverticale
Lahauteurdunarbreestlenombredenudsdupluslongchemindirect,lapluslonguebrancheentrelaracineet
une feuille, racine et feuille inclues. Si larbre dispose dune racine, de deux fils et quun des fils a une feuille, la
hauteurdelarbreest3.
e.Larbrebinaire
Unarbrebinaireestunarbredontchaquenudaauplusdeuxfils.Depuislaracine,larbrebinaireestconstitude
deuxsousarbresdiffrencis,lesousarbredroitetlesousarbregauche.
Ilexistedesarbrestrois,quatre,nfils.Cependantseulslesarbresbinairesserontabordsicietnotammentles
arbresbinairesordonns.Leschmasuivantmontreunarbrebinairestrictementcompletdehauteur3.
- 2 - ENI Editions - All rigths reserved
Arbrebinaireordonnstrictementcompletdehauteur3
3.Parcoursdunarbre
Pourlasuite,lastructuredunnuddunarbreseralasuivante,tantbiencomprisquchaquenudestassocie
unevaleur(sinonlarbrenaaucunintrt)etquebienquecettestructureressemblecelledunlmentdeliste
doublementchanecenestpluspourunereprsentationlinairemaishirarchique.
Structure noeud
valeur:entier
pGauche:pointeur sur noeud
pDroit:pointeur sur noeud
FinStruct
Chaquearbrebinairepeuttredcomposensousarbres,ungaucheetundroite.Maisbiensouventunsous
arbrepeutluimmetreclat:chaquenudayantunoudesfils,contientunoudeuxsousarbres,undroiteet
ungauche.Lenud9adeuxsousarbres:ungaucheverslenud9,undroiteverslenud10.Dansles
fonctionsdeparcourssuivantes,chaqueappelchaquenudnevalantpasNILestconsidrcommelaracinedun
arbreetlessousarbrespartantdecenudserontparcouruscommetels.
Le parcours complet dun arbre consiste parcourir tout larbre afin daccder lensemble des nuds de larbre.
Bienquilsoitpossibledefairececiavecdesstructuresitratives,lemoyenleplusfacileestdemployer des sous
programmesrcursifsafindetraiter:
G Laracine
G Lesousarbregauche
G Lesousarbredroit.
Ce type de parcours est dit prfix. Le programme va dabord traiter tous les lments de gauche. Arriv une
feuille, il remonte au nud prcdent, puis passe droite pour traiter les lments de gauche de celuici, puis
remonteetainsidesuite.
Danslarbrebinairedelexemple,lordredesortieestlesuivant:
G Branchegauche:12>9>8(cestunefeuille)
G Onremonteaunud9
- 3 - ENI Editions - All rigths reserved
G Branchedroite:10(cestunefeuille)
G Onremonteaunud9,puislaracine12
G Branchedroite:14
G Branchegauche:13(feuille)
G Onremonteaunud14
G Branchegauche:16
G Lasortiefinaleestdonc:129810141316.
Pourlereprsenter,ilfaututiliserunefonctionouprocdurercursive.
Fonction prefixe(pNoeud :pointeur sur noeud)
Dbut
Si pNoeud<>NIL Alors
Afficher pNoeudvaleur // racine
prefixe(pNoeudpGauche) // sous-arbre gauche
prefixe(pNoeudpDroite) // sous-arbre droit
FinSi
Fin
Ilexistedeuxautrestypesdeparcours.Leparcourspostfixquitraitedanscetordre:
G Lesousarbregauche
G Lesousarbredroit
G Laracine
Lordredesortieest810913161412.
Fonction postfixe(pNoeud :pointeur sur noeud)
Dbut
Si pNoeud<>NIL Alors
prefixe(pNoeudpGauche) // sous-arbre gauche
prefixe(pNoeudpDroite) // sous-arbre droit
Afficher pNoeudvaleur // racine
FinSi
Fin
Etleparcoursinfix,appelaussiparcourssymtriqueouhirarchiquecanonique.Ceparcoursseratrsutileparla
suite.Lordreestlesuivant:
G Lesousarbregauche
G Laracine
G Lesousarbredroit.
Cettefoislordredesortieestlesuivant:
G Sousarbregauche:8910
G Racine:12
G Sousarbredroit:131416.
- 4 - ENI Editions - All rigths reserved
Vousobtenezlasquence891012131416.Cesttrsintressant:larbrebinairedonnenexemplenapast
choisi au hasard. Il sagit dun arbre binaire ordonn, construit de sorte quavec un parcours infix les valeurs des
diffrentsnudssonttries.
Fonction infixe(pNoeud :pointeur sur noeud)
Dbut
Si pNoeud<>NIL Alors
infixe(pNoeudpGauche) // sous-arbre gauche
Afficher pNoeudvaleur // racine
infixe(pNoeudpDroite) // sous-arbre droit
FinSi
Fin
4.Arbrebinaireordonn
a.Principe
Unarbrebinaireestordonnsipourunevaleurdunnuddonn,lavaleurdufilsdegaucheluiestinfrieureetla
valeurdufilsdedroiteluiestsuprieure.
pGauchevaleur<pEncoursvaleur<pDroitevaleur
Imaginezquevousvoulezajouterlavaleur15danslarbre:
G Comparez15laracine12:cestsuprieur,directionlenuddedroite.
G Comparez15aunud14:cestsuprieur,directionlenuddedroite.
G Comparez15aunud16:cestinfrieur,directionlenuddegauche.
G Ilnyapasdenudgauche:placez15danscenouveaunud.
Touslesparcourssontpossiblesetleparcoursinfixvousdonnetouteslesvaleursdjtries.
b.Recherchedunlment
Pourrechercherunlment,vousavezdeuxsolutions:utiliserunesolutionitrativeouunesolutionrcursive.En
effet les deux sont possibles et assez simples. Il suffit de comparer la valeur recherche la valeur de chaque
nud.Sielleestinfrieure,alorslarecherchecontinuegauche,sinonellecontinuedroite,tantquunefeuillena
pastatteinteetquelavaleurnapasttrouve.
Lafonctionrech1()prenddeuxarguments:lavaleurrechercheetlaracinedelarbre. Elle retourne un boolen
VRAIsilavaleurattrouve,FAUXsinon.Elleutiliseunesimpleboucle.
Fonction rech1(vrech :entier, pArbre :pointeur sur noeud) :Boolen
Var
trouve :boolen
pEncours :pointeur sur noeud
Dbut
pEncours=pArbre
trouve=FAUX
Tant que pEncours<>NIL ET trouve=FAUX Faire
Si pEncoursvaleur=vrech Alors
trouve=VRAI
Sinon
Si vrech < pEncoursvaleur Alors
pEncours=pEncourspGauche
Sinon
pEncours=pEncourspDroite
Finsi
FinSi
FinTantQue
Finfonc
- 5 - ENI Editions - All rigths reserved
Lafonctionrech2()estrcursive.Elleprendtroisarguments:lavaleurrecherche,laracinedelarbreetladresse
dunudcontenantlavaleurtrouve.Silavaleurnestpastrouve,ladressecontientNIL.
Fonction rech2(vrech :entier, pArbre, pEncours,pointeurs sur noeud)
Dbut
Si pArbre=NIL Alors
pEncours=NIL
Sinon
Si pArbrevaleur=vrech Alors
pEncours=pArbre
Sinon
Si pArbrevaleur > vrech Alors
rech2(valeur,pArbrepGauche, pEncours)
Sinon
rech2(valeur,pArbrepDroite, pEncours)
FinSi
Finsi
FinSi
FinFonc
c.Ajoutdunlment
Quandvousajoutezunlment,vousdevezrespecterlastructuredelarbreordonn.Lajoutdunlmentajoute
unefeuillelarbre.Ilvousfauttrouverlecheminjusquaunudpre.Lafonctionrech2()peuttremodifieence
sens:sillmentajouternestpastrouv,alorsledernierlmentquivautalorsNILdoittreremplacparla
nouvellefeuilleettreraccordlabonnebrancheaupre.Ilfautdoncconserverladressedupre.
Lafonctioninserer()prendtroisarguments:lavaleurajouter,ladressedelarbreetladressedunudauquel
ajouterlavaleur,droiteougaucheselonlecas.
Fonction inserer(v:entier, pArbre, pPrec : pointeurs sur noeud)
Var
pNouveau=pointeur sur noeud
Dbut
Si pArbre=NIL Alors
pNouveau=nouveau noeud
pNouveauvaleur=v
pNouveaupGauche=NIL
pNouveaupDroite=NIL
Si pPrec<> NIL Alors
Si v>pPrecValeur Alors
pPrecpDroite=pNouveau
Sinon
pPrecpGauche=pNouveau
FinSI
FinSi
Sinon
Si pArbrevaleur<>v Alors
Si v > pArbrevaleur Alors
insrer (v, pArbre, pArbrepDroite)
Sinon
insrer (v,pArbre, pArbrepGauche)
FinSi
FinSi
FinSi
FinFonc
d.Suppressiondunnud
Pourledernierpointdecechapitre,cestvousquiallezcrirelalgorithmedelafonctionncessairelasuppression
dunud.Ilyatroiscastraiter:
G La suppression dun nud sans fils (une feuille), cest le cas le plus simple. Le pointeur correspondant
(droiteougauche)dupredoittreplacNIL.
- 6 - ENI Editions - All rigths reserved
G Lasuppressiondunnudayantunfils:lefilsdroittreraccordaubonpointeurdugrandpre.
G Lasuppressiondunnudayantdeuxfils.Cestlecasleplusproblmatique.
Pour ce dernier cas, vous pouvez procder aux chanages directement. Par exemple, soit un morceau de larbre
dexemple,vousvoulezsupprimerlenud8:
Suppressiondunnuddeuxfils
Lenud8tantsupprim,ilfautrorganiserlarbreenconsquence.Lenudavaitdeuxfils:celuidegauche(et
toutsonsousarbre)remplacelenudsupprim,celuidedroite(ettoutsonsousarbre)vadroitedunouveau
nud.
Une autre possibilit est de supprimer le nud, parcourir les deux sousarbres de cet ancien nud et dajouter
chaquelmentdanslepremierarbre.
- 7 - ENI Editions - All rigths reserved
Leslisteschanes
1.Listeschanessimples
a.Principe
Danslaviequotidienne,unelisterevtplusieursformes:unelistedecourses,detcheseffectuer,unindex,un
glossaire,unecollectiondedvds,demusiques,etc.Ceslistessontcomposesdlmentsindividuels,lislesuns
aux autres par leur type ou lordre que vous voulez leur donner. Pour passer dun lment un autre, vous
descendezdanslalistedanslordrequevousluiavezdonn.
Comment se reprsenter une liste, par dfinition linaire, en programmation ? Vous connaissez au moins un
moyen:lestableaux.Dansuntableau,vouspouvezstockernlmentsetlordrepeuttrereprsentparlindice
dutableau.
Connaissezvousunautremoyendestockerdeslments?Lesenregistrementsdetypesstructurslepermettent
et en plus vous pouvez y stocker bien plus de dtails. Vous pouvez aussi crer des tableaux denregistrements,
doncleurdonneruncertainordre.
Lutilisationdestableauxposecependantparfoisdesproblmesunpeucomplexes.Vouslavezdjremarquavec
lesmthodesdetris.
G Commentinsrerunnouvelenregistrementendbutdetableau?Ilnyapasdindicesngatifs
G Comment insrer un nouvel enregistrement en fin de tableau ? Si lalgorithmique propose un
redimensionnementdynamique,leslangagesPHPlautorisent.
G Commentinsrerunlmentaumilieudutableau?Fautildcalertousleslmentspourplacerlenouveau
lendroitdonn?Sioui,letableaurisquededborder.
G Etsivoussupprimezunenregistrement,allezvousdenouveaudcalerletableaupourboucherletrou?Ou
trouveruneparadepourpasserpardessus?
Vouspouvezvousarrangerpourtoutprogrammerafindetoutfairemarcheraveclestableaux.Cestparfaitement
possible. Mais estce vraiment raisonnable ? Estce de la programmation efficace ? Rappelezvous quau chapitre
Introduction lalgorithmique, vous avez appris quil faut tre conome en ressources. Cette mthode est
gourmandeetcomplique.Ilvousfautentrouveruneautreplussimpleetplusbelle.
En fait, encore une fois, vous connaissez tous les principes de base de cette nouvelle mthode. Voici quelques
lments:
G Unenregistrementpeutcontenirunautreenregistrement.
G Cetautreenregistrementpeuttredummetypestructur.
G Lenregistrementpeutaussicontenirunpointeurversunautreenregistrementdummetype.
G EnnotationJava,unenregistrementestunobjetetdansunobjet,onpeutrfrencerunautreobjetdu
mmetype.
G Onobtientainsiunecascadedenregistrementsquisesuiventlesunslesautres.Pouraccderausuivant,il
suffitdaccderlarfrencedecetenregistrementdanslenregistrementactuel.
G Chaqueenregistrementdisposedunpointeurourfrenceverslesuivant.
G Lesenregistrementssontdoncchanslesunsauxautres,cestunelistechanedenregistrements.
Le principe peut tre reprsent par le schma suivant. Chaque enregistrement est reprsent par un cadre et
contientunevaleuretunpointeurappelpsuivquipointesurlenregistrementsuivantdelaliste.
- 1 - ENI Editions - All rigths reserved
Reprsentationlogiquedunelistechane
Pouraccderunlmentdonndelalistevousparteztoujoursdupremierlment.Del,connaissantladresse
dusuivantparlepointeurpsuiv,vouspassezsuccessivementauxnsuivants.Quandlepointeurnepointesurplus
rien(null),cestquelenregistrementestledernier.
Unelistechanedecetypeestditeunilatre:laccsauxlmentscomposantlalisteestsquentiel(vousdevez
lirelesnlmentsprcdentspouraccderceluivoulu)etunidirectionnel.
Chaquelmentdelalisteestunenregistrement.Cetenregistrementpeutcontenirautantdechampsquevousle
souhaitez, mais lun deux sera un pointeur sur un enregistrement de mme type. Quand vous ajouterez un
deuximelment,vousplacerezsonadressedanslepointeurdupremieretainsidesuite.Chaqueenregistrement
finalpointerasurlavaleurNIL.
Pourcommencer,voiciuntypestructursimplequipourraitconvenir.Enfaitlavaleurpourraittrenimportequoiet
letypeprendrajusteunentierquelconque.
TYPES
// Un lment de liste chane
Structure element
valeur:entier
pSuivNIL:pointeur sur element
FinStruct
CettedclarationinitialedutypestructurelementcontientunpointeurpSuiv(pourPointeursurSuivant)surune
structuredummetype.PardfautilestinitialislavaleurNIL:ilnyapasencoredenregistrementsuivant.Que
pouvezvousfairedecettestructure?Toutdabordvousdplacerdunlmentunautredelaliste.Pourcela,il
suffitdepartirdupremierlmentetdercuprer,enboucle,lepointeurdellmentsuivant,jusqutombersur
NIL.
Quellessontlesoprationslmentairespossiblessuruneliste?
G Creruneliste:cestcrerlepremierenregistrement,celuidette,quipermettradaccderauxautres.
G Parcouriruneliste:cestbalayertousleslments,unparun,jusquaudernier.
G Rechercherunlmentdanslaliste:soitindiquersilexiste,soitretournerunpointeurverssaposition.
G Ajouterunlment nimporteodanslaliste:audbut,aumilieu,lafin.Unefonctiondajoutpourrait
aussireprendrelapremireoprationdecrationdeliste.
G Supprimerunlmentnimporteodanslaliste.
G Supprimerlaliste.
Toutes ces actions peuvent se faire au travers de sousprogrammes, rendant lusage de la liste beaucoup plus
simple. Pour se rapprocher des langages fonctionnels, les sousprogrammes devant le plus souvent retourner un
pointeurversunlmentdelaliste.
Unedernirechose:lepremierlmentdelalisteesttoujourslepointdentrepourlaplupartdesfonctions.tant
donn quil sera reprsent par la suite par un pointeur, ne perdez JAMAIS ladresse de ce premier lment : il
seraitimpossiblederetrouverledbutdelaliste,dautant plus quaveclallocationdynamiquedemmoire,ilest
plusquepossiblequeleszonesmmoiresalloueschaquelmentnesoientpascontigus.
Conserveztoujoursladressedupremierenregistrementdansunpointeurprvuceteffetdontvousne
modifierezpaslavaleurtoutaulongduprogramme,saufsivoussupprimezlepremierlmentoutoutela
liste.
b.Cration
- 2 - ENI Editions - All rigths reserved
Pourcreruneliste,ilfautcommencerparsonpremierlment.Lepremierlmentestunpointeurauquelvous
allez allouer dynamiquement une zone mmoire. Il prendra la valeur que vous voulez et son pointeur
denregistrementsuivantrecevraNIL.Lafonctionretourneunpointeurverslepremierlmentdelanouvelleliste.
Fonction cree_liste():pointeur sur element
Var
pTete:pointeur sur element
Dbut
pTetenouveau element
pTetepSuiv NIL // (*pTete).pSuivNIL
Retoune pTete
FinFonc
Rappel : pTete>pSuiv < NIL se lit ainsi : (*pTete).pSuivNIL, cestdire que le champ pSuiv de
lenregistrementpointparpTetereoitlavaleurNIL.
Cette fonction amne un premier commentaire. Dans le chapitre Les sousprogrammes, vous avez appris la
diffrenceentrelesvariableslocalesetglobales.IcipTeteestunevariablelocale,elleseradtruitelafindela
fonction.Pourtantladressequellecontientestretourne.Cestquelepointeurntantpaslibr,lazonemmoire
allouedynamiquementlestpourtouteladureduprogramme.lasortiedelafonction,lazonemmoireexiste
encoreetdoncsonadresseestencorevalide.
RemarquezquelaffectationdelavaleurNILpSuivnestpasncessairecarcestsavaleurpardfautlorsdela
dclarationdelenregistrementstructur.
Pourexploitercettefonction,ilsuffitdedclarerunpointeuretluiaffecterlersultatdecelleci:
Programme liste1
Var
pTete:pointeur sur element
Dbut
pTetecree_liste();
Fin
Lafonctioncree_listeesttrssimple.Peuttrepourriezvousenprofiterpourvoirlemcanismesimplepermettant
dajouterdeslmentslesunslasuitedesautres.Lafonctioncree_liste2()modifievavousdemanderdesaisir
enboucledesvaleursquiserontajouteslesunesaprslesautresenfindeliste.Pourceci,vousaurezbesoinde
conserverchaquefoistroisinformations:
G LepointeurpTetedelattedelaliste,quidevratreretournparlafonction.
G LepointeurpEncoursdellmentactueldelaliste,dellmentajoutenfait.
G Le pointeur pPrec de llment prcdent, dont le pointeur pSuiv devra recevoir ladresse de llmenten
cours.
Fonction cree_liste2() :pointeur sur element
Var
pTete, pEncours, pPrec :pointeurs sur element
v :Entier
Dbut
// 1er lment
pTetenouveau element
Afficher "Valeur du premier lment ?"
Saisir pTetevaleur

// Le premier lment est le prcdent de llment suivant


pPrecpTete
Rpter
Afficher "Valeur suivante (0=sortie) ?"
Saisir v
Si v<>0 Alors
// Allocation du nouvel lment
pEncoursnouveau element
pEncoursvaleur v

- 3 - ENI Editions - All rigths reserved

// Chanage : pEncours est le suivant de pPrec


pPrecpSuiv pEncours
pPrecpEncours
FinSi
Jusqu v=0

// Fin de liste : pSuiv NIL


pPrecpSuiv NIL
Retourne pTete
FinFonc
c.Parcoursdelaliste
Leparcoursdelalisteestmaintenantpossiblepuisquelafonctionprcdentevousapermisderemplirquelques
enregistrements.Commetoujoursonpartdupointeurdette,puisonpassedenregistrementenenregistrement
jusqurencontrerlavaleurNIL.
Lafonctionparcours_listereoitcommeargumentlepointeurdette.Unesimplebouclevaensuitebalayertoutela
listeetaffichertouteslesvaleursquiysontcontenues.
Fonction parcours_liste(pTete :pointeur sur element)
Var
pEncours :pointeur sur lment
Dbut
pEncourspTete
Tant que pEncours<>NIL Faire
Afficher pEncoursvaleur
pEncours pEncourspSuiv
FinTantQue
FinFonc
d.Recherche
Deuxtypesdesousprogrammessontpossibles:lepremierdterminesillmentexistedanslalisteetretourne
un boolen, vrai ou faux, selon que llment est trouv ou non. Cest donc une fonction. Le second retourne
ladresse de llment trouv et ladresse de llment prcdent, vous verrez pourquoi ensuite. Cest donc une
procdure car une fonction ne peut retourner deux valeurs. Mais pourquoi ne pas faire dune pierre deux coups,
cestdire un sousprogramme qui va la fois retourner vrai ou faux, mais aussi des pointeurs sur llment
courantetprcdent?
Cestpossiblecarvouspouvezpasserdespointeurscommeargumentsdefonctions,modifierladressesurlaquelle
ilspointentetretournertoutdemmeunboolen.Enfait,ilestquasimentinutilederetournerunboolencarde
toutefaonsillmentnestpastrouv,pEncoursvaudraNILensortiedefonction.
Laprocdurerecherche_listeprendquatreparamtres:
G Lavaleurvrecherche.
G UnpointeurpTetesurlattedelaliste.
G UnpointeurpPrecsurllmentprcdent,celuitrouv.
G UnpointeurpEncourssurllmenttrouv.
G Unboolenvraioufaux.
G Sillmentesttrouv,pPrecpointesurceluidavant,pEncourssurllmenttrouv.
G Sillmentestabsent,pEncoursvautNILetpPrecpointesurledernierlmentdelaliste.
G SipPrecvautNIL,llmentrecherchestlepremierdelaliste.
Procdure recherche_liste (E:v:entier, E:pTete, ES : pPrec,pEncours
:pointeurs sur element,S :trouve :boolen)
- 4 - ENI Editions - All rigths reserved
Var
trouve :boolen
Dbut
trouveFAUX
pPrecNIL
pEncourspTete
Tant que pEncours<>NIL ET pEncoursvaleur<>v Faire
pPrecpEncours
pEncours pEncourspSuiv
FinTantQue
Si pEncours<>NIL ET pEncoursvaleur=v Alors
trouveVRAI
FinSI
FinProc
e.Ajoutdunlment
Pour lajout dun lment dans la liste, trois cas de figure peuvent se prsenter, ncessitant trois traitements
diffrents:
G Lajoutdunlmentendbutdeliste.
G Lajoutdunlmentenmilieudeliste.
G Lajoutdunlmentenfindeliste.
Danslestroiscas,lechanageestmodifi.Ilestcertespossibledecrerungrossousprogrammequigrelestrois
casduncoup,maisilestprofitabledediffrenciercestroistraitementsentroissousprogrammesindpendants.Il
seratoujourstempsensuitedecrerunsousprogrammefdrateurquigreratouslescas.
Danstouslescassuivants,ladressedellmentajouter,quevousaurezdjremplieaveclabonnevaleur,sera
reprsenteparlepointeurpNouveau.
Deuxcassontpossibles:lajoutdunlmentdansunelistevide,auquelcasilsagitdupremierenregistrementet
lajoutdunlmentenpremirepositiondelaliste.
Danslepremiercas,ilsagitdefaireensortequellmentajoutersoitlepremier,doncquepNouveaudevienne
llmentdettedelaliste,sanslmentsuivant.Vouspassezlaprocdurelepointeursurlenregistrementetle
pointeurdette.
Procdure ajout_unique(E :pNouveau, ES :pTete: pointeurs sur element)
Dbut
pNouveaupSuiv NIL
pTetepNouveau
FinProc
La seconde procdure ajoute le nouvel lment en tte de liste, sachant que la liste contient dj au moins un
lment.Cestuncastrssimpleolenouvellmentreoitcommelmentsuivantceluidette.Pourcedernier,
riennechange.
Procdure ajout_dbut(E :pNouveau, ES :pTete :pointeurs sur element)
Dbut
pNouveaupSuiv pTete
pTetepNouveau
FinProc
Cestencoreuncastrssimple.Lerajoutdunlmentenfindelistencessiteseulementdeconnatreladressedu
dernierlmentactuel.LepointeurpSuivdecedernierpointerasurlenouvellmentetlepSuivdunouvellment
recevraNIL.
Sivousreprenezlesprocduresderechercheetdeparcoursdelalistechane,lafindelalistepEncoursvaut
NIL et pPrec contient ladresse du dernier enregistrement. La procdure ajout_fin() reoit deux paramtres :
pNouveauetpPrec.
Ajoutendbutdeliste
Ajoutenfindeliste
- 5 - ENI Editions - All rigths reserved
Procdure ajout_fin(ES : pNouveau, pPrec :pointeurs sur element)
Dbut
pPrecpSuiv pNouveau
pNouveaupSuiv NIL
FinProc
Aufinal,aucunajoutnauratbiencompliqu,puisquelencorevousdisposezdetoutlencessaire.Pourajouter
un lment entre deux autres lments dune liste, vous devez connatre ladresse de llment prcdent et
ladressedellmentcourant,sachantquelenouvellmentserainsrentrelesdeux.Laprocdureajout_milieu
() reoit donc trois arguments : le nouvel lment pNouveau, llment prcdent pPrec et llment actuel
pEncours.
Procdure ajout_milieu(ES :pNouveau, pPrec, pEncours) :pointeurs
sur element)
Dbut
pPrecpSuiv pNouveau
pNouveaupSuiv pEncours
FinProc
Lebutestdegnraliserlesajoutsenungrandsousprogrammeunifi.Pourcela,ilfautsavoiroplacerllment
ajouter. Lalgorithme de recherche dun lment retourne deux pointeurs : celui de llment trouv et de
llment prcdent. Supposez que vous souhaitez insrer votre nouvel lment juste avant llmentrecherch,
celadevientpluttsimple.Quatrecasdefigureseprsentent:
G pPreccontientNIL(pasdlmentavant)etpEncourscontientNIL:ilnyaaucunlmentdanslaliste,le
nouveauseralepremieretseullment.
G pPrec contient NIL (pas dlment avant) et pEncours pointe sur llment trouv qui est le premier : le
nouveauseplaceavant,enpremier.
G pPrec pointe sur un lment prcdent et pEncours pointe sur llment trouv, le nouveau se place au
milieudesdeux.
G pPrecpointesurunlmentprcdentetpEncourscontientNIL(larechercheestarriveaubout,lment
trouvounon),lenouveauseplaceendernier.
Quatrecasdefiguresquicorrespondentauxquatresousprogrammesdjcrscidessus!Lalgorithmedevient
simple : il suffit dappeler la bonne procdure selon les valeurs de pPrec et de pEncours. La procdure
ajout_elementprendtroisvaleurs:lavaleurrecherche,lavaleurinsreravantetlepointeurdettedelaliste.
Procdure ajout_element(E:vrech,vnouveau :entiers, ES :pTete
:pointeur sur element)
Var
pPrec, pEncours, pNouveau : pointeurs sur element
Dbut
pNouveaunouveau element ;
pNouveauvaleur vnouveau
recherche_liste(vrech,pTete,pPrec,pEncours)
Si pPrec=NIL Alors
Si pEncours=NIL Alors
ajout_unique(pNouveau, pTete)
Sinon
ajout_dbut(pNouveau, pTete)
FinSI
Sinon
Si pEncours=NIL Alors
ajout_fin(pNouveau, pPrec)
Sinon
ajout_milieu(pNouveau, pPrec, pEncours)
FinSi
FinSi
FinProc
Ajoutenmilieudeliste
Gnralisation
- 6 - ENI Editions - All rigths reserved
Lestraitementssonticitrsdtaills.Cependant,analysezlesprocduresajout_premier()etajout_dbut().Que
remarquezvous?Ellesseressemblent,dautantplusquedansajout_dbut(),pTetecontientdjNILsilnypas
denregistrements.Donclesdeuxprocduressontidentiques:ajout_debut()remplaceajout_premier().
Regardezmaintenantajout_fin()etajout_milieu():dansajout_milieu,quereoitpEncours>pSuivsivoustesen
findeliste?LavaleurNIL.Donclesdeuxsontidentiquesetajout_mlilieu()peutremplacerajout_fin().Laprocdure
ajout_elementsetrouvesimplifieainsi.
Lesdeuxautresprocduresneserventplusrien.
Procdure ajout_element(vrech,vnouveau :entiers, pTete
:pointeur sur element)
...
Si pPrec=NIL Alors
ajout_dbut(pNouveau, pTete)
Sinon
ajout_milieu(pNouveau, pPrec, pEncours)
FinSi
FinProc
f.Suppressiondunlment
Lajoutdlmentsestungrandpasenavantcarvousconnaissezetcomprenezintgralementleprincipeinhrent
auxlisteschanes.Poursupprimerunlmentdecetteliste,cestquasimentlammechose,ilfautjusterecoller
lesmorceauxetlibrerlammoireallouellmentsupprim.Ilyaquatrepossibilits:
G Supprimerleseullmentdelaliste
G Supprimerlepremierlmentdelaliste
G Supprimerledernierlmentdelaliste
G Supprimerunlmentaumilieudelaliste.
Il faut que llment supprimer existe, donc tout dabord le rechercher et connatre son adresse et celle de
llment prcdent. Llment prcdent verra son pointeur pSuiv prendre comme valeur le pointeur pSuiv de
llmenttrouv.
Lesfonctionssuivantesrestructurentlalistepourluiredonnerlebonchanage.Lalibrationdelammoireoccupe
parllment effacer sera effectue selon le mme modle que la fonction fdratrice dajoutdansunegrande
fonctiondesuppression.
Cestfacile,sillmentestleseul,donclattedelaliste,ilsuffitdeplacersonpointeurNIL.Pasdeprcdent,
pasdesuivant,cesttermin.
Procdure suppr_unique(ES :pTete :pointeur sur element)
Dbut
pTeteNIL
FinProc
Cestaussisimple:cestllmentsuivantquidevientlattedelaliste.
Procdure suppr_premier(ES :pTete :pointeur sur element)
Dbut
pTete pTetepSuiv
FinProc
Simplification
Supprimerleseullment
Supprimerlepremierlment
Supprimerledernierlment
- 7 - ENI Editions - All rigths reserved
Toujoursaussisimple:llmentprcdentreoitNILcommevaleurdepointeursuivant.
Procdure suppr_dernier(E :pPrec :pointeur sur element)
Dbut
pPrecpSuiv NIL
FinProc
Ilfautraccorderllmentprcdentavecllmentsuivant.
Procdure suppr_milieu(E :pPrec,pEncours : pointeurs sur element)
Dbut
pPrecpSuiv pEncourspSuiv
FinFonc
Contrairementlajout,vouspouveztoutdesuitevoirsilestpossibledesimplifieravantdallerplusloin,selonle
mmeprincipe.Ainsidanslafonctionsuppr_premier()pTeterecevraNILsillmentsupprimestleseulcarpTete
>pSuivvautNIL.
Idem pour suppr_milieu() et suppr_dernier(). Dans suppr_milieu, pEncours>pSuiv vaut NIL si llment est le
dernier.
Lesfonctionssuppr_unique()etsuppr_dernier()sontdoncinutiles,saufpourlexemple!
Toutdabordvousdeveztrouverllmentsupprimer.Silnyestpas,ilnyariensupprimer.DoncsipEncours,
contenantllmenttrouv,vautNIL,ilnyarienfaire.Ensuite,ilyadeuxcasdefigure :
G pPrecvautNIL:llmentsupprimerestlepremier(ouleseul).
G pPrecestdiffrentdeNIL,llmentsupprimerestaumilieuouenfindeliste.
Ensuite,aprsavoirappellafonctionadquate,vousnavezplusqulibrerlammoireallouepourllmentet
passersonpointeurNIL.
La procdure suppr_element ne prend que deux arguments : la valeur de llment supprimer et la tte de la
liste.
Procdure suppr_element(E:vrech:entier,ES:pTete:pointeur sur element)
Var
pPrec, pEncours :pointeurs sur element
Dbut
recherche_liste(vrech,pTete,pPrec,pEncours:pointeurs sur elements)
Si pEncours=NIL Alors
Afficher "Element absent"
Sinon
Si pPrec=NIL Alors
suppr_premier(pTete)
Sinon
suppr_milieu(pPrec,pEncours)
FinSi
Librer pEncours
pEncoursNIL
FinProc
g.Supprimertoutelaliste
Pour supprimer tous les lments de la liste, il suffit de supprimer tous les lments jusquau dernier. Mais
attention!Nesupprimezpasunlmentsansavoirauparavantconservladresse de llmentsuivant!Sivous
ne lavez pas fait, non seulement les lments suivants sont perdus, mais la mmoire des lments suivants ne
pourraplustrelibre!
Lafonctionsuppr_listeneprendquunseulargument:lattedelaliste.
Supprimerunlmentaumilieu
Simplification
Gnralisation
- 8 - ENI Editions - All rigths reserved
Fonction suppr_liste(pTete :pointeur sur element)
Var
pEncours, pSuivant :pointeurs sur lment
Dbut
pEncourspTete
Tant que pEncours<>NIL Faire
pSuivantpEncourspSuiv
Librer pEncours
pEncourspSuivant
FinTantQue
pTete=NIL
FinFonc
h.Parcoursrcursif
Ilestpossiblederemplacerlesousprogrammeitratifdeparcoursdelalisteparunefonctionrcursive:lesous
programmesappelle luimmeavecladresse de llmentsuivanttantquellment reu en argument nestpas
NIL.
Fonction parcours_recursif(pEncours :pointeur sur element)
Dbut
Si pEncours<>NIL Alors
Afficher (*pEncours).valeur
parcours_recursif(pEncourspSuiv)
FinSi
FinFonc
Cettefonctionestappeleaveclepointeurdettecommeparamtre.
parcours_recursif(pTete)
2.LimplmentationenPHP
VoicileprogrammeadaptauPHP.Ilfautadapterquelquesprocdurespourquellesretournentunerfrencevers
lesdiverslmentsdelaliste.
<?php

class element {
public $valeur;
public $pSuiv=null;
}

// Creation de la tete
function cree_liste() {
$pTete=new element();
$pTete->pSuiv=null;
return $pTete;
}

// tete et suivants
function cree_liste2() {
// 1er lment
pTete=new element();
echo "1er lment ? ";
$pTete->valeur=(int)(fgets(STDIN));

$pPrec=$pTete;

// elements suivants
do {
echo "Element suivant ? ";
$v=(int)(fgets(STDIN));
if($v!=0) {
- 9 - ENI Editions - All rigths reserved
$pEncours=new element();
$pEncours->valeur=$v;

// chanage
$pPrec->pSuiv=$pEncours;

$pPrec=$pEncours;
}
} while($v!=0);

// Fin de liste
$pPrec->pSuiv=null;
return $pTete;
}

// parcours itratif
function parcours_liste($pTete) {

$pEncours=$pTete;

while($pEncours!=null) {
echo $pEncours->valeur." ";
$pEncours=$pEncours->pSuiv;
}
echo "\n";
}

// adapt pour PHP


function recherche_liste($v, $pTete) {
$pPrec=null;
$pEncours=$pTete;

while($pEncours!=null && $pEncours->valeur!=$v) {


$pPrec=$pEncours;
$pEncours=$pEncours->pSuiv;
}
return $pPrec;
}

// Rajout pour PHP


function existe_liste($v, $pTete) {
$pPrec=null;
$trouve=false;

$pPrec=recherche_liste($v,$pTete);

if($pPrec==null) {
if($pTete!=null && $pTete->valeur==$v) $trouve=true;
} else {
if($pPrec->pSuiv!=null) $trouve=true;
}
return $trouve;
}

// Fonctions dajout
function ajout_debut($pNouveau, $pTete) {
$pNouveau->pSuiv=$pTete;
$pTete=$pNouveau;
return $pTete;
}

function ajout_milieu($pNouveau, $pPrec, $pEncours) {


$pPrec->pSuiv=$pNouveau;
$pNouveau->pSuiv=$pEncours;
}

function ajout_element($vrech, $vnouveau, $pTete) {


$pPrec=null;
- 10 - ENI Editions - All rigths reserved
$pEncours=null;

$pNouveau=new element();
$pNouveau->valeur=$vnouveau;

$pPrec=recherche_liste($vrech,$pTete);
if($pPrec!=null) $pEncours=$pPrec->pSuiv;

if($pPrec==null) $pTete=ajout_debut($pNouveau, $pTete);


else ajout_milieu($pNouveau, $pPrec, $pEncours);

return $pTete;
}

// Fonctions de suppression
function suppr_premier($pTete) {
$pTete=$pTete->pSuiv;
return $pTete;
}

function suppr_milieu($pPrec, $pEncours) {


$pPrec->pSuiv=$pEncours->pSuiv;
}

function suppr_element($vrech, $pTete) {


$pPrec=null;
$pEncours=null;

$pPrec=recherche_liste($vrech,$pTete);
if($pPrec!=null) $pEncours=$pPrec->pSuiv;
else $pEncours=$pTete;

if($pEncours!=null) {
if($pPrec==null) $pTete=suppr_premier($pTete);
else suppr_milieu($pPrec,$pEncours);
}
$pEncours=null;
return $pTete;
}

// supprimer la liste
function suppr_liste($pTete) {
$pTete=null;
return $pTete;
}

// parcours rcursif
function parcours_recursif($pEncours) {
if($pEncours!=null) {
echo $pEncours->valeur." ";
parcours_recursif($pEncours->pSuiv);
} else echo "\n";
}

// programme principal

$pTete=cree_liste2();

parcours_liste($pTete);

echo "Saisir la valeur recherchee : ";


$v=(int)(fgets(STDIN));

if(existe_liste($v,$pTete)) echo "Trouv !\n";


else echo "Absent !\n";

$pTete=ajout_element(2,15,$pTete);

parcours_liste($pTete);

- 11 - ENI Editions - All rigths reserved

echo "Saisir la valeur supprimer : ";


$v=(int)(fgets(STDIN));
$pTete=suppr_element($v,$pTete);

parcours_recursif($pTete);

suppr_liste($pTete);
?>
3.Autresexemplesdelistes
a.Listescirculaires
Unelistecirculairepermetdaccdernimportequellmentdelalistedepuisnimportequelautrelmentsans
passerparlepointeurdette.
Pourmettreenplacecetypedeliste,ilsuffitdefairepointerllmentsuivantdudernierlmentsurlepointeurde
tte.
Dans une telle liste, les fonctions dajout et de suppression dlments sont simplifies et correspondent aux
fonctionsdajoutetdesuppressionaumilieu.Ilyaunpetitproblmepourlafonctionderecherchequinesarrte
jamais.Ilfautdoncplacerundrapeaupourarrterlarecherchequandonretombesurllmentdedpart.Ilsuffit
destockerladressededpart.Sivousretombezdessus,cestquevousavezparcourutoutelaliste.
b.Listesdlmentstris
Danscetypedeliste,leslmentssontplacsselonunordredfiniparvousmmeauseindesvaleurscontenues
dansleslments.Ainsivoustesassurderespectercetordrelorsduparcoursdelaliste.
Vousdevezadapterlafonctionderecherchepourfairerespectercetordre.
c.Listesdoublementchanes
Dans une liste chane simple, le parcours ne seffectue que dans un seul sens et depuis un lment vous ne
pouvezpasretournerauprcdent.Unepremiremthodeconsisteraitconserverladressedechaquelment
prcdent,cequiseraitpossibleaveclutilisationdefonctionsrcursives,maisceseraittrslourd.
Lautrepossibilitconsisteutiliserdeslistesdoublementchanes:chaquelmentnecontientnonplusunseul
pointeur, mais deux : un pour llment suivant, un autre pour llment prcdent. Ainsi, vous pouvez vous
dplacerdanslesdeuxsensdanslaliste,soitverslaqueue(fin),soitverslatte.Ceslistessontditesbilatres.
Lestraitementsdoiventtreadaptsenconsquence.Prenezleproblmelenvers:vousavezdeuxpointeurs
mettrejour.Sivoussavezlefairedansunsens(commeleslistessimples)voussavezlefairedanslautre,vous
changezjustedesens.Ilyadoncdeuxfoisplusdoprationsdechanage:
Chanageavant
G pPrecpSuivpNouveau
G pNouveaupSuivpSuivant
Chanagearrire
G pSuivantpPrecpNouveau
G pNouveaupPrecpPrec
Leslistesbilatrespeuventaussitrecirculaireset/outries.
d.Filesetpiles
Dansunefiledattente,dansunmagasin,uncinma,brefdansunequeue,lepremierarrivestlepremierservi.En
anglais,celasetraduitpar"FirstIn,FirstOut",soitFIFOenabrg.
- 12 - ENI Editions - All rigths reserved
UnefiledattentedetypeFIFOpeuttrereprsenteparunelistechane.Chaquenouvellmentestajouten
findeliste,tandisqueleslmentssonttraitslesunsaprslesautresdepuislattedelaliste.
Quandvousfaiteslavaisselle,lesassiettessontempileslesunessurlesautres.Quandvouslavezlesassiettes
vous prenez celles du dessus en descendant au fur et mesure. Si de nouvelles assiettes sales sont empiles,
elleslesontsurledessusdelapile.
Leprincipeestlemmeeninformatiquequandvousvouleztraiterdeslmentsaufuretmesuredeleurarrive:
les derniers arrivs sont traits en premier. La pile peut tre reprsente par une liste chane : les nouveaux
lmentssontsystmatiquementempilsenttedelisteetleslmentssonttoujourstraitsdepuiscettette.Si
leslmentsarriventplusvitequeleurtraitement,ceuxarrivsenpremierrisquentdtretraitsbientard.
- 13 - ENI Editions - All rigths reserved
Lespointeursetrfrences
1.Rappelssurlammoireetlesdonnes
a.Structuredelammoire
Les prcdents chapitres vous ont dj appris normment de choses sur la mmoire et lorganisation de son
contenu:
G Lammoireestdcoupeenoctets.
G Chaqueoctetdelammoiredisposeduneadresse.
G Une donne peut staler sur plusieurs octets, donc occuper une plage dadresses (par exemple 4 ou 8
octetspourunrel,plusencorepourunechane).
Reprsentationdunevariableenmmoire
Unevariableestunnomdonnuneouplusieurscases.Ellenommelazonedelammoirecontenantladonne.
Lazonedelammoirecontenantladonneestdfiniepardeuxlments:
G Ladressededbutdeladonne,cestdireladressedupremieroctetcontenantladonne.
G Latailledecettezone,cestdirelenombredoctetsconstituantlesdonnes.
Latailledelazonedpenddutypedeladonne.UncaractreASCIInoccupequunseuloctet,unentierquatre,
unentierlonghuit,etc.
Quandvousaccdezaucontenudelavariable,vousaccdezaucontenudelazonemmoirequiluiestassocie.
La variable ellemme contient donc une autre information, ladresse de la zone mmoire laquelle elle est
attribue.
Parconvention,unordinateursachantgrerbeaucoupdemmoire,lesadressessontnotesenhexadcimal.Cest
plussimpledeparlerdadresse0x2dcf0239quedeladresse768541241.Certainslangagespermettentdaccder
etdoncdevoirladressedelazonemmoiredunevariable,toutsimplementladressedelavariable.
b.PHP:deslimitesquinensontpas
Ilvavousfalloirlgrementdchanter.LelangagePHPutilisdepuisledbutdecetouvragenepermetpasde
connatreladressedelavariable.Enfait,laplupartdeschosesdcritesdanslesprochainespagesserontenpartie
- 1 - ENI Editions - All rigths reserved
inaccessiblescelangage.Etparmiceschoses,lapossibilitdaccderladressemmoiredesdiversesvariables.
La raison est simple : PHP est un langage volu de haut niveau qui na pas interfrer directement avec la
mmoire de lordinateur. Le programme PHP ne sait pas o sont rellement stockes ses donnes en mmoire
centrale,cestlinterprteurquisoccupedetout.Silavaittpossibledevoiruneadresse,celleciauraittcelle
auseindelammoirerserveparlinterprteur,sanspouvoirfairelelienaveclammoirephysique.
Cesystmeprsentedenombreuxavantages.PuisquecestPHPquigrevotreplacelammoire,vousnavez
plusvoussoucierdeproblmespropresdeslangagesdebasniveau.EnCparexemple,quandvouscrezune
chanedecaractres,cestenfaituntableaudecaractres.Sivousdbordezdelataillequevousavezinitialement
fixe, vous risquez de graves dysfonctionnements et plantages, car lespace mmoire situ aprs est peuttre
rserv pour une autre variable ou un bout de programme. C ne vous prviendra pas en cas derreur dans les
indices de tableaux non plus. PHP vous dbarrasse de tous ces problmes puisquil gre tout cela votre place.
Aucunrisquededpasserquoiquecesoit,aucunrisquedoublierdelibrerdelammoire,etc.
Vous verrez que PHP gre trs bien pour certaines choses les rfrences, comme cela vous a brivement t
expliqudanslechapitre"Lestableauxetstructures".
c.BrefsexemplesenC
LelangageCestunlangagedebasniveaupermettantunaccsdirectaucontenudelammoirephysique,toutau
moinscellerservepourvotreprogramme.EnC,vouspouvezafficherladressedunevariabletrssimplement.Le
boutdecodesuivantaffichelecontenuetladressedunevariableentirelongue.IlsuffitenCdajouterlesigne
"&"(ETcommercial)avantlenomdelavariable.Lachanesotrique%#xdsignifiequele&iestunevaleurentire
(d)quidoittreconvertielaffichageenhexadcimal,avecunprfixe0xavant(#),le%indiquantderemplacer
lescaractresaccolsparlavariablesitueenparamtre,danslordre.
long i=123456;
printf("%d ladresse %#xd\n",i,&i);
Lersultatvarievidemmentdunemachinelautreetnestjamaislemmesionrelanceleprogrammeplusieurs
fois:
123456 ladresse 0xbf9f8420d
Cpermetaussideconnatrelalongueurdunevariable,lenombredoctetsquelleutilise,aveclafonctionsizeof().
printf("%d ladresse %#xd, taille de %d octets\n",i,&i,sizeof(i));
Unevariabledetypelongestcodesur4octetssurunordinateur32bits,donclersultatneprovoqueaucune
surprise.
123456 ladresse 0xbfa03430d, taille de 4 octets
2.Lepointeur
a.Principeetdfinition
Quecesoitavecdeslangagesdebasniveau,dehautniveaucommePHPouenalgorithmique,ilpeuttreutilede
trouver des moyens de manipuler directement ou indirectement des adresses de variables ou autres lments
(tableaux,typesstructurs,objets).EnPHPcenestpasdirectementpossible,vousverrezunautremoyen.Maisla
notionestimportante,ycomprispourcelangage.
Vousnaurezquerarementloccasion,voirejamais,derentreruneadresselamaindansunevariable.MmeenC,
vouspartirezgnralementduneadressedjdfinie(celledunevariable,duntableau,etc).
Dansleslangagessupportantlesmanipulationsdadressesmmoire,ilestcourantdemanipulercesadressesau
traversdevariablesparticuliresquinecontiennentnonpasunedonne,maisuneadressemmoire.Cesontdes
pointeurs.
Unpointeurestunevariablequicontientladresseduneautrevariable.
Le pointeur pointe sur une autre variable dont il contient ladresse mmoire, cette dernire tant dite variable
pointe.Sivousaffichezlecontenudunpointeur,vousobtenezuneadressequiestcelledelavariablepointe,
tandisquesivousaffichezlecontenudelavariablepointe,vousobtenezlavaleurassociecettedernire.
Un pointeur est une variable. De ce fait, elle doit tre dclare, dispose ellemme de sa propre adresse en
mmoireetsevoitdfiniruntype.Letypedunpointeurnedcritpascequilcontient(cestuneadresse,doncen
principedunelongueurde32ou64bitsselonlesarchitectures)maisletypedelavariablequilpointe.Unpointeur
- 2 - ENI Editions - All rigths reserved
surunevariabledetypelongdevraitdonctredclaravecuntypelong.
Lepointeuretlavariablepointeenmmoire
b.LeCroidespointeurs
Peuttretesvousperdudanscesdfinitionsetexplications.LexemplesuivantenCdevraitsuffisammentvous
clairer pour la suite. Supposez que vous voulez placer dans un pointeur ladresse de la variable i de lexemple
prcdent. Pour dclarer un pointeur en C, il suffit dajouter une toile "*" avant son nom. Chaque ligne est
commente pour vous aider. Lobjectifestdefairepointerunpointeurp_isurladresse de lentieri.Pourcela,le
pointeurrecevracetteadresselaidedusigne"&"devanti,carcommevuauparavant,cesignepermetdaccder
ladressedunevariable.
long i=123456; /* Un entier long contenant 123456 */
long *p_i; /* Un pointeur sur un entier long */
/* Le pointeur p_i reoit ladresse de i */
p_i=&i;
printf("%d ladresse %#xd, taille de %d octets\n",i,&i,sizeof(i));
printf("Le pointeur p_i pointe sur ladresse %#xd\n",p_i);
lexcutionsurlamachinedelauteur,onobtientceci:
123456 ladresse 0xbfa95cbcd, taille de 4 octets
Le pointeur p_i pointe sur ladresse 0xbfa95cbcd
Notezqueladressedelavariableicorrespondmaintenantexactementaucontenudupointeurp_i.Lepointeurp_i
pointesurlavariableidontilcontientladresse.
Mais que faire de ce pointeur ? Le pointeur sert mmoriser ladresse, (lemplacement mmoire) dune autre
variable. Les utilisations sont multiples et la suite du chapitre vous proposera deux applications des pointeurs :
listeschanesetarbresbinaires.Enattendant,depuisunpointeurvouspouvezaussiaccderaucontenudela
variablepointe.Ilsuffittantlaffichagequlaffectationdajouterunetoile"*"avantsonnom.Queprovoque
enClalignesuivante?
printf("Contenu de la variable pointe via *p_i: %d\n",*p_i);
Laffichageducontenuprsentladressepointe,donclecontenudelavariablepointe:
Contenu de la variable pointe via *p_i: 123456
Lefaitdaccderaucontenudelavariablepointesappelledrfrencerunpointeur.
Aveccesystme,ilestpossibledemanipulerlesvariablesetlespointeursdanstouslessens.Sivousmodifiezle
contenu de la variable pointe, ladresse du pointeur nest pas modifie, mais son drfrencement affichera la
nouvellevaleur.Rciproquement,vouspouvezmodifierlavaleurdelavariablepointeenpassantparsonpointeur
avecltoiledevant.
- 3 - ENI Editions - All rigths reserved
/* modification de la valeur de la variable pointe par p_i */
*p_i=987654;
printf("i contient maintenant %d\n",i);
Lersultatestquevousvenezdemodifierlecontenudelazonemmoireladressepointeparp_i,quiestcelle
dei.Vousvenezdoncdemodifierlavaleurdeienpassantparunpointeur.
i contient maintenant 987654
c.Applications
Lesapplicationssontnombreuses:
G En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structur. Elle doit
retournerladressedecellecietdoncsonrsultatseraplacdansunpointeuradquat.
G Danslechapitresurlessousprogrammes,vousavezvuquilestpossibledepasserunevariableenSortie
(S)ouEntre/Sortie(ES)uneprocdure.Daprsvous,quelestlemcanismeutilis?Lepointeur,bien
entendu:vouspassezladressedelavariableenparamtreetlesousprogrammevamodifierlecontenu
delammoirecetteadresseviaunpointeur.
G Lespointeursouvrentlavoielutilisationdemcanismescomplexes.Notamment,vouspouvezcrerune
liste denregistrements ordonns : un enregistrement contient une valeur, puis un pointeur vers
lenregistrementsuivantetainsidesuite
G Dans un langage bas niveau comme le C, les tableaux se manipulent trs facilement via des pointeurs,
puisquilestpossibledefairedescalculssurlesadresses:+1vaaucontenudeladressesuivanteetainsi
desuite.
VoiciunsimpleexempleenCdunefonctionquidoitmodifierlecontenudunevariableenpassanttoutdabordpar
unevaleurderetour,puisparunpointeur.
LapremirefonctionesttrsclassiqueetressemblebeaucoupcequiexisteenPHP.
long modif(long var,long n)
{
var=n;
return var;
}
Ellesutiliseainsietnamnepasderemarqueparticulire:
i=modif(i,1000);
printf("i contient maintenant %d\n",i);
Lasecondefonctionestmodifiepourprendreuneadresseenparamtre:
void modif2(long *var, long n)
{
*var=n;
}
Le premier paramtre est un pointeur sur une variable de type long. La fonction doit recevoir ladresse dune
variabledetypelong,commelavariableidelexemple.Vousdevezlappelercommececi:
modif2(&i,20000);
printf("i contient maintenant %d\n",i);
Cest ladresse de i que vous passez comme premier paramtre de la fonction. Dans la fonction modif2, var va
contenir ladresse de i, va modifier le contenu de cette adresse en y plaant la valeur du second paramtre. Au
retour,lavaleurdeiestdoncmodifie.
i contient maintenant 20000
CestexactementlefonctionnementdessousprogrammesdetypeprocdureduchapitreLessousprogrammes.
- 4 - ENI Editions - All rigths reserved
Cest avec les enregistrements de type structur et surtout les tableaux que les pointeurs montrent toute leur
puissance. Un tableau est une liste dlments contigus en mmoire. Si vous rcuprez ladresse du premier
lment,vouspouvezaccdezauxnlmentssuivantssitusauxnadressessuivanteslaidedunpointeur.
Prenez une chane "bonjour". Chaque caractre occupe un octet et en mmoire la chane se termine par un
caractrenul.EnC,unechanedecaractresestenfaituntableaudecaractres,llmentdindice0contenantle
premiercaractre,llmentdindice1lesecond,etc,jusquaudernierlmentcontenantlecaractrenuldefinde
chane. Placez un pointeur sur le premier lment du tableau. Si vous incrmentez le pointeur de 1, vous vous
dplacezdelalongueurduncaractreenmmoire,vousvoustrouvezsurlesecondcaractreetainsidesuite.
Ajouter1unpointeurnedplacepasforcmentladressedeunoctetenmmoire,maisdelalongueurdu
typedupointeur.Sivousajoutez1unpointeurdetypelong,vousajoutezquatreoctetsladresse.
laidedeceprincipe,ildevienttrssimpledecalculerlalongueurdunechanedecaractresenC:tantquela
valeurcontenueladressedupointeurnestpasnulle,vousincrmentezde1lepointeur.Cequidonne:
char chaine[]="bonjour"; /* un tableau de caractres, une chane */
char *p_c; /*un pointeur de type caractre */
int n; /* va contenir le nombre de caractres */
/* le pointeur p_c contient ladresse du premier lment */
p_c=&chaine[0];
/* tant que *p_c ne contient pas \0 (nul) */
while(*p_c!=\0)
{
p_c++; /* on dcale dun char ladresse */
n++; /* on incrmente le compteur */
}
printf("Longueur: %d\n",n);
Laboucleestextrmementdtaillemaisilestpossibledefairebienpluscourt!
for(n=0;*p_c!=\0;p_c++) n++;
EnC,chaquelmentduntableauestenfaitunpointeursurladressemmoirecontenantcetlment.Ce
quiveutdirequechainecontientladressedupremierlmentetque*chainecontientlepremierlment,
chaine+1ladressedusecondlmentet*(chaine+1)soncontenu,etc.Aussip_c=&chaine[0]auraitpuscrire
p_c=chaine.
Voyezvousmaintenantlintrtdespointeurs?Bienquecettenotionsoitassezcomplexe,ellepermetdesimplifier
fortementlestraitementssurlestableaux,lespassagesetlarcuprationdevaleursetstructurescomplexes.
3.Notationalgorithmique
a.Dclareretutiliserlespointeurs
Lalgorithmiqueautorisebienentendulutilisationdespointeurs.Vousdclarezunpointeurcommenimportequelle
variableetaummeendroit,souslemotclVAR.
nom : pointeur sur type point
Parconvention,lespointeurscommencentparlalettrep.Cenestpasuneobligationmaisvousvousyretrouverez
beaucoupmieuxsivoussuivezcetterecommandation.Commevuprcdemment,letypepointdoittredumme
typequelavariablepointe.Sivouscrezunpointeursurunentier,lepointeurseradetypeentier:ilpointesur
unentier.
Var
txt :chane
ptxt :pointeur sur chane
cpt :entier
pInt :pointeur sur entier
Lepointeurpeutrecevoiruneadressestatique,cestdire une adresse en hexadcimal que vous rentrez vous
mme. Cest une affectation directe. En pratique, cette mthode nest que trs rarement utilise, sauf cas
- 5 - ENI Editions - All rigths reserved
spcifiques(sionsaitqutelleoutelleadressesetrouvetoujourslammedonneentoutecirconstance)etvous
prfrerezpasserladressedunevariableconnue.
pointeuradresse de variable
Aveclesvariablesdupetitexemple,celadonne:
Dbut
txt"Hello World"
ptxtadresse de txt
cpt10
pIntadresse de cpt
Tout comme en C, vous utiliserez ltoile pour accder au contenu de la variable pointe, tant en lecture quen
affectation.Suiteduprogramme:
Afficher *ptxt
*ptxt"Salut tout le monde"
Afficher txt
*pInt20
cptcpt+1
Afficher cpt
lafin,quecontiennenttxtetcpt?Respectivement"Saluttoutlemonde"et21.
Ilsepeutquunpointeurnaitpasencorereudadresseetdoncpointesurnullepart.Cestembtantcarcestle
plantageassursivoustentezdelutiliser.Pourviterceproblme,vousluiaffecterezunevaleurgnrique,quine
reprsenterien,maisquipourracependanttreteste.CestlavaleurNIL(NotIdentifiedLink).EnC,cestNULLet
en PHP null. NIL est une sorte dquivalent de zro, mais qui est reconnue telle quelle (si vous comparez NIL et
zro,vousaurezunretourfaux).
pIntNIL
Fin
Attention : cestvousdetestersiunpointeurestpositionnsurNILavantdelutiliser!Unaccsun
pointeurcontenantNILprovoquerauneerreur.
Dernierpoint,maiscecidevraitvoussemblervident,vousavezledroitdecrerdespointeurssurnimportequel
typedevariable,ycomprisdesenregistrements.Cestmmelundespiliersdelutilisationdespointeurs.Lasuite
duchapitreyferafortementappel.
Type
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct
Var
art :tarticle
pArt :pointeur sur tarticle
Dbut
art.ref"ref01001"
pArtadresse de art
Afficher (*pArt).ref // on trouve aussi la notation pArtref
Fin
Encommentaire,ilestindiququelanotationpArtrefestaussiutilise,avecuneflcheindiquantquonpointesur
lenregistrementrefdelastructurepointe.CettenotationestissuedeslangagesCetC++quifontladiffrence
entre une variable structure (utilisation du point pour laccs aux champs) et un pointeur sur une variable
structure(utilisationdelaflche).Dansledoute,vouspouvezaussiprocderainsi:
Afficher pArtref
Afficher (*pArt).ref
Lesdeuxsyntaxessontquivalentescarrappelezvousqueltoiledrferencelepointeur:onrcuprelavaleur
delavariablepointeetdoncicilquivalentdelavariableartoriginale.
- 6 - ENI Editions - All rigths reserved
b.Allocationdynamique
Jusqu prsent les pointeurs recevaient ladresse dune variable qui existait dj par affectation. Il est aussi
possible de rserver un emplacement mmoire pour une donne pointe directement. Dans ce principe, vous
pouvezcrerunpointeursurunentierparexempleetrserverunespacemmoirequicontiendracetentier,sur
lequellavariablepointeurpointera.Cestleprincipedelallocationdynamiquedemmoire.Ilvousfautemployerla
syntaxesuivante:
pointeurnouveau type
Letypedoitbienentendutreceluidelavaleurquiseracontenuelemplacementmmoirerserv.Aprscette
instruction, le pointeur reoit ladresse mmoire de la zone rserve. En cas dchec (plus de mmoire disponible
parexemple)ilreoitlavaleurNIL.
Dans lexemple suivant, un pointeur sur un entier est dclar. Voulant placer une valeur entire dans la zone
mmoirepointe,ilfautdabordrserverlemplacementncessaire.Puisvialutilisationdeltoiledevantlenomdu
pointeur,onyplaceunentier.
Programme alloc
Var
pEntier :pointeur sur entier
Dbut
pEntiernouveau Entier
*pEntier12345
Afficher *pEntier
Fin
Danslaplupartdeslangagesdisposantdepointeurs,ilestpossibledeprciserlatailledelammoirealloue,par
exemple allouer un espace pour dix entiers. Dans ce cas, cest lquivalent dun tableau dentiers et ladresse
retourneseracelledupremierentier.Ajouter1aupointeurdcaleraceluicidunlment.Cettesyntaxenestpas
utiliseenalgorithmiqueoonprfreallouerlammoirelmentparlment,quitteleschanerensuite.
Quand vous allouez dynamiquement de la mmoire, elle reste occupe tout le temps de lexistence du pointeur.
Sansriendautre,lammoireestrcupreuniquementlasortieduprogramme.Ilestaussifaciledallouerdela
mmoirequedelalibrer,oudeladsallouer(unbarbarismebienutile)volont:dsqueleoulespointeursne
sontplusutiles,onlibrelammoireassocie,cestceladegagn.Pourcecivousutiliserezlasyntaxesuivante:
Librer pointeur
Quandvouslibrezlepointeur,vouslibrezlazonemmoiresurlaquelleilpointait,zonequiredevientdisponible
pour toute autre utilisation. Attention ! Si vous avez conserv dans un autre pointeur ladresse de cette zone et
que vous lavez dsalloue, ce pointeur pointe sur une zone ventuellement raffecte autre chose. Y accder
risquedefournirunevaleurarbitraire,ycrirerisquedoccasionnerdesproblmes,voiredesplantages.Lemieux
estdereplacerunevaleurNILaprslalibrationetdepensertesterlepointeuravantdelutiliser.
Nedrfrencezjamaisunpointeurdontlazonemmoireatlibre.Cestunefautemalheureusement
courante. Dans de trs gros programmes, le programmeur oublie parfois de tester la valeur du pointeur
avantdyaccder,provoquantunefuitemmoireauxconsquencessouventlourdes.
Programme libere
Var
pEntier :pointeur sur entier
Dbut
pEntiernouveau Entier
/* suite du programme */
...
librer pEntier
pEntierNIL
Fin
4.PHPetlesrfrences
a.DiffrencesentreleCetPHP
- 7 - ENI Editions - All rigths reserved
LelangageCestleroidespointeurs.forcedenparler,onenoublieraitpresquePHP.Dufaitdelutilisationdun
interprteur,PHPneconnatpaslespointeursausenspropre.Ilestcependantpossiblequunevariablerfrence
lautre.Celaressembleunpeuauxpointeurs.Cependantilexistedesdiffrencesessentielles:
G Un pointeur contient ladresse relle en mmoire dune variable. Une rfrence PHP, appele handle
(poigne) en anglais, ne contient quune information "virtuelle" permettant daccder la ressource et
fournieparlinterprteur.
G LesmanipulationsdepointeurspeuventvitedevenirtrscomplexesenC/C++:risquededpassementdes
adresses,allocationsmmoirescompliques,risquedeconfondrelestypes,etc.Ilnyapasderisquedece
genreenPHPolammoireestgreparlinterprteur.
G LeseuloprateurprsentenPHPestle"&"permettantderfrencerunevariable.
Ne croyez pas que labsence des pointeurs en PHP soit une limitation, cest mme tout le contraire. Tout dabord
PHPestunlangagevoludehautniveaudontlerlenestpaslamanipulationbasniveaudadressesphysiques.
De ce fait, le programmeur est entirement dbarrass de toute la gestion de ces adresses puisque la machine
virtuellesoccupedetout.CestunesortedeC++dbarrassdetoutesacomplexit.LedveloppementenPHP
estdonctrssimplifienseconcentrantsurlesfonctionnalits.
b.Lesrfrences
EnPHP,toutevariablepeuttrerfrenceetenrfrenceruneautre.Loprateur"&"devantunnomdevariable
permetdercuprersarfrence.Sivoustentezdelafficher,vousnobtiendrezpasdadressemmoiremaisson
nom de rfrence tabli par linterprteur PHP. PHP maintient une table des ressources (variables par exemple)
utilises dans le programme. Chaque ressource est identifie par une valeur, une entre. Cest cette valeur qui
rfrence la variable. Dans lexemple suivant, $copie reoit la rfrence du tableau $t. Les deux variables
rfrencent donc la mme chose : le tableau. On accde celuici par lune ou lautre variable, puisquelles
rfrencent le mme tableau. De mme, la fonction tableau reoit comme paramtre la rfrence de la variable
passeenparamtre.Lamodificationestdirectementeffectuesurletableaupassenparamtre.
EnPHPtouteslesvaleurssontpassesencopieSAUFpourlesobjets,quilesonttoujoursparrfrenceetceci
depuisPHP5.
<html>
<head><meta/>
<title>Rfrences explicites</title>
</head>
<body>
<?php

function tableau(&$tab)
{
$tab[1]=12345;
}

$t=array(2,7,9,10,11,14,17,18,20,22);
$copie=&$t;

echo "${t[2]}<br />\n";


$copie[2]=5;

echo "${t[2]}<br />\n";

tableau($t);

echo "${t[1]}<br />\n";

?>
</body>
</html>
Vous reconnaissez lun des exemples du chapitre "Les tableaux et structures". Il lui a t ajout une fonction
"tableau" qui prend comme paramtre un tableau dentiers. Le tableau t est pass en paramtre de la fonction
tableau. Dans cette fonction, le paramtre est modifi : lindice 1 du tableau tab reoit la nouvelle valeur 12345.
Aprs la fin de la fonction, le programme raffiche le contenu de lindice 1 du tableau pass en paramtre : il
contient12345.
- 8 - ENI Editions - All rigths reserved
En PHP, tous les objets sont affects et passs en rfrence aux fonctions. Par contre, tous les types
simples (si on peut parler de types en PHP, parlez plutt de scalaires) sont affects et passs en copie.
Vouspouvezforcerlepassageenrfrenceenajoutantun&devantlavariabledansladclarationdelafonction
oulaffectation.Cestvousdefairetrsattentionlorsquevousmodifiezlecontenudecestypesdevariables
danslafonction.
Il est possible de dclarer certains types classiques comme des objets pour faire ragir PHP comme Java,
notamment avec les tableaux que Java considre comme des objets (Java considre tous les types comme des
objets, tout ce qui est dclar avec new). En PHP, il est possible de convertir un tableau en objet. Ainsi, il sera
automatiquementaffectetpassenparamtrecommerfrencesansutiliserde&pralable.
<html>
<head><meta/>
<title>Rfrence avec ArrayObject</title>
</head>
<body>
<?php

function tableau($tab)
{
$tab[1]=12345;
}

$t=array(2,7,9,10,11,14,17,18,20,22);
$o_t=new ArrayObject($t);

$copie=$o_t;

echo "${o_t[2]}<br />\n";


$copie[2]=5;

echo "${o_t[2]}<br />\n";

tableau($o_t);

echo "${o_t[1]}<br />\n";


?>
</body>
</html>
Lesrfrencesfonctionnentaussisurdestypesquelconques.
<html>
<head><meta/>
<title>Rfrence sur types quelconques</title>
</head>
<body>
<?php

function modif_int($var)
{
$var=10;
return $var;
}

function modif_int2(&$var)
{
$var=20;
}

$v=0;

// aucun effet
modif_int($v);
echo "$v<br />\n";

// par retour de valeur


$v=modif_int($v);
- 9 - ENI Editions - All rigths reserved
echo "$v<br />\n";

// par reference
modif_int2($v);
echo "$v<br />\n";

?>
</body>
</html>
c.Rfrencessurstructures
Danslasuite,vousallezavoirmanipulerdespointeurssurdesstructures.CestextrmementsimplecardansPHP
toutes les soidisant structures sont en fait des objets jusquprsentvolontairementtronqusdelaplupartde
leursfonctionnalits.Orcommetoutobjet,lavariablequireoitunobjetenreoitunerfrence.Vousavezdj
utilisceprincipesanslesavoir,toujoursdanslechapitreLestableauxetstructures,aveclesstructurestfabricant
ettarticle.
Cet exemple est bien plus intressant quil ny parat, vous le voyez probablement maintenant avec unil neuf,
puisque chaque dclaration dune variable enregistrement de ces types est en fait une rfrence sur
lenregistrement:
G $articleestunerfrencesurunestructure(unobjet)detypetarticle.
G $article contenant une variable de type tfabricant, on cre dedans une rfrence fab sur un objet de ce
type.
G $art2detypetarticlereoitlarfrencedearticle.Ilsrfrencentlemmeenregistrement.
G Le contenu des champs de $art2 est affich, cest le mme que article. Si vous modifiez les champs, la
modificationserpercutesurtouteslesrfrencessurcetenregistrement:cestlemmepourtous.
<html>
<head><meta/>
<title>Rfrence structures</title>
</head>
<body>
<?php

class tfabricant {
public $ref;
public $nom;
public $adresse;
public $tel;
}
class tarticle {
public $ref;
public $libelle;
public $prix;
public $fab;
}

$article=new tarticle();
$article->ref="Art001_01";
$article->fab=new tfabricant();
$article->fab->ref="Fab1234";

$art2=$article;

echo "$art2->ref<br />\n";


echo "{$art2->fab->ref}<br />\n";

?>
</body>
</html>
- 10 - ENI Editions - All rigths reserved
d.LepigeenPHP
En PHP il faut faire trs attention : quand vous passez une rfrence en paramtre, vous pouvez modifier le
contenudelarfrenceetcecontenuseramodifidirectementdanslazonemmoire,cestparfait.Maisvousne
pouvezpasmodifierlarfrenceellemme!Sivousmodifiezauseindunemthodelavaleurdelarfrenceelle
mme,elleretrouvesavaleurinitialeensortie.Parexemple:
class element {
public $valeur;
}

function modif($p1,$p2) {
$p1=$p2;
}
Sidansleprogrammeprincipalvousavez:
$p1=new element();
$p2=new element();

$p1->valeur=10;
$p2->valeur=15;

modif($p1,$p2) ;

echo $p1->valeur ;
Lasortiesera10!Eneffetdanslamthodemodif(),p1contientbienlarfrenceverslemplacementmmoirede
lobjetp1,maislavariablep1estellemmelocalelamthode!Doncenaffectantp2p1,p1reoitlarfrence
dep2maislanouvellevaleurestperduelasortiedemodif().Ilfautdoncprocderainsi:
function modif($p1, $p2) {
$p1->valeur=$p2->valeur;
}
Cettefois,cestlecontenudesvaleursdanslazonemmoirerfrencequiestaffectetvousobtenezlersultat
attendu.
e.Lavaleurnull
Ilsepeutquevousnayezpasbesointoutdesuitedecrerunerfrencesurunenregistrement,maisquevous
vouliezviterdyaccderparinadvertance.Danscecas,aulieudecrerunerfrenceavecnew,vouspouvezlui
affecterunevaleurappelenull.Cettevaleursignifiequelavariableatdclaremaisnapasdobjetinstanci
(termeexpliqudanslechapitresuivant):vousneluiavezpasencoreaffectdenregistrement.Ainsi,vouspouvez
djtesterlavariableellemmeavantdetesterleschampsquellecontient.
Dans lexemple suivant modifi, tarticle contient toujours une variable de type tfabricant. Mais elle ne recevra un
enregistrementqueplustarddansleprogramme.Enattendant,lechampfabreoitunevaleurnulle,signifiantque
larticlenapasencoredefabricantrfrenc.
Html>
<head><meta/>
<title>Rfrence structures 2</title>
</head>
<body>
<?php

class tfabricant {
public $ref;
}

class tarticle {
public $ref;
public $fab=null;
}

$article=new tarticle();
- 11 - ENI Editions - All rigths reserved
$article->ref="Art001_01";

if($article->fab!=null)
echo "{$article->fab->ref}<br />\n";
else
echo "Pas de fabricant pour cet article<br />\n";

?>
</body>
</html>
- 12 - ENI Editions - All rigths reserved
Lalgbreboolen
1.Loriginedestests
Lestestseffectustantenalgorithmiquequenprogrammationsontdestestslogiques,oupluttfaisantappella
logique. Le chapitre Les variables et oprateurs a dj brivement abord ce point lorsquil a t question des
oprateursboolens.LesoprateursditslogiquesET,OUetNONsontdesreprsentationsdelalogique.Dequelle
logiqueparleton?
Fondamentalement, la logique est la mme pour tout le monde, bien que videmment linterprtation des rsultats
puissevarierdunindividulautre(enstatistiqueparexemple).Lalogiqueestuniverselle.MonsieurSpock,silavait
exist naurait pas dit mieux. Mais jusqu peu (dans lchelle de lhumanit) il ny avait aucun moyen de se la
reprsenter rellement, sous forme de symboles, dassertions,etc.Ilny avait aucune reprsentation formelle de la
logique.
Orunordinateurestlogique(mmesionpeutluidemanderdeschosesillogiques,cestvousquileprogrammezaprs
tout). La logique est mme la base de nombreuses applications mathmatiques, lectroniques, dintelligence
artificielle.Eninformatique,lematrielestlectroniqueetdpenddelalogique,lesprogrammesdpendenttantde
tests et de calculs faisant appel la logique et devant fonctionner sur des circuits lectroniques. Sans logique, pas
dlectronique,nidordinateurs,nideprogrammes.
Cestcequifaitquelesoprateurs,conditionsettestsnedoiventpastrepossnimportecomment.Ilnyariende
plus logique quunordinateur,maisaussiriendeplusstupide:ilvabtement(etencorelanotiondebtiseluiest
inconnue)excuterexactementcequevousluidemandez,mmesilersultatentraneuneerreurouestfauxetcela
dumomentquelestestssontbienpossetquunerponselogiquepeutentredduite.Ainsi:
PROGRAMME STUPIDE
VAR
froid, nu, sortir en Boolen
DEBUT
FroidVRAI
NuVRAI
Si Froid=VRAI ET nu=VRAI Alors
SortirVRAI
FinSi
FIN
Cetalgorithmepeuttreainsiinterprt:"Silfaitfroiddehorsetquejesuisnu,alorsjepeuxsortir".Cetalgorithme
estpourvousetmoi,treshumains,faux.Vousnallezpassortirnusilfaitfroid,vousauriezpluttintrtmettre
SortirFAUX,ouinverserlaconditionfroidounu.Cestvident!Maislordinateursenfiche:ilnaaucunmoyende
savoir que vous avez fait une erreur dans vos tests. Le programme est mathmatiquement logique : chaque test
analysestcorrectetdonclesconditionssontrempliespourpasserlavariableSortirVRAI.
Lasuiteabordedespointsthoriques.LebutnestpasdevousdonneruncoursmagistralsurlalgbredeBoolemais
de vous fournir des bases de comprhension du fonctionnement de la logique vu du ct de linformatique. Si vous
voulez aller plus loin, il existe une littrature consquente ce sujet dans les bibliothques et les librairies (par
exemple, "Algbre de Boole" chez Masson). Sil vous intresse un jour daller largement audel et dexplorer les
mcanismes de logique et de pense humaine ou dintelligence artificielle, il existe un gros ouvrage de rfrence,
rfrencedenombreuxscientifiques,informaticiensetc,quisappelle"Gdel,Escher,Bach:lesbrinsduneguirlande
ternelle",parDouglasHofstadter.
2.Petiteserreurs,grossesconsquences
Comprenezvous maintenant limportance de la logique formelle et de bien crire les tests et conditions dans un
algorithme?
Pourvousconforterunpeuvoicideuxexemplesdeprogrammesmalcritsetdeleursdsastreusesconsquences.
a.Ariane5
Le4juin1996unbugdunprogrammedelapremirefuseAriane5aprovoqusadestructionaprs40secondes
devol.Leprogrammeenquestioncontrlaitlesgyroscopes(quiindiquentlorientation)delafuse.IlvenaitdAriane
4 et navait pas t test ni modifi pour Ariane 5. En gros, un nombre de 64 bits a t converti en 16 bits.
videmment cela ne "rentre pas" et les valeurs retournes par ce programme sont devenus aberrantes. Or ce
programmetaitcritiqueetnauraitjamaisdretournerdevaleursimpossibles.Lesdonnesretournesntaient
pas testes et vrifies par le programme central de calcul de vol qui les prenaient pour argent comptant et les
- 1 - ENI Editions - All rigths reserved
interprtaient telles quelles. Sur un nombre sign, le dernier bit correspond au signe. Lorsque les 16 bits ont t
remplis,ledernierbitestpassun.Leprogrammeareuuneindicationcommequoilafuseavaitchangdesens
(pointait vers le bas) et a orient les tuyres des racteurs en les braquant fond pour rectifier une situation
totalement fausse. La fuse a donc subi un moment donn de par la pousse et sa position, des forces
arodynamiques telles que sa destruction est devenue invitable. Le comble ? Le programme des gyroscopes ne
devaittreutilisquedurantlecomptereboursetuniquementsurlesmodlesAriane3!Autrementdit,ilnaurait
jamaisdtreprsentnifonctionnerenvol.
b.MarsClimateOrbiter
Lautreexempletoucheencoreaudomainespatial.Le11dcembre1998laNASAlanaunesondeendirectionde
Mars:MarsClimateOrbiter(MCO),danslebutdtudierleclimatmartien.Lasondearrivaeninsertionorbitale(mise
enorbiteautourdeMars)le23septembre1999.Lasondedevaitallumersonmoteurprincipalunbonquartdheure,
passerderrirelaplante(pertedecontactaveclaTerre)puisdenouveaudevant(reprisedecontact).Lecontact
najamaisrepris.Pourquoi?Parcequelorsdescalculsncessairescetteinsertionsurorbite,MCOafaitappelun
programme issu dun autre fournisseur (Lockheed Martin). Or MCO programm par la NASA utilisait le systme
mtrique (Newtons par seconde) et celui de Lockheed Martin le systme de mesure imprial anglais (Livre par
seconde).Personnenavrifinitest.Lersultatestquelasondesestapprochetrshautevitesse57kms
delasurface,aulieude150kmsetabrldanslatmosphremartienne.Bteerreur.
Imaginezmaintenantlesconsquencesdecesdeuxtrsstupideserreursdeprogrammation(desimplestestsde
conversion),silyavaiteudesastronautesdanscesmissionsHeureusement,votremodestechelle,vousnavez
probablementpaslaprtentiondenvoyerdeshommessurMars
3.GeorgeBoole
Comme indiqu dans le chapitre Les variables et oprateurs, cest langlais George Boole (18151684), logicien,
mathmaticien et philosophe qui le premier a pos les bases de la formalisation de la logique en proposant une
analyse mathmatique de celleci. En 1847 il publie un livre intitul "Mathematical Analysis of Logic" (Analyse
mathmatique de la logique) puis en 1854 "An Investigation Into the Laws of Thought, on Which are Founded the
MathematicalTheoriesofLogicandProbabilities"(unerecherchesurlesloisdelapense,surlesquellessontfondesles
thories mathmatiques de logique et de probabilits). Dans ces ouvrages, George Boole dveloppe une nouvelle
formedelogique.Leformalismerassembleunelogiquesymboliqueetunelogiquemathmatique.Lesidesdoivent
tretraduitesmathmatiquementsousformedquations.Cellescipeuventensuitetretransformesviadesloiset
leursrsultatstraduitsentermeslogiques.
Boolecrealorsunalgbrebassurdeuxvaleursnumriques,le0etle1,autrementditlebinaire,quiseraofficialis
etmisenpratiquedansletraitementdelinformationlesiclesuivantavecClaudeShannon.
Durant sa vie, les travaux de Boole restrent au stade thorique. Cependant, son algbre est la base de
nombreuses applications quotidiennes telles que llectronique (les circuits logiques), linformatique (processeurs,
programmes), les probabilits, llectricit (les relais), la tlphonie (les commutateurs), diverses recherches
scientifiques,etc.Ntrspauvreetautodidacte,GeorgeBoolefiniramembredelillustreRoyalSocietyeteffectuerade
nombreuxtravauxsurlesquationsdiffrentielles.
4.Lalgbre
a.tablirunecommunication
George Boole a dvelopp lalgbre qui porte son nom. Il est utilis en mathmatique, logique, lectronique et
informatique. Il permet deffectuer des oprations sur les variables logiques. Comme son nom lindique, il permet
dutiliserdestechniquesalgbriquespourtraitercesvariableslogiques.
Prenezlaphrasesuivanteabsolumentlogique"UnepropositionpeuttrevraieOUfausse,maisnepeutpastre
vraie ET fausse". Autrement dit une variable logique ne dispose que dun seul tat un moment donn : vrai ou
faux.Enprenantplusieurspropositions,onpeutappliquerentreellesdesformulesalgbriques.
La premire utilisation de cet algbre la t pour ltablissement de communications tlphoniques via la
commutation tlphonique mise en place par Claude Shannon. Prenez cet exemple simple de mise en place dune
communicationtlphoniqueentredeuxinterlocuteurs.Unecommunicationncessitelafoisunmetteur(quimet
lappel)etunrcepteur(celuiquidcroche).Onadonc:
Communication=Emetteur ET rcepteur
Lacommunicationesttabliesilmetteurappelleetquelercepteurdcroche.Endautrestermes,Communication
estVRAIEsiEmetteurestVRAIetrcepteurestVRAI.Danslesautrescas,lacommunicationnestablirapasetsera
donc FAUX. Si vous appelez quelquun (VRAI) mais quil ne dcroche pas (FAUX), ou encore que vous dcrochez
(VRAI)sansappelmis(FAUX),ouquepersonnenappelleninedcroche(FAUXdanslesdeuxcas),ilnyaaucune
- 2 - ENI Editions - All rigths reserved
communicationdtablie.Onpeutendduirelatablesuivante:
NetrouvezvouspasquecettetableressemblebeaucouploprateurlogiqueET?Oui,cestunexempleconcret
dapplication de lalgbre de Boole. Cette table o toutes les variables logiques sont poses avec leur rsultat
sappelleunetabledevrit.
Chaque case prend une valeur VRAI ou FAUX et la colonne finale le rsultat attendu, luimme VRAI ou FAUX.
RemplacezVRAIetFAUXparlesvaleursbinairesrespectives1et0:
Ilyadesfoisoilyavidemmentplusdedeuxvariableslogiques.Prenezlexemplesuivant.Quanddcrochezvous
votre tlphone ? Quand il sonne ? Quand vous voulez appeler quelquun ? Sil sonne, voulezvous vraiment
rpondre(sivousavezlaffichagedunomoudunumrodelappelant,vousvoudrezpeuttrefiltrervosappels)?
Quelspostulatsposezvous?Vousdcrochezsi:
G LetlphonesonneETvousvoulezrpondre,
G Vousvoulezappelerquelquun.
Autrementdit:
Dcrocher=(Sonnerie ET volont de rpondre) OU envie dappeler quelquun
DcrocherestVRAIsivotretlphonesonne(VRAI)ETquevousvoulezrpondre(VRAI)OUsivousvoulezappeler
quelquun(VRAI).
b.Lavrit
Vous avez vu cidessus une table de vrit. Pour tablir celleci, vous avez besoin de variables logiques qui ne
prennentquedeuxvaleurs:VRAIouFAUX,quon appelle lesvaleursdevrit.Cesvaleursformentunensemble
appelB.VRAIetFAUXnencessitentquedeuxchiffrespourtrereprsents:1et0.LensembleBsenoteainsi:
B={1,0}
En mathmatiques, vous connaissez probablement dautres ensembles, comme par exemple lensemble N des
entiers naturels. Sur ces ensembles sappliquent des lois, des thormes, des transformations. Cest pareil pour
lensemble B, qui est rgit par des lois et des transformations. De cellesci peuvent tre dduites une grande
quantitdepropritsetdedrivations.
c.LaloiET
VouslaconnaissezdjdepuislechapitreLesvariablesetoprateursetloprateurlogiqueassoci.LaloiETest
aussiappelelaconjonction.Ellesnonceainsi:
Emetteur Rcepteur Communication
FAUX(nappellepas) FAUX(nedcrochepas) FAUX(pasdecomm.)
FAUX(nappellepas) VRAI(dcroche) FAUX(pasdecomm.)
VRAI(appelle) FAUX(nedcrochepas) FAUX(pasdecomm.)
VRAI(appelle) VRAI(dcroche) VRAI(communication!)
Emetteur Rcepteur Communication
0 0 0
0 1 0
1 0 0
1 1 1
- 3 - ENI Editions - All rigths reserved
aETbestVRAIsietseulementsiaestVRAIetbestVRAI
LaloiETutiliseunenotationparticulirediffrenteselonlechampdapplication:
G "."(lepoint):a.b
G "":ab
G "&","&&"ou"AND"enprogrammation,selonleslangages.
La suite du chapitre utilisera la premire notation avec le point. Cette loi est souvent associe une vraie
multiplication,car0*nvauttoujours0.Cependantattention,certainespropritsnesappliquentpasdutoutdela
mmemanire!
LaloiETpeuttredcritesousformedetable,nepasconfondreavecunetabledevrit.Elleressembleplutt
unetabledemultiplication...
d.LaloiOU
Vousconnaissezaussicetteloi,rencontreauchapitreLesvariablesetoprateursavecloprateurlogiqueassoci
OU. La loi OU est aussi appele la disjonction. Vous trouvez parfois aussi "disjonction inclusive" afin de la
diffrencierdunautreoprateur.Ellesnonceainsi:
aOUbestVRAIsietseulementsiaestVRAIoubestVRAI
NotezqueleOUtantinclusif(onyvient),siaetbsontVRAIStouslesdeux,aOUbestVRAIaussi.Dumoment
quaumoinslundesdeuxestvrai,aOUbestVRAI.
Lesnotationssuivantessontutilises:
G "+"(signeplus):a+b
G "":ab
G "|","||","OR"selonleslangagesdeprogrammation.
Lasuiteutiliseralapremirenotationaveclesigne"+".LaloiOUestsouventassocieavecladdition,cequise
rvle totalement faux. En effet, 1+1 (addition binaire) vaut 0 avec une retenue de 1. Or, 1+1 est VRAI, donc 1
Attentionaudanger!
LaloiOUpeuttredcritesousformedetable.
e.Lecontraire
Lecontraire,appelaussingationsedfinitainsi:
LoiET
a\b 0 1
0 0 0
1 0 1
LoiOU
a\b 0 1
0 0 1
1 1 1
- 4 - ENI Editions - All rigths reserved
LecontrairedeaestVRAIseulementsiaestFAUX.
VousavezdjrencontrlecontraireavecloprateurNON.Lecontraireestnotcommececi:
G nona
G
G a
G "!","NOT","~"selonleslangagesdeprogrammation.
Ainsiilsuffitderetenirque1=0etque0=1.Parlasuite,cesontlesformesouquiserontutilises,selonle
cas(ex:pournonnona).
f.Lesproprits
Elleestidentiquelalgbreclassique.Danscertainscas,lesparenthsessontinutiles.Ainsi:
a+(b+c)=(a+b)+c=a+b+c
Etencore:
a.(b.c)=(a.b).c=a.b.c
Elleindiquequelordredesvariableslogiquesnaaucuneimportance:
a+b=b+a
Etencore:
a.b=b.a
Attention, cette fois il y a une diffrence importante par rapport lalgbre classique et la distribution lie aux
oprateurs+et*.Cestlaraisonpourlaquelleilatexpliququilnefallaitpaslesconfondreaveclessymboles
logiques.Eneffet,si:
a.(b+c)=(a.b)+(a.c)
estidentique,
a+(b.c)=(a+b).(a+c)
nelestpasdutout,maisestparfaitementcorrectenalgbredeBoole.
Lidempotence signifie que si on applique la mme opration une ou plusieurs fois alors on retrouve toujours le
mmersultat.Parexemple3/1vauttoujours3,mmesivousdiviseznfoispar1.Cettepropritsappliqueaux
deuxoprateurs.Ainsi:
a.a.a.a.a.a.a.a(etc)=a
et
a+a+a+a+a+a(etc)=a
Langationdelangationdunevariablelogiqueestgalelavariablelogique.Ainsilaphrase"Lavieestbelle"
quivaut"Lavienestpasnonbelle".Entermeslogiquesa=nonnona:
a=
Demme:
a+a=1
Lassociativit
Lacommutativit
Ladistributivit
Lidempotence
Lacomplmentarit
- 5 - ENI Editions - All rigths reserved
En effet, lexpression"LavieestbelleOUlavienestpasbelle"quivaut0+1,cequiestVRAIdaprslaloiOU,
lunedesvariablesaumoinstantvraie.Enfin,
a.a=0
quivautdireque"LavieestbelleETlavienestpasbelle",cequividemmentestimpossible.DaprslaloiET,
1.0=0doncFAUX.
Encalculclassique,sivousfaites1+2*3,vousobtenez7carlamultiplicationestprioritairesurladdition.Enalgbre
de Boole les priorits sappliquent aussi. Le ET est prioritaire sur le OU. Vous pouvez cependant influer sur les
prioritsaveclesparenthses.Voicideuxexemples.Danslesdeuxcas,aestFAUX(0),bestVRAI(1)etcestVRAI
(1).
Exemple1:
a+b.c=?
G LeETestprioritaire,oncommenceparb.c:1.1=1
G PuisonpasseauOU:0+1=1
G Onobtientdonca+b.c=VRAI
Exemple2:
a.b+c=?
G LeETestprioritaire,oncommencepara.b:0.1=0
G PuisonpasseauOU:0+1=1
G Onobtientdonca.b+c=1,VRAI
Commetoutalgbre,celuideBooledisposeaussidesesthormes.LethormedeDeMorgantablitdeuxvrits
sympathiquesquisontsouventutilespourrduiredescalculsboolensetaussidansltablissementdestestset
conditions.Cesontenfaitlespropritsassociesaucontraire(NON,ngation).Prenezlatabledevritsuivante:
Prenezmaintenantcettesecondetabledevrit:
Comparezlesdernirescolonnesetvousobtenezlgalitsuivante:
Lapriorit
LethormedeDeMorgan
a b a+b (a+b)
0 0 0 1
0 1 1 0
1 0 1 0
1 1 1 0
a b a b a.b
0 0 1 1 1
0 1 1 0 0
1 0 0 1 0
1 1 0 0 0
- 6 - ENI Editions - All rigths reserved
(a+b)=a.b
Danslesdeuxcas,lersultatseraVRAIuniquementsiaETbsontFAUX.
Delammemanire,avecunetabledevritpluscomplte:
Comparezlacolonnecentraleaveclacolonnefinaleetvousobtenez:
(a.b)=a+b
Danslesdeuxcas,lersultatseraVRAIseulementsiaOUbsontFAUX.
g.Quelquesfonctionslogiques
Lesfonctionslogiquesnesontnidesloisnidesthormes:ellessedduisentdecesdeuxdernierssousformede
formules qui peuvent souvent tre rduites, auxquelles on a donn un nom pour les raccourcir et pour plus de
pratique.Ellessontsouvent"cbles"endurauseindesmicroprocesseursetproposesparquelqueslangagesde
programmation.
Pasdejeudemotsici,rienvoiraveclasriejaponaise.DansleOU(appelOUinclusif)lersultatestVRAIsiaou
boulesdeuxsontvrais.DansleOUexclusif,lersultatestVRAIseulementsiaoubestvrai,maispaslesdeuxen
mmetemps.TraduisezcecienalgbredeBoole:
(aOUb)ETPAS(aETb)soit(a+b).(a.b)
Siondveloppeonobtient:
G (a+b).(a+b)(lederniertermeprovientduthormedeDeMorgan)
G a.a+a.b+b.a+b.b
G a.aetb.bvalenttoujours0(FAUX),onlessupprime,ilreste
G a.b+a.b
Voicisatabledevrit:
LeOUexclusifestnotXOR(leXpoureXclusif).Vouslerencontrezsouscesnotations:
G "":diffrentde,eneffetXORestparfaitementquivalent
a b a.b (a.b) a b a+b
0 0 0 1 1 1 1
0 1 0 1 1 0 1
1 0 0 1 0 1 1
1 1 0 0 0 0 0
LeOUexclusifXOR
a b ab
0 0 0
0 1 1
1 0 1
1 1 0
- 7 - ENI Editions - All rigths reserved
G "":un+entour,ab
Si le XOR nest pas (ou peu) utilis en algorithmique, beaucoup de langages de programmation le proposent,
permettantderemplaceruneconditionlongueparuneconditionpluscourte.Lesprogrammeursnontsouventpasle
rflexe de lutiliser.LaplupartdesmicroprocesseursintgrentdirectementuneinstructiondetypeXOR,accessible
depuis le langage assembleur associ. Enfin, en lectronique, les applications sous forme de porte logique sont
nombreuses.
Lquivalenceportetrsbiensonnom.NoteEQV,ellesignifiequeaEQVbestVRAIsietseulementsiaetbontla
mmevaleur.EnalgbredeBoole:
NON(aOUb)OU(aETb)soit(a+b)+(a.b)
Siondveloppeonobtient:
G (a+b)+(a.b)(lepremiertermeprovientduthormedeDeMorgan)
G (a+a).(a+b).(b.a).(b+b)
G (a+a)et(b+b)valenttoujours1(VRAI),onlessupprime,ilreste
G (a+b).(b+a)
VoicilatabledevritdeEQV:
RemarquezquelquivalenceestlecontraireduXOR.Autrementdit:
aEQVb=(aXORb)
Sivousdveloppezencorelangationde(a+b).(b+a)laidedespropritsetduthormedeDeMorgan,vous
retrouvezlaformulealgbriquedeXOR.
LeEQVestsouventreprsentparlesymbole" ":a b.
Laplupartdeslangagesneproposentpascesfonctions.Limplicationindiquequeaestuneconditionsuffisantepour
b, tandis que b est une condition ncessaire pour a. Cela signifie que si b est vrai, ou bien que si a et b sont
identiques,lexpressionesttoujoursvraie:
LimplicationsenoteaIMPb.
aIMPb=a+b
LquivalenceEQV
a b a b
0 0 1
0 1 0
1 0 0
1 1 1
Limplicationetlinhibition
a b ab
0 0 1
0 1 1
1 0 0
1 1 1
- 8 - ENI Editions - All rigths reserved
Linhibitionestlecontrairedelimplication,ellesenoteaINHb.
aINHb=a.b
h.Avecplusdedeuxvariables
Riennempcheet,bienaucontraire,dutiliserplusdedeuxvariableslogiquesdansdesexpressionsdelalgbrede
Boole.Reprenezlexempledeltablissementdelacommunicationtlphonique.Elledisposedetroisvariables:
G sonner,quiseraappelea,
G rpondre,quiseraappelebet
G appeler,quiseraappelec.
Lersultat(dcrocher)serad,maisnintervientpasdanslescalculs.Quelleestlatablecorrespondante?Attention,
ilyaunpige.VRAIestreprsentpar1,FAUXpar0.
Avezvoustrouvlepige?asonne,onnapasenviederpondre,maisonveutappeler(pourappeler).Dansce
cas, vous nallez pas dcrocher : vous attendrez que le tlphone arrte de sonner, or cidessus vous le faites
quandmme.Donclatablecidessusnestpascorrecte.Uneligneestfausse.Voicilabonnetable:
a b ab
0 0 0
0 1 0
1 0 1
1 1 0
a(sonner) b(rpondre) c(appeler) d(dcrocher)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
a(sonner) b(rpondre) c(appeler) d(dcrocher)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
- 9 - ENI Editions - All rigths reserved
Ladifficultconsistemaintenanttrouvercomment,depuiscettetabledevrit,dfiniruneexpressionboolenne
qui retourne VRAI. Vous constatez que seules quatre lignes de la table de vrit sont vraies, cestdire que la
personnevavraimentdcrocher.
Lersultatest1quanda,betcvalent:
G 0,0,1
G 0,1,1
G 1,1,0
G 1,1,1
Vous pouvez aussi crire que d est vrai quand (a,b,c)=(0,0,1) ou (0,1,1) ou (1,1,0) ou (1,1,1). Convertissez cet
noncenexpressionboolenne:
d=a.b.c+a.b.c+a.bc+a.b.c
Ilestintressantderemarquerquelesdeuxpremierstermesdelexpressionpeuventtrefactorisspara.cetles
deuxdernierspara.bselonlapropritdedistributivit.Lersultatdevientdonc:
d=(a.c).(b+b)+(a.b).(c+c)
Demmecommelapropritdecomplmentaritindiquequea+a=1,lesexpressionsb+betc+csonttoujours
vraies.Ellespeuventtresupprimes.Lersultatfinaldevient:
d=a.c+a.b
Ce nest malheureusement pas toujours aussi vident. Avec quatre, cinq, six termes, les expressions deviennent
beaucouppluslonguesetcomplexes.Ilfauttoujourschercherfaireauplussimple,aveclemoinsdetermesetde
variablespossibles,quitteclaterlesexpressionsboolennes.
Enalgorithmique,lexpressionboolenneprcdenteseraittraduiteainsidansuntest:
PROGRAMME TELEPHONE
VAR
a,b,c,d:boolens
DEBUT
aVRAI
bVRAI
cFAUX
Si ((NON a) ET b) OU (a ET c) Alors
dVRAI
Sinon
dFAUX
FinSi
Si d=VRAI Alors
Afficher "Je dcroche"
Sinon
Afficher "Je ne dcroche pas"
FinSi
FIN
Demanireplussimple,riennempchedefairececi:
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1
Trouverlexpressionminimale
Applicationdanslalgorithme
- 10 - ENI Editions - All rigths reserved
PROGRAMME TEL2
VAR
a,b,c,d :boolens
DEBUT
aVRAI
bVRAI
cFAUX
d((NON a) ET b) OU (a ET c)
Si d Alors
Afficher "Je dcroche"
Sinon
Afficher "Je ne dcroche pas"
FinSi
FIN
Le"Sid"quivaut"Sid=VRAI".
5.Unedernireprcision
Aveclesconditionssuivantes:"Silfaitchaudetquilnepleutpas,alorsjevaismepromener",vousaurezparfoisla
tentationdefairececi:
PROGRAMME CHAUD
VAR
chaud,pleuvoir:boolens
DEBUT
chaudVRAI
pleuvoirFAUX
Si chaud=VRAI Alors
Si pleuvoir=FAUX Alors
Afficher "Je me promne "
Sinon
Afficher "Je rentre"
FinSI
Sinon
Afficher "Je rentre "
FinSI
Fin
Cest possible, cela marche, mais ce nest pas trs beau. Deux tests, deux conditions et une rptition inutile.
Pourquoinepasfairececi?
PROGRAMME CHAUDMIEUX
VAR
chaud,pleuvoir :boolens
FIN
chaudVRAI
pleuvoirFAUX
Si chaud=VRAI ET pleuvoir=FAUX Alors
Afficher "Je me promne "
Sinon
Afficher "Je rentre "
FinSI
FIN
Celamarcheexactementdelammemanire,maisilnyaplusquuntestetpasderptition.Cestpluscourt.Tout
demme,cetalgorithmeaplusdeclassequeleprcdent!Etpourpaterunpeuplusvosventuelsprofesseurs,
pourquoinepasremplacerletestpar:
...
Si chaud ET NON pleuvoir Alors

...
- 11 - ENI Editions - All rigths reserved
Lestestsetconditions
1.Principe
Dans le prcdent chapitre, vous avez pu vous familiariser avec les expressions mettant en place des oprateurs,
quilssoientdecalcul,decomparaison(lgalit)ouboolens.Cesoprateursetexpressionstrouventtoutleursens
unefoisutilissdansdesconditions(quonappelleaussidesbranchementsconditionnels).Uneexpressionvalue
estouvraie(lersultatestdiffrentdezro)oufausse.Suivantcersultat,lalgorithmevaeffectueruneaction,ou
uneautre.Cestleprincipedelacondition.
Grce aux oprateurs boolens, lexpression peut tre compose : plusieurs expressions sont lies entre elles
laidedunoprateurboolen,ventuellementregroupesavecdesparenthsespourenmodifierlapriorit.
(a=1 OU (b*3=6)) ET c>10
est une expression tout fait valable. Celleci sera vraie si chacun de ses composants respecte les conditions
imposes.Cetteexpressionestvraiesiavaut1etcestsuprieur10ousibvaut2(2*3=6)etcestsuprieur
10.
Reprenezlalgorithmeduprcdentchapitrequicalculelesdeuxrsultatspossiblesdunequationduseconddegr.
Lnonc simplifi disait que pour des raisons pratiques seul le cas o lquation a deux solutions fonctionne.
Autrementdit,lalgorithmenestpasfauxdanscecasdefigure,maisilestincomplet.Ilmanquedesconditionspour
testerlavaleurdudterminant:celuiciestilpositif,ngatifounul?Etdanscescas,quefaireetcommentlefaire?
Imaginez un second algorithme permettant de se rendre dun point A un point B. Vous nallez pas le faire ici
rellement, car cest quelque chose de trs complexe sur un rseau routier important. De nombreux sites Internet
vous proposent dtablir un trajet avec des indications. Cest le rsultat qui est intressant. Les indications sont
simples : allez tout droit, tournez droite au prochain carrefour, faites trois kilomtres et au rondpoint prenez la
troisimesortiedirectionB.Danslaplupartdescas,sivoussuivezcetrajetvousarrivezbonport.Maisquiddes
impondrables?Paroallezvouspassersilaroutedroiteauprochaincarrefourestdevenueunsensinterdit(cela
arrive parfois, y compris avec un GPS, prudence) ou que des travaux empchent de prendre la troisime sortie du
rondpoint?
Reprenezletrajet:alleztoutdroit.Siauprochaincarrefourlaroutedroiteestensensinterdit:continueztout
droitpuisprenezdroiteaucarrefoursuivantpuisgauchesurdeuxkilomtresjusquaurondpoint.Sinon:tournez
droiteetfaitestroiskilomtresjusquaurondpoint.Aurondpoint,silasortieversBestlibre,prenezcettesortie.
Sinon,prenezversCpuistroiscentsmtrespluslointournezdroiteversB.
Ce petit parcours ne met pas uniquement en lumire la complexit dun trajet en cas de dtour, mais aussi les
nombreusesconditionsquipermettentdtabliruntrajetencasdeproblme.Sivousenpossdez,certainslogiciels
denavigationparGPSdisposentdepossibilitsditinraireBis,detrajectoiredvitementsurtellesection,ouencore
pourviterlessectionspage.Pouvezvousmaintenantimaginerlenombredexpressionsvaluerdanstousces
casdefigure,enplusdelavitesseautorisesurchaqueroutepouroptimiserlheuredarrive?
2.Quetester?
Lesoprateurssappliquentsurquasimenttouslestypesdedonnes,ycomprisleschanesdecaractres,toutau
moinsenpseudocodealgorithmique.Vouspouvezdoncquasimenttouttester.Partester,comprenezicivaluerune
expressionquiestunecondition.Uneconditionestdonclefaitdeffectuerdestestspour,enfonctiondursultatde
ceuxci,effectuercertainesactionsoudautres.
Uneconditionestdoncuneaffirmation:lalgorithmeetleprogrammeensuitedterminerontsicelleciestvraie,ou
fausse.
UneconditionretournantVRAIouFAUXacommersultatunboolen.
Enrglegnrale,uneconditionestunecomparaisonmmesienprogrammationuneconditionpeuttredcritepar
une simple variable (ou mme une affectation) par exemple. Pour rappel, une comparaison est une expression
composedetroislments:
G unepremirevaleur:variableouscalaire
G unoprateurdecomparaison
G unesecondevaleur:variableouscalaire.
Lesoprateursdecomparaisonsont:
- 1 - ENI Editions - All rigths reserved
G Lgalit:=
G Ladiffrence:!=ou<>
G Infrieur:<
G Infrieurougal:<=
G Suprieur:>
G Suprieurougal:>=
Lepseudocodealgorithmiqueninterditpasdecomparerdeschanesdecaractres.videmment,vousprendrezsoin
denepasmlangerlestorchonsetlesserviettes,ennecomparantquelesvariablesdetypescompatibles.Dansune
condition une expression, quel que soit le rsultat de celleci, sera toujours value comme tant soit vraie, soit
fausse.
Loprateur daffectation peut aussi tre utilis dans une condition. Dans ce cas, si vous affectez 0 une
variable,lexpressionserafausseetsivousaffecteznimportequelleautrevaleur,elleseravraie.
Enlangagecourant,ilvousarrivededire"choisissezunnombreentre1et10".Enmathmatique,vouscrivezcela
commececi:
1 nombre 10
Si vous crivez ceci dans votre algorithme, attendezvous des rsultats surprenants le jour o vous allez le
convertirenvritableprogramme.Eneffetlesoprateursdecomparaisonontunepriorit,cequevoussavezdj,
maislexpression quilscomposentestaussisouventvaluedegauchedroite.Silavariablenombrecontientla
valeur15,voicicequicepasse:
G Lexpression115estvalue:elleestvraie.
G Etensuite?Toutvadpendredulangage,lexpressionsuivantevrai10peuttrevraieaussi.
G Lersultatestpouvantable:laconditionestvrifieetlecodecorrespondantvatreexcut!
Vousdevezdoncproscrirecetteformedexpression.Voicicellesquiconviennentdanscecas:
nombre>=1 ET nombre<=10
Ouencore
1<=nombre ET nombre<=10
3.TestsSI
a.Formesimple
Ilnya,enalgorithmique,quuneseuleinstructiondetest,"Si",quiprendcependantdeuxformes:unesimpleet
une complexe. Le test SI permet dexcuter du code si la condition (la ou les expressions qui la composent) est
vraie.Laformesimpleestlasuivante:
Si boolen Alors
Bloc dinstructions
FinSi
Noteziciqueleboolenestlacondition.Commeindiquprcdemment,laconditionpeutaussitrereprsente
paruneseulevariable.Siellecontient0,ellereprsenteleboolenFAUX,sinonleboolenVRAI.
- 2 - ENI Editions - All rigths reserved
Que se passetil si la condition est vraie ? Le bloc dinstructions situ aprs le "Alors" est excut. Sa taille (le
nombre dinstructions) na aucune importance : de une ligne n lignes, sans limite. Dans le cas contraire, le
programmecontinuelinstructionsuivantle"FinSi".Lexemplesuivantmontrecommentobtenirlavaleurabsolue
dunnombreaveccettemthode.
PROGRAMME ABS
VAR
Nombre :entier
DEBUT
nombre-15
Si nombre<0 Alors
nombre-nombre
FinSi
Afficher nombre
FIN
EnPHP,cestle"if"quidoittreutilisaveclexpressionboolenneentreparenthses.Lasyntaxeestcelleci:
if(boolean) { /*code */ }
Si le code PHP ne tient que sur une ligne, les accolades peuvent tre supprimes, comme dans lexemple de la
valeur absolue. Cet exemple montre une seconde possibilit par les mcanismes offerts par les bibliothques de
fonctiondePHP.
<html>
<head><meta/>
<title>ABS</title>
</head>
<body>
<?php
$nombre=-15;
if($nombre<0) $nombre=-$nombre;
echo $nombre;

echo "<br />";


// seconde possibilitit
$nombre2=-32;
$nombre2=abs($nombre2);
echo $nombre2;
?>
</body>
</html>
b.Formecomplexe
La forme complexe na de complexe que le nom. Il y a des cas o il faut excuter quelques instructions si la
conditionestfaussesansvouloirpassertoutdesuitelinstructionsitueaprsleFinSi.Danscecas,utilisezla
formesuivante:
Si boolen Alors
Bloc dinstructions
Sinon
Bloc dinstructions
FinSi
Si la condition est vraie, le bloc dinstructions situ aprs le Alors est excut. Ceci ne diffre pas du tout de la
premireforme.Cependant,silaconditionestfausse,cettefoiscestleblocdinstructionssituaprsleSinonqui
estexcut.Ensuite,leprogrammereprendlecoursnormaldesonexcutionaprsleFinSi.
Notezquevousauriezputrsbienfaireunquivalentdelaformecomplexeenutilisantdeuxformessimples:la
premireaveclaconditionvraie,lasecondeaveclangationdecettecondition.Maiscenestpastrsjoli,mmesi
cestcorrect.Retenezque:
G Si dans une forme complexe, lun des deux blocs dinstructions est vide, alors transformezla en forme
simple:modifiezlaconditionenconsquence.
G Laisser un bloc dinstructions vide dans une forme complexe nest pas conseill : cest une grosse
- 3 - ENI Editions - All rigths reserved
maladresse de programmation qui peut tre facilement vite, cest un programme sale. Cependant,
certains langages lautorisent, ce nest pas une erreur ni mme une faute lourde, mais ce nest pas une
raison
Lalgorithmesuivantestuneillustrationdelaformecomplexe:ellevrifiesitroisvaleursentresauclaviersont
triesparordrecroissant:
PROGRAMME TRI
VAR
x,y,z:entiers
DEBUT
Afficher "Entrez trois valeurs entires distinctes"
Saisir x,y,z
Si z>y ET y>x Alors
Afficher " Tris en ordre croissant"
Sinon
Afficher "Ces nombres ne sont pas tris"
FinSi
FIN
LecodesuivantenPHPnestpasbiendifficilecomprendre.
<html>
<head><meta/>
<title>trie ?</title>
</head>
<body>
<?php
if(!isset($_GET[x])) {
?>
<form method="GET">
x : <input type="text" size="4" name="x" /><br />
y : <input type="text" size="4" name="y" /><br />
z : <input type="text" size="4" name="z" /><br />
<input type="submit" name="OK" /><br />
</form>
<?php
} else {
$x=$_GET[x];
$y=$_GET[y];
$z=$_GET[z];

if($z>$y && $y>$x)


echo "Tries en ordre croissant";
else
echo "Ces nombres ne sont pas tries";
}
?>
</body>
</html>
4.Testsimbriqus
Vous connaissez le dicton populaire "avec des si, on mettrait Paris en bouteille", qui rpond gnralement une
accumulationdeconditions"silfaitbeauetquilfaitchaudetquelavoiturenestpasenpanne,alorsnousironsla
mer,sinonsilavoitureestenpannenousprendronsletrain,sinonsilyagrvealorsnousferonsdustop,sinonsi
toutvamalalorsnousresteronslamaison".Cestunpeulourdditcommecela,maisquinajamaischafauddes
plansdouteuxdevantvrifierplusieursconditionsavecdesscnariosdesecours?
Vousretrouverezparfoislemmeproblmeenprogrammation.LesdeuxformesdeSicidessuspermettentdesen
sortirassurment,maislasyntaxepeutdevenirtrslourde.Vouspouvezeneffetparfaitementimbriquervostests
en plaant des Si en cascade dans les blocs dinstructions situs aprs les Alors et les Sinon. Prenez lexemple
suivant : il faut deviner si un nombre saisi au clavier est proche ou non dune valeur prdfinie. Pour le savoir, le
programmeaffichefroid,tide,chaudoubouillantsuivantlcartentrelavaleursaisieetcelleprdfinie.Cetcart
estcalculavecunesimplesoustraction,puisendterminantsavaleurabsolue.
PROGRAMME IMBRIQUE
- 4 - ENI Editions - All rigths reserved
VAR
nombre,saisie,ecart :entiers
DEBUT
Nombre63
Afficher "Saisissez une valeur entre 0 et 100 :"
Saisir saisie
ecartnombre-saisie
Si ecart < 0 Alors
Ecart-ecart
FinSi
Si ecart=0 Alors
Afficher "Bravo !"
Sinon
Si ecart<5 Alors
Afficher "Bouillant"
Sinon
Si ecart<10 Alors
Afficher "Chaud"
Sinon
Si ecart<15 Alors
Afficher "Tide"
Sinon
Afficher "Froid"
FinSi
FinSi
FinSi
FinSi
FIN
Peuttre trouvezvous cette syntaxe trop longue et surtout peu lisible. Une astuce consiste tracer des traits
verticaux allant des Si aux FinSi pour ne pas sy perdre. Cest dailleurs recommand par certains professeurs
dalgorithmique, y compris pour les boucles (abordes dans un prochain chapitre). Lalgorithme cidessus est
parfaitementvalableetdunesyntaxecorrecte.Cependant,ilestpossibledefaireplusconcisaveclaformesuivante.
Si boolen Alors
Bloc dinstructions 1
SinonSi boolen Alors
Bloc dinstructions 2
SinonSi boolen Alors
Bloc dinstructions n
Sinon
Bloc dinstruction final
FinSi
Cetteformeestpluspropre,pluslisibleetvitedesemlangerlespinceaux.Demultiplesconditionssonttestes.Si
lapremirenestpasvraie,onpasseladeuxime,puislatroisimeetainsidesuite,jusqucequunecondition
soitvrifie.Danslecascontraire,cestleblocdinstructionsfinalquiestexcut.Lestestsduprcdentexemple
doiventdonctrercritscommececi:
Si ecart=0 Alors
Afficher "Bravo !"
SinonSi ecart<5 Alors
Afficher "Bouillant"
SinonSi ecart<10 Alors
Afficher "Chaud"
SinonSi ecart<15 Alors
Afficher "Tide"
Sinon
Afficher "Froid"
FinSi
VoicilecodecorrespondantenPHP :
<html>
<head><meta/>
<title>imbrique</title>
</head>
<body>
<?php
- 5 - ENI Editions - All rigths reserved
if(!isset($_GET[saisie])) {
?>
<form method="GET">
Entrez un nombre entier : <input type="text"
size="4" name="saisie" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$nombre=63;

$saisie=$_GET[saisie];

$ecart=$nombre-$saisie;
if($ecart<0) $ecart=-$ecart;

if($ecart==0) echo "Bravo!";


else if($ecart<5) echo "Bouillant";
else if($ecart<10) echo "Chaud";
else if($ecart<15) echo "Tiede";
else echo "Froid";
}
?>
</body>
</html>
Quelleconomiedeplacepourplusdeclartetdeconcision!Maintenantvousdisposezdetoutlencessairepour
rsoudreunequationduseconddegrdanstouslescasdefigure.Ilmanquedeuxcas:
G Si=0,ilnyaquuneseulesolutionquivaut:

G Si<0,lquationnapasdesolution.
PROGRAMME EQUATION2
VAR
a,b,c,delta,x1,x2:rels
DEBUT
a3
b6
c-10
delta( b * b ) - ( 4 * a * c )
Si delta>0 Alors
x1( -b + racine(delta) ) / ( 2 * a )
x2( -b - racine(delta) ) / ( 2 * a )
Afficher "Les deux solutions sont x1=",x1, "x2=",x2
SinonSi delta=0 Alors
x1 -b / (2 * a)
Afficher "Lunique solution est :",x1
Sinon
Afficher "Lquation na pas de solution"
FinSi
FIN
EnPHP,leprogrammeatmodifilgrementpourautoriserlasaisiedea,betc :
<html>
<head><meta/>
<title>equation du second degre</title>
</head>
<body>
<?php
if(!isset($_GET[a])) {
- 6 - ENI Editions - All rigths reserved
?>
y=ax*x+bc+c <br />
<form method="GET">
a : <input type="text" size="4" name="a" /><br />
b : <input type="text" size="4" name="b" /><br />
c : <input type="text" size="4" name="c" /><br />
<input type="submit" name="OK" /><br />
</form>
<?php
} else {
$a=$_GET[a];
$b=$_GET[b];
$c=$_GET[c];
$delta=($b*$b)-(4*$a*$c);
if($delta>0) {
$x1=(-$b+sqrt($delta))/(2*$a);
$x2=(-$b-sqrt($delta))/(2*$a);
echo "Deux solutions :";
echo "x1=$x1";
echo "x2=$x2";
}
else if ($delta==0) {
$x1=-$b/(2*$a);
echo "Une seule solution x1=$x1";
}
else echo "Pas de solution";
}
?>
</body>
</html>
5.Choixmultiples
Si les tests imbriqus facilitent parfois la vie, ils deviennent parfois trop lourds lorsque le nombre de tests devient
tropimportant.Certainslangagesonttrouvuneintressanteparadeceproblmeenproposantdesstructuresde
testsselonquetelleexpressionestvraie,outelleautreetainsidesuite.AulieudefairedesSiimbriqusoudes
SinonSi,ilsuffitalorsdindiquerquoifairequandtelleoutellevaleurestrencontre.Enalgorithmique,celasetraduit
parlapseudoinstruction"Selonque".
Selon que :
Condition 1 : bloc 1
Condition 2 : bloc 2
Condition n : bloc n
Sinon : bloc final
Fin Selon
Une instruction "Selon que" peut tre convertie facilement en Si imbriqus. Les conditions sont vrifies les unes
aprslesautres,danslordreindiqu.Quanduneconditionestvraie,leblocdinstructionsassociestexcutpuis
lalgorithme continue aprs le "Fin Selon". Si aucune condition nest vrifie, cest le bloc final du "Sinon" qui est
excut.
Voici une application simple qui permet de placer dans une variable le nom dun mois en fonction de son numro
(entre1et12):
Variable mois en Numrique
Variable libelle_mois en Alphanumrique
Dbut
mois11
Selon que :
mois=1 : libelle_mois"janvier"
mois=2 : libelle_mois"fvrier"
mois=3 : libelle_mois"mars"
mois=4 : libelle_mois"avril"
mois=5 : libelle_mois"mai"
mois=6 : libelle_mois"juin"
mois=7 : libelle_mois"juillet"
mois=8 : libelle_mois"aot"
mois=9 : libelle_mois"septembre"
- 7 - ENI Editions - All rigths reserved
mois=10 : libelle_mois"octobre"
mois=11 : libelle_mois"novembre"
mois=12 : libelle_mois"dcembre"
Fin Selon
Fin
EnPHPlastructurequivalenteestle"switch()case".
switch(variable) {
case valeur1 : <instructions> ; break ;
case valeur2 : ... ; break ;
...
default : <instructions> ;
}
Chaque valeur case correspond une valeur possible de la variable du switch. Si plusieurs instructions sont
prsentes,ilestprfrabledelesplacerentreaccolades.Lebreakestpourunefoisutileetfortementconseill.En
effetsiPHPtombesurunecorrespondance,parexemplevaleur1,etsiaucunbreaknestprsent,alorsilvaexcuter
toutes les instructions, jusquen bas, ou jusqu ce quil rencontre un break. En pratique, les instructions prvues
pourvaleur2,valeur3,etc,sontexcutes.Ledefaultestlactionpardfautsiaucunevaleurcasenestvrifie.
<html>
<head><meta/>
<title>bissextile</title>
</head>
<body>
<?php
$mois=5;

switch($mois) {
case 1: $libmois="Janvier"; break;
case 2: $libmois="Fvrier"; break;
case 3: $libmois="Mars"; break;
case 4: $libmois="Avril"; break;
case 5: $libmois="Mai"; break;
case 6: $libmois="Juin"; break;
case 7: $libmois="Juillet"; break;
case 8: $libmois="Aot"; break;
case 9: $libmois="Septembre"; break;
case 10: $libmois="Octobre"; break;
case 11: $libmois="Novembre"; break;
case 12: $libmois="Dcembre"; break;
default: $libmois="???";
}
echo $libmois;
?>
</body>
</html>
6.Desexemplescomplets
a.Lelendemaindunedate
Lesstructuresdjabordespermettentdjdeffectuerpasmaldepetiteschoses.Vousallezmaintenantcalculer
lelendemaindunedateselonlescritressuivants:
G Ladateestdcomposedanstroisvariablesanne,moisetjour.
G Ilfautgrer:
G leschangementsdemois
G lenombredejoursdanslemois
- 8 - ENI Editions - All rigths reserved
G lechangementdanne
G lesannesbissextilespourlemoisdefvrier.
Pourinformation,uneanneestbissextilesiellevrifieintgralementdeuxrgles:
G lanneestdivisiblepar4et,
G lanneestdivisiblepar400maispaspar100.
Lalgorithme pour indiquer si une anne est bissextile ou non, est le suivant. Notez que dire quune anne est
divisibleparnconsistedirequelerestedeladivisionparnestnul.
PROGRAMME BISSEXTILE
VAR
Annee :entier
DEBUT
Afficher "Entrez lanne"
Saisir annee
Si (annee%4=0) ET ((annee%400=0) OU (annee%100>0)) Alors
Afficher annee, " est bissextile."
Sinon
Afficher annee, " nest pas bissextile."
FinSi
FIN
EnPHP:
<html>
<head><meta/>
<title>bissextile</title>
</head>
<body>
<?php
if(!isset($_GET[annee])) {
?>
<form method="GET">
Anne : <input type="text" size="4" name="annee" />
<input type="submit" name="OK" />
</form>
<?php
} else {
$annee=$_GET[annee];
if(($annee%4==0) && (($annee%400==0) || ($annee%100>0)))
echo "$annee est bissextile";
else
echo "$annee nest pas bissextile";
}
?>
</body>
</html>
Cetestdannebissextilenintervientquelorsdescalculssurledernierjourdefvrier,poursavoirsilelendemain
du 28 est le 29 ou le 1
er
mars. De mme, il faut grer les cas o les mois ont 30 ou 31 jours, ainsi que le
changementdannelorsdumoisdedcembre.Lalgorithmeutilisedesstructures"SelonQue"et"Si".
PROGRAMME LENDEMAIN
VAR
annee,mois,jour:entiers
DEBUT
Afficher "Date initiale ?"
Saisir jour, mois, annee
Selon que:
mois=1 OU mois=3 OU mois=5 OU mois=7 OU mois=8 OU mois=10:
Si jour=31 Alors
jour1
- 9 - ENI Editions - All rigths reserved
moismois+1
Sinon
Jourjour+1
FinSi
mois=4 OU mois=6 OU mois=9 OU mois=11:
Si jour=30 Alors
jour1
moismois+1
Sinon
jourjour+1
FinSi
Mois=2:
Si (annee%4=0) ET ((annee%400=0) OU (annee%100>0)) Alors
Si jour=29 Alors
jour1
moismois+1
Sinon
jourjour+1
FinSi
Sinon
Si jour=28 Alors
jour1
moismois+1
Sinon
jourjour+1
FinSi
FinSi
Mois=12:
Si jour=31 Alors
jour1
mois1
anneeannee+1
Sinon
jourjour+1
FinSi
Fin Selon
Afficher "Le lendemain est le ",jour, mois, annee
Fin
LeprogrammePHPassocirefltecequiadjtexpliqucidessus:uncase sansbreakcontinuelexcution
jusquaubreaksuivantoujusqulafin.Aussiunesuitede"case"surlammeligneestpossible :cestcommesi
vouslesmettiezlesunssouslesautres.Pourlereste,lecodeesttrsprochedelalgorithme.
<html>
<head><meta/>
<title>Annees mois jours : lendemain</title>
</head>
<body>
<?php
if(!isset($_GET[jour])) {
?>
<form method="GET">
jour : <input type="text" size="4" name="jour" />
<br />
mois : <input type="text" size="4" name="mois" />
<br />
annee : <input type="text" size="4" name="annee" />
<br />
<input type="submit" name="OK" /><br />
</form>
<?php
} else {
$jour=$_GET[jour];
$mois=$_GET[mois];
$annee=$_GET[annee];
switch($mois) {
case 1:case 3:case 5:case 7:case 8:case 10: {
if($jour==31) {
$jour=1;
- 10 - ENI Editions - All rigths reserved
$mois++;
} else $jour++;
break;
}
case 4:case 6:case 9:case 11: {
if($jour==30) {
$jour=1;
$mois++;
} else $jour++;
break;
}
case 2: {
if( ($annee%4==0) && (($annee%400==0) || ($annee%100>0)) ) {
if($jour==29) {
$jour=1;
$mois++;
} else $jour++;
} else {
if($jour==28) {
$jour=1;
$mois++;
} else $jour++;
}
break;
}
case 12: {
if($jour==31) {
$jour=1;
$mois=1;
$annee++;
} else $jour++;
}

}
echo "Demain est le $jour/$mois/$annee";
}

?>
</body>
</html>
b.Lavaliditdunedate
Les calculs de dates sont une source inpuisable dalgorithmes. Sauriezvous par exemple vous inspirer de
lalgorithmecidessuspourtesterlavaliditdunedaterentreauclavier?Ilsuffitpourchaquemoisdevrifiersile
jourentrestcorrect,lepigetantcommecidessuspourlesannesbissextilesetlemoisdefvrier.Lalgorithme
cidessous introduit une nouveaut : la prsence dun drapeau (quon appelle flag en anglais) ou indicateur. Le
drapeauestunevariableinitialiseunevaleurprdfinieaudbutduprogrammeetdontlavaleurestmodifie
selonlersultatdestests.Aprstouslestests,onvrifielavaleurdudrapeau.Atellechang?Alorsilyaeuun
problme.Ledrapeauestreprsentparlavariable"erreur".Enfindescript,siellecontientautrechoseque0,
alorsladateestinvalide.Savaleurestmodifie1lorsquuntestnestpasconcluant.
Variables erreur, annee, mois, jour en Numrique
Dbut
erreur0
Ecrire "Date initiale ?"
Lire jour, mois, annee
Si jour<0 OU mois<0 OU mois>12 Alors
erreur1
Sinon Si Mois=1 OU mois=3 OU mois=5 OU mois=7 OU mois=8 OU mois=10
ou mois=12 Alors
Si jour>31 Alors
erreur1
FinSi
Sinon Si mois=4 OU mois=6 OU mois=9 OU mois=11 Alors
Si jour>30 Alors
erreur1
FinSi
- 11 - ENI Editions - All rigths reserved
Sinon SI mois=2 Alors
Si (annee%4=0) ET ((annee%400=0) OU (annee%100>0)) Alors
Si jour>29 Alors
erreur1
FinSi
Sinon
Si jour>28 Alors
erreur1
FinSi
FinSi
FinSi
Si erreur=1 Alors
Ecrire "Date incorrecte"
Sinon
Ecrire "Date correcte"
FinSI
Fin
c.Lheuredansnsecondes
Le but de lalgorithme est cette fois de dterminer lheurequil sera dans n secondes. Pour cela, lutilisateur doit
saisir lheure actuelle dcompose en heures (sur 24 heures), minutes et secondes. Bien entendu, il faut tenir
compte du changement de jour, dheure, de minute, sans oublier quil y a 60 minutes dans une heure et 60
secondesdansuneminute.Parexemple,enadditionnant147secondes23heures,58minuteset12secondes,
quelleheureseratil?Ilseraminuit,0minuteet39secondeslelendemain.Danslalgorithmevousutiliserezdes
valeursentires.Ainsilersultatdesdivisionsseraunentieretnonunrel(parexemple159/60=2,65maisavec
unentiervousrcuprerezseulement2).
G Dansunpremiertemps,additionnezlessecondes:147+12=159
G Ensuite, convertissez ces secondes en minutes. Pour cela, il suffit de diviser par 60 pour rcuprer les
minutes, puis de rcuprer le reste de la division entire (le modulo) pour les secondes en trop (159/60
donne2minutesavecunrestede39secondes).Voussavezmaintenantquelafinestde39secondes.
G Additionnez les minutes : 58+2=60. Si le chiffre est suprieur ou gal 60, procdez comme pour les
secondes.60/60=1,soituneheuresupplmentaireetunrestede0donc0minute.Voussavezmaintenant
quelavaleurdumilieuest0minute.
G Additionnezlesheures:23+1=24soitminuit.Lencore,lidalestdecompterlesjours.Ainsi24/24=1(soit
+1jour),sansrestedonc0heure:minuit.
Ilseradoncminuitet39secondes.
PROGRAMME heure
VAR
jours,heures,minutes,secondes,nbsec:entiers
DEBUT
heures17
minutes55
secondes48
Afficher "Combien de secondes en plus ?"
Saisir nbsec
secondessecondes+nbsec

minutesminutes+(secondes / 60)
secondessecondes % 60

heuresheures+(minutes / 60)
minutesminutes % 60
joursheures / 24
heuresheures % 24

Afficher jours, heures, minutes, secondes


FIN
Lesimpleestilmeilleur?
- 12 - ENI Editions - All rigths reserved
Limplmentation en PHP ne ncessite pas de commentaires particuliers. Laffichage final est juste un peu plus
agrable.
<html>
<head><meta/>
<title>calcul dheures</title>
</head>
<body>
<?php
if(!isset($_GET[nbsec])) {
?>
<form method="GET">
nb de secondes ajouter : <input type="text"
size="4" name="nbsec" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$heures=17;
$minutes=55;
$secondes=48;

$nbsec=$_GET[nbsec];

$secondes+=$nbsec;
$minutes+=(int)($secondes/60);
$secondes=$secondes%60;

$heures+=(int)($minutes/60);
$minutes=$minutes%60;

$jours+=(int)($heures/24);
$heures=$heures%24;

echo "$jours $heures $minutes $secondes";


}
?>
</body>
</html>
tesvous surpris par la forme que revt cet algorithme ? Probablement car il ny a aucun test deffectu. La
questionsepose:sontilsdanscecasvraimentncessaires?Larponsenecoulepasdesource.Rappelezvous
quilnesuffitpasquunalgorithmefonctionne,maisquilfonctionnevite,bienetquilsoitconome.Estcelecas?
Cet algorithme effectue neuf calculs : additions, divisions et modulos. Si on ajoute des tests, on ajoute des
instructions et lalgorithme devient plus long. Or, vous aurez loccasion de le voir dans les chapitres suivants, la
complexitdesalgorithmesnestpaslieleurlongueur.Certainssonttrscourts(commeceluici)etpourtanttrs
gourmand en ressources. Inversement, dautres sont longs et semblent compliqus pour un rsultat de grande
rapidit.
Untestbienpospeutviterdescalculsinutiles.Uncalculestgourmandentempsmachine:lemicroprocesseur
travaillepluslongtempsenfaisantdesdivisionsetdesmodulosquencomparantdeuxvaleurs:ellessontgales
ounonetdanslecasdenombres,ilsuffitdefaireunETpourvoirsicelaretournelammevaleur,uneopration
lmentaire trs rapide, bien plus que le moindre calcul. Autrement dit, vous avez tout intrt faire des tests
quandceuxcipeuventpermettredviterdescalculslourds.
PROGRAMME HEURE2
VAR
jours,heures,minutes,secondes,nbsec:entier
DEBUT
heures17
minutes55
secondes48
Afficher "Combien de secondes en plus ?"
Saisir nbsec
secondessecondes+nbsec

Lestestspouroptimiser
- 13 - ENI Editions - All rigths reserved
Si secondes>59 Alors
minutesminutes+(secondes / 60)
secondesseconde % 60

Si minutes>59 Alors
heuresheures+(minutes / 60)
minutesminutes % 60

Si heures>23 Alors
joursheures / 24
heuresheures % 24
FinSi
FinSi
FinSi
Afficher jours, heures, minutes, secondes
FIN
Danslemeilleurdescas,unseulcalculseraeffectu.Danslepire,neuf.Entrelesdeux,touteunegamme.Sipar
exemple on additionne 60 secondes, alors on augmente forcment dune minute et trois calculs supplmentaires
sont effectus. Si on augmente dune heure, alors trois autres nouveaux calculs ont lieu et dune journe, deux
derniers calculs. On retrouve bien neuf calculs, au pire. Mais la complexit moyenne est largement rduite par
rapportaupremieralgorithme.Ceseraitcalculableviaunintervallealatoiremaisborndenvaleurspertinentes.
VoicileprogrammemodifienPHP :
<html>
<head><meta/>
<title>Calcul dheures 2</title>
</head>
<body>
<?php
if(!isset($_GET[nbsec])) {
?>
<form method="GET">
nb de secondes ajouter : <input type="text"
size="4" name="nbsec" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$heures=17;
$minutes=55;
$secondes=48;

$secondes+=$nbsec;

$nbsec=$_GET[nbsec];

if($secondes>59) {
$minutes+=(int)($secondes/60);
$secondes=$secondes%60;

if($minutes>59) {
$heures+=(int)($minutes/60);
$minutes=$minutes%60;
if($heures>23) {
$jours+=(int)($heures/24);
$heures=$heures%24;
}
}
}

echo "$jours $heures $minutes $secondes";


}
?>
</body>
</html>
SachantqueUnixcomptelenombredesecondescoulesdepuisle1erjanvier1970minuitpourcalculerladate
- 14 - ENI Editions - All rigths reserved
actuelle, vous savez maintenant comment le systme dexploitation fait pour vous la fournir ! Et encore, il doit
convertirlesjoursenannes,entenantcomptedesannesbissextiles.Vousavezmaintenanttoutlencessaire
pourcrervousmmelesmorceauxdalgorithmesmanquants.Vouspouvezmme,sivouslesouhaitez,crerun
algorithmesupplmentairepourgrerparexemplelesfuseauxhorairesenfonctionduneheurecentraleUTC.Ilny
ariendedifficile!
- 15 - ENI Editions - All rigths reserved
LobjetenPHP
1.Leslangagesobjet
Lesdeuxpartiesprcdentesdecechapitrevousontprsentcequestlaprogrammationobjet.Ilexisteplusieurs
langagesorientsObjet.OnparledeProgrammationOrienteObjet(POO).Lesprmicesdelaprogrammationobjet
sontanciennes(pourdelinformatique) :1967aveclelangageSimula,puisSmalltalk.Lgedordbuteaudbutdes
annes1980,avectoutdabordlObjectiveC(encoretrsutilisnotammentdansledveloppementdeMacOSetde
sesoutils),puisle"CwithClasses"en1983,quideviendraleC++,puisEiffel,puisleLispObjetetainsidesuite.
Lesannes1990ontvulexplosiondelobjettouteslessaucespourlemeilleuretpourlepireetpasuniquement
dansleslangages.Ainsidesbasesdedonnesobjetsontapparues.DancienslangagescommelePascal,leBasicou
mmeleCOBOLontvoluverslobjet :Delphi,VisualBasic,CobolObjet,etc.Mmeleslangagesmacrospropres
dessuitesbureautiques(MSOffice,OpenOffice.org)oudebasededonnes(Access,Paradox)setarguentdtredes
langagesobjet.Siladfinitiondelobjetcorrespondpeuprscequivousatprsentdepuisledbutdece
chapitre,lespuristesdoiventdanscertainscasbienrire.
Larrive de Java comme vrai langage objet de haut niveau a chang beaucoup de choses : reprenant les bonnes
idesduC++,illadapteenuntoutplussimpleetpluspratique,adaptauxbesoinsmodernesdesdveloppeurset
surtoutdesapplications.LaforcedeSUNatdeproposerunlangageadaptunelargegammedebesoins :des
appletsJava,lapprentissagedelobjet,lesapplicationsdportes,lesserveursdapplications,etc.
Un gros concurrent de la plateforme Java (Java, ses outils, ses API, etc) se nomme .NET avec le langage C#
(prononcezCsharp)etestvidemmentobjet.Lesexemplesdecelivreauraientparfaitementputredveloppsen
C#,sachantquelelangageestmaintenantdisponibleailleursquesousWindows.
Un autre concurrent de Java et de .NET, est le PHP. Lobjet est apparu dans la version 4 de PHP, la suite de
nombreusesdemandesencesens.Iltaitcependanttrssimpleetpluttlimit.LePHPestdevenuunvrailangage
objetaveclaversion5.SonmodleestJava.IlestdanslesfaitsassezsimpledeconvertirlesprogrammesJavaen
PHP.
LasuitevousprsentedesnotionsdobjetenPHP.Elleselimiteraauxnotionsquevousavezrencontresdepuisle
dbutdecechapitre.
2.Dclarationdesclassesetobjets
Inconsciemment ou non, vous utilisez lobjet depuis la prsentation des structures en PHP pour lesquelles il a t
questionde"tricher".LesstructuresprogrammesenPHPsontdesobjets.
Uneclasse,sesattributsetsesmembressedclarentainsi :
class nom_classe {
// liste des attributs
public $att1 ;
protected $att2 ;
private $att3 ;

// liste des mthodes
public function methode1() {
// code mthode1
}
private function methode2() {
// code mthode2
}
}
Vous remarquez que cela ressemble trs fortement aux structures du chapitre Les tableaux et structures. Et pour
cause, il a fallu tricher en PHP pour utiliser une classe comme une structure. La structure est en fait une classe
uniquementcomposedattributspublics,dolexpressioncourantequiditquuneclasseestunestructureavecdes
fonctions.
VoiciunexemplesimplifidimplmentationdelaclasseEcranfaisantunconstructeuravectroisparamtrespasss
la valeur null par dfaut et une mthode modif_type() appele par lun des constructeurs ou do vous voulez,
puisque la mthode est publique. Cet exemple fait aussi apparatre lutilisation dune variable statique et son
utilisationdepuisleprogrammeprincipal.
<html>
- 1 - ENI Editions - All rigths reserved
<head><meta/>
<title>Objets Ecran</title>
</head>
<body>
<?php

class Ecran {
private $type,$marque,$modele,$connecteur;
private $resolution;
private $diagonale;
private $hauteur,$largeur,$profondeur,$poids;
public static $nb_ecrans=0;

// constructeur par dfaut

// constructeur avec 3 arguments
function Ecran($t=null, $mq=null, $mdl=null) {
echo "Constructeur avec trois arguments<br />";

if($t==null) {
$this->type="Inconnu" ;
$this->marque="Inconnu" ;
$this->modele="Inconnu" ;
$this->nb_ecrans++ ;
} else {
$this->modif_type($t) ;
$this->marque=$mq ;
$this->modele=$mdl;
self::$nb_ecrans++ ;
}
}

public function modif_type($mod) {
$tmod=array("CRT","LCD","PLASMA");

$ok=array_search($mod,$tmod);

if($ok) $this->type=$mod;
return $ok;
}

public function affiche_type() {
echo $this->type."<br />";
}

// fonction statique
public static function nbEcrans() {
echo self::$nb_ecrans."<br />";
}
}

// allocation dynamique avec construction
$o1=new Ecran("LCD","LG","L1915S");

// appel dune mthode
$o1->affiche_type();

// Les deux lignes font la mme chose
Ecran::nbEcrans();
echo $o1->nbEcrans()."<br />";

?>
</body>
</html>
Contrairement lalgorithmique, les attributs et mthodes ne sont pas regroups par blocs publics, privs ou
protgs.Cestvousdajouteravantlenometletypedumembresilestpublic,privouprotg.Lesdfinitions
public et private sont exactement celles vues cidessus, tandis que protected limite la porte des attributs aux
classesdrives.
- 2 - ENI Editions - All rigths reserved
IlnestpaspossibledutiliserlepolymorphismeenPHP,cequiempchelacrationdeplusieursconstructeurs.Ilfaut
doncruserenconsquence.Icicestassezsimple,maisilexistedautresmoyensdevrifierlalistedesparamtres
passsunefonction.
3.Hritage
PHPautoriselhritagesimplemaispaslhritagemultiple.Vousverrezcependantquilestpossiblederuserunpetit
peu avec les interfaces. Lexemple des figures gomtriques peut sappliquer ici, car PHP supporte trs bien les
classesetmthodesabstraites.
Lhritageestexactementcommeenalgorithmique,saufqulaplacede"hritede"vousutilisezlemotclextends.
Concernantlesclassesetmthodesabstraites,vousajoutezdevantlenomlemotclabstract.
Notez que dans la dfinition de la classe abstraite, quelques attributs privs sont remplacs par des attributs
protgs.Autrement,lesclassesdrivesnauraientpaseuledroitdyaccder.
Enfin notez aussi lutilisation du motcl parent qui remplace la classe (ou plutt lobjet) hrite, utilis ici pour
appelerleconstructeurdelaclassefigurechargdeplacerlesbonnescouleurs.
<html>
<head><meta/>
<title>Heritage en PHP</title>
</head>
<body>
<?php

abstract class figure {
protected $x,$y,$surface,$perimetre;
protected $c_contour,$c_remp;
const PI=3.1415927;

function figure($c1, $c2) {
$this->setcolor_c($c1);
$this->setcolor_r($c2);
}

public function setcolor_c($couleur) {
$this->c_contour=$couleur;
}

public function setcolor_r($couleur) {
$this->c_remp=$couleur;
}

abstract public function getSurface();
abstract public function getPerimetre();
}

class disque extends figure {
private $rayon=0;

// constructeur
function disque($c_x, $c_y, $r) {
parent::__construct("noir","blanc");
$this->x=$c_x;
$this->y=$c_y;
$this->rayon=$r;
}

// implmentation des mthodes abstraites
public function getSurface() {
return self::PI*$this->rayon*$this->rayon;
}

public function getPerimetre() {
return 2*self::PI*$this->rayon;
}
}

- 3 - ENI Editions - All rigths reserved
class rectangle extends figure {
private $largeur, $hauteur;

// constructeur
function rectangle($c_x,$c_y,$r_l,$r_h) {
parent::__construct("violet","marron");
$this->x=$c_x;
$this->y=$c_y;
$this->largeur=$r_l;
$this->hauteur=$r_h;
}

// implmentation des mthodes abstraites
public function getSurface() {
return $this->largeur*$this->hauteur;
}

public function getPerimetre() {
return 2*($this->largeur+$this->hauteur);
}
}

$o1=new disque(100,100,10);
echo $o1->getSurface()."<br />";
echo $o1->getPerimetre()."<br />";

$o2=new rectangle(10,10,35,25);
echo $o2->getSurface()."<br />";
echo $o2->getPerimetre()."<br />";

?>
</body>
</html>
4.Interfaces
Encore une fois, en PHP les interfaces sont exactement comme en algorithmique. Vous crez une interface avec le
motclinterfaceetvousindiquezquelaclasseimplmentecetteinterfaceaveclemotclimplementsaprslenom
delaclasse,suividunomdelinterface.
<html>
<head><meta/>
<title>Interfaces en PHP</title>
</head>
<body>
<?php


interface lecture {
public function lecture() ;
public function pause() ;
public function stop() ;
public function avance() ;
public function retour() ;
public function precedent() ;
public function suivant() ;
}

class Musique implements lecture {
private $morceau;
private $position,$duree,$piste;

function Musique($m, $p) {
$this->morceau=$m;
$this->piste=$p;
$position=0;
}

- 4 - ENI Editions - All rigths reserved

// Dbut dimplmentation de linterface
public function lecture() {
echo "lecture de {$this->morceau}<br />";
}
public function pause() {
echo "Pause {$this->position}<br />";
}
public function stop() {
echo "Arrt piste {$this->piste}<br />";
}
public function avance() {
echo "Avance<br />";
}
public function retour() {
echo "retour<br />";
}
public function precedent() {
echo "Prcdent<br />";
}
public function suivant() {
echo "Suivant<br />";
}
}

$o1=new Musique("Somebody to love",10);
$o1->lecture();
?>
</body>
</html>
Uneclassepeutimplmenterplusieursinterfaces.Danscecas,sparezlesnomsdesinterfacespardesvirgules.
Une interface peut hriter dune ou plusieurs autres interfaces via le motcl extends suivi du nom de la ou des
interfaceshrites.
interface lecture1 {
public function lecture() ;
public function pause() ;
public function stop() ;
}
interface lecture2 {
public function avance() ;
public function retour() ;
public function precedent() ;
}
interface lecture extends lecture1, lecture2 {
public function suivant() ;
}
CesdeuxdernierscassontlesseulsenPHPo,indirectement,unesortedhritagemultipleatmisenplace,dans
le sens o une classe peut hriter de plusieurs dfinitions de mthodes. Cest simpliste dans le sens o de toute
faon,cesmthodesdoiventtreimplmentesobligatoirementdanslaclassequiutiliselesinterfacesetquainsi,
PHPnapassavoirsildoitutilisertelleoutellemthodedelunedesclasseshrites.
- 5 - ENI Editions - All rigths reserved
Manipulerlesobjets
1.Lesconstructeurs
a.Dclaration
Quandvousinstanciezuneclasse,cestdirequandvouscrezunobjetdutypedeclassedonn,ilvousfautbien
souventappelerdiversesmthodespourremplirsesattributsaveclesbonnesvaleurs.Pourreprendrelexemplede
la classe Ecran, nul doute quen crant un objet de ce type vous voudrez positionner les attributs type, marque,
modle,etc,auxbonnesvaleurs.Lasolutionactuelleconsisteappelerexplicitementlesmthodesprvuescet
effet :modif_type(),modif_marque(),modif_modle()etainsidesuite.
Il existe un moyen plus efficace et implicite de positionner les bonnes valeurs des attributs (et deffectuer toute
autreoprationncessaire)dslinstanciation.Cemoyen,cestleconstructeur.
Leconstructeurestunemthodeparticulirequiestappeleautomatiquementdsquevouscrezunobjetsans
que vous ayez le prciser, que se soit par dclaration ou allocation dynamique (via un pointeur). Dans cette
mthode,librevousdefairecequevousvoulez,maisdans90%descassonrleseradedonnerauxattributs
leursbonnesvaleursinitiales,oudesvaleurspardfaut.
Unconstructeurdoitrespecterlesdeuxpropritssuivantes :
G Ilportelemmenomquelaclasse.
G Ilneretournepasdevaleur.
Vialepolymorphismeparamtrique(quonappelleaussilasurchargedesmthodes)vouspouvezcrerautantde
constructeursquevouslesouhaitez,unparcasselonlesparamtrespasss.Enalgorithmiquevousajouterezle
motcl Constructeur devant le nom de la mthode en remplacement de Procdure ou Fonction. Ce nest pas
forcmentobligatoirecaraucuneautremthodenedoitavoirlemmenomquelaclasse.
b.Appelimplicite
La classe Ecran se voit complte de deux constructeurs : le premier ne reoit aucun paramtre et sera utilis
lorsque lobjet ne reoit aucune valeur lors de sa cration. Le second prend trois paramtres (type, marque,
modle)pourlesinitialiserlacrationdelobjet.
Unconstructeurquinereoitaucunparamtreestappelleconstructeurpardfaut.Ilestappelquand
aucunevaleurnestpasselobjetlorsdesacration.
Classe Ecran
attributs privs
type :chane
marque :chane
modle :chane
mthodes publiques
Constructeur Ecran()
Dbut
Afficher "Constructeur par dfaut"
this.type"Inconnu"
this.marque"Inconnu"
this.modle"Inconnu"
Fin
Constructeur Ecran(t,mq,mdl :chanes)
Dbut
Afficher "Constructeur avec 3 arguments"
this.typet
this.marquemq
this.modlemdl
Fin
FinClasse
- 1 - ENI Editions - All rigths reserved
Comment savoir quel constructeur va tre appel la cration de lobjet ? Cest vous de passer les bonnes
valeurs lobjet ds son instanciation (dclaration ou cration). Dans lexemple suivant, deux objets Ecran sont
crs.Lepremierlest comme dhabitude :cestleconstructeurpardfaut(sansparamtres)quiseraappel.Le
secondprendtroisparamtresentreparenthses,commesivouspassiezdesparamtresunemthode :cestle
constructeurassociquiseraappel.
Programme obj8
Var
// Appel implicite Ecran()
o1:Ecran
// Appel implicite Ecran(t,mq,mdl)
o2:Ecran("LCD","LG","L1915S")
Dbut
o1.affiche_modle() // INCONNU
o2.affiche_modle() // L1915S
Fin
lexcution sans avoir rien demand, les deux messages au sein des constructeurs sont affichs, les attributs
disposentdjdevaleurs,placeslparlesconstructeurs.
Avecuneallocationdynamique,cestpareil :
Programme obj9
Var
p_oEcran :pointeur sur Ecran
Dbut
p_oEcrannouveau Ecran("LCD","LG","L1915S")
p_oEcran->affiche_modle() // L1915S
...
Fin
c.Lhritage
Quesepassetillorsquevousinstanciezunobjetduneclassedrive ?
G Si la classe drive na pas de constructeur, cest celui de la superclasse qui est appel, si cestpossible
(paramtresidentiquesparexemple).
G Silaclassedrivedisposedunconstructeur,cestluiquiestappel.
G Pardfautsileconstructeurduneclassedriveestprsent,leconstructeurdelasuperclassenestpas
appel.Cestvousdyfaireappelexplicitement.
Classe A
...
Constructeur A()
Dbut
Afficher "Je suis A"
Fin
...
FinClasse

Classe B hrite de A
...
Constructeur B()
Dbut
Afficher "Je suis B"
Fin
...
FinClasse

Programme obj10
Var
o1 :A
o2 :B
Dbut
- 2 - ENI Editions - All rigths reserved
...
Fin
Leprogrammeobj10credeuxobjetsetdonnelaffichagesuivant :
Je suis A
Je suis B
PourappelerexplicitementleconstructeurdeAdepuisB,vousdevezlefaireexplicitementauseinduconstructeur
deBvialemotclsuper.Celuiciremplaantlobjetsuperclasse,ilsutilisecommeunobjet.Modifiezleconstructeur
deBainsi :
Classe B hrite de A
...
Constructeur B()
Dbut
super()
Afficher "Je suis B"
Fin
...
FinClasse
Vousobtenezenrelanantobj10lersultatsuivant :
Je suis A
Je suis A
Je suis B
UnenouvellelignecorrespondantlappelduconstructeurdeAdepuisBestaffiche.Lencore,encasdhritage
encascade,vousdevezappelerlesconstructeursencascade.
Il faut bien comprendre pourquoi lappel au constructeur de la superclasse nest pas automatique : rien ne vous
empche au sein du constructeur de la classe drive dinitialiser les attributs de la superclasse directement,
puisque sauf si ceuxci sont privs, vous y avez accs directement. Lappel implicite au constructeur de la
superclasserisqueraitdefairedoubleemploioudcraservosvaleurs.
2.Lesdestructeurs
Toutcommeleconstructeurestappellacrationdunobjet,ledestructeurestappelquandlobjetestdtruitou
lallocation dynamique libre. Tous les langages ne proposent pas de destructeurs, notamment Java, mais
proposent parfois des mthodes particulires appeles automatiquement quand lobjetnest plus utilis (sortie de
fonctionquandlobjetestlocal,remiseNILdesavaleur,etc).
PHP5proposeundestructeur,appel__destruct.
Ledestructeurestrarementemployenalgorithmiquecarlesprofesseursquilenseignent ont souvent le langage
JavalespritcommelangagedimplmentationetpasleC++parexemple.Pourtantilpeuttreimportantdansdes
langages o lallocation de la mmoire est dynamique. Un attribut dun objet peut tre un pointeur allou
dynamiquement.Quandvousnavezplusbesoindelobjetetquevouslelibrez,quesepassetilpourcepointeur ?
Ilfautlibreraussilazonealloue.
Ledestructeurressemblebeaucoupauconstructeur,saufque :
G Ilnyaquunseuldestructeur.
G Ilneprendpasdeparamtres.
G Sonnomestcomposduntildesuividunomdelaclasse.
G VouslefaitesprcderdumotDestructeur.
Il dispose des mmes proprits pour les classes drives. Vous devez ventuellement lappeler vousmme, en
cascade.
Classe B hrite de A
...
- 3 - ENI Editions - All rigths reserved
Constructeur B()
Destructeur ~B()
Dbut
// Appel explicite du destructeur de A
super.~A()
Fin
FinClasse

Programme obj11
Var
p_o1 :pointeur sur B
Dbut
p_o1nouveau B // appel implicite au constructeur
...
Librer p_o1 // appel implicite au destructeur
Fin
3.Lesmembresstatiques
a.Attributs
Quandvouscrezuneinstancedeclasse(unobjet),chaqueobjetrsultantdisposedesonpropreespacemmoire
etchaqueattributdonndisposedoncdesaproprevaleurtotalementindpendantedecelledummeattributdun
autreobjet.
Pourtant il peut y avoir des cas o vous voudrez partager un attribut commun tous les objets de ce type de
classe.Lecasdcoleestceluiovousvoulezconnatrelenombredefoisolaclasseatinstancie.Danslecas
delaclasseEcran,vousvoudriezparexemplesavoircombiendobjetsdetypeEcranonttcrs.
Pour cela, lattribut doit tre commun tous les objets et chaque objet doit pouvoir modifier la valeur de cet
attribut,valeurquiseraensuitelammepourtouslesobjets.Cestlerledelattributstatique.
Unattributstatiqueestunattributquinestcrquenunseulexemplaireetquiestcommuntouslesobjets
delaclasse.
Vous le dclarez comme nimporte quel attribut, sauf que vous lui ajoutez le motcl "statique" aprs son type.
Lattributstatiquepeuttreprivoupublic.Ilpeuttreimportantdinitialiserunevaleurpardfautpourunattribut
statique.
Classe Ecran
attributs privs
nb_ecrans0 :entier statique
...
FinClasse
Plutt que dutiliser this pour y accder, vous utilisez le nom de la classe ellemme, tant depuis lextrieur de
lobjet (si lattribut est public) que de lintrieur. Lexemple suivant montre les possibilits associes avec deux
objets :leconstructeurajoute1,ledestructeursoustrait1.Lestapesintermdiairesaffichentltat de lattribut
statiquenb_ecrans.
Classe Ecran
attributs publics
nb_ecrans0 :entier statique
...
mthodes publiques
Constructeur Ecran()
Dbut
nb_ecransnb_ecran+1
Fin
Destructeur ~Ecran()
Dbut
nb_ecransnb_ecran-1
Fin
Procdure nbEcrans()
Dbut
Afficher nb_ecrans
FinProc
FinClasse
- 4 - ENI Editions - All rigths reserved

Programme obj11
Var
p_o1 :pointeur sur Ecran
p_o2 :pointeur sur Ecran
Dbut
p_o1nouveau Ecran
p_o1->nbEcrans() // 1

p_o2nouveau Ecran
p_o2->nbEcrans() // 2

Afficher Ecran.nb_ecrans // Accs public : 2

Librer p_o1
p_o2->nbEcrans() // 1

Librer p_o2
Afficher Ecran.nb_ecrans // Seul moyen ici : 0
Fin
4.Classesetmthodesabstraites
Ilyadesfoisovousavezbesoindedfinirunprototypedeclassedanslaquellevousallezdclarerdesmthodes,
mais pas forcment leur implmentation. Par exemple, vous voulez crer des classes reprsentant des figures
gomtriquesafindeconcevoirunlogicieldeconceptionassisteparordinateur.Dansceslogiciels(2Dou3D),les
diffrentesfigurestracesonttoutesleurspropritscommeleursdimensions,surface,primtre,volume,couleur
deremplissage,couleurducontour,etc.Lesvaleursdecesattributsvarientdunefigurelautre,cestnormal,mais
certaines mthodes peuvent tre identiques comme celles pour la couleur et dautres non comme le calcul des
surfaces, volumes et primtres. Pourtant toutes les figures (carrs, rectangles, polygones, triangles, trapzes,
losanges,etc)doiventdisposerdecesmthodes.Commentdcrirececienobjet ?
Lasolutionconsistecrireuneclassedebasequideviendralasuperclassedetouteslesfiguresgomtriqueset
quivacontenirtouslesattributsdebasecommelapositiondedpartx,ydutracdelafigure,sescouleurs,mais
aussitouteslesmthodesnonseulementdebasemaisquidoiventaussiobligatoirementtreimplmentesdans
touteslesclassesquiendrivent.Lesmthodesdecalculdesurfaceetdeprimtredoiventtredclaresdans
cetteclasse.Pourtantellesnecontiendrontriencommecode :ceseralaclassedrivedelesprogrammer.
Cetteclassedebasecontenantdesmthodessansimplmentationnepourrapastreinstancie,vousnepourrez
pascrerdobjetpartirdelle,carelleestdefaitinutilisableetnesertquedebasepourlesmthodesdrives.
Uneclassenoninstanciableetcontenantdesmthodesnonimplmentes,uniquementdestinetredrive,
est appele une classe abstraite. Les mthodes non implmentes quelle contient sont appeles mthodes
abstraites.
G Pourcreruneclasseabstraite,vousajoutezlemotcl"abstraite"aprslenomdelaclasse.
G Pourcrerunemthodeabstraite,vousajoutezlemotcl"abstraite"avantsonnom.
Classe figure abstraite
attributs privs
x :rel
y :rel
c_contour :chane // couleur contour
c_remp :chane :: couleur remplissage
surface :rel
primtre :rel
mthodes publiques
Procdure setcolor_c(E :couleur :chane)
Dbut
this.c_contourcouleur
Fin
...
Fonction abstraite getSurface() :reel
Fonction abstraite getPerimtre() :reel
...
FinClasse
- 5 - ENI Editions - All rigths reserved
partirdumomentouneclassecontientunemthodeabstraite,elleestellemmeabstraite.Laclassefigureest
abstraite :ellecontientdesmthodesabstraites,sansimplmentation.Ellecontientaussidesmthodesquinesont
pasabstraitescommesetcolor_c()quinaurapasforcmenttrerimplmentedanslesclassesdrives.
Ilestdecefaitimpossibledecrerunobjetdetypefigure.Vousdevezmaintenantcrerlesclassesquienhritent.
Voici deux exemples simplifis de classes : disque et rectangle. Vous devez implmenter dedans les mthodes
abstraitesdelasuperclasse.
Note importante : vous tes oblig dimplmenter dans la classe drive les mthodes abstraites de la
superclasse.Sivousnesouhaitezpaslefaire,vousdevezdenouveaudclarerlamthodecommeabstraite
etlaclassedriveseraellemmeabstraite.
Classe disque hrite de figure
attributs privs
rayon :rel
mthodes publiques
Constructeur disque(c_x,c_y,r)
Dbut
this.xc_x
this.yc_y
this.rayonr
Fin
Fonction getSurface() :rel
Dbut
Retourne PI*this.rayon*this.rayon
FinFonc
Fonction getPerimtre() :rel
Dbut
Retourne 2*PI*this.rayon
Fin
FinClasse

Classe rectangle hrite de figure


attributs privs
largeur :rel
hauteur :rel
mthodes publiques
Constructeur rectangle(c_x,c_y,r_l,r_h)
Dbut
this.xc_x
this.yc_y
this.largeurr_l
this.hauteurr_h
Fin
Fonction getSurface() :rel
Dbut
Retourne this.largeur*this.hauteur
FinFonc
Fonction getPerimtre() :rel
Dbut
Retourne 2*(this.largeur+this.hauteur)
Fin
FinClasse
Les deux classes disque et rectangle ne comportant pas de mthodes abstraites, elle ne sont pas abstraites et
peuventtreinstancies.
5.Interfaces
Lesclassesabstraitessontdesclassescomportantdesmthodesimplmentesounon.Ellesserventgnralement
desuperclassesdautres.Ilestpossibledepousserleraisonnementplusloin :questilncessairedefairepour
crer une classe servant uniquement et entirement de prototype une classe ? Cette classe doit avoir les
propritssuivantes :
G Noninstanciable
- 6 - ENI Editions - All rigths reserved
G Abstraite
G Necontenantquedesmthodesabstraites.
Ainsi toute classe drivant de cette classe spciale devrait obligatoirement implmenter toutes les mthodes. Quel
estlintrt ?Celuidedfinirunmodleuniqueetcompletdemthodespourlesclassesquidcidentdelesutiliser.
Cestypesparticuliersdeclassessappellentdesinterfaces.Enpratiqueuneclassenhritepasduneinterface :mis
partlesdfinitionsdesmthodesuneinterfacenecontientpasdecode.Pourdclareruneclasse,vousutilisezle
motclInterfacelaplacedeclasse.Parexemple,vousvoulezcreruneinterfacequidclaretouteslesmthodes
debasepourlalecturedunfichiermultimdia :lecture,pause,stop,avancerapide,retourrapide,pisteprcdente,
pistesuivante.Linterfaceressembleraitceci (lesparamtresdesmthodesnesontpasprcissici) :
Interface lecture
mthodes publiques
Procdure lecture() ;
Procdure pause() ;
Procdure stop() ;
Procdure avance() ;
Procdure retour() ;
Procdure prcdent() ;
Procdure suivant() ;
FinInterface
NotezbienquuneinterfacenecontientQUEdesmthodesetriendautre.

On dit quune classe qui dcide dutiliser une interface implmente les mthodes de linterface, donc implmente
linterface.Vousutilisezcemmemotclpourleprciser.
Classe titi implmente interface
Vouspouvezdciderdimplmenterplusieursinterfacesauseindevotreclasse,danscecasvoussparezlesnoms
desinterfacespardesvirgules.
Classe titi implmente interface1, interface2, interfacen
Vousdevezimplmentertouteslesmthodesdelinterfacedanslaclasse.Sivousnelefaitespas,lamthodequi
nestpasimplmentedoittredclareabstraiteetlaclassedevientabstraite,doncnoninstanciable.
LaclasseMusiquercuprelinterfacelecture :
Classe Musique implmente lecture
attributs privs
morceau :chane
piste :chane
position : entier
duree : entier
mthodes publiques
Constructeur Musique(m,p :chanes)
Dbut
this.morceaumorceau
this.pistep
position0
// Mthode de calcul :dure du morceau en secondes
dureeduree_morceau(morceau)
Fin
// Dbut dimplmentation de linterface
Procdure lecture()
Dbut
...
FinProc
Procdure pause()
Dbut
...
Fin
Procdure stop()
Dbut
- 7 - ENI Editions - All rigths reserved
...
Fin
// Continuez ici
...
FinClasse
- 8 - ENI Editions - All rigths reserved
Principedelobjet,unenotionvidente
1.Avantdecontinuer
Vousvoicidansledernierchapitredecelivre.Sivotreobjectiftaitdapprendreprogrammerdansdeslangages
procduraux ou fonctionnels, cestdire bass sur lutilisation de sousprogrammes tels que prsents ici, vous
pourriezvousarrterl.Eneffet,dsprsentvousdisposezdetousleslmentsindispensablespourprogrammer
enlangageCouenPascal.
Cependant, il serait dommage de ne pas continuer, ceci mme si vous naurezpastoutdesuiteprogrammeren
objet.Laprogrammationobjetestdepuisledbutdesannes1990nonseulementunclassique,maisfaitpartiede
lacultureinformatique.UnlangagecommeleC++,volutiondulangageCetmmedautrescommeDelphidrivdu
Pascal,VisualBasicdrivduBasic,ainsiquelaplupartdeslangagesdemacrossousMSOfficeouOpenOffice.org,ou
encoreleslangagesdecertainsgestionnairesdebasesdedonnes,sontdeslangagesobjet.
Ne pas comprendre lobjet, cest risquer de se couper de beaucoup de produits, beaucoup de fonctionnalits et
parfoisaussiduneplusgrandesimplicitdanscertainstraitements.
2.Rappelssurlaprogrammationprocdurale
Lesprocduresoufonctionsreoiventdesdonnesenarguments(paramtres).Ellesretournentdesvaleurssoitpar
lemmechemin(pointeursourfrence),soitenrenvoyantdirectementunedonnecommersultatdelafonction.
Dansunlangageprocdural(oufonctionnel)lesdonnessontsparesdesprogrammesquilesutilisent.
a.Lesdonnes
Chaquevariabledisposeduntypequiindiquequellesortedevaleurellepeutcontenir.Cestypessontditsprimitifs
quand ils sont directement proposs par le langage luimme. Ils peuvent diffrer selon les langages mais le C
proposeunesriedentiers,derelsetdecaractres.Dautresincluentleschanesdecaractres.
Letypedelavariablepeutaussitredfiniparleprogrammeur.Cesontlestypesstructursquevousdcrivez
vousmme.
Les tableaux permettent de regrouper en un tout plusieurs occurrences de valeurs dans une mme variable. Ils
peuventcontenirnvaleurs,gnralementdummetype(dansleslangagestypscommeleC)ounon(langages
nontypscommelePHP).
Desvariablesparticuliresappeleslespointeursnecontiennentpasdirectementunevaleurmaisladressedune
variable contenant cette valeur, cestdire ladresse de lemplacement de cette valeur dans la mmoire de
lordinateur.Bienqueplusdifficileapprhender,ellespermettentunesouplesseingaledanslesmanipulations
de valeurs. Pour pallier au risque de complexit dans certains langages volus, la notion de rfrence remplace
parfoiscelledepointeur,notammentenJavaouenPHP.
b.Lestraitements
Lestraitementssonteffectussoitdansleprogrammeprincipal(quonappelleparfoislecorpsdeprogramme)soit
dans des sousprogrammes appels procdures ou fonctions. Dans ce dernier cas, la fonction est utilise comme
uneinstructionretournantunevaleur,alorsquelaprocdureestunblocdinstructionssansvaleurmaispouvant
ventuellementenretournerviaunpassagedevaleursautraversdesparamtres.DeslangagescommeleC,PHP
ouJavanefontpasdedistinctionentrecesdeuxnotions,unefonctionneretournantpasforcmentdevaleur.
3.Lobjet
a.Danslaviecourante
Regardezautourdevousdequoisontconstituestouslesobjetsrelsouabstraitsquivousentourent.Unobjet
relestparexempleunesalire,uncouteau,unstylo,unevoiture,votrecrandordinateur,untlphone,etc.Par
abstraitcomprenezuneentreprise,unservice,uneorganisationquelconque,etc.
Ces objets ont des proprits intrinsques. Prenez un cran, parmi ses proprits physiques et dusage vous
trouvez :
- 1 - ENI Editions - All rigths reserved
G sesdimensions,
G sontype(crt,lcd,etc),
G sesconnecteurs(vga,dvi),
G sonpoids(cestlourduncrantube),
G ladiagonaledaffichageenpouces,
G lesrsolutionsdaffichagesupportesaveclesfrquencesassocies,
G etc.
Cemmecranaprobablementunmodedemploidcrivantlesmanipulationstantmatriellesquelogiciellespour
leparamtrer,parexemple :
G rglerlescouleurs(etassoci :contraste,etc),
G rglerlazonedaffichage,
G changerdersolution,
G etc.
Unobjetcommeuncrandisposedoncdeproprits :cestladescriptiondecequilest,desontat.
Ildisposeaussidemthodes :quellessontlesactionspossiblespourmodifiersontat,soncomportement,pour
lutiliser.Cestcequilsaitfaire.
Tous les objets de la vie courante ont des proprits et des mthodes. Mme une salire (dimensions, couleur,
nombredetrous,contenu,mthodespourfairecoulerleselplusoumoinsvite,louvrir,laremplir,lafermer,etc).
Imaginezlenombredepropritsetdemthodespouruntrehumain
Ladfinitiondespropritsetdesmthodesdcritespouruncranestvalablepour99%descranssicenest
plus. Le contenu des proprits sera probablement modifi, mais si lcran est standard le changement de
rsolution via Windows, MacOS ou Linux sera effectu de la mme manire. La dfinition globale (proprits et
mthodes)duntelobjetpeutformerunesortedemoulecommuntouslesobjets,lescrans,demmetype.
Unefoisquevousdisposezdece"moule",vouspouvezlappliquerautantdobjets,lescrans,quevousvoulez,
avecdventuellesvariantes,enappliquantlesmmesmthodes.
b.Eninformatique
Enprogrammationprocdurale,laquestionseposerquandondveloppeest"quoisertleprogramme ?".Ici,il
sertmanipulerlesinformationsetlesfonctionsduncran.
Comment en programmation reprsenter les proprits de lcran et les manipulations qui y sont associes ?
Jusquprsentvousauriezprobablementraisonnainsi :
G RegroupertouteslesinformationssurlcrandansuntypestructurtEcran(parexemple).
G Crerdessousprogrammesdegestiondesparamtresdelcran,prenantcommeargumentslastructure
correspondante.
G Pourncrans,vouscreznenregistrements(structures)detypetEcran,unparcran,dansdesvariables
diffrentes,oudansdestableaux.
Pourrsumer,enalgorithmiquevouscririezquelquechoseressemblantplusoumoinscela :
Programmationprocdurale
- 2 - ENI Editions - All rigths reserved
Type
Structure tEcran
type :chane
marque :chane
modle :chane
diagonale :entier
hauteur :reel
largeur :reel
profondeur :reel
poids :reel
connecteur :chane
resolution : tableau[1..10] de chanes
FinStruct
Procdure changer_resolution(...)
Procdure mise_en_veille(...)
Procdure rallumer(...)
Procdure regler_affichage(...)
...
Cest correct, possible, vous devrez probablement jouer avec les pointeurs et rfrences pour le passage de la
structure, donc pourquoi pas. Des milliers de programmes ont t dvelopps ainsi. Posezvous cependant la
question :pourquoinepasassocierlespropritsdunobjetetlestraitementsassocisenunmmeensemble ?
Quandvousprogrammezenobjet,laquestionseposerest"Surquoiporteleprogramme ?".Larponseest :sur
lescrans.Puisqueleprogrammeportesurlescrans,pourquoinepastenterderpondrelaquestionposela
findupointprcdent ?Larponseest"pourquoipas"etcestlebutoulundesbutsdelaprogrammationobjet.
En langage procdural ou en algorithmique, une structure est dj appele un objet, dans un certain nombre
douvragesdalgorithmiqueunpeuanciens(annes1980),danslesensoellecontientunensemblededonnes
cohrentessurunsujetbienprcis.Lastructuretarticlecontenaittouteslespropritsdunarticle.Vousaccdez
uneinformationtraverslepoint"."oulaflche""silenregistrementestunerfrence.
Lastructurecodedonctouteslespropritsdunobjetrelouabstrait.Cependanttouslestraitementsassocis
sontdansdessousprogrammespart.
RegardezceslignesissuesdelexempleenPHPsurlesstructures :
class tarticle {
public $ref;
public $libelle;
public $prix;
public $fab;
}


$article=new tarticle();
$article->ref="Art001_01";
La variable $article est en principe une structure. Pourtant, ce nest pas le cas. Cest une variable objet (une
instance).Vousaccdezuneproprit,unedonnedelobjet avec la flche ">".Vousaccdeznonpasdes
enregistrementsmaisdesattributsassocislavariable.Voiciunedfinitiondelobjet :
Dans les langages objets, les donnes et les traitements qui manipulent ces donnes sont regroups au sein
dunemmeentitappeleobjet.
EnPHPlesobjetssontdcritsaveclemotcl"class".Enalgorithmiqueilslesontaveclemotcl"classe".
Quellessontlespropritsdunechanedecaractres ?
G Lachaneellemme,composedunesuitedecaractres.
Quelssontlestraitementsapplicablesunechane ?
G Lecalculdesalongueur,
G ledcoupageensouschanes,
G laconcatnationavecuneautrechane,
Programmationobjet
- 3 - ENI Editions - All rigths reserved
G larechercheduneautrechanededans,
G lclatementdelachaneselonundlimiteur,
G laconversionenminusculesoumajuscules,
G lasuppressiondesespacesavantetaprs,
G etc.
Maintenant,regroupezlespropritsdelachaneettouslestraitementspossiblesdessusenunseultout.Vous
obtenezunobjet.
Un programme objet est constitu dun ensemble dobjets qui communiquent entre eux par lmission et la
rceptiondemessagespourraliserletraitementfinal.Celaparatimpressionnantetcompliqucommecelamais
cestenfaittrssimple.Danslalignesuivante :
$cpt=$tab.count();
lobjet appel $tab, un tableau PHP dclar comme arrayObject, reoit lordre associ sa fonction count() :
compterlenombredlmentsdecetableau.
Sivousnavezpasencorebiencompris,alorsditesvousquunvritableobjeteninformatiqueestunpeucommeun
enregistrement(ilenreprendlesmmespropritsquesontleschamps)auquelonauraitajoutdedansdessous
programmeschargsdemanipulerseschamps.Lessousprogrammesneseraientpluspartmaispartieprenante
delastructure,quiseraitalorsnonplusladfinitiondunenregistrement,maisdunobjet.
4.Classe,objets
Ilestncessairedeconnatrequelquesmotsdevocabulairepourdfinirunobjet.Unobjetestdfinipar :
G Lesdonnessurluimme :sesproprits,sontat.
G Cequilfait :lestraitementsquilassociesesdonnesoulesdonnesreuesdesautresobjets.
Commelesstructuressedfinissentaveclemotcldummenom,lastructuredunobjetsedcritaveclemotcl
"Classe"pourclassedobjet.Cettestructuredelobjetdfinitcequeseraunobjetdecetype.Laclasseestletype
delobjet.
G Unobjetestunevariabledontletypeestsaclasse.
G Uneclasseestenfaitunmouleservantcrerplusieursobjets.Lesobjetsissusdunemmeclassesont
diffrentslesunsdesautresparcequelesvaleursdeleurspropritsnesontpastoujourslesmmes.
G Comme il peut y avoir plusieurs objets de mme type de classe, on dit quun objet est une instance de
classe.
Ladfinitiondunobjetestunpeucommecelledunestructure,saufquelleestcomposededeuxparties :
G Les attributs sont les proprits de lobjet, cestdire les diffrentes variables qui dfinissent ce quil
reprsente,sontat.
G Lesmthodessontlessousprogrammes,fonctionsouprocduresquiinfluentsurlobjet,parexemplesurles
attributs.
Cesdeuxpartiessontappeleslesmembresdelobjet.
Lesattributssontdesvariablesdenimportequeltype,primitif,tableau,objet,etc.Lesmthodessontlquivalent
dessousprogrammesvusjusquprsent,maispropreslobjet.
- 4 - ENI Editions - All rigths reserved
Classe mon_objet
attributs
attr1 :entier
attr2 :tableau[1..10] de rels
...
mthodes
procdure afficher()
procdure effacer()
...
FinClasse
Reprenezlexempleprocduralsurlcran.VoicicequepourraittrelaclassedelobjetdetypeEcran :
Type
Classe Ecran
attributs
type :Chane
marque :chane
modle :chane
diagonale :entier
hauteur :reel
largeur :reel
profondeur :reel
poids :reel
connecteur :chane
resolution : tableau[1..10] de chanes
mthodes
Procdure changer_resolution(...)
Procdure mise_en_veille(...)
Procdure rallumer(...)
Procdure regler_affichage(...)
Procdure affiche_modle()
Procdure saisie_modle()
FinClasse
5.Dclarationetaccs
Unobjetsedclarecommeunevariableouunenregistrementsaufquelenomdutypeestlenomdelaclasse :
Var
ecran1 :Ecran
ecran2 :Ecran
Vouspouvezaussicrerdestableauxdobjets :
Var
ecrans :tableau[1..10] dEcrans
Etmmedclarerdespointeurssurdesobjets,puisqueeuxaussioccupentunezonemmoire :
Var
ecran :Ecran
pEcran :pointeur sur Ecran
Parconvention,lesvariablesobjets,quiserontsimplementappelesobjetsparlasuite,commencentsouventparla
lettreo :oEcran1,o1,o2,etc.Maisvousntesabsolumentpasobligdesuivrecetteconvention,saufsiellevous
estimpose.
Vous accdez aux divers membres de lobjet en utilisant le point "." entre le nom de lobjet et ses membres,
exactement comme pour une structure. La seule diffrence est quaprs le point vous navez plus forcment un
champ(unattribut)maisaussiunsousprogramme(unemthode).Quandvousplacezunemthodeaprslepoint,
vouslancezlexcutiondecelleci.
Type
Classe Ecran
...
- 5 - ENI Editions - All rigths reserved
FinClasse
Programme obj1
Var
o1 :Ecran
Dbut
// modification des attributs
o1.type"LCD"
o1.connecteur"VGA"

// accs direct aux attributs


Afficher o1.type

// appel aux mthodes


o1.mise_en_veille()
o1.ralumer()
o1.affiche_modle()
Fin
6.Lesmthodes
Regrouperlesfonctionsetlesdonnesauseindunemmestructureappeleobjetestdjbienpluscohrentpour
lapense.Maiscommentmanipulerlesattributsdelobjetauseindunedesesmthodes ?Cestlquestuntrs
grosavantage :alorsquenprogrammationprocduralevousdeviezpasserladonne(lavariable)enargument,l
cesttotalementinutile :lamthode"sait"implicitementquelattributauquelilaccdeappartientlobjet :
Classe Ecran
attributs
type :chane
...
mthodes
Procdure modifie_type(E :t :chane)
Dbut
typet
FinProc
...
FinClasse
Il arrive parfois que des noms dattributs soient identiques ceux dautres objets ou arguments passs en
paramtresdemthodes.Pourviterlaconfusion,vouspouvezexplicitementdsignerquelemembreappartient
votreobjetenprcisantlemotcl"this"suividupointetdesonnom.Thisseraremplacparlobjetluimmelorsde
lappel.
Classe Ecran
...
Procdure modifie_type(E :t :chane)
Dbut
this.typet
FinProc
...
FinClasse
En programmation objet pure, il ny a plus de notion de programme principal et de sousprogrammes : tous les
traitements se font au sein des mthodes et mme le bloc dinstructions principal est une mthode au sein dune
classe,commeenJava.
Comme tous les composants dun programme sont des objets, il stablit une communication entre les objets. En
pratique,cestvidemmentvousquiinitiezcettecommunication :quandonditquunpremierobjetdemandequelque
choseunsecond,cest que lunedesmthodesdupremierobjetappellelunedesmthodesdusecond.Puisque
tout est objet, vous pouvez crer une instance du second objet comme attribut du premier, ou mme passer des
objetsenargumentsdemthodes.
Danslexempleprcdent,lobjetdetypeEcranpeutrecevoirlemessagemodifie_typequimodifielattributtype.
Ilestpossiblededcrire(programmer)unemthodeendehorsdeladfinitiondelaclasse(enalgorithmique).Dans
cecas,dansladfinitiondelaclassevouscrivezleprototypedelamthode(nom+paramtres)etendessousvous
dfinissez la mthode. Vous devez respecter la syntaxe suivante avec les doubles points "::" entre le nom de la
classeetlamthode:
Procdure classe::methode(params)
- 6 - ENI Editions - All rigths reserved
Parexemple :
Classe Ecran
...
mthodes
Procdure modifie_type(E :t :chane)
...
FinClasse

Procdure Ecran::modifie_type(E :t :chane)


Dbut
this.typet
FinProc
7.Portedesmembres
Dans le programme obj1, laccs aux divers membres, attributs ou mthodes, se fait directement. Le programme
accde aux membres en passant par lobjet et loprateur point. Cest que dans la dfinition de la classe, les
membressontbiensouventpublics :ilssontaccessiblessansaucuneprotection.
Vous pouvez choisir de rendre les divers membres publics ou privs. Par dfaut, en PHP par exemple, si vous ne
prcisezrientoussontpublics.Enalgorithmiquelesattributssontpardfautprivsetlesmthodespubliques.
G Public :lesmembressontdirectementaccessiblesdepuistouteautrepartieduprogrammeouobjetcomme
danslesexemplesprcdentsvialoprateurpoint.
G Priv : les membres ne sont plus accessibles depuis lextrieur de lobjet. Ils sont seulement accessibles
depuislintrieurdelobjet.
Vouspouvezprciserdanslesdclarationsletypedaccsvosmembres.VoiciunexempledelaclasseEcranoles
attributssontprivs,doncaccessiblesuniquementdepuislesmthodesdelobjetetlesmthodespubliques :
Classe Ecran
attributs privs
type :chane
marque :chane
modle :chane
...
mthodes publiques
Procdure regler_affichage(...)
Procdure affiche_modle()
Procdure saisie_modle()
FinClasse
Aveccettenouvelledfinition,vousnepouvezplusutiliserleprogrammeobj1telquel.Vousdevezlemodifier.
Programme obj2
Var
o1:Ecran
Dbut
// Attributs privs : accs depuis lextrieur interdit
o1.type"LCD" // *** INTERDIT !!! ***
// Accs direct aux attributs
Afficher o1.type // *** INTERDIT !!! ***

// Mthodes publiques : accs autoris


o1.saisie_modle("Multisync FE1250+")o1.affiche_modle()
Fin
Ilexisteuntroisimetypedaccs : laccsprotg.Ilestparticulieretvouslereverrezplusloinlorsquelanotion
dhritageseraaborde.Unmembreprotgestconsidrcommeprivpourlesautresobjetsindpendantscaril
nestpasaccessibledepuisceuxci,maiscommepublicauseindelobjetetdesobjetsquiendrivent.
- 7 - ENI Editions - All rigths reserved
8.Encapsulationdesdonnes
Lesmembrespeuventtrepublicsouprivs.Lastructureinternedunobjetcomporteuncertainnombredattributs
etdemthodesquiluisontpropres,quirefltentsastructureinterne.Desattributsetmthodesdelobjetnesont
utiles que pour dautres mthodes et donc ne doivent pas tre accessibles depuis lextrieur de lobjet. De mme,
afindelaisserunseulpointdentreauxdiversattributs,vousnedevriezpaspermettrelaccs ceuxcilafois
directementetpardesmthodes.
Unebonnepratiqueconsisteinterdirelaccspublicauxattributs.Seuleslesmthodesyaccdentetsivousvoulez
les manipuler, vous dfinissez des mthodes publiques pour cela. Vous vitez ainsi que le programmeur manipule
directementlastructureinternedevotreobjetetymettenimporte quoi car vous pouvez effectuer un contrle au
seindesmthodes.Cestleprincipedelencapsulationdesdonnes :
G Lesattributssontprivs(ouprotgs).
G Vouslesmanipulezenpassantpardesmthodespubliques.
Lexemplemodifisuivantmetenvidencecequiauraitpuposerunproblme :vousvoulezmodifierletypedcran.
Enpassantdirectementparunattributpublicvousauriezpumettrenimportequoidedanscomme"PLAT".
Orlamthodemodifie_typevrifieavantcequevousymettez dansunchoixprdfini(crt,lcd,plasma).Siletype
que vous voulez ne correspond pas, il est rejet. Vous venez de blinder (un peu) votre objet en empchant
quiconque de le "casser". Vous reconnaissez maintenant limportance, dans certains cas, de lencapsulation des
donnes.
Types
Classe Ecran
attributs privs
...
type:chane
...
mthodes publiques
...
Fonction modif_type(mod :chane) :boolen
...
FinClasse
Fonction Ecran::modif_type(mod :chane) :boolen
Var
tmod :tableau[1..3]<-{"CRT","LCD","PLASMA"} de chanes
ok :boolen
i :entier
Dbut
okFAUX
i1
Tant que i<=3 ET NON ok Faire
Si mod=tmod[i] Alors
okVRAI
FinSi
i=i+1
FinTantQue
Si ok Alors
this.typemod
FinSi
Retourne OK
FinFonc
Programme obj3
Var
oEcran :Ecran

Dbut
Si NON oEcran.modifie_type("PLAT") Alors
Afficher "Erreur dans la modification du type"
FinSi
Fin
Les utilisateurs de vos classes nont pas toujours savoir comment sont dfinies cellesci : ils nont accs quaux
membrespublicsdevotreclasse.Vousdfinissezenfaitdesinterfaces(lalistedesmthodes)depuislesquellesles
utilisateursaccdentindirectementauxattributs.Lesmthodesquipermettentdemanipulerlobjetsontlesmmes
quelles que soient les valeurs des attributs de lobjet. Cestpourquoiunobjetdontlattribut type est CRT ou LCD
- 8 - ENI Editions - All rigths reserved
sutilise de la mme manire : cest le principe dabstraction : lutilisateur manipule nimporte quelle instance de
classesansrienconnatredesacomplexitinterne.
9.Lhritage
a.Principe
Vousnetrouverezlanotiondhritagenullepartailleursquedanslobjet.Ilpermetdecrerunenouvelleclasse
depuis une classe existante. On dit alors que la nouvelle classe hrite de la premire, ou quelle drive de la
premire.Vousentendrezrgulirementparlerdeclassesdrivesenprogrammationobjet.
Quanduneclassehriteduneautre,ellercupretoussesattributsetmthodes.Onditquelaclassedebaseest
unesuperclasse.Laclassedrivehritedesmembresdelasuperclasse.Saufquedanslaclassedrive,vous
pouvezajouterdesnouveauxattributsetdesnouvellesmthodesetmmeredfinirlesmthodesdelaclassede
base :cestunefonctionnalitmajeuredelanotiondobjet.
Soituneclasseanimal :
Classe animal
attributs privs
forme :chane
ordre :chane
...
mthodes publiques
Procdure modifie_ordre(E :ordre :chane)
...
FinClasse
Le rgne animal est complexe et pourrat tre divis en normment de choses : vertbrs, invertbrs,
mammifres, insectes ou encore herbivores, carnivores ou omnivores. Ces trois derniers sont la base tous des
animaux :desclassesdecegenredriventdelaclasseanimal.
Pourdclareruneclassequidriveduneautre,respectezlasyntaxesuivante :
Classe maClasse hrite de Superclasse
attributs
...
mthodes
FinClasse
Pour dfinir les classes herbivores, carnivores ou omnivores, vous hritez des proprits de base du sousrgne
animalassoci.
Classe herbivore hrite de animal
...
FinClasse
Classe carnivore hrite de animal
...
FinClasse
Classe omnivore hrite de animal
...
FinClasse
Aveclhritage,vouspouvezconcevoirdesclassesdeplusenplusspcialises.Demmesivousdevezconcevoir
des classes dont les proprits sont trs proches, plutt que de tout reprogrammer depuis zro, vous pouvez
concevoiruneclassedebase(lasuperclasse)etcrerdeuxclassesquihritentdecelleci.
Donnezunoudeuxnomsdanimauxdanschaquecatgorie.Lavacheestherbivore,lechevalaussi.Lesdeuxnont
paslemmergimeetpaslemmenombredestomacs.Vouspouvezlesdiffrencierdansdeuxclassesdiffrentes
quidriventdelaclasseherbivore :
Classe cheval hrite de herbivore
...
FinClasse
Classe vache hrite de herbivore
...
FinClasse
- 9 - ENI Editions - All rigths reserved
Vouspouvezfairedemmeaveclescarnivores :lion,chienetlesomnivores :lhomme,lesinge.Vousconstituez
doncunensembledeclassesdrivesdeplusenplusspcialises.
Dansuneclassedrive,vousavezunaccsdirectauxmembres,tantlesattributsquelesmthodes,detoutesles
superclassesdorigine,encascade.Doncceciestcorrect,partantduprincipequeomnivoredrivedeanimalvous
pouvezappelerlamthodemodifie_ordre()delasuperclasseanimal.
Programme obj4
Var
o3:herbivore
Dbut
o3.modifie_ordre(mammifre)
Fin
Rappelezvouscependantquelaccsauxattributsdpenddeleurprotection.Silesattributsdelasuperclassesont
privs,uneclassedrivenepeutpasyaccderdirectement.Sielleestprotgeoupublique,cestpossible.
b.Commerce
Lavantageestdetaille,telpointquilexistepourdeslangagescommeC++,PHPouJavadesditeursdelogiciels
spcialissdanslaventedeclasses,regroupessousformedebibliothques.Ilexistedoncuncommercedobjets
etcommelesclassessontdesmoulesrutilisablesvolonttoutlemondeytrouvesoncompte.Voustrouverez
ces produits sous le nom dAPI (Application Programming Interface). Il existe des API pour peu prs tous les
domainesdelinformatique :telleAPIpouraccderplusfacilementauxbasesdedonnes,telleAPIpouraiderau
dveloppement dun logiciel de gestion de cabinet mdical, etc. Vous trouverez sur Internet des sites spcialiss
dans la diffusion, souvent gratuite, de classes trs pratiques. Si la classe de base de PHP pour la gestion des
tableauxnevoussuffitpas,vouspourrezentrouverdautresquiproposeronttouslestypesdetri,dereconstituer
unechane,dallouerdynamiquementdeslmentssupplmentaires,quigrerontleslisteschanesvotreplace,
etc.Toutestpossible.
Enunephrase,lagrandeforcedelobjet estdtrerutilisable,acclrantainsiledveloppementdapplicationspar
lutilisationdecomposantsdjtestsetvalids.
c.Hirarchie
Quand une classe hrite dune autre, on dit que cest une classe fille (et lobjet rsultat un fils). Il y a donc une
relationhirarchiquereprisesurlagnalogie.Ilyadesobjetspre,grandpre,etc,jusquuneclassedebase.
Commeplusieursclassesdistinctespeuventdriverdune superclasse et que dautresencorepeuventdriveren
cascade des nouvelles classes, vous obtenez un hirarchie entre les classes, un arbre des classes (et objets
associs),commeunarbregnalogique :uneclassedebaseatantdefils,quionteuxmmestantdefilsetainsi
desuite.Cettehirarchiedcritunearborescence.
CestflagrantenJavaotouteslesclasseshritentlabaseduneseulesuperclasseappeleObject.Cetteclasse
sertdeprototype,debase,pourtouteslesautres.TouteslesclassesproposespardfautparJava(toutesles
APIduSDK)driventdelaclasseObject.LaclasseObjectproposedesmthodesquisonttoutesrimplmentes
danslesclassesdrives.LaclasseObjectestdonclasuperclassedetouteslesclassesJava.
Si vous reprenez lexemple des rgimes alimentaires du rgne animal, vous obtenez une arborescence de ce
genre :
- 10 - ENI Editions - All rigths reserved
Hritageethirarchiesdesclasses
d.Simpleoumultiple
N classes peuvent driver dune superclasse, cest ce que vous avez vu jusqu prsent. Si vous regardez la
hirarchie actuelle, il serait ventuellement possible de modifier quelque chose. Un omnivore mange la fois de
lherbe(fruitsetlgumes)etdelaviande.IlestdonclafoisHerbivoreetcarnivore.Pourraitonalorscrerune
classeOmnivoredrivantdesclassesCarnivoreetHerbivore ?Cestpossible.Danscecas,lanouvelleclassehrite
desmembresdesdeuxclassespres.
Classe omnivore hrite de Herbivore, Carnivore
...
FinClasse
Lahirarchiedevient :
Hritagemultiple,attentionlacomplexit
Cestpossible,maiscelaposesouventplusdeproblmesquecelanenrsout.Lesavissontpartagssurcesujet.
Maisvoiciunbrefexempledesimplicationsunpeutorduesgnresparlhritagemultiple :sideuxmthodesde
mme nom sont dfinies dans les deux superclasses et pas dans la classe drive, quelle mthode doit tre
appelesisonnomestappeldanscelleci ?Leslangagesproposentdesastucespourgrercegenredecas,mais
cela devient trs complexe. Lhritage multiple a t implment dans le langage C++ mais pas en Java ou PHP,
toutaumoinspasdirectement :uneclassenedrivequeduneseuleclasse.
Avant de vous lancer dans de lhritage multiple, tentez de voir sil est possible de transformer la hirarchie en
hritagesimple,dutiliserdesclassesinstanciantcommeattributsdautresclassesoudutiliserlesinterfaces.Ilnya
quasimentjamaisdobligationutiliserlhritagemultiple.
10.Lepolymorphisme
a.Principe
Quand vous hritez dune classe, vous pouvez depuis un objet de la nouvelle classe accder directement aux
mthodes des superclasses : de fait elles font toutes partie de la classe drive. Pourtant il est probable que si
vous avez driv de la superclasse cestquevousaveztrouvunavantageajouterdesnouveauxattributset
des nouvelles mthodes. Certaines de ces nouvelles mthodes remplacent peuttre les mthodes de la
superclasseouyfontappel.
Lepolymorphismedesmthodesestunautreconceptessentieldelaprogrammationobjet.Polymorphismesignifie
quune mme chose peut prendre plusieurs formes. Certains animaux en font leur spcialit comme les abeilles :
chezunemmeespce,ilyatroisformesdindividus,lafemelle(reine),lesmles(fauxbourdon)etlesouvrires
(femellesstriles).Troisformesdiffrentespourlammeespce,oupluttlammelarvelabase.
- 11 - ENI Editions - All rigths reserved
Ductdelobjet,lepolymorphismepermetdecrerplusieursmthodesquiportentlemmenom.Ondistingue
troistypesdepolymorphisme.
b.Lepolymorphismeadhoc
Gnralement dans un langage procdural, vous ne pouvez avoir quune seule procdure portant le mme nom
dans un mme programme. Si le sousprogramme Afficher() doit tre utilis pour des donnes diffrentes, vous
devezsoitladapterenconsquence,soitcrerautantdesousprogrammeAfficher_xxx()oxxxnommeraitlerle
exactdusousprogramme.
En objet, comme chaque dfinition de classe est indpendante de sa voisine, vous pouvez rutiliser les mmes
nomsdemthodesdansdesclassesdiffrentes,puisquellesnontaucunrapportentreelles.
Classe lion hrite de Carnivore
...
mthodes publiques
Procdure affiche_nom()
...
FinClasse
Classe Ecran
...
mthodes publiques
Procdure affiche_nom()
...
FinClasse
c.Lepolymorphismedhritage
Vous avez le droit et cest souvent le cas, de redfinir une mthode dune superclasse dans une classe drive,
aveclemmenomdemthode.UneclasseObjectcommeenJavadfinitdesmthodesdebase,quisontredfinies
danslesclassesdrivesenfonctiondesnouvellespropritsdecelleci.Unexempleclassiqueestunjeudchecs
etsespices.Chaquepicedujeuaunnombreplusoumoinslimitdemouvementsautoriss.
Une classe pice va dfinir une mthode mouvement(). Les classes drives pion, fou, tour, cavalier, roi et reine
vontconteniraussiunemthodemouvement()quidtermineraleursmouvementspropres :
Classe Pice
...
mthodes publiques
Procdure mouvement()
Dbut
Afficher "Mouvement de Pice"
FinProc
...
FinClasse
Classe Tour hrite de Pice
...
mthodes publiques
Procdure mouvement()
Dbut
Afficher "Mouvement de Tour"
FinProc
...
FinClasse
Quand vous allez dclarer un objet de type tour et que vous allez accder la mthode mouvement(), cest la
mthodemouvement()dePicequivatreappeleetcestdonclemessagecorrespondant"MouvementdeTour"
quisaffiche.
Programme obj5
var
matour1 :Tour
Dbut
...
// Appel de mouvement() de lobjet matour1
matour1.mouvement()
Fin
- 12 - ENI Editions - All rigths reserved
Vous pouvez explicitement faire appel la mthode de la superclasse Pice dont Tour drive laide du motcl
super (pour superclasse) au sein de la ou des mthodes concernes. Dans lexemple suivant la mthode
mouvement() de la classe Tour a t modifie pour appeler la mthode mouvement() de Pice. lissue de ce
programme,lesdeuxmessagessontaffichs,dabordceluipourPice,puisceluipourTour.
Classe Tour hrite de Pice
...
mthodes publiques
Procdure mouvement()
Dbut
// Appel de mouvement() de Pice
super.mouvement()
Afficher "Mouvement de Tour"
FinProc
...
FinClasse
Programme obj6
var
matour1 :Tour
Dbut
...
// Appel de mouvement() de lobjet matour1
matour1.mouvement()
Fin
Encasdhritageencascade,lemotclsuperserapportelaclassemre,cestdirecelledontdrive
directement la classe fille. Pour remonter toute la hirarchie des classes, vous devez utiliser le motcl
superdanstouteslesmthodesdetouteslesclassesprcdentes,encascade.
d.Lepolymorphismeparamtrique
Chaquemthodeauseinduneclassedisposedunesignatureparticulire.Cettesignatureestconstituedunom
delamthode,desparamtresquelleprendetdelavaleurquelleretourne.Lelangageobjetsebasesurcette
signaturepourappelerlabonnemthode.
Le principe de lobjet indique quil suffit quun seul de ces trois constituants de la signature varie pour que la
mthodesoitconsidrecommediffrente.Vouspouvezfaireparexemplevarierletypedevariableretournepar
lamthodeetaussilesparamtres,maispaslenomdecelleci ?Voyezvouslesimplicationsdirectes ?Vousavez
ledroitdedonnerlemmenomplusieursmthodesconditionquelenombreoulestypesdesparamtresde
cellescinesoientpasidentiques.
Soituneclassecalculquiredfinitdesoprationssurdiverstypesdevariables :entiers,rels,maisaussichanes
decaractrespourlesconcatnerparexemple.Danscetteclasse,vousvoulezquequandvousappelezlamthode
addition(),ladditiondesdeuxvaleurspassesenparamtressoiteffectue,sanssesoucierdeleurtype.Celane
reprsente aucun problme. Lexemple suivant implmente ces trois mthodes et le programme principal y fait
appel.
Classe calcul
...
mthodes publiques
// Addition de deux entiers
Fonction addition(x,y :entiers) :entier
Dbut
Retourne x+y
FinFonc

// Addition de deux rels


Fonction addition(x,y :rels) :rel
Dbut
Retourne x+y
FinFonc

// Concatnation de deux chanes


Fonction addition(x,y :chanes) :chane
Dbut
Retourne x&y
- 13 - ENI Editions - All rigths reserved
FinFonc
...
FinClasse
Programme obj7
Var
oCalc :Calcul
Dbut
// Deux entiers
Afficher oCalc.addition(10,20)

// Deux rels
Affichier oCalc.addition(3.1415927,14.984)

// Deux chanes
Afficher oCalc.addition("Bonjour" ,"les amis")
Fin
- 14 - ENI Editions - All rigths reserved

Vous aimerez peut-être aussi