Vous êtes sur la page 1sur 220

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

SbastienROHAUT
Rsum
L'auteur
Sbastien ROHAUT a dbut comme Ingnieur de dveloppement en C++. Aujourdhui Ingnieur Systme il intervient sur des missions
rgulires pour de grands comptes et continue denseigner le dveloppement des classes dingnieur et masters MTIC.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0PWS5rU+dzIgLAA==-enidentnumber
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.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0EaHgxE+dzIgLAA==-enidentnumber
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:
Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstruction
duprogrammeetlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALde
prendrecesdeuxnombresenmmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvelle
case. Puis lUCpasselinstructionsuivante.Sielleconsisteaffichercersultat,alorslUCvalirelecontenudela
mmoire ladresseoestplaclersultat,puisvaenvoyerlersultatvialecomposantdE/Sadquat.Etainside
suite.Aufinalledroulementdunprogrammeauseindelordinateurestlesuivant:
G lUCextraituneinstructiondelammoire,
G analyselinstruction,
G rechercheenmmoirelesdonnesconcernesparlinstruction,
G dclencheloprationadquatesurlALUoulE/S,
G rangelersultatdanslammoire.
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.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
4
Note:lesmicroprocesseursactuelssonttrscomplexes.Ilnestpasraredetrouverauseindeceuxciplusieurs
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
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
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:
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*10
0
=1234

Lunitestreprsentepar10
0
,ladizainepar10
1
,lacentainepar10
2
,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*2
0
=2
1
+2
0
=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
+2
6
+2
5
+2
4
+2
3
+2
2
+2
1
+2
0
=128+64+32+16+8+4+2+1=255

Donc
11111111
(2)
=255
(10)

Soit256valeurspossiblesde0(zro)255,cequipeuttreplussimplementcalculpar2
n
,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:
G 183/2=91,reste1
G 91/2=45,reste1
G 45/2=22,reste1
G 22/2=11,reste0
CourantFil1 CourantFil2 Binaire Dcimal
Nepassepas Nepassepas 00 0
Nepassepas Passe 01 1
Passe Nepassepas 10 2
Passe Passe 11 3
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
6
G 11/2=5,reste1
G 5/2=2,reste1
G 2/2=1,reste0
G 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)

Pourstockercettevaleurenmmoire,les8premiersbitsdepoidsfaible,soitloctetdepoidsfaible,serontplacs
dans la premire case mmoire, et les 8derniers bits de poids fort, soit loctetdepoidsfort,serontplacsdansla
casesuivante.Ladmarcheseraitlammeen32bitsou64bits.
Casemmoire1 Casemmoire2
00111001 10010110
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
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?"2
4
=16.Ilfautdonc4bits.Letableausuivantrsumelesconversions.

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!
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
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzE+dzIgLAA==-enidentnumber
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,ycomprislesautodidactes,onttousunmomentouunautreeuaffaireaveclesalgorithmes,caril
existe en programmation une multitude de moyens darriver un rsultat, mais trs peu pour obtenir le meilleur
rsultat possible, ce qui explique pourquoi beaucoup de programmes ayant la mme fonction, se ressemblent (au
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
me
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
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:
G soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela),
G soitdefaireunschmaexplicatifavecdessymboles.
Dans la pratique, les deux formes sont possibles. Mais un dessin ne vautil pas un long discours ? Il est dailleurs
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
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:
G 1retape:lancerled
G 2metape:saisirunevaleur
G 3me tape : si la valeur saisie est diffrente de la valeur du d, retourner la troisime tape, sinon
continuer
G 4metape:afficher"bravo".
Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprend
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
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:
G Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME".
G Unezonededclarationdesdonnesutilisesparleprogrammes:variables,constantes,types,structures,
tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuretmesuredes
diffrentschapitres.Cettezonecommenceparlemot"VAR".
G Le programme luimme, cestdirelesdiverstraitements.Lesinstructionsduprogrammesontencadres
parlesmots"DEBUT"et"FIN".Ilvousestconseill,pourplusdeclartetdelisibilit,dindenterlesdiverses
lignes(delesdcalerlesunesparrapportauxautres)laidedestouchesdetabulation.Leprogrammepeut
tredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance.
G Lescommentaires:cestuntextelibrequipeuttretendusurplusieurslignesetencadrparlessquences
de caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvez uniquement la
commencerparlescaractres"//".
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
12
Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexempleune
tabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvousobtenezn
fois n boucles, donc n
2
boucles. La complexit est donc f(n)=n
2
, et vous la noterez O(n
2
). Le cot de 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)soitn
2
+n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetque
vous comparez avec la courbe simple n
2
, vous remarquerez que le rajout devient ngligeable. Au final, lalgorithme
conserveunecomplexitO(n
2
).

Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies":
G O(1):complexitconstante
G O(log(n)):complexitlogarithmique
G O(n):complexitlinaire
G O(n.log(n)):complexitquasilinaire
G O(n
2
):complexitquadratique

G O(n
3
):complexitcubique

G O(n
p
):complexitpolynomiale

G O(n
log(n)
):complexitquasipolynomiale

G O(2
n
):complexitexponentielle

G O(n!):complexitfactorielle
Cescomplexitsnesontpasforcmentfacilesapprhender,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(2
n
) lalgorithme effectue dj 1024
oprations,etplusde3,5millionspourO(n!)!
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
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)soit10
9
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(2
n
), le traitement prendrait un dixime de seconde tout de
mme,cequiestnormeetrelativisefortementlapuissancedesprocesseurs
Vouscomprenezmaintenantlutilitdeconnatrelacomplexitdesalgorithmesetdoptimiserceuxci
Danslasuite,lescomplexitsneserontfourniesquedanslescasolestraitements,pluscompliqusquedhabitude,
sont en concurrence avec diverses mthodes. Cestlecasparexempledesmthodesdetrissurdestableaux.Ceci
dansluniquebutdevousdonnerunsimpleordredide.
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630k+dzIgLAA==-enidentnumber
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:
Cseg segment
assume cs:cseg, ds:cseg
org 100h
main proc
jmp debut
mess db Hello world!$
debut:
mov dx, offset mess
mov ah, 9
int 21h
ret
main endp
cseg ends
end main
echo "Hello world!"
10 PRINT "Hello world!"
20 END
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
DISPLAY "Hello world!".
STOP RUN.
#include <stdio.h>

int main(int argc, char **argv)
{
printf("Hello world!\n");
return 0;
}
#include <iostream>
Enassembleurx86sousDOS
EnshellUnix
EnBasicoriginel
EnCOBOL
EnlangageC
EnlangageC++
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
15

