Vous êtes sur la page 1sur 220

Algorithmique

Techniques fondamentales de programmation

SbastienROHAUT

Rsum

Ce livre 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, 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++ et surtout Java.
Une grande partie des algorithmes de ce livre sont rcrits en Java et les sources, directement utilisables, sont disponibles en tlchargement
sur le site de lditeur (www.eni-livres.com).
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.

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

ENI Editions - All rigths reserved - Jonifar lina - 1-


1
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 ? Avezvous besoin, durant vos tudes, de matriser les techniques fondamentales de programmation
pour passer votre diplme? tesvous un professionnel ou un autodidacte passionn qui veut encore en savoir
davantage?Estceunenouvelletapedevotrecarrireprofessionnelleontantpasinformaticienvoustesamen
programmerdesmacrosoudesscriptscomplexes?Quelleraisonencoretrouver?Sivousrpondezouilunedesces
questions, mais aussi aux dizaines dautres quil serait possible de poser, alors oui, vous devez apprendre
programmer.Apprendreprogrammer,cestenfinsavoircommentfontlesautrespourcrerdesuperbeslogiciels,cest
savoirtermecommentlescrersoimme,etlesdvelopper.
Commentapprendreprogrammer?Onnesimprovisepasprogrammeur.Cestunmtier,etcommetoutmtier,cela
sapprend. Dans les coles, des professeurs enseignants pour des classes de BTS, DUT, DEUG, classes prparatoires,
etc.,sontspcialissdanslapprentissagedesnotionsfondamentalesdeprogrammation.Lesautodidactesseplongent
dans des livres, des sites Internet, dans la documentation en ligne des langages, pour apprendre ces notions.
Lensembledecesnotionscestlalgorithmique.

Ce livre reprend les notions essentielles, fondamentales, de la programmation. Pour apprendre programmer, il faut
dabordcomprendrecequestvraimentunordinateur,commentilfonctionneetsurtoutcommentilpeutfairefonctionner
desprogrammes,commentilmanipuleetstockelesdonnesetlesinstructions,quelleestsalogique.Alors,aufuret
mesure,lerestecouledesourcecommeunevidence: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
prsenticialavantagedtredansunfranaistrsexplicite"tantque,jusqu,pourchaque,afficher,saisir,etc.".Leur
lecturenencessiteaucuneconnaissancepralabledetermestroptechniques.

Celivrenefaitpasquaborderlesnotionsbasiques.Deuxchapitres,lunsurlespointeursetlesrfrences,lautresur
les objets, ouvrent les portes de la programmation dans des langages volus et puissants comme le C, le C++ et
surtout Java. Dailleurs, presque tous les algorithmes de ce livre sont rcrits en Java. Les sources directement
utilisablessontdisponiblesentlchargementsurlesitedesditionsENI.

Lauteur tient particulirement remercier ses anciens professeurs de BTS du lyce de Montmorency, ses anciens
professeursetaujourdhuicollguesdelESGI,notammentceuxdalgorithmiqueetdeprogrammationC,C++etJavaqui
sereconnaitront,pourluiavoirtransmisencoreunpeuplusleplaisirdumtierdinformaticienetdutravailbienfait.

ENI Editions - All rigths reserved - Jonifar lina - 1-


2
Lesfondementsdelinformatique

1.ArchitecturedeVonNeumann

Unordinateurestunensembledecircuitslectroniquespermettantdemanipulerdesinformationsquonappelledes
donnes et capable de faire "tourner" des programmes, cestdire une suite ou squence dinstructions
programmes lavance et quil va drouler du dbut la fin dans le but dobtenir des rsultats. Pour comprendre
commentunordinateurpeutdroulerunprogramme,ilfauttudierunpeuplusendtailsonfonctionnement.
CestVonNeumannquiadfinien1944larchitecturedesordinateursmodernesencorelargementutiliseaujourdhui
(avecdesvariantescependant).LarchitecturedeVonNeumann(issuedestravauxdeTuringdontilseraquestionplus
loin)dcomposelordinateurenquatrepartiesdistinctes:

1. LUnitArithmtiqueetLogiqueUAL(ALUenanglais)estlorganedelordinateurqui
excutelescalculs:additions,soustractions,multiplications,divisions,modulos,gestiondes
signes(positif,ngatif),oprationslogiques(boolenne),comparaisons,parfoisrotationset
dcalagesdevaleurs(toujoursdanslecadredunelogiqueboolenne).IlexistedesUAL
spcialisesdanslesnombresvirguleflottante,dautresdansdestraitementscomplexes
commeleslogarithmes,lesinversions,lesracines,lesvecteurs,lescalculstrigonomtriques,
etc.Certainesdocumentationsluirajoutentquelquesregistres(petitescasesmmoires
intgreslUAL)etluidonnentlenomdeprocesseur(CPU).

2. LUnitdeContrleUC(CUenanglais),nepasconfondreavecUnitCentrale,contrlele
squenagedesoprations,autrementditledroulementduprogramme.Elleprendses
instructionsdanslammoireetdonnesesordreslUAL.Lesrsultatsretournspeuvent
influersurlesquenage.LUCpassealorslinstructionsuivanteouuneautreinstruction
tellequeleprogrammeluiordonnedeffectuer.

3. Lammoirepeuttredcritecommeunesuitedepetitescasesnumrotes,chaquecase
pouvantcontenirunepetiteinformation(petitedanslesensolatailledechaquecaseest
fixe).Cetteinformationpeuttreuneinstructionouunmorceaudinstructionduprogramme
(uneinstructionpeutoccuperplusieurscases)ouunedonne(nombre,caractre,ou
morceaudeceuxci).CestlUCquiacommerlecentraldecontrlerlaccslammoire
pourleprogrammeetlesdonnes.Chaquenumrodecaseestappeluneadresse.Pour
accderlammoire,ilsuffitdeconnatresonadresse.Lesinstructionsduprogrammepour
lUCetlesdonnespourlUALsontplacesdansdeszonesdiffrentesdelammemmoire
physique.

4. LesEntres/SortiesE/S(I/Oenanglais)permettentdecommuniqueraveclemonde
extrieuretdoncvous:cepeuttreunclavierpourentrerlesdonnes,etuncranpour
afficherlesrsultats.Ilpermetlordinateurdtreinteractif.

Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstruction
duprogrammeetlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALde
prendrecesdeuxnombresenmmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvelle
case. Puis lUCpasselinstructionsuivante.Sielleconsisteaffichercersultat,alorslUCvalirelecontenudela
mmoire ladresseoestplaclersultat,puisvaenvoyerlersultatvialecomposantdE/Sadquat.Etainside
suite.Aufinalledroulementdunprogrammeauseindelordinateurestlesuivant:

lUCextraituneinstructiondelammoire,

analyselinstruction,

rechercheenmmoirelesdonnesconcernesparlinstruction,

dclencheloprationadquatesurlALUoulE/S,

rangelersultatdanslammoire.

ENI Editions - All rigths reserved - Jonifar lina - 1-


3
VonNeumann,predesordinateursactuels

Si vous ouvrez le capot de votre ordinateur, vous y verrez une grande quantit de cartes, composants, cbles, et
mme des organes mcaniques (lecteurs de disques durs, cd et disquette). Un programme que vous allez crire et
droulernesexcutepourtantquedansunseulendroit:lemicroprocesseur.Lemicroprocesseurdevotreordinateur
est une puce facilement reconnaissable car cest souvent la plus grosse, celle qui dispose du plus de pattes et est
gnralement surmonte dun gros bloc daluminium ou de cuivre accompagn dun ventilateur pour le refroidir. Il
contientlUAL,lUCetdiversautresorganes:desregistresspcialiss(donnes,compteurs,adresses,tats,etc),un
squenceur qui synchronise tous les composants, une horloge interne, une unit dentresortie qui gre la
communication avec la mmoire ( ne pas confondre avec lE/S des priphriques clavier, cran, etc). Le
microprocesseurdisposeselonsonmodledunjeu(ensemble)dinstructionsprdfini.

Sil tait tout seul, le microprocesseur ne pourrait pas faire grand chose. Au sein de larchitecture de Von Neumann
seuls sont reprsents les composants logiques de base. Autour de ce schma logique se raccordent bien dautres
organeslectroniquescommelescontrleurs.Cespuceslectroniquesquonappelleaussiparfoischipsetssontaussi
des sortes de microprocesseurs qui disposent souvent dun jeu dinstructions pour les contrler, justement. Ces
instructionssontsouventmoinsnombreusesetpasgnralistes.Lescontrleursontunrleprcis,selonleurgenre:
greruncertaintypedepriphrique(ex:uncontrleurdecartegraphique,uncontrleurpourlesdisquesdurs,etc),
oudetransfertdedonnes(ex:lescontrleursdesbusdemmoireetdedonnes,lescontrleursUSB,PCI,etc).
Touscescomposantssontintgrssuruncircuitimprimprincipalappellacartemre.

ArchitecturedeVonNeumann

Pourrsumer:larchitecturedeVonNeumannestsimplecomprendreetrpartitlesfonctionnalitsdunordinateur
en quatre entits logiques. Ces entits logiques se retrouvent pour deux dentre elles (UC et UAL) dans le
microprocesseur. Les autres et les composants additionnels se retrouvent sur la carte mre ou sur les cartes
dextension(lammoirenestplussoudesurunecartemremaisfourniesousformedecarteadditionnelleappele
barrette,lecontrleurE/SgraphiqueestsurunecartegraphiqueadditionnellerelieunbusPCI,AGPouPCI/E).Les
programmes sont excuts par le microprocesseur qui est aid (dans le sens o celuici accde aux fonctions
proposes)pardiverscontrleurs.

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


4
ote:lesmicroprocesseursactuelssonttrscomplexes.Ilnestpasraredetrouverauseindeceuxciplusieurs
N
UAL pour acclrer les traitements. De mme on trouve souvent une mmoire intermdiaire appele mmoire
cache ou antmmoire, celleci tant souvent spcialise : une mmoire cache pour les instructions et une autre
pourlesdonnes.

2.LamachinedeTuring

Avant mme lapparition des premiers vrais ordinateurs programmables, Alan Turing avait dfini en 1936 (le 28 mai
exactement)cequonappellelaMachinedeTuring.Cettemachineabstraite(quinexistepasrellement)estenfait
une mthode de modlisation du fonctionnement dun ordinateur ou plutt lorigine dun calculateur mcanique.
Commentfairepour,depuisunpostulatdebase,arriverunrsultatdonn?Enrespectantdesprocduresdonnes.
Cestlundesprincipesdelalgorithmique.

UnemachinedeTuringntantpasunevraiemachine(ausensmatriel),ilsuffitpoursenservirsoitdeseservirdesa
tte (rflexion et mmoire), soit dun crayon qui fera office de tte de lecture, dune longue bande de papier
dcompose en cases quon appelle ruban, et dune table de symboles et de procdures lie ltat de la case
respecterquandontombesurunecasecontenantunsymboledonn.Onseplacesurlapremirecase,onvrifieson
symboleetsontatassocis,onexcutelaprocdureassocie(changementdevaleur/symbole,avancer,reculer)et
on continue drouler ce programme jusqu ce que la procdure vrifiant quon a obtenu le rsultat final soit
vrifie.Onvientdedroulerunprogramme,etlensemblesymboles/procduredcritceprogramme.Cestlanctrede
lalgorithme.

AlanTuring,crateurdelamachineabstraitedummenom

IlexistedeslivrescompletssurlamachinedeTuring,notammentundeAlanTuringluimmeetdeJeanYvesGirard,
auxditionsSeuil,CollectionPointsSciences.Linformatiquenestpasleseuldomainedapplicationdelamachine.Elle
permet de dterminer la complexit dun algorithme, si quelque chose peut vraiment tre calcul, a des domaines
dapplications dans la physique et notamment loptique, etc. Vous pouvez simuler une machine de Turing sur votre
ordinateurviaplusieurslangagesdontunappelBrainf*ck.

ExempledemachinedeTuring

3.Reprsentationinternedesinstructionsetdesdonnes

a.Lebinaire

quoi ressemblent les instructions et les donnes (valeurs) utilises rellement par lordinateur ? Celuici ne
comprendquunechose:deschiffres.Siltrehumainainventdesreprsentationspratiquesdeschiffresavecle

ENI Editions - All rigths reserved - Jonifar lina - 3-


5
systme dcimal (soit une notation en base 10 en allant de zro neuf), un ordinateur ne manipule que deux
valeurs : 0 ou 1. En effet si vous pouviez trs fortement agrandir un circuit intgr, vous verriez que celuici est
composdenombreusespistesdanslesquellespasseuncourantlectrique.

Danscescircuitsilnyaquedeuxpossibilits:soitlecourantpasseetdanscecascelaquivautunevaleurdeun
(1), soit le courant ne passe pas, et dans ce cas cest la valeur zro (0) qui est retenue. Cestdu binaire (qui ne
prendquedeuxvaleurs).Uneunitbinairesappelleun bit(binarydigit).CemotatinventparClaudeShannon
en1948.
Commeilyaplusieurspistessurlescircuits,plusieursvaleurs0et1,doncplusieursbits,circulentenmmetemps.
Enassociantcesvaleurs,onobtientdesvaleursplusgrandes.Enpassantdesdonnessurunfil,lavaleurmaximale
estde1.Sionprenddeuxfils,soitdeuxbits,lavaleurmaximaleenbinaireest11,soit3endcimal.Pourquoi?Voici
unedmonstrationpartapes:

CourantFil1 CourantFil2 Binaire Dcimal


Nepassepas Nepassepas 00 0

Nepassepas Passe 01 1

Passe Nepassepas 10 2

Passe Passe 11 3

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 reprsente une valeur. Si le courant passe, lampoule sallume et prend la valeur
associe.

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

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

Lunitestreprsentepar10 0 ,ladizainepar101 ,lacentainepar102 ,etainsidesuite.Pourconvertirlebinaireen


unevaleurdcimalepluslisible,ilfaututiliserlespuissancesde2,lapluspetitevaleurtantlaplusdroiteetest
appele bit de poids faible, la plus grande la plus gauche et est appele bit de poids fort. Dans lexemple
prcdent,lavaleurbinaire11peuttreconvertieainsi:

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

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

11 (2) =3(10)

Voiciundernierexempleavecunevaleurbinairecodesur8bits.Quelleestlaplusgrandevaleurdcimalequipeut
trecodeavec8bits?

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

Donc

11111111 (2) =255(10)

Soit256valeurspossiblesde0(zro)255,cequipeuttreplussimplementcalculpar2n ,soitdeuxpuissancen,n
tantlenombredebitscontenusdanslavaleurbinaire.Laplusgrandevaleurconvertieendcimalestdonc:

2 n 1
Il est possible de convertir du dcimal en binaire avec des divisions successives : on divise les rsultats sans la
virgulesuccessivementpardeux.Lersultatbinaireseralajuxtapositiondesrestes(0ou1)saufpourledernier.Par
exempleaveclenombre183:

183/2=91,reste1

91/2=45,reste1

45/2=22,reste1

22/2=11,reste0

- 4- ENI Editions - All rigths reserved - Jonifar lina


6
11/2=5,reste1

5/2=2,reste1

2/2=1,reste0

Onremontedudernier:10110111

Conversiondcimaleenbinaire

Cestdoncenbinairequesontreprsentestouteslesvaleursquunordinateurmanipule.Cestvalabletantpourles
donnes (numriques ou texte) que pour les instructions destination du microprocesseur. Un nombre binaire
correspondrauneinstruction.Parexemplesurunmicroprocesseurx86(IntelouAMD),01110100estlinstructionje
(jump if equal), ou encore la ligne 10110000 01100001 qui signifiemov $0x61, %al (placer la valeur hexadcimale
0x61dansleregistreAL).

Lesordinateursdudbutdesannes2000saventmanipulerdesnombressur64bitsor2 64 estgal18446744
073709551616soitplusde18milliardsdemilliards!

Lide dutiliser deux valeurs pour encoder dautres valeurs remonte Francis Bacon. En 1623, il cherche une
mthode stganographique pour pouvoir crypter un texte compos des lettres de lalphabet. Il remarque quun
assemblage de deux lettres groupes par cinq permet de coder lensemble de lalphabet. Il appelle cet alphabet
"bilitre".Le"a"taitreprsentpar"AAAAA",le"B"par"AAAAB",jusquau"Z","BABBB".Lalphabetdelpoque,le
latin,contenaitvingtquatrelettres,le"j"seconfondantavecle"i"etle"u"avecle"v".

b.Lesoctetsetlesmots

Un ordinateur sait manipuler individuellement chaque bit dune valeur. Mais les bits ne sont pas stocks
individuellement dans une case mmoire. Ils sont regroups, gnralement par multiples de huit (8). Ainsi un
ensemblede8bitsestappelunoctet.Lavantagedeloctetestquilsuffit(ouentoutcasalongtempssuffi)pour
reprsentertousleschiffres,lettresetsymbolesdesalphabetsoccidentaux.Unoctetreprsentelesvaleursde0
255.
Aveclaugmentationdesespacesdestockages,delaquantitdemmoire,dubesoindereprsentationdenombres
deplusenplusgrands,dunaccsplusrapidelammoireouencoredeplusdinstructions,ilafalluaugmenterla
tailledesvaleursmanipuler.De8,puis16,puis32,certainsmicroprocesseurspeuventmanipulerdesvaleursde64
voire128bits,parfoisplus..Cesvaleursdeviennentdifficilesdcrireetreprsenter.Pourcesvaleurs,onparlede
motmmoire(wordenanglais).Certainsmicroprocesseursfontunediffrenceentrediverstypesdemots.Ceuxde
Motorola comme les 68000 (qui quipaient ls ordinateurs Atari ST, Amiga, les consoles Sega Megadrive et plus
rcemmentlesPalmPilot)utilisentdesmotsde16bits,etdesmotslongs(longword)de32bits.
Les instructions et les donnes sont donc codes sous forme de nombres binaires quon appelle des mots.
Cependant suivant le type de microprocesseur lordre des mots est diffrent entre la ralit et son stockage en
mmoire.Avecunmicroprocesseurx86enmoderel(16bits)lenombredcimal38457ncessite16bitssoitdeux
octetsouunmotdeseizeoctetspourtrereprsent:

38457 (10) =1001011000111001(2)

Pour stocker cette valeur en mmoire, les 8 premiers bits de poids faible, soit loctetdepoidsfaible,serontplacs
dans la premire case mmoire, et les 8derniers bits de poids fort, soit loctet de poids fort, seront placs dans la
casesuivante.Ladmarcheseraitlammeen32bitsou64bits.

Casemmoire1 Casemmoire2

00111001 10010110

ENI Editions - All rigths reserved - Jonifar lina - 5-


7
c.Lhexadcimal

Sivousreprenezlexempledunevaleurbinairecodesur64bits,ilfaut640ou1pourladcrire:
1111111111111111111111111111111111111111111111111111111111111111

Endcimalilfautvingtchiffres:18446744073709551616
a prend beaucoup de place et cest difficile manipuler. Puisquil existe une base 10 (dcimal) et une base 2
(binaire),pourquoinepasprendreunebaseplusleve,multiplede2,pourrduirelalongueuretlamanipulationde
cesnombres?Cestainsiqueninformatiqueilestdusagedutiliserlabase16,appelehexadcimale.
Une base hexadcimale permet de coder les valeurs de 0 15. Si de 0 9 on utilise les valeurs dcimales
correspondantes,audessusilfaututiliserdeslettresdelalphabet,deA(10)F(15).
Commentpasserdubinairelhexadcimal?Cecirevientrpondrelaquestion"Combienfautildebitsdansun
nombrebinairepourcoder16valeurs?"24 =16.Ilfautdonc4bits.Letableausuivantrsumelesconversions.

Dcimal 0 1 2 3 4 5 6 7 8 9 10

Hexa 0 1 2 3 4 5 6 7 8 9 A

Binaire 0 1 10 11 100 101 110 111 1000 1001 1010

Dcimal 11 12 13 14 15

Hexa B C D E F

Binaire 1011 1100 1101 1110 1111

Sivousreprenezlenombre183quincessite8bitssoitunoctet,saconversiondonneB7enhexadcimal.Ondit
doncque:

183 (10) =B7(16)

dudcimallhexadcimal

Si vous prenez la valeur maximale en 64 bits, cela donne FFFFFFFFFFFFFFFF soit 16 caractres. Un informaticien
exercestquasimentcapabledeconvertirlavoledelhexadcimalendcimal.Prenezlavaleur8Csoit10001100
enbinaire.LeCvaut12.
8*16+12=140

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

- 6- ENI Editions - All rigths reserved - Jonifar lina


8
Lalgorithmique

1.Programmer,cestunart

Pourobtenirunrsultatdonn,ilfautgnralementsuivreunemthode,unecertainelogique.Sauftreungrand
ptissierdontlasciencedesmlangesdesingrdientsestinne(oulefruitdunelonguepratique),vousnobtiendrez
jamaisundlicieuxgteauauchocolatmmesivousdisposezdesmeilleursingrdientsetaccessoiresdecuisson,si
vousneconnaissezpaslesbonnesproportions,lordredanslesquelsajouterlesingrdients,letempsdecuisson,la
temprature:bref,larecette.Demme,sansformationdemcanicienousansladocumentationtechniquedumoteur
devotrevhicule,inutiledevouslancerdansunchangementdejointdeculasse:cestlacasseassure.
Il en est de mme de la programmation. Il existe plusieurs langages de programmation trs simples, extrmement
simples parfois, qui peuvent donner un temps lillusion que vous savez programmer. En entreprise mme, certains
employssontbombardsdveloppeurspourleursquelquesconnaissancesconfusesdeVisualBasic,deDelphioude
Windev. Le rsultat risque dtre catastrophique. Les publicits sont allchantes mais trompeuses. Les bons
programmeurs, y compris les autodidactes, ont tous un moment ou un autre eu affaire avec les algorithmes, car il
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
niveaudelaprogrammation)alorsquecenesontpaslesmmesprogrammeursquilesontdvelopps.Lesdbutants
qui se lancent dans des projets de programmation audacieux se retrouvent parfois bloqus, ne matrisant pas une
technique particulire de logique de programmation. Certains abandonnent, dautres trouvent un moyen de
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
directement dans la machine (en ROM), soit sur une cartouche, cassette ou disquette annexe. Le Basic de Microsoft
(Qbasic,Quickbasic)taitlivravecleDOSduPC.LesAmstradavaientlebasicLocomotive,lesAtariSTlAtariBasicet
surtout le GFA Basic, un langage de grande classe, etc. Une gnration complte dutilisateurs sest lance dans la
programmationlaidedeceslangagesetdeladocumentationfourniequibiensouventfournissaitnonseulementles
rfrencesdulangagemaisaussilesmthodesdebasedeprogrammation.Avecplusoumoinsdesuccs.Lersultat
taitsouventuninfmebidouillage,maisquimarchait.

Orlebutnestpasqueleprogrammefonctionne,maisquilfonctionneviteetbien,breflemieuxpossible.Lemeilleur
ordinateuraumondeetlemeilleurlangageaumondenevousyaiderontpas.

2.Dfinition:Lalgorithmeestunerecette

Avezvous dj eu loccasion de programmer un magntoscope (en voie de disparition) ou un enregistreur de dvd ?


Quavezvousfaitlapremirefoisquevousavezallumvotrepostedetlvisionpourrglerlarceptiondeschanes?
Nuldoutequevousavezouvertlemodedemploietsuivilasquencedinstructionsindique:appuyersurlatouche
Menudelatlcommande,sedplacersurEnregistrementetappuyersurOK,sedplacersurunelignepuisindiquer
lachane,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,incorporezlesjaunesdoeuf,puisle
sucreetlafarine,battezlesoeufsenneigepuisincorporezdoucementdanslemlange,etc.

Danslesdeuxcas,flicitations!Vousavezdroulvotrepremieralgorithme!
Une dfinition simple dun algorithme : cest une suite dinstructions qui, quand elles sont excutes correctement
aboutissentaursultatattendu.Cestunnoncdansunlangageclair,biendfinietordonnquipermetdersoudre
unproblme,leplussouventparcalcul.CettedfinitionestrapprocherdufonctionnementdelamachinedeTuring
quiavantlapparitiondelordinateurutilisaitcettedmarchepourrsoudredenombreuxproblmes.Lalgorithmeest
doncunerecettepourquunordinateurpuissedonnerunrsultatdonn.
LemotalgorithmevientdunomdumathmaticienAlKhuwarizmi(MuhammadibnMsalKhuwrizm),savantpersan
duIX m e sicle,auteurdunouvrageappel"Latranspositionetlarduction",Aljabrwalmuqbalah.LemotAljabr
deviendraalgbre,lenomdelauteurseralatinisenAlgoritmi,quiseralabasedumotalgorithme.

3.Pourquoiutiliserunalgorithme?

Lalgorithmedcritformellementcequedoitfairelordinateurpourarriverunbutbienprcis.Cesontlesinstructions
quon doit lui donner. Ces instructions sont souvent dcrites dans un langage clair et comprhensible par ltre
humain:fairececi,fairecelasilersultatatellevaleur,etainsidesuite.

Unalgorithmebientablietquifonctionne(toutaumoinsenthorie)pourratredirectementrcritdansunlangage

ENI Editions - All rigths reserved - Jonifar lina - 1-


9
deprogrammationvolucommeleC,JavaouPHP.Malheureusement,enprogrammationcestsouventlhommede
semettreauniveaudelamachine.

Delarflexionlaprogrammation

Plus que cela, un algorithme dcrit une mthode de rsolution de problmes courants. Un algorithme est donc
rutilisable,saufcasponctueloutrsprcis.Ilexisteplusieursmoyensdobtenirunmmersultat,maiscertainssont
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 importantes de
donnes.
Lamatrisedelalgorithmiqueetlapprentissagedesalgorithmesdebasesontunedesconditionsdelarussitedun
projet en programmation, quil soit personnel ou professionnel. Lexprience aidant, vous allez acqurir au fur et
mesuredesmcanismesdepensequivouspermettrontdoptimiserlestraitementsquevousdevezprogrammer,tant
envitessequenoccupationmmoireoummeenquantitdelignesdeprogrammation.Surcedernierpoint,ilexiste
denombreuxcasodesalgorithmeslongsetcomplexessontplusperformantsquedautressemblantpluspratiques
aupremierabord.

Apprendre lalgorithmique (ou lalgorithmie, les deux sont autoriss) cest donc apprendre programmer dans les
rglesdelart.Toutaulongdecetouvrage,vousallezdcouvrirlesnotionslmentairesquivouspermettronttantde
comprendre le fonctionnement interne dun programme que de le concevoir, laide dune progression simple et
constanteetdexemplespratiquesetcomprhensibles.

4.Leformalisme

Lebutdunalgorithmetantdedcrireuntraitementinformatiquedansquelquechosedecomprhensibleparlhumain
(etfacilementtransposableverslamachine),pourquunalgorithmesoitcomprhensible,ilfautquilsoitclairetlisible.
Danscecasilexistedeuxmoyensefficaces:

soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela),

soitdefaireunschmaexplicatifavecdessymboles.

Dans la pratique, les deux formes sont possibles. Mais un dessin ne vautil pas un long discours ? Il est dailleurs
courant de commencer par un schma, puis quand celuici devient trop complexe, de passer un texte explicatif (la
recette).

Danslesdeuxcas,lasyntaxepourletexteoulessymbolespourlesschmasdoiventrpondredesrglesstrictes,
voirenormalises.Ilfautquechacunconnaisseleursignificationetsachedonclesinterprter.Cestpouraquetoutes
lesreprsentationsalgorithmiquessuiventpeudechosesprslemmeformalisme.Silesschmassontpossibles,ils
sontcependantmoinsutilissquelesalgorithmessousformetextuelle.Cestquesivousconstruisezunalgorithme,il
est plus facile de le corriger quand il est saisi au clavier sous forme de texte que lorsquil est dessin sous forme
dorganigrammedansunlogicieldedessinvectorieloudeprsentation.

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).Voiciun
exemple dalgorithme sous forme dorganigramme qui simule un lanc de d et qui demande une personne de
devinerlavaleur.

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


10
Unformalismequioccupetropdeplace

Danscetexemplesimplifi,lestraitementssontdansdesrectangles,lesprisesdedcisiondansdeslosanges,etles
flches reprsentent lordredudroulementduprogramme.Siunevaleurestprsentectdelaflche,laction
dpenddursultatdelaquestionposedanslelosange.Lesdcisionsetlesflchespeuventdcriredesboucles.
Dansleschma,tantquelutilisateurnapassaisilabonnevaleur,laquestionluiestdenouveaupose.
Cetalgorithmeesttrssimple,lorganigrammeaussi.Cependantvoyezdjlatailledeceluici(laplacequilprend)
parrapportcequilfait.Imaginezmaintenantunalgorithmepluscomplexequidoitparexempledcriretouslescas
defiguredanslagestiondunecommunicationentredeuxmachines(descriptiondunprotocoledecommunication):
leschmancessiteraunefeuilledunegrandedimensionetseradifficiletudier.

b.Lalgorithmesousformedetexte

Prenezlemmenoncdulancded.Celuicipourraittrecritainsienfranaiscorrect:

1retape:lancerled

2metape:saisirunevaleur

3me tape : si la valeur saisie est diffrente de la valeur du d, retourner la troisime tape, sinon
continuer

4metape:afficher"bravo".

Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprend

ENI Editions - All rigths reserved - Jonifar lina - 3-


11
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

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

Si vous comprenez dj le programme cidessus alors cet ouvrage vous sera encore plus agrable lire. Sinon, la
suite vous donnera de toute faon toutes les explications ncessaires la comprhension de chaque ligne de cet
algorithme.Ilreprenddemaniretrsdtailletouteslestapessuivre.Souscetteforme,ilestpresquepossible
dimplmenterlalgorithmelignelignedansunlangagedeprogrammationvolu.
Cest sous cette forme textuelle que les algorithmes seront reprsents dans ce livre. Ce texte, programme ou
pseudocodealgorithmique,estdcomposenplusieursparties:

Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME".

Unezonededclarationdesdonnesutilisesparleprogrammes:variables,constantes,types,structures,
tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuretmesuredes
diffrentschapitres.Cettezonecommenceparlemot"VAR".

Le programme luimme, cestdire les divers traitements. Les instructions du programme sont encadres
parlesmots"DEBUT"et"FIN".Ilvousestconseill,pourplusdeclartetdelisibilit,dindenterlesdiverses
lignes(delesdcalerlesunesparrapportauxautres)laidedestouchesdetabulation.Leprogrammepeut
tredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance.

Lescommentaires:cestuntextelibrequipeuttretendusurplusieurslignesetencadrparlessquences
de caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvez uniquement la
commencerparlescaractres"//".

Unedernirepartie,oupluttpremirecarlorsquelleestprsenteellesesitueavanttouteslesautres,peut
tre constitue des sousprogrammes, semblants de programmes complets appels par le programme
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
cotserapluslev.Ilexistecertainscasoilestpossibledutiliserplusieursalgorithmespoureffectuerunemme
tche,commepourtrierleslmentsduntableaudevaleurs.Certainsalgorithmesservlenttrepluscoteuxque
dautres,passuncertainnombredlmentstrier.Lecotdunalgorithmerefltesacomplexitouentermeplus
simplesonefficacit.Lesmots"cot","complexit"et"efficacit"refltenticilammedfinition.Plusunalgorithmeest
complexe, plus il est coteux et moins il est efficace. Le calcul de cette complexit a comme rsultat une quation
mathmatiquequonrduitgnralementensuiteunenotiondordregnral.

LacomplexitestnotO(f(n))oleO(grandO)veutdire"dordre"etfestlafonctionmathmatiquedenquiestla
quantitdinformationsmanipuledanslalgorithme.Voiciunexemplepourmieuxcomprendre:soitunalgorithmequi
compte de 1 n et qui affiche les valeurs correspondantes. Dans la pratique, vous allez utiliser une boucle (voir
chapitrecorrespondant)allantde1n.Ilfaudrafairenpassagespourtoutafficheretdoncvousallermanipulernfois
linformation.Lafonctionmathmatiquedonnantlecotseraalorsf(n)=n.Lacomplexitestalorslinaireetvousla
noterezO(n).

- 4- ENI Editions - All rigths reserved - Jonifar lina


12
Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexempleune
tabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvousobtenezn
fois n boucles, donc n2 boucles. La complexit est donc f(n)= n2 , et vous la noterez O(n 2 ). Le cot de lalgorithme
augmenteaucarrdunombredinformations.
Sivousrajoutezenplusunequelconqueoprationdanslapremireboucle,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)soitn2 +n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetque
vous comparez avec la courbe simple n2 , vous remarquerez que le rajout devient ngligeable. Au final, lalgorithme
conserveunecomplexitO(n2 ).

Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies":

O(1):complexitconstante

O(log(n)):complexitlogarithmique

O(n):complexitlinaire

O(n.log(n)):complexitquasilinaire

O(n2 ):complexitquadratique

O(n3 ):complexitcubique

O(np ):complexitpolynomiale

O(nlog(n) ):complexitquasipolynomiale

O(2n ):complexitexponentielle

O(n!):complexitfactorielle

Cescomplexitsnesontpasforcmentfacilesapprhender,aussivoiciungraphiquereprsentantquelquesunesde
cellesci. En abscisse est indiqu le nombre de donnes traiter et en ordonne la complexit associe: le nombre
doprations effectues pour n donnes. Pour des complexits dordre O(2n ) lalgorithme effectue dj 1024
oprations,etplusde3,5millionspourO(n!)!

ENI Editions - All rigths reserved - Jonifar lina - 5-


13
Courbesdecomplexit

Commentsereprsenterrellementunecomplexitentermedetempspassparlordinateurtraiterlesdonnes?
Chaque microprocesseur est capable de traiter un certain nombre doprations par seconde. Le plus long tant
gnralement les calculs sur les rels (flottants), le critre souvent retenu pour dterminer la puissance brute dun
processeurestleFLOPS:FloatingPointOperationsPerSecond.UnIntelPentium43.2GHztourneunemoyenne
de3,1GFLOPS(GigaFlops)soit109 FLOPS,ouencoreunmilliarddoprationssurrelsparseconde.Sivoustraitez20
donnesdansunalgorithmedecomplexitO(n),lavitessedecalculsechiffreenmillionimesdeseconde.Lemme
nombrededonnesdansunalgorithmedecomplexitO(n!)doiteffectuer2432902008176640000oprationscequi
prendra784807099secondes,ouencoreunefoisconvertiautourde25ans!Bienentendu,unecomplexitO(n!)estla
pire qui puisse exister. Avec une complexit infrieure O(2n ), le traitement prendrait un dixime de seconde tout de
mme,cequiestnormeetrelativisefortementlapuissancedesprocesseurs

Vouscomprenezmaintenantlutilitdeconnatrelacomplexitdesalgorithmesetdoptimiserceuxci
Danslasuite,lescomplexitsneserontfourniesquedanslescasolestraitements,pluscompliqusquedhabitude,
sont en concurrence avec diverses mthodes. Cest le cas par exemple des mthodes de tris sur des tableaux. Ceci
dansluniquebutdevousdonnerunsimpleordredide.

- 6- ENI Editions - All rigths reserved - Jonifar lina


14
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,en
loccurrencelefameuxHelloworld!.Voicicommentaffichercetextedansdiverslangages:

Enassembleurx86sousDOS

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

EnshellUnix

echo "Hello world!"

EnBasicoriginel

10 PRINT "Hello world!"


20 END

EnCOBOL

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

EnlangageC

#include <stdio.h>

int main(int argc, char **argv)


{
printf("Hello world!\n");
return 0;
}

EnlangageC++

#include <iostream>

ENI Editions - All rigths reserved - Jonifar lina - 1-


15
int main()
{
std::cout < "Hello world!" < std::endl;
return 0;
}

EnPHP

<?php
print ("Hello world!");
?>

EnJava

public class HelloWorld {


public static void main(String[] args) {
System.out.println("Hello world!");
}
}

EnVisualBasic

Sub Main()
MsgBox("Hello world!")
End Sub

EnPascal

program Bonjour;
begin
WriteLn(Hello world!);
end.

2.Classificationsdeslangages

Queremarquezvous?Ilyaautantdesyntaxesdiffrentesquilexistedelangages.Cependantvousconstatezque
leslangagesC,C++,JavaouPHPontdenombreusesressemblances,alorsquelassembleurouleCOBOLsemblent
sortis douvrages de ScienceFiction. Cest que les premiers ont quelques liens familiaux tandis que les autres sont
radicalementopposs.

a.Hautniveau,basniveau

Puisquilexistedescentainesdelangagesdeprogrammation,lequelchoisirpourimplmentervosalgorithmes?Ilny
apasderponsesimplecettequestion.Chaquelangageatgnralementconupourdesusagesdiffrentset
souventspcifiques,bienquenvoluantlaplupartdeslangagesditsdehautniveausoientdevenusdeplusenplus
gnralistes. Il existe plusieurs classifications des langages. La plus ancienne dpend de laffinit du langage par
rapportlamachine.Onparlealorsduniveaudulangage.Ilestcourantdeparlerdunlangagedebasniveauoude
niveau zro (0) quand celuici ncessite des connaissances approfondies du fonctionnement de votre ordinateur :
mcanismes de gestion de la mmoire, instructions du microprocesseur, etc. Un exemple de langage de trs bas
niveau est le langage machine sous sa forme binaire, ou de le la programmation en assembleur o ces mmes
valeurs binaires sont reprsentes par des mots (mnmoniques) en anglais. Vu que les programmes sont
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
courantjusqulapparitiondesmachinestrsrapidesoleurvitesseacompensuneplusfaiblevitessedexcution
dunlangageplusvolucommeleC,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(oupluttsoncompilateurousoninterprteur)sechargeradeconvertirvosordressimples(enapparence)
en langage de bas niveau (en langage machine). Ne vous fiez pas aux apparences : laffichage dune bote de

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


16
dialogueprendunelignedelangagedehautniveau,maisdescentainesenassembleur!Parmileslangagesdetrs
haut niveau se trouvent Java, C#, le PHP, ou mme le C (en faisant abstraction de certains mcanismes).
Linconvnientdunlangagedehautniveauestquilnestpastoujourspossibledallerdanslesdtailslesplusfins.

b.Diversesclassifications

ctdesniveaux,tousleslangagesnontpaslemmebut.IlnestpaspossibledecomparerlelangageHTMLdont
le rle est de formater des pages web et le Visual Basic qui permet un dveloppement rapide dapplications
graphiques.Cestpourquoiilexistedautresclassificationsdontvoiciunbrefchantillon:

gnralisteouspcialis

objetouprocdural

typounontyp(cfchapitresurlesvariables)

interprtoucompil

etc

Certains langages sont spcialiss. Le HTML est spcialis dans la conception de pages web statiques : son
excutionacommersultatdirectlaffichagedunepageHTMLquilamisenforme.LeSQLestunlangagedebasede
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
langage est dit compil quand le programme source sous forme de texte est tout dabordluettraitparunautre
programme appel compilateur qui le convertit en langage machine directement comprhensible par lordinateur.
Voustapezvotreprogramme,vouslancezlacommandedecompilationetenfinvousobtenezunfichierexcutable
(un.exesousWindowsparexemple)quevouspouvezlecaschantlancercommenimportequelautreprogramme
enlangagemachine.Unprogrammeenlangageinterprtncessitepourfonctionneruninterprte(ouinterprteur)
quiestunautreprogrammequivatraduiredirectement,aufuretmesuredesonexcution,votreprogrammeen
langagemachine,unpeucommeunvraiinterprtequidansuninterviewtraduitsimultanmentlanglaisenfranais.
Le programme est souvent un fichier texte, et linterprte analyse la syntaxe de celuici avant de le drouler
dynamiquement.Unprogrammeinterprtserapluslentquunlangagecompilcausedelaconversiondynamique
duprogramme,alorsquecettetapeestdjeffectulavanceavecunlangagecompil.Aucontraire,lacorrection
deserreursestplussimpleavecunlangageinterprt.Linterprtevavitevousindiqueraucoursdelexcutiono
se trouve lerreur de syntaxe (mais pas de logique) lorsquil va la rencontrer, quelle ligne, linstruction en cause,
ventuellementuneaidesupplmentaire.Alorsquavecuncompilateur,cestaumomentdelacompilation,souvent
longue, quapparaissent les erreurs. Une fois compil, dautres erreurs plus complexes comme les fuites mmoire
peuvent apparatre mais il devient difficile den dterminer lorigine (il faut alors faire appel dautresprogrammes
spciauxappelsdbuggers).

ENI Editions - All rigths reserved - Jonifar lina - 3-


17
tapesdecompilationetdditiondesliensenC

3.Lamachinevirtuelle

Ilexisteunetapeintermdiaireentrelinterprtetlecompil:lamachinevirtuelleapplicative.Lamachinevirtuelle
estunprogramme,gnralementuninterprteur,quipermetdisolerlapplicationquildoitfairetournerdumatrielet
mmedusystmedexploitation.Leprogrammenathoriquementaucunaccsauxspcificitsdumatriel,lensemble
desesbesoinsluitantfourniparlamachinevituelle.Ainsi,toutprogrammeconupourcettemachinevirtuellepourra
fonctionnersurnimportequelordinateur,dumomentqueladitemachinevirtuelleexistepourcetordinateur.Cesten
quelquesorteunecouchedabstractionultime.Gnralement,leprogrammefonctionnantdepuislamachinevirtuellea
djsubiunepremirephasedecompilationpourletransformernonpasenlangagemachineproprelordinateur,
mais dans un langage "machine virtuelle" pour ainsi dire, que lon nomme bytecode. Ce bytecode pourra tre
interprtparlamachinevirtuelle,ouplutt,etcecideplusenplusrgulirement,compillavolejusteaumoment
desonutilisation(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 - Jonifar lina


18
GnrationetexcutiondebytecodeJava

Pour implmenter vos algorithmes, il vous faut trouver un langage simple, de haut niveau, gnraliste mais vous
permettantparlasuitedvoluerversdesapplicationspluscomplexesetcompltes.Dansunespritdouvertureetde
compatibilit,ilseraitintressantquecelangagenesoitpasdisponibleuniquementsousWindows,etquesipossible
le programme rsultant puisse fonctionner sur plusieurs systmes dexploitation sans avoir le modifier, ni le
recompiler. Parmi les langages qui pourraient convenir, il y a C# (prononcer C Sharp) et Java. Le premier, issu de la
technologie .NET de Microsoft, tait lorigine destin uniquement aux plateformes Windows (.NET tait dcrit
multiplateforme, ce qui selon Microsoft signifiait compatible avec la plupart des versions de Windows, pas les autres
systmes comme MacOS ou Unix). Une implmentation libre et fonctionnant sur un grand nombre darchitectures
matrielles et de systmes dexploitationestdisponiblesouslaformede Monoquiproposelaplupartdeslments
de.NET.Maiscertainsdeceuxcisontprotgspardesbrevets(lesbrevetslogicielsnesontpasvalidesenEurope)et
nysontpastousintgrs.AussiilexistelesprogrammesenC#quipourraientnepasfonctionneravecMono.Ilfaut
donctemporairementmettrecelangagelcart.

4.Java

a.Lesavantages

Java, cependant, dispose de toutes les qualits ncessaires. Bas sur une machine virtuelle (tout comme Mono,
dailleurs), il suffit que celleci soit intgralement disponible pour la plupart des environnements matriels et des
systmesdexploitationpourquetoutprogrammeJavafonctionnesansaucunemodification.Cestlecas.Dvelopp
originellement par Sun Microsystems, le langage Java, sa machine virtuelle et tout son environnement (ce quon
rsume par la "Technologie Java") sont disponibles pour Windows mais aussi pour MacOS, Linux et la plupart des
autresUnix(Solaris,AIX,HPUX,Tru64,etc).ToutprogrammeenJavafonctionnerasurtouscessystmes!Mieux,si
voustesamateurdelibertetdelogicielslibres,sachezquelaversion7(prvueen2008)seralapremireversion
disponiblesouslicenceGPL.
Il existe plusieurs versions de Java. Celle qui vous intresse en priorit dans le cadre de ce livre est la version
standard, ou SE (Standard Edition). Vous pouvez tlcharger Java depuis le site de Sun Microsystems ladresse
http://java.sun.com/javase/downloads/index.jsp.Quandcelaserapossible,chaquealgorithmeprsentparlasuite
seraimplment(programm)enJava.Pourquoicelangageestilintressantpourlesdbutants?

ENI Editions - All rigths reserved - Jonifar lina - 5-


19
Ilestgratuit.

Ilestdisponiblepourbeaucoupdemachinesetdematriels.

ToutprogrammeJavafonctionnerasurtouteslesmachinesvirtuelles,sansmodification.Ilestindpendantde
laplateforme.

IlexistedenombreuxditeursetIDE(IntegratedDevelopmentEnvironment)supportantoutantspcialiss
pourJava.

Ilestutilispardesmillionsdepersonnes.

Il est rput sr, ne pouvant thoriquement pas accder au systme dexploitation ou la machine elle
mmesansautorisationexplicite.

Il dispose dune immense collection de bibliothques, rpondant presque tous les besoins. Il est mme
possibledeprogrammerdesjeuxen3Ddetypecommercial.

Il est lun des piliers du web grce aux fameuses applets, aux servlets mais permet la programmation
dapplicationstrscompltes.

Il fait totalement abstraction du matriel pour se concentrer sur la program mation fonctionnelle. Par
exemple, vous navez absolument pas vous proccuper de la gestion de la mmoire (la plaie des
programmeurs),Javalefaitpourvous.

IlestdrivdulangageC++,sanssescomplications.UnprogrammeurCetC++peutfacilementcomprendre
Java,demmequunprogrammeurJavapourraapprendreplusfacilementleC++.

Ilestobjet,notionquiserasommairementtudieenfindouvrage.

Il peut fonctionner tant en mode texte (depuis une console MSDOS ou un shell MacOS/Unix) quen mode
graphique.

Ilestrapide,grceauprincipeduJIToudecompilationlavole.

SilfautciterunseuldfautdeJava(maispasforcmentleseul,riennestparfait),cestquilestpluttgourmanden
ressourcesdelamachine,surtoutlammoire.Pourlesexemplesdecelivre,videmmentcelaneseressentirapas.
Maissivouscommencezdvelopperdetrsgrosprogrammes,alorsunexcsdemmoireneserapasinutile.

Comme les algorithmes de ce livre seront aussi rimplments en Java vous devez disposer du minimum vous
permettant de taper le code (texte), cestdire dun diteur. Lditeur de texte de base de votre systme
dexploitation suffira, comme notepad sous Windows, gedit/kedit sous Linux, etc. Il existe cependant un trs bon
diteurdveloppenJava,destinauxprogrammeurs.Vousletrouverezladressehttp://www.jedit.org/.
videmment, il vous faut aussi le ncessaire pour compiler (en bytecode) et excuter vos programmes (la machine
virtuelle).SurlesitedeSun,vouspouveztlchargerdeuxversions:leJDKetleJRE.LeJDK,JavaDevelopmentKit,
estceluiquevousdeveztlcharger,contenanttoutlencessairepourconcevoiretexcutervosprogrammes.Par
contre, une fois votre programme compil, vous pouvez nutiliser que le JRE, Java Runtime Environment, ce qui
pourraitsetraduireparenvironnementdexcutionJava.Ilnesertriendinstallerlesdeuxenmmetempssurla
mmemachine,puisqueleJDKinclutleJRE.

b.UnpremierprogrammeJava

LepremierprogrammeJavaquevousalleztaper,compileretlancerestlefameux"HelloWorld"dontlalgorithmene
mrite videmment pas dtre expliqu, vu que le programme se contente dun simple affichage. Le code Java
rsultantestlesuivant.

public class HelloWorld {


public static void main(String[] args) {
System.out.println("Hello world!");
}
}

- 6- ENI Editions - All rigths reserved - Jonifar lina


20
TapezceprogrammeetplacezledansunfichierappelHelloWorld.java.Cestimportant:lenomdufichierdoittre
identiqueaunomindiqusurlapremireligneduprogramme,justeaprslemotclass,auquelvousdevezajouter
lextension".java".

Pourcompilerleprogramme,oupluttletransformerenbytecode,ouvrezunefentreMSDOSsousWindows,ouune
console (ou terminal) shell sous Unix/MacOS, et tapez linstruction suivante l o votre programme est sauv. Le
programme javac (Java Compiler) va transformer votre programme source en bytecode Java. Le signe ">" indique
linvitedecommandeoupromptdeMSDOSoudushell,neletapezpas.

>javac HelloWorld.java

LeprogrammejavacadcrerdanslerpertoireunfichierappelHelloWorld.class.Sicenestpaslecas,vousavez
probablementfaituneerreurdesyntaxe,auquelcasjavacaaffichunmessagederreur.Vousdevezenfinexcuter
votre programme avec la commande java. Saisissez en argument le nom du programme HelloWorld sans
lextension".class".

>java HelloWorld
Hello world!

Bravo,vousvenezdefairefonctionnervotrepremierprogrammeJava.

La syntaxe du langage Java de ce premier programme peut surprendre le nophyte. Cest que des notions peu
videntes pour le dbutant y sont prsentes. Si on reprend le code source en mettant en italique les lignes qui
semblentneservirrien,ilnenrestequune!

public class HelloWorld {


public static void main(String[] args) {
System.out.println("Hello world!");
}
}

Vouspouvezfaireabstractionpourlemomentdeslignesenitaliquepourvousconcentrersurcequilyaentreelles,
cidessusengrasetquireprsentelecoeurduprogramme.Cependantilpeuttreutiledecomprendrecequeces
lignessignifient.Ellesapportentlesnotionsdeclasseetdemthode,rcurrentesdansleslangagesobjet.

Laclasseestllmentfondamentalcontenanttouslesautreslmentsdeprogrammation.Cestellequiva
contenirlesdonnesmanipulesparleprogrammeetlesinstructionspourlesmanipuler.Onappelleaussi
les donnes variables ou attributs. Dans ce livre, vous rencontrerez principalement le premier,
variable, qui sera expliqu plus bas. On appelle les blocs dinstructions qui manipulent les donnes des
fonctionsoumthodes.Lencore,cestpluttfonctionquiseraprfrdanscelivre.

La mthode dcrit les traitements informatiques de la classe. Elle sappelle aussi fonction ou fonction
membre. La fonction est compose dun nom qui dcrit gnralement ce quelle fait, dune liste de valeurs
quonpeutluipasserquonappelledesargumentsouparamtres(lensemblesappellelentte)etdunbloc
dinstructionsquicontientleprogrammeouunboutdeprogramme.

Il peut y avoir plusieurs classes dans un programme Java, quon regroupe gnralement en units fonctionnelles,
oprationnelles, cohrentes et souvent indpendantes. Chaque classe peut bien entendu contenir plusieurs
variablesetfonctions.

DansunprogrammeJava,lepointdentredelexcutionduprogramme,autrementditcequiseraexcut
enpremier,estlafonction"main"(principale)delaclassequiportelemmenomqueleprogramme.Dans
lexemple Hello World, cest la fonction main de la classe HelloWorld du programme HelloWorld qui sera
excuteenpremier.

Sitoutcecivoussemblecompliqu,etcestvidemmentcomprhensibleetnormal,sachezquecelivrenapaspour
butdevousapprendreJavamaisjustedesenservircommeexempledapplicationdesalgorithmes.Lesnotionsde
variables et de fonctions seront revues en dtail. Ce qui est important, ce sont les traitements contenus entre les
lignesenitalique,cestdireengras,selonlexemplecidessus.

ENI Editions - All rigths reserved - Jonifar lina - 7-


21
Lavariable

1.Principe

Voussavezgrceauchapitreprcdentcommentlordinateursereprsenteleschiffresetlesnombres:sousformede
binaire. De mme la mmoire de lordinateur, compose de cases, peut contenir des informations, notamment ces
fameuxnombres.Enprogrammation,ilfautquelquechosedesimple,pratiqueetsouplemanipulerpourreprsenter
cesnombres.
Chaquecasedelammoireestnumrote.Silammoirefait,disons,256octets,etquechaquecasepeutcontenirun
octet,alorsilya256casesnumrotesde0255.Onpeutdoncobtenirlavaleurdunecasedepuissonnumro,en
disantquelacase74contientlavaleur212.Loasecomplique,cestquelammoiredevosordinateursatteintun
nombre trs important de cases. Avec 1 Go de mmoire, vous avez 1073741824 cases pouvant contenir chacune un
octet.Commentvoulezvousvoussouvenirdechaquenumrodecase?Cestbienentenduimpossible.
Siparcontrevousdonnezunnomouunetiquettechaquevaleurcontenuedanslacase,ouunesuitedevaleurs
de plusieurs cases, pour vous en rappeler plus facilement, cela devient bien plus vident. Cest ce quon appelle une
variable. En informatique, une variable est lassociation dune tiquette une valeur. Vous nommez la valeur. La
variablereprsentelavaleuretsesubstitutelle.Lavariableestdonclavaleur.Maiscommesonnomlindique,cette
valeurpeutchangerdansletemps,soitquelavariablenereprsenteplusla(oules)mme(s)case(s)mmoire,soit
quelavaleurdelacaseachang.

nevariableestunnomoutiquettedonnunevaleur(nombre,texte,etc).Cettevaleurpeutvarieraucours
U
dutemps:onaffecteunenouvellevaleuraunom,dolenomdevariable.

Quelnomdonnerunevaleur?Lenomquevousvoulezetqui,sipossibleestenrapportaveccequereprsentela
valeur.Cepeuttreunelettre,uneassociationdelettresetdechiffres,oudautressymboles.Leformalismedesnoms
desvariablesdpenddulangageutilis.Desfois,uncaractrespcifiqueindiqueletype(quevousrencontrerezplus
bas)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:

var

titre

Total

Somme_globale

Quandvousprogrammerez,vousveillerezvousrenseignersurlesconventionsutilisesparlelangagepournommer
vosvariables:certainsutilisentdessyntaxestrsparticulires,dautressontbeaucoupmoinsstricts.
Lavariablenestquunoutilpourlesalgorithmesetleprogrammeur,afinquilpuissesereprsenter"danslerel"les
donnes quil manipule. Si vous modifiez le nom "Somme_globale" par "Pomme_frite" partout dans lalgorithme ou le
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. Cest le
compilateuroulinterprteurquiferalaconversiondesnomsverslesadressesdescasesmmoirevotreplace.

Sivoussouhaitezvous"amuser"manipulerdirectementdesadressesmmoirenonpasparleurnommaisparleur
adresse, quelques langages le permettent. Directement, vous pouvez apprendre lassembleur(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...

ENI Editions - All rigths reserved - Jonifar lina - 1-


22
Lavariable:unetiquetteassocieunevaleurenmmoire

2.Dclaration

Pourexister,unevariabledoittredclare,cestdirequevousdevezindiqueraudbutdelalgorithmecommentelle
sappelleetcequelledoitcontenir.Eneffet,pourquelalgorithmeutilisevotrevariable,ildoitdjsavoirquelleexiste
et ce quelledoitcontenir.Ilnesagitpasicidedfinirlavaleurdelavariable,vouspourrezlefairedanslasuitede
lalgorithmeenluiaffectantunevaleur.Ilsagitdedonnersonnometdeprciserletypedevaleurquellepeutcontenir.
Lesvariablessedclarentaudbutdelalgorithme,avantleprogrammeluimmemaisaprslemot"VAR".

VAR
Variable1 :type
Variable2,variable3 :type
...

3.Lestypes

Unecasemmoirecontientgnralementunoctet,cestdireunevaleurde0255.Maisunevariablepeuttrsbien
contenirlenombre214862,lerel3,1415926,letexte"bonjour",etc.Doncunevariablenestpasuniquementdfinie
parlavaleurquellecontient,maisaussiparlaplacequecettevaleuroccupeetparlamaniredontlalgorithmevala
reprsenteretlutiliser: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

Placerdesnombresdanslavariableestleplusvident,etsouventlepluscourant.Unecasemmoirepeutcontenir
unoctet,cestdireunevaleurcompriseentre0et255(28 1).Maissielledoitcontenirunevaleurngative?Alors
surles8bits,unserarservausigne,etlacasemmoirepourracontenirdesvaleursde127+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
explications ncessaires pour comprendre comment lordinateur se reprsente exactement les nombres ngatifs et
rels:cenestpassivident!

Aufinal,lordinateurestcapabledegrerdesnombresdelongueurvariable,signsounon,entiersourels.Suivant
le langage de programmation, les types portent des noms diffrents. Cependant le C et ses drivs proposent les
typessuivants.AttentioncarJavafaitladiffrenceentreletypeBytedeunoctetetletypeCharquiprenddeuxoctets
causeduformatdecodagedescaractresenUnicode.

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


23
Typenumrique Plagedevaleurspossibles

Byte(char) 0255

Entiersimplesign(int) 3276832767

Entiersimplenonsign 065535

Entierlongsign(long) 21474836482147483647

Entierlongnonsign 04294967295


Ngatif:3,40x1038 1,40x1045
Relsimpleprcision(float)
Positif:1,40x1045 3,40x1038


Ngatif:1,79x10308 4,94x10324
Reldoubleprcision(double)
Positif:4,94x10324 1,79x10308

Vousdevezchoisirqueltypenumriqueutiliserselonvosbesoins.Lavoiedelafacilitconsisteprendreletypele
plus lev comme un entier long ou pire, un rel en double prcision afin dtre tranquille. En informatique comme
dans beaucoup de mtiers, il faut choisir la formule la plus conomique. On parle ici dconomie de moyens. Quun
programme donne le rsultat attendu nest pas suffisant, il faut aussi quil le fasse vite, bien et en consommant le
moins de ressources possibles. Le fait de disposer de plusieurs gigaoctets nest pas un critre suffisant pour
programmernimportecomment.Unelistedemillevaleurscomprisesentre0et100cotera1000octets(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. Cela peut sembler faible, mais non seulement lordinateur doit manipuler 8 cases mmoire au lieu dune,
mais en plus il doit en permanence convertir une valeur quil pense tre un nombre rel avec des chiffres aprs la
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
cependant tre plus circonspect quand vous convertirez votre algorithme en vrai langage de programmation. Dune
maniregnrale,deuxtypesnumriquessontutilissenalgorithmique:

Lesentiers:nombressansvirgule,ngatifsoupositifs

Lesrels:nombresvirgule,positifsoungatifs.

Lesvariablessedclarenttoutesaudbutdelalgorithme.Sidurantlardactiondeceluicivousremarquezquevous
enavezbesoindautres,vouslesrajouterezaudbut.

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" ou avec le point dcimal, cependant dans les langages de programmation, ce sera bien souvent le point qui
serautilis"3.14".

EnJava,lestypesportentlesmmesnoms,enanglais,destypessitusdansletableauprcdent,maisnedispose
pasdetypesnonsigns.Autrementdit,unevariablenumriquepeutcontenirdesnombrespositifsoungatifs,mais
lintervalledevaleurssetrouve"unpeu"rduite.Leseultypenonsignestletypechar(letypecaractre)pourdes
raisonsvidentesquevousverrezplusbas.

Dans lexemple suivant, tous les types numriques classiques de Java sont dclars. Les noms des variables sont
assezparlantspourlescomprendre.Puischaquevariablesevoitassignelavaleurmaximalequellepeutsupporter.
Ceprogrammeamnetroisremarques:

Lerel32bits(float)voitsadfinitionforce:lecompilateurindiqueuneerreursignifiantunrisquedeperte
deprcisionautrement.Ilestaussipossibledajouterun"D"lafinpourforcerundoubleouun"F"pourun
float,carJavaconsidrelesvaleursrellessaisiescommetantdutypedoublepardfaut.

ENI Editions - All rigths reserved - Jonifar lina - 3-


24
Javaconsidrelesvaleursentiressaisiescommetant32bitspardfaut.Pourunentiersur64bits,ilfaut
rajouterun"L"lafin,quisignifiequecettevaleurestunentierlong.

LaffichagedelavaleurdePIesttronqu,rsultatdelaprcisionappliquesurunrel64bitsetparJava.

class chap2_types {
public static void main(String[] args) {
byte entier8bits;
short entier16bits;
int entier32bits;
long entier64bits;
float reel32bits;
double reel64bits;

entier8bits=127;
entier16bits=32767;
entier32bits=2147483647;
entier64bits=9223372036854775807L;
reel32bits=3.1415927f;
reel64bits=3.1415926535897932384626433832795028841971d;
System.out.println(reel64bits);
System.out.println(entier64bits);
}
}

b.Autrestypesnumriques

Ilexistedautrestypesnumriquesmoinsutiliss,toutaumoinssurlesordinateurspersonnelsoudansdeslangages
deprogrammationclassiques,maisbienplussurdesmoyensougrossystmesoudansdesbasesdedonnes.Le
systmeBCDbinarycodeddecimalpourdcimalcodenbinaireestutilisprincipalementenlectroniquecarilest
assezsimplemettreen uvre.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 manipule que des octets
(compossde8bits),ilexistedeuxmthodespourcoderdesnombresenBCD:

soitnemettrequunchiffreparoctetetcomplterlerestequepardes1oudes0,"EBCDIC"

soitmettredeuxchiffresparoctet,etrajouterunsignelafin,"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.Cestdoncunentier,etlelangagedoitfournirdesinstructionspourconvertircettevaleurendate
relle.

c.Lescaractres

Siunordinateurnesavaitmanipulerquelesnombres,vousneseriezpasentraindelirecelivre,critlaidedun
traitementdetexte(OpenOffice.org),quiluimanipuletoutesortedecaractres:chiffres,lettres,caractresspciaux,
etc. Une variable peut aussi contenir des caractres. Suivant les livres et sites Internet, vous trouverez les types
"Alphanumrique","Caractre","Chane","String".Ainsiunevariablepeutstockervotrenom,unelignecompltede
texte,outoutcequevousvoulezquincessiteunereprsentationalphanumrique.Onappelledailleursunesuitede
caractresalphanumriqueunechanedecaractres.

Sivousdevezreprsenterunseulcaractre,utilisezletype"caractre".Pourunechane,utilisezletype"chane".

VAR
texte:chane
car:caractre

- 4- ENI Editions - All rigths reserved - Jonifar lina


25
Quelle place occupe une chane de caractre ? En principe, un caractre occupe un octet. chaque valeur comprise
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 lorigine les 128 caractres utiles pour crire en anglais. Par dfaut elle ne contient pas les
accents.OrlatableASCIIpeutcontenir256caractres.Les128autres(huitimebitun)contiennentdescaractres
semigraphiques et des caractres spcifiques certaines langues, typiquement le franais, pour les caractres
accentus.Onparlealorsdepagedecodeoudecharset.Cespagesfontlobjetdunenormalisation,parexemplela
normeISO885915quiestlapagedEuropedelOuest,aveclecaractredeleuro"".Danslaplupartdeslangages
cecodagesurunoctetsuffitetainsiunechanedecaractresde50caractresoccupe50octets.

Enpseudocodealgorithmique,leschanesdecaractressontplacesentreguillemetspourdeuxraisons:

1. viteruneambigutentrelesnombressousformedechanedecaractresetlesnombres
auformatnumrique.Certainslangagesnefontcertespasdirectementladiffrence(cest
selonlecontextedutilisation)maisavecdautrescestcatastrophique.Lasuitede
caractres1,2,3reprsentetellelenombre123etstockeainsienmmoiresousforme
binairedansunoctetdelammoire,oulachane"123"stockeainsienmmoiresous
formedecodesASCII,soitunpourchaquecaractre?Lesguillemetsvitentleserreurs
dinterprtations.

2. Nepasconfondrelenomdelavariableavecsoncontenu,notammentlorsduneaffectation.
Ainsi,quandvousaffecterezunvaleurunevariable,sicelleciestentreguillemetsvouslui
affecterezunechanedecaractres,sicestunnombre,ceseracenombre(sachantquele
nomdunevariablenepeutpastreconstituuniquementdechiffres),etenfinsicenestni
unechaneniunchiffre,cestunevariable.Danscecaslapremirevariablerecevracomme
valeurcelledelasecondequiluiestaffecte.Nepasrespecterceprincipeestunecause
derreurgraveetnanmoinscommune.
Javadisposeduntypespcialpourleschanesdecaractresappel"String".Lexemplesuivantmontredeuxmoyens
deplacerdutextedansunechane.Ilestpossibledelefairedsladclarationdelavariable(cestdailleurspossible
directementpourlaplupartdestypes),soitensuiteparaffectation.

class chap2_string1 {
public static void main(String[] args) {
String texte="Hello World !";
String text2;

text2="Bonjour les amis";


System.out.println(texte);
System.out.println(text2);
}
}

d.Letypeboolen

Pourdterminersiuneaffirmationestvraieoufausse,lordinateurdoitsebasersurlersultatdecetteaffirmation.En
informatique, on emploie plus volontiers la notion dexpression et dvaluation de cette expression. Une expression
peuttredcritecommetanttoutcequipeutfournirunevaleurquelordinateurpeutdterminer,stocker,valuer.
Par exemple, laffirmation"a>b"selonlaquelleaestsuprieurb.Siavaut3etbvaut2,laffirmationestvraie.Si
maintenantavaut1etbvaut2,laffirmationestfausse.Danslesdeuxcas"a>b"estuneexpressionquivautsoit
vrai,soitfaux.Cestlecasleplussimple,maisaussilepluscourantetlepluspratiquecommevousleverrezlorsdes
testsetdesconditions.
Comment lordinateur dterminetil ce qui est vrai et faux ? 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,doncsilersultatvaut
zro(0)alorsilseraconsidrcommefaux.Avantdeconsidrercettedfinitioncommeexacte,renseignezvoustout
de mme car certains langages (comme linterprteur de commande Unix) font linverse ! Cependant dans des
langagescommeJavaouleC,1estvrai,0estfaux.

Pour reprsenter les valeurs vrai et faux, il suffit de deux chiffres, 0 et 1. Combien fautildeplacepourstockerces
deuxvaleurs?Unseulbit!Enpratique,leslangagesgrentlesboolensdeplusieursmanires.Certainscrentdes
"champs" de bits dans un mme octet, dautres utilisent un octet complet, etc. Cependant, plusieurs langages
proposentletypeboolen,trspratique.
Danslapratique,ceslangagesproposentdesconstantes(desvariablesquiprennentunevaleurunefoispourtoute)
spcialespourreprsenterlesvaleursvraietfaux:

TRUEpourvrai

FALSEpourfaux

ENI Editions - All rigths reserved - Jonifar lina - 5-


26
Cesconstantespeuventmmetreutilisesdirectementpourvalueruneexpression.Telleexpressionestellevraie,
telle autre estelle fausse ? Suivant le langage, il faudra faire attention si les constantes existent et sont en
minusculesoumajuscules.

VAR

Test:boolen

Java dispose aussi dun type spcial pour les boolens appel "Boolean". Comme la plus petite unit de stockage
dune case mmoire est loctet, le boolen occupe un case donc un octet. Cependant il ne peut accepter que deux
valeurs:trueetfalse.lexcution,lesvaleurs[trueetfalse]serontaffichesentouteslettres.Remarqueziciune
nouvelle proprit : la dclaration des variables il est possible tout comme en pseudocode de mettre plusieurs
variablesetdaffecteraussiplusieursvaleurs,ensparantlesvariablespardesvirgules.

class chap2_boolean {
public static void main(String[] args) {
Boolean b1=true, b2=false, b3;

b3=true;
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
}
}

IlnestpaspossibleenJavadeconvertirdirectementunboolenenentieretviceversa.

4.Affectation

a.Affectationdevaleurs

Dansleprogramme

Pour donner une valeur une variable, il faut passer par un processus daffectation laide dun oprateur. En
pseudocode,onutiliselesymboledaffectation.gauchedecesymbole,vousplacezlenomdelavariable,
droitelavaleur.Voustrouverezaussidanscertainesreprsentationsalgorithmiquesle:=issuduPascal.Lesdeux
sontquivalentsetutilisables(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

VousavezvidemmentrencontrdanslesprogrammesJavaprcdentscommentaffecterunevaleurunevariable.
Cest le signe "= " qui est utilis. Lemploi du signe "= " en pseudocodena pas la mme signification, ce que vous
verrezunpeuplusloindanslesoprateursdecomparaison.
Attentioncependantnepasvoustromperentreletypedelavariableetlavaleurquevousluiaffectez.Cestune
causederreurfrquente,tantenpseudocodealgorithmiquequedansunvrailangage.Danscertainscasapourra
marcher (dans le sens o lordinateur ne retournera pas forcment une erreur) mais le rsultat ne sera pas celui
attendu.Considrezlexemple,pascorrect,suivant:

PROGRAMME AFFECT2
VAR
a:entier

- 6- ENI Editions - All rigths reserved - Jonifar lina


27
b:rel
c:chane
DEBUT
b3,1415927
a3,1415927
c12345
FIN

Lexcutiondecepseudocodeprovoquequelquessurprises,etdeserreurs.ToutdabordbreoitlavaleurdePI,et
comme b est dclar en rel (pour lexemple, le type classique Numrique naurait pas t pertinent), cest correct.
Puisareoitlammechose.Oraestunentier!Suivantleslangagesdeprogrammation,vousobtiendrezsoitune
erreur,soitafonctionnera,maispasparfaitement.Lavariableatantunentier,ilsepeutqueanecontiennequela
valeurentiredeb,soit3.Notezquecertainslangagesautorisentuneconversionexpliciteduntypeversunautre.
On parle de transtypage. Quant la variable c, elle doit contenir une chane de caractres, dlimite par des
guillemets,absentsici,cequiprovoqueraitprobablementuneerreur.

LecodeJavasuivantnefonctionnepas.Sauriezvousdevinermaintenantpourquoi?

class chap2_equal1 {
public static void main(String[] args) {
int i_a;
double f_a;
f_a=3.1415927;
i_a=3.1415927;
System.out.println(f_a);
System.out.println(i_a);
}
}

Voicilarponsedonneparlecompilateurjavac:

chap2_equal1.java:7: possible loss of precision


found : double
required: int
i_a=3.1415927;
^
1 error

Le transtypage en Java consiste indiquer entre parenthses avant la valeur affecter le type final de celleci. La
valeurseraconvertie,sipossible,danscetypeavantdtreaffecte.Javanepermetpasdefairenimportequoietle
transtypagedoitsuivreunecertainelogique(dugenre,onnepeutpasconvertirdirectementunechanedecaractres
enentier).Demmeletranstypage,notammentverslebas(duntypedegrandetailleversunetaillerduite)risque
de provoquer une perte de prcision, voire mme dun grand nombre dinformations. Dans cet exemple, f_a est
explicitementconvertieenentier.Javanevadoncconserverquelapartieentiredef_aeti_acontiendra3.

class chap2_equal2 {
public static void main(String[] args) {
int i_a;
double f_a;

f_a=3.1415927;
i_a=(int)3.1415927;
System.out.println(f_a);
System.out.println(i_a);
}
}

Cequiretourne:

3.1415927
3

Afindenepasvousfairetapersurlesdoigtsparvotreprofesseurdalgorithmique,prcisezlebontypedsledbut,
etvitezlesaffectationsdouteuses.

Dansladclaration

Vousavezledroitdedonnerunevaleurinitialeoupardfautunevariablelorsdesadclaration.Danscecasvous
devezutiliserloprateurdaffectationlorsdeladclaration.

ENI Editions - All rigths reserved - Jonifar lina - 7-


28
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.CestlammechoseenJava:

class chap4_init2 {
public static void main(String[] args) {
int i=1,cpt=2,resultat=3;
System.out.println(i) ;
}
}

b.Affectationdevariables

Leprincipeestexactementlemmesaufquecettefoisvousnemettezpasdevaleurdroitemaisuneautrevariable,
cequiapoureffetdaffecterlavariabledegauchelavaleurdelavariablededroite.

PROGRAMME AFFECT3
VAR
a,b:entiers
DEBUT
a10
ba
FIN

Lencore,vousprendrezbiensoindenepasmlangerlestorchonsetlesserviettesennaffectantpasdesvariables
detypesincompatibles.Lexemplesuivantestvidemmentfaux.

PROGRAMME AFFECT4
VAR
a:entier
b :rel
DEBUT
b3.1415927
ab
FIN

L encore, noubliez pas une ventuelle conversion dans un vrai langage et de dclarer correctement vos variables
danslebontype.LexempleJavasuivantnedevraitpasvousposerdeproblmesdecomprhension.

class chap2_equal3 {
public static void main(String[] args) {
int a=10,b,c;
double r1=3.1415927, r2;
String txt1="Hello World", txt2;


b=a;
r2=r1;
c=(int)r2;
txt2=txt1;
System.out.println(r2);
System.out.println(c);
System.out.println(txt2);
}
}

N ote:onnepeutpasaffecterdevariableuneautrevariablelorsdesadclaration.

- 8- ENI Editions - All rigths reserved - Jonifar lina


29
5.Saisieetaffichage

Poursimulerlaffichageduntexteoudunevaleursurlcran,ilfaututiliserlapseudoinstruction"Afficher"quiprend
sa suite une chane de texte ou une variable. Si vous mlangez du texte et des variables, sparez ceuxci par des
virgules.laffichage,lesvirgulesserontremplacespardesespaces.

PROGRAMME AFFICHE
VAR
a:entier
texte:chane
DEBUT
a10
texte"Hello World"
Afficher a
Afficher texte
Afficher "Bonjour les amis"
FIN

PourinviterunutilisateurrentrerauclavierunevaleurutilisezlemotSaisir.Lalgorithmeattendraalorsuneentreau
clavierquiseravalideaveclatouchedentre.Lavaleurquevoussaisissezseraplacedanslavariableindiquela
suitede"Saisir".

PROGRAMME SAISIE
VAR
reponse:chane
DEBUT
Afficher "Quel est votre nom ?"
Saisir reponse
Afficher "Vous vous appelez",reponse
FIN

Sivousdevezsaisirplusieursvaleursplacerchacunedansunevariable,vouspouvezutiliserplusieurs"Saisir",mais
plussimplementplacezlesdiversesvariableslasuitedununiqueSaisir,sparespardesvirgules.Lutilisateurdevra
alorssaisirplusieursvaleurs(selonlelangagefinal:lesuneslasuitedesautressparespardesespaces,ouen
appuyantsurlatouche[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 Java les exemples utilisent "System.out.println()" pour
afficherquelquechosedanslaconsoleMSDOSoudansleshellUnix/MacOS.Cestunesyntaxeunpeucompliquequi
trouvesalogiquedansleprincipedelobjetquiseraaborddansledernierchapitre.Javaesteneffetavanttoutun
langage permettant de manipuler des composants graphiques (fentres, botes de dialogue, etc). Voyez ce quil est
ncessairedefairepoursaisirdutexteauclavierdepuislaconsoledanslexemplesuivant.

import java.io.*;

class chap2_saisie {
public static void main(String[] args) {
String txt;
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Entrez votre texte:");
txt=saisie.readLine();
System.out.println("Vous avez saisi :");
System.out.println(txt);
}
catch(Exception excp) {
System.out.println("Erreur");

ENI Editions - All rigths reserved - Jonifar lina - 9-


30
}

}
}

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.

Une constante se dclare gnralement avant les variables sous le motcl CONST. Elle est aussi dun 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 java, une
constanteestaussiappelevariablefinale,danslesensoellenepeutplustremodifie.Elleestdclareavecle
motcl"final".

class chap2_cercle2 {
public static void main(String[] args) {
final double PI=3.1415926;
double r,surface,perimetre;

r=5.2;

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

System.out.println(surface+" "+perimetre);

}
}

- 10 - ENI Editions - All rigths reserved - Jonifar lina


31
OprateursetCalculs

1.Lesaffectations

Le symbole daffectation "" fait partie dune grande famille, celle des oprateurs. Comme son nom lindique, un
oprateurestutilispouretdansdesoprations.Lesymbole"" est un oprateur daffectation.Ilexisteplusieurs
oprateursquiserventauxcalculs,affectations,comparaisons,rotations(debits),groupages,etc.

2.Lesoprateursarithmtiques

Pour que les algorithmes puissent effectuer des calculs, il faut pouvoir au moins faire des oprations simples. Vous
utiliserezpourcelalessymbolessuivants:

+:addition

:soustraction

* ou x:multiplication(ilestplusfaciledcrireunxpourfoisquunetoile)

/:division

%oumod:modulo

DIV:Ladivisionentire

appel:unmoduloestlerestedunedivisionentire.Parexemple15/2vaut7,maisilreste1.Onditque15
R
modulo2vaut1.

Cesoprateurssontditsbinairescarilssutilisentavecdeuxvaleurs:uneavantlesymboleetuneaprs.Lesvaleurs
avantetaprspeuventtredesdonnes(demmetypequelavariablequireoitlesrsultats)oudesvariables.Voici
unexempledoprationsdansunsimplealgorithmequicalculelasurfaceetleprimtreduncercle.

PROGRAMME CERCLE
VAR
r, PI, surface,perimetre:rels
DEBUT
PI3,1415927
r5,2
surfacePI * r * r
perimetre2 * PI * r
Afficher surface,perimetre
FIN

Ici il ny a que des multiplications. Vous pouvez dj remarquer que vous avez parfaitement le droit de chaner vos
calculsetdemlangerlesdonnesetlesvariables.Simulezlesdeuxcalculs:

surfacePI * r * r
surface3,1415927 * 5,2 * 5,2
surface84.948666608

perimetre2 * PI * r
perimetre2 * 3,1415927 * 5,2
perimetre32.67256408

Enjava:

class chap2_cercle {
public static void main(String[] args) {

ENI Editions - All rigths reserved - Jonifar lina - 1-


32
double pi,r,surface,perimetre;
pi=3.1415927;
r=5.2;

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

System.out.println(surface+" "+perimetre);

}
}

Ilestpossibledegrouperlescalculsavecdesparenthses"(...)".Cellesciinfluentsurlaprioritdescalculs.Vousvous
rendrezcompteeneffetquelesoprateursontdesdegrsdeprioritdiffrents.Parexemple,unemultiplicationest
"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.Sivousfaitesceciavec
votrecalculatrice,vousnobtiendrezpascersultatcarlamultiplicationaunordredeprioritpluslevqueladdition.
Lordinateurvadabordfaire4*5=20,puis3+20=23.Lersultatestdonc23.Sivoussouhaitezindiquerlalgorithme,
etdoncensuitedansunvrailangage,unemodificationdespriorits,vousdevezutiliserlesparenthses.

PROGRAMME PRIO2
VAR
x,y,z,total:entier
DEBUT
x3
y4
z5
total(x + y) * z
Afficher total
FIN

Cettefoisvousobtenezlersultat(3+4)*5,cequivaut35.

VoicilquivalentenJavaquiregroupelesdeuxcas:

class chap2_prios {
public static void main(String[] args) {
int x,y,z,total;

x=3;
y=4;
z=5;

total=x+y*z;
System.out.println(total);

total=(x+y)*z;
System.out.println(total);
}
}

Voiciunsimplealgorithmepourcalculerlesrsultatsdunequationduseconddegr.Unequationduseconddegr
estdelaforme:

ax+bx+c=0

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


33
Pourrsoudreunetellequation,ilfautcalculerun"discriminant"souslaforme

=b-4ac

Suivantlavaleurdudiscriminant,lesrsultatsvarient:

si>0,ilyadeuxsolutions

si=0,ilnyaquuneseulesolution

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
quicalculelaracinecarredex.Cestunpeulquivalentdesfonctionsduntableur,vousverrezdanscelivrecomment
crervospropresfonctions.

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

EnJava,notezlutilisationdefonctionsmathmatiquesintgrescommesqrt(racinecarre):

class chap2_equation {
public static void main(String[] args) {
double a,b,c,delta,x1,x2;

a=3;
b=6;
c=-10;
delta=(b*b)-(4*a*c);
x1=(-b+Math.sqrt(delta))/(2*a);
x2=(-b-Math.sqrt(delta))/(2*a);
System.out.println("les rsultats sont :");
System.out.println("x1="+x1);
System.out.println("x2="+x2);
}
}

Quelqueslangagesadmettentdesoprateursarithmtiquesunaires,cestdirequineprennentquunevaleur:

++xincrmentede1lavariablex

x++idemmaisaprslutilisationencours

xdcrmentede1lavariablex

ENI Editions - All rigths reserved - Jonifar lina - 3-


34
xidemmaisaprslutilisationencours

Cettecriturepeutsurprendre.Voiciunexemple:

PROGRAMME UNAIRE
VAR
a:entier
DEBUT
a1
Ecrire ++a
Ecrire a++
Ecrire a
FIN

Lepremieraffichageindique2,lavariableaestincrmenteavantsonutilisation.

Ledeuximeindique2aussi,lavariableaestincrmenteaprssonutilisation.

Ledernierindique3.

ote:lesoprateurs+etpeuventaussitreutilisscommeoprateursunaires:placsavantunscalaireou
N
unevariable,lesigne""donneralopposdecettevaleur(1estgal1).

3.Lesoprateursboolens

Lesoprateursnepermettentpasquedefairedescalculs.Dansuneexpression,unoprateurpeutaussieffectuer
desvaluationsdeboolens.Vousavezvuquepourlordinateurtoutcequiestvraiestdiffrentde0,cequiestfaux
valant 0. Comment alors faire si deux expressions sont lunevraie,lautre fausse, pour connatre la valeur des deux
conjugues ? Il faut utiliser des oprateurs boolens pour indiquer ce qui doit tre considr comme vrai : lun ou
lautre,lesdeuxenmmetemps,etc.

Loprateur ET indique que les deux expressions situes avant et aprs doivent tre toutes les deux vraies
pourquelensemblelesoitaussi.

Loprateur OU indique que seule lune des deux expressions, que ce soit celle situe avant ou celle situe
aprs,doittrevraiepourquelexpressioncompltesoitvraieaussi.

LeNONestlangation.Silexpressiontaitvraieelledevientfausse,etviceversa.

Lesoprateursboolenssontrgisparlalogiqueboolenne,dunomdelinventeurnonpasdelalogiqueellemme,
maisdestravauxdeGeorgeBoolequiauXIXmesiclearestructurtoutelalogiqueenunsystmeformel(quelon
peutinterprteravecdesmots,desphrasescomprhensibles).Prenezlesdeuxexpressions:"Ilfaitbeauetlesoleil
brille".Lapremireexpression"ilfaitbeau"estvraiesilfaitvraimentbeau.Lasecondeexpression"lesoleilbrille"est
vraiesilesoleilbrillevraiment.Silesdeuxexpressionssontvraies,alorslexpressionglobaleestvraie.Parcontre:"Il
aneigetilfaitbeau".Silaneig,cettepremireexpressionestvraie.Cependantsilnefaitpasbeau,laseconde
expressionestfausse.Lensembleestdoncfaux(danslecascontraire,chaussezvosskis).
Les trois oprateurs logiques ET, OU et NON peuvent tre simplement compris laide de petits tableaux appels
parfois"tablesdevrit".Exp1etExp2sontdesexpressionsboolennesvraiesoufausses.Parexemplelexpression
a=1estvraiesiavautvraiment1.
ET:

- 4- ENI Editions - All rigths reserved - Jonifar lina


35
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,alorslersultattotalest
faux.

OU:

ENI Editions - All rigths reserved - Jonifar lina - 5-


36
TabledevritOU

DanslecasduOU,aumoinslunedesdeuxexpressionsdoittrevraiepourquelensemblesoitvrai.Seuleuneseule
assertionestdoncfausse,danslecasolesdeuxexpressionssontfaussestouteslesdeux.
NON:

TabledevritNON

- 6- ENI Editions - All rigths reserved - Jonifar lina


37
LeNONesttrsfacilecomprendre,puisquelexpressionboolenneestinverse:cequitaitvraidevientfauxetvice
versa.
Dansquelcaslesoprateursboolenssontilsutiles?Danslesexpressionsutilisesdansdesconditions(excuter
uneactionselonteloutelcritre)quandcesconditionssontmultiples.Parexemple,sivousvoulezexcuteruneaction
uniquementsideuxvariablesaetbsontvraies(contiennentautrechoseque0).

PROGRAMME ET1
VAR
a,b:entiers
result:boolen
Dbut
a1
b2
resulta ET b
Afficher result
Fin

otezquelalgorithme cidessusnevrifiepassiavaut1etbvaut2.Ileffectueloprationlogique"aETb".
N
Commelesvariablesaetbsonttouteslesdeuxdiffrentesde0,ellessontconsidrescommevraies.Doncla
variableresultcontient"VRAI".etsafficheraainsisilelangagelepermet,ousousformedelavaleur1.

4.Lesoprateursdecomparaison

Lalgorithme cidessus ne vrifie pas les valeurs des variables. Il faut pour cela utiliser dautres oprateurs. Pour
valueruneexpression,ilfautparfoisavoirbesoindecomparerdesvaleurs.Commentsavoirsiunutilisateurdevotre
logiciel a rpondu oui ou non votre question ? Comment savoir si le chiffre saisi dans le jeu du lancer de d
correspondaubonrsultat?Vousallezdevoirutiliserlesoprateursdecomparaison.Ilyenaplusieurs.Ceuxcisont
des oprateurs binaires : ils prennent deux valeurs, une avant et une aprs. Ces valeurs peuvent tre soit des
scalaires (entiers, rels, chanes de caractre selon le langage utilis) directement, soit leur reprsentation sous
formedevariable.Lordinateurvalueralersultatdecettecomparaisonsousformeboolenne:lersultatseravrai
oufaux.

eslangagesragissentdiffremmentselonlescomparaisonsetlestypesdesdonnescompares.Lencore,
L
prenez garde ne pas mlanger les types. Aussi, si en pseudocode algorithmique les chanes de caractres
peuventtrecomparesavectouslesoprateurs,prenezgardelinterprtationquienestfaiteparleslangages.
EnCnotamment(etentreautres)ilfautpasserpardesfonctionsspcialises.

a.Lgalit

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?Dans
un langage comme le BASIC, linterprtation du signe = dpend du contexte. Avec une variable avant et hors
contextedecondition,cest une affectation. Dans une expression conditionnelle, cestunecomparaison.Durdesy
retrouver ! Cest pour a que certains langages comme C, C++, Java ou encore PHP utilisent loprateur dgalit
"==",deuxfoisgal,pournepasleconfondreavecloprateurdaffectation"=".Dansceslangages:

ENI Editions - All rigths reserved - Jonifar lina - 7-


38
a=b=c

estuneexpressionvalablequisignifiequeareoitlavaleurdebquiellemmereoitlavaleurdec.Lavariablebest
affecteenpremier,puisa.Lestroisvariablesdisposentdelammevaleurlafin.

a=b==c

estaussiuneexpressionvalable.Le"=="estprioritairesurle"="etb==cestfauxcar5et10sontdiffrents.Faux
vaut0.Lavariableareoitlersultatdelexpressiona==b,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:

<:infrieur

ou<=:infrieurougal

>:suprieur

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

- 8- ENI Editions - All rigths reserved - Jonifar lina


39
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
vous vous trompez dans les types et les affectations. Dans lexemple suivant, les deux chanes "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

Danslepremiercas,lexpressionestvraie.Danslesecond,elleestfausse.

Ilestpossibledadditionnerdeschanesdecaractres.Lersultatenestlaconcatnationdesdeuxchanes.Ilnest
parcontrepaspossibledutiliserlesautresoprateursarithmtiques.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

ENI Editions - All rigths reserved - Jonifar lina - 9-


40
Pourallerplusloin

1.Lesnombresngatifs

Unnombresignparexemplesur8bits,contientunbitrservpourlesigne.Cestentoutcasainsiquon vous le
prsentepourplusdecomprhension.Gnralementcestlebitdepoidsfort,leplusgauche,quisertpourlesigne:
0 le nombre est positif, 1 il est ngatif. Par exemple 9 (10) devrait tre reprsent par 10001001 (2) . Cette
reprsentationpratiquepourlelecteurnelestcependantabsolumentpaspourlordinateur.Additionnez9et30,vous
obtenez21.

Enbinaire,30quivaut00011110.Lebinairesadditionnecommeledcimal:1+1=10doncretenuede1,etainside
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
reprsentcommececi.Lordinateur"ruse"aveclesmanipulationsbinaires.Lastuceconsisteprendrelecomplment
undelavaleurbinaireenvaleurabsolue(9=>9),etdeluirajouterun(onobtientaufinaluncomplmentdeux).
Lecomplmentunconsisteremplacertousleszros(0)pardesun(1)ettousles1pardes0.

11111111 (complment un)


00001001 (9)
=11110110 (tout est invers)
+00000001 (+1)
=11110111 (quivaut -9 reprsentation machine)

Remarque: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,leprincipemmedubinaireveutquechaquevaleurreprsenteunepuissancede2enfonctiondesapositionde
0n,doncunevaleurentire.Enplus,lesnombresrelsnontjamaislammetaille:plusoumoinsdechiffresavant
la virgule, plus ou moins aprs. Il faut prendre le problme lenvers : ne seraitce pas plutt la virgule qui se
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,2x100 .
Voil qui est trs intressant. Les nombres 12, 10 et 1 pourraient parfaitement tre cods directement en binaire.
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

ENI Editions - All rigths reserved - Jonifar lina - 1-


41
Envritablenotationscientifique,oncrit1,82195E2soit1,82195x102 .

Cestleprincipedelanotationscientifiquequilvafalloirretenirmaisenbinaire,pasendcimal.Lemicroprocesseurne
manipulepasdepuissancesde10,maisde2.Aussiilfauttrouver,selonlemmeprincipe,unmoyendetransformer
toutcecienbinaire.Danslapartieavantlavirgule,cesontdespuissancesde2positives(20 , 21 ,22 ,etc).Aprsla
virgule,ilfautpasserenpuissancesde2ngatives(2 1 ,22 ,23 ,etc).Lapremirepartieneposeaucunproblme.

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/21 ,22 =1/22 ,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(23 +24 +28 +2


9 +210 ...)vousobtenezuntotalde0,1949920654296875.Vousvoyezquonnobtientpaslavaleurexacte.Mmeavec
plusdeplaceetplusdecalculs,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
momentilfautsarrter,etquil faut se contenter duneprcisiondecompromis.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,illest
sur 64 bits. Il existe aussi une prcision sur 80 bits. Le principe est le mme dans tous les cas. Il est bas sur la
reprsentationdusigne"S"dunombre,dunemantisse"M"etdunexposant"E".

Reprsentationbinaire32bitsdunrelsimpleprcision

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


42
Dansunnombrerelensimpleprcisionsur32bits,unbitestrservpourlesigne,8pourlexposantet23pourla
mantisse, dans cet ordre, le bit de poids fort tant le signe. Lexposant doit subir un dcalage de 2 n1 1,ntantle
nombredebitsutiliss.Ledcalageestdoncde127.Enfin,ilnefautpasconserverle1delamantisse:ilestimplicite.

Signe S:0
Exposant E: 7+127=134 , soit 10000111
(10) (2)
Mantisse: 182,195 ( 1 0 ) , sur 23 bits 01101100011000111101011 ( 2 )

Aufinalvousobtenezlenombrecoden32bitssuivant:

S E E E E E E E E M M M M M M M

0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0

M M M M M M M M M M M M M M M M

0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1

Pourretrouverdepuiscenombre32bitslavaleurrelleendcimal,ilfautappliquerlaformulesuivante:

Formuledecalculdunreldepuissareprsentationbinaire

Reprenezlesvaleursprcdentes,convertiesendcimalpourplusdefacilit:

S=0

E=137

M=3551723

Lecodagedunrelsur32bitsamnedeuxremarques:

La taille de la mantisse limite la prcision pour des nombres de grande valeur, car plus le nombre avant la
virguleoccupedelaplace,pluslataillerestantedanslamantisseestrduitepourleschiffresaprslavirgule.
Cetteremarqueestaussidansunemoindremesurevalablepourunrelcodsur64bits.

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,194999992847442626953125avecunarrondi224 !
Unexempleconcretetsimpledeserreursdarrondipeuttretoutfaitmisenvidenceavecunesimplecalculatrice
trs bas prix, ne seraitce quen divisant 1 par 3. Obtenezvous 1,333333 ou 1,333334 ? En rutilisant cette mme

ENI Editions - All rigths reserved - Jonifar lina - 3-


43
valeurlescalculssuivantssontsouventfausss.
Vu le nombre de manipulations pour arriver grer les nombres rels, leur manipulation par le microprocesseur est
plus lente quavec des nombres entiers. Heureusement, ct, puis dans les microprocesseurs sont apparus des
composants supplmentaires appels FPU, Flotting Point Unit, dont le but est de pouvoir manipuler directement les
nombresetlesfonctionsmathmatiquesassocies,acclrantfortementletraitementdesdonnes.Peuttreavez
vous entendu parler des processeurs Intel 386 qui quipaient les PC vers 1990. Un coprocesseur mathmatique
appel 80387 pouvait souvent tre ajout pour acclrer les oprations. Mme les ordinateurs personnels de type
AtariSTpouvaientsevoirajouteruncoprocesseurdecetype(68881).Aujourdhuicescoprocesseursnensontplus:
ilssontdirectementintgrsdanslemicroprocesseur.LedernierPentiumouAthlondevotrePCencontient.

3.Lesdates

Lesdatessontreprsentesdedeuxmaniresdanslordinateur.LapremireestleformatBCDvuprcdemment,et
ceci presque exclusivement dans le bios (setup) de votre ordinateur, pour des raisons historiques. Le second est le
timestampUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuitpileUTC.Cette
date a t retenue car bien que lide dUnix soit apparue en 1969, lre dUnix (arrive de la premire version et
expansion)dbutedanslesannes1970.

Le11avril200721heures,24minuteset43secondes,letimestampUnixestde1176319483secondes.
Le timestamp est gnralement cod sur un entier de 32 bits sign. Sil est ngatif, il reprsente une date davant
1970,silestpositifunedatesuivante.Ilcouvreuneplagede136ans,du13dcembre190120heures45minutes52
secondesjusquau19janvier2038,3heures14minutes8secondes.Passecettedate,quesepasseratil?Tousles
systmes dexploitation ou les ordinateurs nayant pas prvu ce problme rencontreront un magistral bug digne de
celuidelan2000,oupire:lebugdelan2000(quinapaseulieu,oupeu,malgrlesprdictionscatastrophiques)
taitessentiellementlogiciel,letimestampestdfiniauseindusystmedexploitation.

Alorsquefaire?Dj,ilresteunetrentainedannespourmodifierlachose,etcestbiensouventdjfait.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
reprsenterdesdatesdelpoqueoluniverstelquenousleconnaissonsnexistaitpas,etdanslefutur,unepriode
onotreSoleilnexisteraplusdepuisbienlongtemps...Ilsuffitdoncdepasserletimestampsur64bits,etsachantquil
existeuntypetimestampenprogrammation,derecompilertouslesprogrammes.Ilnyadoncaucunsoucisefaire.

4.Lescaractres

Lescaractressonthabituellementcodssur8bits,soitunoctet,enutilisantlatableASCII.Danscettetable,les128
premires valeurs ne reprsentent pas que les caractres pour les anglais mais aussi divers codes non affichables
utilisspourcontrlerlaffichage dun terminal. Les caractres de 0 31 vont contenir des choses comme les retour
chariot,lepassagelaligne,latabulation,etc.Lecaractre32estlespace,le127lecaractredesuppression.Le"A"
enmajusculedmarre65,enminuscule97,leschiffresenpartantde048.Leresteestlaponctuation,divers
signescommelessymbolesmontaires,lesoprateursetcomparateursarithmtiques,etainsidesuite.Typiquement,
lachane"HelloWorld!"estreprsenteainsi.

CodeASCII 72 101 108 108 111 32 87 111 114 108 100 33

Caractre H e l l o W o r l d !

Lescaractresdunemmechaneoccupenttousdescasesmmoirescontigus.Lordinateuroupluttleslangages
utilisant les chanes de caractres doivent savoir o celleci commence (cest indiqu en interne par la variable elle
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:

Lesfichierstextesetlesnomsdefichierscritsdansdautreslanguesquelanglaisneserontpasinterprts
correctementsurlessystmesnutilisantpaslammepagedecode.Typiquement,sivousutilisezunepagede
codenorvgiennesurdesfichiersenfranais,vousobtiendrezdescaractressurprenants.

Les 128 octets ne suffisent pas toujours coder tous les caractres dune langue particulire, par exemple
tous les idogrammes chinois ou japonais. Dans ce cas, lalphabet de ces langues est restreint, ou les gens
natifs de ces pays (et dautres) doivent utiliser plusieurs pages de code, ou passer par des logiciels et

- 4- ENI Editions - All rigths reserved - Jonifar lina


44
systmesgrantspcifiquementleurlangue.

Pourpaliercesinconvnients,ilafallutrouverunautresystmedecodagedescaractres.Larrivedesordinateurs
avecunegrandecapacitmmoireetunegestionavancedelaffichagedescaractrespermetdedisposerdepolices
decaractres(unfichierquicontienttouslesdessinsdescaractresdestinationdelcranoudelimprimante)qui
peuvent contenir les alphabets de la plupart des langues. Par exemple dans la police Arial, on pourrait trouver les
caractreseuropens,maisaussihbreux,arabes,chinois,japonais,etainsidesuite.Maiscommentreprsenterces
milliersdecaractresdiffrentsenmmoire?

UnenormeappeleUnicode,reconnueparlaplupartdessystmesdexploitationetdeslogicielsnotammentsousUnix
etWindows,faitsautercettelimitation.Chaquecaractredisposedunnometdunidentifiantnumrique,demanire
unifie et quelque soit le systme cible. Cestdire que tout produit sachant interprter les caractres unicode
afficheraleschanesdecaractrescritessouscettenormeaveclesbonscaractres.
Untexteunicodeenchinoissafficheraenchinoissivotretraitementdetextegrelunicodeetdisposedelapolicede
caractresunicodecontenantlesidogrammeschinois.Notezquevousnavezpasvoussoucierdelamaniredont
voustapezletexte:lesystmedexploitationetleslogicielslefontvotreplace:vouscontinueztapervotretexte
commevouslaveztoujoursfait.
Unicodeestunenormedereprsentationinternedescaractres,etproposediversformatsdestockageenmmoire.
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
dfaut sous Linux, est lUTF8,UniversalTransformationFormat.Sontudedpasselecadredecelivreetprendrait
plusieurspages.Cependant,sachezquelemodleUnicodeestunmodleencouches.
Lapremirecoucheestlejeudecaractresabstrait,enfaitunelistedescaractresetleurnomprcis.Parexemplele
""correspond"Lettremajusculelatineccdille".

Lasecondeestlindexnumriqueducaractrecod,appelpointdecode,notU+XXXXoXXXXestenhexadcimal.
Sansrentrerdanslesdtails,le""estreprsentparlepointdecodageU+00C7.Ilexisteplusieursniveauxensuite.
Java utilise un codage des caractres sous forme Unicode sur 16 bits. Le premier octet en partant de la gauche
reprsentelejeudecaractre,lesecondlenumrodecaractredanscejeu.CestpourquoiletypecaractreenJava
utilisedeuxoctets,alorsquilnenutilisequunseulenC.

ENI Editions - All rigths reserved - Jonifar lina - 5-


45
Typesetlangages

1.Langagestypsounon

Quelques langages sont trs souples avec les variables. Vous pouvez tout dabord 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,longueur,etlesventuellesconversionsdoiventtreexplicites.

En algorithmique, vous vous contenterez de donner le nom, le type et ventuellement la taille de la variable, qui
garderasespropritstoutaulongdelalgorithme,savaleurpouvantbienentenduvoluer.

2.Lagestiondelammoire

Lagestiondelammoireestlecalvairedesprogrammeursenlangagesdebasniveauoummedehautniveauquand
ceuxci laissent au programmeur la tche de grer la mmoire luimme.Cest le cas de langages comme le C ou le
C++. Imaginez une chane de caractres Hello World ! .Celleci est compose de 12 caractres en comptant la
ponctuation et lespace.Commeunechanesetermineparuncaractrenul,ilfaut,selonleprincipequuncaractre
estcodenASCII,13octetspourstockercettechaneenmmoire.

En algorithmique, vous navez pas vous soucier de loccupation mmoire de vos variables et chanes. En Java, ou
encore en PHP, non plus : ces langages disposent de mcanismes appels "ramassemiettes"quilefontpourvous.
MaisenCparexemple,ceseraitvousdedclarervotrevariabledemanirecequesoncontenupuissecontenir
jusqu13octetsendclarant,enfait,13casesmmoiresdunoctet.Voicilamthodeditestatique:

char texte[13] ;

ouencorelamthodedynamique:

char *texte=malloc(13*sizeof(char));

Ce nest pas tout. En effet avec cette dernire syntaxe le malheur veut que outre cette tche complexe dallocation
mmoire,vousdeviezlibrervousmmelammoire,sinonvotreprogrammecontinueraconsommercellecijusqu
lafindesonexcution.Maiscesystmedegestiondelammoireestilvraimentuninconvnient?Prenezencompte
cesquelquesallgations:

Lagestiondelammoiredemaniredynamiquencessiteuneconnaissanceavancedelatailledesvariables
utilises,delaquantitdemmoirencessaireetdelammoirephysiquedelamachine.

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.

Lallocation dynamique permet dutiliser uniquement la quantit de mmoire ncessaire un instant donn.
Cestcertesinsignifiantpourquelquesoctets,maissilsagitdemanipulerdegrossesimagesoudesfilms,a
compte.

La mmoire inutilise peut tre libre ds quellenest plus ncessaire. Avec les mthodes dites statiques,
ellelestuniquementlafinduprogramme(oudunblocdinstructions).

Lallocationmmoireestlaplusgrandesourcederreursdansunprogramme,pouvantoccasionnerdusimple
dysfonctionnement au plantage complet du programme, voire mme de graves problmes de scurit
(piratage)dansdesapplicationscritiques.

Partantduprincipequunlangagedehautniveaunedoitpasembterleprogrammeuravecunequelconquegestion
du matriel, Java gre la mmoire votre place et donc vous navez pas vous soucier de librer la mmoire de
maniresicomplexeenapparence.

ENI Editions - All rigths reserved - Jonifar lina - 1-


46
Lestestsetconditions

1.Principe

Dansleprcdentchapitrevousavezpuvousfamiliariseraveclesexpressionsmettantenplacedesoprateurs,quils
soient de calcul, de comparaison (lgalit) ou boolens. Ces oprateurs et expressions trouvent tout leur sens une
foisutilissdansdesconditions(quonappelleaussidesbranchementsconditionnels).Uneexpressionvalueestou
vraie (le rsultat est diffrent de zro) ou fausse. Suivant ce rsultat, lalgorithme va effectuer une action, ou une
autre.Cestleprincipedelacondition.

Grceauxoprateursboolens,lexpressionpeuttrecompose:plusieursexpressionssontliesentreelleslaide
dunoprateurboolen,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)etcestsuprieur10.
Reprenezlalgorithmeduprcdentchapitrequicalculelesdeuxrsultatspossiblesdunequationduseconddegr.
Lnonc simplifi disait que pour des raisons pratiques seul le cas o lquation a deux solutions fonctionne.
Autrementdit,lalgorithme nestpasfauxdanscecasdefigure,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,carcestquelquechosedetrscomplexesurunrseauroutierimportant.DenombreuxsitesInternetvous
proposentdtabliruntrajetavecdesindications.Cestlersultatquiestintressant.Lesindicationssontsimples:
allez tout droit, tournez droite au prochain carrefour, faites trois kilomtres et au rondpoint prenez la troisime
sortie direction B. Dans la plupart des cas si vous suivez ce trajet vous arrivez bon port. Mais quid des
impondrables?Paroallezvouspassersilaroutedroiteauprochaincarrefourestdevenueunsensinterdit(a
arriveparfois,ycomprisavecunGPS,prudence)ouquedestravauxempchentdeprendrelatroisimesortiedurond
point?

Reprenezletrajet:alleztoutdroit.Siauprochaincarrefourlaroutedroiteestensensinterdit:continueztoutdroit
puis prenez droite au carrefour suivant puis gauche sur deux kilomtres jusquau rondpoint. Sinon : tournez
droite et faites trois kilomtres jusquau rondpoint. Au rondpoint, si la sortie vers B est libre, prenez cette sortie.
Sinon,prenezversCpuistroiscentsmtrespluslointournezdroiteversB.

Ce petit parcours ne met pas uniquement en lumire la complexit dun trajet en cas de dtour, mais aussi les
nombreusesconditionsquipermettentdtabliruntrajetencasdeproblme.Sivousenpossdez,certainslogicielsde
navigationparGPSdisposentdepossibilitsditinraireBis,detrajectoiredvitementsurtellesection,ouencorepour
viterlessectionspage.Pouvezvousmaintenantimaginerlenombredexpressionsvaluerdanstouscescasde
figure,enplusdelavitessedechaqueroutepouroptimiserlheuredarrive?

2.Quetester?

Les oprateurs sappliquent sur quasiment tous les types de donnes, y compris les chanes de caractres, tout au
moinsenpseudocodealgorithmique.Vouspouvezdoncquasimenttouttester.Partester,comprenezicivaluerune
expressionquiestunecondition.Uneconditionestdonclefaitdeffectuerdestestspour,enfonctiondursultatde
ceuxci,effectuercertainesactionsoudautres.
Une condition est donc une affirmation:lalgorithmeetleprogrammeensuitedterminerontsicelleciestvraie,ou
fausse.
UneconditionretournantVRAIouFAUX,acommersultatunboolen.

Enrglegnrale,uneconditionestunecomparaisonmmesienprogrammationuneconditionpeuttredcritepar
une simple variable (ou mme une affectation) par exemple. Pour rappel, une comparaison est une expression
composedetroislments:

unepremirevaleur:variableouscalaire

unoprateurdecomparaison

unesecondevaleur:variableouscalaire.

Lesoprateursdecomparaisonsont:

ENI Editions - All rigths reserved - Jonifar lina - 1-


47
Lgalit:=

Ladiffrence:!=ou<>

Infrieur:<

Infrieurougal:<=

Suprieur:>

Suprieurougal:>=

Lepseudocodealgorithmiqueninterditpasdecomparerdeschanesdecaractres.Evidemment,vousprendrezsoin
nepasmlangerlestorchonsetlesserviettes,ennecomparantquelesvariablesdetypescompatibles.Dansune
condition une expression, quel que soit le rsultat de celleci, sera toujours value comme tant soit vraie, soit
fausse.

ote:loprateurdaffectationpeutaussitreutilisdansunecondition.Danscecassivousaffectez0une
N
variable,lexpressionserafausse,etsivousaffecteznimportequelleautrevaleur,elleseravraie.

Enlangagecourant,ilvousarrivededire"choisissezunnombreentre1et10".Enmathmatique,vouscrivezcela
commececi:

1 nombre 10

Sivouscrivezcecidansvotrealgorithme,attendezvousdesrsultatssurprenantslejourovousallezleconvertir
en vritable programme. En effet les oprateurs de comparaison ont une priorit, ce que vous savez dj, mais
lexpressionquilscomposentestaussisouventvaluedegauchedroite.Silavariablenombrecontientlavaleur15,
voicicequicepasse:

Lexpression115estvalue:elleestvraie.

Etensuite?Toutvadpendredulangage,lexpressionsuivantevrai10peuttrevraieaussi:"vrai"esticile
rsultat de lexpression 1 15. Vrai vaut gnralement 1. Donc 1 10 est vraie, ce nest pas le rsultat
attendu.

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
unecomplexe.LetestSIpermetdexcuterducodesilacondition(laoulesexpressionsquilacomposent)estvraie.
Laformesimpleestlasuivante:

Si boolen Alors
Bloc dinstructions
FinSi

Noteziciqueleboolenestlacondition.Commeindiquprcdemment,laconditionpeutaussitrereprsentepar

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


48
uneseulevariable.Siellecontient0,ellereprsenteleboolenFAUX,sinonleboolenVRAI.
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
programme continue linstructionsuivantle"FinSi". Lexemple suivant montre comment obtenir la valeur absolue
dunnombreaveccettemthode.

PROGRAMME ABS
VAR
Nombre :entier
DEBUT
nombre-15
Si nombre<0 Alors
nombre-nombre
FinSi
Afficher nombre
FIN

EnJava,cestle"if"quidoittreutilisaveclexpressionboolenneentreparenthses.Lasyntaxeestcelleci:

if(boolean) { /*code */ }

SilecodeJavanetientquesuruneligne,lesaccoladespeuventtresupprimes,commedanslexempledelavaleur
absolue.

class chap3_abs {
public static void main(String[] args) {
int nombre;

nombre=-15;
if(nombre<0) nombre=-nombre;
System.out.println(nombre);
}
}

b.Formecomplexe

Laformecomplexenadecomplexequelenom.Ilyadescasoilfautexcuterquelquesinstructionssilacondition
est fausse sans vouloir passer tout de suite linstruction situe aprs le FinSi. Dans ce cas, utilisez la forme
suivante:

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,cettefoiscestleblocdinstructionssituaprsleSinonquiest
excut.Ensuite,leprogrammereprendlecoursnormaldesonexcutionaprsleFinSi.

Notez que vous auriez pu trs bien faire un quivalent de la forme complexe en utilisant deux formes simples : la
premireaveclaconditionvraie,lasecondeaveclangationdecettecondition.Maiscenestpastrsjoli,mmesi
cestcorrect.Retenezque:

Sidansuneformecomplexe,lundesdeuxblocsdinstructionsestvide,alorstransformezlaenformesimple:
modifiezlaconditionenconsquence.

Laisserunblocdinstructionsvidedansuneformecomplexenestpasconseill:cestunegrossemaladresse
de programmation qui peut tre facilement vite, cest un programme sale. Cependant, certains langages
lautorisent,cenestpasuneerreurnimmeunefautelourde,maiscenestpasuneraison

Lalgorithme suivant est une illustration de la forme complexe : elle vrifie si trois valeurs entres au clavier sont
triesparordrecroissant:

PROGRAMME TRI
VAR

ENI Editions - All rigths reserved - Jonifar lina - 3-


49
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

CommetoujoursenJava,lecodesemblepluscomplexequilnyparaitetcecipourdeuxraisons:

Lasaisiencessitelamiseenplacedemcanismescomplexes:beaucoupdelignespourpasgrandchose.

La saisie attend une chane de caractres, or les tests se font sur des entiers. Il faut donc convertir les
chanesdecaractresenvaleursentires.Javapermetdeconvertirdanstouslessens,maiscecifaitappel
desnotions(classesetobjets)quiserontabordesenfindouvrage.

import java.io.*;

class chap3_tri {
public static void main(String[] args) {
String t1,t2,t3;
int x,y,z;
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Entrez trois valeurs entires distinctes:");
try {

t1=saisie.readLine();
t2=saisie.readLine();
t3=saisie.readLine();
x=Integer.parseInt(t1);
y=Integer.parseInt(t2);
z=Integer.parseInt(t3);

if(z>y && y>x)
System.out.println("Tris en ordre croissant");
else
System.out.println("Ces nombres ne sont pas tris");
}
catch(Exception excp) {
System.out.println("Erreur");
}
}
}

4.Testsimbriqus

Vousconnaissezledictonpopulaire"avecdessi,onmettraitParisenbouteille",auquelonrpondgnralementaprs
uneaccumulationdeconditions"silfaitbeau,etquilfaitchaud,etquelavoiturenestpasenpanne,alorsnousirons
lamer,sinonsilavoitureestenpannenousprendronsletrain,sinonsilyagrvealorsnousferonsdustop,sinon
sitoutvamalalorsnousresteronslamaison".Cestunpeulourdditcommea,maisquinajamaischafauddes
plansdouteuxdevantvrifierplusieursconditionsavecdesscnariosdesecours?
Vous retrouverez parfois le mme problme en programmation. Les deux formes de Si cidessuspermettentdesen
sortirassurment,maislasyntaxepeutdevenirtrslourde.Vouspouvezeneffetparfaitementimbriquervostestsen
plaantdesSiencascadedanslesblocsdinstructionssitusaprslesAlorsetlesSinon.Prenezlexemplesuivant:il
faut deviner si un nombre saisi au clavier est proche ou non dune valeur prdfinie. Pour le savoir, le programme
affichefroid,tide,chaudoubouillantsuivantlcartentrelavaleursaisieetcelleprdfinie.Cetcartestcalculavec
unesimplesoustraction,puisendterminantsavaleurabsolue.

PROGRAMME IMBRIQUE
VAR
nombre,saisie,ecart :entiers

- 4- ENI Editions - All rigths reserved - Jonifar lina


50
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.Cependantilestpossibledefaireplusconcisaveclaformesuivante.

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.Sila
premirenestpasvraie,onpasseladeuxime,puislatroisime,etainsidesuite,jusqucequuneconditionsoit
vrifie.Danslecascontraire,cestleblocdinstructionsfinalquiestexcut.Lestestsduprcdentexempledoivent
donctrercritscommececi:

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

VoicilecodecorrespondantenJava:

import java.io.*;

class chap3_imbrique {
public static void main(String[] args) {
String txt="10";
int ecart,nombre,saisie=0;
BufferedReader input;

ENI Editions - All rigths reserved - Jonifar lina - 5-


51
nombre=63;

input=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Entrez trois valeurs entires distinctes:");
try {
txt=input.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
saisie=Integer.parseInt(txt);

ecart=nombre-saisie;
if(ecart<0) ecart=-ecart;
if(ecart==0) System.out.println("Bravo!");
else if(ecart<5) System.out.println("Bouillant");
else if(ecart<10) System.out.println("Chaud");
else if(ecart<15) System.out.println("Tide");
else System.out.println("Froid");
}
}

Quelleconomiedeplacepourplusdeclartetdeconcision!Maintenantvousdisposezdetoutlencessairepour
rsoudreunequationduseconddegrdanstouslescasdefigure.Ilmanquedeuxcas:

Si=0,ilnyaquuneseulesolutionquivaut:

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

EnJava,leprogrammeatmodifilgrementpourautoriserlasaisiedea,betc:

import java.io.*;

class chap3_equation {
public static void main(String[] args) {
double a=0,b=0,c=0,delta,x1,x2;
String ta="",tb="",tc="";

BufferedReader input;

input=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Entrez a,b et c :");

- 6- ENI Editions - All rigths reserved - Jonifar lina


52
try {
ta=input.readLine();
tb=input.readLine();
tc=input.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
a=Double.parseDouble(ta);
b=Double.parseDouble(tb);
c=Double.parseDouble(tc);

delta=(b*b)-(4*a*c);
if(delta>0) {
x1=(-b+Math.sqrt(delta))/(2*a);
x2=(-b-Math.sqrt(delta))/(2*a);
System.out.println("Deux solutions :");
System.out.println("x1="+x1);
System.out.println("x2="+x2);
}
else if (delta==0) {
x1=-b/(2*a);
System.out.println("Une seule solution x1="+x1);
}
else System.out.println("Pas de solution");
}
}

5.Choixmultiples

Silestestsimbriqusfacilitentparfoislavie,ilsdeviennentparfoistroplourdslorsquelenombredetestsdevienttrop
important.Certainslangagesonttrouvuneintressanteparadeceproblmeenproposantdesstructuresdetests
selonquetelleexpressionestvraie,outelleautre,etainsidesuite.AulieudefairedesSiimbriqusoudesSinonSi,il
suffit alors dindiquer quoi faire quand telle ou telle valeur est rencontre. En algorithmique, cela se traduit par la
pseudoinstruction"Selonque".

Selon que :
Condition 1 : bloc 1
Condition 2 : bloc 2
Condition n : bloc n
Sinon : bloc final
Fin Selon

Uneinstruction"Selonque"peuttreconvertiefacilementenSiimbriqus.Lesconditionssontvrifieslesunesaprs
les autres, dans lordre indiqu. Quand une condition est vraie, le bloc dinstructions associ est excut puis
lalgorithme continue aprs le "Fin Selon". Si aucune condition nest vrifie, cest le bloc final du "Sinon" qui est
excut.
Voiciuneapplicationsimplequipermetdeplacerdansunevariablelenomdunmoisenfonctiondesonnumro(entre
1et12):

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"
mois=10 : libelle_mois"octobre"
mois=11 : libelle_mois"novembre"
mois=12 : libelle_mois"dcembre"

ENI Editions - All rigths reserved - Jonifar lina - 7-


53
Fin Selon
Fin

EnJavalastructurequivalenteestle"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.Le breakestpourunefoisutileetfortementconseill.En
effetsiJavatombesurunecorrespondance,parexemplevaleur1,etsiaucunbreaknestprsent,alorsilvaexcuter
touteslesinstructions,jusquenbas,oujusqucequilrencontreunbreak.Enpratique,lesinstructionsprvuespour
valeur2,valeur3,etc,sontexcutes.Ledefaultestlactionpardfautsiaucunevaleurcasenestvrifie.

class chap3_case {
public static void main(String[] args) {
int mois;
String libmois;
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="???";
}
System.out.println(libmois);
}
}

6.Desexemplescomplets

a.Lelendemaindunedate

Lesstructuresdjabordespermettentdjdeffectuerpasmaldepetiteschoses.Vousallezmaintenantcalculer
lelendemaindunedateselonlescritressuivants:

Ladateestdcomposedanstroisvariablesanne,moisetjour.

Ilfautgrer:

leschangementsdemois

lenombredejoursdanslemois

lechangementdanne

lesannesbissextilespourlemoisdefvrier.

- 8- ENI Editions - All rigths reserved - Jonifar lina


54
Pourinformation,uneanneestbissextilesiellevrifieintgralementdeuxrgles:

lesannesdivisiblespar4,et,

lesannesdivisiblespar400maispaspar100.

Lalgorithmepourindiquersiuneanneestbissextileounonestlesuivant.Notezquedirequuneanneestdivisible
parnconsistedirequelerestedeladivisionparnestnul.

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

EnJava:

import java.io.*;

class chap3_bissextile {
public static void main(String[] args) {
int annee=0;
String cannee="";
BufferedReader input;

input=new BufferedReader(new InputStreamReader(System.in));


System.out.println("Entrez une anne :");
try {
cannee=input.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
annee=Integer.parseInt(cannee);

if( (annee%4==0) && ((annee%400==0) || (annee%100>0)) )


System.out.println(annee+" est bissextile");
else
System.out.println(annee+" nest pas bissextile");
}
}

Cetestdannebissextilenintervientquelorsdescalculssurledernierjourdefvrier,poursavoirsilelendemaindu
28estle29oule1 e rmars.Demmeilfautgrerlescasolesmoisont30ou31jours,ainsiquelechangement
dannelorsdumoisdedcembre.Lalgorithmeutilisedesstructures"SelonQue"etSi.

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
moismois+1
Sinon
Jourjour+1
FinSi

ENI Editions - All rigths reserved - Jonifar lina - 9-


55
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

Le programme Java associ reflte ce qui a dj t expliqu cidessus : un case sans break continue lexcution
jusquau break suivant ou jusqulafin.Aussiunesuitede"case"surlammeligneestpossible:cest comme si
vouslesmettiezlesunssouslesautres.Pourlereste,lecodeesttrsprochedelalgorithme.

import java.io.*;
class chap3_lendemain {
public static void main(String[] args) {
int jour=0,mois=0,annee=0;
String cjour="",cmois="",cannee="";
BufferedReader input;

input=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Entrez jour mois annee:");
try {
cjour=input.readLine();
cmois=input.readLine();
cannee=input.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
annee=Integer.parseInt(cannee);
mois=Integer.parseInt(cmois);
jour=Integer.parseInt(cjour);

switch(mois) {
case 1:case 3:case 5:case 7:case 8:case 10: {
if(jour==31) {
jour=1;
mois++;
} else jour++;
break;
}
case 4:case 6:case 9:case 11: {

- 10 - ENI Editions - All rigths reserved - Jonifar lina


56
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++;
}

}
System.out.println("Demain est le "+jour+ "/"+mois+ "/" +annee);
}
}

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
drapeau est une variable initialise une valeur prdfinie au dbut du programme et dont la valeur est modifie
selonlersultatdestests.Aprstouslestests,onvrifielavaleurdudrapeau.Atellechang?Alorsilyaeuun
problme.Ledrapeauestreprsentparlavariable"erreur".Enfindescript,siellecontientautrechoseque0,alors
ladateestinvalide.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
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

ENI Editions - All rigths reserved - Jonifar lina - 11 -


57
FinSi
FinSi
FinSi
Si erreur=1 Alors
Ecrire "Date incorrecte"
Sinon
Ecrire "Date correcte"
FinSI
Fin

c.Lheuredansnsecondes

Lesimpleestilmeilleur?

Lebutdelalgorithmeestcettefoisdedterminerlheurequilseradansnsecondes.Poura,lutilisateurdoitsaisir
lheureactuelledcomposeenheures(sur24heures),minutesetsecondes.Bienentendu,ilfauttenircomptedu
changementdejour,dheure,deminute,sansoublierquilya60minutesdansuneheureet60secondesdansune
minute.Parexemple,enadditionnant147secondes23heures,58minuteset12secondes,quelleheureseratil?
Ilseraminuit,0minuteet39secondeslelendemain!Danslalgorithmevousutiliserezdesvaleursentires.Ainsile
rsultatdesdivisionsseraunentieretnonunrel(parexemple159/60=2,65maisavecunentiervousrcuprerez
seulement2).

Dansunpremiertemps,additionnezlessecondes:147+12=159

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.

Additionnez les minutes : 58+2= 60. Si le chiffre est suprieur ou gal 60, procdez comme pour les
secondes.60/60=1,soituneheuresupplmentaire,etunrestede0donc0minute.Voussavezmaintenant
quelemilieuest0minute.

Additionnezlesheures:23+1=24soitminuit.Lencorelidalestdecompterlesjours.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

Limplmentation en Java ne ncessite pas de commentaires particuliers. Laffichage final est juste un peu plus
agrable.

import java.io.*;
class chap3_heure {
public static void main(String[] args) {
int jours=0,heures, minutes, secondes,nbsec=0;

- 12 - ENI Editions - All rigths reserved - Jonifar lina


58
String txt="";
BufferedReader saisie;

heures=17;
minutes=55;
secondes=48;

saisie=new BufferedReader(new InputStreamReader(System.in));


try {
System.out.println("Combien de secondes ?");
txt=saisie.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
nbsec=Integer.parseInt(txt);

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

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

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

System.out.println(jours+"d "+heures+":"+minutes+" :"+secondes);


}
}

Lestestspouroptimiser

tesvoussurprisparlaformequerevtcetalgorithme?Probablementcarilnyaaucuntestdeffectu!Laquestion
se pose : sontils dans ce cas vraiment ncessaires ? La rponse ne coule pas de source. Rappelezvous quil ne
suffit pas quun algorithme fonctionne, mais quil fonctionne vite, bien, et quil soit conome. Estce le cas ? Cet
algorithmeeffectueneufcalculs:additions,divisionsetmodulos.Sionrajoutedestests,onrajoutedesinstructions
etlalgorithmedevientpluslong.Or,vousaurezloccasiondelevoirdansleschapitressuivants,lacomplexitdes
algorithmesnestpaslieleurlongueur.Certainssonttrscourts(commeceluici)etpourtanttrsgourmanden
ressources.Inversement,dautressontlongsetsemblentcompliquspourunrsultatdegranderapidit.

Un test bien pos peut viter des calculs inutiles. Un calcul est gourmand en temps machine : le microprocesseur
travaillepluslongtempsenfaisantdesdivisionsetdesmodulosquencomparantdeuxvaleurs:ellessontgalesou
non, et dans le cas de nombres, il suffit de faire un ET pour voir si a retourne la mme valeur, une opration
lmentairetrsrapide,bienplusquelemoindrecalcul.Autrementdit,vousaveztoutintrtfairedestestsquand
ceuxcipeuventpermettredviterdescalculslourds.

PROGRAMME HEURE2
VAR
jours,heures,minutes,secondes,nbsec:entier
DEBUT
heures17
minutes55
secondes48
Afficher "Combien de secondes en plus ?"
Saisir nbsec
secondessecondes+nbsec

Si secondes>59 Alors
minutesminutes+(secondes / 60)
secondesseconde % 60

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

Si heures>23 Alors
joursheures / 24

ENI Editions - All rigths reserved - Jonifar lina - 13 -


59
heuresheures % 24
FinSi
FinSi
FinSi
Afficher jours, heures, minutes, secondes
FIN

Dans le meilleur des cas, un seul calcul sera effectu. Dans le pire, neuf. Entre les deux, toute une gamme. Si par
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
dernierscalculs.Onretrouvebienneufcalculs,aupire.Maislacomplexitmoyenneestlargementrduiteparrapport
aupremieralgorithme.Ceseraitcalculableviaunintervallealatoiremaisborndenvaleurspertinentes.

VoiciseulementlapartiemodifieducodeJava:

secondes+=nbsec;

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

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

SachantqueUnixcomptelenombredesecondescoulesdepuisle1erjanvier1970minuitpourcalculerladate
actuelle, vous savez maintenant comment le systme dexploitation fait pour vous la fournir ! Et encore, il doit
convertir les jours en annes, en tenant compte des annes bissextiles. Vous avez maintenant tout le ncessaire
pour crer vousmme les morceaux dalgorithmes manquants. Vous pouvez mme si vous le souhaitez crer un
algorithmesupplmentairepourgrerparexemplelesfuseauxhorairesenfonctionduneheurecentraleUTC.Ilnya
riendedifficile!

- 14 - ENI Editions - All rigths reserved - Jonifar lina


60
Lalgbreboolen

1.Loriginedestests

Lestestseffectustantenalgorithmiquequenprogrammationsontdestestslogiques,oupluttfaisantappellalogique.Lechapitre
Lesvariablesetoprateursadjbrivementabordcepointlorsquil a t question des oprateurs boolens. Les oprateurs dits
logiquesET,OUetNONsontdesreprsentationsdelalogique.Dequellelogiqueparleton?

Fondamentalement,lalogiqueestlammepourtoutlemonde,bienquevidemmentlinterprtationdesrsultatspuissevarierdun
individu lautre(enstatistiqueparexemple).Lalogiqueestuniverselle.MonsieurSpock,silavaitexistnauraitpasditmieux.Mais
jusqu peu (dans lchelle de lhumanit) il ny avait aucun moyen de se la reprsenter rellement, sous forme de symboles,
dassertions,etc.Ilnyavaitaucunereprsentationformelledelalogique.
Orunordinateurestlogique(mmesionpeutluidemanderdeschosesillogiques,cestvousquileprogrammezaprstout).Lalogique
estmmelabasedenombreusesapplicationsmathmatiques,lectroniques,dintelligenceartificielle.Eninformatique,lematrielest
lectronique et dpend de la logique, et les programmes dpendent tant de tests et de calculs faisant appel la logique, et devant
fonctionnersurdescircuitslectroniques.Sanslogique,pasdlectronique,nidordinateurs,nideprogrammes.

Cestcequifaitquelesoprateurs,conditionsettestsnedoiventpastrepossnimportecomment.Ilnyariendepluslogiquequun
ordinateur,maisaussiriendeplusstupide:ilvabtement(etencorelanotiondebtiseluiestinconnue)excuterexactementceque
vous lui demandez, mme si le rsultat entrane une erreur ou est faux et cela du moment que les tests sont bien poss et quune
rponselogiquepeutentredduite.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".Cetalgorithmeestpourvouset
moi, tres humains, faux. Vous nallez pas sortir nu sil fait froid, vous auriez plutt intrt mettre Sortir FAUX, ou inverser la
conditionfroidounu.Cestvident!Maislordinateursenfiche:ilnaaucunmoyendesavoirquevousavezfaituneerreurdansvos
tests.Leprogrammeestmathmatiquementlogique:chaquetestanalysestcorrectetdonclesconditionssontrempliespourpasser
lavariableSortirVRAI.

Lasuiteabordedespointsthoriques.LebutnestpasdevousdonneruncoursmagistralsurlalgbredeBoolemaisdevousfournir
desbasesdecomprhensiondufonctionnementdelalogiquevuductdelinformatique.Sivousvoulezallerplusloin,ilexisteune
littrature consquente ce sujet dans les bibliothques et les librairies (par exemple, "Algbre de Boole" chez Masson). Sil vous
intresseunjourdallerlargementaudeletdexplorerlesmcanismesdelogiqueetdepensehumaineoudintelligenceartificielle,il
existe un gros ouvrage de rfrence, rfrence de nombreux scientifiques, informaticiens etc, qui sappelle "Gdel, Escher, Bach : les
brinsduneguirlandeternelle",parDouglasHofstadter.

2.Petiteserreurs,grossesconsquences

Comprenezvousmaintenantlimportancedelalogiqueformelleetdebiencrirelestestsetconditionsdansunalgorithme?
Pourvousconforterunpeuvoicideuxexemplesdeprogrammesmalcritsetdeleursdsastreusesconsquences.

a.Ariane5

Le 4 juin 1996 un bug dun programme de la premire fuse Ariane 5 a provoqu sa destruction aprs 40 secondes de vol. Le
programmeenquestioncontrlaitlesgyroscopes(quiindiquentlorientation)delafuse.IlvenaitdAriane4etnavaitpasttestni
modifi pour Ariane 5. En gros, un nombre de 64 bits a t converti en 16 bits. videmment a ne "rentre pas" et les valeurs
retournes par ce programme sont devenus aberrantes. Or ce programme tait critique et naurait jamais d retourner de valeurs
impossibles.Lesdonnesretournesntaientpastestesetvrifiesparleprogrammecentraldecalculdevolquilesprenaientpour
argentcomptantetlesinterprtaienttellesquelles.Surunnombresign,ledernierbitcorrespondausigne.Lorsqueles16bitsont
tremplis,ledernierbitestpassun.Leprogrammeareuuneindicationcommequoilafuseavaitchangdesens(pointaitvers
lebas)etaorientlestuyresdesracteursenlesbraquantfondpourrectifierunesituationtotalementfausse.Lafuseadonc
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 devait tre utilis que durant le compte rebours et uniquement sur les
modlesAriane3!Autrementdit,ilnauraitjamaisdtreprsentnifonctionnerenvol.

b.MarsClimateOrbiter

Lautreexempletoucheencoreaudomainespatial.Le11dcembre1998laNASAlanaunesondeendirectiondeMars:MarsClimate
Orbiter (MCO), dans le but dtudier le climat martien. La sonde arriva en insertion orbitale (mise en orbite autour de Mars) le 23
septembre1999.Lasondedevaitallumersonmoteurprincipalunbonquartdheure,passerderrirelaplante(pertedecontactavec
laTerre)puisdenouveaudevant(reprisedecontact).Lecontactnajamaisrepris.Pourquoi?Parcequelorsdescalculsncessaires
cetteinsertionsurorbite,MCOafaitappelunprogrammeissudunautrefournisseur(LockheedMartin).OrMCOprogrammparla

ENI Editions - All rigths reserved - Jonifar lina - 1-


61
NASAutilisaitlesystmemtrique(Newtonsparseconde),etceluideLockheedMartinlesystmedemesureimprialanglais(Livrepar
seconde).Personnenavrifinitest.Lersultatestquelasondesestapprochetrshautevitesse57kmsdelasurface,au
lieude150kms,etabrldanslatmosphremartienne.Bteerreur.
Imaginezmaintenantlesconsquencesdecesdeuxtrsstupideserreursdeprogrammation(desimplestestsdeconversion),sily
avait eu des astronautes dans ces missionsHeureusement,votremodestechelle,vousnavez probablement pas la prtention
denvoyerdeshommessurMars

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
1847ilpublieunlivreintitul"MathematicalAnalysisofLogic"(Analysemathmatiquedelalogique)puisen1854"AnInvestigationInto
theLawsofThought,onWhichareFoundedtheMathematicalTheoriesofLogicandProbabilities".(Unerecherchesurlesloisdelapense,
surlesquellessontfondeslesthoriesmathmatiquesdelogiqueetdeprobabilits).DanscesouvragesGeorgeBooledveloppeune
nouvelle forme de logique. Le formalisme rassemble une logique symbolique et une logique mathmatique. Les ides doivent tre
traduites mathmatiquement sous formes dquations. Cellesci peuvent ensuite tre transformes via des lois et leurs rsultats
traduitsentermeslogiques.

Boole cre alors un algbre bas sur deux valeurs numriques, le 0 et le 1, autrement dit le binaire, qui sera officialis et mis en
pratiquedansletraitementdelinformationlesiclesuivantavecClaudeShannon.

Durant sa vie, les travaux de Boole restrent au stade thorique. Cependant son algbre est la base de nombreuses applications
quotidiennestellesquellectronique(lescircuitslogiques),linformatique(processeurs,programmes),lesprobabilits,llectricit(les
relais), la tlphonie (les commutateurs), diverses recherches scientifiques, etc. N trs pauvre et autodidacte, George Boole finira
membre de lillustreRoyalSocietyeteffectueradenombreuxtravauxsurlesquationsdiffrentielles.Ilmourradune pneumonie mal
soigne.

4.Lalgbre

a.tablirunecommunication

GeorgeBooleadvelopplalgbrequiportesonnom.Ilestutilisenmathmatique,logique,lectroniqueetinformatique.Ilpermet
deffectuer des oprations sur les variables logiques. Comme son nom lindique,ilpermetdutiliser des techniques algbriques pour
traitercesvariableslogiques.
Prenezlaphrasesuivanteabsolumentlogique"UnepropositionpeuttrevraieOUfausse,maisnepeutpastrevraieETfausse".
Autrementditunevariablelogiquenedisposequedunseultatunmomentdonn:vraioufaux.Enprenantplusieurspropositions,
onpeutappliquerentreellesdesformulesalgbriques.

Lapremireutilisationdecetalgbrelatpourltablissementdecommunicationstlphoniquesvialacommutationtlphonique
mise en place par Claude Shannon. Prenez cet exemple simple de mise en place dune communication tlphonique entre deux
interlocuteurs.Unecommunicationncessitelafoisunmetteur(quimetlappel)etunrcepteur(celuiquidcroche).Onadonc:

Communication=Emetteur ET rcepteur

La communication est tablie si lmetteur appelle et que le rcepteur dcroche. En dautres termes, Communication est VRAIE si
EmetteurestVRAIetrcepteurestVRAI.Danslesautrescas,lacommunicationnestablirapas,etseradoncFAUX.Sivousappelez
quelquun(VRAI)maisquilnedcrochepas(FAUX),ouencorequevousdcrochez(VRAI)sansappelmis(FAUX),ouquepersonne
nappelleninedcroche(FAUXdanslesdeuxcas),ilnyaaucunecommunicationdtablie.Onpeutendduirelatablesuivante:

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!)

Ne trouvezvous pas que cette table ressemble beaucoup loprateur logique ET ? Oui, cest un exemple concret dapplication de
lalgbredeBoole.Cettetableotouteslesvariableslogiquessontposesavecleurrsultatsappelleunetabledevrit.

ChaquecaseprendunevaleurVRAIouFAUX,etlacolonnefinalelersultatattendu,luimmeVRAIouFAUX.RemplacezVRAIetFAUX
parlesvaleursbinairesrespectives1et0:

Emetteur Rcepteur Communication

0 0 0

0 1 0

1 0 0

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


62
1 1 1

Ilyadesfoisoilyavidemmentplusdedeuxvariableslogiques.Prenezlexemplesuivant.Quanddcrochezvousvotretlphone?
Quandilsonne?Quandvousvoulezappelerquelquun?Silsonne,voulezvousvraimentrpondre(sivousavezlaffichagedunomou
dunumrodelappelant,vousvoudrezpeuttrefiltrervosappels)?

Quelspostulatsposezvous?Vousdcrochezsi:

LetlphonesonneETvousvoulezrpondre,

Vousvoulezappelerquelquun.

Autrementdit:

Dcrocher=(Sonnerie ET volont de rpondre) OU envie dappeler quelquun

DcrocherestVRAIsivotretlphonesonne(VRAI)ETquevousvoulezrpondre(VRAI)OUsivousvoulezappelerquelquun(VRAI).

b.Lavrit

Vous avez vu cidessus une table de vrit. Pour tablir celleci, vous avez besoin de variables logiques qui ne prennent que deux
valeurs:VRAIouFAUX,quonappellelesvaleursdevrit.CesvaleursformentunensembleappelB.VRAIetFAUXnencessitent
quedeuxchiffrespourtrereprsents:1et0.LensembleBsenoteainsi:

B={1,0}

Enmathmatique,vousconnaissezprobablementdautresensembles,commeparexemplelensembleNdesentiersnaturels.Surces
ensemblessappliquentdeslois,desthormes,destransformations.CestpareilpourlensembleB,quiestrgitpardesloisetdes
transformations.Decellescipeuventtredduitesunegrandequantitdepropritsetdedrivations.

c.LaloiET

VouslaconnaissezdjdepuislechapitreLesvariablesetoprateursetloprateurlogiqueassoci.LaloiETestaussiappelela
conjonction.Ellesnonceainsi:
AETbestVRAIsietseulementsiaestVRAIetbestVRAI

LaloiETutiliseunenotationparticulirediffrenteselonlechampdapplication:

"."(lepoint):a.b

"":ab

"&","&&"ou"AND"enprogrammation,selonleslangages

Lasuiteduchapitreutiliseralapremirenotationaveclepoint.Cetteloiestsouventassocieunevraiemultiplication,car0*nvaut
toujours0.Cependantattention,certainespropritsnesappliquentpasdutoutdelammemanire!

La loi ET peut tre dcrite sous forme de table, ne pas confondre avec une table de vrit. Elle ressemble plutt une table de
multiplication...

LoiET
a\b 0 1
0 0 0
1 0 1

d.LaloiOU

Vousconnaissezaussicetteloi,rencontreauchapitreLesvariablesetoprateursavecloprateurlogiqueassociOU.LaloiOUest
aussi appele la disjonction. Vous trouvez parfois aussi disjonction inclusive afin de la diffrencier dun autre oprateur. Elle
snonceainsi:

AOUbestVRAIsietseulementsiaestVRAIoubestVRAI

NotezqueleOUtantinclusif(onyvient),siaetbsontVRAIStouslesdeux,aOUbestVRAIaussi.Dumomentquaumoinslundes
deuxestvrai,aOUbestVRAI.

Lesnotationssuivantessontutilises:

"+"(signeplus):a+b

"":ab

ENI Editions - All rigths reserved - Jonifar lina - 3-


63
"|","||","OR"selonleslangagesdeprogrammation.

Lasuiteutiliseralapremirenotationaveclesigne+.LaloiOUestsouventassocieavecladdition,cequiservletotalement
faux.Eneffet,1+1(additionbinaire)vaut0avecuneretenuede1.Or,1+1estVRAI,donc1Attentionaudanger!

LaloiOUpeuttredcritesousformedetable.

LoiOU
a\b 0 1
0 0 1
1 1 1

e.Lecontraire

Lecontraire,appelaussingationsedfinitainsi:

LecontrairedeaestVRAIseulementsiaestFAUX.

VousavezdjrencontrlecontraireavecloprateurNON.Lecontraireestnotcommececi:

nona

"!","NOT","~"selonleslangagesdeprogrammation.

Ainsiilsuffitderetenirque1=0etque0=1.Parlasuite,cesontlesformesouquiserontutilises,selonlecas(ex:pour
nonnona).

f.Lesproprits

Lassociativit

Elleestidentiquelalgbreclassique.Danscertainscas,lesparenthsessontinutiles.Ainsi:
a+(b+c)=(a+b)+c=a+b+c
Etencore:

a.(b.c)=(a.b).c=a.b.c

Lacommutativit

Elleindiquequelordredesvariableslogiquesnaaucuneimportance:
a+b=b+a
Etencore:

a.b=b.a

Ladistributivit

Attention,cettefoisilyaunediffrenceimportanteparrapportlalgbreclassiqueetladistributionlieauxoprateurs+et*.Cest
laraisonpourlaquelleilatexpliququilnefallaitpaslesconfondreaveclessymboleslogiques.Eneffet,si:
a.(b+c)=(a.b)+(a.c)

estidentique,
a+(b.c)=(a+b).(a+c)

nelestpasdutout,maisestparfaitementcorrectenalgbredeBoole.

Lidempotence

Lidempotence signifie que si on applique la mme opration une ou plusieurs fois alors on retrouve toujours le mme rsultat. Par
exemple3/1vauttoujours3,mmesivousdiviseznfoispar1.Cettepropritsappliqueauxdeuxoprateurs.Ainsi:

a.a.a.a.a.a.a.a(etc)=a

et
a+a+a+a+a+a(etc)=a

- 4- ENI Editions - All rigths reserved - Jonifar lina


64
Lacomplmentarit

Langationdelangationdunevariablelogiqueestgalelavariablelogique.AinsilaphraseLavieestbellequivaut"Lavie
nestpasnonbelle".Entermeslogiquesa=nonnona:

a=
Demme:

a+a=1
Eneffet,lexpression"LavieestbelleOUlavienestpasbelle"quivaut0+1,cequiestVRAIdaprslaloiOU,lunedesvariablesau
moinstantvraie.Enfin,

a.a=0

quivautdireque"LavieestbelleETlavienestpasbelle",cequividemmentestimpossible.DaprslaloiET,1.0=0doncFAUX.

Lapriorit

En calcul classique, si vous faites 1+2*3, vous obtenez 7 car la multiplication est prioritaire sur laddition. En algbre de Boole les
prioritssappliquentaussi.LeETestprioritairesurleOU.Vouspouvezcependantinfluersurlesprioritsaveclesparenthses.Voici
deuxexemples.Danslesdeuxcas,aestFAUX(0),bestVRAI(1)etCestVRAI(1)

Exemple1:

a+b.c=?

LeETestprioritaire,oncommenceparb.c:1.1=1

PuisonpasseauOU:0+1=1

Onobtientdonca+b.c=VRAI

Exemple2:
a.b+c=?

LeETestprioritaire,oncommencepara.b:0.1=0

PuisonpasseauOU:0+1=1

Onobtientdonca.b+c=1,VRAI

LethormedeDeMorgan

Commetoutalgbre,celuideBooledisposeaussidesesthormes.LethormedeDeMorgantablitdeuxvritssympathiquesqui
sont souvent utiles pour rduire des calculs boolens et aussi dans ltablissement des tests et conditions. Ce sont en fait les
propritsassociesaucontraire(NON,ngation).Prenezlatabledevritsuivante:

a b a+b (a+b)

0 0 0 1

0 1 1 0

1 0 1 0

1 1 1 0

Prenezmaintenantcettesecondetabledevrit:

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

Comparezlesdernirescolonnesetvousobtenezlgalitsuivante:
(a+b)=a.b

ENI Editions - All rigths reserved - Jonifar lina - 5-


65
Danslesdeuxcas,lersultatseraVRAIuniquementsiaETbsontFAUX.
Delammemanire,avecunetabledevritpluscomplte:

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

Comparezlacolonnecentraleaveclacolonnefinaleetvousobtenez:
(a.b)=a+b

Danslesdeuxcas,lersultatseraVRAIseulementsiaOUbsontFAUX.

g.Quelquesfonctionslogiques

Les fonctions logiques ne sont ni des lois ni des thormes : elles se dduisent de ces deux derniers sous forme de formules qui
peuvent souvent tre rduites, auxquelles on a donn un nom pour les raccourcir et pour plus de pratique. Elles sont souvent
"cbles"endurauseindesmicroprocesseursetproposesparquelqueslangagesdeprogrammation.

LeOUexclusifXOR

Pasdejeudemotsici,rienvoiraveclasriejaponaise.DansleOU(appelOUinclusif)lersultatestVRAIsiaouboulesdeuxsont
vrais. Dans le OU exclusif, le rsultat est VRAI seulement si a ou b est vrai, mais pas les deux en mme temps. Traduisez ceci en
algbredeBoole:
(aOUb)ETPAS(aETb)soit(a+b).(a.b)

Siondveloppeonobtient:

(a+b).(a+b)(lederniertermeprovientduthormedeDeMorgan)

a.a+a.b+b.a+b.b

a.aetb.bvalenttoujours0(FAUX),onlessupprime,ilreste

a.b+a.b

Voicisatabledevrit:

a b ab

0 0 0

0 1 1

1 0 1

1 1 0

LeOUexclusifestnotXOR(leXpoureXclusif).Vouslerencontrezsouscesnotations:

"":diffrentde,eneffetXORestparfaitementquivalent

"":un+entour,ab

SileXORnestpas(oupeu)utilisenalgorithmique,beaucoupdelangagesdeprogrammationleproposent,permettantderemplacer
une condition longue par une condition plus courte. Les programmeurs nont souvent pas le rflexe de lutiliser. La plupart des
microprocesseurs intgrent directement une instruction de type XOR, accessible depuis le langage assembleur associ. Enfin en
lectroniquelesapplicationssousformedeportelogiquesontnombreuses.

LquivalenceEQV

Lquivalenceportetrsbiensonnom.NoteEQV,ellesignifiequeaEQVbestVRAIsietseulementsiaetbontlammevaleur.En
algbredeBoole:

NON(aOUb)OU(aETb)soit(a+b)+(a.b)

- 6- ENI Editions - All rigths reserved - Jonifar lina


66
Siondveloppeonobtient:

(a+b)+(a.b)(lepremiertermeprovientduthormedeDeMorgan)

(a+a).(a+b).(b.a).(b+b)

(a+a)et(b+b)valenttoujours1(VRAI),onlessupprime,ilreste

(a+b).(b+a)

VoicilatabledevritdeEQV:

a b ab

0 0 1

0 1 0

1 0 0

1 1 1

VousdevezremarquerquelquivalenceestlecontraireduXOR.Autrementdit:
aEQVb=(aXORb)
Si vous dveloppez encore la ngation de (a+b).(b+a) laide des proprits et du thorme de De Morgan, vous retrouvez la
formulealgbriquedeXOR.
LeEQVestsouventreprsentparlesymbole"":ab.

Limplicationetlinhibition

Laplupartdeslangagesneproposentpascesfonctions.Limplicationindiquequeaestuneconditionsuffisantepourb,tandisqueb
est une condition ncessaire pour a. Cela signifie que si b est vrai, ou bien que si a et b sont identiques, lexpression est toujours
vraie:

LimplicationsenoteaIMPb.
aIMPb=a+b

a b ab

0 0 1

0 1 1

1 0 0

1 1 1

Linhibitionestlecontrairedelimplication,ellesenoteaINHb.

aINHb=a.b

A b Ab

0 0 0

0 1 0

1 0 1

1 1 0

h.Avecplusdedeuxvariables

Riennempche,etbienaucontraire,dutiliserplusdedeuxvariableslogiquesdansdesexpressionsdelalgbredeBoole.Reprenez
lexempledeltablissementdelacommunicationtlphonique.Elledisposedetroisvariables:

ENI Editions - All rigths reserved - Jonifar lina - 7-


67
sonner,quiseraappelea,

rpondre,quiseraappelebet

appeler,quiseraappelec.

Lersultat(dcrocher)serad,maisnintervientpasdanslescalculs.Quelleestlatablecorrespondante?Attentionilyaunpige.
VRAIestreprsentpar1,FAUXpar0.

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

Avezvoustrouvlepige?asonne,onnapasenviederpondre,maisonveutappeler(pourappeler).Danscecasvousnallez
pasdcrocher:vousattendrezqueletlphonearrtedesonner,orcidessusvouslefaitesquandmme.Donclatablecidessus
nestpascorrecte.Uneligneestfausse.Voicilabonnetable:

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 0

1 1 0 1

1 1 1 1

Trouverlexpressionminimale

Ladifficultconsistemaintenanttrouvercomment,depuiscettetabledevrit,dfiniruneexpressionboolennequiretourneVRAI.
Vousconstatezqueseulesquatrelignesdelatabledevritsontvraies,cestdirequelapersonnevavraimentdcrocher.

Lersultatest1quanda,betcvalent:

0,0,1

0,1,1

1,1,0

1,1,1

Vouspouvezaussicrirequedestvraiquand(a,b,c)=(0,0,1)ou(0,1,1)ou(1,1,0)ou(1,1,1).Convertissezcetnoncenexpression
boolenne:

d=a.b.c+a.b.c+a.bc+a.b.c

- 8- ENI Editions - All rigths reserved - Jonifar lina


68
Ilestintressantderemarquerquelesdeuxpremierstermesdelexpressionpeuventtrefactorisspara.cetlesdeuxdernierspar
a.bselonlapropritdedistributivit.Lersultatdevientdonc:
d=(a.c).(b+b)+(a.b).(c+c)

De mme comme la proprit de complmentarit indique que a+a= 1, les expressions b+b et c+c sont toujours vraies. Elles
peuventtresupprimes.Lersultatfinaldevient:

d=a.c+a.b
Ce nest malheureusement pas toujours aussi vident. Avec quatre, cinq, six termes, les expressions deviennent beaucoup plus
longues et complexes. Il faut toujours chercher faire au plus simple, avec le moins de termes et de variables possibles, quitte
claterlesexpressionsboolennes.

Applicationdanslalgorithme

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:

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

Soitlesconditionssuivantes:"Silfaitchaudetquilnepleutpas,alorsjevaismepromener".

Vousaurezparfoislatentationdefairececi:

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

ENI Editions - All rigths reserved - Jonifar lina - 9-


69
Cestpossible,amarche,maissommetoute,cenestpastrsbeau.Deuxtests,deuxconditions,etunerptitioninutile.Pourquoine
pasfairececi?

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

Ca marche exactement de la mme manire, mais il ny a plus quun test, et pas de rptition. Cest plus court. Tout de mme, cet
algorithmeaplusdeclassequeleprcdent!Etpourpaterunpeuplusvosventuelsprofesseurs,pourquoinepasremplacerletest
par:

...
Si chaud ET NON pleuvoir Alors

...

- 10 - ENI Editions - All rigths reserved - Jonifar lina


70
Lesstructuresitratives

1.Dfinition

Comme indiqu dans le premier chapitre, la boucle est la quatrime grande structure de base de lalgorithmique, et
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
parler parfois destructures rptitives,cestlammechosediteautrement.Lebutduneboucleestderpterun
blocdinstructionsplusieursfois.Selonletypedeboucle,ceblocvatrerptunnombrefixedefois(nfois)ouselon
uncertainnombredecritres(untestdeuneouplusieursconditions)quevousconnaisseztrsbienmaintenant.

La boucle est un lment trs simple au premier abord. Les premiers exemples que vous rencontrerez seront bien
souvent vidents. Pourtant elle devient rapidement lune des btes noires du programmeur en herbe cause
justementdesfameuxcritresdesortie.Silestestsexcutentuneactiondonne(structureSI)encasderussiteou
non,uneerreurdansuneconditiondesortiepeutameneraumauvaisnombredeboucles,nejamaisyrentrerou
mmepire,nejamaisensortir.

Laboucleestdautantmoinssimpleassimilerquilestprobablequevousnayezjamaisrencontrunestructuredece
genrehorsdelalgorithmiqueetdeslangagesdeprogrammation.Danslelangagecourant,onneparlepasdeboucle
quandilsagitderciterunetabledemultiplication.Enalgorithmiquevousdevrezpourtantenutiliserunepourcalculer
cettetable.Demmedanslutilisationquotidiennedelordinateur,vousnutilisezpascettestructurepourtanttousles
programmes le font. Comment lire lintgralit dun fichier de traitement de texte ? Comment jouer un mp3 ou une
vido?laidedesbouclesbienentendu!

2.Quelquesusagessimples

Unexemplesimple,cestlecasounutilisateurdoitrpondreunequestionparmiunelistederponsesimposes
commeo(oui)oun(non).Silutilisateurrpondautrechose(nimportequoi),ilfautluireposerlaquestion,jusquce
quilrpondevraimentooun.

Pourcrerunetabledemultiplication,de3parexemple,vousallezprocdercommesivouslarcitiez:

3*1=3

2*2=6

3*3=9

3*9=27

3*10=30

Vous allez donc multiplier 3 successivement par les nombres de 1 10. En algorithmique, vous connaissez les
variables.Commentaffecterunevaleurde110successivementunevariable?Avecuneboucle!
Etsimaintenantvousvouliezcrerlensembledestablesdemultiplication:tablesde1,de2,etc,jusqu10ouplus?
Ilvousfaudraimbriquerdeuxboucles!

Sivousvoulezcalculerunepuissancequelconque,unefactorielle,sortirleplusgranddesnombresparmiunelistede
nombressaisis(enattendantlestableaux),etc:ilfaudraencoreutiliserlesboucles.

Dans le chapitre prcdent vous avez vu comment calculer les solutions dun polynme du second degr. Et si vous
souhaitiez tracer sa courbe graphique via un programme (en Java par exemple) ? Il vous faudra encore utiliser une
boucle(etquelquesastuces).

Vousverrezquaveclesboucles,vouspourrezmmeextrairelesracinescarres.
Cesexemplessimplesmettentenvidenceaumoinstroischoses:

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

ENI Editions - All rigths reserved - Jonifar lina - 1-


71
Il est possible dimbriquer plusieurs niveaux de boucles : vous pouvez faire des boucles dans des boucles,
autantdefoisquevouslevoulez.

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

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


72
TantQue

1.Structuregnrale

Laboucledetype"TantQue"permetlarptitiondunblocdinstructionstantquelaconditiontesteestvrifie,donc
vraie.Sasyntaxeestlasuivante:

Tant Que boolen Faire


Bloc dinstructions
FinTantQue

Lorsdelexcutionduprogramme,celuiciarrivesurlinstruction"Tantque".Ilvaluelexpressionboolenne(uneou
plusieursconditions,ouuneseulevariable).SilexpressionretourneVRAI,alorsleprogrammeexcutelesinstructions
suivantesjusqucequilarriveau"FinTantQue".Arrivici,ilremonteau"TantQue"etvaluedenouveaulexpression
boolenne,sicestVRAIalorsilexcutedenouveaulesinstructions,etainsidesuite,tantquelexpressionretourne
VRAI.Silexpressiondevientfausse,alorsleprogrammesautelinstructionsituejusteaprsle"FinTantQue".Voici
unsimpleexemplequicomptede110:

PROGRAMME TQUE1
VAR
Cpt:entier
DEBUT
Cpt1
Tant que Cpt<=10 Faire
Afficher Cpt
CptCpt+1
FinTantQue
FIN

EnJava,laboucle"TantQue"estreprsentepar"while()",aveclexpressionboolenneentreparenthses.

while(booleen) {
/* bloc dinstructions */
}

Siuneseuleinstructionestprsenteauseindelaboucle,lesaccoladessontinutiles.

while(boolen) instruction ;

VoicilecodeJavacorrespondantlalgorithmeTQUE1:

class chap4_tq1 {
public static void main(String[] args) {
int cpt;

cpt=1;
while(cpt<=10) {
System.out.println(cpt);
cpt++;
}
}
}

2.Bouclesinfinieset"break"

Faitestoujoursbienattentioncequevotreboucledisposeduneconditiondesortie.Eneffetriennevousempche
de faire des boucles infinies. Dans le cas dune structure itrative "Tant Que", il suffit que la condition soit toujours
VRAIE,parexemple:

Tant que VRAI Faire


...
FinTantQue

ENI Editions - All rigths reserved - Jonifar lina - 1-


73
Ouencore,

Tant que a=a


...
FinTantQue

EnJavaasetraduitpar:

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

Danslesdeuxcas,lexpressionboolenneesttoujoursvraiedoncleprogrammenesortjamaisdelaboucle.Laplupart
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
directementauTantQue)sansexcuterlerestedesinstructions(instruction continue).Lunedespremireschoses
quevousdevezapprendreenalgorithmiqueaveclesbouclescestquesansvouloirparatreexcessif,lutilisationdes
break (et continue) est trs dconseille : de nombreux programmeurs, et pas forcment en herbe, parsment
lintrieurdeleursbouclesdeconditionsdesortiessupplmentaires,quilsnommentsouventdes"casspciaux":"je
nai pas prvu de grer a dans un cas gnral, alors je place une srie dexceptions". Or lobjectif nest pas de
multipliercesconditions,maisdetouteslesrunirauseindeluniqueexpressionboolenneduTantQue.Ilfautdonc
runirtouteslesconditionsdarrtdelaboucleenunseulpoint.

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

class chap4_break {
public static void main(String[] args) {
int cpt;

cpt=1;
while(true) {
System.out.println(cpt);
if(cpt==10) break;
cpt++;
}
}
}

n algorithmique il est toujours possible de trouver une expression boolenne, mme si elle est longue et
E
complexe, permettant dviter lutilisation de "break" et de "continue". Si vous ntes pas daccord, votre
professeurrisquedevousmettreaudfidetrouverunexemplecontradictoire.Peineperdue.

Il faut cependant modrer ces propos. Linterruptiondune boucle au milieu de celleci est dconseille, 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.

Enfinlebutnestpasdecrerdesbouclesdontleblocdinstructionsfaitdixpages(cestunefaondeparler).Dansce
cas,ilestcertesintelligentderunirtouteslesconditionsdesortieenunpoint:aamliorelalisibilit.Cependant,
vousrisquezdevousperdredansvotrepropreprogramme(dolesindentations).Vousapprendrezplusloindansce
livrelanotiondefonctionsetdeprocduresquivouspermettraundcoupagefindevosblocsdinstructionsquivous
simplifierontlavie.

3.Desexemples

a.Unetabledemultiplication

Pourquoi ne pas sattaquer aux exemples cits cidessus, et mme plus, pour vous entraner ? Commencez par la
tabledemultiplication.Aprsavoirsaisilenumrodelatabledemande,uncompteurestinitialis1.Tantquece
compteur est infrieur ou gal 10, on le multiplie par le numro de table, puis aprs avoir affich le rsultat, on
lincrmente. Dans la dernire boucle, le compteur passe de 10 11. Une fois remont au Tant Que, lexpression

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


74
devientfausse:laboucleesttermine,etleprogrammesetermine.

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

CequidonneenJava:

import java.io.*;
class chap4_multi1 {
public static void main(String[] args) {
int cpt,table,resultat=1;
String txt="";
BufferedReader saisie;
saisie=new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Table ?");
txt=saisie.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
table=Integer.parseInt(txt);
cpt=1;
while(cpt<=10) {
resultat=table*cpt;
System.out.println(table+"x"+cpt+"="+resultat);
cpt++;
}
}
}

b.Unefactorielle

Danslemmeordredide,voiciunpetitalgorithmequicalculeunefactorielle.Pourrappel,lafactorielledenscritn!
etsecalculeenmultiplianttouteslesvaleursde1n.Ainsi10!=10*9*8*7*6*5*4*3*2*1,soit3628800(amonte
trsvite).Danschaquepassagedanslaboucleilsagitdemultiplierlecompteurparlersultatdelamultiplication
prcdente. Notez quil est inutile de multiplier par un : a ne change pas le rsultat et du coup le programme
effectue une boucle de trop. De mme, ce coupci lalgorithmecompteralenvers : il partira de n pour descendre
jusqudeux.

PROGRAMME FACT
VAR
cpt,resultat:entiers
DEBUT
Afficher "Quelle factorielle ?"
Saisir cpt
resultatcpt
Tant que cpt>2 Faire
cptcpt-1
resultatcpt*resultat
FinTantQue
Afficher resultat
FIN

CequidonneenJava:

ENI Editions - All rigths reserved - Jonifar lina - 3-


75
import java.io.*;
class chap4_fact {*
public static void main(String[] args) {
int cpt,resultat=1;
String txt="";
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Table ?");
txt=saisie.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
cpt=Integer.parseInt(txt);
resultat=cpt;

while(cpt>2) {
cpt-;
resultat=resultat*cpt;
}
System.out.println(resultat);
}
}

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.Si
nvautun,resultatvautx.Etpourlespuissancesngatives?x n estgal1/x n .
Ilsagitdoncdedterminerlesignedelapuissanceetdefaireunedivision.Ilfautaussircuprerlavaleurabsolue
delapuissance,cequevoussavezdjfaire.Danslalgorithmesuivant,undrapeausigneestutilispoursavoir
sinestngatifounon,afindeffectuerunedivisionlafin.

Variables x,n,signe,cpt,resultat en Numrique


Dbut
Signe0
Ecrire "x,n ?"
Lire x,n
Si n<0 Alors
Signe1
n-n
FinSI
cpt1
resultat1
Tant que cpt<=n Faire
resultatresultat*x

- 4- ENI Editions - All rigths reserved - Jonifar lina


76
cptcpt+1
FinTantQue
Si signe=1 Alors
Resultat1/resultat
FinSi
Ecrire resultat
Fin

CequidonneenJava:

import java.io.*;
class chap4_puissance {
public static void main(String[] args) {
long x=1,n=1,cpt;
double resultat;
boolean signe=false;
String t1="",t2="";
BufferedReader saisie;
saisie=new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("x,y ?");
t1=saisie.readLine();
t2=saisie.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
x=Long.parseLong(t1);
n=Long.parseLong(t2);
if(n<0) {
n=-n;
signe=true;
}
cpt=1;
resultat=1;

while(cpt<=n) {
resultat=resultat*x;

cpt++;
}
if(signe) resultat=1/resultat;
System.out.println(resultat);
}
}

d.Touteslestablesdemultiplication

Toutcommelestests,ilesttoutfaitpossibledimbriquerlesboucles,cestdiredemettreuneboucledansune
autreboucle,surautantdeniveauxquevouslesouhaitez.Vouspouvezenvisager1,2,3,nniveaux,maisarisque
de devenir difficilement lisible. Voici un exemple deux niveaux. Il sagit tout simplement de calculer et dafficher
toutes les tables de multiplication de 1 10. Pour cela deux boucles doivent tre utilises. La premire va
reprsenterlatablecalculer,de110.Lasecondelintrieurdelapremirevamultiplierlatabledonnede1
10.Vousavezdoncdeuxbouclesde110.Simulezcequilsepasse:

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

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

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

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

ENI Editions - All rigths reserved - Jonifar lina - 5-


77
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

LammechoseenJava:

class chap4_multi2 {
public static void main(String[] args) {
int cpt,table,resultat=1;

table=1;
while(table<=10) {
System.out.println("table des "+table);
cpt=1;
while(cpt<=10) {
resultat=table*cpt;
System.out.println(table+"x"+cpt+"="+resultat);
cpt++;
}
table++;
}
}
}

e.Saisiedenotesetcalculdemoyennes

Lebutdelalgorithmesuivantestdinviterlutilisateursaisirdesnotesdtudiantsentre0et20,dedterminerla
note la plus basse, la note la plus haute et de calculer une moyenne. Tant que lutilisateur na pas saisi de note
ngative de 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.
Commencez tout dabord par cette partie de lalgorithme : la saisie des notes. Il faut pour cela utiliser une boucle
dontluniqueconditiondesortieestunenotede1.

PROGRAMME NOTE
VAR
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

- 6- ENI Editions - All rigths reserved - Jonifar lina


78
FinTantQue
Fin

CequidonneenJava:

import java.io.*;
class chap4_note {
public static void main(String[] args) {
String tnote;
int note;
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));


try {

System.out.println("Note (<-1:sortie) ?");


tnote=saisie.readLine();
note=Integer.parseInt(tnote);
while(note>-1) {
if(note>20) {
while(note <-1 || note>20) {
System.out.println("Erreur ! Note (-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
}
}
if(note>-1) {
System.out.println("Note actuelle :"+note);
System.out.println("Note (-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
}
}

}
catch(Exception excp) {
System.out.println("Erreur");
}
}
}

Cetalgorithmemontrequunesimplerptitiondesaisieestpluscomplexequilnyparait.Autoutdbutlutilisateur
sevoitposerunepremirefoislaquestion,silrpond"1"toutdesuite,ilnentremmepasdanslaboucle.Dansla
premireboucle,unevrificationesteffectuesurlavaliditdelanotesaisie:estellesuprieure20?Sioui,alors
ilfautdenouveaueffectuerunesaisie,etreposerenbouclelaquestionautantdefoisquencessaire,cestdire
tant que la note saisie nest pas comprise entre 1 et 20. Sachant que 1 est une condition de sortie, tous les
traitements,ycomprislasaisiedunenouvellenote,nedoiventpastreeffectusdanscecas.Vousaveziciunetrs
belleapplicationduncasoun"break"auraitpueffectivementtreutilis.Voiciunexemple(incomplet)quiremplace
ledernier"Si"delalgorithmeprcdent:

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

Laboucleprincipalepeuteneffettredirectementinterrompuedsquunenotede1estrencontre.Danscecas,il
seraitmmepossibledallerplusloinenconsidrantlapremirebouclecommeinfinieeteneffectuantdedanstoutes
lessaisiesetlaconditiondesortie:

Variable note en Numrique


Dbut
Tant que VRAI Faire
Ecrire "Entrez une note"
Lire note

ENI Editions - All rigths reserved - Jonifar lina - 7-


79
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

CequidonneenJava:

import java.io.*;
class chap4_note2 {
public static void main(String[] args) {
String tnote;
int note;
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {

while(true) {
System.out.println("Note (<-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
if(note>20)
while(note<-1 || note>20) {
System.out.println("Erreur ! Note (-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
}
}
if(note==-1) break;
System.out.println(note);
}

}
catch(Exception excp) {
System.out.println("Erreur");
}
}
}

Il est encore possible dallerplusloinenJavaaveclinstructioncontinue.Eneffetpluttquedecrerunenouvelle


boucleencasderreurdesaisie,pourquoinepasrelancercelleciaudbut?

Lebloccentraldinstructionsdevientdonc:

while(true) {
System.out.println("Note (<-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
if(note>20) {
System.out.println("Erreur");
continue;
}
if(note==-1) break;
System.out.println(note);
}

Commevouspouvezleconstatercetalgorithmeestunpeupluscourtqueloriginal,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
principedconseill,etilvautmieuxquelaboucleellemmeaituneconditiondesortieafindviterunecatastrophe
encasdemodificationdublocdinstructionsquellecontient.Ilfautmaintenantcomplterlalgorithmedoriginepoury
rajouternosvariables:

- 8- ENI Editions - All rigths reserved - Jonifar lina


80
Uncompteurdunombredenotes.

Lanoteminimale.

Lanotemaximale.

Lasommedetouteslesnotes.

Lamoyenne.

Lamoyenneseffectueensortiedelaboucleprincipale,unefoislensembledesnotessaisi.Ilfautveillercequau
moinsunenoteaittsaisie,sinonlalgorithmeeffectueraitunedivisionparzro,cequiestvidemmentimpossible.
Auseindelaboucle,etseulementsilanotesaisieestdiffrentede1,lalgorithmecomparelaplusbassenoteavec
lanoteactuelle,quidevientlaplusbasselecaschant,lammechoseestfaitepourlanotelaplushaute(vous
prendrezsoindinitialisercorrectementcesvaleursdsledbut)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 code Java prend quelques lgres distances avec cet algorithme en utilisant honteusement les facilits offertes
parbreaketcontinue.

import java.io.*;
class chap4_moymax {
public static void main(String[] args) {
String tnote;
int note,min,max,sum,cpt;
float moy;
BufferedReader saisie;

ENI Editions - All rigths reserved - Jonifar lina - 9-


81
min=20;
max=0;
cpt=0;
sum=0;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {

while(true) {
System.out.println("Note (<-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
if(note>20) {
System.out.println("Erreur : nouvelle saisie...");
continue;
}
if(note==-1) break;
cpt++;
sum=sum+note;
if(note<min) min=note;
if(note>max) max=note;
System.out.println(note);
}
if(cpt!=0) {
moy=sum/cpt;
System.out.println("cpt:"+cpt);
System.out.println("min:"+min);
System.out.println("max:"+max);
System.out.println("moy:"+moy);
}
}
catch(Exception excp) {
System.out.println("Erreur");
}
}
}

f.Rendezlamonnaie

Lebutdecetalgorithmeestdecalculerunrendudemonnaieenfonctiondelavaleurdespicesetdesbillets,en
dterminantcombiendebilletsdetellevaleuroudepicesdetellevaleurilfautrendre.Ilsagitdoncdetransformer
unesommeencoupurescorrespondantes.Parexemple1898,67eurospeuventsedcomposeren:

3billetsde500euros

1billetde200euros

1billetde100euros

1billetde50euros

2billetsde20euros

1billetde5euros

1picede2euros

1picede1euro

1picede50centimes

1picede10centimes

- 10 - ENI Editions - All rigths reserved - Jonifar lina


82
1picede5centimes

1picede2centimes

Autantlediretoutdesuite,cetalgorithmeestleparadisdesboucles.Ilenfaudrauneparvaleurfacialedebilletou
depice.Leprincipeesteneffettrssimple.Ilsagitdesoustraireauseindunebouclelavaleurfacialedubillet,par
exemple 500 euros, au montant total, tant que ce montant est suprieur ou gal la valeur du billet. 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

CequidonneenJava:

class chap4_monnaie {
public static void main(String[] args) {
String tnote;
int montant,nb500;
montant=1700;
nb500=0;

while(montant>=500) {
nb500++;
montant=montant-500;
}
System.out.println("Nombre de billets de 500: "+nb500);
System.out.println("Reste :"+montant);
}
}

Quesepassetillasortiedelaboucle?nb500vaut3,etmontantvaut200:cestlereste.Aussiilfautgnraliser
lalgorithmepourtouteslesvaleurs.

Variables montant,nb500,nb200,nb100,nb50,nb20,nb10,nb5 en Numrique


Variables nb5,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

ENI Editions - All rigths reserved - Jonifar lina - 11 -


83
nb50nb50+1
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
dailleurs que certaines parties totalement videntes ont t remplaces par des "".Estce possible de faire plus
court ? Cest quil vous manque encore quelques notions et lments que vous dcouvrirez dans les prochains
chapitres. 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= A3 +B3 +C3 , A reprsentant les centaines, B les
dizainesetClesunits.Larechercheseralimitepourchaquevaleurentirecompriseentre1et10(bienentendu,
vous pouvez augmenter lintervalle mais celuici na pas t choisi au hasard). Lalgorithme ncessite trois boucles
pour chacune des valeurs. Cest bien entendu au sein de la dernire boucle que les valeurs sont calcules et les
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

- 12 - ENI Editions - All rigths reserved - Jonifar lina


84
SivousconvertissezceprogrammeenJava,vousdevriezobtenirseulementdeuxpossibilits:153et371.Eneffet
3+7+1=27+343+1=371
VoicileprogrammequivalentenJava:

class chap4_troisboucles {
public static void main(String[] args) {
double x,y,z,nb1,nb2;
x=1;
while(x<=100) {
y=1;
while(y<=100) {
z=1;
while(z<=100) {
nb1=x*100+y*10+z;
nb2=Math.pow(x,3)+Math.pow(y,3)+Math.pow(z,3);
if(nb1==nb2) {
System.out.println(x+" "+y+" "+z);
}
z++;
}
y++;
}
x++;
}
}
}

ENI Editions - All rigths reserved - Jonifar lina - 13 -


85
RpterJusqu

1.Diffrencesfondamentales

Malgrlabondancedexemplesvusjusquprsent,lastructureitrative"TantQue"nestpaslaseule.Mmesilest
possibledetoutprogrammeraveccetypedeboucle,ilenmanqueencoredeux,dontlastructure"RpterJusqu".
Sonpseudocodeestlesuivant:

Rpter
Bloc dinstructions
Jusqu boolen

Le"Rpter"ressemblefortementau"Tantque"aveccependantdeuximportantesdiffrences:

Quoiquilarrive,ilyauratoujoursaumoinsunpassagedanslaboucle:leblocdinstructionsseraexcutau
moinsunefois,

Lexpressionboolennefinaleestinverse.Untantquea!=1devientun"jusqua=1".

Le"jusqu" se comprend comme "jusqu ce que la condition soit vrifie". Pour faire une boucle infinie il faut donc
faire:

Rpter
Bloc dinstructions
Jusqu FAUX

Pour reprendre lalgorithme de saisie du relev de notes qui avait pos quelques problmes, 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

LelangageJavaneproposepasdestructure"rpterjusqu".Parcontreilproposeunestructure"rpterTant
Que".Ilsuffitdoncuniquementdinverserlaconditiondesortiedujusqu.

do {
/* bloc dinstructions */
}while(condition) ;

LeprogrammeJavaavecquelquesfacilitspourraittre:

import java.io.*;
class chap4_note4 {
public static void main(String[] args) {
String tnote;
int note;
BufferedReader saisie;

ENI Editions - All rigths reserved - Jonifar lina - 1-


86
saisie=new BufferedReader(new InputStreamReader(System.in));
try {

do{
System.out.println("Note (<-1:sortie) ?");
tnote=saisie.readLine();
note=Integer.parseInt(tnote);
if(note>20) {
System.out.println("Erreur");
continue;
}
if(note>-1) System.out.println(note);
}while(note>-1);
}
catch(Exception excp) {
System.out.println("Erreur");
}
}
}

Notezbienattentivementlaconditiondesortiecentrale:lanotedoittresuprieureougale1ETinfrieureou
gale 20 pour sortir de la saisie. Avec le "Tant que", la boucle continuait tant que la note tait infrieure 1OU
suprieure20.Unenuance,maisdetaille.

Cesnuancessontlunedesraisonsquifontquedestudiantsetdesprogrammeurs,pourtantparfoischevronns,sy
perdent. Cest aussi lune des raisons qui fait que la boucle "Rpter jusqu" nest pas prsente dans certains
langagescommeleCouJava.EnJavacependant,voustrouvezunebouclequivalenteau"RpterTantQue",le
"dowhile",quireprendlefaitduneitrationobligatoire,maisaveclesmmesexpressionsboolennesquele"Tant
Que"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.Notezqueicilescompteurspartentde0afindtreincrmentsen
dbutdeboucle,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

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


87
nb2a+b+c
Si nb1=nb2 Alors
Ecrire nb1,a,b,c
FinSI
Jusqu c=10
Jusqu b=10
Jusqu a=10
Fin

EnJava:

class chap4_troisboucles2 {
public static void main(String[] args) {
double x,y,z,nb1,nb2;
x=1;
do {
y=1;
do {
z=1;
do {
nb1=x*100+y*10+z;
nb2=Math.pow(x,3)+Math.pow(y,3)+Math.pow(z,3);
if(nb1==nb2) {
System.out.println(nb1+"="+nb2+", "+x+" "+y+" "+z);
}
z++;
}while(z<=10);
y++;
}while(y<=10);
x++;
}while(x<=10);
}
}

ENI Editions - All rigths reserved - Jonifar lina - 3-


88
PourFinPour

1.Unestructurepourcompter

Troisime et dernire structure itrative de lalgorithmique, le "Pour Fin Pour" est une boucle lusage quasi
exclusifdescompteurs.chaquepassagedanslaboucle,uncompteurestincrmentoudcrment,selonlecas.On
ditalorsquilsagitdunestructureincrmentale.

Sasyntaxeenpseudocodeestlasuivante:

Pour variable De dbut fin [PAS pas] Faire


Bloc dinstructions
Fin Pour

chaquepassagedanslaboucle,lavariableprendrasuccessivementchacunedesvaleursdanslintervalle[ab](aet
binclus).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
grosblocdinstructions,desyretrouver,lavariabletantrptedanslasyntaxedefindeboucle.Enfinilestpossible
detrouverdessyntaxesalternativesdrivantdecestroisdernires.

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.

I lnexisteaucuncasolastructure"PourFinPour"eststrictementncessaire.Ellenefaitquesimplifierles
autresstructuresitrativeslorsdelutilisationdecompteurs.

3.Quellestructurechoisir?

Mais alors quand utiliser telle ou telle structure ? On emploie une structure "Pour" lorsquon connat lavance le
nombreditrations ncessaires au traitement. Ce nombre peut tre fixe ou calcul par avance avant la boucle, peu
importe. La boucle "Pour" est dterministe : son nombre ditrations est fix une fois pour toute et est en principe
invariable(bienquilrestepossibledetricher).
On emploie les structures "Tant Que" ou "Rpter" lorsquon ne connat pas forcment lavance le nombre
ditrationsquiserontncessaireslobtentiondursultatsouhait.Lexempleleplusconcretestreprsentparla
saisiedesnotes:onpeutensaisirune,200,aucune,maisonlesaitpaslavance.Maisapeuttreaussilalecture
deslignesdunfichier(onnenconnatpaslenombreparavance),denregistrementsdansunebasededonnes,un

ENI Editions - All rigths reserved - Jonifar lina - 1-


89
calculcomplexedevantretourneruneprcisionparticulire,unnombredetoursdansunjeu(lepremierquigagnesort
delaboucle),etc.

4.Unpigeviter

Toutcommeilfautviterlesbouclesinfinies(saufsicestparfaitementvolontaire),ilfautaussiviterquelqueserreurs
quipeuventservlertrssurprenantesselonlecas(rappelezvouslaLoideMurphy).Voiciunexempledecequilne
fautpasfaire:

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?Vouspassezde1
2,puisQuoi?3?6?7?14?Cadevientnimportequoi,etaucunnombreditrationsnepeuttreprvu.Vousne
savezplusquandvousallezsortirdelaboucle,nimmelanouvellevaleurducompteurchaqueitration.Selonles
langages, vous aurez au mieux un fonctionnement peu prs conforme ce que vous attendiez, au pire du grand
nimportequoi.Oreninformatique,sauftravaillerpourunditeurpeuscrupuleuxsurlaqualit,un"peuprs"est
inacceptable.

e modifiez jamais un compteur de boucle "Pour" au sein de celleci. Si cela savre vraiment ncessaire,
N
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

CequienJavadonne:

class troisboucles {
public static void main(String[] args) {
double x,y,z,nb1,nb2;

for(x=1;x<=10;x++) {
for(y=1;y<=10;y++) {
for(z=1;z<=10;z++) {
nb1=x*100+y*10+z;

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


90
nb2=Math.pow(x,3)+Math.pow(y,3)+Math.pow(z,3);
if(nb1==nb2) {
System.out.println(x+" "+y+" "+z);
}
}
}
}
}
}

b.Lafactorielle

Encore un classique : avec une factorielle de n, vous savez lavance le nombre ditrations ncessaire : 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

EnJava:

import java.io.*;
class chap4_fact3 {
public static void main(String[] args) {
Long i,cpt,resultat;
String txt="";
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Table ?");
txt=saisie.readLine();
}
catch(Exception excp) {
System.out.println("Erreur");
}
cpt=Long.parseLong(txt);
resultat=1l;

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


System.out.println(resultat);
}
}

c.Racinecarreavecprcision

Ilfallaitbieninnover,voilquiestfaitaveclecalculduneracinecarre.Savezvousextraireuneracinecarrela
main?Avantlapparitiondescalculatrices,leslycensettudiantsutilisaientsoitdestablesoudesrglescalcul,
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
lAncientaitunmathmaticien,mcanicienetingnieurgrecnAlexandrieau1ersicledenotrere.Ilacritde
nombreuxtraitsetlaissquelquesformulesdontlunepermettantdecalculerlaireduntriangleenfonctiondela
longueurdesesctsetuneautrepermettantdapprocherlavaleurduneracinecarredemanirercursive.Voici
commenttrouverlaformule:

ENI Editions - All rigths reserved - Jonifar lina - 3-


91
FormuledeHrondAlexandrie

Lasuitefinalepermetdecalculerlaracinecarreenfonctiondunevaleurinitialearbitrairex0 .Enprincipe,onutilise
lavaleurentireapprochedelaracinecarre,laformulepermettantinitialementdobtenirrapidementlesnombres
situsaprslavirgule.Doncsivouscherchezlaracinecarrede40,sachantque6x6vaut36etque7*7vaut49,la
racinecarreestcompriseentrelesdeux,vousdevriezmettre6.Cependantdanslapratique,nimportequellevaleur
peutconvenir,avecunnombreimportantditrationsvousobtiendrieztoujourslersultatattendu,autantenplaant
1que10000.

Il est cependant trs intressant de pouvoir optimiser le calcul en rcuprant lentier le plus proche. Du coup
lalgorithmeseraextrmementprcis.Celuicicontiendradeuxboucles.Lapremiredetype"TantQue",chargede
calculer lentier x le plus proche de la racine carre de a. La seconde de type "Pour" calculera les dcimales. Le
nombre ditrations permettra de dterminer une prcision. Dailleurs, inutile dexcuter cette seconde boucle si le
rsultatdelapremirecorrespondlaracinerecherche.

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

Vousalleztretonndelapertinenceetdelaprcisiondesrsultats.Ainsienseulementtroisouquatreitrations,
la prcision est suffisante pour la plupart des applications. Malheureusement, et vous le verrez dans la suite 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)
disposentduneinstructionendurrienquepoura(FSQRTparexemplesurunvieuxMotorolaMC68881).
Enattendant,voicilatranscriptiondececalculavancenJava:

class chap4_racine {

- 4- ENI Editions - All rigths reserved - Jonifar lina


92
public static void main(String[] args) {
double i,x,a,cpt;
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));
}
}
System.out.println(x);
System.out.println(Math.pow(x,2));
}
}

d.CalculdunombrePI

Sachant maintenant laide des boucles peu prs tout faire, notamment calculer une racine carre, il serait
intressant de trouver une application encore plus prcise. Et pourquoi pas tenter dapprocher la valeur de PI ? Il
existeplusieursmoyensdapprochercettevaleur.Piestlacirconfrenceduncercledontlediamtreest1.Sansvous
exposer ici les dtails de la mthode, sachez que Leonhard Euler, grand savant du XVIII m e sicle, a rsolu un
problmeconnudelonguedate:ladterminationdelasommedesinversesdescarrsdentier.Laformuleestla
suivante:

Remarquezlaprsenceduneitrationsurlespuissancesdechaquednominateur(diviseur).Voiciuneapplicationde
laboucle"Pour".Demme,remarquezquePIestlevaucarr.Ilfaudradoncquevouseffectuiezuneracinecarre
lafinpourobtenirlebonrsultat.Donc:

Effectuerndivisionssuccessivesde1/n.

Multipliercersultatpar6.

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

Question:Combienfautilditrationspourobtenirseptchiffrescorrectsaprslavirgule?VoicileprogrammeJava
correspondant,quidevraitvousfournirunepetiteide:

ENI Editions - All rigths reserved - Jonifar lina - 5-


93
class chap4_pi {
public static void main(String[] args) {
double i,x,a,cpt;
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));
}
}
System.out.println(x);
}
}

- 6- ENI Editions - All rigths reserved - Jonifar lina


94
Prsentation

1.Principeetdfinition

a.Simplifierlesvariables

Jusquprsent,lestypesdedonnesquevousavezrencontrssontdesscalaires,saufpourleschanesdecaractres.Pour
rappelunscalaireestuntypededonnequinereprsentequuneseulevariablelafois.Unentier,uncaractre,unrel,un
boolen,etc,sontdesscalaires.Unechanedecaractresnon:ilsagitdunesuite,ouliste,decaractres,lesunsaprsles
autres.Unechaneestdoncunelisteordonneparvossoinsdescalaires.Leslangagesproposentsouventuntypepourles
chanesdecaractres,maiscestunefacilitofferteparceuxci.UnlangagecommeleCnenproposepas.Enalgorithmique,
vousutilisezletype"Alphanumrique",ilvousfaudraalorsfaireattentionlorsdelaconversionenC.Bienheureusement,Java
proposeuntypedecegenre,mmesicommesouvent,derrirelesapparencessecacheunebientrompeuseralit
Maisalorscommentsereprsenterunechanedecaractresavecuntypescalaire?Ilfautpourcelaserappelercommentsont
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 exemple partir du principe quelles
contiennentdesscalaires.Siunecasemmoirecontientlenombre65,cepeuttrelavaleurentire65ouencorelecodeASCII
du caractre "A". Une case mmoire peut parfaitement contenir ladresse dune autre case mmoire : cest un peu plus
compliququecelaenalair,etceseralobjetdunpluslongexposdanslasuitedecetouvrage.

Une chane de caractres est donc une suite de scalaires de type Caractre, les uns derrire les autres dans des cases
mmoires en principes contigus. Selon le mme principe, si vous reprenez lexemple du chapitre prcdent consistant en la
saisie des notes dtudiants, ne pensezvous pas quil serait plus pratique de pouvoir conserver ces notes pour la suite du
programme?Ilseraitalorspossibledelesrutiliservolontpourdenouveauxcalculs,voiremmepourlessauverdansun
fichier,lesimprimer,lesconsulter,etc.
Jusquprsent,leseulmoyendontvousdisposieztaitdefaireuneboucledesaisiedenotes,etdedansdetenterdefaire
les calculs au fur et mesure. Lautre possibilit tait de poser n fois la mme question et de placer les rsultats dans n
variablesdiffrentes.Imaginezceci:

...
Lire N1
Lire N2
...
Lire N20
Moy(N1+N2+...+N20)/20
...

Ridicule,nestcepas?Maintenant,sivoussavezquilyavingtlvesdansuneclasseetdoncvingtnotessaisir,neseraitil
pasplussimplederemplacertouteslesvariablesparuneseule,maisquipourraitcontenirtouteslesnotes?Lideseraitdonc
davoirunnomdevariablemaisquipourraitassocierunenoteunnumro.Prenezlavariable"note".Ilsuffiraitalorsdedire
que"note1vaut15,note2vaut17,note3vaut8,etc.".
Unensembledevaleursreprsentparlemmenomvariableetidentifiparunnumrosappelleuntableau.Lenumroqui
sertidentifierunlment(unevaleur)dutableausappelleunindice.Enreprsentationalgorithmique,unlmentdutableau
estreprsentparlenomdelavariableauquelonaccolelindiceentrecrochets:

Note[1]15

n tableau nest pas un type de donnes, mais une liste dlments dun type donn. On parlera dun tableau de n
U
lmentsdetypenumrique,ouAlphanumrique,etc.

b.Lesdimensions

Faites courir un peu plus votre imagination et maintenant vous avez trois classes de vingt lves. Devezvous utiliser trois
tableaux ? Ce quil y a de bien avec les tableaux, cest quon peut rajouter des indices aux indices. Cest trs facile
apprhenderavecdeuxindices.

Note[1][10]17

Cecipourrait(auconditionnelcarsoumisauxcontraintesdelanumrotationdeslments)setraduirepar:La10menotede
la1reclasse.
Rajouter un indice un tableau sappelle rajouter une dimension un tableau. Avec une dimension le tableau peut tre
reprsentsuruneligne.Avecdeuxdimensions,letableaupeuttrereprsentenlignesetcolonnes,commedansuntableur
ouunegrillequelconque.Etavectroisdimensions?Sousformedecube,avecunaxedeprofondeur.Audelcestplusdifficile
reprsenter, aussi il faut parfois utiliser des analogies avec des choses de la vie courante. Ainsi pour trois dimensions,
imaginezungrandcasieravecxcasesenlargeur,ycasesenhauteur,etdontchaquetiroirestdcomposenzpetitescases.

ENI Editions - All rigths reserved - Jonifar lina - 1-


95
Cesreprsentationsrestenttotalementvirtuelles,unevuedelesprit.Denombreuxtableauxnontabsolumentpaspourbutde
reprsenterdeslignesetdescolonnes.Untableaudeuxdimensionspeutparfaitementreprsenterunjeudemorpion,une
matrice,uneclasseetlesnotesdestudiantsassocies
Lepigeaveclestableauxplusieursdimensions,cestlataillequilsoccupentenmmoire.Imaginezdixcoles,disposantde
dixclasseschacunedevingtlves.Nousvoulonsplacerlesnotesdansuntableau.Voicidoncuntableaudetroisdimensions:

Note[1..10][1..10][1..20]

Combiendenotespourraobtenirletableau?10x10x20:2000notes!Sillmentfaitunoctet,vousapprochezles2Ko.Mais
sillmentdutableaucontientunrelsur64bits,cest16Koquisontutiliss!Pourtantlesindicessemblaientsipeulevs.

c.Lestypes

Untableaunestpasuntypededonnesmaisunensembledevaleurs,ellesmmestypes,regroupesetindicessousun
nomdevariableunique.Pouvezvouscreruntableaucontenantnimportequeltypedevaleurs?Attentionlinterprtation
decettequestion.Untableaucontientilnvaleursdummetype,ouaucontrairenvaleursdetypesdiffrents?

Enalgorithmique,leprincipeestsimple:untableaucontientnlmentsdemmetype.Autrementdit,vousallezdclarerun
tableaudevingtnotesennumrique,dixrels,cinqchanesdecaractres,etc.

Cependant en dehors du pseudocode algorithmique la dfinition, la dclaration et lutilisation des tableaux dpendent
fortementdulangage.LestableauxsimplesenJavaouenCparexemplenecontiennentquunseultypepossibledevaleurs.
TandisquenPHP,vouspouvezmlangertoutcequevoulez,lindice1contenantunentier,lindice2dutexte,etc.

Cela peut tre un peu droutant lusage, mais ces langages, souvent appels non typs (cest discutable) sont dune
souplesseincomparable.
Enattendant,respectezenalgorithmiquelefaitquuntableauaenprincipeunnombredindicesfinietquilssonttypsunefois
pourtoute.

d.Dclaration

Enpseudocodealgorithmique,lestableauxsedclarentaummeendroitquelesvariables,justeavantledbutdutraitement
luimme,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,lesusages,les
professeurs, etc. Il ny a malheureusement pas de rgle prcise en ce domaine. Lvidence, visvis de lorganisation de la
mmoire de lordinateur, voudrait que la numrotation dmarre zro : a simplifie les calculs de la position des diffrents
lmentsdutableaudanslammoire.Cependantcommentalorscomprendrecetableau?

Valeurs:tableau[1..10] de rels

Selonlesusages,sicetableaureprsentedixvaleursalors:

Silanumrotationcommence1,lesindicesvontdevaleur[1]valeur[10].

Silanumrotationcommence0,lesindicesvontdevaleur[0]valeur[9].CestlecasdulangageCouduJava.

Certaines notations algorithmiques sont encore plus surprenantes (pour ne pas tre mchant) : la valeur indique entre
crochets peut correspondre au nombre maximal dindices en partant de zro. Cest ainsi que le tableau valeurs contiendrait
onzelments!Nayezpasdinquitudes,ceneserapaslecasici.
Danslasuite,lesindicescommencerontunpourallerjusqun,ntantlenombredlmentsdutableau.Letableauvaleurs
[1..10]auradoncbiendixlments,numrotsde110.Commeilnesagitpasdunergleabsoluedanstousleslangages
vous prendrez bien soin vrifier ce quil en est lorsque vous crirez vos programmes. Si vous tes tudiant, suivez la
reprsentationfournieparvosprofesseurs,ventuellementprcisezlesrglesquevousappliquezauxindices.Danstousles
cas,naccusezpaslauteurdecetouvrage!

e.Utilisation

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


96
Unlmentdetableaureoitunevaleurcommeunevariable,selitcommeunevariableetscritcommeunevariable.Cesont
danslesstructuresitrativesquelestableauxprennenttoutesleurssignifications.Eneffetlesindicesdesdimensionspeuvent
trereprsentslaidedevariables.

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:

Fixerunnombredlmentssuffisammentgrandlavancepourtresrquearentre.

Ou alors, meilleure solution, redimensionner votre tableau la bonne taille ds que le nombre dlments vous est
connu.

Il existe en pseudocode algorithmique une instruction appele "Redim" qui permet de redimensionner un tableau dont le
nombredlmentsnestpasconnulavance.Cependant,ilestsouventconseilldviterdelutiliser.Cetteinstructiontrouve
son utilit dans le fait quen pseudocode les variables et les tableaux sont dclars avant le programme, ce qui induit
limpossibilitdinitialiserlenombredlments duntableausuivantlavaleurdunevariable.Cependantleslangagescomme
Javadisposentdemcanismespermettantdedclarerdestableauxsansforcmentconnatreleurtaillelavance.
Sivousdevezutiliserdestableauxdynamiques,alorsvousnedevezpasindiquerdenombresdlmentsdansladclaration.
Celaserafaitdanslinstructionderedimensionnement.

PROGRAMME REDIM
VAR
Elements :tableau[] dentiers
Nb:entier
DEBUT
Ecrire "Combien dlments ?"
Lire nb
Redim elements[1..nb-1]
FIN

ous ne pouvez pas redimensionner un tableau dj correctement dimensionn, tout comme il est impossible de
V
dpasserlenombredlmentsdclars.Pourobteniruntableauplusgrand,ilfautalorsencrerunautre,ouutiliserle
mcanismedespointeurs,telquilseraprsentdanslechapitreNotionsavances.

2.Javaetlestableaux

a.Tableauxclassiquesndimensions

Java sait grer des tableaux de 1 n dimensions. Il existe plusieurs syntaxes pour les dclarer. Le principe est presque le
mmequepourlesvariables,saufquevousdevezprciserlenombredlmentsdutableau.Lesindicesnedmarrentpas1
mais0,ilfaudradoncadapterleprogrammeenconsquencelorsdupassagedelalgorithmeenJava.Vousdevezutiliserles
crochetslorsdeladclaration.Ceuxciseplacentsoitaprslenomdutableau,soitavant,accolsautypedutableau.Entre
lescrochets,nindiquezpaslenombredlments.

Unedimension

Indiqueztoutdabordletype,puislenom,commepourunevariable,suividescrochets.CettepremirenotationestissueduC
etduC++,etestsouventutiliseparlesprogrammeursissusdeceslangages:

int tab[];

ENI Editions - All rigths reserved - Jonifar lina - 3-


97
Lasyntaxesuivante,aveclescrochetsauniveaudutype,estquivalente:

int[] tab;

Vousindiquezainsiquetabcontiendrauntableaudentiersunedimension.Notezquelatailledutableaunestpasprcise
au moment de sa dclaration. Vous ne spcifiez la taille du tableau quau moment de son utilisation. a peut sembler
surprenant, mais a vite un ventuel gchis de mmoire si le tableau nest soit jamais utilis, soit de taille excessive. Une
pratiquecouranteconsisterserverunmaximumdlmentsdsledbut,aucaso.Cestunebienmauvaisepratique.

Pourindiquerlenombredlmentsdutableau,utilisezlasyntaxesuivante:

tableau = new type[taille];

Pouruntableaudentiersdedixlments,vousferezdonc:

tab=new int[10];

Vouspouvezlafoisdclareruntableauetsonnombredlmentsenmixantlesdeuxsyntaxes:

int tab[]=new int[10] ;


int[] tab2=new int[20] ;

Touslestypespeuventfairelobjetdetableaux.Pourdixlments,lesindicesentrecrochetsvontde09.Suivantletypedu
tableau, les lments ont des valeurs prdfinies quivalentes 0 pour les types numriques, False pour les boolens,
caractrenulpourletypecaractre,null(valeurnulle)pourlesautres.
Vouspouvezdclareruntableauavecdesvaleursprdfiniescommececi:

int t[]={2,7,9,10,11,14,17,18,20,22};

oucommecela:

int[] t={2,7,9,10,11,14,17,18,20,22};

Cequirevientexactementaumme.
Vous accdez au contenu de chaque lment exactement comme prvu, savoir en mettant le numro de lindice entre les
crochets.

tab[2]=254 ;
total=total+tab[3] ;

Vouspouvezobtenirlenombredlmentsduntableaulaidedunepropritparticulireappelelength.

nb=tab.length ;

Vous pouvez redfinir un tableau nimporte quel moment, exactement comme si vous indiquiez son nombre dlments,
cependantattention:touteslesanciennesvaleurssontperdues.

Rfrencesdetableaux

Attentioniciilyaunnormepige,tellementgrosquelesdbutantssousJavatombenttousdedanslesdeuxpiedsjoints.Il
estpossibleenJavadefairececi:

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. Le
principeestexpliqudanslepointsuivantsurlareprsentationmmoireetdanslechapitreNotionsavances.Ici,cenestpas
letableauquiestcopi:copiereoitlarfrencedutableaut.Lesvariablescopieettrfrencentlemmetableau:sivous
modifiez un lment de copie, vous modifiez llment correspondant de t puisquils rfrencent le mme tableau, le mme
endroit dans la mmoire. Lexemple suivant met ceci en lumire : un lment de copie est modifi, puis on affiche llment
correspondantdet:cestlemme.

class chap5_tab1 {
public static void main(String[] args) {
int[] t={2,7,9,10,11,14,17,18,20,22};
int[] copie=t;

System.out.println(t[2]);
copie[2]=5;
System.out.println(t[2]);

- 4- ENI Editions - All rigths reserved - Jonifar lina


98
}
}

Laffectation par rfrence peut tre la source de nombreux dysfonctionnements imprvus voire plantages. Pour recopier un
tableaudansunautre,vousavezdeuxpossibilits:

Copierviaunebouclechaquelmentdutableaudanslautre.

Utiliser une mthode (fonction) appele arraycopy qui copie des lments dun premier tableau vers un second
tableau.

Lesdeuxcassonttraitsdanslexemplesuivant.

class chap5_tabcopie {
public static void main(String[] args) {
int[] t={2,7,9,10,11,14,17,18,20,22};
int[] copie;
int i;

copie=new int[t.length];

/* mthode 1 : boucle */
for(i=0;i<t.length;i++) copie[i]=t[i];

/* mthode 2 : arraycopy */
System.arraycopy(t,0,copie,0,t.length);

System.out.println(t[2]);
copie[2]=5;
System.out.println(t[2]);
}
}

Tableauxndimensions

Java sait manipuler des tableaux plusieurs dimensions. Selon le principe prcdent, le nom du tableau reprsente une
rfrence sur le tableau en mmoire. Dans un tableau n dimensions, chaque dimension rfrence son propre tableau
indpendant en mmoire. Chaque indice de la premire dimension rfrence un tableau pour chaque deuxime dimension.
Cestainsiquilestpossiblequelenombredindicesdeladeuximedimension(oudelatroisime,quatrime,etc.)nesoitpas
lemmeselonlindicedelapremiredimension.Lasuitevousprsentequelqueslmentspratiques.
Vousdclarezuntableaundimensionsenplaantautantdecrochetsquededimensionssouhaites:

/* deux dimensions */
int[][] t1 ;
int t2[][] ;
/* trois dimensions */
int[][][] t3 ;
int t4[][][] ;

Pourindiquerlenombredlments,faitescommepouruneseuledimension,placezlenombredindicesentrelescrochets:

t1=new int[5][10] ;

Vouspouvezaussilefairedirectementdansladclaration:

int[][] t2=new int[6][12] ;

Ilestpossibledefairevarierlenombredindices.Imaginezletableaut2commedevantstockerlesnotesdesixclasses,mais
quelenombredtudiantsparclassevariede1725.Voicicommentprocder:

int[][] t2=new int[6][]


t2[0]=new int[17] ;
t2[1]=new int[20] ;
t2[2]=new int[19] ;
t2[3]=new int[25];
...

Chaquelmentdelapremiredimensionrfrenceuntableaudenlments(lasecondedimension),npouvanttrevariable.

Pour initialiser le contenu dun tableau avec des valeurs prdfinies, comme pour un tableau une dimension utilisez les
accolades.Seulementicivousdevezimbriquerplusieursniveauxdaccolades,unniveaupardimension,commececi:

ENI Editions - All rigths reserved - Jonifar lina - 5-


99
int[][] t2={ { 10,17,8,9,10,20,13,11,7,5} , // 0,0 0,9
{ 9,14,2,0,18,10,16,19,18,6} , // 1,0 1,9
{ 17,8,9,7,10,12,11,14,11} } ; // 2,0 2,8

La taille de chaque dimension dun tableau peut tre rcupre avec la proprit length. Cependant attention, vous
nobtiendrez pas le nombre total dlments de tout le tableau, mais pour chaque dimension. Lexemple suivant met ceci en
lumirepouruntableaudeuxdimensions.Pourobtenirlenombredlmentsdechaquedimension,rcuprezlaproprit
lengthpourchacunedecesdimensions:

class chap5_2dim {
public static void main(String[] args) {
int[][] t=new int[3][];
int i,total=0;

t[0]=new int[10];
t[1]=new int[8];
t[2]=new int[9];

System.out.println(t.length); // 1ere dimension

for(i=0;i<t.length;i++) {
total+=t[i].length; // calcul nb total delements
System.out.println(t[i].length);
}
System.out.println(total);
}
}

3.Reprsentationenmmoire

a.Reprsentationlinaire

En principe, les lments dun tableau sont placs dans des cases contigus en mmoire. Si vous prenez un tableau de dix
nombres,ilpourraittrereprsentainsi:

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

La case est le numro de la case mmoire, lindice le numro dans le tableau et la valeur la note associe lindice. Une
constatation simposedellemme : les numros des cases mmoire (les adresses) nontpasderapportaveclindice, mis
partlefaitquilssontcontigus.
Autantsereprsenteruntableaudescalairesunedimension(unseulindice)enmmoireestsimple,autantsereprsenter
deux ou n dimensions devient un peu moins vident, dautant plus que cette reprsentation peut varier dun langage un
autre.Commelenombremaximaldindiceestconnulavance(danslecasdupseudocodealgorithmique),untableaudeux
dimensionspeuttrefacilementtransposentableauuneseuledimension.

Soituntableaunote[1..3][1..5]:deuxdimensions,quireprsententquinzevaleurs.Voicicommentcecipourraittrereprsent
enmmoire:

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

La premire ligne reprsente ladresse de la case mmoire associe aux diffrents indices du tableau. Cette valeur est bien
entenduentirementarbitraireetestconnuedulangagemettanten uvreletableau.
La deuxime ligne reprsente les indices des diffrents lments du tableau. Remarquez que dans cette reprsentation, on
commence par la premire dimension, puis par la deuxime, etc. Un tableau n dimensions peut donc tre reprsent de
maniretotalementlinaire.Ilestpratiqueendbutantdesereprsenteruntableaudeuxdimensionsentermesdelignes
etdecolonnes.Maiscettevuedelespritesttotalementfausse:lammoireentantquetellenepeuttrereprsenteainsi,
elleestlinaire(lefameuxruban).Untableaustaledonclinairementdanslammoire,dunemanireouduneautre.Cette
dernireremarqueestsujettecautioncommevousleverrezunpeuplusbas.

Dans le cas du tableau deux dimensions, comment un langage utilisant ce principe peut connatre la position exacte dun
lmentenmmoire?Soit:

- 6- ENI Editions - All rigths reserved - Jonifar lina


100
mlapositionconnuedupremierlment,

xlindicedelapremiredimensionmoins1,

ylindicedelasecondedimensionmoins1,

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:

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

Pourcalculerlapositiondunlmentdindicex,y,zaveclesmmesprrequisquaudessus,avecMzlataillemaximaledela
dimensionetMylataillemaximaledeladimensiony,onobtientlaformulesuivante:
p=m+(x*My*Mz)+(y*Mz)+z

b.Reprsentationparrfrence

La reprsentation linaire cidessus est bien pratique pour votre imagination, mais montre ses limites dans certains cas.
Notamment,quesepassetilaveclestypesquinesontpasdesscalaires?Prenezlexempleleplussimple:untableaude
chanesdecaractres.
Danslammoireetcommevuprcdemment,unechanedecaractresestreprsenteparunesuitedevaleursnumriques:
lescodesASCII(ouunicode,selonlecas).Lemot"Bonjour"estreprsentainsi:

Lettre B o n j o u r

ASCII 66 111 110 106 111 117 114

Sachant quon ne connat pas forcment lavance la longueur dune chane de caractres, celleci se termine souvent, et
suivantleslangages,paruncaractrenul.Aussienmmoire,vousobtiendrezceci:

Adresse 1616 1617 1618 1619 1620 1621 1622 1623

Contenu 66 111 110 106 111 117 114 0

Cettebrvetudemetenvidencedeuxproblmes:

Dansuntableauuneseuledimension,ilnestpasvidentdereprsenterlesindicesdeschanesdecaractres.Une
astucepourraitconsisterrechercherlescaractresnuls(0)pourretrouverlesindicessuivants(lecaractresuivant
estlepremierdelachanedindice+1).Mais:

La longueur dunechanedecaractresntantpasfixe,commentrserverlavancelespacecontiguncessaireau
stockagedenchanesdansuntableaudenlments?

Vous pourriez videmment contourner ce problme en dcrtant de manire totalement arbitraire que les chanes de
caractres stockes dans votre tableau ont une longueur fixe. Mais quelle perte de place si votre chane ne fait que deux
caractrespourdeuxcentsrservs!Cenestpasunesolutionretenir.

Pour crer des tableaux n dimensions quelques langages et non des moindres, utilisent une autre mthode. Pour plus de
clart,lemieuxestdecomprendreleprincipetoutdabordavecuntableauunedimension,puisdeux.
Une chane dune longueur de n caractres est en fait bien souvent un tableau une dimension comportant n+1 indices,
sachant que le dernier indice contiendra un caractre nul. Chaque lment du tableau est le code ASCII (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
caractrescetypedevariable,lelangageconnatlalongueurdecettechane(a="Salut",lalongueurdeSalutest5)etva

ENI Editions - All rigths reserved - Jonifar lina - 7-


101
allouerlespacemmoirecontiguncessaireaustockagedecettechane.Quereprsentealorslavariable?Biensouventce
seralapositionenmmoiredelachanedecaractres,autrementditsonadresse.

Pour reprendre lexemple de la chane de caractres "Bonjour" cidessus, elle dbute ladresse mmoire 1616. Si cest la
variable "txt" qui "contient" cette chane, txt va en fait rfrencer le tableau de caractres prsent ladresse 1616. Cest
flagrantavecdeslangagescommeleCquipermettentdemanipulerdirectementlesadressesmmoireetleurcontenu.
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.Soitlaphrase"il
nefaitpasbeau",vousvoulezplacerchacundesmotsdansunlmentduntableau:

Adresses 2007>2009 2010>2012 2013>2017 2018>2021 2022>2026

Contenu Il Ne Fait Pas Beau

Notezdeuxchoses:

Un octet est rajout pour le caractre nul en fin de chane et donc une chane de longueur n occupe n+1 octets en
mmoire.

Ilsepeutqueleschanesnesesuiventpasenmmoiresiaumomentdelescrirededansilnexistepasassezde
positionslibrescontigusdisponibles.Aussilesadressesdonnesdanscetableaupeuventtretotalementdcales
parrapportlaralit.

Letableaudechanedecaractrescontiendraitdonclesrfrencesdesadressesmmoiresosontrellementstockesles
chanesdecaractres:

Indice 0 1 2 3 4

Rfrence 2007 2010 2013 2018 2022

Unastucieuxtourdepassepassequipermetdenombreuseschoses!

- 8- ENI Editions - All rigths reserved - Jonifar lina


102
Manipulationssimples

1.Recherchedunlment

Vousdisposezduntableaudenlmentscorrespondantauxprnomsdevosamis,etvousvoulezsavoirsilunde
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

EnJava:

class chap5_recherche {
public static void main(String[] args) {
int[] t={10,20,14,25,17,8,10,12,15,5,41,19,2,6,21};
int i=0,rech;
boolean trouve=false;

rech=15;

while(i<t.length && !trouve) {
if(t[i]==rech) trouve=true;
i++;

ENI Editions - All rigths reserved - Jonifar lina - 1-


103
}

if(trouve) System.out.println("Trouv position "+(i-1));
else System.out.println("");
}
}

2.Leplusgrand/petit,moyenne

Danslechapitreprcdent,vousaviezeuloccasiondedterminerlapluspetiteetlaplusgrandedunesriedenotes
saisiesparlutilisateur.Ilsagitcettefoisdefairelammechoseaveclestableaux.Leprincipeestlemmesaufquela
donnenevientpasdunesaisiedelutilisateurmaisdutableau.Voiciunexemplepouruntableaudedixlments:

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

EnJava:

class chap5_minmoymax {
public static void main(String[] args) {
double[] notes={10,20,14,11,17,8,10,12,15,5,16,19,2,6,0};
double min,moy,max;
int i;

min=notes[0];
max=notes[0];
moy=0;

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

System.out.println(min+" "+max+" "+moy);
}
}

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:

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


104
Letableaudisposededeuxdimensions,3x3.

Ilfautauseindunebouclepermuterlesjoueurs.

Siunepositionestdjoccupe,ilfautdenouveauposerlaquestion.

Aprschaquecoup,ilfautvrifiertoutesleslignes,colonnesetdiagonales.

Siuneligne,colonne,diagonaleestcomplte,onsortdelaboucle.

Encasdevictoire,ilfautindiquerquelpion(x,o)agagn.

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

/* 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

ENI Editions - All rigths reserved - Jonifar lina - 3-


105

/* 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
colonnessontgagnantesfontappeldesindicesstatiques.Orsivoussouhaitiezparexempletendrecetalgorithme
un"Puissance4"quiestfondamentalementlammechose,vousauriezdestestsrallonge.

VoicilersultatenJava,laffichageayanttlgrementamlioretlescoordonnesadaptesenfonctiondesindices
destableauxdmarrant1:

import java.io.*;
class chap5_morpion {
public static void main(String[] args) {
char[][] p=new char[3][3];
int i,j,x=0,y=0,nbtours=0;
boolean gagne;
char pion= ;
String tx="",ty="";
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));

/* 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 */
System.out.println(" 1 2 3");
for(i=0;i<3;i++) {
System.out.println((i+1) +"|"+p[i][0]+"|"+p[i][1]+"|
"+p[i][2]+"|");
}
System.out.println("Au tour de "+pion);
System.out.println("Coordonnees ? (x,y)");
try {
tx=saisie.readLine();
y=saisie.readLine();

- 4- ENI Editions - All rigths reserved - Jonifar lina


106
}
catch(Exception excp) {
System.out.println("Erreur");
}
x=Integer.parseInt(tx)-1;
y=Integer.parseInt(ty)-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); // fin boucle

/* Plateau */
System.out.println(" 1 2 3");
for(i=0;i<3;i++) {
System.out.println((i+1)+"|" +p[i][0]+"|"+p[i][1]+"|"+p[i][2]+"|");
}

if(gagne) System.out.println(pion+" gagne !");


else System.out.println("Personne ne gagne.");
}
}

ENI Editions - All rigths reserved - Jonifar lina - 5-


107
Algorithmesavancs

1.Lesalgorithmesdestris

a.Leprincipe

Vous avez pu voir dans les exemples prcdents lintrt des tableaux pour le stockage de valeurs multiples. Mais
suivant le cas il peut tre utile davoir besoin dobtenir une liste ordonne de valeurs par ordre croissant ou
dcroissant.Autrementditvousvouleztrierlecontenudutableau.Prenezlecasdunprofesseursouhaitanttrierles
notesdeseslvesdelaplusbasselaplushaute,oudesrsultatsduntiragedulotopourlerendrepluslisible.

Imaginezuntiragedulotodecinqnumros,videmmenttousdiffrents,dontlesvaleursstalententre1et49.Voici
ltatinitialdutableausuiteautirageausort:

48 17 25 9 34

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
premier chapitre, ne soit gnralement pas (ou peu) aborde dans les premires annes dtudes en informatique.
Les algorithmes ont souvent une complexit proche. Pourtant lusage un tri shell est plus rapide quun tri par
slection,toutdpendantdunombredlmentsetlventuelordredeceuxciaudpart.

b.Letriparcration

Letriparcrationneseraabordquedupointdevuethorique.Eneffetsicettemthodesemblesimple,elleesten
fait lourde et complique. Si on demande un dbutant en programmation comment trier un tableau, il vous
proposeratrscertainementdecrerundeuximetableaudanslequelonplaceraaufuretmesureleslmentsdu
premiertableaudanslordrecroissant.
Cestunetrsmauvaiseidepourdemultiplesraisonsdont:

Lajoutdunsecondtableaudoublelammoirencessaire.

Larecherchedupluspetitlmentestpluscompliquequonnelepensecarchaquepassage,ilnefautpas
reprendreceuxdjsortis,etcestcompliqu.

Le nombre de boucles et de recherches est important. La complexit de lalgorithme rsultant aussi,


suprieureauxautres.

Pourtoutescesraisonsletriparcrationnedoitabsolumentpastreutilis.

c.Letriparslection

Letriparslectionesttrssimple:ilconsisteslectionnerdansletableaulapluspetitevaleuretlapermuteravec
le premier lment du tableau, puis la deuxime plus petite valeur (hors premier lment) et la permuter avec le
deuxime lment du tableau, et ainsi de suite, et cela pour tous les lments du tableau. Voici les tapes
ncessairesdepuislexemplecidessus:

tape1:lapluspetitevaleurest9,onpermute9et48.

9 17 25 48 34

tape2:lapluspetitevaleursuivanteest17,djlabonneposition,onpasselasuivante.

ENI Editions - All rigths reserved - Jonifar lina - 1-


108
9 17 25 48 34

tape3:lapluspetitevaleursuivanteest25,djlabonneposition,onpasselasuivante.

9 17 25 48 34

tape4:lapluspetitevaleursuivanteest34,onpermute34et48.Letableauesttri.

9 17 25 48 34

Sileprincipeestsimple,lalgorithmersultantncessitemalheureusementlarecherchedanstoutoupartiedutableau
delapluspetitevaleurpossibleetcesansgrandeoptimisationpossible.Onpeutparcontreviterdepermuterdes
valeurssiaucunevaleurinfrieurenattrouve.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)etainsidesuitesoitunecomplexitdelalgorithme den(n1)/2ce
quidveloppdonneunecomplexitdordreO(n).
VoicilecodeJavacorrespondant:

class chap5_triselect {
public static void main(String[] args) {
int t[]={27,44,12,18,23,19,101,54,29,77,52,88,10,32};
int i,j,cpt,temp,min;

cpt=14;
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++) {
System.out.print(t[j]+" ");
}
System.out.println();
}
}
}

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


109
d.Letribulles

Letribullesaunlointainrapportaveclechampagneoudailleurstouteslesboissonsgazeuses.Lebutestquepar
permutations successives des valeurs voisines, les valeurs les plus leves remontent vers les dernires places du
tableau,tandisquelesvaleurslesplusbassesmigrentverslespremiresplaces.Pourtrierdansunordrecroissant,il
fautquechaquevaleurdunlmentdutableausoitpluspetitequecelledellmentquisuit(saufpourledernier,
bienentendu).Voiciunesimulationpaspasdupremierpassage:

tape1:48estsuprieur17,onpermute.

17 48 25 9 34

tape2:48estsuprieur25,onpermute.

17 25 48 9 34

tape3:48estsuprieur9,onpermute.

17 25 9 48 34

tape4:48estsuprieur34,onpermute.

17 25 9 34 48

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 une permutation au moins a eu lieu lors dun passage, il faut en
relanceruneautre.Ainsiilfautmettreenplaceundrapeau(flag)indiquantsiunepermutationaeulieuounon.Voici
lesrsultatsaprslespassagessuccessifs:

Passe1:

17 25 9 34 48

Passe2:

17 9 25 34 48

Passe3:

9 17 25 34 48

Lastructureglobaledelalgorithmeestdonc:

PROGRAMME TRIBULLE
VAR
Permut :boolen
temp,Cpt,i:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Permutvrai
TantQue Permut Faire
PermutFaux

ENI Editions - All rigths reserved - Jonifar lina - 3-


110
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

Cependant si vous implmentez cet algorithme dans un quelconque langage vous allez vous apercevoir que celuici
dansnotrecasprciseffectueunepassedetrop.Eneffetdsletroisimepassageletableauesttrietpourtantle
programme continue. Cest que lors de ce passage lalgorithme a effectu une permutation des deux premires
valeurs 17 et 9. Partant de ce fait, lindicateur de permutation est pass Vrai et donc une nouvelle boucle est
relance.Commeilnestpaspossibledeprvoirlavancelenombredepermutationsrestantes,lalgorithmemontre
seslimitesdanscecasprcis.
Si n est le nombre dlments du tableau, lalgorithme effectue n1boucles TantQue etn1 boucles Poursoit (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
leves,etainsidesuite.Ilestdoncpossibledoptimiserlalgorithmeendcrmentantde1labouclePourchaque
nouvellepasse.

...
DEBUT
...
Permutvrai
Cpt5
TantQue Permut Faire
...
Pour i de 1 Cpt-1
...
FinPour
CptCpt-1
FinTantQue
FIN

Lacomplexitdecetalgorithmeestunpeumoinsleve.Eneffetoneffectueuneboucledemoinschaquepassage.
LacomplexitestcependanttoujoursenO(n):aupremierpassageilya(n1)comparaisons,audeuximepassage
(n2),autroisime(n3)etainsidesuite.Onobtientdoncunecomplexitde(n1)+(n2)+(n3)++1soitn(n1)/2et
doncnn/2.Cestidentiqueautriparslection.
LecodeJavacorrespondantestlesuivant:

class chap5_tribulle {
public static void main(String[] args) {
int t[]={14,13,12,11,10,9,8,7,6,5,4,3,2,1};
int i,cpt,temp;
boolean Permut=true;

cpt=13;
while(Permut) {
for(i=0;i<14;i++) System.out.print(t[i]+" ");
System.out.println();
System.out.println("->");
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<14;i++) System.out.print(t[i]+" ");
System.out.println();

- 4- ENI Editions - All rigths reserved - Jonifar lina


111
}
}
}

e.Letriparinsertion

Letriparinsertionconsisteslectionnerunlmentdutableauetlinsrerdirectementlabonnepositiondansla
partiedutableaudjtrie.Onprocdeentroistapes:

Onplacellmenttrierdansunevariabletemporaire.

Tantqueleslmentsdutableauquiprcdentllmenttrierluisontsuprieurs,ondcaleceslments
dunepositionenrcuprantlespacevidelaissparllmenttrier.

Oninsreensuitelavariabletemporairelanouvellepositionlaissevacanteparledcalage.

Voicilesdiffrentestapespourletableauexemple:

tape1:ledeuximelment17estplacdansunevariabletemporairequiestcompareauxlmentsqui
leprcdent.Chacunestdcaltantquilestsuprieurllmenttrier.

48 17 25 9 34 48 25 9 34 17 48 25 9 34

17entemporaire Dcalagede48 17lanouvelleposition

tape2:25estcomparauxlmentsquileprcdentetchacunestdcaljusqucequellmentnesoit
plussuprieurautroisime.

17 48 25 9 34 17 48 9 34 17 25 48 9 34

25entemporaire Dcalagede48 25lanouvelleposition

tape 3 : 9 est compar aux lments qui le prcdent. Ici comme dans ltape 1 on sarrte forcment au
premierlment.

17 25 48 9 34 17 25 48 34 9 17 25 48 34

9entemporaire Dcalagede17,25et48 9lanouvelleposition

tape4:34estcomparauxlmentsquileprcdent.Seul48luiestsuprieur.

9 17 25 34 48 9 17 25 48 9 17 25 34 48

9entemporaire Dcalagede48 34lanouvelleposition

Lalgorithme rsultant est assez simple. Seule la boucle de dcalage peut tre un peu plus ardue comprendre.
Chaquelmentestdcalversladroite(oulebasselonlareprsentationquonsenfait)dutableautantquilest
suprieurllmentrecherche.

PROGRAMME TRINSERTION
VAR
i,mem,pos:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Pour i de 1 Cpt faire
memt[i]

ENI Editions - All rigths reserved - Jonifar lina - 5-


112
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

Commesouventlacomplexitvarieselonlordreinitialdeslmentsdansletableautrier.Cependantdanslepire
descasoneffectue(n1)bouclesdanslesquellesoneffectueunemoyennede(n2)/2changesetdoncuntotalde
(n1)(n2)/2. On obtient une complexit dordreO(n). Cependant on effectue en moyenne seulement la moiti des
comparaisons(danslexemplecidessus,sixcomparaisonssonteffectuesalorsquedixauraientputreeffectues).
Lacomplexitestalorsbienmoindre.Danslapratiqueuntriparinsertionestgnralementplusrapidequelestris
bullesetparslection.

UnepetiteremarqueconcernantlecodeJava.Sivousfaites:

while(t[pos]>mem && pos>=0)

Lexpressionestvaluedegauchedroite.Vousallezavoiruneerreurunmomentdonn:quandposvaut0,la
boucle suivante il vaut 1. Or si un langage comme le C permet de dborder les indices (aucune vrification nest
effectue), Java ne le permet pas et cause une exception qui stoppe le programme avec une erreur. Aussi il faut
dabordtesterlavaleurdeposAVANTdevrifierlecontenudutableaucetindice.

while(pos>=0 && t[pos]>mem)

LecodeenJavacorrespondantestlesuivant:

class chap5_trinsert {
public static void main(String[] args) {
int t[]={48,17,25,9,34};
int i,j,mem,pos,cpt;
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++) System.out.print(t[j]+" ");
}
System.out.println();
}
}

f.LetriShell

LetriShellestunevariantedutriprcdentquiatproposparDonaldL.Shellen1959(ilnyadoncaucunrapport
avecleshellUnixouWindows).Danscetypedetrileslmentsnesontplusdcalsdeununmaisparpasplus
important.Lapermutationseffectueenfonctiondecepas.Unefoislespermutationsdecepaseffectues,lepasest
rduit.Quandlepasatteint1,letriShelldevientunbtetriparinsertion.Aufinal,letriShellconsistedgrossir
un maximum le tableau trier en plaant ds les premiers passages le plus dlments possibles dans les bonnes
parties du tableau. Dans un tableau dune dizaine dlments, la moyenne des lments de la premire partie du
tableauestplusbassequecelledeladeuximepartie,dslepremierpassage.

Au final, le tri Shell est dune complexit O(n2 ) mais se rvle tre plus rapide dans la majorit des cas. Cest
lalgorithmedetrileplusutilis.
Prenezuntableaudedixlments:

8 4 6 9 7 1 3 2 0 5

Etunpasde4:

tape1:t[1]ett[5]sontcomparsetventuellementpermuts.

- 6- ENI Editions - All rigths reserved - Jonifar lina


113
7 4 6 9 8 1 3 2 0 5

tape2:t[2]ett[6]sontcomparsetventuellementpermuts.

7 1 6 9 8 4 3 2 0 5

tape3:t[3]ett[7]sontcomparsetventuellementpermuts.

7 1 3 9 8 4 6 2 0 5

tape4:t[4]ett[8]sontcomparsetventuellementpermuts.

7 1 3 2 8 4 6 9 0 5

tape5:t[5]ett[9]sontcomparsetventuellementpermuts.

7 1 3 2 0 4 6 9 8 5

Lepasnedoitpastrecalculauhasardcarcestdeluiquedpendlefficacitdelalgorithme.Laformuleutilisepar
lalgorithmeestgnralement:

U(n+1) =3Un +1avecU0 =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

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

SoitenJava:

class chap5_trishell {
public static void main(String[] args) {
int t[]={48,17,25,9,34,12,28,1,4,98,0,33,48,10,11,9,25};
int i,j,n=0,mem,pos,cpt;

cpt=t.length;

ENI Editions - All rigths reserved - Jonifar lina - 7-


114

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

while(n!=0) {
n=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++) System.out.print(t[j]+" ");
System.out.println();
}
}
}

2.Recherchepardichotomie

Larecherchepardichotomienesappliquequesurlestableauxdjtris.Vousavezdjrencontrunalgorithmede
recherchedlmentdansuntableaunontri.Maisceluiciposaitunproblme:siletableauavait10000lments,et
queparpurhasardceluiquevouscherchiezestle10000 m e ,ilfaudrabalayerlintgralitdutableau.Cetterecherche
squentiellenestpasidale.
Dansuntableautri,laproblmatiqueestradicalementdiffrente.Rienquavecunerecherchesquentielleildevient
inutiledebalayertoutletableau:ilsuffitdesarrterdsquelavaleurdellmentdutableaudevientsuprieurece
quonrecherche,douneprobablecomplexitmoyenneplusbasse.Maisilresteunesolutionplusefficace.
Ladichotomieconsistediviserpardeuxlintervallederecherchetantquellmentrecherchnestpastrouv.Surun
tableautde10lmentstris:

Indice 1 2 3 4 5 6 7 8 9 10

Valeur 2 7 9 10 11 14 17 18 20 22

Vousvoulezsavoirsilavaleur20estprsentedansletableau.

tape1:Calculerlindicesituaumilieudutableau.Lindicededbutest1,lindicedefinest10,lemilieuvaut
dbut+fin/2.Commecettevaleurnestpasforcmententireonrcupreladivisionentire:(dbut+fin)DIV2.
Ici5.

Indice 1 2 3 4 5 6 7 8 9 10

Valeur 2 7 9 10 11 14 17 18 20 22

tape2:Comparerlavaleurt[5]avec20.tantinfrieure,celaveutdirequelavaleur20estforcmentaudel
delindice5.OnpositionneDbut6,etonrecalcule(dbut+fin)DIV2.Ici8.

Indice 1 2 3 4 5 6 7 8 9 10

Valeur 2 7 9 10 11 14 17 18 20 22

tape3:Comparerlavaleurt[8]avec20.tantinfrieure,celaveutdirequelavaleur20estaudeldelindice
8.OnpositionneDbut9,etonrecalcule.Onobtient9.

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 - Jonifar lina


115
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

LecodeenJavacorrespondantestlesuivant:

class chap5_dicho {
public static void main(String[] args) {
int t[]={2,7,9,10,11,14,17,18,20,22};
int d,f,m,rech;

rech=15;
d=0;
f=t.length-1;

do {
m=(int)((d+f)/2);
System.out.println("d="+d+", f="+f+", m="+m+", t[m]="+t[m]);
if(rech>t[m]) d=m+1;
else f=m-1;

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

if(rech==t[m]) System.out.println(rech+" trouv la position "+m);


else System.out.println(rech+" na pas t trouv");
}
}

ENI Editions - All rigths reserved - Jonifar lina - 9-


116
Structuresetenregistrements

1.Principe

Les tableaux sont certes trs pratiques, mais ils ne permettent pas toujours de rpondre efficacement tous les
besoinsdestockage.Untableauestunestructurededonnesdonttousleslmentssontdemmetype.Quefaire
quandvousavezbesoindeplacerdansunestructuredetypetableaudesenregistrementsdetypesdiffrents?

Comme exemple concret, prenez un catalogue de produits dans un magasin spcialis. Un article est dcrit laide
dunerfrence,unnom(libell)etunprix.Lesdeuxpremierssontdeschanesdecaractres,ledernierunnombre
rel.Commentsereprsentercelaavecdestableaux?Ilfaudraittroistableaux:unpourlesrfrences,unautrepour
leslibellsetuntroisimepourlesprix.Lindicedelarticledevraittreidentiquepourlestroistableaux.

Cestpossible,faisable,maisenpratiquetotalementingrabledsquilsagitdallerunpeuplusloinquedesimples
traitements.Quiddestri?Quiddesrecherches?Cadevientdifficile.Ilfaudraitdoncunesortedemtatypeparticulier
quipourraitregrouperenunseulensembledesvariablesdetypesdiffrents.

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
diffrentsounon.Cesstructurescomposesdeplusieurslmentsformentuneentituniquequiestappeleuntype
structur.

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
lmentsdetypesprimitifs(entiers,rels,chanes,caractres),destableaux,maisaussideslmentsdautrestypes
structurs.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, vous dclarerez les types structurs hors du programme et des sousprogrammes, 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

Chaquestructureporteunnom.Cenomserautilispourdclarerdesenregistrements.

Une structure peut contenir 1 n champs, du mme type ou de types diffrents. Une structure un seul
champestensoitotalementinutile.

Lastructurepourdcrireunarticleseraitdoncquelquechosecomme:

Type
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct

b.Enregistrement

ENI Editions - All rigths reserved - Jonifar lina - 1-


117
Un enregistrement est une "variable" dun type structur donn. Il se dclare exactement comme une variable, au
mmeendroit,souslemotclVAR.Unenregistrementpeutdonctreconsidrcommeunevariable,unpeuspciale
cependant.

VAR
nom_enreg:nom_type

Danslecadredelexempleprcdent,vousdclarezdesarticlesainsi:

VAR
article1,article2,article3:tarticle

Enmmoire,lesdiverslmentsdunenregistrementpeuventgnralementtrereprsentscommetantdansdes
zonescontigus.

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, et plus particulirement pour la ressemblance avec un contenu de base de donnes relationnelle,
lanalogienestpascomplte.Unenregistrementnecontientpasdidentifiantoucluniquesetriennempcheque
deuxenregistrementsdemmetypecontiennentlesmmedonnes.Ceseraitvousauseindevotreprogramme
degrercescasdefigure.

Demmelechampdapplicationdesenregistrementsestbeaucoupplusvastequilnyparat.Certainslangagesles
utilisentpourdeschosestotalementdiffrentesquunedescriptiondedonnesdegestion.Ainsiunlangagecomme
leCdisposedetypesstructurspourgrerlesfichiers:ouverture,fermeture,position,typedaccs,etc.,maisaussi
leurnom,leurrfrencesurledisque,leurspropritaires,leursdroits,Dautrestypesstructurssontutilespourla
gestiondesdatesetheures,pourreprsenteruneconnexionrseau

3.Utiliserlesenregistrements

Lesenregistrementssontcompossdeplusieurslmentsappelschamps.Quandvousmanipulezunenregistrement,
vouslefaitesautraversdeseschamps:

Ilnestpaspossibledaffecterunevaleurunenregistrementenpassantparsonnom.Pourluiaffecterdes
valeurs,ilfautlesaffecteruneuneauxchampscorrespondants.

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 - Jonifar lina


118
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.Aussinoubliez jamais dcrirelenomdelenregistrementETlenomduchamp.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,ycompris,vousleverrezdansleprochainchapitre,commeparamtresdesousprogrammes,ensaisie,en
affichage,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 a r t i c l e 1 . r e f
Afficher "Libell du premier article ?"
Saisir a r t i c l e 1 . l i b e l l
Afficher "Prix du premier article ?"
Saisir a r t i c l e 1 . p r i x
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
a r t i c l e 2 . p r i x 1 5 . 2 5
Si a r t i c l e 1 . p r i x = a r t i c l e 2 . p r i x Alors
afficher "Les deux articles ont le mme prix"
FinSi
FIN

Voicilesconstatationsquipeuventtretiresdecetexemple:

Le nom du champ seul ne reprsente rien, il est toujours associ son enregistrement sous la forme
enreg.champ.Cequiestappelchampreprsentecettepaire.

Un champ sutilise exactement comme une variable indpendante. Cest ce quelle est puisquun type
structurestunensembledevariablesduntypedonn.

Decefait,unchamppeutrecevoirunevaleurcommeuneautre.

Enfin, le seul cas o un enregistrement peut recevoir une valeur en globalit cest quand on lui affecte un
autreenregistrementdummetype.

b.Unenregistrementdansunestructure

Untypestructurdfinitunnouveautypedevariableappelenregistrement.Unenregistrementestdclarcomme
une variable. Il semble donc logique quun enregistrement puisse faire luimme partie dun autre type structur.

ENI Editions - All rigths reserved - Jonifar lina - 3-


119
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
aussirajouterlesinformationssurlefournisseur.Poura,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 */
a r t . f a b . r e f "Fab1234"
a r t . f a b . n o m "Le roi de la tarte"
a r t . f a b . a d r e s s e "12 rue Siflette 13248 Latruelle"
a r t . f a b . t e l "0404040404"
Fin

c.Untableaudansunestructure

Vousvoulezmaintenantconnatrelenombredarticlesvendussurlesdouzemoisdelanne.Pouravousallezcrer
unnouveautypestructurquivareprendreunenregistrementtarticleauquelvousallezajouterunmoyendestocker
douzevaleursrelles.Lemeilleurmoyenquevousconnaissezdjestletableau.Vouspouvezparfaitementrajouter
untableaucommechampdestructure.

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 - Jonifar lina


120
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
b a r t 0 1 . a r t . r e f "art001_01"
b a r t 0 1 . a r t . f a b . r e f "Fab1234"
Pour i de 1 12 Faire
Afficher "Ventes du mois",i," ?"
Saisir b a r t 0 1 . v e n t e [ i ]
totaltotal+b a r t 0 1 . v e n t e [ 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
plusieurs enregistrements, comme dans lexemple de article1, article2 et article3. Lidal serait de pouvoir traiter n
articlessansavoirdclarernenregistrementsindpendants.Unenregistrementtant(larptitionestlemeilleur
amidelammoire)dclarcommeunevariable,vousavezaussiledroitdecrerdestableauxdenregistrements.Un
tableau denregistrements se dclare comme nimporte quel autre tableau. Il est parfois appel table. Dans cette
table,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 a r t i c l e s [ i ] . r e f
FinPour
Fin

ENI Editions - All rigths reserved - Jonifar lina - 5-


121
b.Unetablecommechamp

Selonlemmeprincipequuntableaudansunestructure,vouspouvezutiliseruntableaudenregistrementscomme
typededonnesdansunestructure,puisquecenestquuntableau,aprstout.
Soitunegrandeenseignedisposantdedixmagasins.Vousdevezdcriredeuxstructures:unestructuremagasin,et
unestructureenseigne.Lastructureenseignedoitcontenirlesenregistrementsdesdixmagasins.Voicicequevous
pourriezfaire:

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 e n s e i g n e . m a g a s i n [ i ] . a d r e s s e
Afficher "tel du magasin",i
Saisir e n s e i g n e . m a g a s i n [ i ] . t e l
Afficher "grant du magasin",i
Saisir e n s e i g n e . m a g a s i n [ i ] . g e r a n t
FinPour
Fin

Il ny a en fait rien de bien complexe. Vous pouvez encore aller plus loin en crant des tables contenant dautres
tables,etainsidesuite

5.EtJava?

Ilyaiciunpetitproblme.Javanedisposepas,toutaumoinsdirectement,demoyendedclarerunestructureen
tantquetelle,contrairementdeslangagescommeleC,C++oulePascal.Javaestunlangageditobjet.Lobjetest
aborddansledernierchapitre.PourcrerunobjetJava,ilfautcrireuneclasse:cestladescriptionouunesortede
"type"dobjet.Uneclassepeutcontenirdesvariables(lesattributs)etdesboutsdeprogramme(lesmthodes).Par
(mauvaise)analogieuneclassequinecontiendraitquedesvariablespourraittreapparenteunestructure.Voici
unexemplesuccinct:

class tfabricant {
public String ref;
public String nom;
public String adresse;
public String tel;
}
class tarticle {
public String ref;
public String libelle;
public float prix;
public tfabricant fab=new tfabricant();
}

class chap5_struct {
public static void main(String[] args) {
tarticle article1=new tarticle();

article1.ref="Art001_01";

- 6- ENI Editions - All rigths reserved - Jonifar lina


122
article1.fab.ref="Fab1234";
System.out.println(article1.ref);
System.out.println(article1.fab.ref);
}
}

Il est fortement probable que vous ne compreniez pas certaines instructions comme public, new, et pourquoi il faut
utiliserdesparenthses,pourquoiclassetpasstruct,etc.Nevousinquitezpas,toutceciseraexpliquaudernier
chapitre consacr lobjet. Pour linstant, remarquez seulement que dans ce cas prcis, le motcl class peut tre
utilispourdclarerdessortesdestructures.Ilestaussipossibledecrerdestableauxdobjets:

class tfabricant {
public String ref;
public String nom;
public String adresse;
public String tel;
}
class tarticle {
public String ref;
public String libelle;
public float prix;
public tfabricant fab=new tfabricant();
}

class chap5_struct2 {
public static void main(String[] args) {
int i=0;

tarticle article[]=new tarticle[3];


for(i=0;i<3;i++) article[i]=new tarticle();

article[0].ref="Art001_01";
article[0].fab.ref="Fab1234";
article[1].ref="Art002_02";
article[1].fab.ref="Fab4321";
System.out.println(article[0].ref);
System.out.println(article[0].fab.ref);
System.out.println(article[1].ref);
System.out.println(article[1].fab.ref);
}
}

ENI Editions - All rigths reserved - Jonifar lina - 7-


123
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. Or peuttreavezvousremarququelqueslimitationsfrustrantes,etnotammentunecertainelourdeur
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.
Nauraitilpastplussimpledelefaireuneseulefois,etdepasserceblocdinstructionsuniquementlavaleurdont
onveutrcuprerlavaleurabsolue?
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 rajouter le code
ncessaireceprogrammedansunestructurespcialeetpartduprogrammeprincipal.Cestcequon appelle un
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
dcompos en de plus petites units ou parties rutilisables qui sont ensuite appeles le moment opportun par le
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 quils soient, simplifiant ainsi fortement lcriture du code, et permettant
aussidallerbeaucoupplusvite.
Un programme complet forme une application. Une application est, si vous avez correctement suivi, compose de
plusieurspartiesfonctionnelles:

Leprogrammeprincipal,oublocprincipal,quicorrespondaublocprincipaldinstructionssituessouslemotcl
PROGRAMME et DEBUT. Cest ce programme qui est excut quand vous lancez lexcutable qui rsulte de
limplmentationdevotrealgorithmeenJava,parexemple.EnJava,leprogrammeprincipalestcequiestsitu
souslalignecontenantlemot"main"quisignifiedepuislanglais"principal".

Dessousprogrammes,chargsdediversrles,quipeuventallerducalculdunevaleurabsolueceluidune
puissancequelconque,uneconversiondedate,leformatagedunechanedecaractres,laffichage dunen
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.

nsousprogrammeneselancejamaistoutseul,ildoittreappeldepuisleprogrammeprincipal.Cependant,
U
un sousprogramme peut parfaitement faire appel un autre sousprogramme. Par exemple, un sous
programmechargdecalculeruneracinecarrepeutappelerlesousprogrammechargdesvaleursabsolues

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,carleprogrammeprincipalnepeut pasutiliserunsousprogrammesilnesaitpassil
existe.

<SOUS-PROGRAMME 1>
<SOUS-PROGRAMME 1>
...
PROGRAMME XYZ
VAR

ENI Editions - All rigths reserved - Jonifar lina - 1-


124
...
DEBUT
...
FIN

i dans votre algorithme vos sousprogrammes sont crits endessous du programme principal, il est fort
S
probable quand vous passez la programmation, que vous obteniez des erreurs. Un langage comme le C
autorise cependant la dclaration du nom du sousprogramme en haut du programme, et sa programmation en
dessous. Le PHP quant lui se fiche totalement de lendroit o le sousprogramme est crit. Quant Java, la
problmatiqueestdiffrentedufaitdesaconceptionobjet(dernierchapitre).

Lesousprogrammeaunestructureassezsimpleetpourcause:cestlammequepourleprogrammeprincipal:
vousydclarezvosvariables,constantes,tableaux,etc,etvousplacezvosinstructionsentreDEBUTetFIN.Voiciun
simpleexemple,pourlemomentayezuneconfianceaveugle,lestermescommeProcdureserontexpliqusunpeu
plusloin.Danscetexemple,vingttiretssontaffichs,enpartantduprincipequilslesontsurlammeligne.

Procdure RepeteCar()
Var
i:entier
Dbut
Pour i de 1 20 Faire
Afficher "-"
FinPour
FinProc

Vousconstatezquunsousprogrammeestconstitude:

Unidentifiantsousformedenom:RepeteCar(),quiluiservirapourtreappel.

Unezonededclarationdevariables.

UnblocdinstructionsencadrentreDbutetFin.

Letouttanticietdanslecadredecetexemple,prcismententrelesmotsclsProcdureetFinProc.

nalgorithmique,unsousprogrammenepeutpastredclardansunautresousprogramme.Lapossibilit
E
existe cependant parfois dans certains langages de programmation, comme le PHP, mais alors il faut faire
preuvedunetrsgranderigueur:lesousprogrammeseraconnuduresteduprogrammeseulementquandcelui
quiledclareseraluimmeappelunepremirefois

b.EnJava

EnJavaunsousprogrammesedclaresouscetteforme:

type_donnee nom_fonction(argument1, argument2, ..., argumentn) {


/* code du sous programme */
return valeur ; /* suivant le retour */
}

Vousnavezpasencorerencontrcequestunretourniunargument.Cenestpasgnantpourlespetitsexemples.
EnJavaunsousprogrammeestappelunemthode.Cenestpasunequestionderhtoriquemaisliaufaitque
Javaestunlangageobjetetquecenesontpasdessousprogrammesausenspropredutermemaisdesmorceaux
deprogrammesauseindunobjet.VousverreztoutcecidanslechapitreUneapprochedelobjet.
PourreprendrelepetitsousprogrammeRepeteCar(),sachezquesivousvoulezviterenJavaunpassagelaligne,
vous pouvez utiliser print la place de println, le ln de ce dernier signifiant linefeed. Aussi, dans le cadre de cet
exempleetdetouslessuivants,saufdanslechapitreUneapprochedelobjet,vousrajouterezunmotcl"static"
devant la dclaration de la mthode (du sousprogramme). Enfin, comme ce sousprogramme ne retourne pas de
valeur,vousyrajouterezaussilemotcl"void".

static void RepeteCar() {


int i ;
for(i=1 ;i<=20 ;i++) System.out.print("*");

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


125
System.out.println();
}

3.Appel

Un sousprogramme est excut depuis le programme principal ou un autre programme. Pour a, le programme fait
appelausousprogramme.Lappelausousprogrammeestuneinstructionquivadclencherlexcutiondeceluici.Cet
appel peut avoir lieu nimporte o. Suivant les diverses conventions, les sousprogrammes peuvent tre appels
depuis une instruction Appel, ou Appeler. Plus simplement, il est dusage dappeler, comme vous et moi, un sous
programmeparsonnom.Lusagepeutcependantchangerselonletypedesousprogramme,procdureoufonction,
les instructions cidessus tant souvent rserves aux procdures. Pour reprendre le sousprogramme RepeteCar(),
voiciunexempledappel:

Procdure RepeteCar()
VAR
i:entire
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

Les plus perspicaces dentre vous auront remarqu que la variable i est dclare deux fois, une fois dans le sous
programme,etunefoisdansleprogrammeprincipal.Cestnormal,lesexplicationsarriverontentempsvoulu.
Lorsquelesousprogrammesetermine,linstructionsituejusteendessousdesonappelestexcute.Onditquilya
retourdusousprogrammeverslinstructionsuivante,ouappelante.

Enfin, un sousprogrammepeuttreappelenluifournissantdesvaleurs,appelesparamtres.Cesvaleursseront
placesdansdesvariablesutilisablesauseindusousprogrammecommetouteautrevariable.

VoicilexemplecompletenJavaavecengraslappellamthode(sousprogramme).

class chap6_declare {
static void RepeteCar() {

int i ;

for(i=1 ;i<=20 ;i++) System.out.print("*");

System.out.println();

public static void main(String[] args) {


int i;
System.out.println("10 lignes de 20 caractres");
for(i=1;i<=10;i++) R e p e t e C a r ( ) ;
}
}

4.Fonctionsetprocdures

LesousprogrammeRepeteCar()atdclaraveclemotclProcdure,etilvousatindiquaussilexistencedu
motclFonction.Ilyadoncdeuxtypesdesousprogrammes.Certainslangagespeuventproposeroulun,oulautre,
parfoislesdeux.Vousentendrezparfoisparlerdelangagesprocduraux(commelePascal)oufonctionnels(commele

ENI Editions - All rigths reserved - Jonifar lina - 3-


126
C).

Avantdecontinuer,justeunpetitmotsurJava.Javanefaitpasdediffrencesentrelesfonctionsetlesprocdures
tellesqueprsentesici.EnJava,lesprocduressontdesfonctionsquineretournentpasdevaleurs,ouplutt,vous
lavezcompris,desmthodesquineretournentpasdevaleurs.

a.Lesprocdures

Les procdures sont des sousprogrammes constitus dune suite dinstructions indpendantes. Une procdure ne
retournepasdersultatoudevaleurauprogrammequilaappel,toutcommelesvaleurspassesenparamtrene
sont pas forcment modifies de manire globale. Une procdure pourrait faire lobjetdun programme part. Son
contenupeutcependantparfoisinfluersurledroulementglobalduprogramme,silmodifieunfichier,unebasede
donnes,etc.

La procdure RepeteCar() est un exemple typique : le bloc de donnes rptitif influe sur laffichage, mais ne
retournerienentantquetel.

Ilexistecependantquelquesmoyensindirectspouruneprocdurederetournerunevaleur:

en passant celleci par rfrence, selon le mme principe que ce qui a t expliqu pour les tableaux : le
sousprogrammereoitlarfrencedelavariable,etpeutlamodifierverscellecontenantlanouvellevaleur.
Ceciestdailleursaussipossibleaveclesfonctions.

Plussimplement,lalgorithmiqueeffectuesouventunedistinctionentrelesvaleursenentredelaprocdure
(celles quon lui transmet) et les valeurs en sortie. Dans ce cas, autant utiliser les fonctions, notamment si
uneseulevaleurdoittreretourne.

Enmodifiantlescontenusdesvariablesglobales,variablesaccessiblespourtouslesprogrammesetlessous
programmestantenlecturequencriture(cf.cechapitre,Variableslocalesetglobales).

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

UnefonctionsedclareaveclemotclFonction,suividesonnometdutypedevaleurquelleretourne.Ce
peuttrenimportequeltype(entier,rel,chane).

Unefonctionpeutcontenirunezonededclarationdevariableetdetypesstructurs.

LeblocdinstructionsestencadrentreDbutetFinFonc.

LavaleurdelafonctionestretourneparlinstructionRetourne.Lavaleurretournedoittredummetype
quecelleattendueparladclarationdelafonction.

Fonction equation():rel
Var
a,b,c,x:rels
Dbut
xa*x*x+b*x+c

- 4- ENI Editions - All rigths reserved - Jonifar lina


127
retourne x
FinFonc

Ilexisteunediffrencetrsimportanteentreuneprocdureetunefonction:

Laprocdureestvuecommeuneinstruction.

Lafonctionestvuecommeunevaleur.

Tout comme une variable retourne une valeur, une fonction retourne aussi une valeur, ce qui veut dire quune
fonctionpeuttreutilise(appele)partoutounevariablepourraitltre:dansuneexpression,dansuncalcul,un
affichage,uneaffectation,etc.Dansunseulcas,lafonctionnepeutpastreutilise:unefonctionfournitunevaleur,
ellenepeutpassevoiraffecteunevaleur.Ceciestinterdit:

equationx ; /* INTERDIT */

maisceciestautoris:

xequation()

xrecevraalorslavaleurretourneparlafonctionequation()vialinstructionRetourne.

PROGRAMME EQ1
Var
result:rel
Dbut
resultequation()
Afficher result
Fin

ote:linstructionRetourneneretournepasunevariable,maisunevaleur.Cettevaleurpeuttrelecontenu
N
dune variable, mais aussi une autre fonction (auquel cas cest le rsultat de cette autre fonction qui sera
retourn)ounimportequelleexpressionpouvanttrevalue.Lafonctionequation()peutdonctrecriteainsi:

Fonction equation():rel
Var
a,b,c,x:rels
Dbut
Retourne a*x*x+b*x+c
FinFonc

Voici le mme exemple en Java. Cette fois la mthode va retourner un entier, ce qui est prcise lors de sa
dclaration.

static double equation() {


double a,b,c,x ;
/* 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 a. 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

ENI Editions - All rigths reserved - Jonifar lina - 5-


128
dclare.UnevariabledclaredansunsousprogrammesouslesmotsclsProcdureouFonctionnepourradans
ce cas qutre lisible et modifiable uniquement dans ce sousprogramme. Idem pour le programme principal : une
variabledclaresouslemotclProgrammeneseraaccessiblequeparceluici.
Lesvariablesaccessiblesuniquementparleprogrammeousousprogrammedanslesquelsellessontdclares,sont
appelesdesvariableslocales.Touteslesvariablesquevousavezrencontresjusquprsentsontdesvariables
locales.

Les variables locales de mme nom nont aucun rapport entre elles. Elles sont totalement indpendantes les unes
desautresetaucuneinteractionentreellesnestpossible.Lesvariableslocalespeuventdoncparfaitementporterun
mmenom.LavariableideRepeteCar()nestpasdutoutlammequelavariableiduprogrammeLignes.Ilnya
aucunrisquedaccderlavaleuroudemodifiercelleciparaccidentdelunverslautreprogramme.Ductdela
mmoire,lecontenudecesdeuxvariablesestcloisonnetdistinct,desadressesdiffrentes.

n Java, une variable dclare dans le programme principal ou dans une mthode est locale ce bloc
E
dinstructions,cestdirenonvisibledepuislesautresmthodes.

b.Globales

Ilseraitpourtanttrspratiquedepouvoiraccderunevariabledepuisnimportequelendroitduprogramme,quil
soit principal ou un sousprogramme. Ce mcanisme permettrait dutiliser son contenu et den modifier la valeur
partoutdansleprogramme.Laportedune telle variable stendraittoutlecode.Cetypedevariablesappelle
unevariableglobale,etelleexistetantenalgorithmiquequedanslaplupartdeslangages.

Unevariableglobaleestdclareendehorsdessousprogrammesetduprogrammeprincipal,avantceuxci,cest
dire en premier dans lalgorithme. tant globale, elle est accessible de partout, tant en accs (lecture du contenu)
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:

- 6- ENI Editions - All rigths reserved - Jonifar lina


129
Ellenestdclarequuneseulefoispourlintgralitduprogramme.Ellenedoitdoncjamaistreredclare
tantdansleprogrammeprincipalquedansunsousprogramme.

Ellepermetindirectementde"passer"desvaleursauxsousprogrammes qui lutilisent.Cest un "dommage


collatral", et les variables globales ne devraient tre rserves que lorsque cellesci sont vraiment
communeslaplusgrandepartieducode.

Ilseraitridiculededclarertouteslesvariablesenglobales.Laplupartdesprogrammesetsousprogrammes
ne les utiliseraient pas toutes, et en plus vous risqueriez par accident, pensant une variable locale, den
modifiercertainessansyprendregarde,etainsidemettreenprillexcutionduprogramme.

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.VariablesglobalesetJava

En Java les variables globales se dclarent hors des blocs de programmes comme la mthode main() (programme
principal) et les mthodes. Elles sont dclares tout en haut, en dessous du motcl class. Toutes ces variables
serontvisiblesdepuisnimportequellemthodeouprogrammeprincipaleauseindecette"classe",voiremmeau
del car il est possible de prciser des niveaux de visibilit des variables. Tout ceci vous sera brivement expliqu
dans le dernier chapitre. En attendant ce chapitre et un surcrot dexplications, outre le type de la variable vous
rajouterezlemotcl"staticdevantlesvariables.

class chap6_globale {
static char c;
static int nbcar;

static void RepeteCar() {

int i ;

for(i=1 ;i<=nbcar ;i++) System.out.print(c);

System.out.println();

}


public static void main(String[] args) {
c=*;
for(nbcar=1;nbcar<=10;nbcar++) RepeteCar();
}
}

6.Lesparamtres

Maintenant que vous rservez les variables globales des cas bien prcis, il vous faut trouver un autre moyen de
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:

ENI Editions - All rigths reserved - Jonifar lina - 7-


130
Proc
d ure nom_proc(E param1:type,ES param2:type,S param3:type)

Lesparamtresduneprocduresontdetroiscatgories:

Ceux en entre, qui correspondent aux valeurs que vous souhaitez transmettre la procdure. Entre les
parenthses,ilssontprcdsdun"E",commeEntre,carcesontlesvaleursenentredelaprocdure.

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.

Ceuxenentreetensortie,prcdsde"ES".

Quandvousavezplusieursparamtresenentre,ilsuffitdetouslesmettreaprsleE,etmmedelesregrouper
selonleurtype.Cetteprocdureprendcinqparamtres:troisentiersetdeuxchanes.

Procdure proc(E p1,p2,p3:entiers,p4,p5:chanes)

LaprocdureRepeteCar()seprtebienunparamtre.Commenteneffetutiliserunevariableglobalepourspcifier
le nombre de caractres rpter ? Autant passer ce nombre en paramtre. Voici le programme modifi en
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(lenombrede
secondes)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

Passerunenregistrementcommeparamtre

Laprocdureprcdentefonctionnecertesmerveille,maisavecunpeuplusderflexion,pourquoinepasutiliser

- 8- ENI Editions - All rigths reserved - Jonifar lina


131
uneseulestructurepourreprsentertouteslescomposantesduneheure?

Struct hms
heures:entier
minutes:entier
secondes:entier
FinStruct

Unenregistrementpeuttrepassenparamtreduneprocduretoutcommeunevariable,enentreouensortie.
Laprocdureetleprogrammepeuventtreconvertiscommececi:

Types
Struct hms
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.Aussiilnyapasbesoindespcifiersiles
paramtressontenentreouensortie.Ilssontforcmentenentre.Parcontre,lavaleurdelafonctionpeuttre
denimportequeltype.

Voici une fonction qui fait linverse de la procdure prcdente : elle reoit des heures, minutes et seconde, et en
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):entire
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:

ENI Editions - All rigths reserved - Jonifar lina - 9-


132
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
Var
nb_secondes:entier
heures:hms
Dbut
nb_secondes3950
heuressec_to_hms(nb_secondes)
Afficher heures.heures,heures.minutes,heures.secondes
Fin

ne procdure ne retournant quune seule valeur et quel que soit son type est toujours convertible en
U
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.ParamtresetJava

Le langage Java accepte nimporte quel type de paramtre en argument dune mthode (une fonction) : types
classiques comme les entiers, ou tableaux, structures (enregistrements), objets. Dans certains cas ces paramtres
peuvent tre en entre et en sortie : uniquement si la variable passe en argument nest pas dun type primitif
(entiers, rels, caractres). Pour les autres il ny a pas le choix : les tableaux ou enregistrements passs en
paramtresenentreetsortie,cequiveutdirequelesparamtresdecegenre,silssontmodifisdanslamthode,
sontaussimodifishorsdelamthode.Cestleprincipedupassageparrfrence.Lesrfrencesserontabordes
unpeuplusprofondmentdanslechapitreNotionsavancesconsacrauxnotionsavancesdontlespointeurs.

En attendant tous les exemples prcdents sont faisables en Java, bien heureusement. La procdure RepeteCar()
estdonctransformeainsi:

class chap6_param1 {
static void RepeteCar(int nbcar, char c) {

int i ;

for(i=1 ;i<=nbcar ;i++) System.out.print(c);

System.out.println();

- 10 - ENI Editions - All rigths reserved - Jonifar lina


133
}

public static void main(String[] args) {
int nb;
for(nb=1;nb<=10;nb++) RepeteCar(nb,*);
}
}

VoicienJavaunereprisedesstructureshmsetdesfonctionshms_to_sec()etsec_to_hms().Ilnyapasdedifficult
danscetteimplmentation.

class hms {
int heures;
int minutes;
int secondes;
}

class chap6_secondes {
static int hms_to_sec(hms duree) {
int total;
total=duree.heures*3600+duree.minutes*60+duree.secondes;
return total;
}

static hms sec_to_hms(int nbsec) {
hms duree=new hms();
duree.heures=nbsec/3600;
nbsec=nbsec%3600;
duree.minutes=nbsec/60;
duree.secondes=nbsec%60;

return duree;
}
public static void main(String[] args) {
int nb_secondes, nb_secondes1,nb_secondes2;
hms heures=new hms();

// exemple 1
nb_secondes=39450;
heures=sec_to_hms(nb_secondes);
System.out.println(heures.heures+":"+heures.minutes+":" +heures.se-
condes);

// exemple 2
nb_secondes1=3950;
nb_secondes2=hms_to_sec(sec_to_hms(nb_secondes1));
System.out.println(nb_secondes2);
}
}

d.Petiteapplicationfonctionnelle

Pourfinir,cesdeuxfonctionssontpluspratiquesquilnyparat.Grceelles,vouspouveztrsfacilementtrouverle
tempscoulentreunepremireheureetunesecondeheure.Leprincipeestdesplussimples:

Voussaisissezdeuxhorairesdansdesenregistrementshms.

Vouslesconvertissezennombredesecondes.

Vousfaitesladiffrenceentrecesdeuxnombres.

Vousconvertissezlersultatenenregistrementhms.

Ditcommececi,apourraitsemblerunpeucompliqusilesfonctionsnexistaientpas.Vousavezdoncbesoindela
dfinition du type structur hms et des deux fonctions nbsec_to_hms et hms_to_nbsec. Vous navez mme pas
besoindevariablespouryplacerlesnombresdesecondes.Uneseuleligneaveclesbonsparamtressuffitsen

ENI Editions - All rigths reserved - Jonifar lina - 11 -


134
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
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
d e l t a s e c _ t o _ h m s ( h m s _ t o _ n b s e c ( h e u r e 2 ) - h m s _ t o _ n b s e c ( h e u r e 1 ) )
Afficher "Il sest coul :"
Afficher delta.heures,delta.minutes,delta.secondes
Fin

Pourquoi ne pas aller encore plus loin en crant une fonction qui calcule seule la dure en faisant appel aux deux
autresfonctions?Eneffetvouspouvezparfaitementappelerdessousprogrammesdansdautressousprogrammes,
doncdesfonctionsdansdesfonctions,oudesprocduresdansdesfonctionsetrciproquement.Voiciunefonction
hms_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

Ducoupleprogrammeprincipalestmodificommececi:

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
d e l t a h m s _ d e l t a ( h e u r e 1 , h e u r e 2 )
Afficher "Il sest coul :"
Afficher delta.heures,delta.minutes,delta.secondes
Fin

- 12 - ENI Editions - All rigths reserved - Jonifar lina


135
VoicienfinuneimplmentationenJavadelafonctionhms_delta()etducalculdecedernierexemple:

...
class chap6_secondes {
...
static hms hms_delta(hms hms1, hms hms2) {
hms delta=new hms();
delta=sec_to_hms(hms_to_sec(hms2)-hms_to_sec(hms1));
return delta;
}
public static void main(String[] args) {
hms heures=new hms();
hms heures2=new hms();
hms delta;
...
// exemple 3
heures.heures=10;
heures.minutes=30;
heures.secondes=45;
heures2.heures=18;
heures2.minutes=36;
heures2.secondes=24;

delta=hms_delta(heures,heures2);
System.out.println(delta.heures+":"+delta.minutes+":"+delta.secondes);
}
}

7.Sousprogrammesprdfinis

a.Unchoiximportant

Presque tous les langages de programmation proposent dune manire ou dune autre la possibilit de crer des
sousprogrammes.CestlecasduC,duC++,deJava,deC#,etc.Vouspouvez,etvousallezcrervospropressous
programmes,selonlecas.

Cependant, ces mmes langages sont souvent dj fournis avec une quantit plus ou moins importante de sous
programmes. Dans les exemples prcdents en Java, vous en avez dj utilis. En Java, les instructions println ou
readLine peuvent tre considrs, sous certains aspects (cf le dernier chapitre) comme des sousprogrammes,lun
chargdafficherdutexte,lautredesaisirdesdonnes.LelangagePHPproposeunequantitimpressionnantede
sousprogrammes : calculs mathmatiques, travaux graphiques, manipulations de bases de donnes : plusieurs
milliers!

Autrementdit,lesconcepteursdulangageoudautrespersonnesfournissentdesbibliothquesdesousprogrammes
pour rduire autant que possible et sans tomber dans lexcs, le travail des programmeurs. Avant de crer vos
propressousprogrammes,vrifieztoutdaborddansladocumentationdulangagequevousutilisez,sivouspouvez
ytrouvervotrebonheur.

Unsousprogrammeprdfiniporteunnomquirefltesouventcequilfait.Cestuneprocdureouunefonction(cf.
lasectionVariableslocalesetglobalesdecechapitre),plussouventunefonction,quiretourneunrsultat.

b.Quelquesexemples

Fonctionssurchanes

Vous pouvez obtenir la longueur dune chane de caractres avec la fonction longueur. Elle semploie en passant
entre parenthses une chane de caractres, et retourne comme rsultat une valeur entire qui est le nombre de
caractresdecettechane.

Programme len
Var
txt :chane
l :entier
Dbut
txt"Un petit texte"
llongueur(txt)

ENI Editions - All rigths reserved - Jonifar lina - 13 -


136
Afficher l /* affiche 14 */
Fin

Les fonctions milieu, gauche et droite permettent de dcouper des morceaux dans une chane de caractres. 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
partantdelagauche,pourdroitedepuisladroiteetpourmilieudepuislapositionindique.Lespositionsdmarrent
1.Leprogrammesuivantvatoutdabordaffichertouslescaractresdunechane,lesunsaprslesautres,puisle
premiermot,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
Affiche gauche(txt,5) // Salut
Affiche droite(txt,4) // amis
Fin

La fonction pos (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

Lafonctionsupprpermetdesupprimerunesouschanedunechanedecaractresenfonctiondesapositioninitiale
etdesalongueur.

Programme suppr
Var
txt :chane
Dbut
txt"abcdefgh"
txtsuppr(txt,4,len(txt)-3)
Affiche txt /* reste abc */
Fin

Fonctionsmathmatiques

Tousleslangagesproposentsouventungrandnombredefonctionsmathmatiques.Dommagepourvous,laplupart
desexemplesdesdernierschapitresontdesquivalentssousformedefonctions.Cestlecasdesracinescarres,
despuissances,desfactorielles,desfonctionstrigonomtriquescommelessinus,cosinusettangente,etc.

racine(x):donnelaracinecarredex

puissance(x,y):donnexlapuissancey

sin(x):sinusdex

- 14 - ENI Editions - All rigths reserved - Jonifar lina


137
cos(x):cosinusdex

tan(x):tangentedex

Certainesconventionsalgorithmiquesnereconnaissantpasles%ouMODcommeoprateursmodulos(alorsqueles
langages,eux,si),vouspouveztrouverparfoislafonctionmod(x,y),quiquivautxMODy,etlafonctionentier(x,y)
quiquivautxDIVy.
Une fonction trs sympathique est la fonction alatoire(). Elle dtermine un nombre alatoire. Utilise sans
paramtre, elle trouve un rel entre 0 et 1. Utilise avec un paramtre entier, elle trouve une valeur entre 0 et n.
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 dsaisie Alors
Afficher "Rat, essayez encore"
FinSi
Jusqu d=saisie
Afficher "Bravo !"
Fin

Fonctionsdeconversion

Vouspouvezconvertirunechanedecaractresenvaleurnumriquelaidedelafonctionchnum,quiprendcomme
paramtrelachanedecaractresetquiretournelavaleurenentierourel(selonlecas).Lachanedoittreune
reprsentationdunevaleurnumrique,etriendautre.

Lafonctionnumchfaitexactementlecontraire:elleconvertitunnombreenchanedecaractres,lidalpoursauver
toutcecidansunfichiertexte.Voiciunexemplesimple:

Programme conversion
Var
rPi :rel
cPi :chane
Dbut
rPi=3.1415927
cPi=numch(rPi)
Afficher cPi
cPi="3.14"
rPi=chnum(cPi)
Fin

FonctionsprdfiniesenJava

Les fonctions prdfinies en Java sont extrmement nombreuses. Dans les exemples prcdents vous avez eu
loccasiondenrencontrerquelquesunes,notammentdesconversionsdechanesversdesentiers,parexemple.En
fait, les fonctions prdfinies sont en fait souvent associes des types particuliers, des objets particuliers, etc.
Les fonctions sont en fait des mthodes associes la manipulation dlments particuliers. Le mieux est de vous
reporterladocumentationenlignedeJavaladressehttp://java.sun.com/javase/6/docs/api/pourlaversion6du
jdk.Dansleslistesdegauche,notammentcelledubas,recherchezString.Danslecadreprincipalsaffichetoutela
documentation associe ce type dobjet, car oui en Java une chane de caractres est un objet. Dans cette
documentation, vous trouvez toutes les fonctions associes aux chanes de caractres. Notamment, voici celles qui
peuventvousintresser:

length():retournelalongueurdelachane.

substring(dbut[,fin]):dcoupeunmorceaudechane.

trim():supprimetouslesespacesendbutetfindechane.

ENI Editions - All rigths reserved - Jonifar lina - 15 -


138
indexOf(chane [,depart]) : retourne la position dune chane dans une autre, depuis une ventuelle
position.

isEmpty():retournevraioufauxselonquelachaneestvideounon.

valueOf(valeur):lavaleurestconvertieenchane.

Notez que les positions dans les chanes dbutent 0. Pour utiliser ces fonctions, vous devez les accoler avec un
pointaunomdelavariabledetypeStringquevousutilisez.Parexemple:

class chap6_predef {
public static void main(String[] args) {
int valeur;
String txt1,txt2;

txt1=" Bonjour les amis ";
txt1=t x t 1 . t r i m ( ) ; // supprime les espaces
valeur=t x t 1 . l e n g t h ( ) ; // longeur : 16
System.out.println(txt1+" de longueur "+valeur);

txt2=t x t 1 . s u b s t r i n g ( 3 , 5 ) ; // jo
System.out.println(txt2);
}
}

Lesfonctionsmathmatiques

Toujours dans la documentation en ligne, slectionnez Maths dans la liste en bas gauche. Le cadre central vous
propose toutes les fonctions mathmatiques et il y en a normment. Pour utiliser ces fonctions, vous devez leur
accolerMathavecunpointdevant.

class chap6_math {
public static void main(String[] args) {
long valeur;
valeur=(long)Math.pow(2,48);
System.out.println(valeur);
}
}

8.Derniercas:lestableaux

Une fonction peut retourner un tableau seulement si la variable qui la reoit est ellemme un tableau de mme
dimensionetdemmenombredindices.
De mme, il est possible de passer un tableau en paramtre dune 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, si le langage dimplmentationneproposepasdinstructions ou de fonctions prdfinies pour trouver la
tailleduntableau,vousdevriezpassercellecienparamtre.Quandvouspassezuntableauenparamtredunsous
programme,mettezuniquementsonnomsansutiliserlescrochets.
Denombreuxexemplessontpossibles.Parmieux,pourquoinepastrieruntableau?Reprenezlundesalgorithmesde
triduchapitreprcdent,commeletriparinsertion,etadaptezlepourletransformerenfonction:

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

- 16 - ENI Editions - All rigths reserved - Jonifar lina


139
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

EnJavacestencoreplussimple:ilsefichedelatailledestableauxpasssenparamtres,etenpluspourpouvez
obtenirlatailleduntableau.Lafonctiontri_tableau()nereoitdoncquunseulparamtre,letableautrier,etnest
mmepasobligederetournerletableaucarilestpassenrfrence.

class chap6_tri {
static void tri_tableau(int[] tab) {
int i,mem,pos,cpt;

cpt=tab.length;

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;
}
}

public static void main(String[] args) {


int t[]={48,17,25,9,34};
int i,cpt;

cpt=t.length;

System.out.println("Avant :");
for(i=0;i<cpt;i++) System.out.print(t[i]+" ");
System.out.println();

tri_tableau(t);

System.out.println("Aprs :");
for(i=0;i<cpt;i++) System.out.print(t[i]+" ");
System.out.println();
}
}

Lersultatestlesuivant:

Avant :
48 17 25 9 34
Aprs :
9 17 25 34 48

ENI Editions - All rigths reserved - Jonifar lina - 17 -


140
Lessousprogrammesrcursifs

1.Principe

Unsousprogrammepeutappelerunautresousprogramme, quel quilsoit.Doncunsousprogrammepeutsappeler


luimme. Un sousprogramme est dit rcursif sil est, tout au moins en partie, dfini par luimme. Autrement dit, si
dans une fonction ou une procdure vous faites appel cette propre fonction ou procdure, cellesci sont dites
rcursives.Lexempleleplussimpleestlafactorielle:n!=n*(n1)!
Ilexistedeuxtypesdercursivit:

Simpleourapide:lesousprogrammesappelleluimme.

Croiseouindirecte:deuxsousprogrammessappellentlunlautre:lepremierappellelesecond,quiappelle
lepremier,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:

10!=10*9*8*7*6*5*4*3*2*1

Donc10!=10*(9*8*7*6*5*4*3*2*1)

Donc10!=10*9!

Doncn!=n*(n1)!

Sivouscrezunefonction(appropriedanscecas)appelefact()etchargedecalculerlafactorielleden,vousauriez
unraccourcidecegenre:

ENI Editions - All rigths reserved - Jonifar lina - 1-


141
fact(n)=n*fact(n-1)

Delilvousdevienttrsfaciledcrireunefonctionfact()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:

1 re tape:5>1?Oui:fact(5)appelle5*fact(4)

2 m e tape:4>1?Oui:fact(4)appelle4*fact(3)

3 m e tape:3>1?Oui:fact(3)appelle3*fact(2)

4 m e tape:2>1?Oui:fact(2)appelle2*fact(1)

5 m e tape:1>1?Non:fact(1)sortenretournantlavaleur1fact(2).

Estcefini?Non!Chaquefonctionappeleseterminantretournesavaleurauprogrammeousousprogrammelayant
appel.Doncacontinue:

6 m e tape:fact(2):2*fact(1)=2,retourne2fact(3)

7 m e tape:fact(3):3*fact(2)=6,retourne6fact(4)

8 m e tape:fact(4):4*fact(3)=24,retourne24fact(5)

9 m e tape:fact(5):5*fact(4)=120,retourne120auprogrammeappelant.

Sivoussuivezlordredesappels<>retoursvousobtenezleschmasuivant:

Lesallersretoursdunappelrcursif

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 - Jonifar lina


142
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

LammefonctionenJavaavecsonprogrammedaccompagnement:

class chap6_fact {

static int fact(int n)
{
if(n==0) return 1;
else return n*fact(n-1);
}

public static void main(String[] args) {
int n;

n=fact(10);
System.out.println(n);
}
}

3.Unexemplepratique:lestoursdeHanoi

LestoursdeHanoisontunjeuderflexionquiatinventen1883parN.ClausdeSiamprofesseuraucollgedeLi
SouStian.Silacuriositvousapoussrecherchercesnomsetvilles,peuttreavezvouseuunesurprise:aucun
desdeuxnexiste.Cesontenfaitdesanagrammesfaisantcroirequecejeuatinventparunasiatique.Toutfaux!
N. Claus de Siam est lanagramme de Lucas DAmiens, (Edouard Lucas en fait), n Amiens, et LiSouStian est
lanagrammedeSaintLouis,nomduLyceoLucasenseignait.

LestoursdeHanoidriventdunelgendeHindouquiditquuntempledisposedetroispoteauxsurlesquelssempilent
64 disques en or de diamtres diffrents. Les prtres de Brahma dplacent continuellement les disques du premier
poteau vers le troisime en passant ventuellement par un poteau intermdiaire et en respectant quelques rgles
simples:

Ilsnepeuventdplacerquunseuldisquelafois.

Ilsnepeuventdplacerundisquequedansunemplacementvideousurundisquedeplusgranddiamtre.

Lalgendeditaussiquequandlesdisquesonttempilsaudbutdestemps,etquelorsquelesprtresaurontfini
delesdplacer,ceseralafindumonde.

uldoutequesilesprtresdelalgendeavaienteuunordinateur,nousserionstousdjmortsQuoique!
N
Avec 64 disques il faut 264 1 dplacements (18446744073709551615 et uniquement sans se tromper), soit
raisondeunparseconde584542046090ans(584milliardsdannes).Sachantqueluniversaenviron14milliards
dannes(cestthorique),ilnousreste570milliardsdannespourenprofiter.Enplus,lesdisquesenordoivent
tretrslourdsdplacer.

LejeufaitrfrenceHanocardanslacapitaleduVietnam,uneanciennencoloniefranaise,lestoitsdecertaines
pagodesontlaformedeplateauxempils.
Lalgorithme rcursif pour rsoudre ce problme est un grand classique ncessitant un peu de torture mentale.
Supposonsquevoussachiezdplacern1disques.Pourendplacern,ilsuffitdedplacer(n1)disquesdupiquet1
au piquet 3, puis de dplacer le grand disque du piquet 1 au piquet 2, et de terminer en dplaant les (n1)autres
disquesdupiquet3verslepiquet2.

Soient:

ENI Editions - All rigths reserved - Jonifar lina - 3-


143
nlenombrededisques,

alapositiondedpart,valant1,

b,lapositiondarrive,valant2,

c,lapositionintermdiaireutilisable,valant3,

audpart,touslesdisquessontlapositiona,

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

SoitenJava:

class chap6_hanoi {
static void deplace(int n, int a,int b, int c)
{
if(n>0) {
deplace(n-1,a,c,b);
System.out.println("De "+a+" vers "+b);
deplace(n-1,c,b,a);
}
}
public static void main(String[] args) {

deplace(3,1,2,3);
}
}

- 4- ENI Editions - All rigths reserved - Jonifar lina


144
Lesdiffrentsfichiers

1.Prambule

Vouspermettrez,pourunefois,dtreunpeudirect :lesfichierssontunecalamitdcrireenalgorithmique.Durant
des annes, jusquaumilieudesannes1990,leCOBOLargnenmatrechezleslangagesdeprogrammationen
informatiquedegestion.Celangagetaitaussipuissantdanscedomainequesasyntaxetaitpratique.Ceuxdentre
vous qui connaissent un peu le COBOL savent de quoi il est question ici. Une des sources de sa puissance tait sa
capacitgrerlesfichiersetlesenregistrementsstructurs,danstouslessens,danstouteslesformes.

Seulement,leCOBOLestpassdemodepourlesnouveauxdveloppements.Lesmultitudesdefichiersdedonnes
diversesetvariesonttremplacespardautresstructures,notammentpardesbasesdedonnesrelationnelles,
rendantcaduqueltudedelaplupartdestypesdefichiersauprofitdelangagescommeleSQL.Pourtant,lesbasesde
donnesellesmmessontsouventstockesdansdesfichiers.
Aussi,cechapitreestpluscourtquelesautres.Ilseraitpossiblededcrireunefouledetypesdefichiers :deslivres
complets existent sur ce thme, de plusieurs centaines de pages. Les bases et dfinitions thoriques seront peu
prstoutescouvertes,maisseulsseronttraitslesfichierstextes.Javanesachantpasdirectement(vouspouvezbien
entendutoutreprogrammer,cestsonrle)grerdesfichiersdetypeindexs,celarsoutsingulirementleproblme.

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,rajoutezdeuxproblmes :

Malgr la puissance de vos ordinateurs, la capacit mmoire reste souvent limite. Un ordinateur 32 bits
"standard" (bureau, jeu) est souvent limit 4 Go. Parfois des machines vont encore beaucoup plus haut,
jusqu 64 Go. Or, mme au modeste niveau de lordinateur personnel cela reste souvent trs insuffisant : il
est impossible de conserver toutes les donnes en mmoire. Par exemple, un film au format DV dun
camescopenumriqueoccupeprsde20Go,unDVDcompletplusde8Go,etc.

Mmesiltaitpossibledeconservertouteslesdonnesenmmoirecentrale,cequiseraitsommetoutelidal
vu la vitesse daccs aux informations, cette dernire est volatile. Cestdire que tant que lordinateur est
allum,quevosprogrammesneplantentpas,etquellectricitfonctionne,ilnyaaucunproblme.Dsquon
dbranche,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
informations sont places sur un support moins volatile que la mmoire de lordinateur. Aussi un fichier se place sur
unedisquette(envoiededisparition),unebandemagntique(commelessauvegardessurbandeparexemple),une
clUSB,etsurtout,surundisquedur.

4.Lesformats

a.Typesdecontenus

Unfichiersedistinguedesautresparquelquesattributs dontsonnometsacatgorie.Ilssedistinguentaussientre
eux par lorganisationdeleursdonnescequidfinitleurformat.Vousconnaissezprobablementplusieursformats
defichiers :

lesfichierstexte

ENI Editions - All rigths reserved - Jonifar lina - 1-


145
lesdocumentsdestraitementsdetexte

lesfichierssonMP3

lesvidosDivX

lesfichiersHTML

lesimagesJPEG

lesfichiersdevotregestiondecomptebancaire

etc.

Comment sy retrouver dans tout ce bazar ? Il existe autant dorganisations de donnes quil existe de logiciels !
Cestdailleurssouventuntrsgrosproblme,cestcequonappelleunformatdefichierspropritaire :ilestsouvent
impossiblederelireunformatdonnavecunproduitconcurrent.

anapasforcmentderapportdirect,maisunpeudelobbyingdanscecas prcisnestpasdusuperflu :il



existedenombreuxformatsdefichiersdit"ouverts",dontlorganisationdesdonnesquiysontcontenuesest
connue et documente. Tout format de fichier "ouvert" est reconnu gnralement de la mme manire par les
programmes sachant les utiliser. Le PDF (pour certains documents) est un format ouvert, invent par Adobe, le
format OGG Vorbis en est un autre, concurrent du MP3. Il existe encore une diffrenciation entre les formats
propritairesetlesformatslibres.Touslesformatslibressontouverts,maisseulementtrspeudepropritairesle
sont.Unformatlibre,ouvertetrpanduestungagedeprennitetdecompatibilitdevosdonnes.OGGVorbis
estlibre,PDFnelestpas.SidemainAdobeendveloppeunenouvelleversion,ellepourraittreincompatibleavec
les prcdentes, et payante. On a vu des documents Word ne plus pouvoir tre ouverts dune version une
autre

Tout ce qui peut tre formalis peut tre stock dans un fichier. Il y a cependant des diffrences videntes et
flagrantesentreunfichierquidoitstockerunephotoetunautrequistockeunepageHTMLdunsiteweb.

Deuxcatgoriesdefichierssontdistinguables :

Lesfichiersorganisssousformedelignesdetextesuccessives,quisappellentdesfichierstexte.

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 - Jonifar lina


146
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
sous forme hexadcimale ou binaire, il serait possible de convertir les squences en instructions lisibles, cest ce
quonappelleundsassembleur.MmeprincipepourunfichierauformatMP3 :ceformatncessiteunprogramme
quivaanalyserleformatconnueteneffectuerlatransformationenondesonorequipourratreenvoyeversvotre
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,rendantce
derniertotalementinutilisable.

aconfigurationcompltedeWindowsestplacedansunregistreoubasederegistre.Cettebaseeststocke
L
dansdeuxfichiers,system.datetusers.dat,auformatbinaire.Silssontcorrompus,ilestfortementprobable
de devoir tout rinstaller. Laccs ce registre ne vous est quindirectement possible via lditeur de base de
registreregeditouregedt32,maispasenlouvrantsousnotepad.

c.Lefichiertexte

Unfichiertexteestcequilannonce :ilcontientdutextesousformedelignes.Chaqueligneestdistinctedesautres.
Poursavoirsildoitpasserlalignelordinateuroupluttlesystmedexploitationrajoutedescaractresspciaux.
SousWindows,cesontlescaractresASCIICR(CarriageReturn,retourchariot)quivaut13etLF(LineFeed,Sautde
Ligne)quivaut10.CettesquenceCRLFpasselaligne.SousUnixetsesdrivs,dontMacOS,seullecaractreLF
estncessaire(uneconversionestncessairepourconvertirdutextedeWindowsversUnixetrciproquement).Nul
besoinicidevousmontrerunecapturedunditeurouvrantunfichiertexte
Dounequalitessentielledufichiertexte :

ENI Editions - All rigths reserved - Jonifar lina - 3-


147
Unfichiertexteestdirectementlisibleparlutilisateur,etsonorganisationdevientvidente.

Dansunfichiertexte,mmelesnombressontreprsentssousformedecaractresASCII(ouunicode,selonlecas).
Le nombre 1234 sera reprsent exactement sous cette forme caractre, soit la suite ASCII 31323334
(hxadcimal),49505152 (dcimal) ou encore 0011001 0011010 0011011 0011100 en binaire. Le mme nombre
dansunfichierbinaireseraitreprsenten04D2(hxadcimal)ou10011010010enbinaire :unegrossediffrence.
Celaveutdirequequandvousallezcriredesnombresdansunfichiertexte,vousdevrezutiliserdesfonctionsde
conversiondenombresversdeschanes.Rciproquement,vousdevrezutiliseruneautrefonctionquandvouslirez
ceschanespourlesconvertirennombres.Vouspouvezutiliserlesfonctionsprdfiniespourcela :

x=chnum(txt) :convertitlachanetxtenvaleurnumrique

txt=numch(x) :convertitlavaleurnumriquexenchane

VousavezpuvoirdansquelquesexemplesdeschapitresprcdentsqueJavadisposedunarsenalintressantde
fonctions(onparleplusdemthodes,dailleurs)pourconvertirdutexteenentier,rel,etc.Unsoucipeutseposer
avec les rels : les anglosaxons (et dautres) utilisent le point comme sparateur dcimal, alors que vous utilisez
probablementlavirguleenFrance.Certesleslangagesdeprogrammationutilisentprincipalementlepoint,maisles
tableursfrancissutilisentlavirgule.Amiscanadiens,sivouslisezcelivre,voustespluschanceuxquelesfranais,
quidevrontfaireattentionenconvertissantunechaneennombreetviceversa,causedelavirgule.Dansledoute,
lisezlemanueldevotrelangage.

uasiment tous les fichiers de configuration dun systme dexploitation Unix sont des fichiers texte. Pour
Q
modifier cette configuration, il suffit donc bien souvent de louvrir avec un diteur de texte, de modifier ou
dajouterdeslignes,desauver,etcesttout.

d.Quelformatutiliser ?

Faites preuve de bon sens. Il serait ridicule dutiliser un fichier texte pour sauver une image, tout comme il serait
ridiculedutiliserunfichierbinaireuniquementpoursauverdutextesimple(unformatdetraitementdetexteestplus
complexe quilny parat). Des formats rputs ( la mode) comme le XML sont des fichiers la structure pouvant
devenirtrscomplexe,etpourtantsontdesfichierstexte.

Fichiertexte

Lespropritsdunfichiertextesont lessuivantes :

Lesfichierstextesontutilisspourstockerdesdonnesstructures.

Cesdonnespeuventtredutexte,desnombres,dumomentquetoutestconvertientextelisible.

Cesdonnesstructuressontdesenregistrements.

Lesenregistrementsdunfichiertextesontreprsentssousformesdelignes,spareslesunesdesautres
parunesquenceCRLF(Windows)ouLF(Unix/Mac).

Chaquelignereprsenteunestructuredenregistrement,selonunformatprtabli(fixeoudlimit).

Unfichiertexteestlisibleetmodifiableparnimportequelditeurdetexte.

Linterprtationdesenregistrementsdpendbienentendudesafinalit.

Unfichiertextenepeuttreluqueligneligne.

Un enregistrement se rajoute uniquement la fin du fichier. Pour modifier ou insrer un enregistrement, il


faudraprobablementtoutrcrire.

Fichierbinaire

Commepourlesfichierstexte,voiciquelquespropritsdunfichierbinaire :

- 4- ENI Editions - All rigths reserved - Jonifar lina


148
Unfichierbinairepeutstockernimportequoi,quecesoitstructurounon.

Lesfichiersbinairesnontpasdestructureapparente,ilsreprsententunesuitededonnes(octets)crites
lesunesaprslesautres.

Touteslesdonnessontreprsentessousformebinaire.Lesnombressontconvertis,etsilyadutexte,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.

La structure des enregistrements est dpendante de linterprtation du programme. Les enregistrements


peuventtredelongueurfixe,maiscollslesunsaprslesautressansretourlaligne.

Decefait,unfichierbinairenedoitpastreouvertouenregistrdepuisunditeurdetexte :ilestsouvent
illisible. Seul le programme sachant le manipuler est apte lutiliser. Vous pouvez cependant utiliser un
diteurhxadcimal.

Lefichierpeuttreluoctetparoctet,ouparbloc,ouentirement,depuisnimportequelleposition,puisque
cestvousquidfinissezsastructure.Idempourlesenregistrements.

5.Lesaccsauxfichiers

a.Squentiel

Lefichiersquentielpermetdaccderauxdonnesdansleurordredcriture.Vousaccdezauxdonneslesunes
aprslesautres.Pourpouvoiraccderaumillimeenregistrementvousdevezdabordlireles999premiers(cequine
veutpasdirequevousdevezlesinterprter).Lesfichierstextesontgnralementdesfichierssquentiels,chaque
enregistrementtantreprsentparuneligne.

Unfichierbinairepeuttrsbientresquentiel,puisqueencoreunefoiscestvousquidterminezsastructure.Vous
pouvez dcrter que les n premiers octets sont la description dune figure gomtrique de n faces, puis que les n
autresenregistrementsreprsententlalongueurdesfaces,lesangles,etc.

Il nest pas possible de modifier directement lenregistrement dun fichier squentiel. Vous pouvez rajouter un
enregistrementlafin.Poursupprimer,vouspourrezutiliserunditeur.

b.Accsdirect

Laccsdirectestaussiappelalatoire.Ilnyariendespcialementalatoiredevotrect,maiscontrairement
laccssquentiel,vouspouvezsauterdirectementlendroitquevousdsirez.Pourunfichiertexte,apourraittre
lenumrodenregistrement(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, un identifiant. La connaissance de cet identifiant permet daccder directement lenregistrementquil
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 ?

UnlangagecommeleCOBOLestleroidelamanipulationdesfichiers,notammentensquentielindex.Ilseraitplus
complexe, mais pas infaisable (pour les professeurs sadiques ou les tudiants masochistes) de dcoder un fichier
MP3danscelangage.

ENI Editions - All rigths reserved - Jonifar lina - 5-


149
Vouspouvezfairecequevousvoulezdunfichier,cestvousquiendterminezlastructure.Mieux (oupire,selonle
cas) :lelangagedeprogrammationnaquefaireducontenudufichier.SivousdemandezaulangageCdouvriren
modetexteunfichierbinaireetquevousenlisezsuccessivementlesenregistrements,ilnebroncherapas :surun
grosfichier,iltrouveraprobablementquelquesretourslaligne.
Demmevouspouvezsauterloctetdevotrechoixdansunfichiertexte,enlirepiletroisoctets,etcesttout.Cest
vous dimplmenter linterprtation du contenu des fichiers dans le langage vis. Quant lindex, cest une
catastrophe,C,C++etJavaneproposentriendeprdfini.Cestvousdetoutcreraveclesfonctionsdebases
existantes. En son temps, lauteur de ce livre avait dailleurs reprogramm les fonctions permettant laccs aux
fichiersensquentielindexduCOBOLenCpuisenC++danslecadredunprojetdefindannedtudes.

- 6- ENI Editions - All rigths reserved - Jonifar lina


150
Lesenregistrements
Cechapitreseconcentresurlesfichierstexte.Dansceuxci,vousdevezdfinirlastructuredevosenregistrements.Bien
quetoutsoitpossible,notammentavecdesstructuresenarborescencecommeleXML,vouspouvezinitialementchoisir
entredeuxmthodesassezsimples :lesenregistrementsavecdlimiteursoulargeurfixe.

1.Lesdlimiteurs

LesenregistrementsdlimitssontcourantssousUnix.Danschaqueligne,lesvaleursindividuellessontappelesdes
champs et sont spares entre elles par un caractre particulier appel caractre de sparation ou caractre de
dlimitation,ouenfindlimiteur.Nimportequelcaractrepeutconvenir,cependantilnedoitpasseretrouverdansla
valeurdunchamp,cequiauraitpoureffetdecasserlastructuredelenregistrement.Cesontsouventlepointvirgule
""oulesdeuxpoints":"quisontutiliss.
Leschampsdenregistrementssontgnralementencadrspardesguillemetslorsquilsagitdechanesdecaractres,
rienpourdesvaleursnumriques.Cenestpasuneaffirmation :cenestpastoujourslecasetcestvousdegrerle
typedunevaleurdonne,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 :

Unsparateur":"dlimitelesdiffrentschamps.

Ilyaseptchamps,numrots(parconvention)de17.

1 e rchamp :nomdelutilisateur(sonlogin).

2 m e champ :indicateurdemotdepasse(icistockailleurs).

3 m e champ :UID,identifiantnumriqueuniquedelutilisateur.

4 m e champ :GID,identifiantdugroupedelutilisateur(stockailleurs).

5 m e champ :commentairelibre.

6 m e champ :dossierpersonneldelutilisateur.

7 m e 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 :

Dufaitqueleschampssoientcollslesunsauxautresetquechaquechampneprendpasplusdespaceque
sadonneoccupe,fournitunrelavantageentermedoccupationdespacedisqueetdemmoire.

Cependant, le traitement de dcoupage de la chane en fonction de la position forcment alatoire dun

ENI Editions - All rigths reserved - Jonifar lina - 1-


151
dlimiteur est plus complexe quil ny parat. Certes les langages peuvent fournir des fonctions appropries,
maiscommentferiezvousvousmme ?

Surcedernierpointcestassezfacileformalisersousformedalgorithme.Unefonction"split"reoittroisparamtres :
unechanedecaractres,ledlimiteur,etunepositiondedpart.Elleretournelechamppartirdecetteposition,qui
estlenumrodecaractredelachane,dmarrantun.Silafonctionretourneunechanevide,cestquilnyaplus
rien.

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

Pour exploiter cette fonction voici un petit programme qui recherche successivement tous les champs dune ligne. Il
suffit de boucler tant que la fonction split ne retourne pas de chane vide. chaque passage dans la boucle il faut
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

Vousconstatezqueletraitementnestpasanodin,etsurdesmilliersdenregistrementsapeutcompter.

2.Largeurfixe

Dans des enregistrements largeur fixe, il ny a pas de dlimiteurs. Chaque champ a une longueur prdfinie et
occupetoutecettelongueur,quittetrecompltpardesespaces.Leschampssontainsicollslesunsauxautres,
enunseulgrosbloc.
Silfallaitconvertirunelignecidessusenenregistrementfixeilfaudraitsavoirque :

Unloginfaitenprincipe8caractres.

Unmotdepasse1seul(stockailleurs).

LesUIDetGIDutilisentaumaximum5chiffres.

Lecommentaireseraarbitrairement(pourlexemple)de15caractres.

Lescheminsetshellsarbitrairementaussi15caractres.

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


152
|-----------------------------------------------------------------|
|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:

Contrairementauformatdlimit,leformatlargeurfixeconsommebienplusdemmoire.Danscetexemple
64 octets sont utiliss pour chaque enregistrement. Dans le format dlimit, la taille est variable, mais la
premirelignenutilisaitque32octets.

Cependant, la rcupration de tels enregistrements est bien plus simple, car vous connaissez lavance la
tailledechaquechampetdonctouteslespositionspourdcoupervosenregistrements.Parcontre,ilfaudra
pensersupprimerlesventuelsespacesentrop,ensupprimantlesespacesfinaux.Leslangagesproposent
souvent une fonction appele trim qui le fait pour vous. Nul besoin donc de faire des recherches comme
prcdemment.

Cette praticabilit compense lutilisation de la mmoire, dautant plus quelle concide fortement avec les types
structursabordsdanslechapitrecinq.Lalectureetlcrituredanslesfichierssetrouventainsifacilites.

Unfichierformatfixeaaussiunautreavantage :ilestpossibledechoisirparmilesdeuxformats,texteoubinaire,
pour lenregistrer. Autrement dit soit ligne ligne, soit contigus. Comme vous connaissez la taille exacte dun
enregistrement, il suffit de dire que les octets 1 64 reprsentent le premier, 65 129 le deuxime, 130 194 le
troisime, et ainsi de suite. Vous devrez cependant faire attention avec les valeurs numriques, un entier occupant
gnralementquatreoctets,unreldoubleprcisionhuit,etc.

Connaissant lavance les positions de chaque champ, vous utiliserez les sous programmes prdfinis de chaque
langagepourdcouperunesouschanedecaractresquivalentlafonctionmilieuduchapitreprcdent.

3.Principesdaccs

a.tapesdebase

Pourtravailleravecdesfichiers,vousdevrezrespecteruncertainordre.Ilvousfaudra :

Ouvrirlefichier,cestdireindiquerquelfichiervousvoulezaccder,etcomment.

Traiterlecontenudufichier :lelire,ycrire,breftouteslesoprationssouhaitespouraccderetmanipuler
soncontenu.

Fermerlefichier,quandtouslestraitementssonttermins.

Ltape la plus importante est la premire. Comment ouvrir un fichier ? Si vous aviez le droit douvrir seulement un
seulfichier,ceseraitassezsimple,maisquestcequivousempcheraitdenouvrirtroisouquatreenmmetemps ?

b.Identificateursdefichiersetcanaux

Leprogrammedoitpouvoirsavoirdansquelfichieriltravaillelorsquilsagitdy lire ou dycriredesdonnes.Ceci


passeparlutilisationdunidentifiantuniquepourchaquefichierouvert.
Danslapratique,tousleslangages,oupresque,eninterne,utilisentlammemthode.Laccsunfichierpassepar
lutilisationduncanal.Danslaralit,lavraievie(sousentendezparlquelinformatiquenestpaslavraievie,ou
pluttunmoyenmaispasunefin),uncanalrelieentreeuxdeuxcoursdeau,oulamer,unlac,etc.
Danscecanaltransite,outredeleau,desbateaux,pniches,dansunsensetdanslautre.

Danslemondevirtuel,uncanalpermetdefairetransiterunfluxdinformation(lesdonnes)dunprogrammeversun
fichier,dunfichierversunprogramme,dunprogrammeunautre,entredeuxfichiers,entreunprogrammeetun
priphrique,etc.Parexemple,ilexisteuncanalquifaittransitercequevoustapezauclavierversleprogrammequi
attendunesaisie,unautrecanalpourtransfrerverslaffichagecequeleprogrammedoitafficher.Certainscanaux
fonctionnentdanslesdeuxsens,dautresnon.

ENI Editions - All rigths reserved - Jonifar lina - 3-


153
Chaquecanalporteunnumrounique,certainsontdesnomsprdfinis.Celuirattachpardfautauclavier,appel
canal dentre standard, porte le numro 0 (si tant est que 0 soit un nombre) et sappelle STDIN. Celui qui fait
transiter les informations afficher vers lcran (ou plutt le pilote ou soussystme daffichage), appel canal de
sortiestandardportelenumro1etsappelleSTDOUT.IlenexisteuntroisimeappelSTDERRetportantlenumro
2,chargdevhiculerlesmessagesderreur.
Lanotiondecanalestflagranteaveccertainssystmesdexploitation,surtoutUnixquienuseetenabuse.Windows
hriteluimmedecettenotion,exploitablesimplementautraversdelinterprteurdecommandesdorigineDOS.En
C,ilestpossibledutiliserlesfonctionsdelectureetdcrituredefichiersaveccestroiscanaux.

Vousdisposezdetouslescanauxaudeldunumrodeux,donc3etsuivantspourvospropresfichiers.Louverture
dun fichier consiste donc, directement ou indirectement, rattacher un canal un fichier. Les donnes que vous
crirez dans le fichier iront de votre programme vers le fichier par ce canal, et celles que vous lirez du fichier au
programmetoujoursparcecanal.
Lesnotationsalgorithmiquespeuventvariersurcepoint.Certainesnotationsreprennentlasyntaxedunlangagede
typeBasicouVisualBasic,danslequelvousdevezindiquervousmmequelnumrodecanalutiliserlouverturedu
fichier. Dautres reprennent une syntaxe issue du C o cest la fonction C ouvrant le fichier qui choisit un canal, et
vousrcuprezunidentifiantdefichiersousformedevariable.Cetidentifiantestlenomlogiquedufichierauseindu
programme.Cestcettenotationquiestgnralementprfrableenalgorithmique.

nC,unefonctiondouverturedefichierretourneunevariabledetypeFILEquiestenfaituntypestructur
E
contenant diverses informations dont un entier contenant un numro qui se rvle tre le numro du
descripteur de fichiers au niveau du systme dexploitation. Des limites sont dfinies au sein du systme. Sous
Linux, il ne peut y avoir par dfaut plus de 1024*1024 fichiers ouverts, mais en pratique 1024 par processus
(programme). Ca devrait suffire, cependant divers mcanismes permettent daller encore plus loin, gnralement
jusqu 8192. Audel, a devient trs trs lourd. Un nom logique de fichier est donc un enregistrement de type
structur.

c.Lesmodesdouverture

Enouvrantunfichier,ilfautindiquercommentvoussouhaitezyaccder.Souhaitezvousseulementliresoncontenu,
ycrireovousvoulez,ourajouterdesligneslafin ?

Enlecture,vousavezunaccsenlectureseuleaufichier.Vousnepouvezpasycrire.Vouspouvezvousy
dplacer,retourneraudbut,liretoutcequevousvoulez,maiscesttout.

Encriture,parfoisnommlecture/criture,vouspouvezmodifiernimportequellepartiedufichier,crireo
vousvoulez,craservosanciennesdonnesquiserontdoncdfinitivementperdues(vivelessauvegardes).
Attentionlacassesivosenregistrementssontdetaillevariabledansunfichiertexte !Vouspouvezaussi
lirelecontenudufichier.

Enajout(append),vousnepouvezpaslirelefichier,maisuniquementrajouterdesdonnesaprslafinde
celuici,commerajouterunenregistrementouquelquesoctetstoutaubout.Vousnepouvezpasmodifierles
donnesquiysontdjcrites.

eproblmeprincipalquevousrencontrerezquandvousutiliserezdesenregistrementsdansunfichier,cest
L
quil ny a aucun moyen deffacer un enregistrement, donc de rduire la taille de celuici. Vous devrez donc
ruser, utiliser un indicateur particulier pour indiquer un enregistrement supprim, et prvoir des traitements de
rorganisation des fichiers (rindexation, suppression des lignes, listes chanes, etc) en passant probablement
pardesfichierstemporaires,outoutchargerenmmoire,puisrcrireseulementlesbonnesvaleurs

- 4- ENI Editions - All rigths reserved - Jonifar lina


154
Fichiertextesquentiel

1.Ouvriretfermerunfichier

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

VAR
fic:fichier squentiel

Vous devez ensuite ouvrir le fichier, en associant nom logique et nom du fichier, avec le mode douverturesouhait.
CeciseffectueaveclinstructionOuvrir.

Ouvrir "toto.txt" dans fic en lecture

Voustrouverezaussiparfoiscettesyntaxesousformedefonction,plusprochedecertainslangages :

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

Lapremiresyntaxeestsouventprfrableenalgorithmique.Pourfermerunfichier,utilisezlinstructionFermersuivie
dunomlogiquedufichier.

Fermer fic

Il existe aussi une syntaxe fonctionnelle, mais les mmes remarques sappliquent : utilisez la premire en cas de
doute.

Fermer(fic)

ote :neplacezpaslenomdufichierdanslesinstructionsdelecture,critureetdefermeture.Leprogramme
N
neconnatpaslenomdufichier,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,unenregistrementtantquivalentune
ligne. La lecture dune ligne se fait via linstruction Lire. Lire lit lenregistrement prsent la position actuelle du
fichier,puisseplacesurlenregistrementsuivant.louverturedufichier,Lirelitlapremireligne.UnnouveauLire
liraladeuxime,etainsidesuitejusqulafin.Cestpourcelaquelalectureestditesquentielle.Voustrouverez
aussilammeinstructionsouslenomLireFichier,cestlammechose.

Lasyntaxeestlasuivante :

Lire(nom_logique,variable)

ENI Editions - All rigths reserved - Jonifar lina - 1-


155
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 :

Seloncertainsformalismesalgorithmiques,Lireestunefonctionquiretourneunboolen,doncvraioufaux.
Sivoustentezdelireunenregistrementetquilnyenaplus,LireretourneFAUX.Autrementdit,tantqueLire
estVRAI,onpeutcontinuerlireleslignessuivantes.

LafonctionEOF()parfoisappeleaussiFinFichier()retourneunboolenquiindiquesilafindufichierat
atteinteounon.Cettefonctionprendenparamtrelenomlogiquedufichier.ElleretourneVRAIsilafindu
fichieratatteinte,doncsilneresteplusdenregistrementslire.

a fonction algorithmique EOF() va retourner VRAI si le fichier que vous ouvrez ne contient pas
L
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 - Jonifar lina


156
Lireestunechose,criredansunfichierenestuneautre.LcritureutiliselinstructionEcrire,unefonctionquiprend
comme paramtre le nom logique du fichier et lenregistrement (la ligne) crire. Vous trouverez tout comme
linstructiondelecture,uneinstructionEcrireFichierstrictementidentique :

Ecrire(nom_logique,enregistrement)

Commevousdevezcriredesenregistrementslargeurfixe,cestvousdevrifierquelesenregistrementssont
labonnelongueur.Silssonttroplongs,vousavezmaldimensionnvosenregistrementslorigine(uncasrgulier
estuneadresserallongeouunnomdevillecompos).Silssonttropcourts,vousdevrezleurrajouterdesespaces
enfindechane.
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
espacesrajoutslafin.

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

Cela laisse entendre que vous navez plus vous soucier que la chane soit trop courte ou trop longue. Cestvrai
danslalgorithme,maisattentiondansunvrailangage !LelangageCOBOLanciennementauprogrammeduBTStait
unrgalceniveaumaisenCouenJava,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)

ENI Editions - All rigths reserved - Jonifar lina - 3-


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

LinstructionEcrirerajoutelenregistrementdanslefichier,puisseplacelasuitedelenregistrementcr.Aussisi
vousexcutezunenouvelleinstructionEcrire,lenouvelenregistrementseplaceralasuiteduprcdent.Attention
cependantaumodedouverturedufichier !Enmodelecture/criture,lenregistrementneserapasajoutlafindu
fichier (contrairement au mode ajout) mais la position courante : vous crasez les enregistrements existants, les
unsaprslesautres.

Unprogrammeassezsimpleconsisterecopierlesenregistrementsdunfichierdansunautre.Pourrajouteruntout
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

Traitersurdisqueouenmmoire ?

Cette stratgie de recopie a un avantage : elle nutilise que trs peu de mmoire. Elle a cependant un trs gros
inconvnient,ellencessitelaprsenceunmomentdonndedeuxfichierssurledisquedur.Dansletraitement
prcdentlebuttaitdesupprimerleslignesinutilesdupremierfichier.Aufinalcegenredetraitementestentrois
tapes :

Recopiedesenregistrementsdepasswdversbackup.

Suppressiondufichierpasswd.

Renommagedebackupenpasswd.

Cettemthodeseraprivilgiersurdesfichierstrsimposants,plusieursmilliers(oumillions)delignes,silammoire
nedoitpastretropcharge.

Uneautremthodeconsistetouttraiterenmmoire.Ellesefaitendeuxtapes :

Lectureintgraledufichierpasswdetstockagedeslignesdansuntableau.

Rcrituredufichierpasswdaveclesbonslmentsdutableau.

ote :Certainslangagesfontunedistinctionentrelemodedcriture,gnralementdestructeur(lefichierest
N
purgvidavantlajoutdedonnes)etunmodedajouttendu,olefichierpeutaussitreluPrudence.

- 4- ENI Editions - All rigths reserved - Jonifar lina


158
Cette mthode est plus rapide et plus simple. Laccs et le traitement des enregistrements en mmoire sont plus
rapidesquelaccsunfichierdudisque.Unefoisenmmoirelesdonnespeuventtremanipulesvolont,sans
avoirrelirelesenregistrements.Elleestprfrablesilacapacitmmoiredevotreordinateurlepermet.Lesgros
logiciels comme les gestionnaires de bases de donnes relationnels chargent souvent en cache plusieurs blocs de
fichierspouracclrerleurstraitements.

Tantquelessupportsdestockagenonvolatilesserontpluslentsquelammoire,cestainsiquilfaudraprocder.

3.Lesenregistrementsstructurs

Peuttrefaudraitildiredailleursenregistrementsdetypesstructurs,telsquevusdanslechapitreLestableauxet
structures.Lamthodedelecturesquentiellerencontredanslepointprcdentamisenlumireunpetitproblme.
Quandvousrcuprezunenregistrement,vouslercuprezenentieretcestvousdeledcouperensuite.Pouren
rcuprerplusieurs,vousutilisezdestableaux,unpourchaquechampdelenregistrement.
OrdanslechapitreLestableauxetstructuresvousavezprisconnaissancedesenregistrementsdetypesstructurs.
Ces enregistrements sont euxmmes dcomposs en champs. Pourquoi ne pas lire et crire directement un
enregistrementdetypestructurdansunfichier ?

ttention :silanotationalgorithmiquepermetlalectureetlcrituredenregistrementsdetypesstructursdans
A
unfichier,cenestpaslecasdetousleslangages.SileCOBOLlefaittrsbien,cenestpaslecasdetousles
autres, comme le C ou Java, tout au moins tel que prsent ici. Ne seraitce parce que dans ces langages les
longueursdeschanessontvariables,etlesnombresreprsentssousformebinaire,vousdevriezsoitutiliserun
fichierbinaire,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
duncoup,etlusduncoup.

Ecrire()varajouterunenregistrementdanslefichier,quiseracomposdetousleschampsdutypestructur.
Commelatailleexacteestprcise,toutletexteestdjcorrectementformat.Dutravailenmoins.

Lire()litunenregistrementcomplet,soittousleschampsdutypestructur duncoup.Aprslalecture,chaque
champcontientlabonnevaleur.

Dans les deux cas, le type structur doit correspondre exactement au contenu du fichier, et rciproquement, sinon,
gareauxmauvaisessurprises.Lalgorithmesuivantcritunenregistrementstructurdansunfichier,puisrelitcemme
fichieretyrcuprelenregistrementdansuneautrevariabledemmetype.

Programme FicEnreg
Var
maligne,recup :enrpwd
fic :fichier squentiel
Dbut
maligne.login"toto"
pwd"x"
uid"1001"
gid"415"
...
/* Ecriture */

ENI Editions - All rigths reserved - Jonifar lina - 5-


159
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.ExempleenJava

Javasaitmanipulerlestypesdefichiersbinairesoutexte,squentielsouenaccsdirect.Cenestpastrscompliqu
mais cela fait appel au mme principe que la saisie au clavier, avec une gestion des exceptions lors de louverture,
laccsetlafermeturedufichier,etaussipourparerauxventuelleserreursdelecture/criture.

LeprogrammeJavasuivantestunexempledelectureetdercrituredenregistrementsavecdlimiteurs,commele
fichierdesutilisateursdUnix.Ilfait :

Ouverturedufichierenlecture.

Lecturedechaqueligne.

Chaqueligneestplacedansuntableaudeuxdimensions :lapremireestlaligne,lasecondeleschamps
dcoupsvialamthodesplit().

Uneplaceestrservepourdventuelstraitementssurlesenregistrements.

Ouverturedufichierdesortieencriture.

Recompositiondetoutesleslignesviaunefonctionrecolle()prenantenparamtreuntableaudechanesetle
dlimiteur.

Ecrituredelalignereconstruitedanslefichier,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.

import java.io.*;

- 6- ENI Editions - All rigths reserved - Jonifar lina


160
class chap7_fic1 {
public static String recolle(String[] morceaux, String separateur) {
int l=morceaux.length;
String chaine="";

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

public static void main(String[] args) {


BufferedReader Fichier=null;
BufferedWriter FicSort=null;

String ligne;
String[][] passwd=new String[100][];

int cpt=0;
ligne="x";

try {

// Ouvre le fichier
Fichier=new BufferedReader(new FileReader ("/etc/passwd"));

while(ligne!=null) {
// lit une ligne
ligne=Fichier.readLine();
if(ligne!=null) {
// Split de la ligne
passwd[cpt]=ligne.split(":");
cpt++;
}
}
// Eventuel traitement ici sur le tableau

// Fichier de sortie
FicSort=new BufferedWriter(new FileWriter ("macopie"));

cpt=0;
while(passwd[cpt]!=null) {
// On recolle les morceaux
ligne=recolle(passwd[cpt],":");

// On enregistre la ligne
FicSort.write(ligne+"\n");
cpt++;
}

}
catch (FileNotFoundException ex) {
System.out.println("Fichier absent");
}
catch (IOException ex) {
System.out.println("Erreur de lecture");
}

finally {
try {
Fichier.close();
FicSort.close();
}
catch (IOException ex) {
System.out.println("Erreur de Fermeture");
}
}
}

ENI Editions - All rigths reserved - Jonifar lina - 7-


161
}

- 8- ENI Editions - All rigths reserved - Jonifar lina


162
Lespointeursetrfrences

1.Rappelssurlammoireetlesdonnes

a.Structuredelammoire

Les prcdents chapitres vous ont dj appris normment de choses sur la mmoire et lorganisation de son
contenu:

Lammoireestdcoupeenoctets.

Chaqueoctetdelammoiredisposeduneadresse.

Unedonnepeutstalersurplusieursoctets,doncoccuperuneplagedadresses(parexemple4ou8octets
pourunrel,plusencorepourunechane).

Reprsentationdunevariableenmmoire

Unevariableestunnomdonnuneouplusieurscases.Ellenommelazonedelammoirecontenantladonne.La
zonedelammoirecontenantladonneestdfiniepardeuxchoses:

Ladressededbutdeladonne,cestdireladressedupremieroctetcontenantladonne.

Latailledecettezone,cestdirelenombredoctetssurlequelstalentlesdonnes.

Latailledelazonedpenddutypedeladonne.UncaractreASCIInoccupequunseuloctet,unentierquatre,un
entierlonghuit,etc.

Quandvousaccdezaucontenudelavariable,vousaccdezaucontenudelazonemmoirequiluiestassocie.La
variableellemmecontientdoncuneautreinformation,ladressedelazonemmoirelaquelleelleestattribue.

Parconvention,unordinateursachantgrerbeaucoupdemmoire,lesadressessontnotesenhexadcimal.Cest

ENI Editions - All rigths reserved - Jonifar lina - 1-


163
plussimpledeparlerdadresse0x2dcf0239quedeladresse768541241.Certainslangagespermettentdaccderet
doncdevoirladressedelazonemmoiredunevariable,toutsimplementladressedelavariable.

b.Java:deslimitesquinensontpas

Il va vous falloir lgrement dchanter. Le langage Java utilis depuis le dbut de cet ouvrage ne permet pas de
connatreladressedelavariable.Enfait,laplupartdeschosesdcritesdanslesprochainespagesserontenpartie
inaccessiblescelangage.Etparmiceschoses,lapossibilitdaccderladressemmoiredesdiversesvariables.
Laraisonestsimple:Javaestunlangagevoludehautniveauquinapas(etvousavec)interfrerdirectement
avec la mmoire de lordinateur. Dans un programme Java, la mmoire est alloue dynamiquement par la machine
virtuelle qui lui fournit le ncessaire. Le programme Java ne sait pas o sont rellement stockes ses donnes en
mmoirecentrale,cestlamachinevirtuellequisoccupedetout.Silavaittpossibledevoiruneadresse,celleci
aurait t celle au sein de la mmoire rserve par la machine virtuelle, sans pouvoir faire le lien avec la mmoire
physique.
Cesystmeprsentedenombreuxavantages.Puisquecestlamachinevirtuellequigrevotreplacelammoire,
vousnavezplusvoussoucierdeproblmespropresdeslangagesdebasniveau.EnCparexemple,quandvous
crezunechanedecaractres,cestenfaituntableaudecaractres.Sivousdbordezdelataillequevousavez
initialement fixe, vous risquez de graves dysfonctionnements et plantages, car lespace mmoire situ aprs est
peuttrerservpouruneautrevariable,ouunboutdeprogramme.Cnevousprviendrapasencasderreurdans
lesindicesdetableauxnonplus.Javavousdbarrassedetouscesproblmespuisquilgretoutavotreplace.
Aucunrisquededpasserquoiquecesoit,aucunrisquedoublierdelibrerdelammoire,etc.
Vous verrez que Java gre trs bien pour certaines choses les rfrences, comme cela vous a brivement t
expliqudanslechapitreLestableauxetstructuressurlestableaux.

c.BrefsexemplesenC

LelangageCestunlangagedebasniveaupermettantunaccsdirectaucontenudelammoirephysique,toutau
moinscellerservepourvotreprogramme.EnCvouspouvezafficherladressedunevariabletrssimplement.Le
boutdecodesuivantaffichelecontenuetladressedunevariableentirelongue.IlsuffitenCderajouterlesigne
"&"(ETcommercial)avantlenomdelavariable.Lachanesotrique%#xdsignifiequele&iestunevaleurentire
(d)quidoittreconvertielaffichageenhexadcimal,avecunprfixe0xavant(#),le%indiquantderemplacerles
caractresaccolsparlavariablesitueenparamtre,danslordre.

long i=123456;
printf("%d ladresse %#xd\n",i,&i);

Lersultatvarievidemmentdunemachinelautre,etnestjamaislemmesionrelanceleprogrammeplusieurs
fois:

123456 ladresse 0xbf9f8420d

Cpermetaussideconnatrelalongueurdunevariable,lenombredoctetsquelleutilise,aveclafonctionsizeof().

printf("%d ladresse %#xd, taille de %d octets\n",i,&i,sizeof(i));

Une variable de type long est code sur 4 octets sur un ordinateur 32 bits, donc le rsultat ne provoque aucune
surprise.

123456 ladresse 0xbfa03430d, taille de 4 octets

2.Lepointeur

a.Principeetdfinition

Quecesoitavecdeslangagesdebasniveau,dehautniveaucommeJavaouenalgorithmique,ilpeuttreutilede
trouver des moyens de manipuler directement ou indirectement des adresses de variables ou autres lments
(tableaux,typesstructurs,objets).EnJavacenestpasdirectementpossible,vousverrezunautremoyen.Maisla
notionestimportante,ycomprispourcelangage.

Vousnaurezquerarementloccasion,voirejamais,derentreruneadresselamaindansunevariable.MmeenC,
vouspartirezgnralementduneadressedjdfinie(celledunevariable,duntableau,etc).

Dans les langages supportant les manipulations dadresses mmoire, il est courant de manipuler ces adresses au
traversdevariablesparticuliresquinecontiennentnonpasunedonne,maisuneadressemmoire.Cesontdes

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


164
pointeurs.
Unpointeurestunevariablequicontientladresseduneautrevariable.
Le pointeur pointe sur une autre variable dont il contient ladresse mmoire, cette dernire tant dite variable
pointe. Si vous affichez le contenu dun pointeur, vous obtenez une adresse qui est celle de la variable pointe,
tandisquesivousaffichezlecontenudelavariablepointe,vousobtenezlavaleurassociecettedernire.

Unpointeurestunevariable.Decefait,elledoittredclare,disposeellemmedesapropreadresseenmmoire,
etsevoitdfiniruntype.Letypedunpointeurnedcritpascequilcontient(cestuneadresse,doncenprincipe
dunelongueurde32ou64bitsselonlesarchitectures)maisletypedelavariablequilpointe.Unpointeursurune
variabledetypelongdevraitdonctredclaravecuntypelong.

Lepointeuretlavariablepointeenmmoire

b.LeCroidespointeurs

Peuttre tesvous perdu dans ces dfinitions et explications. Lexemple suivant en C devrait suffisamment vous
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 de lui rajouter une toile "*" avant son nom. Chaque ligne est
commente pour vous aider. Lobjectif est de faire pointer un pointeur p_i sur ladresse de lentier i. Pour a 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 0 x b f a 9 5 c b c d , taille de 4 octets


Le pointeur p_i pointe sur ladresse 0 x b f a 9 5 c b c d

Notezqueladressedelavariableicorrespondmaintenantexactementaucontenudupointeurp_i.Lepointeurp_i
pointesurlavariableidontilcontientladresse.

ENI Editions - All rigths reserved - Jonifar lina - 3-


165
Maisquefairedecepointeur?Lepointeursertmmoriserladresse,(lemplacementmmoire)duneautrevariable.
Lesutilisationssontmultiplesetlasuiteduchapitrevousproposeradeuxapplicationsdespointeurs:listeschanes
etarbresbinaires.Enattendant,depuisunpointeurvouspouvezaussiaccderaucontenudelavariablepointe.Il
suffit tant laffichage qu laffectation de rajouter une toile "*" avant son nom. Que provoque en C la ligne
suivante?

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.

/* modification de la valeur de la variable pointe par p_i */


*p_i=987654;
printf("i contient maintenant %d\n",i);

Lersultatestquevousvenezdemodifierlecontenudelazonemmoireladressepointeparp_i,quiestcellede
i.Vousvenezdoncdemodifierlavaleurdeienpassantparunpointeur.

i contient maintenant 987654

c.Applications

Lesapplicationssontnombreuses:

En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structur. Elle doit
retournerladressedecelleci,etdoncsonrsultatseraplacdansunpointeuradquat.

Danslechapitresurlessousprogrammes,vousavezvuquilestpossibledepasserunevariableenSortie
(S) ou Entre/Sortie (ES) une procdure. Daprs vous, quel est le mcanisme utilis ? Le pointeur, bien
entendu:vouspassezladressedelavariableenparamtre,etlesousprogrammevamodifierlecontenude
lammoirecetteadresseviaunpointeur.

Les pointeurs ouvrent la voie lutilisation de mcanismes complexes. Notamment, vous pouvez crer une
liste denregistrements ordonns : un enregistrement contient une valeur, puis un pointeur vers
lenregistrementsuivant,etainsidesuite

Dans un langage bas niveau comme le C, les tableaux se manipulent trs facilement via des pointeurs,
puisquilestpossibledefairedescalculssurlesadresses:+1vaaucontenudeladressesuivante,etainsi
desuite.

VoiciunsimpleexempleenCdunefonctionquidoitmodifierlecontenudunevariableenpassanttoutdabordpar
unevaleurderetour,puisparunpointeur.
LapremirefonctionesttrsclassiqueetressemblebeaucoupcequiexisteenJava.

long modif(long var,long n)


{
var=n;
return var;
}

Ellesutiliseainsietnamnepasderemarqueparticulire:

i=modif(i,1000);
printf("i contient maintenant %d\n",i);

Lasecondefonctionestmodifiepourprendreuneadresseenparamtre:

- 4- ENI Editions - All rigths reserved - Jonifar lina


166
void modif2(long *var, long n)
{
*var=n;
}

Lepremierparamtreestunpointeursurunevariabledetypelong.Lafonctiondoitrecevoirladressedunevariable
detypelong,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.

Cest avec les enregistrements de types structurs et surtout les tableaux que les pointeurs montrent toute leur
puissance.Untableauestunelistedlmentscontigusenmmoire.Sivousrcuprezladressedupremierlment,
vouspouvezaccdezauxnlmentssuivantssitusauxnadressessuivanteslaidedunpointeur.
Prenezunechane"bonjour".Chaquecaractreoccupeunoctet,etenmmoirelachanesetermineparuncaractre
nul. En C, une chane de caractres est en fait un tableau de caractres, llment dindice 0 contenant le premier
caractre,llment dindice1lesecond,etc,jusquaudernierlmentcontenantlecaractrenuldefindechane.
Placezunpointeursurlepremierlmentdutableau.Sivousincrmentezdeunlepointeurvousvousdplacezdela
longueurduncaractreenmmoire,vousvoustrouvezsurlesecondcaractreetainsidesuite.

ote:Ajouter1unpointeurnedplacepasforcmentladressedeunoctetenmmoire,maisdelalongueur
N
dutypedupointeur.Sivousajoutez1unpointeurdetypelong,vousajoutezquatreoctetsladresse.

laide de ce principe, il devient trs simple de calculer la longueur dune chane de caractres en C : tant que la
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++;

ote:enC,chaquelmentduntableauestenfaitunpointeursurladressemmoirecontenantcetlment.
N
Cequiveutdirequechainecontientladressedupremierlment,etque*chainecontientlepremierlment,
chaine+1 ladresse du second lment, et *(chaine+1) son contenu, etc. Aussi p_c= &chaine[0] aurait pu scrire
p_c=chaine.

Voyezvousmaintenantlintrtdespointeurs?Bienquecettenotionsoitassezcomplexe,ellepermetdesimplifier
fortementlestraitementssurlestableaux,lespassagesetlarcuprationdevaleursetstructurescomplexes.

3.Notationalgorithmique

a.Dclareretutiliserlespointeurs

ENI Editions - All rigths reserved - Jonifar lina - 5-


167
Lalgorithmiqueautorisebienentendulutilisationdespointeurs.Vousdclarezunpointeurcommenimportequelle
variableetaummeendroit,souslemotclVAR.

nom : pointeur sur type point

Parconvention,lespointeurscommencentparlalettrep.Cenestpasuneobligationmaisvousvousyretrouverez
beaucoupmieuxsivoussuivezcetterecommandation.Commevuprcdemment,letypepointdoittredumme
typequelavariablepointe.Sivouscrezunpointeursurunentier,lepointeurseradetypeentier:ilpointesurun
entier.

Var
txt :chane
ptxt :pointeur sur chane
cpt :entier
pInt :pointeur sur entier

Le pointeur peut recevoir une adresse statique, cestdire une adresse en hexadcimal que vous rentrez vous
mme.Cestuneaffectationdirecte.Enpratiquecettemthodenestquetrsrarementutilise,saufcasspcifiques
(sionsaitqutelleoutelleadressesetrouvetoujourslammedonneentoutecirconstance)etvousprfrerez
passerladressedunevariableconnue.

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.

Ilsepeutquun pointeur nait pas encore reu dadresseetdoncpointesurnullepart.Cest embtant car cestle
plantageassursivoustentezdelutiliser.Pourviterceproblme,vousluiaffecterezunevaleurgnrique,quine
reprsenterien,maisquipourracependanttreteste.CestlavaleurNIL(NotIdentifiedLink).EnC,cestNULL,et
enJavanull.NILestunesortedquivalentdezro,maisquiestreconnuetellequelle(sivouscomparezNILetzro,
vousaurezunretourfaux).

pIntNIL
Fin

ttention : cest vous de tester si un pointeur est positionn sur NIL avant de lutiliser ! Un accs un
A
pointeurcontenantNILprovoquerauneerreur.

Dernier point, mais ceci devrait vous sembler vident, vous avez le droit de crer des pointeurs sur nimportequel
typedevariable,ycomprisdesenregistrements.Cestmmelundespiliersdelutilisationdespointeurs.Lasuitedu
chapitreyferafortementappel.

Type
Structure tarticle
ref:chane
libelle:chaine
prix:rel
FinStruct
Var

- 6- ENI Editions - All rigths reserved - Jonifar lina


168
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
lenregistrement ref de la structure pointe. Cette notation est issue des langages C et C++ qui font la diffrence
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:onrcuprelavaleurde
lavariablepointe,etdoncicilquivalentdelavariableartoriginale.

b.Allocationdynamique

Jusquprsentlespointeursrecevaientladressedunevariablequiexistaitdjparaffectation.Ilestaussipossible
derserverunemplacementmmoirepourunedonnepointedirectement.Dansceprincipe,vouspouvezcrerun
pointeursurunentierparexemple,etrserverunespacemmoirequicontiendracetentier,surlequellavariable
pointeurpointera.Cestleprincipedelallocationdynamiquedemmoire.Ilvousfautemployerlasyntaxesuivante:

pointeurnouveau type

Le type doit bien entendu tre celui de la valeur qui sera contenue lemplacement mmoire rserv. Aprs cette
instruction,lepointeurreoitladressemmoiredelazonerserve.Encasdchec(plusdemmoiredisponiblepar
exemple)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.Ajouterunaupointeurdcaleraceluicidunlment.Cettesyntaxenestpas
utiliseenalgorithmiqueoonprfreallouerlammoirelmentparlment,quitteleschanerensuite.

Quandvousallouezdynamiquementdelammoire,elleresteoccupetoutletempsdelexistencedupointeur.Sans
rien dautre, la mmoire est rcupre uniquement la sortie du programme. Il est aussi facile dallouer de la
mmoirequedelalibrer,oudeladsallouer(unbarbarismebienutile)volont:dsqueleoulespointeursne
sontplusutiles,onlibrelammoireassocie,cestadegagn.Pourcecivousutiliserezlasyntaxesuivante:

Lib
r er pointeur

Quand vous librez le pointeur, vous librez la zone mmoire sur laquelle il pointait, zone qui redevient disponible
pourtouteautreutilisation.Attention!Sivousavezconservdansunautrepointeurladressedecettezoneetque
vouslavezdsalloue,cepointeurpointesurunezoneventuellementraffecteautrechose.Yaccderrisquede
fournir une valeur arbitraire, y crire risque doccasionner des problmes, voire des plantages. Le mieux est de
replacerunevaleurNILaprslalibration,etdepensertesterlepointeuravantdelutiliser.

e drfrencez jamais un pointeur dont la zone mmoire a t libre. Cest une faute malheureusement
N
courante.Dansdetrsgrosprogrammesleprogrammeuroublieparfoisdetesterlavaleurdupointeuravant
dyaccder,provoquantunefuitemmoireauxconsquencessouventlourdes.

ENI Editions - All rigths reserved - Jonifar lina - 7-


169
Programme libere
Var
pEntier :pointeur sur entier
Dbut
pEntiernouveau Entier
/* suite du programme */
...
librer pEntier
pEntierNIL
Fin

4.Javaetlesrfrences

a.DiffrencesentreleCetJava

Le langage C est le roi des pointeurs. force den parler, on en oublierait presque Java. Du fait de la machine
virtuelle, Java ne connat pas les pointeurs au sens propre. Pourtant, navezvous pas rencontr quelque chose y
ressemblantdanslechapitreLestableauxetstructuressurlestableaux?Eneffet!Sionaffecteuntableauun
autre,lesdeuxvariablesrsultantesreprsententlemmetableau!Unevariablerfrencelautre.aressembleun
peuauxpointeurs.Cependantilexistedesdiffrencesessentielles:

Le C/C++ autorise les pointeurs sur nimporte quel type tant primitif (int, long, float, etc) que complexe
(structures,tableaux,objetspourleC++).Javanautoriselesrfrencesquesurlesvariablesdsignantdes
objets. Les objets sont abords au chapitre suivant, mais en Java les tableaux et structures tels que vus
jusquprsentsontenfaitdesobjets.

Un pointeur contient ladresse relle en mmoire dune variable, une rfrence Java, appele handle
(poigne) en anglais, ne contient quune information "virtuelle" permettant daccder lobjet (contenu du
tableau,enregistrement,etc)etfournieparlamachinevirtuelle.

LesmanipulationsdepointeurspeuventvitedevenirtrscomplexesenC/C++:risquededpassementdes
adresses, allocations mmoires compliques, risque de confondre les types, etc. Aucun risque en Java : la
machinevirtuellesoccupepresquedetout.

Lesoprateurs"&"permettantdaccderladressedunevariableet"*"pouraccderaucontenuprsent
ladressepointenexistentpasenJava.LeseuloprateurprsentenJavaestlepoint,quevousavezdj
rencontraveclesenregistrements.

NecroyezpasquelabsencedespointeursenJavasoitunelimitation,cestmmetoutlecontraire.ToutdabordJava
estunlangagevoludehautniveaudontlerlenestpaslamanipulationbasniveaudadressesphysiques.Dece
fait le programmeur, vous, est entirement dbarrass de toute la gestion de ces adresses puisque la machine
virtuellesoccupedetout.CestunesortedeC++dbarrassdetoutesacomplexit.LedveloppementenJavaest
donctrssimplifienseconcentrantsurlesfonctionnalits.

b.Lesrfrencessurlesobjets

EnJava,toutevariabledontlecontenuestdclaraveclinstruction"new"estunerfrencesurletypedevariable
associ.Parexemplequandvousdclarezuntableau:

int tab[];
tab=new int[10];

Lavariabletabestunerfrenceversuntableaudentiers.Doncsivousdclarezunevariabledummetypeetque
vousluiaffecteztab,cettenouvellevariableseraellemmeunerfrencedutableaurfrencpartab.

Du coup, toutes ces variables sont des rfrences, ce qui veut dire que quand vous affectez un tableau, une
structureouunobjetuneautrevariable,vousnecrezpasunecopiemaisajoutezunerfrencedessus.Tousces
types sont des objets. Et toute variable qui reoit un objet nen reoit pas une copie mais rfrence cet objet. Ce
phnomne a t mis en vidence dans le chapitre Les tableaux et structures avec laffectationdun tableau un
autre:lesdeuxvariablesrfrencentlemmetableau.Leprincipevaplusloincarpuisquunevariableainsiaffecte
est une rfrence, a veut dire que si vous passez un objet (tableau, structure, objet, etc.) en paramtre dune
fonction,vouspassezlarfrencesurcetobjetetnonlecontenuassoci.Regardezlexemplesuivant:

class chap8_ref1 {

- 8- ENI Editions - All rigths reserved - Jonifar lina


170
static void tableau(int[] tab)
{
tab[1]=12345;
}

public static void main(String[] args) {
int[] t={2,7,9,10,11,14,17,18,20,22};
int[] copie;

copie=t;
System.out.println(t[2]);
copie[2]=5;
System.out.println(t[2]);
tableau(t);
System.out.println(t[1]);

}
}

Vous reconnaissez lun des exemples du chapitre Les tableaux et structures. Il lui a t rajout une fonction
"tableau"quiprendcommeparamtreuntableaudentiers.Leslignesengrasconstituentlaprincipalemodification
de lexemple. Le tableau t est pass en paramtre de la fonction tableau. Dans cette fonction, le paramtre est
modifi:lindice1dutableautabreoitlanouvellevaleur12345.Aprslafindelafonction,leprogrammeraffichele
contenudelindice1dutableaupassenparamtre:ilcontient12345.

nJava,lestableaux,structures,chanes,quisontenfaitdesobjets,donctouslesobjets,sontpassspar
E
dfautparrfrenceauxfonctions.Cestvousdefairetrsattentionlorsquevousmodifiezlecontenudeces
typesdevariablesdanslafonction.

c.Lestypesprimitifs

Sionpasseenparamtreunevaleurduntypedebaseditprimitifcommeunentierparexempleunefonction,ilest
cette fois pass par copie. Aussi si vous voulez modifier dfinitivement la valeur passe en paramtre, lune des
mthodesestderetournerlabonnevaleur.Danslexemplesuivant,aupremierappellavariablevnestpasmodifie,
tandisquausecondellereoitsanouvellevaleurparretourdelafonctionmodif_int.

class chap8_ref2 {
static int modif_int(int var)
{
var=10;
return var;
}

public static void main(String[] args) {
int v=0;

modif_int(v);
System.out.println(v);
v=modif_int(v);
System.out.println(v);
}
}

nJava,touslestypesprimitifs(int,long,float,double,char)sontpasssparcopieauxfonctions,cestdire
E
que le paramtre de la fonction reoit une copie du contenu de la variable, et non pas une rfrence. Donc
pour tous ces types, la variable initialement passe en paramtre ne perd pas sa valeur : vous la retrouvez en
sortantdelafonction.Ilestimpossibledecrerunerfrencesuruntypeprimitif.

LesdveloppeursJavanesesontjamaisplaintsdecettatdefait,conscientsquetoutcecifacilitegrandementla
programmationetlasyntaxe.AlorsquenCouC++ilfautfaireattentionavecdesdclarationspassimples,icitout
estfaitpardfaut.DautreslangagescommelePHPenversion5ontreprisceprincipe.

d.Rfrencessurstructures

ENI Editions - All rigths reserved - Jonifar lina - 9-


171
Danslasuite,vousallezavoirmanipulerdespointeurssurdesstructures.Ducoupcestextrmementsimplecar
dans Java toutes les soitdisant structures sont en fait des objets jusqu prsent volontairement tronqus de la
plupart de leurs fonctionnalits. Or comme tout objet, la variable qui reoit un objet en reoit une rfrence. Vous
avezdjutilisceprincipesanslesavoir,toujoursdanslechapitreLestableauxetstructures,aveclesstructures
tfabricantettarticle.

Cet exemple est bien plus intressant quil ny parat, vous le voyez probablement maintenant avec un oeil neuf,
puisque chaque dclaration dune variable enregistrement de ces types est en fait une rfrence sur
lenregistrement:

articleestunerfrencesurunestructure(unobjet)detypetarticle.

articlecontenantunevariabledetypetfabricant,oncrededansunerfrencefabsurunobjetdecetype.

art2detypetarticlereoitlarfrencedearticle.Ilsrfrencentlemmeenregistrement.

Lecontenudeschampsdeart2estaffich,cestducouplemmequearticle.Sivousmodifiezleschamps,la
modificationserpercutesurtouteslesrfrencessurcetenregistrement:cestlemmepourtous.

class tfabricant {
public String ref;
public String nom;
public String adresse;
public String tel;
}
class tarticle {
public String ref;
public String libelle;
public float prix;
public tfabricant fab;
}
class chap8_refstruct {
public static void main(String[] args) {
tarticle article=new tarticle();
tarticle art2 ;
article.ref="Art001_01";
article.fab=new tfabricant();
article.fab.ref="Fab1234";
art2=article ;
System.out.println(art2.ref);
System.out.println(art2.fab.ref);
}
}

e.LepigeenJava

EnJavailfautfairetrsattention:quandvouspassezunerfrenceenparamtrevouspouvezmodifierlecontenu
delarfrenceetcecontenuseramodifidirectementdanslazonemmoire,cestparfait.Maisvousnepouvezpas
modifierlarfrenceellemme!Simodifiezauseindunemthodelavaleurdelarfrenceellemme,elleretrouve
savaleurinitialeensortie.Parexemple:

static void modif(element p1,element p2) {


p1=p2;
}

Sidansleprogrammeprincipalvousavez:

p1=new element();
p2=new element();
p1.valeur=10;
p2.valeur=15;
modif(p1,p2) ;
System.out.println(p1.valeur) ;

Lasortiesera10!Eneffetdanslamthodemodif(),p1contientbienlarfrenceverslemplacement mmoire de
lobjetp1,maislavariablep1estellemmelocalelamthode!Doncenaffectantp2p1,p1reoitlarfrencede

- 10 - ENI Editions - All rigths reserved - Jonifar lina


172
p2maislanouvellevaleurestperduelasortiedemodif().Ilfautdoncprocderainsi:

static void modif(element p1,element p2) {


p1.valeur=p2.valeur;
}

Cettefoiscestlecontenudesvaleursdanslazonemmoirerfrencequiestaffect,etvousobtenezlersultat
attendu.

f.Lavaleurnull

Ilsepeutquevousnayezpasbesointoutdesuitedecrerunerfrencesurunenregistrement,maisquevous
vouliez viter dyaccderparinadvertance.Danscecas,aulieudecrerunerfrenceavecnew,vouspouvezlui
affecterunevaleurappele null. Cette valeur signifie que la variable a t dclare mais na pas dobjetinstanci
(terme expliqu dans le chapitre suivant) : vous ne lui avez pas encore affect denregistrement. Du coup, vous
pouvezdjtesterlavariableellemmeavantdetesterleschampsquellecontient.

Dans lexemple suivant modifi, tarticle contient toujours une variable de type tfabricant. Mais elle ne recevra un
enregistrementqueplustarddansleprogramme.Enattendant,lechampfabreoitunevaleurnulle,signifiantque
larticlenapasencoredefabricantrfrenc.

class tfabricant {
public String ref;
}
class tarticle {
public String ref;
public tfabricant fab=null;
}

class chap8_refstruct2 {
public static void main(String[] args) {
tarticle article=new tarticle();
article.ref="Art001_01";
if(article.fab!=null)
System.out.println(article.fab.ref);
else
System.out.println("Pas de fabricant pour cet article");
}
}

ENI Editions - All rigths reserved - Jonifar lina - 11 -


173
Leslisteschanes

1.Listeschanessimples

a.Principe

Danslaviequotidienne,unelisterevtplusieursformes:unelistedecourses,detcheseffectuer,unindex,un
glossaire,unecollectiondedvds,demusiques,etc.Ceslistessontcomposesdlmentsindividuels,lislesunsaux
autresparleurtypeoulordrequevousvoulezleurdonner.Pourpasserdunlmentunautre,vousdescendez
danslalistedanslordrequevousluiavezdonn.

Commentsereprsenteruneliste,pardfinitionlinaire,enprogrammation?Vousconnaissezaumoinsunmoyen:
les tableaux. Dans un tableau, vous pouvez y stocker n lments, et lordre peut tre reprsent par lindice du
tableau.
Connaissezvousunautremoyendestockerdeslments?Lesenregistrementsdetypesstructurslepermettent,
etenplusvouspouvezystockerbienplusdedtails.Vouspouvezaussicrerdestableauxdenregistrements,donc
leurdonneruncertainordre.
Lutilisationdestableauxposecependantparfoisdesproblmesunpeucomplexes.Vouslavezdjremarquavec
lesmthodesdetris.

Commentinsrerunnouvelenregistrementendbutdetableau?Ilnyapasdindicesngatifs

Comment insrer un nouvel enregistrement en fin de tableau ? Si lalgorithmique propose un


redimensionnementdynamique,leslangagescommeJavanelepermettentpas.

Commentinsrerunlmentaumilieudutableau?Fautildcalertousleslmentspourplacerlenouveau
lendroitdonn?Sioui,letableaurisquededborder.

Etsivoussupprimezunenregistrement,allezvousdenouveaudcalerletableaupourboucherletrou?Ou
trouveruneparadepourpasserpardessus?

Vous pouvez vous arranger pour tout programmer afin de tout faire marcher avec les tableaux. Cestparfaitement
possible. Mais estce vraiment raisonnable ? Estce de la programmation efficace ? Rappelezvous quau chapitre
Introductionlalgorithmiquevousavezapprisquilfauttreconomeenressources.Cettemthodeestgourmande
etcomplique.Ilvousfautentrouveruneautreplussimpleetplusbelle.

En fait, encore une fois, vous connaissez tous les principes de base de cette nouvelle mthode. Voici quelques
lments:

Unenregistrementpeutcontenirunautreenregistrement.

Cetautreenregistrementpeuttredummetypestructur.

Lenregistrementpeutaussicontenirunpointeurversunautreenregistrementdummetype.

En notation Java, un enregistrement est un objet, et dans un objet, on peut rfrencer un autre objet du
mmetype.

On obtient, du coup, une cascade denregistrements qui se suivent les uns les autres. Pour accder au
suivant,ilsuffitdaccderlarfrencedecetenregistrementdanslenregistrementactuel.

Chaqueenregistrementdisposedunpointeurourfrenceverslesuivant.

Lesenregistrementssontdoncchanslesunsauxautres,cestunelistechanedenregistrements.

Le principe peut tre reprsent par le schma suivant. Chaque enregistrement est reprsent par un cadre et
contientunevaleuretunpointeurappelpsuivquipointesurlenregistrementsuivantdelaliste.

ENI Editions - All rigths reserved - Jonifar lina - 1-


174
Reprsentationlogiquedunelistechane

Pouraccderunlmentdonndelalistevousparteztoujoursdupremierlment.Delconnaissantladressedu
suivantparlepointeurpsuiv,vouspassezsuccessivementauxnsuivants.Quandlepointeurnepointesurplusrien
(null),cestquelenregistrementestledernier.
Unelistechanedecetypeestditeunilatre:laccsauxlmentscomposantlalisteestsquentiel(vousdevez
lirelesnlmentsprcdentspouraccderceluivoulu),etunidirectionnel.
Chaquelmentdelalisteestunenregistrement.Cetenregistrementpeutcontenirautantdechampsquevousle
souhaitez, mais lun deux sera un pointeur sur un enregistrement de mme type. Quand vous rajouterez un
deuximelment,vousplacerezsonadressedanslepointeurdupremier,etainsidesuite.Chaqueenregistrement
finalpointerasurlavaleurNIL.

Pourcommencer,voiciuntypestructursimplequipourraitconvenir.Enfaitlavaleurpourraittrenimportequoi,et
letypeprendrajusteunentierquelconque.

TYPES
// Un lment de liste chane
Structure element
valeur:entier
pSuivNIL:pointeur sur element
FinStruct

Cette dclaration initiale du type structur element contient un pointeur pSuiv (pour Pointeur sur Suivant) sur une
structuredummetype.PardfautilestinitialislavaleurNIL:ilnyapasencoredenregistrementsuivant.Que
pouvezvousfairedecettestructure?Toutdabordvousdplacerdunlmentunautredelaliste.Poura,ilsuffit
departirdupremierlment,etdercuprer,enboucle,lepointeurdellmentsuivant,jusqutombersurNIL.

Quellessontlesoprationslmentairespossiblessuruneliste?

Creruneliste:cestcrerlepremierenregistrement,celuidette,quipermettradaccderauxautres.

Parcouriruneliste:cestbalayertousleslments,unparun,jusquaudernier.

Rechercherunlmentdanslaliste:soitindiquersilexiste,soitretournerunpointeurverssaposition.

Ajouter un lment nimporte o dans la liste : au dbut, au milieu, la fin. Une fonction dajout pourrait
aussireprendrelapremireoprationdecrationdeliste.

Supprimerunlmentnimporteodanslaliste.

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
donnquilserareprsentparlasuiteparunpointeur,neperdezJAMAISladressedecepremierlment:ilserait
impossiblederetrouverledbutdelaliste,dautantplusquaveclallocationdynamiquedemmoire,ilestplusque
possiblequeleszonesmmoiresalloueschaquelmentnesoientpascontigus.

onservez toujours ladresse du premier enregistrement dans un pointeur prvu cet effet dont vous ne
C
modifierez pas la valeur tout au long du programme, sauf si vous supprimez le premier lment ou toute la
liste.

b.Cration

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


175
Pourcreruneliste,ilfautcommencerparsonpremierlment.Lepremierlmentestunpointeurauquelvousallez
allouer dynamiquement une zone mmoire. Il prendra la valeur que vous voulez, et son pointeur denregistrement
suivantrecevraNIL.Lafonctionretourneunpointeurverslepremierlmentdelanouvelleliste.

Fonction cree_liste():pointeur sur element


Var
pTete:pointeur sur element
Dbut
pTetenouveau element
pTetepSuiv NIL // (*pTete).pSuivNIL
Retoune pTete
FinFonc

appel : pTetepSuiv NIL se lit ainsi : (*pTete).pSuivNIL, cestdire que le champ pSuiv de
R
lenregistrementpointparpTetereoitlavaleurNIL.

Cettefonctionamneunpremiercommentaire.DanslechapitreLessousprogrammesvousavezapprisladiffrence
entre les variables locales et globales. Ici pTete est une variable locale, elle sera dtruite la fin de la fonction.
Pourtantladresse quellecontientestretourne.Cestquelepointeurntantpaslibr,lazonemmoirealloue
dynamiquementlestpourtouteladureduprogramme.lasortiedelafonction,lazonemmoireexisteencoreet
doncsonadresseestencorevalide.
Remarquez que laffectation de la valeur NIL pSuiv nest pas ncessaire car cest sa valeur par dfaut lors de la
dclarationdelenregistrementstructur.

Pourexploitercettefonction,ilsuffitdedclarerunpointeur,etluiaffecterlersultatdecelleci:

Programme liste1
Var
pTete:pointeur sur element
Dbut
pTetecree_liste();
Fin

Lafonctioncree_listeesttrssimple.Peuttrepourriezvousenprofiterpourvoirlemcanismesimplepermettant
derajouterdeslmentslesunslasuitedesautres.Lafonctioncree_liste2()modifievavousdemanderdesaisir
enboucledesvaleursquiserontajouteslesunesaprslesautresenfindeliste.Pourcecivousaurezbesoinde
conserverchaquefoistroisinformations:

LepointeurpTetedelattedelaliste,quidevratreretournparlafonction.

LepointeurpEncoursdellmentactueldelaliste,dellmentrajoutenfait.

Le pointeur pPrec de llment prcdent, dont le pointeur pSuiv devra recevoir ladresse de llment en
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

ENI Editions - All rigths reserved - Jonifar lina - 3-


176
// 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

Le parcours de la liste est maintenant possible puisque la fonction prcdente vous a permis de remplir quelques
enregistrements. Comme toujours on part du pointeur de tte, puis on passe denregistrement en enregistrement
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:lepremierdterminesillmentexistedanslalisteetretourneun
boolen,vraioufaux,selonquellmentesttrouvounon.Cestdoncunefonction.Lesecondretourneladresse
dellmenttrouvetladressedellmentprcdent,vousverrezpourquoiensuite.Cestdoncuneprocdurecar
une fonction ne peut retourner deux valeurs. Mais pourquoi ne pas faire dune pierre deux coups, cestdire un
sousprogrammequivalafoisretournervraioufaux,maisaussidespointeurssurllmentcourantetprcdent?
Cestpossiblecarvouspouvezpasserdespointeurscommeargumentsdefonctions,modifierladressesurlaquelle
ilspointent,etretournertoutdemmeunboolen.Enfait,ilestquasimentinutilederetournerunboolencarde
toutefaonsillmentnestpastrouv,pEncoursvaudraNILensortiedefonction.

Laprocdurerecherche_listeprendquatreparamtres:

Lavaleurvrecherche.

UnpointeurpTetesurlattedelaliste.

UnpointeurpPrecsurllmentprcdent,celuitrouv.

UnpointeurpEncourssurllmenttrouv.

Unboolenvraioufaux.

Sillmentesttrouv,pPrecpointesurceluidavant,pEncourssurllmenttrouv.

Sillmentestabsent,pEncoursvaurNILetpPrecpointesurledernierlmentdelaliste.

SipPrecvautNIL,llmentrecherchestlepremierdelaliste.

Procdure recherche_liste (E:v:entier, E:pTete, ES : pPrec,pEncours


e n)
:pointeurs sur element,S :trouve :bool
Var

- 4- ENI Editions - All rigths reserved - Jonifar lina


177
trouve :boolen
Dbut
trouveFAUX
pPrecNIL
pEncourspTete
Tant que pEncoursNIL ET pEncoursvaleur<>v Faire
pPrecpEncours
pEncours pEncourspSuiv
FinTantQue
Si pEncoursNIL 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:

Lajoutdunlmentendbutdeliste.

Lajoutdunlmentenmilieudeliste.

Lajoutdunlmentenfindeliste.

Danslestroiscas,lechanageestmodifi.Ilestcertespossibledecrerungrossousprogrammequigrelestrois
casduncoup,maisilestprofitabledediffrenciercestroistraitementsentroissousprogrammesindpendants.Il
seratoujourstempsensuitedecrerunsousprogrammefdrateurquigreratouslescas.

Danstouslescassuivants,ladressedellmentrajouter,quevousaurezdjremplieaveclabonnevaleur,sera
reprsenteparlepointeurpNouveau.

Ajoutendbutdeliste

Deuxcassontpossibles:lajoutdunlmentdansunelistevide,auquelcasilsagitdupremierenregistrement,et
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

Ajoutenfindeliste

Cestencoreuncastrssimple.Lerajoutdunlmentenfindelistencessiteseulementdeconnatreladressedu
dernierlmentactuel.LepointeurpSuivdecedernierpointerasurlenouvellment,etlepSuivdunouvellment
recevraNIL.
Sivousreprenezlesprocduresderechercheetdeparcoursdelalistechane,lafindelalistepEncoursvautNIL
etpPreccontientladressedudernierenregistrement.Laprocdureajout_fin()reoitdeuxparamtres:pNouveauet
pPrec.

ENI Editions - All rigths reserved - Jonifar lina - 5-


178
Procdure ajout_fin(ES : pNouveau, pPrec :pointeurs sur element)
Dbut
pPrecpSuiv pNouveau
pNouveaupSuiv NIL
FinProc

Ajoutenmilieudeliste

Aufinal,aucunajoutnauratbiencompliqu,puisquelencorevousdisposezdetoutlencessaire.Pourrajouter
un lment entre deux autres lments dune liste, vous devez connatre ladresse de llment prcdent, et
ladressedellmentcourant,sachantquelenouvellmentserainsrentrelesdeux.Laprocdureajout_milieu()
reoitdonctroisarguments:lenouvellmentpNouveau,llmentprcdentpPrecetllmentactuelpEncours.

Procdure ajout_milieu(ES :pNouveau, pPrec, pEncours) :pointeurs


sur element)
Dbut
pPrecpSuiv pNouveau
pNouveaupSuiv pEncours
FinProc

Gnralisation

Lebutestdegnraliserlesajoutsenungrandsousprogrammeunifi.Poura,ilfautsavoiroplacerllment
rajouter.Lalgorithmederecherchedunlmentretournedeuxpointeurs:celuidellmenttrouvetdellment
prcdent. Supposez que vous souhaitez insrer votre nouvel lment juste avant llmentrecherch,adevient
pluttsimple.Quatrecasdefigureseprsentent:

pPrec contient NIL (pas dlment avant) et pEncours contient NIL : il ny a aucun lment dans la liste, le
nouveauseralepremieretseullment.

pPrec contient NIL (pas dlment avant) et pEncours pointe sur llment trouv qui est le premier : le
nouveauseplaceavant,enpremier.

pPrecpointesurunlmentprcdentetpEncourspointesurllmenttrouv,lenouveauseplaceaumilieu
desdeux.

pPrecpointesurunlmentprcdentetpEncourscontientNIL(larechercheestarriveaubout,lment
trouvounon),lenouveauseplaceendernier.

Quatre cas de figures qui correspondent aux quatre sousprogrammes dj crs cidessus ! Lalgorithme devient
simple:ilsuffitdappelerlabonneprocdureselonlesvaleursdepPrecetdepEncours.Laprocdureajout_element
prendtroisvaleurs: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

- 6- ENI Editions - All rigths reserved - Jonifar lina


179
Simplification

Les traitements sont ici trs dtaills. Cependant, analysez les procdures ajout_premier() et ajout_dbut(). Que
remarquezvous ? Elles se ressemblent, dautant plus que dans ajout_dbut(), pTete contient dj NIL silny pas
denregistrements.Donclesdeuxprocduressontidentiques:ajout_debut()remplaceajout_premier().

Regardezmaintenantajout_fin()etajout_milieu():dansajout_milieu,pEncours>pSuivreoitquoisivoustesenfin
deliste?LavaleurNIL!Donclesdeuxsontidentiques,etajout_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,ilfautjusterecollerles
morceauxetlibrerlammoireallouellmentsupprim.Ilyaquatrepossibilits:

Supprimerleseullmentdelaliste

Supprimerlepremierlmentdelaliste

Supprimerledernierlmentdelaliste

Supprimerunlmentaumilieudelaliste.

Le tout supposer que llment supprimer existe, donc quil faut tout dabord le rechercher et connatre son
adresse, et celle de llment prcdent. Llment prcedent verra son pointeur pSuiv prendre comme valeur le
pointeurpSuivdellmenttrouv.
Lesfonctionssuivantesrestructurentlalistepourluiredonnerlebonchanage.Lalibrationdelammoireoccupe
par llment effacer sera effectue selon le mme modle que la fonction fdratrice dajout dans une grande
fonctiondesuppression.

Supprimerleseullment

Cestfacile,sillmentestleseul,donclattedelaliste,ilsuffitdeplacersonpointeurNIL.Pasdeprcdent,
pasdesuivant,cesttermin.

Procdure suppr_unique(ES :pTete :pointeur sur element)


Dbut
pTeteNIL
FinProc

Supprimerlepremierlment

Cestaussisimple:cestllmentsuivantquidevientlattedelaliste.

Procdure suppr_premier(ES :pTete :pointeur sur element)


Dbut
pTete pTetepSuiv
FinProc

Supprimerledernierlment

Toujoursaussisimple:llmentprcdentreoitNILcommevaleurdepointeursuivant.

ENI Editions - All rigths reserved - Jonifar lina - 7-


180
Procdure suppr_dernier(E :pPrec :pointeur sur element)
Dbut
pPrecpSuiv NIL
FinProc

Supprimerunlmentaumilieu

Ilfautraccorderllmentprcdentavecllmentsuivant.

Procdure suppr_milieu(E :pPrec,pEncours : pointeurs sur element)


Dbut
pPrecpSuiv pEncourspSuiv
FinFonc

Simplification

Contrairement lajout,vouspouveztoutdesuitevoirsilestpossibledesimplifieravantdallerplusloin,selonle
mmeprincipe.Ainsidanslafonctionsuppr_premier()pTeterecevraNILsillmentsupprimestleseulcarpTete
>pSuivvautNIL.

Idempoursuppr_milieu()etsuppr_dernier().Danssuppr_milieu,pEncours>pSuivvautNILsillmentestledernier.
Lesfonctionssuppr_unique()etsuppr_dernier()sontdoncinutiles,saufpourlexemple!

Gnralisation

Toutdabord vous devez trouver llmentsupprimer.Silny est pas, il nyariensupprimer.DoncsipEncours,


contenantllmenttrouv,vautNIL,ilnyarienfaire.Ensuite,ilyadeuxcasdefigure:

pPrecvautNIL:llmentsupprimerestlepremier(ouleseul).

pPrecestdiffrentdeNIL,llmentsupprimerestaumilieuouenfindeliste.

Ensuite,aprsavoirappellafonctionadquate,vousnavezplusqulibrerlammoireallouepourllment,et
passersonpointeurNIL.
Laprocduresuppr_elementneprendquedeuxarguments:lavaleurdellmentsupprimer,etlattedelaliste.

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

Poursupprimertousleslmentsdelaliste,ilsuffitdesupprimertousleslmentsjusquaudernier.Maisattention!
Nesupprimezpasunlmentsansavoirauparavantconservladressedellmentsuivant!Sivousnelavezpas
fait,nonseulementleslmentssuivantssontperdus,maislammoiredeslmentssuivantsnepourraplustre
libre!
Lafonctionsuppr_listeneprendquunseulargument:lattedelaliste.

Fonction suppr_liste(pTete :pointeur sur element)


Var

- 8- ENI Editions - All rigths reserved - Jonifar lina


181
pEncours, pSuivant :pointeurs sur lment
Dbut
pEncourspTete
Tant que pEncoursNIL Faire
pSuivantpEncourspSuiv
Librer pEncours
pEncourspSuivant
FinTantQue
pTete=NIL
FinFonc

h.Parcoursrcursif

Ilestpossiblederemplacerlesousprogrammeitratifdeparcoursdelalisteparunefonctionrcursive:lesous
programmesappelleluimmeavecladressedellmentsuivanttantquellmentreuenargumentnestpasNIL.

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.LimplmentationenJava

cause du fait quen Java les arguments des mthodes ne sont pas en entre/sortie (pour rappel, voir dans ce
chapitre le point Les pointeurs et rfrences Java et les rfrences Le pige en Java) il faut adapter quelques
procdurespourquellesretournentunerfrenceverslesdiverslmentsdelaliste.

import java.io.*;

class element {
int valeur;
element pSuiv=null;
}

class chap8_liste {
// Fonction de saisie
static int saisir() {
String txt;
int vretour=0;
BufferedReader saisie;

saisie=new BufferedReader(new InputStreamReader(System.in));
try {
txt=saisie.readLine();
vretour=Integer.parseInt(txt);

}
catch(Exception excp) {
System.out.println("Erreur");
}
return vretour;
}

// Cration de la tte
static element cree_liste() {
element pTete;

pTete=new element();
pTete.pSuiv=null;

ENI Editions - All rigths reserved - Jonifar lina - 9-


182
return pTete;
}

// Tte et suivants
static element cree_liste2() {
element pTete,pPrec,pEncours;
int v;

// 1er lment
pTete=new element();
System.out.println("1er lment ?");
pTete.valeur=saisir();

pPrec=pTete;

// Elments suivants
do {
System.out.println("Element suivant ?");
v=saisir();
if(v!=0) {
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
static void parcours_liste(element pTete) {
element pEncours;

pEncours=pTete;

while(pEncours!=null) {
System.out.print(pEncours.valeur+" ");
pEncours=pEncours.pSuiv;
}
System.out.println();
}

// Adapt pour Java
static element recherche_liste(int v,element pTete) {
element pEncours,pPrec;

pPrec=null;
pEncours=pTete;

while(pEncours!=null && pEncours.valeur!=v) {
pPrec=pEncours;
pEncours=pEncours.pSuiv;
}
return pPrec;
}

// Rajout pour Java
static boolean existe_liste(int v, element pTete) {
element pPrec=null;
boolean trouve=false;
pPrec=recherche_liste(v,pTete);

if(pPrec==null) {

- 10 - ENI Editions - All rigths reserved - Jonifar lina


183
if(pTete!=null && pTete.valeur==v) trouve=true;
} else {
if(pPrec.pSuiv!=null) trouve=true;
}
return trouve;
}

// Fonctions dajout
static element ajout_debut(element pNouveau, element pTete) {
pNouveau.pSuiv=pTete;
pTete=pNouveau;
return pTete;
}

static void ajout_milieu(element pNouveau, element pPrec, element


pEncours) {
pPrec.pSuiv=pNouveau;
pNouveau.pSuiv=pEncours;

static element ajout_element(int vrech, int vnouveau, element pTete) {


element pPrec=null,pEncours=null,pNouveau;

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
static element suppr_premier(element pTete) {
pTete=pTete.pSuiv;
return pTete;
}

static void suppr_milieu(element pPrec, element pEncours) {


pPrec.pSuiv=pEncours.pSuiv;
}

static element suppr_element(int vrech, element pTete) {


element 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
static element suppr_liste(element pTete) {
pTete=null;
return pTete;
}

// Parcours rcursif
static void parcours_recursif(element pEncours) {

ENI Editions - All rigths reserved - Jonifar lina - 11 -


184
if(pEncours!=null) {
System.out.print(pEncours.valeur+" ");
parcours_recursif(pEncours.pSuiv);
}
}

// Programme principal
public static void main(String[] args) {
element pTete,pPrec;
int v;

pTete=cree_liste2();

parcours_liste(pTete);

System.out.println("Saisir la valeur recherchee :");
v=saisir();

if(existe_liste(v,pTete)) System.out.println("Trouv !");
else System.out.println("Absent !");

pTete=ajout_element(2,15,pTete);

parcours_liste(pTete);

System.out.println("Saisir la valeur supprimer" :);
v=saisir();
pTete=suppr_element(v,pTete);

parcours_recursif(pTete);
System.out.println();

suppr_liste(pTete);
}
}

3.Autresexemplesdelistes

a.Listescirculaires

Une liste circulaire permet daccder nimporte quel lment de la liste depuis nimporte quel autre lment sans
passerparlepointeurdette.
Pourmettreenplacecetypedeliste,ilsuffitdefairepointerllmentsuivantdudernierlmentsurlepointeurde
tte.
Dans une telle liste, les fonctions dajout et de suppression dlments sont simplifies et correspondent aux
fonctionsdajoutetdesuppressionaumilieu.Ilyaunpetitproblmepourlafonctionderecherchequiducoupne
sarrtejamais!Ilfautdoncplacerundrapeaupourarrterlarecherchequandonretombesurllmentdedpart.
Ilsuffitdestockerladressededpart.Sivousretombezdessus,cestquevousavezparcourutoutelaliste.

b.Listesdlmentstris

Danscetypedeliste,leslmentssontplacsselonunordredfiniparvousmmeauseindesvaleurscontenues
dansleslments.Ainsivoustesassurderespectercetordrelorsduparcoursdelaliste.
Vousdevezadapterlafonctionderecherchepourfairerespectercetordre.

c.Listesdoublementchanes

Dansunelistechanesimple,leparcoursneseffectuequedansunseulsens,etdepuisunlmentvousnepouvez
pasretournerauprcdent.Unepremiremthodeconsisteraitconserverladressedechaquelmentprcdent,
cequiseraitpossibleaveclutilisationdefonctionsrcursives,maisceseraittrslourd.
Lautrepossibilitconsisteutiliserdeslistesdoublementchanes:chaquelmentnecontientnonplusunseul
pointeur,maisdeux:unpourllmentsuivant,unautrepourllmentprcdent.Ainsi,vouspouvezvousdplacer

- 12 - ENI Editions - All rigths reserved - Jonifar lina


185
danslesdeuxsensdanslaliste,soitverslaqueue(fin),soitverslatte.Ceslistessontditesbilatres.
Lestraitementsdoiventtreadaptsenconsquence.Prenezleproblmelenvers:vousavezdeuxpointeurs
mettrejour.Sivoussavezlefairedansunsens(commeleslistessimples)voussavezlefairedanslautre,vous
changezjustedesens.Ilyadoncdeuxfoisplusdoprationsdechanage:
Chanageavant

pPrecpSuivpNouveau

pNouveaupSuivpSuivant

Chanagearrire

pSuivantpPrecpNouveau

pNouveaupPrecpPrec

Leslistesbilatrespeuventaussitrecirculaireset/outries.

d.Filesetpiles

Dansunefiledattente,dansunmagasin,uncinma,brefdansunequeue,lepremierarrivestlepremierservi.En
anglais,celasetraduitpar"FirstIn,FirstOut",soitFIFOenabrg.

UnefiledattentedetypeFIFOpeuttrereprsenteparunelistechane.Chaquenouvellmentestrajouten
findeliste,tandisqueleslmentssonttraitslesunsaprslesautresdepuislattedelaliste.
Quandvousfaiteslavaisselle,lesassiettessontempileslesunessurlesautres.Quandvouslavezlesassiettes
vousprenezcellesdudessusendescendantaufuretmesure.Sidesnouvellesassiettessalessontrajouteselles
lesontsurledessusdelapile.

Leprincipeestlemmeeninformatiquequandvousvouleztraiterdeslmentsaufuretmesuredeleurarrive:
les derniers arrivs sont traits en premier. La pile peut tre reprsente par une liste chane : les nouveaux
lmentssontsystmatiquementrajoutsenttedelisteetleslmentssonttoujourstraitsdepuiscettette.Si
leslmentsarriventplusvitequeleurtraitement,ceuxarrivsenpremierrisquentdtretraitsbientard.

ENI Editions - All rigths reserved - Jonifar lina - 13 -


186
Lesarbres

1.Principe

ote : Limplmentation des arbres en Java reprend des principes quasiidentiques aux listes vues
N
prcdemment.LecodeJavanevousserapasfournicecoupci!vousdimplmentercesalgorithmes,cenest
pastrsdifficile.

Dans la nature, les vgtaux dcrivent souvent des structures dites arborescentes. Lexemple le plus vocateur est
larbre:letroncsedcomposeenplusieursbranches,sedcomposantellesmmesenbranchespluspetites,etainsi
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
dcompositiondelexcutiondunprogrammeetdesesappelsauxsousprogrammes,breftoutcequipeutincorporer
unenotiondehirarchiepeuttrereprsentsousformedunearborescence.
Lexemple le plus simple comprendre est la gnalogie. On parle darbre gnalogique. Partant de vous (1), vous
placeztoutdabordvosparents(2),puislesparentsdevosparents(4),puislesparentsdecesderniers(8)etainside
suite. Tous sont relis par leurs liens de parent : vous avec vos parents, parents avec grandsparents et ainsi de
suite.Leschmapartdevous,maispourraitpartirdevosarriresgrandsparents,ayantxenfants,ypetitsenfants,z
arrirespetits enfants (dont vous), chaque individu tant le successeur de son parent, et le prdcesseur de ses
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.Unlmentpeutdonctredcritparplusieursinformationsmaisdeuxseulementvontvousintresserpourla
suite:unlmentindividupointesursonpreetsamre.Untypestructurpouvantreprsenterunindividupourrait
donctre:

Structure individu
nom:chane
pnom :chane
...
pPre:pointeur sur individu
pMre:pointeur sur individu
FinStruct

Contrairementauxlisteschanessimplesoudoubles,ilnesagitpasicidedfiniruneliste,fileoupilemaisunenotion
dehirarchieentrelmentspresetfils.Cettehirarchieportelenomdarbre.

2.Dfinitions

a.Base

ENI Editions - All rigths reserved - Jonifar lina - 1-


187
Un arbre est form dune racine qui est llment la base de larbre, et dun nombre fini darbres qui lui sont
raccordsappelssousarbres.

Chaque lment dunarbrepeutavoirplusieurssuccesseurs(vousavezdeuxparents)maisunseulprdcesseur.


Seulelaracinenapasdeprdcesseur.

b.Terminologie

Lesarbresutilisentuneterminologieparticulirequireprendengroscelledelanatureetdelagnalogie:

Un noeud ou sommet est un lment quelconque de larbre. Dans un arbre gnalogique, chaque individu
reprsenteunnoeudousommet:ilaplusieurssuccesseursmaisunseulprdcesseur.

Laracineestlepremierlmentdelarbre,nayantpasdeprdcesseurdanslahirarchie.

Unefeuilleounoeudterminal,ounoeudfinalestunlmentquinapasdesuccesseur.

Unnoeudinterneestunnoeudquinestniracine,nifeuille,quiadoncunprdcesseuretdessuccesseurs.

Unarcreliedeuxnoeuds.

Unebrancheestlecheminquirelielaracineunefeuille.

Ductdurapprochementgnalogiquelgrementsexiste,voustrouverezlestermessuivants:

Lepreestleprdcesseuruniquedunnoeud.

Lesfilssontlesnsuccesseursdunnoeud.

Lesnoeudsdepreidentiquesontdesfrres.

Lenoeudleplusgauchedelarbreestlan.

Unarbrepeuttredcrithorizontalementetverticalement.

c.Descriptionhorizontale

Horizontalement, un arbre naire est un arbre dont le nombre maximum de fils par noeud est n. Les fils sont
regroupsparniveaux.Unniveauestlensembledesnoeudsgaledistancedelaracine.Lepremierniveauestla
racine,ledeuximelesfilsdelaracine,letroisimelesfilsdesfils,etainsidesuite.Quandchaquenoeuddunniveau
aexactementnfils,leniveauestditsatur.
Unarbreeststrictementcompletsitouslesniveauxsontcomplets.Ilestsimplementcompletausenslargesitous
lesniveauxintermdiairessontcompletsmaisquilmanquedesfeuilles.Dansunarbrestrictementcomplet,laracine
ettouslesnoeudsinternesontexactementnfils,niplusnimoins.

d.Descriptionverticale

Lahauteurdunarbreestlenombredenoeudsdupluslongchemindirect,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

Unarbrebinaireestunarbredontchaquenoeudaauplusdeuxfils.Depuislaracine,larbrebinaireestconstitude
deuxsousarbresdiffrencis,lesousarbredroitetlesousarbregauche.
Ilexistedesarbrestrois,quatre,nfils.Cependantseulslesarbresbinairesserontabordsicietnotammentles
arbresbinairesordonns.Leschmasuivantmontreunarbrebinairestrictementcompletdehauteur3.

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


188
Arbrebinaireordonnstrictementcompletdehauteur3

3.Parcoursdunarbre

Pourlasuite,lastructuredunnoeuddunarbreseralasuivante,tantbiencomprisquchaquenoeudestassocie
une valeur (sinon larbrena aucun intrt) et que bien que cette structure ressemble celle dun lment de liste
doublementchanecenestpluspourunereprsentationlinairemaishirarchique.

Structure noeud
valeur:entier
pGauche:pointeur sur noeud
pDroit:pointeur sur noeud
FinStruct

Chaquearbrebinairepeuttredcomposensousarbres,ungaucheetundroite.Maisbiensouventunsous
arbrepeutluimmetreclat:chaquenoeudayantunoudesfils,contientunoudeuxsousarbres,undroiteet
ungauche.Lenoeud9adeuxsousarbres:ungaucheverslenoeud9,undroiteverslenoeud10.Dansles
fonctionsdeparcourssuivantes,chaqueappelchaquenoeudnevalantpasNILestconsidrcommelaracinedun
arbreetlessousarbrespartantdecenoeudserontparcouruscommetels.
Leparcourscompletdunarbreconsisteparcourirtoutlarbreafindaccderlensembledesnoeudsdelarbre.Bien
quil soit possible de faire ceci avec des structures itratives le moyen le plus facile est demployer des sous
programmesrcursifsafindetraiter:

Laracine

Lesousarbregauche

Lesousarbredroit

Cetypedeparcoursestditprfix.Leprogrammevadabordtraitertousleslmentsdegauche.Arrivunefeuille,
ilremonteaunoeudprcdent,puispassedroitepourtraiterleslmentsdegauchedeceluici,puisremonte,et
ainsidesuite.

Danslarbrebinairedelexemple,lordredesortieestlesuivant:

Branchegauche:12>9>8(cestunefeuille)

Onremonteaunoeud9

ENI Editions - All rigths reserved - Jonifar lina - 3-


189
Branchedroite:10(cestunefeuille)

Onremonteaunoeud9,puislaracine12

Branchedroite:14

Branchegauche:13(feuille)

Onremonteaunoeud14

Branchegauche:16

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:

Lesousarbregauche

Lesousarbredroit

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:

Lesousarbregauche

Laracine

Lesousarbredroit

Cettefoislordredesortieestlesuivant:

Sousarbregauche:8910

Racine:12

Sousarbredroit:131416

- 4- ENI Editions - All rigths reserved - Jonifar lina


190
Vousobtenezlasquence891012131416.Cesttrsintressant:larbrebinairedonnenexemplenapast
choisi au hasard. Il sagit dun arbre binaire ordonn, construit de sorte quavec un parcours infix les valeurs des
diffrentsnoeudssonttries.

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

Unarbrebinaireestordonnsipourunevaleurdunnoeuddonn,lavaleurdufilsdegaucheluiestinfrieureetla
valeurdufilsdedroiteluiestsuprieure.

pGauchevaleur<pEncoursvaleur<pDroitevaleur

Imaginezquevousvoulezrajouterlavaleur15danslarbre:

Comparez15laracine12:cestsuprieur,directionlenoeuddedroite.

Comparez15aunoeud14:cestsuprieur,directionlenoeuddedroite.

Comparez15aunoeud16:cestinfrieur,directionlenoeuddegauche.

Ilnyapasdenoeudgauche:placez15danscenouveaunoeud.

Touslesparcourssontpossibles,etleparcoursinfixvousdonnetouteslesvaleursdjtries.

b.Recherchedunlment

Pourrechercherunlment,vousavezdeuxsolutions:utiliserunesolutionitrativeouunesolutionrcursive.En
effetlesdeuxsontpossiblesetassezsimples.Ilsuffitdecomparerlavaleurrecherchelavaleurdechaquenoeud.
Sielleestinfrieure,alorslarecherchecontinuegauche,sinonellecontinuedroite,tantquunefeuillenapast
atteinteetquelavaleurnapasttrouve.

Lafonctionrech1()prenddeuxarguments:lavaleurrechercheetlaracinedelarbre.ElleretourneunboolenVRAI
silavaleurattrouve,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

ENI Editions - All rigths reserved - Jonifar lina - 5-


191
Lafonctionrech2()estrcursive.Elleprendtroisarguments:lavaleurrecherche,laracinedelarbreetladressedu
noeudcontenantlavaleurtrouve.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.Lajoutdunlmentrajoute
unefeuillelarbre.Ilvousfauttrouverlecheminjusquaunoeudpre.Lafonctionrech2()peuttremodifieence
sens:sillment ajouter nestpastrouv,alorsledernierlmentquivautalorsNILdoittreremplacparla
nouvellefeuilleettreraccordlabonnebrancheaupre.Ilfautdoncconserverladressedupre.

Lafonctioninserer()prendtroisarguments:lavaleurrajouter

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!= ou <> v Alors
Si v > pArbrevaleur Alors
insrer (v, pArbre, pArbrepDroite)
Sinon
insrer (v,pArbre, pArbrepGauche)
FinSi
FinSi
FinSi
FinFonc

d.Suppressiondunnoeud

Pourledernierpointdecechapitre,cestvousquiallezcrirelalgorithmedelafonctionncessairelasuppression
dunoeud.Ilyatroiscastraiter:

Lasuppressiondunnoeudsansfils(unefeuille),cestlecasleplussimple.Lepointeurcorrespondant(droite
ougauche)dupredoittreplacNIL.

Lasuppressiondunnoeudayantunfils:lefilsdroittreraccordaubonpointeurdugrandpre.

- 6- ENI Editions - All rigths reserved - Jonifar lina


192
Lasuppressiondunnoeudayantdeuxfils.Cestlecasleplusproblmatique.

Pour ce dernier cas, vous pouvez procder aux chanages directement. Par exemple, soit un morceau de larbre
dexemple,vousvoulezsupprimerlenoeud8:

Suppressiondunnoeuddeuxfils

Lenoeud9tantsupprim,ilfautrorganiserlarbreenconsquence.Lenoeudavaitdeuxfils:celuidegauche(et
tout son sousarbre) remplace le noeud supprim, celui de droite (et tout son sous arbre) va droite du nouveau
noeud.

Uneautrepossibilitestdesupprimerlenoeud,parcourirlesdeuxsousarbresdecetanciennoeudetderajouter
chaquelmentdanslepremierarbre.

ENI Editions - All rigths reserved - Jonifar lina - 7-


193
Principedelobjet,unenotionvidente

1.Avantdecontinuer

Vous voici dans le dernier chapitre de ce livre. Si votre objectif tait dapprendre programmer dans des langages
procduraux ou fonctionnels, cestdire bass sur lutilisation de sousprogrammes tels que prsents ici, vous
pourriezvousarrterl.Eneffetdsprsentvousdisposezdetousleslmentsindispensablespourprogrammer
enlangageCouenPascal.
Cependantilseraitdommagedenepascontinuer,cecimmesivousnaurezpastoutdesuiteprogrammerenobjet.
La programmation objet est depuis le dbut des annes 1990 non seulement un classique, mais fait partie de la
culture informatique. Un langage comme le C++, volution du langage C, et mme dautres comme Delphi driv du
pascal,VisualBasicdrivduBasic,ainsiquelaplupartdeslangagesdemacrossousMsOfficeouOpenOffice.org,ou
encoreleslangagesdecertainsgestionnairesdebasesdedonnes,sontdeslangagesobjet.
Nepascomprendrelobjet,cestrisquerdesecouperdebeaucoupdeproduits,beaucoupdefonctionnalits,etparfois
aussiduneplusgrandesimplicitdanscertainstraitements.

2.Rappelssurlaprogrammationprocdurale

Lesprocduresoufonctionsreoiventcesdonnesenarguments(paramtres)etlesretournentmodifiesounonpar
lemmecheminouparvaleurretourdefonction :
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.

Le type de la variable peut aussi tre dfini par le programmeur. Ce sont les types structurs que vous dcrivez
vousmme.
Les tableaux permettent de regrouper en un tout, plusieurs occurrences de valeurs dans une mme variable. Ils
peuvent contenir n valeurs, gnralement du mme type (dans les langages typs comme le C) ou non (langages
nontypscommelePHP).

Des variables particulires appeles les pointeurs ne contiennent pas directement une valeur mais ladresse dune
variable contenant cette valeur, cestdire ladresse de lemplacement de cette valeur dans la mmoire de
lordinateur.Bienqueplusdifficileapprhender,ellespermettentunesouplesseingaledanslesmanipulationsde
valeurs.Pourpalieraurisquedecomplexitdanscertainslangagesvolus,lanotionderfrenceremplaceparfois
celledepointeur,notammentenJava.

b.Lestraitements

Lestraitementssonteffectussoitdansleprogrammeprincipal(quonappelleparfoislecorpsdeprogramme)soit
dansdessousprogrammesappelsprocduresoufonctions.Danscederniercas,lafonctionestutilisecommeune
instruction retournant une valeur, alors que la procdure est un bloc dinstructions sans valeur mais pouvant
ventuellement en retourner via un passage de valeurs au travers des paramtres. Des langages comme le C ou
Javanefontpasdedistinctionentrecesdeuxnotions,unefonctionneretournantpasforcmentdevaleur.

3.Lobjet

a.Danslaviecourante

Regardez autour de vous de quoi sont constitues les choses. Par chose, comprenez tous les objets rels ou
abstraits qui vous entourent . Un objet rel est par exemple une salire, un couteau, un stylo, une voiture, votre
cran dordinateur, un tlphone, etc. Par abstrait comprenez une entreprise, un service, une organisation
quelconque,etc.

Ces objets ont des proprits intrinsques. Prenez un cran. Parmi ses proprits physiques et dusage vous

ENI Editions - All rigths reserved - Jonifar lina - 1-


194
trouvez :

sesdimensions,

sontype(crt,lcd,etc),

sesconnecteurs(vga,dvi),

sonpoids(cestlourduncrantube),

ladiagonaledaffichageenpouces,

lesrsolutionsdaffichagesupportesaveclesfrquencesassocies,

etc.

Cemmecranaprobablementunmodedemploidcrivantlesmanipulationstantmatriellesquelogiciellespourle
paramtrer,parexemple :

rglerlescouleurs(etassoci :contraste,etc),

rglerlazonedaffichage,

changerdersolution,

etc.

Unobjetcommeuncrandisposedoncdeproprits :cestladescriptiondecequilest,desontat.

Il dispose aussi de mthodes : quelles sont les actions possibles pour modifier son tat, son comportement, pour
lutiliser.Cestcequilsaitfaire.

Toutes les choses, tous les objets de la vie courante ont des proprits et des mthodes. Mme une salire
(dimensions, couleur, nombre de trous, contenu, mthodes pour faire couler le sel plus ou moins vite, louvrir, la
remplir,lafermer,etc).Imaginezlenombredepropritsetdemthodespouruntrehumain

Ladfinitiondespropritsetdesmthodesdcritespouruncranestvalablepour99%descranssicenestplus.
Lecontenudespropritsseraprobablementmodifi,maissilcraneststandardlechangementdersolutionvia
Windows,MacOSouLinuxseraeffectudelammemanire.Ladfinitionglobale(propritsetmthodes)duntel
objetpeutformerunesortedemoulecommuntouslesobjets,lescrans,demmetype.

Unefoisquevousdisposezdece"moule",vouspouvezlappliquerautantdobjets,lescrans,quevousvoulez,
avecdventuellesvariantes,enappliquantlesmmesmthodes.

b.Eninformatique

Programmationprocdurale

Enprogrammationprocdurale,laquestionseposerquandondveloppeest"quoisertleprogramme ?".Ici,il
sertmanipulerlesinformationsetlesfonctionsduncran.
Commentenprogrammationreprsenterlespropritsdelcranetlesmanipulationsquiysontassocies ?Jusqu
prsentvousauriezprobablementraisonnainsi :

RegroupertouteslesinformationssurlcrandansuntypestructurtEcran(parexemple).

Crer des sousprogrammes de gestion des paramtres de lcran, prenant comme arguments la structure
correspondante.

Pour n crans, vous crez n enregistrements (structures) de type tEcran, un par cran, dans des variables
diffrentes,oudansdestableaux.

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


195
Pourrsumer,enalgorithmiquevouscririezquelquechoseressemblantplusoumoinsa :

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 ?

Programmationobjet

Quandvousprogrammezenobjet,laquestionseposerest"Surquoiporteleprogramme ?".Larponseest :sur


lescrans.Puisqueleprogrammeportesurlescrans,pourquoinepastenterderpondrelaquestionposela
findupointprcdent ?Larponseest "pourquoipas",etcestlebutoulundesbutsdelaprogrammationobjet.

Vousavezdjindirectementcroisplusieursfoislechemindesobjets.Leschapitresprcdentsvousontmontr
destableaux,desstructures,deschanesdecaractres,desrfrences.EnJavatousceslmentssontdesobjets.
Enfait,toutcequevousavezdclaraveclemotcl"new"estunobjet.

Dans les exemples, vous avez probablement remarqu que la saisie de chanes au clavier, la lecture et
lenregistrementdefichiersetmmelesinstructionsncessaireslaffichagepassentpardesobjets.Sicenestpas
lecas,leprincipedesstructuresdevraientvousaidermieuxcomprendre.

En langage procdural ou en algorithmique, une structure est dj appele un objet, dans un certain nombre
douvrages dalgorithmique un peu anciens (annes 1980), dans le sens o elle contient un ensemble de donnes
cohrentessurunsujetbienprcis.Lastructuretarticlecontenaittouteslespropritsdunarticle.Vousaccdez
uneinformationtraverslepoint"."oulaflche""silenregistrementestunerfrence.

La structure code donc toutes les proprits dun objet rel ou abstrait. Cependant tous les traitements associs
sontdansdessousprogrammespart.

Maintenant,regardezceslignesissuesdelexempleenJavasurlesfichiers :

String ligne;
...
passwd[cpt]l i g n e . s p l i t ( " : " )
...

La variable ligne est une chane de caractres. Pourtant, vous avez limpression quelle est utilise comme un
enregistrement de structures, mais laide du point "." vous accdez non pas des enregistrements, mais des
fonctionsassocieslavariable !Pourquoi ?Larponsesetrouvedansunedfinitiondelobjet :

Dansleslangagesobjet,lesdonnesetlestraitementsquimanipulentcesdonnessontregroupsauseindune
mmeentitappeleobjet.
EnJavalesobjetssontdcritsaveclemotcl"class".Enalgorithmiqueilslesontaveclemotcl"classe".

Quellessontlespropritsdunechanedecaractres ?

Lachaneellemme,composedunesuitedecaractres.

Quelssontlestraitementsapplicablesunechane ?

Lecalculdesalongueur,

ENI Editions - All rigths reserved - Jonifar lina - 3-


196
ledcoupageensouschanes,

laconcatnationavecuneautrechane,

larechercheduneautrechanededans,

lclatementdelachaneselonundlimiteur,

laconversionenminusculesoumajuscules,

lasuppressiondesespacesavantetaprs,

etc.

Maintenant, regroupez les proprits de la chane et tous les traitements possibles dessus en un seul tout. Vous
obtenezunobjet.
Unprogrammeobjetestconstitudunensembledobjetsquicommuniquententreeuxparlmissionetlarception
demessagespourraliserletraitementfinal.Caparatimpressionnantetcompliqucommeamaiscestenfaittrs
simple.Danslalignesuivante :

passwd[cpt]ligne.split(":")

lobjetappellignedetypeStringreoitlordreassocisafonctionsplit() :dcoupersachaneselonledlimiteur
":"etretournercommersultatuntableaucontenantleslmentsdcoups.
Maisquiluienvoielordre ?Leprogrammeprincipal ?Regardezcommentdmarreunprogramme :

c l a s s c h a p 7 _ f i c 1 {
p u b l i c s t a t i c v o i d m a i n (String[] args) {
...
}
}

Votre programme principal Java est en fait une fonction particulire dune classe qui porte le nom de votre
programme ! Quand vous excutez votre programme, linterprteur Java cre un objet de la classe chap7_fic1 et
cherchededansunefonctionmain()pourlexcuter.

Cestdonclobjet(unefonctiondelobjet)chap7_fic1quidemandeunobjetdetypeStringdedcouperunechane
en plusieurs morceaux et de lui retourner le tout dans un tableau. Il y a donc bien une communication entre les
objets,etcestvousquiditesquoifaire.

Sivousnavezpasencorebiencompris,alorsditesvousquunvritableobjeteninformatiqueestunpeucommeun
enregistrement(ilenreprendlesmmespropritsquesontleschamps)auquelonauraitrajoutdedansdessous
programmeschargsdemanipulerseschamps.Lessousprogrammesneseraientpluspartmaispartieprenante
delastructure,quiseraitalorsnonplusladfinitiondunenregistrement,maisdunobjet.

4.Classe,objets

Ilestncessairedeconnatrequelquesmotsdevocabulairepourdfinirunobjet.Unobjetestdfinipar :

Lesdonnessurluimme :sesproprits,sontat.

Cequilfait :lestraitementsquilassociesesdonnesoulesdonnesreuesdesautresobjets.

Comme les structures se dfinissent avec le motcl du mme nom, la structure dun objet se dcrit avec le motcl
"Classe" pourclassedobjet.Cettestructuredelobjetdfinitcequeseraunobjetdecetype.Laclasseestletypede
lobjet.

Unobjetestunevariabledontletypeestsaclasse.

Une classe est en fait un moule servant crer plusieurs objets. Les objets issus dune mme classe sont
diffrentslesunsdesautresparcequelesvaleursdeleurspropritsnesontpastoujourslesmmes(ex :un

- 4- ENI Editions - All rigths reserved - Jonifar lina


197
objetdeclasseStringenJavanecontientpaslammechanedecaractresquunautreobjetString).

Commeilpeutyavoirplusieursobjetsdemmetypedeclasse,onditquunobjetestuneinstancedeclasse.

Ladfinitiondunobjetestunpeucommecelledunestructure,saufquelleestcomposededeuxparties :

Les attributs sont les proprits de lobjet, cestdire les diffrentes variables qui dfinissent ce quil
reprsente,sontat.

Lesmthodessontlessousprogrammes,fonctionsouprocduresquiinfluentsurlobjet,parexemplesurles
attributs.

Cesdeuxpartiessontappeleslesmembresdelobjet.

Lesattributssontdesvariablesdenimportequeltype,primitif,tableau,objet,etc.Lesmthodessontlquivalentdes
sousprogrammesvusjusquprsent,maispropreslobjet.

Classe mon_objet
attributs
attr1 :entier
attr2 :tableau[1..10] de r
e ls
...
m
t hodes
proc
d ure afficher()
proc
d ure 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

ENI Editions - All rigths reserved - Jonifar lina - 5-


198
Etmmedclarerdespointeurssurdesobjets,puisqueeuxaussioccupentunezonemmoire :

Var
ecran :Ecran
pEcran :pointeur sur Ecran

Par convention les variables objets, qui seront simplement appeles objets par la suite, commencent souvent par la
lettre o : oEcran1, o1, o2, etc. Mais vous ntes absolument pas oblig de suivre cette convention, sauf si votre
responsable,chef,professeurvouslimpose.

Vous accdez aux divers membres de lobjet en utilisant le point "." entre le nom de lobjet et ses membres,
exactementcommepourunestructure.Laseulediffrenceestquaprslepointvousnavezplusforcmentunchamp
(un attribut) mais aussi un sousprogramme (une mthode). Quand vous placez une mthode aprs le point, vous
lancezlexcutiondecelleci.

Type
Classe Ecran
...
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
la pense. Mais comment manipuler les attributs de lobjet au sein dune de ses mthodes ? Cest l quest un trs
gros avantage : alors quen programmation procdurale vous deviez passer la donne (la variable) en argument, l
cesttotalementinutile :lamthode"sait"implicitementquelattributauquelilaccdeappartientlobjet :

Classe Ecran
attributs
type :chane
...
mthodes
Procdure modifie_type(E :t :chane)
Dbut
typet
FinProc
...
FinClasse

Ilarriveparfoisquedesnomsdattributssoientidentiquesceuxdautresobjetsouargumentspasssenparamtres
demthodes.Pourviterlaconfusionvouspouvezexplicitementdsignerquelemembreappartientvotreobjeten
prcisantlemotcl"this"suividupointetdesonnom.Thisseraremplacparlobjetluimmelorsdelappel.

Classe Ecran
...
Procdure modifie_type(E :t :chane)
Dbut
t h i s .typet
FinProc
...
FinClasse

- 6- ENI Editions - All rigths reserved - Jonifar lina


199
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
pratiquecestvidemmentvousquiinitiezcettecommunication :quandonditquunpremierobjetdemandequelque
choseunsecond,cestquelunedesmthodesdupremierobjetappellelunedesmthodesdusecond.Puisquetout
estobjet,vouspouvezcreruneinstancedusecondobjetcommeattributdupremier, oummepasserdesobjetsen
argumentsdemthodes.
Danslexempleprcdent,lobjetdetypeEcranpeutrecevoirlemessagemodifie_typequimodifielattributtype.

Il est possible de dcrire (programmer) une mthode en dehors de la dfinition de la classe (en algorithmique, mais
pas en Java par exemple). Dans ce cas, dans la dfinition de la classe vous crivez le prototype de la mthode
(nom+paramtres) et en dessous vous dfinissez la mthode. Vous devez respecter la syntaxe suivante avec les
doublespoints"::"entrelenomdelaclasseetlamthode:

Procdure classe::methode(params)

Parexemple :

Classe Ecran
...
mthodes
Procdure modifie_type(E :t :chane)
...
FinClasse

Procdure Ecran::modifie_type(E :t :chane)
Dbut
this.typet
FinProc

7.Portedesmembres

Dansleprogrammeobj1laccsauxdiversmembres,attributsoumthodes,sefaitdirectement.Leprogrammeaccde
auxmembresenpassantparlobjet et loprateurpoint.Cestquedansladfinitiondelaclasse,lesmembressont
biensouventpublics :ilssontaccessiblessansaucuneprotection.

Vous pouvez choisir de rendre les divers membres publics ou privs. Par dfaut en Java par exemple si vous ne
prcisezrientoussontpublics.Enalgorithmiquelesattributssontpardfautprivsetlesmthodespubliques.

Public : les membres sont directement accessibles depuis toute autre partie du programme ou objet comme
danslesexemplesprcdentsvialoprateurpoint.

Priv : les membres ne sont plus accessibles depuis lextrieur de lobjet. Ils sont seulement accessibles
depuislintrieurdelobjet.

Vouspouvezprciserdanslesdclarationsletypedaccsvosmembres.VoiciunexempledelaclasseEcranoles
attributssontprivs,doncaccessiblesuniquementdepuislesmthodesdelobjet,etlesmthodespubliques :

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

ENI Editions - All rigths reserved - Jonifar lina - 7-


200
Var
o1:Ecran
Dbut
// Attributs privs : accs depuis lextrieur interdit
o 1 . t y p e " L C D " / / * * * I N T E R D I T ! ! ! * * *
// Accs direct aux attributs
Afficher o1.type // *** INTERDIT !!! ***

// Mthodes publiques : accs autoris
o1.saisie_modle("Multisync FE1250+")o1.affiche_modle()
Fin

Il existe un troisime type daccs : laccs protg. Il est particulier et vous le reverrez plus loin lorsque la notion
dhritage sera aborde. Un membre protg est considr comme priv pour les autres objets indpendants car il
nestpasaccessibledepuisceuxci,maiscommepublicauseindelobjetetdesobjetsquiendrivent.

8.Encapsulationdesdonnes

Lesmembrespeuventtrepublicsouprivs.Lastructureinternedunobjetcomporteuncertainnombredattributset
demthodesquiluisontpropres,quirefltentsastructureinterne.Desattributsetmthodesdelobjetnesontutiles
que pour dautres mthodes et donc ne doivent pas tre accessibles depuis lextrieur de lobjet. De mme, afin de
laisserunseulpointdentreauxdiversattributs,vousnedevriezpaspermettrelaccsceuxcilafoisdirectement
etpardesmthodes.

Unebonnepratiqueconsisteinterdirelaccspublicauxattributs.Seuleslesmthodesyaccdentetsivousvoulez
les manipuler, vous dfinissez des mthodes publiques pour cela. Vous vitez ainsi que le programmeur manipule
directementlastructureinternedevotreobjetetymettenimportequoicarvouspouvezeffectueruncontrleausein
desmthodes.Cestleprincipedelencapsulationdesdonnes :

Lesattributssontprivs(ouprotgs).

Vouslesmanipulezenpassantpardesmthodespubliques.

Lexemplemodifisuivantmetenvidencecequiauraitpuposerunproblme :vousvoulezmodifierletypedcran.
Enpassantdirectementparunattributpublicvousauriezpumettrenimportequoidedanscomme"PLAT".

Orlamthodemodifie_typevrifieavantcequevousymettez dansunchoixprdfini(crt,lcd,plasma).Siletypeque
vousvouleznecorrespondpas,ilestrejet.Vousvenezdeblinder(unpeu)votreobjetenempchantquiconquedele
"casser".Vousreconnaissezmaintenantlimportance,danscertainscas,delencapsulationdesdonnes.

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

- 8- ENI Editions - All rigths reserved - Jonifar lina


201
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
utilisateurs accdent indirectement aux attributs. Les mthodes qui permettent de manipuler lobjet sont les mmes
quelquessoientlesvaleursdesattributsdelobjet.CestpourquoiunobjetdontlattributtypeestCRTouLCDsutilise
de la mme manire : cest le principe dabstraction : lutilisateur manipule nimporte quelle instance de classe sans
rienconnatredesacomplexitinterne.

9.Lhritage

a.Principe

Vous ne trouverez la notion dhritage nulle part ailleurs que dans lobjet. Il permet de crer une nouvelle classe
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
une superclasse. La classe drive hrite des membres de la superclasse. Sauf que dans la classe drive, vous
pouvezrajouterdesnouveauxattributsetdesnouvellesmthodes,etmmeredfinirlesmthodesdelaclassede
base :cestunefonctionnalitmajeuredelanotiondobjet.

Soituneclasseanimal :

Classe animal
attributs privs
forme :chane
ordre :chane
...
mthodes publiques
Procdure modifie_ordre(E :ordre :chane)
...
FinClasse

Lergneanimalestcomplexeetpourrattredivisennormmentdechoses :vertbrs,invertbrs,mamifres,
insectes,ou encore herbivores, carnivores ou omnivores. Ces trois derniers sont la base tous des animaux : des
classesdecegenredriventdelaclasseanimal.
Pourdclareruneclassequidriveduneautrerespectezlasyntaxesuivante :

Classe maClasse h
r ite de Superclasse
attributs
...
m
t hodes
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

ENI Editions - All rigths reserved - Jonifar lina - 9-


202
...
FinClasse

Aveclhritage, vous pouvez concevoir des classes de plus en plus spcialises. De mme si vous devez concevoir
des classes dont les proprits sont trs proches, plutt que de tout reprogrammer depuis zro, vous pouvez
concevoiruneclassedebase(lasuperclasse)etcrerdeuxclassesquihritentdecelleci.

Donnezunoudeuxnomsdanimauxdanschaquecatgorie.Lavacheestherbivore,lechevalaussi.Lesdeuxnont
paslemmergime,etpaslemmenombredestomacs.Vouspouvezlesdiffrencierdansdeuxclassesdiffrentes
quidriventdelaclasseherbivore :

Classe cheval hrite de herbivore


...
FinClasse
Classe vache hrite de herbivore
...
FinClasse

Vous pouvez faire de mme avec les carnivores : lion, chien, et les omnivores : lhomme, le singe. Vous constituez
doncunensembledeclassesdrivesdeplusenplusspcialises.

Dansuneclassedrive,vousavezunaccsdirectauxmembres,tantlesattributsquelesmthodes,detoutesles
superclasses dorigine, en cascade. Donc ceci est correct, partant du principe que omnivore drive de animal vous
pouvezappelerlamthodemodifie_ordre()delasuperclasseanimal.

Programme obj4
Var
o3:herbivore
Dbut
o3.modifie_ordre(mammifre)
Fin

Rappelezvouscependantquelaccsauxattributsdpenddeleurprotection.Silesattributsdelasuperclassesont
privs,uneclassedrivenepeutpasyaccderdirectement.Sielleestprotgeoupublique,cestpossible.

b.Commerce

Lavantage est de taille, tellement quil existe pour des langages comme C++ ou Java des diteurs de logiciels
spcialissdanslaventedeclasses,regroupessousformedebibliothques.Ilexistedoncuncommercedobjetset
commelesclassessontdesmoulesrutilisablesvolonttoutlemondeytrouvesoncompte.Voustrouverezces
produitssouslenomdAPI :ApplicationProgrammingInterface,etilexistedesAPIpourpeuprstouslesdomaines
de linformatique : telle API pour accder plus facilement aux bases de donnes, telle API pour aider au
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 Java pour la gestion des
tableauxnevoussuffitpas,vouspourrezentrouverdautresquiproposeronttouslestypesdetri,dereconstituer
unechane,dallouerdynamiquementdeslmentssupplmentaires,quigrerontleslisteschanesvotreplace,
etc.Toutestpossible.
Enunephrase,lagrandeforcedelobjet est dtrerutilisable,acclrantainsiledveloppementdapplicationpar
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.
Comme plusieurs classes distinctes peuvent driver dune superclasse, et que dautres encore peuvent driver en
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(touteslesAPI
duSDK)driventdelaclasseObject.LaclasseObjectproposedesmthodesquisonttoutesrimplmentesdans
lesclassesdrives.LaclasseObjectestdonclasuperclassedetouteslesclassesJava.
Sivousreprenezlexempledesrgimesalimentairesdurgneanimal,vousobtenezunearborescencedecegenre :

- 10 - ENI Editions - All rigths reserved - Jonifar lina


203
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 (fruits et lgumes) et de la viande. Il est donc la fois herbivore et carnivore. Pourraiton alors crer une
classeOmnivoredrivantdesclassesCarnivoreetherbivore ?Cestpossible.Danscecaslanouvelleclassehrite
desmembresdesdeuxclassespres.

Classe omnivore hrite de Herbivore, Carnivore


...
FinClasse

Ducouplahirarchiedevient :

Hritagemultiple,attentionlacomplexit

Cestpossible,maiscelaposesouventplusdeproblmesqueaenrsout.Lesavissontpartagssurcesujet.Mais
voiciunbrefexempledesimplicationsunpeutorduesgnresparlhritagemultiple :sideuxmthodesdemme
nomsontdfiniesdanslesdeuxsuperclassesetpasdanslaclassedrive,quellemthodedoittreappelesison
nomestappeldanscelleci ?Leslangagesproposentdesastucespourgrercegenredecas,maisadevienttrs
complexe. Lhritage multiple a t implment dans le langage C++ mais pas en Java, tout au moins pas
directement :uneclassenedrivequeduneseuleclasse.

ENI Editions - All rigths reserved - Jonifar lina - 11 -


204
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
mthodesdessuperclasses :defaitellesfonttoutespartiedelaclassedrive.Pourtantilestprobablequesivous
avez driv de la superclasse cest que vous avez trouv un avantage rajouter des nouveaux attributs et des
nouvellesmthodes.Certainesdecesnouvellesmthodesremplacentpeuttrelesmthodesdelasuperclasseouy
fontappel.

Lepolymorphismedesmthodesestunautreconceptessentieldelaprogrammationobjet.Polymorphismesignifie
quunemmechosepeutprendreplusieursformes.Certainsanimauxenfontleurspcialitcommelesabeilles :chez
unemmeespce,ilyatroisformesdindividus,lafemelle(reine),lesmles(fauxbourdon)etlesouvrires(femelles
striles).Troisformesdiffrentespourlammeespce,oupluttlammelarvelabase.
Ductdelobjet,lepolymorphismepermetdecrerplusieursmthodesquiportentlemmenom.Ondistinguetrois
typesdepolymorphisme.

b.Lepolymorphismeadhoc

Gnralementdansunlangageprocdural,vousnepouvezavoirquuneseuleprocdureportantlemmenomdans
unmmeprogramme.SilesousprogrammeAfficher()doittreutilispourdesdonnesdiffrentes,vousdevezsoit
ladapter en consquence, soit crer autant de sousprogramme Afficher_xxx() o xxx nommerait le rle exact du
sousprogramme.

Enobjet,commechaquedfinitiondeclasseestindpendantedesavoisine,vouspouvezrutiliserlesmmesnoms
demthodesdansdesclassesdiffrentes,puisquellesnontaucunrapportentreelles.

Classe lion hrite de Carnivore


...
mthodes publiques
Procdure affiche_nom()
...
FinClasse
Classe Ecran
...
mthodes publiques
Procdure affiche_nom()
...
FinClasse

c.Lepolymorphismedhritage

Vousavezledroit,etcestsouventlecas,deredfinirunemthodedunesuperclassedansuneclassedrive,avec
lemmenomdemthode.UneclasseObjectcommeenJavadfinitdesmthodesdebase,quisontredfiniesdans
lesclassesdrivesenfonctiondesnouvellespropritsdecelleci.Unexempleclassiqueestunjeudchecsetses
pices.Chaquepicedujeuaunnombreplusoumoinslimitdemouvementsautoriss.

Uneclassepicevadfinirunemthodemouvement().Lesclassesdrivespion,fou,tour,cavalier,roietreinevont
conteniraussiunemthodemouvement()quidtermineraleursmouvementspropres :

Classe Pice
...
mthodes publiques
Procdure mouvement()
Dbut
Afficher "Mouvement de Pice"
FinProc
...
FinClasse
Classe Tour hrite de Pice
...

- 12 - ENI Editions - All rigths reserved - Jonifar lina


205
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

VouspouvezexplicitementfaireappellamthodedelasuperclassePicedontTourdrivelaidedumotclsuper
(poursuperclasse) auseindelaoudesmthodesconcernes.Danslexemplesuivantlamthodemouvement()dela
classe Tour a t modifie pour appeler la mthode mouvement() de Pice. lissue de ce programme, les deux
messagessontaffichs,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

ote : en cas dhritage en cascade, le motcl super se rapporte la classe mre, cestdire celle dont
N
drivedirectementlaclassefille.Pourremontertoutelahirarchiedesclasses,vousdevezutiliserlemotcl
superdanstouteslesmthodesdetouteslesclassesprcdentes,encascade.

d.Lepolymorphismeparamtrique

Chaquemthodeauseinduneclassedisposedunesignatureparticulire.Cettesignatureestconstituedunomde
la mthode, des paramtres quelle prend et de la valeur quelle retourne. Le langage objet se base sur cette
signaturepourappelerlabonnemthode.

Leprincipedelobjetindiquequilsuffitquunseuldecestroisconstituantsdelasignaturevariepourquelamthode
soitconsidrecommediffrente.Vouspouvezfaireparexemplevarierletypedevariableretourneparlamthode,
et aussi les paramtres, mais pas le nom de celleci ?Voyezvous les implications directes ? Vous avez le droit de
donnerlemmenomplusieursmthodesconditionquelenombreoulestypesdesparamtresdecellescine
soientpasidentiques.

Soituneclassecalculquiredfinitdesoprationssurdiverstypesdevariables :entiers,rels,maisaussichanesde
caractres pour les concatner par exemple. Dans cette classe, vous voulez que quand vous appelez la mthode
addition(),ladditiondesdeuxvaleurspassesenparamtressoiteffectue,sanssesoucierdeleurtype.Celane
reprsenteaucunproblme.Lexemplesuivantimplmentecestroismthodes,etleprogrammeprincipalyfaitappel.

ENI Editions - All rigths reserved - Jonifar lina - 13 -


206
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
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 - Jonifar lina


207
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, aux bonnes valeurs. La solution actuelle consiste appeler explicitement les mthodes prvues cet
effet :modif_type(),modif_marque(),modif_modle(),etainsidesuite.
Ilexisteunmoyenplusefficaceetimplicitedepositionnerlesbonnesvaleursdesattributs(etdeffectuertouteautre
oprationncessaire)dslinstanciation.Cemoyen,cestleconstructeur.
Le constructeur est une mthode particulire qui est appele automatiquement ds que vous crez un objet sans
que vous ayez le prciser, que se soit par dclaration ou allocation dynamique (via un pointeur). Dans cette
mthode, libre vous de faire ce que vous voulez, mais dans 90% des cas son rle sera de donner aux attributs
leursbonnesvaleursinitiales,oudesvaleurspardfaut.

Unconstructeurdoitrespecterlesdeuxpropritssuivantes :

Ilportelemmenomquelaclasse.

Ilneretournepasdevaleur.

Via le polymorphisme paramtrique (quon appelle aussi la surcharge des mthodes) vous pouvez crer autant de
constructeurs que vous le souhaitez, un par cas selon les paramtres passs. En algorithmique vous rajouterez le
motcl Constructeur devant le nom de la mthode en remplacement de Procdure ou Fonction. Ce nest pas
forcmentobligatoirecaraucuneautremthodenedoitavoirlemmenomquelaclasse.

b.Appelimplicite

LaclasseEcransevoitcompltededeuxconstructeurs :lepremiernereoitaucunparamtreetserautilislorsque
lobjetnereoitaucunevaleurlorsdesacration.Lesecondprendtroisparamtres(type,marque,modle)pourles
initialiserlacrationdelobjet.

n constructeur qui ne reoit aucun paramtre est appel le constructeur par dfaut. Il est appel quand
U
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

ENI Editions - All rigths reserved - Jonifar lina - 1-


208
Commentsavoirquelconstructeurvatreappellacrationdelobjet ?Cestvousdepasserlesbonnesvaleurs
lobjet ds son instanciation (dclaration ou cration). Dans lexemple suivant, deux objets Ecran sont crs. Le
premierlestcommedhabitude :cestleconstructeurpardfaut(sansparamtres)quiseraappel.Lesecondprend
trois paramtres entre parenthses, comme si vous passiez des paramtres une mthode : cest le constructeur
associquiseraappel.

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 ?

Si la classe drive na pas de constructeur, cest celui de la superclasse qui est appel, si cest possible
(paramtresidentiquesparexemple).

Silaclassedrivedisposedunconstructeur,cestluiquiestappel.

Par dfaut si le constructeur dune classe drive est prsent, le constructeur de la superclasse nest pas
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 - Jonifar lina


209
...
Fin

Leprogrammeobj10credeuxobjetsetdonnelaffichagesuivant :

Je suis A
Je suis B

PourappelerexplicitementleconstructeurdeAdepuisB,vousdevezlefaireexplicitementauseinduconstructeurde
Bvialemotclsuper.Celuiciremplaantlobjetsuperclasse,ilsutilisecommeunobjet.ModifiezleconstructeurdeB
ainsi :

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
empcheauseinduconstructeurdelaclassedrivedinitialiserlesattributsdelasuperclassedirectement,puisque
sauf si ceuxci sont privs, vous y avez accs directement. Lappel implicite au constructeur de la superclasse
risqueraitdefairedoubleemploioudcraservosvaleurs.

2.Lesdestructeurs

Toutcommeleconstructeurestappellacrationdunobjet,ledestructeurestappelquandlobjetestdtruit,ou
lallocationdynamiquelibre.Tousleslangagesneproposentpasdedestructeurs,notammentJava,maisproposent
parfoisdesmthodesparticuliresappelesautomatiquementquandlobjetnestplusutilis(sortiedefonctionquand
lobjetestlocal,remiseNILdesavaleur,etc).

LedestructeurestrarementemployenalgorithmiquecarlesprofesseurslenseignantontsouventlelangageJava
lesprit comme langage dimplmentation, et pas le C++ par exemple. Pourtant il peut tre important dans des
langages o lallocation de la mmoire est dynamique. Un attribut dun objet peut tre un pointeur allou
dynamiquement.Quandvousnavezplusbesoindelobjetetquevouslelibrez,quesepassetilpourcepointeur ?Il
fautlibreraussilazonealloue.

Ledestructeurressemblebeaucoupauconstructeur,saufque :

Ilnyaquunseuldestructeur.

Ilneprendpasdeparamtres.

Sonnomestcomposduntildesuividunomdelaclasse.

VouslefaitesprcderdumotDestructeur.

Il dispose des mmes proprits pour les classes drives. Vous devez ventuellement lappeler vousmme, en
cascade.

Classe B hrite de A
...
Constructeur B()
Destructeur ~B()

ENI Editions - All rigths reserved - Jonifar lina - 3-


210
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.

Pourtantilpeutyavoirdescasovousvoudrezpartagerunattributcommuntouslesobjetsdecetypedeclasse.
Lecasdcoleestceluiovousvoulezconnatrelenombredefoisolaclasseatinstancie.Danslecasdela
classeEcran,vousvoudriezparexemplesavoircombiendobjetsdetypeEcranonttcrs.

Poura,lattributdoittrecommuntouslesobjets,etchaqueobjetdoitpouvoirmodifierlavaleurdecetattribut,
valeurquiseraensuitelammepourtouslesobjets.Cestlerledelattributstatique.

Unattributstatiqueestunattributquinestcrquenunseulexemplaireetquiestcommuntouslesobjetsde
laclasse.

Vous le dclarez comme nimporte quel attribut, sauf que vous lui rajoutez le motcl statique aprs son type.
Lattributstatiquepeuttreprivoupublic.Ilpeuttreimportantdinitialiserunevaleurpardfautpourunattribut
statique.

Classe Ecran
attributs privs
n b _ e c r a n s 0 : e n t i e r s t a t i q u e
...
FinClasse

Pluttquedutiliserthispouryaccder,vousutilisezlenomdelaclasseellemme,tantdepuislextrieurdelobjet
(si lattributestpublic)quedelintrieur. Lexemple suivant montre les possibilits associes avec deux objets : le
constructeur rajoute 1, le destructeur soustrait 1. Les tapes intermdiaires affichent ltat de lattribut statique
nb_ecrans.

Classe Ecran
attributs publics
n b _ e c r a n s 0 : e n t i e r s t a t i q u e
...
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

Programme obj11

- 4- ENI Editions - All rigths reserved - Jonifar lina


211
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
gomtriques afin de concevoir un logiciel de conception assiste par ordinateur. Dans ces logiciels (2D ou 3D), les
diffrentesfigurestracesonttoutesleurspropritscommeleursdimensions,surface,primtre,volume,couleurde
remplissage, couleur du contour, etc. Les valeurs de ces attributs varient dune figure lautre, cest normal, 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 ?

Lasolutionconsistecrireuneclassedebasequideviendralasuperclassedetouteslesfiguresgomtriques,etqui
vacontenirtouslesattributsdebasecommelapositiondedpartx,ydutracdelafigure,sescouleurs,maisaussi
touteslesmthodesnonseulementdebasemaisquidoiventaussiobligatoirementtreimplmentesdanstoutesles
classesquiendrivent.Lesmthodesdecalculdesurfaceetdeprimtredoiventtredclaresdanscetteclasse.
Pourtantellesnecontiendrontriencommecode :ceseralaclassedrivedelesprogrammer.

Cette classe de base contenant des mthodes sans implmentation ne pourra pas tre instancie, vous ne pourrez
pascrerdobjetpartirdelle,carelleestdefaitinutilisableetnesertquedebasepourlesmthodesdrives.
Une classe non instanciable et contenant des mthodes non implmentes, uniquement destine tre drive,
est appele une classe abstraite. Les mthodes non implmentes quelle contient sont appeles mthodes
abstraites.

Pourcreruneclasseabstraite,vousrajoutezlemotcl"abstraite"aprslenomdelaclasse.

Pourcrerunemthodeabstraite,vousrajoutezlemotcl"abstraite"avantsonnom.

Classe figure a b s t r a i t e
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 a b s t r a i t e getSurface() :reel
Fonction a b s t r a i t e getPerimtre() :reel
...
FinClasse

partirdumomentouneclassecontientunemthodeabstraite,elleestellemmeabstraite.Laclassefigureest
abstraite :ellecontientdesmthodesabstraites,sansimplmentation.Ellecontientaussidesmthodesquinesont

ENI Editions - All rigths reserved - Jonifar lina - 5-


212
pasabstraitescommesetcolor_c()quinaurapasforcmenttrerimplmentedanslesclassesdrives.
Ilestdecefaitimpossibledecrerunobjetdetypefigure.Vousdevezmaintenantcrerlesclassesquienhritent.
Voici deux exemples simplifis de classes : disque et rectangle. Vous devez implmenter dedans les mthodes
abstraitesdelasuperclasse.

ote importante : vous tes oblig dimplmenter dans la classe drive les mthodes abstraites de la
N
superclasse.Sivousnesouhaitezpaslefaire,vousdevezdenouveaudclarerlamthodecommeabstraiteet
laclassedriveseraellemmeabstraite.

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
de superclasses dautres. Il est possible de pousser le raisonnement plus loin : questil ncessaire de faire pour
creruneclasseservantuniquementetentirementdeprototypeuneclasse ?Cetteclassedoitavoirlesproprits
suivantes :

Noninstanciable

Abstraite

- 6- ENI Editions - All rigths reserved - Jonifar lina


213
Necontenantquedesmthodesabstraites.

Ainsitouteclassedrivantdecetteclassespcialedevraitobligatoirementimplmentertouteslesmthodes.Quelest
lintrt ?Celuidedfinirunmodleuniqueetcompletdemthodespourlesclassesquidcidentdelesutiliser.

Cestypesparticuliersdeclassessappellentdesinterfaces.Enpratiqueuneclassenhritepasduneinterface :mis
partlesdfinitionsdesmthodesuneinterfacenecontientpasdecode.Pourdclareruneclasse,vousutilisezlemot
cl Interface la place de classe. Par exemple, vous voulez crer une interface qui dclare toutes les mthodes de
basepourlalecturedunfichiermultimdia :lecture,pause,stop,avancerapide,retourrapide,pisteprcdente,piste
suivante.Linterfaceressembleraitceci (lesparamtresdesmthodesnesonticipasprciss):

Interface lecture
mthodes publiques
Procdure lecture() ;
Procdure pause() ;
Procdure stop() ;
Procdure avance() ;
Procdure retour() ;
Procdure prcdent() ;
Procdure suivant() ;
FinInterface

N otezbienquuneinterfacenecontientQUEdesmthodesetriendautre.

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

Vous devez implmenter toutes les mthodes de linterface dans la classe. Si vous ne le faites pas, la mthode qui
nestpasimplmentedoittredclareabstraite,etlaclassedevientabstraite,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
...

ENI Editions - All rigths reserved - Jonifar lina - 7-


214
Fin
// Continuez ici
...
FinClasse

- 8- ENI Editions - All rigths reserved - Jonifar lina


215
LobjetenJava

1.Leslangagesobjet

Lesdeuxpartiesprcdentesdecechapitrevousontprsentcequestlaprogrammationobjet.Ilexisteplusieurs
langagesorientsObjet.OnparledeProgrammationOrienteObjet(POO).Lesprmicesdelaprogrammationobjet
sontanciennes(pourdelinformatique) :1967aveclelangageSimula,puisSmalltalk.Lgedordbuteaudbutdes
annes1980,avectoutdabordlObjectiveC(encoretrsutilisnotammentdansledveloppementdeMacOSetde
sesoutils),puisle"CwithClasses en1983,quideviendraleC++,puisEiffel,puisleLispObjet,etainsidesuite.

Lesannes1990ontvulexplosiondelobjettouteslessaucespourlemeilleuretpourlepire,etpasuniquement
dansleslangages.Ainsidesbasesdedonnesobjetsontapparues.DancienslangagescommelePascal,leBasicou
mmeleCOBOLontvoluverslobjet :Delphi,VisualBasic,CobolObjet,etc.Mmeleslangagesmacrospropres
dessuitesbureautiques(MsOffice,OpenOffice.org)oudebasededonnes(Access,Paradox)setarguentdtredes
langagesobjet.Siladfinitiondelobjetcorrespondpeuprscequivousatprsentdepuisledbutdece
chapitre,lespuristesdoiventdanscertainscasbienrire.
LarrivedeJavacommevrailangageobjetdehautniveauachangbeaucoupdechoses :reprenantlesbonnesides
duC++,illadapteenuntoutplussimpleetpluspratique,adaptauxbesoinsmodernesdesdveloppeursetsurtout
desapplications.LaforcedeSUNatdeproposerunlangageadaptunelargegammedebesoins :desapplets
Java,lapprentissagedelobjet,lesapplicationsdportes,lesserveursdapplications,etc.

LegrosconcurrentdelaplateformeJava(Java,sesoutils,sesAPI,etc)senomme.NETaveclelangageC#(prononcez
Csharp)etestvidemmentobjet.LesexemplesdecelivreauraientparfaitementputredveloppsenC#,sachant
quelelangageestmaintenantdisponibleailleursquesousWindows.

LasuitevousprsentedesnotionsdobjetenJava.Elleselimiteraauxnotionsquevousavezrencontresdepuisle
dbut de ce chapitre. Pour un meilleur apprentissage des fonctionnalits objet avances de Java, les Editions ENI
proposentdeslivresspcialissdanscedomaine,comme"J2SE, les fondamentaux de la programmation Java"de
Benjamin Aumaille. Quant une approche de lobjet plus oriente vers la conception dinterfaces graphiques, vous
trouverez lessentiel dans Conception et programmation objet, Applications de gestion en environnement
graphique dePascalDanone.

2.Dclarationdesclassesetobjets

Inconsciemment ou non, vous utilisez lobjet dans Java depuis les premiers exemples de ce livre. Dans le premier
chapitre,ilvousatdemanddenepasvoussouciercemomentdeladclarationduprogrammeprincipal.

Ensuite,desvariablescommeleschanes,lestableauxetsurtoutlesstructures(pourlesquellesilatquestionde
tricher) sont des objets. Enfin, toutes les fonctions que vous avez pu soit utiliser directement soit crer sont des
mthodesdobjets,etquelquesvariablesquivousonttprsentescommeglobalessontdesmembres.

Pastropsurprisnisecou ?Non ?Tantmieux.Autantfairelepointtoutdesuite :quasimenttoutestobjetenJava.


Uneclasse,sesattributsetsesmembressedclarentainsi :

class nom_classe {
// liste des attributs
public int att1 ;
protected int att2 ;
private String att3 ;

// liste des mthodes


public void methode1() {
// code mthode1
}
private int methode2() {
// code mthode2
}
}

Vousremarquezquearessembletrsfortementauxstructuresduchapitre5.Etpourcause,ilafallutricherenJava
pour utiliser une classe comme une structure. La structure est en fait une classe uniquement compose dattributs
publics,dolexpressioncourantequiditquuneclasseestunestructureavecdesfonctions.

Voici un exemple simplifi dimplmentation de la classe Ecran faisant apparatre deux constucteurs via le
polymorphisme paramtrique et une mthode modif_type() appele par lun des constructeurs ou do vous voulez,
puisquelamthodeestpublique.Cetexemplefaitaussiapparatrelutilisationdunevariablestatiqueetsonutilisation

ENI Editions - All rigths reserved - Jonifar lina - 1-


216
depuislamthodemain() :

class Ecran {
private String type,marque,modele,connecteur;
private String[] resolution=new String[10] ;
private int diagonale ;
private float hauteur,largeur,profondeur, poids ;
static int nb_ecrans=0;

// Constructeur par dfaut


Ecran() {
System.out.println("Constructeur par dfaut") ;
this.type="Inconnu" ;
this.marque="Inconnu" ;
this.modele="Inconnu" ;
this.nb_ecrans++ ;
}

// Constructeur avec 3 arguments


Ecran(String t, String mq, String mdl) {
System.out.println("Constructeur avec trois arguments");
modif_type(t ) ;
this.marque=mq ;
this.modele=mdl;
this.nb_ecrans++ ;
}

public boolean modif_type(String mod) {


String[] tmod={"CRT","LCD","PLASMA"};
Boolean ok=false;
for(int i=0;i<tmod.length;i++) if(mod==tmod[i]) ok=true;
if(ok) this.type=mod;
return ok;
}

public void affiche_type() {


System.out.println(this.type);
}

// Fonction statique
static void nbEcrans() {
System.out.println(nb_ecrans);
}

class chap9_ecran {

public static void main(String[] args) {


Ecran o1;

// 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();
System.out.println(o1.nb_ecrans);
}
}

Contrairementlalgorithmique,lesattributsetmthodesnesontpasregroupsparblocspublics,privsouprotgs.
Cest vous dajouter avant le nom et le type du membre sil est public, priv ou protg. Les dfinitions public et
privatesontexactementcellesvuescidessus,tandisqueprotectedlimitelaportedesattributsauxclassesdrives.
Les constructeurs ici au nombre de deux sont dclars comme en pseudocode algorithmique mais sans prciser ni
motclparticuliernitypederetour :vouscrivezseulementlenomdelaclassesuividesparamtres.

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


217
Vous remarquez depuis le dbut du livre que la fonction principale main() est en fait une mthode particulire dune
classepourtanttrsclassique.Lafonctionmain()eststatique,ellepeuttreappelehorsdelaclassedirectement,
cestdailleurslebut.Lenomdelaclasseestceluidufichierrsultantsanslextensionjavaouclass.

Sivousallezdanslerpertoire(dossier)ovousavezgnrlebytecodejava,les.class,vousdevezremarquerque
lorsque Java rencontre plusieurs dfinitions de classes dans un code source, il gnre autant de fichiers .class quil
existe de classes dcrites. Le fichier porte le nom de la classe. Il sera dynamiquement charg lors du lancement du
programme.SivoussupprimezlefichierEcran.class,plusriennemarche.

3.Hritage

Javaautoriselhritagesimplemaispaslhritagemultiple.Vousverrezcependantquilestpossiblederuserunpetit
peu avec les interfaces. Lexemple des figures gomtriques peut sappliquer ici, car Java supporte trs bien le
polymorphismeetlesclassesetmthodesabstraites.
Lhritageestexactementcommeenalgorithmique,saufqulaplacede"hritede"vousutilisezlemotcl"extends".
Concernantlesclassesetmthodesabstraitesvousrajoutezdevantlenomlemotcl"abstract".

Notezquedansladfinitiondelaclasseabstraitequelquesattributsprivssontremplacspardesattributsprotgs.
Autrement,lesclassesdrivesnauraientpaseuledroitdyaccder.

Enfin notez aussi lutilisation du motcl "super" comme en algorithmique, qui remplace la classe (ou plutt lobjet)
hrite,utiliseicipourappelerleconstructeurdelaclassefigurechargdeplacerlesbonnescouleurs.

Utilisedansunconstructeur,superdoittrelapremireinstructionappele.

abstract class figure {


protected double x,y,surface,perimetre;
protected String c_contour,c_remp;
public final double PI=3.1415927;

// Constructeur de figure
figure(String c1, String c2) {
setcolor_c(c1);
setcolor_r(c2);
}

public void setcolor_c(String couleur) {


this.c_contour=couleur;
}
public void setcolor_r(String couleur) {
this.c_remp=couleur;
}

// Mthodes abstraites
abstract public double getSurface();
abstract public double getPerimetre();
}

class disque extends figure {


private double rayon=0;

// Constructeur
disque(double c_x, double c_y, double r) {
// appel du constructeur de figure
super("noir","blanc");
this.x=c_x;
this.y=c_y;
this.rayon=r;
}

// Implmentation des mthodes abstraites


public double getSurface() {
return this.PI*this.rayon*this.rayon;
}

public double getPerimetre() {


return 2*this.PI*this.rayon;

ENI Editions - All rigths reserved - Jonifar lina - 3-


218
}
}

class rectangle extends figure {


private double largeur,hauteur;

// Constructeur
rectangle(double c_x,double c_y,double r_l,double r_h) {
// appel du constructeur de figure
super("violet","marron");
this.x=c_x;
this.y=c_y;
this.largeur=r_l;
this.hauteur=r_h;
}

// Implmentation des mthodes abstraites


public double getSurface() {
return this.largeur*this.hauteur;
}

public double getPerimetre() {


return 2*(this.largeur+this.hauteur);
}
}

class chap9_heritage {
public static void main(String[] args) {
disque o1;
rectangle o2;

o1=new disque(100,100,10);

System.out.println(o1.getSurface());
System.out.println(o1.getPerimetre());

o2=new rectangle(10,10,35,25);
System.out.println(o2.getSurface());
System.out.println(o2.getPerimetre());

}
}

4.Interfaces

Encoreunefois,enJavalesinterfacessontexactementcommeenalgorithmique.Vouscrezuneinterfaceaveclemot
cl"interface" etvousindiquezquelaclasseimplmentecetteinterfaceaveclemotcl"implements"aprslenom
delaclasse,suividunomdelinterface.

interface lecture {
public void lecture() ;
public void pause() ;
public void stop() ;
public void avance() ;
public void retour() ;
public void prcdent() ;
public void suivant() ;
}

class Musique implements lecture {


private String morceau;
private int position,duree,piste;

Musique(String m, int p) {
this.morceau=m;
this.piste=p;

- 4- ENI Editions - All rigths reserved - Jonifar lina


219
position=0;
}

// Dbut dimplmentation de linterface


public void lecture() {
System.out.println("lecture de "+this.morceau);
}
public void pause() {
System.out.println("Pause "+position);
}
public void stop() {
System.out.println("Arrt piste "+this.piste);
}
public void avance() {
System.out.println("Avance");
}
public void retour() {
System.out.println("retour");
}
public void prcdent() {
System.out.println("Prcdent");
}
public void suivant() {
System.out.println("Suivant");
}
}

class chap9_interface {
public static void main(String[] args) {
Musique o1;

o1=new Musique("Somebody to love",10);


o1.lecture();
}
}

Uneclassepeutimplmenterplusieursinterfaces,danscecassparezlesnomsdesinterfacespardesvirgules.

Une interface peut hriter dune ou plusieurs autres interfaces via le motcl "extends" suivi du nom de la ou des
interfaceshrites.

interface lecture1 {
public void lecture() ;
public void pause() ;
public void stop() ;
}
interface lecture2 {
public void avance() ;
public void retour() ;
public void prcdent() ;
}
interface lecture extends lecture1, lecture2 {
public void suivant() ;

CesdeuxdernierscassontlesseulsenJavao,indirectement,unesortedhritagemultipleatmisenplace,dans
lesensouneinterfaceouuneclassepeuthriterdeplusieursdfinitionsdemthodes.Cestsimplistedanslesens
odetoutefaoncesmthodesdoiventtreimplmentesobligatoirementdanslaclassequiutiliselesinterfaces,et
queducoupJavanapassavoirsildoitutilisertelleoutellemthodedelunedesclasseshrites.

ENI Editions - All rigths reserved - Jonifar lina - 5-


220

Vous aimerez peut-être aussi