Alghorithme


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 wwweni-livrescom Ce livre numrique a t conu et est diffus dans le respect des droits dauteur Toutes les marques cites ont t dposes par leur diteur respectif La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41 dune part que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective et dautre part que les analyses et les courtes citations dans un but dexemple et dillustration toute reprsentation ou reproduction intgrale ou partielle faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause est illicite alina 1er de larticle 40 Cette reprsentation ou reproduction par quelque procd que ce soit constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal Copyright Editions ENI Algorithmique Techniques fondamentales de programmation Sbastien ROHAUT Rsum Lauteur 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 ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0PWS5rUdzIgLAA-enidentnumber 1
Introduction Pourquoi apprendre programmer Avezvous comme lauteur dispos au dbut de la microinformatique dun ordinateur o il fallait programmer soimme des jeux ou outils ou saisir des dizaines de pages de lignes de programmation Avezvous besoin durant vos tudes de matriser les techniques fondamentales de programmation pour passer votre diplme tesvous un professionnel ou un autodidacte passionn qui veut encore en savoir davantage Estce une nouvelle tape de votre carrire professionnelle o ntant pas informaticien vous tes amen programmer des macros ou des scripts complexes Quelle raison encore trouver Si vous rpondez oui lune des ces questions mais aussi aux dizaines dautres quil serait possible de poser alors oui vous devez apprendre programmer Apprendre programmer cest enfin savoir comment font les autres pour crer de superbes logiciels cest savoir terme comment les crer soimme et les dvelopper Comment apprendre programmer On ne simprovise pas programmeur Cest un mtier et comme tout mtier cela sapprend Dans les coles des professeurs enseignants pour des classes de BTS DUT DEUG classes prparatoires etc sont spcialiss dans lapprentissage des notions fondamentales de programmation Les autodidactes se plongent dans des livres des sites Internet dans la documentation en ligne des langages pour apprendre ces notions Lensemble de ces notions cest lalgorithmique Ce livre reprend les notions essentielles fondamentales 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 coule de source comme une vidence variables tests conditions boucles tableaux fonctions fichiers jusquaux notions avances comme les pointeurs et les objets Le formalisme algorithmique la syntaxe du langage algorithmique ou pseudocode 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 Il existe plusieurs variantes utilises selon le professeur le langage dorigine Celui prsent ici a lavantage dtre dans un franais trs explicite quottantque jusqu pour chaque afficher saisir etcquot Leur lecture ne ncessite aucune connaissance pralable de termes trop techniques Ce livre ne fait pas quaborder les notions basiques 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 Dailleurs presque tous les algorithmes de ce livre sont rcrits en Java Les sources directement utilisables sont disponibles en tlchargement sur le site des ditions ENI Lauteur tient particulirement remercier ses anciens professeurs de BTS du lyce de Montmorency ses anciens professeurs et aujourdhui collgues de lESGI notamment ceux dalgorithmique et de programmation C C et Java qui se reconnaitront pour lui avoir transmis encore un peu plus le plaisir du mtier dinformaticien et du travail bien fait ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0EaHgxEdzIgLAA-enidentnumber 2
Les fondements de linformatique 1 Architecture de Von Neumann Un ordinateur est un ensemble de circuits lectroniques permettant de manipuler des informations quon appelle des donnes et capable de faire quottournerquot 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 comment un ordinateur peut drouler un programme il faut tudier un peu plus en dtail son fonctionnement Cest Von Neumann qui a dfini en 1944 larchitecture des ordinateurs modernes encore largement utilise aujourdhui avec des variantes cependant Larchitecture de Von Neumann issue des travaux de Turing dont il sera question plus loin dcompose lordinateur en quatre parties distinctes Les instructions du programme sont prsentes dans la mmoire Lunit de contrle va prendre la premire instruction du programme et lexcuter Si linstruction est par exemple dadditionner deux nombres elle va demander lUAL de prendre ces deux nombres en mmoire et de les additionner et ventuellement de placer le rsultat dans une nouvelle case Puis lUC passe linstruction suivante Si elle consiste afficher ce rsultat alors lUC va lire le contenu de la mmoire ladresse o est plac le rsultat puis va envoyer le rsultat via le composant dES adquat Et ainsi de suite Au final le droulement dun programme au sein de lordinateur est le suivant lUC extrait une instruction de la mmoire analyse linstruction recherche en mmoire les donnes concernes par linstruction dclenche lopration adquate sur lALU ou lES range le rsultat dans la mmoire 1 LUnit Arithmtique et Logique UAL ALU en anglais est lorgane de lordinateur qui excute les calculs additions soustractions multiplications divisions modulos gestion des signes positif ngatif oprations logiques boolenne comparaisons parfois rotations et dcalages de valeurs toujours dans le cadre dune logique boolenne Il existe des UAL spcialises dans les nombres virgule flottante dautres dans des traitements complexes comme les logarithmes les inversions les racines les vecteurs les calculs trigonomtriques etc Certaines documentations lui rajoutent quelques registres petites cases mmoires intgres lUAL et lui donnent le nom de processeur CPU 2 LUnit de ContrleUC CU en anglais ne pas confondre avec Unit Centrale contrle le squenage des oprations autrement dit le droulement du programme Elle prend ses instructions dans la mmoire et donne ses ordres lUAL Les rsultats retourns peuvent influer sur le squenage LUC passe alors linstruction suivante ou une autre instruction telle que le programme lui ordonne deffectuer 3 La mmoire peut tre dcrite comme une suite de petites cases numrotes chaque case pouvant contenir une petite information petite dans le sens o la taille de chaque case est fixe Cette information peut tre une instruction ou un morceau dinstruction du programme une instruction peut occuper plusieurs cases ou une donne nombre caractre ou morceau de ceuxci Cest lUC qui a comme rle central de contrler laccs la mmoire pour le programme et les donnes Chaque numro de case est appel une adresse Pour accder la mmoire il suffit de connatre son adresse Les instructions du programme pour lUC et les donnes pour lUAL sont places dans des zones diffrentes de la mme mmoire physique 4 Les EntresSorties ES IO en anglais permettent de communiquer avec le monde extrieur et donc vous ce peut tre un clavier pour entrer les donnes et un cran pour afficher les rsultats Il permet lordinateur dtre interactif ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 3
Von Neumann pre des ordinateurs actuels 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 drouler ne sexcute pourtant que dans un seul endroit le microprocesseur Le microprocesseur de votre ordinateur 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 contient lUAL lUC et divers autres organes des registres spcialiss 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 lES des priphriques clavier cran etc Le microprocesseur dispose selon son modle dun jeu ensemble dinstructions prdfini 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 organes lectroniques comme les contrleurs Ces puces lectroniques quon appelle aussi parfois chipsets sont aussi des sortes de microprocesseurs qui disposent souvent dun jeu dinstructions pour les contrler justement Ces instructions sont souvent moins nombreuses et pas gnralistes Les contrleurs ont un rle prcis selon leur genre grer un certain type de priphrique ex un contrleur de carte graphique un contrleur pour les disques durs etc ou de transfert de donnes ex les contrleurs des bus de mmoire et de donnes les contrleurs USB PCI etc Tous ces composants sont intgrs sur un circuit imprim principal appel la carte mre Architecture de Von Neumann Pour rsumer larchitecture de Von Neumann est simple comprendre et rpartit les fonctionnalits dun ordinateur 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 la mmoire nest plus soude sur une carte mre mais fournie sous forme de carte additionnelle appele barrette le contrleur ES graphique est sur une carte graphique additionnelle relie un bus PCI AGP ou PCIE Les programmes sont excuts par le microprocesseur qui est aid dans le sens o celuici accde aux fonctions proposes par divers contrleurs - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 4
Note les microprocesseurs actuels sont trs complexes Il nest pas rare de trouver au sein de ceuxci plusieurs 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 pour les donnes 2 La machine de Turing Avant mme lapparition des premiers vrais ordinateurs programmables Alan Turing avait dfini en 1936 le 28 mai exactement ce quon appelle la Machine de Turing Cette machine abstraite qui nexiste pas rellement est en fait une mthode de modlisation du fonctionnement dun ordinateur ou plutt lorigine dun calculateur mcanique Comment faire pour depuis un postulat de base arriver un rsultat donn En respectant des procdures donnes Cest lun des principes de lalgorithmique Une machine de Turing ntant pas une vraie machine au sens matriel il suffit pour sen servir soit de se servir de sa 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 respecter quand on tombe sur une case contenant un symbole donn On se place sur la premire case on vrifie son symbole et son tat associs on excute la procdure associe changement de valeursymbole avancer reculer et on continue drouler ce programme jusqu ce que la procdure vrifiant quon a obtenu le rsultat final soit vrifie On vient de drouler un programme et lensemble symbolesprocdure dcrit ce programme Cest lanctre de lalgorithme Alan Turing crateur de la machine abstraite du mme nom Il existe des livres complets sur la machine de Turing notamment un de Alan Turing luimme et de JeanYves Girard aux ditions Seuil Collection Points Sciences Linformatique nest pas le seul domaine dapplication de la machine Elle permet de dterminer la 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 ordinateur via plusieurs langages dont un appel Brainfck Exemple de machine de Turing 3 Reprsentation interne des instructions et des donnes a Le binaire quoi ressemblent les instructions et les donnes valeurs utilises rellement par lordinateur Celuici ne comprend quune chose des chiffres Si ltre humain a invent des reprsentations pratiques des chiffres avec le ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 5
systme dcimal soit une notation en base 10 en allant de zro neuf un ordinateur ne manipule que deux valeurs 0 ou 1 En effet si vous pouviez trs fortement agrandir un circuit intgr vous verriez que celuici est compos de nombreuses pistes dans lesquelles passe un courant lectrique Dans ces circuits il ny a que deux possibilits soit le courant passe et dans ce cas cela quivaut une valeur de un 1 soit le courant ne passe pas et dans ce cas cest la valeur zro 0 qui est retenue Cest du binaire qui ne prend que deux valeurs Une unit binaire sappelle un bit binary digitCe mot a t invent par Claude Shannon en 1948 Comme il y a plusieurs pistes sur les circuits plusieurs valeurs 0 et 1 donc plusieurs bits circulent en mme temps En associant ces valeurs on obtient des valeurs plus grandes En passant des donnes sur un fil la valeur maximale est de 1 Si on prend deux fils soit deux bits la valeur maximale en binaire est 11 soit 3 en dcimal Pourquoi Voici une dmonstration par tapes 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 Le binaire comme son nom lindique utilise une base deux 2 tout comme le dcimal utilise une base dix 10 En dcimal tous les nombres peuvent tre reprsents laide de puissances de 10 Prenez le nombre 1234 11032102310141001234 Lunit est reprsente par 100 la dizaine par 101 la centaine par 102 et ainsi de suite Pour convertir le binaire en une valeur dcimale plus lisible il faut utiliser les puissances de 2 la plus petite valeur tant la plus droite et est appele bit de poids faible la plus grande la plus gauche et est appele bit de poids fort Dans lexemple prcdent la valeur binaire 11 peut tre convertie ainsi 1211202120213 Les informaticiens et mathmaticiens utilisent une notation particulire en indice nombres en retrait bas pour indiquer des conversions 112310 Voici un dernier exemple avec une valeur binaire code sur 8 bits Quelle est la plus grande valeur dcimale qui peut tre code avec 8 bits 2 7262524232221201286432168421255 Donc 11111111225510 Soit 256 valeurs possibles de 0 zro 255 ce qui peut tre plus simplement calcul par 2n soit deux puissance n n tant le nombre de bits contenus dans la valeur binaire La plus grande valeur convertie en dcimal est donc 2 n 1 Il est possible de convertir du dcimal en binaire avec des divisions successives on divise les rsultats sans la virgule successivement par deux Le rsultat binaire sera la juxtaposition des restes 0 ou 1 sauf pour le dernier Par exemple avec le nombre 183 183291 reste 1 91245 reste 1 45222 reste 1 22211 reste 0 Courant Fil 1 Courant Fil 2 Binaire Dcimal Ne passe pas Ne passe pas 00 0 Ne passe pas Passe 01 1 Passe Ne passe pas 10 2 Passe Passe 11 3 - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 6
1125 reste 1 522 reste 1 221 reste 0 On remonte du dernier 10110111 Conversion dcimale en binaire Cest donc en binaire que sont reprsentes toutes les valeurs quun ordinateur manipule Cest valable tant pour les donnes numriques ou texte que pour les instructions destination du microprocesseur Un nombre binaire correspondra une instruction Par exemple sur un microprocesseur x86 Intel ou AMD 01110100 est linstruction je jump if equal ou encore la ligne 10110000 01100001 qui signifie mov 0x61 al placer la valeur hexadcimale 0x61 dans le registre AL Les ordinateurs du dbut des annes 2000 savent manipuler des nombres sur 64bits or 264 est gal 18 446 744 073 709 551 616 soit plus de 18 milliards de milliards 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 quotbilitrequot Le quotaquot tait reprsent par quotAAAAAquot le quotBquot par quotAAAABquot jusquau quotZquot quotBABBBquot Lalphabet de lpoque le latin contenait vingtquatre lettres le quotjquot se confondant avec le quotiquot et le quotuquot avec le quotvquot b Les octets et les mots 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 ensemble de 8 bits est appel un octet Lavantage de loctet est quil suffit ou en tout cas a longtemps suffi pour reprsenter tous les chiffres lettres et symboles des alphabets occidentaux Un octet reprsente les valeurs de 0 255 Avec laugmentation des espaces de stockages de la quantit de mmoire du besoin de reprsentation de nombres de plus en plus grands dun accs plus rapide la mmoire ou encore de plus dinstructions il a fallu augmenter la taille des valeurs manipuler De 8 puis 16 puis 32 certains microprocesseurs peuvent manipuler des valeurs de 64 voire 128 bits parfois plus Ces valeurs deviennent difficiles dcrire et reprsenter Pour ces valeurs on parle de mot mmoire word en anglais Certains microprocesseurs font une diffrence entre divers types de mots Ceux de Motorola comme les 68000 qui quipaient ls ordinateurs Atari ST Amiga les consoles Sega Megadrive et plus rcemment les Palm Pilot utilisent des mots de 16 bits et des mots longs long word de 32bits 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 Avec un microprocesseur x86 en mode rel 16 bits le nombre dcimal 38457 ncessite 16 bits soit deux octets ou un mot de seize octets pour tre reprsent 384571010010110001110012 Pour stocker cette valeur en mmoire les 8 premiers bits de poids faible soit loctet de poids faible seront placs dans la premire case mmoire et les 8derniers bits de poids fort soit loctet de poids fort seront placs dans la case suivante La dmarche serait la mme en 32 bits ou 64 bits Case mmoire 1 Case mmoire 2 00111001 10010110 ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 7
c Lhexadcimal Si vous reprenez lexemple dune valeur binaire code sur 64 bits il faut 64 0 ou 1 pour la dcrire 1111111111111111111111111111111111111111111111111111111111111111 En dcimal il faut vingt chiffres 18 446 744 073 709 551 616 a prend beaucoup de place et cest difficile manipuler Puisquil existe une base 10 dcimal et une base 2 binaire pourquoi ne pas prendre une base plus leve multiple de 2 pour rduire la longueur et la manipulation de ces nombres Cest ainsi quen informatique il est dusage dutiliser la base 16 appele hexadcimale Une base hexadcimale permet de coder les valeurs de 0 15 Si de 0 9 on utilise les valeurs dcimales correspondantes audessus il faut utiliser des lettres de lalphabet de A 10 F 15 Comment passer du binaire lhexadcimal Ceci revient rpondre la question quotCombien fautil de bits dans un nombre binaire pour coder 16 valeurs quot 2416 Il faut donc 4 bits Le tableau suivant rsume les conversions Si vous reprenez le nombre 183 qui ncessite 8 bits soit un octet sa conversion donne B7 en hexadcimal On dit donc que 18310B716 du dcimal lhexadcimal Si vous prenez la valeur maximale en 64 bits cela donne FFFFFFFFFFFFFFFF soit 16 caractres Un informaticien exerc est quasiment capable de convertir la vole de lhexadcimal en dcimal Prenez la valeur 8C soit 10001100 en binaire Le C vaut 12 81612140 Sans aller plus loin sachez que les bases 2 10 et 16 ne sont pas les seules Sur certaines machines et certains systmes dexploitation il est courant dutiliser une base 8 pour des valeurs ne ncessitant que trois bits pour tre reprsente Somme toute tant quil reste assez de symboles rien nempcherait davoir une base 30 Dcimal 0 1 2 3 4 5 6 7 8 9 10 Hexa 0 1 2 3 4 5 6 7 8 9 A Binaire 0 1 10 11 100 101 110 111 1000 1001 1010 Dcimal 11 12 13 14 15 Hexa B C D E F Binaire 1011 1100 1101 1110 1111 - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0rwDvzEdzIgLAA-enidentnumber 8
Lalgorithmique 1 Programmer cest un art Pour obtenir un rsultat donn il faut gnralement suivre une mthode une certaine logique Sauf tre un grand ptissier dont la science des mlanges des ingrdients est inne ou le fruit dune longue pratique vous nobtiendrez jamais un dlicieux gteau au chocolat mme si vous disposez des meilleurs ingrdients et accessoires de cuisson si vous ne connaissez pas les bonnes proportions lordre dans lesquels ajouter les ingrdients le temps de cuisson la temprature bref la recette De mme sans formation de mcanicien ou sans la documentation technique du moteur de votre vhicule inutile de vous lancer dans un changement de joint de culasse cest la casse assure 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 employs sont bombards dveloppeurs pour leurs quelques connaissances confuses de Visual Basic de Delphi ou de 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 niveau de la programmation alors que ce ne sont pas les mmes programmeurs qui les ont dvelopps Les dbutants 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 dfaut de donner une solution complte leur problme leur fournira les bases et les techniques pour avancer 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 tait livr avec le DOS du PC Les Amstrad avaient le basic Locomotive les Atari ST lAtari Basic et surtout le GFA Basic un langage de grande classe etc Une gnration complte dutilisateurs sest lance dans la programmation laide de ces langages et de la documentation fournie qui bien souvent fournissait non seulement les rfrences du langage mais aussi les mthodes de base de programmation Avec plus ou moins de succs Le rsultat tait souvent un infme bidouillage mais qui marchait Or le but nest pas que le programme fonctionne mais quil fonctionne vite et bien bref le mieux possible Le meilleur ordinateur au monde et le meilleur langage au monde ne vous y aideront pas 2 Dfinition Lalgorithme est une recette Avezvous dj eu loccasion de programmer un magntoscope en voie de disparition ou un enregistreur de dvd Quavezvous fait la premire fois que vous avez allum votre poste de tlvision pour rgler la rception des chanes Nul doute que vous avez ouvert le mode demploi et suivi la squence dinstructions indique appuyer sur la touche Menu de la tlcommande se dplacer sur Enregistrement et appuyer sur OK se dplacer sur une ligne puis indiquer la chane 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 chocolat et le beurre dans une casserole feu doux retirez la casserole du feu incorporez les jaunes doeuf puis le sucre et la farine battez les oeufs en neige puis incorporez doucement dans le mlange etc Dans les deux cas flicitations Vous avez droul votre premier algorithme Une dfinition simple dun algorithme cest une suite dinstructions qui quand elles sont excutes correctement aboutissent au rsultat attendu Cest un nonc dans un langage clair bien dfini et ordonn qui permet de rsoudre un problme le plus souvent par calcul Cette dfinition est rapprocher du fonctionnement de la machine de Turing qui avant lapparition de lordinateur utilisait cette dmarche pour rsoudre de nombreux problmes Lalgorithme est donc une recette pour quun ordinateur puisse donner un rsultat donn Le mot algorithme vient du nom du mathmaticien Al Khuwarizmi Muhammad ibn Ms alKhuwrizm savant persan du IXme sicle auteur dun ouvrage appel quotLa transposition et la rductionquot Aljabr walmuqbalah Le mot Aljabr deviendra algbre le nom de lauteur sera latinis en Algoritmi qui sera la base du mot algorithme 3 Pourquoi utiliser un algorithme Lalgorithme dcrit formellement ce que doit faire lordinateur pour arriver un but bien prcis Ce sont les instructions quon doit lui donner Ces instructions sont souvent dcrites dans un langage clair et comprhensible par ltre humain faire ceci faire cela si le rsultat a telle valeur et ainsi de suite Un algorithme bien tabli et qui fonctionne tout au moins en thorie pourra tre directement rcrit dans un langage ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 9
de programmation volu comme le C Java ou PHP Malheureusement en programmation cest souvent lhomme de se mettre au niveau de la machine De la rflexion la programmation Plus que cela un algorithme dcrit une mthode de rsolution de problmes courants Un algorithme est donc rutilisable sauf cas ponctuel ou trs prcis Il existe plusieurs moyens dobtenir un mme rsultat mais certains sont meilleurs que dautres Cest le cas par exemple des mthodes de tris de donnes par ordre alphabtique Il existe divers algorithmes dcrivant ces mthodes certaines tant adaptes des quantits plus ou moins importantes de donnes La matrise de lalgorithmique et lapprentissage des algorithmes de base sont une des conditions de la russite dun projet en programmation quil soit personnel ou professionnel Lexprience aidant vous allez acqurir au fur et mesure des mcanismes de pense qui vous permettront doptimiser les traitements que vous devez programmer tant en vitesse quen occupation mmoire ou mme en quantit de lignes de programmation Sur ce dernier point il existe de nombreux cas o des algorithmes longs et complexes sont plus performants que dautres semblant plus pratiques au premier abord Apprendre lalgorithmique ou lalgorithmie les deux sont autoriss cest donc apprendre programmer dans les rgles de lart Tout au long de cet ouvrage vous allez dcouvrir les notions lmentaires qui vous permettront tant de comprendre le fonctionnement interne dun programme que de le concevoir laide dune progression simple et constante et dexemples pratiques et comprhensibles 4 Le formalisme Le but dun algorithme tant de dcrire un traitement informatique dans quelque chose de comprhensible par lhumain et facilement transposable vers la machine pour quun algorithme soit comprhensible il faut quil soit clair et lisible Dans ce cas il existe deux moyens efficaces soit dcrire lalgorithme sous forme de texte simple et vident faire ceci faire cela soit de faire un schma explicatif avec des symboles 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 Dans les deux cas la syntaxe pour le texte ou les symboles pour les schmas doivent rpondre des rgles strictes voire normalises Il faut que chacun connaisse leur signification et sache donc les interprter Cest pour a que toutes les reprsentations algorithmiques suivent peu de choses prs le mme formalisme Si les schmas sont possibles ils sont cependant moins utiliss que les algorithmes sous forme textuelle Cest que si vous construisez un algorithme il est plus facile de le corriger quand il est saisi au clavier sous forme de texte que lorsquil est dessin sous forme dorganigramme dans un logiciel de dessin vectoriel ou de prsentation a La reprsentation graphique Les algorithmes peuvent tre construits laide de symboles dorganigrammes Les tudiants en informatique BTS DUT connaissent bien cette tablette en plastique permettant de dessiner des organigrammes Ils lutilisent en algorithmique en base de donnes en mthode Merise etc dans chaque cas la signification est diffrente Voici un exemple dalgorithme sous forme dorganigramme qui simule un lanc de d et qui demande une personne de deviner la valeur - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 10
Un formalisme qui occupe trop de place Dans cet exemple simplifi les traitements sont dans des rectangles les prises de dcision dans des losanges et les flches reprsentent lordre du droulement du programme Si une valeur est prsente ct de la flche laction dpend du rsultat de la question pose dans le losange Les dcisions et les flches peuvent dcrire des boucles Dans le schma tant que lutilisateur na pas saisi la bonne valeur la question lui est de nouveau pose Cet algorithme est trs simple lorganigramme aussi Cependant voyez dj la taille de celuici la place quil prend par rapport ce quil fait Imaginez maintenant un algorithme plus complexe qui doit par exemple dcrire tous les cas de figure dans la gestion dune communication entre deux machines description dun protocole de communication le schma ncessitera une feuille dune grande dimension et sera difficile tudier b Lalgorithme sous forme de texte Prenez le mme nonc du lanc de d Celuici pourrait tre crit ainsi en franais correct 1re tape lancer le d 2me tape saisir une valeur 3me tape si la valeur saisie est diffrente de la valeur du d retourner la troisime tape sinon continuer 4me tape afficher quotbravoquot Vu ainsi cest trs simple De cette manire il est vident que tout le monde mme un noninformaticien comprend ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 11
ce que lalgorithme est cens faire Cependant si les algorithmes complexes devaient tre crits ainsi ce serait encore une fois bien trop long et vous finiriez soit par vous lasser dune criture trop complexe soit cela prendrait trop de place Cest pourquoi il faut utiliser une syntaxe prcise et concise Commentaires ce programme affiche bonjour PROGRAMME HelloWorld Dclarations variables constantes types etc VAR deentier valeurentier Dbut du programme DEBUT dealatoire6 valeur0 Tant que valeurde Faire Lire valeur FinTantQue Afficher quotBravoquot 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 Il reprend de manire trs dtaille toutes les tapes suivre Sous cette forme il est presque possible dimplmenter lalgorithme ligne ligne dans un langage de programmation volu Cest sous cette forme textuelle que les algorithmes seront reprsents dans ce livre Ce texte programme ou pseudocode algorithmique est dcompos en plusieurs parties Le nom du programme qui namne pas de commentaires particuliers situ aprs le mot quotPROGRAMMEquot Une zone de dclaration des donnes utilises par le programmes variables constantes types structures tableaux etc Si la signification de ces mots vous chappe ceuxci seront expliqus au fur et mesure des diffrents chapitres Cette zone commence par le mot quotVARquot Le programme luimme cestdire les divers traitements Les instructions du programme sont encadres par les mots quotDEBUTquot et quotFINquot Il vous est conseill pour plus de clart et de lisibilit dindenter les diverses lignes de les dcaler les unes par rapport aux autres laide des touches de tabulation Le programme peut tre de nimporte quelle longueur une ligne ou 10000 lignes ceci na pas dimportance Les commentaires cest un texte libre qui peut tre tendu sur plusieurs lignes et encadr par les squences de caractres quotquot et quotquot Si votre commentaire tient sur une seule ligne vous pouvez uniquement la commencer par les caractres quotquot Une dernire partie ou plutt premire car lorsquelle est prsente elle se situe avant toutes les autres peut tre constitue des sousprogrammes semblants de programmes complets appels par le programme principal Ces sous programmes appels procdures ou fonctions font lobjet dun chapitre complet 5 La complexit Lexemple du lanc de d est un algorithme trs simple court concis et rapide Ce nest pas le cas de tous les algorithmes Certains sont complexes et le traitement rsultant peut ncessiter beaucoup de temps et de ressources de la machine Cest ce quon appelle le quotcotquot de lalgorithme et il est calculable Si un algorithme est quotgourmandquot son cot sera plus lev Il existe certains cas o il est possible dutiliser plusieurs algorithmes pour effectuer une mme tche comme pour trier les lments dun tableau de valeurs Certains algorithmes se rvlent tre plus coteux que dautres pass un certain nombre dlments trier Le cot dun algorithme reflte sa complexit ou en terme plus simple son efficacit Les mots quotcotquot quotcomplexitquot et quotefficacitquot refltent ici la mme dfinition Plus un algorithme est complexe plus il est coteux et moins il est efficace Le calcul de cette complexit a comme rsultat une quation mathmatique quon rduit gnralement ensuite une notion dordre gnral La complexit est not Ofn o le O grand O veut dire quotdordrequot et f est la fonction mathmatique de n qui est la quantit dinformations manipule dans lalgorithme Voici un exemple pour mieux comprendre soit un algorithme qui compte de 1 n et qui affiche les valeurs correspondantes Dans la pratique vous allez utiliser une boucle voir chapitre correspondant allant de 1 n Il faudra faire n passages pour tout afficher et donc vous aller manipuler n fois linformation La fonction mathmatique donnant le cot sera alors fnn La complexit est alors linaire et vous la noterez On - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 12
Si dans le mme algorithme vous dcidez de faire une seconde boucle dans la premire pour afficher par exemple une table de multiplications la premire boucle va toujours de 1 n la seconde va aussi de 1 n Au total vous obtenez n fois n boucles donc n2 boucles La complexit est donc fnn2 et vous la noterez On2 Le cot de lalgorithme augmente au carr du nombre dinformations Si vous rajoutez en plus une quelconque opration dans la premire boucle cette opration a aussi un cot que vous pouvez tenter de prendre en compte Si vous ajoutez une multiplication et que celleci a un cot de 1 alors la complexit finale est de nn1 soit n2n Cependant si vous faites une courbe pour de grandes valeurs de n et que vous comparez avec la courbe simple n2 vous remarquerez que le rajout devient ngligeable Au final lalgorithme conserve une complexit On2 Si la complexit peut parfois tre calcule assez finement il en existe plusieurs quotprdfiniesquot O1 complexit constante Ologn complexit logarithmique On complexit linaire Onlogn complexit quasilinaire On2 complexit quadratique On3 complexit cubique Onp complexit polynomiale Onlogn complexit quasipolynomiale O2n complexit exponentielle On complexit factorielle Ces complexits ne sont pas forcment faciles apprhender aussi voici un graphique reprsentant quelques unes de 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 O2n lalgorithme effectue dj 1024 oprations et plus de 35 millions pour On ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 13
Courbes de complexit Comment se reprsenter rellement une complexit en terme de temps pass par lordinateur traiter les donnes 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 processeur est le FLOPS Floating Point Operations Per Second Un Intel Pentium 4 32GHz tourne une moyenne de 31 GFLOPS GigaFlops soit 109 FLOPS ou encore un milliard doprations sur rels par seconde Si vous traitez 20 donnes dans un algorithme de complexit On la vitesse de calcul se chiffre en millionimes de seconde Le mme nombre de donnes dans un algorithme de complexit On doit effectuer 2432902008176640000 oprations ce qui prendra 784807099 secondes ou encore une fois converti autour de 25 ans Bien entendu une complexit On est la pire qui puisse exister Avec une complexit infrieure O2n le traitement prendrait un dixime de seconde tout de mme ce qui est norme et relativise fortement la puissance des processeurs Vous comprenez maintenant lutilit de connatre la complexit des algorithmes et doptimiser ceuxci Dans la suite les complexits ne seront fournies que dans les cas o les traitements plus compliqus que dhabitude sont en concurrence avec diverses mthodes Cest le cas par exemple des mthodes de tris sur des tableaux Ceci dans lunique but de vous donner un simple ordre dide - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0tZ630kdzIgLAA-enidentnumber 14
Les langages dimplmentation 1 Quel langage Il existe plusieurs centaines de langages de programmation si on tient compte de toutes les variantes possibles dun mme langage Comme vous avez pu le lire au dbut de ce chapitre lordinateur ne comprend nativement quun seul 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 coutume dans le milieu de linformatique de tester un langage en lui faisant afficher un message pour dire bonjour en loccurrence le fameux Hello world Voici comment afficher ce texte dans divers langages Cseg segment assume cscseg dscseg 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 quotHello worldquot 10 PRINT quotHello worldquot 20 END IDENTIFICATION DIVISION PROGRAM-ID HELLO-WORLD ENVIRONMENT DIVISION DATA DIVISION PROCEDURE DIVISION DISPLAY quotHello worldquot STOP RUN include ltstdiohgt int mainint argc char argv printfquotHello worldnquot return 0 include ltiostreamgt En assembleur x86 sous DOS En shell Unix En Basic originel En COBOL En langage C En langage C ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 15
int main stdcout lt quotHello worldquot lt stdendl return 0 ltphp print quotHello worldquot gt public class HelloWorld public static void mainString args SystemoutprintlnquotHello worldquot Sub Main MsgBoxquotHello worldquot End Sub program Bonjour begin WriteLnHello world end 2 Classifications des langages Que remarquezvous Il y a autant de syntaxes diffrentes quil existe de langages Cependant vous constatez que les langages C C Java ou PHP ont de nombreuses ressemblances alors que lassembleur ou le COBOL semblent sortis douvrages de ScienceFiction Cest que les premiers ont quelques liens familiaux tandis que les autres sont radicalement opposs a Haut niveau bas niveau Puisquil existe des centaines de langages de programmation lequel choisir pour implmenter vos algorithmes Il ny a pas de rponse simple cette question Chaque langage a t gnralement conu pour des usages diffrents et souvent spcifiques bien quen voluant la plupart des langages dits de haut niveau soient devenus de plus en plus gnralistes Il existe plusieurs classifications des langages La plus ancienne dpend de laffinit du langage par rapport la machine On parle alors du niveau du langage Il est courant de parler dun langage de bas niveau ou de 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 courant jusqu lapparition des machines trs rapides o leur vitesse a compens une plus faible vitesse dexcution dun langage plus volu comme le C mais avec lavantage dune programmation plus simple loppos des langages de bas niveau se trouvent les langages de haut niveau Il ny a pas dchelle prcise Vous pourrez trouver dans quelques sources des niveaux allant de 0 4 mais les langages voluant tellement vite certains langages qui taient considrs de haut niveau comme le C se sont vus dclasss vers le bas Un langage de haut niveau permet de faire une abstraction presque complte du fonctionnement interne de votre ordinateur Le langage ou plutt son compilateur ou son interprteur se chargera de convertir vos ordres simples en apparence en langage de bas niveau en langage machine Ne vous fiez pas aux apparences laffichage dune bote de En PHP En Java En Visual Basic En Pascal - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 16
dialogue prend une ligne de langage de haut niveau mais des centaines en assembleur Parmi les langages de trs haut niveau se trouvent Java C le PHP ou mme le C en faisant abstraction de certains mcanismes Linconvnient dun langage de haut niveau est quil nest pas toujours possible daller dans les dtails les plus fins b Diverses classifications ct des niveaux tous les langages nont pas le mme but Il nest pas possible de comparer le langage HTML dont le rle est de formater des pages web et le Visual Basic qui permet un dveloppement rapide dapplications graphiques Cest pourquoi il existe dautres classifications dont voici un bref chantillon gnraliste ou spcialis objet ou procdural typ ou non typ cf chapitre sur les variables interprt ou compil etc Certains langages sont spcialiss Le HTML est spcialis dans la conception de pages web statiques son excution a comme rsultat direct laffichage dune page HTML quil a mis en forme Le SQL est un langage de base de donnes il permet de grer des enregistrements de donnes Le Javascript est un langage qui permet de programmer des pages web dynamiques du ct du navigateur web tandis que le PHP bien que devenu gnraliste ou ASP permettent de programmer des sites web dynamiques mais cette fois du ct du serveur Certains langages peuvent faire appel dautres langages Vous pouvez parfaitement faire du SQL dans du PHP si votre site doit accder une base de donnes c Compil ou interprt Une autre distinction prendre en compte est la diffrence entre un langage interprt et un langage compil Un langage est dit compil quand le programme source sous forme de texte est tout dabord lu et trait par un autre programme appel compilateur qui le convertit en langage machine directement comprhensible par lordinateur Vous tapez votre programme vous lancez la commande de compilation et enfin vous obtenez un fichier excutable un exe sous Windows par exemple que vous pouvez le cas chant lancer comme nimporte quel autre programme en langage machine Un programme en langage interprt ncessite pour fonctionner un interprte ou interprteur qui est un autre programme qui va traduire directement au fur et mesure de son excution votre programme en langage machine un peu comme un vrai interprte qui dans un interview traduit simultanment langlais en franais Le programme est souvent un fichier texte et linterprte analyse la syntaxe de celuici avant de le drouler dynamiquement Un programme interprt sera plus lent quun langage compil cause de la conversion dynamique du programme alors que cette tape est dj effectu lavance avec un langage compil Au contraire la correction des erreurs est plus simple avec un langage interprt Linterprte va vite vous indiquer au cours de lexcution o se trouve lerreur de syntaxe mais pas de logique lorsquil va la rencontrer quelle ligne linstruction en cause ventuellement une aide supplmentaire Alors quavec un compilateur cest au moment de la compilation souvent longue quapparaissent les erreurs Une fois compil dautres erreurs plus complexes comme les fuites mmoire peuvent apparatre mais il devient difficile den dterminer lorigine il faut alors faire appel dautres programmes spciaux appels dbuggers ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 17
tapes de compilation et ddition des liens en C 3 La machine virtuelle Il existe une tape intermdiaire entre linterprt et le compil la machine virtuelle applicative La machine virtuelle est un programme gnralement un interprteur qui permet disoler lapplication quil doit faire tourner du matriel et mme du systme dexploitation Le programme na thoriquement aucun accs aux spcificits du matriel lensemble de ses besoins lui tant fourni par la machine vituelle Ainsi tout programme conu pour cette machine virtuelle pourra fonctionner sur nimporte quel ordinateur du moment que la dite machine virtuelle existe pour cet ordinateur Cest en quelque sorte une couche dabstraction ultime Gnralement le programme fonctionnant depuis la machine virtuelle a dj subi une premire phase de compilation pour le transformer non pas en langage machine propre lordinateur mais dans un langage quotmachine virtuellequot pour ainsi dire que lon nomme bytecode Ce bytecode pourra tre interprt par la machine virtuelle ou plutt et ceci de plus en plus rgulirement compil la vole juste au moment de son utilisation technologie JIT Just in Time Ainsi dans certaines circonstances le programme fonctionne presque aussi vite quun programme compil pour une machine cible Un exemple de langage utilisant une machine virtuelle est Java - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 18
Gnration et excution de bytecode Java Pour implmenter vos algorithmes il vous faut trouver un langage simple de haut niveau gnraliste mais vous permettant par la suite dvoluer vers des applications plus complexes et compltes Dans un esprit douverture et de compatibilit il serait intressant que ce langage ne soit pas disponible uniquement sous Windows et que si possible 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 dexploitation est disponible sous la forme de Mono qui propose la plupart des lments de NET Mais certains de ceuxci sont protgs par des brevets les brevets logiciels ne sont pas valides en Europe et ny sont pas tous intgrs Aussi il existe les programmes en C qui pourraient ne pas fonctionner avec Mono Il faut donc temporairement mettre ce langage lcart 4 Java a Les avantages 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 systmes dexploitation pour que tout programme Java fonctionne sans aucune modification Cest le cas Dvelopp originellement par Sun Microsystems le langage Java sa machine virtuelle et tout son environnement ce quon rsume par la quotTechnologie Javaquot sont disponibles pour Windows mais aussi pour MacOS Linux et la plupart des autres Unix Solaris AIX HPUX Tru64 etc Tout programme en Java fonctionnera sur tous ces systmes Mieux si vous tes amateur de libert et de logiciels libres sachez que la version 7 prvue en 2008 sera la premire version disponible sous licence GPL 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 httpjavasuncomjavasedownloadsindexjsp Quand cela sera possible chaque algorithme prsent par la suite sera implment programm en Java Pourquoi ce langage estil intressant pour les dbutants ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 19
Il est gratuit Il est disponible pour beaucoup de machines et de matriels Tout programme Java fonctionnera sur toutes les machines virtuelles sans modification Il est indpendant de la plateforme Il existe de nombreux diteurs et IDE Integrated Development Environment supportant ou tant spcialiss pour Java Il est utilis par des millions de personnes Il dispose dune immense collection de bibliothques rpondant presque tous les besoins Il est mme possible de programmer des jeux en 3D de type commercial Il est lun des piliers du web grce aux fameuses applets aux servlets mais permet la programmation dapplications trs compltes 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 Java le fait pour vous Il est driv du langage C sans ses complications Un programmeur C et C peut facilement comprendre Java de mme quun programmeur Java pourra apprendre plus facilement le C Il est objet notion qui sera sommairement tudie en fin douvrage Il peut fonctionner tant en mode texte depuis une console MSDOS ou un shell MacOSUnix quen mode graphique Il est rapide grce au principe du JIT ou de compilation la vole Sil faut citer un seul dfaut de Java mais pas forcment le seul rien nest parfait cest quil est plutt gourmand en ressources de la machine surtout la mmoire Pour les exemples de ce livre videmment cela ne se ressentira pas Mais si vous commencez dvelopper de trs gros programmes alors un excs de mmoire ne sera pas inutile 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 geditkedit sous Linux etc Il existe cependant un trs bon diteur dvelopp en Java destin aux programmeurs Vous le trouverez ladresse httpwwwjeditorg videmment il vous faut aussi le ncessaire pour compiler en bytecode et excuter vos programmes la machine virtuelle Sur le site de Sun vous pouvez tlcharger deux versions le JDK et le JRE Le JDK Java Development Kit est celui que vous devez tlcharger contenant tout le ncessaire pour concevoir et excuter vos programmes Par contre une fois votre programme compil vous pouvez nutiliser que le JRE Java Runtime Environment ce qui pourrait se traduire par environnement dexcution Java Il ne sert rien dinstaller les deux en mme temps sur la mme machine puisque le JDK inclut le JRE b Un premier programme Java Le premier programme Java que vous allez taper compiler et lancer est le fameux quotHello Worldquot dont lalgorithme ne mrite videmment pas dtre expliqu vu que le programme se contente dun simple affichage Le code Java rsultant est le suivant public class HelloWorld public static void mainString args SystemoutprintlnquotHello worldquot - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 20
Tapez ce programme et placezle dans un fichier appel HelloWorldjava Cest important le nom du fichier doit tre identique au nom indiqu sur la premire ligne du programme juste aprs le mot class auquel vous devez ajouter lextension quotjavaquot Pour compiler le programme ou plutt le transformer en bytecode ouvrez une fentre MSDOS sous Windows ou une console ou terminal shell sous UnixMacOS 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 quotgtquot indique linvite de commande ou prompt de MSDOS ou du shell ne le tapez pas gtjavac HelloWorldjava Le programme javac a d crer dans le rpertoire un fichier appel HelloWorldclass Si ce nest pas le cas vous avez probablement fait une erreur de syntaxe auquel cas javac a affich un message derreur Vous devez enfin excuter votre programme avec la commande java Saisissez en argument le nom du programme HelloWorld sans lextension quotclassquot gtjava HelloWorld Hello world Bravo vous venez de faire fonctionner votre premier programme Java 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 semblent ne servir rien il nen reste quune public class HelloWorld public static void mainString args SystemoutprintlnquotHello worldquot Vous pouvez faire abstraction pour le moment des lignes en italique pour vous concentrer sur ce quil y a entre elles cidessus en gras et qui reprsente le coeur du programme Cependant il peut tre utile de comprendre ce que ces lignes signifient Elles apportent les notions de classe et de mthode rcurrentes dans les langages objet La classe est llment fondamental contenant tous les autres lments de programmation Cest elle qui va contenir les donnes manipules par le programme et les instructions pour les manipuler On appelle aussi 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 fonctions ou mthodes L encore cest plutt fonction qui sera prfr dans ce livre 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 quon peut lui passer quon appelle des arguments ou paramtres lensemble sappelle lentte et dun bloc dinstructions qui contient le programme ou un bout de programme 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 variables et fonctions Dans un programme Java le point dentre de lexcution du programme autrement dit ce qui sera excut en premier est la fonction quotmainquot principale de la classe qui porte le mme nom que le programme Dans lexemple Hello World cest la fonction main de la classe HelloWorld du programme HelloWorld qui sera excute en premier Si tout ceci vous semble compliqu et cest videmment comprhensible et normal sachez que ce livre na pas pour but de vous apprendre Java mais juste de sen servir comme exemple dapplication des algorithmes Les notions de variables et de fonctions seront revues en dtail Ce qui est important ce sont les traitements contenus entre les lignes en italique cestdire en gras selon lexemple cidessus ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U6Bj2EdzIgLAA-enidentnumber 21
La variable 1 Principe Vous savez grce au chapitre prcdent comment lordinateur se reprsente les chiffres et les nombres sous forme de binaire De mme la mmoire de lordinateur compose de cases peut contenir des informations notamment ces fameux nombres En programmation il faut quelque chose de simple pratique et souple manipuler pour reprsenter ces nombres Chaque case de la mmoire est numrote Si la mmoire fait disons 256 octets et que chaque case peut contenir un octet alors il y a 256 cases numrotes de 0 255 On peut donc obtenir la valeur dune case depuis son numro en disant que la case 74 contient la valeur 212 L o a se complique cest que la mmoire de vos ordinateurs atteint un nombre trs important de cases Avec 1 Go de mmoire vous avez 1073741824 cases pouvant contenir chacune un octet Comment voulezvous vous souvenir de chaque numro de case Cest bien entendu impossible Si par contre vous donnez un nom ou une tiquette chaque valeur contenue dans la case ou une suite de valeurs 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 variable reprsente la valeur et se substitut elle La variable est donc la valeur Mais comme son nom lindique cette valeur peut changer dans le temps soit que la variable ne reprsente plus la ou les mmes cases mmoire soit que la valeur de la case a chang Une variable est un nom ou tiquette donn une valeur nombre texte etc Cette valeur peut varier au cours du temps on affecte une nouvelle valeur au nom do le nom de variable Quel nom donner une valeur Le nom que vous voulez et qui si possible est en rapport avec ce que reprsente la valeur Ce peut tre une lettre une association de lettres et de chiffres ou dautres symboles Le formalisme des noms des variables dpend du langage utilis Des fois un caractre spcifique indique le type que vous rencontrerez plus bas de la variable ce quelle peut contenir 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 Si vous pouvez gnralement utiliser un nom de grande taille vitez pour des raisons purement pratiques les noms rallonge Voici quelques exemples de noms de variables a var titre Total Sommeglobale Quand vous programmerez vous veillerez vous renseigner sur les conventions utilises par le langage pour nommer vos variables certains utilisent des syntaxes trs particulires dautres sont beaucoup moins stricts La variable nest quun outil pour les algorithmes et le programmeur afin quil puisse se reprsenter quotdans le relquot les donnes quil manipule Si vous modifiez le nom quotSommeglobalequot par quotPommefritequot partout dans lalgorithme ou le programme la variable reprsentera toujours la mme donne le programme fonctionnera lidentique mais ce sera 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 compilateur ou linterprteur qui fera la conversion des noms vers les adresses des cases mmoire votre place Si vous souhaitez vous quotamuserquot manipuler directement des adresses mmoire non pas par leur nom mais par leur adresse quelques langages le permettent Directement vous pouvez apprendre lassembleur mais vous devrez tre trs courageux et patient sinon des langages comme le C ou le C permettent la manipulation via des quotpointeursquot 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 reprsente tant ladresse que la valeur la valeur a telle adresse mmoire cest source de beaucoup damusement pour le programmeur ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 22
La variable une tiquette associe une valeur en mmoire 2 Dclaration Pour exister une variable doit tre dclare cestdire que vous devez indiquer au dbut de lalgorithme comment elle sappelle et ce quelle doit contenir En effet pour que lalgorithme utilise votre variable il doit dj savoir quelle existe et ce quelle doit contenir Il ne sagit pas ici de dfinir la valeur de la variable vous pourrez le faire dans la suite de lalgorithme en lui affectant une valeur Il sagit de donner son nom et de prciser le type de valeur quelle peut contenir Les variables se dclarent au dbut de lalgorithme avant le programme luimme mais aprs le mot quotVARquot VAR Variable1 type Variable2variable3 type 3 Les types Une case mmoire contient gnralement un octet cestdire une valeur de 0 255 Mais une variable peut trs bien contenir le nombre 214862 le rel 31415926 le texte quotbonjourquot etc Donc une variable nest pas uniquement dfinie par la valeur quelle contient mais aussi par la place que cette valeur occupe et par la manire dont lalgorithme va la reprsenter et lutiliser nombre texte etc Cest le type de la variable Que pouvezvous mettre comme valeur dans une variable En principe tout ce que vous voulez Cependant vous devez tout de mme prciser quel type la valeur reprsente Estce un nombre Si oui un entier sans virgule ou un rel avec virgule Estce du texte Estce un tableau Et ainsi de suite Vous entendrez parfois parler du quotcodagequot de la variable selon le type et la taille de la valeur celleci est encode de manire diffrente dans la mmoire utilisant plus de cases a Les nombres Placer des nombres dans la variable est le plus vident et souvent le plus courant Une case mmoire peut contenir un octet cestdire une valeur comprise entre 0 et 255 28 1 Mais si elle doit contenir une valeur ngative Alors sur les 8 bits un sera rserv au signe et la case mmoire pourra contenir des valeurs de 127 128 On dit alors que la variable est quotsignequot elle peut contenir des valeurs positives et des valeurs ngatives Seulement 8 bits ne sont pas suffisants pour des grandes valeurs Cest pourquoi les nombres peuvent tre placs dans deux cases 16 bits quatre cases 32 bits ou plus Si lordinateur est bien plus laise et bien plus rapide avec des nombres entiers il sait aussi manipuler des nombres 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 ce nest pas si vident Au final lordinateur est capable de grer des nombres de longueur variable signs ou non entiers ou rels Suivant le langage de programmation les types portent des noms diffrents Cependant le C et ses drivs proposent les types suivants Attention car Java fait la diffrence entre le type Byte de un octet et le type Char qui prend deux octets cause du format de codage des caractres en Unicode - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 23
Vous devez choisir quel type numrique utiliser selon vos besoins La voie de la facilit consiste prendre le type le 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 programmer nimporte comment Une liste de mille valeurs comprises entre 0 et 100 cotera 1000 octets soit pas 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 virgule en entier alors que cest dj le cas Quand vous verrez plus bas la formule mathmatique ncessaire vous vous rendrez compte du gchis Utilisez les types qui vont bien avec les valeurs qui vont bien En algorithmique cest bien plus simple Rien ne vous empche de prciser que vous manipulez des entiers ou des rels mais vous pouvez aussi indiquer tout simplement que vous utilisez des variables contenant des valeurs numriques avec le pseudotype quotnumriquequot Vous devrez cependant tre plus circonspect quand vous convertirez votre algorithme en vrai langage de programmation Dune manire gnrale deux types numriques sont utiliss en algorithmique Les entiers nombres sans virgule ngatifs ou positifs Les rels nombres virgule positifs ou ngatifs Les variables se dclarent toutes au dbut de lalgorithme Si durant la rdaction de celuici vous remarquez que vous en avez besoin dautres vous les rajouterez au dbut VAR montantrel sommemoyennerels qte entier Pour les variables contenant des nombres rels ces derniers scrivent avec une vraie virgule comme en franais quot314quot ou avec le point dcimal cependant dans les langages de programmation ce sera bien souvent le point qui sera utilis quot314quot En Java les types portent les mmes noms en anglais des types situs dans le tableau prcdent mais ne dispose pas de types non signs Autrement dit une variable numrique peut contenir des nombres positifs ou ngatifs mais lintervalle de valeurs se trouve quotun peuquot rduite Le seul type non sign est le type char le type caractre pour des raisons videntes que vous verrez plus bas Dans lexemple suivant tous les types numriques classiques de Java sont dclars Les noms des variables sont assez parlants pour les comprendre Puis chaque variable se voit assigne la valeur maximale quelle peut supporter Ce programme amne trois remarques Le rel 32 bits float voit sa dfinition force le compilateur indique une erreur signifiant un risque de perte de prcision autrement Il est aussi possible dajouter un quotDquot la fin pour forcer un double ou un quotFquot pour un float car Java considre les valeurs relles saisies comme tant du type double par dfaut Type numrique Plage de valeurs possibles Byte char 0 255 Entier simple sign int 32 768 32 767 Entier simple non sign 0 65535 Entier long sign long 2 147 483 648 2 147 483 647 Entier long non sign 0 4294967295 Rel simple prcision float Ngatif 340x1038 140x1045 Positif 140x1045 340x1038 Rel double prcision double Ngatif 179x10308 494x10324 Positif 494x10324 179x10308 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 24
Java considre les valeurs entires saisies comme tant 32 bits par dfaut Pour un entier sur 64 bits il faut rajouter un quotLquot la fin qui signifie que cette valeur est un entier long Laffichage de la valeur de PI est tronqu rsultat de la prcision applique sur un rel 64 bits et par Java class chap2types public static void mainString args byte entier8bits short entier16bits int entier32bits long entier64bits float reel32bits double reel64bits entier8bits127 entier16bits32767 entier32bits2147483647 entier64bits9223372036854775807L reel32bits31415927f reel64bits31415926535897932384626433832795028841971d Systemoutprintlnreel64bits Systemoutprintlnentier64bits b Autres types numriques Il existe dautres types numriques moins utiliss tout au moins sur les ordinateurs personnels ou dans des langages de programmation classiques mais bien plus sur des moyens ou gros systmes ou dans des bases de donnes Le systme BCD binary coded decimal pour dcimal cod en binaire est utilis principalement en lectronique car il est assez simple mettre en uvre En BCD chaque chiffre est cod sur 4 bits 00002010 00012110 001022 10 00112310 et ainsi de suite jusqu 10012910 Comme un ordinateur ne manipule que des octets composs de 8 bits il existe deux mthodes pour coder des nombres en BCD soit ne mettre quun chiffre par octet et complter le reste que par des 1 ou des 0 quotEBCDICquot soit mettre deux chiffres par octet et rajouter un signe la fin quotpacked BCDquot Par exemple le nombre 237 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 quotmontairequot 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 exprims sous le nom quotdatequot Lordinateur de type PC stocke les dates de diverses manires la plus commune tant sous la forme dun timestamp une valeur signifiant le temps coul depuis une date prcise Ce timestamp est souvent celui du systme Unix qui reprsente le nombre de secondes coules depuis le 1er janvier 1970 minuit UTC exactement Cest donc un entier et le langage doit fournir des instructions pour convertir cette valeur en date relle c Les caractres Si un ordinateur ne savait manipuler que les nombres vous ne seriez pas en train de lire ce livre crit laide dun traitement de texte OpenOfficeorg qui lui manipule toute sorte de caractres chiffres lettres caractres spciaux etc Une variable peut aussi contenir des caractres Suivant les livres et sites Internet vous trouverez les types quotAlphanumriquequot quotCaractrequot quotChanequot quotStringquot Ainsi une variable peut stocker votre nom une ligne complte de texte ou tout ce que vous voulez qui ncessite une reprsentation alphanumrique On appelle dailleurs une suite de caractres alphanumrique une chane de caractres Si vous devez reprsenter un seul caractre utilisez le type quotcaractrequot Pour une chane utilisez le type quotchanequot VAR textechane carcaractre - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 25
Quelle place occupe une chane de caractre En principe un caractre occupe un octet chaque valeur comprise entre 0 et 255 est associ un caractre Cest le principe de lASCII quotAmerican Standard Code for Information Interchangequot 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 Or la table ASCII peut contenir 256 caractres Les 128 autres huitime bit un contiennent des caractres semigraphiques et des caractres spcifiques certaines langues typiquement le franais pour les caractres accentus On parle alors de page de code ou de charset Ces pages font lobjet dune normalisation par exemple la norme ISO 885915 qui est la page dEurope de lOuest avec le caractre de leuro quotquot Dans la plupart des langages ce codage sur un octet suffit et ainsi une chane de caractres de 50 caractres occupe 50 octets En pseudocode algorithmique les chanes de caractres sont places entre guillemets pour deux raisons Java dispose dun type spcial pour les chanes de caractres appel quotStringquot Lexemple suivant montre deux moyens de placer du texte dans une chane Il est possible de le faire ds la dclaration de la variable cest dailleurs possible directement pour la plupart des types soit ensuite par affectation class chap2string1 public static void mainString args String textequotHello World quot String text2 text2quotBonjour les amisquot Systemoutprintlntexte Systemoutprintlntext2 d Le type boolen Pour dterminer si une affirmation est vraie ou fausse lordinateur doit se baser sur le rsultat de cette affirmation En informatique on emploie plus volontiers la notion dexpression et dvaluation de cette expression Une expression peut tre dcrite comme tant tout ce qui peut fournir une valeur que lordinateur peut dterminer stocker valuer Par exemple laffirmation quotagtbquot selon laquelle a est suprieur b Si a vaut 3 et b vaut 2 laffirmation est vraie Si maintenant a vaut 1 et b vaut 2 laffirmation est fausse Dans les deux cas quotagtbquot est une expression qui vaut soit vrai soit faux Cest le cas le plus simple mais aussi le plus courant et le plus pratique comme vous le verrez lors des tests et des conditions 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 Tout ce qui retourne un rsultat diffrent de zro 0 est considr comme tant vrai donc si le rsultat vaut zro 0 alors il sera considr comme faux Avant de considrer cette dfinition comme exacte renseignezvous tout de mme car certains langages comme linterprteur de commande Unix font linverse Cependant dans des langages comme Java ou le C 1 est vrai 0 est faux Pour reprsenter les valeurs vrai et faux il suffit de deux chiffres 0 et 1 Combien fautil de place pour stocker ces deux valeurs Un seul bit En pratique les langages grent les boolens de plusieurs manires Certains crent des quotchampsquot de bits dans un mme octet dautres utilisent un octet complet etc Cependant plusieurs langages proposent le type boolen trs pratique Dans la pratique ces langages proposent des constantes des variables qui prennent une valeur une fois pour toute spciales pour reprsenter les valeurs vrai et faux TRUE pour vrai FALSE pour faux 1 viter une ambigut entre les nombres sous forme de chane de caractres et les nombres au format numrique Certains langages ne font certes pas directement la diffrence cest selon le contexte dutilisation mais avec dautres cest catastrophique La suite de caractres 123 reprsentetelle le nombre 123 et stocke ainsi en mmoire sous forme binaire dans un octet de la mmoire ou la chane quot123quot stocke ainsi en mmoire sous forme de codes ASCII soit un pour chaque caractre Les guillemets vitent les erreurs dinterprtations 2 Ne pas confondre le nom de la variable avec son contenu notamment lors dune affectation Ainsi quand vous affecterez un valeur une variable si celleci est entre guillemets vous lui affecterez une chane de caractres si cest un nombre ce sera ce nombre sachant que le nom dune variable ne peut pas tre constitu uniquement de chiffres et enfin si ce nest ni une chane ni un chiffre cest une variable Dans ce cas la premire variable recevra comme valeur celle de la seconde qui lui est affecte Ne pas respecter ce principe est une cause derreur grave et nanmoins commune ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 26
Ces constantes peuvent mme tre utilises directement pour valuer une expression Telle expression estelle vraie telle autre estelle fausse Suivant le langage il faudra faire attention si les constantes existent et sont en minuscules ou majuscules VAR Testboolen Java dispose aussi dun type spcial pour les boolens appel quotBooleanquot 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 true et false lexcution les valeurs true et false seront affiches en toutes lettres Remarquez ici une nouvelle proprit la dclaration des variables il est possible tout comme en pseudocode de mettre plusieurs variables et daffecter aussi plusieurs valeurs en sparant les variables par des virgules class chap2boolean public static void mainString args Boolean b1true b2false b3 b3true Systemoutprintlnb1 Systemoutprintlnb2 Systemoutprintlnb3 Il nest pas possible en Java de convertir directement un boolen en entier et vice versa 4 Affectation a Affectation de valeurs Pour donner une valeur une variable il faut passer par un processus daffectation laide dun oprateur En pseudocode on utilise le symbole daffectation gauche de ce symbole vous placez le nom de la variable droite la valeur Vous trouverez aussi dans certaines reprsentations algorithmiques le issu du Pascal Les deux sont quivalents et utilisables mais vitez de les mlanger pour sy retrouver Voici quelques exemples daffectations en pseudocode PROGRAMME AFFECTATION VAR aentier bcrels titrechane vraiboolen DEBUT a10 b31415927 c12345 titrequotma premire affectationquot vraiTRUE FIN Vous avez videmment rencontr dans les programmes Java prcdents comment affecter une valeur une variable Cest le signe quotquot qui est utilis Lemploi du signe quotquot en pseudocode na pas la mme signification ce que vous verrez un peu plus loin dans les oprateurs de comparaison Attention cependant ne pas vous tromper entre le type de la variable et la valeur que vous lui affectez Cest une cause derreur frquente tant en pseudocode algorithmique que dans un vrai langage Dans certains cas a pourra marcher dans le sens o lordinateur ne retournera pas forcment une erreur mais le rsultat ne sera pas celui attendu Considrez lexemple pas correct suivant PROGRAMME AFFECT2 VAR aentier Dans le programme - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 27
brel cchane DEBUT b31415927 a31415927 c12345 FIN Lexcution de ce pseudocode provoque quelques surprises et des erreurs Tout dabord b reoit la valeur de PI et comme b est dclar en rel pour lexemple le type classique Numrique naurait pas t pertinent cest correct Puis a reoit la mme chose Or a est un entier Suivant les langages de programmation vous obtiendrez soit une erreur soit a fonctionnera mais pas parfaitement La variable a tant un entier il se peut que a ne contienne que la valeur entire de b soit 3 Notez que certains langages autorisent une conversion explicite dun type vers un autre On parle de transtypage Quant la variable c elle doit contenir une chane de caractres dlimite par des guillemets absents ici ce qui provoquerait probablement une erreur Le code Java suivant ne fonctionne pas Sauriezvous deviner maintenant pourquoi class chap2equal1 public static void mainString args int ia double fa fa31415927 ia31415927 Systemoutprintlnfa Systemoutprintlnia Voici la rponse donne par le compilateur javac chap2equal1java7 possible loss of precision found double required int ia31415927 1 error Le transtypage en Java consiste indiquer entre parenthses avant la valeur affecter le type final de celleci La valeur sera convertie si possible dans ce type avant dtre affecte Java ne permet pas de faire nimporte quoi et le transtypage doit suivre une certaine logique du genre on ne peut pas convertir directement une chane de caractres en entier De mme le transtypage notamment vers le bas dun type de grande taille vers une taille rduite risque de provoquer une perte de prcision voire mme dun grand nombre dinformations Dans cet exemple fa est explicitement convertie en entier Java ne va donc conserver que la partie entire de fa et ia contiendra 3 class chap2equal2 public static void mainString args int ia double fa fa31415927 iaint31415927 Systemoutprintlnfa Systemoutprintlnia Ce qui retourne 31415927 3 Afin de ne pas vous faire taper sur les doigts par votre professeur dalgorithmique prcisez le bon type ds le dbut et vitez les affectations douteuses Vous avez le droit de donner une valeur initiale ou par dfaut une variable lors de sa dclaration Dans ce cas vous devez utiliser loprateur daffectation lors de la dclaration Dans la dclaration ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 28
PROGRAMME DECLARE2 VAR a10entier b35c82347rels titrequotMon titrequotchane vraiVRAIboolen DEBUT Afficher a FIN Avec une valeur par dfaut la variable dispose dj dun contenu ds son initialisation et peut tre directement utilise Cest la mme chose en Java class chap4init2 public static void mainString args int i1cpt2resultat3 Systemoutprintlni b Affectation de variables Le principe est exactement le mme sauf que cette fois vous ne mettez pas de valeur droite mais une autre variable ce qui a pour effet daffecter la variable de gauche la valeur de la variable de droite PROGRAMME AFFECT3 VAR abentiers DEBUT a10 ba FIN L encore vous prendrez bien soin de ne pas mlanger les torchons et les serviettes en naffectant pas des variables de types incompatibles Lexemple suivant est videmment faux PROGRAMME AFFECT4 VAR aentier b rel DEBUT b31415927 ab FIN L encore noubliez pas une ventuelle conversion dans un vrai langage et de dclarer correctement vos variables dans le bon type Lexemple Java suivant ne devrait pas vous poser de problmes de comprhension class chap2equal3 public static void mainString args int a10bc double r131415927 r2 String txt1quotHello Worldquot txt2 ba r2r1 cintr2 txt2txt1 Systemoutprintlnr2 Systemoutprintlnc Systemoutprintlntxt2 Note on ne peut pas affecter de variable une autre variable lors de sa dclaration - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 29
5 Saisie et affichage Pour simuler laffichage dun texte ou dune valeur sur lcran il faut utiliser la pseudoinstruction quotAfficherquot qui prend sa suite une chane de texte ou une variable Si vous mlangez du texte et des variables sparez ceuxci par des virgules laffichage les virgules seront remplaces par des espaces PROGRAMME AFFICHE VAR aentier textechane DEBUT a10 textequotHello Worldquot Afficher a Afficher texte Afficher quotBonjour les amisquot FIN Pour inviter un utilisateur rentrer au clavier une valeur utilisez le mot Saisir Lalgorithme attendra alors une entre au clavier qui sera valide avec la touche dentre La valeur que vous saisissez sera place dans la variable indique la suite de quotSaisirquot PROGRAMME SAISIE VAR reponsechane DEBUT Afficher quotQuel est votre nom quot Saisir reponse Afficher quotVous vous appelezquotreponse FIN Si vous devez saisir plusieurs valeurs placer chacune dans une variable vous pouvez utiliser plusieurs quotSaisirquot mais plus simplement placez les diverses variables la suite dun unique Saisir spares par des virgules Lutilisateur devra alors saisir plusieurs valeurs selon le langage final les unes la suite des autres spares par des espaces ou en appuyant sur la touche Entre aprs chaque saisie PROGRAMME SAISIEMULTIPLE VAR nomprenomchanes DEBUT Afficher quotQuels sont vos noms et prnoms quot Saisir nomprenom FIN Vous avez dj remarqu depuis le premier chapitre quen Java les exemples utilisent quotSystemoutprintlnquot pour afficher quelque chose dans la console MSDOS ou dans le shell UnixMacOS Cest une syntaxe un peu complique qui trouve sa logique dans le principe de lobjet qui sera abord dans le dernier chapitre Java est en effet avant tout un langage permettant de manipuler des composants graphiques fentres botes de dialogue etc Voyez ce quil est ncessaire de faire pour saisir du texte au clavier depuis la console dans lexemple suivant import javaio class chap2saisie public static void mainString args String txt BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotEntrez votre textequot txtsaisiereadLine SystemoutprintlnquotVous avez saisi quot Systemoutprintlntxt catchException excp SystemoutprintlnquotErreurquot ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 30
6 Les constantes Vous pouvez dcider de donner une valeur une variable et que cette valeur ne doit pas changer elle doit rester fixe dans le temps et inaltrable pour toute la dure du programme Sa valeur doit rester constante Do son nom Une constante est une valeur reprsente tout comme une variable par une valeur qui ne peut pas tre modifie aprs son initialisation Elle est immuable Un exemple de constante pourrait tre la valeur de PI Une constante se dclare gnralement avant les variables sous le motcl CONST Elle est aussi dun type donn Certains langages de programmation passent parfois outre du type de la constante PROGRAMME CONSTANTE CONST PI31415927rel VAR R5entier Airerel DEBUT Aire2PIR Afficher Aire FIN Une constante sutilise exactement comme une variable sauf quelle ne peut pas recevoir de valeur En java une constante est aussi appele variable finale dans le sens o elle ne peut plus tre modifie Elle est dclare avec le motcl quotfinalquot class chap2cercle2 public static void mainString args final double PI31415926 double rsurfaceperimetre r52 surfacePIrr perimetre2PIr Systemoutprintlnsurfacequot quotperimetre - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02zCB30dzIgLAA-enidentnumber 31
Oprateurs et Calculs 1 Les affectations Le symbole daffectation quotquot fait partie dune grande famille celle des oprateurs Comme son nom lindique un oprateur est utilis pour et dans des oprations Le symbole quotquot est un oprateur daffectation Il existe plusieurs oprateurs qui servent aux calculs affectations comparaisons rotations de bits groupages etc 2 Les oprateurs arithmtiques Pour que les algorithmes puissent effectuer des calculs il faut pouvoir au moins faire des oprations simples Vous utiliserez pour cela les symboles suivants addition soustraction ou x multiplication il est plus facile dcrire un x pour fois quune toile division ou mod modulo DIV La division entire Rappel un modulo est le reste dune division entire Par exemple 152 vaut 7 mais il reste 1 On dit que 15 modulo 2 vaut 1 Ces oprateurs sont dits binaires car ils sutilisent avec deux valeurs une avant le symbole et une aprs Les valeurs avant et aprs peuvent tre des donnes de mme type que la variable qui reoit les rsultats ou des variables Voici un exemple doprations dans un simple algorithme qui calcule la surface et le primtre dun cercle PROGRAMME CERCLE VAR r PI surfaceperimetrerels DEBUT PI31415927 r52 surfacePI r r perimetre2 PI r Afficher surfaceperimetre FIN Ici il ny a que des multiplications Vous pouvez dj remarquer que vous avez parfaitement le droit de chaner vos calculs et de mlanger les donnes et les variables Simulez les deux calculs surfacePI r r surface31415927 52 52 surface84948666608 perimetre2 PI r perimetre2 31415927 52 perimetre3267256408 En java class chap2cercle public static void mainString args ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 32
double pirsurfaceperimetre pi31415927 r52 surfacepirr perimetre2pir Systemoutprintlnsurfacequot quotperimetre Il est possible de grouper les calculs avec des parenthses quotquot Cellesci influent sur la priorit des calculs Vous vous rendrez compte en effet que les oprateurs ont des degrs de priorit diffrents Par exemple une multiplication est quotplus fortequot quune addition Prenez lexemple suivant PROGRAMME PRIORITE VAR xyztotalentiers DEBUT x3 y4 z5 totalx y z Afficher total FIN Que vaudra total Si vous effectuez le calcul de gauche droite vous obtenez 347 7535 Si vous faites ceci avec votre calculatrice vous nobtiendrez pas ce rsultat car la multiplication a un ordre de priorit plus lev que laddition Lordinateur va dabord faire 4520 puis 32023 Le rsultat est donc 23 Si vous souhaitez indiquer lalgorithme et donc ensuite dans un vrai langage une modification des priorits vous devez utiliser les parenthses PROGRAMME PRIO2 VAR xyztotalentier DEBUT x3 y4 z5 totalx y z Afficher total FIN Cette fois vous obtenez le rsultat 345 ce qui vaut 35 Voici lquivalent en Java qui regroupe les deux cas class chap2prios public static void mainString args int xyztotal x3 y4 z5 totalxyz Systemoutprintlntotal totalxyz Systemoutprintlntotal Voici un simple algorithme pour calculer les rsultats dune quation du second degr Une quation du second degr est de la forme ax2bxc0 - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 33
Pour rsoudre une telle quation il faut calculer un quotdiscriminantquot sous la forme b2-4ac Suivant la valeur du discriminant les rsultats varient si gt0 il y a deux solutions si 0 il ny a quune seule solution si lt0 lquation na pas de solution Pour lexemple lalgorithme part du principe que lquation est volontairement pose comme ayant deux solutions Il sera complt dans le prochain chapitre consacr aux tests Les rsultats dune quation du second degr sont appels les racines Pour les calculer il faut utiliser les oprations suivantes et Pour la racine carre vous utiliserez dans lalgorithme la syntaxe quotracinexquot o racine est une fonction mathmatique qui calcule la racine carre de x Cest un peu lquivalent des fonctions dun tableur vous verrez dans ce livre comment crer vos propres fonctions PROGRAMME EQUATION VAR abcdeltax1x2 rels DEBUT a3 b6 c-10 delta b b - 4 a c x1 -b racinedelta 2 a x2 -b - racinedelta 2 a Afficher quotles rsultats sont quot Afficher quotx1quotx1 Afficher quotx2quotx2 FIN En Java notez lutilisation de fonctions mathmatiques intgres comme sqrt racine carre class chap2equation public static void mainString args double abcdeltax1x2 a3 b6 c-10 deltabb-4ac x1-bMathsqrtdelta2a x2-b-Mathsqrtdelta2a Systemoutprintlnquotles rsultats sont quot Systemoutprintlnquotx1quotx1 Systemoutprintlnquotx2quotx2 Quelques langages admettent des oprateurs arithmtiques unaires cestdire qui ne prennent quune valeur x incrmente de 1 la variable x x idem mais aprs lutilisation en cours x dcrmente de 1 la variable x ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 34
x idem mais aprs lutilisation en cours Cette criture peut surprendre Voici un exemple PROGRAMME UNAIRE VAR aentier DEBUT a1 Ecrire a Ecrire a Ecrire a FIN Le premier affichage indique 2 la variable a est incrmente avant son utilisation Le deuxime indique 2 aussi la variable a est incrmente aprs son utilisation Le dernier indique 3 Note les oprateurs et peuvent aussi tre utiliss comme oprateurs unaires placs avant un scalaire ou une variable le signe quotquot donnera loppos de cette valeur 1 est gal 1 3 Les oprateurs boolens Les oprateurs ne permettent pas que de faire des calculs Dans une expression un oprateur peut aussi effectuer des valuations de boolens Vous avez vu que pour lordinateur tout ce qui est vrai est diffrent de 0 ce qui est faux valant 0 Comment alors faire si deux expressions sont lune vraie 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 les deux en mme temps etc Loprateur ET indique que les deux expressions situes avant et aprs doivent tre toutes les deux vraies pour que lensemble le soit aussi Loprateur OU indique que seule lune des deux expressions que ce soit celle situe avant ou celle situe aprs doit tre vraie pour que lexpression complte soit vraie aussi Le NON est la ngation Si lexpression tait vraie elle devient fausse et vice versa Les oprateurs boolens sont rgis par la logique boolenne du nom de linventeur non pas de la logique ellemme mais des travaux de George Boole qui au XIXme sicle a restructur toute la logique en un systme formel que lon peut interprter avec des mots des phrases comprhensibles Prenez les deux expressions quotIl fait beau et le soleil brillequot La premire expression quotil fait beauquot est vraie sil fait vraiment beau La seconde expression quotle soleil brillequot est vraie si le soleil brille vraiment Si les deux expressions sont vraies alors lexpression globale est vraie Par contre quotIl a neig et il fait beauquot Sil a neig cette premire expression est vraie Cependant sil ne fait pas beau la seconde expression est fausse Lensemble est donc faux dans le cas contraire chaussez vos skis Les trois oprateurs logiques ET OU et NON peuvent tre simplement compris laide de petits tableaux appels parfois quottables de vritquot Exp1 et Exp2 sont des expressions boolennes vraies ou fausses Par exemple lexpression a1 est vraie si a vaut vraiment 1 ET - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 35
Table de vrit ET Ce tableau est comprendre ainsi si Exp1 est vraie et Exp2 est vraie alors lensemble est vrai On dit plus gnralement que Exp1 ET Exp2 est vrai Dans le cas du ET lensemble est vrai uniquement si les deux expressions sont vraies lune ET lautre Dans les autres cas comme au moins lune des deux est fausse alors le rsultat total est faux OU ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 36
Table de vrit OU Dans le cas du OU au moins lune des deux expressions doit tre vraie pour que lensemble soit vrai Seule une seule assertion est donc fausse dans le cas o les deux expressions sont fausses toutes les deux NON Table de vrit NON - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 37
Le NON est trs facile comprendre puisque lexpression boolenne est inverse ce qui tait vrai devient faux et vice versa Dans quel cas les oprateurs boolens sontils utiles Dans les expressions utilises dans des conditions excuter une action selon tel ou tel critre quand ces conditions sont multiples Par exemple si vous voulez excuter une action uniquement si deux variables a et b sont vraies contiennent autre chose que 0 PROGRAMME ET1 VAR abentiers resultboolen Dbut a1 b2 resulta ET b Afficher result Fin Notez que lalgorithme cidessus ne vrifie pas si a vaut 1 et b vaut 2 Il effectue lopration logique quota ET bquot Comme les variables a et b sont toutes les deux diffrentes de 0 elles sont considres comme vraies Donc la variable result contient quotVRAIquot et saffichera ainsi si le langage le permet ou sous forme de la valeur 1 4 Les oprateurs de comparaison Lalgorithme cidessus ne vrifie pas les valeurs des variables Il faut pour cela utiliser dautres oprateurs Pour valuer une expression il faut parfois avoir besoin de comparer des valeurs Comment savoir si un utilisateur de votre logiciel a rpondu oui ou non votre question Comment savoir si le chiffre saisi dans le jeu du lancer de d correspond au bon rsultat Vous allez devoir utiliser les oprateurs de comparaison Il y en a plusieurs Ceuxci sont 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 forme de variable Lordinateur valuera le rsultat de cette comparaison sous forme boolenne le rsultat sera vrai ou faux Les langages ragissent diffremment selon les comparaisons et les types des donnes compares L encore prenez garde ne pas mlanger les types Aussi si en pseudocode algorithmique les chanes de caractres peuvent tre compares avec tous les oprateurs prenez garde linterprtation qui en est faite par les langages En C notamment et entre autres il faut passer par des fonctions spcialises a Lgalit Loprateur dgalit scrit avec le signe quotquot et sert vrifier si les deux valeurs droite et gauche sont identiques cestdire quelles ont la mme valeur Dans cet exemple lexpression ab est vraie mais ac est fausse PROGRAMME EGALE VAR abcentiers DEBUT a5 b5 c10 Afficher ab Afficher ac FIN Il ne faut surtout pas confondre tant en algorithmique que dans les langages de programmation loprateur daffectation quotquot et loprateur dgalit quotquot En mathmatique et en langage courant ab peut avoir deux significations soit a reoit la valeur de b soit on cherche vrifier si a et b sont gaux Laquelle est la bonne Dans un langage comme le BASIC linterprtation du signe dpend du contexte Avec une variable avant et hors contexte de condition cest une affectation Dans une expression conditionnelle cest une comparaison Dur de sy retrouver Cest pour a que certains langages comme C C Java ou encore PHP utilisent loprateur dgalit quotquot deux fois gal pour ne pas le confondre avec loprateur daffectation quotquot Dans ces langages ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 38
abc est une expression valable qui signifie que a reoit la valeur de b qui ellemme reoit la valeur de c La variable b est affecte en premier puis a Les trois variables disposent de la mme valeur la fin abc est aussi une expression valable Le quotquot est prioritaire sur le quotquot et bc est faux car 5 et 10 sont diffrents Faux vaut 0 La variable a reoit le rsultat de lexpression ab donc a reoit 0 Lexpression totale est fausse elle vaut zro Si vous aviez eu cab La valeur de a est gale celle de b donc lexpression quotabquot est vraie et vaut 1 Donc c vaut 1 et lexpression est vraie Nuance b La diffrence Loprateur de diffrence est dcrit par les symboles quotquot ou quotquot point dexclamation et gal quil faut comprendre comme la ngation voir oprateur boolen de lgalit Vous trouverez parfois quotltgtquot comme quivalent de infrieur ou suprieur si cest infrieur ou suprieur alors ce nest pas gal Attention une expression quotabquot est vraie si la valeur de a est diffrente de b PROGRAMME DIFF VAR abentiers DEBUT a10 b20 Afficher ab Afficher NONab FIN Les rsultats de cet algorithme sont identiques Les valeurs de a et de b sont diffrentes Dans le premier cas quotabquot est vrai Dans le second cas quotabquot est faux mais la ngation de ce rsultat est vraie c Infrieur suprieur Quatre oprateurs permettent de comparer des valeurs infrieures et suprieures avec ou sans galit lt infrieur ou lt infrieur ou gal gt suprieur ou gt suprieur ou gal La comprhension de ces quatre oprateurs ne doit pas poser de problme Le rsultat est vrai si la valeur de gauche est infrieure infrieure ou gale suprieure suprieure ou gale la valeur de droite PROGRAMME INFSUP VAR abcentier DEBUT a10 b10 c20 Afficher altc Afficher altb Afficher cgtb Afficher cgtc - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 39
Afficher NONclta Afficher cgta FIN Les quatre premires expressions dcrivent parfaitement les rsultats attendus elles sont toutes vraies Les deux dernires sont fausses et parfaitement quivalentes Si la valeur de c nest pas infrieure ou gale a elle lui est forcment suprieure Cest encore ici une proprit de lalgbre de Boole 5 Le cas des chanes de caractres Vous pouvez en pseudocode algorithmique utiliser les oprateurs de comparaison avec des chanes de caractres La comparaison seffectue alors en fonction de lordre alphabtique des chanes de caractres Cet ordre est tabli en fonction de la numrotation des caractres dans la table ASCII ou la page Unicode Dans cet exemple txt2 est suprieur txt1 dans le sens o dans un tri alphabtique des deux le b est situ aprs le a PROGRAMME TXT VAR txt1txt2chanes DEBUT txt1quotaquot txt2quotbquot Ecrire txt2gttxt1 FIN Ces oprateurs appliqus des chanes de caractres sont un bon exemple de ce qui peut se passer si par hasard vous vous trompez dans les types et les affectations Dans lexemple suivant les deux chanes quot1111quot et quot2quot sont compares ainsi que les deux entiers de mme valeur Lesquelles sont les plus grandes PROGRAMME TXTCOMP VAR xy entiers txt1txt2chanes DEBUT x1111 y2 Afficher xgty txt1quot1111quot txt2quot2quot Afficher txt1gttxt2 FIN Dans le premier cas lexpression est vraie Dans le second elle est fausse Il est possible dadditionner des chanes de caractres Le rsultat en est la concatnation des deux chanes Il nest par contre pas possible dutiliser les autres oprateurs arithmtiques Vous pouvez utiliser loprateur quotampquot ou quotquot pour concatner cependant le premier est prfrable PROGRAMME CONCAT VAR txt1txt2chanes DEBUT Afficher quotComment vous appelez-vous quot Saisir txt1 txt2quotVous vous appelez quotamptxt1 Afficher txt1 FIN ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ZRxb50dzIgLAA-enidentnumber 40
Pour aller plus loin 1 Les nombres ngatifs Un nombre sign par exemple sur 8 bits contient un bit rserv pour le signe Cest en tout cas ainsi quon vous le prsente pour plus de comprhension Gnralement cest le bit de poids fort le plus gauche qui sert pour le signe 0 le nombre est positif 1 il est ngatif Par exemple 910 devrait tre reprsent par 100010012 Cette reprsentation pratique pour le lecteur ne lest cependant absolument pas pour lordinateur Additionnez 9 et 30 vous obtenez 21 En binaire 30 quivaut 00011110 Le binaire sadditionne comme le dcimal 1110 donc retenue de 1 et ainsi de suite 00011110 30 10001001 -9 10100111 -39 Il y a un problme Vous devriez obtenir 21 soit 00010101 Cest quen ralit un nombre ngatif nest pas reprsent comme ceci Lordinateur quotrusequot avec les manipulations binaires Lastuce consiste prendre le complment un de la valeur binaire en valeur absolue 9 gt 9 et de lui rajouter un on obtient au final un complment deux Le complment un consiste remplacer tous les zros 0 par des un 1 et tous les 1 par des 0 11111111 complment un 00001001 9 11110110 tout est invers 00000001 1 11110111 quivaut -9 reprsentation machine Remarque Si vous additionnez un nombre avec son complment deux vous obtenez 0 plus une retenue Maintenant additionnez ce rsultat 30 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 nativement en interne toutes ces valeurs matriellement 2 La reprsentation des nombres rels Sil est simple de se reprsenter un nombre entier en binaire cela semble plus complexe avec un nombre virgule En effet le principe mme du binaire veut que chaque valeur reprsente une puissance de 2 en fonction de sa position de 0 n donc une valeur entire En plus les nombres rels nont jamais la mme taille plus ou moins de chiffres avant 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 Prenez un exemple simple 12 1212x0112x10- 1 12E-1 En vritable notation scientifique on crit 12E0 soit 12x100 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 1821957 182195182195x0001182195x10- 3 182195E-3 ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE05wL8EdzIgLAA-enidentnumber 41
En vritable notation scientifique on crit 182195E2 soit 182195x102 Cest le principe de la notation scientifique quil va falloir retenir mais en binaire pas en dcimal Le microprocesseur ne manipule pas de puissances de 10 mais de 2 Aussi il faut trouver selon le mme principe un moyen de transformer tout ceci en binaire Dans la partie avant la virgule ce sont des puissances de 2 positives 20 21 22 etc Aprs la virgule il faut passer en puissances de 2 ngatives 21 22 23 etc La premire partie ne pose aucun problme 18210 101101102 La seconde partie est plus dlicate Elle se base sur les puissances ngatives de 2 Pour rappel mathmatique 2 1121 22122 etc 0195x20390 lt1 on pose 0 00 0390x20780 lt1 on pose 0 000 0780x21560 gt1 on pose 1 0001 0560x21120 gt1 on pose 1 00011 0120x20240 lt1 on pose 0 000110 0240x20480 lt1 on pose 0 0001100 0480x20960 lt1 on pose 0 00011000 0960x21920 gt1 on pose 1 000110001 0920x21840 gt1 on pose 1 0001100011 0840x21680 gt1 on pose 1 00011000111 0680x21360 gt1 on pose 1 000110001111 0360x20720 lt1 on pose 0 0001100011110 0720x21440 gt1 on pose 1 00011000111101 0440x20880 lt1 on pose 0 000110001111010 0880x21760 gt1 on pose 1 0001100011110101 0760x21520 gt1 on pose 1 00011000111101011 et ainsi de suite Ici vous obtenez une prcision de 216 Si dailleurs vous faites le total en dcimal 2324282 9210 vous obtenez un total de 01949920654296875 Vous voyez quon nobtient pas la valeur exacte Mme avec plus de place et plus de calculs le rsultat approcherait 01949999999 sans jamais atteindre 0195 019510 00110001111010112 arrondi une prcision de 2- 1 6 18219510 1011011000110001111010112 en arrondi 101101100011000111101011101101100011000111101011x27 Enfin puisque le 1 avant les virgules est implicite on le supprime On obtient ce quon appelle une mantisse Mantisse01101100011000111101011 Plus on souhaite que la prcision soit fine plus on descend dans les puissances de 2 Vous voyez cependant qu un moment il faut sarrter et quil faut se contenter dune prcision de compromis Ce systme est aussi gourmand en place Il existe une norme pour reprsenter les nombres rels en binaire elle a t dfinie par lIEEE pour des prcisions dites simples et doubles En prcision simple le nombre rel est cod sur 32 bits En prcision double il lest 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 reprsentation du signe quotSquot du nombre dune mantisse quotMquot et dun exposant quotEquot Reprsentation binaire 32 bits dun rel simple prcision - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE05wL8EdzIgLAA-enidentnumber 42
Dans un nombre rel en simple prcision sur 32 bits un bit est rserv pour le signe 8 pour lexposant et 23 pour la mantisse dans cet ordre le bit de poids fort tant le signe Lexposant doit subir un dcalage de 2n1 1 n tant le nombre de bits utiliss Le dcalage est donc de 127 Enfin il ne faut pas conserver le 1 de la mantisse il est implicite Signe S0 Exposant E 712713410 soit 100001112 Mantisse 18219510 sur 23 bits 011011000110001111010112 Au final vous obtenez le nombre cod en 32 bits suivant Pour retrouver depuis ce nombre 32 bits la valeur relle en dcimal il faut appliquer la formule suivante Formule de calcul dun rel depuis sa reprsentation binaire Reprenez les valeurs prcdentes converties en dcimal pour plus de facilit S0 E137 M3551723 Le codage dun rel sur 32 bits amne deux remarques La taille de la mantisse limite la prcision pour des nombres de grande valeur car plus le nombre avant la virgule occupe de la place plus la taille restante dans la mantisse est rduite pour les chiffres aprs la virgule Cette remarque est aussi dans une moindre mesure valable pour un rel cod sur 64 bits La prcision peut se rvler insuffisante pour certaines applications Si vous envoyez une fuse sur Jupiter en calculant la trajectoire en simple prcision pour chaque lment de calcul intervenant la fuse risque cette chelle de ne pas arriver au bon endroit cause des sommes dimprcisions Le principe du rel en double prcision est exactement le mme sauf que les tailles de lexposant et de la mantisse sont agrandies Lexposant fait 11 bits la mantisse 52 bits Si vous reprenez les calculs mais cette fois en double prcision vous arrivez un total de 182194999992847442626953125 avec un arrondi 224 Un exemple concret et simple des erreurs darrondi peut tre tout fait mis en vidence avec une simple calculatrice trs bas prix ne seraitce quen divisant 1 par 3 Obtenezvous 1333333 ou 1333334 En rutilisant cette mme S E E E E E E E E M M M M M M M 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 M M M M M M M M M M M M M M M M 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE05wL8EdzIgLAA-enidentnumber 43
valeur les calculs suivants sont souvent fausss 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 appel 80387 pouvait souvent tre ajout pour acclrer les oprations Mme les ordinateurs personnels de type Atari ST pouvaient se voir ajouter un coprocesseur de ce type 68881 Aujourdhui ces coprocesseurs nen sont plus ils sont directement intgrs dans le microprocesseur Le dernier Pentium ou Athlon de votre PC en contient 3 Les dates Les dates sont reprsentes de deux manires dans lordinateur La premire est le format BCD vu prcdemment et ceci presque exclusivement dans le bios setup de votre ordinateur pour des raisons historiques Le second est le timestamp Unix qui reprsente le nombre de secondes coules depuis le 1er janvier 1970 minuit pile UTC Cette date a t retenue car bien que lide dUnix soit apparue en 1969 lre dUnix arrive de la premire version et expansion dbute dans les annes 1970 Le 11 avril 2007 21 heures 24 minutes et 43 secondes le timestamp Unix est de 1176319483 secondes Le timestamp est gnralement cod sur un entier de 32 bits sign Sil est ngatif il reprsente une date davant 1970 sil est positif une date suivante Il couvre une plage de 136 ans du 13 dcembre 1901 20 heures 45 minutes 52 secondes jusquau 19 janvier 2038 3 heures 14 minutes 8 secondes Passe cette date que se passeratil Tous les systmes dexploitation ou les ordinateurs nayant pas prvu ce problme rencontreront un magistral bug digne de celui de lan 2000 ou pire le bug de lan 2000 qui na pas eu lieu ou peu malgr les prdictions catastrophiques tait essentiellement logiciel le timestamp est dfini au sein du systme dexploitation Alors que faire Dj il reste une trentaine dannes pour modifier la chose et cest bien souvent dj fait Unix a t conu il y a bientt 40 ans et est toujours extrmement utilis Il est fort probable que dici 30 ans lui ou lun de ses drivs le soit encore Cest un systme dexploitation qui a fait ses preuves Or les technologies voluent et les ordinateurs actuels manipulent sans difficult des nombres de 64 bits Un timestamp sign sur 64 bits permet de reprsenter des dates de lpoque o lunivers tel que nous le connaissons nexistait pas et dans le futur une priode o notre Soleil nexistera plus depuis bien longtemps Il suffit donc de passer le timestamp sur 64 bits et sachant quil existe un type timestamp en programmation de recompiler tous les programmes Il ny a donc aucun souci se faire 4 Les caractres Les caractres sont habituellement cods sur 8 bits soit un octet en utilisant la table ASCII Dans cette table les 128 premires valeurs ne reprsentent pas que les caractres pour les anglais mais aussi divers codes non affichables utiliss pour contrler laffichage dun terminal Les caractres de 0 31 vont contenir des choses comme les retour chariot le passage la ligne la tabulation etc Le caractre 32 est lespace le 127 le caractre de suppression Le quotAquot en majuscule dmarre 65 en minuscule 97 les chiffres en partant de 0 48 Le reste est la ponctuation divers signes comme les symboles montaires les oprateurs et comparateurs arithmtiques et ainsi de suite Typiquement la chane quotHello Worldquot est reprsente ainsi Les caractres dune mme chane occupent tous des cases mmoires contigus Lordinateur ou plutt les langages chane Quand lordinateur doit rcuprer une chane il lit tous les caractres contigus jusqu ce quil trouve le caractre vide de code 0 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 propres chaque pays Ces 128 caractres sont placs au sein de pages de codes dont la plupart sont normalises Quand on change de pays on change de page de code Ce systme prsente cependant deux inconvnients Les fichiers textes et les noms de fichiers crits dans dautres langues que langlais ne seront pas interprts correctement sur les systmes nutilisant pas la mme page de code Typiquement si vous utilisez une page de code norvgienne sur des fichiers en franais vous obtiendrez des caractres surprenants 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 Code ASCII 72 101 108 108 111 32 87 111 114 108 100 33 Caractre H e l l o W o r l d - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE05wL8EdzIgLAA-enidentnumber 44
systmes grant spcifiquement leur langue Pour palier ces inconvnients il a fallu trouver un autre systme de codage des caractres Larrive des ordinateurs avec une grande capacit mmoire et une gestion avance de laffichage des caractres permet de disposer de polices de caractres un fichier qui contient tous les dessins des caractres destination de lcran ou de limprimante qui peuvent contenir les alphabets de la plupart des langues Par exemple dans la police Arial on pourrait trouver les caractres europens mais aussi hbreux arabes chinois japonais et ainsi de suite Mais comment reprsenter ces milliers de caractres diffrents en mmoire Une norme appele Unicode reconnue par la plupart des systmes dexploitation et des logiciels notamment sous Unix et Windows fait sauter cette limitation Chaque caractre dispose dun nom et dun identifiant numrique de manire unifie et quelque soit le systme cible Cestdire que tout produit sachant interprter les caractres unicode affichera les chanes de caractres crites sous cette norme avec les bons caractres Un texte unicode en chinois saffichera en chinois si votre traitement de texte gre lunicode et dispose de la police de caractres unicode contenant les idogrammes chinois Notez que vous navez pas vous soucier de la manire dont vous tapez le texte le systme dexploitation et les logiciels le font votre place vous continuez taper votre texte comme vous lavez toujours fait Unicode est une norme de reprsentation interne des caractres et propose divers formats de stockage en mmoire 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 Universal Transformation Format Son tude dpasse le cadre de ce livre et prendrait plusieurs pages Cependant sachez que le modle Unicode est un modle en couches La premire couche est le jeu de caractres abstrait en fait une liste des caractres et leur nom prcis Par exemple le quotquot correspond quotLettre majuscule latine c cdillequot La seconde est lindex numrique du caractre cod appel point de code not UXXXX o XXXX est en hexadcimal Sans rentrer dans les dtails le quotquot est reprsent par le point de codage U00C7 Il existe plusieurs niveaux ensuite Java utilise un codage des caractres sous forme Unicode sur 16 bits Le premier octet en partant de la gauche reprsente le jeu de caractre le second le numro de caractre dans ce jeu Cest pourquoi le type caractre en Java utilise deux octets alors quil nen utilise quun seul en C ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE05wL8EdzIgLAA-enidentnumber 45
Types et langages 1 Langages typs ou non Quelques langages sont trs souples avec les variables Vous pouvez tout dabord y mettre des nombres puis du texte puis de nouveau des nombres Ces langages sont dits quotnon typsquot Certains poussent le raisonnement assez loin une variable peut contenir le chiffre 3 et lautre le texte quot3 petits cochonsquot il pourra les additionner ce qui devrait donner 6 Cest le cas du PHP par exemple le type de la variable dpend alors de son contexte dutilisation le langage tentant de convertir son contenu quand cest possible linverse dautres langages sont de quottypage fortquot o toutes les variables doivent tre dclares de manire extrmement prcise type signe longueur et les ventuelles conversions doivent tre explicites En algorithmique vous vous contenterez de donner le nom le type et ventuellement la taille de la variable qui gardera ses proprits tout au long de lalgorithme sa valeur pouvant bien entendu voluer 2 La gestion de la mmoire La gestion de la mmoire est le calvaire des programmeurs en langages de bas niveau ou mme de haut niveau quand 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 Comme une chane se termine par un caractre nul il faut selon le principe quun caractre est cod en ASCII 13 octets pour stocker cette chane en mmoire 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 quotramassemiettesquot qui le font pour vous Mais en C par exemple ce serait vous de dclarer votre variable de manire ce que son contenu puisse contenir jusqu 13 octets en dclarant en fait 13 cases mmoires dun octet Voici la mthode dite statique char texte13 ou encore la mthode dynamique char textemalloc13sizeofchar Ce nest pas tout En effet avec cette dernire syntaxe le malheur veut que outre cette tche complexe dallocation mmoire vous deviez librer vousmme la mmoire sinon votre programme continuera consommer celleci jusqu la fin de son excution Mais ce systme de gestion de la mmoire estil vraiment un inconvnient Prenez en compte ces quelques allgations La gestion de la mmoire de manire dynamique ncessite une connaissance avance de la taille des variables utilises de la quantit de mmoire ncessaire et de la mmoire physique de la machine 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 puissantes et pratiques Lallocation dynamique permet dutiliser uniquement la quantit de mmoire ncessaire un instant donn Cest certes insignifiant pour quelques octets mais sil sagit de manipuler de grosses images ou des films a compte La mmoire inutilise peut tre libre ds quelle nest plus ncessaire Avec les mthodes dites statiques elle lest uniquement la fin du programme ou dun bloc dinstructions Lallocation mmoire est la plus grande source derreurs dans un programme pouvant occasionner du simple dysfonctionnement au plantage complet du programme voire mme de graves problmes de scurit piratage dans des applications critiques Partant du principe quun langage de haut niveau ne doit pas embter le programmeur avec une quelconque gestion du matriel Java gre la mmoire votre place et donc vous navez pas vous soucier de librer la mmoire de manire si complexe en apparence ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0NVqx9EdzIgLAA-enidentnumber 46
Les tests et conditions 1 Principe Dans le prcdent chapitre vous avez pu vous familiariser avec les expressions mettant en place des oprateurs quils soient de calcul de comparaison lgalit ou boolens Ces oprateurs et expressions trouvent tout leur sens une fois utiliss dans des conditions quon appelle aussi des branchements conditionnels Une expression value est ou vraie le rsultat est diffrent de zro ou fausse Suivant ce rsultat lalgorithme va effectuer une action ou une autre Cest le principe de la condition Grce aux oprateurs boolens lexpression peut tre compose plusieurs expressions sont lies entre elles laide dun oprateur boolen ventuellement regroupes avec des parenthses pour en modifier la priorit a1 OU b36 ET cgt10 est une expression tout fait valable Celleci sera vraie si chacun de ses composants respecte les conditions imposes Cette expression est vraie si a vaut 1 et c est suprieur 10 ou si b vaut 2 236 et c est suprieur 10 Reprenez lalgorithme du prcdent chapitre qui calcule les deux rsultats possibles dune quation du second degr Lnonc simplifi disait que pour des raisons pratiques seul le cas o lquation a deux solutions fonctionne Autrement dit lalgorithme nest pas faux dans ce cas de figure mais il est incomplet Il manque des conditions pour tester la valeur du dterminant celuici estil positif ngatif ou nul Et dans ces cas que faire et comment le faire Imaginez un second algorithme permettant de se rendre dun point A un point B Vous nallez pas le faire ici rellement car cest quelque chose de trs complexe sur un rseau routier important De nombreux sites Internet vous proposent dtablir un trajet avec des indications Cest le rsultat qui est intressant Les indications sont simples allez tout droit tournez droite au prochain carrefour faites trois kilomtres et au rondpoint prenez la troisime sortie direction B Dans la plupart des cas si vous suivez ce trajet vous arrivez bon port Mais quid des impondrables Par o allezvous passer si la route droite au prochain carrefour est devenue un sens interdit a Reprenez le trajet allez tout droit Si au prochain carrefour la route droite est en sens interdit continuez tout droit 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 prenez vers C puis trois cents mtres plus loin tournez droite vers B Ce petit parcours ne met pas uniquement en lumire la complexit dun trajet en cas de dtour mais aussi les nombreuses conditions qui permettent dtablir un trajet en cas de problme Si vous en possdez certains logiciels de navigation par GPS disposent de possibilits ditinraire Bis de trajectoire dvitement sur telle section ou encore pour viter les sections page Pouvezvous maintenant imaginer le nombre dexpressions valuer dans tous ces cas de figure en plus de la vitesse de chaque route pour optimiser lheure darrive 2 Que tester Les oprateurs sappliquent sur quasiment tous les types de donnes y compris les chanes de caractres tout au moins en pseudocode algorithmique Vous pouvez donc quasiment tout tester Par tester comprenez ici valuer une expression qui est une condition Une condition est donc le fait deffectuer des tests pour en fonction du rsultat de ceuxci effectuer certaines actions ou dautres Une condition est donc une affirmation lalgorithme et le programme ensuite dtermineront si celleci est vraie ou fausse Une condition retournant VRAI ou FAUX a comme rsultat un boolen En rgle gnrale une condition est une comparaison mme si en programmation une condition peut tre dcrite par une simple variable ou mme une affectation par exemple Pour rappel une comparaison est une expression compose de trois lments une premire valeur variable ou scalaire un oprateur de comparaison une seconde valeur variable ou scalaire Les oprateurs de comparaison sont ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 47
Lgalit La diffrence ou ltgt Infrieur lt Infrieur ou gal lt Suprieur gt Suprieur ou gal gt Le pseudocode algorithmique ninterdit pas de comparer des chanes de caractres Evidemment vous prendrez soin ne pas mlanger les torchons et les serviettes en ne comparant que les variables de types compatibles Dans une condition une expression quel que soit le rsultat de celleci sera toujours value comme tant soit vraie soit fausse Note loprateur daffectation peut aussi tre utilis dans une condition Dans ce cas si vous affectez 0 une variable lexpression sera fausse et si vous affectez nimporte quelle autre valeur elle sera vraie En langage courant il vous arrive de dire quotchoisissez un nombre entre 1 et 10quot En mathmatique vous crivez cela comme ceci 1 nombre 10 Si vous crivez ceci dans votre algorithme attendezvous des rsultats surprenants le jour o vous allez le convertir en vritable programme En effet les oprateurs de comparaison ont une priorit ce que vous savez dj mais lexpression quils composent est aussi souvent value de gauche droite Si la variable nombre contient la valeur 15 voici ce qui ce passe Lexpression 1 15 est value elle est vraie Et ensuite Tout va dpendre du langage lexpression suivante vrai 10 peut tre vraie aussi quotvraiquot est ici le rsultat de lexpression 1 15 Vrai vaut gnralement 1 Donc 1 10 est vraie ce nest pas le rsultat attendu Le rsultat est pouvantable la condition est vrifie et le code correspondant va tre excut Vous devez donc proscrire cette forme dexpression Voici celles qui conviennent dans ce cas nombregt1 ET nombrelt10 Ou encore 1ltnombre ET nombrelt10 3 Tests SI a Forme simple Il ny a en algorithmique quune seule instruction de test quotSiquot qui prend cependant deux formes une simple et une complexe Le test SI permet dexcuter du code si la condition la ou les expressions qui la composent est vraie La forme simple est la suivante Si boolen Alors Bloc dinstructions FinSi Notez ici que le boolen est la condition Comme indiqu prcdemment la condition peut aussi tre reprsente par - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 48
une seule variable Si elle contient 0 elle reprsente le boolen FAUX sinon le boolen VRAI Que se passetil si la condition est vraie Le bloc dinstructions situ aprs le quotAlorsquot est excut Sa taille le nombre dinstructions na aucune importance de une ligne n lignes sans limite Dans le cas contraire le programme continue linstruction suivant le quotFinSiquot Lexemple suivant montre comment obtenir la valeur absolue dun nombre avec cette mthode PROGRAMME ABS VAR Nombre entier DEBUT nombre-15 Si nombrelt0 Alors nombre-nombre FinSi Afficher nombre FIN En Java cest le quotifquot qui doit tre utilis avec lexpression boolenne entre parenthses La syntaxe est celleci ifboolean code Si le code Java ne tient que sur une ligne les accolades peuvent tre supprimes comme dans lexemple de la valeur absolue class chap3abs public static void mainString args int nombre nombre-15 ifnombrelt0 nombre-nombre Systemoutprintlnnombre b Forme complexe La forme complexe na de complexe que le nom Il y a des cas o il faut excuter quelques instructions si la condition 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 premire forme Cependant si la condition est fausse cette fois cest le bloc dinstructions situ aprs le Sinon qui est excut Ensuite le programme reprend le cours normal de son excution aprs le FinSi Notez que vous auriez pu trs bien faire un quivalent de la forme complexe en utilisant deux formes simples la premire avec la condition vraie la seconde avec la ngation de cette condition Mais ce nest pas trs joli mme si cest correct Retenez que Si dans une forme complexe lun des deux blocs dinstructions est vide alors transformezla en forme simple modifiez la condition en consquence Laisser un bloc dinstructions vide dans une forme complexe nest pas conseill cest une grosse maladresse de programmation qui peut tre facilement vite cest un programme sale Cependant certains langages lautorisent ce nest pas une erreur ni mme une faute lourde mais ce nest pas une raison Lalgorithme suivant est une illustration de la forme complexe elle vrifie si trois valeurs entres au clavier sont tries par ordre croissant PROGRAMME TRI VAR ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 49
xyzentiers DEBUT Afficher quotEntrez trois valeurs entires distinctesquot Saisir xyz Si zgty ET ygtx Alors Afficher quot Tris en ordre croissantquot Sinon Afficher quotCes nombres ne sont pas trisquot FinSi FIN Comme toujours en Java le code semble plus complexe quil ny parait et ceci pour deux raisons La saisie ncessite la mise en place de mcanismes complexes beaucoup de lignes pour pas grandchose La saisie attend une chane de caractres or les tests se font sur des entiers Il faut donc convertir les chanes de caractres en valeurs entires Java permet de convertir dans tous les sens mais ceci fait appel des notions classes et objets qui seront abordes en fin douvrage import javaio class chap3tri public static void mainString args String t1t2t3 int xyz BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin SystemoutprintlnquotEntrez trois valeurs entires distinctesquot try t1saisiereadLine t2saisiereadLine t3saisiereadLine xIntegerparseIntt1 yIntegerparseIntt2 zIntegerparseIntt3 ifzgty ampamp ygtx SystemoutprintlnquotTris en ordre croissantquot else SystemoutprintlnquotCes nombres ne sont pas trisquot catchException excp SystemoutprintlnquotErreurquot 4 Tests imbriqus Vous connaissez le dicton populaire quotavec des si on mettrait Paris en bouteillequot auquel on rpond gnralement aprs une accumulation de conditions quotsil fait beau et quil fait chaud et que la voiture nest pas en panne alors nous irons la mer sinon si la voiture est en panne nous prendrons le train sinon sil y a grve alors nous ferons du stop sinon si tout va mal alors nous resterons la maisonquot Cest un peu lourd dit comme a mais qui na jamais chafaud des plans douteux devant vrifier plusieurs conditions avec des scnarios de secours Vous retrouverez parfois le mme problme en programmation Les deux formes de Si cidessus permettent de sen sortir assurment mais la syntaxe peut devenir trs lourde Vous pouvez en effet parfaitement imbriquer vos tests en plaant des Si en cascade dans les blocs dinstructions situs aprs les Alors et les Sinon Prenez lexemple suivant il faut deviner si un nombre saisi au clavier est proche ou non dune valeur prdfinie Pour le savoir le programme affiche froid tide chaud ou bouillant suivant lcart entre la valeur saisie et celle prdfinie Cet cart est calcul avec une simple soustraction puis en dterminant sa valeur absolue PROGRAMME IMBRIQUE VAR nombresaisieecart entiers - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 50
DEBUT Nombre63 Afficher quotSaisissez une valeur entre 0 et 100quot Saisir saisie ecartnombre-saisie Si ecart lt 0 Alors Ecart-ecart FinSi Si ecart0 Alors Afficher quotBravo quot Sinon Si ecartlt5 Alors Afficher quotBouillantquot Sinon Si ecartlt10 Alors Afficher quotChaudquot Sinon Si ecartlt15 Alors Afficher quotTidequot Sinon Afficher quotFroidquot 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 parfaitement valable et dune syntaxe correcte Cependant il est possible de faire plus concis avec la forme suivante Si boolen Alors Bloc dinstructions 1 SinonSi boolen Alors Bloc dinstructions 2 SinonSi boolen Alors Bloc dinstructions n Sinon Bloc dinstruction final FinSi Cette forme est plus propre plus lisible et vite de se mlanger les pinceaux De multiples conditions sont testes Si la premire nest pas vraie on passe la deuxime puis la troisime et ainsi de suite jusqu ce quune condition soit vrifie Dans le cas contraire cest le bloc dinstructions final qui est excut Les tests du prcdent exemple doivent donc tre rcrits comme ceci Si ecart0 Alors Afficher quotBravo quot SinonSi ecartlt5 Alors Afficher quotBouillantquot SinonSi ecartlt10 Alors Afficher quotChaudquot SinonSi ecartlt15 Alors Afficher quotTidequot Sinon Afficher quotFroidquot FinSi Voici le code correspondant en Java import javaio class chap3imbrique public static void mainString args String txtquot10quot int ecartnombresaisie0 BufferedReader input ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 51
nombre63 inputnew BufferedReadernew InputStreamReaderSystemin SystemoutprintlnquotEntrez trois valeurs entires distinctesquot try txtinputreadLine catchException excp SystemoutprintlnquotErreurquot saisieIntegerparseInttxt ecartnombre-saisie ifecartlt0 ecart-ecart ifecart0 SystemoutprintlnquotBravoquot else ifecartlt5 SystemoutprintlnquotBouillantquot else ifecartlt10 SystemoutprintlnquotChaudquot else ifecartlt15 SystemoutprintlnquotTidequot else SystemoutprintlnquotFroidquot Quelle conomie de place pour plus de clart et de concision Maintenant vous disposez de tout le ncessaire pour rsoudre une quation du second degr dans tous les cas de figure Il manque deux cas Si 0 il ny a quune seule solution qui vaut Si lt0 lquation na pas de solution PROGRAMME EQUATION2 VAR abcdeltax1x2rels DEBUT a3 b6 c-10 delta b b - 4 a c Si deltagt0 Alors x1 -b racinedelta 2 a x2 -b - racinedelta 2 a Afficher quotLes deux solutions sont x1quotx1 quotx2quotx2 SinonSi delta0 Alors x1 -b 2 a Afficher quotLunique solution est quotx1 Sinon Afficher quotLquation na pas de solutionquot FinSi FIN En Java le programme a t modifi lgrement pour autoriser la saisie de a b et c import javaio class chap3equation public static void mainString args double a0b0c0deltax1x2 String taquotquottbquotquottcquotquot BufferedReader input inputnew BufferedReadernew InputStreamReaderSystemin SystemoutprintlnquotEntrez ab et c quot - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 52
try tainputreadLine tbinputreadLine tcinputreadLine catchException excp SystemoutprintlnquotErreurquot aDoubleparseDoubleta bDoubleparseDoubletb cDoubleparseDoubletc deltabb-4ac ifdeltagt0 x1-bMathsqrtdelta2a x2-b-Mathsqrtdelta2a SystemoutprintlnquotDeux solutions quot Systemoutprintlnquotx1quotx1 Systemoutprintlnquotx2quotx2 else if delta0 x1-b2a SystemoutprintlnquotUne seule solution x1quotx1 else SystemoutprintlnquotPas de solutionquot 5 Choix multiples Si les tests imbriqus facilitent parfois la vie ils deviennent parfois trop lourds lorsque le nombre de tests devient trop important Certains langages ont trouv une intressante parade ce problme en proposant des structures de tests selon que telle expression est vraie ou telle autre et ainsi de suite Au lieu de faire des Si imbriqus ou des SinonSi il suffit alors dindiquer quoi faire quand telle ou telle valeur est rencontre En algorithmique cela se traduit par la pseudoinstruction quotSelon quequot Selon que Condition 1 bloc 1 Condition 2 bloc 2 Condition n bloc n Sinon bloc final Fin Selon Une instruction quotSelon quequot peut tre convertie facilement en Si imbriqus Les conditions sont vrifies les unes aprs les autres dans lordre indiqu Quand une condition est vraie le bloc dinstructions associ est excut puis lalgorithme continue aprs le quotFin Selonquot Si aucune condition nest vrifie cest le bloc final du quotSinonquot qui est excut Voici une application simple qui permet de placer dans une variable le nom dun mois en fonction de son numro entre 1 et 12 Variable mois en Numrique Variable libellemois en Alphanumrique Dbut mois11 Selon que mois1 libellemoisquotjanvierquot mois2 libellemoisquotfvrierquot mois3 libellemoisquotmarsquot mois4 libellemoisquotavrilquot mois5 libellemoisquotmaiquot mois6 libellemoisquotjuinquot mois7 libellemoisquotjuilletquot mois8 libellemoisquotaotquot mois9 libellemoisquotseptembrequot mois10 libellemoisquotoctobrequot mois11 libellemoisquotnovembrequot mois12 libellemoisquotdcembrequot ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 53
Fin Selon Fin En Java la structure quivalente est le quotswitch casequot switchvariable case valeur1 ltinstructionsgt break case valeur2 break default ltinstructionsgt Chaque valeur case correspond une valeur possible de la variable du switch Si plusieurs instructions sont prsentes il est prfrable de les placer entre accolades Le break est pour une fois utile et fortement conseill En effet si Java tombe sur une correspondance par exemple valeur1 et si aucun break nest prsent alors il va excuter toutes les instructions jusquen bas ou jusqu ce quil rencontre un break En pratique les instructions prvues pour valeur2 valeur3 etc sont excutes Le default est laction par dfaut si aucune valeur case nest vrifie class chap3case public static void mainString args int mois String libmois mois5 switchmois case 1 libmoisquotJanvierquot break case 2 libmoisquotFvrierquot break case 3 libmoisquotMarsquot break case 4 libmoisquotAvrilquot break case 5 libmoisquotMaiquot break case 6 libmoisquotJuinquot break case 7 libmoisquotJuilletquot break case 8 libmoisquotAotquot break case 9 libmoisquotSeptembrequot break case 10 libmoisquotOctobrequot break case 11 libmoisquotNovembrequot break case 12 libmoisquotDcembrequot break default libmoisquotquot Systemoutprintlnlibmois 6 Des exemples complets a Le lendemain dune date Les structures dj abordes permettent dj deffectuer pas mal de petites choses Vous allez maintenant calculer le lendemain dune date selon les critres suivants La date est dcompose dans trois variables anne mois et jour Il faut grer les changements de mois le nombre de jours dans le mois le changement danne les annes bissextiles pour le mois de fvrier - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 54
Pour information une anne est bissextile si elle vrifie intgralement deux rgles les annes divisibles par 4 et les annes divisibles par 400 mais pas par 100 Lalgorithme pour indiquer si une anne est bissextile ou non est le suivant Notez que dire quune anne est divisible par n consiste dire que le reste de la division par n est nul PROGRAMME BISSEXTILE VAR Annee entier DEBUT Afficher quotEntrez lannequot Saisir annee Si annee40 ET annee4000 OU annee100gt0 Alors Afficher annee quot est bissextilequot Sinon Afficher annee quot nest pas bissextilequot FinSi FIN En Java import javaio class chap3bissextile public static void mainString args int annee0 String canneequotquot BufferedReader input inputnew BufferedReadernew InputStreamReaderSystemin SystemoutprintlnquotEntrez une anne quot try canneeinputreadLine catchException excp SystemoutprintlnquotErreurquot anneeIntegerparseIntcannee if annee40 ampamp annee4000 annee100gt0 Systemoutprintlnanneequot est bissextilequot else Systemoutprintlnanneequot nest pas bissextilequot Ce test danne bissextile nintervient que lors des calculs sur le dernier jour de fvrier pour savoir si le lendemain du 28 est le 29 ou le 1er mars De mme il faut grer les cas o les mois ont 30 ou 31 jours ainsi que le changement danne lors du mois de dcembre Lalgorithme utilise des structures quotSelon Quequot et Si PROGRAMME LENDEMAIN VAR anneemoisjourentiers DEBUT Afficher quotDate initiale quot Saisir jour mois annee Selon que mois1 OU mois3 OU mois5 OU mois7 OU mois8 OU mois10 Si jour31 Alors jour1 moismois1 Sinon Jourjour1 FinSi ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 55
mois4 OU mois6 OU mois9 OU mois11 Si jour30 Alors jour1 moismois1 Sinon jourjour1 FinSi Mois2 Si annee40 ET annee4000 OU annee100gt0 Alors Si jour29 Alors jour1 moismois1 Sinon jourjour1 FinSi Sinon Si jour28 Alors jour1 moismois1 Sinon jourjour1 FinSi FinSi Mois12 Si jour31 Alors jour1 mois1 anneeannee1 Sinon jourjour1 FinSi Fin Selon Afficher quotLe lendemain est le quotjour 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 jusqu la fin Aussi une suite de quotcasequot sur la mme ligne est possible cest comme si vous les mettiez les uns sous les autres Pour le reste le code est trs proche de lalgorithme import javaio class chap3lendemain public static void mainString args int jour0mois0annee0 String cjourquotquotcmoisquotquotcanneequotquot BufferedReader input inputnew BufferedReadernew InputStreamReaderSystemin SystemoutprintlnquotEntrez jour mois anneequot try cjourinputreadLine cmoisinputreadLine canneeinputreadLine catchException excp SystemoutprintlnquotErreurquot anneeIntegerparseIntcannee moisIntegerparseIntcmois jourIntegerparseIntcjour switchmois case 1case 3case 5case 7case 8case 10 ifjour31 jour1 mois else jour break case 4case 6case 9case 11 - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 56
ifjour30 jour1 mois else jour break case 2 if annee40 ampamp annee4000 annee100gt0 ifjour29 jour1 mois else jour else ifjour28 jour1 mois else jour break case 12 ifjour31 jour1 mois1 annee else jour SystemoutprintlnquotDemain est le quotjour quotquotmois quotquot annee b La validit dune date Les calculs de dates sont une source inpuisable dalgorithmes Sauriezvous par exemple vous inspirer de lalgorithme cidessus pour tester la validit dune date rentre au clavier Il suffit pour chaque mois de vrifier si le jour entr est correct le pige tant comme cidessus pour les annes bissextiles et le mois de fvrier 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 selon le rsultat des tests Aprs tous les tests on vrifie la valeur du drapeau Atelle chang Alors il y a eu un problme Le drapeau est reprsent par la variable quoterreurquot En fin de script si elle contient autre chose que 0 alors la date est invalide Sa valeur est modifie 1 lorsquun test nest pas concluant Variables erreur annee mois jour en Numrique Dbut erreur0 Ecrire quotDate initiale quot Lire jour mois annee Si jourlt0 OU moislt0 OU moisgt12 Alors erreur1 Sinon Si Mois1 OU mois3 OU mois5 OU mois7 OU mois8 OU mois10 ou mois12 Alors Si jourgt31 Alors erreur1 FinSi Sinon Si mois4 OU mois6 OU mois9 OU mois11 Alors Si jourgt30 Alors erreur1 FinSi Sinon SI mois2 Alors Si annee40 ET annee4000 OU annee100gt0 Alors Si jourgt29 Alors erreur1 FinSi Sinon Si jourgt28 Alors erreur1 ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 57
FinSi FinSi FinSi Si erreur1 Alors Ecrire quotDate incorrectequot Sinon Ecrire quotDate correctequot FinSI Fin c Lheure dans n secondes Le but de lalgorithme est cette fois de dterminer lheure quil sera dans n secondes Pour a lutilisateur doit saisir lheure actuelle dcompose en heures sur 24 heures minutes et secondes Bien entendu il faut tenir compte du changement de jour dheure de minute sans oublier quil y a 60 minutes dans une heure et 60 secondes dans une minute Par exemple en additionnant 147 secondes 23 heures 58 minutes et 12 secondes quelle heure seratil Il sera minuit 0 minute et 39 secondes le lendemain Dans lalgorithme vous utiliserez des valeurs entires Ainsi le rsultat des divisions sera un entier et non un rel par exemple 15960265 mais avec un entier vous rcuprerez seulement 2 Dans un premier temps additionnez les secondes 14712159 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 15960 donne 2 minutes avec un reste de 39 secondes Vous savez maintenant que la fin est de 39 secondes Additionnez les minutes 58260 Si le chiffre est suprieur ou gal 60 procdez comme pour les secondes 60601 soit une heure supplmentaire et un reste de 0 donc 0 minute Vous savez maintenant que le milieu est 0 minute Additionnez les heures 23124 soit minuit L encore lidal est de compter les jours Ainsi 24241 soit 1 jour sans reste donc 0 heure minuit Il sera donc minuit et 39 secondes PROGRAMME heure VAR joursheuresminutessecondesnbsecentiers DEBUT heures17 minutes55 secondes48 Afficher quotCombien de secondes en plus quot Saisir nbsec secondessecondesnbsec minutesminutessecondes 60 secondessecondes 60 heuresheuresminutes 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 javaio class chap3heure public static void mainString args int jours0heures minutes secondesnbsec0 Le simple estil meilleur - 12 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 58
String txtquotquot BufferedReader saisie heures17 minutes55 secondes48 saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotCombien de secondes quot txtsaisiereadLine catchException excp SystemoutprintlnquotErreurquot nbsecIntegerparseInttxt secondesnbsec minutessecondes60 secondessecondes60 heuresminutes60 minutesminutes60 joursheures24 heuresheures24 Systemoutprintlnjoursquotd quotheuresquotquotminutesquot quotsecondes tesvous surpris par la forme que revt cet algorithme Probablement car il ny a aucun test deffectu La question 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 algorithme effectue neuf calculs additions divisions et modulos Si on rajoute des tests on rajoute des instructions et lalgorithme devient plus long Or vous aurez loccasion de le voir dans les chapitres suivants la complexit des algorithmes nest pas lie leur longueur Certains sont trs courts comme celuici et pourtant trs gourmand en ressources Inversement dautres sont longs et semblent compliqus pour un rsultat de grande rapidit Un test bien pos peut viter des calculs inutiles Un calcul est gourmand en temps machine le microprocesseur travaille plus longtemps en faisant des divisions et des modulos quen comparant deux valeurs elles sont gales ou non et dans le cas de nombres il suffit de faire un ET pour voir si a retourne la mme valeur une opration lmentaire trs rapide bien plus que le moindre calcul Autrement dit vous avez tout intrt faire des tests quand ceuxci peuvent permettre dviter des calculs lourds PROGRAMME HEURE2 VAR joursheuresminutessecondesnbsecentier DEBUT heures17 minutes55 secondes48 Afficher quotCombien de secondes en plus quot Saisir nbsec secondessecondesnbsec Si secondesgt59 Alors minutesminutessecondes 60 secondesseconde 60 Si minutesgt59 Alors heuresheuresminutes 60 minutesminutes 60 Si heuresgt23 Alors joursheures 24 Les tests pour optimiser ENI Editions - All rigths reserved - Jonifar lina - 13 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 59
heuresheures 24 FinSi FinSi FinSi Afficher jours heures minutes secondes FIN Dans le meilleur des cas un seul calcul sera effectu Dans le pire neuf Entre les deux toute une gamme Si par exemple on additionne 60 secondes alors on augmente forcment dune minute et trois calculs supplmentaires sont effectus Si on augmente dune heure alors trois autres nouveaux calculs ont lieu et dune journe deux derniers calculs On retrouve bien neuf calculs au pire Mais la complexit moyenne est largement rduite par rapport au premier algorithme Ce serait calculable via un intervalle alatoire mais born de n valeurs pertinentes Voici seulement la partie modifie du code Java secondesnbsec ifsecondesgt59 minutessecondes60 secondessecondes60 ifminutesgt59 heuresminutes60 minutesminutes60 ifheuresgt23 joursheures24 heuresheures24 Sachant que Unix compte le nombre de secondes coules depuis le 1er janvier 1970 minuit pour calculer la date 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 algorithme supplmentaire pour grer par exemple les fuseaux horaires en fonction dune heure centrale UTC Il ny a rien de difficile - 14 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0YeOIEdzIgLAA-enidentnumber 60
Lalgbre boolen 1 Lorigine des tests Les tests effectus tant en algorithmique quen programmation sont des tests logiques ou plutt faisant appel la logique Le chapitre Les variables et oprateurs a dj brivement abord ce point lorsquil a t question des oprateurs boolens Les oprateurs dits logiques ET OU et NON sont des reprsentations de la logique De quelle logique parleton Fondamentalement la logique est la mme pour tout le monde bien que videmment linterprtation des rsultats puisse varier dun individu lautre en statistique par exemple La logique est universelle Monsieur Spock sil avait exist naurait pas dit mieux Mais jusqu peu dans lchelle de lhumanit il ny avait aucun moyen de se la reprsenter rellement sous forme de symboles dassertions etc Il ny avait aucune reprsentation formelle de la logique Or un ordinateur est logique mme si on peut lui demander des choses illogiques cest vous qui le programmez aprs tout La logique est mme la base de nombreuses applications mathmatiques lectroniques dintelligence artificielle En informatique le matriel est lectronique et dpend de la logique et les programmes dpendent tant de tests et de calculs faisant appel la logique et devant fonctionner sur des circuits lectroniques Sans logique pas dlectronique ni dordinateurs ni de programmes Cest ce qui fait que les oprateurs conditions et tests ne doivent pas tre poss nimporte comment Il ny a rien de plus logique quun ordinateur mais aussi rien de plus stupide il va btement et encore la notion de btise lui est inconnue excuter exactement ce que 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 rponse logique peut en tre dduite Ainsi PROGRAMME STUPIDE VAR froid nu sortir en Boolen DEBUT FroidVRAI NuVRAI Si FroidVRAI ET nuVRAI Alors SortirVRAI FinSi FIN Cet algorithme peut tre ainsi interprt quotSil fait froid dehors et que je suis nu alors je peux sortirquot Cet algorithme est pour vous et moi tres humains faux Vous nallez pas sortir nu sil fait froid vous auriez plutt intrt mettre Sortir FAUX ou inverser la condition froid ou nu Cest vident Mais lordinateur sen fiche il na aucun moyen de savoir que vous avez fait une erreur dans vos tests Le programme est mathmatiquement logique chaque test analys est correct et donc les conditions sont remplies pour passer la variable Sortir VRAI La suite aborde des points thoriques Le but nest pas de vous donner un cours magistral sur lalgbre de Boole mais de vous fournir des bases de comprhension du fonctionnement de la logique vu du ct de linformatique Si vous voulez aller plus loin il existe une littrature consquente ce sujet dans les bibliothques et les librairies par exemple quotAlgbre de Boolequot chez Masson Sil vous intresse un jour daller largement audel et dexplorer les mcanismes de logique et de pense humaine ou dintelligence artificielle il existe un gros ouvrage de rfrence rfrence de nombreux scientifiques informaticiens etc qui sappelle quotGdel Escher Bach les brins dune guirlande ternellequot par Douglas Hofstadter 2 Petites erreurs grosses consquences Comprenezvous maintenant limportance de la logique formelle et de bien crire les tests et conditions dans un algorithme Pour vous conforter un peu voici deux exemples de programmes mal crits et de leurs dsastreuses consquences a Ariane 5 Le 4 juin 1996 un bug dun programme de la premire fuse Ariane 5 a provoqu sa destruction aprs 40 secondes de vol Le programme en question contrlait les gyroscopes qui indiquent lorientation de la fuse Il venait dAriane 4 et navait pas t test ni modifi pour Ariane 5 En gros un nombre de 64 bits a t converti en 16 bits videmment a ne quotrentre pasquot et les valeurs retournes par ce programme sont devenus aberrantes Or ce programme tait critique et naurait jamais d retourner de valeurs impossibles Les donnes retournes ntaient pas testes et vrifies par le programme central de calcul de vol qui les prenaient pour argent comptant et les interprtaient telles quelles Sur un nombre sign le dernier bit correspond au signe Lorsque les 16 bits ont t remplis le dernier bit est pass un Le programme a reu une indication comme quoi la fuse avait chang de sens pointait vers le bas et a orient les tuyres des racteurs en les braquant fond pour rectifier une situation totalement fausse La fuse a donc subi un moment donn de par la pousse et sa position des forces arodynamiques telles que sa destruction est devenue invitable Le comble Le programme des gyroscopes ne devait tre utilis que durant le compte rebours et uniquement sur les modles Ariane 3 Autrement dit il naurait jamais d tre prsent ni fonctionner en vol b Mars Climate Orbiter Lautre exemple touche encore au domaine spatial Le 11 dcembre 1998 la NASA lana une sonde en direction de Mars Mars Climate Orbiter MCO dans le but dtudier le climat martien La sonde arriva en insertion orbitale mise en orbite autour de Mars le 23 septembre 1999 La sonde devait allumer son moteur principal un bon quart dheure passer derrire la plante perte de contact avec la Terre puis de nouveau devant reprise de contact Le contact na jamais repris Pourquoi Parce que lors des calculs ncessaires cette insertion sur orbite MCO a fait appel un programme issu dun autre fournisseur Lockheed Martin Or MCO programm par la ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 61
NASA utilisait le systme mtrique Newtons par seconde et celui de Lockheed Martin le systme de mesure imprial anglais Livre par seconde Personne na vrifi ni test Le rsultat est que la sonde sest approche trs haute vitesse 57 kms de la surface au lieu de 150 kms et a brl dans latmosphre martienne Bte erreur Imaginez maintenant les consquences de ces deux trs stupides erreurs de programmation de simples tests de conversion sil y avait eu des astronautes dans ces missions Heureusement votre modeste chelle vous navez probablement pas la prtention denvoyer des hommes sur Mars 3 George Boole Comme indiqu dans le chapitre Les variables et oprateurs cest langlais George Boole 18151684 logicien mathmaticien et philosophe qui le premier a pos les bases de la formalisation de la logique en proposant une analyse mathmatique de celleci En 1847 il publie un livre intitul quotMathematical Analysis of Logicquot Analyse mathmatique de la logique puis en 1854 quotAn Investigation Into the Laws of Thought on Which are Founded the Mathematical Theories of Logic and Probabilitiesquot Une recherche sur les lois de la pense sur lesquelles sont fondes les thories mathmatiques de logique et de probabilits Dans ces ouvrages George Boole dveloppe une 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 traduits en termes logiques 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 pratique dans le traitement de linformation le sicle suivant avec Claude Shannon Durant sa vie les travaux de Boole restrent au stade thorique Cependant son algbre est la base de nombreuses applications quotidiennes telles que llectronique les circuits logiques linformatique processeurs programmes les probabilits llectricit les relais la tlphonie les commutateurs diverses recherches scientifiques etc N trs pauvre et autodidacte George Boole finira membre de lillustre Royal Society et effectuera de nombreux travaux sur les quations diffrentielles Il mourra dune pneumonie mal soigne 4 Lalgbre a tablir une communication George Boole a dvelopp lalgbre qui porte son nom Il est utilis en mathmatique logique lectronique et informatique Il permet deffectuer des oprations sur les variables logiques Comme son nom lindique il permet dutiliser des techniques algbriques pour traiter ces variables logiques Prenez la phrase suivante absolument logique quotUne proposition peut tre vraie OU fausse mais ne peut pas tre vraie ET faussequot Autrement dit une variable logique ne dispose que dun seul tat un moment donn vrai ou faux En prenant plusieurs propositions on peut appliquer entre elles des formules algbriques La premire utilisation de cet algbre la t pour ltablissement de communications tlphoniques via la commutation tlphonique mise en place par Claude Shannon Prenez cet exemple simple de mise en place dune communication tlphonique entre deux interlocuteurs Une communication ncessite la fois un metteur qui met lappel et un rcepteur celui qui dcroche On a donc CommunicationEmetteur ET rcepteur La communication est tablie si lmetteur appelle et que le rcepteur dcroche En dautres termes Communication est VRAIE si Emetteur est VRAI et rcepteur est VRAI Dans les autres cas la communication ne stablira pas et sera donc FAUX Si vous appelez quelquun VRAI mais quil ne dcroche pas FAUX ou encore que vous dcrochez VRAI sans appel mis FAUX ou que personne nappelle ni ne dcroche FAUX dans les deux cas il ny a aucune communication dtablie On peut en dduire la table suivante Ne trouvezvous pas que cette table ressemble beaucoup loprateur logique ET Oui cest un exemple concret dapplication de lalgbre de Boole Cette table o toutes les variables logiques sont poses avec leur rsultat sappelle une table de vrit Chaque case prend une valeur VRAI ou FAUX et la colonne finale le rsultat attendu luimme VRAI ou FAUX Remplacez VRAI et FAUX par les valeurs binaires respectives 1 et 0 Emetteur Rcepteur Communication FAUX nappelle pas FAUX ne dcroche pas FAUX pas de comm FAUX nappelle pas VRAI dcroche FAUX pas de comm VRAI appelle FAUX ne dcroche pas FAUX pas de comm VRAI appelle VRAI dcroche VRAI communication Emetteur Rcepteur Communication 0 0 0 0 1 0 1 0 0 - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 62
Il y a des fois o il y a videmment plus de deux variables logiques Prenez lexemple suivant Quand dcrochezvous votre tlphone Quand il sonne Quand vous voulez appeler quelquun Sil sonne voulezvous vraiment rpondre si vous avez laffichage du nom ou du numro de lappelant vous voudrez peuttre filtrer vos appels Quels postulats posezvous Vous dcrochez si Le tlphone sonne ET vous voulez rpondre Vous voulez appeler quelquun Autrement dit DcrocherSonnerie ET volont de rpondre OU envie dappeler quelquun Dcrocher est VRAI si votre tlphone sonne VRAI ET que vous voulez rpondre VRAI OU si vous voulez appeler quelquun VRAI b La vrit Vous avez vu cidessus une table de vrit Pour tablir celleci vous avez besoin de variables logiques qui ne prennent que deux valeurs VRAI ou FAUX quon appelle les valeurs de vrit Ces valeurs forment un ensemble appel B VRAI et FAUX ne ncessitent que deux chiffres pour tre reprsents 1 et 0 Lensemble B se note ainsi B10 En mathmatique vous connaissez probablement dautres ensembles comme par exemple lensemble N des entiers naturels Sur ces ensembles sappliquent des lois des thormes des transformations Cest pareil pour lensemble B qui est rgit par des lois et des transformations De cellesci peuvent tre dduites une grande quantit de proprits et de drivations c La loi ET Vous la connaissez dj depuis le chapitre Les variables et oprateurs et loprateur logique associ La loi ET est aussi appele la conjonction Elle snonce ainsi A ET b est VRAI si et seulement si a est VRAI et b est VRAI La loi ET utilise une notation particulire diffrente selon le champ dapplication quotquot le point ab quotquot ab quotampquot quotampampquot ou quotANDquot en programmation selon les langages La suite du chapitre utilisera la premire notation avec le point Cette loi est souvent associe une vraie multiplication car 0n vaut toujours 0 Cependant attention certaines proprits ne sappliquent pas du tout de la mme manire La loi ET peut tre dcrite sous forme de table ne pas confondre avec une table de vrit Elle ressemble plutt une table de multiplication d La loi OU Vous connaissez aussi cette loi rencontre au chapitre Les variables et oprateurs avec loprateur logique associ OU La loi OU est aussi appele la disjonction Vous trouvez parfois aussi disjonction inclusive afin de la diffrencier dun autre oprateur Elle snonce ainsi A OU b est VRAI si et seulement si a est VRAI ou b est VRAI Notez que le OU tant inclusif on y vient si a et b sont VRAIS tous les deux a OU b est VRAI aussi Du moment quau moins lun des deux est vrai a OU b est VRAI Les notations suivantes sont utilises quotquot signe plus ab quotquot ab 1 1 1 Loi ET ab 0 1 0 0 0 1 0 1 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 63
quotquot quotquot quotORquot selon les langages de programmation La suite utilisera la premire notation avec le signe La loi OU est souvent associe avec laddition ce qui se rvle totalement faux En effet 11 addition binaire vaut 0 avec une retenue de 1 Or 11 est VRAI donc 1 Attention au danger La loi OU peut tre dcrite sous forme de table e Le contraire Le contraire appel aussi ngation se dfinit ainsi Le contraire de a est VRAI seulement si a est FAUX Vous avez dj rencontr le contraire avec loprateur NON Le contraire est not comme ceci nona a quotquot quotNOTquot quotquot selon les langages de programmation Ainsi il suffit de retenir que 10 et que 01 Par la suite ce sont les formes ou qui seront utilises selon le cas ex pour non non a f Les proprits Elle est identique lalgbre classique Dans certains cas les parenthses sont inutiles Ainsi abcabcabc Et encore abcabcabc Elle indique que lordre des variables logiques na aucune importance abba Et encore abba Attention cette fois il y a une diffrence importante par rapport lalgbre classique et la distribution lie aux oprateurs et Cest la raison pour laquelle il a t expliqu quil ne fallait pas les confondre avec les symboles logiques En effet si abcabac est identique abcabac ne lest pas du tout mais est parfaitement correct en algbre de Boole Lidempotence signifie que si on applique la mme opration une ou plusieurs fois alors on retrouve toujours le mme rsultat Par exemple 31 vaut toujours 3 mme si vous divisez n fois par 1 Cette proprit sapplique aux deux oprateurs Ainsi aaaaaaaa etca et aaaaaa etca Loi OU ab 0 1 0 0 1 1 1 1 Lassociativit La commutativit La distributivit Lidempotence - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 64
La ngation de la ngation dune variable logique est gale la variable logique Ainsi la phrase La vie est belle quivaut quotLa vie nest pas non bellequot En termes logiques anon non a a De mme aa1 En effet lexpression quotLa vie est belle OU la vie nest pas bellequot quivaut 01 ce qui est VRAI daprs la loi OU lune des variables au moins tant vraie Enfin aa0 quivaut dire que quotLa vie est belle ET la vie nest pas bellequot ce qui videmment est impossible Daprs la loi ET 100 donc FAUX En calcul classique si vous faites 123 vous obtenez 7 car la multiplication est prioritaire sur laddition En algbre de Boole les priorits sappliquent aussi Le ET est prioritaire sur le OU Vous pouvez cependant influer sur les priorits avec les parenthses Voici deux exemples Dans les deux cas a est FAUX 0 b est VRAI 1 et C est VRAI 1 Exemple 1 abc Le ET est prioritaire on commence par bc 111 Puis on passe au OU 011 On obtient donc abcVRAI Exemple 2 abc Le ET est prioritaire on commence par ab 010 Puis on passe au OU 011 On obtient donc abc1 VRAI Comme tout algbre celui de Boole dispose aussi de ses thormes Le thorme de De Morgan tablit deux vrits sympathiques qui sont souvent utiles pour rduire des calculs boolens et aussi dans ltablissement des tests et conditions Ce sont en fait les proprits associes au contraire NON ngation Prenez la table de vrit suivante Prenez maintenant cette seconde table de vrit Comparez les dernires colonnes et vous obtenez lgalit suivante abab La complmentarit La priorit Le thorme de De Morgan a b ab ab 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 a b a b a b 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 65
Dans les deux cas le rsultat sera VRAI uniquement si a ET b sont FAUX De la mme manire avec une table de vrit plus complte Comparez la colonne centrale avec la colonne finale et vous obtenez abab Dans les deux cas le rsultat sera VRAI seulement si a OU b sont FAUX g Quelques fonctions logiques 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 quotcblesquot en dur au sein des microprocesseurs et proposes par quelques langages de programmation Pas de jeu de mots ici rien voir avec la srie japonaise Dans le OU appel OU inclusif le rsultat est VRAI si a ou b ou les deux sont 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 algbre de Boole a OU b ET PAS a ET b soit abab Si on dveloppe on obtient abab le dernier terme provient du thorme de De Morgan aaabbabb aa et bb valent toujours 0 FAUX on les supprime il reste abab Voici sa table de vrit Le OU exclusif est not XOR le X pour eXclusif Vous le rencontrez sous ces notations quotquot diffrent de en effet XOR est parfaitement quivalent quotquot un entour ab Si le XOR nest pas ou peu utilis en algorithmique beaucoup de langages de programmation le proposent permettant de remplacer 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 lectronique les applications sous forme de porte logique sont nombreuses Lquivalence porte trs bien son nom Note EQV elle signifie que a EQV b est VRAI si et seulement si a et b ont la mme valeur En algbre de Boole NON a OU b OU a ET b soit abab a b ab ab a b a b 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 Le OU exclusif XOR a b ab 0 0 0 0 1 1 1 0 1 1 1 0 Lquivalence EQV - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 66
Si on dveloppe on obtient abab le premier terme provient du thorme de De Morgan aaabbabb aa et bb valent toujours 1 VRAI on les supprime il reste abba Voici la table de vrit de EQV Vous devez remarquer que lquivalence est le contraire du XOR Autrement dit a EQV b a XOR b Si vous dveloppez encore la ngation de abba laide des proprits et du thorme de De Morgan vous retrouvez la formule algbrique de XOR Le EQV est souvent reprsent par le symbole quotquot ab La plupart des langages ne proposent pas ces fonctions Limplication indique que a est une condition suffisante pour b tandis que b est une condition ncessaire pour a Cela signifie que si b est vrai ou bien que si a et b sont identiques lexpression est toujours vraie Limplication se note a IMP b a IMP b ab Linhibition est le contraire de limplication elle se note a INH b a INH b ab h Avec plus de deux variables Rien nempche et bien au contraire dutiliser plus de deux variables logiques dans des expressions de lalgbre de Boole Reprenez lexemple de ltablissement de la communication tlphonique Elle dispose de trois variables a b ab 0 0 1 0 1 0 1 0 0 1 1 1 Limplication et linhibition a b ab 0 0 1 0 1 1 1 0 0 1 1 1 A b Ab 0 0 0 0 1 0 1 0 1 1 1 0 ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 67
sonner qui sera appele a rpondre qui sera appele b et appeler qui sera appele c Le rsultat dcrocher sera d mais nintervient pas dans les calculs Quelle est la table correspondante Attention il y a un pige VRAI est reprsent par 1 FAUX par 0 Avezvous trouv le pige a sonne on na pas envie de rpondre mais on veut appeler pour appeler Dans ce cas vous nallez pas dcrocher vous attendrez que le tlphone arrte de sonner or cidessus vous le faites quand mme Donc la table cidessus nest pas correcte Une ligne est fausse Voici la bonne table La difficult consiste maintenant trouver comment depuis cette table de vrit dfinir une expression boolenne qui retourne VRAI Vous constatez que seules quatre lignes de la table de vrit sont vraies cestdire que la personne va vraiment dcrocher Le rsultat est 1 quand a b et c valent 0 0 1 0 1 1 1 1 0 1 1 1 Vous pouvez aussi crire que d est vrai quand abc001 ou 011 ou 110 ou 111 Convertissez cet nonc en expression boolenne dabcabcabcabc a sonner b rpondre c appeler d dcrocher 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 a sonner b rpondre c appeler d dcrocher 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 1 Trouver lexpression minimale - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 68
Il est intressant de remarquer que les deux premiers termes de lexpression peuvent tre factoriss par ac et les deux derniers par ab selon la proprit de distributivit Le rsultat devient donc dacbbabcc De mme comme la proprit de complmentarit indique que aa1 les expressions bb et cc sont toujours vraies Elles peuvent tre supprimes Le rsultat final devient dacab 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 clater les expressions boolennes En algorithmique lexpression boolenne prcdente serait traduite ainsi dans un test PROGRAMME TELEPHONE VAR abcdboolens DEBUT aVRAI bVRAI cFAUX Si NON a ET b OU a ET c Alors dVRAI Sinon dFAUX FinSi Si dVRAI Alors Afficher quotJe dcrochequot Sinon Afficher quotJe ne dcroche pasquot FinSi FIN De manire plus simple rien nempche de faire ceci PROGRAMME TEL2 VAR abcd boolens DEBUT aVRAI bVRAI cFAUX dNON a ET b OU a ET c Si d Alors Afficher quotJe dcrochequot Sinon Afficher quotJe ne dcroche pasquot FinSi FIN Le quotSi dquot quivaut quotSi dVRAIquot 5 Une dernire prcision Soit les conditions suivantes quotSil fait chaud et quil ne pleut pas alors je vais me promenerquot Vous aurez parfois la tentation de faire ceci PROGRAMME CHAUD VAR chaudpleuvoirboolens DEBUT chaudVRAI pleuvoirFAUX Si chaudVRAI Alors Si pleuvoirFAUX Alors Afficher quotJe me promne quot Sinon Afficher quotJe rentrequot FinSI Sinon Afficher quotJe rentre quot FinSI Fin Application dans lalgorithme ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 69
Cest possible a marche mais somme toute ce nest pas trs beau Deux tests deux conditions et une rptition inutile Pourquoi ne pas faire ceci PROGRAMME CHAUDMIEUX VAR chaudpleuvoir boolens FIN chaudVRAI pleuvoirFAUX Si chaudVRAI ET pleuvoirFAUX Alors Afficher quotJe me promne quot Sinon Afficher quotJe rentre quot 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 algorithme a plus de classe que le prcdent Et pour pater un peu plus vos ventuels professeurs pourquoi ne pas remplacer le test par Si chaud ET NON pleuvoir Alors - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0URDDA1CdzIgLAA-enidentnumber 70
Les structures itratives 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 structures de base Les boucles sont des structures itratives Une itration ou structure itrative est une squence dinstructions destine tre excute plusieurs fois Cest aussi laction dexcuter cette instruction Vous entendrez parler parfois de structures rptitives cest la mme chose dite autrement Le but dune boucle est de rpter un bloc dinstructions plusieurs fois Selon le type de boucle ce bloc va tre rpt un nombre fixe de fois n fois ou selon un certain nombre de critres un test de une ou plusieurs conditions que vous connaissez trs bien maintenant 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 justement des fameux critres de sortie Si les tests excutent une action donne structure SI en cas de russite ou non une erreur dans une condition de sortie peut amener au mauvais nombre de boucles ne jamais y rentrer ou mme pire ne jamais en sortir La boucle est dautant moins simple assimiler quil est probable que vous nayez jamais rencontr une structure de ce genre hors de lalgorithmique et des langages de programmation Dans le langage courant on ne parle pas de boucle quand il sagit de rciter une table de multiplication En algorithmique vous devrez pourtant en utiliser une pour calculer cette table De mme dans lutilisation quotidienne de lordinateur vous nutilisez pas cette structure pourtant tous les programmes le font Comment lire lintgralit dun fichier de traitement de texte Comment jouer un mp3 ou une vido laide des boucles bien entendu 2 Quelques usages simples Un exemple simple cest le cas o un utilisateur doit rpondre une question parmi une liste de rponses imposes comme o oui ou n non Si lutilisateur rpond autre chose nimporte quoi il faut lui reposer la question jusqu ce quil rponde vraiment o ou n Pour crer une table de multiplication de 3 par exemple vous allez procder comme si vous la rcitiez 313 226 339 3927 31030 Vous allez donc multiplier 3 successivement par les nombres de 1 10 En algorithmique vous connaissez les variables Comment affecter une valeur de 1 10 successivement une variable Avec une boucle Et si maintenant vous vouliez crer lensemble des tables de multiplication tables de 1 de 2 etc jusqu 10 ou plus Il vous faudra imbriquer deux boucles Si vous voulez calculer une puissance quelconque une factorielle sortir le plus grand des nombres parmi une liste de nombres saisis en attendant les tableaux etc il faudra encore utiliser les boucles 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 et quelques astuces Vous verrez quavec les boucles vous pourrez mme extraire les racines carres Ces exemples simples mettent en vidence au moins trois choses Il existe plusieurs types de boucles certaines ont un nombre fixe ditrations dautres dpendent de conditions de sortie que vous aurez dfinir ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0dbo8DFCdzIgLAA-enidentnumber 71
Il est possible dimbriquer plusieurs niveaux de boucles vous pouvez faire des boucles dans des boucles autant de fois que vous le voulez Il existe une quantit infinie dutilisation des boucles qui en font une structure incontournable en programmation pour la moindre des applications un tant soit peu complexe - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0dbo8DFCdzIgLAA-enidentnumber 72
Tant Que 1 Structure gnrale La boucle de type quotTant Quequot permet la rptition dun bloc dinstructions tant que la condition teste est vrifie donc vraie Sa syntaxe est la suivante Tant Que boolen Faire Bloc dinstructions FinTantQue Lors de lexcution du programme celuici arrive sur linstruction quotTant quequot Il value lexpression boolenne une ou plusieurs conditions ou une seule variable Si lexpression retourne VRAI alors le programme excute les instructions suivantes jusqu ce quil arrive au quotFinTantQuequot Arriv ici il remonte au quotTant Quequot et value de nouveau lexpression boolenne si cest VRAI alors il excute de nouveau les instructions et ainsi de suite tant que lexpression retourne VRAI Si lexpression devient fausse alors le programme saute linstruction situe juste aprs le quotFinTantQuequot Voici un simple exemple qui compte de 1 10 PROGRAMME TQUE1 VAR Cptentier DEBUT Cpt1 Tant que Cptlt10 Faire Afficher Cpt CptCpt1 FinTantQue FIN En Java la boucle quotTantQuequot est reprsente par quotwhilequot avec lexpression boolenne entre parenthses whilebooleen bloc dinstructions Si une seule instruction est prsente au sein de la boucle les accolades sont inutiles whileboolen instruction Voici le code Java correspondant lalgorithme TQUE1 class chap4tq1 public static void mainString args int cpt cpt1 whilecptlt10 Systemoutprintlncpt cpt 2 Boucles infinies et quotbreakquot Faites toujours bien attention ce que votre boucle dispose dune condition de sortie En effet rien ne vous empche de faire des boucles infinies Dans le cas dune structure itrative quotTant Quequot il suffit que la condition soit toujours VRAIE par exemple Tant que VRAI Faire FinTantQue ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 73
Ou encore Tant que aa FinTantQue En Java a se traduit par whiletrue Dans les deux cas lexpression boolenne est toujours vraie donc le programme ne sort jamais de la boucle La plupart des langages C C Java PHP etc proposent des instructions spciales qui permettent de sortir dune boucle depuis nimporte quel endroit du bloc dinstructions instruction break ou mme de relancer la boucle remonter directement au Tant Que sans excuter le reste des instructions instruction continue Lune des premires choses que vous devez apprendre en algorithmique avec les boucles cest que sans vouloir paratre excessif lutilisation des break et continue est trs dconseille de nombreux programmeurs et pas forcment en herbe parsment lintrieur de leurs boucles de conditions de sorties supplmentaires quils nomment souvent des quotcas spciauxquot quotje nai pas prvu de grer a dans un cas gnral alors je place une srie dexceptionsquot Or lobjectif nest pas de multiplier ces conditions mais de toutes les runir au sein de lunique expression boolenne du Tant Que Il faut donc runir toutes les conditions darrt de la boucle en un seul point Le quotbreakquot existe tel quel en Java Voici donc un exemple de ce que thoriquement il ne faut pas faire class chap4break public static void mainString args int cpt cpt1 whiletrue Systemoutprintlncpt ifcpt10 break cpt En algorithmique il est toujours possible de trouver une expression boolenne mme si elle est longue et complexe permettant dviter lutilisation de quotbreakquot et de quotcontinuequot Si vous ntes pas daccord votre professeur risque de vous mettre au dfi de trouver un exemple contradictoire Peine perdue Il faut cependant modrer ces propos Linterruption dune boucle au milieu de celleci est dconseille certes Mais comme pour tout il faut se mfier des gnralisations Il y a videmment des cas o il devient bien trop compliqu de crer des boucles uniquement pour respecter ce principe Sil faut crer une expression boolenne rallonge et bidouiller cest le mot parfois son bloc dinstructions avec des mthodes tarabiscotes des drapeaux tout va par exemple dautant plus que celuici prend dj un grand nombre de lignes autant utiliser un break Au contraire utiliser les breaks tort et travers nest pas recommandable Le tout est de trouver un quilibre entre la condition de sortie et la lisibilit de lalgorithme Enfin le but nest pas de crer des boucles dont le bloc dinstructions fait dix pages cest une faon de parler Dans ce cas il est certes intelligent de runir toutes les conditions de sortie en un point a amliore la lisibilit Cependant vous risquez de vous perdre dans votre propre programme do les indentations Vous apprendrez plus loin dans ce livre la notion de fonctions et de procdures qui vous permettra un dcoupage fin de vos blocs dinstructions qui vous simplifieront la vie 3 Des exemples a Une table de multiplication Pourquoi ne pas sattaquer aux exemples cits cidessus et mme plus pour vous entraner Commencez par la table de multiplication Aprs avoir saisi le numro de la table demande un compteur est initialis 1 Tant que ce compteur est infrieur ou gal 10 on le multiplie par le numro de table puis aprs avoir affich le rsultat on lincrmente Dans la dernire boucle le compteur passe de 10 11 Une fois remont au Tant Que lexpression - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 74
devient fausse la boucle est termine et le programme se termine PROGRAMME MUTLI1 VAR tablecptresultatentiers DEBUT Afficher quotQuelle table de multiplication quot Saisir table cpt1 Tant que cptlt10 Faire resultatcpttable Afficher tablequotxquotcptquotquotresultat cptcpt1 FinTantQue FIN Ce qui donne en Java import javaio class chap4multi1 public static void mainString args int cpttableresultat1 String txtquotquot BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotTable quot txtsaisiereadLine catchException excp SystemoutprintlnquotErreurquot tableIntegerparseInttxt cpt1 whilecptlt10 resultattablecpt Systemoutprintlntablequotxquotcptquotquotresultat cpt b Une factorielle Dans le mme ordre dide voici un petit algorithme qui calcule une factorielle Pour rappel la factorielle de n scrit n et se calcule en multipliant toutes les valeurs de 1 n Ainsi 1010987654321 soit 3628800 a monte trs vite Dans chaque passage dans la boucle il sagit de multiplier le compteur par le rsultat de la multiplication 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 lalgorithme comptera lenvers il partira de n pour descendre jusqu deux PROGRAMME FACT VAR cptresultatentiers DEBUT Afficher quotQuelle factorielle quot Saisir cpt resultatcpt Tant que cptgt2 Faire cptcpt-1 resultatcptresultat FinTantQue Afficher resultat FIN Ce qui donne en Java ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 75
import javaio class chap4fact public static void mainString args int cptresultat1 String txtquotquot BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotTable quot txtsaisiereadLine catchException excp SystemoutprintlnquotErreurquot cptIntegerparseInttxt resultatcpt whilecptgt2 cpt- resultatresultatcpt Systemoutprintlnresultat c x la puissance y Il sagit cette fois dlever une valeur une puissance quelconque Pour rappel xn est gal xxxx n fois Cest donc trs simple une boucle Tant Que qui va compter de 1 n dans laquelle le rsultat de la multiplication prcdente va tre multipli par x PROGRAMME puissance VAR xncptresultatentiers DEBUT Afficher quotxn quot Saisir xn cpt1 resultat1 Tant que cptltn Faire resultatresultatx cptcpt1 FinTantQue Afficher resultat FIN Cet algorithme fonctionne bien mais ne gre pas tous les cas En fait il fonctionne uniquement si la puissance est suprieure ou gale zro Si n vaut zro le programme ne rentre mme pas dans la boucle et le rsultat vaut 1 Si n vaut un resultat vaut x Et pour les puissances ngatives xn est gal 1xn Il sagit donc de dterminer le signe de la puissance et de faire une division Il faut aussi rcuprer la valeur absolue de la puissance ce que vous savez dj faire Dans lalgorithme suivant un drapeau signe est utilis pour savoir si n est ngatif ou non afin deffectuer une division la fin Variables xnsignecptresultat en Numrique Dbut Signe0 Ecrire quotxn quot Lire xn Si nlt0 Alors Signe1 n-n FinSI cpt1 resultat1 Tant que cptltn Faire resultatresultatx - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 76
cptcpt1 FinTantQue Si signe1 Alors Resultat1resultat FinSi Ecrire resultat Fin Ce qui donne en Java import javaio class chap4puissance public static void mainString args long x1n1cpt double resultat boolean signefalse String t1quotquott2quotquot BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try Systemoutprintlnquotxy quot t1saisiereadLine t2saisiereadLine catchException excp SystemoutprintlnquotErreurquot xLongparseLongt1 nLongparseLongt2 ifnlt0 n-n signetrue cpt1 resultat1 whilecptltn resultatresultatx cpt ifsigne resultat1resultat Systemoutprintlnresultat d Toutes les tables de multiplication Tout comme les tests il est tout fait possible dimbriquer les boucles cestdire de mettre une boucle dans une autre boucle sur autant de niveaux que vous le souhaitez Vous pouvez envisager 1 2 3 n niveaux mais a risque 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 reprsenter la table calculer de 1 10 La seconde lintrieur de la premire va multiplier la table donne de 1 10 Vous avez donc deux boucles de 1 10 Simulez ce quil se passe Premire boucle table des 1 Seconde boucle excution de 11 12 13 110 Premire boucle table des 2 Seconde boucle excution de 21 22 23 210 Premire boucle table des 3 Seconde boucle excution de 31 32 33 310 Premire boucle table des 10 Seconde boucle excution de 101 102 103 ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 77
Voici lalgorithme correspondant chaque passage dans la premire boucle le compteur de la seconde boucle repasse un Cest dans la seconde boucle qua lieu le calcul et laffichage de la table de multiplication PROGRAMME MULTI2 VAR tablecptresultat entiers DEBUT table1 Tant Que tablelt10 Faire Afficher quotTable des quottable cpt1 Tant que cptlt10 Faire resultatcpttable Afficher tablequotxquotcptquotquotresultat cptcpt1 FinTantQue Tabletable1 FinTantQue Fin La mme chose en Java class chap4multi2 public static void mainString args int cpttableresultat1 table1 whiletablelt10 Systemoutprintlnquottable des quottable cpt1 whilecptlt10 resultattablecpt Systemoutprintlntablequotxquotcptquotquotresultat cpt table e Saisie de notes et calcul de moyennes Le but de lalgorithme suivant est dinviter lutilisateur saisir des notes dtudiants entre 0 et 20 de dterminer la 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 question lui est repose sachant que 1 correspond une fin de saisie Procdez par tapes Commencez tout dabord par cette partie de lalgorithme la saisie des notes Il faut pour cela utiliser une boucle dont lunique condition de sortie est une note de 1 PROGRAMME NOTE VAR noteentier Dbut Afficher quotEntrez une notequot Saisir note Tant que notegt-1 Faire Si note gt20 Alors Tant que notelt-1 ou notegt20 Faire Afficher quotErreur 0-gt20 -1 sortie quot Saisir note FinTantQue FinSi Si noteltgt-1 Alors Afficher quotEntrez une notequot Saisir note FinSi - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 78
FinTantQue Fin Ce qui donne en Java import javaio class chap4note public static void mainString args String tnote int note BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotNote lt-1sortie quot tnotesaisiereadLine noteIntegerparseInttnote whilenotegt-1 ifnotegt20 whilenote lt-1 notegt20 SystemoutprintlnquotErreur Note -1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnotegt-1 SystemoutprintlnquotNote actuelle quotnote SystemoutprintlnquotNote -1sortie quot tnotesaisiereadLine noteIntegerparseInttnote catchException excp SystemoutprintlnquotErreurquot Cet algorithme montre quune simple rptition de saisie est plus complexe quil ny parait Au tout dbut lutilisateur se voit poser une premire fois la question sil rpond quot1quot tout de suite il nentre mme pas dans la boucle Dans la premire boucle une vrification est effectue sur la validit de la note saisie estelle suprieure 20 Si oui alors il faut de nouveau effectuer une saisie et reposer en boucle la question autant de fois que ncessaire cestdire tant que la note saisie nest pas comprise entre 1 et 20 Sachant que 1 est une condition de sortie tous les traitements y compris la saisie dune nouvelle note ne doivent pas tre effectus dans ce cas Vous avez ici une trs belle application dun cas o un quotbreakquot aurait pu effectivement tre utilis Voici un exemple incomplet qui remplace le dernier quotSiquot de lalgorithme prcdent Tant que notegt-1 Faire Si note-1 Alors break FinSi Ecrire quotEntrez une notequot Lire note FinTantQue La boucle principale peut en effet tre directement interrompue ds quune note de 1 est rencontre Dans ce cas il serait mme possible daller plus loin en considrant la premire boucle comme infinie et en effectuant dedans toutes les saisies et la condition de sortie Variable note en Numrique Dbut Tant que VRAI Faire Ecrire quotEntrez une notequot Lire note ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 79
Si notelt-1 ou notegt20 Alors Tant que notelt-1 ou notegt20 Faire Ecrire Erreur 0-gt20 -1 sortie quot Lire note FinTantQue FinSi Si note-1 Alors break FinSi FinTantQue Fin Ce qui donne en Java import javaio class chap4note2 public static void mainString args String tnote int note BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try whiletrue SystemoutprintlnquotNote lt-1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnotegt20 whilenotelt-1 notegt20 SystemoutprintlnquotErreur Note -1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnote-1 break Systemoutprintlnnote catchException excp SystemoutprintlnquotErreurquot Il est encore possible daller plus loin en Java avec linstruction continue En effet plutt que de crer une nouvelle boucle en cas derreur de saisie pourquoi ne pas relancer celleci au dbut Le bloc central dinstructions devient donc whiletrue SystemoutprintlnquotNote lt-1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnotegt20 SystemoutprintlnquotErreurquot continue ifnote-1 break Systemoutprintlnnote Comme vous pouvez le constater cet algorithme est un peu plus court que loriginal avec notamment une saisie en moins une expression boolenne en moins dans la condition de la premire boucle un quotsinonquot en moins Cependant fondamentalement cet algorithme est moins propre Comme indiqu prcdemment le break est en principe dconseill et il vaut mieux que la boucle ellemme ait une condition de sortie afin dviter une catastrophe en cas de modification du bloc dinstructions quelle contient Il faut maintenant complter lalgorithme dorigine pour y rajouter nos variables - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 80
Un compteur du nombre de notes La note minimale La note maximale La somme de toutes les notes La moyenne La moyenne seffectue en sortie de la boucle principale une fois lensemble des notes saisi Il faut veiller ce quau moins une note ait t saisie sinon lalgorithme effectuerait une division par zro ce qui est videmment impossible Au sein de la boucle et seulement si la note saisie est diffrente de 1 lalgorithme compare la plus basse note avec la note actuelle qui devient la plus basse le cas chant la mme chose est faite pour la note la plus haute vous prendrez soin dinitialiser correctement ces valeurs ds le dbut et le total des notes est calcul En sortie de boucle il ne reste plus qu faire une division Variables notecptminmaxsummoy en Numrique Dbut min20 max0 cpt0 sum0 Ecrire quotEntrez une notequot Lire note Tant que notegt-1 Faire Si note gt20 Alors Tant que notelt-1 ou notegt20 Faire Ecrire quotErreur 0-gt20 -1 sortie quot Lire note FinTantQue FinSi Si note-1 Alors cptcpt1 sumsumnote Si noteltmin Alors minnote FinSI Si notegtmax Alors maxnote FinSI Ecrire quotEntrez une notequot Lire note FinSi FinTantQue Si cptgt0 Alors moysumcpt Ecrire quotNombre de notes quotcpt Ecrire quotNote la plus basse quotmin Ecrire quotNote la plus haute quotmax Ecrire quotMoyenne quotmoy Sinon Ecrire quotAucune note na t saisiequot FinSI Fin Le code Java prend quelques lgres distances avec cet algorithme en utilisant honteusement les facilits offertes par break et continue import javaio class chap4moymax public static void mainString args String tnote int noteminmaxsumcpt float moy BufferedReader saisie ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 81
min20 max0 cpt0 sum0 saisienew BufferedReadernew InputStreamReaderSystemin try whiletrue SystemoutprintlnquotNote lt-1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnotegt20 SystemoutprintlnquotErreur nouvelle saisiequot continue ifnote-1 break cpt sumsumnote ifnoteltmin minnote ifnotegtmax maxnote Systemoutprintlnnote ifcpt0 moysumcpt Systemoutprintlnquotcptquotcpt Systemoutprintlnquotminquotmin Systemoutprintlnquotmaxquotmax Systemoutprintlnquotmoyquotmoy catchException excp SystemoutprintlnquotErreurquot f Rendez la monnaie Le but de cet algorithme est de calculer un rendu de monnaie en fonction de la valeur des pices et des billets en dterminant combien de billets de telle valeur ou de pices de telle valeur il faut rendre Il sagit donc de transformer une somme en coupures correspondantes Par exemple 189867 euros peuvent se dcomposer en 3 billets de 500 euros 1 billet de 200 euros 1 billet de 100 euros 1 billet de 50 euros 2 billets de 20 euros 1 billet de 5 euros 1 pice de 2 euros 1 pice de 1 euro 1 pice de 50 centimes 1 pice de 10 centimes - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 82
1 pice de 5 centimes 1 pice de 2 centimes Autant le dire tout de suite cet algorithme est le paradis des boucles Il en faudra une par valeur faciale de billet ou de pice Le principe est en effet trs simple Il sagit de soustraire au sein dune boucle la valeur faciale du billet par exemple 500 euros au montant total tant que ce montant est suprieur ou gal la valeur du billet chaque passage dans la boucle on compte un billet Puis on passe au billet suivant et ainsi de suite Voici un exemple pour 1700 euros avec uniquement des billets de 500 euros Variables montant nb500 en Numrique Dbut montant1700 nb5000 Tant Que montantgt500 Faire nb500nb5001 montantmontant-500 FinTantQue Ecrire nb500 montant Fin Ce qui donne en Java class chap4monnaie public static void mainString args String tnote int montantnb500 montant1700 nb5000 whilemontantgt500 nb500 montantmontant-500 SystemoutprintlnquotNombre de billets de 500 quotnb500 SystemoutprintlnquotReste quotmontant Que se passetil la sortie de la boucle nb500 vaut 3 et montant vaut 200 cest le reste Aussi il faut gnraliser lalgorithme pour toutes les valeurs Variables montantnb500nb200nb100nb50nb20nb10nb5 en Numrique Variables nb5nb2nb1nb05nb02nb01nb005nb002nb001 en Numrique Dbut montant1700 nb5000 nb2000 nb1000 nb500 nb200 nb100 nb0020 nb0010 Tant Que montantgt500 Faire nb500nb5001 montantmontant-500 FinTantQue Tant Que montantgt200 Faire nb200nb2001 montantmontant-200 FinTantQue Tant Que montantgt100 Faire nb100nb1001 montantmontant-100 FinTantQue Tant Que montantgt50 Faire ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 83
nb50nb501 montantmontant-50 FinTantQue Tant Que montantgt20 Faire nb20nb201 montantmontant-20 FinTantQue Tant Que montantgt002 Faire nb002nb0021 montantmontant-002 FinTantQue Tant Que montantgt001 Faire nb001nb0011 montantmontant-001 FinTantQue Si nb500gt0 Alors Ecrire nb500quot billets de 500 eurosquot FinSI Si nb200gt0 Alors Ecrire nb200quot billets de 200 eurosquot FinSI Si nb002gt0 Alors Ecrire nb002quot pices de 2 centimesquot FinSI Si nb001gt0 Alors Ecrire nb001quot pices de 1 centimequot 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 quotquot 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 puis dans le suivant encore avec les fonctions g Trois boucles Un dernier exemple de boucle quotTant Quequot va vous montrer une intgration avec trois boucles Le but de cet anodin algorithme est de trouver pour quelles valeurs de A B et C ABCA3B3C3 A reprsentant les centaines B les dizaines et C les units La recherche sera limite pour chaque valeur entire comprise entre 1 et 10 bien entendu 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 rsultats affichs en cas dgalit Variables abcnb1nb2 en Numrique Dbut a1 b1 c1 Tant que alt10 Faire Tant que blt10 Faire Tant que clt10 Faire nb1a100b10c nb2a3b3c3 Si nb1nb2 Alors Ecrire nb1abc FinSI cc1 FinTantQue bb1 FinTantQue aa1 FinTantQue Fin - 12 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 84
Si vous convertissez ce programme en Java vous devriez obtenir seulement deux possibilits 153 et 371 En effet 337313273431371 Voici le programme quivalent en Java class chap4troisboucles public static void mainString args double xyznb1nb2 x1 whilexlt100 y1 whileylt100 z1 whilezlt100 nb1x100y10z nb2Mathpowx3Mathpowy3Mathpowz3 ifnb1nb2 Systemoutprintlnxquot quotyquot quotz z y x ENI Editions - All rigths reserved - Jonifar lina - 13 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE06wKxElCdzIgLAA-enidentnumber 85
Rpter Jusqu 1 Diffrences fondamentales Malgr labondance dexemples vus jusqu prsent la structure itrative quotTant Quequot nest pas la seule Mme sil est possible de tout programmer avec ce type de boucle il en manque encore deux dont la structure quotRpter Jusququot Son pseudocode est le suivant Rpter Bloc dinstructions Jusqu boolen Le quotRpterquot ressemble fortement au quotTant quequot avec cependant deux importantes diffrences Quoi quil arrive il y aura toujours au moins un passage dans la boucle le bloc dinstructions sera excut au moins une fois Lexpression boolenne finale est inverse Un tant que a 1 devient un quotjusqu a1quot Le quotjusququot se comprend comme quotjusqu ce que la condition soit vrifiequot 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 celuici devient un peu plus simple PROGRAMME REPETE VAR Noteentier Dbut Rpter Ecrire quotSaisissez une notequot Lire note Si notelt-1 OU notegt20 Alors Rpter Ecrire quotErreur 0-gt20 -1 sortie quot Lire note Jusqu notegt-1 ET note lt20 FinSI Si note-1 Alors FinSI Jusqu note-1 Fin Le langage Java ne propose pas de structure quotrpter jusququot Par contre il propose une structure quotrpter Tant Quequot Il suffit donc uniquement dinverser la condition de sortie du jusqu do bloc dinstructions whilecondition Le programme Java avec quelques facilits pourrait tre import javaio class chap4note4 public static void mainString args String tnote int note BufferedReader saisie ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0GSeGVCdzIgLAA-enidentnumber 86
saisienew BufferedReadernew InputStreamReaderSystemin try do SystemoutprintlnquotNote lt-1sortie quot tnotesaisiereadLine noteIntegerparseInttnote ifnotegt20 SystemoutprintlnquotErreurquot continue ifnotegt-1 Systemoutprintlnnote whilenotegt-1 catchException excp SystemoutprintlnquotErreurquot Notez bien attentivement la condition de sortie centrale la note doit tre suprieure ou gale 1 ET infrieure ou gale 20 pour sortir de la saisie Avec le quotTant quequot la boucle continuait tant que la note tait infrieure 1 OU suprieure 20 Une nuance mais de taille Ces nuances sont lune des raisons qui font que des tudiants et des programmeurs pourtant parfois chevronns sy perdent Cest aussi lune des raisons qui fait que la boucle quotRpter jusququot nest pas prsente dans certains langages comme le C ou Java En Java cependant vous trouvez une boucle quivalente au quotRpter Tant Quequot le quotdo whilequot qui reprend le fait dune itration obligatoire mais avec les mmes expressions boolennes que le quotTant Quequot initial 2 Quelques exemples adapts a La factorielle Inutile de dcrire nouveau le principe La boucle doit tre quitte quand le compteur vaut 2 Variables cpt resultat en Numrique Dbut Ecrire quotQuelle factorielle quot Lire cpt resultatcpt Rpter cptcpt-1 resultatcptresultat Jusqu cpt2 Ecrire resultat Fin b Les trois boucles L encore mme programme mais style diffrent Notez que ici les compteurs partent de 0 afin dtre incrments en dbut de boucle dans le but de rendre la condition de sortie plus lisible gale 10 Variables abcnb1nb2 en Numrique Dbut a0 b0 c0 Rpter aa1 Rpter bb1 Rpter cc1 nb1a100b10c - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0GSeGVCdzIgLAA-enidentnumber 87
nb2a3b3c3 Si nb1nb2 Alors Ecrire nb1abc FinSI Jusqu c10 Jusqu b10 Jusqu a10 Fin En Java class chap4troisboucles2 public static void mainString args double xyznb1nb2 x1 do y1 do z1 do nb1x100y10z nb2Mathpowx3Mathpowy3Mathpowz3 ifnb1nb2 Systemoutprintlnnb1quotquotnb2quot quotxquot quotyquot quotz z whilezlt10 y whileylt10 x whilexlt10 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0GSeGVCdzIgLAA-enidentnumber 88
Pour Fin Pour 1 Une structure pour compter dit alors quil sagit dune structure incrmentale Sa syntaxe en pseudocode est la suivante Pour variable De dbut fin PAS pas Faire Bloc dinstructions Fin Pour chaque passage dans la boucle la variable prendra successivement chacune des valeurs dans lintervalle ab a et b inclus Le pas est optionnel et est de 1 par dfaut Le pseudocode suivant compte de 1 10 Variable cpt en Numrique Dbut Pour cpt De 1 10 Faire Ecrire cpt Fin Pour Fin Il est possible de trouver des syntaxes lgrement diffrentes elles sont cependant toutes quivalentes Pour variable Allant De dbut fin PAS pas Faire Bloc dinstructions Fin Pour Ou encore Pour compteur dbut fin Pas pas Bloc dinstructions compteur suivant Dans cette dernire forme il est intressant de constater quil est plus simple dans le cas de boucles contenant un gros bloc dinstructions de sy retrouver la variable tant rpte dans la syntaxe de fin de boucle Enfin il est possible de trouver des syntaxes alternatives drivant de ces trois dernires 2 mais pas indispensable Vous aurez rapidement compris que cette boucle ne sert que pour des compteurs Autrement dit tout ce quelle propose est dj intgralement possible avec les structures quotTant Quequot et quotRpterquot Simplement avec le quotPourquot vous navez pas faire vousmme le calcul du compteur Cest donc une simplification Il nexiste aucun cas o la structure quotPour Fin Pourquot est strictement ncessaire Elle ne fait que simplifier les autres structures itratives lors de lutilisation de compteurs 3 Quelle structure choisir Mais alors quand utiliser telle ou telle structure On emploie une structure quotPourquot lorsquon connat lavance le nombre ditrations ncessaires au traitement Ce nombre peut tre fixe ou calcul par avance avant la boucle peu importe La boucle quotPourquot est dterministe son nombre ditrations est fix une fois pour toute et est en principe invariable bien quil reste possible de tricher On emploie les structures quotTant Quequot ou quotRpterquot lorsquon ne connat pas forcment lavance le nombre ditrations qui seront ncessaires lobtention du rsultat souhait Lexemple le plus concret est reprsent par la saisie des notes on peut en saisir une 200 aucune mais on le sait pas lavance Mais a peut tre aussi la lecture des lignes dun fichier on nen connat pas le nombre par avance denregistrements dans une base de donnes un ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 89
calcul complexe devant retourner une prcision particulire un nombre de tours dans un jeu le premier qui gagne sort de la boucle etc 4 Un pige viter Tout comme il faut viter les boucles infinies sauf si cest parfaitement volontaire il faut aussi viter quelques erreurs qui peuvent se rvler trs surprenantes selon le cas rappelezvous la Loi de Murphy Voici un exemple de ce quil ne faut pas faire Variable x en Numrique Dbut Pour x allant de 1 31 Faire Ecrire x xx2 Fin Pour Fin Lerreur sauf si cest ce que vous vouliez explicitement ce qui sappelle jouer avec le feu est de modifier vousmme le compteur utilis par la boucle au sein mme de cette boucle Que se passetil dans cet exemple Vous passez de 1 2 puis Quoi 3 6 7 14 Ca devient nimporte quoi et aucun nombre ditrations ne peut tre prvu Vous ne savez plus quand vous allez sortir de la boucle ni mme la nouvelle valeur du compteur chaque itration Selon les langages vous aurez au mieux un fonctionnement peu prs conforme ce que vous attendiez au pire du grand nimporte quoi Or en informatique sauf travailler pour un diteur peu scrupuleux sur la qualit un quot peu prsquot est inacceptable Ne modifiez jamais un compteur de boucle quotPourquot au sein de celleci Si cela savre vraiment ncessaire modifiez votre boucle pour utiliser une structure quotTant Quequot ou quotRpterquot 5 Quelques exemples a De nouveau trois boucles Promis devenir un grand classique puisque cest la troisime fois que vous le voyez sous trois formes diffrentes donc voici lexemple des trois boucles preuve sil en est que le quotPour Fin Pourquot est bien pratique mais totalement optionnel Lintrt est videmment ici de produire un code plus succinct et encore plus lisible Variables abcnb1nb2 en Numrique Dbut Pour a de 1 10 Faire Pour b de 1 10 Faire Pour c de 1 10 Faire nb1a100b10c nb2a3b3c3 Si nb1nb2 Alors Ecrire nb1abc FinSI Fin Pour Fin Pour Fin Pour Fin Ce qui en Java donne class troisboucles public static void mainString args double xyznb1nb2 forx1xlt10x fory1ylt10y forz1zlt10z nb1x100y10z - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 90
nb2Mathpowx3Mathpowy3Mathpowz3 ifnb1nb2 Systemoutprintlnxquot quotyquot quotz b La factorielle Encore un classique avec une factorielle de n vous savez lavance le nombre ditrations ncessaire n Cest donc une application de choix pour la structure quotPour Fin Pourquot Variables cpt i resultat en Numrique Dbut Ecrire quotQuelle factorielle quot Lire cpt resultat1 Pour i de 2 cpt resultatiresultat Fin Pour Ecrire resultat Fin En Java import javaio class chap4fact3 public static void mainString args Long icptresultat String txtquotquot BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try SystemoutprintlnquotTable quot txtsaisiereadLine catchException excp SystemoutprintlnquotErreurquot cptLongparseLongtxt resultat1l fori2liltcpti resultatresultati Systemoutprintlnresultat c Racine carre avec prcision Il fallait bien innover voil qui est fait avec le calcul dune racine carre Savezvous extraire une racine carre la main Avant lapparition des calculatrices les lycens et tudiants utilisaient soit des tables ou des rgles calcul soit les calculaient euxmmes Il serait possible de dcrire la mthode utilise mais il manque encore quelques notions Une mthode plus mathmatique est lalgorithme de Hron dAlexandrie Cet homme aussi appel Hron lAncien tait un mathmaticien mcanicien et ingnieur grec n Alexandrie au 1er sicle de notre re Il a crit de nombreux traits et laiss quelques formules dont lune permettant de calculer laire dun triangle en fonction de la longueur de ses cts et une autre permettant dapprocher la valeur dune racine carre de manire rcursive Voici comment trouver la formule ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 91
Formule de Hron dAlexandrie La suite finale permet de calculer la racine carre en fonction dune valeur initiale arbitraire x0 En principe on utilise la valeur entire approche de la racine carre la formule permettant initialement dobtenir rapidement les nombres situs aprs la virgule Donc si vous cherchez la racine carre de 40 sachant que 6x6 vaut 36 et que 77 vaut 49 la racine carre est comprise entre les deux vous devriez mettre 6 Cependant dans la pratique nimporte quelle valeur peut convenir avec un nombre important ditrations vous obtiendriez toujours le rsultat attendu autant en plaant 1 que 10000 Il est cependant trs intressant de pouvoir optimiser le calcul en rcuprant lentier le plus proche Du coup lalgorithme sera extrmement prcis Celuici contiendra deux boucles La premire de type quotTant Quequot charge de calculer lentier x le plus proche de la racine carre de a La seconde de type quotPourquot calculera les dcimales Le nombre ditrations permettra de dterminer une prcision Dailleurs inutile dexcuter cette seconde boucle si le rsultat de la premire correspond la racine recherche Variables ixacpt en Numrique Dbut x1 39 cpt5 Tant Que xxlta Faire xx1 Fin Tant Que Si xx a Alors xx-1 Pour i de 1 cpt Faire x05xax Fin Pour FinSi Ecrire quotLa racine de quotaquot est quotx Fin Vous allez tre tonn de la pertinence et de la prcision des rsultats Ainsi en seulement trois ou quatre itrations 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 disposent dune instruction en dur rien que pour a FSQRT par exemple sur un vieux Motorola MC68881 En attendant voici la transcription de ce calcul avanc en Java class chap4racine - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 92
public static void mainString args double ixacpt x1 a31 cpt5 whilexxlta x ifxxa x- fori1iltcpti x05xax Systemoutprintlnx SystemoutprintlnMathpowx2 d Calcul du nombre PI 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 existe plusieurs moyens dapprocher cette valeur Pi est la circonfrence dun cercle dont le diamtre est 1 Sans vous exposer ici les dtails de la mthode sachez que Leonhard Euler grand savant du XVIIIme sicle a rsolu un problme connu de longue date la dtermination de la somme des inverses des carrs dentier La formule est la suivante Remarquez la prsence dune itration sur les puissances de chaque dnominateur diviseur Voici une application de la boucle quotPourquot De mme remarquez que PI est lev au carr Il faudra donc que vous effectuiez une racine carre la fin pour obtenir le bon rsultat Donc Effectuer n divisions successives de 1n2 Multiplier ce rsultat par 6 Extraire la racine carre de ce rsultat pour obtenir PI Variables ixacpt en Numrique Dbut cpt100000 a2 Pour i de 2 cpt Faire aa1ii Fin Pour aa6 x1 Tant Que xxlta Faire xx1 Fin Tant Que Si xx a Alors xx-1 cpt10 Pour i de 1 cpt Faire x05xax Fin Pour FinSi Ecrire quotLa valeur de PI est quotx Fin Question Combien fautil ditrations pour obtenir sept chiffres corrects aprs la virgule Voici le programme Java correspondant qui devrait vous fournir une petite ide ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 93
class chap4pi public static void mainString args double ixacpt cpt100000000 a1 fori2iltcpti aa1ii aa6 x1 cpt10 whilexxlta x ifxxa x- fori1iltcpti x05xax Systemoutprintlnx - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0i0oPH1CdzIgLAA-enidentnumber 94
Prsentation 1 Principe et dfinition a Simplifier les variables Jusqu prsent les types de donnes que vous avez rencontrs sont des scalaires sauf pour les chanes de caractres Pour rappel un scalaire est un type de donne qui ne reprsente quune seule variable la fois Un entier un caractre un rel un boolen etc sont des scalaires Une chane de caractres non il sagit dune suite ou liste de caractres les uns aprs les autres Une chane est donc une liste ordonne par vos soins de scalaires Les langages proposent souvent un type pour les chanes de caractres mais cest une facilit offerte par ceuxci Un langage comme le C nen propose pas En algorithmique vous utilisez le type quotAlphanumriquequot il vous faudra alors faire attention lors de la conversion en C Bien heureusement Java propose un type de ce genre mme si comme souvent derrire les apparences se cache une bien trompeuse ralit Mais alors comment se reprsenter une chane de caractres avec un type scalaire Il faut pour cela se rappeler comment sont places en mmoire les informations La mmoire de lordinateur est compose de cases pouvant contenir certaines informations Ces cases sont numrotes on parle dadresse de la case et contiennent des donnes Ces donnes reprsentent ce que vous voulez selon le contexte de leur utilisation Vous pouvez par exemple partir du principe quelles contiennent des scalaires Si une case mmoire contient le nombre 65 ce peut tre la valeur entire 65 ou encore le code ASCII du caractre quotAquot Une case mmoire peut parfaitement contenir ladresse dune autre case mmoire cest un peu plus compliqu que cela en a lair et ce sera lobjet dun plus long expos dans la suite de cet ouvrage 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 Il serait alors possible de les rutiliser volont pour de nouveaux calculs voire mme pour les sauver dans un fichier les imprimer les consulter etc Jusqu prsent le seul moyen dont vous disposiez tait de faire une boucle de saisie de notes et dedans de tenter de faire les calculs au fur et mesure Lautre possibilit tait de poser n fois la mme question et de placer les rsultats dans n variables diffrentes Imaginez ceci Lire N1 Lire N2 Lire N20 MoyN1N2N2020 Ridicule nestce pas Maintenant si vous savez quil y a vingt lves dans une classe et donc vingt notes saisir ne seraitil pas plus simple de remplacer toutes les variables par une seule mais qui pourrait contenir toutes les notes Lide serait donc davoir un nom de variable mais qui pourrait associer une note un numro Prenez la variable quotnotequot Il suffirait alors de dire que quotnote 1 vaut 15 note 2 vaut 17 note 3 vaut 8etcquot Un ensemble de valeurs reprsent par le mme nom variable et identifi par un numro sappelle un tableau Le numro qui sert identifier un lment une valeur du tableau sappelle un indice En reprsentation algorithmique un lment du tableau est reprsent par le nom de la variable auquel on accole lindice entre crochets Note115 Un tableau nest pas un type de donnes mais une liste dlments dun type donn On parlera dun tableau de n lments de type numrique ou Alphanumrique etc b Les dimensions 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 apprhender avec deux indices Note11017 Ceci pourrait au conditionnel car soumis aux contraintes de la numrotation des lments se traduire par La 10me note de la 1re classe Rajouter un indice un tableau sappelle rajouter une dimension un tableau Avec une dimension le tableau peut tre reprsent sur une ligne Avec deux dimensions le tableau peut tre reprsent en lignes et colonnes comme dans un tableur ou une grille quelconque Et avec trois dimensions Sous forme de cube avec un axe de profondeur Audel cest plus difficile reprsenter aussi il faut parfois utiliser des analogies avec des choses de la vie courante Ainsi pour trois dimensions imaginez un grand casier avec x cases en largeur y cases en hauteur et dont chaque tiroir est dcompos en z petites cases ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 95
Ces reprsentations restent totalement virtuelles une vue de lesprit De nombreux tableaux nont absolument pas pour but de reprsenter des lignes et des colonnes Un tableau deux dimensions peut parfaitement reprsenter un jeu de morpion une matrice une classe et les notes des tudiants associes Le pige avec les tableaux plusieurs dimensions cest la taille quils occupent en mmoire Imaginez dix coles disposant de dix classes chacune de vingt lves Nous voulons placer les notes dans un tableau Voici donc un tableau de trois dimensions Note110110120 Combien de notes pourra obtenir le tableau 10x10x20 2000 notes Si llment fait un octet vous approchez les 2 Ko Mais si llment du tableau contient un rel sur 64 bits cest 16 Ko qui sont utiliss Pourtant les indices semblaient si peu levs c Les types Un tableau nest pas un type de donnes mais un ensemble de valeurs elles mmes types regroupes et indices sous un nom de variable unique Pouvezvous crer un tableau contenant nimporte quel type de valeurs Attention linterprtation de cette question Un tableau contientil n valeurs du mme type ou au contraire n valeurs de types diffrents En algorithmique le principe est simple un tableau contient n lments de mme type Autrement dit vous allez dclarer un tableau de vingt notes en numrique dix rels cinq chanes de caractres etc Cependant en dehors du pseudocode algorithmique la dfinition la dclaration et lutilisation des tableaux dpendent fortement du langage Les tableaux simples en Java ou en C par exemple ne contiennent quun seul type possible de valeurs Tandis quen PHP vous pouvez mlanger tout ce que voulez lindice 1 contenant un entier lindice 2 du texte etc Cela peut tre un peu droutant lusage mais ces langages souvent appels non typs cest discutable sont dune souplesse incomparable En attendant respectez en algorithmique le fait quun tableau a en principe un nombre dindices fini et quils sont typs une fois pour toute d Dclaration En pseudocode algorithmique les tableaux se dclarent au mme endroit que les variables juste avant le dbut du traitement luimme sous cette forme VAR MonTableautableau1nbelements dentiers MonTab2tableau1dim11dim2 de rels Entre les crochets placez le nombre dlments du tableau Il est possible dinitialiser le contenu du tableau sa cration comme ceci VAR mois tableau112lt-quotjanvierquotquotdcembrequot de chanes Ce mme tableau pourrait tre plac dans la section CONST ce qui en ferait une constante Comme cela sera revu un peu plus loin les indices des tableaux peuvent dmarrer 0 ou 1 selon les langages les usages 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 lments du tableau dans la mmoire Cependant comment alors comprendre ce tableau Valeurstableau110 de rels Selon les usages si ce tableau reprsente dix valeurs alors Si la numrotation commence 1 les indices vont de valeur1 valeur10 Si la numrotation commence 0 les indices vont de valeur0 valeur9 Cest le cas du langage C ou du Java 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 onze lments Nayez pas dinquitudes ce ne sera pas le cas ici Dans la suite les indices commenceront un pour aller jusqu n n tant le nombre dlments du tableau Le tableau valeurs 110 aura donc bien dix lments numrots de 1 10 Comme il ne sagit pas dune rgle absolue dans tous les langages vous prendrez bien soin vrifier ce quil en est lorsque vous crirez vos programmes Si vous tes tudiant suivez la reprsentation fournie par vos professeurs ventuellement prcisez les rgles que vous appliquez aux indices Dans tous les cas naccusez pas lauteur de cet ouvrage e Utilisation - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 96
Un lment de tableau reoit une valeur comme une variable se lit comme une variable et scrit comme une variable Ce sont dans les structures itratives que les tableaux prennent toutes leurs significations En effet les indices des dimensions peuvent tre reprsents laide de variables PROGRAMME UTIL VAR notestableau110 de rels ientier DEBUT Pour i de 1 10 Faire Ecrire quotNotequotiquot quot Lire notei FinPour Pour i de 1 10 Faire Ecrire notei FinPour FIN f Les tableaux dynamiques Si vous ne connaissez pas par avance le nombre dlments de votre tableau vous avez deux possibilits Fixer un nombre dlments suffisamment grand lavance pour tre sr que a rentre 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 quotRedimquot qui permet de redimensionner un tableau dont le nombre dlments nest pas connu lavance Cependant il est souvent conseill dviter de lutiliser Cette instruction trouve son utilit dans le fait quen pseudocode les variables et les tableaux sont dclars avant le programme ce qui induit limpossibilit dinitialiser le nombre dlments dun tableau suivant la valeur dune variable Cependant les langages comme Java disposent de mcanismes permettant de dclarer des tableaux sans forcment connatre leur taille lavance Si vous devez utiliser des tableaux dynamiques alors vous ne devez pas indiquer de nombres dlments dans la dclaration Cela sera fait dans linstruction de redimensionnement PROGRAMME REDIM VAR Elements tableau dentiers Nbentier DEBUT Ecrire quotCombien dlments quot Lire nb Redim elements1nb-1 FIN Vous ne pouvez pas redimensionner un tableau dj correctement dimensionn tout comme il est impossible de dpasser le nombre dlments dclars Pour obtenir un tableau plus grand il faut alors en crer un autre ou utiliser le mcanisme des pointeurs tel quil sera prsent dans le chapitre Notions avances 2 Java et les tableaux a Tableaux classiques n dimensions Java sait grer des tableaux de 1 n dimensions Il existe plusieurs syntaxes pour les dclarer Le principe est presque le mme que pour les variables sauf que vous devez prciser le nombre dlments du tableau Les indices ne dmarrent pas 1 mais 0 il faudra donc adapter le programme en consquence lors du passage de lalgorithme en Java Vous devez utiliser les crochets lors de la dclaration Ceuxci se placent soit aprs le nom du tableau soit avant accols au type du tableau Entre les crochets nindiquez pas le nombre dlments Indiquez tout dabord le type puis le nom comme pour une variable suivi des crochets Cette premire notation est issue du C et du C et est souvent utilise par les programmeurs issus de ces langages int tab Une dimension ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 97
La syntaxe suivante avec les crochets au niveau du type est quivalente int tab Vous indiquez ainsi que tab contiendra un tableau dentiers une dimension Notez que la taille du tableau nest pas prcise 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 pratique courante consiste rserver un maximum dlments ds le dbut au cas o Cest une bien mauvaise pratique Pour indiquer le nombre dlments du tableau utilisez la syntaxe suivante tableau new typetaille Pour un tableau dentiers de dix lments vous ferez donc tabnew int10 Vous pouvez la fois dclarer un tableau et son nombre dlments en mixant les deux syntaxes int tabnew int10 int tab2new int20 Tous les types peuvent faire lobjet de tableaux Pour dix lments les indices entre crochets vont de 0 9 Suivant le type du tableau les lments ont des valeurs prdfinies quivalentes 0 pour les types numriques False pour les boolens caractre nul pour le type caractre null valeur nulle pour les autres Vous pouvez dclarer un tableau avec des valeurs prdfinies comme ceci int t27910111417182022 ou comme cela int t27910111417182022 Ce qui revient exactement au mme Vous accdez au contenu de chaque lment exactement comme prvu savoir en mettant le numro de lindice entre les crochets tab2254 totaltotaltab3 Vous pouvez obtenir le nombre dlments dun tableau laide dune proprit particulire appele length nbtablength Vous pouvez redfinir un tableau nimporte quel moment exactement comme si vous indiquiez son nombre dlments cependant attention toutes les anciennes valeurs sont perdues Attention ici il y a un norme pige tellement gros que les dbutants sous Java tombent tous dedans les deux pieds joints Il est possible en Java de faire ceci int t27910111417182022 int copie copiet La dernire ligne donne limpression que le tableau t est copi dans le tableau copie Or Java fonctionne par rfrence Le principe est expliqu dans le point suivant sur la reprsentation mmoire et dans le chapitre Notions avances Ici ce nest pas le tableau qui est copi copie reoit la rfrence du tableau t Les variables copie et t rfrencent le mme tableau si vous 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 correspondant de t cest le mme class chap5tab1 public static void mainString args int t27910111417182022 int copiet Systemoutprintlnt2 copie25 Systemoutprintlnt2 Rfrences de tableaux - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 98
Laffectation par rfrence peut tre la source de nombreux dysfonctionnements imprvus voire plantages Pour recopier un tableau dans un autre vous avez deux possibilits Copier via une boucle chaque lment du tableau dans lautre Utiliser une mthode fonction appele arraycopy qui copie des lments dun premier tableau vers un second tableau Les deux cas sont traits dans lexemple suivant class chap5tabcopie public static void mainString args int t27910111417182022 int copie int i copienew inttlength mthode 1 boucle fori0ilttlengthi copieiti mthode 2 arraycopy Systemarraycopyt0copie0tlength Systemoutprintlnt2 copie25 Systemoutprintlnt2 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 Cest ainsi quil est possible que le nombre dindices de la deuxime dimension ou de la troisime quatrime etc ne soit pas le mme selon lindice de la premire dimension La suite vous prsente quelques lments pratiques Vous dclarez un tableau n dimensions en plaant autant de crochets que de dimensions souhaites deux dimensions int t1 int t2 trois dimensions int t3 int t4 Pour indiquer le nombre dlments faites comme pour une seule dimension placez le nombre dindices entre les crochets t1new int510 Vous pouvez aussi le faire directement dans la dclaration int t2new int612 Il est possible de faire varier le nombre dindices Imaginez le tableau t2 comme devant stocker les notes de six classes mais que le nombre dtudiants par classe varie de 17 25 Voici comment procder int t2new int6 t20new int17 t21new int20 t22new int19 t23new int25 Chaque lment de la premire dimension rfrence un tableau de n lments la seconde dimension n pouvant tre variable Pour initialiser le contenu dun tableau avec des valeurs prdfinies comme pour un tableau une dimension utilisez les accolades Seulement ici vous devez imbriquer plusieurs niveaux daccolades un niveau par dimension comme ceci Tableaux n dimensions ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 99
int t2 1017891020131175 00 09 9142018101619186 10 19 178971012111411 20 28 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 lumire pour un tableau deux dimensions Pour obtenir le nombre dlments de chaque dimension rcuprez la proprit length pour chacune de ces dimensions class chap52dim public static void mainString args int tnew int3 int itotal0 t0new int10 t1new int8 t2new int9 Systemoutprintlntlength 1ere dimension fori0ilttlengthi totaltilength calcul nb total delements Systemoutprintlntilength Systemoutprintlntotal 3 Reprsentation en mmoire a Reprsentation linaire En principe les lments dun tableau sont placs dans des cases contigus en mmoire Si vous prenez un tableau de dix nombres il pourrait tre reprsent ainsi La case est le numro de la case mmoire lindice le numro dans le tableau et la valeur la note associe lindice Une constatation simpose dellemme les numros des cases mmoire les adresses nont pas de rapport avec lindice mis part le fait quils sont contigus Autant se reprsenter un tableau de scalaires une dimension un seul indice en mmoire est simple autant se reprsenter deux ou n dimensions devient un peu moins vident dautant plus que cette reprsentation peut varier dun langage un autre Comme le nombre maximal dindice est connu lavance dans le cas du pseudocode algorithmique un tableau deux dimensions peut tre facilement transpos en tableau une seule dimension Soit un tableau note1315 deux dimensions qui reprsentent quinze valeurs Voici comment ceci pourrait tre reprsent en mmoire La premire ligne reprsente ladresse de la case mmoire associe aux diffrents indices du tableau Cette valeur est bien entendu entirement arbitraire et est connue du langage mettant en uvre le tableau 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 manire totalement linaire Il est pratique en dbutant de se reprsenter un tableau deux dimensions en termes de lignes et de colonnes Mais cette vue de lesprit est totalement fausse la mmoire en tant que telle ne peut tre reprsente ainsi elle est linaire le fameux ruban Un tableau stale donc linairement dans la mmoire dune manire ou dune autre Cette dernire remarque est sujette caution comme vous le verrez un peu plus bas Dans le cas du tableau deux dimensions comment un langage utilisant ce principe peut connatre la position exacte dun lment en mmoire Soit Case 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 Indice 1 2 3 4 5 6 7 8 9 10 Valeur 15 17 8 13 10 6 9 13 14 11 Adr 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 Ind 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 Val 10 7 14 8 12 11 5 12 13 18 20 2 0 17 16 - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 100
m la position connue du premier lment x lindice de la premire dimension moins 1 y lindice de la seconde dimension moins 1 My la taille maximale de la premire dimension La position p en mmoire est pmxMyy Prenez daprs le tableau cidessus llment dindice 34 x vaut 2 y vaut 3 Mx vaut 5 et m vaut 143 p143253156 Soit un nouveau tableau note2121213 il pourrait tre reprsent ainsi Pour calculer la position dun lment dindice xyz avec les mmes prrequis quaudessus avec Mz la taille maximale de la dimension et My la taille maximale de la dimension y on obtient la formule suivante pmxMyMzyMzz b Reprsentation par rfrence La reprsentation linaire cidessus est bien pratique pour votre imagination mais montre ses limites dans certains cas Notamment que se passetil avec les types qui ne sont pas des scalaires Prenez lexemple le plus simple un tableau de chanes de caractres Dans la mmoire et comme vu prcdemment une chane de caractres est reprsente par une suite de valeurs numriques les codes ASCII ou unicode selon le cas Le mot quotBonjourquot est reprsent ainsi Sachant quon ne connat pas forcment lavance la longueur dune chane de caractres celleci se termine souvent et suivant les langages par un caractre nul Aussi en mmoire vous obtiendrez ceci Cette brve tude met en vidence deux problmes Dans un tableau une seule dimension il nest pas vident de reprsenter les indices des chanes de caractres Une astuce pourrait consister rechercher les caractres nuls 0 pour retrouver les indices suivants le caractre suivant est le premier de la chane dindice 1 Mais La longueur dune chane de caractres ntant pas fixe comment rserver lavance lespace contigu ncessaire au stockage de n chanes dans un tableau de n lments 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 caractres pour deux cents rservs Ce nest pas une solution retenir Pour crer des tableaux n dimensions quelques langages et non des moindres utilisent une autre mthode Pour plus de clart le mieux est de comprendre le principe tout dabord avec un tableau une dimension puis deux Une chane dune longueur de n caractres est en fait bien souvent un tableau une dimension comportant n1 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 caractres ce type de variable le langage connat la longueur de cette chane aquotSalutquot la longueur de Salut est 5 et va Adr 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 Ind 111 112 113 121 122 123 211 212 213 221 222 223 Val 10 12 14 10 15 9 8 13 7 5 14 20 Lettre B o n j o u r ASCII 66 111 110 106 111 117 114 Adresse 1616 1617 1618 1619 1620 1621 1622 1623 Contenu 66 111 110 106 111 117 114 0 ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 101
allouer lespace mmoire contigu ncessaire au stockage de cette chane Que reprsente alors la variable Bien souvent ce sera la position en mmoire de la chane de caractres autrement dit son adresse Pour reprendre lexemple de la chane de caractres quotBonjourquot cidessus elle dbute ladresse mmoire 1616 Si cest la variable quottxtquot qui quotcontientquot cette chane txt va en fait rfrencer le tableau de caractres prsent ladresse 1616 Cest flagrant avec des langages comme le C qui permettent de manipuler directement les adresses mmoire et leur contenu Prenez maintenant un tableau de cinq chanes de caractres PROGRAMME TABCHAINES VAR Messagestableau15 de chanes DEBUT Messages1quotilquot Messages2quotnequot Messages3quotfaitquot Messages4quotpasquot Messages5quotbeauquot FIN Pour se reprsenter ceci en mmoire il faut dabord se reprsenter lorganisation des chanes de caractres Soit la phrase quotil ne fait pas beauquot vous voulez placer chacun des mots dans un lment dun tableau Notez deux choses Un octet est rajout pour le caractre nul en fin de chane et donc une chane de longueur n occupe n1 octets en mmoire Il se peut que les chanes ne se suivent pas en mmoire si au moment de les crire dedans il nexiste pas assez de positions libres contigus disponibles Aussi les adresses donnes dans ce tableau peuvent tre totalement dcales par rapport la ralit Le tableau de chane de caractres contiendrait donc les rfrences des adresses mmoires o sont rellement stockes les chanes de caractres Un astucieux tour de passepasse qui permet de nombreuses choses Adresses 2007gt2009 2010gt2012 2013gt2017 2018gt2021 2022gt2026 Contenu Il Ne Fait Pas Beau Indice 0 1 2 3 4 Rfrence 2007 2010 2013 2018 2022 - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE02b4JVCdzIgLAA-enidentnumber 102
Manipulations simples 1 Recherche dun lment Vous disposez dun tableau de n lments correspondant aux prnoms de vos amis et vous voulez savoir si lun de ceuxci est bien prsent dans votre tableau Il faut alors le rechercher Le principe consiste balayer lintgralit du tableau laide dune structure itrative et en sortir ds que llment a t trouv ou que le nombre maximal dindice a t dpass la sortie de la boucle il faudra de nouveau vrifier pour savoir si oui ou non llment a t trouv il se peut en effet que tout le tableau ait t parcouru et que ce soit la raison de la sortie de la boucle PROGRAMME RECHERCHE VAR Tableau nomstableau110 de chanes rechchane ientier DEBUT i1 Tant que ilt10 et nomsiltgtrech Faire ii1 FinTantQue ii-1 Si nomiRech Alors Afficher quotTrouvquot Sinon Afficher quotAbsentquot FinSi FIN Il y a la possibilit de faire diffremment avec un drapeau PROGRAMME RECHERCHE2 VAR Tableau nomstableau110 de chanes Rechchane ientier trouveboolen DEBUT i1 trouveFAUX Tant que ilt10 et trouveFAUX Faire Si nom1rech Alors trouveVRAI FinSi ii1 FinTantQue Si trouve Alors Affiche quotTrouvquot Sinon Affiche quotAbsentquot FinSi FIN En Java class chap5recherche public static void mainString args int t10201425178101215541192621 int i0rech boolean trouvefalse rech15 whileilttlength ampamp trouve iftirech trouvetrue i ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA-enidentnumber 103
iftrouve SystemoutprintlnquotTrouv position quoti-1 else Systemoutprintlnquotquot 2 Le plus grandpetit moyenne Dans le chapitre prcdent vous aviez eu loccasion de dterminer la plus petite et la plus grande dune srie de notes saisies par lutilisateur Il sagit cette fois de faire la mme chose avec les tableaux Le principe est le mme sauf que la donne ne vient pas dune saisie de lutilisateur mais du tableau Voici un exemple pour un tableau de dix lments PROGRAMME MINMAXMOY VAR Notestableau110 de rels minmaxmoyrels ientier DEBUT minnotes1 maxnotes1 moy0 Pour i de 1 10 faire Moymoynotei Si noteigtmax Alors Maxnotei FinSi Si noteiltmin Alors Minnotei FinSi FinPour Moymoy10 Afficher minmaxmoy Fin En Java class chap5minmoymax public static void mainString args double notes1020141117810121551619260 double minmoymax int i minnotes0 maxnotes0 moy0 fori0iltnoteslengthi moynotesi ifnotesigtmax maxnotesi ifnotesiltmin minnotesi moynoteslength Systemoutprintlnminquot quotmaxquot quotmoy 3 Le morpion Le jeu du morpion ou tictactoe consiste aligner des ronds ou des croix en ligne colonne ou diagonale sur un plateau de 3x3 cases Le premier joueur qui aligne ses pions a gagn Sans crer ici une intelligence artificielle pour jouer lalgorithme va demander chaque joueur tour de rle dindiquer les coordonnes x ligne et y colonne o mettre son pion puis va dterminer si le joueur gagne ou non Cet algorithme est un peu plus compliqu quil ny parat - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA-enidentnumber 104
Le tableau dispose de deux dimensions 3x3 Il faut au sein dune boucle permuter les joueurs Si une position est dj occupe il faut de nouveau poser la question Aprs chaque coup il faut vrifier toutes les lignes colonnes et diagonales Si une lignecolonne diagonale est complte on sort de la boucle En cas de victoire il faut indiquer quel pion xo a gagn Il faut grer le match nul neuf tours et personne na gagn Le programme qui suit nest pas optimis de manire tout fait volontaire afin de forcer la manipulation des indices de tableaux deux dimensions PROGRAMME MORPION VAR ptableau1313 de caractres ijxynbtoursentiers pion caractre gagneboolen DEBUT Initialisation du plateau que des blancs Pour i allant de 1 3 Faire Pour j allant de 1 3 Faire pijquot quot FinPour FinPour gagneFAUX nbtour0 Boucle de jeu Rpter Changement du pion joueur Si pionltgtquotoquot Alors Pionquotoquot Sinon Pionquotxquot FinSi Affichage du plateau Pour i allant de 1 3 Faire Afficher pi1pi2pi3 FinPour Saisie des coordonnes Rpter Afficher quotCoordonnes xyquot Saisir xy Jusqu xgt1 ET xlt3 ET ygt1 ET ylt3 ET pxyquot quot Mise en place du pion pxy pion Vrification en ligne i1 Tant que ilt3 ET NON gagne Si pi1quot quot ET pi1pi2 ET pi1pi3 alors gagneVRAI FinSi ii1 FinTantQue ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA-enidentnumber 105
Vrification en colonne si NON gagne Alors i1 Tant que ilt3 ET NON gagne Si p1iquot quot ET p1ip2i ET p1ip3i alors gagneVRAI FinSi ii1 FinTantQue FinSi Vrification des deux diagonales Si NON gagne Alors Si p11quot quot ET p11p22 ET p11p33 OU p13 p22 ET p13p31 Alors GagneVRAI FinSi FinSi nbtoursnbtours1 Jusqu gagneVRAI OU nbtour9 Si gagne Alors Afficher pionquot a gagn quot Sinon Afficher quotPersonne ne gagnequot FinSi FIN Comme indiqu ce programme nest pas optimis Ainsi les boucles et tests qui dterminent si les lignes et les colonnes sont gagnantes font appel des indices statiques Or si vous souhaitiez par exemple tendre cet algorithme un quotPuissance 4quot qui est fondamentalement la mme chose vous auriez des tests rallonge Voici le rsultat en Java laffichage ayant t lgrement amlior et les coordonnes adaptes en fonction des indices des tableaux dmarrant 1 import javaio class chap5morpion public static void mainString args char pnew char33 int ijx0y0nbtours0 boolean gagne char pion String txquotquottyquotquot BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin Initialisation du tableau fori0ilt3i forj0jlt3j pij gagnefalse Boucle principale do ifpiono piono else pionx Saisie des coordonnees do Plateau Systemoutprintlnquot 1 2 3quot fori0ilt3i Systemoutprintlni1 quotquotpi0quotquotpi1quot quotpi2quotquot SystemoutprintlnquotAu tour de quotpion SystemoutprintlnquotCoordonnees xyquot try txsaisiereadLine ysaisiereadLine - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA-enidentnumber 106
catchException excp SystemoutprintlnquotErreurquot xIntegerparseInttx-1 yIntegerparseIntty-1 whilexlt0 xgt2 ylt0 ygt2 pxy pxypion Ligne i0 whileilt3 ampamp gagne ifpi0 ampamp pi0pi1 ampamp pi0pi2 gagnetrue i Colonne i0 whileilt3 ampamp gagne ifp0i ampamp p0ip1i ampamp p0ip2i gagnetrue i Deux diagonales ifp11 ampamp p00p11 ampamp p00p22 p02p11 ampamp p02p20 gagnetrue nbtours1 whilegagne ampamp nbtours9 fin boucle Plateau Systemoutprintlnquot 1 2 3quot fori0ilt3i Systemoutprintlni1quotquot pi0quotquotpi1quotquotpi2quotquot ifgagne Systemoutprintlnpionquot gagne quot else SystemoutprintlnquotPersonne ne gagnequot ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0U0ulKlCdzIgLAA-enidentnumber 107
Algorithmes avancs 1 Les algorithmes des tris a Le principe 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 Autrement dit vous voulez trier le contenu du tableau Prenez le cas dun professeur souhaitant trier les notes de ses lves de la plus basse la plus haute ou des rsultats dun tirage du loto pour le rendre plus lisible Imaginez un tirage du loto de cinq numros videmment tous diffrents dont les valeurs stalent entre 1 et 49 Voici ltat initial du tableau suite au tirage au sort 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 complexit qui dtermine leur usage notamment pour de grandes plages de valeurs Dans les algorithmes suivants la variable Cpt contient le nombre dlments du tableau initial et t est le tableau Il est intressant de prendre en compte la complexit de ces divers algorithmes bien que cette notion prsente au 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 tout dpendant du nombre dlments et lventuel ordre de ceuxci au dpart b Le tri par cration Le tri par cration ne sera abord que du point de vue thorique En effet si cette mthode semble simple elle est en fait lourde et complique Si on demande un dbutant en programmation comment trier un tableau il vous proposera trs certainement de crer un deuxime tableau dans lequel on placera au fur et mesure les lments du premier tableau dans lordre croissant Cest une trs mauvaise ide pour de multiples raisons dont Lajout dun second tableau double la mmoire ncessaire La recherche du plus petit lment est plus complique quon ne le pense car chaque passage il ne faut pas reprendre ceux dj sortis et cest compliqu Le nombre de boucles et de recherches est important La complexit de lalgorithme rsultant aussi suprieure aux autres Pour toutes ces raisons le tri par cration ne doit absolument pas tre utilis c Le tri par slection Le tri par slection est trs simple il consiste slectionner dans le tableau la plus petite valeur et la permuter avec 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 ncessaires depuis lexemple cidessus tape 1 la plus petite valeur est 9 on permute 9 et 48 tape 2 la plus petite valeur suivante est 17 dj la bonne position on passe la suivante 48 17 25 9 34 9 17 25 48 34 ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 108
tape 3 la plus petite valeur suivante est 25 dj la bonne position on passe la suivante tape 4 la plus petite valeur suivante est 34 on permute 34 et 48 Le tableau est tri Si le principe est simple lalgorithme rsultant ncessite malheureusement la recherche dans tout ou partie du tableau de la plus petite valeur possible et ce sans grande optimisation possible On peut par contre viter de permuter des valeurs si aucune valeur infrieure na t trouve Voici lalgorithme PROGRAMME SELECTION VAR tempijminCptentiers ttableau15 dentiers DEBUT Cpt5 Pour i de 1 Cpt-1 Faire mini Pour j de i1 Cpt Si tjlttmin alors minj FinSi FinPour Si minltgtj alors temptmin tmin ti ti temp FinSi FinPour FIN chaque passage dans la boucle on effectue une comparaison de moins que lors du passage prcdent Le nombre total de passages est donc de n1n2n3 et ainsi de suite soit une complexit de lalgorithme de nn12 ce qui dvelopp donne une complexit dordre On2 Voici le code Java correspondant class chap5triselect public static void mainString args int t27441218231910154297752881032 int ijcpttempmin cpt14 fori0iltcpt-1i mini forji1jltcptj iftjlttmin minj ifmini temptmin tminti titemp forj0jltcptj Systemoutprinttjquot quot Systemoutprintln 9 17 25 48 34 9 17 25 48 34 9 17 25 48 34 - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 109
d Le tri bulles Le tri bulles a un lointain rapport avec le champagne ou dailleurs toutes les boissons gazeuses Le but est que par permutations successives des valeurs voisines les valeurs les plus leves remontent vers les dernires places du tableau tandis que les valeurs les plus basses migrent vers les premires places Pour trier dans un ordre croissant il faut que chaque valeur dun lment du tableau soit plus petite que celle de llment qui suit sauf pour le dernier bien entendu Voici une simulation pas pas du premier passage tape 1 48 est suprieur 17 on permute tape 2 48 est suprieur 25 on permute tape 3 48 est suprieur 9 on permute tape 4 48 est suprieur 34 on permute lissue de ce premier passage vous remarquez que la valeur la plus leve est dj en dernire place du tableau 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 relancer une autre Ainsi il faut mettre en place un drapeau flag indiquant si une permutation a eu lieu ou non Voici les rsultats aprs les passages successifs Passe 1 Passe 2 Passe 3 La structure globale de lalgorithme est donc PROGRAMME TRIBULLE VAR Permut boolen tempCptientiers ttableau15 dentiers DEBUT Cpt5 Permutvrai TantQue Permut Faire PermutFaux 17 48 25 9 34 17 25 48 9 34 17 25 9 48 34 17 25 9 34 48 17 25 9 34 48 17 9 25 34 48 9 17 25 34 48 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 110
Pour i de 1 Cpt-1 Faire Si tigtti1 alors tempti titi1 ti1ti PermutVrai FinSi FinPour FinTantQue FIN Cependant si vous implmentez cet algorithme dans un quelconque langage vous allez vous apercevoir que celuici dans notre cas prcis effectue une passe de trop En effet ds le troisime passage le tableau est tri et pourtant le 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 Comme il nest pas possible de prvoir lavance le nombre de permutations restantes lalgorithme montre ses limites dans ce cas prcis Si n est le nombre dlments du tableau lalgorithme effectue n1 boucles TantQue et n1 boucles Pour soit n12 boucles ce qui se dveloppe en n22n1 La complexit est dordre On2 Autrement dit la complexit de cet algorithme est leve Remarquez aussi que cet algorithme balaie quoi quil arrive toutes les valeurs du tableau alors quon sait dj qu la premire passe la dernire valeur est la plus leve qu la seconde passe les deux dernires valeurs sont les plus leves et ainsi de suite Il est donc possible doptimiser lalgorithme en dcrmentant de 1 la boucle Pour chaque nouvelle passe DEBUT Permutvrai Cpt5 TantQue Permut Faire Pour i de 1 Cpt-1 FinPour CptCpt-1 FinTantQue FIN La complexit de cet algorithme est un peu moins leve En effet on effectue une boucle de moins chaque passage La complexit est cependant toujours en On2 au premier passage il y a n1 comparaisons au deuxime passage n2 au troisime n3 et ainsi de suite On obtient donc une complexit de n1n2n31 soit nn12 et donc n2n2 Cest identique au tri par slection Le code Java correspondant est le suivant class chap5tribulle public static void mainString args int t1413121110987654321 int icpttemp boolean Permuttrue cpt13 whilePermut fori0ilt14i Systemoutprinttiquot quot Systemoutprintln Systemoutprintlnquot-gtquot Permutfalse fori0iltcpti iftigtti1 tempti titi1 ti1temp Permuttrue cpt- fori0ilt14i Systemoutprinttiquot quot Systemoutprintln - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 111
e Le tri par insertion Le tri par insertion consiste slectionner un lment du tableau et linsrer directement la bonne position dans la partie du tableau dj trie On procde en trois tapes On place llment trier dans une variable temporaire Tant que les lments du tableau qui prcdent llment trier lui sont suprieurs on dcale ces lments dune position en rcuprant lespace vide laiss par llment trier On insre ensuite la variable temporaire la nouvelle position laisse vacante par le dcalage Voici les diffrentes tapes pour le tableau exemple tape 1 le deuxime lment 17 est plac dans une variable temporaire qui est compare aux lments qui le prcdent Chacun est dcal tant quil est suprieur llment trier tape 2 25 est compar aux lments qui le prcdent et chacun est dcal jusqu ce que llment ne soit plus suprieur au troisime tape 3 9 est compar aux lments qui le prcdent Ici comme dans ltape 1 on sarrte forcment au premier lment tape 4 34 est compar aux lments qui le prcdent Seul 48 lui est suprieur Lalgorithme rsultant est assez simple Seule la boucle de dcalage peut tre un peu plus ardue comprendre Chaque lment est dcal vers la droite ou le bas selon la reprsentation quon sen fait du tableau tant quil est suprieur llment recherche PROGRAMME TRINSERTION VAR imemposentiers ttableau15 dentiers DEBUT Cpt5 Pour i de 1 Cpt faire memti 48 17 25 9 34 48 25 9 34 17 48 25 9 34 17 en temporaire Dcalage de 48 17 la nouvelle position 17 48 25 9 34 17 48 9 34 17 25 48 9 34 25 en temporaire Dcalage de 48 25 la nouvelle position 17 25 48 9 34 17 25 48 34 9 17 25 48 34 9 en temporaire Dcalage de 17 25 et 48 9 la nouvelle position 9 17 25 34 48 9 17 25 48 9 17 25 34 48 9 en temporaire Dcalage de 48 34 la nouvelle position ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 112
posi-1 tant que posgt0 ET tposgtmem Faire tpos1tpos pospos-1 FinTantQue tpos1mem FinPour FIN Comme souvent la complexit varie selon lordre initial des lments dans le tableau trier Cependant dans le pire des cas on effectue n1 boucles dans lesquelles on effectue une moyenne de n22 changes et donc un total de n1n22 On obtient une complexit dordre On2 Cependant on effectue en moyenne seulement la moiti des comparaisons dans lexemple cidessus six comparaisons sont effectues alors que dix auraient pu tre effectues La complexit est alors bien moindre Dans la pratique un tri par insertion est gnralement plus rapide que les tris bulles et par slection Une petite remarque concernant le code Java Si vous faites whiletposgtmem ampamp posgt0 Lexpression est value de gauche droite Vous allez avoir une erreur un moment donn quand pos vaut 0 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 dabord tester la valeur de pos AVANT de vrifier le contenu du tableau cet indice whileposgt0 ampamp tposgtmem Le code en Java correspondant est le suivant class chap5trinsert public static void mainString args int t481725934 int ijmemposcpt cpt5 fori1iltcpti memti posi-1 whileposgt0 ampamp tposgtmem tpos1tpos pos- tpos1mem forj0jltcptj Systemoutprinttjquot quot Systemoutprintln f Le tri Shell Le tri Shell est une variante du tri prcdent qui a t propos par Donald L Shell en 1959 il ny a donc aucun rapport avec le shell Unix ou Windows Dans ce type de tri les lments ne sont plus dcals de un un mais par pas plus important La permutation seffectue en fonction de ce pas Une fois les permutations de ce pas effectues le pas est rduit Quand le pas atteint 1 le tri Shell devient un bte tri par insertion Au final le tri Shell consiste dgrossir 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 tableau est plus basse que celle de la deuxime partie ds le premier passage Au final le tri Shell est dune complexit On2 mais se rvle tre plus rapide dans la majorit des cas Cest lalgorithme de tri le plus utilis Prenez un tableau de dix lments Et un pas de 4 tape 1 t1 et t5 sont compars et ventuellement permuts 8 4 6 9 7 1 3 2 0 5 - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 113
tape 2 t2 et t6 sont compars et ventuellement permuts tape 3 t3 et t7 sont compars et ventuellement permuts tape 4 t4 et t8 sont compars et ventuellement permuts tape 5 t5 et t9 sont compars et ventuellement permuts Le pas ne doit pas tre calcul au hasard car cest de lui que dpend lefficacit de lalgorithme La formule utilise par lalgorithme est gnralement Un13Un1 avec U00 PROGRAMME TRISHELL VAR cptnijtmpentiers ttableau110 dentiers DEBUT cpt10 n0 TantQue nltcpt Faire n3n1 FinTantQue TanQue nltgt0 Faire nn3 Pour i de n cpt-1 Faire tmpti ji TantQue jgtn-1 ET tj-ngttmp tj tj-n jj-n FinTantQue tj tmp FinPour FinTantQue FIN Soit en Java class chap5trishell public static void mainString args int t48172593412281498033481011925 int ijn0memposcpt cpttlength 7 4 6 9 8 1 3 2 0 5 7 1 6 9 8 4 3 2 0 5 7 1 3 9 8 4 6 2 0 5 7 1 3 2 8 4 6 9 0 5 7 1 3 2 0 4 6 9 8 5 ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 114
whilenltcpt n3n1 whilen0 nn3 foriniltcpti memti ji whilejgtn-1 ampamp tj-ngtmem tjtj-n jj-n tjmem forj0jltcptj Systemoutprinttjquot quot Systemoutprintln 2 Recherche par dichotomie La recherche par dichotomie ne sapplique que sur les tableaux dj tris Vous avez dj rencontr un algorithme de recherche dlment dans un tableau non tri Mais celuici posait un problme si le tableau avait 10000 lments et que par pur hasard celui que vous cherchiez est le 10000me il faudra balayer lintgralit du tableau Cette recherche squentielle nest pas idale Dans un tableau tri la problmatique est radicalement diffrente Rien quavec une recherche squentielle il devient inutile de balayer tout le tableau il suffit de sarrter ds que la valeur de llment du tableau devient suprieure ce quon recherche do une probable complexit moyenne plus basse Mais il reste une solution plus efficace La dichotomie consiste diviser par deux lintervalle de recherche tant que llment recherch nest pas trouv Sur un tableau t de 10 lments tris Vous voulez savoir si la valeur 20 est prsente dans le tableau tape 1 Calculer lindice situ au milieu du tableau Lindice de dbut est 1 lindice de fin est 10 le milieu vaut dbutfin2 Comme cette valeur nest pas forcment entire on rcupre la division entire dbutfin DIV 2 Ici 5 tape 2 Comparer la valeur t5 avec 20 tant infrieure cela veut dire que la valeur 20 est forcment audel de lindice 5 On positionne Dbut 6 et on recalcule dbutfin DIV 2 Ici 8 tape 3 Comparer la valeur t8 avec 20 tant infrieure cela veut dire que la valeur 20 est audel de lindice 8 On positionne Dbut 9 et on recalcule On obtient 9 Indice 1 2 3 4 5 6 7 8 9 10 Valeur 2 7 9 10 11 14 17 18 20 22 Indice 1 2 3 4 5 6 7 8 9 10 Valeur 2 7 9 10 11 14 17 18 20 22 Indice 1 2 3 4 5 6 7 8 9 10 Valeur 2 7 9 10 11 14 17 18 20 22 Indice 1 2 3 4 5 6 7 8 9 10 Valeur 2 7 9 10 11 14 17 18 20 22 - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 115
tape 4 Comparer t9 avec 20 Les valeurs sont identiques la recherche est termine La recherche doit continuer tant que Dbut est infrieur ou gal Fin et que llment recherch na pas t trouv PROGRAMME DICHOTOMIE VAR ttableau110 dentiers dmfrechentiers DEBUT rech18 d1 f10 Rpter mdf DIV 2 Si rechgttm Alors dm1 Sinon fm-1 FinSi TantQue dltf ET rechltgttm Si rechtm Alors Afficher quotTrouvquot Sinon Afficher quotAbsentquot FinSi FIN Le code en Java correspondant est le suivant class chap5dicho public static void mainString args int t27910111417182022 int dfmrech rech15 d0 ftlength-1 do mintdf2 Systemoutprintlnquotdquotdquot fquotfquot mquotmquot tmquottm ifrechgttm dm1 else fm-1 whiledltf ampamp rechtm ifrechtm Systemoutprintlnrechquot trouv la position quotm else Systemoutprintlnrechquot na pas t trouvquot ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0h7PaMVCdzIgLAA-enidentnumber 116
Structures et enregistrements 1 Principe Les tableaux sont certes trs pratiques mais ils ne permettent pas toujours de rpondre efficacement tous les besoins de stockage Un tableau est une structure de donnes dont tous les lments sont de mme type Que faire quand vous avez besoin de placer dans une structure de type tableau des enregistrements de types diffrents Comme exemple concret prenez un catalogue de produits dans un magasin spcialis Un article est dcrit laide dune rfrence un nom libell et un prix Les deux premiers sont des chanes de caractres le dernier un nombre rel Comment se reprsenter cela avec des tableaux Il faudrait trois tableaux un pour les rfrences un autre pour les libells et un troisime pour les prix Lindice de larticle devrait tre identique pour les trois tableaux Cest possible faisable mais en pratique totalement ingrable ds quil sagit daller un peu plus loin que de simples traitements Quid des tri Quid des recherches Ca devient difficile Il faudrait donc une sorte de mtatype particulier qui pourrait regrouper en un seul ensemble des variables de types diffrents Ces mtatypes existent Ils sappellent des structures ou types structurs et permettent de dcrire des enregistrements Les enregistrements sont en fait des structures de donnes composes dlments de types diffrents ou non Ces structures composes de plusieurs lments forment une entit unique qui est appele un type structur Autrement dit vous pouvez crer vos propres types de donnes en combinant dautres lments de types diffrents ou non et crer des variables de ce nouveau type quon appelle des enregistrements Les diffrents lments contenus dans un type structur sont appels des champs 2 Dclaration a Type structur Le type structur est opposable aux types dit primitifs vus jusqu prsent Un type structur peut contenir des lments de types primitifs entiers rels chanes caractres des tableaux mais aussi des lments dautres types structurs Ceci permet une infinit de nouveaux types pour tous les cas de figures Un type structur doit tre dclar et dfini avant les variables pour quil puisse tre utilis pour dfinir des enregistrements Le type structur se dclare donc entre les constantes et les variables Si lalgorithme contient des 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 quotTypequot entre les motscls Structure et FinStruct Type Structure nomtype champ1typechamp1 champ2typechamp2 Champn typechampn FinStruct Chaque structure porte un nom Ce nom sera utilis pour dclarer des enregistrements Une structure peut contenir 1 n champs du mme type ou de types diffrents Une structure un seul champ est en soi totalement inutile La structure pour dcrire un article serait donc quelque chose comme Type Structure tarticle refchane libellechaine prixrel FinStruct b Enregistrement ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 117
Un enregistrement est une quotvariablequot dun type structur donn Il se dclare exactement comme une variable au mme endroit sous le motcl VAR Un enregistrement peut donc tre considr comme une variable un peu spciale cependant VAR nomenregnomtype Dans le cadre de lexemple prcdent vous dclarez des articles ainsi VAR article1article2article3tarticle En mmoire les divers lments dun enregistrement peuvent gnralement tre reprsents comme tant dans des zones contigus 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 reprenne le mme schma les traitements sen trouvent grandement simplifis Cependant et plus particulirement pour la ressemblance avec un contenu de base de donnes relationnelle lanalogie nest pas complte Un enregistrement ne contient pas didentifiant ou cl uniques et rien nempche que deux enregistrements de mme type contiennent les mme donnes Ce serait vous au sein de votre programme de grer ces cas de figure De mme le champ dapplication des enregistrements est beaucoup plus vaste quil ny parat Certains langages les utilisent pour des choses totalement diffrentes quune description de donnes de gestion Ainsi un langage comme le C dispose de types structurs pour grer les fichiers ouverture fermeture position type daccs etc mais aussi leur nom leur rfrence sur le disque leurs propritaires leurs droits Dautres types structurs sont utiles pour la gestion des dates et heures pour reprsenter une connexion rseau 3 Utiliser les enregistrements Les enregistrements sont composs de plusieurs lments appels champs Quand vous manipulez un enregistrement vous le faites au travers de ses champs Il nest pas possible daffecter une valeur un enregistrement en passant par son nom Pour lui affecter des valeurs il faut les affecter une une aux champs correspondants Cependant il est possible daffecter un enregistrement un autre du mme type chaque champ de lenregistrement affect reoit la valeur du champ correspondant de lenregistrement affecter a Utiliser les champs Vous accdez aux champs dun enregistrement en passant par le nom de lenregistrement et le nom du champ spars par le caractre quotquot le point selon la forme suivante nomenregnomchamp Cette syntaxe reprsente la valeur du champ nomchamp au sein de lenregistrement nomenreg Reprenons lexemple prcdent article1prix - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 118
reprsente le prix de larticle1 Dailleurs pour plus de simplicit lisez vos enregistrements de droite gauche article2libell se lit quotlibell de article2quot 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 Aussi noubliez jamais dcrire le nom de lenregistrement ET le nom du champ De mme ne confondez pas le nom du type structur et le nom de lenregistrement tarticleref mauvaise ide ne reprsente rien du tout et ne peut recevoir aucune valeur Les champs dun enregistrement se manipulent exactement comme des variables ils peuvent recevoir des valeurs et leur valeur peut tre affecte une autre variable Les champs peuvent tre utiliss partout o les variables sont utilises y compris vous le verrez dans le prochain chapitre comme paramtres de sous programmes en saisie en affichage etc Lexemple suivant reprend tous ces principes PROGRAMME demoenreg Type Structure tarticle refchane libellechaine prixrel FinStruct Var article1article2tarticle reponsechane DEBUT Afficher quotRfrence du premier article quot Saisir article1ref Afficher quotLibell du premier article quot Saisir article1libell Afficher quotPrix du premier article quot Saisir article1prix Afficher article1refarticle1libellearticle1prix Afficher quotCopier le premier article dans le second quot Saisir reponse Si reponsequotouiquot Alors article2article1 Afficher article2refarticle2libellearticle2prix FinSi article2prix 1525 Si article1prixarticle2prix Alors afficher quotLes deux articles ont le mme prixquot FinSi FIN Voici les constatations qui peuvent tre tires de cet exemple Le nom du champ seul ne reprsente rien il est toujours associ son enregistrement sous la forme enregchamp Ce qui est appel champ reprsente cette paire Un champ sutilise exactement comme une variable indpendante Cest ce quelle est puisquun type structur est un ensemble de variables dun type donn De ce fait un champ peut recevoir une valeur comme une autre Enfin le seul cas o un enregistrement peut recevoir une valeur en globalit cest quand on lui affecte un autre enregistrement du mme type b Un enregistrement dans une structure Un type structur dfinit un nouveau type de variable appel enregistrement Un enregistrement est dclar comme une variable Il semble donc logique quun enregistrement puisse faire luimme partie dun autre type structur ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 119
Chaque article dispose dun fabricant Ce fabricant peut tre dcrit par une structure type Structure tfabricant refchane nomchane adressechane telchane FinStruct Vous voulez maintenant associer un fabricant chacun de vos articles Rien de plus simple incorporez un enregistrement de type tfabricant votre type structur tarticle Structure tarticle refchane libellechane prixchane fabtfabricant FinStruct Maintenant dclarez un enregistrement de type article VAR artarticle Dans votre programme vous allez accder aux champs de lenregistrement art comme vu cidessus mais vous allez aussi rajouter les informations sur le fournisseur Pour a il suffit de respecter la syntaxe avec des points nomenreg1nomenreg2nomchamp Soit comme exemple Dbut artrefquotart00101quot artlibellequotPelle tarte Inox Luxequot artprix3550 cher pour une pelle tarte artfabref quotFab1234quot artfabnom quotLe roi de la tartequot artfabadresse quot12 rue Siflette 13248 Latruellequot artfabtel quot0404040404quot Fin c Un tableau dans une structure Vous voulez maintenant connatre le nombre darticles vendus sur les douze mois de lanne Pour a vous allez crer un nouveau type structur qui va reprendre un enregistrement tarticle auquel vous allez ajouter un moyen de stocker douze valeurs relles Le meilleur moyen que vous connaissez dj est le tableau Vous pouvez parfaitement rajouter un tableau comme champ de structure Structure bilanart arttarticle ventetableau112 de rels FinStruct Soit dit en passant dans une telle structure et un enregistrement bart1 associ laccs aux divers champs peut devenir un peu long Vous accdez au tableau vente ainsi bart1venteindice Lalgorithme suivant va demander la saisie successive des douze quantits de ventes mensuelles TYPES Le fabricant Structure tfabricant refchane nomchane adressechane - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 120
telchane FinStruct Larticle Structure tarticle refchane libellechane prixchane fabtfabricant FinStruct Les ventes mensuelles Structure bilanart arttarticle ventetableau112 de rels FinStruct VAR bart01bilanart itotal0entiers Dbut bart01artref quotart00101quot bart01artfabref quotFab1234quot Pour i de 1 12 Faire Afficher quotVentes du moisquotiquot quot Saisir bart01ventei totaltotalbart01ventei FinPour Afficher quotTotal annuel quot total Fin 4 Les tableaux denregistrements a Les tables 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 articles sans avoir dclarer n enregistrements indpendants Un enregistrement tant la rptition est le meilleur ami de la mmoire dclar comme une variable vous avez aussi le droit de crer des tableaux denregistrements Un tableau denregistrements se dclare comme nimporte quel autre tableau Il est parfois appel table Dans cette table les colonnes sont les champs et les lignes les enregistrements Soit la structure tarticle simplifie dorigine Structure tarticle refchane libellechaine prixrel FinStruct Vous voulez crer une table de dix enregistrements Var articles tableau110 de tarticles Pour saisir les lments dun enregistrement de cette table vous utilisez les indices articles1refquotart00101quot Pour accder aux dix enregistrements le mieux est dutiliser une boucle Dbut Pour i de 1 10 Faire Afficher quotSaisir ref articlequoti Saisir articlesiref FinPour Fin ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 121
b Une table comme champ Selon le mme principe quun tableau dans une structure vous pouvez utiliser un tableau denregistrements comme type de donnes dans une structure puisque ce nest quun tableau aprs tout Soit une grande enseigne disposant de dix magasins Vous devez dcrire deux structures une structure magasin et une structure enseigne La structure enseigne doit contenir les enregistrements des dix magasins Voici ce que vous pourriez faire Structure tmagasin adressechane telchane gerantchane FinStruct Structure tenseigne nomchane magasin tableau110 de tmagasins FinStruct Voici comment exploiter un enregistrement de type tenseigne Var enseigne tenseigne i entier Dbut Afficher quotNom de lenseigne quot Saisir enseignenom pour i de 1 10 Faire Afficher quotadresse du magasinquoti Saisir enseignemagasiniadresse Afficher quottel du magasinquoti Saisir enseignemagasinitel Afficher quotgrant du magasinquoti Saisir enseignemagasinigerant FinPour Fin Il ny a en fait rien de bien complexe Vous pouvez encore aller plus loin en crant des tables contenant dautres tables et ainsi de suite 5 Et Java Il y a ici un petit problme Java ne dispose pas tout au moins directement de moyen de dclarer une structure en tant que telle contrairement des langages comme le C C ou le Pascal Java est un langage dit objet Lobjet est abord dans le dernier chapitre Pour crer un objet Java il faut crire une classe cest la description ou une sorte de quottypequot dobjet Une classe peut contenir des variables les attributs et des bouts de programme les mthodes Par mauvaise analogie une classe qui ne contiendrait que des variables pourrait tre apparente une structure Voici un exemple succinct 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 fabnew tfabricant class chap5struct public static void mainString args tarticle article1new tarticle article1refquotArt00101quot - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 122
article1fabrefquotFab1234quot Systemoutprintlnarticle1ref Systemoutprintlnarticle1fabref Il est fortement probable que vous ne compreniez pas certaines instructions comme public new et pourquoi il faut utiliser des parenthses pourquoi class et pas struct etc Ne vous inquitez pas tout ceci sera expliqu au dernier chapitre consacr lobjet Pour linstant remarquez seulement que dans ce cas prcis le motcl class peut tre utilis pour dclarer des sortes de structures Il est aussi possible de crer des tableaux dobjets 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 fabnew tfabricant class chap5struct2 public static void mainString args int i0 tarticle articlenew tarticle3 fori0ilt3i articleinew tarticle article0refquotArt00101quot article0fabrefquotFab1234quot article1refquotArt00202quot article1fabrefquotFab4321quot Systemoutprintlnarticle0ref Systemoutprintlnarticle0fabref Systemoutprintlnarticle1ref Systemoutprintlnarticle1fabref ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0XegOlCdzIgLAA-enidentnumber 123
Prsentation 1 Principe Lors de la prsentation de la structure dun algorithme il a t brivement abord la possibilit dajouter une partie 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 peuttre avezvous remarqu quelques limitations frustrantes et notamment une certaine lourdeur 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 Lembtant est qu chaque fois que vous voulez calculer cette valeur vous devez rpter la structure conditionnelle Nauraitil pas t plus simple de le faire une seule fois et de passer ce bloc dinstructions uniquement la valeur dont on veut rcuprer la valeur absolue Vous pourriez pour cela envisager un second programme qui serait lanc par le programme principal avec comme paramtre cette valeur Cest techniquement faisable mais placer un second programme part un excutable juste pour ce genre de traitement cest une perte de temps et despace Lautre solution consiste rajouter le code ncessaire ce programme dans une structure spciale et part du programme principal Cest ce quon appelle un sousprogramme Les anciens langages BASIC utilisaient dailleurs des instructions en ce sens gosub sub xxx endsub etc sub pour sousprogramme 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 programme principal Un sousprogramme vite la rptition inutile de code et permet de clarifier le programme 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 aussi daller beaucoup plus vite Un programme complet forme une application Une application est si vous avez correctement suivi compose de plusieurs parties fonctionnelles Le programme principal ou bloc principal qui correspond au bloc principal dinstructions situes sous le motcl PROGRAMME et DEBUT Cest ce programme qui est excut quand vous lancez lexcutable qui rsulte de limplmentation de votre algorithme en Java par exemple En Java le programme principal est ce qui est situ sous la ligne contenant le mot quotmainquot qui signifie depuis langlais quotprincipalquot Des sousprogrammes chargs de divers rles qui peuvent aller du calcul dune valeur absolue celui dune expressions sousprogrammes mais aussi et surtout les mots fonctions et procdures pour les dcrire Cest Un sousprogramme ne se lance jamais tout seul il doit tre appel depuis le programme principal Cependant 2 Dclaration et dfinition a Dans un algorithme 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 langages de programmation car le programme principal ne peut pas utiliser un sousprogramme sil ne sait pas sil existe ltSOUS-PROGRAMME 1gt ltSOUS-PROGRAMME 1gt PROGRAMME XYZ VAR ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 124
DEBUT FIN Si dans votre algorithme vos sousprogrammes sont crits endessous du programme principal il est fort probable quand vous passez la programmation que vous obteniez des erreurs Un langage comme le C autorise cependant la dclaration du nom du sousprogramme en haut du programme et sa programmation en dessous Le PHP quant lui se fiche totalement de lendroit o le sousprogramme est crit Quant Java la problmatique est diffrente du fait de sa conception objet dernier chapitre Le sousprogramme a une structure assez simple et pour cause cest la mme que pour le programme principal vous y dclarez vos variables constantes tableaux etc et vous placez vos instructions entre DEBUT et FIN Voici un simple exemple pour le moment ayez une confiance aveugle les termes comme Procdure seront expliqus un peu plus loin Dans cet exemple vingt tirets sont affichs en partant du principe quils le sont sur la mme ligne Procdure RepeteCar Var ientier Dbut Pour i de 1 20 Faire Afficher quot-quot FinPour FinProc Vous constatez quun sousprogramme est constitu de Un identifiant sous forme de nom RepeteCar qui lui servira pour tre appel Une zone de dclaration de variables Un bloc dinstructions encadr entre Dbut et Fin Le tout tant ici et dans le cadre de cet exemple prcisment entre les motscls Procdure et FinProc En algorithmique un sousprogramme ne peut pas tre dclar dans un autre sousprogramme La possibilit existe cependant parfois dans certains langages de programmation comme le PHP mais alors il faut faire preuve dune trs grande rigueur le sousprogramme sera connu du reste du programme seulement quand celui qui le dclare sera luimme appel une premire fois b En Java En Java un sousprogramme se dclare sous cette forme typedonnee nomfonctionargument1 argument2 argumentn code du sous programme return valeur suivant le retour Vous navez pas encore rencontr ce quest un retour ni un argument Ce nest pas gnant pour les petits exemples En Java un sousprogramme est appel une mthode Ce nest pas une question de rhtorique mais li au fait que Java est un langage objet et que ce ne sont pas des sousprogrammes au sens propre du terme mais des morceaux de programmes au sein dun objet Vous verrez tout ceci dans le chapitre Une approche de lobjet Pour reprendre le petit sousprogramme RepeteCar sachez que si vous voulez viter en Java un passage la ligne vous pouvez utiliser print la place de println le ln de ce dernier signifiant linefeed Aussi dans le cadre de cet exemple et de tous les suivants sauf dans le chapitre Une approche de lobjet vous rajouterez un mot cl quotstaticquot devant la dclaration de la mthode du sousprogramme Enfin comme ce sousprogramme ne retourne pas de valeur vous y rajouterez aussi le motcl quotvoidquot static void RepeteCar int i fori1 ilt20 i Systemoutprintquotquot - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 125
Systemoutprintln 3 Appel Un sousprogramme est excut depuis le programme principal ou un autre programme Pour a le programme fait appel au sousprogramme Lappel au sousprogramme est une instruction qui va dclencher lexcution de celuici Cet appel peut avoir lieu nimporte o Suivant les diverses conventions les sousprogrammes peuvent tre appels les instructions cidessus tant souvent rserves aux procdures Pour reprendre le sousprogramme RepeteCar voici un exemple dappel Procdure RepeteCar VAR ientire DEBUT Pour i de 1 20 Faire Afficher quot-quot FinPour FIN FinProc PROGRAMME LIGNES VAR ientier DEBUT Afficher quotVoici 10 lignes de 20 caractresquot Pour i de 1 10 Faire RepeteCar FinPour Afficher quotLe programme est terminquot FIN Lorsque le sousprogramme se termine linstruction situe juste en dessous de son appel est excute On dit quil y a retour du sousprogramme vers linstruction suivante ou appelante Enfin un sousprogramme peut tre appel en lui fournissant des valeurs appeles paramtres Ces valeurs seront places dans des variables utilisables au sein du sousprogramme comme toute autre variable Voici lexemple complet en Java avec en gras lappel la mthode sousprogramme class chap6declare static void RepeteCar int i fori1 ilt20 i Systemoutprintquotquot Systemoutprintln public static void mainString args int i Systemoutprintlnquot10 lignes de 20 caractresquot fori1ilt10i RepeteCar 4 Fonctions et procdures Le sousprogramme RepeteCar a t dclar avec le motcl Procdure et il vous a t indiqu aussi lexistence du motcl Fonction Il y a donc deux types de sousprogrammes Certains langages peuvent proposer ou lun ou lautre parfois les deux Vous entendrez parfois parler de langages procduraux comme le Pascal ou fonctionnels comme le ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 126
C Avant de continuer juste un petit mot sur Java Java ne fait pas de diffrences entre les fonctions et les procdures telles que prsentes ici En Java les procdures sont des fonctions qui ne retournent pas de valeurs ou plutt vous lavez compris des mthodes qui ne retournent pas de valeurs a Les procdures Les procdures sont des sousprogrammes constitus dune suite dinstructions indpendantes Une procdure ne retourne pas de rsultat ou de valeur au programme qui la appel tout comme les valeurs passes en paramtre ne sont pas forcment modifies de manire globale Une procdure pourrait faire lobjet dun programme part Son contenu peut cependant parfois influer sur le droulement global du programme sil modifie un fichier une base de donnes etc La procdure RepeteCar est un exemple typique le bloc de donnes rptitif influe sur laffichage mais ne retourne rien en tant que tel Il existe cependant quelques moyens indirects pour une procdure de retourner une valeur en passant celleci par rfrence selon le mme principe que ce qui a t expliqu pour les tableaux le sousprogramme reoit la rfrence de la variable et peut la modifier vers celle contenant la nouvelle valeur Ceci est dailleurs aussi possible avec les fonctions Plus simplement lalgorithmique effectue souvent une distinction entre les valeurs en entre de la procdure celles quon lui transmet et les valeurs en sortie Dans ce cas autant utiliser les fonctions notamment si une seule valeur doit tre retourne b Les fonctions En mathmatique vous avez probablement rencontr la notion de fonction Dans le cadre de la rsolution dune quation du second degr lquation scrit gnralement ainsi fxax2bxc Le rsultat de fx ou fonction de x est le rsultat du contenu de la fonction cestdire lquation La valeur de fx est ce rsultat Cest pareil en algorithmique une fonction est un sousprogramme qui retourne une valeur Un fonction se dcrit ainsi Fonction nomtype Var variables Dbut bloc dinstructions Retourne valeur FinFonc Une fonction se dclare avec le motcl Fonction suivi de son nom et du type de valeur quelle retourne Ce peut tre nimporte quel type entier rel chane Une fonction peut contenir une zone de dclaration de variable et de types structurs Le bloc dinstructions est encadr entre Dbut et FinFonc La valeur de la fonction est retourne par linstruction Retourne La valeur retourne doit tre du mme type que celle attendue par la dclaration de la fonction Fonction equationrel Var abcxrels Dbut xaxxbxc - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 127
retourne x FinFonc Il existe une diffrence trs importante entre une procdure et une fonction La procdure est vue comme une instruction La fonction est vue comme une valeur Tout comme une variable retourne une valeur une fonction retourne aussi une valeur ce qui veut dire quune fonction peut tre utilise appele partout o une variable pourrait ltre dans une expression dans un calcul un affichage une affectation etc Dans un seul cas la fonction ne peut pas tre utilise une fonction fournit une valeur elle ne peut pas se voir affecte une valeur Ceci est interdit equationx INTERDIT mais ceci est autoris xequation x recevra alors la valeur retourne par la fonction equation via linstruction Retourne PROGRAMME EQ1 Var resultrel Dbut resultequation Afficher result Fin Note linstruction Retourne ne retourne pas une variable mais une valeur Cette valeur peut tre le contenu dune variable mais aussi une autre fonction auquel cas cest le rsultat de cette autre fonction qui sera retourn ou nimporte quelle expression pouvant tre value La fonction equation peut donc tre crite ainsi Fonction equationrel Var abcxrels Dbut Retourne axxbxc 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 abcx Il faudrait initialiser les variables ici xaxxbxc return x 5 Variables locales et globales a Locales Lexemple de la procdure RepeteCar a soulev un petit problme pas si anodin que a Il met en vidence lutilisation de deux variables de mme nom lune dans le programme principal lautre dans le sousprogramme La variable i apparat deux fois Lendroit o les variables sont dclares est trs important Selon cet endroit les variables ont une quotportequot diffrente La porte dune variable est sa visibilit au sein des diffrentes parties du programme Le cas gnral dit quune variable nest visible et accessible par dfaut que dans le bloc dinstructions o elle a t ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 128
dclare Une variable dclare dans un sousprogramme sous les motscls Procdure ou Fonction ne pourra dans ce cas qutre lisible et modifiable uniquement dans ce sousprogramme Idem pour le programme principal une variable dclare sous le motcl Programme ne sera accessible que par celuici Les variables accessibles uniquement par le programme ou sousprogramme dans lesquels elles sont dclares sont appeles des variables locales Toutes les variables que vous avez rencontres jusqu prsent sont des variables locales Les variables locales de mme nom nont aucun rapport entre elles Elles sont totalement indpendantes les unes des autres et aucune interaction entre elles nest possible Les variables locales peuvent donc parfaitement porter un mme nom La variable i de RepeteCar nest pas du tout la mme que la variable i du programme Lignes Il ny a aucun risque daccder la valeur ou de modifier celleci par accident de lun vers lautre programme Du ct de la mmoire le contenu de ces deux variables est cloisonn et distinct des adresses diffrentes En Java une variable dclare dans le programme principal ou dans une mthode est locale ce bloc dinstructions cestdire non visible depuis les autres mthodes b Globales Il serait pourtant trs pratique de pouvoir accder une variable depuis nimporte quel endroit du programme quil soit principal ou un sousprogramme Ce mcanisme permettrait dutiliser son contenu et den modifier la valeur partout dans le programme La porte dune telle variable stendrait tout le code Ce type de variable sappelle une variable globale et elle existe tant en algorithmique que dans la plupart des langages Une variable globale est dclare en dehors des sousprogrammes et du programme principal avant ceuxci cest dire en premier dans lalgorithme tant globale elle est accessible de partout tant en accs lecture du contenu quen modification affectation dune nouvelle valeur Les variables globales sont dclares de cette manire Var globales nbcarentier ccaractre Procdure RepeteCar VAR ientier Dbut Pour i de 1 nbcar Faire Afficher c FinPour FinProc PROGRAMME LIGNES VAR ientier DEBUT cquotquot Pour nbcar de 1 10 Faire RepeteCar FinPour FIN Ce programme une fois excut devrait vous afficher quelque chose de ce genre La variable globale amne trois remarques - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 129
Elle nest dclare quune seule fois pour lintgralit du programme Elle ne doit donc jamais tre redclare tant dans le programme principal que dans un sousprogramme Elle permet indirectement de quotpasserquot des valeurs aux sousprogrammes qui lutilisent Cest un quotdommage collatralquot et les variables globales ne devraient tre rserves que lorsque cellesci sont vraiment communes la plus grande partie du code Il serait ridicule de dclarer toutes les variables en globales La plupart des programmes et sousprogrammes ne les utiliseraient pas toutes et en plus vous risqueriez par accident pensant une variable locale den modifier certaines sans y prendre garde et ainsi de mettre en pril lexcution du programme 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 compilation ou lexcution c Variables globales et Java 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 dans le dernier chapitre En attendant ce chapitre et un surcrot dexplications outre le type de la variable vous rajouterez le motcl quotstatic devant les variables class chap6globale static char c static int nbcar static void RepeteCar int i fori1 iltnbcar i Systemoutprintc Systemoutprintln public static void mainString args c fornbcar1nbcarlt10nbcar RepeteCar 6 Les paramtres Maintenant que vous rservez les variables globales des cas bien prcis il vous faut trouver un autre moyen de passer des valeurs aux procdures et aux fonctions Quand en mathmatiques vous calculez la valeur dune fonction f x vous lui demandez en fait de calculer la valeur de la fonction selon la valeur de x Vous passez donc la valeur de x la fonction Le principe est le mme avec vos algorithmes vous pouvez transmettre des valeurs vos procdures et fonctions tout comme vous pouvez en recevoir La syntaxe diffre lgrement entre les fonctions et les procdures pour cette raison Dans les deux cas cependant les paramtres se placent entre les parenthses situes aprs leur nom toute expression retournant une valeur que ce soit un scalaire une variable un tableau un enregistrement une table ou encore une fonction qui sera substitue par son rsultat a Procdures La syntaxe de passage des paramtres est la suivante ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 130
Procdure nomprocE param1typeES param2typeS param3type Les paramtres dune procdure sont de trois catgories Ceux en entre qui correspondent aux valeurs que vous souhaitez transmettre la procdure Entre les parenthses ils sont prcds dun quotEquot comme Entre car ce sont les valeurs en entre de la procdure Ceux en entre et en sortie prcds de quotESquot Quand vous avez plusieurs paramtres en entre il suffit de tous les mettre aprs le E et mme de les regrouper selon leur type Cette procdure prend cinq paramtres trois entiers et deux chanes Procdure procE p1p2p3entiersp4p5chanes La procdure RepeteCar se prte bien un paramtre Comment en effet utiliser une variable globale pour spcifier le nombre de caractres rpter Autant passer ce nombre en paramtre Voici le programme modifi en consquence Procdure RepeteCarE nbcarentier E ccaractre VAR ientier DEBUT Pour i de 1 nbcar Faire Afficher c FinPour FinProc PROGRAMME LIGNES VAR ientier DEBUT Pour i de 1 10 Faire RepeteCariquotquot FinPour FIN Vous rcuprez une ventuelle valeur en sortie via la ou les variables E ou ES Voici une procdure qui convertit un nombre de secondes en heures minutes et secondes Elle prend quatre paramtres dont un en entre le nombre de secondes et trois en sortie heures minutes et secondes Procdure sectohmsE nbsecentier S hmsentiers Dbut hnbsec DIV 3600 nbsecnbsec3600 mnbsec DIV 60 snbsec MOD 60 FinProcdure PROGRAMME convertsec Var nbsecondes entier heuresminutessecondesentiers Dbut nbsecondes3950 sectohmsnbsecondesheuresminutessecondes Afficher heuresminutessecondes Fin La procdure prcdente fonctionne certes merveille mais avec un peu plus de rflexion pourquoi ne pas utiliser Passer un enregistrement comme paramtre - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 131
une seule structure pour reprsenter toutes les composantes dune heure Struct hms heuresentier minutesentier secondesentier FinStruct Un enregistrement peut tre pass en paramtre dune procdure tout comme une variable en entre ou en sortie La procdure et le programme peuvent tre convertis comme ceci Types Struct hms heuresentier minutesentier secondesentier FinStruct Procdure sectohmsE nbsecentier S dureehms Dbut dureeheuresnbsec DIV 3600 nbsecnbsec3600 dureeminutesnbsec DIV 60 dureesecondesnbsec60 FinProcdure PROGRAMME convertsec Var nbsecondesentier heureshms Dbut nbsecondes3950 sectohmsnbsecondesheures Afficher heuresheuresheuresminutesheuressecondes Fin b Les fonctions Les fonctions ne retournent quune seule valeur via linstruction Retourne Aussi il ny a pas besoin de spcifier si les paramtres sont en entre ou en sortie Ils sont forcment en entre Par contre la valeur de la fonction peut tre de nimporte quel type Voici une fonction qui fait linverse de la procdure prcdente elle reoit des heures minutes et seconde et en contrepartie elle retourne le nombre de secondes total Fonction hmstosecheuresminutessecondes entiersentier Var totalentier Dbut totalheures3600minutes60secondes Retourne total FinFonc Une fonction peut parfaitement rcuprer un enregistrement comme paramtre Voici une bonne occasion de rutiliser le type structur prcdemment dfini Fonction hmstosecdureehmsentire Var total entier Dbut totaldureeheures3600dureeminutes60dureesecondes Retourne total FinFonc Enfin une fonction peut aussi retourner un enregistrement Ce qui veut dire que la procdure sectohms est inutile une fonction peut la remplacer ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 132
Fonction sectohmsnbsec entierhms Var dureehms Dbut dureeheuresnbsec DIV 3600 nbsecnbsec3600 dureeminutesnbsec DIV 60 dureesecondesnbsec60 Retourne duree FinFonc Pour cette dernire fonction le rsultat doit tre affect un enregistrement de mme type PROGRAMME convertsec2 Var nbsecondesentier heureshms Dbut nbsecondes3950 heuressectohmsnbsecondes Afficher heuresheuresheuresminutesheuressecondes Fin Une procdure ne retournant quune seule valeur et quel que soit son type est toujours convertible en fonction Une telle procdure doit dailleurs toujours tre convertie en ce sens elle na pas dintrt autrement Pour tester les fonctions sectohms et hmstosec 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 paramtre une autre fonction si les types attendus sont compatibles PROGRAMME convertsec3 Var nbsecondes1entier nbsecondes2entier Dbut nbsecondes13950 nbsecondes2hmstosecsectohmsnbsecondes1 Si nbsecondes1nbsecondes2 Alors Afficher quotErreur dans lune des fonctions quot Sinon Afficher quotUn programme parfaitquot FinSi Fin c Paramtres et Java 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 paramtres en entre et sortie ce qui veut dire que les paramtres de ce genre sils sont modifis dans la mthode sont aussi modifis hors de la mthode Cest le principe du passage par rfrence Les rfrences seront abordes un peu plus profondment dans le chapitre Notions avances consacr aux notions avances dont les pointeurs En attendant tous les exemples prcdents sont faisables en Java bien heureusement La procdure RepeteCar est donc transforme ainsi class chap6param1 static void RepeteCarint nbcar char c int i fori1 iltnbcar i Systemoutprintc Systemoutprintln - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 133
public static void mainString args int nb fornb1nblt10nb RepeteCarnb Voici en Java une reprise des structures hms et des fonctions hmstosec et sectohms Il ny a pas de difficult dans cette implmentation class hms int heures int minutes int secondes class chap6secondes static int hmstosechms duree int total totaldureeheures3600dureeminutes60dureesecondes return total static hms sectohmsint nbsec hms dureenew hms dureeheuresnbsec3600 nbsecnbsec3600 dureeminutesnbsec60 dureesecondesnbsec60 return duree public static void mainString args int nbsecondes nbsecondes1nbsecondes2 hms heuresnew hms exemple 1 nbsecondes39450 heuressectohmsnbsecondes exemple 2 nbsecondes13950 nbsecondes2hmstosecsectohmsnbsecondes1 Systemoutprintlnnbsecondes2 d Petite application fonctionnelle Pour finir ces deux fonctions sont plus pratiques quil ny parat Grce elles vous pouvez trs facilement trouver le temps coul entre une premire heure et une seconde heure Le principe est des plus simples Vous saisissez deux horaires dans des enregistrements hms Vous les convertissez en nombre de secondes Vous faites la diffrence entre ces deux nombres Vous convertissez le rsultat en enregistrement hms Dit comme ceci a pourrait sembler un peu compliqu si les fonctions nexistaient pas Vous avez donc besoin de la dfinition du type structur hms et des deux fonctions nbsectohms et hmstonbsec Vous navez mme pas besoin de variables pour y placer les nombres de secondes Une seule ligne avec les bons paramtres suffit sen ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 134
passer voyez celle en gras Type Struct hms heuresentier minutesentier secondesentier FinStruct Fonction hmstosecdureehmsentier Var totalentier Dbut totaldureeheures3600dureeminutes60dureesecondes Retourne total FinFonc Fonction sectohmsnbsec entierhms Var dureehms Dbut dureeheuresnbsec DIV 3600 nbsecnbsec3600 dureeminutesnbsec DIV 60 dureesecondesnbsec60 Retourne duree FinFonc Programme delta Var heure1heure2deltahms Dbut Afficher quotSaisir lheure de dpartquot Saisir heure1heuresheure1minutesheure1secondes Afficher quotSaisir lheure de finquot Saisir heure2heuresheure2minutesheure2secondes deltasectohmshmstonbsecheure2- hmstonbsecheure1 Afficher quotIl sest coul quot Afficher deltaheuresdeltaminutesdeltasecondes Fin Pourquoi ne pas aller encore plus loin en crant une fonction qui calcule seule la dure en faisant appel aux deux autres fonctions En effet vous pouvez parfaitement appeler des sousprogrammes dans dautres sousprogrammes donc des fonctions dans des fonctions ou des procdures dans des fonctions et rciproquement Voici une fonction hmsdelta qui va calculer tout ceci Fonction hmsdeltahms1hms2hmshms Var deltahms Dbut deltanbsectohmshmstonbsechms2-hmstonbsechms1 Retourne delta FinFonc Du coup le programme principal est modifi comme ceci Programme delta Var heure1heure2deltahms Dbut Afficher quotSaisir lheure de dpartquot Saisir heure1heuresheure1minutesheure1secondes Afficher quotSaisir lheure de finquot Saisir heure2heuresheure2minutesheure2secondes deltahmsdeltaheure1heure2 Afficher quotIl sest coul quot Afficher deltaheuresdeltaminutesdeltasecondes Fin - 12 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 135
Voici enfin une implmentation en Java de la fonction hmsdelta et du calcul de ce dernier exemple class chap6secondes static hms hmsdeltahms hms1 hms hms2 hms deltanew hms deltasectohmshmstosechms2-hmstosechms1 return delta public static void mainString args hms heuresnew hms hms heures2new hms hms delta exemple 3 heuresheures10 heuresminutes30 heuressecondes45 heures2heures18 heures2minutes36 heures2secondes24 deltahmsdeltaheuresheures2 Systemoutprintlndeltaheuresquotquotdeltaminutesquotquotdeltasecondes 7 Sousprogrammes prdfinis a Un choix important Presque tous les langages de programmation proposent dune manire ou dune autre la possibilit de crer des readLine peuvent tre considrs sous certains aspects cf le dernier chapitre comme des sousprogrammes lun charg dafficher du texte lautre de saisir des donnes Le langage PHP propose une quantit impressionnante de sousprogrammes calculs mathmatiques travaux graphiques manipulations de bases de donnes plusieurs milliers Autrement dit les concepteurs du langage ou dautres personnes fournissent des bibliothques de sousprogrammes pour rduire autant que possible et sans tomber dans lexcs le travail des programmeurs Avant de crer vos propres sousprogrammes vrifiez tout dabord dans la documentation du langage que vous utilisez si vous pouvez y trouver votre bonheur Un sousprogramme prdfini porte un nom qui reflte souvent ce quil fait Cest une procdure ou une fonction cf la section Variables locales et globales de ce chapitre plus souvent une fonction qui retourne un rsultat b Quelques exemples 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 caractres de cette chane Programme len Var txt chane l entier Dbut txtquotUn petit textequot llongueurtxt Fonctions sur chanes ENI Editions - All rigths reserved - Jonifar lina - 13 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 136
Afficher l affiche 14 Fin Les fonctions milieu gauche et droite permettent de dcouper des morceaux dans une chane de caractres La fonction milieu prend trois valeurs entre parenthses une chane une position de dbut et une longueur Elle est parfois nomme sschaine souschane sutilisant de la mme manire Les deux autres ne prennent que deux paramtres une chane et une longueur Dans le cas de gauche cest le nombre de caractres dcouper en partant de la gauche pour droite depuis la droite et pour milieu depuis la position indique Les positions dmarrent 1 Le programme suivant va tout dabord afficher tous les caractres dune chane les uns aprs les autres puis le premier mot puis le dernier Programme decoupe Var txt chane result chane i entier Dbut txtquotSalut les amisquot Pour i de 1 longueurtxt Faire resultmilieutxti1 Afficher result les lettres une une Fin Affiche gauchetxt5 Salut Affiche droitetxt4 amis Fin La fonction pos position dtermine la position dune chane de caractres dans une autre Elle trouve donc une souschane de caractres donne et retourne sa position le cas chant zro sinon Programme trouve Var chchanes position entier Dbut txtquotabcedefghikquot positionposquotdefquottxt Si pos0 Alors Afficher quotPas trouvquot sinon Afficher quotA la positionquotpos FinSI Fin La fonction suppr permet de supprimer une souschane dune chane de caractres en fonction de sa position initiale et de sa longueur Programme suppr Var txt chane Dbut txtquotabcdefghquot txtsupprtxt4lentxt-3 Affiche txt reste abc Fin Tous les langages proposent souvent un grand nombre de fonctions mathmatiques Dommage pour vous la plupart des exemples des derniers chapitres ont des quivalents sous forme de fonctions Cest le cas des racines carres des puissances des factorielles des fonctions trigonomtriques comme les sinus cosinus et tangente etc racinex donne la racine carre de x puissancexy donne x la puissance y sinx sinus de x Fonctions mathmatiques - 14 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 137
cosx cosinus de x tanx tangente de x Certaines conventions algorithmiques ne reconnaissant pas les ou MOD comme oprateurs modulos alors que les langages eux si vous pouvez trouver parfois la fonction modxy qui quivaut x MOD y et la fonction entierxy qui quivaut x DIV y 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 Idal pour un lancer de d Programme d Var d saisie entiers Dbut dalatoire51 entre 1 et 6 Rpter Afficher quotQuelle est la valeur du d quot Saisir saisie Si dsaisie Alors Afficher quotRat essayez encorequot FinSi Jusqu dsaisie Afficher quotBravo quot Fin Vous pouvez convertir une chane de caractres en valeur numrique laide de la fonction chnum qui prend comme paramtre la chane de caractres et qui retourne la valeur en entier ou rel selon le cas La chane doit tre une reprsentation dune valeur numrique et rien dautre La fonction numch fait exactement le contraire elle convertit un nombre en chane de caractres lidal pour sauver tout ceci dans un fichier texte Voici un exemple simple Programme conversion Var rPi rel cPi chane Dbut rPi31415927 cPinumchrPi Afficher cPi cPiquot314quot rPichnumcPi Fin Les fonctions prdfinies en Java sont extrmement nombreuses Dans les exemples prcdents vous avez eu loccasion den rencontrer quelques unes notamment des conversions de chanes vers des entiers par exemple 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 reporter la documentation en ligne de Java ladresse httpjavasuncomjavase6docsapi pour la version 6 du jdk Dans les listes de gauche notamment celle du bas recherchez String Dans le cadre principal saffiche toute la 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 peuvent vous intresser length retourne la longueur de la chane substringdbut fin dcoupe un morceau de chane trim supprime tous les espaces en dbut et fin de chane Fonctions de conversion Fonctions prdfinies en Java ENI Editions - All rigths reserved - Jonifar lina - 15 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 138
indexOfchane depart retourne la position dune chane dans une autre depuis une ventuelle position isEmpty retourne vrai ou faux selon que la chane est vide ou non valueOfvaleur la valeur est convertie en chane Notez que les positions dans les chanes dbutent 0 Pour utiliser ces fonctions vous devez les accoler avec un point au nom de la variable de type String que vous utilisez Par exemple class chap6predef public static void mainString args int valeur String txt1txt2 txt1quot Bonjour les amis quot txt1txt1trim supprime les espaces valeurtxt1length longeur 16 Systemoutprintlntxt1quot de longueur quotvaleur txt2txt1substring35 jo Systemoutprintlntxt2 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 accoler Math avec un point devant class chap6math public static void mainString args long valeur valeurlongMathpow248 Systemoutprintlnvaleur 8 Dernier cas les tableaux Une fonction peut retourner un tableau seulement si la variable qui la reoit est ellemme un tableau de mme dimension et de mme nombre dindices 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 dimplmentation ne propose pas dinstructions ou de fonctions prdfinies pour trouver la De nombreux exemples sont possibles Parmi eux pourquoi ne pas trier un tableau Reprenez lun des algorithmes de tri du chapitre prcdent comme le tri par insertion et adaptezle pour le transformer en fonction Fonction tritableauttableau dentiersnbentier tableau dentiers VAR imementiers DEBUT Pour i de 1 nbelem faire memtabi posi-1 tant que tabposgtmem et posgt0 Faire tabpos1tabpos pospos-1 FinTantQue tabpos1mem Les fonctions mathmatiques - 16 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 139
FinPour FinFonc Voici un petit programme pour lexploiter PROGRAMME TRITAB CONST INDICES10 VAR t tableau1INDICES 10587316942 dentiers i entier Dbut ttritableautINDICES Pour i de 1 INDICES Faire Afficher ti FinPour Fin En Java cest encore plus simple il se fiche de la taille des tableaux passs en paramtres et en plus pour pouvez obtenir la taille dun tableau La fonction tri tableau ne reoit donc quun seul paramtre le tableau trier et nest mme pas oblige de retourner le tableau car il est pass en rfrence class chap6tri static void tritableauint tab int imemposcpt cpttablength fori1iltcpti memtabi posi-1 whileposgt0 ampamp tabposgtmem tabpos1tabpos pos-- tabpos1mem public static void mainString args int t481725934 int icpt cpttlength SystemoutprintlnquotAvant quot fori0iltcpti Systemoutprinttiquot quot Systemoutprintln tritableaut SystemoutprintlnquotAprs quot fori0iltcpti Systemoutprinttiquot quot Systemoutprintln Le rsultat est le suivant Avant 48 17 25 9 34 Aprs 9 17 25 34 48 ENI Editions - All rigths reserved - Jonifar lina - 17 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0I71JRlCdzIgLAA-enidentnumber 140
Les sousprogrammes rcursifs 1 Principe Un sousprogramme peut appeler un autre sousprogramme quel quil soit Donc un sousprogramme peut sappeler 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 Lexemple le plus simple est la factorielle nnn1 Il existe deux types de rcursivit Simple ou rapide le sousprogramme sappelle luimme Croise ou indirecte deux sousprogrammes sappellent lun lautre le premier appelle le second qui appelle le premier etc La rcursivit peut tre applique tant aux fonctions quaux procdures Pour une rcursivit simple Procdure recursive Dbut instructions recursive instructions Fin Pour une rcursivit croise Procdure recur1 Dbut instructions recur2 instructions Fin Procdure recur2 Dbut instructions recur1 instructions Fin La suite ne va exposer que les sousprogrammes rcursifs simples 2 Un premier exemple la factorielle Une factorielle est lexemple rv dapplication dun algorithme rcursif Cet exemple a dj t prsent dans les chapitres prcdents mais un petit rappel simpose 1010987654321 Donc 1010987654321 Donc 10109 Donc nnn1 Si vous crez une fonction approprie dans ce cas appele fact et charge de calculer la factorielle de n vous auriez un raccourci de ce genre ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA-enidentnumber 141
factnnfactn-1 De l il vous devient trs facile dcrire une fonction fact rcursive Fonction factnentier entier Dbut nfactn-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 continuer tant que n est suprieur 1 Voici les passes successives pour une factorielle de 5 1 re tape 5gt1 Oui fact5 appelle 5fact4 2 me tape 4gt1 Oui fact4 appelle 4fact3 3 me tape 3gt1 Oui fact3 appelle 3fact2 4 me tape 2gt1 Oui fact2 appelle 2fact1 5 me tape 1gt1 Non fact1 sort en retournant la valeur 1 fact2 Estce fini Non Chaque fonction appele se terminant retourne sa valeur au programme ou sousprogramme layant appel Donc a continue 6 me tape fact2 2fact12 retourne 2 fact3 7 me tape fact3 3fact26 retourne 6 fact4 8 me tape fact4 4fact324 retourne 24 fact5 9 me tape fact5 5fact4120 retourne 120 au programme appelant Si vous suivez lordre des appelsltgtretours vous obtenez le schma suivant Les allersretours dun appel rcursif Un algorithme un peu plus correct de fact est donc Fonction factn entier entier Dbut Si ngt1 Alors nnfactn-1 FinSi Retourne n Fin - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA-enidentnumber 142
Il manque encore le cas de la factorielle de zro qui vaut un Au final la fonction rcursive fact pourrait ressembler ceci car une factorielle nest possible quavec des entiers positifs Font factnentierentier Dbut Si n0 Alors Retourne 1 Sinon Retourne nfactn-1 FinSi Fin La mme fonction en Java avec son programme daccompagnement class chap6fact static int factint n ifn0 return 1 else return nfactn-1 public static void mainString args int n nfact10 Systemoutprintlnn 3 Un exemple pratique les tours de Hanoi des deux nexiste Ce sont en fait des anagrammes faisant croire que ce jeu a t invent par un asiatique Tout faux N Claus de Siam est lanagramme de Lucas DAmiens Edouard Lucas en fait n Amiens et LiSouStian est lanagramme de SaintLouis nom du Lyce o Lucas enseignait Les tours de Hanoi drivent dune lgende Hindou qui dit quun temple dispose de trois poteaux sur lesquels sempilent 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 Ils ne peuvent dplacer quun seul disque la fois Ils ne peuvent dplacer un disque que dans un emplacement vide ou sur un disque de plus grand diamtre La lgende dit aussi que quand les disques ont t empils au dbut des temps et que lorsque les prtres auront fini de les dplacer ce sera la fin du monde Nul doute que si les prtres de la lgende avaient eu un ordinateur nous serions tous dj morts Quoique Avec 64 disques il faut 264 1 dplacements 18446744073709551615 et uniquement sans se tromper soit raison de un par seconde 584 542 046 090 ans 584 milliards dannes Sachant que lunivers a environ 14 milliards dannes cest thorique il nous reste 570 milliards dannes pour en profiter En plus les disques en or doivent tre trs lourds dplacer Le jeu fait rfrence Hano car dans la capitale du Vietnam une anciennen colonie franaise les toits de certaines pagodes ont la forme de plateaux empils Lalgorithme rcursif pour rsoudre ce problme est un grand classique ncessitant un peu de torture mentale Supposons que vous sachiez dplacer n1 disques Pour en dplacer n il suffit de dplacer n1 disques du piquet 1 au piquet 3 puis de dplacer le grand disque du piquet 1 au piquet 2 et de terminer en dplaant les n1 autres disques du piquet 3 vers le piquet 2 Soient ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA-enidentnumber 143
n le nombre de disques a la position de dpart valant 1 b la position darrive valant 2 c la position intermdiaire utilisable valant 3 au dpart tous les disques sont la position a une procdure quotdplacerquot qui dplace un disque dune position une autre via une position intermdiaire Lalgorithme est le suivant Procdure dplacernabc entiers Dbut Si ngt0 Alors dplacern-1acb Afficher quotDe quota quotvers quotb dplacern-1cba FinSi Fin Soit en Java class chap6hanoi static void deplaceint n int aint b int c ifngt0 deplacen-1acb SystemoutprintlnquotDe quotaquot vers quotb deplacen-1cba public static void mainString args deplace3123 - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0z66ITVCdzIgLAA-enidentnumber 144
Les diffrents fichiers 1 Prambule Vous permettrez pour une fois dtre un peu direct les fichiers sont une calamit dcrire en algorithmique Durant des annes jusquau milieu des annes 1990 le COBOL a rgn en matre chez les langages de programmation en informatique de gestion Ce langage tait aussi puissant dans ce domaine que sa syntaxe tait pratique Ceux dentre vous qui connaissent un peu le COBOL savent de quoi il est question ici Une des sources de sa puissance tait sa capacit grer les fichiers et les enregistrements structurs dans tous les sens dans toutes les formes Seulement le COBOL est pass de mode pour les nouveaux dveloppements Les multitudes de fichiers de donnes diverses et varies ont t remplaces par dautres structures notamment par des bases de donnes relationnelles rendant caduque ltude de la plupart des types de fichiers au profit de langages comme le SQL Pourtant les bases de donnes ellesmmes sont souvent stockes dans des fichiers Aussi ce chapitre est plus court que les autres Il serait possible de dcrire une foule de types de fichiers des livres complets existent sur ce thme de plusieurs centaines de pages Les bases et dfinitions thoriques seront peu prs toutes couvertes mais seuls seront traits les fichiers textes Java ne sachant pas directement vous pouvez bien entendu tout reprogrammer cest son rle grer des fichiers de type indexs cela rsout singulirement le problme 2 Problmatique Questce quun fichier Cest exactement la mme chose que dans la ralit Quand vous avez une seule information retenir dans votre tte cest facile Quand vous en avez des milliers cest une mission impossible Vous allez utiliser un agenda rempli de fiches Le cerveau a certes des capacits incroyables mais comment retenir toutes les transactions bancaires de millions de comptes pour une banque cela rajoutez deux problmes Malgr la puissance de vos ordinateurs la capacit mmoire reste souvent limite Un ordinateur 32 bits quotstandardquot 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 camescope numrique occupe prs de 20 Go un DVD complet plus de 8 Go etc Mme sil tait possible de conserver toutes les donnes en mmoire centrale ce qui serait somme toute lidal vu la vitesse daccs aux informations cette dernire est volatile Cestdire que tant que lordinateur est allum que vos programmes ne plantent pas et que llectricit fonctionne il ny a aucun problme Ds quon dbranche tout disparat Il faut donc trouver une solution prenne pour conserver vos donnes Un fichier correspond lune des possibilits 3 Dfinition Un fichier est un ensemble dinformations gnralement structures dune manire ou dune autre Certes la mmoire 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 une disquette en voie de disparition une bande magntique comme les sauvegardes sur bande par exemple une cl USB et surtout sur un disque dur 4 Les formats a Types de contenus Un fichier se distingue des autres par quelques attributs dont son nom et sa catgorie Ils se distinguent aussi entre eux par lorganisation de leurs donnes ce qui dfinit leur format Vous connaissez probablement plusieurs formats de fichiers les fichiers texte ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 145
les documents des traitements de texte les fichiers son MP3 les vidos DivX les fichiers HTML les images JPEG les fichiers de votre gestion de compte bancaire etc Comment sy retrouver dans tout ce bazar Il existe autant dorganisations de donnes quil existe de logiciels Cest dailleurs souvent un trs gros problme cest ce quon appelle un format de fichiers propritaire il est souvent impossible de relire un format donn avec un produit concurrent a na pas forcment de rapport direct mais un peu de lobbying dans ce cas prcis nest pas du superflu il existe de nombreux formats de fichiers dit quotouvertsquot dont lorganisation des donnes qui y sont contenues est connue et documente Tout format de fichier quotouvertquot 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 propritaires et les formats libres Tous les formats libres sont ouverts mais seulement trs peu de propritaires le sont Un format libre ouvert et rpandu est un gage de prennit et de compatibilit de vos donnes OGG Vorbis est libre PDF ne lest pas Si demain Adobe en dveloppe une nouvelle version elle pourrait tre incompatible avec 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 flagrantes entre un fichier qui doit stocker une photo et un autre qui stocke une page HTML dun site web Deux catgories de fichiers sont distinguables Les fichiers organiss sous forme de lignes de texte successives qui sappellent des fichiers texte Les fichiers bruts contenant des donnes varies dont des nombres reprsents sous forme binaire ne correspondant peu ou pas du tout du texte qui sappellent des fichiers binaires b Le fichier binaire Comment reconnatre ces fichiers les uns des autres Cest trs facile Prenez un diteur de texte simple notepad sous Windows et ouvrez le fichier sur lequel vous avez des doutes Si vous obtenez ceci lditeur est kwrite sous Linux - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 146
Rsultat de louverture dun fichier binaire dans un diteur 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 quon appelle un dsassembleur Mme principe pour un fichier au format MP3 ce format ncessite un programme qui va analyser le format connu et en effectuer la transformation en onde sonore qui pourra tre envoye vers votre carte son puis vos oreilles Il est intressant de noter que lditeur de texte kwrite ayant t utilis pour la capture cidessus a fourni un avertissement intressant Risque de corruption dun fichier binaire Un fichier binaire nutilise pas de reprsentation ASCII ou Unicode pour reprsenter les nombres do les caractres farfelus affichs Aussi renregistrer un fichier binaire avec un diteur de texte cassera le format du fichier rendant ce dernier totalement inutilisable La configuration complte de Windows est place dans un registre ou base de registre Cette base est stocke dans deux fichiers systemdat et usersdat au format binaire Sils sont corrompus il est fortement probable de devoir tout rinstaller Laccs ce registre ne vous est quindirectement possible via lditeur de base de registre regedit ou regedt32 mais pas en louvrant sous notepad c Le fichier texte Un fichier texte est ce quil annonce il contient du texte sous forme de lignes Chaque ligne est distincte des autres Pour savoir sil doit passer la ligne lordinateur ou plutt le systme dexploitation rajoute des caractres spciaux Sous Windows ce sont les caractres ASCII CR Carriage Return retour chariot qui vaut 13 et LF Line Feed Saut de Ligne qui vaut 10 Cette squence CRLF passe la ligne Sous Unix et ses drivs dont MacOS seul le caractre LF est ncessaire une conversion est ncessaire pour convertir du texte de Windows vers Unix et rciproquement Nul besoin ici de vous montrer une capture dun diteur ouvrant un fichier texte Do une qualit essentielle du fichier texte ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 147
Un fichier texte est directement lisible par lutilisateur et son organisation devient vidente Dans un fichier texte mme les nombres sont reprsents sous forme de caractres ASCII ou unicode selon le cas Le nombre 1234 sera reprsent exactement sous cette forme caractre soit la suite ASCII 31323334 hxadcimal 49505152 dcimal ou encore 0011001 0011010 0011011 0011100 en binaire Le mme nombre dans un fichier binaire serait reprsent en 04D2 hxadcimal ou 10011010010 en binaire une grosse diffrence Cela veut dire que quand vous allez crire des nombres dans un fichier texte vous devrez utiliser des fonctions de conversion de nombres vers des chanes Rciproquement vous devrez utiliser une autre fonction quand vous lirez ces chanes pour les convertir en nombres Vous pouvez utiliser les fonctions prdfinies pour cela xchnumtxt convertit la chane txt en valeur numrique txtnumchx convertit la valeur numrique x en chane Vous avez pu voir dans quelques exemples des chapitres prcdents que Java dispose dun arsenal intressant de fonctions on parle plus de mthodes dailleurs pour convertir du texte en entier rel etc Un souci peut se poser avec les rels les anglosaxons et dautres utilisent le point comme sparateur dcimal alors que vous utilisez probablement la virgule en France Certes les langages de programmation utilisent principalement le point mais les tableurs franciss utilisent la virgule Amis canadiens si vous lisez ce livre vous tes plus chanceux que les franais qui devront faire attention en convertissant une chane en nombre et vice versa cause de la virgule Dans le doute lisez le manuel de votre langage Quasiment tous les fichiers de configuration dun systme dexploitation Unix sont des fichiers texte Pour modifier cette configuration il suffit donc bien souvent de louvrir avec un diteur de texte de modifier ou dajouter des lignes de sauver et cest tout d Quel format utiliser Faites preuve de bon sens Il serait ridicule dutiliser un fichier texte pour sauver une image tout comme il serait ridicule dutiliser un fichier binaire uniquement pour sauver du texte simple un format de traitement de texte est plus complexe quil ny parat Des formats rputs la mode comme le XML sont des fichiers la structure pouvant devenir trs complexe et pourtant sont des fichiers texte Les proprits dun fichier texte sont les suivantes Les fichiers texte sont utiliss pour stocker des donnes structures Ces donnes peuvent tre du texte des nombres du moment que tout est converti en texte lisible Ces donnes structures sont des enregistrements Les enregistrements dun fichier texte sont reprsents sous formes de lignes spares les unes des autres par une squence CRLF Windows ou LF UnixMac Chaque ligne reprsente une structure denregistrement selon un format prtabli fixe ou dlimit Un fichier texte est lisible et modifiable par nimporte quel diteur de texte Linterprtation des enregistrements dpend bien entendu de sa finalit Un fichier texte ne peut tre lu que ligne ligne Un enregistrement se rajoute uniquement la fin du fichier Pour modifier ou insrer un enregistrement il faudra probablement tout rcrire Comme pour les fichiers texte voici quelques proprits dun fichier binaire Fichier texte Fichier binaire - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 148
Un fichier binaire peut stocker nimporte quoi que ce soit structur ou non Les fichiers binaires nont pas de structure apparente ils reprsentent une suite de donnes octets crites les unes aprs les autres Toutes les donnes sont reprsentes sous forme binaire Les nombres sont convertis et sil y a du texte il apparat comme tel mais non structur De mme si on y voit un caractre il se peut que ce soit un effet de 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 exactement comme si elles sortaient de la mmoire cest la mme reprsentation La structure des enregistrements est dpendante de linterprtation du programme Les enregistrements peuvent tre de longueur fixe mais colls les uns aprs les autres sans retour la ligne De ce fait un fichier binaire ne doit pas tre ouvert ou enregistr depuis un diteur de texte il est souvent illisible Seul le programme sachant le manipuler est apte lutiliser Vous pouvez cependant utiliser un diteur hxadcimal Le fichier peut tre lu octet par octet ou par bloc ou entirement depuis nimporte quelle position puisque cest vous qui dfinissez sa structure Idem pour les enregistrements 5 Les accs aux fichiers a Squentiel Le fichier squentiel permet daccder aux donnes dans leur ordre dcriture Vous accdez aux donnes les unes aprs les autres Pour pouvoir accder au millime enregistrement vous devez dabord lire les 999 premiers ce qui ne veut pas dire que vous devez les interprter Les fichiers texte sont gnralement des fichiers squentiels chaque enregistrement tant reprsent par une ligne Un fichier binaire peut trs bien tre squentiel puisque encore une fois cest vous qui dterminez sa structure Vous pouvez dcrter que les n premiers octets sont la description dune figure gomtrique de n faces puis que les n autres enregistrements reprsentent la longueur des faces les angles etc Il nest pas possible de modifier directement lenregistrement dun fichier squentiel Vous pouvez rajouter un enregistrement la fin Pour supprimer vous pourrez utiliser un diteur b Accs direct Laccs direct est aussi appel alatoire Il ny a rien de spcialement alatoire de votre ct mais contrairement laccs squentiel vous pouvez sauter directement lendroit que vous dsirez Pour un fichier texte a pourrait tre le numro denregistrement de ligne Pour un fichier binaire cest la position de loctet souhait 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 lenregistrement quil 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 lenregistrement correspondant dans le fichier Un fichier index est donc un super mlange des deux prcdents Les index peuvent tre totalement indpendants auquel cas il ny a pas forcment de moyen de lire les enregistrements sans connatre son index Mais bien souvent vous entendrez parler de squentiel index le fichier 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 prochain chapitre d Autre Un langage comme le COBOL est le roi de la manipulation des fichiers notamment en squentiel index Il serait plus complexe mais pas infaisable pour les professeurs sadiques ou les tudiants masochistes de dcoder un fichier MP3 dans ce langage ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 149
Vous pouvez faire ce que vous voulez dun fichier cest vous qui en dterminez la structure Mieux ou pire selon le cas le langage de programmation na que faire du contenu du fichier Si vous demandez au langage C douvrir en mode texte un fichier binaire et que vous en lisez successivement les enregistrements il ne bronchera pas sur un gros fichier il trouvera probablement quelques retours la ligne De mme vous pouvez sauter loctet de votre choix dans un fichier texte en lire pile trois octets et cest tout Cest vous dimplmenter linterprtation du contenu des fichiers dans le langage vis Quant lindex cest une catastrophe C C et Java ne proposent rien de prdfini Cest vous de tout crer avec les fonctions de bases existantes En son temps lauteur de ce livre avait dailleurs reprogramm les fonctions permettant laccs aux fichiers en squentiel index du COBOL en C puis en C dans le cadre dun projet de fin danne dtudes - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0CYbVFCdzIgLAA-enidentnumber 150
Les enregistrements Ce chapitre se concentre sur les fichiers texte Dans ceuxci vous devez dfinir la structure de vos enregistrements Bien que tout soit possible notamment avec des structures en arborescence comme le XML vous pouvez initialement choisir entre deux mthodes assez simples les enregistrements avec dlimiteurs ou largeur fixe 1 Les dlimiteurs Les enregistrements dlimits sont courants sous Unix Dans chaque ligne les valeurs individuelles sont appeles des champs et sont spares entre elles par un caractre particulier appel caractre de sparation ou caractre de dlimitation ou enfin dlimiteur Nimporte quel caractre peut convenir cependant il ne doit pas se retrouver dans la valeur dun champ ce qui aurait pour effet de casser la structure de lenregistrement Ce sont souvent le pointvirgule quotquot ou les deux points quotquot qui sont utiliss Les champs denregistrements sont gnralement encadrs par des guillemets lorsquil sagit de chanes de caractres rien pour des valeurs numriques Ce nest pas une affirmation ce nest pas toujours le cas et cest vous de grer le type dune valeur donne au sein de votre programme Voici un simple exemple de contenu de fichier dlimit de type courant sous Unix rootx00rootrootbinbash binx11binbinbinbash daemonx22Daemonsbinbinbash lpx47Printing daemonvarspoollpdbinbash mailx812Mailer daemonvarspoolclientmqueuebinfalse newsx913News systemetcnewsbinbash uucpx1014Unix-to-Unix CoPy systemetcuucpbinbash Les plus perspicaces dentre vous auront reconnu un morceau du fichier etcpasswd qui contient quelques informations sur les comptes des utilisateurs du systme Unix Chaque ligne est un enregistrement dont la structure est la suivante Un sparateur quotquot dlimite les diffrents champs Il y a sept champs numrots par convention de 1 7 1 er champ nom de lutilisateur son login 2 me champ indicateur de mot de passe ici stock ailleurs 3 me champ UID identifiant numrique unique de lutilisateur 4 me champ GID identifiant du groupe de lutilisateur stock ailleurs 5 me champ commentaire libre 6 me champ dossier personnel de lutilisateur 7 me champ linterprteur de commandes shell de connexion Vous voyez bien quil est possible de placer des informations trs importantes dans un fichier texte La manipulation dun tel fichier est assez vidente il suffit de lire une ligne puis de dcouper celleci champ par champ ce qui est plutt simple car il suffit ds lors de trouver les dlimiteurs La plupart des langages proposent des fonctions qui permettent de dcouper une chane selon des dlimiteurs Ce type de fichier a aussi bien des avantages que des inconvnients Du fait que les champs soient colls les uns aux autres et que chaque champ ne prend pas plus despace que sa donne occupe fournit un rel avantage en terme doccupation despace disque et de mmoire Cependant le traitement de dcoupage de la chane en fonction de la position forcment alatoire dun ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA-enidentnumber 151
dlimiteur est plus complexe quil ny parat Certes les langages peuvent fournir des fonctions appropries mais comment feriezvous vousmme Sur ce dernier point cest assez facile formaliser sous forme dalgorithme Une fonction quotsplitquot reoit trois paramtres une chane de caractres le dlimiteur et une position de dpart Elle retourne le champ partir de cette position qui est le numro de caractre de la chane dmarrant un Si la fonction retourne une chane vide cest quil ny a plus rien Fonction splittxt chanedelim caractrepos entier chane Var li entiers tmp chane Dbut llongueurdelim tmpquotquot ipos Tant que iltl et milieutxti1delim Faire tmptmpampmilieutxti1 un seul caractre concatn ii1 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 nouveau champ Programme decoupe Var ligneresult chane pos entier Dbut pos1 lignequotrootx00rootrootbinbashquot resultquottotoquot Tant que resultquotquot Faire resultdecoupelignequot quotpos Si resultquotquot Alors Afficher result posposlongueurresult1 aprs le dlimiteur FinSi FinTantQue Fin Vous constatez que le traitement nest pas anodin et sur des milliers denregistrements a peut compter 2 Largeur fixe Dans des enregistrements largeur fixe il ny a pas de dlimiteurs Chaque champ a une longueur prdfinie et occupe toute cette longueur quitte tre complt par des espaces Les champs sont ainsi colls les uns aux autres en un seul gros bloc Sil fallait convertir une ligne cidessus en enregistrement fixe il faudrait savoir que Un login fait en principe 8 caractres Un mot de passe 1 seul stock ailleurs Les UID et GID utilisent au maximum 5 chiffres Le commentaire sera arbitrairement pour lexemple de 15 caractres Les chemins et shells arbitrairement aussi 15 caractres - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA-enidentnumber 152
----------------------------------------------------------------- root x0 0 Commentaire root binbash bin x1 1 Commentaire bin binbash daemon x2 4 Commentaire sbin binbash rohaut x123 123 Compte Seb homeseb binksh ----------------------------------------------------------------- 1 891 11 22 33 45 6 0 45 01 56 90 4 Deux choses sautent aux yeux Contrairement au format dlimit le format largeur fixe consomme bien plus de mmoire Dans cet exemple 64 octets sont utiliss pour chaque enregistrement Dans le format dlimit la taille est variable mais la premire ligne nutilisait que 32 octets Cependant la rcupration de tels enregistrements est bien plus simple car vous connaissez lavance la taille de chaque champ et donc toutes les positions pour dcouper vos enregistrements Par contre il faudra penser supprimer les ventuels espaces en trop en supprimant les espaces finaux Les langages proposent 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 structurs abords dans le chapitre cinq La lecture et lcriture dans les fichiers se trouvent ainsi facilites Un fichier format fixe a aussi un autre avantage il est possible de choisir parmi les deux formats texte ou binaire 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 gnralement quatre octets un rel double prcision huit etc Connaissant lavance les positions de chaque champ vous utiliserez les sous programmes prdfinis de chaque langage pour dcouper une souschane de caractres quivalent la fonction milieu du chapitre prcdent 3 Principes daccs a tapes de base Pour travailler avec des fichiers vous devrez respecter un certain ordre Il vous faudra Ouvrir le fichier cestdire indiquer quel fichier vous voulez accder et comment Traiter le contenu du fichier le lire y crire bref toutes les oprations souhaites pour accder et manipuler son contenu Fermer le fichier quand tous les traitements sont termins Ltape la plus importante est la premire Comment ouvrir un fichier Si vous aviez le droit douvrir seulement un seul fichier ce serait assez simple mais questce qui vous empcherait den ouvrir trois ou quatre en mme temps b Identificateurs de fichiers et canaux Le programme doit pouvoir savoir dans quel fichier il travaille lorsquil sagit dy lire ou dy crire des donnes Ceci passe par lutilisation dun identifiant unique pour chaque fichier ouvert Dans la pratique tous les langages ou presque en interne utilisent la mme mthode Laccs un fichier passe par lutilisation dun canal Dans la ralit la vraie vie sousentendez par l que linformatique nest pas la vraie vie ou plutt un moyen mais pas une fin un canal relie entre eux deux cours deau ou la mer un lac etc Dans ce canal transite outre de leau des bateaux pniches dans un sens et dans lautre Dans le monde virtuel un canal permet de faire transiter un flux dinformation les donnes dun programme vers un fichier dun fichier vers un programme dun programme un autre entre deux fichiers entre un programme et un priphrique etc Par exemple il existe un canal qui fait transiter ce que vous tapez au clavier vers le programme qui attend une saisie un autre canal pour transfrer vers laffichage ce que le programme doit afficher Certains canaux fonctionnent dans les deux sens dautres non ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA-enidentnumber 153
Chaque canal porte un numro unique certains ont des noms prdfinis Celui rattach par dfaut au clavier 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 sortie standard porte le numro 1 et sappelle STDOUT Il en existe un troisime appel STDERR et portant le numro 2 charg de vhiculer les messages derreur La notion de canal est flagrante avec certains systmes dexploitation surtout Unix qui en use et en abuse Windows hrite luimme de cette notion exploitable simplement au travers de linterprteur de commandes dorigine DOS En C il est possible dutiliser les fonctions de lecture et dcriture de fichiers avec ces trois canaux Vous disposez de tous les canaux audel du numro deux donc 3 et suivants pour vos propres fichiers 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 programme toujours par ce canal Les notations algorithmiques peuvent varier sur ce point Certaines notations reprennent la syntaxe dun langage de type Basic ou Visual Basic dans lequel vous devez indiquer vousmme quel numro de canal utiliser louverture du fichier Dautres reprennent une syntaxe issue du C o cest la fonction C ouvrant le fichier qui choisit un canal et vous rcuprez un identifiant de fichier sous forme de variable Cet identifiant est le nom logique du fichier au sein du programme Cest cette notation qui est gnralement prfrable en algorithmique En C une fonction douverture de fichier retourne une variable de type FILE qui est en fait un type structur 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 10241024 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 Les modes douverture En ouvrant un fichier il faut indiquer comment vous souhaitez y accder Souhaitezvous seulement lire son contenu y crire o vous voulez ou rajouter des lignes la fin Enlecture vous avez un accs en lecture seule au fichier Vous ne pouvez pas y crire Vous pouvez vous y dplacer retourner au dbut lire tout ce que vous voulez mais cest tout Encriture parfois nomm lecturecriture vous pouvez modifier nimporte quelle partie du fichier crire o vous voulez craser vos anciennes donnes qui seront donc dfinitivement perdues vive les sauvegardes Attention la casse si vos enregistrements sont de taille variable dans un fichier texte Vous pouvez aussi lire le contenu du fichier Enajout append vous ne pouvez pas lire le fichier mais uniquement rajouter des donnes aprs la fin de celuici comme rajouter un enregistrement ou quelques octets tout au bout Vous ne pouvez pas modifier les donnes qui y sont dj crites Le problme principal que vous rencontrerez quand vous utiliserez des enregistrements dans un fichier 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 par des fichiers temporaires ou tout charger en mmoire puis rcrire seulement les bonnes valeurs - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0ESF4XVCdzIgLAA-enidentnumber 154
Fichier texte squentiel 1 Ouvrir et fermer un fichier Vous devez tout dabord dclarer le nom logique du fichier la variable qui permettra associe au fichier de travailler avec Ceci se place comme dhabitude dans la section Var Vous indiquez ensuite le type daccs squentiel direct index etc Notez quen accs direct vous pouvez aussi travailler en mode squentiel VAR ficfichier squentiel Vous devez ensuite ouvrir le fichier en associant nom logique et nom du fichier avec le mode douverture souhait Ceci seffectue avec linstruction Ouvrir Ouvrir quottototxtquot dans fic en lecture Vous trouverez aussi parfois cette syntaxe sous forme de fonction plus proche de certains langages ficOuvrirquottototxtquotquotlecturequot La premire syntaxe est souvent prfrable en algorithmique Pour fermer un fichier utilisez linstruction Fermer suivie du nom logique du fichier Fermer fic Il existe aussi une syntaxe fonctionnelle mais les mmes remarques sappliquent utilisez la premire en cas de doute Fermerfic Note ne placez pas le nom du fichier dans les instructions de lecture criture et de fermeture Le programme ne connat pas le nom du fichier mais seulement son nom logique Aussi le dbut dun ventuel programme ressemblerait ceci Programme OUVRE Var fic fichier squentiel nom chane Dbut nomquottototxtquot Ouvrir nom dans fic en lecture traitements Fermer fic Fin 2 Lire et crire des enregistrements a Lecture Pour simple rappel les enregistrements sont ici les lignes dun fichier texte un enregistrement tant quivalent une ligne La lecture dune ligne se fait via linstruction Lire Lire lit lenregistrement prsent la position actuelle du fichier puis se place sur lenregistrement suivant louverture du fichier Lire lit la premire ligne Un nouveau Lire lira la deuxime et ainsi de suite jusqu la fin Cest pour cela que la lecture est dite squentielle Vous trouverez aussi la mme instruction sous le nom LireFichier cest la mme chose La syntaxe est la suivante Lirenomlogiquevariable ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 155
La variable en second paramtre reoit lenregistrement la ligne lue Dans lexemple suivant un enregistrement du fichier des mots de passe de lexemple cidessus est lu partant du principe que la largeur est fixe puis lenregistrement est dcoup pour rcuprer le login et luid converti en entier Programme OUVRE Var fic fichier squentiel nom chane lignelogin chane uid entier Dbut nomquotpasswdquot Ouvrir nom dans fic en lecture traitements Lireficligne logintrimmilieuligne18 uidchnummilieuligne105 Afficher loginuid Fermer fic Fin Que faire cependant quand on ne connat pas lavance le nombre de lignes du fichier Comment savoir si la fin du fichier a t atteinte Vous avez deux possibilits Selon certains formalismes algorithmiques Lire est une fonction qui retourne un boolen donc vrai ou faux Si vous tentez de lire un enregistrement et quil ny en a plus Lire retourne FAUX Autrement dit tant que Lire est VRAI on peut continuer lire les lignes suivantes La fonction EOF parfois appele aussi FinFichier retourne un boolen qui indique si la fin du fichier a t atteinte ou non Cette fonction prend en paramtre le nom logique du fichier Elle retourne VRAI si la fin du fichier a t atteinte donc sil ne reste plus denregistrements lire La fonction algorithmique EOF va retourner VRAI si le fichier que vous ouvrez ne contient pas denregistrements donc si la fin de fichier est atteinte ds louverture Or dans quelques langages le programme ne le sait pas tant quil na pas tent de lire un enregistrement et donc une fonction de ce type retournerait FAUX tant quaucune lecture naurait eu lieu Prudence Le programme suivant va lire tout le fichier des mots de passe et placer les logins et UID dans des tableaux Comme on ne connat pas lavance le nombre dlments on se limitera arbitrairement 100 lignes Programme LIREFIC Var fic fichier squentiel nom chane lignechane ientier login tableau1100 de chanes uid tableau1100 dentiers Dbut nomquotpasswdquot i0 Ouvrir nom dans fic en lecture Tant que NON EOFfic Faire Lireficligne ii1 logini trimmilieuligne18 uidi chnummilieuligne105 FinTantQue Afficher iquot enregistrements lusquot Fermer fic Fin b criture - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 156
Lire est une chose crire dans un fichier en est une autre Lcriture utilise linstruction Ecrire une fonction qui prend comme paramtre le nom logique du fichier et lenregistrement la ligne crire Vous trouverez tout comme linstruction de lecture une instruction EcrireFichier strictement identique Ecrirenomlogiqueenregistrement Comme vous devez crire des enregistrements largeur fixe cest vous de vrifier que les enregistrements sont la bonne longueur Sils sont trop longs vous avez mal dimensionn vos enregistrements lorigine un cas rgulier est une adresse rallonge ou un nom de ville compos Sils sont trop courts vous devrez leur rajouter des espaces en fin de chane Par exemple toujours dans lexemple des logins que faire si celuici est trop court par exemple quottotoquot donc quatre caractres alors quil devrait en faire huit Lastuce consiste rallonger le login avec des espaces Ce nest pas un problme pour le relire puisque la fonction trim restaurera son tat dorigine Il est probable que votre langage de programmation propose une fonction qui remplit toute seule les morceaux manquants des fois il sagit mme de linstruction dcriture le fprintf du C le fait trs bien 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 longueur attendue Elle retournera ce mme champ mais reformat soit coup la bonne longueur soit avec des espaces rajouts la fin Fonction Formatechamp chane longueur entier entier Var nbspaceslen entiers Dbut lenlongueurchamp Si lengtlongueur Alors champgauchechanelongueur Sinon nbspaceslongueur-len Tant que nbspacesltgt0 Faire champchampampquot quot nbspacesnbspaces-1 FinTantQue FinSi Retourne champ FinFonct Quelques formalismes algorithmiques autorisent parfois de prciser lavance une longueur de chane la dclaration de la variable Var login chane de 8 caractres Cela laisse entendre que vous navez plus vous soucier que la chane soit trop courte ou trop longue Cest vrai dans lalgorithme mais attention dans un vrai langage Le langage COBOL anciennement au programme du BTS tait un rgal ce niveau mais en C ou en Java la taille nest pas prcise La fonction Formate fait bien votre affaire Vous pouvez reconstruire votre enregistrement puis lcrire Programme ECRIT Var fic fichier squentiel nomlignechanes tlogintuidtpwdtgidtcmtthometshellchanes uidgidentiers Dbut nomquotpasswdquot Ouvrir nom dans fic en Ajout loginquottotoquot uid500 gid501 reconstitution tloginFormatetlogin8 tuidFormatenumchuid5 tgidFormatenumchgid5 tpwdFormatetpwd1 tcmtFormatetcmt15 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 157
thomeFormatethome15 tshellFormatetshell15 lignetloginamptpwdamptuidamptgidamptcmtampthomeamptshell Ecriture Ecrireficligne Fermer fic Fin Linstruction Ecrire rajoute lenregistrement dans le fichier puis se place la suite de lenregistrement cr Aussi si vous excutez une nouvelle instruction Ecrire le nouvel enregistrement se placera la suite du prcdent Attention cependant au mode douverture du fichier En mode lecturecriture lenregistrement ne sera pas ajout la fin du fichier contrairement au mode ajout mais la position courante vous crasez les enregistrements existants les uns aprs les autres Un programme assez simple consiste recopier les enregistrements dun fichier dans un autre Pour rajouter un tout petit peu de piment pourquoi ne pas dire que si le champ mot de passe contient un quotdquot lenregistrement doit tre dtruit Il suffit de ne pas le recopier dans le nouveau fichier Programme COPIE Var ficfic2 fichiers squentiels nomnom2 chanes lignepwdchanes Dbut nomquotpasswdquot nom2quotbackupquot Ouvrir nom dans fic en lecture Ouvrir nom2 dans fic2 en Ajout Tant que NON EOFfic Faire Lireficligne pwd trimmilieuligne91 Si pwdltgtquot-quot Alors Ecrirefic2ligne FinSi FinTantQue Fermer fic Fermer fic2 Fin Cette stratgie de recopie a un avantage elle nutilise que trs peu de mmoire Elle a cependant un trs gros inconvnient elle ncessite la prsence un moment donn de deux fichiers sur le disque dur Dans le traitement prcdent le but tait de supprimer les lignes inutiles du premier fichier Au final ce genre de traitement est en trois tapes Recopie des enregistrements de passwd vers backup Suppression du fichier passwd Renommage de backup en passwd Cette mthode sera privilgier sur des fichiers trs imposants plusieurs milliers ou millions de lignes si la mmoire ne doit pas tre trop charge Une autre mthode consiste tout traiter en mmoire Elle se fait en deux tapes Lecture intgrale du fichier passwd et stockage des lignes dans un tableau Rcriture du fichier passwd avec les bons lments du tableau Note Certains langages font une distinction entre le mode dcriture gnralement destructeur le fichier est purg vid avant lajout de donnes et un mode dajout tendu o le fichier peut aussi tre lu Prudence Traiter sur disque ou en mmoire - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 158
Cette mthode est plus rapide et plus simple Laccs et le traitement des enregistrements en mmoire sont plus rapides que laccs un fichier du disque Une fois en mmoire les donnes peuvent tre manipules volont sans avoir relire les enregistrements Elle est prfrable si la capacit mmoire de votre ordinateur le permet Les gros logiciels comme les gestionnaires de bases de donnes relationnels chargent souvent en cache plusieurs blocs de fichiers pour acclrer leurs traitements Tant que les supports de stockage non volatiles seront plus lents que la mmoire cest ainsi quil faudra procder 3 Les enregistrements structurs Peuttre faudraitil dire dailleurs enregistrements de types structurs tels que vus dans le chapitre Les tableaux et structures La mthode de lecture squentielle rencontre dans le point prcdent a mis en lumire un petit problme Quand vous rcuprez un enregistrement vous le rcuprez en entier et cest vous de le dcouper ensuite Pour en rcuprer plusieurs vous utilisez des tableaux un pour chaque champ de lenregistrement Or dans le chapitre Les tableaux et structures vous avez pris connaissance des enregistrements de types structurs Ces enregistrements sont euxmmes dcomposs en champs Pourquoi ne pas lire et crire directement un enregistrement de type structur dans un fichier Attention si la notation algorithmique permet la lecture et lcriture denregistrements de types structurs dans un fichier ce nest pas le cas de tous les langages Si le COBOL le fait trs bien ce nest pas le cas de tous les autres comme le C ou Java tout au moins tel que prsent ici Ne seraitce parce que dans ces langages les longueurs des chanes sont variables et les nombres reprsents sous forme binaire vous devriez soit utiliser un fichier binaire soit tout transformer en chane et justifier ces dernires la longueur voulue Pour utiliser des enregistrements structurs vous devez prciser la taille exacte de chaque champ composant le type 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 expliques dans la partie du chapitre Les tableaux et structures qui leur est consacre Pour le reste la lecture et lcriture dun enregistrement fonctionnent lidentique des enregistrements simples composs quot la mainquot Les mmes fonctions sont utilises La nuance importante est que tous les champs sont crits dun coup et lus dun coup Ecrire va rajouter un enregistrement dans le fichier qui sera compos de tous les champs du type structur Comme la taille exacte est prcise tout le texte est dj correctement format Du travail en moins Lire lit un enregistrement complet soit tous les champs du type structur dun coup Aprs la lecture chaque champ contient la bonne valeur Dans les deux cas le type structur doit correspondre exactement au contenu du fichier et rciproquement sinon gare aux mauvaises surprises Lalgorithme suivant crit un enregistrement structur dans un fichier puis relit ce mme fichier et y rcupre lenregistrement dans une autre variable de mme type Programme FicEnreg Var malignerecup enrpwd fic fichier squentiel Dbut maligneloginquottotoquot pwdquotxquot uidquot1001quot gidquot415quot Ecriture ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 159
Ouvrir quotpasswdquot dans fic en Ajout Ecrireficmaligne Fermer fic Relecture Ouvrir quotpasswdquot dans fic en Lecture Lireficrecup Fermer fic On Obtient la mme chose Afficher recuplogin Afficher recupuid Fin Dans le mme ordre dide vous pouvez parfaitement utiliser un tableau denregistrements pour lire tout le fichier et placer tous les enregistrements en mmoire Programme litout Var lignes tableau150 de enrpwd fic fichier squentiel i entier Dbut i1 Ouvrir quotpasswdquot dans fic en Lecture Tant que NON EOFfic Faire Lireficlignesi ii1 FinTantQue Fermer fic Fin 4 Exemple en Java Java sait manipuler les types de fichiers binaires ou texte squentiels ou en accs direct Ce nest pas trs compliqu mais cela fait appel au mme principe que la saisie au clavier avec une gestion des exceptions lors de louverture laccs et la fermeture du fichier et aussi pour parer aux ventuelles erreurs de lecturecriture Le programme Java suivant est un exemple de lecture et de rcriture denregistrements avec dlimiteurs comme le fichier des utilisateurs dUnix Il fait Ouverture du fichier en lecture Lecture de chaque ligne Chaque ligne est place dans un tableau deux dimensions la premire est la ligne la seconde les champs dcoups via la mthode split Une place est rserve pour dventuels traitements sur les enregistrements Ouverture du fichier de sortie en criture Recomposition de toutes les lignes via une fonction recolle prenant en paramtre un tableau de chanes et le dlimiteur Ecriture de la ligne reconstruite dans le fichier avec un retour chariot En ltat le programme ne fait quune simple copie vous de crer les ventuels traitements entre la lecture et lcriture Aussi les lignes sont places dans un tableau de taille fixe Peuttre seraitil plus avantageux dutiliser des listes chanes comme expliqu dans le prochain chapitre Les instructions de dclaration douverture lecture criture et fermeture sont places en gras import javaio - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 160
class chap7fic1 public static String recolleString morceaux String separateur int lmorceauxlength String chainequotquot forint i0iltli chainechaineconcatmorceauxi ifil-1 chainechaineconcatseparateur return chaine public static void mainString args BufferedReader Fichiernull BufferedWriter FicSortnull String ligne String passwdnew String100 int cpt0 lignequotxquot try Ouvre le fichier Fichiernew BufferedReadernew FileReader quotetcpasswdquot whilelignenull lit une ligne ligneFichierreadLine iflignenull Split de la ligne passwdcptlignesplitquotquot cpt Eventuel traitement ici sur le tableau Fichier de sortie FicSortnew BufferedWriternew FileWriter quotmacopiequot cpt0 whilepasswdcptnull On recolle les morceaux lignerecollepasswdcptquotquot On enregistre la ligne FicSortwritelignequotnquot cpt catch FileNotFoundException ex SystemoutprintlnquotFichier absentquot catch IOException ex SystemoutprintlnquotErreur de lecturequot finally try Fichierclose FicSortclose catch IOException ex SystemoutprintlnquotErreur de Fermeturequot ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 161
- 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0O0TZFCdzIgLAA-enidentnumber 162
Les pointeurs et rfrences 1 Rappels sur la mmoire et les donnes a Structure de la mmoire Les prcdents chapitres vous ont dj appris normment de choses sur la mmoire et lorganisation de son contenu La mmoire est dcoupe en octets Chaque octet de la mmoire dispose dune adresse Une donne peut staler sur plusieurs octets donc occuper une plage dadresses par exemple 4 ou 8 octets pour un rel plus encore pour une chane Reprsentation dune variable en mmoire Une variable est un nom donn une ou plusieurs cases Elle nomme la zone de la mmoire contenant la donne La zone de la mmoire contenant la donne est dfinie par deux choses Ladresse de dbut de la donne cestdire ladresse du premier octet contenant la donne La taille de cette zone cestdire le nombre doctets sur lequel stalent les donnes La taille de la zone dpend du type de la donne Un caractre ASCII noccupe quun seul octet un entier quatre un entier long huit etc Quand vous accdez au contenu de la variable vous accdez au contenu de la zone mmoire qui lui est associe La variable ellemme contient donc une autre information ladresse de la zone mmoire laquelle elle est attribue Par convention un ordinateur sachant grer beaucoup de mmoire les adresses sont notes en hexadcimal Cest ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 163
plus simple de parler dadresse 0x2dcf0239 que de ladresse 768541241 Certains langages permettent daccder et donc de voir ladresse de la zone mmoire dune variable tout simplement ladresse de la variable b Java des limites qui nen sont pas Il va vous falloir lgrement dchanter Le langage Java utilis depuis le dbut de cet ouvrage ne permet pas de connatre ladresse de la variable En fait la plupart des choses dcrites dans les prochaines pages seront en partie inaccessibles ce langage Et parmi ces choses la possibilit daccder ladresse mmoire des diverses variables La raison est simple Java est un langage volu de haut niveau qui na pas et vous avec interfrer directement 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 mmoire centrale cest la machine virtuelle qui soccupe de tout Sil avait t possible de voir une adresse celleci aurait t celle au sein de la mmoire rserve par la machine virtuelle sans pouvoir faire le lien avec la mmoire physique Ce systme prsente de nombreux avantages Puisque cest la machine virtuelle qui gre votre place la mmoire vous navez plus vous soucier de problmes propres des langages de bas niveau En C par exemple quand vous crez une chane de caractres cest en fait un tableau de caractres Si vous dbordez de la taille que vous avez initialement fixe vous risquez de graves dysfonctionnements et plantages car lespace mmoire situ aprs est peuttre rserv pour une autre variable ou un bout de programme C ne vous prviendra pas en cas derreur dans les indices de tableaux non plus Java vous dbarrasse de tous ces problmes puisquil gre tout a votre place Aucun risque de dpasser quoi que ce soit aucun risque doublier de librer de la mmoire etc Vous verrez que Java gre trs bien pour certaines choses les rfrences comme cela vous a brivement t expliqu dans le chapitre Les tableaux et structures sur les tableaux c Brefs exemples en C Le langage C est un langage de bas niveau permettant un accs direct au contenu de la mmoire physique tout au moins celle rserve pour votre programme En C vous pouvez afficher ladresse dune variable trs simplement Le bout de code suivant affiche le contenu et ladresse dune variable entire longue Il suffit en C de rajouter le signe quotampquot ET commercial avant le nom de la variable La chane sotrique xd signifie que le ampi est une valeur entire d qui doit tre convertie laffichage en hexadcimal avec un prfixe 0x avant le indiquant de remplacer les caractres accols par la variable situe en paramtre dans lordre long i123456 printfquotd ladresse xdnquotiampi Le rsultat varie videmment dune machine lautre et nest jamais le mme si on relance le programme plusieurs fois 123456 ladresse 0xbf9f8420d C permet aussi de connatre la longueur dune variable le nombre doctets quelle utilise avec la fonction sizeof printfquotd ladresse xd taille de d octetsnquotiampisizeofi 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 Le pointeur a Principe et dfinition Que ce soit avec des langages de bas niveau de haut niveau comme Java ou en algorithmique il peut tre utile de trouver des moyens de manipuler directement ou indirectement des adresses de variables ou autres lments tableaux types structurs objets En Java ce nest pas directement possible vous verrez un autre moyen Mais la notion est importante y compris pour ce langage Vous naurez que rarement loccasion voire jamais de rentrer une adresse la main dans une variable Mme en C vous partirez gnralement dune adresse dj dfinie celle dune variable dun tableau etc Dans les langages supportant les manipulations dadresses mmoire il est courant de manipuler ces adresses au travers de variables particulires qui ne contiennent non pas une donne mais une adresse mmoire Ce sont des - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 164
pointeurs Un pointeur est une variable qui contient ladresse dune autre variable 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 tandis que si vous affichez le contenu de la variable pointe vous obtenez la valeur associe cette dernire Un pointeur est une variable De ce fait elle doit tre dclare dispose ellemme de sa propre adresse en mmoire et se voit dfinir un type Le type dun pointeur ne dcrit pas ce quil contient cest une adresse donc en principe dune longueur de 32 ou 64 bits selon les architectures mais le type de la variable quil pointe Un pointeur sur une variable de type long devrait donc tre dclar avec un type long Le pointeur et la variable pointe en mmoire b Le C roi des pointeurs 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 quotquot avant son nom Chaque ligne est commente pour vous aider Lobjectif est de faire pointer un pointeur pi sur ladresse de lentier i Pour a le pointeur recevra cette adresse laide du signe quotampquot devant i car comme vu auparavant ce signe permet daccder ladresse dune variable long i123456 Un entier long contenant 123456 long pi Un pointeur sur un entier long Le pointeur pi reoit ladresse de i piampi printfquotd ladresse xd taille de d octetsnquotiampisizeofi printfquotLe pointeur pi pointe sur ladresse xdnquotpi lexcution sur la machine de lauteur on obtient ceci 123456 ladresse 0xbfa95cbcd taille de 4 octets Le pointeur pi pointe sur ladresse 0xbfa95cbcd Notez que ladresse de la variable i correspond maintenant exactement au contenu du pointeur pi Le pointeur pi pointe sur la variable i dont il contient ladresse ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 165
Mais que faire de ce pointeur Le pointeur sert mmoriser ladresse lemplacement mmoire dune autre variable Les utilisations sont multiples et la suite du chapitre vous proposera deux applications des pointeurs listes chanes et arbres binaires En attendant depuis un pointeur vous pouvez aussi accder au contenu de la variable pointe Il suffit tant laffichage qu laffectation de rajouter une toile quotquot avant son nom Que provoque en C la ligne suivante printfquotContenu de la variable pointe via pi dnquotpi Laffichage du contenu prsent ladresse pointe donc le contenu de la variable pointe Contenu de la variable pointe via pi 123456 Le fait daccder au contenu de la variable pointe sappelle drfrencer un pointeur Avec ce systme il est possible de manipuler les variables et les pointeurs dans tous les sens Si vous modifiez le contenu de la variable pointe ladresse du pointeur nest pas modifie mais son drfrencement affichera la nouvelle valeur Rciproquement vous pouvez modifier la valeur de la variable pointe en passant par son pointeur avec ltoile devant modification de la valeur de la variable pointe par pi pi987654 printfquoti contient maintenant dnquoti Le rsultat est que vous venez de modifier le contenu de la zone mmoire ladresse pointe par pi qui est celle de i Vous venez donc de modifier la valeur de i en passant par un pointeur i contient maintenant 987654 c Applications Les applications sont nombreuses En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structur Elle doit retourner ladresse de celleci et donc son rsultat sera plac dans un pointeur adquat Dans le chapitre sur les sousprogrammes vous avez vu quil est possible de passer une variable en Sortie S ou EntreSortie ES une procdure Daprs vous quel est le mcanisme utilis Le pointeur bien entendu vous passez ladresse de la variable en paramtre et le sousprogramme va modifier le contenu de la mmoire cette adresse via un pointeur 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 lenregistrement suivant et ainsi de suite Dans un langage bas niveau comme le C les tableaux se manipulent trs facilement via des pointeurs puisquil est possible de faire des calculs sur les adresses 1 va au contenu de ladresse suivante et ainsi de suite Voici un simple exemple en C dune fonction qui doit modifier le contenu dune variable en passant tout dabord par une valeur de retour puis par un pointeur La premire fonction est trs classique et ressemble beaucoup ce qui existe en Java long modiflong varlong n varn return var Elle sutilise ainsi et namne pas de remarque particulire imodifi1000 printfquoti contient maintenant dnquoti La seconde fonction est modifie pour prendre une adresse en paramtre - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 166
void modif2long var long n varn Le premier paramtre est un pointeur sur une variable de type long La fonction doit recevoir ladresse dune variable de type long comme la variable i de lexemple Vous devez lappeler comme ceci modif2ampi20000 printfquoti contient maintenant dnquoti 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 la valeur de i est donc modifie i contient maintenant 20000 Cest exactement le fonctionnement des sousprogrammes de type procdure du chapitre Les sousprogrammes Cest avec les enregistrements de types structurs et surtout les tableaux que les pointeurs montrent toute leur puissance Un tableau est une liste dlments contigus en mmoire Si vous rcuprez ladresse du premier lment vous pouvez accdez aux n lments suivants situs aux n adresses suivantes laide dun pointeur Prenez une chane quotbonjourquot Chaque caractre occupe un octet et en mmoire la chane se termine par un caractre nul En C une chane de caractres est en fait un tableau de caractres llment dindice 0 contenant le premier caractre llment dindice 1 le second etc jusquau dernier lment contenant le caractre nul de fin de chane Placez un pointeur sur le premier lment du tableau Si vous incrmentez de un le pointeur vous vous dplacez de la longueur dun caractre en mmoire vous vous trouvez sur le second caractre et ainsi de suite Note Ajouter 1 un pointeur ne dplace pas forcment ladresse de un octet en mmoire mais de la longueur du type du pointeur Si vous ajoutez 1 un pointeur de type long vous ajoutez quatre octets ladresse laide de ce principe il devient trs simple de calculer la longueur dune chane de caractres en C tant que la valeur contenue ladresse du pointeur nest pas nulle vous incrmentez de 1 le pointeur Ce qui donne char chainequotbonjourquot un tableau de caractres une chane char pc un pointeur de type caractre int n va contenir le nombre de caractres le pointeur pc contient ladresse du premier lment pcampchaine0 tant que pc ne contient pas 0 nul whilepc0 pc on dcale dun char ladresse n on incrmente le compteur printfquotLongueur dnquotn La boucle est extrmement dtaille mais il est possible de faire bien plus court forn0pc0pc n Note en C chaque lment dun tableau est en fait un pointeur sur ladresse mmoire contenant cet lment Ce qui veut dire que chaine contient ladresse du premier lment et que chaine contient le premier lment chaine1 ladresse du second lment et chaine1 son contenu etc Aussi pcampchaine0 aurait pu scrire pcchaine Voyezvous maintenant lintrt des pointeurs Bien que cette notion soit assez complexe elle permet de simplifier fortement les traitements sur les tableaux les passages et la rcupration de valeurs et structures complexes 3 Notation algorithmique a Dclarer et utiliser les pointeurs ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 167
Lalgorithmique autorise bien entendu lutilisation des pointeurs Vous dclarez un pointeur comme nimporte quelle variable et au mme endroit sous le motcl VAR nom pointeur sur type point Par convention les pointeurs commencent par la lettre p Ce nest pas une obligation mais vous vous y retrouverez beaucoup mieux si vous suivez cette recommandation Comme vu prcdemment le type point doit tre du mme type que la variable pointe Si vous crez un pointeur sur un entier le pointeur sera de type entier il pointe sur un entier Var txt chane ptxt pointeur sur chane cpt entier pInt pointeur sur entier si on sait qu telle ou telle adresse se trouve toujours la mme donne en toute circonstance et vous prfrerez passer ladresse dune variable connue pointeuradresse de variable Avec les variables du petit exemple cela donne Dbut txtquotHello Worldquot 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 Suite du programme Afficher ptxt ptxtquotSalut tout le mondequot Afficher txt pInt20 cptcpt1 Afficher cpt la fin que contiennent txt et cpt Respectivement quotSalut tout le mondequot et 21 Il se peut quun pointeur nait pas encore reu dadresse et donc pointe sur nulle part Cest embtant car cest le plantage assur si vous tentez de lutiliser Pour viter ce problme vous lui affecterez une valeur gnrique qui ne reprsente rien mais qui pourra cependant tre teste Cest la valeur NIL Not Identified Link En C cest NULL et en Java null NIL est une sorte dquivalent de zro mais qui est reconnue telle quelle si vous comparez NIL et zro vous aurez un retour faux pIntNIL Fin Attention cest vous de tester si un pointeur est positionn sur NIL avant de lutiliser Un accs un pointeur contenant NIL provoquera une erreur Dernier point mais ceci devrait vous sembler vident vous avez le droit de crer des pointeurs sur nimporte quel type de variable y compris des enregistrements Cest mme lun des piliers de lutilisation des pointeurs La suite du chapitre y fera fortement appel Type Structure tarticle refchane libellechaine prixrel FinStruct Var - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 168
art tarticle pArt pointeur sur tarticle Dbut artrefquotref01001quot pArtadresse de art Afficher pArtref on trouve aussi la notation pArtref Fin En commentaire il est indiqu que la notation pArtref est aussi utilise avec une flche indiquant quon pointe sur 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 utilisation de la flche Dans le doute vous pouvez aussi procder ainsi Afficher pArtref Afficher pArtref Les deux syntaxes sont quivalentes car rappelezvous que ltoile drference le pointeur on rcupre la valeur de la variable pointe et donc ici lquivalent de la variable art originale b Allocation dynamique Jusqu prsent les pointeurs recevaient ladresse dune variable qui existait dj par affectation Il est aussi possible de rserver un emplacement mmoire pour une donne pointe directement Dans ce principe vous pouvez crer un pointeur sur un entier par exemple et rserver un espace mmoire qui contiendra cet entier sur lequel la variable pointeur pointera Cest le principe de lallocation dynamique de mmoire Il vous faut employer la syntaxe suivante pointeurnouveau type Le type doit bien entendu tre celui de la valeur qui sera contenue lemplacement mmoire rserv Aprs cette instruction le pointeur reoit ladresse mmoire de la zone rserve En cas dchec plus de mmoire disponible par exemple il reoit la valeur NIL Dans lexemple suivant un pointeur sur un entier est dclar Voulant placer une valeur entire dans la zone mmoire pointe il faut dabord rserver lemplacement ncessaire Puis via lutilisation de ltoile devant le nom du pointeur on y place un entier Programme alloc Var pEntier pointeur sur entier Dbut pEntiernouveau Entier pEntier12345 Afficher pEntier Fin Dans la plupart des langages disposant de pointeurs il est possible de prciser la taille de la mmoire alloue par exemple allouer un espace pour dix entiers Dans ce cas cest lquivalent dun tableau dentiers et ladresse retourne sera celle du premier entier Ajouter un au pointeur dcalera celuici dun lment Cette syntaxe nest pas utilise en algorithmique o on prfre allouer la mmoire lment par lment quitte les chaner ensuite Quand vous allouez dynamiquement de la mmoire elle reste occupe tout le temps de lexistence du pointeur Sans rien dautre la mmoire est rcupre uniquement la sortie du programme Il est aussi facile dallouer de la mmoire que de la librer ou de la dsallouer un barbarisme bien utile volont ds que le ou les pointeurs ne sont plus utiles on libre la mmoire associe cest a de gagn Pour ceci vous utiliserez la syntaxe suivante Librer pointeur Quand vous librez le pointeur vous librez la zone mmoire sur laquelle il pointait zone qui redevient disponible pour toute autre utilisation Attention Si vous avez conserv dans un autre pointeur ladresse de cette zone et que vous lavez dsalloue ce pointeur pointe sur une zone ventuellement raffecte autre chose Y accder risque de fournir une valeur arbitraire y crire risque doccasionner des problmes voire des plantages Le mieux est de replacer une valeur NIL aprs la libration et de penser tester le pointeur avant de lutiliser Ne drfrencez jamais un pointeur dont la zone mmoire a t libre Cest une faute malheureusement courante Dans de trs gros programmes le programmeur oublie parfois de tester la valeur du pointeur avant dy accder provoquant une fuite mmoire aux consquences souvent lourdes ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 169
Programme libere Var pEntier pointeur sur entier Dbut pEntiernouveau Entier suite du programme librer pEntier pEntierNIL Fin 4 Java et les rfrences a Diffrences entre le C et Java 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 ressemblant dans le chapitre Les tableaux et structures sur les tableaux En effet Si on affecte un tableau un autre les deux variables rsultantes reprsentent le mme tableau Une variable rfrence lautre a ressemble un peu aux pointeurs Cependant il existe des diffrences essentielles Le CC autorise les pointeurs sur nimporte quel type tant primitif int long float etc que complexe structures tableaux objets pour le C Java nautorise les rfrences que sur les variables dsignant des objets Les objets sont abords au chapitre suivant mais en Java les tableaux et structures tels que vus jusqu prsent sont en fait des objets Un pointeur contient ladresse relle en mmoire dune variable une rfrence Java appele handle poigne en anglais ne contient quune information quotvirtuellequot permettant daccder lobjet contenu du tableau enregistrement etc et fournie par la machine virtuelle Les manipulations de pointeurs peuvent vite devenir trs complexes en CC risque de dpassement des adresses allocations mmoires compliques risque de confondre les types etc Aucun risque en Java la machine virtuelle soccupe presque de tout Les oprateurs quotampquot permettant daccder ladresse dune variable et quotquot pour accder au contenu prsent ladresse pointe nexistent pas en Java Le seul oprateur prsent en Java est le point que vous avez dj rencontr avec les enregistrements Ne croyez pas que labsence des pointeurs en Java soit une limitation cest mme tout le contraire Tout dabord Java est un langage volu de haut niveau dont le rle nest pas la manipulation bas niveau dadresses physiques De ce fait le programmeur vous est entirement dbarrass de toute la gestion de ces adresses puisque la machine virtuelle soccupe de tout Cest une sorte de C dbarrass de toute sa complexit Le dveloppement en Java est donc trs simplifi en se concentrant sur les fonctionnalits b Les rfrences sur les objets En Java toute variable dont le contenu est dclar avec linstruction quotnewquot est une rfrence sur le type de variable associ Par exemple quand vous dclarez un tableau int tab tabnew int10 La variable tab est une rfrence vers un tableau dentiers Donc si vous dclarez une variable du mme type et que vous lui affectez tab cette nouvelle variable sera ellemme une rfrence du tableau rfrenc par tab Du coup toutes ces variables sont des rfrences ce qui veut dire que quand vous affectez un tableau une structure ou un objet une autre variable vous ne crez pas une copie mais ajoutez une rfrence dessus Tous ces 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 laffectation dun tableau un autre les deux variables rfrencent le mme tableau Le principe va plus loin car puisquune variable ainsi affecte est une rfrence a veut dire que si vous passez un objet tableau structure objet etc en paramtre dune fonction vous passez la rfrence sur cet objet et non le contenu associ Regardez lexemple suivant class chap8ref1 - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 170
static void tableauint tab tab112345 public static void mainString args int t27910111417182022 int copie copiet Systemoutprintlnt2 copie25 Systemoutprintlnt2 tableaut Systemoutprintlnt1 Vous reconnaissez lun des exemples du chapitre Les tableaux et structures Il lui a t rajout une fonction quottableauquot qui prend comme paramtre un tableau dentiers Les lignes en gras constituent la principale modification de lexemple Le tableau t est pass en paramtre de la fonction tableau Dans cette fonction le paramtre est modifi lindice 1 du tableau tab reoit la nouvelle valeur 12345 Aprs la fin de la fonction le programme raffiche le contenu de lindice 1 du tableau pass en paramtre il contient 12345 En Java les tableaux structures chanes qui sont en fait des objets donc tous les objets sont passs par dfaut par rfrence aux fonctions Cest vous de faire trs attention lorsque vous modifiez le contenu de ces types de variables dans la fonction c Les types primitifs Si on passe en paramtre une valeur dun type de base dit primitif comme un entier par exemple une fonction il est cette fois pass par copie Aussi si vous voulez modifier dfinitivement la valeur passe en paramtre lune des mthodes est de retourner la bonne valeur Dans lexemple suivant au premier appel la variable v nest pas modifie tandis quau second elle reoit sa nouvelle valeur par retour de la fonction modifint class chap8ref2 static int modifintint var var10 return var public static void mainString args int v0 modifintv Systemoutprintlnv vmodifintv Systemoutprintlnv En Java tous les types primitifs int long float double char sont passs par copie aux fonctions 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 sortant de la fonction Il est impossible de crer une rfrence sur un type primitif Les dveloppeurs Java ne se sont jamais plaints de cet tat de fait conscients que tout ceci facilite grandement la programmation et la syntaxe Alors quen C ou C il faut faire attention avec des dclarations pas simples ici tout est fait par dfaut Dautres langages comme le PHP en version 5 ont repris ce principe d Rfrences sur structures ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 171
Dans la suite vous allez avoir manipuler des pointeurs sur des structures Du coup cest extrmement simple car 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 avez dj utilis ce principe sans le savoir toujours dans le chapitre Les tableaux et structures avec les structures tfabricant et tarticle 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 article est une rfrence sur une structure un objet de type tarticle article contenant une variable de type tfabricant on cre dedans une rfrence fab sur un objet de ce type art2 de type tarticle reoit la rfrence de article Ils rfrencent le mme enregistrement Le contenu des champs de art2 est affich cest du coup le mme que article Si vous modifiez les champs la modification se rpercute sur toutes les rfrences sur cet enregistrement cest le mme pour tous 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 chap8refstruct public static void mainString args tarticle articlenew tarticle tarticle art2 articlerefquotArt00101quot articlefabnew tfabricant articlefabrefquotFab1234quot art2article Systemoutprintlnart2ref Systemoutprintlnart2fabref e Le pige en Java En Java il faut faire trs attention quand vous passez une rfrence en paramtre vous pouvez modifier le contenu de la rfrence et ce contenu sera modifi directement dans la zone mmoire cest parfait Mais vous ne pouvez pas modifier la rfrence ellemme Si modifiez au sein dune mthode la valeur de la rfrence ellemme elle retrouve sa valeur initiale en sortie Par exemple static void modifelement p1element p2 p1p2 Si dans le programme principal vous avez p1new element p2new element p1valeur10 p2valeur15 modifp1p2 Systemoutprintlnp1valeur La sortie sera 10 En effet dans la mthode modif p1 contient bien la rfrence vers lemplacement mmoire de lobjet p1 mais la variable p1 est ellemme locale la mthode Donc en affectant p2 p1 p1 reoit la rfrence de - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 172
p2 mais la nouvelle valeur est perdue la sortie de modif Il faut donc procder ainsi static void modifelement p1element p2 p1valeurp2valeur Cette fois cest le contenu des valeurs dans la zone mmoire rfrence qui est affect et vous obtenez le rsultat attendu f La valeur null Il se peut que vous nayez pas besoin tout de suite de crer une rfrence sur un enregistrement mais que vous vouliez viter dy accder par inadvertance Dans ce cas au lieu de crer une rfrence avec new vous pouvez lui affecter une valeur appele null Cette valeur signifie que la variable a t dclare mais na pas dobjet instanci terme expliqu dans le chapitre suivant vous ne lui avez pas encore affect denregistrement Du coup vous pouvez dj tester la variable ellemme avant de tester les champs quelle contient Dans lexemple suivant modifi tarticle contient toujours une variable de type tfabricant Mais elle ne recevra un enregistrement que plus tard dans le programme En attendant le champ fab reoit une valeur nulle signifiant que larticle na pas encore de fabricant rfrenc class tfabricant public String ref class tarticle public String ref public tfabricant fabnull class chap8refstruct2 public static void mainString args tarticle articlenew tarticle articlerefquotArt00101quot ifarticlefabnull Systemoutprintlnarticlefabref else SystemoutprintlnquotPas de fabricant pour cet articlequot ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0WXVrblCdzIgLAA-enidentnumber 173
Les listes chanes 1 Listes chanes simples a Principe Dans la vie quotidienne une liste revt plusieurs formes une liste de courses de tches effectuer un index un glossaire une collection de dvds de musiques etc Ces listes sont composes dlments individuels lis les uns aux autres par leur type ou lordre que vous voulez leur donner Pour passer dun lment un autre vous descendez dans la liste dans lordre que vous lui avez donn Comment se reprsenter une liste par dfinition linaire en programmation Vous connaissez au moins un moyen les tableaux Dans un tableau vous pouvez y stocker n lments et lordre peut tre reprsent par lindice du tableau Connaissezvous un autre moyen de stocker des lments Les enregistrements de types structurs le permettent et en plus vous pouvez y stocker bien plus de dtails Vous pouvez aussi crer des tableaux denregistrements donc leur donner un certain ordre Lutilisation des tableaux pose cependant parfois des problmes un peu complexes Vous lavez dj remarqu avec les mthodes de tris Comment insrer un nouvel enregistrement en dbut de tableau Il ny a pas dindices ngatifs Comment insrer un nouvel enregistrement en fin de tableau Si lalgorithmique propose un redimensionnement dynamique les langages comme Java ne le permettent pas Comment insrer un lment au milieu du tableau Fautil dcaler tous les lments pour placer le nouveau lendroit donn Si oui le tableau risque de dborder Et si vous supprimez un enregistrement allezvous de nouveau dcaler le tableau pour boucher le trou Ou trouver une parade pour passer pardessus Vous pouvez vous arranger pour tout programmer afin de tout faire marcher avec les tableaux Cest parfaitement possible Mais estce vraiment raisonnable Estce de la programmation efficace Rappelezvous quau chapitre Introduction lalgorithmique vous avez appris quil faut tre conome en ressources Cette mthode est gourmande et complique Il vous faut en trouver une autre plus simple et plus belle En fait encore une fois vous connaissez tous les principes de base de cette nouvelle mthode Voici quelques lments Un enregistrement peut contenir un autre enregistrement Cet autre enregistrement peut tre du mme type structur Lenregistrement peut aussi contenir un pointeur vers un autre enregistrement du mme type En notation Java un enregistrement est un objet et dans un objet on peut rfrencer un autre objet du mme type On obtient du coup une cascade denregistrements qui se suivent les uns les autres Pour accder au suivant il suffit daccder la rfrence de cet enregistrement dans lenregistrement actuel Chaque enregistrement dispose dun pointeur ou rfrence vers le suivant Les enregistrements sont donc chans les uns aux autres cest une liste chane denregistrements Le principe peut tre reprsent par le schma suivant Chaque enregistrement est reprsent par un cadre et contient une valeur et un pointeur appel psuiv qui pointe sur lenregistrement suivant de la liste ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 174
Reprsentation logique dune liste chane Pour accder un lment donn de la liste vous partez toujours du premier lment De l connaissant ladresse du suivant par le pointeur psuiv vous passez successivement aux n suivants Quand le pointeur ne pointe sur plus rien null cest que lenregistrement est le dernier Une liste chane de ce type est dite unilatre laccs aux lments composant la liste est squentiel vous devez lire les n lments prcdents pour accder celui voulu et unidirectionnel Chaque lment de la liste est un enregistrement Cet enregistrement peut contenir autant de champs que vous le souhaitez mais lun deux sera un pointeur sur un enregistrement de mme type Quand vous rajouterez un deuxime lment vous placerez son adresse dans le pointeur du premier et ainsi de suite Chaque enregistrement final pointera sur la valeur NIL Pour commencer voici un type structur simple qui pourrait convenir En fait la valeur pourrait tre nimporte quoi et le type prendra juste un entier quelconque TYPES Un lment de liste chane Structure element valeurentier pSuivNILpointeur sur element FinStruct Cette dclaration initiale du type structur element contient un pointeur pSuiv pour Pointeur sur Suivant sur une structure du mme type Par dfaut il est initialis la valeur NIL il ny a pas encore denregistrement suivant Que pouvezvous faire de cette structure Tout dabord vous dplacer dun lment un autre de la liste Pour a il suffit de partir du premier lment et de rcuprer en boucle le pointeur de llment suivant jusqu tomber sur NIL Quelles sont les oprations lmentaires possibles sur une liste Crer une liste cest crer le premier enregistrement celui de tte qui permettra daccder aux autres Parcourir une liste cest balayer tous les lments un par un jusquau dernier Rechercher un lment dans la liste soit indiquer sil existe soit retourner un pointeur vers sa position Ajouter un lment nimporte o dans la liste au dbut au milieu la fin Une fonction dajout pourrait aussi reprendre la premire opration de cration de liste Supprimer un lment nimporte o dans la liste Supprimer la liste 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 pointeur vers un lment de la liste Une dernire chose le premier lment de la liste est toujours le point dentre pour la plupart des fonctions tant donn quil sera reprsent par la suite par un pointeur ne perdez JAMAIS ladresse de ce premier lment il serait impossible de retrouver le dbut de la liste dautant plus quavec lallocation dynamique de mmoire il est plus que possible que les zones mmoires alloues chaque lment ne soient pas contigus Conservez toujours ladresse du premier enregistrement dans un pointeur prvu cet effet dont vous ne modifierez pas la valeur tout au long du programme sauf si vous supprimez le premier lment ou toute la liste b Cration - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 175
Pour crer une liste il faut commencer par son premier lment Le premier lment est un pointeur auquel vous allez allouer dynamiquement une zone mmoire Il prendra la valeur que vous voulez et son pointeur denregistrement suivant recevra NIL La fonction retourne un pointeur vers le premier lment de la nouvelle liste Fonction creelistepointeur sur element Var pTetepointeur sur element Dbut pTetenouveau element pTetepSuiv NIL pTetepSuivNIL Retoune pTete FinFonc Rappel pTetepSuiv NIL se lit ainsi pTetepSuivNIL cestdire que le champ pSuiv de lenregistrement point par pTete reoit la valeur NIL Cette fonction amne un premier commentaire Dans le chapitre Les sousprogrammes vous avez appris la diffrence entre les variables locales et globales Ici pTete est une variable locale elle sera dtruite la fin de la fonction Pourtant ladresse quelle contient est retourne Cest que le pointeur ntant pas libr la zone mmoire alloue dynamiquement lest pour toute la dure du programme la sortie de la fonction la zone mmoire existe encore et donc son adresse est encore valide Remarquez que laffectation de la valeur NIL pSuiv nest pas ncessaire car cest sa valeur par dfaut lors de la dclaration de lenregistrement structur Pour exploiter cette fonction il suffit de dclarer un pointeur et lui affecter le rsultat de celleci Programme liste1 Var pTetepointeur sur element Dbut pTetecreeliste Fin La fonction creeliste est trs simple Peuttre pourriezvous en profiter pour voir le mcanisme simple permettant de rajouter des lments les uns la suite des autres La fonction creeliste2 modifie va vous demander de saisir en boucle des valeurs qui seront ajoutes les unes aprs les autres en fin de liste Pour ceci vous aurez besoin de conserver chaque fois trois informations Le pointeur pTete de la tte de la liste qui devra tre retourn par la fonction Le pointeur pEncours de llment actuel de la liste de llment rajout en fait Le pointeur pPrec de llment prcdent dont le pointeur pSuiv devra recevoir ladresse de llment en cours Fonction creeliste2 pointeur sur element Var pTete pEncours pPrec pointeurs sur element v Entier Dbut 1er lment pTetenouveau element Afficher quotValeur du premier lment quot Saisir pTetevaleur Le premier lment est le prcdent de llment suivant pPrecpTete Rpter Afficher quotValeur suivante 0sortie quot Saisir v Si vltgt0 Alors Allocation du nouvel lment pEncoursnouveau element pEncoursvaleur v ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 176
Chanage pEncours est le suivant de pPrec pPrecpSuiv pEncours pPrecpEncours FinSi Jusqu v0 Fin de liste pSuiv NIL pPrecpSuiv NIL Retourne pTete FinFonc c Parcours de la liste 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 jusqu rencontrer la valeur NIL La fonction parcoursliste reoit comme argument le pointeur de tte Une simple boucle va ensuite balayer toute la liste et afficher toutes les valeurs qui y sont contenues Fonction parcourslistepTete pointeur sur element Var pEncours pointeur sur lment Dbut pEncourspTete Tant que pEncoursltgtNIL Faire Afficher pEncoursvaleur pEncours pEncourspSuiv FinTantQue FinFonc d Recherche Deux types de sousprogrammes sont possibles le premier dtermine si llment existe dans la liste et retourne un boolen vrai ou faux selon que llment est trouv ou non Cest donc une fonction Le second retourne ladresse de llment trouv et ladresse de llment prcdent vous verrez pourquoi ensuite Cest donc une procdure car une fonction ne peut retourner deux valeurs Mais pourquoi ne pas faire dune pierre deux coups cestdire un sousprogramme qui va la fois retourner vrai ou faux mais aussi des pointeurs sur llment courant et prcdent Cest possible car vous pouvez passer des pointeurs comme arguments de fonctions modifier ladresse sur laquelle ils pointent et retourner tout de mme un boolen En fait il est quasiment inutile de retourner un boolen car de toute faon si llment nest pas trouv pEncours vaudra NIL en sortie de fonction La procdure rechercheliste prend quatre paramtres La valeur v recherche Un pointeur pTete sur la tte de la liste Un pointeur pPrec sur llment prcdent celui trouv Un pointeur pEncours sur llment trouv Un boolen vrai ou faux Si llment est trouv pPrec pointe sur celui davant pEncours sur llment trouv Si llment est absent pEncours vaur NIL et pPrec pointe sur le dernier lment de la liste Si pPrec vaut NIL llment recherch est le premier de la liste Procdure rechercheliste Eventier EpTete ES pPrecpEncours pointeurs sur elementS trouve boolen Var - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 177
trouve boolen Dbut trouveFAUX pPrecNIL pEncourspTete Tant que pEncoursNIL ET pEncoursvaleurltgtv Faire pPrecpEncours pEncours pEncourspSuiv FinTantQue Si pEncoursNIL ET pEncoursvaleurv Alors trouveVRAI FinSI FinProc e Ajout dun lment Pour lajout dun lment dans la liste trois cas de figure peuvent se prsenter ncessitant trois traitements diffrents Lajout dun lment en dbut de liste Lajout dun lment en milieu de liste Lajout dun lment en fin de liste Dans les trois cas le chanage est modifi Il est certes possible de crer un gros sousprogramme qui gre les trois cas dun coup mais il est profitable de diffrencier ces trois traitements en trois sousprogrammes indpendants Il sera toujours temps ensuite de crer un sousprogramme fdrateur qui grera tous les cas Dans tous les cas suivants ladresse de llment rajouter que vous aurez dj remplie avec la bonne valeur sera reprsente par le pointeur pNouveau Deux cas sont possibles lajout dun lment dans une liste vide auquel cas il sagit du premier enregistrement et lajout dun lment en premire position de la liste Dans le premier cas il sagit de faire en sorte que llment ajouter soit le premier donc que pNouveau devienne llment de tte de la liste sans lment suivant Vous passez la procdure le pointeur sur lenregistrement et le pointeur de tte Procdure ajoutuniqueE 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 Cest un cas trs simple o le nouvel lment reoit comme lment suivant celui de tte Pour ce dernier rien ne change Procdure ajoutdbutE pNouveau ES pTete pointeurs sur element Dbut pNouveaupSuiv pTete pTetepNouveau FinProc Cest encore un cas trs simple Le rajout dun lment en fin de liste ncessite seulement de connatre ladresse du dernier lment actuel Le pointeur pSuiv de ce dernier pointera sur le nouvel lment et le pSuiv du nouvel lment recevra NIL Si vous reprenez les procdures de recherche et de parcours de la liste chane la fin de la liste pEncours vaut NIL et pPrec contient ladresse du dernier enregistrement La procdure ajoutfin reoit deux paramtres pNouveau et pPrec Ajout en dbut de liste Ajout en fin de liste ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 178
Procdure ajoutfinES pNouveau pPrec pointeurs sur element Dbut pPrecpSuiv pNouveau pNouveaupSuiv NIL FinProc Au final aucun ajout naura t bien compliqu puisque l encore vous disposez de tout le ncessaire Pour rajouter un lment entre deux autres lments dune liste vous devez connatre ladresse de llment prcdent et ladresse de llment courant sachant que le nouvel lment sera insr entre les deux La procdure ajoutmilieu reoit donc trois arguments le nouvel lment pNouveau llment prcdent pPrec et llment actuel pEncours Procdure ajoutmilieuES pNouveau pPrec pEncours pointeurs sur element Dbut pPrecpSuiv pNouveau pNouveaupSuiv pEncours FinProc Le but est de gnraliser les ajouts en un grand sousprogramme unifi Pour a il faut savoir o placer llment rajouter Lalgorithme de recherche dun lment retourne deux pointeurs celui de llment trouv et de llment prcdent Supposez que vous souhaitez insrer votre nouvel lment juste avant llment recherch a devient plutt simple Quatre cas de figure se prsentent pPrec contient NIL pas dlment avant et pEncours contient NIL il ny a aucun lment dans la liste le nouveau sera le premier et seul lment pPrec contient NIL pas dlment avant et pEncours pointe sur llment trouv qui est le premier le nouveau se place avant en premier pPrec pointe sur un lment prcdent et pEncours pointe sur llment trouv le nouveau se place au milieu des deux pPrec pointe sur un lment prcdent et pEncours contient NIL la recherche est arrive au bout lment trouv ou non le nouveau se place en dernier Quatre cas de figures qui correspondent aux quatre sousprogrammes dj crs cidessus Lalgorithme devient simple il suffit dappeler la bonne procdure selon les valeurs de pPrec et de pEncours La procdure ajoutelement prend trois valeurs la valeur recherche la valeur insrer avant et le pointeur de tte de la liste Procdure ajoutelementEvrechvnouveau entiers ES pTete pointeur sur element Var pPrec pEncours pNouveau pointeurs sur element Dbut pNouveaunouveau element pNouveauvaleur vnouveau recherchelistevrechpTetepPrecpEncours Si pPrecNIL Alors Si pEncoursNIL Alors ajoutuniquepNouveau pTete Sinon ajoutdbutpNouveau pTete FinSI Sinon Si pEncoursNIL Alors ajoutfinpNouveau pPrec Sinon ajoutmilieupNouveau pPrec pEncours FinSi FinSi FinProc Ajout en milieu de liste Gnralisation - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 179
Les traitements sont ici trs dtaills Cependant analysez les procdures ajoutpremier et ajoutdbut Que remarquezvous Elles se ressemblent dautant plus que dans ajoutdbut pTete contient dj NIL sil ny pas denregistrements Donc les deux procdures sont identiques ajoutdebut remplace ajoutpremier Regardez maintenant ajoutfin et ajoutmilieu dans ajoutmilieu pEncoursgtpSuiv reoit quoi si vous tes en fin de liste La valeur NIL Donc les deux sont identiques et ajoutmlilieu peut remplacer ajoutfin La procdure ajoutelement se trouve simplifie ainsi Les deux autres procdures ne servent plus rien Procdure ajoutelementvrechvnouveau entiers pTete pointeur sur element Si pPrecNIL Alors ajoutdbutpNouveau pTete Sinon ajoutmilieupNouveau pPrec pEncours FinSi FinProc f Suppression dun lment Lajout dlments est un grand pas en avant car vous connaissez et comprenez intgralement le principe inhrent aux listes chanes Pour supprimer un lment de cette liste cest quasiment la mme chose il faut juste recoller les morceaux et librer la mmoire alloue llment supprim Il y a quatre possibilits Supprimer le seul lment de la liste Supprimer le premier lment de la liste Supprimer le dernier lment de la liste Supprimer un lment au milieu de la liste 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 pointeur pSuiv de llment trouv Les fonctions suivantes restructurent la liste pour lui redonner le bon chanage La libration de la mmoire occupe par llment effacer sera effectue selon le mme modle que la fonction fdratrice dajout dans une grande fonction de suppression Cest facile si llment est le seul donc la tte de la liste il suffit de placer son pointeur NIL Pas de prcdent pas de suivant cest termin Procdure suppruniqueES pTete pointeur sur element Dbut pTeteNIL FinProc Cest aussi simple cest llment suivant qui devient la tte de la liste Procdure supprpremierES pTete pointeur sur element Dbut pTete pTetepSuiv FinProc Toujours aussi simple llment prcdent reoit NIL comme valeur de pointeur suivant Simplification Supprimer le seul lment Supprimer le premier lment Supprimer le dernier lment ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 180
Procdure supprdernierE pPrec pointeur sur element Dbut pPrecpSuiv NIL FinProc Il faut raccorder llment prcdent avec llment suivant Procdure supprmilieuE pPrecpEncours pointeurs sur element Dbut pPrecpSuiv pEncourspSuiv FinFonc Contrairement lajout vous pouvez tout de suite voir sil est possible de simplifier avant daller plus loin selon le mme principe Ainsi dans la fonction supprpremier pTete recevra NIL si llment supprim est le seul car pTete gtpSuiv vaut NIL Idem pour supprmilieu et supprdernier Dans supprmilieu pEncoursgtpSuiv vaut NIL si llment est le dernier Les fonctions supprunique et supprdernier sont donc inutiles sauf pour lexemple Tout dabord vous devez trouver llment supprimer Sil ny est pas il ny a rien supprimer Donc si pEncours contenant llment trouv vaut NIL il ny a rien faire Ensuite il y a deux cas de figure pPrec vaut NIL llment supprimer est le premier ou le seul pPrec est diffrent de NIL llment supprimer est au milieu ou en fin de liste Ensuite aprs avoir appel la fonction adquate vous navez plus qu librer la mmoire alloue pour llment et passer son pointeur NIL La procdure supprelement ne prend que deux arguments la valeur de llment supprimer et la tte de la liste Procdure supprelementEvrechentierESpTetepointeur sur element Var pPrec pEncours pointeurs sur element Dbut recherchelistevrechpTetepPrecpEncourspointeurs sur elements Si pEncoursNIL Alors Afficher quotElement absentquot Sinon Si pPrecNIL Alors supprpremierpTete Sinon supprmilieupPrecpEncours FinSi Librer pEncours pEncoursNIL FinProc g Supprimer toute la liste Pour supprimer tous les lments de la liste il suffit de supprimer tous les lments jusquau dernier Mais attention Ne supprimez pas un lment sans avoir auparavant conserv ladresse de llment suivant Si vous ne lavez pas fait non seulement les lments suivants sont perdus mais la mmoire des lments suivants ne pourra plus tre libre La fonction supprliste ne prend quun seul argument la tte de la liste Fonction supprlistepTete pointeur sur element Var Supprimer un lment au milieu Simplification Gnralisation - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 181
pEncours pSuivant pointeurs sur lment Dbut pEncourspTete Tant que pEncoursNIL Faire pSuivantpEncourspSuiv Librer pEncours pEncourspSuivant FinTantQue pTeteNIL FinFonc h Parcours rcursif Fonction parcoursrecursifpEncours pointeur sur element Dbut Si pEncoursltgtNIL Alors Afficher pEncoursvaleur parcoursrecursifpEncourspSuiv FinSi FinFonc Cette fonction est appele avec le pointeur de tte comme paramtre parcoursrecursifpTete 2 Limplmentation en Java cause du fait quen Java les arguments des mthodes ne sont pas en entresortie pour rappel voir dans ce chapitre le point Les pointeurs et rfrences Java et les rfrences Le pige en Java il faut adapter quelques procdures pour quelles retournent une rfrence vers les divers lments de la liste import javaio class element int valeur element pSuivnull class chap8liste Fonction de saisie static int saisir String txt int vretour0 BufferedReader saisie saisienew BufferedReadernew InputStreamReaderSystemin try txtsaisiereadLine vretourIntegerparseInttxt catchException excp SystemoutprintlnquotErreurquot return vretour Cration de la tte static element creeliste element pTete pTetenew element pTetepSuivnull ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 182
return pTete Tte et suivants static element creeliste2 element pTetepPrecpEncours int v 1er lment pTetenew element Systemoutprintlnquot1er lment quot pTetevaleursaisir pPrecpTete Elments suivants do SystemoutprintlnquotElement suivant quot vsaisir ifv0 pEncoursnew element pEncoursvaleurv Chanage pPrecpSuivpEncours pPrecpEncours whilev0 Fin de liste pPrecpSuivnull return pTete Parcours itratif static void parcourslisteelement pTete element pEncours pEncourspTete whilepEncoursnull SystemoutprintpEncoursvaleurquot quot pEncourspEncourspSuiv Systemoutprintln Adapt pour Java static element recherchelisteint velement pTete element pEncourspPrec pPrecnull pEncourspTete whilepEncoursnull ampamp pEncoursvaleurv pPrecpEncours pEncourspEncourspSuiv return pPrec Rajout pour Java static boolean existelisteint v element pTete element pPrecnull boolean trouvefalse pPrecrecherchelistevpTete ifpPrecnull - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 183
ifpTetenull ampamp pTetevaleurv trouvetrue else ifpPrecpSuivnull trouvetrue return trouve Fonctions dajout static element ajoutdebutelement pNouveau element pTete pNouveaupSuivpTete pTetepNouveau return pTete static void ajoutmilieuelement pNouveau element pPrec element pEncours pPrecpSuivpNouveau pNouveaupSuivpEncours static element ajoutelementint vrech int vnouveau element pTete element pPrecnullpEncoursnullpNouveau pNouveaunew element pNouveauvaleurvnouveau pPrecrecherchelistevrechpTete ifpPrecnull pEncourspPrecpSuiv ifpPrecnull pTeteajoutdebutpNouveau pTete else ajoutmilieupNouveau pPrec pEncours return pTete Fonctions de suppression static element supprpremierelement pTete pTetepTetepSuiv return pTete static void supprmilieuelement pPrec element pEncours pPrecpSuivpEncourspSuiv static element supprelementint vrech element pTete element pPrecnull pEncoursnull pPrecrecherchelistevrechpTete ifpPrecnull pEncourspPrecpSuiv else pEncourspTete ifpEncoursnull ifpPrecnull pTetesupprpremierpTete else supprmilieupPrecpEncours pEncoursnull return pTete Supprimer la liste static element supprlisteelement pTete pTetenull return pTete Parcours rcursif static void parcoursrecursifelement pEncours ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 184
ifpEncoursnull SystemoutprintpEncoursvaleurquot quot parcoursrecursifpEncourspSuiv Programme principal public static void mainString args element pTetepPrec int v pTetecreeliste2 parcourslistepTete SystemoutprintlnquotSaisir la valeur recherchee quot vsaisir ifexistelistevpTete SystemoutprintlnquotTrouv quot else SystemoutprintlnquotAbsent quot pTeteajoutelement215pTete parcourslistepTete SystemoutprintlnquotSaisir la valeur supprimerquot vsaisir pTetesupprelementvpTete parcoursrecursifpTete Systemoutprintln supprlistepTete 3 Autres exemples de listes a Listes circulaires Une liste circulaire permet daccder nimporte quel lment de la liste depuis nimporte quel autre lment sans passer par le pointeur de tte Pour mettre en place ce type de liste il suffit de faire pointer llment suivant du dernier lment sur le pointeur de tte Dans une telle liste les fonctions dajout et de suppression dlments sont simplifies et correspondent aux fonctions dajout et de suppression au milieu Il y a un petit problme pour la fonction de recherche qui du coup ne sarrte jamais Il faut donc placer un drapeau pour arrter la recherche quand on retombe sur llment de dpart Il suffit de stocker ladresse de dpart Si vous retombez dessus cest que vous avez parcouru toute la liste b Listes dlments tris Dans ce type de liste les lments sont placs selon un ordre dfini par vousmme au sein des valeurs contenues dans les lments Ainsi vous tes assur de respecter cet ordre lors du parcours de la liste Vous devez adapter la fonction de recherche pour faire respecter cet ordre c Listes doublement chanes Dans une liste chane simple le parcours ne seffectue que dans un seul sens et depuis un lment vous ne pouvez pas retourner au prcdent Une premire mthode consisterait conserver ladresse de chaque lment prcdent ce qui serait possible avec lutilisation de fonctions rcursives mais ce serait trs lourd Lautre possibilit consiste utiliser des listes doublement chanes chaque lment ne contient non plus un seul pointeur mais deux un pour llment suivant un autre pour llment prcdent Ainsi vous pouvez vous dplacer - 12 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 185
dans les deux sens dans la liste soit vers la queue fin soit vers la tte Ces listes sont dites bilatres Les traitements doivent tre adapts en consquence Prenez le problme lenvers vous avez deux pointeurs mettre jour Si vous savez le faire dans un sens comme les listes simples vous savez le faire dans lautre vous changez juste de sens Il y a donc deux fois plus doprations de chanage Chanage avant pPrecpSuiv pNouveau pNouveaupSuiv pSuivant Chanage arrire pSuivantpPrec pNouveau pNouveaupPrec pPrec Les listes bilatres peuvent aussi tre circulaires etou tries d Files et piles Dans une file dattente dans un magasin un cinma bref dans une queue le premier arriv est le premier servi En anglais cela se traduit par quotFirst In First Outquot soit FIFO en abrg Une file dattente de type FIFO peut tre reprsente par une liste chane Chaque nouvel lment est rajout en fin de liste tandis que les lments sont traits les uns aprs les autres depuis la tte de la liste Quand vous faites la vaisselle les assiettes sont empiles les unes sur les autres Quand vous lavez les assiettes vous prenez celles du dessus en descendant au fur et mesure Si des nouvelles assiettes sales sont rajoutes elles le sont sur le dessus de la pile Le principe est le mme en informatique quand vous voulez traiter des lments au fur et mesure de leur arrive les derniers arrivs sont traits en premier La pile peut tre reprsente par une liste chane les nouveaux lments sont systmatiquement rajouts en tte de liste et les lments sont toujours traits depuis cette tte Si les lments arrivent plus vite que leur traitement ceux arrivs en premier risquent dtre traits bien tard ENI Editions - All rigths reserved - Jonifar lina - 13 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE09WSze1CdzIgLAA-enidentnumber 186
Les arbres 1 Principe Note Limplmentation des arbres en Java reprend des principes quasiidentiques aux listes vues prcdemment Le code Java ne vous sera pas fourni ce coupci vous dimplmenter ces algorithmes ce nest pas trs difficile Dans la nature les vgtaux dcrivent souvent des structures dites arborescentes Lexemple le plus vocateur est larbre le tronc se dcompose en plusieurs branches se dcomposant ellesmmes en branches plus petites et ainsi de suite jusquaux extrmits o poussent les feuilles Selon le cas aprs les tableaux et les listes vous pouvez vous aussi choisir de reprsenter lorganisation de vos donnes sous forme darborescence en programmation La notion darborescence est trs courante sur votre ordinateur personnel de nombreuses informations sont reprsentes directement ou indirectement sous forme darborescence les dossiers des disques durs la structure dune page web la structure dun site web la dcomposition de lexcution dun programme et de ses appels aux sousprogrammes bref tout ce qui peut incorporer une notion de hirarchie peut tre reprsent sous forme dune arborescence Lexemple le plus simple comprendre est la gnalogie On parle darbre gnalogique Partant de vous 1 vous placez tout dabord vos parents 2 puis les parents de vos parents 4 puis les parents de ces derniers 8 et ainsi de suite Tous sont relis par leurs liens de parent vous avec vos parents parents avec grandsparents et ainsi de suite Le schma part de vous mais pourrait partir de vos arrires grandsparents ayant x enfants y petitsenfants z arrirespetits enfants dont vous chaque individu tant le successeur de son parent et le prdcesseur de ses enfants Un arbre gnalogique est un arbre binaire Comment reprsenter un tel arbre gnalogique en programmation Vous disposez comme souvent de plusieurs moyens notamment avec les bases de donnes mais connaissant les listes chanes vous devez penser quil existe un moyen ou un autre de sen sortir directement avec quelques enregistrements et pointeurs Vous avez raison Dans un arbre chaque lment membre de votre famille dispose dun pre et dune mre qui ont euxmmes deux parents Un lment peut donc tre dcrit par plusieurs informations mais deux seulement vont vous intresser pour la suite un lment individu pointe sur son pre et sa mre Un type structur pouvant reprsenter un individu pourrait donc tre Structure individu nomchane pnom chane pPrepointeur sur individu pMrepointeur sur individu FinStruct Contrairement aux listes chanes simples ou doubles il ne sagit pas ici de dfinir une liste file ou pile mais une notion de hirarchie entre lments pres et fils Cette hirarchie porte le nom darbre 2 Dfinitions a Base ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 187
Un arbre est form dune racine qui est llment la base de larbre et dun nombre fini darbres qui lui sont raccords appels sousarbres Chaque lment dun arbre peut avoir plusieurs successeurs vous avez deux parents mais un seul prdcesseur Seule la racine na pas de prdcesseur b Terminologie Les arbres utilisent une terminologie particulire qui reprend en gros celle de la nature et de la gnalogie Un noeud ou sommet est un lment quelconque de larbre Dans un arbre gnalogique chaque individu reprsente un noeud ou sommet il a plusieurs successeurs mais un seul prdcesseur La racine est le premier lment de larbre nayant pas de prdcesseur dans la hirarchie Une feuille ou noeud terminal ou noeud final est un lment qui na pas de successeur Un noeud interne est un noeud qui nest ni racine ni feuille qui a donc un prdcesseur et des successeurs Un arc relie deux noeuds Une branche est le chemin qui relie la racine une feuille Du ct du rapprochement gnalogique lgrement sexiste vous trouverez les termes suivants Le pre est le prdcesseur unique dun noeud Les fils sont les n successeurs dun noeud Les noeuds de pre identique sont des frres Le noeud le plus gauche de larbre est lan Un arbre peut tre dcrit horizontalement et verticalement c Description horizontale Horizontalement un arbre naire est un arbre dont le nombre maximum de fils par noeud est n Les fils sont regroups par niveaux Un niveau est lensemble des noeuds gale distance de la racine Le premier niveau est la racine le deuxime les fils de la racine le troisime les fils des fils et ainsi de suite Quand chaque noeud dun niveau a exactement n fils le niveau est dit satur Un arbre est strictement complet si tous les niveaux sont complets Il est simplement complet au sens large si tous les niveaux intermdiaires sont complets mais quil manque des feuilles Dans un arbre strictement complet la racine et tous les noeuds internes ont exactement n fils ni plus ni moins d Description verticale La hauteur dun arbre est le nombre de noeuds du plus long chemin direct la plus longue branche entre la racine et une feuille racine et feuille inclues Si larbre dispose dune racine de deux fils et quun des fils a une feuille la hauteur de larbre est 3 e Larbre binaire Un arbre binaire est un arbre dont chaque noeud a au plus deux fils Depuis la racine larbre binaire est constitu de deux sousarbres diffrencis le sousarbre droit et le sousarbre gauche Il existe des arbres trois quatre n fils Cependant seuls les arbres binaires seront abords ici et notamment les arbres binaires ordonns Le schma suivant montre un arbre binaire strictement complet de hauteur 3 - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 188
Arbre binaire ordonn strictement complet de hauteur 3 3 Parcours dun arbre Pour la suite la structure dun noeud dun arbre sera la suivante tant bien compris qu chaque noeud est associe une valeur sinon larbre na aucun intrt et que bien que cette structure ressemble celle dun lment de liste doublement chane ce nest plus pour une reprsentation linaire mais hirarchique Structure noeud valeurentier pGauchepointeur sur noeud pDroitpointeur sur noeud FinStruct un gauche Le noeud 9 a deux sousarbres un gauche vers le noeud 9 un droite vers le noeud 10 Dans les fonctions de parcours suivantes chaque appel chaque noeud ne valant pas NIL est considr comme la racine dun arbre et les sousarbres partant de ce noeud seront parcourus comme tels Le parcours complet dun arbre consiste parcourir tout larbre afin daccder lensemble des noeuds de larbre Bien La racine Le sousarbre gauche Le sousarbre droit Ce type de parcours est dit prfix Le programme va dabord traiter tous les lments de gauche Arriv une feuille il remonte au noeud prcdent puis passe droite pour traiter les lments de gauche de celuici puis remonte et ainsi de suite Dans larbre binaire de lexemple lordre de sortie est le suivant Branche gauche 12 gt 9 gt 8 cest une feuille On remonte au noeud 9 ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 189
Branche droite 10 cest une feuille On remonte au noeud 9 puis la racine 12 Branche droite 14 Branche gauche 13 feuille On remonte au noeud 14 Branche gauche 16 La sortie finale est donc 12 9 8 10 14 13 16 Pour le reprsenter il faut utiliser une fonction ou procdure rcursive Fonction prefixepNoeud pointeur sur noeud Dbut Si pNoeudltgtNIL Alors Afficher pNoeudvaleur racine prefixepNoeudpGauche sous-arbre gauche prefixepNoeudpDroite sous-arbre droit FinSi Fin Il existe deux autres types de parcours Le parcours postfix qui traite dans cet ordre Le sousarbre gauche Le sousarbre droit La racine Lordre de sortie est 8 10 9 13 16 14 12 Fonction postfixepNoeud pointeur sur noeud Dbut Si pNoeudltgtNIL Alors prefixepNoeudpGauche sous-arbre gauche prefixepNoeudpDroite sous-arbre droit Afficher pNoeudvaleur racine FinSi Fin Et le parcours infix appel aussi parcours symtrique ou hirarchique canonique Ce parcours sera trs utile par la suite Lordre est le suivant Le sousarbre gauche La racine Le sousarbre droit Cette fois lordre de sortie est le suivant Sousarbre gauche 8 9 10 Racine 12 Sousarbre droit 13 14 16 - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 190
Vous obtenez la squence 8 9 10 12 13 14 16 Cest trs intressant larbre binaire donn en exemple na pas t choisi au hasard Il sagit dun arbre binaire ordonn construit de sorte quavec un parcours infix les valeurs des diffrents noeuds sont tries Fonction infixepNoeud pointeur sur noeud Dbut Si pNoeudltgtNIL Alors infixepNoeudpGauche sous-arbre gauche Afficher pNoeudvaleur racine infixepNoeudpDroite sous-arbre droit FinSi Fin 4 Arbre binaire ordonn a Principe Un arbre binaire est ordonn si pour une valeur dun noeud donn la valeur du fils de gauche lui est infrieure et la valeur du fils de droite lui est suprieure pGauchevaleur lt pEncoursvaleur lt pDroitevaleur Imaginez que vous voulez rajouter la valeur 15 dans larbre Comparez 15 la racine 12 cest suprieur direction le noeud de droite Comparez 15 au noeud 14 cest suprieur direction le noeud de droite Comparez 15 au noeud 16 cest infrieur direction le noeud de gauche Il ny a pas de noeud gauche placez 15 dans ce nouveau noeud Tous les parcours sont possibles et le parcours infix vous donne toutes les valeurs dj tries b Recherche dun lment Pour rechercher un lment vous avez deux solutions utiliser une solution itrative ou une solution rcursive En effet les deux sont possibles et assez simples Il suffit de comparer la valeur recherche la valeur de chaque noeud Si elle est infrieure alors la recherche continue gauche sinon elle continue droite tant quune feuille na pas t atteinte et que la valeur na pas t trouve La fonction rech1 prend deux arguments la valeur recherche et la racine de larbre Elle retourne un boolen VRAI si la valeur a t trouve FAUX sinon Elle utilise une simple boucle Fonction rech1vrech entier pArbre pointeur sur noeud Boolen Var trouve boolen pEncours pointeur sur noeud Dbut pEncourspArbre trouveFAUX Tant que pEncoursltgtNIL ET trouveFAUX Faire Si pEncoursvaleurvrech Alors trouveVRAI Sinon Si vrech lt pEncoursvaleur Alors pEncourspEncourspGauche Sinon pEncourspEncourspDroite Finsi FinSi FinTantQue Finfonc ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 191
La fonction rech2 est rcursive Elle prend trois arguments la valeur recherche la racine de larbre et ladresse du noeud contenant la valeur trouve Si la valeur nest pas trouve ladresse contient NIL Fonction rech2vrech entier pArbre pEncourspointeurs sur noeud Dbut Si pArbreNIL Alors pEncoursNIL Sinon Si pArbrevaleurvrech Alors pEncourspArbre Sinon Si pArbrevaleur gt vrech Alors rech2valeurpArbrepGauche pEncours Sinon rech2valeurpArbrepDroite pEncours FinSi Finsi FinSi FinFonc c Ajout dun lment Quand vous ajoutez un lment vous devez respecter la structure de larbre ordonn Lajout dun lment rajoute une feuille larbre Il vous faut trouver le chemin jusquau noeud pre La fonction rech2 peut tre modifie en ce sens si llment ajouter nest pas trouv alors le dernier lment qui vaut alors NIL doit tre remplac par la nouvelle feuille et tre raccord la bonne branche au pre Il faut donc conserver ladresse du pre La fonction inserer prend trois arguments la valeur rajouter Fonction insererventier pArbre pPrec pointeurs sur noeud Var pNouveaupointeur sur noeud Dbut Si pArbreNIL Alors pNouveaunouveau noeud pNouveauvaleurv pNouveaupGaucheNIL pNouveaupDroiteNIL Si pPrecltgt NIL Alors Si vgtpPrecValeur Alors pPrecpDroitepNouveau Sinon pPrecpGauchepNouveau FinSI FinSi Sinon Si pArbrevaleur ou ltgt v Alors Si v gt pArbrevaleur Alors insrer v pArbre pArbrepDroite Sinon insrer vpArbre pArbrepGauche FinSi FinSi FinSi FinFonc d Suppression dun noeud Pour le dernier point de ce chapitre cest vous qui allez crire lalgorithme de la fonction ncessaire la suppression du noeud Il y a trois cas traiter La suppression dun noeud sans fils une feuille cest le cas le plus simple Le pointeur correspondant droite ou gauche du pre doit tre plac NIL La suppression dun noeud ayant un fils le fils droit tre raccord au bon pointeur du grandpre - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 192
La suppression dun noeud ayant deux fils Cest le cas le plus problmatique Pour ce dernier cas vous pouvez procder aux chanages directement Par exemple soit un morceau de larbre dexemple vous voulez supprimer le noeud 8 Suppression dun noeud deux fils Le noeud 9 tant supprim il faut rorganiser larbre en consquence Le noeud avait deux fils celui de gauche et tout son sousarbre remplace le noeud supprim celui de droite et tout son sous arbre va droite du nouveau noeud Une autre possibilit est de supprimer le noeud parcourir les deux sousarbres de cet ancien noeud et de rajouter chaque lment dans le premier arbre ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0VfhdiFCdzIgLAA-enidentnumber 193
Principe de lobjet une notion vidente 1 Avant de continuer 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 pourriez vous arrter l En effet ds prsent vous disposez de tous les lments indispensables pour programmer en langage C ou en Pascal Cependant il serait dommage de ne pas continuer ceci mme si vous naurez pas tout de suite programmer en objet 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 Visual Basic driv du Basic ainsi que la plupart des langages de macros sous Ms Office ou OpenOfficeorg ou encore les langages de certains gestionnaires de bases de donnes sont des langages objet Ne pas comprendre lobjet cest risquer de se couper de beaucoup de produits beaucoup de fonctionnalits et parfois aussi dune plus grande simplicit dans certains traitements 2 Rappels sur la programmation procdurale Les procdures ou fonctions reoivent ces donnes en arguments paramtres et les retournent modifies ou non par le mme chemin ou par valeur retour de fonction Dans un langage procdural ou fonctionnel les donnes sont spares des programmes qui les utilisent a Les donnes Chaque variable dispose dun type qui indique quelle sorte de valeur elle peut contenir Ces types sont dits primitifs quand ils sont directement proposs par le langage luimme Ils peuvent diffrer selon les langages mais le C propose une srie dentiers de rels et de caractres Dautres incluent les chanes de caractres 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 non typs comme le PHP 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 Bien que plus difficile apprhender elles permettent une souplesse ingale dans les manipulations de valeurs Pour palier au risque de complexit dans certains langages volus la notion de rfrence remplace parfois celle de pointeur notamment en Java b Les traitements Les traitements sont effectus soit dans le programme principal quon appelle parfois le corps de programme soit dans des sousprogrammes appels procdures ou fonctions Dans ce dernier cas la fonction est utilise comme une 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 Java ne font pas de distinction entre ces deux notions une fonction ne retournant pas forcment de valeur 3 Lobjet a Dans la vie courante Regardez autour de vous de quoi sont constitues les choses Par chose comprenez tous les objets rels ou abstraits qui vous entourent Un objet rel est par exemple une salire un couteau un stylo une voiture votre cran dordinateur un tlphone etc Par abstrait comprenez une entreprise un service une organisation quelconque etc Ces objets ont des proprits intrinsques Prenez un cran Parmi ses proprits physiques et dusage vous ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 194
trouvez ses dimensions son type crt lcd etc ses connecteurs vga dvi son poids cest lourd un cran tube la diagonale daffichage en pouces les rsolutions daffichage supportes avec les frquences associes etc Ce mme cran a probablement un mode demploi dcrivant les manipulations tant matrielles que logicielles pour le paramtrer par exemple rgler les couleurs et associ contraste etc rgler la zone daffichage changer de rsolution etc Un objet comme un cran dispose donc de proprits cest la description de ce quil est de son tat Il dispose aussi de mthodes quelles sont les actions possibles pour modifier son tat son comportement pour lutiliser Cest ce quil sait faire 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 la fermer etc Imaginez le nombre de proprits et de mthodes pour un tre humain La dfinition des proprits et des mthodes dcrites pour un cran est valable pour 99 des crans si ce nest plus Le contenu des proprits sera probablement modifi mais si lcran est standard le changement de rsolution via Windows MacOS ou Linux sera effectu de la mme manire La dfinition globale proprits et mthodes dun tel objet peut former une sorte de moule commun tous les objets les crans de mme type Une fois que vous disposez de ce quotmoulequot vous pouvez lappliquer autant dobjets les crans que vous voulez avec dventuelles variantes en appliquant les mmes mthodes b En informatique En programmation procdurale la question se poser quand on dveloppe est quot quoi sert le programme quot Ici il sert manipuler les informations et les fonctions dun cran Comment en programmation reprsenter les proprits de lcran et les manipulations qui y sont associes Jusqu prsent vous auriez probablement raisonn ainsi Regrouper toutes les informations sur lcran dans un type structur tEcran par exemple 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 ou dans des tableaux Programmation procdurale - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 195
Pour rsumer en algorithmique vous cririez quelque chose ressemblant plus ou moins a Type Structure tEcran type chane marque chane modle chane diagonale entier hauteur reel largeur reel profondeur reel poids reel connecteur chane resolution tableau110 de chanes FinStruct Procdure changerresolution Procdure miseenveille Procdure rallumer Procdure regleraffichage 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 pourquoi ne pas associer les proprits dun objet et les traitements associs en un mme ensemble Quand vous programmez en objet la question se poser est quotSur quoi porte le programme quot La rponse est sur les crans Puisque le programme porte sur les crans pourquoi ne pas tenter de rpondre la question pose la fin du point prcdent La rponse est quotpourquoi pasquot et cest le but ou lun des buts de la programmation objet Vous avez dj indirectement crois plusieurs fois le chemin des objets Les chapitres prcdents vous ont montr des tableaux des structures des chanes de caractres des rfrences En Java tous ces lments sont des objets En fait tout ce que vous avez dclar avec le motcl quotnewquot est un objet Dans les exemples vous avez probablement remarqu que la saisie de chanes au clavier la lecture et lenregistrement de fichiers et mme les instructions ncessaires laffichage passent par des objets Si ce nest pas le cas le principe des structures devraient vous aider mieux comprendre 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 cohrentes sur un sujet bien prcis La structure tarticle contenait toutes les proprits dun article Vous accdez une information travers le point quotquot ou la flche quotquot si lenregistrement est une rfrence La structure code donc toutes les proprits dun objet rel ou abstrait Cependant tous les traitements associs sont dans des sousprogrammes part Maintenant regardez ces lignes issues de lexemple en Java sur les fichiers String ligne passwdcptlignesplitquotquot La variable ligne est une chane de caractres Pourtant vous avez limpression quelle est utilise comme un enregistrement de structures mais laide du point quotquot vous accdez non pas des enregistrements mais des fonctions associes la variable Pourquoi La rponse se trouve dans une dfinition de lobjet Dans les langages objet les donnes et les traitements qui manipulent ces donnes sont regroups au sein dune mme entit appele objet En Java les objets sont dcrits avec le motcl quotclassquot En algorithmique ils le sont avec le motcl quotclassequot Quelles sont les proprits dune chane de caractres La chane ellemme compose dune suite de caractres Quels sont les traitements applicables une chane Le calcul de sa longueur Programmation objet ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 196
le dcoupage en souschanes la concatnation avec une autre chane la recherche dune autre chane dedans lclatement de la chane selon un dlimiteur la conversion en minuscules ou majuscules la suppression des espaces avant et aprs etc Maintenant regroupez les proprits de la chane et tous les traitements possibles dessus en un seul tout Vous obtenez un objet Un programme objet est constitu dun ensemble dobjets qui communiquent entre eux par lmission et la rception de messages pour raliser le traitement final Ca parat impressionnant et compliqu comme a mais cest en fait trs simple Dans la ligne suivante passwdcptlignesplitquotquot lobjet appel ligne de type String reoit lordre associ sa fonction split dcouper sa chane selon le dlimiteur quotquot et retourner comme rsultat un tableau contenant les lments dcoups Mais qui lui envoie lordre Le programme principal Regardez comment dmarre un programme class chap7fic1 public static void main String args Votre programme principal Java est en fait une fonction particulire dune classe qui porte le nom de votre programme Quand vous excutez votre programme linterprteur Java cre un objet de la classe chap7fic1 et cherche dedans une fonction main pour lexcuter Cest donc lobjet une fonction de lobjet chap7fic1 qui demande un objet de type String de dcouper une chane en plusieurs morceaux et de lui retourner le tout dans un tableau Il y a donc bien une communication entre les objets et cest vous qui dites quoi faire Si vous navez pas encore bien compris alors ditesvous quun vritable objet en informatique est un peu comme un de la structure qui serait alors non plus la dfinition dun enregistrement mais dun objet 4 Classe objets Il est ncessaire de connatre quelques mots de vocabulaire pour dfinir un objet Un objet est dfini par Les donnes sur luimme ses proprits son tat Ce quil fait les traitements quil associe ses donnes ou les donnes reues des autres objets Comme les structures se dfinissent avec le motcl du mme nom la structure dun objet se dcrit avec le motcl quotClassequot pour classe dobjet Cette structure de lobjet dfinit ce que sera un objet de ce type La classe est le type de lobjet Un objet est une variable dont le type est sa classe Une classe est en fait un moule servant crer plusieurs objets Les objets issus dune mme classe sont diffrents les uns des autres parce que les valeurs de leurs proprits ne sont pas toujours les mmes ex un - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 197
objet de classe String en Java ne contient pas la mme chane de caractres quun autre objet String Comme il peut y avoir plusieurs objets de mme type de classe on dit quun objet est une instance de classe La dfinition dun objet est un peu comme celle dune structure sauf quelle est compose de deux parties Les attributs sont les proprits de lobjet cestdire les diffrentes variables qui dfinissent ce quil reprsente son tat Les mthodes sont les sousprogrammes fonctions ou procdures qui influent sur lobjet par exemple sur les attributs Ces deux parties sont appeles les membres de lobjet Les attributs sont des variables de nimporte quel type primitif tableau objet etc Les mthodes sont lquivalent des sousprogrammes vus jusqu prsent mais propres lobjet Classe monobjet attributs attr1 entier attr2 tableau110 de rels mthodes procdure afficher procdure effacer FinClasse Reprenez lexemple procdural sur lcran Voici ce que pourrait tre la classe de lobjet de type Ecran Type Classe Ecran attributs type Chane marque chane modle chane diagonale entier hauteur reel largeur reel profondeur reel poids reel connecteur chane resolution tableau110 de chanes mthodes Procdure changerresolution Procdure miseenveille Procdure rallumer Procdure regleraffichage Procdure affichemodle Procdure saisiemodle FinClasse 5 Dclaration et accs Un objet se dclare comme une variable ou un enregistrement sauf que le nom du type est le nom de la classe Var ecran1 Ecran ecran2 Ecran Vous pouvez aussi crer des tableaux dobjets Var ecrans tableau110 dEcrans ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 198
Et mme dclarer des pointeurs sur des objets puisque eux aussi occupent une zone mmoire 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 professeur vous limpose Vous accdez aux divers membres de lobjet en utilisant le point quotquot entre le nom de lobjet et ses membres exactement comme pour une structure La seule diffrence est quaprs le point vous navez plus forcment un champ un attribut mais aussi un sousprogramme une mthode Quand vous placez une mthode aprs le point vous lancez lexcution de celleci Type Classe Ecran FinClasse Programme obj1 Var o1 Ecran Dbut modification des attributs o1typequotLCDquot o1connecteurquotVGAquot accs direct aux attributs Afficher o1type appel aux mthodes o1miseenveille o1ralumer o1affichemodle Fin 6 Les mthodes Regrouper les fonctions et les donnes au sein dune mme structure appele objet est dj bien plus cohrent pour 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 cest totalement inutile la mthode quotsaitquot implicitement que lattribut auquel il accde appartient lobjet Classe Ecran attributs type chane mthodes Procdure modifietypeE t chane Dbut typet FinProc FinClasse Il arrive parfois que des noms dattributs soient identiques ceux dautres objets ou arguments passs en paramtres de mthodes Pour viter la confusion vous pouvez explicitement dsigner que le membre appartient votre objet en prcisant le mot cl quotthisquot suivi du point et de son nom This sera remplac par lobjet luimme lors de lappel Classe Ecran Procdure modifietypeE t chane Dbut thistypet FinProc FinClasse - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 199
En programmation objet pure il ny a plus de notion de programme principal et de sousprogrammes tous les traitements se font au sein des mthodes et mme le bloc dinstructions principal est une mthode au sein dune classe comme en Java Comme tous les composants dun programme sont des objets il stablit une communication entre les objets En pratique cest videmment vous qui initiez cette communication quand on dit quun premier objet demande quelque chose un second cest que lune des mthodes du premier objet appelle lune des mthodes du second Puisque tout est objet vous pouvez crer une instance du second objet comme attribut du premier ou mme passer des objets en arguments de mthodes Dans lexemple prcdent lobjet de type Ecran peut recevoir le message modifietype qui modifie lattribut type 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 nomparamtres et en dessous vous dfinissez la mthode Vous devez respecter la syntaxe suivante avec les doubles points quotquot entre le nom de la classe et la mthode Procdure classemethodeparams Par exemple Classe Ecran mthodes Procdure modifietypeE t chane FinClasse Procdure EcranmodifietypeE t chane Dbut thistypet FinProc 7 Porte des membres Dans le programme obj1 laccs aux divers membres attributs ou mthodes se fait directement Le programme accde aux membres en passant par lobjet et loprateur point Cest que dans la dfinition de la classe les membres sont bien souvent publics ils sont accessibles sans aucune protection Vous pouvez choisir de rendre les divers membres publics ou privs Par dfaut en Java par exemple si vous ne prcisez rien tous sont publics En algorithmique les attributs sont par dfaut privs et les mthodes publiques Public les membres sont directement accessibles depuis toute autre partie du programme ou objet comme dans les exemples prcdents via loprateur point Priv les membres ne sont plus accessibles depuis lextrieur de lobjet Ils sont seulement accessibles depuis lintrieur de lobjet Vous pouvez prciser dans les dclarations le type daccs vos membres Voici un exemple de la classe Ecran o les attributs sont privs donc accessibles uniquement depuis les mthodes de lobjet et les mthodes publiques Classe Ecran attributs privs type chane marque chane modle chane mthodes publiques Procdure regleraffichage Procdure affichemodle Procdure saisiemodle FinClasse Avec cette nouvelle dfinition vous ne pouvez plus utiliser le programme obj1 tel quel Vous devez le modifier Programme obj2 ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 200
Var o1Ecran Dbut Attributs privs accs depuis lextrieur interdit o1type quotLCDquot INTERDIT Accs direct aux attributs Afficher o1type INTERDIT Mthodes publiques accs autoris o1saisiemodlequotMultisync FE1250quoto1affichemodle 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 nest pas accessible depuis ceuxci mais comme public au sein de lobjet et des objets qui en drivent 8 Encapsulation des donnes Les membres peuvent tre publics ou privs La structure interne dun objet comporte un certain nombre dattributs et de mthodes qui lui sont propres qui refltent sa structure interne Des attributs et mthodes de lobjet ne sont utiles que pour dautres mthodes et donc ne doivent pas tre accessibles depuis lextrieur de lobjet De mme afin de laisser un seul point dentre aux divers attributs vous ne devriez pas permettre laccs ceuxci la fois directement et par des mthodes Une bonne pratique consiste interdire laccs public aux attributs Seules les mthodes y accdent et si vous voulez les manipuler vous dfinissez des mthodes publiques pour cela Vous vitez ainsi que le programmeur manipule directement la structure interne de votre objet et y mette nimporte quoi car vous pouvez effectuer un contrle au sein des mthodes Cest le principe de lencapsulation des donnes Les attributs sont privs ou protgs Vous les manipulez en passant par des mthodes publiques Lexemple modifi suivant met en vidence ce qui aurait pu poser un problme vous voulez modifier le type dcran En passant directement par un attribut public vous auriez pu mettre nimporte quoi dedans comme quotPLATquot Or la mthode modifietype vrifie avant ce que vous y mettez dans un choix prdfini crt lcd plasma Si le type que vous voulez ne correspond pas il est rejet Vous venez de blinder un peu votre objet en empchant quiconque de le quotcasserquot Vous reconnaissez maintenant limportance dans certains cas de lencapsulation des donnes Types Classe Ecran attributs privs typechane mthodes publiques Fonction modiftypemod chane boolen FinClasse Fonction Ecranmodiftypemod chane boolen Var tmod tableau13lt-quotCRTquotquotLCDquotquotPLASMAquot de chanes ok boolen i entier Dbut okFAUX i1 Tant que ilt3 ET NON ok Faire Si modtmodi Alors okVRAI FinSi ii1 FinTantQue Si ok Alors thistypemod - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 201
FinSi Retourne OK FinFonc Programme obj3 Var oEcran Ecran Dbut Si NON oEcranmodifietypequotPLATquot Alors Afficher quotErreur dans la modification du typequot FinSi Fin Les utilisateurs de vos classes nont pas toujours savoir comment sont dfinies cellesci ils nont accs quaux membres publics de votre classe Vous dfinissez en fait des interfaces la liste des mthodes depuis lesquelles les utilisateurs accdent indirectement aux attributs Les mthodes qui permettent de manipuler lobjet sont les mmes quelques soient les valeurs des attributs de lobjet Cest pourquoi un objet dont lattribut type est CRT ou LCD sutilise de la mme manire cest le principe dabstraction lutilisateur manipule nimporte quelle instance de classe sans rien connatre de sa complexit interne 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 Vous entendrez rgulirement parler de classes drives en programmation objet Quand une classe hrite dune autre elle rcupre tous ses attributs et mthodes On dit que la classe de base est une superclasse La classe drive hrite des membres de la superclasse Sauf que dans la classe drive vous pouvez rajouter des nouveaux attributs et des nouvelles mthodes et mme redfinir les mthodes de la classe de base cest une fonctionnalit majeure de la notion dobjet Soit une classe animal Classe animal attributs privs forme chane ordre chane mthodes publiques Procdure modifieordreE ordre chane FinClasse Le rgne animal est complexe et pourrat tre divis en normment de choses vertbrs invertbrs mamifres insectesou encore herbivores carnivores ou omnivores Ces trois derniers sont la base tous des animaux des classes de ce genre drivent de la classe animal Pour dclarer une classe qui drive dune autre respectez la syntaxe suivante Classe maClasse hrite de Superclasse attributs mthodes FinClasse Pour dfinir les classes herbivores carnivores ou omnivores vous hritez des proprits de base du sousrgne animal associ Classe herbivore hrite de animal FinClasse Classe carnivore hrite de animal FinClasse Classe omnivore hrite de animal ENI Editions - All rigths reserved - Jonifar lina - 9 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 202
FinClasse Avec lhritage 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 concevoir une classe de base la superclasse et crer deux classes qui hritent de celleci Donnez un ou deux noms danimaux dans chaque catgorie La vache est herbivore le cheval aussi Les deux nont pas le mme rgime et pas le mme nombre destomacs Vous pouvez les diffrencier dans deux classes diffrentes qui drivent de la classe herbivore 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 donc un ensemble de classes drives de plus en plus spcialises Dans une classe drive vous avez un accs direct aux membres tant les attributs que les mthodes de toutes les superclasses dorigine en cascade Donc ceci est correct partant du principe que omnivore drive de animal vous pouvez appeler la mthode modifieordre de la superclasse animal Programme obj4 Var o3herbivore Dbut o3modifieordremammifre Fin Rappelezvous cependant que laccs aux attributs dpend de leur protection Si les attributs de la superclasse sont privs une classe drive ne peut pas y accder directement Si elle est protge ou publique cest possible b Commerce Lavantage est de taille tellement quil existe pour des langages comme C ou Java des diteurs de logiciels spcialiss dans la vente de classes regroupes sous forme de bibliothques Il existe donc un commerce dobjets et comme les classes sont des moules rutilisables volont tout le monde y trouve son compte Vous trouverez ces produits sous le nom dAPI Application Programming Interface et il existe des API pour peu prs tous les domaines 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 tableaux ne vous suffit pas vous pourrez en trouver dautres qui proposeront tous les types de tri de reconstituer une chane dallouer dynamiquement des lments supplmentaires qui greront les listes chanes votre place etc Tout est possible En une phrase la grande force de lobjet est dtre rutilisable acclrant ainsi le dveloppement dapplication par lutilisation de composants dj tests et valids 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 relation hirarchique reprise sur la gnalogie Il y a des objets pre grandpre etc jusqu une classe de base 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 comme un arbre gnalogique une classe de base a tant de fils qui ont euxmmes tant de fils et ainsi de suite Cette hirarchie dcrit une arborescence Cest flagrant en Java o toutes les classes hritent la base dune seule superclasse appele Object Cette classe sert de prototype de base pour toutes les autres Toutes les classes proposes par dfaut par Java toutes les API du SDK drivent de la classe Object La classe Object propose des mthodes qui sont toutes rimplmentes dans les classes drives La classe Object est donc la superclasse de toutes les classes Java Si vous reprenez lexemple des rgimes alimentaires du rgne animal vous obtenez une arborescence de ce genre - 10 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 203
Hritage et hirarchies des classes d Simple ou multiple 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 classe Omnivore drivant des classes Carnivore et herbivore Cest possible Dans ce cas la nouvelle classe hrite des membres des deux classes pres Classe omnivore hrite de Herbivore Carnivore FinClasse Du coup la hirarchie devient Hritage multiple attention la complexit Cest possible mais cela pose souvent plus de problmes que a en rsout Les avis sont partags sur ce sujet Mais voici un bref exemple des implications un peu tordues gnres par lhritage multiple si deux mthodes de mme nom sont dfinies dans les deux superclasses et pas dans la classe drive quelle mthode doit tre appele si son nom est appel dans celleci Les langages proposent des astuces pour grer ce genre de cas mais a devient trs complexe Lhritage multiple a t implment dans le langage C mais pas en Java tout au moins pas directement une classe ne drive que dune seule classe ENI Editions - All rigths reserved - Jonifar lina - 11 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 204
Avant de vous lancer dans de lhritage multiple tentez de voir sil est possible de transformer la hirarchie en hritage simple dutiliser des classes instanciant comme attributs dautres classes ou dutiliser les interfaces Il ny a quasiment jamais dobligation utiliser lhritage multiple 10 Le polymorphisme a Principe Quand vous hritez dune classe vous pouvez depuis un objet de la nouvelle classe accder directement aux mthodes des superclasses de fait elles font toutes partie de la classe drive Pourtant il est probable que si vous avez driv de la superclasse cest que vous avez trouv un avantage rajouter des nouveaux attributs et des nouvelles mthodes Certaines de ces nouvelles mthodes remplacent peuttre les mthodes de la superclasse ou y font appel Le polymorphisme des mthodes est un autre concept essentiel de la programmation objet Polymorphisme signifie quune mme chose peut prendre plusieurs formes Certains animaux en font leur spcialit comme les abeilles chez une mme espce il y a trois formes dindividus la femelle reine les mles fauxbourdon et les ouvrires femelles striles Trois formes diffrentes pour la mme espce ou plutt la mme larve la base Du ct de lobjet le polymorphisme permet de crer plusieurs mthodes qui portent le mme nom On distingue trois types de polymorphisme b Le polymorphisme ad hoc Gnralement dans un langage procdural vous ne pouvez avoir quune seule procdure portant le mme nom dans un mme programme Si le sousprogramme Afficher doit tre utilis pour des donnes diffrentes vous devez soit ladapter en consquence soit crer autant de sousprogramme Afficherxxx o xxx nommerait le rle exact du sousprogramme En objet comme chaque dfinition de classe est indpendante de sa voisine vous pouvez rutiliser les mmes noms de mthodes dans des classes diffrentes puisquelles nont aucun rapport entre elles Classe lion hrite de Carnivore mthodes publiques Procdure affichenom FinClasse Classe Ecran mthodes publiques Procdure affichenom FinClasse c Le polymorphisme dhritage Vous avez le droit et cest souvent le cas de redfinir une mthode dune superclasse dans une classe drive avec le mme nom de mthode Une classe Object comme en Java dfinit des mthodes de base qui sont redfinies dans les classes drives en fonction des nouvelles proprits de celleci Un exemple classique est un jeu dchecs et ses pices Chaque pice du jeu a un nombre plus ou moins limit de mouvements autoriss Une classe pice va dfinir une mthode mouvement Les classes drives pion fou tour cavalier roi et reine vont contenir aussi une mthode mouvement qui dterminera leurs mouvements propres Classe Pice mthodes publiques Procdure mouvement Dbut Afficher quotMouvement de Picequot FinProc FinClasse Classe Tour hrite de Pice - 12 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 205
mthodes publiques Procdure mouvement Dbut Afficher quotMouvement de Tourquot FinProc FinClasse Quand vous allez dclarer un objet de type tour et que vous allez accder la mthode mouvement cest la mthode mouvement de Pice qui va tre appele et cest donc le message correspondant quotMouvement de Tourquot qui saffiche Programme obj5 var matour1 Tour Dbut Appel de mouvement de lobjet matour1 matour1mouvement Fin Vous pouvez explicitement faire appel la mthode de la superclasse Pice dont Tour drive laide du motcl super pour superclasse au sein de la ou des mthodes concernes Dans lexemple suivant la mthode mouvement de la classe Tour a t modifie pour appeler la mthode mouvement de Pice lissue de ce programme les deux messages sont affichs dabord celui pour Pice puis celui pour Tour Classe Tour hrite de Pice mthodes publiques Procdure mouvement Dbut Appel de mouvement de Pice supermouvement Afficher quotMouvement de Tourquot FinProc FinClasse Programme obj6 var matour1 Tour Dbut Appel de mouvement de lobjet matour1 matour1mouvement Fin Note en cas dhritage en cascade le motcl super se rapporte la classe mre cestdire celle dont drive directement la classe fille Pour remonter toute la hirarchie des classes vous devez utiliser le motcl super dans toutes les mthodes de toutes les classes prcdentes en cascade d Le polymorphisme paramtrique Chaque mthode au sein dune classe dispose dune signature particulire Cette signature est constitue du nom de la mthode des paramtres quelle prend et de la valeur quelle retourne Le langage objet se base sur cette signature pour appeler la bonne mthode Le principe de lobjet indique quil suffit quun seul de ces trois constituants de la signature varie pour que la mthode soit considre comme diffrente Vous pouvez faire par exemple varier le type de variable retourne par la mthode et aussi les paramtres mais pas le nom de celleci Voyezvous les implications directes Vous avez le droit de donner le mme nom plusieurs mthodes condition que le nombre ou les types des paramtres de cellesci ne soient pas identiques Soit une classe calcul qui redfinit des oprations sur divers types de variables entiers rels mais aussi chanes de caractres pour les concatner par exemple Dans cette classe vous voulez que quand vous appelez la mthode addition laddition des deux valeurs passes en paramtres soit effectue sans se soucier de leur type Cela ne reprsente aucun problme Lexemple suivant implmente ces trois mthodes et le programme principal y fait appel ENI Editions - All rigths reserved - Jonifar lina - 13 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 206
Classe calcul mthodes publiques Addition de deux entiers Fonction additionxy entiers entier Dbut Retourne xy FinFonc Addition de deux rels Fonction additionxy rels rel Dbut Retourne xy FinFonc Concatnation de deux chanes Fonction additionxy chanes chane Dbut Retourne xampy FinFonc FinClasse Programme obj7 Var oCalc Calcul Dbut Deux entiers Afficher oCalcaddition1020 Deux rels Affichier oCalcaddition3141592714984 Deux chanes Afficher oCalcadditionquotBonjourquot quotles amisquot Fin - 14 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0e85ikFCdzIgLAA-enidentnumber 207
Manipuler les objets 1 Les constructeurs a Dclaration Quand vous instanciez une classe cestdire quand vous crez un objet du type de classe donn il vous faut bien souvent appeler diverses mthodes pour remplir ses attributs avec les bonnes valeurs Pour reprendre lexemple de 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 modiftype modif marque modifmodle et ainsi de suite Il existe un moyen plus efficace et implicite de positionner les bonnes valeurs des attributs et deffectuer toute autre opration ncessaire ds linstanciation Ce moyen cest le constructeur 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 leurs bonnes valeurs initiales ou des valeurs par dfaut Un constructeur doit respecter les deux proprits suivantes Il porte le mme nom que la classe Il ne retourne pas de valeur 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 forcment obligatoire car aucune autre mthode ne doit avoir le mme nom que la classe b Appel implicite La classe Ecran se voit complte de deux constructeurs le premier ne reoit aucun paramtre et sera utilis lorsque lobjet ne reoit aucune valeur lors de sa cration Le second prend trois paramtres type marque modle pour les initialiser la cration de lobjet Un constructeur qui ne reoit aucun paramtre est appel le constructeur par dfaut Il est appel quand aucune valeur nest passe lobjet lors de sa cration Classe Ecran attributs privs type chane marque chane modle chane mthodes publiques Constructeur Ecran Dbut Afficher quotConstructeur par dfautquot thistypequotInconnuquot thismarquequotInconnuquot thismodlequotInconnuquot Fin Constructeur Ecrantmqmdl chanes Dbut Afficher quotConstructeur avec 3 argumentsquot thistypet thismarquemq thismodlemdl Fin FinClasse ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 208
Comment savoir quel constructeur va tre appel la cration de lobjet Cest vous de passer les bonnes valeurs lobjet ds son instanciation dclaration ou cration Dans lexemple suivant deux objets Ecran sont crs Le premier lest comme dhabitude cest le constructeur par dfaut sans paramtres qui sera appel Le second prend trois paramtres entre parenthses comme si vous passiez des paramtres une mthode cest le constructeur associ qui sera appel Programme obj8 Var Appel implicite Ecran o1Ecran Appel implicite Ecrantmqmdl o2EcranquotLCDquotquotLGquotquotL1915Squot Dbut o1affichemodle INCONNU o2affichemodle L1915S Fin lexcution sans avoir rien demand les deux messages au sein des constructeurs sont affichs les attributs disposent dj de valeurs places l par les constructeurs Avec une allocation dynamique cest pareil Programme obj9 Var poEcran pointeur sur Ecran Dbut poEcrannouveau EcranquotLCDquotquotLGquotquotL1915Squot poEcran-gtaffichemodle L1915S Fin c Lhritage Que se passetil lorsque vous instanciez un objet dune classe drive Si la classe drive na pas de constructeur cest celui de la superclasse qui est appel si cest possible paramtres identiques par exemple Si la classe drive dispose dun constructeur cest lui qui est appel Par dfaut si le constructeur dune classe drive est prsent le constructeur de la superclasse nest pas appel Cest vous dy faire appel explicitement Classe A Constructeur A Dbut Afficher quotJe suis Aquot Fin FinClasse Classe B hrite de A Constructeur B Dbut Afficher quotJe suis Bquot Fin FinClasse Programme obj10 Var o1 A o2 B Dbut - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 209
Fin Le programme obj10 cre deux objets et donne laffichage suivant Je suis A Je suis B Pour appeler explicitement le constructeur de A depuis B vous devez le faire explicitement au sein du constructeur de B via le motcl super Celuici remplaant lobjet superclasse il sutilise comme un objet Modifiez le constructeur de B ainsi Classe B hrite de A Constructeur B Dbut super Afficher quotJe suis Bquot Fin FinClasse Vous obtenez en relanant obj10 le rsultat suivant Je suis A Je suis A Je suis B Une nouvelle ligne correspondant lappel du constructeur de A depuis B est affiche L encore en cas dhritage en cascade vous devez appeler les constructeurs en cascade Il faut bien comprendre pourquoi lappel au constructeur de la superclasse nest pas automatique rien ne vous empche au sein du constructeur de la classe drive dinitialiser les attributs de la superclasse directement puisque sauf si ceuxci sont privs vous y avez accs directement Lappel implicite au constructeur de la superclasse risquerait de faire double emploi ou dcraser vos valeurs 2 Les destructeurs Tout comme le constructeur est appel la cration dun objet le destructeur est appel quand lobjet est dtruit ou lallocation dynamique libre Tous les langages ne proposent pas de destructeurs notamment Java mais proposent parfois des mthodes particulires appeles automatiquement quand lobjet nest plus utilis sortie de fonction quand lobjet est local remise NIL de sa valeur etc Le destructeur est rarement employ en algorithmique car les professeurs lenseignant ont souvent le langage Java 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 Quand vous navez plus besoin de lobjet et que vous le librez que se passetil pour ce pointeur Il faut librer aussi la zone alloue Le destructeur ressemble beaucoup au constructeur sauf que Il ny a quun seul destructeur Il ne prend pas de paramtres Son nom est compos dun tilde suivi du nom de la classe Vous le faites prcder du mot Destructeur Il dispose des mmes proprits pour les classes drives Vous devez ventuellement lappeler vousmme en cascade Classe B hrite de A Constructeur B Destructeur B ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 210
Dbut Appel explicite du destructeur de A superA Fin FinClasse Programme obj11 Var po1 pointeur sur B Dbut po1nouveau B appel implicite au constructeur Librer po1 appel implicite au destructeur Fin 3 Les membres statiques a Attributs Quand vous crez une instance de classe un objet chaque objet rsultant dispose de son propre espace mmoire et chaque attribut donn dispose donc de sa propre valeur totalement indpendante de celle du mme attribut dun autre objet Pourtant il peut y avoir des cas o vous voudrez partager un attribut commun tous les objets de ce type de classe Le cas dcole est celui o vous voulez connatre le nombre de fois o la classe a t instancie Dans le cas de la classe Ecran vous voudriez par exemple savoir combien dobjets de type Ecran ont t crs Pour a lattribut doit tre commun tous les objets et chaque objet doit pouvoir modifier la valeur de cet attribut valeur qui sera ensuite la mme pour tous les objets Cest le rle de lattribut statique Un attribut statique est un attribut qui nest cr quen un seul exemplaire et qui est commun tous les objets de la classe Vous le dclarez comme nimporte quel attribut sauf que vous lui rajoutez le motcl statique aprs son type Lattribut statique peut tre priv ou public Il peut tre important dinitialiser une valeur par dfaut pour un attribut statique Classe Ecran attributs privs nbecrans0 entier statique FinClasse Plutt que dutiliser this pour y accder vous utilisez le nom de la classe ellemme tant depuis lextrieur de lobjet si lattribut est public que de lintrieur Lexemple suivant montre les possibilits associes avec deux objets le constructeur rajoute 1 le destructeur soustrait 1 Les tapes intermdiaires affichent ltat de lattribut statique nbecrans Classe Ecran attributs publics nbecrans0 entier statique mthodes publiques Constructeur Ecran Dbut nbecransnbecran1 Fin Destructeur Ecran Dbut nbecransnbecran-1 Fin Procdure nbEcrans Dbut Afficher nbecrans FinProc FinClasse Programme obj11 - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 211
Var po1 pointeur sur Ecran po2 pointeur sur Ecran Dbut po1nouveau Ecran po1-gtnbEcrans 1 po2nouveau Ecran po2-gtnbEcrans 2 Afficher Ecrannbecrans Accs public 2 Librer po1 po2-gtnbEcrans 1 Librer po2 Afficher Ecrannbecrans Seul moyen ici 0 Fin 4 Classes et mthodes abstraites Il y a des fois o vous avez besoin de dfinir un prototype de classe dans laquelle vous allez dclarer des mthodes 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 diffrentes figures traces ont toutes leurs proprits comme leurs dimensions surface primtre volume couleur de 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 doivent disposer de ces mthodes Comment dcrire ceci en objet La solution consiste crire une classe de base qui deviendra la superclasse de toutes les figures gomtriques et qui va contenir tous les attributs de base comme la position de dpart xy du trac de la figure ses couleurs mais aussi toutes les mthodes non seulement de base mais qui doivent aussi obligatoirement tre implmentes dans toutes les classes qui en drivent Les mthodes de calcul de surface et de primtre doivent tre dclares dans cette classe Pourtant elles ne contiendront rien comme code ce sera la classe drive de les programmer Cette classe de base contenant des mthodes sans implmentation ne pourra pas tre instancie vous ne pourrez pas crer dobjet partir delle car elle est de fait inutilisable et ne sert que de base pour les mthodes drives 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 Pour crer une classe abstraite vous rajoutez le motcl quotabstraitequot aprs le nom de la classe Pour crer une mthode abstraite vous rajoutez le motcl quotabstraitequot avant son nom Classe figure abstraite attributs privs x rel y rel ccontour chane couleur contour cremp chane couleur remplissage surface rel primtre rel mthodes publiques Procdure setcolorcE couleur chane Dbut thisccontourcouleur Fin Fonction abstraite getSurface reel Fonction abstraite getPerimtre reel FinClasse partir du moment o une classe contient une mthode abstraite elle est ellemme abstraite La classe figure est abstraite elle contient des mthodes abstraites sans implmentation Elle contient aussi des mthodes qui ne sont ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 212
pas abstraites comme setcolorc qui naura pas forcment tre rimplmente dans les classes drives Il est de ce fait impossible de crer un objet de type figure Vous devez maintenant crer les classes qui en hritent Voici deux exemples simplifis de classes disque et rectangle Vous devez implmenter dedans les mthodes abstraites de la superclasse Note importante vous tes oblig dimplmenter dans la classe drive les mthodes abstraites de la superclasse Si vous ne souhaitez pas le faire vous devez de nouveau dclarer la mthode comme abstraite et la classe drive sera ellemme abstraite Classe disque hrite de figure attributs privs rayon rel mthodes publiques Constructeur disquecxcyr Dbut thisxcx thisycy thisrayonr Fin Fonction getSurface rel Dbut Retourne PIthisrayonthisrayon FinFonc Fonction getPerimtre rel Dbut Retourne 2PIthisrayon Fin FinClasse Classe rectangle hrite de figure attributs privs largeur rel hauteur rel mthodes publiques Constructeur rectanglecxcyrlrh Dbut thisxcx thisycy thislargeurrl thishauteurrh Fin Fonction getSurface rel Dbut Retourne thislargeurthishauteur FinFonc Fonction getPerimtre rel Dbut Retourne 2thislargeurthishauteur Fin FinClasse Les deux classes disque et rectangle ne comportant pas de mthodes abstraites elle ne sont pas abstraites et peuvent tre instancies 5 Interfaces Les classes abstraites sont des classes comportant des mthodes implmentes ou non Elles servent gnralement de superclasses dautres Il est possible de pousser le raisonnement plus loin questil ncessaire de faire pour crer une classe servant uniquement et entirement de prototype une classe Cette classe doit avoir les proprits suivantes Non instanciable Abstraite - 6 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 213
Ne contenant que des mthodes abstraites Ainsi toute classe drivant de cette classe spciale devrait obligatoirement implmenter toutes les mthodes Quel est lintrt Celui de dfinir un modle unique et complet de mthodes pour les classes qui dcident de les utiliser Ces types particuliers de classes sappellent des interfaces En pratique une classe nhrite pas dune interface mis base pour la lecture dun fichier multimdia lecture pause stop avance rapide retour rapide piste prcdente piste suivante Linterface ressemblerait ceci les paramtres des mthodes ne sont ici pas prciss Interface lecture mthodes publiques Procdure lecture Procdure pause Procdure stop Procdure avance Procdure retour Procdure prcdent Procdure suivant FinInterface Notez bien quune interface ne contient QUE des mthodes et rien dautre On dit quune classe qui dcide dutiliser une interface implmente les mthodes de linterface donc implmente linterface Vous utilisez ce mme motcl pour le prciser Classe titi implmente interface Vous pouvez dcider dimplmenter plusieurs interfaces au sein de votre classe dans ce cas vous sparez les noms des interfaces par des virgules 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 nest pas implmente doit tre dclare abstraite et la classe devient abstraite donc non instanciable La classe Musique rcupre linterface lecture Classe Musique implmente lecture attributs privs morceau chane piste chane position entier duree entier mthodes publiques Constructeur Musiquemp chanes Dbut thismorceaumorceau thispistep position0 Mthode de calcul dure du morceau en secondes dureedureemorceaumorceau Fin Dbut dimplmentation de linterface Procdure lecture Dbut FinProc Procdure pause Dbut Fin Procdure stop Dbut ENI Editions - All rigths reserved - Jonifar lina - 7 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 214
Fin Continuez ici FinClasse - 8 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE001NnFCdzIgLAA-enidentnumber 215
Lobjet en Java 1 Les langages objet Les deux parties prcdentes de ce chapitre vous ont prsent ce quest la programmation objet Il existe plusieurs langages orients Objet On parle de Programmation Oriente Objet POO Les prmices de la programmation objet sont anciennes pour de linformatique 1967 avec le langage Simula puis Smalltalk Lge dor dbute au dbut des annes 1980 avec tout dabord lObjective C encore trs utilis notamment dans le dveloppement de MacOS et de ses outils puis le quotC with Classes en 1983 qui deviendra le C puis Eiffel puis le Lisp Objet et ainsi de suite Les annes 1990 ont vu lexplosion de lobjet toutes les sauces pour le meilleur et pour le pire et pas uniquement dans les langages Ainsi des bases de donnes objet sont apparues Danciens langages comme le Pascal le Basic ou mme le COBOL ont volu vers lobjet Delphi Visual Basic Cobol Objet etc Mme les langages macros propres des suites bureautiques Ms Office OpenOfficeorg ou de base de donnes Access Paradox se targuent dtre des langages objet Si la dfinition de lobjet correspond peu prs ce qui vous a t prsent depuis le dbut de ce chapitre les puristes doivent dans certains cas bien rire Larrive de Java comme vrai langage objet de haut niveau a chang beaucoup de choses reprenant les bonnes ides du C il ladapte en un tout plus simple et plus pratique adapt aux besoins modernes des dveloppeurs et surtout des applications La force de SUN a t de proposer un langage adapt une large gamme de besoins des applets Java lapprentissage de lobjet les applications dportes les serveurs dapplications etc Le gros concurrent de la plateforme Java Java ses outils ses API etc se nomme NET avec le langage C prononcez C sharp et est videmment objet Les exemples de ce livre auraient parfaitement pu tre dvelopps en C sachant que le langage est maintenant disponible ailleurs que sous Windows La suite vous prsente des notions dobjet en Java Elle se limitera aux notions que vous avez rencontres depuis le dbut de ce chapitre Pour un meilleur apprentissage des fonctionnalits objet avances de Java les Editions ENI proposent des livres spcialiss dans ce domaine comme quotJ2SE les fondamentaux de la programmation Javaquot 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 de Pascal Danone 2 Dclaration des classes et objets Inconsciemment ou non vous utilisez lobjet dans Java depuis les premiers exemples de ce livre Dans le premier chapitre il vous a t demand de ne pas vous soucier ce moment de la dclaration du programme principal Ensuite des variables comme les chanes les tableaux et surtout les structures pour lesquelles il a t question de tricher sont des objets Enfin toutes les fonctions que vous avez pu soit utiliser directement soit crer sont des mthodes dobjets et quelques variables qui vous ont t prsentes comme globales sont des membres Pas trop surpris ni secou Non Tant mieux Autant faire le point tout de suite quasiment tout est objet en Java Une classe ses attributs et ses membres se dclarent ainsi class nomclasse 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 Vous remarquez que a ressemble trs fortement aux structures du chapitre 5 Et pour cause il a fallu tricher en Java pour utiliser une classe comme une structure La structure est en fait une classe uniquement compose dattributs publics do lexpression courante qui dit quune classe est une structure avec des fonctions Voici un exemple simplifi dimplmentation de la classe Ecran faisant apparatre deux constucteurs via le polymorphisme paramtrique et une mthode modiftype appele par lun des constructeurs ou do vous voulez puisque la mthode est publique Cet exemple fait aussi apparatre lutilisation dune variable statique et son utilisation ENI Editions - All rigths reserved - Jonifar lina - 1 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0d7pVCdzIgLAA-enidentnumber 216
depuis la mthode main class Ecran private String typemarquemodeleconnecteur private String resolutionnew String10 private int diagonale private float hauteurlargeurprofondeur poids static int nbecrans0 Constructeur par dfaut Ecran SystemoutprintlnquotConstructeur par dfautquot thistypequotInconnuquot thismarquequotInconnuquot thismodelequotInconnuquot thisnbecrans Constructeur avec 3 arguments EcranString t String mq String mdl SystemoutprintlnquotConstructeur avec trois argumentsquot modiftypet thismarquemq thismodelemdl thisnbecrans public boolean modiftypeString mod String tmodquotCRTquotquotLCDquotquotPLASMAquot Boolean okfalse forint i0ilttmodlengthi ifmodtmodi oktrue ifok thistypemod return ok public void affichetype Systemoutprintlnthistype Fonction statique static void nbEcrans Systemoutprintlnnbecrans class chap9ecran public static void mainString args Ecran o1 Allocation dynamique avec construction o1new EcranquotLCDquotquotLGquotquotL1915Squot Appel dune mthode o1affichetype Les deux lignes font la mme chose EcrannbEcrans Systemoutprintlno1nbecrans Contrairement lalgorithmique les attributs et mthodes ne sont pas regroups par blocs publics privs ou protgs Cest vous dajouter avant le nom et le type du membre sil est public priv ou protg Les dfinitions public et private sont exactement celles vues cidessus tandis que protected limite la porte des attributs aux classes drives Les constructeurs ici au nombre de deux sont dclars comme en pseudocode algorithmique mais sans prciser ni motcl particulier ni type de retour vous crivez seulement le nom de la classe suivi des paramtres - 2 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0d7pVCdzIgLAA-enidentnumber 217
Vous remarquez depuis le dbut du livre que la fonction principale main est en fait une mthode particulire dune classe pourtant trs classique La fonction main est statique elle peut tre appele hors de la classe directement cest dailleurs le but Le nom de la classe est celui du fichier rsultant sans lextension java ou class Si vous allez dans le rpertoire dossier o vous avez gnr le bytecode java les class vous devez remarquer que 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 Si vous supprimez le fichier Ecranclass plus rien ne marche 3 Hritage Java autorise lhritage simple mais pas lhritage multiple Vous verrez cependant quil est possible de ruser un petit peu avec les interfaces Lexemple des figures gomtriques peut sappliquer ici car Java supporte trs bien le polymorphisme et les classes et mthodes abstraites Lhritage est exactement comme en algorithmique sauf qu la place de quothrite dequot vous utilisez le motcl quotextendsquot Concernant les classes et mthodes abstraites vous rajoutez devant le nom le motcl quotabstractquot Notez que dans la dfinition de la classe abstraite quelques attributs privs sont remplacs par des attributs protgs Autrement les classes drives nauraient pas eu le droit dy accder Enfin notez aussi lutilisation du motcl quotsuperquot comme en algorithmique qui remplace la classe ou plutt lobjet hrite utilise ici pour appeler le constructeur de la classe figure charg de placer les bonnes couleurs Utilise dans un constructeur super doit tre la premire instruction appele abstract class figure protected double xysurfaceperimetre protected String ccontourcremp public final double PI31415927 Constructeur de figure figureString c1 String c2 setcolorcc1 setcolorrc2 public void setcolorcString couleur thisccontourcouleur public void setcolorrString couleur thiscrempcouleur Mthodes abstraites abstract public double getSurface abstract public double getPerimetre class disque extends figure private double rayon0 Constructeur disquedouble cx double cy double r appel du constructeur de figure superquotnoirquotquotblancquot thisxcx thisycy thisrayonr Implmentation des mthodes abstraites public double getSurface return thisPIthisrayonthisrayon public double getPerimetre return 2thisPIthisrayon ENI Editions - All rigths reserved - Jonifar lina - 3 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0d7pVCdzIgLAA-enidentnumber 218
class rectangle extends figure private double largeurhauteur Constructeur rectangledouble cxdouble cydouble rldouble rh appel du constructeur de figure superquotvioletquotquotmarronquot thisxcx thisycy thislargeurrl thishauteurrh Implmentation des mthodes abstraites public double getSurface return thislargeurthishauteur public double getPerimetre return 2thislargeurthishauteur class chap9heritage public static void mainString args disque o1 rectangle o2 o1new disque10010010 Systemoutprintlno1getSurface Systemoutprintlno1getPerimetre o2new rectangle10103525 Systemoutprintlno2getSurface Systemoutprintlno2getPerimetre 4 Interfaces de la classe suivi du nom de linterface 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 positiondureepiste MusiqueString m int p thismorceaum thispistep - 4 - ENI Editions - All rigths reserved - Jonifar lina enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0d7pVCdzIgLAA-enidentnumber 219
position0 Dbut dimplmentation de linterface public void lecture Systemoutprintlnquotlecture de quotthismorceau public void pause SystemoutprintlnquotPause quotposition public void stop SystemoutprintlnquotArrt piste quotthispiste public void avance SystemoutprintlnquotAvancequot public void retour Systemoutprintlnquotretourquot public void prcdent SystemoutprintlnquotPrcdentquot public void suivant SystemoutprintlnquotSuivantquot class chap9interface public static void mainString args Musique o1 o1new MusiquequotSomebody to lovequot10 o1lecture Une classe peut implmenter plusieurs interfaces dans ce cas sparez les noms des interfaces par des virgules Une interface peut hriter dune ou plusieurs autres interfaces via le motcl quotextendsquot suivi du nom de la ou des interfaces hrites 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 Ces deux derniers cas sont les seuls en Java o indirectement une sorte dhritage multiple a t mis en place dans le sens o une interface ou une classe peut hriter de plusieurs dfinitions de mthodes Cest simpliste dans le sens o de toute faon ces mthodes doivent tre implmentes obligatoirement dans la classe qui utilise les interfaces et que du coup Java na pas savoir sil doit utiliser telle ou telle mthode de lune des classes hrites ENI Editions - All rigths reserved - Jonifar lina - 5 - enidentnumber-AAEAAADAQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA8MzkxMTMyIC0gSm9uaWZhciBsaW5hIC0gYjFmZjY2YzEtOTA0Yy00Njc1LWI2ZTItMjc1ODEwOGQ1ZWE0d7pVCdzIgLAA-enidentnumber 220
تحميل

PDF

1557 مشاهدة.

Omar Ajouaou

Omar Ajouaou

Algorithmique - Techniques fondamentales de programmation
أرسلت .



كلمات مفتاحية :
alghorithme
alghorithme wetud docs ...