int main()
{
std::cout < "Hello world!" < std::endl;
return 0;
}
<?php
print ("Hello world!");
?>
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Sub Main()
MsgBox("Hello world!")
End Sub
program Bonjour;
begin
WriteLn(Hello world!);
end.
2.Classificationsdeslangages
Queremarquezvous?Ilyaautantdesyntaxesdiffrentesquilexistedelangages.Cependantvousconstatezque
leslangagesC,C++,JavaouPHPontdenombreusesressemblances,alorsquelassembleurouleCOBOLsemblent
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
EnPHP
EnJava
EnVisualBasic
EnPascal
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
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:
G gnralisteouspcialis
G objetouprocdural
G typounontyp(cfchapitresurlesvariables)
G interprtoucompil
G 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
langageestditcompilquandleprogrammesourcesousformedetexteesttoutdabordluettraitparunautre
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).
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
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.Parmileslangagesquipourraientconvenir,ilyaC#(prononcerCSharp)etJava.Lepremier,issudela
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?
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
19
G Ilestgratuit.
G Ilestdisponiblepourbeaucoupdemachinesetdematriels.
G ToutprogrammeJavafonctionnerasurtouteslesmachinesvirtuelles,sansmodification.Ilestindpendantde
laplateforme.
G IlexistedenombreuxditeursetIDE(IntegratedDevelopmentEnvironment)supportantoutantspcialiss
pourJava.
G Ilestutilispardesmillionsdepersonnes.
G Il est rput sr, ne pouvant thoriquement pas accder au systme dexploitation ou la machine elle
mmesansautorisationexplicite.
G Il dispose dune immense collection de bibliothques, rpondant presque tous les besoins. Il est mme
possibledeprogrammerdesjeuxen3Ddetypecommercial.
G Il est lun des piliers du web grce aux fameuses applets, aux servlets mais permet la programmation
dapplicationstrscompltes.
G 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.
G IlestdrivdulangageC++,sanssescomplications.UnprogrammeurCetC++peutfacilementcomprendre
Java,demmequunprogrammeurJavapourraapprendreplusfacilementleC++.
G Ilestobjet,notionquiserasommairementtudieenfindouvrage.
G Il peut fonctionner tant en mode texte (depuis une console MSDOS ou un shell MacOS/Unix) quen mode
graphique.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
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.
G 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.
G 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.
G 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.
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2E+dzIgLAA==-enidentnumber
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.
Unevariableestunnomoutiquettedonnunevaleur(nombre,texte,etc).Cettevaleurpeutvarieraucours
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:
G a
G var
G titre
G Total
G 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,quelqueslangageslepermettent.Directement,vouspouvezapprendrelassembleur(maisvousdevreztre
trscourageuxetpatient),sinondeslangagescommeleCouleC++permettentlamanipulationviades"pointeurs":
ce sont des tiquettes qui sont accoles ladresse de la case mmoire, contrairement aux noms des variables
classiques qui sont associes la valeur que la case contient. Comme en rgle gnrale le nom dune variable
reprsentetantladressequelavaleur(lavaleuratelleadressemmoire),cestsourcedebeaucoupdamusement(!)
pourleprogrammeur...
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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(2
8
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
23
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:
G Lesentiers:nombressansvirgule,ngatifsoupositifs
G 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:
G Lerel32bits(float)voitsadfinitionforce:lecompilateurindiqueuneerreursignifiantunrisquedeperte
deprcisionautrement.Ilestaussipossibledajouterun"D"lafinpourforcerundoubleouun"F"pourun
float,carJavaconsidrelesvaleursrellessaisiescommetantdutypedoublepardfaut.
Typenumrique Plagedevaleurspossibles
Byte(char) 0255
Entiersimplesign(int) 3276832767
Entiersimplenonsign 065535
Entierlongsign(long) 21474836482147483647
Entierlongnonsign 04294967295
Relsimpleprcision(float)
Ngatif:3,40x10
38
1,40x10
45

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

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

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

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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
24
G Javaconsidrelesvaleursentiressaisiescommetant32bitspardfaut.Pourunentiersur64bits,ilfaut
rajouterun"L"lafin,quisignifiequecettevaleurestunentierlong.
G 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
assezsimplemettreenuvre.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:
G soitnemettrequunchiffreparoctetetcomplterlerestequepardes1oudes0,"EBCDIC"
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
25
Quelleplaceoccupeunechanedecaractre?Enprincipe,uncaractreoccupeunoctet.chaquevaleurcomprise
entre 0 et 255 est associ un caractre. Cest le principe de lASCII "American Standard Code for Information
Interchange", norme de codage des caractres la plus connue et la plus utilise. La table ASCII, invente par les
amricains, contient 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:
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.
Pourreprsenterlesvaleursvraietfaux,ilsuffitdedeuxchiffres,0et1.Combienfautildeplacepourstockerces
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:
G TRUEpourvrai
G FALSEpourfaux
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.
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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
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
Dansleprogramme
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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.
Vousavezledroitdedonnerunevaleurinitialeoupardfautunevariablelorsdesadclaration.Danscecasvous
devezutiliserloprateurdaffectationlorsdeladclaration.
Dansladclaration
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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);
}
}
Note:onnepeutpasaffecterdevariableuneautrevariablelorsdesadclaration.
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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");
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30+dzIgLAA==-enidentnumber
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:
G +:addition
G :soustraction
G * ou x:multiplication(ilestplusfaciledcrireunxpourfoisquunetoile)
G /:division
G %oumod:modulo
G DIV:Ladivisionentire
Rappel:unmoduloestlerestedunedivisionentire.Parexemple15/2vaut7,maisilreste1.Onditque15
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) {
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
33
Pourrsoudreunetellequation,ilfautcalculerun"discriminant"souslaforme
=b-4ac
Suivantlavaleurdudiscriminant,lesrsultatsvarient:
G si>0,ilyadeuxsolutions
G si=0,ilnyaquuneseulesolution
G si<0,lquationnapasdesolution.
Pourlexemple, lalgorithmepartduprincipequelquationestvolontairementposecommeayantdeuxsolutions.Il
sera complt dans le prochain chapitre consacr aux tests. Les rsultats dune quation du second degr sont
appelslesracines.Pourlescalculer,ilfaututiliserlesoprationssuivantes:
et

Pourlaracinecarre,vousutiliserezdanslalgorithmelasyntaxe"racine(x)"oracineestunefonctionmathmatique
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:
G ++xincrmentede1lavariablex
G x++idemmaisaprslutilisationencours
G xdcrmentede1lavariablex
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
34
G xidemmaisaprslutilisationencours
Cettecriturepeutsurprendre.Voiciunexemple:
PROGRAMME UNAIRE
VAR
a:entier
DEBUT
a1
Ecrire ++a
Ecrire a++
Ecrire a
FIN
G Lepremieraffichageindique2,lavariableaestincrmenteavantsonutilisation.
G Ledeuximeindique2aussi,lavariableaestincrmenteaprssonutilisation.
G Ledernierindique3.
Note:lesoprateurs+etpeuventaussitreutilisscommeoprateursunaires:placsavantunscalaireou
unevariable,lesigne""donneralopposdecettevaleur(1estgal1).
3.Lesoprateursboolens
Lesoprateursnepermettentpasquedefairedescalculs.Dansuneexpression,unoprateurpeutaussieffectuer
desvaluationsdeboolens.Vousavezvuquepourlordinateurtoutcequiestvraiestdiffrentde0,cequiestfaux
valant0.Commentalorsfairesideuxexpressionssontlunevraie,lautrefausse,pourconnatrelavaleurdesdeux
conjugues ? Il faut utiliser des oprateurs boolens pour indiquer ce qui doit tre considr comme vrai : lun ou
lautre,lesdeuxenmmetemps,etc.
G Loprateur ET indique que les deux expressions situes avant et aprs doivent tre toutes les deux vraies
pourquelensemblelesoitaussi.
G Loprateur OU indique que seule lune des deux expressions, que ce soit celle situe avant ou celle situe
aprs,doittrevraiepourquelexpressioncompltesoitvraieaussi.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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:
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
36
TabledevritOU
DanslecasduOU,aumoinslunedesdeuxexpressionsdoittrevraiepourquelensemblesoitvrai.Seuleuneseule
assertionestdoncfausse,danslecasolesdeuxexpressionssontfaussestouteslesdeux.
NON:
TabledevritNON
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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
Notezquelalgorithme cidessusnevrifiepassiavaut1etbvaut2.Ileffectueloprationlogique"aETb".
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.
Leslangagesragissentdiffremmentselonlescomparaisonsetlestypesdesdonnescompares.Lencore,
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,cestuneaffectation.Dansuneexpressionconditionnelle,cestunecomparaison.Durdesy
retrouver ! Cest pour a que certains langages comme C, C++, Java ou encore PHP utilisent loprateur dgalit
"==",deuxfoisgal,pournepasleconfondreavecloprateurdaffectation"=".Dansceslangages:
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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:
G <:infrieur
G ou<=:infrieurougal
G >:suprieur
G ou>=:suprieurougal
La comprhension de ces quatre oprateurs ne doit pas poser de problme. Le rsultat est vrai si la valeur de
gaucheestinfrieure,infrieureougale,suprieure,suprieureougalelavaleurdedroite.
PROGRAMME INFSUP
VAR
a,b,c:entier
DEBUT
a10
b10
c20
Afficher a<c
Afficher a<=b
Afficher c>b
Afficher c>=c

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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50+dzIgLAA==-enidentnumber
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,2x10
0
.

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

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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0+5wL8E+dzIgLAA==-enidentnumber
41
Envritablenotationscientifique,oncrit1,82195E2soit1,82195x10
2
.
Cestleprincipedelanotationscientifiquequilvafalloirretenirmaisenbinaire,pasendcimal.Lemicroprocesseurne
manipulepasdepuissancesde10,maisde2.Aussiilfauttrouver,selonlemmeprincipe,unmoyendetransformer
toutcecienbinaire.Danslapartieavantlavirgule,cesontdespuissancesde2positives(2
0
, 2
1
,2
2
,etc).Aprsla
virgule,ilfautpasserenpuissancesde2ngatives(2
1
,2
2
,2
3
,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/2
1
,2
2
=1/2
2
,etc.

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


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

9
+2
10
...)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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0+5wL8E+dzIgLAA==-enidentnumber
42
Dansunnombrerelensimpleprcisionsur32bits,unbitestrservpourlesigne,8pourlexposantet23pourla
mantisse,danscetordre,lebitdepoidsforttantlesigne.Lexposant doit subir un dcalage de 2
n1
1,ntantle
nombredebitsutiliss.Ledcalageestdoncde127.Enfin,ilnefautpasconserverle1delamantisse:ilestimplicite.
Signe S:0
Exposant E: 7+127=134
( 1 0 )
, soit 10000111
( 2 )

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

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

Lecodagedunrelsur32bitsamnedeuxremarques:
G La taille de la mantisse limite la prcision pour des nombres de grande valeur, car plus le nombre avant la
virguleoccupedelaplace,pluslataillerestantedanslamantisseestrduitepourleschiffresaprslavirgule.
Cetteremarqueestaussidansunemoindremesurevalablepourunrelcodsur64bits.
G Laprcisionpeutservlerinsuffisantepourcertainesapplications.SivousenvoyezunefusesurJupiteren
calculantlatrajectoireensimpleprcisionpourchaquelmentdecalculintervenant,lafuserisquecette
chelledenepasarriveraubonendroitcausedessommesdimprcisions...
Leprincipedurelendoubleprcisionestexactementlemme,saufquelestaillesdelexposantetdelamantisse
sont agrandies. Lexposant fait 11 bits, la mantisse 52 bits. Si vous reprenez les calculs mais cette fois en double
prcision,vousarrivezuntotalde182,194999992847442626953125avecunarrondi2
24
!

Unexempleconcretetsimpledeserreursdarrondipeuttretoutfaitmisenvidenceavecunesimplecalculatrice
trs bas prix, ne seraitce quen divisant 1 par 3. Obtenezvous 1,333333 ou 1,333334 ? En rutilisant cette mme
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
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0+5wL8E+dzIgLAA==-enidentnumber
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 dunterminal.Lescaractresde031vontcontenirdeschosescommelesretour
chariot,lepassagelaligne,latabulation,etc.Lecaractre32estlespace,le127lecaractredesuppression.Le"A"
enmajusculedmarre65,enminuscule97,leschiffresenpartantde048.Leresteestlaponctuation,divers
signescommelessymbolesmontaires,lesoprateursetcomparateursarithmtiques,etainsidesuite.Typiquement,
lachane"HelloWorld!"estreprsenteainsi.
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:
G Lesfichierstextesetlesnomsdefichierscritsdansdautreslanguesquelanglaisneserontpasinterprts
correctementsurlessystmesnutilisantpaslammepagedecode.Typiquement,sivousutilisezunepagede
codenorvgiennesurdesfichiersenfranais,vousobtiendrezdescaractressurprenants.
G 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
CodeASCII 72 101 108 108 111 32 87 111 114 108 100 33
Caractre H e l l o W o r l d !
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0+5wL8E+dzIgLAA==-enidentnumber
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.
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0+5wL8E+dzIgLAA==-enidentnumber
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
encoreenPHP,nonplus:ceslangagesdisposentdemcanismesappels"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:
G Lagestiondelammoiredemaniredynamiquencessiteuneconnaissanceavancedelatailledesvariables
utilises,delaquantitdemmoirencessaireetdelammoirephysiquedelamachine.
G Laccs la mmoire passe par lutilisation de variables particulires appeles pointeurs car elles ne
reprsentent pas une valeur mais ladresse dune case. Une fois matrises, cellesci se rvlent tre trs
puissantesetpratiques.
G Lallocation dynamique permet dutiliser uniquement la quantit de mmoire ncessaire un instant donn.
Cestcertesinsignifiantpourquelquesoctets,maissilsagitdemanipulerdegrossesimagesoudesfilms,a
compte.
G La mmoire inutilise peut tre libre ds quellenest plus ncessaire. Avec les mthodes dites statiques,
ellelestuniquementlafinduprogramme(oudunblocdinstructions).
G 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.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0NVqx9E+dzIgLAA==-enidentnumber
46
Lestestsetconditions
1.Principe
Dansleprcdentchapitrevousavezpuvousfamiliariseraveclesexpressionsmettantenplacedesoprateurs,quils
soient de calcul, de comparaison (lgalit)ouboolens.Cesoprateursetexpressionstrouventtoutleursensune
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:
G unepremirevaleur:variableouscalaire
G unoprateurdecomparaison
G unesecondevaleur:variableouscalaire.
Lesoprateursdecomparaisonsont:
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
47
G Lgalit:=
G Ladiffrence:!=ou<>
G Infrieur:<
G Infrieurougal:<=
G Suprieur:>
G 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.
Note:loprateurdaffectationpeutaussitreutilisdansunecondition.Danscecassivousaffectez0une
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:
G Lexpression115estvalue:elleestvraie.
G 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.
G Lersultatestpouvantable:laconditionestvrifieetlecodecorrespondantvatreexcut!
Vousdevezdoncproscrirecetteformedexpression.Voicicellesquiconviennentdanscecas:
nombre>=1 ET nombre<=10
Ouencore
1<=nombre ET nombre<=10
3.TestsSI
a.Formesimple
Ilnya,enalgorithmique,quuneseuleinstructiondetest:"Si",quiprendcependantdeuxformes:unesimpleet
unecomplexe.LetestSIpermetdexcuterducodesilacondition(laoulesexpressionsquilacomposent)estvraie.
Laformesimpleestlasuivante:
Si boolen Alors
Bloc dinstructions
FinSi
Noteziciqueleboolenestlacondition.Commeindiquprcdemment,laconditionpeutaussitrereprsentepar
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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". Lexemplesuivantmontrecommentobtenirlavaleurabsolue
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:
G Sidansuneformecomplexe,lundesdeuxblocsdinstructionsestvide,alorstransformezlaenformesimple:
modifiezlaconditionenconsquence.
G 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
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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:
G Lasaisiencessitelamiseenplacedemcanismescomplexes:beaucoupdelignespourpasgrandchose.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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;

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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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:
G Si=0,ilnyaquuneseulesolutionquivaut:

G Si<0,lquationnapasdesolution.
PROGRAMME EQUATION2
VAR
a,b,c,delta,x1,x2:rels
DEBUT
a3
b6
c-10
delta( b * b ) - ( 4 * a * c )
Si delta>0 Alors
x1( -b + racine(delta) ) / ( 2 * a )
x2( -b - racine(delta) ) / ( 2 * a )
Afficher "Les deux solutions sont x1=",x1, "x2=",x2
SinonSi delta=0 Alors
x1 -b / (2 * a)
Afficher "Lunique solution est :",x1
Sinon
Afficher "Lquation na pas de solution"
FinSi
FIN
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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"
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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:
G Ladateestdcomposedanstroisvariablesanne,moisetjour.
G Ilfautgrer:
G leschangementsdemois
G lenombredejoursdanslemois
G lechangementdanne
G lesannesbissextilespourlemoisdefvrier.
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
54
Pourinformation,uneanneestbissextilesiellevrifieintgralementdeuxrgles:
G lesannesdivisiblespar4,et,
G 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
er
mars.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
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
57
FinSi
FinSi
FinSi
Si erreur=1 Alors
Ecrire "Date incorrecte"
Sinon
Ecrire "Date correcte"
FinSI
Fin
c.Lheuredansnsecondes
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).
G Dansunpremiertemps,additionnezlessecondes:147+12=159
G Ensuite, convertissez ces secondes en minutes. Pour cela il suffit de diviser par 60 pour rcuprer les
minutes, puis de rcuprer le reste de la division entire (le modulo) pour les secondes en trop (159/60
donne2minutesavecunrestede39secondes.Voussavezmaintenantquelafinestde39secondes.
G Additionnez les minutes : 58+2=60. Si le chiffre est suprieur ou gal 60, procdez comme pour les
secondes.60/60=1,soituneheuresupplmentaire,etunrestede0donc0minute.Voussavezmaintenant
quelemilieuest0minute.
G 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;
Lesimpleestilmeilleur?
- 12 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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);


}
}
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
Lestestspouroptimiser
- 13 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOI/E+dzIgLAA==-enidentnumber
60
Lalgbreboolen
1.Loriginedestests
Lestestseffectustantenalgorithmiquequenprogrammationsontdestestslogiques,oupluttfaisantappellalogique.Lechapitre
Lesvariablesetoprateursadjbrivementabordcepointlorsquilatquestiondesoprateursboolens.Lesoprateursdits
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
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:
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
FAUX(nappellepas) FAUX(nedcrochepas) FAUX(pasdecomm.)
FAUX(nappellepas) VRAI(dcroche) FAUX(pasdecomm.)
VRAI(appelle) FAUX(nedcrochepas) FAUX(pasdecomm.)
VRAI(appelle) VRAI(dcroche) VRAI(communication!)
Emetteur Rcepteur Communication
0 0 0
0 1 0
1 0 0
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
62
Ilyadesfoisoilyavidemmentplusdedeuxvariableslogiques.Prenezlexemplesuivant.Quanddcrochezvousvotretlphone?
Quandilsonne?Quandvousvoulezappelerquelquun?Silsonne,voulezvousvraimentrpondre(sivousavezlaffichagedunomou
dunumrodelappelant,vousvoudrezpeuttrefiltrervosappels)?
Quelspostulatsposezvous?Vousdcrochezsi:
G LetlphonesonneETvousvoulezrpondre,
G 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:
G "."(lepoint):a.b
G "":ab
G "&","&&"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...
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:
G "+"(signeplus):a+b
G "":ab
1 1 1
LoiET
a\b 0 1
0 0 0
1 0 1
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
63
G "|","||","OR"selonleslangagesdeprogrammation.
Lasuiteutiliseralapremirenotationaveclesigne+.LaloiOUestsouventassocieavecladdition,cequiservletotalement
faux.Eneffet,1+1(additionbinaire)vaut0avecuneretenuede1.Or,1+1estVRAI,donc1Attentionaudanger!
LaloiOUpeuttredcritesousformedetable.
e.Lecontraire
Lecontraire,appelaussingationsedfinitainsi:
LecontrairedeaestVRAIseulementsiaestFAUX.
VousavezdjrencontrlecontraireavecloprateurNON.Lecontraireestnotcommececi:
G nona
G
G a
G "!","NOT","~"selonleslangagesdeprogrammation.
Ainsiilsuffitderetenirque1=0etque0=1.Parlasuite,cesontlesformesouquiserontutilises,selonlecas(ex:pour
nonnona).
f.Lesproprits
Elleestidentiquelalgbreclassique.Danscertainscas,lesparenthsessontinutiles.Ainsi:
a+(b+c)=(a+b)+c=a+b+c
Etencore:
a.(b.c)=(a.b).c=a.b.c
Elleindiquequelordredesvariableslogiquesnaaucuneimportance:
a+b=b+a
Etencore:
a.b=b.a
Attention,cettefoisilyaunediffrenceimportanteparrapportlalgbreclassiqueetladistributionlieauxoprateurs+et*.Cest
laraisonpourlaquelleilatexpliququilnefallaitpaslesconfondreaveclessymboleslogiques.Eneffet,si:
a.(b+c)=(a.b)+(a.c)
estidentique,
a+(b.c)=(a+b).(a+c)
nelestpasdutout,maisestparfaitementcorrectenalgbredeBoole.
Lidempotence signifie que si on applique la mme opration une ou plusieurs fois alors on retrouve toujours le 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
LoiOU
a\b 0 1
0 0 1
1 1 1
Lassociativit
Lacommutativit
Ladistributivit
Lidempotence
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
64
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.
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=?
G LeETestprioritaire,oncommenceparb.c:1.1=1
G PuisonpasseauOU:0+1=1
G Onobtientdonca+b.c=VRAI
Exemple2:
a.b+c=?
G LeETestprioritaire,oncommencepara.b:0.1=0
G PuisonpasseauOU:0+1=1
G Onobtientdonca.b+c=1,VRAI
Commetoutalgbre,celuideBooledisposeaussidesesthormes.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:
Prenezmaintenantcettesecondetabledevrit:
Comparezlesdernirescolonnesetvousobtenezlgalitsuivante:
(a+b)=a.b
Lacomplmentarit
Lapriorit
LethormedeDeMorgan
a b a+b (a+b)
0 0 0 1
0 1 1 0
1 0 1 0
1 1 1 0
a b a b a.b
0 0 1 1 1
0 1 1 0 0
1 0 0 1 0
1 1 0 0 0
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
65
Danslesdeuxcas,lersultatseraVRAIuniquementsiaETbsontFAUX.
Delammemanire,avecunetabledevritpluscomplte:
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.
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:
G (a+b).(a+b)(lederniertermeprovientduthormedeDeMorgan)
G a.a+a.b+b.a+b.b
G a.aetb.bvalenttoujours0(FAUX),onlessupprime,ilreste
G a.b+a.b
Voicisatabledevrit:
LeOUexclusifestnotXOR(leXpoureXclusif).Vouslerencontrezsouscesnotations:
G "":diffrentde,eneffetXORestparfaitementquivalent
G "":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.
Lquivalenceportetrsbiensonnom.NoteEQV,ellesignifiequeaEQVbestVRAIsietseulementsiaetbontlammevaleur.En
algbredeBoole:
NON(aOUb)OU(aETb)soit(a+b)+(a.b)
a b a.b (a.b) a b a+b
0 0 0 1 1 1 1
0 1 0 1 1 0 1
1 0 0 1 0 1 1
1 1 0 0 0 0 0
LeOUexclusifXOR
a b ab
0 0 0
0 1 1
1 0 1
1 1 0
LquivalenceEQV
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
66
Siondveloppeonobtient:
G (a+b)+(a.b)(lepremiertermeprovientduthormedeDeMorgan)
G (a+a).(a+b).(b.a).(b+b)
G (a+a)et(b+b)valenttoujours1(VRAI),onlessupprime,ilreste
G (a+b).(b+a)
VoicilatabledevritdeEQV:
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.
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
Linhibitionestlecontrairedelimplication,ellesenoteaINHb.
aINHb=a.b
h.Avecplusdedeuxvariables
Riennempche,etbienaucontraire,dutiliserplusdedeuxvariableslogiquesdansdesexpressionsdelalgbredeBoole.Reprenez
lexempledeltablissementdelacommunicationtlphonique.Elledisposedetroisvariables:
a b ab
0 0 1
0 1 0
1 0 0
1 1 1
Limplicationetlinhibition
a b ab
0 0 1
0 1 1
1 0 0
1 1 1
A b Ab
0 0 0
0 1 0
1 0 1
1 1 0
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
67
G sonner,quiseraappelea,
G rpondre,quiseraappelebet
G appeler,quiseraappelec.
Lersultat(dcrocher)serad,maisnintervientpasdanslescalculs.Quelleestlatablecorrespondante?Attentionilyaunpige.
VRAIestreprsentpar1,FAUXpar0.
Avezvoustrouvlepige?asonne,onnapasenviederpondre,maisonveutappeler(pourappeler).Danscecasvousnallez
pasdcrocher:vousattendrezqueletlphonearrtedesonner,orcidessusvouslefaitesquandmme.Donclatablecidessus
nestpascorrecte.Uneligneestfausse.Voicilabonnetable:
Ladifficultconsistemaintenanttrouvercomment,depuiscettetabledevrit,dfiniruneexpressionboolennequiretourneVRAI.
Vousconstatezqueseulesquatrelignesdelatabledevritsontvraies,cestdirequelapersonnevavraimentdcrocher.
Lersultatest1quanda,betcvalent:
G 0,0,1
G 0,1,1
G 1,1,0
G 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
a(sonner) b(rpondre) c(appeler) d(dcrocher)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
a(sonner) b(rpondre) c(appeler) d(dcrocher)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1
Trouverlexpressionminimale
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
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.
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
Applicationdanslalgorithme
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA==-enidentnumber
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:
G 3*1=3
G 2*2=6
G 3*3=9
G
G 3*9=27
G 3*10=30
Vous allez donc multiplier 3 successivement par les nombres de 1 10. En algorithmique, vous connaissez les
variables.Commentaffecterunevaleurde110successivementunevariable?Avecuneboucle!
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:
G Il existe plusieurs types de boucles : certaines ont un nombre fixe ditrations, dautres dpendent de
conditionsdesortiequevousaurezdfinir.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0dbo8DFCdzIgLAA==-enidentnumber
71
G Il est possible dimbriquer plusieurs niveaux de boucles : vous pouvez faire des boucles dans des boucles,
autantdefoisquevouslevoulez.
G Il existe une quantit infinie dutilisation des boucles qui en font une structure incontournable en
programmationpourlamoindredesapplicationsuntantsoitpeucomplexe.
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0dbo8DFCdzIgLAA==-enidentnumber
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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++;
}
}
}
En algorithmique il est toujours possible de trouver une expression boolenne, mme si elle est longue et
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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:
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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:
G Premireboucle,tabledes1.Secondeboucle:excutionde1*1,1*2,1*31*10
G Premireboucle,tabledes2.Secondeboucle:excutionde2*1,2*2,2*32*10
G Premireboucle,tabledes3.Secondeboucle:excutionde3*1,3*2,3*33*10
G
G Premireboucle,tabledes10.Secondeboucle:excutionde10*1,10*2,10*3
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
80
G Uncompteurdunombredenotes.
G Lanoteminimale.
G Lanotemaximale.
G Lasommedetouteslesnotes.
G 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;
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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:
G 3billetsde500euros
G 1billetde200euros
G 1billetde100euros
G 1billetde50euros
G 2billetsde20euros
G 1billetde5euros
G 1picede2euros
G 1picede1euro
G 1picede50centimes
G 1picede10centimes
- 10 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
82
G 1picede5centimes
G 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
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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
dailleursquecertainespartiestotalementvidentesonttremplacespardes"".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=A
3
+B
3
+C
3
, 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
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++;
}
}
}
- 13 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA==-enidentnumber
85
RpterJusqu
1.Diffrencesfondamentales
Malgrlabondancedexemplesvusjusquprsent,lastructureitrative"TantQue"nestpaslaseule.Mmesilest
possibledetoutprogrammeraveccetypedeboucle,ilenmanqueencoredeux,dontlastructure"RpterJusqu".
Sonpseudocodeestlesuivant:
Rpter
Bloc dinstructions
Jusqu boolen
Le"Rpter"ressemblefortementau"Tantque"aveccependantdeuximportantesdiffrences:
G Quoiquilarrive,ilyauratoujoursaumoinsunpassagedanslaboucle:leblocdinstructionsseraexcutau
moinsunefois,
G 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;

- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0G+SeGVCdzIgLAA==-enidentnumber
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
gale20poursortirdelasaisie.Avecle"Tantque",labouclecontinuaittantquelanotetaitinfrieure 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0G+SeGVCdzIgLAA==-enidentnumber
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);
}
}
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0G+SeGVCdzIgLAA==-enidentnumber
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.
Ilnexisteaucuncasolastructure"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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
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.
Ne modifiez jamais un compteur de boucle "Pour" au sein de celleci. Si cela savre vraiment ncessaire,
modifiezvotrebouclepourutiliserunestructure"TantQue"ou"Rpter".
5.Quelquesexemples
a.Denouveautroisboucles
Promisdevenirungrandclassique,puisquecestlatroisimefoisquevouslevoyezsoustroisformesdiffrentes
donc,voicilexempledestroisboucles,preuvesilenestquele"PourFinPour"estbienpratiquemaistotalement
optionnel.Lintrtestvidemmenticideproduireuncodeplussuccinctetencorepluslisible.
Variables a,b,c,nb1,nb2 en Numrique
Dbut
Pour a de 1 10 Faire
Pour b de 1 10 Faire
Pour c de 1 10 Faire
nb1a*100+b*10+c
nb2a+b+c
Si nb1=nb2 Alors
Ecrire nb1,a,b,c
FinSI
Fin Pour
Fin Pour
Fin Pour
Fin
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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
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:
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
91
FormuledeHrondAlexandrie
Lasuitefinalepermetdecalculerlaracinecarreenfonctiondunevaleurinitialearbitrairex
0
.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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
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
me
sicle, a rsolu un
problmeconnudelonguedate:ladterminationdelasommedesinversesdescarrsdentier.Laformuleestla
suivante:

