Anda di halaman 1dari 221

Algorithmique

Techniques fondamentales de programmation

SbastienROHAUT

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

L'auteur
Sbastien ROHAUT a dbut comme Ingnieur de dveloppement en C++. Aujourdhui Ingnieur Systme il intervient sur des missions rgulires pour de grands comptes et continue denseigner le dveloppement des classes dingnieur et masters MTIC.
Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

ENI Editions - All rigths reserved

- 1-

Introduction
Pourquoi apprendre programmer ? Avezvous, comme lauteur, dispos au dbut de la microinformatique dun ordinateur o il fallait programmer soimme des jeux ou outils, ou saisir des dizaines de pages de lignes de programmation ? Avezvous besoin, durant vos tudes, de matriser les techniques fondamentales de programmation pour passer votre diplme? tesvous un professionnel ou un autodidacte passionn qui veut encore en savoir davantage?Estceunenouvelletapedevotrecarrireprofessionnelleontantpasinformaticienvoustesamen programmerdesmacrosoudesscriptscomplexes?Quelleraisonencoretrouver?Sivousrpondezouilunedesces questions, mais aussi aux dizaines dautres quil serait possible de poser, alors oui, vous devez apprendre programmer.Apprendreprogrammer,cestenfinsavoircommentfontlesautrespourcrerdesuperbeslogiciels,cest savoirtermecommentlescrersoimme,etlesdvelopper. Commentapprendreprogrammer?Onnesimprovisepasprogrammeur.Cestunmtier,etcommetoutmtier,cela sapprend. Dans les coles, des professeurs enseignants pour des classes de BTS, DUT, DEUG, classes prparatoires, etc.,sontspcialissdanslapprentissagedesnotionsfondamentalesdeprogrammation.Lesautodidactesseplongent dans des livres, des sites Internet, dans la documentation en ligne des langages, pour apprendre ces notions. Lensembledecesnotionscestlalgorithmique. Ce livre reprend les notions essentielles, fondamentales, de la programmation. Pour apprendre programmer, il faut dabordcomprendrecequestvraimentunordinateur,commentilfonctionneetsurtoutcommentilpeutfairefonctionner desprogrammes,commentilmanipuleetstockelesdonnesetlesinstructions,quelleestsalogique.Alors,aufuret mesure,lerestecouledesourcecommeunevidence:variables,tests,conditions,boucles,tableaux,fonctions,fichiers, jusquauxnotionsavancescommelespointeursetlesobjets. Le formalisme algorithmique, (la syntaxe du langage algorithmique ou pseudocode) reprend celui couramment utilis danslescolesdinformatiqueetdanslesformationscommelesBTS,DUT,premiresannesdingnierie,quicelivre estenpartiedestinetconseill.Ilexisteplusieursvariantesutilises,selonleprofesseur,lelangagedorigine.Celui prsenticialavantagedtredansunfranaistrsexplicite"tantque,jusqu,pourchaque,afficher,saisir,etc.".Leur lecturenencessiteaucuneconnaissancepralabledetermestroptechniques. Celivrenefaitpasquaborderlesnotionsbasiques.Deuxchapitres,lunsurlespointeursetlesrfrences,lautresur les objets, ouvrent les portes de la programmation dans des langages volus et puissants comme le C, le C++ et surtout Java. Dailleurs, presque tous les algorithmes de ce livre sont rcrits en Java. Les sources directement utilisablessontdisponiblesentlchargementsurlesitedesditionsENI. Lauteur tient particulirement remercier ses anciens professeurs de BTS du lyce de Montmorency, ses anciens professeursetaujourdhuicollguesdelESGI,notammentceuxdalgorithmiqueetdeprogrammationC,C++etJavaqui sereconnaitront,pourluiavoirtransmisencoreunpeuplusleplaisirdumtierdinformaticienetdutravailbienfait.

ENI Editions - All rigths reserved

- 1-

Lesfondementsdelinformatique
1.ArchitecturedeVonNeumann
Unordinateurestunensembledecircuitslectroniquespermettantdemanipulerdesinformationsquonappelledes donnes et capable de faire "tourner" des programmes, cestdire une suite ou squence dinstructions programmes lavance et quil va drouler du dbut la fin dans le but dobtenir des rsultats. Pour comprendre commentunordinateurpeutdroulerunprogramme,ilfauttudierunpeuplusendtailsonfonctionnement. CestVonNeumannquiadfinien1944larchitecturedesordinateursmodernesencorelargementutiliseaujourdhui (avecdesvariantescependant).LarchitecturedeVonNeumann(issuedestravauxdeTuringdontilseraquestionplus loin)dcomposelordinateurenquatrepartiesdistinctes: 1. LUnitArithmtiqueetLogiqueUAL(ALUenanglais)estlorganedelordinateurqui excutelescalculs:additions,soustractions,multiplications,divisions,modulos,gestiondes signes(positif,ngatif),oprationslogiques(boolenne),comparaisons,parfoisrotationset dcalagesdevaleurs(toujoursdanslecadredunelogiqueboolenne).IlexistedesUAL spcialisesdanslesnombresvirguleflottante,dautresdansdestraitementscomplexes commeleslogarithmes,lesinversions,lesracines,lesvecteurs,lescalculstrigonomtriques, etc.Certainesdocumentationsluirajoutentquelquesregistres(petitescasesmmoires intgreslUAL)etluidonnentlenomdeprocesseur(CPU). 2. LUnitdeContrleUC(CUenanglais),nepasconfondreavecUnitCentrale,contrlele squenagedesoprations,autrementditledroulementduprogramme.Elleprendses instructionsdanslammoireetdonnesesordreslUAL.Lesrsultatsretournspeuvent influersurlesquenage.LUCpassealorslinstructionsuivanteouuneautreinstruction tellequeleprogrammeluiordonnedeffectuer. 3. Lammoirepeuttredcritecommeunesuitedepetitescasesnumrotes,chaquecase pouvantcontenirunepetiteinformation(petitedanslesensolatailledechaquecaseest fixe).Cetteinformationpeuttreuneinstructionouunmorceaudinstructionduprogramme (uneinstructionpeutoccuperplusieurscases)ouunedonne(nombre,caractre,ou morceaudeceuxci).CestlUCquiacommerlecentraldecontrlerlaccslammoire pourleprogrammeetlesdonnes.Chaquenumrodecaseestappeluneadresse.Pour accderlammoire,ilsuffitdeconnatresonadresse.Lesinstructionsduprogrammepour lUCetlesdonnespourlUALsontplacesdansdeszonesdiffrentesdelammemmoire physique. 4. LesEntres/SortiesE/S(I/Oenanglais)permettentdecommuniqueraveclemonde extrieuretdoncvous:cepeuttreunclavierpourentrerlesdonnes,etuncranpour afficherlesrsultats.Ilpermetlordinateurdtreinteractif. Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstruction duprogrammeetlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALde prendrecesdeuxnombresenmmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvelle case. Puis lUCpasselinstructionsuivante.Sielleconsisteaffichercersultat,alorslUCvalirelecontenudela mmoire ladresseoestplaclersultat,puisvaenvoyerlersultatvialecomposantdE/Sadquat.Etainside suite.Aufinalledroulementdunprogrammeauseindelordinateurestlesuivant:
q

lUCextraituneinstructiondelammoire, analyselinstruction, rechercheenmmoirelesdonnesconcernesparlinstruction, dclencheloprationadquatesurlALUoulE/S, rangelersultatdanslammoire.

ENI Editions - All rigths reserved

- 1-

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

N ote: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

ENI Editions - All rigths reserved

- 3-

systme dcimal (soit une notation en base 10 en allant de zro neuf), un ordinateur ne manipule que deux valeurs : 0 ou 1. En effet si vous pouviez trs fortement agrandir un circuit intgr, vous verriez que celuici est composdenombreusespistesdanslesquellespasseuncourantlectrique. Danscescircuitsilnyaquedeuxpossibilits:soitlecourantpasseetdanscecascelaquivautunevaleurdeun (1), soit le courant ne passe pas, et dans ce cas cest la valeur zro (0) qui est retenue. Cestdu binaire (qui ne prendquedeuxvaleurs).Uneunitbinairesappelleun bit(binarydigit).CemotatinventparClaudeShannon en1948. Commeilyaplusieurspistessurlescircuits,plusieursvaleurs0et1,doncplusieursbits,circulentenmmetemps. Enassociantcesvaleurs,onobtientdesvaleursplusgrandes.Enpassantdesdonnessurunfil,lavaleurmaximale estde1.Sionprenddeuxfils,soitdeuxbits,lavaleurmaximaleenbinaireest11,soit3endcimal.Pourquoi?Voici unedmonstrationpartapes:

CourantFil1
Nepassepas Nepassepas Passe Passe

CourantFil2
Nepassepas Passe Nepassepas Passe

Binaire
00 01 10 11

Dcimal
0 1 2 3

Une analogie fort ancienne (en informatique, ancien peut signifier un laps de temps trs court), des annes 1980, expliquait le fonctionnement des nombres binaires en associant des fils transportant du courant des ampoules lectriques. Chaque ampoule reprsente une valeur. Si le courant passe, lampoule sallume et prend la valeur associe. Lebinaire,commesonnomlindique,utiliseunebasedeux(2)toutcommeledcimalutiliseunebasedix(10).En dcimal,touslesnombrespeuventtrereprsentslaidedepuissancesde10.Prenezlenombre1234: 1*103+2*102+3*101+4*100 =1234 Lunitestreprsentepar10 0 ,ladizainepar101 ,lacentainepar102 ,etainsidesuite.Pourconvertirlebinaireen unevaleurdcimalepluslisible,ilfaututiliserlespuissancesde2,lapluspetitevaleurtantlaplusdroiteetest appele bit de poids faible, la plus grande la plus gauche et est appele bit de poids fort. Dans lexemple prcdent,lavaleurbinaire11peuttreconvertieainsi: 1*21+1*20 =21 +20 =2+1=3 Les informaticiens et mathmaticiens utilisent une notation particulire en indice (nombres en retrait bas) pour indiquerdesconversions: 11 (2) =3(10) Voiciundernierexempleavecunevaleurbinairecodesur8bits.Quelleestlaplusgrandevaleurdcimalequipeut trecodeavec8bits? 2 7 +26 +25 +24 +23 +22 +21 +20 =128+64+32+16+8+4+2+1=255 Donc 11111111 (2) =255(10)

Soit256valeurspossiblesde0(zro)255,cequipeuttreplussimplementcalculpar2n ,soitdeuxpuissancen,n tantlenombredebitscontenusdanslavaleurbinaire.Laplusgrandevaleurconvertieendcimalestdonc: 2 n 1 Il est possible de convertir du dcimal en binaire avec des divisions successives : on divise les rsultats sans la virgulesuccessivementpardeux.Lersultatbinaireseralajuxtapositiondesrestes(0ou1)saufpourledernier.Par exempleaveclenombre183:
q

183/2=91,reste1 91/2=45,reste1 45/2=22,reste1 22/2=11,reste0

- 4-

ENI Editions - All rigths reserved

11/2=5,reste1 5/2=2,reste1 2/2=1,reste0 Onremontedudernier:10110111

Conversiondcimaleenbinaire Cestdoncenbinairequesontreprsentestouteslesvaleursquunordinateurmanipule.Cestvalabletantpourles donnes (numriques ou texte) que pour les instructions destination du microprocesseur. Un nombre binaire correspondrauneinstruction.Parexemplesurunmicroprocesseurx86(IntelouAMD),01110100estlinstructionje (jump if equal), ou encore la ligne 10110000 01100001 qui signifiemov $0x61, %al (placer la valeur hexadcimale 0x61dansleregistreAL). Lesordinateursdudbutdesannes2000saventmanipulerdesnombressur64bitsor2 64 estgal18446744 073709551616soitplusde18milliardsdemilliards! Lide dutiliser deux valeurs pour encoder dautres valeurs remonte Francis Bacon. En 1623, il cherche une mthode stganographique pour pouvoir crypter un texte compos des lettres de lalphabet. Il remarque quun assemblage de deux lettres groupes par cinq permet de coder lensemble de lalphabet. Il appelle cet alphabet "bilitre".Le"a"taitreprsentpar"AAAAA",le"B"par"AAAAB",jusquau"Z","BABBB".Lalphabetdelpoque,le latin,contenaitvingtquatrelettres,le"j"seconfondantavecle"i"etle"u"avecle"v".

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

ENI Editions - All rigths reserved

- 5-

c.Lhexadcimal
Sivousreprenezlexempledunevaleurbinairecodesur64bits,ilfaut640ou1pourladcrire: 1111111111111111111111111111111111111111111111111111111111111111 Endcimalilfautvingtchiffres:18446744073709551616 a prend beaucoup de place et cest difficile manipuler. Puisquil existe une base 10 (dcimal) et une base 2 (binaire),pourquoinepasprendreunebaseplusleve,multiplede2,pourrduirelalongueuretlamanipulationde cesnombres?Cestainsiqueninformatiqueilestdusagedutiliserlabase16,appelehexadcimale. Une base hexadcimale permet de coder les valeurs de 0 15. Si de 0 9 on utilise les valeurs dcimales correspondantes,audessusilfaututiliserdeslettresdelalphabet,deA(10)F(15). Commentpasserdubinairelhexadcimal?Cecirevientrpondrelaquestion"Combienfautildebitsdansun nombrebinairepourcoder16valeurs?"24 =16.Ilfautdonc4bits.Letableausuivantrsumelesconversions. Dcimal Hexa Binaire 0 0 0 1 1 1 2 2 10 3 3 11 4 4 100 5 5 101 6 6 110 7 7 111 8 8 1000 9 9 1001 10 A 1010

Dcimal Hexa Binaire

11 B 1011

12 C 1100

13 D 1101

14 E 1110

15 F 1111

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

dudcimallhexadcimal Si vous prenez la valeur maximale en 64 bits, cela donne FFFFFFFFFFFFFFFF soit 16 caractres. Un informaticien exercestquasimentcapabledeconvertirlavoledelhexadcimalendcimal.Prenezlavaleur8Csoit10001100 enbinaire.LeCvaut12. 8*16+12=140 Sans aller plus loin, sachez que les bases 2, 10 et 16 ne sont pas les seules. Sur certaines machines et certains systmesdexploitation,ilestcourantdutiliserunebase8pourdesvaleursnencessitantquetroisbitspourtre reprsente.Sommetoute,tantquilresteassezdesymboles,riennempcheraitdavoirunebase30!

- 6-

ENI Editions - All rigths reserved

Lalgorithmique
1.Programmer,cestunart
Pourobtenirunrsultatdonn,ilfautgnralementsuivreunemthode,unecertainelogique.Sauftreungrand ptissierdontlasciencedesmlangesdesingrdientsestinne(oulefruitdunelonguepratique),vousnobtiendrez jamaisundlicieuxgteauauchocolatmmesivousdisposezdesmeilleursingrdientsetaccessoiresdecuisson,si vousneconnaissezpaslesbonnesproportions,lordredanslesquelsajouterlesingrdients,letempsdecuisson,la temprature:bref,larecette.Demme,sansformationdemcanicienousansladocumentationtechniquedumoteur devotrevhicule,inutiledevouslancerdansunchangementdejointdeculasse:cestlacasseassure. Il en est de mme de la programmation. Il existe plusieurs langages de programmation trs simples, extrmement simples parfois, qui peuvent donner un temps lillusion que vous savez programmer. En entreprise mme, certains employssontbombardsdveloppeurspourleursquelquesconnaissancesconfusesdeVisualBasic,deDelphioude Windev. Le rsultat risque dtre catastrophique. Les publicits sont allchantes mais trompeuses. Les bons programmeurs, y compris les autodidactes, ont tous un moment ou un autre eu affaire avec les algorithmes, car il existe en programmation une multitude de moyens darriver un rsultat, mais trs peu pour obtenir le meilleur rsultat possible, ce qui explique pourquoi beaucoup de programmes ayant la mme fonction, se ressemblent (au niveaudelaprogrammation)alorsquecenesontpaslesmmesprogrammeursquilesontdvelopps.Lesdbutants qui se lancent dans des projets de programmation audacieux se retrouvent parfois bloqus, ne matrisant pas une technique particulire de logique de programmation. Certains abandonnent, dautres trouvent un moyen de contournement (souvent peu reluisant). Les derniers liront peuttre un livre dalgorithmique comme celuici, qui dfautdedonnerunesolutioncomplteleurproblme,leurfourniralesbasesetlestechniquespouravancer. Les ordinateurs personnels du dbut des annes 1980 taient tous livrs soit avec un langage BASIC inclus directement dans la machine (en ROM), soit sur une cartouche, cassette ou disquette annexe. Le Basic de Microsoft (Qbasic,Quickbasic)taitlivravecleDOSduPC.LesAmstradavaientlebasicLocomotive,lesAtariSTlAtariBasicet surtout le GFA Basic, un langage de grande classe, etc. Une gnration complte dutilisateurs sest lance dans la programmationlaidedeceslangagesetdeladocumentationfourniequibiensouventfournissaitnonseulementles rfrencesdulangagemaisaussilesmthodesdebasedeprogrammation.Avecplusoumoinsdesuccs.Lersultat taitsouventuninfmebidouillage,maisquimarchait. Orlebutnestpasqueleprogrammefonctionne,maisquilfonctionneviteetbien,breflemieuxpossible.Lemeilleur ordinateuraumondeetlemeilleurlangageaumondenevousyaiderontpas.

2.Dfinition:Lalgorithmeestunerecette
Avezvous dj eu loccasion de programmer un magntoscope (en voie de disparition) ou un enregistreur de dvd ? Quavezvousfaitlapremirefoisquevousavezallumvotrepostedetlvisionpourrglerlarceptiondeschanes? Nuldoutequevousavezouvertlemodedemploietsuivilasquencedinstructionsindique:appuyersurlatouche Menudelatlcommande,sedplacersurEnregistrementetappuyersurOK,sedplacersurunelignepuisindiquer lachane,lheure,etc. Avezvous dj eu loccasion de faire la cuisine ? Pour un gteau, vous tesvous lanc directement ou avezvous ouvert un livre pour rcuprer la liste et la quantit de chaque ingrdient, pour suivre la recette : faites fondre le chocolatetlebeurredansunecasserolefeudoux,retirezlacasseroledufeu,incorporezlesjaunesdoeuf,puisle sucreetlafarine,battezlesoeufsenneigepuisincorporezdoucementdanslemlange,etc. Danslesdeuxcas,flicitations!Vousavezdroulvotrepremieralgorithme! Une dfinition simple dun algorithme : cest une suite dinstructions qui, quand elles sont excutes correctement aboutissentaursultatattendu.Cestunnoncdansunlangageclair,biendfinietordonnquipermetdersoudre unproblme,leplussouventparcalcul.CettedfinitionestrapprocherdufonctionnementdelamachinedeTuring quiavantlapparitiondelordinateurutilisaitcettedmarchepourrsoudredenombreuxproblmes.Lalgorithmeest doncunerecettepourquunordinateurpuissedonnerunrsultatdonn. LemotalgorithmevientdunomdumathmaticienAlKhuwarizmi(MuhammadibnMsalKhuwrizm),savantpersan duIX m e sicle,auteurdunouvrageappel"Latranspositionetlarduction",Aljabrwalmuqbalah.LemotAljabr deviendraalgbre,lenomdelauteurseralatinisenAlgoritmi,quiseralabasedumotalgorithme.

3.Pourquoiutiliserunalgorithme?
Lalgorithmedcritformellementcequedoitfairelordinateurpourarriverunbutbienprcis.Cesontlesinstructions quon doit lui donner. Ces instructions sont souvent dcrites dans un langage clair et comprhensible par ltre humain:fairececi,fairecelasilersultatatellevaleur,etainsidesuite. Unalgorithmebientablietquifonctionne(toutaumoinsenthorie)pourratredirectementrcritdansunlangage

ENI Editions - All rigths reserved

- 1-

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:
q

soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela), soitdefaireunschmaexplicatifavecdessymboles.

Dans la pratique, les deux formes sont possibles. Mais un dessin ne vautil pas un long discours ? Il est dailleurs courant de commencer par un schma, puis quand celuici devient trop complexe, de passer un texte explicatif (la recette). Danslesdeuxcas,lasyntaxepourletexteoulessymbolespourlesschmasdoiventrpondredesrglesstrictes, voirenormalises.Ilfautquechacunconnaisseleursignificationetsachedonclesinterprter.Cestpouraquetoutes lesreprsentationsalgorithmiquessuiventpeudechosesprslemmeformalisme.Silesschmassontpossibles,ils sontcependantmoinsutilissquelesalgorithmessousformetextuelle.Cestquesivousconstruisezunalgorithme,il est plus facile de le corriger quand il est saisi au clavier sous forme de texte que lorsquil est dessin sous forme dorganigrammedansunlogicieldedessinvectorieloudeprsentation.

a.Lareprsentationgraphique
Lesalgorithmespeuventtreconstruitslaidedesymbolesdorganigrammes.Lestudiantseninformatique(BTS, DUT) connaissent bien cette tablette en plastique permettant de dessiner des organigrammes. Ils lutilisent en algorithmique,enbasededonnes,enmthodeMerise,etc(danschaquecaslasignificationestdiffrente).Voiciun exemple dalgorithme sous forme dorganigramme qui simule un lanc de d et qui demande une personne de devinerlavaleur.

- 2-

ENI Editions - All rigths reserved

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:
q

1retape:lancerled 2metape:saisirunevaleur 3me tape : si la valeur saisie est diffrente de la valeur du d, retourner la troisime tape, sinon continuer 4metape:afficher"bravo".

Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprend

ENI Editions - All rigths reserved

- 3-

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:
q

Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME". Unezonededclarationdesdonnesutilisesparleprogrammes:variables,constantes,types,structures, tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuretmesuredes diffrentschapitres.Cettezonecommenceparlemot"VAR". Le programme luimme, cestdire les divers traitements. Les instructions du programme sont encadres parlesmots"DEBUT"et"FIN".Ilvousestconseill,pourplusdeclartetdelisibilit,dindenterlesdiverses lignes(delesdcalerlesunesparrapportauxautres)laidedestouchesdetabulation.Leprogrammepeut tredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance. Lescommentaires:cestuntextelibrequipeuttretendusurplusieurslignesetencadrparlessquences de caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvez uniquement la commencerparlescaractres"//". Unedernirepartie,oupluttpremirecarlorsquelleestprsenteellesesitueavanttouteslesautres,peut tre constitue des sousprogrammes, semblants de programmes complets appels par le programme principal.Cessousprogrammes,appelsprocduresoufonctions,fontlobjetdunchapitrecomplet.

5.Lacomplexit
Lexemple du lanc de d est un algorithme trs simple, court, concis et rapide. Ce nest pas le cas de tous les algorithmes.Certainssontcomplexesetletraitementrsultantpeutncessiterbeaucoupdetempsetderessources delamachine.Cestcequonappellele"cot"delalgorithme,etilestcalculable.Siunalgorithmeest"gourmand"son cotserapluslev.Ilexistecertainscasoilestpossibledutiliserplusieursalgorithmespoureffectuerunemme tche,commepourtrierleslmentsduntableaudevaleurs.Certainsalgorithmesservlenttrepluscoteuxque dautres,passuncertainnombredlmentstrier.Lecotdunalgorithmerefltesacomplexitouentermeplus simplesonefficacit.Lesmots"cot","complexit"et"efficacit"refltenticilammedfinition.Plusunalgorithmeest complexe, plus il est coteux et moins il est efficace. Le calcul de cette complexit a comme rsultat une quation mathmatiquequonrduitgnralementensuiteunenotiondordregnral. LacomplexitestnotO(f(n))oleO(grandO)veutdire"dordre"etfestlafonctionmathmatiquedenquiestla quantitdinformationsmanipuledanslalgorithme.Voiciunexemplepourmieuxcomprendre:soitunalgorithmequi compte de 1 n et qui affiche les valeurs correspondantes. Dans la pratique, vous allez utiliser une boucle (voir chapitrecorrespondant)allantde1n.Ilfaudrafairenpassagespourtoutafficheretdoncvousallermanipulernfois linformation.Lafonctionmathmatiquedonnantlecotseraalorsf(n)=n.Lacomplexitestalorslinaireetvousla noterezO(n).
- 4 ENI Editions - All rigths reserved

Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexempleune tabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvousobtenezn fois n boucles, donc n2 boucles. La complexit est donc f(n)= n2 , et vous la noterez O(n 2 ). Le cot de lalgorithme augmenteaucarrdunombredinformations. Sivousrajoutezenplusunequelconqueoprationdanslapremireboucle,cetteoprationaaussiuncotquevous pouvez tenter de prendre en compte. Si vous ajoutez une multiplication et que celleci a un cot de 1, alors la complexitfinaleestden*(n+1)soitn2 +n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetque vous comparez avec la courbe simple n2 , vous remarquerez que le rajout devient ngligeable. Au final, lalgorithme conserveunecomplexitO(n2 ). Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies":
q

O(1):complexitconstante O(log(n)):complexitlogarithmique O(n):complexitlinaire O(n.log(n)):complexitquasilinaire O(n2 ):complexitquadratique O(n3 ):complexitcubique O(np ):complexitpolynomiale O(nlog(n) ):complexitquasipolynomiale O(2n ):complexitexponentielle O(n!):complexitfactorielle

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

ENI Editions - All rigths reserved

- 5-

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

- 6-

ENI Editions - All rigths reserved

Leslangagesdimplmentation
1.Quellangage?
Ilexisteplusieurscentainesdelangagesdeprogrammationsiontientcomptedetouteslesvariantespossiblesdun mmelangage.Commevousavezpulelireaudbutdecechapitre,lordinateurnecomprendnativementquunseul langage, le langage machine. Croyezvous vraiment que vous allez implmenter le programme de lancer de d directement en binaire (ou mme en hexadcimal) ? Le choix du langage mrite une petite dmonstration. On a coutumedanslemilieudelinformatique,detesterunlangageenluifaisantafficherunmessagepourdirebonjour,en loccurrencelefameuxHelloworld!.Voicicommentaffichercetextedansdiverslangages: Enassembleurx86sousDOS Cseg segment assume cs:cseg, ds:cseg org 100h main proc jmp debut mess db Hello world!$ debut: mov dx, offset mess mov ah, 9 int 21h ret main endp cseg ends end main

EnshellUnix echo "Hello world!"

EnBasicoriginel 10 PRINT "Hello world!" 20 END

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

EnlangageC #include <stdio.h> int main(int argc, char **argv) { printf("Hello world!\n"); return 0; }

EnlangageC++ #include <iostream>


ENI Editions - All rigths reserved - 1-

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

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

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

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

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

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

a.Hautniveau,basniveau
Puisquilexistedescentainesdelangagesdeprogrammation,lequelchoisirpourimplmentervosalgorithmes?Ilny apasderponsesimplecettequestion.Chaquelangageatgnralementconupourdesusagesdiffrentset souventspcifiques,bienquenvoluantlaplupartdeslangagesditsdehautniveausoientdevenusdeplusenplus gnralistes. Il existe plusieurs classifications des langages. La plus ancienne dpend de laffinit du langage par rapportlamachine.Onparlealorsduniveaudulangage.Ilestcourantdeparlerdunlangagedebasniveauoude niveau zro (0) quand celuici ncessite des connaissances approfondies du fonctionnement de votre ordinateur : mcanismes de gestion de la mmoire, instructions du microprocesseur, etc. Un exemple de langage de trs bas niveau est le langage machine sous sa forme binaire, ou de le la programmation en assembleur o ces mmes valeurs binaires sont reprsentes par des mots (mnmoniques) en anglais. Vu que les programmes sont directement comprhensibles par le matriel, vos programmes seraient alors les plus rapides. Il est tout fait possible de programmer de grosses applications en assembleur (et notamment des jeux), ctait dailleurs trs courantjusqulapparitiondesmachinestrsrapidesoleurvitesseacompensuneplusfaiblevitessedexcution dunlangageplusvolucommeleC,maisaveclavantageduneprogrammationplussimple. lopposdeslangagesdebasniveausetrouventleslangagesdehautniveau.Ilnyapasdchelleprcise.Vous pourrez trouver dans quelques sources des niveaux allant de 0 4, mais les langages voluant tellement vite, certainslangagesquitaientconsidrsdehautniveaucommeleCsesontvusdclasssverslebas!Unlangage dehautniveaupermetdefaireuneabstractionpresquecompltedufonctionnementinternedevotreordinateur.Le langage(oupluttsoncompilateurousoninterprteur)sechargeradeconvertirvosordressimples(enapparence) en langage de bas niveau (en langage machine). Ne vous fiez pas aux apparences : laffichage dune bote de

- 2-

ENI Editions - All rigths reserved

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:
q

gnralisteouspcialis objetouprocdural typounontyp(cfchapitresurlesvariables) interprtoucompil etc

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

c.Compilouinterprt
Uneautredistinctionprendreencompteestladiffrenceentreunlangageinterprtetunlangagecompil.Un langage est dit compil quand le programme source sous forme de texte est tout dabordluettraitparunautre programme appel compilateur qui le convertit en langage machine directement comprhensible par lordinateur. Voustapezvotreprogramme,vouslancezlacommandedecompilationetenfinvousobtenezunfichierexcutable (un.exesousWindowsparexemple)quevouspouvezlecaschantlancercommenimportequelautreprogramme enlangagemachine.Unprogrammeenlangageinterprtncessitepourfonctionneruninterprte(ouinterprteur) quiestunautreprogrammequivatraduiredirectement,aufuretmesuredesonexcution,votreprogrammeen langagemachine,unpeucommeunvraiinterprtequidansuninterviewtraduitsimultanmentlanglaisenfranais. Le programme est souvent un fichier texte, et linterprte analyse la syntaxe de celuici avant de le drouler dynamiquement.Unprogrammeinterprtserapluslentquunlangagecompilcausedelaconversiondynamique duprogramme,alorsquecettetapeestdjeffectulavanceavecunlangagecompil.Aucontraire,lacorrection deserreursestplussimpleavecunlangageinterprt.Linterprtevavitevousindiqueraucoursdelexcutiono se trouve lerreur de syntaxe (mais pas de logique) lorsquil va la rencontrer, quelle ligne, linstruction en cause, ventuellementuneaidesupplmentaire.Alorsquavecuncompilateur,cestaumomentdelacompilation,souvent longue, quapparaissent les erreurs. Une fois compil, dautres erreurs plus complexes comme les fuites mmoire peuvent apparatre mais il devient difficile den dterminer lorigine (il faut alors faire appel dautresprogrammes spciauxappelsdbuggers).

ENI Editions - All rigths reserved

- 3-

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

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

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

ENI Editions - All rigths reserved

- 5-

Ilestgratuit. Ilestdisponiblepourbeaucoupdemachinesetdematriels. ToutprogrammeJavafonctionnerasurtouteslesmachinesvirtuelles,sansmodification.Ilestindpendantde laplateforme. IlexistedenombreuxditeursetIDE(IntegratedDevelopmentEnvironment)supportantoutantspcialiss pourJava. Ilestutilispardesmillionsdepersonnes. Il est rput sr, ne pouvant thoriquement pas accder au systme dexploitation ou la machine elle mmesansautorisationexplicite. Il dispose dune immense collection de bibliothques, rpondant presque tous les besoins. Il est mme possibledeprogrammerdesjeuxen3Ddetypecommercial. Il est lun des piliers du web grce aux fameuses applets, aux servlets mais permet la programmation dapplicationstrscompltes. Il fait totalement abstraction du matriel pour se concentrer sur la program mation fonctionnelle. Par exemple, vous navez absolument pas vous proccuper de la gestion de la mmoire (la plaie des programmeurs),Javalefaitpourvous. IlestdrivdulangageC++,sanssescomplications.UnprogrammeurCetC++peutfacilementcomprendre Java,demmequunprogrammeurJavapourraapprendreplusfacilementleC++. Ilestobjet,notionquiserasommairementtudieenfindouvrage. Il peut fonctionner tant en mode texte (depuis une console MSDOS ou un shell MacOS/Unix) quen mode graphique. Ilestrapide,grceauprincipeduJIToudecompilationlavole.

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

b.UnpremierprogrammeJava
LepremierprogrammeJavaquevousalleztaper,compileretlancerestlefameux"HelloWorld"dontlalgorithmene mrite videmment pas dtre expliqu, vu que le programme se contente dun simple affichage. Le code Java rsultantestlesuivant. public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } }

- 6-

ENI Editions - All rigths reserved

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.
q

Laclasseestllmentfondamentalcontenanttouslesautreslmentsdeprogrammation.Cestellequiva contenirlesdonnesmanipulesparleprogrammeetlesinstructionspourlesmanipuler.Onappelleaussi les donnes variables ou attributs. Dans ce livre, vous rencontrerez principalement le premier, variable, qui sera expliqu plus bas. On appelle les blocs dinstructions qui manipulent les donnes des fonctionsoumthodes.Lencore,cestpluttfonctionquiseraprfrdanscelivre. La mthode dcrit les traitements informatiques de la classe. Elle sappelle aussi fonction ou fonction membre. La fonction est compose dun nom qui dcrit gnralement ce quelle fait, dune liste de valeurs quonpeutluipasserquonappelledesargumentsouparamtres(lensemblesappellelentte)etdunbloc dinstructionsquicontientleprogrammeouunboutdeprogramme.

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

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

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

ENI Editions - All rigths reserved

- 7-

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. U nevariableestunnomoutiquettedonnunevaleur(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:
q

a var titre Total Somme_globale

Quandvousprogrammerez,vousveillerezvousrenseignersurlesconventionsutilisesparlelangagepournommer vosvariables:certainsutilisentdessyntaxestrsparticulires,dautressontbeaucoupmoinsstricts. Lavariablenestquunoutilpourlesalgorithmesetleprogrammeur,afinquilpuissesereprsenter"danslerel"les donnes quil manipule. Si vous modifiez le nom "Somme_globale" par "Pomme_frite" partout dans lalgorithme ou le programme,lavariablereprsenteratoujourslammedonne,leprogrammefonctionneralidentique,maiscesera plus difficile pour vous de faire le rapprochement. De mme la case mmoire ne porte pas rellement un nom ou tiquette. Chaque case est plutt rfrence par une adresse, ellemme exprime par une valeur binaire. Cest le compilateuroulinterprteurquiferalaconversiondesnomsverslesadressesdescasesmmoirevotreplace. Sivoussouhaitezvous"amuser"manipulerdirectementdesadressesmmoirenonpasparleurnommaisparleur adresse, quelques langages le permettent. Directement, vous pouvez apprendre lassembleur(maisvousdevreztre trscourageuxetpatient),sinondeslangagescommeleCouleC++permettentlamanipulationviades"pointeurs": ce sont des tiquettes qui sont accoles ladresse de la case mmoire, contrairement aux noms des variables classiques qui sont associes la valeur que la case contient. Comme en rgle gnrale le nom dune variable reprsentetantladressequelavaleur(lavaleuratelleadressemmoire),cestsourcedebeaucoupdamusement(!) pourleprogrammeur...

ENI Editions - All rigths reserved

- 1-

Lavariable:unetiquetteassocieunevaleurenmmoire

2.Dclaration
Pourexister,unevariabledoittredclare,cestdirequevousdevezindiqueraudbutdelalgorithmecommentelle sappelleetcequelledoitcontenir.Eneffet,pourquelalgorithmeutilisevotrevariable,ildoitdjsavoirquelleexiste et ce quelledoitcontenir.Ilnesagitpasicidedfinirlavaleurdelavariable,vouspourrezlefairedanslasuitede lalgorithmeenluiaffectantunevaleur.Ilsagitdedonnersonnometdeprciserletypedevaleurquellepeutcontenir. Lesvariablessedclarentaudbutdelalgorithme,avantleprogrammeluimmemaisaprslemot"VAR". VAR Variable1 :type Variable2,variable3 :type ...

3.Lestypes
Unecasemmoirecontientgnralementunoctet,cestdireunevaleurde0255.Maisunevariablepeuttrsbien contenirlenombre214862,lerel3,1415926,letexte"bonjour",etc.Doncunevariablenestpasuniquementdfinie parlavaleurquellecontient,maisaussiparlaplacequecettevaleuroccupeetparlamaniredontlalgorithmevala reprsenteretlutiliser:nombre,texte,etc.Cestletypedelavariable. Que pouvezvous mettre comme valeur dans une variable ? En principe, tout ce que vous voulez. Cependant, vous deveztoutdemmeprciserqueltypelavaleurreprsente.Estceunnombre? Sioui,unentier(sansvirgule)ouunrel(avecvirgule)?Estcedutexte?Estceuntableau?Etainsidesuite.Vous entendrez parfois parler du "codage" de la variable : selon le type et la taille de la valeur, celleci est encode de manirediffrentedanslammoire,utilisantplusdecases.

a.Lesnombres
Placerdesnombresdanslavariableestleplusvident,etsouventlepluscourant.Unecasemmoirepeutcontenir unoctet,cestdireunevaleurcompriseentre0et255(28 1).Maissielledoitcontenirunevaleurngative?Alors surles8bits,unserarservausigne,etlacasemmoirepourracontenirdesvaleursde127+128.Onditalors quelavariableest"signe":ellepeutcontenirdesvaleurspositivesetdesvaleursngatives.Seulement,8bitsne sontpassuffisantspourdesgrandesvaleurs.Cestpourquoilesnombrespeuventtreplacsdansdeuxcases(16 bits),quatrecases(32bits)ouplus. Silordinateurestbienpluslaiseetbienplusrapideavecdesnombresentiers,ilsaitaussimanipulerdesnombres rels, bien que dans ce cas leur codage en binaire soit radicalement diffrent. Vous trouverez plus bas toutes les explications ncessaires pour comprendre comment lordinateur se reprsente exactement les nombres ngatifs et rels:cenestpassivident! Aufinal,lordinateurestcapabledegrerdesnombresdelongueurvariable,signsounon,entiersourels.Suivant le langage de programmation, les types portent des noms diffrents. Cependant le C et ses drivs proposent les typessuivants.AttentioncarJavafaitladiffrenceentreletypeBytedeunoctetetletypeCharquiprenddeuxoctets causeduformatdecodagedescaractresenUnicode.

- 2-

ENI Editions - All rigths reserved

Typenumrique Byte(char) Entiersimplesign(int) Entiersimplenonsign Entierlongsign(long) Entierlongnonsign

Plagedevaleurspossibles 0255 3276832767 065535 21474836482147483647 04294967295 Ngatif:3,40x1038 1,40x1045 Positif:1,40x1045 3,40x1038

Relsimpleprcision(float)

Reldoubleprcision(double)

Ngatif:1,79x10308 4,94x10324 Positif:4,94x10324 1,79x10308

Vousdevezchoisirqueltypenumriqueutiliserselonvosbesoins.Lavoiedelafacilitconsisteprendreletypele plus lev comme un entier long ou pire, un rel en double prcision afin dtre tranquille. En informatique comme dans beaucoup de mtiers, il faut choisir la formule la plus conomique. On parle ici dconomie de moyens. Quun programme donne le rsultat attendu nest pas suffisant, il faut aussi quil le fasse vite, bien et en consommant le moins de ressources possibles. Le fait de disposer de plusieurs gigaoctets nest pas un critre suffisant pour programmernimportecomment.Unelistedemillevaleurscomprisesentre0et100cotera1000octets(soitpas loin de 1 ko) dans un type byte, mais 8000 octets (pas loin de 8 ko) soit 8 fois plus dans une type rel double prcision. Cela peut sembler faible, mais non seulement lordinateur doit manipuler 8 cases mmoire au lieu dune, mais en plus il doit en permanence convertir une valeur quil pense tre un nombre rel avec des chiffres aprs la virguleenentier,alorsquecestdjlecas!Quandvousverrezplusbaslaformulemathmatiquencessaire,vous vousrendrezcomptedugchis! Utilisezlestypesquivontbienaveclesvaleursquivontbien.Enalgorithmique,cestbienplussimple.Riennevous empchedeprciserquevousmanipulezdesentiersoudesrels,maisvouspouvezaussiindiquertoutsimplement que vous utilisez des variables contenant des valeurs numriques avec le pseudotype "numrique". Vous devrez cependant tre plus circonspect quand vous convertirez votre algorithme en vrai langage de programmation. Dune maniregnrale,deuxtypesnumriquessontutilissenalgorithmique:
q

Lesentiers:nombressansvirgule,ngatifsoupositifs Lesrels:nombresvirgule,positifsoungatifs.

Lesvariablessedclarenttoutesaudbutdelalgorithme.Sidurantlardactiondeceluicivousremarquezquevous enavezbesoindautres,vouslesrajouterezaudbut. VAR montant:rel somme,moyenne:rels qte :entier Pour les variables contenant des nombres rels, ces derniers scrivent avec une vraie virgule comme en franais "3,14" ou avec le point dcimal, cependant dans les langages de programmation, ce sera bien souvent le point qui serautilis"3.14". EnJava,lestypesportentlesmmesnoms,enanglais,destypessitusdansletableauprcdent,maisnedispose pasdetypesnonsigns.Autrementdit,unevariablenumriquepeutcontenirdesnombrespositifsoungatifs,mais lintervalledevaleurssetrouve"unpeu"rduite.Leseultypenonsignestletypechar(letypecaractre)pourdes raisonsvidentesquevousverrezplusbas. Dans lexemple suivant, tous les types numriques classiques de Java sont dclars. Les noms des variables sont assezparlantspourlescomprendre.Puischaquevariablesevoitassignelavaleurmaximalequellepeutsupporter. Ceprogrammeamnetroisremarques:
q

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

ENI Editions - All rigths reserved

- 3-

Javaconsidrelesvaleursentiressaisiescommetant32bitspardfaut.Pourunentiersur64bits,ilfaut rajouterun"L"lafin,quisignifiequecettevaleurestunentierlong. LaffichagedelavaleurdePIesttronqu,rsultatdelaprcisionappliquesurunrel64bitsetparJava.

class chap2_types { public static void main(String[] args) { byte entier8bits; short entier16bits; int entier32bits; long entier64bits; float reel32bits; double reel64bits; entier8bits=127; entier16bits=32767; entier32bits=2147483647; entier64bits=9223372036854775807L; reel32bits=3.1415927f; reel64bits=3.1415926535897932384626433832795028841971d; System.out.println(reel64bits); System.out.println(entier64bits); } }

b.Autrestypesnumriques
Ilexistedautrestypesnumriquesmoinsutiliss,toutaumoinssurlesordinateurspersonnelsoudansdeslangages deprogrammationclassiques,maisbienplussurdesmoyensougrossystmesoudansdesbasesdedonnes.Le systmeBCDbinarycodeddecimalpourdcimalcodenbinaireestutilisprincipalementenlectroniquecarilest assezsimplemettreen uvre.EnBCD,chaquechiffreestcodsur4bits:0000(2) =0(10) ,0001(2) =1(10) ,0010(2) =2
(10) , 0011(2) =3(10) ,

et ainsi de suite jusqu 1001 (2) =9(10) . Comme un ordinateur ne manipule que des octets

(compossde8bits),ilexistedeuxmthodespourcoderdesnombresenBCD:
q

soitnemettrequunchiffreparoctetetcomplterlerestequepardes1oudes0,"EBCDIC" soitmettredeuxchiffresparoctet,etrajouterunsignelafin,"packedBCD".

Parexemplelenombre237: 11110010 11110011 11110111 en EBCDIC 00100011 01111100 en Packed BCD (le 1100 final est le +, 1101 pour le -) Vous rencontrerez peuttre un jour le type "montaire" pour grer les sommes de mme nom et notamment les rgles darrondi, mais aussi et surtout une grande quantit de types permettant de grer les dates, couramment exprimssouslenom"date".LordinateurdetypePCstockelesdatesdediversesmanires,lapluscommunetant sous la forme dun timestamp, une valeur signifiant le temps coul depuis une date prcise. Ce timestamp est souventceluidusystmeUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuit UTC,exactement.Cestdoncunentier,etlelangagedoitfournirdesinstructionspourconvertircettevaleurendate relle.

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

- 4-

ENI Editions - All rigths reserved

Quelle place occupe une chane de caractre ? En principe, un caractre occupe un octet. chaque valeur comprise entre 0 et 255 est associ un caractre. Cest le principe de lASCII "American Standard Code for Information Interchange", norme de codage des caractres la plus connue et la plus utilise. La table ASCII, invente par les amricains, contient lorigine les 128 caractres utiles pour crire en anglais. Par dfaut elle ne contient pas les accents.OrlatableASCIIpeutcontenir256caractres.Les128autres(huitimebitun)contiennentdescaractres semigraphiques et des caractres spcifiques certaines langues, typiquement le franais, pour les caractres accentus.Onparlealorsdepagedecodeoudecharset.Cespagesfontlobjetdunenormalisation,parexemplela normeISO885915quiestlapagedEuropedelOuest,aveclecaractredeleuro"".Danslaplupartdeslangages cecodagesurunoctetsuffitetainsiunechanedecaractresde50caractresoccupe50octets. Enpseudocodealgorithmique,leschanesdecaractressontplacesentreguillemetspourdeuxraisons: 1. viteruneambigutentrelesnombressousformedechanedecaractresetlesnombres auformatnumrique.Certainslangagesnefontcertespasdirectementladiffrence(cest selonlecontextedutilisation)maisavecdautrescestcatastrophique.Lasuitede caractres1,2,3reprsentetellelenombre123etstockeainsienmmoiresousforme binairedansunoctetdelammoire,oulachane"123"stockeainsienmmoiresous formedecodesASCII,soitunpourchaquecaractre?Lesguillemetsvitentleserreurs dinterprtations. 2. Nepasconfondrelenomdelavariableavecsoncontenu,notammentlorsduneaffectation. Ainsi,quandvousaffecterezunvaleurunevariable,sicelleciestentreguillemetsvouslui affecterezunechanedecaractres,sicestunnombre,ceseracenombre(sachantquele nomdunevariablenepeutpastreconstituuniquementdechiffres),etenfinsicenestni unechaneniunchiffre,cestunevariable.Danscecaslapremirevariablerecevracomme valeurcelledelasecondequiluiestaffecte.Nepasrespecterceprincipeestunecause derreurgraveetnanmoinscommune. Javadisposeduntypespcialpourleschanesdecaractresappel"String".Lexemplesuivantmontredeuxmoyens deplacerdutextedansunechane.Ilestpossibledelefairedsladclarationdelavariable(cestdailleurspossible directementpourlaplupartdestypes),soitensuiteparaffectation. class chap2_string1 { public static void main(String[] args) { String texte="Hello World !"; String text2; text2="Bonjour les amis"; System.out.println(texte); System.out.println(text2); } }

d.Letypeboolen
Pourdterminersiuneaffirmationestvraieoufausse,lordinateurdoitsebasersurlersultatdecetteaffirmation.En informatique, on emploie plus volontiers la notion dexpression et dvaluation de cette expression. Une expression peuttredcritecommetanttoutcequipeutfournirunevaleurquelordinateurpeutdterminer,stocker,valuer. Par exemple, laffirmation"a>b"selonlaquelleaestsuprieurb.Siavaut3etbvaut2,laffirmationestvraie.Si maintenantavaut1etbvaut2,laffirmationestfausse.Danslesdeuxcas"a>b"estuneexpressionquivautsoit vrai,soitfaux.Cestlecasleplussimple,maisaussilepluscourantetlepluspratiquecommevousleverrezlorsdes testsetdesconditions. Comment lordinateur dterminetil ce qui est vrai et faux ? Cest le rle, dans larchitecture de Von Neumann, de lUAL. Sous quelle forme lordinateur se reprsentetil ce qui est vrai ou faux ? Sous forme numrique, comme toujours.Toutcequiretourneunrsultatdiffrentdezro(0)estconsidrcommetantvrai,doncsilersultatvaut zro(0)alorsilseraconsidrcommefaux.Avantdeconsidrercettedfinitioncommeexacte,renseignezvoustout de mme car certains langages (comme linterprteur de commande Unix) font linverse ! Cependant dans des langagescommeJavaouleC,1estvrai,0estfaux. Pour reprsenter les valeurs vrai et faux, il suffit de deux chiffres, 0 et 1. Combien fautildeplacepourstockerces deuxvaleurs?Unseulbit!Enpratique,leslangagesgrentlesboolensdeplusieursmanires.Certainscrentdes "champs" de bits dans un mme octet, dautres utilisent un octet complet, etc. Cependant, plusieurs langages proposentletypeboolen,trspratique. Danslapratique,ceslangagesproposentdesconstantes(desvariablesquiprennentunevaleurunefoispourtoute) spcialespourreprsenterlesvaleursvraietfaux:
q

TRUEpourvrai FALSEpourfaux

ENI Editions - All rigths reserved

- 5-

Cesconstantespeuventmmetreutilisesdirectementpourvalueruneexpression.Telleexpressionestellevraie, telle autre estelle fausse ? Suivant le langage, il faudra faire attention si les constantes existent et sont en minusculesoumajuscules. VAR Test:boolen Java dispose aussi dun type spcial pour les boolens appel "Boolean". Comme la plus petite unit de stockage dune case mmoire est loctet, le boolen occupe un case donc un octet. Cependant il ne peut accepter que deux valeurs:trueetfalse.lexcution,lesvaleurs[trueetfalse]serontaffichesentouteslettres.Remarqueziciune nouvelle proprit : la dclaration des variables il est possible tout comme en pseudocode de mettre plusieurs variablesetdaffecteraussiplusieursvaleurs,ensparantlesvariablespardesvirgules. class chap2_boolean { public static void main(String[] args) { Boolean b1=true, b2=false, b3; b3=true; System.out.println(b1); System.out.println(b2); System.out.println(b3); } } IlnestpaspossibleenJavadeconvertirdirectementunboolenenentieretviceversa.

4.Affectation
a.Affectationdevaleurs
Dansleprogramme Pour donner une valeur une variable, il faut passer par un processus daffectation laide dun oprateur. En pseudocode,onutiliselesymboledaffectation.gauchedecesymbole,vousplacezlenomdelavariable, droitelavaleur.Voustrouverezaussidanscertainesreprsentationsalgorithmiquesle:=issuduPascal.Lesdeux sontquivalentsetutilisables(maisvitezdelesmlanger,poursyretrouver). Voiciquelquesexemplesdaffectationsenpseudocode. PROGRAMME AFFECTATION VAR a:entier b,c:rels titre:chane vrai:boolen DEBUT a10 b3,1415927 c12345 titre"ma premire affectation" vraiTRUE FIN VousavezvidemmentrencontrdanslesprogrammesJavaprcdentscommentaffecterunevaleurunevariable. Cest le signe "= " qui est utilis. Lemploi du signe "= " en pseudocodena pas la mme signification, ce que vous verrezunpeuplusloindanslesoprateursdecomparaison. Attentioncependantnepasvoustromperentreletypedelavariableetlavaleurquevousluiaffectez.Cestune causederreurfrquente,tantenpseudocodealgorithmiquequedansunvrailangage.Danscertainscasapourra marcher (dans le sens o lordinateur ne retournera pas forcment une erreur) mais le rsultat ne sera pas celui attendu.Considrezlexemple,pascorrect,suivant: PROGRAMME AFFECT2 VAR a:entier
- 6 ENI Editions - All rigths reserved

b:rel c:chane DEBUT b3,1415927 a3,1415927 c12345 FIN Lexcutiondecepseudocodeprovoquequelquessurprises,etdeserreurs.ToutdabordbreoitlavaleurdePI,et comme b est dclar en rel (pour lexemple, le type classique Numrique naurait pas t pertinent), cest correct. Puisareoitlammechose.Oraestunentier!Suivantleslangagesdeprogrammation,vousobtiendrezsoitune erreur,soitafonctionnera,maispasparfaitement.Lavariableatantunentier,ilsepeutqueanecontiennequela valeurentiredeb,soit3.Notezquecertainslangagesautorisentuneconversionexpliciteduntypeversunautre. On parle de transtypage. Quant la variable c, elle doit contenir une chane de caractres, dlimite par des guillemets,absentsici,cequiprovoqueraitprobablementuneerreur. LecodeJavasuivantnefonctionnepas.Sauriezvousdevinermaintenantpourquoi? class chap2_equal1 { public static void main(String[] args) { int i_a; double f_a; f_a=3.1415927; i_a=3.1415927; System.out.println(f_a); System.out.println(i_a); } } Voicilarponsedonneparlecompilateurjavac: chap2_equal1.java:7: possible loss of precision found : double required: int i_a=3.1415927; ^ 1 error Le transtypage en Java consiste indiquer entre parenthses avant la valeur affecter le type final de celleci. La valeurseraconvertie,sipossible,danscetypeavantdtreaffecte.Javanepermetpasdefairenimportequoietle transtypagedoitsuivreunecertainelogique(dugenre,onnepeutpasconvertirdirectementunechanedecaractres enentier).Demmeletranstypage,notammentverslebas(duntypedegrandetailleversunetaillerduite)risque de provoquer une perte de prcision, voire mme dun grand nombre dinformations. Dans cet exemple, f_a est explicitementconvertieenentier.Javanevadoncconserverquelapartieentiredef_aeti_acontiendra3. class chap2_equal2 { public static void main(String[] args) { int i_a; double f_a; f_a=3.1415927; i_a=(int)3.1415927; System.out.println(f_a); System.out.println(i_a); } } Cequiretourne: 3.1415927 3 Afindenepasvousfairetapersurlesdoigtsparvotreprofesseurdalgorithmique,prcisezlebontypedsledbut, etvitezlesaffectationsdouteuses. Dansladclaration Vousavezledroitdedonnerunevaleurinitialeoupardfautunevariablelorsdesadclaration.Danscecasvous devezutiliserloprateurdaffectationlorsdeladclaration.

ENI Editions - All rigths reserved

- 7-

PROGRAMME DECLARE2 VAR a10:entier b3.5,c8.2347:rels titre"Mon titre":chane vraiVRAI:boolen DEBUT Afficher a FIN Avec une valeur par dfaut, la variable dispose dj dun contenu ds son initialisation et peut tre directement utilise.CestlammechoseenJava: class chap4_init2 { public static void main(String[] args) { int i=1,cpt=2,resultat=3; System.out.println(i) ; } }

b.Affectationdevariables
Leprincipeestexactementlemmesaufquecettefoisvousnemettezpasdevaleurdroitemaisuneautrevariable, cequiapoureffetdaffecterlavariabledegauchelavaleurdelavariablededroite. PROGRAMME AFFECT3 VAR a,b:entiers DEBUT a10 ba FIN Lencore,vousprendrezbiensoindenepasmlangerlestorchonsetlesserviettesennaffectantpasdesvariables detypesincompatibles.Lexemplesuivantestvidemmentfaux. PROGRAMME AFFECT4 VAR a:entier b :rel DEBUT b3.1415927 ab FIN L encore, noubliez pas une ventuelle conversion dans un vrai langage et de dclarer correctement vos variables danslebontype.LexempleJavasuivantnedevraitpasvousposerdeproblmesdecomprhension. class chap2_equal3 { public static void main(String[] args) { int a=10,b,c; double r1=3.1415927, r2; String txt1="Hello World", txt2; b=a; r2=r1; c=(int)r2; txt2=txt1; System.out.println(r2); System.out.println(c); System.out.println(txt2); } }

N ote:onnepeutpasaffecterdevariableuneautrevariablelorsdesadclaration.

- 8-

ENI Editions - All rigths reserved

5.Saisieetaffichage
Poursimulerlaffichageduntexteoudunevaleursurlcran,ilfaututiliserlapseudoinstruction"Afficher"quiprend sa suite une chane de texte ou une variable. Si vous mlangez du texte et des variables, sparez ceuxci par des virgules.laffichage,lesvirgulesserontremplacespardesespaces. PROGRAMME AFFICHE VAR a:entier texte:chane DEBUT a10 texte"Hello World" Afficher a Afficher texte Afficher "Bonjour les amis" FIN PourinviterunutilisateurrentrerauclavierunevaleurutilisezlemotSaisir.Lalgorithmeattendraalorsuneentreau clavierquiseravalideaveclatouchedentre.Lavaleurquevoussaisissezseraplacedanslavariableindiquela suitede"Saisir". PROGRAMME SAISIE VAR reponse:chane DEBUT Afficher "Quel est votre nom ?" Saisir reponse Afficher "Vous vous appelez",reponse FIN Sivousdevezsaisirplusieursvaleursplacerchacunedansunevariable,vouspouvezutiliserplusieurs"Saisir",mais plussimplementplacezlesdiversesvariableslasuitedununiqueSaisir,sparespardesvirgules.Lutilisateurdevra alorssaisirplusieursvaleurs(selonlelangagefinal:lesuneslasuitedesautressparespardesespaces,ouen appuyantsurlatouche[Entre]aprschaquesaisie). PROGRAMME SAISIE_MULTIPLE VAR nom,prenom:chanes DEBUT Afficher "Quels sont vos noms et prnoms ?" Saisir nom,prenom FIN Vous avez dj remarqu depuis le premier chapitre quen Java les exemples utilisent "System.out.println()" pour afficherquelquechosedanslaconsoleMSDOSoudansleshellUnix/MacOS.Cestunesyntaxeunpeucompliquequi trouvesalogiquedansleprincipedelobjetquiseraaborddansledernierchapitre.Javaesteneffetavanttoutun langage permettant de manipuler des composants graphiques (fentres, botes de dialogue, etc). Voyez ce quil est ncessairedefairepoursaisirdutexteauclavierdepuislaconsoledanslexemplesuivant. import java.io.*; class chap2_saisie { public static void main(String[] args) { String txt; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Entrez votre texte:"); txt=saisie.readLine(); System.out.println("Vous avez saisi :"); System.out.println(txt); } catch(Exception excp) { System.out.println("Erreur");

ENI Editions - All rigths reserved

- 9-

} } }

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

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:
q

+:addition :soustraction * ou x:multiplication(ilestplusfaciledcrireunxpourfoisquunetoile) /:division %oumod:modulo DIV:Ladivisionentire

R appel: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) {

ENI Editions - All rigths reserved

- 1-

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

Pourrsoudreunetellequation,ilfautcalculerun"discriminant"souslaforme =b-4ac Suivantlavaleurdudiscriminant,lesrsultatsvarient:


q

si>0,ilyadeuxsolutions si=0,ilnyaquuneseulesolution si<0,lquationnapasdesolution.

Pourlexemple, lalgorithmepartduprincipequelquationestvolontairementposecommeayantdeuxsolutions.Il sera complt dans le prochain chapitre consacr aux tests. Les rsultats dune quation du second degr sont appelslesracines.Pourlescalculer,ilfaututiliserlesoprationssuivantes: et Pourlaracinecarre,vousutiliserezdanslalgorithmelasyntaxe"racine(x)"oracineestunefonctionmathmatique quicalculelaracinecarredex.Cestunpeulquivalentdesfonctionsduntableur,vousverrezdanscelivrecomment crervospropresfonctions. PROGRAMME EQUATION VAR a,b,c,delta,x1,x2 :rels DEBUT a3 b6 c-10 delta( b * b ) - ( 4 * a * c ) x1( -b + racine(delta) ) / ( 2 * a ) x2( -b - racine(delta) ) / ( 2 * a ) Afficher "les rsultats sont :" Afficher "x1=",x1 Afficher "x2=",x2 FIN EnJava,notezlutilisationdefonctionsmathmatiquesintgrescommesqrt(racinecarre): class chap2_equation { public static void main(String[] args) { double a,b,c,delta,x1,x2; a=3; b=6; c=-10; delta=(b*b)-(4*a*c); x1=(-b+Math.sqrt(delta))/(2*a); x2=(-b-Math.sqrt(delta))/(2*a); System.out.println("les rsultats sont :"); System.out.println("x1="+x1); System.out.println("x2="+x2); } } Quelqueslangagesadmettentdesoprateursarithmtiquesunaires,cestdirequineprennentquunevaleur:
q

++xincrmentede1lavariablex x++idemmaisaprslutilisationencours xdcrmentede1lavariablex

ENI Editions - All rigths reserved

- 3-

xidemmaisaprslutilisationencours

Cettecriturepeutsurprendre.Voiciunexemple: PROGRAMME UNAIRE VAR a:entier DEBUT a1 Ecrire ++a Ecrire a++ Ecrire a FIN
q

Lepremieraffichageindique2,lavariableaestincrmenteavantsonutilisation. Ledeuximeindique2aussi,lavariableaestincrmenteaprssonutilisation. Ledernierindique3.

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

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

Loprateur ET indique que les deux expressions situes avant et aprs doivent tre toutes les deux vraies pourquelensemblelesoitaussi. Loprateur OU indique que seule lune des deux expressions, que ce soit celle situe avant ou celle situe aprs,doittrevraiepourquelexpressioncompltesoitvraieaussi. LeNONestlangation.Silexpressiontaitvraieelledevientfausse,etviceversa.

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

- 4-

ENI Editions - All rigths reserved

TabledevritET Ce tableau est comprendre ainsi : si Exp1 est vraie et Exp2 est vraie, alors lensemble est vrai. On dit plus gnralementqueExp1ETExp2estvrai.DanslecasduET,lensembleestvraiuniquementsilesdeuxexpressions sontvraies:luneETlautre.Danslesautrescas,commeaumoinslunedesdeuxestfausse,alorslersultattotalest faux. OU:

ENI Editions - All rigths reserved

- 5-

TabledevritOU DanslecasduOU,aumoinslunedesdeuxexpressionsdoittrevraiepourquelensemblesoitvrai.Seuleuneseule assertionestdoncfausse,danslecasolesdeuxexpressionssontfaussestouteslesdeux. NON:

TabledevritNON
- 6 ENI Editions - All rigths reserved

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

N otezquelalgorithme 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. L eslangagesragissentdiffremmentselonlescomparaisonsetlestypesdesdonnescompares.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,cest une affectation. Dans une expression conditionnelle, cestunecomparaison.Durdesy retrouver ! Cest pour a que certains langages comme C, C++, Java ou encore PHP utilisent loprateur dgalit "==",deuxfoisgal,pournepasleconfondreavecloprateurdaffectation"=".Dansceslangages:

ENI Editions - All rigths reserved

- 7-

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:
q

<:infrieur ou<=:infrieurougal >:suprieur ou>=:suprieurougal

La comprhension de ces quatre oprateurs ne doit pas poser de problme. Le rsultat est vrai si la valeur de gaucheestinfrieure,infrieureougale,suprieure,suprieureougalelavaleurdedroite. PROGRAMME INFSUP VAR a,b,c:entier DEBUT a10 b10 c20 Afficher Afficher Afficher Afficher

a<c a<=b c>b c>=c

- 8-

ENI Editions - All rigths reserved

Afficher NON(c<=a) Afficher c>a FIN Lesquatrepremiresexpressionsdcriventparfaitementlesrsultatsattendus:ellessonttoutesvraies.Lesdeux derniressontfaussesetparfaitementquivalentes.Silavaleurdecnestpasinfrieureougalea,elleluiest forcmentsuprieure.CestencoreiciunepropritdelalgbredeBoole.

5.Lecasdeschanesdecaractres
Vouspouvez,enpseudocodealgorithmique,utiliserlesoprateursdecomparaisonavecdeschanesdecaractres. Lacomparaisonseffectuealorsenfonctiondelordrealphabtiquedeschanesdecaractres.Cetordreesttablien fonction de la numrotation des caractres dans la table ASCII ou la page Unicode. Dans cet exemple, txt2 est suprieurtxt1danslesensodansuntrialphabtiquedesdeux,lebestsituaprslea. PROGRAMME TXT VAR txt1,txt2:chanes DEBUT txt1"a" txt2"b" Ecrire txt2>txt1 FIN Cesoprateursappliqusdeschanesdecaractressontunbonexempledecequipeutsepassersiparhasard vous vous trompez dans les types et les affectations. Dans lexemple suivant, les deux chanes "1111" et "2" sont compares,ainsiquelesdeuxentiersdemmevaleur.Lesquellessontlesplusgrandes? PROGRAMME TXTCOMP VAR x,y :entiers txt1,txt2:chanes DEBUT x1111 y2 Afficher x>y txt1"1111" txt2"2" Afficher txt1>txt2 FIN Danslepremiercas,lexpressionestvraie.Danslesecond,elleestfausse. Ilestpossibledadditionnerdeschanesdecaractres.Lersultatenestlaconcatnationdesdeuxchanes.Ilnest parcontrepaspossibledutiliserlesautresoprateursarithmtiques.Vouspouvezutiliserloprateur"&"ou"+"pour concatner,cependantlepremierestprfrable. PROGRAMME CONCAT VAR txt1,txt2:chanes DEBUT Afficher "Comment vous appelez-vous ?" Saisir txt1 txt2"Vous vous appelez "&txt1 Afficher txt1 FIN

ENI Editions - All rigths reserved

- 9-

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 00001001 =11110110 +00000001 =11110111 (complment un) (9) (tout est invers) (+1) (quivaut -9 reprsentation machine)

R emarque:Sivousadditionnezunnombreavecsoncomplmentdeux,vousobtenez0(plusuneretenue). Maintenant,additionnezcersultat30: 11110111 (quivaut -9 reprsentation machine) +00011110 (30) =00010101 (21 - plus une retenue) Cest gagn ! En pratique le microprocesseur neffectue pas tous ces calculs de conversion car il sait reprsenter nativementeninternetoutescesvaleurs,matriellement.

2.Lareprsentationdesnombresrels
Silestsimpledesereprsenterunnombreentierenbinaire,celasemblepluscomplexeavecunnombrevirgule.En effet,leprincipemmedubinaireveutquechaquevaleurreprsenteunepuissancede2enfonctiondesapositionde 0n,doncunevaleurentire.Enplus,lesnombresrelsnontjamaislammetaille:plusoumoinsdechiffresavant la virgule, plus ou moins aprs. Il faut prendre le problme lenvers : ne seraitce pas plutt la virgule qui se dplace? Ensuite, estce possible de reprsenter un nombre rel sous forme de rsultat dune manipulation de nombres entiers? Prenezunexemplesimple:1,2. 1,2=12x0,1=12x10 - 1 =12E-1 Envritablenotationscientifique,oncrit1,2E0soit1,2x100 . Voil qui est trs intressant. Les nombres 12, 10 et 1 pourraient parfaitement tre cods directement en binaire. Certains ordinateurs spcialiss, dits calculateurs, fonctionnent de cette manire. Vrifiez avec une valeur plus importante:182,1957: 182,195=182195x0,001=182195x10 - 3 =182195E-3

ENI Editions - All rigths reserved

- 1-

Envritablenotationscientifique,oncrit1,82195E2soit1,82195x102 . Cestleprincipedelanotationscientifiquequilvafalloirretenirmaisenbinaire,pasendcimal.Lemicroprocesseurne manipulepasdepuissancesde10,maisde2.Aussiilfauttrouver,selonlemmeprincipe,unmoyendetransformer toutcecienbinaire.Danslapartieavantlavirgule,cesontdespuissancesde2positives(20 , 21 ,22 ,etc).Aprsla virgule,ilfautpasserenpuissancesde2ngatives(2 1 ,22 ,23 ,etc).Lapremirepartieneposeaucunproblme. 182 ( 1 0 ) =10110110 ( 2 ) La seconde partie est plus dlicate. Elle se base sur les puissances ngatives de 2. Pour rappel mathmatique 2 1 =1/21 ,22 =1/22 ,etc. 0,195x2=0,390 0,390x2=0,780 0,780x2=1,560 0,560x2=1,120 0,120x2=0,240 0,240x2=0,480 0,480x2=0,960 0,960x2=1,920 0,920x2=1,840 0,840x2=1,680 0,680x2=1,360 0,360x2=0,720 0,720x2=1,440 0,440x2=0,880 0,880x2=1,760 0,760x2=1,520 <1, <1, >1, >1, <1, <1, <1, >1, >1, >1, >1, <1, >1, <1, >1, >1, on on on on on on on on on on on on on on on on pose pose pose pose pose pose pose pose pose pose pose pose pose pose pose pose 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0,0... 0,00... 0,001... 0,0011... 0,00110... 0,001100... 0,0011000... 0,00110001... 0,001100011... 0,0011000111... 0,00110001111... 0,001100011110... 0,0011000111101... 0,00110001111010... 0,001100011110101... 0,0011000111101011...

etainsidesuite!Icivousobtenezuneprcisionde2 16 .Sidailleursvousfaitesletotalendcimal(23 +24 +28 +2 9 +210 ...)vousobtenezuntotalde0,1949920654296875.Vousvoyezquonnobtientpaslavaleurexacte.Mmeavec plusdeplaceetplusdecalculs,lersultatapprocherait0,1949999999...sansjamaisatteindre0,195. 0,195 ( 1 0 ) =0011000111101011 ( 2 ) arrondi une prcision de 2 - 1 6 . 182,195 ( 1 0 ) =10110110,0011000111101011 ( 2 ) , en arrondi. 10110110,0011000111101011=1,01101100011000111101011x2 7 Enfin,puisquele1avantlesvirgulesestimplicite,onlesupprime.Onobtientcequonappelleunemantisse. Mantisse=01101100011000111101011 Plusonsouhaitequelaprcisionsoitfine,plusondescenddanslespuissancesde2.Vousvoyezcependantquun momentilfautsarrter,etquil faut se contenter duneprcisiondecompromis.Cesystmeestaussigourmanden place. Il existe une norme pour reprsenter les nombres rels en binaire, elle a t dfinie par lIEEE, pour des prcisionsditessimplesetdoubles.Enprcisionsimple,lenombrerelestcodsur32bits.Enprcisiondouble,illest sur 64 bits. Il existe aussi une prcision sur 80 bits. Le principe est le mme dans tous les cas. Il est bas sur la reprsentationdusigne"S"dunombre,dunemantisse"M"etdunexposant"E".

Reprsentationbinaire32bitsdunrelsimpleprcision

- 2-

ENI Editions - All rigths reserved

Dansunnombrerelensimpleprcisionsur32bits,unbitestrservpourlesigne,8pourlexposantet23pourla mantisse, dans cet ordre, le bit de poids fort tant le signe. Lexposant doit subir un dcalage de 2 n1 1,ntantle nombredebitsutiliss.Ledcalageestdoncde127.Enfin,ilnefautpasconserverle1delamantisse:ilestimplicite. Signe S:0 Exposant E: 7+127=134

(10)

, soit 10000111

(2)

Mantisse: 182,195 ( 1 0 ) , sur 23 bits 01101100011000111101011 ( 2 ) Aufinalvousobtenezlenombrecoden32bitssuivant: S 0 E 1 E 0 E 0 E 0 E 0 E 1 E 1 E 1 M 0 M 1 M 1 M 0 M 1 M 1 M 0

M 0

M 0

M 1

M 1

M 0

M 0

M 0

M 1

M 1

M 1

M 1

M 0

M 1

M 0

M 1

M 1

Pourretrouverdepuiscenombre32bitslavaleurrelleendcimal,ilfautappliquerlaformulesuivante:

Formuledecalculdunreldepuissareprsentationbinaire Reprenezlesvaleursprcdentes,convertiesendcimalpourplusdefacilit:
q

S=0 E=137 M=3551723

Lecodagedunrelsur32bitsamnedeuxremarques:
q

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

Leprincipedurelendoubleprcisionestexactementlemme,saufquelestaillesdelexposantetdelamantisse sont agrandies. Lexposant fait 11 bits, la mantisse 52 bits. Si vous reprenez les calculs mais cette fois en double prcision,vousarrivezuntotalde182,194999992847442626953125avecunarrondi224 ! Unexempleconcretetsimpledeserreursdarrondipeuttretoutfaitmisenvidenceavecunesimplecalculatrice trs bas prix, ne seraitce quen divisant 1 par 3. Obtenezvous 1,333333 ou 1,333334 ? En rutilisant cette mme

ENI Editions - All rigths reserved

- 3-

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

3.Lesdates
Lesdatessontreprsentesdedeuxmaniresdanslordinateur.LapremireestleformatBCDvuprcdemment,et ceci presque exclusivement dans le bios (setup) de votre ordinateur, pour des raisons historiques. Le second est le timestampUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuitpileUTC.Cette date a t retenue car bien que lide dUnix soit apparue en 1969, lre dUnix (arrive de la premire version et expansion)dbutedanslesannes1970. Le11avril200721heures,24minuteset43secondes,letimestampUnixestde1176319483secondes. Le timestamp est gnralement cod sur un entier de 32 bits sign. Sil est ngatif, il reprsente une date davant 1970,silestpositifunedatesuivante.Ilcouvreuneplagede136ans,du13dcembre190120heures45minutes52 secondesjusquau19janvier2038,3heures14minutes8secondes.Passecettedate,quesepasseratil?Tousles systmes dexploitation ou les ordinateurs nayant pas prvu ce problme rencontreront un magistral bug digne de celuidelan2000,oupire:lebugdelan2000(quinapaseulieu,oupeu,malgrlesprdictionscatastrophiques) taitessentiellementlogiciel,letimestampestdfiniauseindusystmedexploitation. Alorsquefaire?Dj,ilresteunetrentainedannespourmodifierlachose,etcestbiensouventdjfait.Unixat conuilyabientt40ansetesttoujoursextrmementutilis.Ilestfortprobablequedici30ans,luioulundeses drivs le soit encore. Cest un systme dexploitation qui a fait ses preuves. Or les technologies voluent et les ordinateurs actuels manipulent sans difficult des nombres de 64 bits. Un timestamp sign sur 64 bits permet de reprsenterdesdatesdelpoqueoluniverstelquenousleconnaissonsnexistaitpas,etdanslefutur,unepriode onotreSoleilnexisteraplusdepuisbienlongtemps...Ilsuffitdoncdepasserletimestampsur64bits,etsachantquil existeuntypetimestampenprogrammation,derecompilertouslesprogrammes.Ilnyadoncaucunsoucisefaire.

4.Lescaractres
Lescaractressonthabituellementcodssur8bits,soitunoctet,enutilisantlatableASCII.Danscettetable,les128 premires valeurs ne reprsentent pas que les caractres pour les anglais mais aussi divers codes non affichables utilisspourcontrlerlaffichage dun terminal. Les caractres de 0 31 vont contenir des choses comme les retour chariot,lepassagelaligne,latabulation,etc.Lecaractre32estlespace,le127lecaractredesuppression.Le"A" enmajusculedmarre65,enminuscule97,leschiffresenpartantde048.Leresteestlaponctuation,divers signescommelessymbolesmontaires,lesoprateursetcomparateursarithmtiques,etainsidesuite.Typiquement, lachane"HelloWorld!"estreprsenteainsi. CodeASCII Caractre 72 H 101 e 108 l 108 l 111 o 32 87 W 111 o 114 r 108 l 100 d 33 !

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:
q

Lesfichierstextesetlesnomsdefichierscritsdansdautreslanguesquelanglaisneserontpasinterprts correctementsurlessystmesnutilisantpaslammepagedecode.Typiquement,sivousutilisezunepagede codenorvgiennesurdesfichiersenfranais,vousobtiendrezdescaractressurprenants. Les 128 octets ne suffisent pas toujours coder tous les caractres dune langue particulire, par exemple tous les idogrammes chinois ou japonais. Dans ce cas, lalphabet de ces langues est restreint, ou les gens natifs de ces pays (et dautres) doivent utiliser plusieurs pages de code, ou passer par des logiciels et
ENI Editions - All rigths reserved

- 4-

systmesgrantspcifiquementleurlangue. Pourpaliercesinconvnients,ilafallutrouverunautresystmedecodagedescaractres.Larrivedesordinateurs avecunegrandecapacitmmoireetunegestionavancedelaffichagedescaractrespermetdedisposerdepolices decaractres(unfichierquicontienttouslesdessinsdescaractresdestinationdelcranoudelimprimante)qui peuvent contenir les alphabets de la plupart des langues. Par exemple dans la police Arial, on pourrait trouver les caractreseuropens,maisaussihbreux,arabes,chinois,japonais,etainsidesuite.Maiscommentreprsenterces milliersdecaractresdiffrentsenmmoire? UnenormeappeleUnicode,reconnueparlaplupartdessystmesdexploitationetdeslogicielsnotammentsousUnix etWindows,faitsautercettelimitation.Chaquecaractredisposedunnometdunidentifiantnumrique,demanire unifie et quelque soit le systme cible. Cestdire que tout produit sachant interprter les caractres unicode afficheraleschanesdecaractrescritessouscettenormeaveclesbonscaractres. Untexteunicodeenchinoissafficheraenchinoissivotretraitementdetextegrelunicodeetdisposedelapolicede caractresunicodecontenantlesidogrammeschinois.Notezquevousnavezpasvoussoucierdelamaniredont voustapezletexte:lesystmedexploitationetleslogicielslefontvotreplace:vouscontinueztapervotretexte commevouslaveztoujoursfait. Unicodeestunenormedereprsentationinternedescaractres,etproposediversformatsdestockageenmmoire. Actuellement, unicode reprsente plus de 245000 chiffres, lettres, symboles, ponctuation, syllabes, rgles de reprsentation, etc. Il faut de la place pour reprsenter ceci. La mthode la plus courante, utilise notamment par dfaut sous Linux, est lUTF8,UniversalTransformationFormat.Sontudedpasselecadredecelivreetprendrait plusieurspages.Cependant,sachezquelemodleUnicodeestunmodleencouches. Lapremirecoucheestlejeudecaractresabstrait,enfaitunelistedescaractresetleurnomprcis.Parexemplele ""correspond"Lettremajusculelatineccdille". Lasecondeestlindexnumriqueducaractrecod,appelpointdecode,notU+XXXXoXXXXestenhexadcimal. Sansrentrerdanslesdtails,le""estreprsentparlepointdecodageU+00C7.Ilexisteplusieursniveauxensuite. Java utilise un codage des caractres sous forme Unicode sur 16 bits. Le premier octet en partant de la gauche reprsentelejeudecaractre,lesecondlenumrodecaractredanscejeu.CestpourquoiletypecaractreenJava utilisedeuxoctets,alorsquilnenutilisequunseulenC.

ENI Editions - All rigths reserved

- 5-

Typesetlangages
1.Langagestypsounon
Quelques langages sont trs souples avec les variables. Vous pouvez tout dabord y mettre des nombres, puis du texte,puisdenouveaudesnombres.Ceslangagessontdits"nontyps".Certainspoussentleraisonnementassez loin : une variable peut contenir le chiffre 3, et lautre le texte "3 petits cochons", il pourra les additionner (ce qui devraitdonner6)!CestlecasduPHPparexemple:letypedelavariabledpendalorsdesoncontextedutilisation, lelangagetentantdeconvertirsoncontenuquandcestpossible! linverse, dautres langages sont de "typage fort" o toutes les variables doivent tre dclares de manire extrmementprcise:type,signe,longueur,etlesventuellesconversionsdoiventtreexplicites. En algorithmique, vous vous contenterez de donner le nom, le type et ventuellement la taille de la variable, qui garderasespropritstoutaulongdelalgorithme,savaleurpouvantbienentenduvoluer.

2.Lagestiondelammoire
Lagestiondelammoireestlecalvairedesprogrammeursenlangagesdebasniveauoummedehautniveauquand ceuxci laissent au programmeur la tche de grer la mmoire luimme.Cest le cas de langages comme le C ou le C++. Imaginez une chane de caractres Hello World ! .Celleci est compose de 12 caractres en comptant la ponctuation et lespace.Commeunechanesetermineparuncaractrenul,ilfaut,selonleprincipequuncaractre estcodenASCII,13octetspourstockercettechaneenmmoire. En algorithmique, vous navez pas vous soucier de loccupation mmoire de vos variables et chanes. En Java, ou encore en PHP, non plus : ces langages disposent de mcanismes appels "ramassemiettes"quilefontpourvous. MaisenCparexemple,ceseraitvousdedclarervotrevariabledemanirecequesoncontenupuissecontenir jusqu13octetsendclarant,enfait,13casesmmoiresdunoctet.Voicilamthodeditestatique: char texte[13] ; ouencorelamthodedynamique: char *texte=malloc(13*sizeof(char)); Ce nest pas tout. En effet avec cette dernire syntaxe le malheur veut que outre cette tche complexe dallocation mmoire,vousdeviezlibrervousmmelammoire,sinonvotreprogrammecontinueraconsommercellecijusqu lafindesonexcution.Maiscesystmedegestiondelammoireestilvraimentuninconvnient?Prenezencompte cesquelquesallgations:
q

Lagestiondelammoiredemaniredynamiquencessiteuneconnaissanceavancedelatailledesvariables utilises,delaquantitdemmoirencessaireetdelammoirephysiquedelamachine. Laccs la mmoire passe par lutilisation de variables particulires appeles pointeurs car elles ne reprsentent pas une valeur mais ladresse dune case. Une fois matrises, cellesci se rvlent tre trs puissantesetpratiques. Lallocation dynamique permet dutiliser uniquement la quantit de mmoire ncessaire un instant donn. Cestcertesinsignifiantpourquelquesoctets,maissilsagitdemanipulerdegrossesimagesoudesfilms,a compte. La mmoire inutilise peut tre libre ds quellenest plus ncessaire. Avec les mthodes dites statiques, ellelestuniquementlafinduprogramme(oudunblocdinstructions). Lallocationmmoireestlaplusgrandesourcederreursdansunprogramme,pouvantoccasionnerdusimple dysfonctionnement au plantage complet du programme, voire mme de graves problmes de scurit (piratage)dansdesapplicationscritiques.

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

ENI Editions - All rigths reserved

- 1-

Lestestsetconditions
1.Principe
Dansleprcdentchapitrevousavezpuvousfamiliariseraveclesexpressionsmettantenplacedesoprateurs,quils soient de calcul, de comparaison (lgalit) ou boolens. Ces oprateurs et expressions trouvent tout leur sens une foisutilissdansdesconditions(quonappelleaussidesbranchementsconditionnels).Uneexpressionvalueestou vraie (le rsultat est diffrent de zro) ou fausse. Suivant ce rsultat, lalgorithme va effectuer une action, ou une autre.Cestleprincipedelacondition. Grceauxoprateursboolens,lexpressionpeuttrecompose:plusieursexpressionssontliesentreelleslaide dunoprateurboolen,ventuellementregroupesavecdesparenthsespourenmodifierlapriorit. (a=1 OU (b*3=6)) ET c>10 est une expression tout fait valable. Celleci sera vraie si chacun de ses composants respecte les conditions imposes.Cetteexpressionestvraiesiavaut1etcestsuprieur10ousibvaut2(2*3=6)etcestsuprieur10. Reprenezlalgorithmeduprcdentchapitrequicalculelesdeuxrsultatspossiblesdunequationduseconddegr. Lnonc simplifi disait que pour des raisons pratiques seul le cas o lquation a deux solutions fonctionne. Autrementdit,lalgorithme nestpasfauxdanscecasdefigure,maisilestincomplet.Ilmanquedesconditionspour testerlavaleurdudterminant:celuiciestilpositif,ngatifounul?Etdanscescas,quefaireetcommentlefaire? Imaginez un second algorithme permettant de se rendre dun point A un point B. Vous nallez pas le faire ici rellement,carcestquelquechosedetrscomplexesurunrseauroutierimportant.DenombreuxsitesInternetvous proposentdtabliruntrajetavecdesindications.Cestlersultatquiestintressant.Lesindicationssontsimples: allez tout droit, tournez droite au prochain carrefour, faites trois kilomtres et au rondpoint prenez la troisime sortie direction B. Dans la plupart des cas si vous suivez ce trajet vous arrivez bon port. Mais quid des impondrables?Paroallezvouspassersilaroutedroiteauprochaincarrefourestdevenueunsensinterdit(a arriveparfois,ycomprisavecunGPS,prudence)ouquedestravauxempchentdeprendrelatroisimesortiedurond point? Reprenezletrajet:alleztoutdroit.Siauprochaincarrefourlaroutedroiteestensensinterdit:continueztoutdroit puis prenez droite au carrefour suivant puis gauche sur deux kilomtres jusquau rondpoint. Sinon : tournez droite et faites trois kilomtres jusquau rondpoint. Au rondpoint, si la sortie vers B est libre, prenez cette sortie. Sinon,prenezversCpuistroiscentsmtrespluslointournezdroiteversB. Ce petit parcours ne met pas uniquement en lumire la complexit dun trajet en cas de dtour, mais aussi les nombreusesconditionsquipermettentdtabliruntrajetencasdeproblme.Sivousenpossdez,certainslogicielsde navigationparGPSdisposentdepossibilitsditinraireBis,detrajectoiredvitementsurtellesection,ouencorepour viterlessectionspage.Pouvezvousmaintenantimaginerlenombredexpressionsvaluerdanstouscescasde figure,enplusdelavitessedechaqueroutepouroptimiserlheuredarrive?

2.Quetester?
Les oprateurs sappliquent sur quasiment tous les types de donnes, y compris les chanes de caractres, tout au moinsenpseudocodealgorithmique.Vouspouvezdoncquasimenttouttester.Partester,comprenezicivaluerune expressionquiestunecondition.Uneconditionestdonclefaitdeffectuerdestestspour,enfonctiondursultatde ceuxci,effectuercertainesactionsoudautres. Une condition est donc une affirmation : lalgorithmeetleprogrammeensuitedterminerontsicelleciestvraie,ou fausse. UneconditionretournantVRAIouFAUX,acommersultatunboolen. Enrglegnrale,uneconditionestunecomparaisonmmesienprogrammationuneconditionpeuttredcritepar une simple variable (ou mme une affectation) par exemple. Pour rappel, une comparaison est une expression composedetroislments:
q

unepremirevaleur:variableouscalaire unoprateurdecomparaison unesecondevaleur:variableouscalaire.

Lesoprateursdecomparaisonsont:

ENI Editions - All rigths reserved

- 1-

Lgalit:= Ladiffrence:!=ou<> Infrieur:< Infrieurougal:<= Suprieur:> Suprieurougal:>=

Lepseudocodealgorithmiqueninterditpasdecomparerdeschanesdecaractres.Evidemment,vousprendrezsoin nepasmlangerlestorchonsetlesserviettes,ennecomparantquelesvariablesdetypescompatibles.Dansune condition une expression, quel que soit le rsultat de celleci, sera toujours value comme tant soit vraie, soit fausse. N ote: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:
q

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

Vousdevezdoncproscrirecetteformedexpression.Voicicellesquiconviennentdanscecas: nombre>=1 ET nombre<=10 Ouencore 1<=nombre ET nombre<=10

3.TestsSI
a.Formesimple
Ilnya,enalgorithmique,quuneseuleinstructiondetest:"Si",quiprendcependantdeuxformes:unesimpleet unecomplexe.LetestSIpermetdexcuterducodesilacondition(laoulesexpressionsquilacomposent)estvraie. Laformesimpleestlasuivante: Si boolen Alors Bloc dinstructions FinSi Noteziciqueleboolenestlacondition.Commeindiquprcdemment,laconditionpeutaussitrereprsentepar

- 2-

ENI Editions - All rigths reserved

uneseulevariable.Siellecontient0,ellereprsenteleboolenFAUX,sinonleboolenVRAI. Que se passetil si la condition est vraie ? Le bloc dinstructions situ aprs le "Alors" est excut. Sa taille (le nombre dinstructions) na aucune importance : de une ligne n lignes, sans limite. Dans le cas contraire, le programme continue linstructionsuivantle"FinSi". Lexemple suivant montre comment obtenir la valeur absolue dunnombreaveccettemthode. PROGRAMME ABS VAR Nombre :entier DEBUT nombre-15 Si nombre<0 Alors nombre-nombre FinSi Afficher nombre FIN EnJava,cestle"if"quidoittreutilisaveclexpressionboolenneentreparenthses.Lasyntaxeestcelleci: if(boolean) { /*code */ } SilecodeJavanetientquesuruneligne,lesaccoladespeuventtresupprimes,commedanslexempledelavaleur absolue. class chap3_abs { public static void main(String[] args) { int nombre; nombre=-15; if(nombre<0) nombre=-nombre; System.out.println(nombre); } }

b.Formecomplexe
Laformecomplexenadecomplexequelenom.Ilyadescasoilfautexcuterquelquesinstructionssilacondition est fausse sans vouloir passer tout de suite linstruction situe aprs le FinSi. Dans ce cas, utilisez la forme suivante: Si boolen Alors Bloc dinstructions Sinon Bloc dinstructions FinSi Si la condition est vraie, le bloc dinstructions situ aprs le Alors est excut. Ceci ne diffre pas du tout de la premireforme.Cependant,silaconditionestfausse,cettefoiscestleblocdinstructionssituaprsleSinonquiest excut.Ensuite,leprogrammereprendlecoursnormaldesonexcutionaprsleFinSi. Notez que vous auriez pu trs bien faire un quivalent de la forme complexe en utilisant deux formes simples : la premireaveclaconditionvraie,lasecondeaveclangationdecettecondition.Maiscenestpastrsjoli,mmesi cestcorrect.Retenezque:
q

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

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

ENI Editions - All rigths reserved

- 3-

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:
q

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

import java.io.*; class chap3_tri { public static void main(String[] args) { String t1,t2,t3; int x,y,z; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Entrez trois valeurs entires distinctes:"); try { t1=saisie.readLine(); t2=saisie.readLine(); t3=saisie.readLine(); x=Integer.parseInt(t1); y=Integer.parseInt(t2); z=Integer.parseInt(t3); if(z>y && y>x) System.out.println("Tris en ordre croissant"); else System.out.println("Ces nombres ne sont pas tris"); } catch(Exception excp) { System.out.println("Erreur"); } } }

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

- 4-

ENI Editions - All rigths reserved

DEBUT Nombre63 Afficher "Saisissez une valeur entre 0 et 100:" Saisir saisie ecartnombre-saisie Si ecart < 0 Alors Ecart-ecart FinSi Si ecart=0 Alors Afficher "Bravo !" Sinon Si ecart<5 Alors Afficher "Bouillant" Sinon Si ecart<10 Alors Afficher "Chaud" Sinon Si ecart<15 Alors Afficher "Tide" Sinon Afficher "Froid" FinSi FinSi FinSi FinSi FIN Peuttre trouvezvous cette syntaxe trop longue et surtout peu lisible. Une astuce consiste tracer des traits verticaux allant des Si aux FinSi pour ne pas sy perdre. Cest dailleurs recommand par certains professeurs dalgorithmique, y compris pour les boucles (abordes dans un prochain chapitre). Lalgorithme cidessus est parfaitementvalableetdunesyntaxecorrecte.Cependantilestpossibledefaireplusconcisaveclaformesuivante. Si boolen Alors Bloc dinstructions 1 SinonSi boolen Alors Bloc dinstructions 2 SinonSi boolen Alors Bloc dinstructions n Sinon Bloc dinstruction final FinSi Cetteformeestpluspropre,pluslisibleetvitedesemlangerlespinceaux.Demultiplesconditionssonttestes.Sila premirenestpasvraie,onpasseladeuxime,puislatroisime,etainsidesuite,jusqucequuneconditionsoit vrifie.Danslecascontraire,cestleblocdinstructionsfinalquiestexcut.Lestestsduprcdentexempledoivent donctrercritscommececi: Si ecart=0 Alors Afficher "Bravo !" SinonSi ecart<5 Alors Afficher "Bouillant" SinonSi ecart<10 Alors Afficher "Chaud" SinonSi ecart<15 Alors Afficher "Tide" Sinon Afficher "Froid" FinSi VoicilecodecorrespondantenJava: import java.io.*; class chap3_imbrique { public static void main(String[] args) { String txt="10"; int ecart,nombre,saisie=0; BufferedReader input;
ENI Editions - All rigths reserved - 5-

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:
q

Si=0,ilnyaquuneseulesolutionquivaut:

Si<0,lquationnapasdesolution.

PROGRAMME EQUATION2 VAR a,b,c,delta,x1,x2:rels DEBUT a3 b6 c-10 delta( b * b ) - ( 4 * a * c ) Si delta>0 Alors x1( -b + racine(delta) ) / ( 2 * a ) x2( -b - racine(delta) ) / ( 2 * a ) Afficher "Les deux solutions sont x1=",x1, "x2=",x2 SinonSi delta=0 Alors x1 -b / (2 * a) Afficher "Lunique solution est :",x1 Sinon Afficher "Lquation na pas de solution" FinSi FIN EnJava,leprogrammeatmodifilgrementpourautoriserlasaisiedea,betc: import java.io.*; class chap3_equation { public static void main(String[] args) { double a=0,b=0,c=0,delta,x1,x2; String ta="",tb="",tc=""; BufferedReader input; input=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Entrez a,b et c :");

- 6-

ENI Editions - All rigths reserved

try { ta=input.readLine(); tb=input.readLine(); tc=input.readLine(); } catch(Exception excp) { System.out.println("Erreur"); } a=Double.parseDouble(ta); b=Double.parseDouble(tb); c=Double.parseDouble(tc); delta=(b*b)-(4*a*c); if(delta>0) { x1=(-b+Math.sqrt(delta))/(2*a); x2=(-b-Math.sqrt(delta))/(2*a); System.out.println("Deux solutions :"); System.out.println("x1="+x1); System.out.println("x2="+x2); } else if (delta==0) { x1=-b/(2*a); System.out.println("Une seule solution x1="+x1); } else System.out.println("Pas de solution"); } }

5.Choixmultiples
Silestestsimbriqusfacilitentparfoislavie,ilsdeviennentparfoistroplourdslorsquelenombredetestsdevienttrop important.Certainslangagesonttrouvuneintressanteparadeceproblmeenproposantdesstructuresdetests selonquetelleexpressionestvraie,outelleautre,etainsidesuite.AulieudefairedesSiimbriqusoudesSinonSi,il suffit alors dindiquer quoi faire quand telle ou telle valeur est rencontre. En algorithmique, cela se traduit par la pseudoinstruction"Selonque". Selon que : Condition 1 : bloc 1 Condition 2 : bloc 2 Condition n : bloc n Sinon : bloc final Fin Selon Uneinstruction"Selonque"peuttreconvertiefacilementenSiimbriqus.Lesconditionssontvrifieslesunesaprs les autres, dans lordre indiqu. Quand une condition est vraie, le bloc dinstructions associ est excut puis lalgorithme continue aprs le "Fin Selon". Si aucune condition nest vrifie, cest le bloc final du "Sinon" qui est excut. Voiciuneapplicationsimplequipermetdeplacerdansunevariablelenomdunmoisenfonctiondesonnumro(entre 1et12): Variable mois en Numrique Variable libelle_mois en Alphanumrique Dbut mois11 Selon que : mois=1 : libelle_mois"janvier" mois=2 : libelle_mois"fvrier" mois=3 : libelle_mois"mars" mois=4 : libelle_mois"avril" mois=5 : libelle_mois"mai" mois=6 : libelle_mois"juin" mois=7 : libelle_mois"juillet" mois=8 : libelle_mois"aot" mois=9 : libelle_mois"septembre" mois=10 : libelle_mois"octobre" mois=11 : libelle_mois"novembre" mois=12 : libelle_mois"dcembre"
ENI Editions - All rigths reserved - 7-

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:
q

Ladateestdcomposedanstroisvariablesanne,moisetjour. Ilfautgrer:
q

leschangementsdemois lenombredejoursdanslemois lechangementdanne lesannesbissextilespourlemoisdefvrier.

- 8-

ENI Editions - All rigths reserved

Pourinformation,uneanneestbissextilesiellevrifieintgralementdeuxrgles:
q

lesannesdivisiblespar4,et, lesannesdivisiblespar400maispaspar100.

Lalgorithmepourindiquersiuneanneestbissextileounonestlesuivant.Notezquedirequuneanneestdivisible parnconsistedirequelerestedeladivisionparnestnul. PROGRAMME BISSEXTILE VAR Annee :entier DEBUT Afficher "Entrez lanne" Saisir annee Si (annee%4=0) ET ((annee%400=0) OU (annee%100>0)) Alors Afficher annee, " est bissextile." Sinon Afficher annee, " nest pas bissextile." FinSi FIN EnJava: import java.io.*; class chap3_bissextile { public static void main(String[] args) { int annee=0; String cannee=""; BufferedReader input; input=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Entrez une anne :"); try { cannee=input.readLine(); } catch(Exception excp) { System.out.println("Erreur"); } annee=Integer.parseInt(cannee); if( (annee%4==0) && ((annee%400==0) || (annee%100>0)) ) System.out.println(annee+" est bissextile"); else System.out.println(annee+" nest pas bissextile"); } } Cetestdannebissextilenintervientquelorsdescalculssurledernierjourdefvrier,poursavoirsilelendemaindu 28estle29oule1 e rmars.Demmeilfautgrerlescasolesmoisont30ou31jours,ainsiquelechangement dannelorsdumoisdedcembre.Lalgorithmeutilisedesstructures"SelonQue"etSi. PROGRAMME LENDEMAIN VAR annee,mois,jour:entiers DEBUT Afficher "Date initiale ?" Saisir jour, mois, annee Selon que: mois=1 OU mois=3 OU mois=5 OU mois=7 OU mois=8 OU mois=10: Si jour=31 Alors jour1 moismois+1 Sinon Jourjour+1 FinSi

ENI Editions - All rigths reserved

- 9-

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

if(jour==30) { jour=1; mois++; } else jour++; break; } case 2: { if( (annee%4==0) && ((annee%400==0) || (annee%100>0)) ) { if(jour==29) { jour=1; mois++; } else jour++; } else { if(jour==28) { jour=1; mois++; } else jour++; } break; } case 12: { if(jour==31) { jour=1; mois=1; annee++; } else jour++; } } System.out.println("Demain est le "+jour+ "/"+mois+ "/" +annee); } }

b.Lavaliditdunedate
Les calculs de dates sont une source inpuisable dalgorithmes. Sauriezvous par exemple vous inspirer de lalgorithmecidessuspourtesterlavaliditdunedaterentreauclavier?Ilsuffitpourchaquemoisdevrifiersile jourentrestcorrect,lepigetantcommecidessuspourlesannesbissextilesetlemoisdefvrier.Lalgorithme cidessous introduit une nouveaut : la prsence dun drapeau (quon appelle flag en anglais) ou indicateur. Le drapeau est une variable initialise une valeur prdfinie au dbut du programme et dont la valeur est modifie selonlersultatdestests.Aprstouslestests,onvrifielavaleurdudrapeau.Atellechang?Alorsilyaeuun problme.Ledrapeauestreprsentparlavariable"erreur".Enfindescript,siellecontientautrechoseque0,alors ladateestinvalide.Savaleurestmodifie1lorsquuntestnestpasconcluant. Variables erreur, annee, mois, jour en Numrique Dbut erreur0 Ecrire "Date initiale ?" Lire jour, mois, annee Si jour<0 OU mois<0 OU mois>12 Alors erreur1 Sinon Si Mois=1 OU mois=3 OU mois=5 OU mois=7 OU mois=8 OU mois=10 ou mois=12 Alors Si jour>31 Alors erreur1 FinSi Sinon Si mois=4 OU mois=6 OU mois=9 OU mois=11 Alors Si jour>30 Alors erreur1 FinSi Sinon SI mois=2 Alors Si (annee%4=0) ET ((annee%400=0) OU (annee%100>0)) Alors Si jour>29 Alors erreur1 FinSi Sinon Si jour>28 Alors erreur1

ENI Editions - All rigths reserved

- 11 -

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

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

Dansunpremiertemps,additionnezlessecondes:147+12=159 Ensuite, convertissez ces secondes en minutes. Pour cela il suffit de diviser par 60 pour rcuprer les minutes, puis de rcuprer le reste de la division entire (le modulo) pour les secondes en trop (159/60 donne2minutesavecunrestede39secondes.Voussavezmaintenantquelafinestde39secondes. Additionnez les minutes : 58+2= 60. Si le chiffre est suprieur ou gal 60, procdez comme pour les secondes.60/60=1,soituneheuresupplmentaire,etunrestede0donc0minute.Voussavezmaintenant quelemilieuest0minute. Additionnezlesheures:23+1=24soitminuit.Lencorelidalestdecompterlesjours.Ainsi24/24=1(soit +1jour),sansrestedonc0heure:minuit.

Ilseradoncminuitet39secondes. PROGRAMME heure VAR jours,heures,minutes,secondes,nbsec:entiers DEBUT heures17 minutes55 secondes48 Afficher "Combien de secondes en plus ?" Saisir nbsec secondessecondes+nbsec minutesminutes+(secondes / 60) secondessecondes % 60 heuresheures+(minutes / 60) minutesminutes % 60 joursheures / 24 heuresheures % 24 Afficher jours, heures, minutes, secondes FIN Limplmentation en Java ne ncessite pas de commentaires particuliers. Laffichage final est juste un peu plus agrable. import java.io.*; class chap3_heure { public static void main(String[] args) { int jours=0,heures, minutes, secondes,nbsec=0;
- 12 ENI Editions - All rigths reserved

String txt=""; BufferedReader saisie; heures=17; minutes=55; secondes=48; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Combien de secondes ?"); txt=saisie.readLine(); } catch(Exception excp) { System.out.println("Erreur"); } nbsec=Integer.parseInt(txt); secondes+=nbsec; minutes+=(secondes/60); secondes=secondes%60; heures+=(minutes/60); minutes=minutes%60; jours+=(heures/24); heures=heures%24; System.out.println(jours+"d "+heures+":"+minutes+" :"+secondes); } }

Lestestspouroptimiser tesvoussurprisparlaformequerevtcetalgorithme?Probablementcarilnyaaucuntestdeffectu!Laquestion se pose : sontils dans ce cas vraiment ncessaires ? La rponse ne coule pas de source. Rappelezvous quil ne suffit pas quun algorithme fonctionne, mais quil fonctionne vite, bien, et quil soit conome. Estce le cas ? Cet algorithmeeffectueneufcalculs:additions,divisionsetmodulos.Sionrajoutedestests,onrajoutedesinstructions etlalgorithmedevientpluslong.Or,vousaurezloccasiondelevoirdansleschapitressuivants,lacomplexitdes algorithmesnestpaslieleurlongueur.Certainssonttrscourts(commeceluici)etpourtanttrsgourmanden ressources.Inversement,dautressontlongsetsemblentcompliquspourunrsultatdegranderapidit. Un test bien pos peut viter des calculs inutiles. Un calcul est gourmand en temps machine : le microprocesseur travaillepluslongtempsenfaisantdesdivisionsetdesmodulosquencomparantdeuxvaleurs:ellessontgalesou non, et dans le cas de nombres, il suffit de faire un ET pour voir si a retourne la mme valeur, une opration lmentairetrsrapide,bienplusquelemoindrecalcul.Autrementdit,vousaveztoutintrtfairedestestsquand ceuxcipeuventpermettredviterdescalculslourds. PROGRAMME HEURE2 VAR jours,heures,minutes,secondes,nbsec:entier DEBUT heures17 minutes55 secondes48 Afficher "Combien de secondes en plus ?" Saisir nbsec secondessecondes+nbsec Si secondes>59 Alors minutesminutes+(secondes / 60) secondesseconde % 60 Si minutes>59 Alors heuresheures+(minutes / 60) minutesminutes % 60 Si heures>23 Alors joursheures / 24

ENI Editions - All rigths reserved

- 13 -

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

Lalgbreboolen
1.Loriginedestests
Lestestseffectustantenalgorithmiquequenprogrammationsontdestestslogiques,oupluttfaisantappellalogique.Lechapitre Lesvariablesetoprateursadjbrivementabordcepointlorsquil a t question des oprateurs boolens. Les oprateurs dits logiquesET,OUetNONsontdesreprsentationsdelalogique.Dequellelogiqueparleton? Fondamentalement,lalogiqueestlammepourtoutlemonde,bienquevidemmentlinterprtationdesrsultatspuissevarierdun individu lautre(enstatistiqueparexemple).Lalogiqueestuniverselle.MonsieurSpock,silavaitexistnauraitpasditmieux.Mais jusqu peu (dans lchelle de lhumanit) il ny avait aucun moyen de se la reprsenter rellement, sous forme de symboles, dassertions,etc.Ilnyavaitaucunereprsentationformelledelalogique. Orunordinateurestlogique(mmesionpeutluidemanderdeschosesillogiques,cestvousquileprogrammezaprstout).Lalogique estmmelabasedenombreusesapplicationsmathmatiques,lectroniques,dintelligenceartificielle.Eninformatique,lematrielest lectronique et dpend de la logique, et les programmes dpendent tant de tests et de calculs faisant appel la logique, et devant fonctionnersurdescircuitslectroniques.Sanslogique,pasdlectronique,nidordinateurs,nideprogrammes. Cestcequifaitquelesoprateurs,conditionsettestsnedoiventpastrepossnimportecomment.Ilnyariendepluslogiquequun ordinateur,maisaussiriendeplusstupide:ilvabtement(etencorelanotiondebtiseluiestinconnue)excuterexactementceque vous lui demandez, mme si le rsultat entrane une erreur ou est faux et cela du moment que les tests sont bien poss et quune rponselogiquepeutentredduite.Ainsi: PROGRAMME STUPIDE VAR froid, nu, sortir en Boolen DEBUT FroidVRAI NuVRAI Si Froid=VRAI ET nu=VRAI Alors SortirVRAI FinSi FIN Cetalgorithmepeuttreainsiinterprt:"Silfaitfroiddehorsetquejesuisnu,alorsjepeuxsortir".Cetalgorithmeestpourvouset moi, tres humains, faux. Vous nallez pas sortir nu sil fait froid, vous auriez plutt intrt mettre Sortir FAUX, ou inverser la conditionfroidounu.Cestvident!Maislordinateursenfiche:ilnaaucunmoyendesavoirquevousavezfaituneerreurdansvos tests.Leprogrammeestmathmatiquementlogique:chaquetestanalysestcorrectetdonclesconditionssontrempliespourpasser lavariableSortirVRAI. Lasuiteabordedespointsthoriques.LebutnestpasdevousdonneruncoursmagistralsurlalgbredeBoolemaisdevousfournir desbasesdecomprhensiondufonctionnementdelalogiquevuductdelinformatique.Sivousvoulezallerplusloin,ilexisteune littrature consquente ce sujet dans les bibliothques et les librairies (par exemple, "Algbre de Boole" chez Masson). Sil vous intresseunjourdallerlargementaudeletdexplorerlesmcanismesdelogiqueetdepensehumaineoudintelligenceartificielle,il existe un gros ouvrage de rfrence, rfrence de nombreux scientifiques, informaticiens etc, qui sappelle "Gdel, Escher, Bach : les brinsduneguirlandeternelle",parDouglasHofstadter.

2.Petiteserreurs,grossesconsquences
Comprenezvousmaintenantlimportancedelalogiqueformelleetdebiencrirelestestsetconditionsdansunalgorithme? Pourvousconforterunpeuvoicideuxexemplesdeprogrammesmalcritsetdeleursdsastreusesconsquences.

a.Ariane5
Le 4 juin 1996 un bug dun programme de la premire fuse Ariane 5 a provoqu sa destruction aprs 40 secondes de vol. Le programmeenquestioncontrlaitlesgyroscopes(quiindiquentlorientation)delafuse.IlvenaitdAriane4etnavaitpasttestni modifi pour Ariane 5. En gros, un nombre de 64 bits a t converti en 16 bits. videmment a ne "rentre pas" et les valeurs retournes par ce programme sont devenus aberrantes. Or ce programme tait critique et naurait jamais d retourner de valeurs impossibles.Lesdonnesretournesntaientpastestesetvrifiesparleprogrammecentraldecalculdevolquilesprenaientpour argentcomptantetlesinterprtaienttellesquelles.Surunnombresign,ledernierbitcorrespondausigne.Lorsqueles16bitsont tremplis,ledernierbitestpassun.Leprogrammeareuuneindicationcommequoilafuseavaitchangdesens(pointaitvers lebas)etaorientlestuyresdesracteursenlesbraquantfondpourrectifierunesituationtotalementfausse.Lafuseadonc subi un moment donn de par la pousse et sa position, des forces arodynamiques telles que sa destruction est devenue invitable. Le comble ? Le programme des gyroscopes ne devait tre utilis que durant le compte rebours et uniquement sur les modlesAriane3!Autrementdit,ilnauraitjamaisdtreprsentnifonctionnerenvol.

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

ENI Editions - All rigths reserved

- 1-

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

3.GeorgeBoole
Comme indiqu dans le chapitre Les variables et oprateurs, cest langlais George Boole (18151684), logicien, mathmaticien et philosophe qui le premier a pos les bases de la formalisation de la logique en proposant une analyse mathmatique de celleci. En 1847ilpublieunlivreintitul"MathematicalAnalysisofLogic"(Analysemathmatiquedelalogique)puisen1854"AnInvestigationInto theLawsofThought,onWhichareFoundedtheMathematicalTheoriesofLogicandProbabilities".(Unerecherchesurlesloisdelapense, surlesquellessontfondeslesthoriesmathmatiquesdelogiqueetdeprobabilits).DanscesouvragesGeorgeBooledveloppeune nouvelle forme de logique. Le formalisme rassemble une logique symbolique et une logique mathmatique. Les ides doivent tre traduites mathmatiquement sous formes dquations. Cellesci peuvent ensuite tre transformes via des lois et leurs rsultats traduitsentermeslogiques. Boole cre alors un algbre bas sur deux valeurs numriques, le 0 et le 1, autrement dit le binaire, qui sera officialis et mis en pratiquedansletraitementdelinformationlesiclesuivantavecClaudeShannon. Durant sa vie, les travaux de Boole restrent au stade thorique. Cependant son algbre est la base de nombreuses applications quotidiennestellesquellectronique(lescircuitslogiques),linformatique(processeurs,programmes),lesprobabilits,llectricit(les relais), la tlphonie (les commutateurs), diverses recherches scientifiques, etc. N trs pauvre et autodidacte, George Boole finira membre de lillustreRoyalSocietyeteffectueradenombreuxtravauxsurlesquationsdiffrentielles.Ilmourradune pneumonie mal soigne.

4.Lalgbre
a.tablirunecommunication
GeorgeBooleadvelopplalgbrequiportesonnom.Ilestutilisenmathmatique,logique,lectroniqueetinformatique.Ilpermet deffectuer des oprations sur les variables logiques. Comme son nom lindique,ilpermetdutiliser des techniques algbriques pour traitercesvariableslogiques. Prenezlaphrasesuivanteabsolumentlogique"UnepropositionpeuttrevraieOUfausse,maisnepeutpastrevraieETfausse". Autrementditunevariablelogiquenedisposequedunseultatunmomentdonn:vraioufaux.Enprenantplusieurspropositions, onpeutappliquerentreellesdesformulesalgbriques. Lapremireutilisationdecetalgbrelatpourltablissementdecommunicationstlphoniquesvialacommutationtlphonique mise en place par Claude Shannon. Prenez cet exemple simple de mise en place dune communication tlphonique entre deux interlocuteurs.Unecommunicationncessitelafoisunmetteur(quimetlappel)etunrcepteur(celuiquidcroche).Onadonc: Communication=Emetteur ET rcepteur La communication est tablie si lmetteur appelle et que le rcepteur dcroche. En dautres termes, Communication est VRAIE si EmetteurestVRAIetrcepteurestVRAI.Danslesautrescas,lacommunicationnestablirapas,etseradoncFAUX.Sivousappelez quelquun(VRAI)maisquilnedcrochepas(FAUX),ouencorequevousdcrochez(VRAI)sansappelmis(FAUX),ouquepersonne nappelleninedcroche(FAUXdanslesdeuxcas),ilnyaaucunecommunicationdtablie.Onpeutendduirelatablesuivante: Emetteur FAUX(nappellepas) FAUX(nappellepas) VRAI(appelle) VRAI(appelle) Rcepteur FAUX(nedcrochepas) VRAI(dcroche) FAUX(nedcrochepas) VRAI(dcroche) Communication FAUX(pasdecomm.) FAUX(pasdecomm.) FAUX(pasdecomm.) VRAI(communication!)

Ne trouvezvous pas que cette table ressemble beaucoup loprateur logique ET ? Oui, cest un exemple concret dapplication de lalgbredeBoole.Cettetableotouteslesvariableslogiquessontposesavecleurrsultatsappelleunetabledevrit. ChaquecaseprendunevaleurVRAIouFAUX,etlacolonnefinalelersultatattendu,luimmeVRAIouFAUX.RemplacezVRAIetFAUX parlesvaleursbinairesrespectives1et0: Emetteur 0 0 1 Rcepteur 0 1 0 Communication 0 0 0

- 2-

ENI Editions - All rigths reserved

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


q

LetlphonesonneETvousvoulezrpondre, Vousvoulezappelerquelquun.

Autrementdit: Dcrocher=(Sonnerie ET volont de rpondre) OU envie dappeler quelquun DcrocherestVRAIsivotretlphonesonne(VRAI)ETquevousvoulezrpondre(VRAI)OUsivousvoulezappelerquelquun(VRAI).

b.Lavrit
Vous avez vu cidessus une table de vrit. Pour tablir celleci, vous avez besoin de variables logiques qui ne prennent que deux valeurs:VRAIouFAUX,quonappellelesvaleursdevrit.CesvaleursformentunensembleappelB.VRAIetFAUXnencessitent quedeuxchiffrespourtrereprsents:1et0.LensembleBsenoteainsi: B={1,0} Enmathmatique,vousconnaissezprobablementdautresensembles,commeparexemplelensembleNdesentiersnaturels.Surces ensemblessappliquentdeslois,desthormes,destransformations.CestpareilpourlensembleB,quiestrgitpardesloisetdes transformations.Decellescipeuventtredduitesunegrandequantitdepropritsetdedrivations.

c.LaloiET
VouslaconnaissezdjdepuislechapitreLesvariablesetoprateursetloprateurlogiqueassoci.LaloiETestaussiappelela conjonction.Ellesnonceainsi: AETbestVRAIsietseulementsiaestVRAIetbestVRAI LaloiETutiliseunenotationparticulirediffrenteselonlechampdapplication:
q

"."(lepoint):a.b "":ab "&","&&"ou"AND"enprogrammation,selonleslangages

Lasuiteduchapitreutiliseralapremirenotationaveclepoint.Cetteloiestsouventassocieunevraiemultiplication,car0*nvaut toujours0.Cependantattention,certainespropritsnesappliquentpasdutoutdelammemanire! La loi ET peut tre dcrite sous forme de table, ne pas confondre avec une table de vrit. Elle ressemble plutt une table de multiplication...

LoiET
a\b 0 1

0 0 0

1 0 1

d.LaloiOU
Vousconnaissezaussicetteloi,rencontreauchapitreLesvariablesetoprateursavecloprateurlogiqueassociOU.LaloiOUest aussi appele la disjonction. Vous trouvez parfois aussi disjonction inclusive afin de la diffrencier dun autre oprateur. Elle snonceainsi: AOUbestVRAIsietseulementsiaestVRAIoubestVRAI NotezqueleOUtantinclusif(onyvient),siaetbsontVRAIStouslesdeux,aOUbestVRAIaussi.Dumomentquaumoinslundes deuxestvrai,aOUbestVRAI. Lesnotationssuivantessontutilises:
q

"+"(signeplus):a+b "":ab

ENI Editions - All rigths reserved

- 3-

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

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

LoiOU
a\b 0 1

0 0 1

1 1 1

e.Lecontraire
Lecontraire,appelaussingationsedfinitainsi: LecontrairedeaestVRAIseulementsiaestFAUX. VousavezdjrencontrlecontraireavecloprateurNON.Lecontraireestnotcommececi:
q

nona a "!","NOT","~"selonleslangagesdeprogrammation.

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

f.Lesproprits
Lassociativit Elleestidentiquelalgbreclassique.Danscertainscas,lesparenthsessontinutiles.Ainsi: a+(b+c)=(a+b)+c=a+b+c Etencore: a.(b.c)=(a.b).c=a.b.c Lacommutativit Elleindiquequelordredesvariableslogiquesnaaucuneimportance: a+b=b+a Etencore: a.b=b.a Ladistributivit Attention,cettefoisilyaunediffrenceimportanteparrapportlalgbreclassiqueetladistributionlieauxoprateurs+et*.Cest laraisonpourlaquelleilatexpliququilnefallaitpaslesconfondreaveclessymboleslogiques.Eneffet,si: a.(b+c)=(a.b)+(a.c) estidentique, a+(b.c)=(a+b).(a+c) nelestpasdutout,maisestparfaitementcorrectenalgbredeBoole. Lidempotence Lidempotence signifie que si on applique la mme opration une ou plusieurs fois alors on retrouve toujours le mme rsultat. Par exemple3/1vauttoujours3,mmesivousdiviseznfoispar1.Cettepropritsappliqueauxdeuxoprateurs.Ainsi: a.a.a.a.a.a.a.a(etc)=a et a+a+a+a+a+a(etc)=a

- 4-

ENI Editions - All rigths reserved

Lacomplmentarit Langationdelangationdunevariablelogiqueestgalelavariablelogique.AinsilaphraseLavieestbellequivaut"Lavie nestpasnonbelle".Entermeslogiquesa=nonnona: a= Demme: a+a=1 Eneffet,lexpression"LavieestbelleOUlavienestpasbelle"quivaut0+1,cequiestVRAIdaprslaloiOU,lunedesvariablesau moinstantvraie.Enfin, a.a=0 quivautdireque"LavieestbelleETlavienestpasbelle",cequividemmentestimpossible.DaprslaloiET,1.0=0doncFAUX. Lapriorit En calcul classique, si vous faites 1+2*3, vous obtenez 7 car la multiplication est prioritaire sur laddition. En algbre de Boole les prioritssappliquentaussi.LeETestprioritairesurleOU.Vouspouvezcependantinfluersurlesprioritsaveclesparenthses.Voici deuxexemples.Danslesdeuxcas,aestFAUX(0),bestVRAI(1)etCestVRAI(1) Exemple1: a+b.c=?
q

LeETestprioritaire,oncommenceparb.c:1.1=1 PuisonpasseauOU:0+1=1 Onobtientdonca+b.c=VRAI

Exemple2: a.b+c=?
q

LeETestprioritaire,oncommencepara.b:0.1=0 PuisonpasseauOU:0+1=1 Onobtientdonca.b+c=1,VRAI

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

Prenezmaintenantcettesecondetabledevrit: a 0 0 1 1 b 0 1 0 1 a 1 1 0 0 b 1 0 1 0 a.b 1 0 0 0

Comparezlesdernirescolonnesetvousobtenezlgalitsuivante: (a+b)=a.b

ENI Editions - All rigths reserved

- 5-

Danslesdeuxcas,lersultatseraVRAIuniquementsiaETbsontFAUX. Delammemanire,avecunetabledevritpluscomplte: a 0 0 1 1 b 0 1 0 1 a.b 0 0 0 0 (a.b) 1 1 1 0 a 1 1 0 0 b 1 0 1 0 a+b 1 1 1 0

Comparezlacolonnecentraleaveclacolonnefinaleetvousobtenez: (a.b)=a+b Danslesdeuxcas,lersultatseraVRAIseulementsiaOUbsontFAUX.

g.Quelquesfonctionslogiques
Les fonctions logiques ne sont ni des lois ni des thormes : elles se dduisent de ces deux derniers sous forme de formules qui peuvent souvent tre rduites, auxquelles on a donn un nom pour les raccourcir et pour plus de pratique. Elles sont souvent "cbles"endurauseindesmicroprocesseursetproposesparquelqueslangagesdeprogrammation. LeOUexclusifXOR Pasdejeudemotsici,rienvoiraveclasriejaponaise.DansleOU(appelOUinclusif)lersultatestVRAIsiaouboulesdeuxsont vrais. Dans le OU exclusif, le rsultat est VRAI seulement si a ou b est vrai, mais pas les deux en mme temps. Traduisez ceci en algbredeBoole: (aOUb)ETPAS(aETb)soit(a+b).(a.b) Siondveloppeonobtient:
q

(a+b).(a+b)(lederniertermeprovientduthormedeDeMorgan) a.a+a.b+b.a+b.b a.aetb.bvalenttoujours0(FAUX),onlessupprime,ilreste a.b+a.b

Voicisatabledevrit: a 0 0 1 1 b 0 1 0 1 ab 0 1 1 0

LeOUexclusifestnotXOR(leXpoureXclusif).Vouslerencontrezsouscesnotations:
q

"":diffrentde,eneffetXORestparfaitementquivalent "":un+entour,ab

SileXORnestpas(oupeu)utilisenalgorithmique,beaucoupdelangagesdeprogrammationleproposent,permettantderemplacer une condition longue par une condition plus courte. Les programmeurs nont souvent pas le rflexe de lutiliser. La plupart des microprocesseurs intgrent directement une instruction de type XOR, accessible depuis le langage assembleur associ. Enfin en lectroniquelesapplicationssousformedeportelogiquesontnombreuses. LquivalenceEQV Lquivalenceportetrsbiensonnom.NoteEQV,ellesignifiequeaEQVbestVRAIsietseulementsiaetbontlammevaleur.En algbredeBoole: NON(aOUb)OU(aETb)soit(a+b)+(a.b)

- 6-

ENI Editions - All rigths reserved

Siondveloppeonobtient:
q

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

VoicilatabledevritdeEQV: a 0 0 1 1 b 0 1 0 1 ab 1 0 0 1

VousdevezremarquerquelquivalenceestlecontraireduXOR.Autrementdit: aEQVb=(aXORb) Si vous dveloppez encore la ngation de (a+b).(b+a) laide des proprits et du thorme de De Morgan, vous retrouvez la formulealgbriquedeXOR. LeEQVestsouventreprsentparlesymbole"":ab. Limplicationetlinhibition Laplupartdeslangagesneproposentpascesfonctions.Limplicationindiquequeaestuneconditionsuffisantepourb,tandisqueb est une condition ncessaire pour a. Cela signifie que si b est vrai, ou bien que si a et b sont identiques, lexpression est toujours vraie: LimplicationsenoteaIMPb. aIMPb=a+b a 0 0 1 1 b 0 1 0 1 ab 1 1 0 1

Linhibitionestlecontrairedelimplication,ellesenoteaINHb. aINHb=a.b A 0 0 1 1 b 0 1 0 1 Ab 0 0 1 0

h.Avecplusdedeuxvariables
Riennempche,etbienaucontraire,dutiliserplusdedeuxvariableslogiquesdansdesexpressionsdelalgbredeBoole.Reprenez lexempledeltablissementdelacommunicationtlphonique.Elledisposedetroisvariables:

ENI Editions - All rigths reserved

- 7-

sonner,quiseraappelea, rpondre,quiseraappelebet appeler,quiseraappelec.

Lersultat(dcrocher)serad,maisnintervientpasdanslescalculs.Quelleestlatablecorrespondante?Attentionilyaunpige. VRAIestreprsentpar1,FAUXpar0. a(sonner) 0 0 0 0 1 1 1 1 b(rpondre) 0 0 1 1 0 0 1 1 c(appeler) 0 1 0 1 0 1 0 1 d(dcrocher) 0 1 0 1 0 1 1 1

Avezvoustrouvlepige?asonne,onnapasenviederpondre,maisonveutappeler(pourappeler).Danscecasvousnallez pasdcrocher:vousattendrezqueletlphonearrtedesonner,orcidessusvouslefaitesquandmme.Donclatablecidessus nestpascorrecte.Uneligneestfausse.Voicilabonnetable: a(sonner) 0 0 0 0 1 1 1 1 b(rpondre) 0 0 1 1 0 0 1 1 c(appeler) 0 1 0 1 0 1 0 1 d(dcrocher) 0 1 0 1 0 0 1 1

Trouverlexpressionminimale Ladifficultconsistemaintenanttrouvercomment,depuiscettetabledevrit,dfiniruneexpressionboolennequiretourneVRAI. Vousconstatezqueseulesquatrelignesdelatabledevritsontvraies,cestdirequelapersonnevavraimentdcrocher. Lersultatest1quanda,betcvalent:


q

0,0,1 0,1,1 1,1,0 1,1,1

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

- 8-

ENI Editions - All rigths reserved

Ilestintressantderemarquerquelesdeuxpremierstermesdelexpressionpeuventtrefactorisspara.cetlesdeuxdernierspar a.bselonlapropritdedistributivit.Lersultatdevientdonc: d=(a.c).(b+b)+(a.b).(c+c) De mme comme la proprit de complmentarit indique que a+a= 1, les expressions b+b et c+c sont toujours vraies. Elles peuventtresupprimes.Lersultatfinaldevient: d=a.c+a.b Ce nest malheureusement pas toujours aussi vident. Avec quatre, cinq, six termes, les expressions deviennent beaucoup plus longues et complexes. Il faut toujours chercher faire au plus simple, avec le moins de termes et de variables possibles, quitte claterlesexpressionsboolennes. Applicationdanslalgorithme Enalgorithmique,lexpressionboolenneprcdenteseraittraduiteainsidansuntest: PROGRAMME TELEPHONE VAR a,b,c,d:boolens DEBUT aVRAI bVRAI cFAUX Si ((NON a) ET b) OU (a ET c) Alors dVRAI Sinon dFAUX FinSi Si d=VRAI Alors Afficher "Je dcroche" Sinon Afficher "Je ne dcroche pas" FinSi FIN Demanireplussimple,riennempchedefairececi: PROGRAMME TEL2 VAR a,b,c,d :boolens DEBUT aVRAI bVRAI cFAUX d((NON a) ET b) OU (a ET c) Si d Alors Afficher "Je dcroche" Sinon Afficher "Je ne dcroche pas" FinSi FIN Le"Sid"quivaut"Sid=VRAI".

5.Unedernireprcision
Soitlesconditionssuivantes:"Silfaitchaudetquilnepleutpas,alorsjevaismepromener". Vousaurezparfoislatentationdefairececi: PROGRAMME CHAUD VAR chaud,pleuvoir:boolens DEBUT chaudVRAI pleuvoirFAUX Si chaud=VRAI Alors Si pleuvoir=FAUX Alors Afficher "Je me promne " Sinon Afficher "Je rentre" FinSI Sinon Afficher "Je rentre " FinSI Fin

ENI Editions - All rigths reserved

- 9-

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

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:
q

3*1=3 2*2=6 3*3=9 3*9=27 3*10=30

Vous allez donc multiplier 3 successivement par les nombres de 1 10. En algorithmique, vous connaissez les variables.Commentaffecterunevaleurde110successivementunevariable?Avecuneboucle! Etsimaintenantvousvouliezcrerlensembledestablesdemultiplication:tablesde1,de2,etc,jusqu10ouplus? Ilvousfaudraimbriquerdeuxboucles! Sivousvoulezcalculerunepuissancequelconque,unefactorielle,sortirleplusgranddesnombresparmiunelistede nombressaisis(enattendantlestableaux),etc:ilfaudraencoreutiliserlesboucles. Dans le chapitre prcdent vous avez vu comment calculer les solutions dun polynme du second degr. Et si vous souhaitiez tracer sa courbe graphique via un programme (en Java par exemple) ? Il vous faudra encore utiliser une boucle(etquelquesastuces). Vousverrezquaveclesboucles,vouspourrezmmeextrairelesracinescarres. Cesexemplessimplesmettentenvidenceaumoinstroischoses:
q

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

ENI Editions - All rigths reserved

- 1-

Il est possible dimbriquer plusieurs niveaux de boucles : vous pouvez faire des boucles dans des boucles, autantdefoisquevouslevoulez. Il existe une quantit infinie dutilisation des boucles qui en font une structure incontournable en programmationpourlamoindredesapplicationsuntantsoitpeucomplexe.

- 2-

ENI Editions - All rigths reserved

TantQue
1.Structuregnrale
Laboucledetype"TantQue"permetlarptitiondunblocdinstructionstantquelaconditiontesteestvrifie,donc vraie.Sasyntaxeestlasuivante: Tant Que boolen Faire Bloc dinstructions FinTantQue Lorsdelexcutionduprogramme,celuiciarrivesurlinstruction"Tantque".Ilvaluelexpressionboolenne(uneou plusieursconditions,ouuneseulevariable).SilexpressionretourneVRAI,alorsleprogrammeexcutelesinstructions suivantesjusqucequilarriveau"FinTantQue".Arrivici,ilremonteau"TantQue"etvaluedenouveaulexpression boolenne,sicestVRAIalorsilexcutedenouveaulesinstructions,etainsidesuite,tantquelexpressionretourne VRAI.Silexpressiondevientfausse,alorsleprogrammesautelinstructionsituejusteaprsle"FinTantQue".Voici unsimpleexemplequicomptede110: PROGRAMME TQUE1 VAR Cpt:entier DEBUT Cpt1 Tant que Cpt<=10 Faire Afficher Cpt CptCpt+1 FinTantQue FIN EnJava,laboucle"TantQue"estreprsentepar"while()",aveclexpressionboolenneentreparenthses. while(booleen) { /* bloc dinstructions */ } Siuneseuleinstructionestprsenteauseindelaboucle,lesaccoladessontinutiles. while(boolen) instruction ; VoicilecodeJavacorrespondantlalgorithmeTQUE1: class chap4_tq1 { public static void main(String[] args) { int cpt; cpt=1; while(cpt<=10) { System.out.println(cpt); cpt++; } } }

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

ENI Editions - All rigths reserved

- 1-

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

E n 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

devientfausse:laboucleesttermine,etleprogrammesetermine. PROGRAMME MUTLI1 VAR table,cpt,resultat:entiers DEBUT Afficher "Quelle table de multiplication ?" Saisir table cpt1 Tant que cpt<=10 Faire resultatcpt*table Afficher table,"x",cpt,"=",resultat cptcpt+1 FinTantQue FIN CequidonneenJava: import java.io.*; class chap4_multi1 { public static void main(String[] args) { int cpt,table,resultat=1; String txt=""; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Table ?"); txt=saisie.readLine(); } catch(Exception excp) { System.out.println("Erreur"); } table=Integer.parseInt(txt); cpt=1; while(cpt<=10) { resultat=table*cpt; System.out.println(table+"x"+cpt+"="+resultat); cpt++; } } }

b.Unefactorielle
Danslemmeordredide,voiciunpetitalgorithmequicalculeunefactorielle.Pourrappel,lafactorielledenscritn! etsecalculeenmultiplianttouteslesvaleursde1n.Ainsi10!=10*9*8*7*6*5*4*3*2*1,soit3628800(amonte trsvite).Danschaquepassagedanslaboucleilsagitdemultiplierlecompteurparlersultatdelamultiplication prcdente. Notez quil est inutile de multiplier par un : a ne change pas le rsultat et du coup le programme effectue une boucle de trop. De mme, ce coupci lalgorithmecompteralenvers : il partira de n pour descendre jusqudeux. PROGRAMME FACT VAR cpt,resultat:entiers DEBUT Afficher "Quelle factorielle ?" Saisir cpt resultatcpt Tant que cpt>2 Faire cptcpt-1 resultatcpt*resultat FinTantQue Afficher resultat FIN CequidonneenJava:

ENI Editions - All rigths reserved

- 3-

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

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:
q

Premireboucle,tabledes1.Secondeboucle:excutionde1*1,1*2,1*31*10 Premireboucle,tabledes2.Secondeboucle:excutionde2*1,2*2,2*32*10 Premireboucle,tabledes3.Secondeboucle:excutionde3*1,3*2,3*33*10 Premireboucle,tabledes10.Secondeboucle:excutionde10*1,10*2,10*3

ENI Editions - All rigths reserved

- 5-

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

FinTantQue Fin CequidonneenJava: import java.io.*; class chap4_note { public static void main(String[] args) { String tnote; int note; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Note (<-1:sortie) ?"); tnote=saisie.readLine(); note=Integer.parseInt(tnote); while(note>-1) { if(note>20) { while(note <-1 || note>20) { System.out.println("Erreur ! Note (-1:sortie) ?"); tnote=saisie.readLine(); note=Integer.parseInt(tnote); } } if(note>-1) { System.out.println("Note actuelle :"+note); System.out.println("Note (-1:sortie) ?"); tnote=saisie.readLine(); note=Integer.parseInt(tnote); } } } catch(Exception excp) { System.out.println("Erreur"); } } } Cetalgorithmemontrequunesimplerptitiondesaisieestpluscomplexequilnyparait.Autoutdbutlutilisateur sevoitposerunepremirefoislaquestion,silrpond"1"toutdesuite,ilnentremmepasdanslaboucle.Dansla premireboucle,unevrificationesteffectuesurlavaliditdelanotesaisie:estellesuprieure20?Sioui,alors ilfautdenouveaueffectuerunesaisie,etreposerenbouclelaquestionautantdefoisquencessaire,cestdire tant que la note saisie nest pas comprise entre 1 et 20. Sachant que 1 est une condition de sortie, tous les traitements,ycomprislasaisiedunenouvellenote,nedoiventpastreeffectusdanscecas.Vousaveziciunetrs belleapplicationduncasoun"break"auraitpueffectivementtreutilis.Voiciunexemple(incomplet)quiremplace ledernier"Si"delalgorithmeprcdent: ... Tant que note>-1 Faire ... Si note=-1 Alors break FinSi Ecrire "Entrez une note" Lire note FinTantQue Laboucleprincipalepeuteneffettredirectementinterrompuedsquunenotede1estrencontre.Danscecas,il seraitmmepossibledallerplusloinenconsidrantlapremirebouclecommeinfinieeteneffectuantdedanstoutes lessaisiesetlaconditiondesortie: Variable note en Numrique Dbut Tant que VRAI Faire Ecrire "Entrez une note" Lire note

ENI Editions - All rigths reserved

- 7-

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

Uncompteurdunombredenotes. Lanoteminimale. Lanotemaximale. Lasommedetouteslesnotes. Lamoyenne.

Lamoyenneseffectueensortiedelaboucleprincipale,unefoislensembledesnotessaisi.Ilfautveillercequau moinsunenoteaittsaisie,sinonlalgorithmeeffectueraitunedivisionparzro,cequiestvidemmentimpossible. Auseindelaboucle,etseulementsilanotesaisieestdiffrentede1,lalgorithmecomparelaplusbassenoteavec lanoteactuelle,quidevientlaplusbasselecaschant,lammechoseestfaitepourlanotelaplushaute(vous prendrezsoindinitialisercorrectementcesvaleursdsledbut)etletotaldesnotesestcalcul.Ensortiedeboucle, ilneresteplusqufaireunedivision. Variables note,cpt,min,max,sum,moy en Numrique Dbut min20 max0 cpt0 sum0 Ecrire "Entrez une note" Lire note Tant que note>-1 Faire Si note >20 Alors Tant que note<-1 ou note>20 Faire Ecrire "Erreur (0->20, -1 sortie) :" Lire note FinTantQue FinSi Si note-1 Alors cptcpt+1 sumsum+note Si note<min Alors minnote FinSI Si note>max Alors maxnote FinSI Ecrire "Entrez une note" Lire note FinSi FinTantQue Si cpt>0 Alors moysum/cpt Ecrire "Nombre de notes :",cpt Ecrire "Note la plus basse :",min Ecrire "Note la plus haute : ",max Ecrire "Moyenne :",moy Sinon Ecrire "Aucune note na t saisie." FinSI Fin Le code Java prend quelques lgres distances avec cet algorithme en utilisant honteusement les facilits offertes parbreaketcontinue. import java.io.*; class chap4_moymax { public static void main(String[] args) { String tnote; int note,min,max,sum,cpt; float moy; BufferedReader saisie;

ENI Editions - All rigths reserved

- 9-

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:
q

3billetsde500euros 1billetde200euros 1billetde100euros 1billetde50euros 2billetsde20euros 1billetde5euros 1picede2euros 1picede1euro 1picede50centimes 1picede10centimes

- 10 -

ENI Editions - All rigths reserved

1picede5centimes 1picede2centimes

Autantlediretoutdesuite,cetalgorithmeestleparadisdesboucles.Ilenfaudrauneparvaleurfacialedebilletou depice.Leprincipeesteneffettrssimple.Ilsagitdesoustraireauseindunebouclelavaleurfacialedubillet,par exemple 500 euros, au montant total, tant que ce montant est suprieur ou gal la valeur du billet. chaque passagedanslaboucle,oncompteunbillet.Puisonpasseaubilletsuivantetainsidesuite.Voiciunexemplepour 1700eurosavecuniquementdesbilletsde500euros. Variables montant, nb500 en Numrique Dbut montant1700 nb5000 Tant Que montant>=500 Faire nb500nb500+1 montantmontant-500 FinTantQue Ecrire nb500, montant Fin CequidonneenJava: class chap4_monnaie { public static void main(String[] args) { String tnote; int montant,nb500; montant=1700; nb500=0; while(montant>=500) { nb500++; montant=montant-500; } System.out.println("Nombre de billets de 500: "+nb500); System.out.println("Reste :"+montant); } } Quesepassetillasortiedelaboucle?nb500vaut3,etmontantvaut200:cestlereste.Aussiilfautgnraliser lalgorithmepourtouteslesvaleurs. Variables montant,nb500,nb200,nb100,nb50,nb20,nb10,nb5 en Numrique Variables nb5,nb2,nb1,nb05,nb02,nb01,nb005,nb002,nb001 en Numrique Dbut montant1700 nb5000 nb200=0 nb100=0 nb50=0 nb20=0 nb10=0 ... nb002=0 nb001=0 Tant Que montant>=500 Faire nb500nb500+1 montantmontant-500 FinTantQue Tant Que montant>=200 Faire nb200nb200+1 montantmontant-200 FinTantQue Tant Que montant>=100 Faire nb100nb100+1 montantmontant-100 FinTantQue Tant Que montant>=50 Faire
ENI Editions - All rigths reserved - 11 -

nb50nb50+1 montantmontant-50 FinTantQue Tant Que montant>=20 Faire nb20nb20+1 montantmontant-20 FinTantQue ... Tant Que montant>=0.02 Faire nb002nb002+1 montantmontant-0.02 FinTantQue Tant Que montant>=0.01 Faire nb001nb001+1 montantmontant-0.01 FinTantQue Si nb500>0 Alors Ecrire nb500," billets de 500 euros" FinSI Si nb200>0 Alors Ecrire nb200," billets de 200 euros" FinSI ... Si nb002>0 Alors Ecrire nb002," pices de 2 centimes" FinSI Si nb001>0 Alors Ecrire nb001," pices de 1 centime" FinSI Fin Cet algorithme est dsesprant. Il est parfait en terme de fonctionnement et de logique, mais il est pouvantablement long, proportionnel au nombre de coupures disponibles dans chaque pays. Tellement long dailleurs que certaines parties totalement videntes ont t remplaces par des "".Estce possible de faire plus court ? Cest quil vous manque encore quelques notions et lments que vous dcouvrirez dans les prochains chapitres. Il est videmment possible de faire plus court. Vous verrez comment faire au prochain chapitre avec les tableaux,puisdanslesuivantencoreaveclesfonctions.

g.Troisboucles
Undernierexempledeboucle"TantQue"vavousmontreruneintgrationavectroisboucles.Lebutdecetanodin algorithme est de trouver pour quelles valeurs de A, B et C, ABC= A3 +B3 +C3 , A reprsentant les centaines, B les dizainesetClesunits.Larechercheseralimitepourchaquevaleurentirecompriseentre1et10(bienentendu, vous pouvez augmenter lintervalle mais celuici na pas t choisi au hasard). Lalgorithme ncessite trois boucles pour chacune des valeurs. Cest bien entendu au sein de la dernire boucle que les valeurs sont calcules et les rsultatsaffichsencasdgalit. Variables a,b,c,nb1,nb2 en Numrique Dbut a1 b1 c1 Tant que a<=10 Faire Tant que b<=10 Faire Tant que c<=10 Faire nb1a*100+b*10+c nb2a+b+c Si nb1=nb2 Alors Ecrire nb1,a,b,c FinSI cc+1 FinTantQue bb+1 FinTantQue aa+1 FinTantQue Fin

- 12 -

ENI Editions - All rigths reserved

SivousconvertissezceprogrammeenJava,vousdevriezobtenirseulementdeuxpossibilits:153et371.Eneffet 3+7+1=27+343+1=371 VoicileprogrammequivalentenJava: class chap4_troisboucles { public static void main(String[] args) { double x,y,z,nb1,nb2; x=1; while(x<=100) { y=1; while(y<=100) { z=1; while(z<=100) { nb1=x*100+y*10+z; nb2=Math.pow(x,3)+Math.pow(y,3)+Math.pow(z,3); if(nb1==nb2) { System.out.println(x+" "+y+" "+z); } z++; } y++; } x++; } } }

ENI Editions - All rigths reserved

- 13 -

RpterJusqu
1.Diffrencesfondamentales
Malgrlabondancedexemplesvusjusquprsent,lastructureitrative"TantQue"nestpaslaseule.Mmesilest possibledetoutprogrammeraveccetypedeboucle,ilenmanqueencoredeux,dontlastructure"RpterJusqu". Sonpseudocodeestlesuivant: Rpter Bloc dinstructions Jusqu boolen Le"Rpter"ressemblefortementau"Tantque"aveccependantdeuximportantesdiffrences:
q

Quoiquilarrive,ilyauratoujoursaumoinsunpassagedanslaboucle:leblocdinstructionsseraexcutau moinsunefois, Lexpressionboolennefinaleestinverse.Untantquea!=1devientun"jusqua=1".

Le"jusqu" se comprend comme "jusqu ce que la condition soit vrifie". Pour faire une boucle infinie il faut donc faire: Rpter Bloc dinstructions Jusqu FAUX Pour reprendre lalgorithme de saisie du relev de notes qui avait pos quelques problmes, celuicidevientunpeu plussimple: PROGRAMME REPETE VAR Note:entier Dbut Rpter Ecrire "Saisissez une note" Lire note Si note<-1 OU note>20 Alors Rpter Ecrire "Erreur (0->20, -1 sortie) :" Lire note Jusqu note>=-1 ET note <=20 FinSI Si note-1 Alors ... FinSI Jusqu note=-1 Fin LelangageJavaneproposepasdestructure"rpterjusqu".Parcontreilproposeunestructure"rpterTant Que".Ilsuffitdoncuniquementdinverserlaconditiondesortiedujusqu. do { /* bloc dinstructions */ }while(condition) ; LeprogrammeJavaavecquelquesfacilitspourraittre: import java.io.*; class chap4_note4 { public static void main(String[] args) { String tnote; int note; BufferedReader saisie;

ENI Editions - All rigths reserved

- 1-

saisie=new BufferedReader(new InputStreamReader(System.in)); try { do{ System.out.println("Note (<-1:sortie) ?"); tnote=saisie.readLine(); note=Integer.parseInt(tnote); if(note>20) { System.out.println("Erreur"); continue; } if(note>-1) System.out.println(note); }while(note>-1); } catch(Exception excp) { System.out.println("Erreur"); } } } Notezbienattentivementlaconditiondesortiecentrale:lanotedoittresuprieureougale1ETinfrieureou gale 20 pour sortir de la saisie. Avec le "Tant que", la boucle continuait tant que la note tait infrieure 1OU suprieure20.Unenuance,maisdetaille. Cesnuancessontlunedesraisonsquifontquedestudiantsetdesprogrammeurs,pourtantparfoischevronns,sy perdent. Cest aussi lune des raisons qui fait que la boucle "Rpter jusqu" nest pas prsente dans certains langagescommeleCouJava.EnJavacependant,voustrouvezunebouclequivalenteau"RpterTantQue",le "dowhile",quireprendlefaitduneitrationobligatoire,maisaveclesmmesexpressionsboolennesquele"Tant Que"initial.

2.Quelquesexemplesadapts
a.Lafactorielle
Inutilededcrirenouveauleprincipe.Laboucledoittrequittequandlecompteurvaut2. Variables cpt, resultat en Numrique Dbut Ecrire "Quelle factorielle ?" Lire cpt resultatcpt Rpter cptcpt-1 resultatcpt*resultat Jusqu cpt=2 Ecrire resultat Fin

b.Lestroisboucles
Lencore,mmeprogrammemaisstylediffrent.Notezqueicilescompteurspartentde0afindtreincrmentsen dbutdeboucle,danslebutderendrelaconditiondesortiepluslisible(gale10). Variables a,b,c,nb1,nb2 en Numrique Dbut a0 b0 c0 Rpter aa+1 Rpter bb+1 Rpter cc+1 nb1a*100+b*10+c
- 2 ENI Editions - All rigths reserved

nb2a+b+c Si nb1=nb2 Alors Ecrire nb1,a,b,c FinSI Jusqu c=10 Jusqu b=10 Jusqu a=10 Fin EnJava: class chap4_troisboucles2 { public static void main(String[] args) { double x,y,z,nb1,nb2; x=1; do { y=1; do { z=1; do { nb1=x*100+y*10+z; nb2=Math.pow(x,3)+Math.pow(y,3)+Math.pow(z,3); if(nb1==nb2) { System.out.println(nb1+"="+nb2+", "+x+" "+y+" "+z); } z++; }while(z<=10); y++; }while(y<=10); x++; }while(x<=10); } }

ENI Editions - All rigths reserved

- 3-

PourFinPour
1.Unestructurepourcompter
Troisime et dernire structure itrative de lalgorithmique, le "Pour Fin Pour" est une boucle lusage quasi exclusifdescompteurs.chaquepassagedanslaboucle,uncompteurestincrmentoudcrment,selonlecas.On ditalorsquilsagitdunestructureincrmentale. Sasyntaxeenpseudocodeestlasuivante: Pour variable De dbut fin [PAS pas] Faire Bloc dinstructions Fin Pour chaquepassagedanslaboucle,lavariableprendrasuccessivementchacunedesvaleursdanslintervalle[ab](aet binclus).Lepasestoptionneletestde1pardfaut.Lepseudocodesuivantcomptede110: Variable cpt en Numrique Dbut Pour cpt De 1 10 Faire Ecrire cpt Fin Pour Fin Ilestpossibledetrouverdessyntaxeslgrementdiffrentes,ellessontcependanttoutesquivalentes: Pour variable Allant De dbut fin [PAS pas] Faire Bloc dinstructions Fin Pour Ouencore: Pour compteur dbut fin [Pas pas] Bloc dinstructions compteur suivant Danscettedernireforme,ilestintressantdeconstaterquilestplussimple,danslecasdebouclescontenantun grosblocdinstructions,desyretrouver,lavariabletantrptedanslasyntaxedefindeboucle.Enfinilestpossible detrouverdessyntaxesalternativesdrivantdecestroisdernires.

2.maispasindispensable
Vous aurez rapidement compris que cette boucle ne sert que pour des compteurs. Autrement dit, tout ce quelle proposeestdjintgralementpossibleaveclesstructures"TantQue"et"Rpter".Simplementavecle"Pour"vous navezpasfairevousmmelecalculducompteur.Cestdoncunesimplification. I lnexisteaucuncasolastructure"PourFinPour"eststrictementncessaire.Ellenefaitquesimplifierles autresstructuresitrativeslorsdelutilisationdecompteurs.

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

ENI Editions - All rigths reserved

- 1-

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. N e 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

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

b.Lafactorielle
Encore un classique : avec une factorielle de n, vous savez lavance le nombre ditrations ncessaire : n. Cest doncuneapplicationdechoixpourlastructure"PourFinPour". Variables cpt, i, resultat en Numrique Dbut Ecrire "Quelle factorielle ?" Lire cpt resultat1 Pour i de 2 cpt resultati*resultat Fin Pour Ecrire resultat Fin EnJava: import java.io.*; class chap4_fact3 { public static void main(String[] args) { Long i,cpt,resultat; String txt=""; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Table ?"); txt=saisie.readLine(); } catch(Exception excp) { System.out.println("Erreur"); } cpt=Long.parseLong(txt); resultat=1l; for(i=2l;i<=cpt;i++) resultat=resultat*i; System.out.println(resultat); } }

c.Racinecarreavecprcision
Ilfallaitbieninnover,voilquiestfaitaveclecalculduneracinecarre.Savezvousextraireuneracinecarrela main?Avantlapparitiondescalculatrices,leslycensettudiantsutilisaientsoitdestablesoudesrglescalcul, soit les calculaient euxmmes. Il serait possible de dcrire la mthode utilise mais il manque encore quelques notions. Une mthode plus mathmatique est lalgorithme de Hron dAlexandrie. Cet homme aussi appel Hron lAncientaitunmathmaticien,mcanicienetingnieurgrecnAlexandrieau1ersicledenotrere.Ilacritde nombreuxtraitsetlaissquelquesformulesdontlunepermettantdecalculerlaireduntriangleenfonctiondela longueurdesesctsetuneautrepermettantdapprocherlavaleurduneracinecarredemanirercursive.Voici commenttrouverlaformule:

ENI Editions - All rigths reserved

- 3-

FormuledeHrondAlexandrie Lasuitefinalepermetdecalculerlaracinecarreenfonctiondunevaleurinitialearbitrairex0 .Enprincipe,onutilise lavaleurentireapprochedelaracinecarre,laformulepermettantinitialementdobtenirrapidementlesnombres situsaprslavirgule.Doncsivouscherchezlaracinecarrede40,sachantque6x6vaut36etque7*7vaut49,la racinecarreestcompriseentrelesdeux,vousdevriezmettre6.Cependantdanslapratique,nimportequellevaleur peutconvenir,avecunnombreimportantditrationsvousobtiendrieztoujourslersultatattendu,autantenplaant 1que10000. Il est cependant trs intressant de pouvoir optimiser le calcul en rcuprant lentier le plus proche. Du coup lalgorithmeseraextrmementprcis.Celuicicontiendradeuxboucles.Lapremiredetype"TantQue",chargede calculer lentier x le plus proche de la racine carre de a. La seconde de type "Pour" calculera les dcimales. Le nombre ditrations permettra de dterminer une prcision. Dailleurs, inutile dexcuter cette seconde boucle si le rsultatdelapremirecorrespondlaracinerecherche. Variables i,x,a,cpt en Numrique Dbut x1 39 cpt5 Tant Que (x*x)<a Faire xx+1 Fin Tant Que Si (x*x) !=a Alors xx-1 Pour i de 1 cpt Faire x0.5*(x+a/x) Fin Pour FinSi Ecrire "La racine de ",a," est ",x Fin Vousalleztretonndelapertinenceetdelaprcisiondesrsultats.Ainsienseulementtroisouquatreitrations, la prcision est suffisante pour la plupart des applications. Malheureusement, et vous le verrez dans la suite de louvrage, cest beaucoup de travail pour pas grand chose : les langages sont fournis avec des instructions particulires permettant deffectuer ces calculs, dautant plus que les fameux FPU (coprocesseurs arithmtiques) disposentduneinstructionendurrienquepoura(FSQRTparexemplesurunvieuxMotorolaMC68881). Enattendant,voicilatranscriptiondececalculavancenJava: class chap4_racine {

- 4-

ENI Editions - All rigths reserved

public static void main(String[] args) { double i,x,a,cpt; x=1; a=31; cpt=5; while(x*x<a) { x++; } if(x*x!=a) { x-; for(i=1;i<=cpt;i++) { x=0.5*(x+(a/x)); } } System.out.println(x); System.out.println(Math.pow(x,2)); } }

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

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


q

Effectuerndivisionssuccessivesde1/n. Multipliercersultatpar6. ExtrairelaracinecarredecersultatpourobtenirPI.

Variables i,x,a,cpt en Numrique Dbut cpt100000 a2 Pour i de 2 cpt Faire aa+1/(i*i) Fin Pour aa*6 x1 Tant Que (x*x)<a Faire xx+1 Fin Tant Que Si (x*x) !=a Alors xx-1 cpt10 Pour i de 1 cpt Faire x0.5*(x+a/x) Fin Pour FinSi Ecrire "La valeur de PI est ",x Fin Question:Combienfautilditrationspourobtenirseptchiffrescorrectsaprslavirgule?VoicileprogrammeJava correspondant,quidevraitvousfournirunepetiteide:

ENI Editions - All rigths reserved

- 5-

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

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

U n 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.

ENI Editions - All rigths reserved

- 1-

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:
q

Silanumrotationcommence1,lesindicesvontdevaleur[1]valeur[10]. Silanumrotationcommence0,lesindicesvontdevaleur[0]valeur[9].CestlecasdulangageCouduJava.

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

e.Utilisation

- 2-

ENI Editions - All rigths reserved

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:
q

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

Il existe en pseudocode algorithmique une instruction appele "Redim" qui permet de redimensionner un tableau dont le nombredlmentsnestpasconnulavance.Cependant,ilestsouventconseilldviterdelutiliser.Cetteinstructiontrouve son utilit dans le fait quen pseudocode les variables et les tableaux sont dclars avant le programme, ce qui induit limpossibilitdinitialiserlenombredlments duntableausuivantlavaleurdunevariable.Cependantleslangagescomme Javadisposentdemcanismespermettantdedclarerdestableauxsansforcmentconnatreleurtaillelavance. Sivousdevezutiliserdestableauxdynamiques,alorsvousnedevezpasindiquerdenombresdlmentsdansladclaration. Celaserafaitdanslinstructionderedimensionnement. PROGRAMME REDIM VAR Elements :tableau[] dentiers Nb:entier DEBUT Ecrire "Combien dlments ?" Lire nb Redim elements[1..nb-1] FIN

V ous 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. Unedimension Indiqueztoutdabordletype,puislenom,commepourunevariable,suividescrochets.CettepremirenotationestissueduC etduC++,etestsouventutiliseparlesprogrammeursissusdeceslangages: int tab[];

ENI Editions - All rigths reserved

- 3-

Lasyntaxesuivante,aveclescrochetsauniveaudutype,estquivalente: int[] tab; Vousindiquezainsiquetabcontiendrauntableaudentiersunedimension.Notezquelatailledutableaunestpasprcise au moment de sa dclaration. Vous ne spcifiez la taille du tableau quau moment de son utilisation. a peut sembler surprenant, mais a vite un ventuel gchis de mmoire si le tableau nest soit jamais utilis, soit de taille excessive. Une pratiquecouranteconsisterserverunmaximumdlmentsdsledbut,aucaso.Cestunebienmauvaisepratique. Pourindiquerlenombredlmentsdutableau,utilisezlasyntaxesuivante: tableau = new type[taille]; Pouruntableaudentiersdedixlments,vousferezdonc: tab=new int[10]; Vouspouvezlafoisdclareruntableauetsonnombredlmentsenmixantlesdeuxsyntaxes: int tab[]=new int[10] ; int[] tab2=new int[20] ; Touslestypespeuventfairelobjetdetableaux.Pourdixlments,lesindicesentrecrochetsvontde09.Suivantletypedu tableau, les lments ont des valeurs prdfinies quivalentes 0 pour les types numriques, False pour les boolens, caractrenulpourletypecaractre,null(valeurnulle)pourlesautres. Vouspouvezdclareruntableauavecdesvaleursprdfiniescommececi: int t[]={2,7,9,10,11,14,17,18,20,22}; oucommecela: int[] t={2,7,9,10,11,14,17,18,20,22}; Cequirevientexactementaumme. Vous accdez au contenu de chaque lment exactement comme prvu, savoir en mettant le numro de lindice entre les crochets. tab[2]=254 ; total=total+tab[3] ; Vouspouvezobtenirlenombredlmentsduntableaulaidedunepropritparticulireappelelength. nb=tab.length ; Vous pouvez redfinir un tableau nimporte quel moment, exactement comme si vous indiquiez son nombre dlments, cependantattention:touteslesanciennesvaleurssontperdues. Rfrencesdetableaux Attentioniciilyaunnormepige,tellementgrosquelesdbutantssousJavatombenttousdedanslesdeuxpiedsjoints.Il estpossibleenJavadefairececi: int[] t={2,7,9,10,11,14,17,18,20,22}; int[] copie; copie=t ; La dernire ligne donne limpression que le tableau t est copi dans le tableau copie. Or Java fonctionne par rfrence. Le principeestexpliqudanslepointsuivantsurlareprsentationmmoireetdanslechapitreNotionsavances.Ici,cenestpas letableauquiestcopi:copiereoitlarfrencedutableaut.Lesvariablescopieettrfrencentlemmetableau:sivous modifiez un lment de copie, vous modifiez llment correspondant de t puisquils rfrencent le mme tableau, le mme endroit dans la mmoire. Lexemple suivant met ceci en lumire : un lment de copie est modifi, puis on affiche llment correspondantdet:cestlemme. class chap5_tab1 { public static void main(String[] args) { int[] t={2,7,9,10,11,14,17,18,20,22}; int[] copie=t; System.out.println(t[2]); copie[2]=5; System.out.println(t[2]);

- 4-

ENI Editions - All rigths reserved

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

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

Lesdeuxcassonttraitsdanslexemplesuivant. class chap5_tabcopie { public static void main(String[] args) { int[] t={2,7,9,10,11,14,17,18,20,22}; int[] copie; int i; copie=new int[t.length]; /* mthode 1 : boucle */ for(i=0;i<t.length;i++) copie[i]=t[i]; /* mthode 2 : arraycopy */ System.arraycopy(t,0,copie,0,t.length); System.out.println(t[2]); copie[2]=5; System.out.println(t[2]); } }

Tableauxndimensions Java sait manipuler des tableaux plusieurs dimensions. Selon le principe prcdent, le nom du tableau reprsente une rfrence sur le tableau en mmoire. Dans un tableau n dimensions, chaque dimension rfrence son propre tableau indpendant en mmoire. Chaque indice de la premire dimension rfrence un tableau pour chaque deuxime dimension. Cestainsiquilestpossiblequelenombredindicesdeladeuximedimension(oudelatroisime,quatrime,etc.)nesoitpas lemmeselonlindicedelapremiredimension.Lasuitevousprsentequelqueslmentspratiques. Vousdclarezuntableaundimensionsenplaantautantdecrochetsquededimensionssouhaites: /* deux dimensions */ int[][] t1 ; int t2[][] ; /* trois dimensions */ int[][][] t3 ; int t4[][][] ; Pourindiquerlenombredlments,faitescommepouruneseuledimension,placezlenombredindicesentrelescrochets: t1=new int[5][10] ; Vouspouvezaussilefairedirectementdansladclaration: int[][] t2=new int[6][12] ; Ilestpossibledefairevarierlenombredindices.Imaginezletableaut2commedevantstockerlesnotesdesixclasses,mais quelenombredtudiantsparclassevariede1725.Voicicommentprocder: int[][] t2=new int[6][] t2[0]=new int[17] ; t2[1]=new int[20] ; t2[2]=new int[19] ; t2[3]=new int[25]; ... Chaquelmentdelapremiredimensionrfrenceuntableaudenlments(lasecondedimension),npouvanttrevariable. Pour initialiser le contenu dun tableau avec des valeurs prdfinies, comme pour un tableau une dimension utilisez les accolades.Seulementicivousdevezimbriquerplusieursniveauxdaccolades,unniveaupardimension,commececi:

ENI Editions - All rigths reserved

- 5-

int[][] t2={ { 10,17,8,9,10,20,13,11,7,5} , // 0,0 0,9 { 9,14,2,0,18,10,16,19,18,6} , // 1,0 1,9 { 17,8,9,7,10,12,11,14,11} } ; // 2,0 2,8 La taille de chaque dimension dun tableau peut tre rcupre avec la proprit length. Cependant attention, vous nobtiendrez pas le nombre total dlments de tout le tableau, mais pour chaque dimension. Lexemple suivant met ceci en lumirepouruntableaudeuxdimensions.Pourobtenirlenombredlmentsdechaquedimension,rcuprezlaproprit lengthpourchacunedecesdimensions: class chap5_2dim { public static void main(String[] args) { int[][] t=new int[3][]; int i,total=0; t[0]=new int[10]; t[1]=new int[8]; t[2]=new int[9]; System.out.println(t.length); // 1ere dimension for(i=0;i<t.length;i++) { total+=t[i].length; // calcul nb total delements System.out.println(t[i].length); } System.out.println(total); } }

3.Reprsentationenmmoire
a.Reprsentationlinaire
En principe, les lments dun tableau sont placs dans des cases contigus en mmoire. Si vous prenez un tableau de dix nombres,ilpourraittrereprsentainsi: Case Indice Valeur 13121 1 15 13122 2 17 13123 3 8 13124 4 13 13125 5 10 13126 6 6 13127 7 9 13128 8 13 13129 9 14 13130 10 11

La case est le numro de la case mmoire, lindice le numro dans le tableau et la valeur la note associe lindice. Une constatation simposedellemme : les numros des cases mmoire (les adresses) nontpasderapportaveclindice, mis partlefaitquilssontcontigus. Autantsereprsenteruntableaudescalairesunedimension(unseulindice)enmmoireestsimple,autantsereprsenter deux ou n dimensions devient un peu moins vident, dautant plus que cette reprsentation peut varier dun langage un autre.Commelenombremaximaldindiceestconnulavance(danslecasdupseudocodealgorithmique),untableaudeux dimensionspeuttrefacilementtransposentableauuneseuledimension. Soituntableaunote[1..3][1..5]:deuxdimensions,quireprsententquinzevaleurs.Voicicommentcecipourraittrereprsent enmmoire: Adr Ind Val 143 1,1 10 144 1,2 7 145 1,3 14 146 1,4 8 147 1,5 12 148 2,1 11 149 2,2 5 150 2,3 12 151 2,4 13 152 2,5 18 153 3,1 20 154 3,2 2 155 3,3 0 156 3,4 17 157 3,5 16

La premire ligne reprsente ladresse de la case mmoire associe aux diffrents indices du tableau. Cette valeur est bien entenduentirementarbitraireetestconnuedulangagemettanten uvreletableau. La deuxime ligne reprsente les indices des diffrents lments du tableau. Remarquez que dans cette reprsentation, on commence par la premire dimension, puis par la deuxime, etc. Un tableau n dimensions peut donc tre reprsent de maniretotalementlinaire.Ilestpratiqueendbutantdesereprsenteruntableaudeuxdimensionsentermesdelignes etdecolonnes.Maiscettevuedelespritesttotalementfausse:lammoireentantquetellenepeuttrereprsenteainsi, elleestlinaire(lefameuxruban).Untableaustaledonclinairementdanslammoire,dunemanireouduneautre.Cette dernireremarqueestsujettecautioncommevousleverrezunpeuplusbas. Dans le cas du tableau deux dimensions, comment un langage utilisant ce principe peut connatre la position exacte dun lmentenmmoire?Soit:

- 6-

ENI Editions - All rigths reserved

mlapositionconnuedupremierlment, xlindicedelapremiredimensionmoins1, ylindicedelasecondedimensionmoins1, Mylataillemaximaledelapremiredimension.

Lapositionpenmmoireest: p=m+(x*My)+y Prenez,daprsletableaucidessus,llmentdindice3,4:xvaut2,yvaut3,Mxvaut5etmvaut143. p=143+(2*5)+3=156 Soitunnouveautableaunote2[1..2][1..2][1..3],ilpourraittrereprsentainsi: Adr Ind Val 1512 1,1,1 10 1513 1,1,2 12 1514 1,1,3 14 1515 1,2,1 10 1516 1,2,2 15 1517 1,2,3 9 1518 2,1,1 8 1519 2,1,2 13 1520 2,1,3 7 1521 2,2,1 5 1522 2,2,2 14 1523 2,2,3 20

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

b.Reprsentationparrfrence
La reprsentation linaire cidessus est bien pratique pour votre imagination, mais montre ses limites dans certains cas. Notamment,quesepassetilaveclestypesquinesontpasdesscalaires?Prenezlexempleleplussimple:untableaude chanesdecaractres. Danslammoireetcommevuprcdemment,unechanedecaractresestreprsenteparunesuitedevaleursnumriques: lescodesASCII(ouunicode,selonlecas).Lemot"Bonjour"estreprsentainsi: Lettre ASCII B 66 o 111 n 110 j 106 o 111 u 117 r 114

Sachant quon ne connat pas forcment lavance la longueur dune chane de caractres, celleci se termine souvent, et suivantleslangages,paruncaractrenul.Aussienmmoire,vousobtiendrezceci: Adresse Contenu 1616 66 1617 111 1618 110 1619 106 1620 111 1621 117 1622 114 1623 0

Cettebrvetudemetenvidencedeuxproblmes:
q

Dansuntableauuneseuledimension,ilnestpasvidentdereprsenterlesindicesdeschanesdecaractres.Une astucepourraitconsisterrechercherlescaractresnuls(0)pourretrouverlesindicessuivants(lecaractresuivant estlepremierdelachanedindice+1).Mais: La longueur dunechanedecaractresntantpasfixe,commentrserverlavancelespacecontiguncessaireau stockagedenchanesdansuntableaudenlments?

Vous pourriez videmment contourner ce problme en dcrtant de manire totalement arbitraire que les chanes de caractres stockes dans votre tableau ont une longueur fixe. Mais quelle perte de place si votre chane ne fait que deux caractrespourdeuxcentsrservs!Cenestpasunesolutionretenir. Pour crer des tableaux n dimensions quelques langages et non des moindres, utilisent une autre mthode. Pour plus de clart,lemieuxestdecomprendreleprincipetoutdabordavecuntableauunedimension,puisdeux. Une chane dune longueur de n caractres est en fait bien souvent un tableau une dimension comportant n+1 indices, sachant que le dernier indice contiendra un caractre nul. Chaque lment du tableau est le code ASCII (ou unicode) correspondant au caractre de la position (indice) donne. Ainsi les variables de type Alphanumrique sont, en fonction du langage, des artifices ou plutt des facilits censes simplifier la vie du dveloppeur. Quand vous affectez une chane de caractrescetypedevariable,lelangageconnatlalongueurdecettechane(a="Salut",lalongueurdeSalutest5)etva

ENI Editions - All rigths reserved

- 7-

allouerlespacemmoirecontiguncessaireaustockagedecettechane.Quereprsentealorslavariable?Biensouventce seralapositionenmmoiredelachanedecaractres,autrementditsonadresse. Pour reprendre lexemple de la chane de caractres "Bonjour" cidessus, elle dbute ladresse mmoire 1616. Si cest la variable "txt" qui "contient" cette chane, txt va en fait rfrencer le tableau de caractres prsent ladresse 1616. Cest flagrantavecdeslangagescommeleCquipermettentdemanipulerdirectementlesadressesmmoireetleurcontenu. Prenezmaintenantuntableaudecinqchanesdecaractres: PROGRAMME TABCHAINES VAR Messages:tableau[1..5] de chanes DEBUT Messages[1]"il" Messages[2]"ne" Messages[3]"fait" Messages[4]"pas" Messages[5]"beau" FIN Poursereprsentercecienmmoire,ilfautdabordsereprsenterlorganisationdeschanesdecaractres.Soitlaphrase"il nefaitpasbeau",vousvoulezplacerchacundesmotsdansunlmentduntableau: Adresses Contenu 2007>2009 Il 2010>2012 Ne 2013>2017 Fait 2018>2021 Pas 2022>2026 Beau

Notezdeuxchoses:
q

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

Letableaudechanedecaractrescontiendraitdonclesrfrencesdesadressesmmoiresosontrellementstockesles chanesdecaractres: Indice Rfrence 0 2007 1 2010 2 2013 3 2018 4 2022

Unastucieuxtourdepassepassequipermetdenombreuseschoses!

- 8-

ENI Editions - All rigths reserved

Manipulationssimples
1.Recherchedunlment
Vousdisposezduntableaudenlmentscorrespondantauxprnomsdevosamis,etvousvoulezsavoirsi lunde ceuxciestbienprsentdansvotretableau.Ilfautalorslerechercher.Leprincipeconsistebalayerlintgralitdu tableau laide dune structure itrative et en sortir ds que llment a t trouv ou que le nombre maximal dindiceatdpass.lasortiedelaboucle,ilfaudradenouveauvrifierpoursavoirsiouiounonllmentat trouv:ilsepeuteneffetquetoutletableauaittparcouruetquecesoitlaraisondelasortiedelaboucle. PROGRAMME RECHERCHE VAR Tableau noms:tableau[1..10] de chanes rech:chane i:entier DEBUT i1 Tant que i<=10 et noms[i]<>rech Faire ii+1 FinTantQue ii-1 Si nom[i]=Rech Alors Afficher "Trouv" Sinon Afficher "Absent" FinSi FIN Ilyalapossibilitdefairediffremmentavecundrapeau: PROGRAMME RECHERCHE2 VAR Tableau noms:tableau[1..10] de chanes Rech:chane i:entier trouve:boolen DEBUT i1 trouveFAUX Tant que i<=10 et trouve=FAUX Faire Si nom[1]=rech Alors trouveVRAI FinSi ii+1 FinTantQue Si trouve Alors Affiche "Trouv" Sinon Affiche "Absent" FinSi FIN EnJava: class chap5_recherche { public static void main(String[] args) { int[] t={10,20,14,25,17,8,10,12,15,5,41,19,2,6,21}; int i=0,rech; boolean trouve=false; rech=15; while(i<t.length && !trouve) { if(t[i]==rech) trouve=true; i++;

ENI Editions - All rigths reserved

- 1-

} 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

Letableaudisposededeuxdimensions,3x3. Ilfautauseindunebouclepermuterlesjoueurs. Siunepositionestdjoccupe,ilfautdenouveauposerlaquestion. Aprschaquecoup,ilfautvrifiertoutesleslignes,colonnesetdiagonales. Siuneligne,colonne,diagonaleestcomplte,onsortdelaboucle. Encasdevictoire,ilfautindiquerquelpion(x,o)agagn. Ilfautgrerlematchnul:neuftoursetpersonnenagagn.

Leprogrammequisuitnestpasoptimis,demaniretoutfaitvolontaire,afindeforcerlamanipulationdesindices detableauxdeuxdimensions: PROGRAMME MORPION VAR p:tableau[1..3][1...3] de caractres i,j,x,y,nbtours:entiers pion :caractre gagne:boolen DEBUT /* Initialisation du plateau : que des blancs */ Pour i allant de 1 3 Faire Pour j allant de 1 3 Faire p[i][j]" " FinPour FinPour gagneFAUX nbtour0 /* Boucle de jeu */ Rpter /* Changement du pion (joueur) */ Si pion<>"o" Alors Pion"o" Sinon Pion"x" FinSi /* Affichage du plateau */ Pour i allant de 1 3 Faire Afficher p[i][1],p[i][2],p[i][3] FinPour /* Saisie des coordonnes */ Rpter Afficher "Coordonnes ? (x,y)" Saisir x,y Jusqu x>=1 ET x<=3 ET y>=1 ET y<=3 ET p[x][y]=" " /* Mise en place du pion */ p[x][y] pion /* Vrification en ligne */ i1 Tant que i<=3 ET NON gagne Si p[i][1]!=" " ET p[i][1]=p[i][2] ET p[i][1]=p[i][3] alors gagneVRAI FinSi ii+1 FinTantQue
ENI Editions - All rigths reserved - 3-

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

} catch(Exception excp) { System.out.println("Erreur"); } x=Integer.parseInt(tx)-1; y=Integer.parseInt(ty)-1; }while(x<0 || x>2 || y<0 || y>2 || p[x][y]!= ); p[x][y]=pion; /* Ligne */ i=0; while(i<3 && !gagne) { if(p[i][0]!= && p[i][0]==p[i][1] && p[i][0]==p[i][2]) gagne=true; i++; } /* Colonne */ i=0; while(i<3 && !gagne) { if(p[0][i]!= && p[0][i]==p[1][i] && p[0][i]==p[2][i]) gagne=true; i++; } /* Deux diagonales */ if(p[1][1]!= && ((p[0][0]==p[1][1] && p[0][0]==p[2][2]) || (p[0][2]==p[1][1] && p[0][2]==p[2][0]))) gagne=true; nbtours+=1; }while(!gagne && nbtours!=9); // fin boucle /* Plateau */ System.out.println(" 1 2 3"); for(i=0;i<3;i++) { System.out.println((i+1)+"|" +p[i][0]+"|"+p[i][1]+"|"+p[i][2]+"|"); } if(gagne) System.out.println(pion+" gagne !"); else System.out.println("Personne ne gagne."); } }

ENI Editions - All rigths reserved

- 5-

Algorithmesavancs
1.Lesalgorithmesdestris
a.Leprincipe
Vous avez pu voir dans les exemples prcdents lintrt des tableaux pour le stockage de valeurs multiples. Mais suivant le cas il peut tre utile davoir besoin dobtenir une liste ordonne de valeurs par ordre croissant ou dcroissant.Autrementditvousvouleztrierlecontenudutableau.Prenezlecasdunprofesseursouhaitanttrierles notesdeseslvesdelaplusbasselaplushaute,oudesrsultatsduntiragedulotopourlerendrepluslisible. Imaginezuntiragedulotodecinqnumros,videmmenttousdiffrents,dontlesvaleursstalententre1et49.Voici ltatinitialdutableausuiteautirageausort: 48 17 25 9 34

Il existe plusieurs mthodes permettant de trier ces diffrentes valeurs. Elles ont toutes leurs qualits et leurs dfauts. Ainsi une mthode sera lente, lautre sera plus gourmande en mmoire, et ainsi de suite. Cest leur complexitquidtermineleurusagenotammentpourdegrandesplagesdevaleurs. Danslesalgorithmessuivants,lavariableCptcontientlenombredlmentsdutableauinitialett[]estletableau. Ilestintressantdeprendreencomptelacomplexitdecesdiversalgorithmes,bienquecettenotion,prsenteau premier chapitre, ne soit gnralement pas (ou peu) aborde dans les premires annes dtudes en informatique. Les algorithmes ont souvent une complexit proche. Pourtant lusage un tri shell est plus rapide quun tri par slection,toutdpendantdunombredlmentsetlventuelordredeceuxciaudpart.

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

Lajoutdunsecondtableaudoublelammoirencessaire. Larecherchedupluspetitlmentestpluscompliquequonnelepensecarchaquepassage,ilnefautpas reprendreceuxdjsortis,etcestcompliqu. Le nombre de boucles et de recherches est important. La complexit de lalgorithme rsultant aussi, suprieureauxautres. Pourtoutescesraisonsletriparcrationnedoitabsolumentpastreutilis.

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

tape1:lapluspetitevaleurest9,onpermute9et48.

17

25

48

34

tape2:lapluspetitevaleursuivanteest17,djlabonneposition,onpasselasuivante.

ENI Editions - All rigths reserved

- 1-

17

25

48

34

tape3:lapluspetitevaleursuivanteest25,djlabonneposition,onpasselasuivante.

17

25

48

34

tape4:lapluspetitevaleursuivanteest34,onpermute34et48.Letableauesttri.

17

25

48

34

Sileprincipeestsimple,lalgorithmersultantncessitemalheureusementlarecherchedanstoutoupartiedutableau delapluspetitevaleurpossibleetcesansgrandeoptimisationpossible.Onpeutparcontreviterdepermuterdes valeurssiaucunevaleurinfrieurenattrouve.Voicilalgorithme: PROGRAMME SELECTION VAR temp,i,j,min,Cpt:entiers t:tableau[1..5] dentiers DEBUT Cpt5 Pour i de 1 Cpt-1 Faire mini Pour j de i+1 Cpt Si t[j]<t[min] alors minj FinSi FinPour Si min<>j alors tempt[min] t[min] t[i] t[i] temp FinSi FinPour FIN chaquepassagedanslaboucle,oneffectueunecomparaisondemoinsquelorsdupassageprcdent.Lenombre totaldepassagesestdoncde(n1)+(n2)+(n3)etainsidesuitesoitunecomplexitdelalgorithme den(n1)/2ce quidveloppdonneunecomplexitdordreO(n). VoicilecodeJavacorrespondant: class chap5_triselect { public static void main(String[] args) { int t[]={27,44,12,18,23,19,101,54,29,77,52,88,10,32}; int i,j,cpt,temp,min; cpt=14; for(i=0;i<cpt-1;i++) { min=i; for(j=i+1;j<cpt;j++) { if(t[j]<t[min]) min=j; } if(min!=i) { temp=t[min]; t[min]=t[i]; t[i]=temp; } for(j=0;j<cpt;j++) { System.out.print(t[j]+" "); } System.out.println(); } } }

- 2-

ENI Editions - All rigths reserved

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:
q

tape1:48estsuprieur17,onpermute.

17

48

25

34

tape2:48estsuprieur25,onpermute.

17

25

48

34

tape3:48estsuprieur9,onpermute.

17

25

48

34

tape4:48estsuprieur34,onpermute.

17

25

34

48

lissuedecepremierpassage,vousremarquezquelavaleurlaplusleveestdjendernireplacedutableau mais que le tableau nest pas entirement tri. Aussi il faut effectuer plusieurs passages en vrifiant chaque passage si des permutations ont eu lieu. Quand une permutation au moins a eu lieu lors dun passage, il faut en relanceruneautre.Ainsiilfautmettreenplaceundrapeau(flag)indiquantsiunepermutationaeulieuounon.Voici lesrsultatsaprslespassagessuccessifs:
q

Passe1:

17

25

34

48

Passe2:

17

25

34

48

Passe3:

17

25

34

48

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

ENI Editions - All rigths reserved

- 3-

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

} } }

e.Letriparinsertion
Letriparinsertionconsisteslectionnerunlmentdutableauetlinsrerdirectementlabonnepositiondansla partiedutableaudjtrie.Onprocdeentroistapes:
q

Onplacellmenttrierdansunevariabletemporaire. Tantqueleslmentsdutableauquiprcdentllmenttrierluisontsuprieurs,ondcaleceslments dunepositionenrcuprantlespacevidelaissparllmenttrier. Oninsreensuitelavariabletemporairelanouvellepositionlaissevacanteparledcalage.

Voicilesdiffrentestapespourletableauexemple:
q

tape1:ledeuximelment17estplacdansunevariabletemporairequiestcompareauxlmentsqui leprcdent.Chacunestdcaltantquilestsuprieurllmenttrier.

48

17

25

34

48

25

34

17

48

25

34

17entemporaire

Dcalagede48

17lanouvelleposition

tape2:25estcomparauxlmentsquileprcdentetchacunestdcaljusqucequellmentnesoit plussuprieurautroisime.

17

48

25

34

17

48

34

17

25

48

34

25entemporaire

Dcalagede48

25lanouvelleposition

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

17

25

48

34

17

25

48

34

17

25

48

34

9entemporaire

Dcalagede17,25et48

9lanouvelleposition

tape4:34estcomparauxlmentsquileprcdent.Seul48luiestsuprieur.

17

25

34

48

17

25

48

17

25

34

48

9entemporaire

Dcalagede48

34lanouvelleposition

Lalgorithme rsultant est assez simple. Seule la boucle de dcalage peut tre un peu plus ardue comprendre. Chaquelmentestdcalversladroite(oulebasselonlareprsentationquonsenfait)dutableautantquilest suprieurllmentrecherche. PROGRAMME TRINSERTION VAR i,mem,pos:entiers t:tableau[1..5] dentiers DEBUT Cpt5 Pour i de 1 Cpt faire memt[i]

ENI Editions - All rigths reserved

- 5-

posi-1 tant que pos>=0 ET t[pos]>mem Faire t[pos+1]t[pos] pospos-1 FinTantQue t[pos+1]mem FinPour FIN Commesouventlacomplexitvarieselonlordreinitialdeslmentsdansletableautrier.Cependantdanslepire descasoneffectue(n1)bouclesdanslesquellesoneffectueunemoyennede(n2)/2changesetdoncuntotalde (n1)(n2)/2. On obtient une complexit dordreO(n). Cependant on effectue en moyenne seulement la moiti des comparaisons(danslexemplecidessus,sixcomparaisonssonteffectuesalorsquedixauraientputreeffectues). Lacomplexitestalorsbienmoindre.Danslapratiqueuntriparinsertionestgnralementplusrapidequelestris bullesetparslection. UnepetiteremarqueconcernantlecodeJava.Sivousfaites: while(t[pos]>mem && pos>=0) Lexpressionestvaluedegauchedroite.Vousallezavoiruneerreurunmomentdonn:quandposvaut0,la boucle suivante il vaut 1. Or si un langage comme le C permet de dborder les indices (aucune vrification nest effectue), Java ne le permet pas et cause une exception qui stoppe le programme avec une erreur. Aussi il faut dabordtesterlavaleurdeposAVANTdevrifierlecontenudutableaucetindice. while(pos>=0 && t[pos]>mem) LecodeenJavacorrespondantestlesuivant: class chap5_trinsert { public static void main(String[] args) { int t[]={48,17,25,9,34}; int i,j,mem,pos,cpt; cpt=5; for(i=1;i<cpt;i++) { mem=t[i]; pos=i-1; while((pos>=0) && (t[pos]>mem)) { t[pos+1]=t[pos]; pos-; } t[pos+1]=mem; for(j=0;j<cpt;j++) System.out.print(t[j]+" "); } System.out.println(); } }

f.LetriShell
LetriShellestunevariantedutriprcdentquiatproposparDonaldL.Shellen1959(ilnyadoncaucunrapport avecleshellUnixouWindows).Danscetypedetrileslmentsnesontplusdcalsdeununmaisparpasplus important.Lapermutationseffectueenfonctiondecepas.Unefoislespermutationsdecepaseffectues,lepasest rduit.Quandlepasatteint1,letriShelldevientunbtetriparinsertion.Aufinal,letriShellconsistedgrossir un maximum le tableau trier en plaant ds les premiers passages le plus dlments possibles dans les bonnes parties du tableau. Dans un tableau dune dizaine dlments, la moyenne des lments de la premire partie du tableauestplusbassequecelledeladeuximepartie,dslepremierpassage. Au final, le tri Shell est dune complexit O(n2 ) mais se rvle tre plus rapide dans la majorit des cas. Cest lalgorithmedetrileplusutilis. Prenezuntableaudedixlments: 8 4 6 9 7 1 3 2 0 5

Etunpasde4:
q

tape1:t[1]ett[5]sontcomparsetventuellementpermuts.
ENI Editions - All rigths reserved

- 6-

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

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

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

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

Lepasnedoitpastrecalculauhasardcarcestdeluiquedpendlefficacitdelalgorithme.Laformuleutilisepar lalgorithmeestgnralement: U(n+1) =3Un +1avecU0 =0 PROGRAMME TRISHELL VAR cpt,n,i,j,tmp:entiers t:tableau[1..10] dentiers DEBUT cpt10 n0 TantQue n<cpt Faire n3*n+1 FinTantQue TanQue n<>0 Faire nn/3 Pour i de n cpt-1 Faire tmpt[i] ji TantQue j>n-1 ET t[j-n]>tmp t[j] t[j-n] jj-n FinTantQue t[j] tmp FinPour FinTantQue FIN SoitenJava: class chap5_trishell { public static void main(String[] args) { int t[]={48,17,25,9,34,12,28,1,4,98,0,33,48,10,11,9,25}; int i,j,n=0,mem,pos,cpt; cpt=t.length;
ENI Editions - All rigths reserved - 7-

while(n<cpt) n=3*n+1; while(n!=0) { n=n/3; for(i=n;i<cpt;i++) { mem=t[i]; j=i; while(j>(n-1) && t[j-n]>mem) { t[j]=t[j-n]; j=j-n; } t[j]=mem; } for(j=0;j<cpt;j++) System.out.print(t[j]+" "); System.out.println(); } } }

2.Recherchepardichotomie
Larecherchepardichotomienesappliquequesurlestableauxdjtris.Vousavezdjrencontrunalgorithmede recherchedlmentdansuntableaunontri.Maisceluiciposaitunproblme:siletableauavait10000lments,et queparpurhasardceluiquevouscherchiezestle10000 m e ,ilfaudrabalayerlintgralitdutableau.Cetterecherche squentiellenestpasidale. Dansuntableautri,laproblmatiqueestradicalementdiffrente.Rienquavecunerecherchesquentielleildevient inutiledebalayertoutletableau:ilsuffitdesarrterdsquelavaleurdellmentdutableaudevientsuprieurece quonrecherche,douneprobablecomplexitmoyenneplusbasse.Maisilresteunesolutionplusefficace. Ladichotomieconsistediviserpardeuxlintervallederecherchetantquellmentrecherchnestpastrouv.Surun tableautde10lmentstris: Indice Valeur 1 2 2 7 3 9 4 10 5 11 6 14 7 17 8 18 9 20 10 22

Vousvoulezsavoirsilavaleur20estprsentedansletableau.
q

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

Indice Valeur

1 2

2 7

3 9

4 10

5 11

6 14

7 17

8 18

9 20

10 22

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

Indice Valeur

1 2

2 7

3 9

4 10

5 11

6 14

7 17

8 18

9 20

10 22

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

Indice Valeur

1 2

2 7

3 9

4 10

5 11

6 14

7 17

8 18

9 20

10 22

- 8-

ENI Editions - All rigths reserved

tape4:Comparert[9]avec20.Lesvaleurssontidentiques,larechercheesttermine.

LarecherchedoitcontinuertantqueDbutestinfrieurougalFinetquellmentrecherchnapasttrouv. PROGRAMME DICHOTOMIE VAR t:tableau[1..10] dentiers d,m,f,rech:entiers DEBUT rech18 d1 f10 Rpter m(d+f) DIV 2 Si rech>t[m] Alors dm+1 Sinon fm-1 FinSi TantQue d<=f ET rech<>t[m] Si rech=t[m] Alors Afficher "Trouv" Sinon Afficher "Absent" FinSi FIN LecodeenJavacorrespondantestlesuivant: class chap5_dicho { public static void main(String[] args) { int t[]={2,7,9,10,11,14,17,18,20,22}; int d,f,m,rech; rech=15; d=0; f=t.length-1; do { m=(int)((d+f)/2); System.out.println("d="+d+", f="+f+", m="+m+", t[m]="+t[m]); if(rech>t[m]) d=m+1; else f=m-1; } while(d<=f && rech!=t[m]); if(rech==t[m]) System.out.println(rech+" trouv la position "+m); else System.out.println(rech+" na pas t trouv"); } }

ENI Editions - All rigths reserved

- 9-

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
q

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

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

b.Enregistrement

ENI Editions - All rigths reserved

- 1-

Un enregistrement est une "variable" dun type structur donn. Il se dclare exactement comme une variable, au mmeendroit,souslemotclVAR.Unenregistrementpeutdonctreconsidrcommeunevariable,unpeuspciale cependant. VAR nom_enreg:nom_type Danslecadredelexempleprcdent,vousdclarezdesarticlesainsi: VAR article1,article2,article3:tarticle Enmmoire,lesdiverslmentsdunenregistrementpeuventgnralementtrereprsentscommetantdansdes zonescontigus.

Avec un enregistrement de ce type, il existe des ressemblances videntes avec lventuelle structure denregistrements en base de donnes, ou dans un fichier. Pour peu que le type structur de lenregistrement reprennelemmeschma,lestraitementssentrouventgrandementsimplifis. Cependant, et plus particulirement pour la ressemblance avec un contenu de base de donnes relationnelle, lanalogienestpascomplte.Unenregistrementnecontientpasdidentifiantoucluniquesetriennempcheque deuxenregistrementsdemmetypecontiennentlesmmedonnes.Ceseraitvousauseindevotreprogramme degrercescasdefigure. Demmelechampdapplicationdesenregistrementsestbeaucoupplusvastequilnyparat.Certainslangagesles utilisentpourdeschosestotalementdiffrentesquunedescriptiondedonnesdegestion.Ainsiunlangagecomme leCdisposedetypesstructurspourgrerlesfichiers:ouverture,fermeture,position,typedaccs,etc.,maisaussi leurnom,leurrfrencesurledisque,leurspropritaires,leursdroits,Dautrestypesstructurssontutilespourla gestiondesdatesetheures,pourreprsenteruneconnexionrseau

3.Utiliserlesenregistrements
Lesenregistrementssontcompossdeplusieurslmentsappelschamps.Quandvousmanipulezunenregistrement, vouslefaitesautraversdeseschamps:
q

Ilnestpaspossibledaffecterunevaleurunenregistrementenpassantparsonnom.Pourluiaffecterdes valeurs,ilfautlesaffecteruneuneauxchampscorrespondants. Cependant, il est possible daffecter un enregistrement un autre du mme type : chaque champ de lenregistrementaffectreoitlavaleurduchampcorrespondantdelenregistrementaffecter.

a.Utiliserleschamps
Vous accdez aux champs dun enregistrement en passant par le nom de lenregistrement et le nom du champ sparsparlecaractre".",lepoint,selonlaformesuivante: nom_enreg.nom_champ Cette syntaxe reprsente la valeur du champ nom_champ au sein de lenregistrement nom_enreg. Reprenons lexempleprcdent: article1.prix

- 2-

ENI Editions - All rigths reserved

reprsente le prix de larticle1. Dailleurs, pour plus de simplicit, lisez vos enregistrements de droite gauche : article2.libellselit"libelldearticle2". Comme il est interdit daffecter une valeur directement un enregistrement complet, vous devez passer par les champs. videmment il est impossible, si vous mettez le nom du champ seul, de savoir quel enregistrement il appartient.Aussinoubliez jamais dcrirelenomdelenregistrementETlenomduchamp.Demme,neconfondez paslenomdutypestructuretlenomdelenregistrement: tarticle.ref /* mauvaise ide */ nereprsenteriendutoutetnepeutrecevoiraucunevaleur. Leschampsdunenregistrementsemanipulentexactementcommedesvariables,ilspeuventrecevoirdesvaleurs,et leur valeur peut tre affecte une autre variable. Les champs peuvent tre utiliss partout o les variables sont utilises,ycompris,vousleverrezdansleprochainchapitre,commeparamtresdesousprogrammes,ensaisie,en affichage,etc. Lexemplesuivantreprendtouscesprincipes: PROGRAMME demo_enreg Type Structure tarticle ref:chane libelle:chaine prix:rel FinStruct Var article1,article2:tarticle reponse:chane DEBUT Afficher "Rfrence du premier article ?" Saisir a r t i c l e 1 . r e f Afficher "Libell du premier article ?" Saisir a r t i c l e 1 . l i b e l l Afficher "Prix du premier article ?" Saisir a r t i c l e 1 . p r i x Afficher article1.ref,article1.libelle,article1.prix Afficher "Copier le premier article dans le second ?" Saisir reponse Si reponse="oui" Alors article2=article1 Afficher article2.ref,article2.libelle,article2.prix FinSi a r t i c l e 2 . p r i x 1 5 . 2 5 Si a r t i c l e 1 . p r i x = a r t i c l e 2 . p r i x Alors afficher "Les deux articles ont le mme prix" FinSi FIN Voicilesconstatationsquipeuventtretiresdecetexemple:
q

Le nom du champ seul ne reprsente rien, il est toujours associ son enregistrement sous la forme enreg.champ.Cequiestappelchampreprsentecettepaire. Un champ sutilise exactement comme une variable indpendante. Cest ce quelle est puisquun type structurestunensembledevariablesduntypedonn. Decefait,unchamppeutrecevoirunevaleurcommeuneautre. Enfin, le seul cas o un enregistrement peut recevoir une valeur en globalit cest quand on lui affecte un autreenregistrementdummetype.

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

ENI Editions - All rigths reserved

- 3-

Chaquearticledisposedunfabricant.Cefabricantpeuttredcritparunestructuretype: Structure tfabricant ref:chane nom:chane adresse:chane tel:chane FinStruct Vous voulez maintenant associer un fabricant chacun de vos articles. Rien de plus simple : incorporez un enregistrementdetypetfabricantvotretypestructurtarticle: Structure tarticle ref:chane libelle:chane prix:chane fab:tfabricant FinStruct Maintenantdclarezunenregistrementdetypearticle: VAR art:article Dansvotreprogramme,vousallezaccderauxchampsdelenregistrementartcommevucidessus,maisvousallez aussirajouterlesinformationssurlefournisseur.Poura,ilsuffitderespecterlasyntaxeavecdespoints: nom_enreg1.nom_enreg2.nom_champ Soitcommeexemple: Dbut art.ref"art001_01" art.libelle"Pelle tarte Inox Luxe" art.prix35.50 /* cher pour une pelle tarte */ a r t . f a b . r e f "Fab1234" a r t . f a b . n o m "Le roi de la tarte" a r t . f a b . a d r e s s e "12 rue Siflette 13248 Latruelle" a r t . f a b . t e l "0404040404" Fin

c.Untableaudansunestructure
Vousvoulezmaintenantconnatrelenombredarticlesvendussurlesdouzemoisdelanne.Pouravousallezcrer unnouveautypestructurquivareprendreunenregistrementtarticleauquelvousallezajouterunmoyendestocker douzevaleursrelles.Lemeilleurmoyenquevousconnaissezdjestletableau.Vouspouvezparfaitementrajouter untableaucommechampdestructure. Structure bilanart art:tarticle vente:tableau[1..12] de rels FinStruct Soit dit en passant, dans une telle structure et un enregistrement bart1 associ, laccs aux divers champs peut devenirunpeulong.Vousaccdezautableauventeainsi: bart1.vente[indice] Lalgorithmesuivantvademanderlasaisiesuccessivedesdouzequantitsdeventesmensuelles: TYPES // Le fabricant Structure tfabricant ref:chane nom:chane adresse:chane

- 4-

ENI Editions - All rigths reserved

tel:chane FinStruct // Larticle Structure tarticle ref:chane libelle:chane prix:chane fab:tfabricant FinStruct // Les ventes mensuelles Structure bilanart art:tarticle vente:tableau[1..12] de rels FinStruct VAR bart01:bilanart i,total=0:entiers Dbut b a r t 0 1 . a r t . r e f "art001_01" b a r t 0 1 . a r t . f a b . r e f "Fab1234" Pour i de 1 12 Faire Afficher "Ventes du mois",i," ?" Saisir b a r t 0 1 . v e n t e [ i ] totaltotal+b a r t 0 1 . v e n t e [ i ] FinPour Afficher "Total annuel :" ,total Fin

4.Lestableauxdenregistrements
a.Lestables
Un article reprsente un enregistrement. Jusqu prsent pour reprsenter plusieurs articles, vous deviez crer plusieurs enregistrements, comme dans lexemple de article1, article2 et article3. Lidal serait de pouvoir traiter n articlessansavoirdclarernenregistrementsindpendants.Unenregistrementtant(larptitionestlemeilleur amidelammoire)dclarcommeunevariable,vousavezaussiledroitdecrerdestableauxdenregistrements.Un tableau denregistrements se dclare comme nimporte quel autre tableau. Il est parfois appel table. Dans cette table,lescolonnessontleschampsetlesligneslesenregistrements. Soitlastructuretarticlesimplifiedorigine: Structure tarticle ref:chane libelle:chaine prix:rel FinStruct Vousvoulezcrerunetablededixenregistrements: Var articles :tableau[1..10] de tarticles Poursaisirleslmentsdunenregistrementdecettetable,vousutilisezlesindices: articles[1].ref="art001_01" Pouraccderauxdixenregistrements,lemieuxestdutiliseruneboucle: Dbut Pour i de 1 10 Faire Afficher "Saisir ref article",i Saisir a r t i c l e s [ i ] . r e f FinPour Fin

ENI Editions - All rigths reserved

- 5-

b.Unetablecommechamp
Selonlemmeprincipequuntableaudansunestructure,vouspouvezutiliseruntableaudenregistrementscomme typededonnesdansunestructure,puisquecenestquuntableau,aprstout. Soitunegrandeenseignedisposantdedixmagasins.Vousdevezdcriredeuxstructures:unestructuremagasin,et unestructureenseigne.Lastructureenseignedoitcontenirlesenregistrementsdesdixmagasins.Voicicequevous pourriezfaire: Structure tmagasin adresse:chane tel:chane gerant:chane FinStruct Structure tenseigne nom:chane magasin :tableau[1..10] de tmagasins FinStruct Voicicommentexploiterunenregistrementdetypetenseigne: Var enseigne :tenseigne i :entier Dbut Afficher "Nom de lenseigne ?" Saisir enseigne.nom pour i de 1 10 Faire Afficher "adresse du magasin",i Saisir e n s e i g n e . m a g a s i n [ i ] . a d r e s s e Afficher "tel du magasin",i Saisir e n s e i g n e . m a g a s i n [ i ] . t e l Afficher "grant du magasin",i Saisir e n s e i g n e . m a g a s i n [ i ] . g e r a n t FinPour Fin Il ny a en fait rien de bien complexe. Vous pouvez encore aller plus loin en crant des tables contenant dautres tables,etainsidesuite

5.EtJava?
Ilyaiciunpetitproblme.Javanedisposepas,toutaumoinsdirectement,demoyendedclarerunestructureen tantquetelle,contrairementdeslangagescommeleC,C++oulePascal.Javaestunlangageditobjet.Lobjetest aborddansledernierchapitre.PourcrerunobjetJava,ilfautcrireuneclasse:cestladescriptionouunesortede "type"dobjet.Uneclassepeutcontenirdesvariables(lesattributs)etdesboutsdeprogramme(lesmthodes).Par (mauvaise)analogieuneclassequinecontiendraitquedesvariablespourraittreapparenteunestructure.Voici unexemplesuccinct: class tfabricant { public String ref; public String nom; public String adresse; public String tel; } class tarticle { public String ref; public String libelle; public float prix; public tfabricant fab=new tfabricant(); } class chap5_struct { public static void main(String[] args) { tarticle article1=new tarticle(); article1.ref="Art001_01";

- 6-

ENI Editions - All rigths reserved

article1.fab.ref="Fab1234"; System.out.println(article1.ref); System.out.println(article1.fab.ref); } } Il est fortement probable que vous ne compreniez pas certaines instructions comme public, new, et pourquoi il faut utiliserdesparenthses,pourquoiclassetpasstruct,etc.Nevousinquitezpas,toutceciseraexpliquaudernier chapitre consacr lobjet. Pour linstant, remarquez seulement que dans ce cas prcis, le motcl class peut tre utilispourdclarerdessortesdestructures.Ilestaussipossibledecrerdestableauxdobjets: class tfabricant { public String ref; public String nom; public String adresse; public String tel; } class tarticle { public String ref; public String libelle; public float prix; public tfabricant fab=new tfabricant(); } class chap5_struct2 { public static void main(String[] args) { int i=0; tarticle article[]=new tarticle[3]; for(i=0;i<3;i++) article[i]=new tarticle(); article[0].ref="Art001_01"; article[0].fab.ref="Fab1234"; article[1].ref="Art002_02"; article[1].fab.ref="Fab4321"; System.out.println(article[0].ref); System.out.println(article[0].fab.ref); System.out.println(article[1].ref); System.out.println(article[1].fab.ref); } }

ENI Editions - All rigths reserved

- 7-

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:
q

Leprogrammeprincipal,oublocprincipal,quicorrespondaublocprincipaldinstructionssituessouslemotcl PROGRAMME et DEBUT. Cest ce programme qui est excut quand vous lancez lexcutable qui rsulte de limplmentationdevotrealgorithmeenJava,parexemple.EnJava,leprogrammeprincipalestcequiestsitu souslalignecontenantlemot"main"quisignifiedepuislanglais"principal". Dessousprogrammes,chargsdediversrles,quipeuventallerducalculdunevaleurabsolueceluidune puissancequelconque,uneconversiondedate,leformatagedunechanedecaractres,laffichage dunen tte quelconque, bref tout ce que vous voudrez bien en faire. Suivant les langages, vous trouverez les expressionssousprogrammes,maisaussietsurtoutlesmotsfonctionsetprocdurespourlesdcrire.Cest le programme principal qui se charge dappeler les sousprogrammes. Ceuxci ne se lancent jamais deux mmes.

U nsousprogrammeneselancejamaistoutseul,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

ENI Editions - All rigths reserved

- 1-

... DEBUT ... FIN

S i 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:
q

Unidentifiantsousformedenom:RepeteCar(),quiluiservirapourtreappel. Unezonededclarationdevariables. UnblocdinstructionsencadrentreDbutetFin. Letouttanticietdanslecadredecetexemple,prcismententrelesmotsclsProcdureetFinProc.

E nalgorithmique,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

System.out.println(); }

3.Appel
Un sousprogramme est excut depuis le programme principal ou un autre programme. Pour a, le programme fait appelausousprogramme.Lappelausousprogrammeestuneinstructionquivadclencherlexcutiondeceluici.Cet appel peut avoir lieu nimporte o. Suivant les diverses conventions, les sousprogrammes peuvent tre appels depuis une instruction Appel, ou Appeler. Plus simplement, il est dusage dappeler, comme vous et moi, un sous programmeparsonnom.Lusagepeutcependantchangerselonletypedesousprogramme,procdureoufonction, les instructions cidessus tant souvent rserves aux procdures. Pour reprendre le sousprogramme RepeteCar(), voiciunexempledappel: Procdure RepeteCar() VAR i:entire DEBUT Pour i de 1 20 Faire Afficher "-" FinPour FIN FinProc PROGRAMME LIGNES VAR i:entier DEBUT Afficher "Voici 10 lignes de 20 caractres" Pour i de 1 10 Faire RepeteCar() FinPour Afficher "Le programme est termin" FIN Les plus perspicaces dentre vous auront remarqu que la variable i est dclare deux fois, une fois dans le sous programme,etunefoisdansleprogrammeprincipal.Cestnormal,lesexplicationsarriverontentempsvoulu. Lorsquelesousprogrammesetermine,linstructionsituejusteendessousdesonappelestexcute.Onditquilya retourdusousprogrammeverslinstructionsuivante,ouappelante. Enfin, un sousprogrammepeuttreappelenluifournissantdesvaleurs,appelesparamtres.Cesvaleursseront placesdansdesvariablesutilisablesauseindusousprogrammecommetouteautrevariable. VoicilexemplecompletenJavaavecengraslappellamthode(sousprogramme). class chap6_declare { static void RepeteCar() { int i ; for(i=1 ;i<=20 ;i++) System.out.print("*"); System.out.println(); } public static void main(String[] args) { int i; System.out.println("10 lignes de 20 caractres"); for(i=1;i<=10;i++) R e p e t e C a r ( ) ; } }

4.Fonctionsetprocdures
LesousprogrammeRepeteCar()atdclaraveclemotclProcdure,etilvousatindiquaussilexistencedu motclFonction.Ilyadoncdeuxtypesdesousprogrammes.Certainslangagespeuventproposeroulun,oulautre, parfoislesdeux.Vousentendrezparfoisparlerdelangagesprocduraux(commelePascal)oufonctionnels(commele
ENI Editions - All rigths reserved - 3-

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

a.Lesprocdures
Les procdures sont des sousprogrammes constitus dune suite dinstructions indpendantes. Une procdure ne retournepasdersultatoudevaleurauprogrammequilaappel,toutcommelesvaleurspassesenparamtrene sont pas forcment modifies de manire globale. Une procdure pourrait faire lobjetdun programme part. Son contenupeutcependantparfoisinfluersurledroulementglobalduprogramme,silmodifieunfichier,unebasede donnes,etc. La procdure RepeteCar() est un exemple typique : le bloc de donnes rptitif influe sur laffichage, mais ne retournerienentantquetel. Ilexistecependantquelquesmoyensindirectspouruneprocdurederetournerunevaleur:
q

en passant celleci par rfrence, selon le mme principe que ce qui a t expliqu pour les tableaux : le sousprogrammereoitlarfrencedelavariable,etpeutlamodifierverscellecontenantlanouvellevaleur. Ceciestdailleursaussipossibleaveclesfonctions. Plussimplement,lalgorithmiqueeffectuesouventunedistinctionentrelesvaleursenentredelaprocdure (celles quon lui transmet) et les valeurs en sortie. Dans ce cas, autant utiliser les fonctions, notamment si uneseulevaleurdoittreretourne. Enmodifiantlescontenusdesvariablesglobales,variablesaccessiblespourtouslesprogrammesetlessous programmestantenlecturequencriture(cf.cechapitre,Variableslocalesetglobales).

b.Lesfonctions
En mathmatique, vous avez probablement rencontr la notion de fonction. Dans le cadre de la rsolution dune quationduseconddegr,lquationscritgnralementainsi: f(x)=ax+bx+c Lersultatdef(x)oufonctiondexestlersultatducontenudelafonction,cestdirelquation.Lavaleurdef(x) est ce rsultat. Cest pareil en algorithmique : une fonction est un sousprogramme qui retourne une valeur. Un fonctionsedcritainsi: Fonction nom():type Var /* variables */ Dbut /* bloc dinstructions */ Retourne valeur FinFonc
q

UnefonctionsedclareaveclemotclFonction,suividesonnometdutypedevaleurquelleretourne.Ce peuttrenimportequeltype(entier,rel,chane). Unefonctionpeutcontenirunezonededclarationdevariableetdetypesstructurs. LeblocdinstructionsestencadrentreDbutetFinFonc. LavaleurdelafonctionestretourneparlinstructionRetourne.Lavaleurretournedoittredummetype quecelleattendueparladclarationdelafonction.

Fonction equation():rel Var a,b,c,x:rels Dbut xa*x*x+b*x+c

- 4-

ENI Editions - All rigths reserved

retourne x FinFonc Ilexisteunediffrencetrsimportanteentreuneprocdureetunefonction:


q

Laprocdureestvuecommeuneinstruction. Lafonctionestvuecommeunevaleur.

Tout comme une variable retourne une valeur, une fonction retourne aussi une valeur, ce qui veut dire quune fonctionpeuttreutilise(appele)partoutounevariablepourraitltre:dansuneexpression,dansuncalcul,un affichage,uneaffectation,etc.Dansunseulcas,lafonctionnepeutpastreutilise:unefonctionfournitunevaleur, ellenepeutpassevoiraffecteunevaleur.Ceciestinterdit: equationx ; /* INTERDIT */ maisceciestautoris: xequation() xrecevraalorslavaleurretourneparlafonctionequation()vialinstructionRetourne. PROGRAMME EQ1 Var result:rel Dbut resultequation() Afficher result Fin

N ote: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
ENI Editions - All rigths reserved - 5-

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. E n 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

Ellenestdclarequuneseulefoispourlintgralitduprogramme.Ellenedoitdoncjamaistreredclare tantdansleprogrammeprincipalquedansunsousprogramme. Ellepermetindirectementde"passer"desvaleursauxsousprogrammes qui lutilisent.Cest un "dommage collatral", et les variables globales ne devraient tre rserves que lorsque cellesci sont vraiment communeslaplusgrandepartieducode. Ilseraitridiculededclarertouteslesvariablesenglobales.Laplupartdesprogrammesetsousprogrammes ne les utiliseraient pas toutes, et en plus vous risqueriez par accident, pensant une variable locale, den modifiercertainessansyprendregarde,etainsidemettreenprillexcutionduprogramme. Comme corollaire, ne donnez jamais le mme nom une variable locale et globale. Cest interdit en algorithmique et dans la plupart des langages qui ne manqueront pas de vous le faire remarquer la compilationoulexcution.

c.VariablesglobalesetJava
En Java les variables globales se dclarent hors des blocs de programmes comme la mthode main() (programme principal) et les mthodes. Elles sont dclares tout en haut, en dessous du motcl class. Toutes ces variables serontvisiblesdepuisnimportequellemthodeouprogrammeprincipaleauseindecette"classe",voiremmeau del car il est possible de prciser des niveaux de visibilit des variables. Tout ceci vous sera brivement expliqu dans le dernier chapitre. En attendant ce chapitre et un surcrot dexplications, outre le type de la variable vous rajouterezlemotcl"staticdevantlesvariables. class chap6_globale { static char c; static int nbcar; static void RepeteCar() { int i ; for(i=1 ;i<=nbcar ;i++) System.out.print(c); System.out.println(); } public static void main(String[] args) { c=*; for(nbcar=1;nbcar<=10;nbcar++) RepeteCar(); } }

6.Lesparamtres
Maintenant que vous rservez les variables globales des cas bien prcis, il vous faut trouver un autre moyen de passerdesvaleursauxprocduresetauxfonctions.Quandenmathmatiquesvouscalculezlavaleurdunefonctionf (x),vousluidemandezenfaitdecalculerlavaleurdelafonctionselonlavaleurdex.Vouspassezdonclavaleurdex lafonction. Leprincipeestlemmeavecvosalgorithmes:vouspouveztransmettredesvaleursvosprocduresetfonctions, toutcommevouspouvezenrecevoir.Lasyntaxediffrelgremententrelesfonctionsetlesprocdurespourcette raison.Danslesdeuxcascependant,lesparamtresseplacententrelesparenthsessituesaprsleurnom. Les paramtres passs un sousprogramme sont gnralement des variables locales au programme ou sous programme lappelant, mais ils ne portent pas forcment le mme nom. Ils sont "rcuprs" au sein du sous programmecommedesvariableslocalesausousprogramme.Ilestcependantpossibledepassercommeparamtre toute expression retournant une valeur, que ce soit un scalaire, une variable, un tableau, un enregistrement, une table,ouencoreunefonction(quiserasubstitueparsonrsultat).

a.Procdures
Lasyntaxedepassagedesparamtresestlasuivante:

ENI Editions - All rigths reserved

- 7-

Procdure nom_proc(E param1:type,ES param2:type,S param3:type) Lesparamtresduneprocduresontdetroiscatgories:


q

Ceux en entre, qui correspondent aux valeurs que vous souhaitez transmettre la procdure. Entre les parenthses,ilssontprcdsdun"E",commeEntre,carcesontlesvaleursenentredelaprocdure. Ceux en sortie, qui correspondent aux valeurs retournes par la procdure au programme ou au sous programmelayantappel.Ilssontprcdsdun"S",commeSortie,carcesontlesvaleursensortiedela procdure. Ces paramtres sont des variables qui doivent tre dclares dans le programme ou sous programmeappelant. Ceuxenentreetensortie,prcdsde"ES".

Quandvousavezplusieursparamtresenentre,ilsuffitdetouslesmettreaprsleE,etmmedelesregrouper selonleurtype.Cetteprocdureprendcinqparamtres:troisentiersetdeuxchanes. Procdure proc(E p1,p2,p3:entiers,p4,p5:chanes) LaprocdureRepeteCar()seprtebienunparamtre.Commenteneffetutiliserunevariableglobalepourspcifier le nombre de caractres rpter ? Autant passer ce nombre en paramtre. Voici le programme modifi en consquence: Procdure RepeteCar(E nbcar:entier, E c:caractre) VAR i:entier DEBUT Pour i de 1 nbcar Faire Afficher c FinPour FinProc PROGRAMME LIGNES VAR i:entier DEBUT Pour i de 1 10 Faire RepeteCar(i,"*") FinPour FIN VousrcuprezuneventuellevaleurensortievialaoulesvariablesEouES.Voiciuneprocdurequiconvertitun nombredesecondesenheures,minutesetsecondes.Elleprendquatreparamtresdontunenentre(lenombrede secondes)ettroisensortie(heuresminutesetsecondes). Procdure sec_to_hms(E nbsec:entier, S h,m,s:entiers) Dbut hnbsec DIV 3600 nbsecnbsec%3600 mnbsec DIV 60 snbsec MOD 60 FinProcdure PROGRAMME convert_sec Var nb_secondes :entier heures,minutes,secondes:entiers Dbut nb_secondes3950 sec_to_hms(nb_secondes,heures,minutes,secondes) Afficher heures,minutes,secondes Fin

Passerunenregistrementcommeparamtre Laprocdureprcdentefonctionnecertesmerveille,maisavecunpeuplusderflexion,pourquoinepasutiliser
- 8 ENI Editions - All rigths reserved

uneseulestructurepourreprsentertouteslescomposantesduneheure? Struct hms heures:entier minutes:entier secondes:entier FinStruct Unenregistrementpeuttrepassenparamtreduneprocduretoutcommeunevariable,enentreouensortie. Laprocdureetleprogrammepeuventtreconvertiscommececi: Types Struct hms heures:entier minutes:entier secondes:entier FinStruct Procdure sec_to_hms(E nbsec:entier, S duree:hms) Dbut duree.heuresnbsec DIV 3600 nbsecnbsec%3600 duree.minutesnbsec DIV 60 duree.secondesnbsec%60 FinProcdure PROGRAMME convert_sec Var nb_secondes:entier heures:hms Dbut nb_secondes3950 sec_to_hms(nb_secondes,heures) Afficher heures.heures,heures.minutes,heures.secondes Fin

b.Lesfonctions
LesfonctionsneretournentquuneseulevaleurvialinstructionRetourne.Aussiilnyapasbesoindespcifiersiles paramtressontenentreouensortie.Ilssontforcmentenentre.Parcontre,lavaleurdelafonctionpeuttre denimportequeltype. Voici une fonction qui fait linverse de la procdure prcdente : elle reoit des heures, minutes et seconde, et en contrepartieelleretournelenombredesecondestotal. Fonction hms_to_sec(heures,minutes,secondes :entiers):entier Var total:entier Dbut totalheures*3600+minutes*60+secondes Retourne total FinFonc Une fonction peut parfaitement rcuprer un enregistrement comme paramtre. Voici une bonne occasion de rutiliserletypestructurprcdemmentdfini: Fonction hms_to_sec(duree:hms):entire Var total :entier Dbut totalduree.heures*3600+duree.minutes*60+duree.secondes Retourne total FinFonc Enfin, une fonction peut aussi retourner un enregistrement. Ce qui veut dire que la procdure sec_to_hms est inutile:unefonctionpeutlaremplacer:

ENI Editions - All rigths reserved

- 9-

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

U ne 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

} 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.secondes); // 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:
q

Voussaisissezdeuxhorairesdansdesenregistrementshms. Vouslesconvertissezennombredesecondes. Vousfaitesladiffrenceentrecesdeuxnombres. Vousconvertissezlersultatenenregistrementhms.

Ditcommececi,apourraitsemblerunpeucompliqusilesfonctionsnexistaientpas.Vousavezdoncbesoindela dfinition du type structur hms et des deux fonctions nbsec_to_hms et hms_to_nbsec. Vous navez mme pas besoindevariablespouryplacerlesnombresdesecondes.Uneseuleligneaveclesbonsparamtressuffitsen
ENI Editions - All rigths reserved - 11 -

passer(voyezcelleengras). Type Struct hms heures:entier minutes:entier secondes:entier FinStruct Fonction hms_to_sec(duree:hms):entier Var total:entier Dbut totalduree.heures*3600+duree.minutes*60+duree.secondes Retourne total FinFonc Fonction sec_to_hms(nbsec :entier):hms Var duree:hms Dbut duree.heuresnbsec DIV 3600 nbsecnbsec%3600 duree.minutesnbsec DIV 60 duree.secondesnbsec%60 Retourne duree FinFonc Programme delta Var heure1,heure2,delta:hms Dbut Afficher "Saisir lheure de dpart" Saisir heure1.heures,heure1.minutes,heure1.secondes Afficher "Saisir lheure de fin" Saisir heure2.heures,heure2.minutes,heure2.secondes d e l t a s e c _ t o _ h m s ( h m s _ t o _ n b s e c ( h e u r e 2 ) - h m s _ t o _ n b s e c ( h e u r e 1 ) ) Afficher "Il sest coul :" Afficher delta.heures,delta.minutes,delta.secondes Fin Pourquoi ne pas aller encore plus loin en crant une fonction qui calcule seule la dure en faisant appel aux deux autresfonctions?Eneffetvouspouvezparfaitementappelerdessousprogrammesdansdautressousprogrammes, doncdesfonctionsdansdesfonctions,oudesprocduresdansdesfonctionsetrciproquement.Voiciunefonction hms_deltaquivacalculertoutceci: Fonction hms_delta(hms1,hms2:hms):hms Var delta:hms Dbut deltanbsec_to_hms(hms_to_nbsec(hms2)-hms_to_nbsec(hms1)) Retourne delta FinFonc Ducoupleprogrammeprincipalestmodificommececi: Programme delta Var heure1,heure2,delta:hms Dbut Afficher "Saisir lheure de dpart" Saisir heure1.heures,heure1.minutes,heure1.secondes Afficher "Saisir lheure de fin" Saisir heure2.heures,heure2.minutes,heure2.secondes d e l t a h m s _ d e l t a ( h e u r e 1 , h e u r e 2 ) Afficher "Il sest coul :" Afficher delta.heures,delta.minutes,delta.secondes Fin

- 12 -

ENI Editions - All rigths reserved

VoicienfinuneimplmentationenJavadelafonctionhms_delta()etducalculdecedernierexemple: ... class chap6_secondes { ... static hms hms_delta(hms hms1, hms hms2) { hms delta=new hms(); delta=sec_to_hms(hms_to_sec(hms2)-hms_to_sec(hms1)); return delta; } public static void main(String[] args) { hms heures=new hms(); hms heures2=new hms(); hms delta; ... // exemple 3 heures.heures=10; heures.minutes=30; heures.secondes=45; heures2.heures=18; heures2.minutes=36; heures2.secondes=24; delta=hms_delta(heures,heures2); System.out.println(delta.heures+":"+delta.minutes+":"+delta.secondes); } }

7.Sousprogrammesprdfinis
a.Unchoiximportant
Presque tous les langages de programmation proposent dune manire ou dune autre la possibilit de crer des sousprogrammes.CestlecasduC,duC++,deJava,deC#,etc.Vouspouvez,etvousallezcrervospropressous programmes,selonlecas. Cependant, ces mmes langages sont souvent dj fournis avec une quantit plus ou moins importante de sous programmes. Dans les exemples prcdents en Java, vous en avez dj utilis. En Java, les instructions println ou readLine peuvent tre considrs, sous certains aspects (cf le dernier chapitre) comme des sousprogrammes,lun chargdafficherdutexte,lautredesaisirdesdonnes.LelangagePHPproposeunequantitimpressionnantede sousprogrammes : calculs mathmatiques, travaux graphiques, manipulations de bases de donnes : plusieurs milliers! Autrementdit,lesconcepteursdulangageoudautrespersonnesfournissentdesbibliothquesdesousprogrammes pour rduire autant que possible et sans tomber dans lexcs, le travail des programmeurs. Avant de crer vos propressousprogrammes,vrifieztoutdaborddansladocumentationdulangagequevousutilisez,sivouspouvez ytrouvervotrebonheur. Unsousprogrammeprdfiniporteunnomquirefltesouventcequilfait.Cestuneprocdureouunefonction(cf. lasectionVariableslocalesetglobalesdecechapitre),plussouventunefonction,quiretourneunrsultat.

b.Quelquesexemples
Fonctionssurchanes Vous pouvez obtenir la longueur dune chane de caractres avec la fonction longueur. Elle semploie en passant entre parenthses une chane de caractres, et retourne comme rsultat une valeur entire qui est le nombre de caractresdecettechane. Programme len Var txt :chane l :entier Dbut txt"Un petit texte" llongueur(txt)

ENI Editions - All rigths reserved

- 13 -

Afficher l /* affiche 14 */ Fin Les fonctions milieu, gauche et droite permettent de dcouper des morceaux dans une chane de caractres. La fonctionmilieuprendtroisvaleursentreparenthses:unechane,unepositiondedbutetunelongueur.Elleest parfois nomme sschaine (souschane), sutilisant de la mme manire. Les deux autres ne prennent que deux paramtres : une chane et une longueur. Dans le cas de gauche, cest le nombre de caractres dcouper en partantdelagauche,pourdroitedepuisladroiteetpourmilieudepuislapositionindique.Lespositionsdmarrent 1.Leprogrammesuivantvatoutdabordaffichertouslescaractresdunechane,lesunsaprslesautres,puisle premiermot,puisledernier. Programme decoupe Var txt :chane result :chane i :entier Dbut txt="Salut les amis" Pour i de 1 longueur(txt) Faire resultmilieu(txt,i,1) Afficher result // les lettres une une Fin Affiche gauche(txt,5) // Salut Affiche droite(txt,4) // amis Fin La fonction pos (position) dtermine la position dune chane de caractres dans une autre. Elle trouve donc une souschanedecaractresdonneetretournesapositionlecaschant,zrosinon. Programme trouve Var ch:chanes position :entier Dbut txt"abcedefghik" positionpos("def",txt) Si pos=0 Alors Afficher "Pas trouv" sinon Afficher "A la position",pos FinSI Fin Lafonctionsupprpermetdesupprimerunesouschanedunechanedecaractresenfonctiondesapositioninitiale etdesalongueur. Programme suppr Var txt :chane Dbut txt"abcdefgh" txtsuppr(txt,4,len(txt)-3) Affiche txt /* reste abc */ Fin

Fonctionsmathmatiques Tousleslangagesproposentsouventungrandnombredefonctionsmathmatiques.Dommagepourvous,laplupart desexemplesdesdernierschapitresontdesquivalentssousformedefonctions.Cestlecasdesracinescarres, despuissances,desfactorielles,desfonctionstrigonomtriquescommelessinus,cosinusettangente,etc.


q

racine(x):donnelaracinecarredex puissance(x,y):donnexlapuissancey sin(x):sinusdex

- 14 -

ENI Editions - All rigths reserved

cos(x):cosinusdex tan(x):tangentedex

Certainesconventionsalgorithmiquesnereconnaissantpasles%ouMODcommeoprateursmodulos(alorsqueles langages,eux,si),vouspouveztrouverparfoislafonctionmod(x,y),quiquivautxMODy,etlafonctionentier(x,y) quiquivautxDIVy. Une fonction trs sympathique est la fonction alatoire(). Elle dtermine un nombre alatoire. Utilise sans paramtre, elle trouve un rel entre 0 et 1. Utilise avec un paramtre entier, elle trouve une valeur entre 0 et n. Idalpourunlancerded. Programme d Var d, saisie :entiers Dbut dalatoire(5)+1 // entre 1 et 6 Rpter Afficher "Quelle est la valeur du d ?" Saisir saisie Si dsaisie Alors Afficher "Rat, essayez encore" FinSi Jusqu d=saisie Afficher "Bravo !" Fin

Fonctionsdeconversion Vouspouvezconvertirunechanedecaractresenvaleurnumriquelaidedelafonctionchnum,quiprendcomme paramtrelachanedecaractresetquiretournelavaleurenentierourel(selonlecas).Lachanedoittreune reprsentationdunevaleurnumrique,etriendautre. Lafonctionnumchfaitexactementlecontraire:elleconvertitunnombreenchanedecaractres,lidalpoursauver toutcecidansunfichiertexte.Voiciunexemplesimple: Programme conversion Var rPi :rel cPi :chane Dbut rPi=3.1415927 cPi=numch(rPi) Afficher cPi cPi="3.14" rPi=chnum(cPi) Fin

FonctionsprdfiniesenJava Les fonctions prdfinies en Java sont extrmement nombreuses. Dans les exemples prcdents vous avez eu loccasiondenrencontrerquelquesunes,notammentdesconversionsdechanesversdesentiers,parexemple.En fait, les fonctions prdfinies sont en fait souvent associes des types particuliers, des objets particuliers, etc. Les fonctions sont en fait des mthodes associes la manipulation dlments particuliers. Le mieux est de vous reporterladocumentationenlignedeJavaladressehttp://java.sun.com/javase/6/docs/api/pourlaversion6du jdk.Dansleslistesdegauche,notammentcelledubas,recherchezString.Danslecadreprincipalsaffichetoutela documentation associe ce type dobjet, car oui en Java une chane de caractres est un objet. Dans cette documentation, vous trouvez toutes les fonctions associes aux chanes de caractres. Notamment, voici celles qui peuventvousintresser:
q

length():retournelalongueurdelachane. substring(dbut[,fin]):dcoupeunmorceaudechane. trim():supprimetouslesespacesendbutetfindechane.

ENI Editions - All rigths reserved

- 15 -

indexOf(chane [,depart]) : retourne la position dune chane dans une autre, depuis une ventuelle position. isEmpty():retournevraioufauxselonquelachaneestvideounon. valueOf(valeur):lavaleurestconvertieenchane.

Notez que les positions dans les chanes dbutent 0. Pour utiliser ces fonctions, vous devez les accoler avec un pointaunomdelavariabledetypeStringquevousutilisez.Parexemple: class chap6_predef { public static void main(String[] args) { int valeur; String txt1,txt2; txt1=" Bonjour les amis "; txt1=t x t 1 . t r i m ( ) ; // supprime les espaces valeur=t x t 1 . l e n g t h ( ) ; // longeur : 16 System.out.println(txt1+" de longueur "+valeur); txt2=t x t 1 . s u b s t r i n g ( 3 , 5 ) ; // jo System.out.println(txt2); } }

Lesfonctionsmathmatiques Toujours dans la documentation en ligne, slectionnez Maths dans la liste en bas gauche. Le cadre central vous propose toutes les fonctions mathmatiques et il y en a normment. Pour utiliser ces fonctions, vous devez leur accolerMathavecunpointdevant. class chap6_math { public static void main(String[] args) { long valeur; valeur=(long)Math.pow(2,48); System.out.println(valeur); } }

8.Derniercas:lestableaux
Une fonction peut retourner un tableau seulement si la variable qui la reoit est ellemme un tableau de mme dimensionetdemmenombredindices. De mme, il est possible de passer un tableau en paramtre dune fonction. Dans ce cas, vous ne connaissez pas forcment par avance le nombre dlments du tableau, aussi vous pouvez ne rien prciser entre les crochets. Cependant, si le langage dimplmentationneproposepasdinstructions ou de fonctions prdfinies pour trouver la tailleduntableau,vousdevriezpassercellecienparamtre.Quandvouspassezuntableauenparamtredunsous programme,mettezuniquementsonnomsansutiliserlescrochets. Denombreuxexemplessontpossibles.Parmieux,pourquoinepastrieruntableau?Reprenezlundesalgorithmesde triduchapitreprcdent,commeletriparinsertion,etadaptezlepourletransformerenfonction: Fonction tri_tableau(t:tableau[] dentiers,nb:entier) :tableau[] dentiers VAR i,mem:entiers DEBUT Pour i de 1 nbelem faire memtab[i] posi-1 tant que tab[pos]>mem et pos>=0 Faire tab[pos+1]tab[pos] pospos-1 FinTantQue tab[pos+1]mem

- 16 -

ENI Editions - All rigths reserved

FinPour FinFonc Voiciunpetitprogrammepourlexploiter: PROGRAMME TRITAB CONST INDICES=10 VAR t :tableau[1..INDICES] {10,5,8,7,3,1,6,9,4,2} dentiers i :entier Dbut t=tri_tableau(t,INDICES) Pour i de 1 INDICES Faire Afficher t[i] FinPour Fin EnJavacestencoreplussimple:ilsefichedelatailledestableauxpasssenparamtres,etenpluspourpouvez obtenirlatailleduntableau.Lafonctiontri_tableau()nereoitdoncquunseulparamtre,letableautrier,etnest mmepasobligederetournerletableaucarilestpassenrfrence. class chap6_tri { static void tri_tableau(int[] tab) { int i,mem,pos,cpt; cpt=tab.length; for(i=1;i<cpt;i++) { mem=tab[i]; pos=i-1; while((pos>=0) && (tab[pos]>mem)) { tab[pos+1]=tab[pos]; pos--; } tab[pos+1]=mem; } } public static void main(String[] args) { int t[]={48,17,25,9,34}; int i,cpt; cpt=t.length; System.out.println("Avant :"); for(i=0;i<cpt;i++) System.out.print(t[i]+" "); System.out.println(); tri_tableau(t); System.out.println("Aprs :"); for(i=0;i<cpt;i++) System.out.print(t[i]+" "); System.out.println(); } } Lersultatestlesuivant: Avant : 48 17 25 9 34 Aprs : 9 17 25 34 48

ENI Editions - All rigths reserved

- 17 -

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:
q

Simpleourapide:lesousprogrammesappelleluimme. Croiseouindirecte:deuxsousprogrammessappellentlunlautre:lepremierappellelesecond,quiappelle lepremier,etc.

Larcursivitpeuttreappliquetantauxfonctionsquauxprocdures. Pourunercursivitsimple: Procdure recursive() Dbut /* instructions */ recursive() /* instructions */ Fin Pourunercursivitcroise: Procdure recur1() Dbut /* instructions */ recur2() /* instructions */ Fin Procdure recur2() Dbut /* instructions */ recur1() /* instructions */ Fin Lasuitenevaexposerquelessousprogrammesrcursifssimples.

2.Unpremierexemple:lafactorielle
Une factorielle est lexemple rv dapplication dun algorithme rcursif. Cet exemple a dj t prsent dans les chapitresprcdentsmaisunpetitrappelsimpose:
q

10!=10*9*8*7*6*5*4*3*2*1 Donc10!=10*(9*8*7*6*5*4*3*2*1) Donc10!=10*9! Doncn!=n*(n1)!

Sivouscrezunefonction(appropriedanscecas)appelefact()etchargedecalculerlafactorielleden,vousauriez unraccourcidecegenre:

ENI Editions - All rigths reserved

- 1-

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:
q

1 re tape:5>1?Oui:fact(5)appelle5*fact(4) 2 m e tape:4>1?Oui:fact(4)appelle4*fact(3) 3 m e tape:3>1?Oui:fact(3)appelle3*fact(2) 4 m e tape:2>1?Oui:fact(2)appelle2*fact(1) 5 m e tape:1>1?Non:fact(1)sortenretournantlavaleur1fact(2).

Estcefini?Non!Chaquefonctionappeleseterminantretournesavaleurauprogrammeousousprogrammelayant appel.Doncacontinue:
q

6 m e tape:fact(2):2*fact(1)=2,retourne2fact(3) 7 m e tape:fact(3):3*fact(2)=6,retourne6fact(4) 8 m e tape:fact(4):4*fact(3)=24,retourne24fact(5) 9 m e tape:fact(5):5*fact(4)=120,retourne120auprogrammeappelant.

Sivoussuivezlordredesappels<>retoursvousobtenezleschmasuivant:

Lesallersretoursdunappelrcursif Unalgorithmeunpeupluscorrectdefact()estdonc: Fonction fact(n :entier) :entier Dbut Si n>1 Alors nn*fact(n-1) FinSi Retourne n Fin

- 2-

ENI Editions - All rigths reserved

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:
q

Ilsnepeuventdplacerquunseuldisquelafois. Ilsnepeuventdplacerundisquequedansunemplacementvideousurundisquedeplusgranddiamtre.

Lalgendeditaussiquequandlesdisquesonttempilsaudbutdestemps,etquelorsquelesprtresaurontfini delesdplacer,ceseralafindumonde. N uldoutequesilesprtresdelalgendeavaienteuunordinateur,nousserionstousdjmortsQuoique! Avec 64 disques il faut 264 1 dplacements (18446744073709551615 et uniquement sans se tromper), soit raisondeunparseconde584542046090ans(584milliardsdannes).Sachantqueluniversaenviron14milliards dannes(cestthorique),ilnousreste570milliardsdannespourenprofiter.Enplus,lesdisquesenordoivent tretrslourdsdplacer. LejeufaitrfrenceHanocardanslacapitaleduVietnam,uneanciennencoloniefranaise,lestoitsdecertaines pagodesontlaformedeplateauxempils. Lalgorithme rcursif pour rsoudre ce problme est un grand classique ncessitant un peu de torture mentale. Supposonsquevoussachiezdplacern1disques.Pourendplacern,ilsuffitdedplacer(n1)disquesdupiquet1 au piquet 3, puis de dplacer le grand disque du piquet 1 au piquet 2, et de terminer en dplaant les (n1)autres disquesdupiquet3verslepiquet2. Soient:

ENI Editions - All rigths reserved

- 3-

nlenombrededisques, alapositiondedpart,valant1, b,lapositiondarrive,valant2, c,lapositionintermdiaireutilisable,valant3, audpart,touslesdisquessontlapositiona, uneprocdure"dplacer"quidplaceundisquedunepositionuneautreviaunepositionintermdiaire.

Lalgorithmeestlesuivant: Procdure dplacer(n,a,b,c :entiers) Dbut Si n>0 Alors dplacer(n-1,a,c,b) Afficher "De ",a, "vers ",b dplacer(n-1,c,b,a); FinSi Fin SoitenJava: class chap6_hanoi { static void deplace(int n, int a,int b, int c) { if(n>0) { deplace(n-1,a,c,b); System.out.println("De "+a+" vers "+b); deplace(n-1,c,b,a); } } public static void main(String[] args) { deplace(3,1,2,3); } }

- 4-

ENI Editions - All rigths reserved

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 :
q

Malgr la puissance de vos ordinateurs, la capacit mmoire reste souvent limite. Un ordinateur 32 bits "standard" (bureau, jeu) est souvent limit 4 Go. Parfois des machines vont encore beaucoup plus haut, jusqu 64 Go. Or, mme au modeste niveau de lordinateur personnel cela reste souvent trs insuffisant : il est impossible de conserver toutes les donnes en mmoire. Par exemple, un film au format DV dun camescopenumriqueoccupeprsde20Go,unDVDcompletplusde8Go,etc. Mmesiltaitpossibledeconservertouteslesdonnesenmmoirecentrale,cequiseraitsommetoutelidal vu la vitesse daccs aux informations, cette dernire est volatile. Cestdire que tant que lordinateur est allum,quevosprogrammesneplantentpas,etquellectricitfonctionne,ilnyaaucunproblme.Dsquon dbranche,toutdisparat.

Ilfautdonctrouverunesolutionprennepourconservervosdonnes.Unfichiercorrespondlunedespossibilits.

3.Dfinition
Unfichierestunensembledinformations,gnralementstructuresdunemanireouduneautre.Certeslammoire contient aussi ce genre dinformations (vous avez vu les types structurs), mais on parle de fichiers quand ces informations sont places sur un support moins volatile que la mmoire de lordinateur. Aussi un fichier se place sur unedisquette(envoiededisparition),unebandemagntique(commelessauvegardessurbandeparexemple),une clUSB,etsurtout,surundisquedur.

4.Lesformats
a.Typesdecontenus
Unfichiersedistinguedesautresparquelquesattributs dontsonnometsacatgorie.Ilssedistinguentaussientre eux par lorganisationdeleursdonnescequidfinitleurformat.Vousconnaissezprobablementplusieursformats defichiers :
q

lesfichierstexte

ENI Editions - All rigths reserved

- 1-

lesdocumentsdestraitementsdetexte lesfichierssonMP3 lesvidosDivX lesfichiersHTML lesimagesJPEG lesfichiersdevotregestiondecomptebancaire etc.

Comment sy retrouver dans tout ce bazar ? Il existe autant dorganisations de donnes quil existe de logiciels ! Cestdailleurssouventuntrsgrosproblme,cestcequonappelleunformatdefichierspropritaire :ilestsouvent impossiblederelireunformatdonnavecunproduitconcurrent. anapasforcmentderapportdirect,maisunpeudelobbyingdanscecas prcisnestpasdusuperflu :il existedenombreuxformatsdefichiersdit"ouverts",dontlorganisationdesdonnesquiysontcontenuesest connue et documente. Tout format de fichier "ouvert" est reconnu gnralement de la mme manire par les programmes sachant les utiliser. Le PDF (pour certains documents) est un format ouvert, invent par Adobe, le format OGG Vorbis en est un autre, concurrent du MP3. Il existe encore une diffrenciation entre les formats propritairesetlesformatslibres.Touslesformatslibressontouverts,maisseulementtrspeudepropritairesle sont.Unformatlibre,ouvertetrpanduestungagedeprennitetdecompatibilitdevosdonnes.OGGVorbis estlibre,PDFnelestpas.SidemainAdobeendveloppeunenouvelleversion,ellepourraittreincompatibleavec les prcdentes, et payante. On a vu des documents Word ne plus pouvoir tre ouverts dune version une autre Tout ce qui peut tre formalis peut tre stock dans un fichier. Il y a cependant des diffrences videntes et flagrantesentreunfichierquidoitstockerunephotoetunautrequistockeunepageHTMLdunsiteweb. Deuxcatgoriesdefichierssontdistinguables :
q

Lesfichiersorganisssousformedelignesdetextesuccessives,quisappellentdesfichierstexte. Les fichiers bruts, contenant des donnes varies dont des nombres reprsents sous forme binaire, ne correspondantpeuoupasdutoutdutexte,quisappellentdesfichiersbinaires.

b.Lefichierbinaire
Commentreconnatrecesfichierslesunsdesautres ?Cesttrsfacile !Prenezunditeurdetextesimple(notepad sousWindows),etouvrezlefichiersurlequelvousavezdesdoutes.Sivousobtenezceci (lditeurestkwritesous Linux):

- 2-

ENI Editions - All rigths reserved

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. L aconfigurationcompltedeWindowsestplacedansunregistreoubasederegistre.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 :

ENI Editions - All rigths reserved

- 3-

Unfichiertexteestdirectementlisibleparlutilisateur,etsonorganisationdevientvidente. Dansunfichiertexte,mmelesnombressontreprsentssousformedecaractresASCII(ouunicode,selonlecas). Le nombre 1234 sera reprsent exactement sous cette forme caractre, soit la suite ASCII 31323334 (hxadcimal),49505152 (dcimal) ou encore 0011001 0011010 0011011 0011100 en binaire. Le mme nombre dansunfichierbinaireseraitreprsenten04D2(hxadcimal)ou10011010010enbinaire :unegrossediffrence. Celaveutdirequequandvousallezcriredesnombresdansunfichiertexte,vousdevrezutiliserdesfonctionsde conversiondenombresversdeschanes.Rciproquement,vousdevrezutiliseruneautrefonctionquandvouslirez ceschanespourlesconvertirennombres.Vouspouvezutiliserlesfonctionsprdfiniespourcela :
q

x=chnum(txt) :convertitlachanetxtenvaleurnumrique txt=numch(x) :convertitlavaleurnumriquexenchane

VousavezpuvoirdansquelquesexemplesdeschapitresprcdentsqueJavadisposedunarsenalintressantde fonctions(onparleplusdemthodes,dailleurs)pourconvertirdutexteenentier,rel,etc.Unsoucipeutseposer avec les rels : les anglosaxons (et dautres) utilisent le point comme sparateur dcimal, alors que vous utilisez probablementlavirguleenFrance.Certesleslangagesdeprogrammationutilisentprincipalementlepoint,maisles tableursfrancissutilisentlavirgule.Amiscanadiens,sivouslisezcelivre,voustespluschanceuxquelesfranais, quidevrontfaireattentionenconvertissantunechaneennombreetviceversa,causedelavirgule.Dansledoute, lisezlemanueldevotrelangage. Q uasiment 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. Fichiertexte Lespropritsdunfichiertextesont lessuivantes :
q

Lesfichierstextesontutilisspourstockerdesdonnesstructures. Cesdonnespeuventtredutexte,desnombres,dumomentquetoutestconvertientextelisible. Cesdonnesstructuressontdesenregistrements. Lesenregistrementsdunfichiertextesontreprsentssousformesdelignes,spareslesunesdesautres parunesquenceCRLF(Windows)ouLF(Unix/Mac). Chaquelignereprsenteunestructuredenregistrement,selonunformatprtabli(fixeoudlimit). Unfichiertexteestlisibleetmodifiableparnimportequelditeurdetexte. Linterprtationdesenregistrementsdpendbienentendudesafinalit. Unfichiertextenepeuttreluqueligneligne. Un enregistrement se rajoute uniquement la fin du fichier. Pour modifier ou insrer un enregistrement, il faudraprobablementtoutrcrire.

Fichierbinaire Commepourlesfichierstexte,voiciquelquespropritsdunfichierbinaire :

- 4-

ENI Editions - All rigths reserved

Unfichierbinairepeutstockernimportequoi,quecesoitstructurounon. Lesfichiersbinairesnontpasdestructureapparente,ilsreprsententunesuitededonnes(octets)crites lesunesaprslesautres. Touteslesdonnessontreprsentessousformebinaire.Lesnombressontconvertis,etsilyadutexte,il apparatcommetelmaisnonstructur.Demmesionyvoituncaractre,ilsepeutquecesoituneffetde bord : la conversion dun nombre donnant par hasard quelque chose de lisible via les codes ASCII ou Unicode mais nayant aucun rapport. Pour rsumer : les donnes dun fichier binaire y sont crites exactementcommesiellessortaientdelammoire :cestlammereprsentation. La structure des enregistrements est dpendante de linterprtation du programme. Les enregistrements peuventtredelongueurfixe,maiscollslesunsaprslesautressansretourlaligne. Decefait,unfichierbinairenedoitpastreouvertouenregistrdepuisunditeurdetexte :ilestsouvent illisible. Seul le programme sachant le manipuler est apte lutiliser. Vous pouvez cependant utiliser un diteurhxadcimal. Lefichierpeuttreluoctetparoctet,ouparbloc,ouentirement,depuisnimportequelleposition,puisque cestvousquidfinissezsastructure.Idempourlesenregistrements.

5.Lesaccsauxfichiers
a.Squentiel
Lefichiersquentielpermetdaccderauxdonnesdansleurordredcriture.Vousaccdezauxdonneslesunes aprslesautres.Pourpouvoiraccderaumillimeenregistrementvousdevezdabordlireles999premiers(cequine veutpasdirequevousdevezlesinterprter).Lesfichierstextesontgnralementdesfichierssquentiels,chaque enregistrementtantreprsentparuneligne. Unfichierbinairepeuttrsbientresquentiel,puisqueencoreunefoiscestvousquidterminezsastructure.Vous pouvez dcrter que les n premiers octets sont la description dune figure gomtrique de n faces, puis que les n autresenregistrementsreprsententlalongueurdesfaces,lesangles,etc. Il nest pas possible de modifier directement lenregistrement dun fichier squentiel. Vous pouvez rajouter un enregistrementlafin.Poursupprimer,vouspourrezutiliserunditeur.

b.Accsdirect
Laccsdirectestaussiappelalatoire.Ilnyariendespcialementalatoiredevotrect,maiscontrairement laccssquentiel,vouspouvezsauterdirectementlendroitquevousdsirez.Pourunfichiertexte,apourraittre lenumrodenregistrement(deligne).Pourunfichierbinaire,cestlapositiondeloctetsouhait.

c.Index
Dans un fichier index, les enregistrements sont identifis par un index qui peut tre un numro ou une valeur quelconque, un identifiant. La connaissance de cet identifiant permet daccder directement lenregistrementquil rfrence. Les enregistrements sont souvent placs les uns la suite des autres dans le fichier, comme en squentiel. Les index sont eux placs dans un tableau dindex, avec pour chaque index la position de lenregistrementcorrespondantdanslefichier.Unfichierindexestdoncunsupermlangedesdeuxprcdents. Les index peuvent tre totalement indpendants, auquel cas il ny a pas forcment de moyen de lire les enregistrementssansconnatresonindex.Maisbiensouvent,vousentendrezparlerdesquentielindex :lefichier est index, mais depuis un index, vous pouvez lire successivement tous les enregistrements suivants. Les index peuvent tre chans dans un sens, dans les deux, voire tris, etc. La notion de chanage est lun des sujets du prochainchapitre.

d.Autre ?
UnlangagecommeleCOBOLestleroidelamanipulationdesfichiers,notammentensquentielindex.Ilseraitplus complexe, mais pas infaisable (pour les professeurs sadiques ou les tudiants masochistes) de dcoder un fichier MP3danscelangage.

ENI Editions - All rigths reserved

- 5-

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

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 :
q

Unsparateur":"dlimitelesdiffrentschamps. Ilyaseptchamps,numrots(parconvention)de17. 1 e rchamp :nomdelutilisateur(sonlogin). 2 m e champ :indicateurdemotdepasse(icistockailleurs). 3 m e champ :UID,identifiantnumriqueuniquedelutilisateur. 4 m e champ :GID,identifiantdugroupedelutilisateur(stockailleurs). 5 m e champ :commentairelibre. 6 m e champ :dossierpersonneldelutilisateur. 7 m e champ :linterprteurdecommandes(shell)deconnexion.

Vousvoyezbienquilestpossibledeplacerdesinformationstrsimportantesdansunfichiertexte. La manipulation dun tel fichier est assez vidente : il suffit de lire une ligne, puis de dcouper celleci champ par champ,cequiestpluttsimplecarilsuffitdslorsdetrouverlesdlimiteurs.Laplupartdeslangagesproposentdes fonctionsquipermettentdedcouperunechaneselondesdlimiteurs.Cetypedefichieraaussibiendesavantages quedesinconvnients :
q

Dufaitqueleschampssoientcollslesunsauxautresetquechaquechampneprendpasplusdespaceque sadonneoccupe,fournitunrelavantageentermedoccupationdespacedisqueetdemmoire. Cependant, le traitement de dcoupage de la chane en fonction de la position forcment alatoire dun

ENI Editions - All rigths reserved

- 1-

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 :
q

Unloginfaitenprincipe8caractres. Unmotdepasse1seul(stockailleurs). LesUIDetGIDutilisentaumaximum5chiffres. Lecommentaireseraarbitrairement(pourlexemple)de15caractres. Lescheminsetshellsarbitrairementaussi15caractres.

- 2-

ENI Editions - All rigths reserved

|-----------------------------------------------------------------| |root x0 0 Commentaire /root /bin/bash | |bin x1 1 Commentaire /bin /bin/bash | |daemon x2 4 Commentaire /sbin /bin/bash | |rohaut x123 123 Compte Seb /home/seb /bin/ksh | |-----------------------------------------------------------------| |1 891 11 22 33 45 6| | 0 45 01 56 90 4| Deuxchosessautentauxyeux:
q

Contrairementauformatdlimit,leformatlargeurfixeconsommebienplusdemmoire.Danscetexemple 64 octets sont utiliss pour chaque enregistrement. Dans le format dlimit, la taille est variable, mais la premirelignenutilisaitque32octets. Cependant, la rcupration de tels enregistrements est bien plus simple, car vous connaissez lavance la tailledechaquechampetdonctouteslespositionspourdcoupervosenregistrements.Parcontre,ilfaudra pensersupprimerlesventuelsespacesentrop,ensupprimantlesespacesfinaux.Leslangagesproposent souvent une fonction appele trim qui le fait pour vous. Nul besoin donc de faire des recherches comme prcdemment.

Cette praticabilit compense lutilisation de la mmoire, dautant plus quelle concide fortement avec les types structursabordsdanslechapitrecinq.Lalectureetlcrituredanslesfichierssetrouventainsifacilites. Unfichierformatfixeaaussiunautreavantage :ilestpossibledechoisirparmilesdeuxformats,texteoubinaire, pour lenregistrer. Autrement dit soit ligne ligne, soit contigus. Comme vous connaissez la taille exacte dun enregistrement, il suffit de dire que les octets 1 64 reprsentent le premier, 65 129 le deuxime, 130 194 le troisime, et ainsi de suite. Vous devrez cependant faire attention avec les valeurs numriques, un entier occupant gnralementquatreoctets,unreldoubleprcisionhuit,etc. Connaissant lavance les positions de chaque champ, vous utiliserez les sous programmes prdfinis de chaque langagepourdcouperunesouschanedecaractresquivalentlafonctionmilieuduchapitreprcdent.

3.Principesdaccs
a.tapesdebase
Pourtravailleravecdesfichiers,vousdevrezrespecteruncertainordre.Ilvousfaudra :
q

Ouvrirlefichier,cestdireindiquerquelfichiervousvoulezaccder,etcomment. Traiterlecontenudufichier :lelire,ycrire,breftouteslesoprationssouhaitespouraccderetmanipuler soncontenu. Fermerlefichier,quandtouslestraitementssonttermins.

Ltape la plus importante est la premire. Comment ouvrir un fichier ? Si vous aviez le droit douvrir seulement un seulfichier,ceseraitassezsimple,maisquestcequivousempcheraitdenouvrirtroisouquatreenmmetemps ?

b.Identificateursdefichiersetcanaux
Leprogrammedoitpouvoirsavoirdansquelfichieriltravaillelorsquilsagitdy lire ou dycriredesdonnes.Ceci passeparlutilisationdunidentifiantuniquepourchaquefichierouvert. Danslapratique,tousleslangages,oupresque,eninterne,utilisentlammemthode.Laccsunfichierpassepar lutilisationduncanal.Danslaralit,lavraievie(sousentendezparlquelinformatiquenestpaslavraievie,ou pluttunmoyenmaispasunefin),uncanalrelieentreeuxdeuxcoursdeau,oulamer,unlac,etc. Danscecanaltransite,outredeleau,desbateaux,pniches,dansunsensetdanslautre. Danslemondevirtuel,uncanalpermetdefairetransiterunfluxdinformation(lesdonnes)dunprogrammeversun fichier,dunfichierversunprogramme,dunprogrammeunautre,entredeuxfichiers,entreunprogrammeetun priphrique,etc.Parexemple,ilexisteuncanalquifaittransitercequevoustapezauclavierversleprogrammequi attendunesaisie,unautrecanalpourtransfrerverslaffichagecequeleprogrammedoitafficher.Certainscanaux fonctionnentdanslesdeuxsens,dautresnon.
ENI Editions - All rigths reserved - 3-

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. E nC,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 ?
q

Enlecture,vousavezunaccsenlectureseuleaufichier.Vousnepouvezpasycrire.Vouspouvezvousy dplacer,retourneraudbut,liretoutcequevousvoulez,maiscesttout. Encriture,parfoisnommlecture/criture,vouspouvezmodifiernimportequellepartiedufichier,crireo vousvoulez,craservosanciennesdonnesquiserontdoncdfinitivementperdues(vivelessauvegardes). Attentionlacassesivosenregistrementssontdetaillevariabledansunfichiertexte !Vouspouvezaussi lirelecontenudufichier. Enajout(append),vousnepouvezpaslirelefichier,maisuniquementrajouterdesdonnesaprslafinde celuici,commerajouterunenregistrementouquelquesoctetstoutaubout.Vousnepouvezpasmodifierles donnesquiysontdjcrites.

L eproblmeprincipalquevousrencontrerezquandvousutiliserezdesenregistrementsdansunfichier,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

Fichiertextesquentiel
1.Ouvriretfermerunfichier
Vousdeveztoutdaborddclarerlenomlogiquedufichier,lavariablequipermettra,associeaufichier,detravailler avec.CeciseplacecommedhabitudedanslasectionVar.Vousindiquezensuiteletypedaccs : squentiel, direct, index,etc.Notezquenaccsdirect,vouspouvezaussitravaillerenmodesquentiel. VAR fic:fichier squentiel Vous devez ensuite ouvrir le fichier, en associant nom logique et nom du fichier, avec le mode douverturesouhait. CeciseffectueaveclinstructionOuvrir. Ouvrir "toto.txt" dans fic en lecture Voustrouverezaussiparfoiscettesyntaxesousformedefonction,plusprochedecertainslangages : ficOuvrir("toto.txt","lecture") Lapremiresyntaxeestsouventprfrableenalgorithmique.Pourfermerunfichier,utilisezlinstructionFermersuivie dunomlogiquedufichier. Fermer fic Il existe aussi une syntaxe fonctionnelle, mais les mmes remarques sappliquent : utilisez la premire en cas de doute. Fermer(fic)

N ote :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)

ENI Editions - All rigths reserved

- 1-

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 :
q

Seloncertainsformalismesalgorithmiques,Lireestunefonctionquiretourneunboolen,doncvraioufaux. Sivoustentezdelireunenregistrementetquilnyenaplus,LireretourneFAUX.Autrementdit,tantqueLire estVRAI,onpeutcontinuerlireleslignessuivantes. LafonctionEOF()parfoisappeleaussiFinFichier()retourneunboolenquiindiquesilafindufichierat atteinteounon.Cettefonctionprendenparamtrelenomlogiquedufichier.ElleretourneVRAIsilafindu fichieratatteinte,doncsilneresteplusdenregistrementslire.

L a 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

Lireestunechose,criredansunfichierenestuneautre.LcritureutiliselinstructionEcrire,unefonctionquiprend comme paramtre le nom logique du fichier et lenregistrement (la ligne) crire. Vous trouverez tout comme linstructiondelecture,uneinstructionEcrireFichierstrictementidentique : Ecrire(nom_logique,enregistrement) Commevousdevezcriredesenregistrementslargeurfixe,cestvousdevrifierquelesenregistrementssont labonnelongueur.Silssonttroplongs,vousavezmaldimensionnvosenregistrementslorigine(uncasrgulier estuneadresserallongeouunnomdevillecompos).Silssonttropcourts,vousdevrezleurrajouterdesespaces enfindechane. Parexemple,toujoursdanslexempledeslogins,quefairesiceluiciesttropcourt,parexemple"toto",doncquatre caractres,alorsquildevraitenfairehuit ?Lastuceconsisterallongerleloginavecdesespaces.Cenestpasun problmepourlerelire,puisquelafonctiontrim()restaurerasontatdorigine.Ilestprobablequevotrelangagede programmation propose une fonction qui remplit toute seule les morceaux manquants, des fois il sagit mme de linstructiondcriture(lefprintfduClefaittrsbien). En attendant, vous pouvez programmer vousmme cette fonction algorithmique. Elle ressemble fortement la procdure RepeteCar(). Appelezla Formate(). Elle prendra comme paramtre le champ de lenregistrement et la longueurattendue.Elleretourneracemmechampmaisreformat :soitcouplabonnelongueur,soitavecdes espacesrajoutslafin. Fonction Formate(champ :chane, longueur :entier) :entier Var nbspaces,len :entiers Dbut len=longueur(champ) Si len>longueur Alors champ=gauche(chane,longueur) Sinon nbspaces=longueur-len Tant que nbspaces<>0 Faire champ=champ&" " nbspaces=nbspaces-1 FinTantQue FinSi Retourne champ FinFonct Quelques formalismes algorithmiques autorisent parfois de prciser lavance une longueur de chane la dclarationdelavariable. Var login :chane de 8 caractres Cela laisse entendre que vous navez plus vous soucier que la chane soit trop courte ou trop longue. Cestvrai danslalgorithme,maisattentiondansunvrailangage !LelangageCOBOLanciennementauprogrammeduBTStait unrgalceniveaumaisenCouenJava,lataillenestpasprcise. LafonctionFormate()faitbienvotreaffaire.Vouspouvezreconstruirevotreenregistrement,puislcrire. Programme ECRIT Var fic :fichier squentiel nom,ligne:chanes tlogin,tuid,tpwd,tgid,tcmt,thome,tshell:chanes uid,gid:entiers Dbut nom"passwd" Ouvrir nom dans fic en Ajout login"toto" uid500 gid501 ... /* reconstitution */ tloginFormate(tlogin,8) tuidFormate(numch(uid),5) tgidFormate(numch(gid),5) tpwdFormate(tpwd,1) tcmtFormate(tcmt,15)

ENI Editions - All rigths reserved

- 3-

thomeFormate(thome,15) tshellFormate(tshell,15) lignetlogin&tpwd&tuid&tgid&tcmt&thome&tshell /* Ecriture */ Ecrire(fic,ligne) Fermer fic Fin LinstructionEcrirerajoutelenregistrementdanslefichier,puisseplacelasuitedelenregistrementcr.Aussisi vousexcutezunenouvelleinstructionEcrire,lenouvelenregistrementseplaceralasuiteduprcdent.Attention cependantaumodedouverturedufichier !Enmodelecture/criture,lenregistrementneserapasajoutlafindu fichier (contrairement au mode ajout) mais la position courante : vous crasez les enregistrements existants, les unsaprslesautres. Unprogrammeassezsimpleconsisterecopierlesenregistrementsdunfichierdansunautre.Pourrajouteruntout petitpeudepiment,pourquoinepasdirequesilechampmotdepassecontientun"d",lenregistrementdoittre dtruit ?Ilsuffitdenepaslerecopierdanslenouveaufichier. Programme COPIE Var fic,fic2 :fichiers squentiels nom,nom2 :chanes ligne,pwd:chanes Dbut nom"passwd" nom2"backup" Ouvrir nom dans fic en lecture Ouvrir nom2 dans fic2 en Ajout Tant que NON EOF(fic) Faire Lire(fic,ligne) pwd trim(milieu(ligne,9,1)) Si pwd<>"-" Alors Ecrire(fic2,ligne) FinSi FinTantQue Fermer fic Fermer fic2 Fin

Traitersurdisqueouenmmoire ? Cette stratgie de recopie a un avantage : elle nutilise que trs peu de mmoire. Elle a cependant un trs gros inconvnient,ellencessitelaprsenceunmomentdonndedeuxfichierssurledisquedur.Dansletraitement prcdentlebuttaitdesupprimerleslignesinutilesdupremierfichier.Aufinalcegenredetraitementestentrois tapes :
q

Recopiedesenregistrementsdepasswdversbackup. Suppressiondufichierpasswd. Renommagedebackupenpasswd.

Cettemthodeseraprivilgiersurdesfichierstrsimposants,plusieursmilliers(oumillions)delignes,silammoire nedoitpastretropcharge. Uneautremthodeconsistetouttraiterenmmoire.Ellesefaitendeuxtapes :


q

Lectureintgraledufichierpasswdetstockagedeslignesdansuntableau. Rcrituredufichierpasswdaveclesbonslmentsdutableau.

N ote :Certainslangagesfontunedistinctionentrelemodedcriture,gnralementdestructeur(lefichierest purgvidavantlajoutdedonnes)etunmodedajouttendu,olefichierpeutaussitreluPrudence.

- 4-

ENI Editions - All rigths reserved

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 ? A ttention :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.
q

Ecrire()varajouterunenregistrementdanslefichier,quiseracomposdetousleschampsdutypestructur. Commelatailleexacteestprcise,toutletexteestdjcorrectementformat.Dutravailenmoins. Lire()litunenregistrementcomplet,soittousleschampsdutypestructur duncoup.Aprslalecture,chaque champcontientlabonnevaleur.

Dans les deux cas, le type structur doit correspondre exactement au contenu du fichier, et rciproquement, sinon, gareauxmauvaisessurprises.Lalgorithmesuivantcritunenregistrementstructurdansunfichier,puisrelitcemme fichieretyrcuprelenregistrementdansuneautrevariabledemmetype. Programme FicEnreg Var maligne,recup :enrpwd fic :fichier squentiel Dbut maligne.login"toto" pwd"x" uid"1001" gid"415" ... /* Ecriture */

ENI Editions - All rigths reserved

- 5-

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 :
q

Ouverturedufichierenlecture. Lecturedechaqueligne. Chaqueligneestplacedansuntableaudeuxdimensions :lapremireestlaligne,lasecondeleschamps dcoupsvialamthodesplit(). Uneplaceestrservepourdventuelstraitementssurlesenregistrements. Ouverturedufichierdesortieencriture. Recompositiondetoutesleslignesviaunefonctionrecolle()prenantenparamtreuntableaudechanesetle dlimiteur. Ecrituredelalignereconstruitedanslefichier,avecunretourchariot.

En ltat le programme ne fait quune simple copie. vous de crer les ventuels traitements entre la lecture et lcriture.Aussi,leslignessontplacesdansuntableaudetaillefixe.Peuttreseraitilplusavantageuxdutiliserdes listeschanes,commeexpliqudansleprochainchapitre. Lesinstructionsdedclaration,douverture,lecture,critureetfermeturesontplacesengras. import java.io.*;

- 6-

ENI Editions - All rigths reserved

class chap7_fic1 { public static String recolle(String[] morceaux, String separateur) { int l=morceaux.length; String chaine=""; for(int i=0;i<l;i++) { chaine=chaine.concat(morceaux[i]); if(i!=(l-1)) chaine=chaine.concat(separateur); } return chaine; } public static void main(String[] args) { BufferedReader Fichier=null; BufferedWriter FicSort=null; String ligne; String[][] passwd=new String[100][]; int cpt=0; ligne="x"; try { // Ouvre le fichier Fichier=new BufferedReader(new FileReader ("/etc/passwd")); while(ligne!=null) { // lit une ligne ligne=Fichier.readLine(); if(ligne!=null) { // Split de la ligne passwd[cpt]=ligne.split(":"); cpt++; } } // Eventuel traitement ici sur le tableau // Fichier de sortie FicSort=new BufferedWriter(new FileWriter ("macopie")); cpt=0; while(passwd[cpt]!=null) { // On recolle les morceaux ligne=recolle(passwd[cpt],":"); // On enregistre la ligne FicSort.write(ligne+"\n"); cpt++; } } catch (FileNotFoundException ex) { System.out.println("Fichier absent"); } catch (IOException ex) { System.out.println("Erreur de lecture"); } finally { try { Fichier.close(); FicSort.close(); } catch (IOException ex) { System.out.println("Erreur de Fermeture"); } } }

ENI Editions - All rigths reserved

- 7-

- 8-

ENI Editions - All rigths reserved

Lespointeursetrfrences
1.Rappelssurlammoireetlesdonnes
a.Structuredelammoire
Les prcdents chapitres vous ont dj appris normment de choses sur la mmoire et lorganisation de son contenu:
q

Lammoireestdcoupeenoctets. Chaqueoctetdelammoiredisposeduneadresse. Unedonnepeutstalersurplusieursoctets,doncoccuperuneplagedadresses(parexemple4ou8octets pourunrel,plusencorepourunechane).

Reprsentationdunevariableenmmoire Unevariableestunnomdonnuneouplusieurscases.Ellenommelazonedelammoirecontenantladonne.La zonedelammoirecontenantladonneestdfiniepardeuxchoses:


q

Ladressededbutdeladonne,cestdireladressedupremieroctetcontenantladonne. Latailledecettezone,cestdirelenombredoctetssurlequelstalentlesdonnes.

Latailledelazonedpenddutypedeladonne.UncaractreASCIInoccupequunseuloctet,unentierquatre,un entierlonghuit,etc. Quandvousaccdezaucontenudelavariable,vousaccdezaucontenudelazonemmoirequiluiestassocie.La variableellemmecontientdoncuneautreinformation,ladressedelazonemmoirelaquelleelleestattribue. Parconvention,unordinateursachantgrerbeaucoupdemmoire,lesadressessontnotesenhexadcimal.Cest

ENI Editions - All rigths reserved

- 1-

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

pointeurs. Unpointeurestunevariablequicontientladresseduneautrevariable. Le pointeur pointe sur une autre variable dont il contient ladresse mmoire, cette dernire tant dite variable pointe. Si vous affichez le contenu dun pointeur, vous obtenez une adresse qui est celle de la variable pointe, tandisquesivousaffichezlecontenudelavariablepointe,vousobtenezlavaleurassociecettedernire. Unpointeurestunevariable.Decefait,elledoittredclare,disposeellemmedesapropreadresseenmmoire, etsevoitdfiniruntype.Letypedunpointeurnedcritpascequilcontient(cestuneadresse,doncenprincipe dunelongueurde32ou64bitsselonlesarchitectures)maisletypedelavariablequilpointe.Unpointeursurune variabledetypelongdevraitdonctredclaravecuntypelong.

Lepointeuretlavariablepointeenmmoire

b.LeCroidespointeurs
Peuttre tesvous perdu dans ces dfinitions et explications. Lexemple suivant en C devrait suffisamment vous clairer pour la suite. Supposez que vous voulez placer dans un pointeur ladresse de la variable i de lexemple prcdent. Pour dclarer un pointeur en C, il suffit de lui rajouter une toile "*" avant son nom. Chaque ligne est commente pour vous aider. Lobjectif est de faire pointer un pointeur p_i sur ladresse de lentier i. Pour a le pointeurrecevracetteadresselaidedusigne"&"devanti,carcommevuauparavant,cesignepermetdaccder ladressedunevariable. long i=123456; /* Un entier long contenant 123456 */ long *p_i; /* Un pointeur sur un entier long */ /* Le pointeur p_i reoit ladresse de i */ p_i=&i; printf("%d ladresse %#xd, taille de %d octets\n",i,&i,sizeof(i)); printf("Le pointeur p_i pointe sur ladresse %#xd\n",p_i); lexcutionsurlamachinedelauteur,onobtientceci: 123456 ladresse 0 x b f a 9 5 c b c d , taille de 4 octets Le pointeur p_i pointe sur ladresse 0 x b f a 9 5 c b c d Notezqueladressedelavariableicorrespondmaintenantexactementaucontenudupointeurp_i.Lepointeurp_i pointesurlavariableidontilcontientladresse.

ENI Editions - All rigths reserved

- 3-

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:
q

En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structur. Elle doit retournerladressedecelleci,etdoncsonrsultatseraplacdansunpointeuradquat. Danslechapitresurlessousprogrammes,vousavezvuquilestpossibledepasserunevariableenSortie (S) ou Entre/Sortie (ES) une procdure. Daprs vous, quel est le mcanisme utilis ? Le pointeur, bien entendu:vouspassezladressedelavariableenparamtre,etlesousprogrammevamodifierlecontenude lammoirecetteadresseviaunpointeur. Les pointeurs ouvrent la voie lutilisation de mcanismes complexes. Notamment, vous pouvez crer une liste denregistrements ordonns : un enregistrement contient une valeur, puis un pointeur vers lenregistrementsuivant,etainsidesuite Dans un langage bas niveau comme le C, les tableaux se manipulent trs facilement via des pointeurs, puisquilestpossibledefairedescalculssurlesadresses:+1vaaucontenudeladressesuivante,etainsi desuite.

VoiciunsimpleexempleenCdunefonctionquidoitmodifierlecontenudunevariableenpassanttoutdabordpar unevaleurderetour,puisparunpointeur. LapremirefonctionesttrsclassiqueetressemblebeaucoupcequiexisteenJava. long modif(long var,long n) { var=n; return var; } Ellesutiliseainsietnamnepasderemarqueparticulire: i=modif(i,1000); printf("i contient maintenant %d\n",i); Lasecondefonctionestmodifiepourprendreuneadresseenparamtre:

- 4-

ENI Editions - All rigths reserved

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. N ote: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++;

N ote: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

ENI Editions - All rigths reserved

- 5-

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

A ttention : 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

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. N e drfrencez jamais un pointeur dont la zone mmoire a t libre. Cest une faute malheureusement courante.Dansdetrsgrosprogrammesleprogrammeuroublieparfoisdetesterlavaleurdupointeuravant dyaccder,provoquantunefuitemmoireauxconsquencessouventlourdes.

ENI Editions - All rigths reserved

- 7-

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:
q

Le C/C++ autorise les pointeurs sur nimporte quel type tant primitif (int, long, float, etc) que complexe (structures,tableaux,objetspourleC++).Javanautoriselesrfrencesquesurlesvariablesdsignantdes objets. Les objets sont abords au chapitre suivant, mais en Java les tableaux et structures tels que vus jusquprsentsontenfaitdesobjets. Un pointeur contient ladresse relle en mmoire dune variable, une rfrence Java, appele handle (poigne) en anglais, ne contient quune information "virtuelle" permettant daccder lobjet (contenu du tableau,enregistrement,etc)etfournieparlamachinevirtuelle. LesmanipulationsdepointeurspeuventvitedevenirtrscomplexesenC/C++:risquededpassementdes adresses, allocations mmoires compliques, risque de confondre les types, etc. Aucun risque en Java : la machinevirtuellesoccupepresquedetout. Lesoprateurs"&"permettantdaccderladressedunevariableet"*"pouraccderaucontenuprsent ladressepointenexistentpasenJava.LeseuloprateurprsentenJavaestlepoint,quevousavezdj rencontraveclesenregistrements.

NecroyezpasquelabsencedespointeursenJavasoitunelimitation,cestmmetoutlecontraire.ToutdabordJava estunlangagevoludehautniveaudontlerlenestpaslamanipulationbasniveaudadressesphysiques.Dece fait le programmeur, vous, est entirement dbarrass de toute la gestion de ces adresses puisque la machine virtuellesoccupedetout.CestunesortedeC++dbarrassdetoutesacomplexit.LedveloppementenJavaest donctrssimplifienseconcentrantsurlesfonctionnalits.

b.Lesrfrencessurlesobjets
EnJava,toutevariabledontlecontenuestdclaraveclinstruction"new"estunerfrencesurletypedevariable associ.Parexemplequandvousdclarezuntableau: int tab[]; tab=new int[10]; Lavariabletabestunerfrenceversuntableaudentiers.Doncsivousdclarezunevariabledummetypeetque vousluiaffecteztab,cettenouvellevariableseraellemmeunerfrencedutableaurfrencpartab. Du coup, toutes ces variables sont des rfrences, ce qui veut dire que quand vous affectez un tableau, une structureouunobjetuneautrevariable,vousnecrezpasunecopiemaisajoutezunerfrencedessus.Tousces types sont des objets. Et toute variable qui reoit un objet nen reoit pas une copie mais rfrence cet objet. Ce phnomne a t mis en vidence dans le chapitre Les tableaux et structures avec laffectationdun tableau un autre:lesdeuxvariablesrfrencentlemmetableau.Leprincipevaplusloincarpuisquunevariableainsiaffecte est une rfrence, a veut dire que si vous passez un objet (tableau, structure, objet, etc.) en paramtre dune fonction,vouspassezlarfrencesurcetobjetetnonlecontenuassoci.Regardezlexemplesuivant: class chap8_ref1 {

- 8-

ENI Editions - All rigths reserved

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. E nJava,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); } }

E nJava,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

ENI Editions - All rigths reserved

- 9-

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:
q

articleestunerfrencesurunestructure(unobjet)detypetarticle. articlecontenantunevariabledetypetfabricant,oncrededansunerfrencefabsurunobjetdecetype. art2detypetarticlereoitlarfrencedearticle.Ilsrfrencentlemmeenregistrement. Lecontenudeschampsdeart2estaffich,cestducouplemmequearticle.Sivousmodifiezleschamps,la modificationserpercutesurtouteslesrfrencessurcetenregistrement:cestlemmepourtous.

class tfabricant { public String ref; public String nom; public String adresse; public String tel; } class tarticle { public String ref; public String libelle; public float prix; public tfabricant fab; } class chap8_refstruct { public static void main(String[] args) { tarticle article=new tarticle(); tarticle art2 ; article.ref="Art001_01"; article.fab=new tfabricant(); article.fab.ref="Fab1234"; art2=article ; System.out.println(art2.ref); System.out.println(art2.fab.ref); } }

e.LepigeenJava
EnJavailfautfairetrsattention:quandvouspassezunerfrenceenparamtrevouspouvezmodifierlecontenu delarfrenceetcecontenuseramodifidirectementdanslazonemmoire,cestparfait.Maisvousnepouvezpas modifierlarfrenceellemme!Simodifiezauseindunemthodelavaleurdelarfrenceellemme,elleretrouve savaleurinitialeensortie.Parexemple: static void modif(element p1,element p2) { p1=p2; } Sidansleprogrammeprincipalvousavez: p1=new element(); p2=new element(); p1.valeur=10; p2.valeur=15; modif(p1,p2) ; System.out.println(p1.valeur) ; Lasortiesera10!Eneffetdanslamthodemodif(),p1contientbienlarfrenceverslemplacement mmoire de lobjetp1,maislavariablep1estellemmelocalelamthode!Doncenaffectantp2p1,p1reoitlarfrencede

- 10 -

ENI Editions - All rigths reserved

p2maislanouvellevaleurestperduelasortiedemodif().Ilfautdoncprocderainsi: static void modif(element p1,element p2) { p1.valeur=p2.valeur; } Cettefoiscestlecontenudesvaleursdanslazonemmoirerfrencequiestaffect,etvousobtenezlersultat attendu.

f.Lavaleurnull
Ilsepeutquevousnayezpasbesointoutdesuitedecrerunerfrencesurunenregistrement,maisquevous vouliez viter dyaccderparinadvertance.Danscecas,aulieudecrerunerfrenceavecnew,vouspouvezlui affecterunevaleurappele null. Cette valeur signifie que la variable a t dclare mais na pas dobjetinstanci (terme expliqu dans le chapitre suivant) : vous ne lui avez pas encore affect denregistrement. Du coup, vous pouvezdjtesterlavariableellemmeavantdetesterleschampsquellecontient. Dans lexemple suivant modifi, tarticle contient toujours une variable de type tfabricant. Mais elle ne recevra un enregistrementqueplustarddansleprogramme.Enattendant,lechampfabreoitunevaleurnulle,signifiantque larticlenapasencoredefabricantrfrenc. class tfabricant { public String ref; } class tarticle { public String ref; public tfabricant fab=null; } class chap8_refstruct2 { public static void main(String[] args) { tarticle article=new tarticle(); article.ref="Art001_01"; if(article.fab!=null) System.out.println(article.fab.ref); else System.out.println("Pas de fabricant pour cet article"); } }

ENI Editions - All rigths reserved

- 11 -

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.
q

Commentinsrerunnouvelenregistrementendbutdetableau?Ilnyapasdindicesngatifs Comment insrer un nouvel enregistrement en fin de tableau ? Si lalgorithmique propose un redimensionnementdynamique,leslangagescommeJavanelepermettentpas. Commentinsrerunlmentaumilieudutableau?Fautildcalertousleslmentspourplacerlenouveau lendroitdonn?Sioui,letableaurisquededborder. Etsivoussupprimezunenregistrement,allezvousdenouveaudcalerletableaupourboucherletrou?Ou trouveruneparadepourpasserpardessus?

Vous pouvez vous arranger pour tout programmer afin de tout faire marcher avec les tableaux. Cestparfaitement possible. Mais estce vraiment raisonnable ? Estce de la programmation efficace ? Rappelezvous quau chapitre Introductionlalgorithmiquevousavezapprisquilfauttreconomeenressources.Cettemthodeestgourmande etcomplique.Ilvousfautentrouveruneautreplussimpleetplusbelle. En fait, encore une fois, vous connaissez tous les principes de base de cette nouvelle mthode. Voici quelques lments:
q

Unenregistrementpeutcontenirunautreenregistrement. Cetautreenregistrementpeuttredummetypestructur. Lenregistrementpeutaussicontenirunpointeurversunautreenregistrementdummetype. En notation Java, un enregistrement est un objet, et dans un objet, on peut rfrencer un autre objet du mmetype. On obtient, du coup, une cascade denregistrements qui se suivent les uns les autres. Pour accder au suivant,ilsuffitdaccderlarfrencedecetenregistrementdanslenregistrementactuel. Chaqueenregistrementdisposedunpointeurourfrenceverslesuivant. Lesenregistrementssontdoncchanslesunsauxautres,cestunelistechanedenregistrements.

Le principe peut tre reprsent par le schma suivant. Chaque enregistrement est reprsent par un cadre et contientunevaleuretunpointeurappelpsuivquipointesurlenregistrementsuivantdelaliste.

ENI Editions - All rigths reserved

- 1-

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?
q

Creruneliste:cestcrerlepremierenregistrement,celuidette,quipermettradaccderauxautres. Parcouriruneliste:cestbalayertousleslments,unparun,jusquaudernier. Rechercherunlmentdanslaliste:soitindiquersilexiste,soitretournerunpointeurverssaposition. Ajouter un lment nimporte o dans la liste : au dbut, au milieu, la fin. Une fonction dajout pourrait aussireprendrelapremireoprationdecrationdeliste. Supprimerunlmentnimporteodanslaliste. Supprimerlaliste.

Toutes ces actions peuvent se faire au travers de sousprogrammes, rendant lusage de la liste beaucoup plus simple. Pour se rapprocher des langages fonctionnels, les sousprogrammes devant le plus souvent retourner un pointeurversunlmentdelaliste. Unedernirechose:lepremierlmentdelalisteesttoujourslepointdentrepourlaplupartdesfonctions.tant donnquilserareprsentparlasuiteparunpointeur,neperdezJAMAISladressedecepremierlment:ilserait impossiblederetrouverledbutdelaliste,dautantplusquaveclallocationdynamiquedemmoire,ilestplusque possiblequeleszonesmmoiresalloueschaquelmentnesoientpascontigus. C onservez 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

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

R appel : 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:
q

LepointeurpTetedelattedelaliste,quidevratreretournparlafonction. LepointeurpEncoursdellmentactueldelaliste,dellmentrajoutenfait. Le pointeur pPrec de llment prcdent, dont le pointeur pSuiv devra recevoir ladresse de llment en cours.

Fonction cree_liste2() :pointeur sur element Var pTete, pEncours, pPrec :pointeurs sur element v :Entier Dbut // 1er lment pTetenouveau element Afficher "Valeur du premier lment ?" Saisir pTetevaleur // Le premier lment est le prcdent de llment suivant pPrecpTete Rpter Afficher "Valeur suivante (0=sortie) ?" Saisir v Si v<>0 Alors // Allocation du nouvel lment pEncoursnouveau element pEncoursvaleur v

ENI Editions - All rigths reserved

- 3-

// 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:
q

Lavaleurvrecherche. UnpointeurpTetesurlattedelaliste. UnpointeurpPrecsurllmentprcdent,celuitrouv. UnpointeurpEncourssurllmenttrouv. Unboolenvraioufaux. Sillmentesttrouv,pPrecpointesurceluidavant,pEncourssurllmenttrouv. Sillmentestabsent,pEncoursvaurNILetpPrecpointesurledernierlmentdelaliste. 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

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:
q

Lajoutdunlmentendbutdeliste. Lajoutdunlmentenmilieudeliste. Lajoutdunlmentenfindeliste.

Danslestroiscas,lechanageestmodifi.Ilestcertespossibledecrerungrossousprogrammequigrelestrois casduncoup,maisilestprofitabledediffrenciercestroistraitementsentroissousprogrammesindpendants.Il seratoujourstempsensuitedecrerunsousprogrammefdrateurquigreratouslescas. Danstouslescassuivants,ladressedellmentrajouter,quevousaurezdjremplieaveclabonnevaleur,sera reprsenteparlepointeurpNouveau. Ajoutendbutdeliste Deuxcassontpossibles:lajoutdunlmentdansunelistevide,auquelcasilsagitdupremierenregistrement,et lajoutdunlmentenpremirepositiondelaliste. Danslepremiercas,ilsagitdefaireensortequellmentajoutersoitlepremier,doncquepNouveaudevienne llmentdettedelaliste,sanslmentsuivant.Vouspassezlaprocdurelepointeursurlenregistrementetle pointeurdette. Procdure ajout_unique(E :pNouveau, ES :pTete: pointeurs sur element) Dbut pNouveaupSuiv NIL pTetepNouveau FinProc La seconde procdure ajoute le nouvel lment en tte de liste, sachant que la liste contient dj au moins un lment.Cestuncastrssimpleolenouvellmentreoitcommelmentsuivantceluidette.Pourcedernier, riennechange. Procdure ajout_dbut(E :pNouveau, ES :pTete :pointeurs sur element) Dbut pNouveaupSuiv pTete pTetepNouveau FinProc

Ajoutenfindeliste Cestencoreuncastrssimple.Lerajoutdunlmentenfindelistencessiteseulementdeconnatreladressedu dernierlmentactuel.LepointeurpSuivdecedernierpointerasurlenouvellment,etlepSuivdunouvellment recevraNIL. Sivousreprenezlesprocduresderechercheetdeparcoursdelalistechane,lafindelalistepEncoursvautNIL etpPreccontientladressedudernierenregistrement.Laprocdureajout_fin()reoitdeuxparamtres:pNouveauet pPrec.

ENI Editions - All rigths reserved

- 5-

Procdure ajout_fin(ES : pNouveau, pPrec :pointeurs sur element) Dbut pPrecpSuiv pNouveau pNouveaupSuiv NIL FinProc

Ajoutenmilieudeliste Aufinal,aucunajoutnauratbiencompliqu,puisquelencorevousdisposezdetoutlencessaire.Pourrajouter un lment entre deux autres lments dune liste, vous devez connatre ladresse de llment prcdent, et ladressedellmentcourant,sachantquelenouvellmentserainsrentrelesdeux.Laprocdureajout_milieu() reoitdonctroisarguments:lenouvellmentpNouveau,llmentprcdentpPrecetllmentactuelpEncours. Procdure ajout_milieu(ES :pNouveau, pPrec, pEncours) :pointeurs sur element) Dbut pPrecpSuiv pNouveau pNouveaupSuiv pEncours FinProc

Gnralisation Lebutestdegnraliserlesajoutsenungrandsousprogrammeunifi.Poura,ilfautsavoiroplacerllment rajouter.Lalgorithmederecherchedunlmentretournedeuxpointeurs:celuidellmenttrouvetdellment prcdent. Supposez que vous souhaitez insrer votre nouvel lment juste avant llmentrecherch,adevient pluttsimple.Quatrecasdefigureseprsentent:
q

pPrec contient NIL (pas dlment avant) et pEncours contient NIL : il ny a aucun lment dans la liste, le nouveauseralepremieretseullment. pPrec contient NIL (pas dlment avant) et pEncours pointe sur llment trouv qui est le premier : le nouveauseplaceavant,enpremier. pPrecpointesurunlmentprcdentetpEncourspointesurllmenttrouv,lenouveauseplaceaumilieu desdeux. pPrecpointesurunlmentprcdentetpEncourscontientNIL(larechercheestarriveaubout,lment trouvounon),lenouveauseplaceendernier.

Quatre cas de figures qui correspondent aux quatre sousprogrammes dj crs cidessus ! Lalgorithme devient simple:ilsuffitdappelerlabonneprocdureselonlesvaleursdepPrecetdepEncours.Laprocdureajout_element prendtroisvaleurs:lavaleurrecherche,lavaleurinsreravantetlepointeurdettedelaliste. Procdure ajout_element(E:vrech,vnouveau :entiers, ES :pTete :pointeur sur element) Var pPrec, pEncours, pNouveau : pointeurs sur element Dbut pNouveaunouveau element ; pNouveauvaleur vnouveau recherche_liste(vrech,pTete,pPrec,pEncours) Si pPrec=NIL Alors Si pEncours=NIL Alors ajout_unique(pNouveau, pTete) Sinon ajout_dbut(pNouveau, pTete) FinSI Sinon Si pEncours=NIL Alors ajout_fin(pNouveau, pPrec) Sinon ajout_milieu(pNouveau, pPrec, pEncours) FinSi FinSi FinProc

- 6-

ENI Editions - All rigths reserved

Simplification Les traitements sont ici trs dtaills. Cependant, analysez les procdures ajout_premier() et ajout_dbut(). Que remarquezvous ? Elles se ressemblent, dautant plus que dans ajout_dbut(), pTete contient dj NIL silny pas denregistrements.Donclesdeuxprocduressontidentiques:ajout_debut()remplaceajout_premier(). Regardezmaintenantajout_fin()etajout_milieu():dansajout_milieu,pEncours>pSuivreoitquoisivoustesenfin deliste?LavaleurNIL!Donclesdeuxsontidentiques,etajout_mlilieu()peutremplacerajout_fin().Laprocdure ajout_elementsetrouvesimplifieainsi. Lesdeuxautresprocduresneserventplusrien. Procdure ajout_element(vrech,vnouveau :entiers, pTete :pointeur sur element) ... Si pPrec=NIL Alors ajout_dbut(pNouveau, pTete) Sinon ajout_milieu(pNouveau, pPrec, pEncours) FinSi FinProc

f.Suppressiondunlment
Lajoutdlmentsestungrandpasenavantcarvousconnaissezetcomprenezintgralementleprincipeinhrent auxlisteschanes.Poursupprimerunlmentdecetteliste,cestquasimentlammechose,ilfautjusterecollerles morceauxetlibrerlammoireallouellmentsupprim.Ilyaquatrepossibilits:
q

Supprimerleseullmentdelaliste Supprimerlepremierlmentdelaliste Supprimerledernierlmentdelaliste Supprimerunlmentaumilieudelaliste.

Le tout supposer que llment supprimer existe, donc quil faut tout dabord le rechercher et connatre son adresse, et celle de llment prcdent. Llment prcedent verra son pointeur pSuiv prendre comme valeur le pointeurpSuivdellmenttrouv. Lesfonctionssuivantesrestructurentlalistepourluiredonnerlebonchanage.Lalibrationdelammoireoccupe par llment effacer sera effectue selon le mme modle que la fonction fdratrice dajout dans une grande fonctiondesuppression. Supprimerleseullment Cestfacile,sillmentestleseul,donclattedelaliste,ilsuffitdeplacersonpointeurNIL.Pasdeprcdent, pasdesuivant,cesttermin. Procdure suppr_unique(ES :pTete :pointeur sur element) Dbut pTeteNIL FinProc

Supprimerlepremierlment Cestaussisimple:cestllmentsuivantquidevientlattedelaliste. Procdure suppr_premier(ES :pTete :pointeur sur element) Dbut pTete pTetepSuiv FinProc

Supprimerledernierlment Toujoursaussisimple:llmentprcdentreoitNILcommevaleurdepointeursuivant.

ENI Editions - All rigths reserved

- 7-

Procdure suppr_dernier(E :pPrec :pointeur sur element) Dbut pPrecpSuiv NIL FinProc

Supprimerunlmentaumilieu Ilfautraccorderllmentprcdentavecllmentsuivant. Procdure suppr_milieu(E :pPrec,pEncours : pointeurs sur element) Dbut pPrecpSuiv pEncourspSuiv FinFonc

Simplification Contrairement lajout,vouspouveztoutdesuitevoirsilestpossibledesimplifieravantdallerplusloin,selonle mmeprincipe.Ainsidanslafonctionsuppr_premier()pTeterecevraNILsillmentsupprimestleseulcarpTete >pSuivvautNIL. Idempoursuppr_milieu()etsuppr_dernier().Danssuppr_milieu,pEncours>pSuivvautNILsillmentestledernier. Lesfonctionssuppr_unique()etsuppr_dernier()sontdoncinutiles,saufpourlexemple! Gnralisation Toutdabord vous devez trouver llmentsupprimer.Silny est pas, il nyariensupprimer.DoncsipEncours, contenantllmenttrouv,vautNIL,ilnyarienfaire.Ensuite,ilyadeuxcasdefigure:
q

pPrecvautNIL:llmentsupprimerestlepremier(ouleseul). pPrecestdiffrentdeNIL,llmentsupprimerestaumilieuouenfindeliste.

Ensuite,aprsavoirappellafonctionadquate,vousnavezplusqulibrerlammoireallouepourllment,et passersonpointeurNIL. Laprocduresuppr_elementneprendquedeuxarguments:lavaleurdellmentsupprimer,etlattedelaliste. Procdure suppr_element(E:vrech:entier,ES:pTete:pointeur sur element) Var pPrec, pEncours :pointeurs sur element Dbut recherche_liste(vrech,pTete,pPrec,pEncours:pointeurs sur elements) Si pEncours=NIL Alors Afficher "Element absent" Sinon Si pPrec=NIL Alors suppr_premier(pTete) Sinon suppr_milieu(pPrec,pEncours) FinSi Librer pEncours pEncoursNIL FinProc

g.Supprimertoutelaliste
Poursupprimertousleslmentsdelaliste,ilsuffitdesupprimertousleslmentsjusquaudernier.Maisattention! Nesupprimezpasunlmentsansavoirauparavantconservladressedellmentsuivant!Sivousnelavezpas fait,nonseulementleslmentssuivantssontperdus,maislammoiredeslmentssuivantsnepourraplustre libre! Lafonctionsuppr_listeneprendquunseulargument:lattedelaliste. Fonction suppr_liste(pTete :pointeur sur element) Var

- 8-

ENI Editions - All rigths reserved

pEncours, pSuivant :pointeurs sur lment Dbut pEncourspTete Tant que pEncoursNIL Faire pSuivantpEncourspSuiv Librer pEncours pEncourspSuivant FinTantQue pTete=NIL FinFonc

h.Parcoursrcursif
Ilestpossiblederemplacerlesousprogrammeitratifdeparcoursdelalisteparunefonctionrcursive:lesous programmesappelleluimmeavecladressedellmentsuivanttantquellmentreuenargumentnestpasNIL. Fonction parcours_recursif(pEncours :pointeur sur element) Dbut Si pEncours<>NIL Alors Afficher (*pEncours).valeur parcours_recursif(pEncourspSuiv) FinSi FinFonc Cettefonctionestappeleaveclepointeurdettecommeparamtre. parcours_recursif(pTete)

2.LimplmentationenJava
cause du fait quen Java les arguments des mthodes ne sont pas en entre/sortie (pour rappel, voir dans ce chapitre le point Les pointeurs et rfrences Java et les rfrences Le pige en Java) il faut adapter quelques procdurespourquellesretournentunerfrenceverslesdiverslmentsdelaliste. import java.io.*; class element { int valeur; element pSuiv=null; } class chap8_liste { // Fonction de saisie static int saisir() { String txt; int vretour=0; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { txt=saisie.readLine(); vretour=Integer.parseInt(txt); } catch(Exception excp) { System.out.println("Erreur"); } return vretour; } // Cration de la tte static element cree_liste() { element pTete; pTete=new element(); pTete.pSuiv=null;
ENI Editions - All rigths reserved - 9-

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

if(pTete!=null && pTete.valeur==v) trouve=true; } else { if(pPrec.pSuiv!=null) trouve=true; } return trouve; } // Fonctions dajout static element ajout_debut(element pNouveau, element pTete) { pNouveau.pSuiv=pTete; pTete=pNouveau; return pTete; } static void ajout_milieu(element pNouveau, element pPrec, element pEncours) { pPrec.pSuiv=pNouveau; pNouveau.pSuiv=pEncours; } static element ajout_element(int vrech, int vnouveau, element pTete) { element pPrec=null,pEncours=null,pNouveau; pNouveau=new element(); pNouveau.valeur=vnouveau; pPrec=recherche_liste(vrech,pTete); if(pPrec!=null) pEncours=pPrec.pSuiv; if(pPrec==null) pTete=ajout_debut(pNouveau, pTete); else ajout_milieu(pNouveau, pPrec, pEncours); return pTete; } // Fonctions de suppression static element suppr_premier(element pTete) { pTete=pTete.pSuiv; return pTete; } static void suppr_milieu(element pPrec, element pEncours) { pPrec.pSuiv=pEncours.pSuiv; } static element suppr_element(int vrech, element pTete) { element pPrec=null, pEncours=null; pPrec=recherche_liste(vrech,pTete); if(pPrec!=null) pEncours=pPrec.pSuiv; else pEncours=pTete; if(pEncours!=null) { if(pPrec==null) pTete=suppr_premier(pTete); else suppr_milieu(pPrec,pEncours); } pEncours=null; return pTete; } // Supprimer la liste static element suppr_liste(element pTete) { pTete=null; return pTete; } // Parcours rcursif static void parcours_recursif(element pEncours) {

ENI Editions - All rigths reserved

- 11 -

if(pEncours!=null) { System.out.print(pEncours.valeur+" "); parcours_recursif(pEncours.pSuiv); } } // Programme principal public static void main(String[] args) { element pTete,pPrec; int v; pTete=cree_liste2(); parcours_liste(pTete); System.out.println("Saisir la valeur recherchee :"); v=saisir(); if(existe_liste(v,pTete)) System.out.println("Trouv !"); else System.out.println("Absent !"); pTete=ajout_element(2,15,pTete); parcours_liste(pTete); System.out.println("Saisir la valeur supprimer" :); v=saisir(); pTete=suppr_element(v,pTete); parcours_recursif(pTete); System.out.println(); suppr_liste(pTete); } }

3.Autresexemplesdelistes
a.Listescirculaires
Une liste circulaire permet daccder nimporte quel lment de la liste depuis nimporte quel autre lment sans passerparlepointeurdette. Pourmettreenplacecetypedeliste,ilsuffitdefairepointerllmentsuivantdudernierlmentsurlepointeurde tte. Dans une telle liste, les fonctions dajout et de suppression dlments sont simplifies et correspondent aux fonctionsdajoutetdesuppressionaumilieu.Ilyaunpetitproblmepourlafonctionderecherchequiducoupne sarrtejamais!Ilfautdoncplacerundrapeaupourarrterlarecherchequandonretombesurllmentdedpart. Ilsuffitdestockerladressededpart.Sivousretombezdessus,cestquevousavezparcourutoutelaliste.

b.Listesdlmentstris
Danscetypedeliste,leslmentssontplacsselonunordredfiniparvousmmeauseindesvaleurscontenues dansleslments.Ainsivoustesassurderespectercetordrelorsduparcoursdelaliste. Vousdevezadapterlafonctionderecherchepourfairerespectercetordre.

c.Listesdoublementchanes
Dansunelistechanesimple,leparcoursneseffectuequedansunseulsens,etdepuisunlmentvousnepouvez pasretournerauprcdent.Unepremiremthodeconsisteraitconserverladressedechaquelmentprcdent, cequiseraitpossibleaveclutilisationdefonctionsrcursives,maisceseraittrslourd. Lautrepossibilitconsisteutiliserdeslistesdoublementchanes:chaquelmentnecontientnonplusunseul pointeur,maisdeux:unpourllmentsuivant,unautrepourllmentprcdent.Ainsi,vouspouvezvousdplacer

- 12 -

ENI Editions - All rigths reserved

danslesdeuxsensdanslaliste,soitverslaqueue(fin),soitverslatte.Ceslistessontditesbilatres. Lestraitementsdoiventtreadaptsenconsquence.Prenezleproblmelenvers:vousavezdeuxpointeurs mettrejour.Sivoussavezlefairedansunsens(commeleslistessimples)voussavezlefairedanslautre,vous changezjustedesens.Ilyadoncdeuxfoisplusdoprationsdechanage: Chanageavant


q

pPrecpSuivpNouveau pNouveaupSuivpSuivant

Chanagearrire
q

pSuivantpPrecpNouveau pNouveaupPrecpPrec

Leslistesbilatrespeuventaussitrecirculaireset/outries.

d.Filesetpiles
Dansunefiledattente,dansunmagasin,uncinma,brefdansunequeue,lepremierarrivestlepremierservi.En anglais,celasetraduitpar"FirstIn,FirstOut",soitFIFOenabrg. UnefiledattentedetypeFIFOpeuttrereprsenteparunelistechane.Chaquenouvellmentestrajouten findeliste,tandisqueleslmentssonttraitslesunsaprslesautresdepuislattedelaliste. Quandvousfaiteslavaisselle,lesassiettessontempileslesunessurlesautres.Quandvouslavezlesassiettes vousprenezcellesdudessusendescendantaufuretmesure.Sidesnouvellesassiettessalessontrajouteselles lesontsurledessusdelapile. Leprincipeestlemmeeninformatiquequandvousvouleztraiterdeslmentsaufuretmesuredeleurarrive: les derniers arrivs sont traits en premier. La pile peut tre reprsente par une liste chane : les nouveaux lmentssontsystmatiquementrajoutsenttedelisteetleslmentssonttoujourstraitsdepuiscettette.Si leslmentsarriventplusvitequeleurtraitement,ceuxarrivsenpremierrisquentdtretraitsbientard.

ENI Editions - All rigths reserved

- 13 -

Lesarbres
1.Principe
N ote : 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
ENI Editions - All rigths reserved - 1-

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:
q

Un noeud ou sommet est un lment quelconque de larbre. Dans un arbre gnalogique, chaque individu reprsenteunnoeudousommet:ilaplusieurssuccesseursmaisunseulprdcesseur. Laracineestlepremierlmentdelarbre,nayantpasdeprdcesseurdanslahirarchie. Unefeuilleounoeudterminal,ounoeudfinalestunlmentquinapasdesuccesseur. Unnoeudinterneestunnoeudquinestniracine,nifeuille,quiadoncunprdcesseuretdessuccesseurs. Unarcreliedeuxnoeuds. Unebrancheestlecheminquirelielaracineunefeuille.

Ductdurapprochementgnalogiquelgrementsexiste,voustrouverezlestermessuivants:
q

Lepreestleprdcesseuruniquedunnoeud. Lesfilssontlesnsuccesseursdunnoeud. Lesnoeudsdepreidentiquesontdesfrres. Lenoeudleplusgauchedelarbreestlan.

Unarbrepeuttredcrithorizontalementetverticalement.

c.Descriptionhorizontale
Horizontalement, un arbre naire est un arbre dont le nombre maximum de fils par noeud est n. Les fils sont regroupsparniveaux.Unniveauestlensembledesnoeudsgaledistancedelaracine.Lepremierniveauestla racine,ledeuximelesfilsdelaracine,letroisimelesfilsdesfils,etainsidesuite.Quandchaquenoeuddunniveau aexactementnfils,leniveauestditsatur. Unarbreeststrictementcompletsitouslesniveauxsontcomplets.Ilestsimplementcompletausenslargesitous lesniveauxintermdiairessontcompletsmaisquilmanquedesfeuilles.Dansunarbrestrictementcomplet,laracine ettouslesnoeudsinternesontexactementnfils,niplusnimoins.

d.Descriptionverticale
Lahauteurdunarbreestlenombredenoeudsdupluslongchemindirect,lapluslonguebrancheentrelaracineet une feuille, racine et feuille inclues. Si larbre dispose dune racine, de deux fils et quun des fils a une feuille, la hauteurdelarbreest3.

e.Larbrebinaire
Unarbrebinaireestunarbredontchaquenoeudaauplusdeuxfils.Depuislaracine,larbrebinaireestconstitude deuxsousarbresdiffrencis,lesousarbredroitetlesousarbregauche. Ilexistedesarbrestrois,quatre,nfils.Cependantseulslesarbresbinairesserontabordsicietnotammentles arbresbinairesordonns.Leschmasuivantmontreunarbrebinairestrictementcompletdehauteur3.

- 2-

ENI Editions - All rigths reserved

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:
q

Laracine Lesousarbregauche Lesousarbredroit

Cetypedeparcoursestditprfix.Leprogrammevadabordtraitertousleslmentsdegauche.Arrivunefeuille, ilremonteaunoeudprcdent,puispassedroitepourtraiterleslmentsdegauchedeceluici,puisremonte,et ainsidesuite. Danslarbrebinairedelexemple,lordredesortieestlesuivant:


q

Branchegauche:12>9>8(cestunefeuille) Onremonteaunoeud9

ENI Editions - All rigths reserved

- 3-

Branchedroite:10(cestunefeuille) Onremonteaunoeud9,puislaracine12 Branchedroite:14 Branchegauche:13(feuille) Onremonteaunoeud14 Branchegauche:16 Lasortiefinaleestdonc:129810141316

Pourlereprsenter,ilfaututiliserunefonctionouprocdurercursive. Fonction prefixe(pNoeud :pointeur sur noeud) Dbut Si pNoeud<>NIL Alors Afficher pNoeudvaleur // racine prefixe(pNoeudpGauche) // sous-arbre gauche prefixe(pNoeudpDroite) // sous-arbre droit FinSi Fin Ilexistedeuxautrestypesdeparcours.Leparcourspostfixquitraitedanscetordre:
q

Lesousarbregauche Lesousarbredroit Laracine

Lordredesortieest810913161412. Fonction postfixe(pNoeud :pointeur sur noeud) Dbut Si pNoeud<>NIL Alors prefixe(pNoeudpGauche) // sous-arbre gauche prefixe(pNoeudpDroite) // sous-arbre droit Afficher pNoeudvaleur // racine FinSi Fin Etleparcoursinfix,appelaussiparcourssymtriqueouhirarchiquecanonique.Ceparcoursseratrsutileparla suite.Lordreestlesuivant:
q

Lesousarbregauche Laracine Lesousarbredroit

Cettefoislordredesortieestlesuivant:
q

Sousarbregauche:8910 Racine:12 Sousarbredroit:131416

- 4-

ENI Editions - All rigths reserved

Vousobtenezlasquence891012131416.Cesttrsintressant:larbrebinairedonnenexemplenapast choisi au hasard. Il sagit dun arbre binaire ordonn, construit de sorte quavec un parcours infix les valeurs des 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:
q

Comparez15laracine12:cestsuprieur,directionlenoeuddedroite. Comparez15aunoeud14:cestsuprieur,directionlenoeuddedroite. Comparez15aunoeud16:cestinfrieur,directionlenoeuddegauche. Ilnyapasdenoeudgauche:placez15danscenouveaunoeud.

Touslesparcourssontpossibles,etleparcoursinfixvousdonnetouteslesvaleursdjtries.

b.Recherchedunlment
Pourrechercherunlment,vousavezdeuxsolutions:utiliserunesolutionitrativeouunesolutionrcursive.En effetlesdeuxsontpossiblesetassezsimples.Ilsuffitdecomparerlavaleurrecherchelavaleurdechaquenoeud. Sielleestinfrieure,alorslarecherchecontinuegauche,sinonellecontinuedroite,tantquunefeuillenapast atteinteetquelavaleurnapasttrouve. Lafonctionrech1()prenddeuxarguments:lavaleurrechercheetlaracinedelarbre.ElleretourneunboolenVRAI silavaleurattrouve,FAUXsinon.Elleutiliseunesimpleboucle. Fonction rech1(vrech :entier, pArbre :pointeur sur noeud) :Boolen Var trouve :boolen pEncours :pointeur sur noeud Dbut pEncours=pArbre trouve=FAUX Tant que pEncours<>NIL ET trouve=FAUX Faire Si pEncoursvaleur=vrech Alors trouve=VRAI Sinon Si vrech < pEncoursvaleur Alors pEncours=pEncourspGauche Sinon pEncours=pEncourspDroite Finsi FinSi FinTantQue Finfonc

ENI Editions - All rigths reserved

- 5-

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:
q

Lasuppressiondunnoeudsansfils(unefeuille),cestlecasleplussimple.Lepointeurcorrespondant(droite ougauche)dupredoittreplacNIL. Lasuppressiondunnoeudayantunfils:lefilsdroittreraccordaubonpointeurdugrandpre.

- 6-

ENI Editions - All rigths reserved

Lasuppressiondunnoeudayantdeuxfils.Cestlecasleplusproblmatique.

Pour ce dernier cas, vous pouvez procder aux chanages directement. Par exemple, soit un morceau de larbre dexemple,vousvoulezsupprimerlenoeud8:

Suppressiondunnoeuddeuxfils Lenoeud9tantsupprim,ilfautrorganiserlarbreenconsquence.Lenoeudavaitdeuxfils:celuidegauche(et tout son sousarbre) remplace le noeud supprim, celui de droite (et tout son sous arbre) va droite du nouveau noeud. Uneautrepossibilitestdesupprimerlenoeud,parcourirlesdeuxsousarbresdecetanciennoeudetderajouter chaquelmentdanslepremierarbre.

ENI Editions - All rigths reserved

- 7-

Principedelobjet,unenotionvidente
1.Avantdecontinuer
Vous voici dans le dernier chapitre de ce livre. Si votre objectif tait dapprendre programmer dans des langages procduraux ou fonctionnels, cestdire bass sur lutilisation de sousprogrammes tels que prsents ici, vous pourriezvousarrterl.Eneffetdsprsentvousdisposezdetousleslmentsindispensablespourprogrammer enlangageCouenPascal. Cependantilseraitdommagedenepascontinuer,cecimmesivousnaurezpastoutdesuiteprogrammerenobjet. La programmation objet est depuis le dbut des annes 1990 non seulement un classique, mais fait partie de la culture informatique. Un langage comme le C++, volution du langage C, et mme dautres comme Delphi driv du pascal,VisualBasicdrivduBasic,ainsiquelaplupartdeslangagesdemacrossousMsOfficeouOpenOffice.org,ou encoreleslangagesdecertainsgestionnairesdebasesdedonnes,sontdeslangagesobjet. Nepascomprendrelobjet,cestrisquerdesecouperdebeaucoupdeproduits,beaucoupdefonctionnalits,etparfois aussiduneplusgrandesimplicitdanscertainstraitements.

2.Rappelssurlaprogrammationprocdurale
Lesprocduresoufonctionsreoiventcesdonnesenarguments(paramtres)etlesretournentmodifiesounonpar lemmecheminouparvaleurretourdefonction : Dansunlangageprocdural(oufonctionnel)lesdonnessontsparesdesprogrammesquilesutilisent.

a.Lesdonnes
Chaquevariabledisposeduntypequiindiquequellesortedevaleurellepeutcontenir.Cestypessontditsprimitifs quand ils sont directement proposs par le langage luimme. Ils peuvent diffrer selon les langages mais le C proposeunesriedentiers,derelsetdecaractres.Dautresincluentleschanesdecaractres. Le type de la variable peut aussi tre dfini par le programmeur. Ce sont les types structurs que vous dcrivez vousmme. Les tableaux permettent de regrouper en un tout, plusieurs occurrences de valeurs dans une mme variable. Ils peuvent contenir n valeurs, gnralement du mme type (dans les langages typs comme le C) ou non (langages nontypscommelePHP). Des variables particulires appeles les pointeurs ne contiennent pas directement une valeur mais ladresse dune variable contenant cette valeur, cestdire ladresse de lemplacement de cette valeur dans la mmoire de lordinateur.Bienqueplusdifficileapprhender,ellespermettentunesouplesseingaledanslesmanipulationsde valeurs.Pourpalieraurisquedecomplexitdanscertainslangagesvolus,lanotionderfrenceremplaceparfois celledepointeur,notammentenJava.

b.Lestraitements
Lestraitementssonteffectussoitdansleprogrammeprincipal(quonappelleparfoislecorpsdeprogramme)soit dansdessousprogrammesappelsprocduresoufonctions.Danscederniercas,lafonctionestutilisecommeune instruction retournant une valeur, alors que la procdure est un bloc dinstructions sans valeur mais pouvant ventuellement en retourner via un passage de valeurs au travers des paramtres. Des langages comme le C ou Javanefontpasdedistinctionentrecesdeuxnotions,unefonctionneretournantpasforcmentdevaleur.

3.Lobjet
a.Danslaviecourante
Regardez autour de vous de quoi sont constitues les choses. Par chose, comprenez tous les objets rels ou abstraits qui vous entourent . Un objet rel est par exemple une salire, un couteau, un stylo, une voiture, votre cran dordinateur, un tlphone, etc. Par abstrait comprenez une entreprise, un service, une organisation quelconque,etc. Ces objets ont des proprits intrinsques. Prenez un cran. Parmi ses proprits physiques et dusage vous

ENI Editions - All rigths reserved

- 1-

trouvez :
q

sesdimensions, sontype(crt,lcd,etc), sesconnecteurs(vga,dvi), sonpoids(cestlourduncrantube), ladiagonaledaffichageenpouces, lesrsolutionsdaffichagesupportesaveclesfrquencesassocies, etc.

Cemmecranaprobablementunmodedemploidcrivantlesmanipulationstantmatriellesquelogiciellespourle paramtrer,parexemple :
q

rglerlescouleurs(etassoci :contraste,etc), rglerlazonedaffichage, changerdersolution, etc.

Unobjetcommeuncrandisposedoncdeproprits :cestladescriptiondecequilest,desontat. Il dispose aussi de mthodes : quelles sont les actions possibles pour modifier son tat, son comportement, pour lutiliser.Cestcequilsaitfaire. Toutes les choses, tous les objets de la vie courante ont des proprits et des mthodes. Mme une salire (dimensions, couleur, nombre de trous, contenu, mthodes pour faire couler le sel plus ou moins vite, louvrir, la remplir,lafermer,etc).Imaginezlenombredepropritsetdemthodespouruntrehumain Ladfinitiondespropritsetdesmthodesdcritespouruncranestvalablepour99%descranssicenestplus. Lecontenudespropritsseraprobablementmodifi,maissilcraneststandardlechangementdersolutionvia Windows,MacOSouLinuxseraeffectudelammemanire.Ladfinitionglobale(propritsetmthodes)duntel objetpeutformerunesortedemoulecommuntouslesobjets,lescrans,demmetype. Unefoisquevousdisposezdece"moule",vouspouvezlappliquerautantdobjets,lescrans,quevousvoulez, avecdventuellesvariantes,enappliquantlesmmesmthodes.

b.Eninformatique
Programmationprocdurale Enprogrammationprocdurale,laquestionseposerquandondveloppeest"quoisertleprogramme ?".Ici,il sertmanipulerlesinformationsetlesfonctionsduncran. Commentenprogrammationreprsenterlespropritsdelcranetlesmanipulationsquiysontassocies ?Jusqu prsentvousauriezprobablementraisonnainsi :
q

RegroupertouteslesinformationssurlcrandansuntypestructurtEcran(parexemple). Crer des sousprogrammes de gestion des paramtres de lcran, prenant comme arguments la structure correspondante. Pour n crans, vous crez n enregistrements (structures) de type tEcran, un par cran, dans des variables diffrentes,oudansdestableaux.

- 2-

ENI Editions - All rigths reserved

Pourrsumer,enalgorithmiquevouscririezquelquechoseressemblantplusoumoinsa : Type Structure tEcran type :chane marque :chane modle :chane diagonale :entier hauteur :reel largeur :reel profondeur :reel poids :reel connecteur :chane resolution : tableau[1..10] de chanes FinStruct Procdure changer_resolution(...) Procdure mise_en_veille(...) Procdure rallumer(...) Procdure regler_affichage(...) ... Cest correct, possible, vous devrez probablement jouer avec les pointeurs et rfrences pour le passage de la structure, donc pourquoi pas. Des milliers de programmes ont t dvelopps ainsi. Posezvous cependant la question :pourquoinepasassocierlespropritsdunobjetetlestraitementsassocisenunmmeensemble ? Programmationobjet Quandvousprogrammezenobjet,laquestionseposerest"Surquoiporteleprogramme ?".Larponseest :sur lescrans.Puisqueleprogrammeportesurlescrans,pourquoinepastenterderpondrelaquestionposela findupointprcdent ?Larponseest "pourquoipas",etcestlebutoulundesbutsdelaprogrammationobjet. Vousavezdjindirectementcroisplusieursfoislechemindesobjets.Leschapitresprcdentsvousontmontr destableaux,desstructures,deschanesdecaractres,desrfrences.EnJavatousceslmentssontdesobjets. Enfait,toutcequevousavezdclaraveclemotcl"new"estunobjet. Dans les exemples, vous avez probablement remarqu que la saisie de chanes au clavier, la lecture et lenregistrementdefichiersetmmelesinstructionsncessaireslaffichagepassentpardesobjets.Sicenestpas lecas,leprincipedesstructuresdevraientvousaidermieuxcomprendre. En langage procdural ou en algorithmique, une structure est dj appele un objet, dans un certain nombre douvrages dalgorithmique un peu anciens (annes 1980), dans le sens o elle contient un ensemble de donnes cohrentessurunsujetbienprcis.Lastructuretarticlecontenaittouteslespropritsdunarticle.Vousaccdez uneinformationtraverslepoint"."oulaflche""silenregistrementestunerfrence. La structure code donc toutes les proprits dun objet rel ou abstrait. Cependant tous les traitements associs sontdansdessousprogrammespart. Maintenant,regardezceslignesissuesdelexempleenJavasurlesfichiers : String ligne; ... passwd[cpt]l i g n e . s p l i t ( " : " ) ... La variable ligne est une chane de caractres. Pourtant, vous avez limpression quelle est utilise comme un enregistrement de structures, mais laide du point "." vous accdez non pas des enregistrements, mais des fonctionsassocieslavariable !Pourquoi ?Larponsesetrouvedansunedfinitiondelobjet : Dansleslangagesobjet,lesdonnesetlestraitementsquimanipulentcesdonnessontregroupsauseindune mmeentitappeleobjet. EnJavalesobjetssontdcritsaveclemotcl"class".Enalgorithmiqueilslesontaveclemotcl"classe". Quellessontlespropritsdunechanedecaractres ?
q

Lachaneellemme,composedunesuitedecaractres.

Quelssontlestraitementsapplicablesunechane ?
q

Lecalculdesalongueur,

ENI Editions - All rigths reserved

- 3-

ledcoupageensouschanes, laconcatnationavecuneautrechane, larechercheduneautrechanededans, lclatementdelachaneselonundlimiteur, laconversionenminusculesoumajuscules, lasuppressiondesespacesavantetaprs, etc.

Maintenant, regroupez les proprits de la chane et tous les traitements possibles dessus en un seul tout. Vous obtenezunobjet. Unprogrammeobjetestconstitudunensembledobjetsquicommuniquententreeuxparlmissionetlarception demessagespourraliserletraitementfinal.Caparatimpressionnantetcompliqucommeamaiscestenfaittrs simple.Danslalignesuivante : passwd[cpt]ligne.split(":") lobjetappellignedetypeStringreoitlordreassocisafonctionsplit() :dcoupersachaneselonledlimiteur ":"etretournercommersultatuntableaucontenantleslmentsdcoups. Maisquiluienvoielordre ?Leprogrammeprincipal ?Regardezcommentdmarreunprogramme : c l a s s c h a p 7 _ f i c 1 { p u b l i c s t a t i c v o i d m a i n (String[] args) { ... } } Votre programme principal Java est en fait une fonction particulire dune classe qui porte le nom de votre programme ! Quand vous excutez votre programme, linterprteur Java cre un objet de la classe chap7_fic1 et cherchededansunefonctionmain()pourlexcuter. Cestdonclobjet(unefonctiondelobjet)chap7_fic1quidemandeunobjetdetypeStringdedcouperunechane en plusieurs morceaux et de lui retourner le tout dans un tableau. Il y a donc bien une communication entre les objets,etcestvousquiditesquoifaire. Sivousnavezpasencorebiencompris,alorsditesvousquunvritableobjeteninformatiqueestunpeucommeun enregistrement(ilenreprendlesmmespropritsquesontleschamps)auquelonauraitrajoutdedansdessous programmeschargsdemanipulerseschamps.Lessousprogrammesneseraientpluspartmaispartieprenante delastructure,quiseraitalorsnonplusladfinitiondunenregistrement,maisdunobjet.

4.Classe,objets
Ilestncessairedeconnatrequelquesmotsdevocabulairepourdfinirunobjet.Unobjetestdfinipar :
q

Lesdonnessurluimme :sesproprits,sontat. Cequilfait :lestraitementsquilassociesesdonnesoulesdonnesreuesdesautresobjets.

Comme les structures se dfinissent avec le motcl du mme nom, la structure dun objet se dcrit avec le motcl "Classe" pourclassedobjet.Cettestructuredelobjetdfinitcequeseraunobjetdecetype.Laclasseestletypede lobjet.
q

Unobjetestunevariabledontletypeestsaclasse. Une classe est en fait un moule servant crer plusieurs objets. Les objets issus dune mme classe sont diffrentslesunsdesautresparcequelesvaleursdeleurspropritsnesontpastoujourslesmmes(ex :un

- 4-

ENI Editions - All rigths reserved

objetdeclasseStringenJavanecontientpaslammechanedecaractresquunautreobjetString).
q

Commeilpeutyavoirplusieursobjetsdemmetypedeclasse,onditquunobjetestuneinstancedeclasse.

Ladfinitiondunobjetestunpeucommecelledunestructure,saufquelleestcomposededeuxparties :
q

Les attributs sont les proprits de lobjet, cestdire les diffrentes variables qui dfinissent ce quil reprsente,sontat. Lesmthodessontlessousprogrammes,fonctionsouprocduresquiinfluentsurlobjet,parexemplesurles attributs.

Cesdeuxpartiessontappeleslesmembresdelobjet. Lesattributssontdesvariablesdenimportequeltype,primitif,tableau,objet,etc.Lesmthodessontlquivalentdes sousprogrammesvusjusquprsent,maispropreslobjet. Classe mon_objet attributs attr1 :entier attr2 :tableau[1..10] de 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

ENI Editions - All rigths reserved

- 5-

Etmmedclarerdespointeurssurdesobjets,puisqueeuxaussioccupentunezonemmoire : Var ecran :Ecran pEcran :pointeur sur Ecran Par convention les variables objets, qui seront simplement appeles objets par la suite, commencent souvent par la lettre o : oEcran1, o1, o2, etc. Mais vous ntes absolument pas oblig de suivre cette convention, sauf si votre responsable,chef,professeurvouslimpose. Vous accdez aux divers membres de lobjet en utilisant le point "." entre le nom de lobjet et ses membres, exactementcommepourunestructure.Laseulediffrenceestquaprslepointvousnavezplusforcmentunchamp (un attribut) mais aussi un sousprogramme (une mthode). Quand vous placez une mthode aprs le point, vous lancezlexcutiondecelleci. Type Classe Ecran ... FinClasse Programme obj1 Var o1 :Ecran Dbut // modification des attributs o1.type"LCD" o1.connecteur"VGA" // accs direct aux attributs Afficher o1.type // appel aux mthodes o1.mise_en_veille() o1.ralumer() o1.affiche_modle() Fin

6.Lesmthodes
Regrouperlesfonctionsetlesdonnesauseindunemmestructureappeleobjetestdjbienpluscohrentpour la pense. Mais comment manipuler les attributs de lobjet au sein dune de ses mthodes ? Cest l quest un trs gros avantage : alors quen programmation procdurale vous deviez passer la donne (la variable) en argument, l cesttotalementinutile :lamthode"sait"implicitementquelattributauquelilaccdeappartientlobjet : Classe Ecran attributs type :chane ... mthodes Procdure modifie_type(E :t :chane) Dbut typet FinProc ... FinClasse Ilarriveparfoisquedesnomsdattributssoientidentiquesceuxdautresobjetsouargumentspasssenparamtres demthodes.Pourviterlaconfusionvouspouvezexplicitementdsignerquelemembreappartientvotreobjeten prcisantlemotcl"this"suividupointetdesonnom.Thisseraremplacparlobjetluimmelorsdelappel. Classe Ecran ... Procdure modifie_type(E :t :chane) Dbut t h i s .typet FinProc ... FinClasse
- 6 ENI Editions - All rigths reserved

En programmation objet pure, il ny a plus de notion de programme principal et de sousprogrammes : tous les traitements se font au sein des mthodes, et mme le bloc dinstructions principal est une mthode au sein dune classe,commeenJava. Comme tous les composants dun programme sont des objets, il stablit une communication entre les objets. En pratiquecestvidemmentvousquiinitiezcettecommunication :quandonditquunpremierobjetdemandequelque choseunsecond,cestquelunedesmthodesdupremierobjetappellelunedesmthodesdusecond.Puisquetout estobjet,vouspouvezcreruneinstancedusecondobjetcommeattributdupremier, oummepasserdesobjetsen argumentsdemthodes. Danslexempleprcdent,lobjetdetypeEcranpeutrecevoirlemessagemodifie_typequimodifielattributtype. Il est possible de dcrire (programmer) une mthode en dehors de la dfinition de la classe (en algorithmique, mais pas en Java par exemple). Dans ce cas, dans la dfinition de la classe vous crivez le prototype de la mthode (nom+paramtres) et en dessous vous dfinissez la mthode. Vous devez respecter la syntaxe suivante avec les doublespoints"::"entrelenomdelaclasseetlamthode: Procdure classe::methode(params) Parexemple : Classe Ecran ... mthodes Procdure modifie_type(E :t :chane) ... FinClasse Procdure Ecran::modifie_type(E :t :chane) Dbut this.typet FinProc

7.Portedesmembres
Dansleprogrammeobj1laccsauxdiversmembres,attributsoumthodes,sefaitdirectement.Leprogrammeaccde auxmembresenpassantparlobjet et loprateurpoint.Cestquedansladfinitiondelaclasse,lesmembressont biensouventpublics :ilssontaccessiblessansaucuneprotection. Vous pouvez choisir de rendre les divers membres publics ou privs. Par dfaut en Java par exemple si vous ne prcisezrientoussontpublics.Enalgorithmiquelesattributssontpardfautprivsetlesmthodespubliques.
q

Public : les membres sont directement accessibles depuis toute autre partie du programme ou objet comme danslesexemplesprcdentsvialoprateurpoint. Priv : les membres ne sont plus accessibles depuis lextrieur de lobjet. Ils sont seulement accessibles depuislintrieurdelobjet.

Vouspouvezprciserdanslesdclarationsletypedaccsvosmembres.VoiciunexempledelaclasseEcranoles attributssontprivs,doncaccessiblesuniquementdepuislesmthodesdelobjet,etlesmthodespubliques : Classe Ecran attributs privs type :chane marque :chane modle :chane ... mthodes publiques Procdure regler_affichage(...) Procdure affiche_modle() Procdure saisie_modle() FinClasse Aveccettenouvelledfinition,vousnepouvezplusutiliserleprogrammeobj1telquel.Vousdevezlemodifier. Programme obj2

ENI Editions - All rigths reserved

- 7-

Var o1:Ecran Dbut // Attributs privs : accs depuis lextrieur interdit o 1 . t y p e " L C D " / / * * * I N T E R D I T ! ! ! * * * // Accs direct aux attributs Afficher o1.type // *** INTERDIT !!! *** // Mthodes publiques : accs autoris o1.saisie_modle("Multisync FE1250+")o1.affiche_modle() Fin Il existe un troisime type daccs : laccs protg. Il est particulier et vous le reverrez plus loin lorsque la notion dhritage sera aborde. Un membre protg est considr comme priv pour les autres objets indpendants car il nestpasaccessibledepuisceuxci,maiscommepublicauseindelobjetetdesobjetsquiendrivent.

8.Encapsulationdesdonnes
Lesmembrespeuventtrepublicsouprivs.Lastructureinternedunobjetcomporteuncertainnombredattributset demthodesquiluisontpropres,quirefltentsastructureinterne.Desattributsetmthodesdelobjetnesontutiles que pour dautres mthodes et donc ne doivent pas tre accessibles depuis lextrieur de lobjet. De mme, afin de laisserunseulpointdentreauxdiversattributs,vousnedevriezpaspermettrelaccsceuxcilafoisdirectement etpardesmthodes. Unebonnepratiqueconsisteinterdirelaccspublicauxattributs.Seuleslesmthodesyaccdentetsivousvoulez les manipuler, vous dfinissez des mthodes publiques pour cela. Vous vitez ainsi que le programmeur manipule directementlastructureinternedevotreobjetetymettenimportequoicarvouspouvezeffectueruncontrleausein desmthodes.Cestleprincipedelencapsulationdesdonnes :
q

Lesattributssontprivs(ouprotgs). Vouslesmanipulezenpassantpardesmthodespubliques.

Lexemplemodifisuivantmetenvidencecequiauraitpuposerunproblme :vousvoulezmodifierletypedcran. Enpassantdirectementparunattributpublicvousauriezpumettrenimportequoidedanscomme"PLAT". Orlamthodemodifie_typevrifieavantcequevousymettez dansunchoixprdfini(crt,lcd,plasma).Siletypeque vousvouleznecorrespondpas,ilestrejet.Vousvenezdeblinder(unpeu)votreobjetenempchantquiconquedele "casser".Vousreconnaissezmaintenantlimportance,danscertainscas,delencapsulationdesdonnes. Types Classe Ecran attributs privs ... type:chane ... mthodes publiques ... Fonction modif_type(mod :chane) :boolen ... FinClasse Fonction Ecran::modif_type(mod :chane) :boolen Var tmod :tableau[1..3]<-{"CRT","LCD","PLASMA"} de chanes ok :boolen i :entier Dbut okFAUX i1 Tant que i<=3 ET NON ok Faire Si mod=tmod[i] Alors okVRAI FinSi i=i+1 FinTantQue Si ok Alors this.typemod

- 8-

ENI Editions - All rigths reserved

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

ENI Editions - All rigths reserved

- 9-

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

Hritageethirarchiesdesclasses

d.Simpleoumultiple
N classes peuvent driver dune superclasse, cest ce que vous avez vu jusqu prsent. Si vous regardez la hirarchie actuelle, il serait ventuellement possible de modifier quelque chose. Un omnivore mange la fois de lherbe (fruits et lgumes) et de la viande. Il est donc la fois herbivore et carnivore. Pourraiton alors crer une classeOmnivoredrivantdesclassesCarnivoreetherbivore ?Cestpossible.Danscecaslanouvelleclassehrite desmembresdesdeuxclassespres. Classe omnivore hrite de Herbivore, Carnivore ... FinClasse Ducouplahirarchiedevient :

Hritagemultiple,attentionlacomplexit Cestpossible,maiscelaposesouventplusdeproblmesqueaenrsout.Lesavissontpartagssurcesujet.Mais voiciunbrefexempledesimplicationsunpeutorduesgnresparlhritagemultiple :sideuxmthodesdemme nomsontdfiniesdanslesdeuxsuperclassesetpasdanslaclassedrive,quellemthodedoittreappelesison nomestappeldanscelleci ?Leslangagesproposentdesastucespourgrercegenredecas,maisadevienttrs complexe. Lhritage multiple a t implment dans le langage C++ mais pas en Java, tout au moins pas directement :uneclassenedrivequeduneseuleclasse.

ENI Editions - All rigths reserved

- 11 -

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

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

N ote : 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.

ENI Editions - All rigths reserved

- 13 -

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

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 :
q

Ilportelemmenomquelaclasse. Ilneretournepasdevaleur.

Via le polymorphisme paramtrique (quon appelle aussi la surcharge des mthodes) vous pouvez crer autant de constructeurs que vous le souhaitez, un par cas selon les paramtres passs. En algorithmique vous rajouterez le motcl Constructeur devant le nom de la mthode en remplacement de Procdure ou Fonction. Ce nest pas forcmentobligatoirecaraucuneautremthodenedoitavoirlemmenomquelaclasse.

b.Appelimplicite
LaclasseEcransevoitcompltededeuxconstructeurs :lepremiernereoitaucunparamtreetserautilislorsque lobjetnereoitaucunevaleurlorsdesacration.Lesecondprendtroisparamtres(type,marque,modle)pourles initialiserlacrationdelobjet. U n 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

ENI Editions - All rigths reserved

- 1-

Commentsavoirquelconstructeurvatreappellacrationdelobjet ?Cestvousdepasserlesbonnesvaleurs lobjet ds son instanciation (dclaration ou cration). Dans lexemple suivant, deux objets Ecran sont crs. Le premierlestcommedhabitude :cestleconstructeurpardfaut(sansparamtres)quiseraappel.Lesecondprend trois paramtres entre parenthses, comme si vous passiez des paramtres une mthode : cest le constructeur associquiseraappel. Programme obj8 Var // Appel implicite Ecran() o1:Ecran // Appel implicite Ecran(t,mq,mdl) o2:Ecran("LCD","LG","L1915S") Dbut o1.affiche_modle() // INCONNU o2.affiche_modle() // L1915S Fin lexcution sans avoir rien demand, les deux messages au sein des constructeurs sont affichs, les attributs disposentdjdevaleurs,placeslparlesconstructeurs. Avecuneallocationdynamique,cestpareil : Programme obj9 Var p_oEcran :pointeur sur Ecran Dbut p_oEcrannouveau Ecran("LCD","LG","L1915S") p_oEcran->affiche_modle() // L1915S ... Fin

c.Lhritage
Quesepassetillorsquevousinstanciezunobjetduneclassedrive ?
q

Si la classe drive na pas de constructeur, cest celui de la superclasse qui est appel, si cest possible (paramtresidentiquesparexemple). Silaclassedrivedisposedunconstructeur,cestluiquiestappel. Par dfaut si le constructeur dune classe drive est prsent, le constructeur de la superclasse nest pas appel.Cestvousdyfaireappelexplicitement.

Classe A ... Constructeur A() Dbut Afficher "Je suis A" Fin ... FinClasse Classe B hrite de A ... Constructeur B() Dbut Afficher "Je suis B" Fin ... FinClasse Programme obj10 Var o1 :A o2 :B Dbut

- 2-

ENI Editions - All rigths reserved

... 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 :
q

Ilnyaquunseuldestructeur. Ilneprendpasdeparamtres. Sonnomestcomposduntildesuividunomdelaclasse. VouslefaitesprcderdumotDestructeur.

Il dispose des mmes proprits pour les classes drives. Vous devez ventuellement lappeler vousmme, en cascade. Classe B hrite de A ... Constructeur B() Destructeur ~B()
ENI Editions - All rigths reserved - 3-

Dbut // Appel explicite du destructeur de A super.~A() Fin FinClasse Programme obj11 Var p_o1 :pointeur sur B Dbut p_o1nouveau B // appel implicite au constructeur ... Librer p_o1 // appel implicite au destructeur Fin

3.Lesmembresstatiques
a.Attributs
Quandvouscrezuneinstancedeclasse(unobjet),chaqueobjetrsultantdisposedesonpropreespacemmoire etchaqueattributdonndisposedoncdesaproprevaleurtotalementindpendantedecelledummeattributdun autreobjet. Pourtantilpeutyavoirdescasovousvoudrezpartagerunattributcommuntouslesobjetsdecetypedeclasse. Lecasdcoleestceluiovousvoulezconnatrelenombredefoisolaclasseatinstancie.Danslecasdela classeEcran,vousvoudriezparexemplesavoircombiendobjetsdetypeEcranonttcrs. Poura,lattributdoittrecommuntouslesobjets,etchaqueobjetdoitpouvoirmodifierlavaleurdecetattribut, valeurquiseraensuitelammepourtouslesobjets.Cestlerledelattributstatique. Unattributstatiqueestunattributquinestcrquenunseulexemplaireetquiestcommuntouslesobjetsde laclasse. Vous le dclarez comme nimporte quel attribut, sauf que vous lui rajoutez le motcl statique aprs son type. Lattributstatiquepeuttreprivoupublic.Ilpeuttreimportantdinitialiserunevaleurpardfautpourunattribut statique. Classe Ecran attributs privs n b _ e c r a n s 0 : e n t i e r s t a t i q u e ... FinClasse Pluttquedutiliserthispouryaccder,vousutilisezlenomdelaclasseellemme,tantdepuislextrieurdelobjet (si lattributestpublic)quedelintrieur. Lexemple suivant montre les possibilits associes avec deux objets : le constructeur rajoute 1, le destructeur soustrait 1. Les tapes intermdiaires affichent ltat de lattribut statique nb_ecrans. Classe Ecran attributs publics n b _ e c r a n s 0 : e n t i e r s t a t i q u e ... mthodes publiques Constructeur Ecran() Dbut nb_ecransnb_ecran+1 Fin Destructeur ~Ecran() Dbut nb_ecransnb_ecran-1 Fin Procdure nbEcrans() Dbut Afficher nb_ecrans FinProc FinClasse Programme obj11

- 4-

ENI Editions - All rigths reserved

Var p_o1 :pointeur sur Ecran p_o2 :pointeur sur Ecran Dbut p_o1nouveau Ecran p_o1->nbEcrans() // 1 p_o2nouveau Ecran p_o2->nbEcrans() // 2 Afficher Ecran.nb_ecrans // Accs public : 2 Librer p_o1 p_o2->nbEcrans() // 1 Librer p_o2 Afficher Ecran.nb_ecrans // Seul moyen ici : 0 Fin

4.Classesetmthodesabstraites
Ilyadesfoisovousavezbesoindedfinirunprototypedeclassedanslaquellevousallezdclarerdesmthodes, mais pas forcment leur implmentation. Par exemple, vous voulez crer des classes reprsentant des figures gomtriques afin de concevoir un logiciel de conception assiste par ordinateur. Dans ces logiciels (2D ou 3D), les diffrentesfigurestracesonttoutesleurspropritscommeleursdimensions,surface,primtre,volume,couleurde remplissage, couleur du contour, etc. Les valeurs de ces attributs varient dune figure lautre, cest normal, mais certaines mthodes peuvent tre identiques comme celles pour la couleur, et dautres non comme le calcul des surfaces, volumes et primtres. Pourtant toutes les figures (carrs, rectangles, polygones, triangles, trapzes, losanges,etc)doiventdisposerdecesmthodes.Commentdcrirececienobjet ? Lasolutionconsistecrireuneclassedebasequideviendralasuperclassedetouteslesfiguresgomtriques,etqui vacontenirtouslesattributsdebasecommelapositiondedpartx,ydutracdelafigure,sescouleurs,maisaussi touteslesmthodesnonseulementdebasemaisquidoiventaussiobligatoirementtreimplmentesdanstoutesles classesquiendrivent.Lesmthodesdecalculdesurfaceetdeprimtredoiventtredclaresdanscetteclasse. Pourtantellesnecontiendrontriencommecode :ceseralaclassedrivedelesprogrammer. Cette classe de base contenant des mthodes sans implmentation ne pourra pas tre instancie, vous ne pourrez pascrerdobjetpartirdelle,carelleestdefaitinutilisableetnesertquedebasepourlesmthodesdrives. Une classe non instanciable et contenant des mthodes non implmentes, uniquement destine tre drive, est appele une classe abstraite. Les mthodes non implmentes quelle contient sont appeles mthodes abstraites.
q

Pourcreruneclasseabstraite,vousrajoutezlemotcl"abstraite"aprslenomdelaclasse. Pourcrerunemthodeabstraite,vousrajoutezlemotcl"abstraite"avantsonnom.

Classe figure a b s t r a i t e attributs privs x :rel y :rel c_contour :chane // couleur contour c_remp :chane :: couleur remplissage surface :rel primtre :rel mthodes publiques Procdure setcolor_c(E :couleur :chane) Dbut this.c_contourcouleur Fin ... Fonction a b s t r a i t e getSurface() :reel Fonction a b s t r a i t e getPerimtre() :reel ... FinClasse partirdumomentouneclassecontientunemthodeabstraite,elleestellemmeabstraite.Laclassefigureest abstraite :ellecontientdesmthodesabstraites,sansimplmentation.Ellecontientaussidesmthodesquinesont

ENI Editions - All rigths reserved

- 5-

pasabstraitescommesetcolor_c()quinaurapasforcmenttrerimplmentedanslesclassesdrives. Ilestdecefaitimpossibledecrerunobjetdetypefigure.Vousdevezmaintenantcrerlesclassesquienhritent. Voici deux exemples simplifis de classes : disque et rectangle. Vous devez implmenter dedans les mthodes abstraitesdelasuperclasse. N ote 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 :
q

Noninstanciable Abstraite

- 6-

ENI Editions - All rigths reserved

Necontenantquedesmthodesabstraites.

Ainsitouteclassedrivantdecetteclassespcialedevraitobligatoirementimplmentertouteslesmthodes.Quelest lintrt ?Celuidedfinirunmodleuniqueetcompletdemthodespourlesclassesquidcidentdelesutiliser. Cestypesparticuliersdeclassessappellentdesinterfaces.Enpratiqueuneclassenhritepasduneinterface :mis partlesdfinitionsdesmthodesuneinterfacenecontientpasdecode.Pourdclareruneclasse,vousutilisezlemot cl Interface la place de classe. Par exemple, vous voulez crer une interface qui dclare toutes les mthodes de basepourlalecturedunfichiermultimdia :lecture,pause,stop,avancerapide,retourrapide,pisteprcdente,piste suivante.Linterfaceressembleraitceci (lesparamtresdesmthodesnesonticipasprciss): Interface lecture mthodes publiques Procdure lecture() ; Procdure pause() ; Procdure stop() ; Procdure avance() ; Procdure retour() ; Procdure prcdent() ; Procdure suivant() ; FinInterface

N otezbienquuneinterfacenecontientQUEdesmthodesetriendautre. On dit quune classe qui dcide dutiliser une interface implmente les mthodes de linterface, donc implmente linterface.Vousutilisezcemmemotclpourleprciser. Classe titi implmente interface Vouspouvezdciderdimplmenterplusieursinterfacesauseindevotreclasse,danscecasvoussparezlesnoms desinterfacespardesvirgules. Classe titi implmente interface1, interface2, interfacen Vous devez implmenter toutes les mthodes de linterface dans la classe. Si vous ne le faites pas, la mthode qui nestpasimplmentedoittredclareabstraite,etlaclassedevientabstraite,doncnoninstanciable. LaclasseMusiquercuprelinterfacelecture : Classe Musique implmente lecture attributs privs morceau :chane piste :chane position : entier duree : entier mthodes publiques Constructeur Musique(m,p :chanes) Dbut this.morceaumorceau this.pistep position0 // Mthode de calcul :dure du morceau en secondes dureeduree_morceau(morceau) Fin // Dbut dimplmentation de linterface Procdure lecture() Dbut ... FinProc Procdure pause() Dbut ... Fin Procdure stop() Dbut ...

ENI Editions - All rigths reserved

- 7-

Fin // Continuez ici ... FinClasse

- 8-

ENI Editions - All rigths reserved

LobjetenJava
1.Leslangagesobjet
Lesdeuxpartiesprcdentesdecechapitrevousontprsentcequestlaprogrammationobjet.Ilexisteplusieurs langagesorientsObjet.OnparledeProgrammationOrienteObjet(POO).Lesprmicesdelaprogrammationobjet sontanciennes(pourdelinformatique) :1967aveclelangageSimula,puisSmalltalk.Lgedordbuteaudbutdes annes1980,avectoutdabordlObjectiveC(encoretrsutilisnotammentdansledveloppementdeMacOSetde sesoutils),puisle"CwithClasses en1983,quideviendraleC++,puisEiffel,puisleLispObjet,etainsidesuite. Lesannes1990ontvulexplosiondelobjettouteslessaucespourlemeilleuretpourlepire,etpasuniquement dansleslangages.Ainsidesbasesdedonnesobjetsontapparues.DancienslangagescommelePascal,leBasicou mmeleCOBOLontvoluverslobjet :Delphi,VisualBasic,CobolObjet,etc.Mmeleslangagesmacrospropres dessuitesbureautiques(MsOffice,OpenOffice.org)oudebasededonnes(Access,Paradox)setarguentdtredes langagesobjet.Siladfinitiondelobjetcorrespondpeuprscequivousatprsentdepuisledbutdece chapitre,lespuristesdoiventdanscertainscasbienrire. LarrivedeJavacommevrailangageobjetdehautniveauachangbeaucoupdechoses :reprenantlesbonnesides duC++,illadapteenuntoutplussimpleetpluspratique,adaptauxbesoinsmodernesdesdveloppeursetsurtout desapplications.LaforcedeSUNatdeproposerunlangageadaptunelargegammedebesoins :desapplets Java,lapprentissagedelobjet,lesapplicationsdportes,lesserveursdapplications,etc. LegrosconcurrentdelaplateformeJava(Java,sesoutils,sesAPI,etc)senomme.NETaveclelangageC#(prononcez Csharp)etestvidemmentobjet.LesexemplesdecelivreauraientparfaitementputredveloppsenC#,sachant quelelangageestmaintenantdisponibleailleursquesousWindows. LasuitevousprsentedesnotionsdobjetenJava.Elleselimiteraauxnotionsquevousavezrencontresdepuisle dbut de ce chapitre. Pour un meilleur apprentissage des fonctionnalits objet avances de Java, les Editions ENI proposentdeslivresspcialissdanscedomaine,comme"J2SE, les fondamentaux de la programmation Java"de Benjamin Aumaille. Quant une approche de lobjet plus oriente vers la conception dinterfaces graphiques, vous trouverez lessentiel dans Conception et programmation objet, Applications de gestion en environnement graphique dePascalDanone.

2.Dclarationdesclassesetobjets
Inconsciemment ou non, vous utilisez lobjet dans Java depuis les premiers exemples de ce livre. Dans le premier chapitre,ilvousatdemanddenepasvoussouciercemomentdeladclarationduprogrammeprincipal. Ensuite,desvariablescommeleschanes,lestableauxetsurtoutlesstructures(pourlesquellesilatquestionde tricher) sont des objets. Enfin, toutes les fonctions que vous avez pu soit utiliser directement soit crer sont des mthodesdobjets,etquelquesvariablesquivousonttprsentescommeglobalessontdesmembres. Pastropsurprisnisecou ?Non ?Tantmieux.Autantfairelepointtoutdesuite :quasimenttoutestobjetenJava. Uneclasse,sesattributsetsesmembressedclarentainsi : class nom_classe { // liste des attributs public int att1 ; protected int att2 ; private String att3 ; // liste des mthodes public void methode1() { // code mthode1 } private int methode2() { // code mthode2 } } Vousremarquezquearessembletrsfortementauxstructuresduchapitre5.Etpourcause,ilafallutricherenJava pour utiliser une classe comme une structure. La structure est en fait une classe uniquement compose dattributs publics,dolexpressioncourantequiditquuneclasseestunestructureavecdesfonctions. Voici un exemple simplifi dimplmentation de la classe Ecran faisant apparatre deux constucteurs via le polymorphisme paramtrique et une mthode modif_type() appele par lun des constructeurs ou do vous voulez, puisquelamthodeestpublique.Cetexemplefaitaussiapparatrelutilisationdunevariablestatiqueetsonutilisation

ENI Editions - All rigths reserved

- 1-

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

Vous remarquez depuis le dbut du livre que la fonction principale main() est en fait une mthode particulire dune classepourtanttrsclassique.Lafonctionmain()eststatique,ellepeuttreappelehorsdelaclassedirectement, cestdailleurslebut.Lenomdelaclasseestceluidufichierrsultantsanslextensionjavaouclass. Sivousallezdanslerpertoire(dossier)ovousavezgnrlebytecodejava,les.class,vousdevezremarquerque lorsque Java rencontre plusieurs dfinitions de classes dans un code source, il gnre autant de fichiers .class quil existe de classes dcrites. Le fichier porte le nom de la classe. Il sera dynamiquement charg lors du lancement du programme.SivoussupprimezlefichierEcran.class,plusriennemarche.

3.Hritage
Javaautoriselhritagesimplemaispaslhritagemultiple.Vousverrezcependantquilestpossiblederuserunpetit peu avec les interfaces. Lexemple des figures gomtriques peut sappliquer ici, car Java supporte trs bien le polymorphismeetlesclassesetmthodesabstraites. Lhritageestexactementcommeenalgorithmique,saufqulaplacede"hritede"vousutilisezlemotcl"extends". Concernantlesclassesetmthodesabstraitesvousrajoutezdevantlenomlemotcl"abstract". Notezquedansladfinitiondelaclasseabstraitequelquesattributsprivssontremplacspardesattributsprotgs. Autrement,lesclassesdrivesnauraientpaseuledroitdyaccder. Enfin notez aussi lutilisation du motcl "super" comme en algorithmique, qui remplace la classe (ou plutt lobjet) hrite,utiliseicipourappelerleconstructeurdelaclassefigurechargdeplacerlesbonnescouleurs. U tilisedansunconstructeur,superdoittrelapremireinstructionappele.

abstract class figure { protected double x,y,surface,perimetre; protected String c_contour,c_remp; public final double PI=3.1415927; // Constructeur de figure figure(String c1, String c2) { setcolor_c(c1); setcolor_r(c2); } public void setcolor_c(String couleur) { this.c_contour=couleur; } public void setcolor_r(String couleur) { this.c_remp=couleur; } // Mthodes abstraites abstract public double getSurface(); abstract public double getPerimetre(); } class disque extends figure { private double rayon=0; // Constructeur disque(double c_x, double c_y, double r) { // appel du constructeur de figure super("noir","blanc"); this.x=c_x; this.y=c_y; this.rayon=r; } // Implmentation des mthodes abstraites public double getSurface() { return this.PI*this.rayon*this.rayon; } public double getPerimetre() { return 2*this.PI*this.rayon;
ENI Editions - All rigths reserved - 3-

} }

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

position=0; } // Dbut dimplmentation de linterface public void lecture() { System.out.println("lecture de "+this.morceau); } public void pause() { System.out.println("Pause "+position); } public void stop() { System.out.println("Arrt piste "+this.piste); } public void avance() { System.out.println("Avance"); } public void retour() { System.out.println("retour"); } public void prcdent() { System.out.println("Prcdent"); } public void suivant() { System.out.println("Suivant"); } } class chap9_interface { public static void main(String[] args) { Musique o1; o1=new Musique("Somebody to love",10); o1.lecture(); } } Uneclassepeutimplmenterplusieursinterfaces,danscecassparezlesnomsdesinterfacespardesvirgules. Une interface peut hriter dune ou plusieurs autres interfaces via le motcl "extends" suivi du nom de la ou des interfaceshrites. interface lecture1 { public void lecture() ; public void pause() ; public void stop() ; } interface lecture2 { public void avance() ; public void retour() ; public void prcdent() ; } interface lecture extends lecture1, lecture2 { public void suivant() ; CesdeuxdernierscassontlesseulsenJavao,indirectement,unesortedhritagemultipleatmisenplace,dans lesensouneinterfaceouuneclassepeuthriterdeplusieursdfinitionsdemthodes.Cestsimplistedanslesens odetoutefaoncesmthodesdoiventtreimplmentesobligatoirementdanslaclassequiutiliselesinterfaces,et queducoupJavanapassavoirsildoitutilisertelleoutellemthodedelunedesclasseshrites.

ENI Editions - All rigths reserved

- 5-

Anda mungkin juga menyukai