2007 - Editions Eni - Algorithmique, Techniques Fondamentales de Programmation (Avec Des Exemples en...

221

Transcript of 2007 - Editions Eni - Algorithmique, Techniques Fondamentales de Programmation (Avec Des Exemples en...

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

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

    AlgorithmiqueTechniques fondamentales de programmation

    SbastienROHAUT

    Rsum

    L'auteur Sbastien ROHAUT a dbut comme Ingnieur de dveloppement en C++. Aujourdhui Ingnieur Systme il intervient sur des missions rgulires pour de grands comptes et continue denseigner le dveloppement des classes dingnieur et masters MTIC.

    - 1 - ENI Editions - All rigths reserved

  • Introduction

    Pourquoi apprendre programmer ? Avezvous, comme lauteur, dispos au dbut de la microinformatique dunordinateur o il fallait programmer soimme des jeux ou outils, ou saisir des dizaines de pages de lignes deprogrammation?Avezvousbesoin,durantvostudes,dematriser les techniques fondamentalesdeprogrammationpour passer votre diplme? tesvous un professionnel ou un autodidacte passionn qui veut encore en savoirdavantage?Estceunenouvelletapedevotrecarrireprofessionnelleontantpasinformaticienvoustesamenprogrammerdesmacrosoudesscriptscomplexes?Quelleraisonencoretrouver?Sivousrpondezouilunedescesquestions, mais aussi aux dizaines dautres quil serait possible de poser, alors oui, vous devez apprendre programmer.Apprendreprogrammer,cestenfinsavoircommentfontlesautrespourcrerdesuperbeslogiciels,cestsavoirtermecommentlescrersoimme,etlesdvelopper.

    Commentapprendreprogrammer?Onnesimprovisepasprogrammeur.Cestunmtier,etcommetoutmtier,celasapprend.Dans lescoles,desprofesseursenseignantspourdesclassesdeBTS,DUT,DEUG,classesprparatoires,etc.,sontspcialissdanslapprentissagedesnotionsfondamentalesdeprogrammation.Lesautodidactesseplongentdans des livres, des sites Internet, dans la documentation en ligne des langages, pour apprendre ces notions.Lensembledecesnotionscestlalgorithmique.

    Ce livre reprend lesnotionsessentielles, fondamentales,de laprogrammation.Pourapprendreprogrammer, il fautdabordcomprendrecequestvraimentunordinateur,commentilfonctionneetsurtoutcommentilpeutfairefonctionnerdesprogrammes,commentilmanipuleetstockelesdonnesetlesinstructions,quelleestsalogique.Alors,aufuretmesure,lerestecouledesourcecommeunevidence:variables,tests,conditions,boucles,tableaux,fonctions,fichiers,jusquauxnotionsavancescommelespointeursetlesobjets.

    Le formalisme algorithmique, (la syntaxe du langage algorithmique ou pseudocode) reprend celui couramment utilisdanslescolesdinformatiqueetdanslesformationscommelesBTS,DUT,premiresannesdingnierie,quicelivreestenpartiedestinetconseill.Ilexisteplusieursvariantesutilises,selonleprofesseur,lelangagedorigine.Celuiprsenticialavantagedtredansunfranaistrsexplicite"tantque,jusqu,pourchaque,afficher,saisir,etc.".Leurlecturenencessiteaucuneconnaissancepralabledetermestroptechniques.

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

    Lauteur tient particulirement remercier ses anciens professeurs de BTS du lyce de Montmorency, ses anciensprofesseursetaujourdhuicollguesdelESGI,notammentceuxdalgorithmiqueetdeprogrammationC,C++etJavaquisereconnaitront,pourluiavoirtransmisencoreunpeuplusleplaisirdumtierdinformaticienetdutravailbienfait.

    - 1 - ENI Editions - All rigths reserved

  • Lesfondementsdelinformatique

    1.ArchitecturedeVonNeumann

    Unordinateurestunensembledecircuitslectroniquespermettantdemanipulerdesinformationsquonappelledesdonnes et capable de faire "tourner" des programmes, cestdire une suite ou squence dinstructionsprogrammes lavanceetquilvadroulerdudbut la findans lebutdobtenirdesrsultats.Pourcomprendrecommentunordinateurpeutdroulerunprogramme,ilfauttudierunpeuplusendtailsonfonctionnement.

    CestVonNeumannquiadfinien1944larchitecturedesordinateursmodernesencorelargementutiliseaujourdhui(avecdesvariantescependant).LarchitecturedeVonNeumann(issuedestravauxdeTuringdontilseraquestionplusloin)dcomposelordinateurenquatrepartiesdistinctes:

    Lesinstructionsduprogrammesontprsentesdanslammoire.Lunitdecontrlevaprendrelapremireinstructionduprogrammeetlexcuter.Silinstructionestparexempledadditionnerdeuxnombres,ellevademanderlUALdeprendrecesdeuxnombresenmmoireetdelesadditionneretventuellementdeplacerlersultatdansunenouvellecase.Puis lUCpasselinstructionsuivante.Sielleconsisteaffichercersultat,alorslUCvalirelecontenudelammoire ladresseoestplaclersultat,puisvaenvoyerlersultatvialecomposantdE/Sadquat.Etainsidesuite.Aufinalledroulementdunprogrammeauseindelordinateurestlesuivant:

    l lUCextraituneinstructiondelammoire,

    l analyselinstruction,

    l rechercheenmmoirelesdonnesconcernesparlinstruction,

    l dclencheloprationadquatesurlALUoulE/S,

    l rangelersultatdanslammoire.

    1. LUnitArithmtiqueetLogiqueUAL(ALUenanglais)estlorganedelordinateurquiexcutelescalculs:additions,soustractions,multiplications,divisions,modulos,gestiondessignes(positif,ngatif),oprationslogiques(boolenne),comparaisons,parfoisrotationsetdcalagesdevaleurs(toujoursdanslecadredunelogiqueboolenne).IlexistedesUALspcialisesdanslesnombresvirguleflottante,dautresdansdestraitementscomplexescommeleslogarithmes,lesinversions,lesracines,lesvecteurs,lescalculstrigonomtriques,etc.Certainesdocumentationsluirajoutentquelquesregistres(petitescasesmmoiresintgreslUAL)etluidonnentlenomdeprocesseur(CPU).

    2. LUnitdeContrleUC(CUenanglais),nepasconfondreavecUnitCentrale,contrlelesquenagedesoprations,autrementditledroulementduprogramme.ElleprendsesinstructionsdanslammoireetdonnesesordreslUAL.Lesrsultatsretournspeuventinfluersurlesquenage.LUCpassealorslinstructionsuivanteouuneautreinstructiontellequeleprogrammeluiordonnedeffectuer.

    3. Lammoirepeuttredcritecommeunesuitedepetitescasesnumrotes,chaquecasepouvantcontenirunepetiteinformation(petitedanslesensolatailledechaquecaseestfixe).Cetteinformationpeuttreuneinstructionouunmorceaudinstructionduprogramme(uneinstructionpeutoccuperplusieurscases)ouunedonne(nombre,caractre,oumorceaudeceuxci).CestlUCquiacommerlecentraldecontrlerlaccslammoirepourleprogrammeetlesdonnes.Chaquenumrodecaseestappeluneadresse.Pouraccderlammoire,ilsuffitdeconnatresonadresse.LesinstructionsduprogrammepourlUCetlesdonnespourlUALsontplacesdansdeszonesdiffrentesdelammemmoirephysique.

    4. LesEntres/SortiesE/S(I/Oenanglais)permettentdecommuniqueraveclemondeextrieuretdoncvous:cepeuttreunclavierpourentrerlesdonnes,etuncranpourafficherlesrsultats.Ilpermetlordinateurdtreinteractif.

    - 1 - ENI Editions - All rigths reserved

  • VonNeumann,predesordinateursactuels

    Si vous ouvrez le capot de votre ordinateur, vous y verrez unegrandequantit de cartes, composants, cbles, etmmedesorganesmcaniques (lecteursdedisquesdurs,cdetdisquette).Unprogrammequevousallezcrireetdroulernesexcutepourtantquedansunseulendroit:lemicroprocesseur.Lemicroprocesseurdevotreordinateurestunepuce facilement reconnaissablecarcestsouvent laplusgrosse,cellequidisposeduplusdepattesetestgnralement surmonte dun gros bloc daluminium ou de cuivre accompagn dun ventilateur pour le refroidir. IlcontientlUAL,lUCetdiversautresorganes:desregistresspcialiss(donnes,compteurs,adresses,tats,etc),unsquenceur qui synchronise tous les composants, une horloge interne, une unit dentresortie qui gre lacommunication avec la mmoire ( ne pas confondre avec lE/S des priphriques clavier, cran, etc). Lemicroprocesseurdisposeselonsonmodledunjeu(ensemble)dinstructionsprdfini.

    Siltait toutseul, lemicroprocesseurnepourraitpas fairegrandchose.Auseinde larchitecturedeVonNeumannseulssont reprsents lescomposants logiquesdebase.Autourdeceschma logiqueseraccordentbiendautresorganeslectroniquescommelescontrleurs.Cespuceslectroniquesquonappelleaussiparfoischipsetssontaussides sortes de microprocesseurs qui disposent souvent dun jeu dinstructions pour les contrler, justement. Cesinstructionssontsouventmoinsnombreusesetpasgnralistes.Lescontrleursontunrleprcis,selonleurgenre:greruncertaintypedepriphrique(ex:uncontrleurdecartegraphique,uncontrleurpourlesdisquesdurs,etc),oudetransfertdedonnes(ex:lescontrleursdesbusdemmoireetdedonnes,lescontrleursUSB,PCI,etc).Touscescomposantssontintgrssuruncircuitimprimprincipalappellacartemre.

    ArchitecturedeVonNeumann

    Pourrsumer:larchitecturedeVonNeumannestsimplecomprendreetrpartitlesfonctionnalitsdunordinateuren quatre entits logiques. Ces entits logiques se retrouvent pour deux dentre elles (UC et UAL) dans lemicroprocesseur. Les autres et les composants additionnels se retrouvent sur la carte mre ou sur les cartesdextension(lammoirenestplussoudesurunecartemremaisfourniesousformedecarteadditionnelleappelebarrette,lecontrleurE/SgraphiqueestsurunecartegraphiqueadditionnellerelieunbusPCI,AGPouPCI/E).Lesprogrammes sont excuts par le microprocesseur qui est aid (dans le sens o celuici accde aux fonctionsproposes)pardiverscontrleurs.

    - 2 - ENI Editions - All rigths reserved

  • Note:lesmicroprocesseursactuelssonttrscomplexes.IlnestpasraredetrouverauseindeceuxciplusieursUALpouracclrer les traitements.Demmeontrouvesouventunemmoire intermdiaireappelemmoire

    cacheouantmmoire, cellecitant souvent spcialise :unemmoirecachepour les instructionsetuneautrepourlesdonnes.

    2.LamachinedeTuring

    Avantmme lapparitiondespremiersvraisordinateursprogrammables,AlanTuringavaitdfinien1936 (le28maiexactement)cequonappellelaMachinedeTuring.Cettemachineabstraite(quinexistepasrellement)estenfaitune mthode de modlisation du fonctionnement dun ordinateur ou plutt loriginedun calculateur mcanique.Commentfairepour,depuisunpostulatdebase,arriverunrsultatdonn?Enrespectantdesprocduresdonnes.Cestlundesprincipesdelalgorithmique.

    UnemachinedeTuringntantpasunevraiemachine(ausensmatriel),ilsuffitpoursenservirsoitdeseservirdesatte (rflexion et mmoire), soit dun crayon qui fera office de tte de lecture, dune longue bande de papierdcomposeen casesquonappelle ruban, etdune tabledesymbolesetdeprocdures lie ltat de la caserespecterquandontombesurunecasecontenantunsymboledonn.Onseplacesurlapremirecase,onvrifiesonsymboleetsontatassocis,onexcutelaprocdureassocie(changementdevaleur/symbole,avancer,reculer)eton continue drouler ceprogramme jusqu ce que la procdure vrifiant quon a obtenu le rsultat final soitvrifie.Onvientdedroulerunprogramme,etlensemblesymboles/procduredcritceprogramme.Cestlanctredelalgorithme.

    AlanTuring,crateurdelamachineabstraitedummenom

    IlexistedeslivrescompletssurlamachinedeTuring,notammentundeAlanTuringluimmeetdeJeanYvesGirard,auxditionsSeuil,CollectionPointsSciences.Linformatiquenestpasleseuldomainedapplicationdelamachine.Ellepermet de dterminer la complexit dun algorithme, si quelque chose peut vraiment tre calcul, a des domainesdapplications dans la physique et notamment loptique, etc.Vouspouvez simuler unemachinedeTuring sur votreordinateurviaplusieurslangagesdontunappelBrainf*ck.

    ExempledemachinedeTuring

    3.Reprsentationinternedesinstructionsetdesdonnes

    a.Lebinaire

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

    - 3 - ENI Editions - All rigths reserved

  • systme dcimal (soit une notation en base 10 en allant de zro neuf), un ordinateur nemanipule que deuxvaleurs : 0 ou 1. En effet si vous pouviez trs fortement agrandir un circuit intgr, vous verriez que celuici estcomposdenombreusespistesdanslesquellespasseuncourantlectrique.

    Danscescircuitsilnyaquedeuxpossibilits:soitlecourantpasseetdanscecascelaquivautunevaleurdeun(1),soit lecourantnepassepas,etdanscecascest lavaleurzro(0)quiestretenue.Cestdubinaire(quineprendquedeuxvaleurs).Uneunitbinairesappelleunbit(binarydigit).CemotatinventparClaudeShannonen1948.

    Commeilyaplusieurspistessurlescircuits,plusieursvaleurs0et1,doncplusieursbits,circulentenmmetemps.Enassociantcesvaleurs,onobtientdesvaleursplusgrandes.Enpassantdesdonnessurunfil,lavaleurmaximaleestde1.Sionprenddeuxfils,soitdeuxbits,lavaleurmaximaleenbinaireest11,soit3endcimal.Pourquoi?Voiciunedmonstrationpartapes:

    Uneanalogiefortancienne(en informatique,ancienpeutsignifierun lapsdetempstrscourt),desannes1980,expliquait le fonctionnement des nombres binaires en associant des fils transportant du courant des ampouleslectriques. Chaque ampoule reprsente une valeur. Si le courant passe, lampoule sallume et prend la valeurassocie.

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

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

    Lunitestreprsentepar100,ladizainepar101,lacentainepar102,etainsidesuite.Pourconvertirlebinaireenunevaleurdcimalepluslisible,ilfaututiliserlespuissancesde2,lapluspetitevaleurtantlaplusdroiteetestappele bit de poids faible, la plus grande la plus gauche et est appele bit de poids fort. Dans lexempleprcdent,lavaleurbinaire11peuttreconvertieainsi:

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

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

    11(2)=3(10)

    Voiciundernierexempleavecunevaleurbinairecodesur8bits.Quelleestlaplusgrandevaleurdcimalequipeuttrecodeavec8bits?

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

    Donc

    11111111(2)=255(10)

    Soit256valeurspossiblesde0(zro)255,cequipeuttreplussimplementcalculpar2n,soitdeuxpuissancen,ntantlenombredebitscontenusdanslavaleurbinaire.Laplusgrandevaleurconvertieendcimalestdonc:

    2n1

    Il est possible de convertir du dcimal en binaire avec des divisions successives : on divise les rsultats sans lavirgulesuccessivementpardeux.Lersultatbinaireseralajuxtapositiondesrestes(0ou1)saufpourledernier.Parexempleaveclenombre183:

    l 183/2=91,reste1

    l 91/2=45,reste1

    l 45/2=22,reste1

    l 22/2=11,reste0

    CourantFil1 CourantFil2 Binaire DcimalNepassepas Nepassepas 00 0

    Nepassepas Passe 01 1

    Passe Nepassepas 10 2

    Passe Passe 11 3

    - 4 - ENI Editions - All rigths reserved

  • l 11/2=5,reste1

    l 5/2=2,reste1

    l 2/2=1,reste0

    l Onremontedudernier:10110111

    Conversiondcimaleenbinaire

    Cestdoncenbinairequesontreprsentestouteslesvaleursquunordinateurmanipule.Cestvalabletantpourlesdonnes (numriques ou texte) que pour les instructions destination du microprocesseur. Un nombre binairecorrespondrauneinstruction.Parexemplesurunmicroprocesseurx86(IntelouAMD),01110100estlinstructionje(jump ifequal),ouencore la ligne1011000001100001quisignifiemov$0x61,%al (placer lavaleurhexadcimale0x61dansleregistreAL).

    Lesordinateursdudbutdesannes2000saventmanipulerdesnombressur64bitsor264estgal18446744073709551616soitplusde18milliardsdemilliards!

    Lide dutiliser deux valeurs pour encoder dautres valeurs remonte Francis Bacon. En 1623, il cherche unemthode stganographique pour pouvoir crypter un texte compos des lettres de lalphabet. Il remarque quunassemblage 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,lelatin,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 stocksindividuellement dans une case mmoire. Ils sont regroups, gnralement par multiples de huit (8). Ainsi unensemblede8bitsestappelunoctet.Lavantagedeloctetestquilsuffit(ouentoutcasalongtempssuffi)pourreprsentertousleschiffres,lettresetsymbolesdesalphabetsoccidentaux.Unoctetreprsentelesvaleursde0255.

    Aveclaugmentationdesespacesdestockages,delaquantitdemmoire,dubesoindereprsentationdenombresdeplusenplusgrands,dunaccsplusrapidelammoireouencoredeplusdinstructions,ilafalluaugmenterlatailledesvaleursmanipuler.De8,puis16,puis32,certainsmicroprocesseurspeuventmanipulerdesvaleursde64voire128bits,parfoisplus..Cesvaleursdeviennentdifficilesdcrireetreprsenter.Pourcesvaleurs,onparledemotmmoire(wordenanglais).Certainsmicroprocesseursfontunediffrenceentrediverstypesdemots.CeuxdeMotorola comme les 68000 (qui quipaient ls ordinateurs Atari ST, Amiga, les consoles Sega Megadrive et plusrcemmentlesPalmPilot)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 demicroprocesseur lordre desmots est diffrent entre la ralit et son stockage enmmoire.Avecunmicroprocesseurx86enmoderel(16bits)lenombredcimal38457ncessite16bitssoitdeuxoctetsouunmotdeseizeoctetspourtrereprsent:

    38457(10)=1001011000111001(2)

    Pourstockercettevaleurenmmoire, les8premiersbitsdepoidsfaible,soit loctetdepoidsfaible,serontplacsdans lapremirecasemmoire,et les8derniersbitsdepoidsfort,soit loctetdepoidsfort,serontplacsdanslacasesuivante.Ladmarcheseraitlammeen32bitsou64bits.

    Casemmoire1 Casemmoire2

    00111001 10010110

    - 5 - ENI Editions - All rigths reserved

  • 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,pourrduirelalongueuretlamanipulationdecesnombres?Cestainsiqueninformatiqueilestdusagedutiliserlabase16,appelehexadcimale.

    Une base hexadcimale permet de coder les valeurs de 0 15. Si de 0 9 on utilise les valeurs dcimalescorrespondantes,audessusilfaututiliserdeslettresdelalphabet,deA(10)F(15).

    Commentpasserdubinairelhexadcimal?Cecirevientrpondrelaquestion"Combienfautildebitsdansunnombrebinairepourcoder16valeurs?"24=16.Ilfautdonc4bits.Letableausuivantrsumelesconversions.

    Sivousreprenezlenombre183quincessite8bitssoitunoctet,saconversiondonneB7enhexadcimal.Onditdoncque:

    183(10)=B7(16)

    dudcimallhexadcimal

    Si vous prenez la valeur maximale en 64 bits, cela donne FFFFFFFFFFFFFFFF soit 16 caractres. Un informaticienexercestquasimentcapabledeconvertirlavoledelhexadcimalendcimal.Prenezlavaleur8Csoit10001100enbinaire.LeCvaut12.

    8*16+12=140

    Sansallerplus loin, sachezque lesbases2,10et16nesontpas lesseules.Surcertainesmachinesetcertainssystmesdexploitation,ilestcourantdutiliserunebase8pourdesvaleursnencessitantquetroisbitspourtrereprsente.Sommetoute,tantquilresteassezdesymboles,riennempcheraitdavoirunebase30!

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

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

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

    Dcimal 11 12 13 14 15

    Hexa B C D E F

    Binaire 1011 1100 1101 1110 1111

    - 6 - ENI Editions - All rigths reserved

  • Lalgorithmique

    1.Programmer,cestunart

    Pourobtenirunrsultatdonn,ilfautgnralementsuivreunemthode,unecertainelogique.Sauftreungrandptissierdontlasciencedesmlangesdesingrdientsestinne(oulefruitdunelonguepratique),vousnobtiendrezjamaisundlicieuxgteauauchocolatmmesivousdisposezdesmeilleursingrdientsetaccessoiresdecuisson,sivousneconnaissezpaslesbonnesproportions,lordredanslesquelsajouterlesingrdients,letempsdecuisson,latemprature:bref,larecette.Demme,sansformationdemcanicienousansladocumentationtechniquedumoteurdevotrevhicule,inutiledevouslancerdansunchangementdejointdeculasse:cestlacasseassure.

    Il enest demmede laprogrammation. Il existeplusieurs langagesdeprogrammation trs simples, extrmementsimples parfois, qui peuvent donner un temps lillusion que vous savez programmer. En entreprisemme, certainsemployssontbombardsdveloppeurspourleursquelquesconnaissancesconfusesdeVisualBasic,deDelphioudeWindev. Le rsultat risque dtre catastrophique. Les publicits sont allchantes mais trompeuses. Les bonsprogrammeurs,ycompris lesautodidactes,onttousunmomentouunautreeuaffaireaveclesalgorithmes,car ilexiste en programmation une multitude de moyens darriver un rsultat, mais trs peu pour obtenir le meilleurrsultat possible, ce qui explique pourquoi beaucoup de programmes ayant lamme fonction, se ressemblent (auniveaudelaprogrammation)alorsquecenesontpaslesmmesprogrammeursquilesontdvelopps.Lesdbutantsqui se lancentdansdesprojetsdeprogrammationaudacieuxse retrouventparfoisbloqus,nematrisantpasunetechnique particulire de logique de programmation. Certains abandonnent, dautres trouvent un moyen decontournement (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 inclusdirectementdans lamachine(enROM),soitsurunecartouche,cassetteoudisquetteannexe.LeBasicdeMicrosoft(Qbasic,Quickbasic)taitlivravecleDOSduPC.LesAmstradavaientlebasicLocomotive,lesAtariSTlAtariBasicetsurtout leGFABasic,un langagedegrandeclasse,etc.Unegnrationcompltedutilisateurs sest lancedans laprogrammationlaidedeceslangagesetdeladocumentationfourniequibiensouventfournissaitnonseulementlesrfrencesdulangagemaisaussilesmthodesdebasedeprogrammation.Avecplusoumoinsdesuccs.Lersultattaitsouventuninfmebidouillage,maisquimarchait.

    Orlebutnestpasqueleprogrammefonctionne,maisquilfonctionneviteetbien,breflemieuxpossible.Lemeilleurordinateuraumondeetlemeilleurlangageaumondenevousyaiderontpas.

    2.Dfinition:Lalgorithmeestunerecette

    Avezvousdjeu loccasiondeprogrammerunmagntoscope(envoiededisparition)ouunenregistreurdedvd?Quavezvousfaitlapremirefoisquevousavezallumvotrepostedetlvisionpourrglerlarceptiondeschanes?Nuldoutequevousavezouvertlemodedemploietsuivilasquencedinstructionsindique:appuyersurlatoucheMenudelatlcommande,sedplacersurEnregistrementetappuyersurOK,sedplacersurunelignepuisindiquerlachane,lheure,etc.

    Avezvous dj eu loccasionde faire la cuisine ? Pourungteau, vous tesvous lanc directement ou avezvousouvert un livre pour rcuprer la liste et la quantit de chaque ingrdient, pour suivre la recette : faites fondre lechocolatetlebeurredansunecasserolefeudoux,retirezlacasseroledufeu,incorporezlesjaunesdoeuf,puislesucreetlafarine,battezlesoeufsenneigepuisincorporezdoucementdanslemlange,etc.

    Danslesdeuxcas,flicitations!Vousavezdroulvotrepremieralgorithme!

    Une dfinition simple dun algorithme : cest une suite dinstructions qui, quand elles sont excutes correctementaboutissentaursultatattendu.Cestunnoncdansunlangageclair,biendfinietordonnquipermetdersoudreunproblme,leplussouventparcalcul.CettedfinitionestrapprocherdufonctionnementdelamachinedeTuringquiavantlapparitiondelordinateurutilisaitcettedmarchepourrsoudredenombreuxproblmes.Lalgorithmeestdoncunerecettepourquunordinateurpuissedonnerunrsultatdonn.

    LemotalgorithmevientdunomdumathmaticienAlKhuwarizmi(MuhammadibnMsalKhuwrizm),savantpersanduIXmesicle,auteurdunouvrageappel"Latranspositionetlarduction",Aljabrwalmuqbalah.LemotAljabrdeviendraalgbre,lenomdelauteurseralatinisenAlgoritmi,quiseralabasedumotalgorithme.

    3.Pourquoiutiliserunalgorithme?

    Lalgorithmedcritformellementcequedoitfairelordinateurpourarriverunbutbienprcis.Cesontlesinstructionsquon doit lui donner. Ces instructions sont souvent dcrites dans un langage clair et comprhensible par ltrehumain:fairececi,fairecelasilersultatatellevaleur,etainsidesuite.

    Unalgorithmebientablietquifonctionne(toutaumoinsenthorie)pourratredirectementrcritdansunlangage

    - 1 - ENI Editions - All rigths reserved

  • deprogrammationvolucommeleC,JavaouPHP.Malheureusement,enprogrammationcestsouventlhommedesemettreauniveaudelamachine.

    Delarflexionlaprogrammation

    Plus que cela, un algorithme dcrit une mthode de rsolution de problmes courants. Un algorithme est doncrutilisable,saufcasponctueloutrsprcis.Ilexisteplusieursmoyensdobtenirunmmersultat,maiscertainssontmeilleursquedautres.Cest lecasparexempledesmthodesdetrisdedonnesparordrealphabtique.Ilexistediversalgorithmesdcrivantcesmthodes,certainestantadaptesdesquantitsplusoumoins importantesdedonnes.

    Lamatrisedelalgorithmiqueetlapprentissagedesalgorithmesdebasesontunedesconditionsdelarussitedunprojetenprogrammation,quil soit personnel ou professionnel. Lexprience aidant, vous allez acqurir au fur et mesuredesmcanismesdepensequivouspermettrontdoptimiserlestraitementsquevousdevezprogrammer,tantenvitessequenoccupationmmoireoummeenquantitdelignesdeprogrammation.Surcedernierpoint,ilexistedenombreuxcasodesalgorithmeslongsetcomplexessontplusperformantsquedautressemblantpluspratiquesaupremierabord.

    Apprendre lalgorithmique (ou lalgorithmie, les deux sont autoriss) cest donc apprendre programmer dans lesrglesdelart.Toutaulongdecetouvrage,vousallezdcouvrirlesnotionslmentairesquivouspermettronttantdecomprendre le fonctionnement interne dun programme que de le concevoir, laide dune progression simple etconstanteetdexemplespratiquesetcomprhensibles.

    4.Leformalisme

    Lebutdunalgorithmetantdedcrireuntraitementinformatiquedansquelquechosedecomprhensibleparlhumain(etfacilementtransposableverslamachine),pourquunalgorithmesoitcomprhensible,ilfautquilsoitclairetlisible.Danscecasilexistedeuxmoyensefficaces:

    l soitdcrirelalgorithmesousformedetextesimpleetvident(fairececi,fairecela),

    l soitdefaireunschmaexplicatifavecdessymboles.

    Dans la pratique, les deux formes sont possibles.Mais undessin ne vautil pasun longdiscours ? Il est dailleurscourantdecommencerparunschma,puisquandceluicidevienttropcomplexe,depasseruntexteexplicatif(larecette).

    Danslesdeuxcas,lasyntaxepourletexteoulessymbolespourlesschmasdoiventrpondredesrglesstrictes,voirenormalises.Ilfautquechacunconnaisseleursignificationetsachedonclesinterprter.Cestpouraquetouteslesreprsentationsalgorithmiquessuiventpeudechosesprslemmeformalisme.Silesschmassontpossibles,ilssontcependantmoinsutilissquelesalgorithmessousformetextuelle.Cestquesivousconstruisezunalgorithme,ilest plus facile de le corriger quand il est saisi au clavier sous formede texte que lorsquil est dessin sous formedorganigrammedansunlogicieldedessinvectorieloudeprsentation.

    a.Lareprsentationgraphique

    Lesalgorithmespeuventtreconstruitslaidedesymbolesdorganigrammes.Lestudiantseninformatique(BTS,DUT) connaissent bien cette tablette en plastique permettant de dessiner des organigrammes. Ils lutilisent enalgorithmique,enbasededonnes,enmthodeMerise,etc(danschaquecaslasignificationestdiffrente).Voiciunexempledalgorithme sous forme dorganigramme qui simule un lanc de d et qui demande une personne dedevinerlavaleur.

    - 2 - ENI Editions - All rigths reserved

  • Unformalismequioccupetropdeplace

    Danscetexemplesimplifi,lestraitementssontdansdesrectangles,lesprisesdedcisiondansdeslosanges,etlesflchesreprsentent lordredudroulementduprogramme.Siunevaleurestprsentectdelaflche,lactiondpenddursultatdelaquestionposedanslelosange.Lesdcisionsetlesflchespeuventdcriredesboucles.Dansleschma,tantquelutilisateurnapassaisilabonnevaleur,laquestionluiestdenouveaupose.

    Cetalgorithmeesttrssimple,lorganigrammeaussi.Cependantvoyezdjlatailledeceluici(laplacequilprend)parrapportcequilfait.Imaginezmaintenantunalgorithmepluscomplexequidoitparexempledcriretouslescasdefiguredanslagestiondunecommunicationentredeuxmachines(descriptiondunprotocoledecommunication):leschmancessiteraunefeuilledunegrandedimensionetseradifficiletudier.

    b.Lalgorithmesousformedetexte

    Prenezlemmenoncdulancded.Celuicipourraittrecritainsienfranaiscorrect:

    l 1retape:lancerled

    l 2metape:saisirunevaleur

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

    l 4metape:afficher"bravo".

    Vuainsi,cesttrssimple.Decettemanire,ilestvidentquetoutlemonde,mmeunnoninformaticien,comprend

    - 3 - ENI Editions - All rigths reserved

  • ce que lalgorithme est cens faire. Cependant, si les algorithmes complexes devaient tre crits ainsi, ce seraitencoreunefoisbientroplongetvousfiniriezsoitparvouslasserdunecrituretropcomplexe,soitcelaprendraittropdeplace.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

    Sivouscomprenezdj leprogrammecidessusalorscetouvragevousseraencoreplusagrable lire.Sinon, lasuitevousdonneradetoute faontoutes lesexplicationsncessaires lacomprhensiondechaque lignedecetalgorithme.Ilreprenddemaniretrsdtailletouteslestapessuivre.Souscetteforme,ilestpresquepossibledimplmenterlalgorithmelignelignedansunlangagedeprogrammationvolu.

    Cest sous cette forme textuelle que les algorithmes seront reprsents dans ce livre. Ce texte, programme oupseudocodealgorithmique,estdcomposenplusieursparties:

    l Lenomduprogramme,quinamnepasdecommentairesparticuliers,situaprslemot"PROGRAMME".

    l Unezonededclarationdesdonnesutilisesparleprogrammes:variables,constantes,types,structures,tableaux,etc.Silasignificationdecesmotsvouschappe,ceuxciserontexpliqusaufuretmesuredesdiffrentschapitres.Cettezonecommenceparlemot"VAR".

    l Leprogrammeluimme, cestdirelesdiverstraitements.Lesinstructionsduprogrammesontencadresparlesmots"DEBUT"et"FIN".Ilvousestconseill,pourplusdeclartetdelisibilit,dindenterlesdiverseslignes(delesdcalerlesunesparrapportauxautres)laidedestouchesdetabulation.Leprogrammepeuttredenimportequellelongueur:uneligneou10000lignes,cecinapasdimportance.

    l Lescommentaires:cestuntextelibrequipeuttretendusurplusieurslignesetencadrparlessquencesde caractres "/*" et "*/". Si votre commentaire tient sur une seule ligne, vous pouvez uniquement lacommencerparlescaractres"//".

    l Unedernirepartie,oupluttpremirecarlorsquelleestprsenteellesesitueavanttouteslesautres,peuttre constitue des sousprogrammes, semblants de programmes complets appels par le programmeprincipal.Cessousprogrammes,appelsprocduresoufonctions,fontlobjetdunchapitrecomplet.

    5.Lacomplexit

    Lexemple du lanc de d est un algorithme trs simple, court, concis et rapide. Ce nest pas le cas de tous lesalgorithmes.Certainssontcomplexesetletraitementrsultantpeutncessiterbeaucoupdetempsetderessourcesdelamachine.Cestcequonappellele"cot"delalgorithme,etilestcalculable.Siunalgorithmeest"gourmand"soncotserapluslev.Ilexistecertainscasoilestpossibledutiliserplusieursalgorithmespoureffectuerunemmetche,commepourtrierleslmentsduntableaudevaleurs.Certainsalgorithmesservlenttrepluscoteuxquedautres,passuncertainnombredlmentstrier.Lecotdunalgorithmerefltesacomplexitouentermeplussimplesonefficacit.Lesmots"cot","complexit"et"efficacit"refltenticilammedfinition.Plusunalgorithmeestcomplexe, plus il est coteux etmoins il est efficace. Le calcul de cette complexit a comme rsultat une quationmathmatiquequonrduitgnralementensuiteunenotiondordregnral.

    LacomplexitestnotO(f(n))oleO(grandO)veutdire"dordre"etfestlafonctionmathmatiquedenquiestlaquantitdinformationsmanipuledanslalgorithme.Voiciunexemplepourmieuxcomprendre:soitunalgorithmequicompte de 1 n et qui affiche les valeurs correspondantes. Dans la pratique, vous allez utiliser une boucle (voirchapitrecorrespondant)allantde1n.Ilfaudrafairenpassagespourtoutafficheretdoncvousallermanipulernfoislinformation.Lafonctionmathmatiquedonnantlecotseraalorsf(n)=n.LacomplexitestalorslinaireetvouslanoterezO(n).

    - 4 - ENI Editions - All rigths reserved

  • Sidanslemmealgorithmevousdcidezdefaireunesecondeboucledanslapremire,pourafficherparexempleunetabledemultiplications:lapremirebouclevatoujoursde1n,lasecondevaausside1n.Autotalvousobteneznfois n boucles, donc n2 boucles. La complexit est donc f(n)=n2, et vous la noterezO(n2). Le cot de lalgorithmeaugmenteaucarrdunombredinformations.

    Sivousrajoutezenplusunequelconqueoprationdanslapremireboucle,cetteoprationaaussiuncotquevouspouvez tenter de prendre en compte. Si vous ajoutez une multiplication et que celleci a un cot de 1, alors lacomplexitfinaleestden*(n+1)soitn2+n.Cependantsivousfaitesunecourbepourdegrandesvaleursdenetquevous comparezavec la courbe simplen2,vous remarquerezque le rajoutdevientngligeable.Au final, lalgorithmeconserveunecomplexitO(n2).

    Silacomplexitpeutparfoistrecalculeassezfinement,ilenexisteplusieurs"prdfinies":

    l O(1):complexitconstante

    l O(log(n)):complexitlogarithmique

    l O(n):complexitlinaire

    l O(n.log(n)):complexitquasilinaire

    l O(n2):complexitquadratique

    l O(n3):complexitcubique

    l O(np):complexitpolynomiale

    l O(nlog(n)):complexitquasipolynomiale

    l O(2n):complexitexponentielle

    l O(n!):complexitfactorielle

    Cescomplexitsnesontpasforcmentfacilesapprhender,aussivoiciungraphiquereprsentantquelquesunesdecellesci.Enabscisseest indiqu lenombrededonnestraiteretenordonne lacomplexitassocie: lenombredoprations effectues pour n donnes. Pour des complexits dordre O(2n) lalgorithme effectue dj 1024oprations,etplusde3,5millionspourO(n!)!

    - 5 - ENI Editions - All rigths reserved

  • Courbesdecomplexit

    Commentsereprsenterrellementunecomplexitentermedetempspassparlordinateurtraiterlesdonnes?Chaque microprocesseur est capable de traiter un certain nombre doprations par seconde. Le plus long tantgnralement les calculs sur les rels (flottants), le critre souvent retenupourdterminer lapuissancebrutedunprocesseurestleFLOPS:FloatingPointOperationsPerSecond.UnIntelPentium43.2GHztourneunemoyennede3,1GFLOPS(GigaFlops)soit109FLOPS,ouencoreunmilliarddoprationssurrelsparseconde.Sivoustraitez20donnesdansunalgorithmedecomplexitO(n),lavitessedecalculsechiffreenmillionimesdeseconde.LemmenombrededonnesdansunalgorithmedecomplexitO(n!)doiteffectuer2432902008176640000oprationscequiprendra784807099secondes,ouencoreunefoisconvertiautourde25ans!Bienentendu,unecomplexitO(n!)estlapirequipuisseexister.Avecunecomplexit infrieureO(2n), letraitementprendraitundiximedesecondetoutdemme,cequiestnormeetrelativisefortementlapuissancedesprocesseurs

    Vouscomprenezmaintenantlutilitdeconnatrelacomplexitdesalgorithmesetdoptimiserceuxci

    Danslasuite,lescomplexitsneserontfourniesquedanslescasolestraitements,pluscompliqusquedhabitude,sontenconcurrenceavecdiversesmthodes.Cestlecasparexempledesmthodesdetrissurdestableaux.Cecidansluniquebutdevousdonnerunsimpleordredide.

    - 6 - ENI Editions - All rigths reserved

  • Leslangagesdimplmentation

    1.Quellangage?

    Ilexisteplusieurscentainesdelangagesdeprogrammationsiontientcomptedetouteslesvariantespossiblesdunmmelangage.Commevousavezpulelireaudbutdecechapitre,lordinateurnecomprendnativementquunseullangage, le langage machine. Croyezvous vraiment que vous allez implmenter le programme de lancer de ddirectement en binaire (ou mme en hexadcimal) ? Le choix du langage mrite une petite dmonstration. On acoutumedanslemilieudelinformatique,detesterunlangageenluifaisantafficherunmessagepourdirebonjour,enloccurrencelefameuxHelloworld!.Voicicommentaffichercetextedansdiverslangages:

    Cseg segment assume cs:cseg, ds:cseg org 100h main proc jmp debut mess db Hello world!$ debut: mov dx, offset mess mov ah, 9 int 21h ret main endp cseg ends end main

    echo "Hello world!"

    10 PRINT "Hello world!" 20 END

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

    #include

    int main(int argc, char **argv) { printf("Hello world!\n"); return 0; }

    #include

    Enassembleurx86sousDOS

    EnshellUnix

    EnBasicoriginel

    EnCOBOL

    EnlangageC

    EnlangageC++

    - 1 - ENI Editions - All rigths reserved

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

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

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

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

    2.Classificationsdeslangages

    Queremarquezvous?Ilyaautantdesyntaxesdiffrentesquilexistedelangages.CependantvousconstatezqueleslangagesC,C++,JavaouPHPontdenombreusesressemblances,alorsquelassembleurouleCOBOLsemblentsortisdouvragesdeScienceFiction.Cestque lespremiersontquelques liens familiaux tandisque lesautres sontradicalementopposs.

    a.Hautniveau,basniveau

    Puisquilexistedescentainesdelangagesdeprogrammation,lequelchoisirpourimplmentervosalgorithmes?Ilnyapasderponsesimplecettequestion.Chaquelangageatgnralementconupourdesusagesdiffrentsetsouventspcifiques,bienquenvoluantlaplupartdeslangagesditsdehautniveausoientdevenusdeplusenplusgnralistes. Il existeplusieurs classificationsdes langages. Laplusanciennedpendde laffinitdu langageparrapportlamachine.Onparlealorsduniveaudulangage.Ilestcourantdeparlerdunlangagedebasniveauoudeniveauzro (0)quandceluicincessitedesconnaissancesapprofondiesdu fonctionnementdevotreordinateur :mcanismes de gestion de lammoire, instructions dumicroprocesseur, etc. Un exemple de langage de trs basniveau est le langagemachine sous sa forme binaire, ou de le la programmation en assembleur o cesmmesvaleurs binaires sont reprsentes par des mots (mnmoniques) en anglais. Vu que les programmes sontdirectement comprhensibles par le matriel, vos programmes seraient alors les plus rapides. Il est tout faitpossible de programmer de grosses applications en assembleur (et notamment des jeux), ctait dailleurs trscourantjusqulapparitiondesmachinestrsrapidesoleurvitesseacompensuneplusfaiblevitessedexcutiondunlangageplusvolucommeleC,maisaveclavantageduneprogrammationplussimple.

    lopposdeslangagesdebasniveausetrouventleslangagesdehautniveau.Ilnyapasdchelleprcise.Vouspourrez trouver dans quelques sources des niveaux allant de 0 4, mais les langages voluant tellement vite,certainslangagesquitaientconsidrsdehautniveaucommeleCsesontvusdclasssverslebas!Unlangagedehautniveaupermetdefaireuneabstractionpresquecompltedufonctionnementinternedevotreordinateur.Lelangage(oupluttsoncompilateurousoninterprteur)sechargeradeconvertirvosordressimples(enapparence)en langage de bas niveau (en langage machine). Ne vous fiez pas aux apparences : laffichage dune bote de

    EnPHP

    EnJava

    EnVisualBasic

    EnPascal

    - 2 - ENI Editions - All rigths reserved

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

    b.Diversesclassifications

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

    l gnralisteouspcialis

    l objetouprocdural

    l typounontyp(cfchapitresurlesvariables)

    l interprtoucompil

    l etc

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

    c.Compilouinterprt

    Uneautredistinctionprendreencompteestladiffrenceentreunlangageinterprtetunlangagecompil.Unlangageestditcompilquandleprogrammesourcesousformedetexteesttoutdabordluettraitparunautreprogramme appel compilateur qui le convertit en langage machine directement comprhensible par lordinateur.Voustapezvotreprogramme,vouslancezlacommandedecompilationetenfinvousobtenezunfichierexcutable(un.exesousWindowsparexemple)quevouspouvezlecaschantlancercommenimportequelautreprogrammeenlangagemachine.Unprogrammeenlangageinterprtncessitepourfonctionneruninterprte(ouinterprteur)quiestunautreprogrammequivatraduiredirectement,aufuretmesuredesonexcution,votreprogrammeenlangagemachine,unpeucommeunvraiinterprtequidansuninterviewtraduitsimultanmentlanglaisenfranais.Le programme est souvent un fichier texte, et linterprte analyse la syntaxe de celuici avant de le droulerdynamiquement.Unprogrammeinterprtserapluslentquunlangagecompilcausedelaconversiondynamiqueduprogramme,alorsquecettetapeestdjeffectulavanceavecunlangagecompil.Aucontraire,lacorrectiondeserreursestplussimpleavecunlangageinterprt.Linterprtevavitevousindiqueraucoursdelexcutionosetrouvelerreurdesyntaxe(maispasde logique) lorsquilva larencontrer,quelle ligne, linstructionencause,ventuellementuneaidesupplmentaire.Alorsquavecuncompilateur,cestaumomentdelacompilation,souventlongue,quapparaissent les erreurs. Une fois compil, dautres erreurs plus complexes comme les fuitesmmoirepeuventapparatremais ildevientdifficiledendterminer lorigine(il fautalorsfaireappeldautresprogrammesspciauxappelsdbuggers).

    - 3 - ENI Editions - All rigths reserved

  • tapesdecompilationetdditiondesliensenC

    3.Lamachinevirtuelle

    Ilexisteunetapeintermdiaireentrelinterprtetlecompil:lamachinevirtuelleapplicative.Lamachinevirtuelleestunprogramme,gnralementuninterprteur,quipermetdisolerlapplicationquildoitfairetournerdumatrieletmmedusystmedexploitation.Leprogrammenathoriquementaucunaccsauxspcificitsdumatriel,lensembledesesbesoinsluitantfourniparlamachinevituelle.Ainsi,toutprogrammeconupourcettemachinevirtuellepourrafonctionnersurnimportequelordinateur,dumomentqueladitemachinevirtuelleexistepourcetordinateur.Cestenquelquesorteunecouchedabstractionultime.Gnralement,leprogrammefonctionnantdepuislamachinevirtuelleadjsubiunepremirephasedecompilationpourletransformernonpasenlangagemachineproprelordinateur,mais dans un langage "machine virtuelle" pour ainsi dire, que lon nomme bytecode. Ce bytecode pourra treinterprtparlamachinevirtuelle,ouplutt,etcecideplusenplusrgulirement,compillavolejusteaumomentdesonutilisation(technologieJIT,JustinTime).

    Ainsi dans certaines circonstances le programme fonctionne presque aussi vite quun programme compil pour unemachinecible!UnexempledelangageutilisantunemachinevirtuelleestJava.

    - 4 - ENI Editions - All rigths reserved

  • GnrationetexcutiondebytecodeJava

    Pour implmenter vos algorithmes, il vous faut trouver un langage simple, de haut niveau, gnraliste mais vouspermettantparlasuitedvoluerversdesapplicationspluscomplexesetcompltes.Dansunespritdouvertureetdecompatibilit,ilseraitintressantquecelangagenesoitpasdisponibleuniquementsousWindows,etquesipossiblele programme rsultant puisse fonctionner sur plusieurs systmes dexploitation sans avoir le modifier, ni lerecompiler.Parmileslangagesquipourraientconvenir, ilyaC#(prononcerCSharp)etJava.Lepremier, issudelatechnologie .NET de Microsoft, tait lorigine destin uniquement aux plateformes Windows (.NET tait dcritmultiplateforme,cequiselonMicrosoftsignifiaitcompatibleavec laplupartdesversionsdeWindows,pas lesautressystmes comme MacOS ou Unix). Une implmentation libre et fonctionnant sur un grand nombre darchitecturesmatriellesetdesystmesdexploitationestdisponiblesouslaformedeMonoquiproposelaplupartdeslmentsde.NET.Maiscertainsdeceuxcisontprotgspardesbrevets(lesbrevetslogicielsnesontpasvalidesenEurope)etnysontpastousintgrs.AussiilexistelesprogrammesenC#quipourraientnepasfonctionneravecMono.Ilfautdonctemporairementmettrecelangagelcart.

    4.Java

    a.Lesavantages

    Java, cependant, dispose de toutes les qualits ncessaires. Bas sur unemachine virtuelle (tout commeMono,dailleurs), il suffit que celleci soit intgralement disponible pour la plupart des environnementsmatriels et dessystmesdexploitationpourquetoutprogrammeJavafonctionnesansaucunemodification.Cestlecas.Dvelopporiginellement par Sun Microsystems, le langage Java, samachine virtuelle et tout son environnement (ce quonrsumepar la"TechnologieJava")sontdisponiblespourWindowsmaisaussipourMacOS,Linuxet laplupartdesautresUnix(Solaris,AIX,HPUX,Tru64,etc).ToutprogrammeenJavafonctionnerasurtouscessystmes!Mieux,sivoustesamateurdelibertetdelogicielslibres,sachezquelaversion7(prvueen2008)seralapremireversiondisponiblesouslicenceGPL.

    Il existe plusieurs versions de Java. Celle qui vous intresse en priorit dans le cadre de ce livre est la versionstandard,ouSE (StandardEdition).Vouspouvez tlcharger Javadepuis le sitedeSunMicrosystems ladressehttp://java.sun.com/javase/downloads/index.jsp.Quandcelaserapossible,chaquealgorithmeprsentparlasuiteseraimplment(programm)enJava.Pourquoicelangageestilintressantpourlesdbutants?

    - 5 - ENI Editions - All rigths reserved

  • l Ilestgratuit.

    l Ilestdisponiblepourbeaucoupdemachinesetdematriels.

    l ToutprogrammeJavafonctionnerasurtouteslesmachinesvirtuelles,sansmodification.Ilestindpendantdelaplateforme.

    l IlexistedenombreuxditeursetIDE(IntegratedDevelopmentEnvironment)supportantoutantspcialisspourJava.

    l Ilestutilispardesmillionsdepersonnes.

    l Il est rput sr, ne pouvant thoriquement pas accder au systme dexploitation ou lamachine ellemmesansautorisationexplicite.

    l Il disposedune immense collection de bibliothques, rpondant presque tous les besoins. Il estmmepossibledeprogrammerdesjeuxen3Ddetypecommercial.

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

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

    l IlestdrivdulangageC++,sanssescomplications.UnprogrammeurCetC++peutfacilementcomprendreJava,demmequunprogrammeurJavapourraapprendreplusfacilementleC++.

    l Ilestobjet,notionquiserasommairementtudieenfindouvrage.

    l Il peut fonctionner tant enmode texte (depuis une consoleMSDOS ou un shell MacOS/Unix) quenmodegraphique.

    l Ilestrapide,grceauprincipeduJIToudecompilationlavole.

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

    Comme les algorithmes de ce livre seront aussi rimplments en Java vous devez disposer du minimum vouspermettant de taper le code (texte), cestdire dun diteur. Lditeur de texte de base de votre systmedexploitation suffira, commenotepad sousWindows, gedit/kedit sous Linux, etc. Il existe cependant un trs bonditeurdveloppenJava,destinauxprogrammeurs.Vousletrouverezladressehttp://www.jedit.org/.

    videmment, ilvousfautaussi lencessairepourcompiler(enbytecode)etexcutervosprogrammes(lamachinevirtuelle).SurlesitedeSun,vouspouveztlchargerdeuxversions:leJDKetleJRE.LeJDK,JavaDevelopmentKit,estceluiquevousdeveztlcharger,contenanttoutlencessairepourconcevoiretexcutervosprogrammes.Parcontre, une fois votre programme compil, vous pouvez nutiliser que le JRE, Java Runtime Environment, ce quipourraitsetraduireparenvironnementdexcutionJava.Ilnesertriendinstallerlesdeuxenmmetempssurlammemachine,puisqueleJDKinclutleJRE.

    b.UnpremierprogrammeJava

    LepremierprogrammeJavaquevousalleztaper,compileretlancerestlefameux"HelloWorld"dontlalgorithmenemrite videmment pas dtre expliqu, vu que le programme se contente dun simple affichage. Le code Javarsultantestlesuivant.

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

    - 6 - ENI Editions - All rigths reserved

  • TapezceprogrammeetplacezledansunfichierappelHelloWorld.java.Cestimportant:lenomdufichierdoittreidentiqueaunomindiqusurlapremireligneduprogramme,justeaprslemotclass,auquelvousdevezajouterlextension".java".

    Pourcompilerleprogramme,oupluttletransformerenbytecode,ouvrezunefentreMSDOSsousWindows,ouuneconsole (ou terminal) shell sousUnix/MacOS, et tapez linstruction suivante l o votre programmeest sauv. Leprogramme javac (JavaCompiler)vatransformervotreprogrammesourceenbytecodeJava.Lesigne">" indiquelinvitedecommandeoupromptdeMSDOSoudushell,neletapezpas.

    >javac HelloWorld.java

    LeprogrammejavacadcrerdanslerpertoireunfichierappelHelloWorld.class.Sicenestpaslecas,vousavezprobablementfaituneerreurdesyntaxe,auquelcasjavacaaffichunmessagederreur.Vousdevezenfinexcutervotre programme avec la commande java. Saisissez en argument le nom du programme HelloWorld sanslextension".class".

    >java HelloWorld Hello world!

    Bravo,vousvenezdefairefonctionnervotrepremierprogrammeJava.

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

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

    Vouspouvezfaireabstractionpourlemomentdeslignesenitaliquepourvousconcentrersurcequilyaentreelles,cidessusengrasetquireprsentelecoeurduprogramme.Cependantilpeuttreutiledecomprendrecequeceslignessignifient.Ellesapportentlesnotionsdeclasseetdemthode,rcurrentesdansleslangagesobjet.

    l Laclasseestllmentfondamentalcontenanttouslesautreslmentsdeprogrammation.Cestellequivacontenirlesdonnesmanipulesparleprogrammeetlesinstructionspourlesmanipuler.Onappelleaussiles donnes variables ou attributs. Dans ce livre, vous rencontrerez principalement le premier,variable, qui seraexpliquplusbas.Onappelle lesblocsdinstructionsquimanipulent lesdonnesdesfonctionsoumthodes.Lencore,cestpluttfonctionquiseraprfrdanscelivre.

    l La mthode dcrit les traitements informatiques de la classe. Elle sappelle aussi fonction ou fonctionmembre.La fonctionestcomposedunnomquidcritgnralementcequelle fait, dune listedevaleursquonpeutluipasserquonappelledesargumentsouparamtres(lensemblesappellelentte)etdunblocdinstructionsquicontientleprogrammeouunboutdeprogramme.

    IlpeutyavoirplusieursclassesdansunprogrammeJava,quon regroupegnralementenunits fonctionnelles,oprationnelles, cohrentes et souvent indpendantes. Chaque classe peut bien entendu contenir plusieursvariablesetfonctions.

    l DansunprogrammeJava,lepointdentredelexcutionduprogramme,autrementditcequiseraexcutenpremier,estlafonction"main"(principale)delaclassequiportelemmenomqueleprogramme.Danslexemple Hello World, cest la fonction main de la classe HelloWorld du programme HelloWorld qui seraexcuteenpremier.

    Sitoutcecivoussemblecompliqu,etcestvidemmentcomprhensibleetnormal,sachezquecelivrenapaspourbutdevousapprendreJavamaisjustedesenservircommeexempledapplicationdesalgorithmes.Lesnotionsdevariablesetdefonctionsserontrevuesendtail.Cequiest important,cesont lestraitementscontenusentre leslignesenitalique,cestdireengras,selonlexemplecidessus.

    - 7 - ENI Editions - All rigths reserved

  • Lavariable

    1.Principe

    Voussavezgrceauchapitreprcdentcommentlordinateursereprsenteleschiffresetlesnombres:sousformedebinaire. De mme la mmoire de lordinateur, compose de cases, peut contenir des informations, notamment cesfameuxnombres.Enprogrammation,ilfautquelquechosedesimple,pratiqueetsouplemanipulerpourreprsentercesnombres.

    Chaquecasedelammoireestnumrote.Silammoirefait,disons,256octets,etquechaquecasepeutcontenirunoctet,alorsilya256casesnumrotesde0255.Onpeutdoncobtenirlavaleurdunecasedepuissonnumro,endisantquelacase74contientlavaleur212.Loasecomplique,cestquelammoiredevosordinateursatteintunnombretrs importantdecases.Avec1Godemmoire,vousavez1073741824casespouvantcontenirchacuneunoctet.Commentvoulezvousvoussouvenirdechaquenumrodecase?Cestbienentenduimpossible.

    Siparcontrevousdonnezunnomouunetiquettechaquevaleurcontenuedanslacase,ouunesuitedevaleursdeplusieurscases,pourvousenrappelerplusfacilement,celadevientbienplusvident.Cestcequonappelleunevariable. En informatique, une variable est lassociation dune tiquette une valeur. Vous nommez la valeur. Lavariablereprsentelavaleuretsesubstitutelle.Lavariableestdonclavaleur.Maiscommesonnomlindique,cettevaleurpeutchangerdansletemps,soitquelavariablenereprsenteplusla(oules)mme(s)case(s)mmoire,soitquelavaleurdelacaseachang.

    Unevariableestunnomoutiquettedonnunevaleur(nombre,texte,etc).Cettevaleurpeutvarieraucoursdutemps:onaffecteunenouvellevaleuraunom,dolenomdevariable.

    Quelnomdonnerunevaleur?Lenomquevousvoulezetqui,sipossibleestenrapportaveccequereprsentelavaleur.Cepeuttreunelettre,uneassociationdelettresetdechiffres,oudautressymboles.Leformalismedesnomsdesvariablesdpenddulangageutilis.Desfois,uncaractrespcifiqueindiqueletype(quevousrencontrerezplusbas)delavariable:cequellepeutcontenir.

    Certains langages acceptent des noms en lettresminuscules,majuscules, avec des chiffres dedans, des caractresspciaux comme le soulign, etc. Quelques langages, dont Java, font la diffrence entre les minuscules et lesmajuscules.Sivouspouvezgnralementutiliserunnomdegrandetaille,vitezpourdesraisonspurementpratiqueslesnomsrallonge.Voiciquelquesexemplesdenomsdevariables:

    l a

    l var

    l titre

    l Total

    l Somme_globale

    Quandvousprogrammerez,vousveillerezvousrenseignersurlesconventionsutilisesparlelangagepournommervosvariables:certainsutilisentdessyntaxestrsparticulires,dautressontbeaucoupmoinsstricts.

    Lavariablenestquunoutilpourlesalgorithmesetleprogrammeur,afinquilpuissesereprsenter"danslerel"lesdonnesquilmanipule.Sivousmodifiez lenom"Somme_globale"par"Pomme_frite"partoutdans lalgorithmeou leprogramme,lavariablereprsenteratoujourslammedonne,leprogrammefonctionneralidentique,maisceseraplus difficile pour vous de faire le rapprochement. De mme la case mmoire ne porte pas rellement un nom outiquette. Chaque case est plutt rfrence par une adresse, ellemmeexprimepar une valeur binaire.Cest lecompilateuroulinterprteurquiferalaconversiondesnomsverslesadressesdescasesmmoirevotreplace.

    Sivoussouhaitezvous"amuser"manipulerdirectementdesadressesmmoirenonpasparleurnommaisparleuradresse,quelqueslangageslepermettent.Directement,vouspouvezapprendrelassembleur(maisvousdevreztretrscourageuxetpatient),sinondeslangagescommeleCouleC++permettentlamanipulationviades"pointeurs":ce sont des tiquettes qui sont accoles ladresse de la case mmoire, contrairement aux noms des variablesclassiques qui sont associes la valeur que la case contient. Comme en rgle gnrale le nom dune variablereprsentetantladressequelavaleur(lavaleuratelleadressemmoire),cestsourcedebeaucoupdamusement(!)pourleprogrammeur...

    - 1 - ENI Editions - All rigths reserved

  • Lavariable:unetiquetteassocieunevaleurenmmoire

    2.Dclaration

    Pourexister,unevariabledoittredclare,cestdirequevousdevezindiqueraudbutdelalgorithmecommentellesappelleetcequelledoitcontenir.Eneffet,pourquelalgorithmeutilisevotrevariable,ildoitdjsavoirquelleexisteetcequelledoitcontenir.Ilnesagitpasicidedfinirlavaleurdelavariable,vouspourrezlefairedanslasuitedelalgorithmeenluiaffectantunevaleur.Ilsagitdedonnersonnometdeprciserletypedevaleurquellepeutcontenir.Lesvariablessedclarentaudbutdelalgorithme,avantleprogrammeluimmemaisaprslemot"VAR".

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

    3.Lestypes

    Unecasemmoirecontientgnralementunoctet,cestdireunevaleurde0255.Maisunevariablepeuttrsbiencontenirlenombre214862,lerel3,1415926,letexte"bonjour",etc.Doncunevariablenestpasuniquementdfinieparlavaleurquellecontient,maisaussiparlaplacequecettevaleuroccupeetparlamaniredontlalgorithmevalareprsenteretlutiliser:nombre,texte,etc.Cestletypedelavariable.

    Quepouvezvousmettre commevaleur dans une variable ? En principe, tout ce que vous voulez. Cependant, vousdeveztoutdemmeprciserqueltypelavaleurreprsente.Estceunnombre?

    Sioui,unentier(sansvirgule)ouunrel(avecvirgule)?Estcedutexte?Estceuntableau?Etainsidesuite.Vousentendrez parfois parler du "codage" de la variable : selon le type et la taille de la valeur, celleci est encode demanirediffrentedanslammoire,utilisantplusdecases.

    a.Lesnombres

    Placerdesnombresdanslavariableestleplusvident,etsouventlepluscourant.Unecasemmoirepeutcontenirunoctet,cestdireunevaleurcompriseentre0et255(281).Maissielledoitcontenirunevaleurngative?Alorssurles8bits,unserarservausigne,etlacasemmoirepourracontenirdesvaleursde127+128.Onditalorsquelavariableest"signe":ellepeutcontenirdesvaleurspositivesetdesvaleursngatives.Seulement,8bitsnesontpassuffisantspourdesgrandesvaleurs.Cestpourquoilesnombrespeuventtreplacsdansdeuxcases(16bits),quatrecases(32bits)ouplus.

    Silordinateurestbienpluslaiseetbienplusrapideavecdesnombresentiers,ilsaitaussimanipulerdesnombresrels, bienquedans ce cas leur codageenbinaire soit radicalementdiffrent.Vous trouverezplusbas toutes lesexplicationsncessairespour comprendre comment lordinateur se reprsente exactement les nombresngatifs etrels:cenestpassivident!

    Aufinal,lordinateurestcapabledegrerdesnombresdelongueurvariable,signsounon,entiersourels.Suivantle langagedeprogrammation, les typesportentdesnomsdiffrents.Cependant leCetsesdrivsproposent lestypessuivants.AttentioncarJavafaitladiffrenceentreletypeBytedeunoctetetletypeCharquiprenddeuxoctetscauseduformatdecodagedescaractresenUnicode.

    - 2 - ENI Editions - All rigths reserved

  • Vousdevezchoisirqueltypenumriqueutiliserselonvosbesoins.Lavoiedelafacilitconsisteprendreletypelepluslevcommeunentier longoupire,un relendoubleprcisionafindtre tranquille.En informatiquecommedansbeaucoupdemtiers, il fautchoisir la formule laplusconomique.Onparle icidconomiedemoyens.Quunprogrammedonne le rsultatattendunestpassuffisant, il fautaussiquil le fassevite,bienetenconsommant lemoins de ressources possibles. Le fait de disposer de plusieurs gigaoctets nest pas un critre suffisant pourprogrammernimportecomment.Unelistedemillevaleurscomprisesentre0et100cotera1000octets(soitpasloinde1ko)dansun typebyte,mais8000octets (pas loinde8ko)soit8 foisplusdansune type reldoubleprcision.Celapeutsembler faible,maisnonseulement lordinateurdoitmanipuler8casesmmoireau lieudune,maisenplus ildoitenpermanenceconvertirunevaleurquilpensetreunnombrerelavecdeschiffresaprs lavirguleenentier,alorsquecestdjlecas!Quandvousverrezplusbaslaformulemathmatiquencessaire,vousvousrendrezcomptedugchis!

    Utilisezlestypesquivontbienaveclesvaleursquivontbien.Enalgorithmique,cestbienplussimple.Riennevousempchedeprciserquevousmanipulezdesentiersoudesrels,maisvouspouvezaussiindiquertoutsimplementque vous utilisez des variables contenant des valeurs numriques avec le pseudotype "numrique". Vous devrezcependanttrepluscirconspectquandvousconvertirezvotrealgorithmeenvrai langagedeprogrammation.Dunemaniregnrale,deuxtypesnumriquessontutilissenalgorithmique:

    l Lesentiers:nombressansvirgule,ngatifsoupositifs

    l Lesrels:nombresvirgule,positifsoungatifs.

    Lesvariablessedclarenttoutesaudbutdelalgorithme.Sidurantlardactiondeceluicivousremarquezquevousenavezbesoindautres,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"ouavec lepointdcimal,cependantdans les langagesdeprogrammation,ceserabiensouvent lepointquiserautilis"3.14".

    EnJava,lestypesportentlesmmesnoms,enanglais,destypessitusdansletableauprcdent,maisnedisposepasdetypesnonsigns.Autrementdit,unevariablenumriquepeutcontenirdesnombrespositifsoungatifs,maislintervalledevaleurssetrouve"unpeu"rduite.Leseultypenonsignestletypechar(letypecaractre)pourdesraisonsvidentesquevousverrezplusbas.

    Dans lexemple suivant, tous les typesnumriques classiquesde Java sontdclars. Lesnomsdesvariables sontassezparlantspourlescomprendre.Puischaquevariablesevoitassignelavaleurmaximalequellepeutsupporter.Ceprogrammeamnetroisremarques:

    l Lerel32bits(float)voitsadfinitionforce:lecompilateurindiqueuneerreursignifiantunrisquedepertedeprcisionautrement.Ilestaussipossibledajouterun"D"lafinpourforcerundoubleouun"F"pourunfloat,carJavaconsidrelesvaleursrellessaisiescommetantdutypedoublepardfaut.

    Typenumrique Plagedevaleurspossibles

    Byte(char) 0255

    Entiersimplesign(int) 3276832767

    Entiersimplenonsign 065535

    Entierlongsign(long) 21474836482147483647

    Entierlongnonsign 04294967295

    Relsimpleprcision(float)Ngatif:3,40x10381,40x1045

    Positif:1,40x10453,40x1038

    Reldoubleprcision(double)Ngatif:1,79x103084,94x10324

    Positif:4,94x103241,79x10308

    - 3 - ENI Editions - All rigths reserved

  • l Javaconsidrelesvaleursentiressaisiescommetant32bitspardfaut.Pourunentiersur64bits,ilfautrajouterun"L"lafin,quisignifiequecettevaleurestunentierlong.

    l 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,toutaumoinssurlesordinateurspersonnelsoudansdeslangagesdeprogrammationclassiques,maisbienplussurdesmoyensougrossystmesoudansdesbasesdedonnes.LesystmeBCDbinarycodeddecimalpourdcimalcodenbinaireestutilisprincipalementenlectroniquecarilestassezsimplemettreenuvre.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:

    l soitnemettrequunchiffreparoctetetcomplterlerestequepardes1oudes0,"EBCDIC"

    l soitmettredeuxchiffresparoctet,etrajouterunsignelafin,"packedBCD".

    Parexemplelenombre237:

    11110010 11110011 11110111 en EBCDIC 00100011 01111100 en Packed BCD (le 1100 final est le +, 1101 pour le -)

    Vous rencontrerezpeuttre un jour le type "montaire" pour grer les sommes demmenomet notamment lesrglesdarrondi,mais aussi et surtout une grande quantit de types permettant de grer les dates, courammentexprimssouslenom"date".LordinateurdetypePCstockelesdatesdediversesmanires,lapluscommunetantsous la forme dun timestamp, une valeur signifiant le temps coul depuis une date prcise. Ce timestamp estsouventceluidusystmeUnix,quireprsentelenombredesecondescoulesdepuisle1erjanvier1970minuitUTC,exactement.Cestdoncunentier,etlelangagedoitfournirdesinstructionspourconvertircettevaleurendaterelle.

    c.Lescaractres

    Siunordinateurnesavaitmanipulerquelesnombres,vousneseriezpasentraindelirecelivre,critlaideduntraitementdetexte(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,unelignecompltedetexte,outoutcequevousvoulezquincessiteunereprsentationalphanumrique.Onappelledailleursunesuitedecaractresalphanumriqueunechanedecaractres.

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

    VAR texte:chane car:caractre

    - 4 - ENI Editions - All rigths reserved

  • Quelleplaceoccupeunechanedecaractre?Enprincipe,uncaractreoccupeunoctet.chaquevaleurcompriseentre 0 et 255 est associ un caractre. Cest le principe de lASCII "American Standard Code for InformationInterchange", norme de codage des caractres la plus connue et la plus utilise. La table ASCII, invente par lesamricains, contient lorigine les128 caractresutilespour crire enanglais. Pardfaut ellene contientpas lesaccents.OrlatableASCIIpeutcontenir256caractres.Les128autres(huitimebitun)contiennentdescaractressemigraphiques et des caractres spcifiques certaines langues, typiquement le franais, pour les caractresaccentus.Onparlealorsdepagedecodeoudecharset.Cespagesfontlobjetdunenormalisation,parexemplelanormeISO885915quiestlapagedEuropedelOuest,aveclecaractredeleuro"".Danslaplupartdeslangagescecodagesurunoctetsuffitetainsiunechanedecaractresde50caractresoccupe50octets.

    Enpseudocodealgorithmique,leschanesdecaractressontplacesentreguillemetspourdeuxraisons:

    Javadisposeduntypespcialpourleschanesdecaractresappel"String".Lexemplesuivantmontredeuxmoyensdeplacerdutextedansunechane.Ilestpossibledelefairedsladclarationdelavariable(cestdailleurspossibledirectementpourlaplupartdestypes),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.Eninformatique,onemploieplusvolontiers lanotiondexpressionetdvaluationdecetteexpression.Uneexpressionpeuttredcritecommetanttoutcequipeutfournirunevaleurquelordinateurpeutdterminer,stocker,valuer.Parexemple, laffirmation"a>b"selonlaquelleaestsuprieurb.Siavaut3etbvaut2,laffirmationestvraie.Simaintenantavaut1etbvaut2,laffirmationestfausse.Danslesdeuxcas"a>b"estuneexpressionquivautsoitvrai,soitfaux.Cestlecasleplussimple,maisaussilepluscourantetlepluspratiquecommevousleverrezlorsdestestsetdesconditions.

    Comment lordinateurdterminetil cequi est vrai et faux?Cest le rle,dans larchitecturedeVonNeumann,delUAL. Sous quelle forme lordinateur se reprsentetil ce qui est vrai ou faux ? Sous forme numrique, commetoujours.Toutcequiretourneunrsultatdiffrentdezro(0)estconsidrcommetantvrai,doncsilersultatvautzro(0)alorsilseraconsidrcommefaux.Avantdeconsidrercettedfinitioncommeexacte,renseignezvoustoutde mme car certains langages (comme linterprteur de commande Unix) font linverse ! Cependant dans deslangagescommeJavaouleC,1estvrai,0estfaux.

    Pourreprsenterlesvaleursvraietfaux,ilsuffitdedeuxchiffres,0et1.Combienfautildeplacepourstockercesdeuxvaleurs?Unseulbit!Enpratique,leslangagesgrentlesboolensdeplusieursmanires.Certainscrentdes"champs" de bits dans un mme octet, dautres utilisent un octet complet, etc. Cependant, plusieurs langagesproposentletypeboolen,trspratique.

    Danslapratique,ceslangagesproposentdesconstantes(desvariablesquiprennentunevaleurunefoispourtoute)spcialespourreprsenterlesvaleursvraietfaux:

    l TRUEpourvrai

    l FALSEpourfaux

    1. viteruneambigutentrelesnombressousformedechanedecaractresetlesnombresauformatnumrique.Certainslangagesnefontcertespasdirectementladiffrence(cestselonlecontextedutilisation)maisavecdautrescestcatastrophique.Lasuitedecaractres1,2,3reprsentetellelenombre123etstockeainsienmmoiresousformebinairedansunoctetdelammoire,oulachane"123"stockeainsienmmoiresousformedecodesASCII,soitunpourchaquecaractre?Lesguillemetsvitentleserreursdinterprtations.

    2. Nepasconfondrelenomdelavariableavecsoncontenu,notammentlorsduneaffectation.Ainsi,quandvousaffecterezunvaleurunevariable,sicelleciestentreguillemetsvousluiaffecterezunechanedecaractres,sicestunnombre,ceseracenombre(sachantquelenomdunevariablenepeutpastreconstituuniquementdechiffres),etenfinsicenestniunechaneniunchiffre,cestunevariable.Danscecaslapremirevariablerecevracommevaleurcelledelasecondequiluiestaffecte.Nepasrespecterceprincipeestunecausederreurgraveetnanmoinscommune.

    - 5 - ENI Editions - All rigths reserved

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

    VAR

    Test:boolen

    Javadisposeaussidun typespcialpour lesboolensappel "Boolean".Comme lapluspetiteunitdestockagedunecasemmoireest loctet, leboolenoccupeuncasedoncunoctet.Cependant ilnepeutaccepterquedeuxvaleurs:trueetfalse.lexcution,lesvaleurs[trueetfalse]serontaffichesentouteslettres.Remarqueziciunenouvelle proprit : la dclaration des variables il est possible tout commeen pseudocodedemettreplusieursvariablesetdaffecteraussiplusieursvaleurs,ensparantlesvariablespardesvirgules.

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

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

    IlnestpaspossibleenJavadeconvertirdirectementunboolenenentieretviceversa.

    4.Affectation

    a.Affectationdevaleurs

    Pour donner une valeur une variable, il faut passer par un processus daffectation laide dun oprateur. Enpseudocode,onutiliselesymboledaffectation.gauchedecesymbole,vousplacezlenomdelavariable,droitelavaleur.Voustrouverezaussidanscertainesreprsentationsalgorithmiquesle:=issuduPascal.Lesdeuxsontquivalentsetutilisables(maisvitezdelesmlanger,poursyretrouver).

    Voiciquelquesexemplesdaffectationsenpseudocode.

    PROGRAMME AFFECTATION VAR a:entier b,c:rels titre:chane vrai:boolen DEBUT a10 b3,1415927 c12345 titre"ma premire affectation" vraiTRUEFIN

    VousavezvidemmentrencontrdanslesprogrammesJavaprcdentscommentaffecterunevaleurunevariable.Cest lesigne"="quiestutilis.Lemploidusigne"="enpseudocodenapas lammesignification,cequevousverrezunpeuplusloindanslesoprateursdecomparaison.

    Attentioncependantnepasvoustromperentreletypedelavariableetlavaleurquevousluiaffectez.Cestunecausederreurfrquente,tantenpseudocodealgorithmiquequedansunvrailangage.Danscertainscasapourramarcher (dans le sens o lordinateur ne retournera pas forcment une erreur)mais le rsultat ne sera pas celuiattendu.Considrezlexemple,pascorrect,suivant:

    PROGRAMME AFFECT2VAR a:entier

    Dansleprogramme

    - 6 - ENI Editions - All rigths reserved

  • b:rel c:chaneDEBUT b3,1415927 a3,1415927 c12345FIN

    Lexcutiondecepseudocodeprovoquequelquessurprises,etdeserreurs.ToutdabordbreoitlavaleurdePI,etcommebestdclarenrel(pour lexemple, letypeclassiqueNumriquenauraitpastpertinent),cest correct.Puisareoitlammechose.Oraestunentier!Suivantleslangagesdeprogrammation,vousobtiendrezsoituneerreur,soitafonctionnera,maispasparfaitement.Lavariableatantunentier,ilsepeutqueanecontiennequelavaleurentiredeb,soit3.Notezquecertainslangagesautorisentuneconversionexpliciteduntypeversunautre.On parle de transtypage. Quant la variable c, elle doit contenir une chane de caractres, dlimite par desguillemets,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 precisionfound : doublerequired: int i_a=3.1415927; ^1 error

    LetranstypageenJavaconsiste indiquerentreparenthsesavant lavaleuraffecter letypefinaldecelleci. Lavaleurseraconvertie,sipossible,danscetypeavantdtreaffecte.Javanepermetpasdefairenimportequoietletranstypagedoitsuivreunecertainelogique(dugenre,onnepeutpasconvertirdirectementunechanedecaractresenentier).Demmeletranstypage,notammentverslebas(duntypedegrandetailleversunetaillerduite)risquede provoquer une perte de prcision, voire mme dun grand nombre dinformations. Dans cet exemple, f_a estexplicitementconvertieenentier.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.14159273

    Afindenepasvousfairetapersurlesdoigtsparvotreprofesseurdalgorithmique,prcisezlebontypedsledbut,etvitezlesaffectationsdouteuses.

    Vousavezledroitdedonnerunevaleurinitialeoupardfautunevariablelorsdesadclaration.Danscecasvousdevezutiliserloprateurdaffectationlorsdeladclaration.

    Dansladclaration

    - 7 - ENI Editions - All rigths reserved

  • PROGRAMME DECLARE2VAR a10:entier b3.5,c8.2347:rels titre"Mon titre":chanevraiVRAI:boolenDEBUT Afficher aFIN

    Avec une valeur par dfaut, la variable dispose dj dun contenu ds son initialisation et peut tre directementutilise.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 AFFECT3VAR a,b:entiersDEBUT a10 baFIN

    Lencore,vousprendrezbiensoindenepasmlangerlestorchonsetlesserviettesennaffectantpasdesvariablesdetypesincompatibles.Lexemplesuivantestvidemmentfaux.

    PROGRAMME AFFECT4VAR a:entier b :relDEBUT b3.1415927 abFIN

    Lencore,noubliezpasuneventuelleconversiondansunvrai langageetdedclarercorrectementvosvariablesdanslebontype.LexempleJavasuivantnedevraitpasvousposerdeproblmesdecomprhension.

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

    Note:onnepeutpasaffecterdevariableuneautrevariablelorsdesadclaration.

    - 8 - ENI Editions - All rigths reserved

  • 5.Saisieetaffichage

    Poursimulerlaffichageduntexteoudunevaleursurlcran,ilfaututiliserlapseudoinstruction"Afficher"quiprendsa suiteune chanede texteouunevariable.Si vousmlangezdu texteetdesvariables, sparez ceuxcipardesvirgules.laffichage,lesvirgulesserontremplacespardesespaces.

    PROGRAMME AFFICHEVAR a:entier texte:chaneDEBUT a10 texte"Hello World" Afficher a Afficher texte Afficher "Bonjour les amis"FIN

    PourinviterunutilisateurrentrerauclavierunevaleurutilisezlemotSaisir.Lalgorithmeattendraalorsuneentreauclavierquiseravalideaveclatouchedentre.Lavaleurquevoussaisissezseraplacedanslavariableindiquelasuitede"Saisir".

    PROGRAMME SAISIEVAR reponse:chaneDEBUT Afficher "Quel est votre nom ?" Saisir reponse Afficher "Vous vous appelez",reponseFIN

    Sivousdevezsaisirplusieursvaleursplacerchacunedansunevariable,vouspouvezutiliserplusieurs"Saisir",maisplussimplementplacezlesdiversesvariableslasuitedununiqueSaisir,sparespardesvirgules.Lutilisateurdevraalorssaisirplusieursvaleurs(selonlelangagefinal:lesuneslasuitedesautressparespardesespaces,ouenappuyantsurlatouche[Entre]aprschaquesaisie).

    PROGRAMME SAISIE_MULTIPLEVAR nom,prenom:chanesDEBUT Afficher "Quels sont vos noms et prnoms ?" Saisir nom,prenomFIN

    Vous avez dj remarqu depuis le premier chapitre quen Java les exemples utilisent "System.out.println()" pourafficherquelquechosedanslaconsoleMSDOSoudansleshellUnix/MacOS.Cestunesyntaxeunpeucompliquequitrouvesalogiquedansleprincipedelobjetquiseraaborddansledernierchapitre.Javaesteneffetavanttoutunlangagepermettantdemanipulerdes composantsgraphiques (fentres, botesdedialogue, etc).Voyez cequil estncessairedefairepoursaisirdutexteauclavierdepuislaconsoledanslexemplesuivant.

    import java.io.*;class chap2_saisie { public static void main(String[] args) { String txt; BufferedReader saisie; saisie=new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Entrez votre texte:"); txt=saisie.readLine(); System.out.println("Vous avez saisi :"); System.out.println(txt); } catch(Exception excp) { System.out.println("Erreur");

    - 9 - ENI Editions - All rigths reserved

    cedricNoteUnmarked dfinie par cedric

  • } }}

    6.Lesconstantes

    Vouspouvezdciderdedonnerunevaleurunevariableetquecettevaleurnedoitpaschanger:elledoitresterfixedansletempsetinaltrable,pourtouteladureduprogramme.Savaleurdoitresterconstante.Dosonnom.

    Une constante est unevaleur, reprsente tout commeunevariable par unevaleur, qui nepeut pas tremodifieaprssoninitialisation.Elleestimmuable.UnexempledeconstantepourraittrelavaleurdePI.

    Uneconstantesedclaregnralementavant lesvariablessous lemotclCONST. Elleestaussidun typedonn.Certainslangagesdeprogrammationpassentparfoisoutredutypedelaconstante.

    PROGRAMME CONSTANTECONST PI3.1415927:relVAR R5:entier Aire:relDEBUT Aire2*PI*R Afficher AireFIN

    Une constante sutilise exactement comme une variable, sauf quelle ne peut pas recevoir de valeur. En java, uneconstanteestaussiappelevariablefinale,danslesensoellenepeutplustremodifie.Elleestdclareaveclemotcl"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, unoprateurestutilispouretdansdesoprations.Lesymbole""estunoprateurdaffectation.Ilexisteplusieursoprateursquiserventauxcalculs,affectations,comparaisons,rotations(debits),groupages,etc.

    2.Lesoprateursarithmtiques

    Pourque lesalgorithmespuissenteffectuerdescalculs, il fautpouvoiraumoins fairedesoprationssimples.Vousutiliserezpourcelalessymbolessuivants:

    l +:addition

    l :soustraction

    l * ou x:multiplication(ilestplusfaciledcrireunxpourfoisquunetoile)

    l /:division

    l %oumod:modulo

    l DIV:Ladivisionentire

    Rappel:unmoduloestlerestedunedivisionentire.Parexemple15/2vaut7,maisilreste1.Onditque15modulo2vaut1.

    Cesoprateurssontditsbinairescarilssutilisentavecdeuxvaleurs:uneavantlesymboleetuneaprs.Lesvaleursavantetaprspeuventtredesdonnes(demmetypequelavariablequireoitlesrsultats)oudesvariables.Voiciunexempledoprationsdansunsimplealgorithmequicalculelasurfaceetleprimtreduncercle.

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

    Ici ilnyaquedesmultiplications.Vouspouvezdjremarquerquevousavezparfaitement ledroitdechanervoscalculsetdemlangerlesdonnesetlesvariables.Simulezlesdeuxcalculs:

    surfacePI * r * rsurface3,1415927 * 5,2 * 5,2surface84.948666608perimetre2 * PI * rperimetre2 * 3,1415927 * 5,2perimetre32.67256408

    Enjava:

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

    - 1 - ENI Editions - All rigths reserved

  • 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.Vousvousrendrezcompteeneffetquelesoprateursontdesdegrsdeprioritdiffrents.Parexemple,unemultiplicationest"plusforte"quuneaddition.

    Prenezlexemplesuivant:

    PROGRAMME PRIORITEVAR x,y,z,total:entiersDEBUT x3 y4 z5 totalx + y * z Afficher totalFIN

    Quevaudratotal?Sivouseffectuezlecalculdegauchedroite,vousobtenez3+4=7,7*5=35.Sivousfaitesceciavecvotrecalculatrice,vousnobtiendrezpascersultatcarlamultiplicationaunordredeprioritpluslevqueladdition.Lordinateurvadabordfaire4*5=20,puis3+20=23.Lersultatestdonc23.Sivoussouhaitezindiquerlalgorithme,etdoncensuitedansunvrailangage,unemodificationdespriorits,vousdevezutiliserlesparenthses.

    PROGRAMME PRIO2VAR x,y,z,total:entierDEBUT x3 y4 z5 total(x + y) * z Afficher totalFIN

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

    ax+bx+c=0

    - 2 - ENI Editions - All rigths reserved

  • Pourrsoudreunetellequation,ilfautcalculerun"discriminant"souslaforme

    =b-4ac

    Suivantlavaleurdudiscriminant,lesrsultatsvarient:

    l si>0,ilyadeuxsolutions

    l si=0,ilnyaquuneseulesolution

    l si

  • l xidemmaisaprslutilisationencours

    Cettecriturepeutsurprendre.Voiciunexemple:

    PROGRAMME UNAIREVAR a:entierDEBUT a1 Ecrire ++a Ecrire a++ Ecrire aFIN

    l Lepremieraffichageindique2,lavariableaestincrmenteavantsonutilisation.

    l Ledeuximeindique2aussi,lavariableaestincrmenteaprssonutilisation.

    l Ledernierindique3.

    Note:lesoprateurs+etpeuventaussitreutilisscommeoprateursunaires:placsavantunscalaireouunevariable,lesigne""donneralopposdecettevaleur(1estgal1).

    3.Lesoprateursboolens

    Lesoprateursnepermettentpasquedefairedescalculs.Dansuneexpression,unoprateurpeutaussieffectuerdesvaluationsdeboolens.Vousavezvuquepourlordinateurtoutcequiestvraiestdiffrentde0,cequiestfauxvalant0.Commentalorsfairesideuxexpressionssontlunevraie,lautrefausse,pourconnatrelavaleurdesdeuxconjugues ? Il faututiliserdesoprateursboolenspour indiquer cequi doit tre considr commevrai : lunoulautre,lesdeuxenmmetemps,etc.

    l LoprateurET indiquequelesdeuxexpressionssituesavantetaprsdoiventtretoutes lesdeuxvraiespourquelensemblelesoitaussi.

    l LoprateurOU indiquequeseule lunedesdeuxexpressions,quecesoitcellesitueavantoucellesitueaprs,doittrevraiepourquelexpressioncompltesoitvraieaussi.

    l LeNONestlangation.Silexpressiontaitvraieelledevientfausse,etviceversa.

    Lesoprateursboolenssontrgisparlalogiqueboolenne,dunomdelinventeurnonpasdelalogiqueellemme,maisdestravauxdeGeorgeBoolequiauXIXmesiclearestructurtoutelalogiqueenunsystmeformel(quelonpeutinterprteravecdesmots,desphrasescomprhensibles).Prenezlesdeuxexpressions:"Ilfaitbeauetlesoleilbrille".Lapremireexpression"ilfaitbeau"estvraiesilfaitvraimentbeau.Lasecondeexpression"lesoleilbrille"estvraiesilesoleilbrillevraiment.Silesdeuxexpressionssontvraies,alorslexpressionglobaleestvraie.Parcontre:"Ilaneigetilfaitbeau".Silaneig,cettepremireexpressionestvraie.Cependantsilnefaitpasbeau,lasecondeexpressionestfausse.Lensembleestdoncfaux(danslecascontraire,chaussezvosskis).

    Les trois oprateurs logiques ET,OU et NON peuvent tre simplement compris laide de petits tableaux appelsparfois"tablesdevrit".Exp1etExp2sontdesexpressionsboolennesvraiesoufausses.Parexemplelexpressiona=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 plusgnralementqueExp1ETExp2estvrai.DanslecasduET,lensembleestvraiuniquementsilesdeuxexpressionssontvraies:luneETlautre.Danslesautrescas,commeaumoinslunedesdeuxestfausse,alorslersultattotalestfaux.

    OU:

    - 5 - ENI Editions - All rigths reserved

  • TabledevritOU

    DanslecasduOU,aumoinslunedesdeuxexpressionsdoittrevraiepourquelensemblesoitvrai.Seuleuneseuleassertionestdoncfausse,danslecasolesdeuxexpressionssontfaussestouteslesdeux.

    NON:

    TabledevritNON

    - 6 - ENI Editions - All rigths reserved

  • LeNONesttrsfacilecomprendre,puisquelexpressionboolenneestinverse:cequitaitvraidevientfauxetviceversa.

    Dansquelcaslesoprateursboolenssontilsutiles?Danslesexpressionsutilisesdansdesconditions(excuteruneactionselonteloutelcritre)quandcesconditionssontmultiples.Parexemple,sivousvoulezexcuteruneactionuniquementsideuxvariablesaetbsontvraies(contiennentautrechoseque0).

    PROGRAMME ET1VAR a,b:entiers result:boolenDbut a1 b2 resulta ET b Afficher resultFin

    Notezquelalgorithmecidessusnevrifiepassiavaut1etbvaut2.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. Pourvalueruneexpression,ilfautparfoisavoirbesoindecomparerdesvaleurs.Commentsavoirsiunutilisateurdevotrelogiciel a rpondu oui ou non votre question ? Comment savoir si le chiffre saisi dans le jeu du lancer de dcorrespondaubonrsultat?Vousallezdevoirutiliserlesoprateursdecomparaison.Ilyenaplusieurs.Ceuxcisontdes oprateurs binaires : ils prennent deux valeurs, une avant et une aprs. Ces valeurs peuvent tre soit desscalaires (entiers, rels, chanes de caractre selon le langage utilis) directement, soit leur reprsentation sousformedevariable.Lordinateurvalueralersultatdecettecomparaisonsousformeboolenne:lersultatseravraioufaux.

    Leslangagesragissentdiffremmentselonlescomparaisonsetlestypesdesdonnescompares.Lencore,prenezgardenepasmlanger les types.Aussi,sienpseudocodealgorithmique leschanesdecaractres

    peuventtrecomparesavectouslesoprateurs,prenezgardelinterprtationquienestfaiteparleslangages.EnCnotamment(etentreautres)ilfautpasserpardesfonctionsspcialises.

    a.Lgalit

    Loprateur dgalit scrit avec le signe "=" et sert vrifier si les deux valeurs droite et gauche sontidentiques, cestdire quelles ont la mme valeur. Dans cet exemple, lexpression a=b est vraie, mais a=c estfausse.

    PROGRAMME EGALEVAR a,b,c:entiersDEBUT a5 b5 c10 Afficher a=b Afficher a=cFIN

    Il ne faut surtout pas confondre, tant en algorithmique que dans les langages de programmation, loprateurdaffectation "" et loprateur dgalit "=". En mathmatique et en langage courant, a=b peut avoir deuxsignifications:soitareoitlavaleurdeb,soitoncherchevrifiersiaetbsontgaux.Laquelleestlabonne?Dansun langagecomme leBASIC, linterprtationdu signe= dpendducontexte.Avecunevariableavantethorscontextedecondition,cestuneaffectation.Dansuneexpressionconditionnelle,cestunecomparaison.Durdesyretrouver !Cestpour aquecertains langagescommeC,C++, JavaouencorePHPutilisent loprateurdgalit"==",deuxfoisgal,pournepasleconfondreavecloprat