Remarquezlaprsenceduneitrationsurlespuissancesdechaquednominateur(diviseur).Voiciuneapplicationde
laboucle"Pour".Demme,remarquezquePIestlevaucarr.Ilfaudradoncquevouseffectuiezuneracinecarre
lafinpourobtenirlebonrsultat.Donc:
G Effectuerndivisionssuccessivesde1/n.
G Multipliercersultatpar6.
G ExtrairelaracinecarredecersultatpourobtenirPI.
Variables i,x,a,cpt en Numrique
Dbut
cpt100000
a2
Pour i de 2 cpt Faire
aa+1/(i*i)
Fin Pour
aa*6
x1
Tant Que (x*x)<a Faire
xx+1
Fin Tant Que
Si (x*x) !=a Alors
xx-1
cpt10
Pour i de 1 cpt Faire
x0.5*(x+a/x)
Fin Pour
FinSi
Ecrire "La valeur de PI est ",x
Fin
Question:Combienfautilditrationspourobtenirseptchiffrescorrectsaprslavirgule?VoicileprogrammeJava
correspondant,quidevraitvousfournirunepetiteide:
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA==-enidentnumber
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
Un tableau nest pas un type de donnes, mais une liste dlments dun type donn. On parlera dun tableau de n
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.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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:
G Silanumrotationcommence1,lesindicesvontdevaleur[1]valeur[10].
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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:
G Fixerunnombredlmentssuffisammentgrandlavancepourtresrquearentre.
G 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
Vous ne pouvez pas redimensionner un tableau dj correctement dimensionn, tout comme il est impossible de
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.
Indiqueztoutdabordletype,puislenom,commepourunevariable,suividescrochets.CettepremirenotationestissueduC
etduC++,etestsouventutiliseparlesprogrammeursissusdeceslangages:
int tab[];
Unedimension
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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.
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]);
Rfrencesdetableaux
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
98
}
}
Laffectation par rfrence peut tre la source de nombreux dysfonctionnements imprvus voire plantages. Pour recopier un
tableaudansunautre,vousavezdeuxpossibilits:
G Copierviaunebouclechaquelmentdutableaudanslautre.
G 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]);
}
}
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:
Tableauxndimensions
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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:
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:
La premire ligne reprsente ladresse de la case mmoire associe aux diffrents indices du tableau. Cette valeur est bien
entenduentirementarbitraireetestconnuedulangagemettantenuvreletableau.
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:
Case 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 15 17 8 13 10 6 9 13 14 11
Adr 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
Ind 1,1 1,2 1,3 1,4 1,5 2,1 2,2 2,3 2,4 2,5 3,1 3,2 3,3 3,4 3,5
Val 10 7 14 8 12 11 5 12 13 18 20 2 0 17 16
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
100
G mlapositionconnuedupremierlment,
G xlindicedelapremiredimensionmoins1,
G ylindicedelasecondedimensionmoins1,
G Mylataillemaximaledelapremiredimension.
Lapositionpenmmoireest:
p=m+(x*My)+y
Prenez,daprsletableaucidessus,llmentdindice3,4:xvaut2,yvaut3,Mxvaut5etmvaut143.
p=143+(2*5)+3=156
Soitunnouveautableaunote2[1..2][1..2][1..3],ilpourraittrereprsentainsi:
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:
Sachant quon ne connat pas forcment lavance la longueur dune chane de caractres, celleci se termine souvent, et
suivantleslangages,paruncaractrenul.Aussienmmoire,vousobtiendrezceci:
Cettebrvetudemetenvidencedeuxproblmes:
G Dansuntableauuneseuledimension,ilnestpasvidentdereprsenterlesindicesdeschanesdecaractres.Une
astucepourraitconsisterrechercherlescaractresnuls(0)pourretrouverlesindicessuivants(lecaractresuivant
estlepremierdelachanedindice+1).Mais:
G 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
Adr 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523
Ind 1,1,1 1,1,2 1,1,3 1,2,1 1,2,2 1,2,3 2,1,1 2,1,2 2,1,3 2,2,1 2,2,2 2,2,3
Val 10 12 14 10 15 9 8 13 7 5 14 20
Lettre B o n j o u r
ASCII 66 111 110 106 111 117 114
Adresse 1616 1617 1618 1619 1620 1621 1622 1623
Contenu 66 111 110 106 111 117 114 0
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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:
Notezdeuxchoses:
G 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.
G Ilsepeutqueleschanesnesesuiventpasenmmoiresiaumomentdelescrirededansilnexistepasassezde
positionslibrescontigusdisponibles.Aussilesadressesdonnesdanscetableaupeuventtretotalementdcales
parrapportlaralit.
Letableaudechanedecaractrescontiendraitdonclesrfrencesdesadressesmmoiresosontrellementstockesles
chanesdecaractres:
Unastucieuxtourdepassepassequipermetdenombreuseschoses!
Adresses 2007>2009 2010>2012 2013>2017 2018>2021 2022>2026
Contenu Il Ne Fait Pas Beau
Indice 0 1 2 3 4
Rfrence 2007 2010 2013 2018 2022
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/2b4J VCdzIgLAA==-enidentnumber
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++;
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA==-enidentnumber
104
G Letableaudisposededeuxdimensions,3x3.
G Ilfautauseindunebouclepermuterlesjoueurs.
G Siunepositionestdjoccupe,ilfautdenouveauposerlaquestion.
G Aprschaquecoup,ilfautvrifiertoutesleslignes,colonnesetdiagonales.
G Siuneligne,colonne,diagonaleestcomplte,onsortdelaboucle.
G Encasdevictoire,ilfautindiquerquelpion(x,o)agagn.
G Ilfautgrerlematchnul:neuftoursetpersonnenagagn.
Leprogrammequisuitnestpasoptimis,demaniretoutfaitvolontaire,afindeforcerlamanipulationdesindices
detableauxdeuxdimensions:
PROGRAMME MORPION
VAR
p:tableau[1..3][1...3] de caractres
i,j,x,y,nbtours:entiers
pion :caractre
gagne:boolen
DEBUT
/* Initialisation du plateau : que des blancs */
Pour i allant de 1 3 Faire
Pour j allant de 1 3 Faire
p[i][j]" "
FinPour
FinPour

gagneFAUX
nbtour0
/* Boucle de jeu */
Rpter

/* Changement du pion (joueur) */


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

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

/* Saisie des coordonnes */


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

/* Mise en place du pion */


p[x][y] pion

/* 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
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA==-enidentnumber
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.");
}
}
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA==-enidentnumber
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:
Il existe plusieurs mthodes permettant de trier ces diffrentes valeurs. Elles ont toutes leurs qualits et leurs
dfauts. Ainsi une mthode sera lente, lautre sera plus gourmande en mmoire, et ainsi de suite. Cest leur
complexitquidtermineleurusagenotammentpourdegrandesplagesdevaleurs.
Danslesalgorithmessuivants,lavariableCptcontientlenombredlmentsdutableauinitialett[]estletableau.
Ilestintressantdeprendreencomptelacomplexitdecesdiversalgorithmes,bienquecettenotion,prsenteau
premierchapitre,nesoitgnralementpas(oupeu)abordedanslespremiresannesdtudes 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:
G Lajoutdunsecondtableaudoublelammoirencessaire.
G Larecherchedupluspetitlmentestpluscompliquequonnelepensecarchaquepassage,ilnefautpas
reprendreceuxdjsortis,etcestcompliqu.
G Le nombre de boucles et de recherches est important. La complexit de lalgorithme rsultant aussi,
suprieureauxautres.
G 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:
G tape1:lapluspetitevaleurest9,onpermute9et48.
G tape2:lapluspetitevaleursuivanteest17,djlabonneposition,onpasselasuivante.
48 17 25 9 34
9 17 25 48 34
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
108
G tape3:lapluspetitevaleursuivanteest25,djlabonneposition,onpasselasuivante.
G tape4:lapluspetitevaleursuivanteest34,onpermute34et48.Letableauesttri.
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();
}
}
}
9 17 25 48 34
9 17 25 48 34
9 17 25 48 34
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
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:
G tape1:48estsuprieur17,onpermute.
G tape2:48estsuprieur25,onpermute.
G tape3:48estsuprieur9,onpermute.
G tape4:48estsuprieur34,onpermute.
lissuedecepremierpassage,vousremarquezquelavaleurlaplusleveestdjendernireplacedutableau
mais que le tableau nest pas entirement tri. Aussi il faut effectuer plusieurs passages en vrifiant chaque
passage si des permutations ont eu lieu. Quand une permutation au moins a eu lieu lors dun passage, il faut en
relanceruneautre.Ainsiilfautmettreenplaceundrapeau(flag)indiquantsiunepermutationaeulieuounon.Voici
lesrsultatsaprslespassagessuccessifs:
G Passe1:
G Passe2:
G Passe3:
Lastructureglobaledelalgorithmeestdonc:
PROGRAMME TRIBULLE
VAR
Permut :boolen
temp,Cpt,i:entiers
t:tableau[1..5] dentiers
DEBUT
Cpt5
Permutvrai
TantQue Permut Faire
PermutFaux
17 48 25 9 34
17 25 48 9 34
17 25 9 48 34
17 25 9 34 48
17 25 9 34 48
17 9 25 34 48
9 17 25 34 48
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
111
}
}
}
e.Letriparinsertion
Letriparinsertionconsisteslectionnerunlmentdutableauetlinsrerdirectementlabonnepositiondansla
partiedutableaudjtrie.Onprocdeentroistapes:
G Onplacellmenttrierdansunevariabletemporaire.
G Tantqueleslmentsdutableauquiprcdentllmenttrierluisontsuprieurs,ondcaleceslments
dunepositionenrcuprantlespacevidelaissparllmenttrier.
G Oninsreensuitelavariabletemporairelanouvellepositionlaissevacanteparledcalage.
Voicilesdiffrentestapespourletableauexemple:
G tape1:ledeuximelment17estplacdansunevariabletemporairequiestcompareauxlmentsqui
leprcdent.Chacunestdcaltantquilestsuprieurllmenttrier.
G tape2:25estcomparauxlmentsquileprcdentetchacunestdcaljusqucequellmentnesoit
plussuprieurautroisime.
G tape 3:9estcomparauxlmentsquileprcdent.Icicommedansltape 1 on sarrte forcment au
premierlment.
G tape4:34estcomparauxlmentsquileprcdent.Seul48luiestsuprieur.
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]
48 17 25 9 34 48 25 9 34 17 48 25 9 34
17entemporaire Dcalagede48 17lanouvelleposition
17 48 25 9 34 17 48 9 34 17 25 48 9 34
25entemporaire Dcalagede48 25lanouvelleposition
17 25 48 9 34 17 25 48 34 9 17 25 48 34
9entemporaire Dcalagede17,25et48 9lanouvelleposition
9 17 25 34 48 9 17 25 48 9 17 25 34 48
9entemporaire Dcalagede48 34lanouvelleposition
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
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(n
2
) mais se rvle tre plus rapide dans la majorit des cas. Cest
lalgorithmedetrileplusutilis.
Prenezuntableaudedixlments:
Etunpasde4:
G tape1:t[1]ett[5]sontcomparsetventuellementpermuts.
8 4 6 9 7 1 3 2 0 5
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
113
G tape2:t[2]ett[6]sontcomparsetventuellementpermuts.
G tape3:t[3]ett[7]sontcomparsetventuellementpermuts.
G tape4:t[4]ett[8]sontcomparsetventuellementpermuts.
G tape5:t[5]ett[9]sontcomparsetventuellementpermuts.

Lepasnedoitpastrecalculauhasardcarcestdeluiquedpendlefficacitdelalgorithme.Laformuleutilisepar
lalgorithmeestgnralement:
U
(n+1)
=3
Un
+1avecU
0
=0

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

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;

7 4 6 9 8 1 3 2 0 5
7 1 6 9 8 4 3 2 0 5
7 1 3 9 8 4 6 2 0 5
7 1 3 2 8 4 6 9 0 5
7 1 3 2 0 4 6 9 8 5
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
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
me
,ilfaudrabalayerlintgralitdutableau.Cetterecherche
squentiellenestpasidale.
Dansuntableautri,laproblmatiqueestradicalementdiffrente.Rienquavecunerecherchesquentielleildevient
inutiledebalayertoutletableau:ilsuffitdesarrterdsquelavaleurdellmentdutableaudevientsuprieurece
quonrecherche,douneprobablecomplexitmoyenneplusbasse.Maisilresteunesolutionplusefficace.
Ladichotomieconsistediviserpardeuxlintervallederecherchetantquellmentrecherchnestpastrouv.Surun
tableautde10lmentstris:
Vousvoulezsavoirsilavaleur20estprsentedansletableau.
G tape1:Calculerlindicesituaumilieudutableau.Lindicededbutest1,lindicedefinest10,lemilieuvaut
dbut+fin/2.Commecettevaleurnestpasforcmententireonrcupreladivisionentire:(dbut+fin)DIV2.
Ici5.
G tape2:Comparerlavaleurt[5]avec20.tantinfrieure,celaveutdirequelavaleur20estforcmentaudel
delindice5.OnpositionneDbut6,etonrecalcule(dbut+fin)DIV2.Ici8.
G 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
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
Indice 1 2 3 4 5 6 7 8 9 10
Valeur 2 7 9 10 11 14 17 18 20 22
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
115
G tape4:Comparert[9]avec20.Lesvaleurssontidentiques,larechercheesttermine.
LarecherchedoitcontinuertantqueDbutestinfrieurougalFinetquellmentrecherchnapasttrouv.
PROGRAMME DICHOTOMIE
VAR
t:tableau[1..10] dentiers
d,m,f,rech:entiers
DEBUT
rech18
d1
f10

Rpter
m(d+f) DIV 2
Si rech>t[m] Alors
dm+1
Sinon
fm-1
FinSi
TantQue d<=f ET rech<>t[m]
Si rech=t[m] Alors
Afficher "Trouv"
Sinon
Afficher "Absent"
FinSi
FIN
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");
}
}
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA==-enidentnumber
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
G Chaquestructureporteunnom.Cenomserautilispourdclarerdesenregistrements.
G 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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
117
Un enregistrement est une "variable" duntypestructurdonn.Ilsedclareexactementcommeunevariable,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:
G Ilnestpaspossibledaffecterunevaleurunenregistrementenpassantparsonnom.Pourluiaffecterdes
valeurs,ilfautlesaffecteruneuneauxchampscorrespondants.
G Cependant, il est possible daffecter un enregistrement un autre du mme type : chaque champ de
lenregistrementaffectreoitlavaleurduchampcorrespondantdelenregistrementaffecter.
a.Utiliserleschamps
Vous accdez aux champs dun enregistrement en passant par le nom de lenregistrement et le nom du champ
sparsparlecaractre".",lepoint,selonlaformesuivante:
nom_enreg.nom_champ
Cette syntaxe reprsente la valeur du champ nom_champ au sein de lenregistrement nom_enreg. Reprenons
lexempleprcdent:
article1.prix
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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
leurvaleurpeuttreaffecteuneautrevariable.Leschampspeuventtreutilisspartoutolesvariablessont
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 article1.ref
Afficher "Libell du premier article ?"
Saisir article1.libell
Afficher "Prix du premier article ?"
Saisir article1.prix
Afficher article1.ref,article1.libelle,article1.prix
Afficher "Copier le premier article dans le second ?"
Saisir reponse
Si reponse="oui" Alors
article2=article1
Afficher article2.ref,article2.libelle,article2.prix
FinSi
article2.prix15.25
Si article1.prix=article2.prix Alors
afficher "Les deux articles ont le mme prix"
FinSi
FIN
Voicilesconstatationsquipeuventtretiresdecetexemple:
G Le nom du champ seul ne reprsente rien, il est toujours associ son enregistrement sous la forme
enreg.champ.Cequiestappelchampreprsentecettepaire.
G Un champ sutilise exactement comme une variable indpendante. Cest ce quelle est puisquun type
structurestunensembledevariablesduntypedonn.
G Decefait,unchamppeutrecevoirunevaleurcommeuneautre.
G Enfin, 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.
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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 */
art.fab.ref"Fab1234"
art.fab.nom"Le roi de la tarte"
art.fab.adresse"12 rue Siflette 13248 Latruelle"
art.fab.tel"0404040404"
Fin
c.Untableaudansunestructure
Vousvoulezmaintenantconnatrelenombredarticlesvendussurlesdouzemoisdelanne.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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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
bart01.art.ref"art001_01"
bart01.art.fab.ref"Fab1234"
Pour i de 1 12 Faire
Afficher "Ventes du mois",i," ?"
Saisir bart01.vente[i]
totaltotal+bart01.vente[i]
FinPour
Afficher "Total annuel :" ,total
Fin
4.Lestableauxdenregistrements
a.Lestables
Un article reprsente un enregistrement. Jusqu prsent pour reprsenter plusieurs articles, vous deviez crer
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 articles[i].ref
FinPour
Fin
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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 enseigne.magasin[i].adresse
Afficher "tel du magasin",i
Saisir enseigne.magasin[i].tel
Afficher "grant du magasin",i
Saisir enseigne.magasin[i].gerant
FinPour
Fin
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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);
}
}
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0Xeg+OlCdzIgLAA==-enidentnumber
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:
G 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".
G 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.
Unsousprogrammeneselancejamaistoutseul,ildoittreappeldepuisleprogrammeprincipal.Cependant,
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
124
...
DEBUT
...
FIN
Si dans votre algorithme vos sousprogrammes sont crits endessous du programme principal, il est fort
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:
G Unidentifiantsousformedenom:RepeteCar(),quiluiservirapourtreappel.
G Unezonededclarationdevariables.
G UnblocdinstructionsencadrentreDbutetFin.
G Letouttanticietdanslecadredecetexemple,prcismententrelesmotsclsProcdureetFinProc.
Enalgorithmique,unsousprogrammenepeutpastredclardansunautresousprogramme.Lapossibilit
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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++) RepeteCar();
}
}
4.Fonctionsetprocdures
LesousprogrammeRepeteCar()atdclaraveclemotclProcdure,etilvousatindiquaussilexistencedu
motclFonction.Ilyadoncdeuxtypesdesousprogrammes.Certainslangagespeuventproposeroulun,oulautre,
parfoislesdeux.Vousentendrezparfoisparlerdelangagesprocduraux(commelePascal)oufonctionnels(commele
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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
sontpasforcmentmodifiesdemanireglobale.Uneprocdurepourraitfairelobjetdun 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:
G en passant celleci par rfrence, selon le mme principe que ce qui a t expliqu pour les tableaux : le
sousprogrammereoitlarfrencedelavariable,etpeutlamodifierverscellecontenantlanouvellevaleur.
Ceciestdailleursaussipossibleaveclesfonctions.
G Plussimplement,lalgorithmiqueeffectuesouventunedistinctionentrelesvaleursenentredelaprocdure
(celles quon lui transmet) et les valeurs en sortie. Dans ce cas, autant utiliser les fonctions, notamment si
uneseulevaleurdoittreretourne.
G 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
G UnefonctionsedclareaveclemotclFonction,suividesonnometdutypedevaleurquelleretourne.Ce
peuttrenimportequeltype(entier,rel,chane).
G Unefonctionpeutcontenirunezonededclarationdevariableetdetypesstructurs.
G LeblocdinstructionsestencadrentreDbutetFinFonc.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
127
retourne x
FinFonc
Ilexisteunediffrencetrsimportanteentreuneprocdureetunefonction:
G Laprocdureestvuecommeuneinstruction.
G 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
Note:linstructionRetourneneretournepasunevariable,maisunevaleur.Cettevaleurpeuttrelecontenu
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
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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.
En Java, une variable dclare dans le programme principal ou dans une mthode est locale ce bloc
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
129
G Ellenestdclarequuneseulefoispourlintgralitduprogramme.Ellenedoitdoncjamaistreredclare
tantdansleprogrammeprincipalquedansunsousprogramme.
G Ellepermetindirectementde"passer"desvaleursauxsousprogrammes qui lutilisent.Cest un "dommage
collatral", et les variables globales ne devraient tre rserves que lorsque cellesci sont vraiment
communeslaplusgrandepartieducode.
G Ilseraitridiculededclarertouteslesvariablesenglobales.Laplupartdesprogrammesetsousprogrammes
ne les utiliseraient pas toutes, et en plus vous risqueriez par accident, pensant une variable locale, den
modifiercertainessansyprendregarde,etainsidemettreenprillexcutionduprogramme.
G Comme corollaire, ne donnez jamais le mme nom une variable locale et globale. Cest interdit en
algorithmique et dans la plupart des langages qui ne manqueront pas de vous le faire remarquer la
compilationoulexcution.
c.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:
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
130
Procdure nom_proc(E param1:type,ES param2:type,S param3:type)
Lesparamtresduneprocduresontdetroiscatgories:
G Ceux en entre, qui correspondent aux valeurs que vous souhaitez transmettre la procdure. Entre les
parenthses,ilssontprcdsdun"E",commeEntre,carcesontlesvaleursenentredelaprocdure.
G Ceux en sortie, qui correspondent aux valeurs retournes par la procdure au programme ou au sous
programmelayantappel.Ilssontprcdsdun"S",commeSortie,carcesontlesvaleursensortiedela
procdure. Ces paramtres sont des variables qui doivent tre dclares dans le programme ou sous
programmeappelant.
G 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
Laprocdureprcdentefonctionnecertesmerveille,maisavecunpeuplusderflexion,pourquoinepasutiliser
Passerunenregistrementcommeparamtre
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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:
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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
Une procdure ne retournant quune seule valeur et quel que soit son type est toujours convertible en
fonction. Une telle procdure doit dailleurs toujours tre convertie en ce sens : elle na pas dintrt
autrement.
Pour tester les fonctions sec_to_hms et hms_to_sec, vous pouvez appeler lune avec lautre. Une fonction
reprsentant son rsultat (la valeur de la fonction est le rsultat quelle retourne), elle peut tre utilise comme
paramtreuneautrefonctionsilestypesattendussontcompatibles.
PROGRAMME convert_sec3
Var
nb_secondes1:entier
nb_secondes2:entier
Dbut
nb_secondes13950
nb_secondes2hms_to_sec(sec_to_hms(nb_secondes1))
Si nb_secondes1!=nb_secondes2 Alors
Afficher "Erreur dans lune des fonctions ?"
Sinon
Afficher "Un programme parfait"
FinSi
Fin
c.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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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:
G Voussaisissezdeuxhorairesdansdesenregistrementshms.
G Vouslesconvertissezennombredesecondes.
G Vousfaitesladiffrenceentrecesdeuxnombres.
G 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
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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
deltasec_to_hms(hms_to_nbsec(heure2)-hms_to_nbsec(heure1))
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
deltahms_delta(heure1,heure2)
Afficher "Il sest coul :"
Afficher delta.heures,delta.minutes,delta.secondes
Fin
- 12 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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.DanslesexemplesprcdentsenJava,vousenavezdjutilis.EnJava,lesinstructionsprintlnou
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
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)
Fonctionssurchanes
- 13 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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
Tousleslangagesproposentsouventungrandnombredefonctionsmathmatiques.Dommagepourvous,laplupart
desexemplesdesdernierschapitresontdesquivalentssousformedefonctions.Cestlecasdesracinescarres,
despuissances,desfactorielles,desfonctionstrigonomtriquescommelessinus,cosinusettangente,etc.
G racine(x):donnelaracinecarredex
G puissance(x,y):donnexlapuissancey
G sin(x):sinusdex
Fonctionsmathmatiques
- 14 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
137
G cos(x):cosinusdex
G 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,elletrouveunrelentre0et1.Utiliseavecunparamtreentier,elletrouveunevaleurentre0etn.
Idalpourunlancerded.
Programme d
Var
d, saisie :entiers
Dbut
dalatoire(5)+1 // entre 1 et 6
Rpter
Afficher "Quelle est la valeur du d ?"
Saisir saisie
Si dsaisie Alors
Afficher "Rat, essayez encore"
FinSi
Jusqu d=saisie
Afficher "Bravo !"
Fin
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
Les fonctions prdfinies en Java sont extrmement nombreuses. Dans les exemples prcdents vous avez eu
loccasiondenrencontrerquelquesunes,notammentdesconversionsdechanesversdesentiers,parexemple.En
fait,lesfonctionsprdfiniessontenfaitsouventassociesdestypesparticuliers,desobjetsparticuliers,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,voustrouveztouteslesfonctionsassociesauxchanesdecaractres.Notamment,voicicellesqui
peuventvousintresser:
G length():retournelalongueurdelachane.
G substring(dbut[,fin]):dcoupeunmorceaudechane.
G trim():supprimetouslesespacesendbutetfindechane.
Fonctionsdeconversion
FonctionsprdfiniesenJava
- 15 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
138
G indexOf(chane [,depart]) : retourne la position dune chane dans une autre, depuis une ventuelle
position.
G isEmpty():retournevraioufauxselonquelachaneestvideounon.
G 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=txt1.trim(); // supprime les espaces
valeur=txt1.length(); // longeur : 16
System.out.println(txt1+" de longueur "+valeur);

txt2=txt1.substring(3,5); // jo
System.out.println(txt2);
}
}
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 dimplmentationneproposepasdinstructionsoudefonctionsprdfiniespourtrouverla
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
Lesfonctionsmathmatiques
- 16 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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
- 17 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71J RlCdzIgLAA==-enidentnumber
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:
G Simpleourapide:lesousprogrammesappelleluimme.
G 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:
G 10!=10*9*8*7*6*5*4*3*2*1
G Donc10!=10*(9*8*7*6*5*4*3*2*1)
G Donc10!=10*9!
G Doncn!=n*(n1)!
Sivouscrezunefonction(appropriedanscecas)appelefact()etchargedecalculerlafactorielleden,vousauriez
unraccourcidecegenre:
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA==-enidentnumber
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:
G 1
re
tape:5>1?Oui:fact(5)appelle5*fact(4)

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

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

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

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

Estcefini?Non!Chaquefonctionappeleseterminantretournesavaleurauprogrammeousousprogrammelayant
appel.Doncacontinue:
G 6
me
tape:fact(2):2*fact(1)=2,retourne2fact(3)

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

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

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

Sivoussuivezlordredesappels<>retoursvousobtenezleschmasuivant:
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA==-enidentnumber
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:
G Ilsnepeuventdplacerquunseuldisquelafois.
G Ilsnepeuventdplacerundisquequedansunemplacementvideousurundisquedeplusgranddiamtre.
Lalgendeditaussiquequandlesdisquesonttempilsaudbutdestemps,etquelorsquelesprtresaurontfini
delesdplacer,ceseralafindumonde.
Nuldoutequesilesprtresdelalgendeavaienteuunordinateur,nousserionstousdjmortsQuoique!
Avec 64 disques il faut 2
64
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
aupiquet3,puisdedplacerlegranddisquedupiquet1aupiquet2,etdeterminerendplaantles(n1)autres
disquesdupiquet3verslepiquet2.
Soient:
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA==-enidentnumber
143
G nlenombrededisques,
G alapositiondedpart,valant1,
G b,lapositiondarrive,valant2,
G c,lapositionintermdiaireutilisable,valant3,
G audpart,touslesdisquessontlapositiona,
G uneprocdure"dplacer"quidplaceundisquedunepositionuneautreviaunepositionintermdiaire.
Lalgorithmeestlesuivant:
Procdure dplacer(n,a,b,c :entiers)
Dbut
Si n>0 Alors
dplacer(n-1,a,c,b)
Afficher "De ",a, "vers ",b
dplacer(n-1,c,b,a);
FinSi
Fin
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA==-enidentnumber
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 :
G 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,
jusqu64Go.Or,mmeaumodesteniveaudelordinateurpersonnelcelarestesouventtrsinsuffisant :il
est impossible de conserver toutes les donnes en mmoire. Par exemple, un film au format DV dun
camescopenumriqueoccupeprsde20Go,unDVDcompletplusde8Go,etc.
G 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 :
G lesfichierstexte
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
145
G lesdocumentsdestraitementsdetexte
G lesfichierssonMP3
G lesvidosDivX
G lesfichiersHTML
G lesimagesJPEG
G lesfichiersdevotregestiondecomptebancaire
G 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 :
G Lesfichiersorganisssousformedelignesdetextesuccessives,quisappellentdesfichierstexte.
G Les fichiers bruts, contenant des donnes varies dont des nombres reprsents sous forme binaire, ne
correspondantpeuoupasdutoutdutexte,quisappellentdesfichiersbinaires.
b.Lefichierbinaire
Commentreconnatrecesfichierslesunsdesautres ?Cesttrsfacile !Prenezunditeurdetextesimple(notepad
sousWindows),etouvrezlefichiersurlequelvousavezdesdoutes.Sivousobtenezceci (lditeurestkwritesous
Linux):
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
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.
LaconfigurationcompltedeWindowsestplacedansunregistreoubasederegistre.Cettebaseeststocke
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 :
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
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)ouencore0011001001101000110110011100enbinaire.Lemmenombre
dansunfichierbinaireseraitreprsenten04D2(hxadcimal)ou10011010010enbinaire :unegrossediffrence.
Celaveutdirequequandvousallezcriredesnombresdansunfichiertexte,vousdevrezutiliserdesfonctionsde
conversiondenombresversdeschanes.Rciproquement,vousdevrezutiliseruneautrefonctionquandvouslirez
ceschanespourlesconvertirennombres.Vouspouvezutiliserlesfonctionsprdfiniespourcela :
G x=chnum(txt) :convertitlachanetxtenvaleurnumrique
G 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.
Quasiment tous les fichiers de configuration dun systme dexploitation Unix sont des fichiers texte. Pour
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.
Lespropritsdunfichiertextesont lessuivantes :
G Lesfichierstextesontutilisspourstockerdesdonnesstructures.
G Cesdonnespeuventtredutexte,desnombres,dumomentquetoutestconvertientextelisible.
G Cesdonnesstructuressontdesenregistrements.
G Lesenregistrementsdunfichiertextesontreprsentssousformesdelignes,spareslesunesdesautres
parunesquenceCRLF(Windows)ouLF(Unix/Mac).
G Chaquelignereprsenteunestructuredenregistrement,selonunformatprtabli(fixeoudlimit).
G Unfichiertexteestlisibleetmodifiableparnimportequelditeurdetexte.
G Linterprtationdesenregistrementsdpendbienentendudesafinalit.
G Unfichiertextenepeuttreluqueligneligne.
G Un enregistrement se rajoute uniquement la fin du fichier. Pour modifier ou insrer un enregistrement, il
faudraprobablementtoutrcrire.
Commepourlesfichierstexte,voiciquelquespropritsdunfichierbinaire :
Fichiertexte
Fichierbinaire
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
148
G Unfichierbinairepeutstockernimportequoi,quecesoitstructurounon.
G Lesfichiersbinairesnontpasdestructureapparente,ilsreprsententunesuitededonnes(octets)crites
lesunesaprslesautres.
G 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.
G La structure des enregistrements est dpendante de linterprtation du programme. Les enregistrements
peuventtredelongueurfixe,maiscollslesunsaprslesautressansretourlaligne.
G Decefait,unfichierbinairenedoitpastreouvertouenregistrdepuisunditeurdetexte :ilestsouvent
illisible. Seul le programme sachant le manipuler est apte lutiliser. Vous pouvez cependant utiliser un
diteurhxadcimal.
G Lefichierpeuttreluoctetparoctet,ouparbloc,ouentirement,depuisnimportequelleposition,puisque
cestvousquidfinissezsastructure.Idempourlesenregistrements.
5.Lesaccsauxfichiers
a.Squentiel
Lefichiersquentielpermetdaccderauxdonnesdansleurordredcriture.Vousaccdezauxdonneslesunes
aprslesautres.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,unidentifiant.Laconnaissancedecetidentifiantpermetdaccder 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.
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0C/YbVFCdzIgLAA==-enidentnumber
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 :
G Unsparateur":"dlimitelesdiffrentschamps.
G Ilyaseptchamps,numrots(parconvention)de17.
G 1
er
champ :nomdelutilisateur(sonlogin).

G 2
me
champ :indicateurdemotdepasse(icistockailleurs).

G 3
me
champ :UID,identifiantnumriqueuniquedelutilisateur.

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

G 5
me
champ :commentairelibre.

G 6
me
champ :dossierpersonneldelutilisateur.

G 7
me
champ :linterprteurdecommandes(shell)deconnexion.

Vousvoyezbienquilestpossibledeplacerdesinformationstrsimportantesdansunfichiertexte.
La manipulation dun tel fichier est assez vidente : il suffit de lire une ligne, puis de dcouper celleci champ par
champ,cequiestpluttsimplecarilsuffitdslorsdetrouverlesdlimiteurs.Laplupartdeslangagesproposentdes
fonctionsquipermettentdedcouperunechaneselondesdlimiteurs.Cetypedefichieraaussibiendesavantages
quedesinconvnients :
G Dufaitqueleschampssoientcollslesunsauxautresetquechaquechampneprendpasplusdespaceque
sadonneoccupe,fournitunrelavantageentermedoccupationdespacedisqueetdemmoire.
G Cependant, le traitement de dcoupage de la chane en fonction de la position forcment alatoire dun
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA==-enidentnumber
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 :
G Unloginfaitenprincipe8caractres.
G Unmotdepasse1seul(stockailleurs).
G LesUIDetGIDutilisentaumaximum5chiffres.
G Lecommentaireseraarbitrairement(pourlexemple)de15caractres.
G Lescheminsetshellsarbitrairementaussi15caractres.
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA==-enidentnumber
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:
G Contrairementauformatdlimit,leformatlargeurfixeconsommebienplusdemmoire.Danscetexemple
64 octets sont utiliss pour chaque enregistrement. Dans le format dlimit, la taille est variable, mais la
premirelignenutilisaitque32octets.
G 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 :
G Ouvrirlefichier,cestdireindiquerquelfichiervousvoulezaccder,etcomment.
G Traiterlecontenudufichier :lelire,ycrire,breftouteslesoprationssouhaitespouraccderetmanipuler
soncontenu.
G Fermerlefichier,quandtouslestraitementssonttermins.
Ltapelaplusimportanteestlapremire.Commentouvrirunfichier ?Sivousaviezledroitdouvrir 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.
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA==-enidentnumber
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.
EnC,unefonctiondouverturedefichierretourneunevariabledetypeFILEquiestenfaituntypestructur
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 ?
G Enlecture,vousavezunaccsenlectureseuleaufichier.Vousnepouvezpasycrire.Vouspouvezvousy
dplacer,retourneraudbut,liretoutcequevousvoulez,maiscesttout.
G Encriture,parfoisnommlecture/criture,vouspouvezmodifiernimportequellepartiedufichier,crireo
vousvoulez,craservosanciennesdonnesquiserontdoncdfinitivementperdues(vivelessauvegardes).
Attentionlacassesivosenregistrementssontdetaillevariabledansunfichiertexte !Vouspouvezaussi
lirelecontenudufichier.
G Enajout(append),vousnepouvezpaslirelefichier,maisuniquementrajouterdesdonnesaprslafinde
celuici,commerajouterunenregistrementouquelquesoctetstoutaubout.Vousnepouvezpasmodifierles
donnesquiysontdjcrites.
Leproblmeprincipalquevousrencontrerezquandvousutiliserezdesenregistrementsdansunfichier,cest
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA==-enidentnumber
154
Fichiertextesquentiel
1.Ouvriretfermerunfichier
Vousdeveztoutdaborddclarerlenomlogiquedufichier,lavariablequipermettra,associeaufichier,detravailler
avec.CeciseplacecommedhabitudedanslasectionVar.Vousindiquezensuiteletypedaccs : squentiel, direct,
index,etc.Notezquenaccsdirect,vouspouvezaussitravaillerenmodesquentiel.
VAR
fic:fichier squentiel
Vousdevezensuiteouvrirlefichier,enassociantnomlogiqueetnomdufichier,aveclemodedouverturesouhait.
CeciseffectueaveclinstructionOuvrir.
Ouvrir "toto.txt" dans fic en lecture
Voustrouverezaussiparfoiscettesyntaxesousformedefonction,plusprochedecertainslangages :
ficOuvrir("toto.txt","lecture")
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)
Note :neplacezpaslenomdufichierdanslesinstructionsdelecture,critureetdefermeture.Leprogramme
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)
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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 :
G Seloncertainsformalismesalgorithmiques,Lireestunefonctionquiretourneunboolen,doncvraioufaux.
Sivoustentezdelireunenregistrementetquilnyenaplus,LireretourneFAUX.Autrementdit,tantqueLire
estVRAI,onpeutcontinuerlireleslignessuivantes.
G LafonctionEOF()parfoisappeleaussiFinFichier()retourneunboolenquiindiquesilafindufichierat
atteinteounon.Cettefonctionprendenparamtrelenomlogiquedufichier.ElleretourneVRAIsilafindu
fichieratatteinte,doncsilneresteplusdenregistrementslire.
La fonction algorithmique EOF() va retourner VRAI si le fichier que vous ouvrez ne contient pas
denregistrements, donc si la fin de fichier est atteinte ds louverture. Or dans quelques langages, le
programme ne le sait pas tant quil na pas tent de lire un enregistrement, et donc une fonction de ce type
retourneraitFAUXtantquaucunelecturenauraiteulieu.Prudence
LeprogrammesuivantvaliretoutlefichierdesmotsdepasseetplacerlesloginsetUIDdansdestableaux.Comme
onneconnatpaslavancelenombredlments,onselimiteraarbitrairement100lignes.
Programme LIREFIC
Var
fic :fichier squentiel
nom :chane
ligne:chane
i:entier
login :tableau[1..100] de chanes
uid :tableau[1..100] dentiers
Dbut
nom"passwd"
i0
Ouvrir nom dans fic en lecture
Tant que NON EOF(fic) Faire
Lire(fic,ligne)
ii+1
login[i] trim(milieu(ligne,1,8))
uid[i] chnum(milieu(ligne,10,5))
FinTantQue
Afficher i," enregistrements lus"
Fermer fic
Fin
b.criture
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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)
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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(contrairementaumodeajout)maislapositioncourante :vouscrasezlesenregistrementsexistants,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
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 :
G Recopiedesenregistrementsdepasswdversbackup.
G Suppressiondufichierpasswd.
G Renommagedebackupenpasswd.
Cettemthodeseraprivilgiersurdesfichierstrsimposants,plusieursmilliers(oumillions)delignes,silammoire
nedoitpastretropcharge.
Uneautremthodeconsistetouttraiterenmmoire.Ellesefaitendeuxtapes :
G Lectureintgraledufichierpasswdetstockagedeslignesdansuntableau.
G Rcrituredufichierpasswdaveclesbonslmentsdutableau.
Note :Certainslangagesfontunedistinctionentrelemodedcriture,gnralementdestructeur(lefichierest
purgvidavantlajoutdedonnes)etunmodedajouttendu,olefichierpeutaussitreluPrudence.
Traitersurdisqueouenmmoire ?
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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 ?
Attention :silanotationalgorithmiquepermetlalectureetlcrituredenregistrementsdetypesstructursdans
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.
G Ecrire()varajouterunenregistrementdanslefichier,quiseracomposdetousleschampsdutypestructur.
Commelatailleexacteestprcise,toutletexteestdjcorrectementformat.Dutravailenmoins.
G 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 */
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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 :
G Ouverturedufichierenlecture.
G Lecturedechaqueligne.
G Chaqueligneestplacedansuntableaudeuxdimensions :lapremireestlaligne,lasecondeleschamps
dcoupsvialamthodesplit().
G Uneplaceestrservepourdventuelstraitementssurlesenregistrements.
G Ouverturedufichierdesortieencriture.
G Recompositiondetoutesleslignesviaunefonctionrecolle()prenantenparamtreuntableaudechanesetle
dlimiteur.
G 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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
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");
}
}
}
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
161
}
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0+TZFCdzIgLAA==-enidentnumber
162
Lespointeursetrfrences
1.Rappelssurlammoireetlesdonnes
a.Structuredelammoire
Les prcdents chapitres vous ont dj appris normment de choses sur la mmoire et lorganisation de son
contenu:
G Lammoireestdcoupeenoctets.
G Chaqueoctetdelammoiredisposeduneadresse.
G Unedonnepeutstalersurplusieursoctets,doncoccuperuneplagedadresses(parexemple4ou8octets
pourunrel,plusencorepourunechane).
Reprsentationdunevariableenmmoire
Unevariableestunnomdonnuneouplusieurscases.Ellenommelazonedelammoirecontenantladonne.La
zonedelammoirecontenantladonneestdfiniepardeuxchoses:
G Ladressededbutdeladonne,cestdireladressedupremieroctetcontenantladonne.
G Latailledecettezone,cestdirelenombredoctetssurlequelstalentlesdonnes.
Latailledelazonedpenddutypedeladonne.UncaractreASCIInoccupequunseuloctet,unentierquatre,un
entierlonghuit,etc.
Quandvousaccdezaucontenudelavariable,vousaccdezaucontenudelazonemmoirequiluiestassocie.La
variableellemmecontientdoncuneautreinformation,ladressedelazonemmoirelaquelleelleestattribue.
Parconvention,unordinateursachantgrerbeaucoupdemmoire,lesadressessontnotesenhexadcimal.Cest
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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 0xbfa95cbcd, taille de 4 octets
Le pointeur p_i pointe sur ladresse 0xbfa95cbcd
Notezqueladressedelavariableicorrespondmaintenantexactementaucontenudupointeurp_i.Lepointeurp_i
pointesurlavariableidontilcontientladresse.
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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:
G En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structur. Elle doit
retournerladressedecelleci,etdoncsonrsultatseraplacdansunpointeuradquat.
G Danslechapitresurlessousprogrammes,vousavezvuquilestpossibledepasserunevariableenSortie
(S) ou Entre/Sortie (ES) une procdure. Daprs vous, quel est le mcanisme utilis ? Le pointeur, bien
entendu:vouspassezladressedelavariableenparamtre,etlesousprogrammevamodifierlecontenude
lammoirecetteadresseviaunpointeur.
G 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
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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.
Note:Ajouter1unpointeurnedplacepasforcmentladressedeunoctetenmmoire,maisdelalongueur
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++;
Note:enC,chaquelmentduntableauestenfaitunpointeursurladressemmoirecontenantcetlment.
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
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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
Attention : cest vous de tester si un pointeur est positionn sur NIL avant de lutiliser ! Un accs un
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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:
Librer 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.
Ne drfrencez jamais un pointeur dont la zone mmoire a t libre. Cest une faute malheureusement
courante.Dansdetrsgrosprogrammesleprogrammeuroublieparfoisdetesterlavaleurdupointeuravant
dyaccder,provoquantunefuitemmoireauxconsquencessouventlourdes.
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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:
G 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.
G 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.
G LesmanipulationsdepointeurspeuventvitedevenirtrscomplexesenC/C++:risquededpassementdes
adresses, allocations mmoires compliques, risque de confondre les types, etc. Aucun risque en Java : la
machinevirtuellesoccupepresquedetout.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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.
EnJava,lestableaux,structures,chanes,quisontenfaitdesobjets,donctouslesobjets,sontpassspar
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);
}
}
EnJava,touslestypesprimitifs(int,long,float,double,char)sontpasssparcopieauxfonctions,cestdire
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
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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:
G articleestunerfrencesurunestructure(unobjet)detypetarticle.
G articlecontenantunevariabledetypetfabricant,oncrededansunerfrencefabsurunobjetdecetype.
G art2detypetarticlereoitlarfrencedearticle.Ilsrfrencentlemmeenregistrement.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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.Cettevaleursignifiequelavariableatdclaremaisna 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");
}
}
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA==-enidentnumber
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.
G Commentinsrerunnouvelenregistrementendbutdetableau?Ilnyapasdindicesngatifs
G Comment insrer un nouvel enregistrement en fin de tableau ? Si lalgorithmique propose un
redimensionnementdynamique,leslangagescommeJavanelepermettentpas.
G Commentinsrerunlmentaumilieudutableau?Fautildcalertousleslmentspourplacerlenouveau
lendroitdonn?Sioui,letableaurisquededborder.
G 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:
G Unenregistrementpeutcontenirunautreenregistrement.
G Cetautreenregistrementpeuttredummetypestructur.
G Lenregistrementpeutaussicontenirunpointeurversunautreenregistrementdummetype.
G En notation Java, un enregistrement est un objet, et dans un objet, on peut rfrencer un autre objet du
mmetype.
G On obtient, du coup, une cascade denregistrements qui se suivent les uns les autres. Pour accder au
suivant,ilsuffitdaccderlarfrencedecetenregistrementdanslenregistrementactuel.
G Chaqueenregistrementdisposedunpointeurourfrenceverslesuivant.
G Lesenregistrementssontdoncchanslesunsauxautres,cestunelistechanedenregistrements.
Le principe peut tre reprsent par le schma suivant. Chaque enregistrement est reprsent par un cadre et
contientunevaleuretunpointeurappelpsuivquipointesurlenregistrementsuivantdelaliste.
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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?
G Creruneliste:cestcrerlepremierenregistrement,celuidette,quipermettradaccderauxautres.
G Parcouriruneliste:cestbalayertousleslments,unparun,jusquaudernier.
G Rechercherunlmentdanslaliste:soitindiquersilexiste,soitretournerunpointeurverssaposition.
G Ajouter un lment nimporte o dans la liste : au dbut, au milieu, la fin. Une fonction dajout pourrait
aussireprendrelapremireoprationdecrationdeliste.
G Supprimerunlmentnimporteodanslaliste.
G Supprimerlaliste.
Toutes ces actions peuvent se faire au travers de sousprogrammes, rendant lusage de la liste beaucoup plus
simple. Pour se rapprocher des langages fonctionnels, les sousprogrammes devant le plus souvent retourner un
pointeurversunlmentdelaliste.
Unedernirechose:lepremierlmentdelalisteesttoujourslepointdentrepourlaplupartdesfonctions.tant
donnquilserareprsentparlasuiteparunpointeur,neperdezJAMAISladressedecepremierlment:ilserait
impossiblederetrouverledbutdelaliste,dautantplusquaveclallocationdynamiquedemmoire,ilestplusque
possiblequeleszonesmmoiresalloueschaquelmentnesoientpascontigus.
Conservez toujours ladresse du premier enregistrement dans un pointeur prvu cet effet dont vous ne
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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
Rappel : pTetepSuiv NIL se lit ainsi : (*pTete).pSuivNIL, cestdire que le champ pSuiv de
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:
G LepointeurpTetedelattedelaliste,quidevratreretournparlafonction.
G LepointeurpEncoursdellmentactueldelaliste,dellmentrajoutenfait.
G 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

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


enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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:
G Lavaleurvrecherche.
G UnpointeurpTetesurlattedelaliste.
G UnpointeurpPrecsurllmentprcdent,celuitrouv.
G UnpointeurpEncourssurllmenttrouv.
G Unboolenvraioufaux.
G Sillmentesttrouv,pPrecpointesurceluidavant,pEncourssurllmenttrouv.
G Sillmentestabsent,pEncoursvaurNILetpPrecpointesurledernierlmentdelaliste.
G SipPrecvautNIL,llmentrecherchestlepremierdelaliste.
Procdure recherche_liste (E:v:entier, E:pTete, ES : pPrec,pEncours
:pointeurs sur element,S :trouve :boolen)
Var
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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:
G Lajoutdunlmentendbutdeliste.
G Lajoutdunlmentenmilieudeliste.
G Lajoutdunlmentenfindeliste.
Danslestroiscas,lechanageestmodifi.Ilestcertespossibledecrerungrossousprogrammequigrelestrois
casduncoup,maisilestprofitabledediffrenciercestroistraitementsentroissousprogrammesindpendants.Il
seratoujourstempsensuitedecrerunsousprogrammefdrateurquigreratouslescas.
Danstouslescassuivants,ladressedellmentrajouter,quevousaurezdjremplieaveclabonnevaleur,sera
reprsenteparlepointeurpNouveau.
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
Cestencoreuncastrssimple.Lerajoutdunlmentenfindelistencessiteseulementdeconnatreladressedu
dernierlmentactuel.LepointeurpSuivdecedernierpointerasurlenouvellment,etlepSuivdunouvellment
recevraNIL.
Sivousreprenezlesprocduresderechercheetdeparcoursdelalistechane,lafindelalistepEncoursvautNIL
etpPreccontientladressedudernierenregistrement.Laprocdureajout_fin()reoitdeuxparamtres:pNouveauet
pPrec.
Ajoutendbutdeliste
Ajoutenfindeliste
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
178
Procdure ajout_fin(ES : pNouveau, pPrec :pointeurs sur element)
Dbut
pPrecpSuiv pNouveau
pNouveaupSuiv NIL
FinProc
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
Lebutestdegnraliserlesajoutsenungrandsousprogrammeunifi.Poura,ilfautsavoiroplacerllment
rajouter.Lalgorithmederecherchedunlmentretournedeuxpointeurs:celuidellmenttrouvetdellment
prcdent. Supposez que vous souhaitez insrer votre nouvel lment juste avant llmentrecherch,adevient
pluttsimple.Quatrecasdefigureseprsentent:
G pPrec contient NIL (pas dlment avant) et pEncours contient NIL : il ny a aucun lment dans la liste, le
nouveauseralepremieretseullment.
G pPrec contient NIL (pas dlment avant) et pEncours pointe sur llment trouv qui est le premier : le
nouveauseplaceavant,enpremier.
G pPrecpointesurunlmentprcdentetpEncourspointesurllmenttrouv,lenouveauseplaceaumilieu
desdeux.
G 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
Ajoutenmilieudeliste
Gnralisation
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
179
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:
G Supprimerleseullmentdelaliste
G Supprimerlepremierlmentdelaliste
G Supprimerledernierlmentdelaliste
G 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.
Cestfacile,sillmentestleseul,donclattedelaliste,ilsuffitdeplacersonpointeurNIL.Pasdeprcdent,
pasdesuivant,cesttermin.
Procdure suppr_unique(ES :pTete :pointeur sur element)
Dbut
pTeteNIL
FinProc
Cestaussisimple:cestllmentsuivantquidevientlattedelaliste.
Procdure suppr_premier(ES :pTete :pointeur sur element)
Dbut
pTete pTetepSuiv
FinProc
Toujoursaussisimple:llmentprcdentreoitNILcommevaleurdepointeursuivant.
Simplification
Supprimerleseullment
Supprimerlepremierlment
Supprimerledernierlment
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
180
Procdure suppr_dernier(E :pPrec :pointeur sur element)
Dbut
pPrecpSuiv NIL
FinProc
Ilfautraccorderllmentprcdentavecllmentsuivant.
Procdure suppr_milieu(E :pPrec,pEncours : pointeurs sur element)
Dbut
pPrecpSuiv pEncourspSuiv
FinFonc
Contrairement lajout,vouspouveztoutdesuitevoirsilestpossibledesimplifieravantdallerplusloin,selonle
mmeprincipe.Ainsidanslafonctionsuppr_premier()pTeterecevraNILsillmentsupprimestleseulcarpTete
>pSuivvautNIL.
Idempoursuppr_milieu()etsuppr_dernier().Danssuppr_milieu,pEncours>pSuivvautNILsillmentestledernier.
Lesfonctionssuppr_unique()etsuppr_dernier()sontdoncinutiles,saufpourlexemple!
Toutdabord vous devez trouver llmentsupprimer.Silny est pas, il nyariensupprimer.DoncsipEncours,
contenantllmenttrouv,vautNIL,ilnyarienfaire.Ensuite,ilyadeuxcasdefigure:
G pPrecvautNIL:llmentsupprimerestlepremier(ouleseul).
G 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
Supprimerunlmentaumilieu
Simplification
Gnralisation
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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;
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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) {
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
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 nimportequellmentdelalistedepuisnimporte 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
185
danslesdeuxsensdanslaliste,soitverslaqueue(fin),soitverslatte.Ceslistessontditesbilatres.
Lestraitementsdoiventtreadaptsenconsquence.Prenezleproblmelenvers:vousavezdeuxpointeurs
mettrejour.Sivoussavezlefairedansunsens(commeleslistessimples)voussavezlefairedanslautre,vous
changezjustedesens.Ilyadoncdeuxfoisplusdoprationsdechanage:
Chanageavant
G pPrecpSuivpNouveau
G pNouveaupSuivpSuivant
Chanagearrire
G pSuivantpPrecpNouveau
G pNouveaupPrecpPrec
Leslistesbilatrespeuventaussitrecirculaireset/outries.
d.Filesetpiles
Dansunefiledattente,dansunmagasin,uncinma,brefdansunequeue,lepremierarrivestlepremierservi.En
anglais,celasetraduitpar"FirstIn,FirstOut",soitFIFOenabrg.
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.
- 13 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA==-enidentnumber
186
Lesarbres
1.Principe
Note : Limplmentation des arbres en Java reprend des principes quasiidentiques aux listes vues
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
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:
G Un noeud ou sommet est un lment quelconque de larbre. Dans un arbre gnalogique, chaque individu
reprsenteunnoeudousommet:ilaplusieurssuccesseursmaisunseulprdcesseur.
G Laracineestlepremierlmentdelarbre,nayantpasdeprdcesseurdanslahirarchie.
G Unefeuilleounoeudterminal,ounoeudfinalestunlmentquinapasdesuccesseur.
G Unnoeudinterneestunnoeudquinestniracine,nifeuille,quiadoncunprdcesseuretdessuccesseurs.
G Unarcreliedeuxnoeuds.
G Unebrancheestlecheminquirelielaracineunefeuille.
Ductdurapprochementgnalogiquelgrementsexiste,voustrouverezlestermessuivants:
G Lepreestleprdcesseuruniquedunnoeud.
G Lesfilssontlesnsuccesseursdunnoeud.
G Lesnoeudsdepreidentiquesontdesfrres.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
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:
G Laracine
G Lesousarbregauche
G Lesousarbredroit
Cetypedeparcoursestditprfix.Leprogrammevadabordtraitertousleslmentsdegauche.Arrivunefeuille,
ilremonteaunoeudprcdent,puispassedroitepourtraiterleslmentsdegauchedeceluici,puisremonte,et
ainsidesuite.
Danslarbrebinairedelexemple,lordredesortieestlesuivant:
G Branchegauche:12>9>8(cestunefeuille)
G Onremonteaunoeud9
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
189
G Branchedroite:10(cestunefeuille)
G Onremonteaunoeud9,puislaracine12
G Branchedroite:14
G Branchegauche:13(feuille)
G Onremonteaunoeud14
G Branchegauche:16
G Lasortiefinaleestdonc:129810141316
Pourlereprsenter,ilfaututiliserunefonctionouprocdurercursive.
Fonction prefixe(pNoeud :pointeur sur noeud)
Dbut
Si pNoeud<>NIL Alors
Afficher pNoeudvaleur // racine
prefixe(pNoeudpGauche) // sous-arbre gauche
prefixe(pNoeudpDroite) // sous-arbre droit
FinSi
Fin
Ilexistedeuxautrestypesdeparcours.Leparcourspostfixquitraitedanscetordre:
G Lesousarbregauche
G Lesousarbredroit
G Laracine
Lordredesortieest810913161412.
Fonction postfixe(pNoeud :pointeur sur noeud)
Dbut
Si pNoeud<>NIL Alors
prefixe(pNoeudpGauche) // sous-arbre gauche
prefixe(pNoeudpDroite) // sous-arbre droit
Afficher pNoeudvaleur // racine
FinSi
Fin
Etleparcoursinfix,appelaussiparcourssymtriqueouhirarchiquecanonique.Ceparcoursseratrsutileparla
suite.Lordreestlesuivant:
G Lesousarbregauche
G Laracine
G Lesousarbredroit
Cettefoislordredesortieestlesuivant:
G Sousarbregauche:8910
G Racine:12
G Sousarbredroit:131416
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
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:
G Comparez15laracine12:cestsuprieur,directionlenoeuddedroite.
G Comparez15aunoeud14:cestsuprieur,directionlenoeuddedroite.
G Comparez15aunoeud16:cestinfrieur,directionlenoeuddegauche.
G 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
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
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:
G Lasuppressiondunnoeudsansfils(unefeuille),cestlecasleplussimple.Lepointeurcorrespondant(droite
ougauche)dupredoittreplacNIL.
G Lasuppressiondunnoeudayantunfils:lefilsdroittreraccordaubonpointeurdugrandpre.
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
192
G 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)remplacelenoeudsupprim,celuidedroite(ettoutsonsousarbre)vadroitedunouveau
noeud.
Uneautrepossibilitestdesupprimerlenoeud,parcourirlesdeuxsousarbresdecetanciennoeudetderajouter
chaquelmentdanslepremierarbre.
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA==-enidentnumber
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
194
trouvez :
G sesdimensions,
G sontype(crt,lcd,etc),
G sesconnecteurs(vga,dvi),
G sonpoids(cestlourduncrantube),
G ladiagonaledaffichageenpouces,
G lesrsolutionsdaffichagesupportesaveclesfrquencesassocies,
G etc.
Cemmecranaprobablementunmodedemploidcrivantlesmanipulationstantmatriellesquelogiciellespourle
paramtrer,parexemple :
G rglerlescouleurs(etassoci :contraste,etc),
G rglerlazonedaffichage,
G changerdersolution,
G 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
Enprogrammationprocdurale,laquestionseposerquandondveloppeest"quoisertleprogramme ?".Ici,il
sertmanipulerlesinformationsetlesfonctionsduncran.
Commentenprogrammationreprsenterlespropritsdelcranetlesmanipulationsquiysontassocies ?Jusqu
prsentvousauriezprobablementraisonnainsi :
G RegroupertouteslesinformationssurlcrandansuntypestructurtEcran(parexemple).
G Crer des sousprogrammes de gestion des paramtres de lcran, prenant comme arguments la structure
correspondante.
G Pourncrans,vouscreznenregistrements(structures)detypetEcran,unparcran,dansdesvariables
diffrentes,oudansdestableaux.
Programmationprocdurale
- 2 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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 ?
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 dalgorithmiqueunpeuanciens(annes1980),danslesensoellecontientunensemblededonnes
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]ligne.split(":")
...
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 ?
G Lachaneellemme,composedunesuitedecaractres.
Quelssontlestraitementsapplicablesunechane ?
G Lecalculdesalongueur,
Programmationobjet
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
196
G ledcoupageensouschanes,
G laconcatnationavecuneautrechane,
G larechercheduneautrechanededans,
G lclatementdelachaneselonundlimiteur,
G laconversionenminusculesoumajuscules,
G lasuppressiondesespacesavantetaprs,
G 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 :
class chap7_fic1 {
public static void main(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 :
G Lesdonnessurluimme :sesproprits,sontat.
G 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.
G Unobjetestunevariabledontletypeestsaclasse.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
197
objetdeclasseStringenJavanecontientpaslammechanedecaractresquunautreobjetString).
G Commeilpeutyavoirplusieursobjetsdemmetypedeclasse,onditquunobjetestuneinstancedeclasse.
Ladfinitiondunobjetestunpeucommecelledunestructure,saufquelleestcomposededeuxparties :
G Les attributs sont les proprits de lobjet, cestdire les diffrentes variables qui dfinissent ce quil
reprsente,sontat.
G Lesmthodessontlessousprogrammes,fonctionsouprocduresquiinfluentsurlobjet,parexemplesurles
attributs.
Cesdeuxpartiessontappeleslesmembresdelobjet.
Lesattributssontdesvariablesdenimportequeltype,primitif,tableau,objet,etc.Lesmthodessontlquivalentdes
sousprogrammesvusjusquprsent,maispropreslobjet.
Classe mon_objet
attributs
attr1 :entier
attr2 :tableau[1..10] de rels
...
mthodes
procdure afficher()
procdure effacer()
...
FinClasse
Reprenezlexempleprocduralsurlcran.VoicicequepourraittrelaclassedelobjetdetypeEcran :
Type
Classe Ecran
attributs
type :Chane
marque :chane
modle :chane
diagonale :entier
hauteur :reel
largeur :reel
profondeur :reel
poids :reel
connecteur :chane
resolution : tableau[1..10] de chanes
mthodes
Procdure changer_resolution(...)
Procdure mise_en_veille(...)
Procdure rallumer(...)
Procdure regler_affichage(...)
Procdure affiche_modle()
Procdure saisie_modle()
FinClasse
5.Dclarationetaccs
Unobjetsedclarecommeunevariableouunenregistrementsaufquelenomdutypeestlenomdelaclasse :
Var
ecran1 :Ecran
ecran2 :Ecran
Vouspouvezaussicrerdestableauxdobjets :
Var
ecrans :tableau[1..10] dEcrans
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
198
Etmmedclarerdespointeurssurdesobjets,puisqueeuxaussioccupentunezonemmoire :
Var
ecran :Ecran
pEcran :pointeur sur Ecran
Parconventionlesvariablesobjets,quiserontsimplementappelesobjetsparlasuite,commencentsouventparla
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
this.typet
FinProc
...
FinClasse
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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.
Ilestpossiblededcrire(programmer)unemthodeendehorsdeladfinitiondelaclasse(enalgorithmique,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.
G Public : les membres sont directement accessibles depuis toute autre partie du programme ou objet comme
danslesexemplesprcdentsvialoprateurpoint.
G 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
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
200
Var
o1:Ecran
Dbut
// Attributs privs : accs depuis lextrieur interdit
o1.type"LCD" // *** INTERDIT !!! ***
// Accs direct aux attributs
Afficher o1.type // *** INTERDIT !!! ***

// Mthodes publiques : accs autoris


o1.saisie_modle("Multisync FE1250+")o1.affiche_modle()
Fin
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 :
G Lesattributssontprivs(ouprotgs).
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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 hrite de Superclasse
attributs
...
mthodes
FinClasse
Pour dfinir les classes herbivores, carnivores ou omnivores, vous hritez des proprits de base du sousrgne
animalassoci.
Classe herbivore hrite de animal
...
FinClasse
Classe carnivore hrite de animal
...
FinClasse
Classe omnivore hrite de animal
- 9 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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.
- 11 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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
Note : en cas dhritage en cascade, le motcl super se rapporte la classe mre, cestdire celle dont
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.
- 13 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA==-enidentnumber
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 :
G Ilportelemmenomquelaclasse.
G Ilneretournepasdevaleur.
Via le polymorphisme paramtrique (quon appelle aussi la surcharge des mthodes) vous pouvez crer autant de
constructeursquevouslesouhaitez,unparcasselonlesparamtrespasss.Enalgorithmiquevousrajouterezle
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.
Un constructeur qui ne reoit aucun paramtre est appel le constructeur par dfaut. Il est appel quand
aucunevaleurnestpasselobjetlorsdesacration.
Classe Ecran
attributs privs
type :chane
marque :chane
modle :chane
mthodes publiques
Constructeur Ecran()
Dbut
Afficher "Constructeur par dfaut"
this.type"Inconnu"
this.marque"Inconnu"
this.modle"Inconnu"
Fin
Constructeur Ecran(t,mq,mdl :chanes)
Dbut
Afficher "Constructeur avec 3 arguments"
this.typet
this.marquemq
this.modlemdl
Fin
FinClasse
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
208
Commentsavoirquelconstructeurvatreappellacrationdelobjet ?Cestvousdepasserlesbonnesvaleurs
lobjet ds son instanciation (dclaration ou cration). Dans lexemple suivant, deux objets Ecran sont crs. Le
premierlestcommedhabitude :cestleconstructeurpardfaut(sansparamtres)quiseraappel.Lesecondprend
troisparamtresentreparenthses,commesivouspassiezdesparamtresunemthode :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 ?
G Si la classe drive na pas de constructeur, cest celui de la superclasse qui est appel, si cest possible
(paramtresidentiquesparexemple).
G Silaclassedrivedisposedunconstructeur,cestluiquiestappel.
G 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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
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 :
G Ilnyaquunseuldestructeur.
G Ilneprendpasdeparamtres.
G Sonnomestcomposduntildesuividunomdelaclasse.
G VouslefaitesprcderdumotDestructeur.
Il dispose des mmes proprits pour les classes drives. Vous devez ventuellement lappeler vousmme, en
cascade.
Classe B hrite de A
...
Constructeur B()
Destructeur ~B()
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
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
nb_ecrans0 :entier statique
...
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
nb_ecrans0 :entier statique
...
mthodes publiques
Constructeur Ecran()
Dbut
nb_ecransnb_ecran+1
Fin
Destructeur ~Ecran()
Dbut
nb_ecransnb_ecran-1
Fin
Procdure nbEcrans()
Dbut
Afficher nb_ecrans
FinProc
FinClasse

Programme obj11
- 4 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
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.
Cetteclassedebasecontenantdesmthodessansimplmentationnepourrapastreinstancie,vousnepourrez
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.
G Pourcreruneclasseabstraite,vousrajoutezlemotcl"abstraite"aprslenomdelaclasse.
G Pourcrerunemthodeabstraite,vousrajoutezlemotcl"abstraite"avantsonnom.
Classe figure abstraite
attributs privs
x :rel
y :rel
c_contour :chane // couleur contour
c_remp :chane :: couleur remplissage
surface :rel
primtre :rel
mthodes publiques
Procdure setcolor_c(E :couleur :chane)
Dbut
this.c_contourcouleur
Fin
...
Fonction abstraite getSurface() :reel
Fonction abstraite getPerimtre() :reel
...
FinClasse
partirdumomentouneclassecontientunemthodeabstraite,elleestellemmeabstraite.Laclassefigureest
abstraite :ellecontientdesmthodesabstraites,sansimplmentation.Ellecontientaussidesmthodesquinesont
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
212
pasabstraitescommesetcolor_c()quinaurapasforcmenttrerimplmentedanslesclassesdrives.
Ilestdecefaitimpossibledecrerunobjetdetypefigure.Vousdevezmaintenantcrerlesclassesquienhritent.
Voici deux exemples simplifis de classes : disque et rectangle. Vous devez implmenter dedans les mthodes
abstraitesdelasuperclasse.
Note importante : vous tes oblig dimplmenter dans la classe drive les mthodes abstraites de la
superclasse.Sivousnesouhaitezpaslefaire,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 :
G Noninstanciable
G Abstraite
- 6 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
213
G 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
NotezbienquuneinterfacenecontientQUEdesmthodesetriendautre.
On dit quune classe qui dcide dutiliser une interface implmente les mthodes de linterface, donc implmente
linterface.Vousutilisezcemmemotclpourleprciser.
Classe titi implmente interface
Vouspouvezdciderdimplmenterplusieursinterfacesauseindevotreclasse,danscecasvoussparezlesnoms
desinterfacespardesvirgules.
Classe titi implmente interface1, interface2, interfacen
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
...
- 7 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
214
Fin
// Continuez ici
...
FinClasse
- 8 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001N+nFCdzIgLAA==-enidentnumber
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
- 1 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/d/7pVCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/d/7pVCdzIgLAA==-enidentnumber
217
Vousremarquezdepuisledbutdulivrequelafonctionprincipalemain()estenfaitunemthodeparticuliredune
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;
- 3 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/d/7pVCdzIgLAA==-enidentnumber
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
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/d/7pVCdzIgLAA==-enidentnumber
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.
- 5 - ENI Editions - All rigths reserved - Jonifar lina
enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJ zaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJ hbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ 0VOSS5FZGl0aW9ucy5NRURJ QXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0/d/7pVCdzIgLAA==-enidentnumber
220

Vous aimerez peut-être aussi