archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05 Le code de la...

311

Transcript of archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05 Le code de la...

Page 1: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Gyoza
vignette couverture

Le livre deJavapremier langage

CHEZ LE MEcircME EacuteDITEUR

DANS LA MEcircME COLLECTION

C DELANNOY ndash Le livre du C premier langage Pour les deacutebutants en programmation Ndeg8838 1994 280 pages

P CHALEacuteAT D CHARNAY ndash Programmation HTML et JavaScript Ndeg9182 1998 460 pages

C DELANNOY ndash Programmer en langage C Avec exercices corrigeacutesNdeg8985 1996 296 pages

C DELANNOY ndash La reacutefeacuterence du C norme ANSIISO Ndeg9036 1998 950 pages

C DELANNOY ndash Programmer en langage C++Ndeg9138 5e eacutedition 2000 648 pages

C DELANNOY ndash Apprendre le C++ avec Visual C++ 6Ndeg9088 1999 496 pages

C DELANNOY ndash Exercices en langage C++ Ndeg9067 2e eacutedition 1999 296 pages

C DELANNOY ndash Programmer en Turbo Pascal 70Ndeg8986 1993-1997 368 pages

PROGRAMMATION INTERNET

A PATZER et al ndash Programmation Java cocircteacute serveur Servlets JSP et EJB Ndeg9109 2000 984 pages

P CHAN ndash Le dictionnaire officiel Java 2 Ndeg9089 1999 890 pages

N MCFARLANE ndash JavaScript professionnelNdeg9141 2000 950 pages

J-C BERNADAC F KNAB ndash Construire une application XML Ndeg9081 1999 500 pages

A HOMER D SUSSMAN B FRANCIS ndash ASP 30 professionnel Ndeg9151 2000 1 150 pages

L LACROIX N LEPRINCE C BOGGERO C LAUER ndash Programmation Web avec PHP Ndeg9113 2000 382 pages

Anne Tasso

Le livre deJavapremier langage

EacuteDITIONS EYROLLES61 Bld Saint-Germain75240 Paris Cedex 05

wwweditions-eyrollescom

Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effetexpresseacutement la photocopie agrave usage collectif sans autorisation des ayantsdroit Or cette pratique sest geacuteneacuteraliseacutee notamment dans les eacutetablissementsdenseignement provoquant une baisse brutale des achats de livres au pointque la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et deles faire eacutediter correctement est aujourdhui menaceacutee

En application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou par-tiellement le preacutesent ouvrage sur quelque support que ce soit sans autorisation de lEacutedi-teur ou du Centre Franccedilais dexploitation du droit de Copie 20 rue des Grands Augustins75006 Pariscopy Eacuteditions Eyrolles 2001 Version eBook (ISBN) de louvrage 2-212-28032-7

DANGER

LEPHOTOCOPILLAGE

TUE LE LIVRE

Sun Sun Microsystems le logo Sun Java JDK sont des marques de fabriqueou des marques deacuteposeacutees de Sun Microsystems Inc

AVANT-PROPOS

Organisation de lrsquoouvrage

Ce livre est tout particuliegraverement destineacute aux deacutebutants qui souhaitent aborder lrsquoappren-tissage de la programmation en utilisant le langage Java comme premier langage

Les concepts fondamentaux de la programmation y sont preacutesenteacutes de faccedilon eacutevolutivegracircce agrave un deacutecoupage de lrsquoouvrage en trois parties chacune couvrant un aspect diffeacuterentdes outils et techniques de programmation

Le chapitre introductif laquo Naissance drsquoun programme raquo constitue le preacutealable neacutecessaireagrave la bonne compreacutehension des parties suivantes Il introduit aux meacutecanismes de cons-truction drsquoun algorithme compte tenu du fonctionnement interne de lrsquoordinateur etexplique les notions de langage informatique de compilation et drsquoexeacutecution agrave travers unexemple de programme eacutecrit en Java

La premiegravere partie concerne lrsquoeacutetude des laquo Outils et techniques de base raquo

bull Le chapitre 1 laquo Stocker une information raquo aborde la notion de variables et detypes Il preacutesente comment stocker une donneacutee en meacutemoire calculer des expressionsmatheacutematiques ou eacutechanger deux valeurs et montre comment le type drsquoune variablepeut influencer sur le reacutesultat drsquoun calcul

bull Le chapitre 2 laquo Communiquer une information raquo explique comment transmettre desvaleurs agrave lrsquoordinateur par lrsquointermeacutediaire du clavier et montre comment lrsquoordinateurfournit des reacutesultats en affichant des messages agrave lrsquoeacutecran

bull Le chapitre 3 laquo Faire des choix raquo examine comment tester des valeurs et prendre desdeacutecisions en fonction du reacutesultat Il traite de la comparaison de valeurs ainsi que delrsquoarborescence de choix

bull Le chapitre 4 laquo Faire des reacutepeacutetitions raquo est consacreacute agrave lrsquoeacutetude des outils de reacutepeacutetition etdrsquoiteacuteration Il aborde les notions drsquoincreacutementation et drsquoaccumulation de valeurs(compter et faire la somme drsquoune collection de valeurs)

La deuxiegraveme partie laquo Initiation agrave la programmation orienteacutee objet raquo introduit lesconcepts fondamentaux indispensables agrave la programmation objet

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageAVANT-PROPOS

VI

bull Le chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo montre lrsquointeacuterecirctde lrsquoemploi de fonctions dans la programmation Il examine les diffeacuterentes eacutetapes deleur creacuteation

bull Le chapitre 6 laquo Fonctions notions avanceacutees raquo deacutecrit tregraves preacuteciseacutement comment mani-puler les fonctions et leurs paramegravetres Il deacutefinit les termes de variable locale et declasse et explique le passage de paramegravetres par valeur

bull Le chapitre 7 laquo Les classes et les objets raquo explique agrave partir de lrsquoeacutetude de la classeString ce que sont les classes et les objets dans le langage Java Il montre ensuitecomment deacutefinir de nouvelles classes et construire des objets propres agrave lrsquoapplicationdeacuteveloppeacutee

bull Le chapitre 8 laquo Les principes du concept drsquoobjet raquo deacuteveloppe plus particuliegraverementcomment les objets se communiquent lrsquoinformation en expliquant notamment le prin-cipe du passage de paramegravetres par reacutefeacuterence Il deacutecrit ensuite les principes fondateursde la notion drsquoobjet crsquoest-agrave-dire lrsquoencapsulation des donneacutees (protection et controcircledes donneacutees constructeur de classe) ainsi que lrsquoheacuteritage entre classes

La troisiegraveme partie laquo Outils et techniques orienteacutes objet raquo donne tous les deacutetails surlrsquoorganisation le traitement et lrsquoexploitation intelligente des objets

bull Le chapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo concerne lrsquoorganisation desdonneacutees sous la forme drsquoun tableau de taille fixe

bull Le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo preacutesente les diffeacute-rents outils qui permettent drsquoorganiser dynamiquement en meacutemoire les ensembles dedonneacutees de mecircme nature Il est eacutegalement consacreacute aux diffeacuterentes techniquesdrsquoarchivage et agrave la faccedilon drsquoacceacuteder aux informations stockeacutees sous forme de fichiers

bull Le chapitre 11 laquo Dessiner des objets raquo couvre une grande partie des outils graphiquesproposeacutes par le langage Java Il analyse le concept eacuteveacutenement-action et deacutecritcomment reacutealiser une applet

Ce livre contient eacutegalement en annexe

bull Un guide drsquoutilisation du CD-Rom expliquant comment utiliser les outils proposeacutesdans le CD-Rom

bull Un index qui vous aidera agrave retrouver une information sur un thegraveme que vous recher-chiez (les mots-cleacutes du langage les exemples les principes de fonctionnement lesclasses et leurs meacutethodes etc)

copy copyright Eacuteditions Eyrolles

Table des matiegraveres

Avant-propos organisation de lrsquoouvrage V

Introduction naissance drsquoun programme 1

Construire un algorithme 1

Exemple lrsquoalgorithme du cafeacute chaud 2Vers une meacutethode 4

Passer de lrsquoalgorithme au programme 4

Qursquoest-ce qursquoun ordinateur 4Un premier programme en Java ou comment parler agrave un ordinateur 9

Exeacutecuter un programme 14

Compiler ou traduire en langage machine 14Compiler un programme eacutecrit en Java 15Les environnements de deacuteveloppement 17

Le projet laquo Gestion drsquoun compte bancaire raquo 17

Cahier des charges 18Les objets manipuleacutes 19La liste des ordres 20

Reacutesumeacute 20

Exercices 21

Apprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes 21Observer et comprendre la structure drsquoun programme Java 21Eacutecrire un premier programme Java 22

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

VIII

PARTIE 1

Les outils et techniques de base 23

CHAPITRE 1

Stocker une information 25

La notion de variable 25

Les noms de variables 26La notion de type 26Les types de base en Java 27Comment choisir un type de variable plutocirct qursquoun autre 30Deacuteclarer une variable 30

Lrsquoinstruction drsquoaffectation 31

Rocircle et meacutecanisme de lrsquoaffectation 31Deacuteclaration et affectation 32Quelques confusions agrave eacuteviter 33Eacutechanger les valeurs de deux variables 34

Les opeacuterateurs arithmeacutetiques 35

La prioriteacute des opeacuterateurs entre eux 36Le type drsquoune expression matheacutematique 37La transformation de types 37

Calculer des statistiques sur des opeacuterations bancaires 39

Cahier des charges 39Le code source complet 42Reacutesultat de lrsquoexeacutecution 42

Reacutesumeacute 43

Exercices 44

Repeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction 44Comprendre le meacutecanisme de lrsquoaffectation 44Comprendre le meacutecanisme drsquoeacutechange de valeurs 45Calculer des expressions mixtes 45Comprendre le meacutecanisme du cast 46

Le projet laquo Gestion drsquoun compte bancaire raquo 46

Deacuteterminer les variables neacutecessaires au programme 46

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

IX

CHAPITRE 2

Communiquer une information 49

La bibliothegraveque System 49

Lrsquoaffichage de donneacutees 50

Affichage de la valeur drsquoune variable 50Affichage drsquoun commentaire 50Affichage de plusieurs variables 51Affichage de la valeur drsquoune expression arithmeacutetique 51Affichage drsquoun texte 52

La saisie de donneacutees 54

La classe Lirejava 54

Reacutesumeacute 56

Exercices 57

Comprendre les opeacuterations de sortie 57Comprendre les opeacuterations drsquoentreacutee 58Observer et comprendre la structure drsquoun programme Java 58

Le projet laquo Gestion drsquoun compte bancaire raquo 59

Afficher le menu principal ainsi que ses options 59

CHAPITRE 3

Faire des choix 61

Lrsquoalgorithme du cafeacute chaud sucreacute ou non 61

Deacutefinition des objets manipuleacutes 62Liste des opeacuterations 62Ordonner la liste des opeacuterations 62

Lrsquoinstruction if-else 64

Syntaxe drsquoif-else 65Comment eacutecrire une condition 66Rechercher le plus grand de deux eacuteleacutements 67Deux erreurs agrave eacuteviter 69Des if-else imbriqueacutes 70

Lrsquoinstruction switch ou comment faire des choix multiples 72

Construction du switch 72Calculer le nombre de jours drsquoun mois donneacute 73Comment choisir entre if-else et switch 75

Reacutesumeacute 76copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

X

Exercices 77

Comprendre les niveaux drsquoimbrication 77Construire une arborescence de choix 78Manipuler les choix multiples geacuterer les caractegraveres 79

Le projet laquo Gestion drsquoun compte bancaire raquo 79

Acceacuteder agrave un menu suivant lrsquooption choisie 79

CHAPITRE 4

Faire des reacutepeacutetitions 81

Combien de sucre dans votre cafeacute 81

La boucle dowhile 8 3

Syntaxe 83Principes de fonctionnement 83Un distributeur automatique de cafeacute 84

La boucle while 89

Syntaxe 89Principes de fonctionnement 90Saisir un nombre entier au clavier 90

La boucle for 96

Syntaxe 96Principes de fonctionnement 96Rechercher le code Unicode drsquoun caractegravere donneacute 97Quelle boucle choisir 99

Reacutesumeacute 100

Exercices 102

Comprendre la boucle dohellipwhile 102Apprendre agrave compter accumuler et rechercher une valeur 102Comprendre la boucle while traduire une marche agrave suivre en programme Java 103Comprendre la boucle for 103

Le projet laquo Gestion drsquoun compte bancaire raquo 104

Rendre le menu interactif 104

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XI

PARTIE 2

Initiation agrave la programmation orienteacutee objet 105

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

Algorithme parameacutetreacute 108

Faire un theacute chaud ou comment remplacer le cafeacute par du theacute 108

Des fonctions Java preacutedeacutefinies 110

La librairie Math 110Exemples drsquoutilisation 111Principes de fonctionnement 113

Construire ses propres fonctions 114

Appeler une fonction 114Deacutefinir une fonction 115

Les fonctions au sein drsquoun programme Java 119

Comment placer plusieurs fonctions dans un programme 119Les diffeacuterentes formes drsquoune fonction 120

Reacutesumeacute 122

Exercices 124

Apprendre agrave deacuteterminer les paramegravetres drsquoun algorithme 124Comprendre lrsquoutilisation des fonctions 124Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction 125Eacutecrire une fonction simple 126

Le projet laquo Gestion drsquoun compte bancaire raquo 126

Deacutefinir une fonction 127Appeler une fonction 127

CHAPITRE 6

Fonctions notions avanceacutees 129

La structure drsquoun programme 129

La visibiliteacute des variables 130Variable locale agrave une fonction 132Variable de classe 134Quelques preacutecisions sur les variables de classe 135

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XII

Les fonctions communiquent 138

Le passage de paramegravetres par valeur 138Le reacutesultat drsquoune fonction 140Lorsqursquoil y a plusieurs reacutesultats agrave retourner 142

Reacutesumeacute 143

Exercices 144

Repeacuterer les variables locales et les variables de classe 144Communiquer des valeurs agrave lrsquoappel drsquoune fonction 145Transmettre un reacutesultat agrave la fonction appelante 146

Le projet laquo Gestion drsquoun compte bancaire raquo 146

Comprendre la visibiliteacute des variables 146Les limites du retour de reacutesultat 147

CHAPITRE 7

Les classes et les objets 149

La classe String une approche vers la notion drsquoobjet 149

Manipuler des mots en programmation 150Les diffeacuterentes meacutethodes de la classe String 151Appliquer une meacutethode agrave un objet 157

Construire et utiliser ses propres classes 159

Deacutefinir une classe et un type 159Deacutefinir un objet 163Manipuler un objet 164Une application qui utilise des objets Cercle 165

Reacutesumeacute 169

Exercices 170

Utiliser les objets de la classe String 170Creacuteer une classe drsquoobjets 170Consulter les variables drsquoinstance 170Analyser les reacutesultats drsquoune application objet 171

Le projet laquo Gestion drsquoun compte bancaire raquo 172

Traiter les chaicircnes de caractegraveres 172Deacutefinir le type Compte 172Construire lrsquoapplication Projet 173Deacutefinir le type LigneComptable 173Modifier le type Compte 173Modifier lrsquoapplication Projet 174

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIII

CHAPITRE 8

Les principes du concept drsquoobjet 175

La communication objet 175

Les donneacutees static 176Le passage de paramegravetres par reacutefeacuterence 178

Les objets controcirclent leur fonctionnement 183

La notion drsquoencapsulation 183La protection des donneacutees 184Les meacutethodes drsquoaccegraves aux donneacutees 185Les constructeurs 190

Lrsquoheacuteritage 192

La relation laquo est un raquo 192Le constructeur drsquoune classe heacuteriteacutee 194La protection des donneacutees heacuteriteacutees 195Le polymorphisme 196

Reacutesumeacute 197

Le projet laquo Gestion drsquoun compte bancaire raquo 198

Encapsuler les donneacutees drsquoun compte bancaire 198Comprendre lrsquoheacuteritage 199

PARTIE 3

Les outils et techniques orienteacutes objet 201

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

Les tableaux agrave une dimension 203

Deacuteclarer un tableau 204Manipuler un tableau 206

Quelques techniques utiles 208

La ligne de commande 208Trier un ensemble de donneacutees 212

Les tableaux agrave deux dimensions 218

Deacuteclaration drsquoun tableau agrave deux dimensions 218Acceacuteder aux eacuteleacutements drsquoun tableau 219

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIV

Reacutesumeacute 225

Exercices 226

Les tableaux agrave une dimension 226Les tableaux drsquoobjets 226Les tableaux agrave deux dimensions 227Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor 227

Le projet laquo Gestion drsquoun compte bancaire raquo 228

Traiter dix lignes comptables 228

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

La programmation dynamique 231

Les vecteurs 232Les dictionnaires 236

Lrsquoarchivage de donneacutees 242

La notion de flux 242Les fichiers textes 242Les fichiers drsquoobjets 247Geacuterer les exceptions 251

Reacutesumeacute 252

Exercices 254

Comprendre les vecteurs 254Comprendre les dictionnaires 254Geacuterer les erreurs 255

Le projet laquo Gestion drsquoun compte bancaire raquo 255

Les comptes sous forme de dictionnaire 255La sauvegarde des comptes bancaires 256La mise en place des dates dans les lignes comptables 256

CHAPITRE 11

Dessiner des objets 259

La librairie AWT 259

Les fenecirctres 260Le dessin 261Les eacuteleacutements de communication graphique 266

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XV

Les eacuteveacutenements 269

Les types drsquoeacuteveacutenements 269Exemple Associer un bouton agrave une action 271Exemple Fermer une fenecirctre 273Quelques principes 275

Les applets 275

Une page HTML 275Construire une applet 276Lrsquoutilitaire AppletViewer 277

Reacutesumeacute 278

Exercices 279

Comprendre les techniques drsquoaffichage graphique 279Apprendre agrave geacuterer les eacuteveacutenements 280

Le projet laquo Gestion drsquoun compte bancaire raquo 281

Calcul de statistiques 281Lrsquointerface graphique 282

Contenu et exploitation du CD-Rom 285

Index 287

copy copyright Eacuteditions Eyrolles

INTRODUCTION

Naissance drsquoun programme

Aujourdrsquohui lrsquoinformatique en geacuteneacuteral et lrsquoordinateur en particulier sont drsquoun usagecourant Gracircce agrave Internet lrsquoinformatique donne accegraves agrave une information mondiale Elledonne aussi la possibiliteacute de traiter cette information pour analyser geacuterer preacutevoir ouconcevoir des eacuteveacutenements dans des domaines aussi divers que la meacuteteacuteo la meacutedecinelrsquoeacuteconomie la bureautique etc

Cette communication et ces traitements ne sont possibles qursquoau travers de lrsquooutil informa-tique Cependant toutes ces faculteacutes reacutesultent davantage de lrsquoapplication drsquoun programmereacutesidant sur lrsquoordinateur que de lrsquoordinateur lui-mecircme En fait le programme est agravelrsquoordinateur ce que lrsquoesprit est agrave lrsquoecirctre humain

Creacuteer une application crsquoest apporter de lrsquoesprit agrave lrsquoordinateur Pour que cet esprit donnesa pleine mesure il est certes neacutecessaire de bien connaicirctre le langage des ordinateursmais surtout il est indispensable de savoir programmer La programmation est lrsquoartdrsquoanalyser un problegraveme afin drsquoen extraire la marche agrave suivre lrsquoalgorithme susceptible dereacutesoudre ce problegraveme

Crsquoest pourquoi ce chapitre commence par aborder la notion drsquoalgorithme Agrave partir drsquounexemple tireacute de la vie courante nous deacuteterminons les eacutetapes essentielles agrave lrsquoeacutelabora-tion drsquoun programme (laquo Construire un algorithme raquo) Agrave la section suivante laquo Qursquoest-ceqursquoun ordinateur raquo nous examinons le rocircle et le fonctionnement de lrsquoordinateur dans lepassage de lrsquoalgorithme au programme Nous eacutetudions ensuite agrave travers un exemplesimple comment eacutecrire un programme en Java et lrsquoexeacutecuter (laquo Un premier programmeen Java ou comment parler agrave un ordinateur raquo) Enfin nous deacutecrivons agrave la section Leprojet laquo Gestion drsquoun compte bancaire raquo le cahier des charges de lrsquoapplication projet quele lecteur assidu peut reacutealiser en suivant les exercices deacutecrits agrave la fin de chaque chapitre

Construire un algorithmeUn ordinateur muni de lrsquoapplication adeacutequate traite une information Il sait calculercompter trier ou rechercher lrsquoinformation dans la mesure ougrave un programmeur lui adonneacute les ordres agrave exeacutecuter et la marche agrave suivre pour arriver au reacutesultat

Cette marche agrave suivre srsquoappelle un algorithme copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

2

Deacuteterminer lrsquoalgorithme crsquoest trouver un cheminement de tacircches agrave fournir agrave lrsquoordinateurpour qursquoil les exeacutecute Voyons comment srsquoy prendre pour construire cette marche agravesuivre

Ne faire qursquoune seule chose agrave la fois

Avant de reacutealiser une application concregravete telle que celle proposeacutee en projet dans cetouvrage neacutecessairement complexe par la diversiteacute des tacircches qursquoelle doit reacutealisersimplifions-nous la tacircche en ne cherchant agrave reacutesoudre qursquoun problegraveme agrave la fois

Consideacuterons que creacuteer une application crsquoest deacutecomposer cette derniegravere en plusieurssous-applications qui agrave leur tour se deacutecomposent en micro-applications jusqursquoagravedescendre au niveau le plus eacuteleacutementaire Cette deacutemarche est appeleacutee analyse descen-dante Elle est le principe de base de toute construction algorithmique

Pour bien comprendre cette deacutemarche penchons-nous sur un problegraveme reacuteel et simple agravereacutesoudre comment faire un cafeacute chaud non sucreacute

Exemple lrsquoalgorithme du cafeacute chaudConstruire un algorithme crsquoest avant tout analyser lrsquoeacutenonceacute du problegraveme afin de deacutefinirlrsquoensemble des objets agrave manipuler pour obtenir un reacutesultat

Deacutefinition des objets manipuleacutes

Analysons lrsquoeacutenonceacute suivant

Comment faire un cafeacute chaud non sucreacute

Chaque mot a son importance et laquo non sucreacute raquo est aussi important que laquo cafeacute raquo oulaquo chaud raquo Le terme laquo non sucreacute raquo implique qursquoil ne soit pas neacutecessaire de prendre dusucre ni une petite cuillegravere

Remarquons que tous les ingreacutedients et ustensiles neacutecessaires ne sont pas citeacutes danslrsquoeacutenonceacute En particulier nous ne savons pas si nous disposons drsquoune cafetiegravere eacutelectriqueou non Pour reacutesoudre notre problegraveme nous devons prendre certaines deacutecisions et cesderniegraveres vont avoir une influence sur lrsquoallure geacuteneacuterale de notre algorithme

Supposons que pour reacutealiser notre cafeacute nous soyons en possession des ustensiles etingreacutedients suivants

cafeacute moulufiltreeaupichet cafetiegravere eacutelectriquetasseeacutelectriciteacutetable

En fixant la liste des ingreacutedients et des ustensiles nous deacutefinissons un environnementune base de travail Nous sommes ainsi en mesure drsquoeacutetablir une liste de toutes les actionsagrave mener pour reacutesoudre le problegraveme et de construire la marche agrave suivre permettantdrsquoobtenir un cafeacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

3

Liste des opeacuterationsVerser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtreRemplir le pichet drsquoeauPrendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique un filtre le pichet de la cafetiegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute remplisse le pichet Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le pichet dans la cafetiegravere

Cette eacutenumeacuteration est une description de toutes les actions neacutecessaires agrave la reacutealisationdrsquoun cafeacute chaud

Chaque action est un fragment du problegraveme donneacute et ne peut plus ecirctre deacutecoupeacutee Chaqueaction est eacuteleacutementaire par rapport agrave lrsquoenvironnement que nous nous sommes donneacute

En deacutefinissant lrsquoensemble des actions possibles nous creacuteons un langage minimal quinous permet de reacutealiser le cafeacute Ce langage est composeacute de verbes (Prendre PoserVerser Faire Attendrehellip) et drsquoobjets (Cafeacute moulu Eau Filtre Tassehellip)

La taille du langage crsquoest-agrave-dire le nombre de mots qursquoil renferme est deacutetermineacutee parlrsquoenvironnement Pour cet exemple nous avons en preacutecisant les hypothegraveses volontaire-ment choisi un environnement restreint Nous aurions pu deacutecrire des tacircches commelaquoprendre un contrat EDFraquo ou laquoplanter une graine de cafeacuteraquo mais elles ne sont pas utiles agravenotre objectif peacutedagogique

Telle que nous lrsquoavons deacutecrite la liste des opeacuterations ne nous permet pas encore de faireun cafeacute chaud En suivant cette liste tout y est mais dans le deacutesordre Pour reacutealiser cefameux cafeacute nous devons ordonner cette liste

Ordonner la liste des opeacuterations1 Prendre une cafetiegravere eacutelectrique2 Poser la cafetiegravere sur la table3 Prendre un filtre4 Poser le filtre dans la cafetiegravere5 Prendre du cafeacute moulu6 Verser le cafeacute moulu dans le filtre7 Prendre le pichet de la cafetiegravere8 Remplir le pichet drsquoeau 9 Verser lrsquoeau dans la cafetiegravere10 Poser le pichet dans la cafetiegravere 11 Brancher la cafetiegravere12 Allumer la cafetiegravere13 Attendre que le cafeacute remplisse le pichet14 Prendre une tasse15 Poser la tasse sur la table16 Eteindre la cafetiegravere17 Prendre le pichet de la cafetiegravere18 Verser le cafeacute dans la tasse

Lrsquoexeacutecution de lrsquoensemble ordonneacute de ces tacircches nous permet maintenant drsquoobtenir ducafeacute chaud non sucreacute

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

4

Remarquons que lrsquoordre drsquoexeacutecution de cette marche agrave suivre est important En effet silrsquoutilisateur reacutealise lrsquoopeacuteration 10 (Allumer la cafetiegravere) avant lrsquoopeacuteration 8 (Verserlrsquoeau dans la cafetiegravere) le reacutesultat est sensiblement diffeacuterent La marche agrave suivreainsi deacutesordonneacutee risque de deacuteteacuteriorer la cafetiegravere eacutelectrique

Cet exemple tireacute de la vie courante montre que pour reacutesoudre un problegraveme il est essen-tiel de deacutefinir les objets utiliseacutes puis de trouver la suite logique de tous les ordres neacuteces-saires agrave la reacutesolution dudit problegraveme

Vers une meacutethodeLa tacircche consistant agrave deacutecrire comment reacutesoudre un problegraveme nrsquoest pas simple Elledeacutepend en partie du niveau de difficulteacute du problegraveme et reacuteclame un savoir-faire la faccedilonde proceacuteder pour deacutecouper un problegraveme en actions eacuteleacutementaires

Pour aborder dans les meilleures conditions possibles la tacircche difficile drsquoeacutelaborationdrsquoun algorithme nous devons tout drsquoabord

bull deacuteterminer les objets utiles agrave la reacutesolution du problegraveme

bull construire et ordonner la liste de toutes les actions neacutecessaires agrave cette reacutesolution

Pour cela il est neacutecessaire

bull drsquoanalyser en deacutetail la tacircche agrave reacutesoudre

bull de fractionner le problegraveme en actions distinctes et eacuteleacutementaires

Ce fractionnement est reacutealiseacute en tenant compte du choix des hypothegraveses de travail Ceshypothegraveses imposent un ensemble de contraintes qui permettent de savoir si lrsquoactiondeacutecrite est eacuteleacutementaire et peut ne plus ecirctre deacutecoupeacutee

Cela fait nous avons construit un algorithme

Passer de lrsquoalgorithme au programmePour construire un algorithme nous avons deacutefini des hypothegraveses de travail crsquoest-agrave-diresupposeacute une base de connaissances minimales neacutecessaires agrave la reacutesolution du problegravemeAinsi le fait de prendre lrsquohypothegravese drsquoavoir du cafeacute moulu nous autorise agrave ne pas deacutecrirelrsquoensemble des tacircches preacuteceacutedant lrsquoacquisition du cafeacute moulu Crsquoest donc la connaissance delrsquoenvironnement de travail qui deacutetermine en grande partie la construction de lrsquoalgorithme

Pour passer de lrsquoalgorithme au programme le choix de lrsquoenvironnement de travail nrsquoestplus de notre ressort Jusqursquoagrave preacutesent nous avons supposeacute que lrsquoexeacutecutant eacutetait humainMaintenant notre exeacutecutant est lrsquoordinateur Pour eacutecrire un programme nous devonssavoir ce dont est capable un ordinateur et connaicirctre son fonctionnement de faccedilon agraveeacutetablir les connaissances et capaciteacutes de cet exeacutecutant

Qursquoest-ce qursquoun ordinateur Notre intention nrsquoest pas de deacutecrire en deacutetail le fonctionnement de lrsquoordinateur et de cescomposants mais drsquoen donner une image simplifieacutee

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

5

Pour tenter de comprendre comment travaille lrsquoordinateur et surtout comment il seprogramme nous allons scheacutematiser agrave lrsquoextrecircme ses meacutecanismes de fonctionnement

Un ordinateur est composeacute de deux parties distinctes la meacutemoire centrale et lrsquouniteacutecentrale

La meacutemoire centrale permet de meacutemoriser toutes les informations neacutecessaires agrave lrsquoexeacutecu-tion drsquoun programme Ces informations correspondent agrave des donneacutees ou agrave des ordres agraveexeacutecuter (instructions) Les ordres placeacutes en meacutemoire sont effectueacutes par lrsquouniteacutecentrale la partie active de lrsquoordinateur

Lorsqursquoun ordinateur exeacutecute un programme son travail consiste en grande partie agravegeacuterer la meacutemoire soit pour y lire une instruction soit pour y stocker une information Ence sens nous pouvons voir lrsquoordinateur comme un robot qui sait agir en fonction desordres qui lui sont fournis Ces actions en nombre limiteacute sont deacutecrites ci-dessous

Deacuteposer ou lire une information dans une case meacutemoire

La meacutemoire est formeacutee drsquoeacuteleacutements ou cases qui possegravedent chacune un numeacutero (uneadresse) Chaque case meacutemoire est en quelque sorte une boicircte aux lettres pouvant conte-nir une information (une lettre) Pour y deacuteposer cette information lrsquoordinateur (lefacteur) doit connaicirctre lrsquoadresse de la boicircte Lorsque le robot place une information dansune case meacutemoire il meacutemorise lrsquoadresse ougrave se situe celle-ci afin de retrouver lrsquoinforma-tion en temps neacutecessaire

Le robot sait deacuteposer une information dans une case mais il ne sait pas la retirer (au sensde prendre un courrier deacuteposeacute dans une boicircte aux lettres) Lorsque le robot prend lrsquoinfor-mation deacuteposeacutee dans une case meacutemoire il ne fait que la lire En aucun cas il ne la retireni ne lrsquoefface Lrsquoinformation lue reste toujours dans la case meacutemoire

Pour effacer une information drsquoune case meacutemoire il est neacutecessaire de placer unenouvelle information dans cette mecircme case Ainsi la nouvelle donneacutee remplace lrsquoancienneet lrsquoinformation preacuteceacutedente est deacutetruite

Figure Indash1

La meacutemoire de lrsquoordi-nateur est composeacutee de cases posseacutedant une adresse et pouvant contenir agrave tout moment une valeur

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

6

Exeacutecuter des opeacuterations simples telles que lrsquoaddition ou la soustraction

Le robot lit et exeacutecute les opeacuterations dans lrsquoordre ougrave elles lui sont fournies Pour faireune addition il va chercher les valeurs agrave additionner dans les cases meacutemoire approprieacutees(stockeacutees par exemple aux adresses a et b) et reacutealise ensuite lrsquoopeacuteration demandeacutee Ilenregistre alors le reacutesultat de cette opeacuteration dans une case drsquoadresse c De telles opeacutera-tions sont deacutecrites agrave lrsquoaide drsquoordres appeleacutes aussi instructions

Comparer des valeurs

Le robot est capable de comparer deux valeurs entre elles pour deacuteterminer si lrsquounedrsquoentre elle est plus grande plus petite eacutegale ou diffeacuterente de lrsquoautre valeur Gracircce agrave lacomparaison le robot est capable de tester une condition et drsquoexeacutecuter un ordre plutocirctqursquoun autre en fonction du reacutesultat du test

La reacutealisation drsquoune comparaison ou drsquoun test fait que le robot ne peut plus exeacutecuter lesinstructions dans leur ordre drsquoapparition En effet suivant le reacutesultat du test il doitrompre lrsquoordre de la marche agrave suivre en sautant une ou plusieurs instructions Crsquoestpourquoi il existe des instructions particuliegraveres dites de branchement Gracircce agrave ce typedrsquoinstructions le robot est agrave mecircme non seulement de sauter des ordres mais aussi derevenir agrave un ensemble drsquoopeacuterations afin de les reacutepeacuteter

Figure Indash2

Le programme exeacutecute les instructions dans lrsquoordre de leur apparition

Figure Indash3

Suivant le reacutesultat du test lrsquoordinateur exeacutecute lrsquoune ou lrsquoautre instruction en sautant celle qursquoil ne doit pas exeacutecuter

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

7

Communiquer une information eacuteleacutementaire

Un programme est essentiellement un outil qui traite lrsquoinformation Cette informationest transmise agrave lrsquoordinateur par lrsquoutilisateur Lrsquoinformation est saisie par lrsquointermeacutediairedu clavier ou de la souris Cette transmission de donneacutees agrave lrsquoordinateur est appeleacuteecommunication drsquoentreacutee (input en anglais) On parle aussi de saisie ou encore de lecturede donneacutees

Apregraves traitement le programme fournit un reacutesultat agrave lrsquoutilisateur soit par lrsquointermeacutediairede lrsquoeacutecran soit sous forme de fichiers que lrsquoon peut ensuite imprimer

Il srsquoagit alors de communication de sortie (output) ou encore drsquoaffichage ou drsquoeacutecriturede donneacutees

Coder lrsquoinformation

De par la nature de ses composants eacutelectroniques le robot ne perccediloit que deux eacutetats composant allumeacute et composant eacuteteint De cette perception deacutecoule le langage binairequi utilise par convention les deux symboles 0 (eacuteteint) et 1 (allumeacute)

Ne connaissant que le 0 et le 1 lrsquoordinateur utilise un code pour repreacutesenter une infor-mation aussi simple qursquoun nombre entier ou un caractegravere Ce code est un programmequi diffeacuterencie chaque type drsquoinformation et transforme une information (donneacutee numeacute-rique ou alphabeacutetique) en valeurs binaires Agrave lrsquoinverse ce programme sait aussi transfor-mer un nombre binaire en valeur numeacuterique ou alphabeacutetique Il existe autant de codesque de types drsquoinformations Cette diffeacuterenciation du codage (en fonction de ce qui doitecirctre repreacutesenteacute) introduit le concept de type de donneacutees

Signalons en outre que toute information fournie agrave lrsquoordinateur est au bout du comptecodeacutee en binaire Lrsquoinformation peut ecirctre un simple nombre ou une instruction deprogramme

Figure Indash4

La saisie au clavier drsquoune valeur correspond agrave une opeacuteration drsquoentreacutee et lrsquoaffichage drsquoun reacutesultat agrave une opeacuteration de sortie

Figure Indash5

Toute information est codeacutee en binaire Il existe autant de codes que de types drsquoinformations

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

8

Exemple

Pour additionner deux nombres lrsquoordinateur fait appel aux trois eacuteleacutements qui lui sontneacutecessaires pour reacutealiser cette opeacuteration Ces eacuteleacutements sont les suivants

bull Le code binaire repreacutesentant lrsquoopeacuteration drsquoaddition (par exemple 0101)

bull Lrsquoadresse de la case meacutemoire ougrave est stockeacute le premier nombre (par exemple 011101)

bull Lrsquoadresse de la case meacutemoire ougrave se trouve la deuxiegraveme valeur (par exemple 010101)

Pour finir lrsquoinstruction drsquoaddition de ces deux nombres srsquoeacutecrit en assemblant les troiscodes binaires (soit dans notre exemple 0101011101010101)

Remarquons que le code binaire associeacute agrave chaque code drsquoopeacuteration (addition test etc)nrsquoest pas neacutecessairement identique drsquoun ordinateur agrave un autre Ce code binaire est deacuteter-mineacute par le constructeur de lrsquoordinateur De ce fait une instruction telle que lrsquoadditionde deux nombres nrsquoa pas le mecircme code binaire drsquoune machine agrave une autre Il existedonc pour un mecircme programme un code binaire qui diffegravere suivant le type drsquoordinateurutiliseacute

Lrsquoordinateur nrsquoest qursquoun exeacutecutant

En pratique le robot est tregraves habile agrave reacutealiser lrsquoensemble des tacircches eacutenonceacutees ci-dessusIl les exeacutecute beaucoup plus rapidement qursquoun ecirctre humain

En revanche le robot nrsquoest pas doueacute drsquointelligence Il nrsquoest ni capable de choisir uneaction plutocirct qursquoune autre ni apte agrave exeacutecuter de lui-mecircme lrsquoensemble de ces actionsPour qursquoil puisse exeacutecuter une instruction il faut qursquoun ecirctre humain deacutetermine lrsquoinstruc-tion la plus approprieacutee et lui donne lrsquoordre de lrsquoexeacutecuter

Le robot est un exeacutecutant capable de comprendre des ordres Compte tenu de ses capaci-teacutes limiteacutees les ordres ne peuvent pas lui ecirctre donneacutes dans le langage naturel propre agravelrsquoecirctre humain En effet le robot ne comprend pas le sens des ordres qursquoil exeacutecute maisseulement leur forme Chaque ordre doit ecirctre eacutecrit avec des mots particuliers et uneforme ou syntaxe preacuteeacutetablie Lrsquoensemble de ces mots constitue un langage informati-que Les langages C C++ Pascal Basic Fortran Cobol et Java sont des langages deprogrammation constitueacutes de mots et drsquoordres dont la syntaxe diffegravere selon le langage

Pour eacutecrire un programme il est neacutecessaire de connaicirctre un de ces langages de faccedilon agravetraduire un algorithme en un programme composeacute drsquoordres

Figure Indash6

Pour un mecircme programme le code binaire diffegravere en fonction de lrsquoordinateur utiliseacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

9

Un premier programme en Java ou comment parler agrave un ordinateurPour creacuteer une application nous allons avoir agrave deacutecrire une liste ordonneacutee drsquoopeacuterationsdans un langage compreacutehensible par lrsquoordinateur La contrainte est de taille et se porteessentiellement sur la faccedilon de deacutefinir et de repreacutesenter les objets neacutecessaires agrave la reacutesolu-tion du problegraveme en fonction du langage de lrsquoordinateur

Pour bien comprendre la difficulteacute du travail agrave accomplir regardons comment fairecalculer agrave un ordinateur la circonfeacuterence drsquoun cercle de rayon quelconque

Calcul de la circonfeacuterence drsquoun cercle

Lrsquoexercice consiste agrave calculer le peacuterimegravetre drsquoun cercle de rayon quelconque Noussupposons que lrsquoutilisateur emploie le clavier pour transmettre au programme la valeurdu rayon

Deacutefinition des objets manipuleacutes

Pour calculer la circonfeacuterence du cercle lrsquoordinateur a besoin de stocker dans ses casesmeacutemoire la valeur du rayon ainsi que celle du peacuterimegravetre Les objets agrave manipuler sontdeux valeurs numeacuteriques appartenant agrave lrsquoensemble des reacuteels Nous appelons P lavaleur correspondant au peacuterimegravetre et R la valeur du rayon

La liste des opeacuterations

La circonfeacuterence drsquoun cercle est calculeacutee agrave partir de la formule P = 2 times π times R

La valeur du rayon est fournie par lrsquoutilisateur agrave lrsquoaide du clavier Elle nrsquoest donc pasconnue au moment de lrsquoeacutecriture du programme En conseacutequence il est neacutecessairedrsquoeacutecrire lrsquoordre (instruction) de saisie au clavier avant de calculer la circonfeacuterence

La liste des opeacuterations est la suivante

1 Reacuteserver deux cases meacutemoire pour y stocker les valeurs correspondant au rayon (R) et au peacuterimegravetre (P)

2 Demander agrave lrsquoutilisateur de saisir la valeur du rayon au clavier et la placer dans la case meacutemoire associeacutee

3 Connaissant la valeur du rayon calculer la circonfeacuterence4 Afficher le reacutesultat

La valeur du rayon puis apregraves calcul celle de la circonfeacuterence sont les donneacutees princi-pales de ce programme Lrsquoordinateur doit les stocker en meacutemoire pour les utiliser

Lrsquoopeacuteration 1 consiste agrave donner un nom aux cases meacutemoire qui vont servir agrave stocker cesdonneacutees Lors de cette opeacuteration appeleacutee deacuteclaration de variables lrsquoordinateur reacuteserveune case meacutemoire pour chaque nom de variable deacutefini Ici ces variables ont pour nom Pet R Au cours de cette reacuteservation drsquoemplacements meacutemoire lrsquoordinateur associe le nomde la variable et lrsquoadresse reacuteelle de la case meacutemoire

Pour le programmeur le nom et lrsquoadresse drsquoune case ne font qursquoun car il ne manipuleles variables que par leur nom alors que lrsquoordinateur travaille avec leur adresse Endonnant un nom agrave une case lrsquoecirctre humain sait facilement identifier les objets qursquoil mani-pule alors qursquoil lui serait peacutenible de manipuler les adresses binaires correspondantes

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

10

Inversement en associant un nom agrave une adresse codeacutee en binaire lrsquoordinateur peut veacuteri-tablement manipuler ces objets

Lrsquoopeacuteration 2 permet de saisir au clavier la valeur du rayon Pour que lrsquoutilisateur noninitieacute sache agrave quoi correspond la valeur saisie il est neacutecessaire avant de proceacuteder agrave cettesaisie drsquoafficher un message explicatif agrave lrsquoeacutecran Lrsquoopeacuteration 2 se deacutecompose en deuxinstructions eacuteleacutementaires agrave savoir

Afficher un message demandant agrave lrsquoutilisateur du programme de saisir une valeur pour le rayonUne fois la valeur saisie par lrsquoutilisateur la placer dans sa case meacutemoire

Les opeacuterations 3 et 4 sont des actions eacuteleacutementaires directement traduisibles en langageinformatique

La traduction en Java

Une application ou programme ne srsquoeacutecrit pas en une seule fois Nous verrons agrave lalecture de cet ouvrage que programmer crsquoest toujours deacutecomposer une difficulteacute endiffeacuterentes tacircches plus aiseacutees agrave reacutealiser Cette deacutecomposition srsquoapplique aussi bien pourconstruire un algorithme que pour lrsquoeacutecriture du programme lui-mecircme

Drsquoune maniegravere geacuteneacuterale la meilleure faccedilon de proceacuteder pour fabriquer un programmerevient agrave eacutecrire une premiegravere eacutebauche et agrave la tester De ces tests il ressort des fautes agravecorriger et surtout de nouvelles ideacutees Le programme final consiste en lrsquoassemblage detoutes ces corrections et de ces ameacuteliorations

Pour traduire la marche agrave suivre deacutefinie preacuteceacutedemment selon les regravegles de syntaxe dulangage Java nous allons utiliser cette mecircme deacutemarche Nous nous inteacuteresserons dansun premier temps agrave la traduction du cœur du programme (opeacuterations 1 agrave 4 deacutecrites agrave lasection preacuteceacutedente) Nous verrons pour finir comment inseacuterer lrsquoensemble de ces instruc-tions dans une structure de programme Java

bull Lrsquoopeacuteration 1 consiste agrave deacuteclarer les variables utiliseacutees pour le calcul de la circonfeacute-rence Cette opeacuteration se traduit par lrsquoinstruction

double R P

Par cette instruction le programme demande agrave lrsquoordinateur de reacuteserver deux casesmeacutemoire nommeacutees R et P pour y stocker les valeurs du rayon et de la circonfeacuterenceLe mot reacuteserveacute double permet de preacuteciser que les valeurs numeacuteriques sont reacuteelleslaquo avec une double preacutecision raquo crsquoest-agrave-dire avec une preacutecision pouvant aller jusqursquoagrave17 chiffres apregraves la virgule

Pour plus drsquoinformations sur la deacutefinition des types de variables reportez-vous au chapitre 1laquo Stocker une information raquo

bull Pour reacutealiser lrsquoopeacuteration 2 nous devons faire afficher un message demandant agrave lrsquoutili-sateur de saisir une valeur Cette opeacuteration se traduit par lrsquoinstruction

Systemoutprint(Valeur du rayon )

Systemoutprint() est ce que lrsquoon appelle un programme ou une fonction preacutedeacutefini

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

11

par le langage Java Ce programme permet drsquoeacutecrire agrave lrsquoeacutecran le message speacutecifieacute agravelrsquointeacuterieur des parenthegraveses Le message afficheacute est ici un fragment de texte appeleacutedans le jargon informatique une chaicircne de caractegraveres Pour que lrsquoordinateur com-prenne que la chaicircne de caractegraveres nrsquoest pas un nom de variable mais un texte agraveafficher il faut placer entre guillemets ( ) tous les caractegraveres composant la chaicircne

bull Lrsquoopeacuteration 2 est termineacutee lorsque la valeur demandeacutee est effectivement saisie etstockeacutee en meacutemoire Pour ce faire nous devons eacutecrire lrsquoinstruction suivante

R = Lired()

Lired()est un programme proposeacute par lrsquoauteur qui permet de communiquer unevaleur numeacuterique au programme par lrsquointermeacutediaire du clavier Ce programme estune fonction qui donne lrsquoordre agrave lrsquoordinateur drsquoattendre la saisie drsquoune valeur de dou-ble preacutecision La saisie est effective lorsque lrsquoutilisateur valide sa reacuteponse en appuy-ant sur la touche entreacutee du clavier Cette fonction nrsquoeacutetant pas preacutedeacutefinie par lelangage Java elle figure dans le CD-Rom livreacute avec le manuel

Une fois la valeur saisie elle est placeacutee dans la variable R gracircce au signe =

Pour plus de preacutecisions sur les deux meacutethodes Systemoutprint() et Lired()reportez-vous au chapitre 2 laquo Communiquer une information raquo Pour le signe = voir le chapitre 1laquo Stocker une information raquo

bull Lrsquoopeacuteration 3 permet de calculer la valeur de la circonfeacuterence Elle se traduit de lafaccedilon suivante

P = 2 MathPI R

Le signe est le symbole qui caracteacuterise lrsquoopeacuteration de multiplication MathPI est leterme qui repreacutesente la valeur numeacuterique du nombre π avec une preacutecision de17 chiffres apregraves la virgule Le mot-cleacute Math deacutesigne la bibliothegraveque de matheacutema-tiques accompagnant le langage Java Cette bibliothegraveque contient outre des con-stantes telles que π des fonctions standards comme sqrt() (racine carreacutee) ou sin()(sinus) Une fois les opeacuterations de multiplication effectueacutees la valeur calculeacutee estplaceacutee dans la variable P gracircce au signe =

bull La derniegravere opeacuteration (4) de notre programme a pour rocircle drsquoafficher le reacutesultat ducalcul preacuteceacutedent Cet affichage est reacutealiseacute gracircce agrave lrsquoinstruction

Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Ce deuxiegraveme appel agrave la fonction Systemoutprint() est plus complexe que le pre-mier Il meacutelange lrsquoaffichage de chaicircnes de caractegraveres (texte entre guillemets) et decontenu de variables

Si les caractegraveres R et P ne sont pas placeacutes entre guillemets crsquoest pour que lrsquoordinateurles interpregravete non pas comme des caractegraveres agrave afficher mais comme les variables quiont eacuteteacute deacuteclareacutees en deacutebut de programme De ce fait il affiche le contenu des vari-ables et non les lettres R et P

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

12

Les signes + qui apparaissent dans lrsquoexpression Le cercle de rayon + R + apour perimetre + P indiquent que chaque eacuteleacutement du message doit ecirctreafficheacute en le collant aux autres drsquoabord la chaicircne de caractegraveres Le cercle derayon puis la valeur de R puis la chaicircne a pour peacuterimegravetre et pour finir lavaleur de P

En reacutesumeacute la partie centrale du programme contient les cinq instructions suivantes

double R P Systemoutprint(Valeur du rayon ) R = Lired() P = 2 MathPI R Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Pour ameacuteliorer la lisibiliteacute du programme il est possible drsquoinseacuterer dans le programmedes commentaires comme suit

Deacuteclaration des variablesdouble R P Afficher le message Valeur du rayon agrave lrsquoeacutecranSystemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable RR = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacuteeP = 2 MathPI R Afficher le reacutesultatSystemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Les lignes du programme qui deacutebutent par les signes sont consideacutereacutees par lrsquoordinateurnon pas comme des ordres agrave exeacutecuter mais comme des lignes de commentaire Ellespermettent drsquoexpliquer en langage naturel ce que reacutealise lrsquoinstruction associeacutee

Eacutecrites de la sorte ces instructions constituent le cœur de notre programme Elles nepeuvent cependant pas encore ecirctre interpreacuteteacutees correctement par lrsquoordinateur En effetcelui-ci exeacutecute les instructions drsquoun programme dans lrsquoordre de leur arriveacutee Une appli-cation doit donc ecirctre constitueacutee drsquoune instruction qui caracteacuterise le deacutebut du programmePour ce faire nous devons eacutecrire notre programme ainsi

public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2 MathPI R Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la fonction main()

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

13

La ligne public static void main(String [] argument) est lrsquoinstruction qui permetdrsquoindiquer agrave lrsquoordinateur le deacutebut du programme Ce deacutebut est identifieacute par ce que lrsquoonappelle la fonction main() crsquoest-agrave-dire la fonction principale du programme De cettefaccedilon lorsque le programme est exeacutecuteacute lrsquoordinateur recherche le mot-cleacute main Unefois ce mot-cleacute trouveacute lrsquoordinateur exeacutecute une agrave une chaque instruction constituant lafonction

Les autres mots-cleacutes tels que public static ou void deacuteterminent certaines caracteacuteris-tiques de la fonction main() Ces mots-cleacutes obligatoirement placeacutes et eacutecrits dans cetordre sont expliqueacutes au fur et agrave mesure de leur apparition dans le livre et plus particuliegrave-rement agrave la section laquo Quelques techniques utiles raquo du chapitre laquo Collectionner un nombrefixe dobjets raquo

Pour finir nous devons inseacuterer la fonction main() dans ce qui est appeleacute une classe JavaEn programmation objet un programme nrsquoest exeacutecutable que srsquoil est deacutefini agrave lrsquointeacuterieurdrsquoune classe Une classe est une entiteacute interpreacuteteacutee par lrsquoordinateur comme eacutetant uneuniteacute de programme qursquoil peut exeacutecuter degraves qursquoun utilisateur le souhaite

Aucun programme ne peut ecirctre eacutecrit en dehors drsquoune classe Nous devons donc placer lafonction main() agrave lrsquointeacuterieur drsquoune classe deacutefinie par lrsquoinstruction public class Cercle comme suit

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2MathPIR Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la classe Cercle

Nous obtenons ainsi le programme dans son inteacutegraliteacute La ligne public class Cerclepermet de deacutefinir une classe Puisque notre programme effectue des opeacuterations sur uncercle nous avons choisi drsquoappeler cette classe Cercle Nous aurions pu lui donner untout autre nom comme Rond ou Exemple Ainsi deacutefinie la classe Cercle devient unprogramme agrave part entiegravere

Pour voir le reacutesultat de lrsquoexeacutecution de ce programme reportez-vous agrave la section laquo Exemple surplate-forme Unix raquo ci-apregraves

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

14

En observant la Figure 7 nous remarquons que ce programme de mecircme que tous ceuxagrave venir est constitueacute de deux blocs encastreacutes deacutefinis par les deux lignes public classCercle et public static void main(String [] argument)

Ces deux blocs constituent la charpente principale et neacutecessaire agrave tout programme eacutecritavec le langage Java Cet exemple montre en outre que les mots reacuteserveacutes par le langageJava sont nombreux et varieacutes et qursquoils constituent une partie du langage Java

Si la syntaxe crsquoest-agrave-dire la forme de ces instructions peut paraicirctre eacutetrange de primeabord nous verrons agrave la lecture de cet ouvrage que leur emploi obeacuteit agrave des regravegles strictesEn apprenant ces regravegles et en les appliquant vous pourrez vous initier aux techniques deconstruction drsquoun programme qui reviennent agrave deacutecomposer un problegraveme en actionseacuteleacutementaires puis agrave traduire celles-ci agrave lrsquoaide du langage Java

Exeacutecuter un programmeNous avons eacutecrit un programme constitueacute drsquoordres dont la syntaxe obeacuteit agrave des regraveglesstrictes Pour obtenir le reacutesultat des calculs deacutecrits dans le programme nous devons lefaire lire par lrsquoordinateur crsquoest-agrave-dire lrsquoexeacutecuter

Pour cela nous devons traduire le programme en langage machine En effet nouslrsquoavons vu lrsquoordinateur ne comprend qursquoun seul langage le langage binaire

Compiler ou traduire en langage machineCette traduction du code source (le programme eacutecrit en langage informatique) en codemachine exeacutecutable (le code binaire) est reacutealiseacutee par un programme appeleacute compila-teur Lrsquoopeacuteration de compilation consiste agrave lancer un programme qui lit chaque instruc-tion du code source et veacuterifie si celles-ci ont une syntaxe correcte Srsquoil nrsquoy a pas drsquoerreurle compilateur creacutee un code binaire directement exeacutecutable par lrsquoordinateur

Il existe autant de compilateurs que de langages Un programme eacutecrit en langage Pascalest traduit en binaire agrave lrsquoaide drsquoun compilateur Pascal et un programme eacutecrit en Java estcompileacute par un compilateur Java Le compilateur Java ne travaille pas tout agrave fait commeun compilateur classique traduisant un code source en code exeacutecutable Pour mieuxcomprendre cette diffeacuterence voyons son fonctionnement et comment lrsquoutiliser

Figure Indash7

Un programme Java est constitueacute de deux blocs encastreacutes Le premier bloc repreacutesente la classe associeacutee au programme tandis que le second deacutetermine la fonction principale

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

15

Compiler un programme eacutecrit en Java

Lrsquoobjectif premier de J Gosling le creacuteateur du langage Java a eacuteteacute de reacutealiser un langageindeacutependant de lrsquoordinateur Dans cette optique un programme eacutecrit sur PC par exem-ple doit pouvoir srsquoexeacutecuter sur un PC (de type IBM) un Macintosh (Apple) ou unestation Unix (de type Sun) et ce sans reacuteeacutecriture ni compilation du code source

Or le code binaire est speacutecifique de chaque machine comme nous lrsquoavons vu agrave lasection laquo Coder lrsquoinformation raquo Il est impossible de faire tourner un mecircme programmesource drsquoune machine agrave une autre sans le compiler agrave nouveau En effet lors de lanouvelle compilation des erreurs apparaissent dues aux diffeacuterences de mateacuteriel infor-matique Pour corriger cet inconveacutenient majeur lrsquoideacutee de JGosling a eacuteteacute de creacuteer uncode intermeacutediaire entre le code source et le code binaire Ce code intermeacutediaire estappeleacute pseudo-code ou encore byte code

En effet en creacuteant un pseudo-code identique pour tous les ordinateurs il est possibledrsquoexeacutecuter ce code sur diffeacuterentes machines sans avoir agrave le recompiler Cette exeacutecutionest reacutealiseacutee par un programme speacutecifique de la machine utiliseacutee qui interpregravete et exeacutecutele pseudo-code compte tenu des ressources propres de lrsquoordinateur

Ce programme srsquoappelle un interpreacuteteur Java Il en existe autant que de types drsquoordina-teurs (plates-formes) Lrsquoensemble des ces interpreacuteteurs constitue ce que lrsquoon appelle lamachine virtuelle Java ou JVM (Java Virtual Machine)

Le compilateur Java ne creacutee pas de code binaire agrave la diffeacuterencedes autres compilateurstels que les compilateurs C ou C++ Il fabrique un pseudo-code qui est ensuite inter-preacuteteacute par un programme speacutecifique de lrsquoordinateur Ce dernier programme transforme lepseudo-code en code directement exeacutecutable par lrsquoordinateur choisi Lrsquoavantage drsquoun telsystegraveme est que le deacuteveloppeur drsquoapplications est certain de creacuteer des programmes tota-lement compatibles avec les diffeacuterents ordinateurs du marcheacute sans avoir agrave reacuteeacutecrire unepartie du code

Le kit de deacuteveloppement Java (JDK)

Le tout premier compilateur Java a eacuteteacute eacutecrit par J Gosling agrave lrsquoinitiative de Sun le cons-tructeur de stations de travail sous Unix au deacutebut des anneacutees 90

Figure Indash8

Le compilateur (javac) transforme le code source en pseudo-code Ce dernier est exeacutecuteacute gracircce agrave un interpreacuteteur (java) speacutecifique de chaque type de machine Lrsquoensemble des interpreacuteteurs constitue la JVM

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

16

Aujourdrsquohui le compilateur Java est teacuteleacutechargeable depuis le site Internet de Sun Il estfourni avec le kit de deacuteveloppement Java (JDK Java Development Kit ou encore SDKSandard Development Kit) Cet environnement est disponible sur les ordinateurs de typeSolaris PC sous Windows 9598 ou NT et Mac OS Si vous souhaitez installer le JDK survotre machine consultez sur le CD-Rom fourni avec louvrage le fichier laquo outils raquo

Le JDK est ce que lrsquoon appelle une boicircte agrave outils de deacuteveloppement drsquoapplications Celarevient agrave dire qursquoil est constitueacute drsquooutils ou programmes que lrsquoon utilise sous forme decommande ou ordre Pour transmettre une commande agrave un ordinateur le programmeurdoit saisir le nom de cette commande au clavier dans une fenecirctre speacutecifique du typedrsquoordinateur utiliseacute Les deux principales commandes agrave connaicirctre pour cet ouvrage sontles commandes de compilation (javac) et drsquoexeacutecution (java)

Exemple sur plate-forme Unix

La marche agrave suivre est la suivante

1 Entrez le programme qui calcule la circonfeacuterence drsquoun cercle (exemple donneacute agrave lasection laquo Eacutecrire un programme raquo) agrave lrsquoaide drsquoun eacutediteur de texte crsquoest-agrave-dire un logi-ciel permettant de saisir du texte au clavier Les eacutediteurs de texte les plus couram-ment utiliseacutes sous Unix sont vi et emacs

2 Sauvegardez votre programme en choisissant comme nom de fichier celui qui suitles termes public class Pour notre exemple nous avons eacutecrit public classCercle Le fichier est donc agrave sauvegarder sous le nom Cerclejava

3 Agrave partir du CD-Rom fourni avec lrsquoouvrage copiez le fichier Lirejava dans votrereacutepertoire de travail La preacutesence de ce fichier est neacutecessaire pour que lrsquoordinateurdemande la saisie drsquoune valeur au clavier Pour plus drsquoinformations reportez-vousau chapitre 2 laquo Communiquer une information raquo

4 Lancez lrsquoordre de compilation en saisissant sous Unix la commande

javac Cerclejava

La compilation est lanceacutee Le compilateur exeacutecute sa tacircche et compile les fichiersCerclejava et Lirejava Au final si aucune erreur nrsquoest deacutetecteacutee le compilateurcreacutee un nouveau fichier appeleacute Cercleclass ainsi qursquoun fichier Lireclass Cesdeux fichiers correspondent au pseudo-code relatif agrave chacun des programmes com-pileacutes

5 Exeacutecutez le programme en lanccedilant la commande

java Cercle

La commande java lance le programme qui interpregravete le pseudo-code creacuteeacute agrave lrsquoeacutetapepreacuteceacutedente Ce programme traduit le pseudo-code dans le code binaire conforme agrave lamachine sur laquelle il est lanceacute Apregraves exeacutecution le reacutesultat obtenu agrave lrsquoeacutecran est

Valeur du rayon 55Le cercle de rayon 5 a pour perimetre 3141592653589793

ougrave 55 est une valeur entreacutee au clavier par lrsquoutilisateurcopy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

17

Pour exeacutecuter un programme les deux eacutetapes suivantes sont neacutecessaires

bull La compilation du programme agrave lrsquoaide de la commande javac suivie du nom duprogramme Une fois la commande reacutealiseacutee le pseudo-code est creacuteeacute et enregistreacute dansun fichier dont le nom correspond au nom du programme suivi de lrsquoextensionlaquo class raquo

bull Lrsquoexeacutecution du programme en appelant lrsquointerpreacuteteur au moyen de la commandejava suivie du nom du programme (sans extension) Cette commande interpregravete lefichier laquo class raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente et exeacutecute le programme

Les environnements de deacuteveloppementLe JDK fournit un ensemble de commandes pour compiler et interpreacuteter Crsquoest un environ-nement courant et facile drsquoemploi dans le monde Unix Il lrsquoest beaucoup moins en revan-che sous Windows 9598NT En effet lrsquoeacutecriture drsquoune commande telle que donner lrsquoordrede compiler un programme ne peut se reacutealiser qursquoen ouvrant une fenecirctre laquo CommandesMS-DOS raquo

Un certain nombre drsquoenvironnements de programmation permettent cependant drsquoeacutecrirede compiler puis drsquoexeacutecuter de faccedilon conviviale un programme Java Citons agrave titredrsquoexemples les environnements de travail tels que le logiciel Kawa (Tek-Tools) sur PCou Visual Cafeacute (Symantec) sur Macintosh

Ces logiciels offrent sous forme drsquointerface graphique conviviale un ensemble drsquooutilsde deacuteveloppement drsquoapplications Les outils les plus utiliseacutes sont en geacuteneacuteral lessuivants

bull Lrsquoeacutediteur de texte pour eacutecrire le programme

bull Les menus et boicirctes agrave outils pour lancer la compilation et lrsquoexeacutecution

bull La fenecirctre de compilation qui affiche les eacuteventuelles erreurs de syntaxe

bull La fenecirctre drsquoexeacutecution qui affiche les messages et reacutesultats du programme en cours

bull La fenecirctre qui visualise les projets en cours dans le cas drsquoun programme deacutefini agrave partirde plusieurs fichiers diffeacuterents

Vous trouverez toutes les informations neacutecessaires au teacuteleacutechargement de ces interfaces dans lefichier laquo Outils raquo preacutesent sur le CD-Rom fourni avec louvrage

Le projet laquo Gestion drsquoun compte bancaire raquo Pour vous permettre de mieux maicirctriser les diffeacuterentes notions abordeacutees dans cetouvrage nous vous proposons de construire une application plus eacutelaboreacutee que lessimples exercices appliqueacutes donneacutes en fin de chapitre

Dans ce projet nous avons volontairement eacuteviteacute lrsquoemploi drsquointerfaces graphiques Bienqursquoattrayantes ces derniegraveres sont difficiles agrave maicirctriser pour des deacutebutants en program-mation Le projet consiste agrave bacirctir une application autour du concept de menu interactifAgrave lrsquoheure du tout-graphique il nrsquoest pas vain drsquoapprendre agrave eacutecrire des menus laquo texte raquoLe fait de passer par cet apprentissage permet drsquoappreacutehender toutes les notions fonda-

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

18

mentales de la programmation sans avoir agrave srsquoeacutevertuer agrave eacutetudier la syntaxe de toutes lesmeacutethodes de la librairie graphique Java

Cahier des chargesIl srsquoagit drsquoeacutecrire une application interactive qui permet de geacuterer lrsquoensemble des comptesbancaires drsquoune personne Les fonctionnaliteacutes fournies par le programme de gestion decomptes bancaires sont les suivantes

Creacuteation Suppression drsquoun compteAffichage drsquoun compte donneacuteSaisie drsquoune ligne comptable pour un compte donneacuteCalcul de statistiquesSauvegarde des donneacutees (ndeg de compte lignes comptables)

Niveau 1 programme interactif sous forme de choix dans un menu

Lrsquoexeacutecution du programme affiche le menu suivant

1 Creacuteer un compte2 Afficher un compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Lrsquoutilisateur choisit une valeur pour exeacutecuter lrsquoopeacuteration souhaiteacutee

bull Si lrsquoutilisateur choisit lrsquooption 1 les informations agrave fournir concernent

Le type du compte [Types possibles Compte courant joint eacutepargne]Le numeacutero du compteLa premiegravere valeur creacutediteacutee Le taux de placement dans le cas drsquoun compte eacutepargne

bull Si lrsquoutilisateur choisit lrsquooption 2 le programme affiche les caracteacuteristiques drsquouncompte (type valeur courante taux) ainsi que les dix derniegraveres opeacuterations compta-bles dans lrsquoordre des dates ougrave ont eacuteteacute effectueacutees les opeacuterations

bull Pour lrsquooption 3 il srsquoagit de fournir des informations pour creacuteer une ligne comptableCes informations sont les suivantes

Le numeacutero du compte concerneacute (avec veacuterification de son existence)La somme agrave creacutediter (valeur positive) ou agrave deacutebiter (valeur neacutegative)La date de lrsquoopeacuterationLe motif de lrsquoachat ou de la vente [thegravemes possibles Salaire Loyer

Alimentation Divers]Le mode de paiement[Types possibles CB ndeg du Chegraveque Virement]

bull Lrsquooption 4 Sortir du menu geacuteneacuteral permet de sortir du programme

bull Lrsquooption 5 Aide du menu geacuteneacuteral affiche une information relative agrave chaque option dumenu

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

19

Niveau 2 structure de donneacutees optimiseacutee en termes drsquoutilisation de la meacutemoire

bull Le programme doit pouvoir geacuterer autant de comptes que neacutecessaire Pour chaquecompte le nombre drsquoopeacuterations comptables doit ecirctre infini et est donc indeacuteterminableau moment de lrsquoeacutecriture du programme

bull En conseacutequence la reacuteservation des cases meacutemoire ne peut pas ecirctre reacutealiseacutee de faccedilondeacutefinitive en tout deacutebut de programme Agrave chaque ligne comptable et agrave chaque nouveaucompte creacuteeacutes le programme doit ecirctre capable de reacuteserver lui-mecircme le nombre suffi-sant drsquoemplacements meacutemoire pour la bonne marche du programme Lorsque leprogramme gegravere lui-mecircme la reacuteservation des emplacements meacutemoire on dit qursquoilgegravere sa meacutemoire de maniegravere dynamique

bull Lrsquooption permettant la suppression drsquoun compte est deacutependante de la faccedilon dont eststockeacutee lrsquoinformation Cette option ne peut ecirctre abordeacutee avant drsquoavoir choisi le modede gestion des emplacements meacutemoire

bull Lrsquooption 5 Sortir du menu geacuteneacuteral doit controcircler la sauvegarde de lrsquoinformation Lesdonneacutees sont sauvegardeacutees sur disque sous forme drsquoun fichier portant le nom comptedat

Niveau 3 srsquoinitier aux graphiques

Un nouveau choix est ajouteacute agrave lrsquooption 2 Afficher un compte du menu geacuteneacuteral ilsrsquoagit drsquoafficher les statistiques pour un compte donneacute sous diffeacuterentes formes graphi-ques (histogramme camembert etc)

Les objets manipuleacutesUn compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero du compte

bull un type de compte ( courant eacutepargne joint etc)

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Nous verrons au chapitre 1 laquo Stocker une information raquo puis tout au long du chapitre 7laquo Les classes et les objets raquo comment deacutefinir et repreacutesenter les objets utiles et neacutecessai-res agrave la reacutealisation de cette application

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Caractegravere

Type du compte Courant Caractegravere

Valeur ndash 1 52030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Caractegravere

Moyen de paiement CB Caractegravere

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

20

La liste des ordresPour creacuteer une application de gestion de comptes bancaires nous devons deacutecomposerlrsquoensemble de ses fonctionnaliteacutes en tacircches eacuteleacutementaires Pour ce faire nous partageonslrsquoapplication en trois niveaux de difficulteacute croissante Les niveaux 1 et 2 doivent ecirctreabordeacutes dans cet ordre et sont neacutecessaires agrave la reacutealisation du niveau 3 La mise en œuvredu niveau 1 permet de reacutealiser les actions suivantes

bull construire un menu (voir les chapitres 2 laquo Communiquer une information raquo et 3laquo Faire des choix raquo)

bull creacuteer des comptes diffeacuterents ou saisir plusieurs lignes comptables (voir leschapitres 4 laquo Faire des reacutepeacutetitions raquo et 9 laquo Collectionner un nombre fixe drsquoobjets raquo)

bull deacutefinir les comptes et les lignes comptables comme des objets informatiques au sensde la programmation objet (voir les chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecri-ture drsquoune fonction raquo et 7 laquo Les classes et les objets raquo)

Pour reacutesoudre le niveau 2 nous allons apprendre les tacircches suivantes

bull geacuterer la meacutemoire de lrsquoordinateur (voir les chapitres 9 laquo Collectionner un nombre fixedrsquoobjets raquo et 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

bull sauvegarder des informations pour que celles-ci ne disparaissent pas une fois lrsquoordi-nateur eacuteteint (voir le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

Le niveau 3 va nous initier aux opeacuterations suivantes bull calculer des statistiques (voir les chapitres 1 laquo Stocker une information raquo et 9

laquo Collectionner un nombre fixe drsquoobjets raquo)

bull dessiner en particulier des histogrammes (voir le chapitre 11 laquo Dessiner desobjets raquo)

Lrsquoeacutetude eacutetape par eacutetape de lrsquoensemble de cet ouvrage va nous permettre de reacutealiser cetteapplication

ReacutesumeacuteEn informatique reacutesoudre un problegraveme crsquoest trouver la suite logique de tous lesordres neacutecessaires agrave la solution dudit problegraveme Cette suite logique est appeleacutee algo-rithme

La construction drsquoun algorithme passe par lrsquoanalyse du problegraveme avec pour objectifde le deacutecouper en une succession de tacircches simplifieacutees et distinctes Ainsi agrave partir delrsquoeacutenonceacute clair preacutecis et eacutecrit en franccedilais drsquoun problegraveme nous devons accomplir lesdeux opeacuterations suivantes

bull Deacutecomposer lrsquoeacutenonceacute en eacutetapes distinctes qui conduisent agrave lrsquoalgorithme

bull Deacutefinir les objets manipuleacutes par lrsquoalgorithme

Une fois lrsquoalgorithme construit il faut laquo eacutecrire le programme raquo crsquoest-agrave-dire traduirelrsquoalgorithme de faccedilon qursquoil soit compris par lrsquoordinateur En effet un programmecrsquoest un algorithme traduit dans un langage compreacutehensible par les ordinateurs

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

21

ExercicesApprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes

Eacutecrivez la marche agrave suivre qui explique comment accrocher un tableau au centredrsquoun mur Pour cela vous devez

a Deacutefinir les objets neacutecessaires agrave la reacutesolution du problegraveme

b Eacutetablir la liste des opeacuterations

c Ordonner cette liste

Plusieurs solutions sont possibles mais chacune doit rester logique agrave lrsquoeacutegard des hypothegraveses prisesen a Par exemple un clou et une perceuse ne vont pas ensemble

Observer et comprendre la structure drsquoun programme JavaObservez le programme suivant

public class Premier

Un ordinateur est composeacute des deux eacuteleacutements principaux suivants

bull La meacutemoire centrale qui sert agrave meacutemoriser des ordres ainsi que des informationsmanipuleacutees par le programme Scheacutematiquement on peut dire qursquoelle estcomposeacutee drsquoemplacements repeacutereacutes chacun par un nom (cocircteacute programmeur) et parune adresse (cocircteacute ordinateur)

bull Lrsquouniteacute centrale qui exeacutecute une agrave une les instructions du programme dans leurordre de lecture Elle constitue la partie active de lrsquoordinateur Ces actions ennombre limiteacute sont les suivantes

ndash deacuteposer une information dans une case meacutemoire

ndash exeacutecuter des opeacuterations simples telles que lrsquoaddition la soustraction etc

ndash comparer des valeurs

ndash communiquer une information eacuteleacutementaire par lrsquointermeacutediaire du clavier ou delrsquoeacutecran

ndash coder lrsquoinformation

Du fait de la technologie toutes les informations manipuleacutees par un ordinateur sontcodeacutees en binaire (0 ou 1) Pour srsquoaffranchir du langage machine binaire on faitappel agrave un langage de programmation dit eacutevolueacute tel que les langages Pascal C ouJava Un tel programme se compose drsquoinstructions deacutefinies par le langage dontlrsquoenchaicircnement reacutealise la solution du problegraveme poseacute

Pour traduire ce programme dans le langage binaire directement exeacutecutable par lrsquoordi-nateur nous devons utiliser un programme approprieacute appeleacute compilateur ou interpreacute-teur Dans cet ouvrage nous nous proposons drsquoeacutetudier comment construire unprogramme en prenant comme support de langage le langage et le compilateur Java

I1

I2

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

22

public static void main(String [] argument) double a Systemoutprint(Entrer une valeur ) a = Lired() Systemoutprint( Vous avez entre + a)

a Repeacuterez les instructions deacutefinissant la fonction main() et celles deacutelimitant la classePremier

b Recherchez les instructions drsquoaffichage

c Quel est le rocircle de lrsquoinstruction double a

d Deacutecrivez lrsquoexeacutecution de ce programme en supposant que lrsquoutilisateur entre auclavier la valeur 10

En suivant la structure ci-dessous et en vous aidant du programme donneacute agrave lasection laquo Calcul de la circonfeacuterence drsquoun cercle raquo eacutecrivez un programme quicalcule le peacuterimegravetre drsquoun carreacute (rappel peacuterimegravetre = 4 times cocircteacute)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe

public static void main(String [] argument) Deacuteclaration des variables repreacutesentant le peacuterimegravetre et le cocircteacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le message Valeur du cocircteacute agrave lrsquoeacutecran helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Lire au clavier une valeur placer cette valeur dans la variable correspondante helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le peacuterimegravetre du carreacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

Eacutecrire un premier programme JavaEn suivant la structure de lrsquoexercice preacuteceacutedent eacutecrivez un programme qui calculela surface drsquoun rectangle (rappel surface = largeur times longueur)

En observant la formule

a Combien de variables faut-il deacuteclarer pour exeacutecuter le calcul

b Combien de valeurs faut-il saisir au clavier

I3

I4

copy copyright Eacuteditions Eyrolles

PARTIE 1

Les outils et techniques de base

CHAPITRE 1

Stocker une information 25

CHAPITRE 2

Communiquer une information 49

CHAPITRE 3

Faire des choix 61

CHAPITRE 4

Faire des reacutepeacutetitions 81

copy copyright Eacuteditions Eyrolles

1Stocker une information

En deacutecrivant au chapitre introductif laquo Naissance drsquoun programme raquo lrsquoalgorithme deconfection drsquoun cafeacute chaud non sucreacute nous avons constateacute que la toute premiegravere eacutetapepour construire une marche agrave suivre consistait agrave deacuteterminer les objets utiles agrave la reacutesolutiondu problegraveme En effet pour faire du cafeacute nous devons prendre le cafeacute lrsquoeau le filtre etc

De la mecircme faccedilon lorsqursquoun deacuteveloppeur drsquoapplications conccediloit un programme il doit nonpas laquoprendreraquo au sens litteacuteral du mot les donneacutees numeacuteriques mais deacutefinir ces donneacuteesainsi que les objets neacutecessaires agrave la reacutealisation du programme Cette deacutefinition consiste agravenommer ces objets et agrave deacutecrire leur contenu afin qursquoils puissent ecirctre stockeacutes en meacutemoire

Crsquoest pourquoi nous eacutetudions dans ce chapitre ce qursquoest une variable et comment la deacutefi-nir (laquo La notion de variable raquo) Nous examinons ensuite agrave la section laquo Lrsquoinstructiondrsquoaffectation raquo comment placer une valeur dans une variable par lrsquointermeacutediaire delrsquoinstruction drsquoaffectation Enfin nous analysons lrsquoincidence du type des variables sur lereacutesultat drsquoun calcul arithmeacutetique (laquo Les opeacuterateurs arithmeacutetiques raquo)

Afin de clarifier les explications vous trouverez tout au long du chapitre des exemplessimples et concis Ces exemples ne sont pas des programmes complets mais de simplesextraits qui eacuteclairent un point preacutecis du concept abordeacute Vous trouverez en fin de chapi-tre (laquo Calculer des statistiques sur des opeacuterations bancaires raquo) un programme entier quiaborde et reacutesume toutes les notions rencontreacutees au fil de ce chapitre

La notion de variableUne variable permet la manipulation de donneacutees et de valeurs Elle est caracteacuteriseacutee parles eacuteleacutements suivants

bull Un nom qui sert agrave repeacuterer un emplacement en meacutemoire dans lequel une valeur estplaceacutee Le choix du nom drsquoune variable est libre Il existe cependant des contraintesque nous preacutesentons agrave la section laquo Les noms de variables raquo

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

26

bull Un type qui deacutetermine la faccedilon dont est traduite la valeur en code binaire ainsi que lataille de lrsquoemplacement meacutemoire Nous examinons ce concept agrave la section laquo La notionde type raquo Plusieurs types simples sont preacutedeacutefinis dans le langage Java et nous endeacutetaillons les caracteacuteristiques agrave la section laquo Les types de base en Java raquo

Les noms de variablesLe choix des noms de variables nrsquoest pas limiteacute Il est toutefois recommandeacute drsquoutiliserdes noms eacutevocateurs Par exemple les noms des variables utiliseacutees dans une applicationqui gegravere les codes-barres de produits vendus en magasin sont plus certainementlaquo article prix codebarre raquo que laquo xyz1 xyz2 xyz3 raquo Les premiers en effet eacutevoquentmieux lrsquoinformation stockeacutee que les seconds

Les contraintes suivantes sont agrave respecter dans lrsquoeacutecriture des noms de variables

bull Le premier caractegravere drsquoune variable doit obligatoirement ecirctre diffeacuterent drsquoun chiffre

bull Aucun espace ne peut figurer dans un nom

bull Les majuscules sont diffeacuterentes des minuscules et tout nom de variable posseacutedant unemajuscule est diffeacuterent du mecircme nom eacutecrit en minuscule

bull Les caractegraveres amp ~ rsquo ( ) [ ] - | ` ^ = sect ltgt pound ainsi que et ne peuvent ecirctre utiliseacutes dans lrsquoeacutecriture drsquoun nom de variable

bull Tout autre caractegravere peut ecirctre utiliseacute y compris les caractegraveres accentueacutes le caractegraverede soulignement (_) et les caractegraveres $ et micro

bull Le nombre de lettres composant le nom drsquoune variable est indeacutefini Neacuteanmoinslrsquoobjectif drsquoun nom de variable eacutetant de renseigner le programmeur sur le contenu dela variable il nrsquoest pas courant de rencontrer des noms de variables de plus de trentelettres

Exemples

La notion de typeUn programme doit geacuterer des informations de nature diverse Ainsi les valeurs tellesque 123 ou 24 sont de type numeacuterique tandis que Spinoza est un mot composeacute de carac-tegraveres Si lrsquoecirctre humain sait drsquoun simple coup drsquoœil faire la distinction entre un nombreet un mot lrsquoordinateur nrsquoen est pas capable Le programmeur doit donc laquo expliquer raquo agravelrsquoordinateur la nature de chaque donneacutee Cette explication passe par la notion de type

Le type drsquoune valeur permet de diffeacuterencier la nature de lrsquoinformation stockeacutee dans unevariable

Nom de variable autoriseacute Nom de variable interdit

compte

num_2 ( _ et non pas - )undeux (et non pas un deux)VALEUR_temporaire

Val$solde

pourquoipas caractegravere interdit2001espace pas de chiffre en deacutebut de variable-plus caractegravere - interditadresse caractegravere interditahah caractegravere interdit

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

27

Agrave chaque type sont associeacutes les eacuteleacutements suivants

bull Un code speacutecifique permettant la traduction de lrsquoinformation en binaire et reacuteciproque-ment

bull Un ensemble drsquoopeacuterations reacutealisables en fonction du type de variable utiliseacute Parexemple si la division est une opeacuteration coheacuterente pour deux valeurs numeacuteriques ellene lrsquoest pas pour deux valeurs de type caractegravere

bull Un intervalle de valeurs possibles deacutependant du codage utiliseacute Par deacutefinition agravechaque type correspond un mecircme nombre drsquooctets et par conseacutequent un nombrelimiteacute de valeurs diffeacuterentes

En effet un octet est un regroupement de 8 bits sachant qursquoun bit ne peut ecirctre qursquoun 0 ouun 1 Lorsqursquoune donneacutee est codeacutee sur 1 octet elle peut prendre les valeurs 00000000(8 zeacuteros) ou encore 111111111 (8 un) et toutes les valeurs intermeacutediaires entre ces deuxextrecircmes (par exemple 10101010 11110000 ou 10010110)

En fait une donneacutee codeacutee sur 8 bits peut par le jeu des combinaisons de 0 et de 1 pren-dre 28 valeurs diffeacuterentes soit 256 valeurs possibles comprises entre ndash 128 et 127Lrsquointervalle [ndash 128 127] est en effet composeacute de 256 valeurs et possegravede autant devaleurs positives que neacutegatives

Pour repreacutesenter la valeur numeacuterique 120 un codage sur 1 octet suffit mais pour repreacute-senter la valeur 250 1 octet ne suffit pas et il est neacutecessaire drsquoutiliser un codage sur2 octets

Les types de base en JavaChaque langage de programmation propose un ensemble de types de base permettant lamanipulation de valeurs numeacuteriques entiegraveres reacuteelles ou caractegraveres Ces types sont

bull repreacutesenteacutes par un mot-cleacute preacutedeacutefini par le langage

bull dits simples car agrave un instant donneacute une variable de type simple ne peut contenirqursquoune et une seule valeur

Agrave lrsquoopposeacute il existe des types appeleacutes types structureacutes qui permettent le stockage sousun mecircme nom de variable de plusieurs valeurs de mecircme type ou non Il srsquoagit destableaux des classes des vecteurs ou encore des dictionnaires Ces types structureacutes sonten geacuteneacuteral deacutefinis par le programmeur Nous les eacutetudions en deacutetail dans la troisiegravemepartie de cet ouvrage intituleacutee laquo Outils et techniques orienteacutes objet raquo

Pour seacutelectionner un type plutocirct qursquoun autre le langage Java deacutefinit huit types simplesqui appartiennent selon ce qursquoils repreacutesentent agrave lrsquoune ou lrsquoautre des quatre cateacutegoriessuivantes logique texte entier reacuteel

Cateacutegorie logique

Il srsquoagit du type boolean Les valeurs logiques ont deux eacutetats laquo true raquo (vrai) oulaquo false raquo (faux) Elles ne peuvent prendre aucune autre valeur que ces deux eacutetats

Cateacutegorie caractegravere

Deux types deacutefinissent cette cateacutegorie le type char et le type String copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

28

Le type char permet de repreacutesenter les caractegraveres isoleacutes alors que le type String sert agravedeacutecrire des seacutequences de caractegraveres En ce sens il ne srsquoagit pas drsquoun type simple

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Pour deacutecrire une variable de type char lrsquoordinateur utilise un code sur 2 octets De cettefaccedilon il lui est possible drsquoutiliser jusqursquoagrave 216 caractegraveres soit 65 536 caractegraveres diffeacute-rents En reacutealiteacute Java utilise une table de correspondance appeleacutee jeu de caractegraveresUnicode Cette table associe un caractegravere agrave une valeur numeacuterique

Par exemple dans la table Unicode le caractegravere A majuscule a pour valeur deacutecimale 65et le caractegravere a minuscule la valeur deacutecimale 97

La table Unicode est organiseacutee comme suit

bull Les 31 premiers caractegraveres ne peuvent ecirctre afficheacutes (tabulation saut de ligne bipsonore etc)

bull Les caractegraveres compris entre le 32e et le 127e correspondent aux caractegraveres du codeASCII (American Standard Code for Information Interchange) qui eacutetait jusqursquoagravepreacutesent le code deacutefinissant tout caractegravere Dans cet intervalle tous les caractegraveres debase sont deacutefinis crsquoest-agrave-dire lrsquoensemble des lettres de lrsquoalphabet en minuscules et enmajuscules ainsi que les signes de ponctuation et les symboles matheacutematiques

bull Les caractegraveres compris entre le 128e et le 256e caractegraveres correspondent agrave des carac-tegraveres speacuteciaux comme les caractegraveres accentueacutes en minuscules et en majuscules et lescaractegraveres semi graphiques Les codes de ces caractegraveres font partie des extensions quipeuvent diffeacuterer selon les pays ou les environnements de travail Ces extensions sontdeacutefinies agrave partir du jeu de caractegraveres employeacute par votre environnement et diffegraverentdonc drsquoun type drsquoordinateur agrave un autre

Pour connaicirctre le code Unicode drsquoun caractegravere accentueacute sur votre ordinateur reportez-vous agravelrsquoexemple de la section laquo La boucle for raquo du chapitre 4 laquo Faire des reacutepeacutetitions raquo

bull Agrave partir du 257e caractegravere il est possible de deacutefinir son propre jeu de caractegraveres dansla table Unicode de faccedilon agrave repreacutesenter par exemple des caractegraveres arabes chinoisou japonais

Cateacutegorie entier

Cette cateacutegorie contient quatre types distincts byte short int long Chacun de cestypes autorise la manipulation de valeurs numeacuteriques entiegraveres positives ou neacutegativesLeur diffeacuterence reacuteside essentiellement dans le nombre drsquooctets utiliseacute pour coder lecontenu de la variable

Type Nombre drsquooctets Eacuteventail de valeurs

byte 1 octet de ndash 128 agrave 127

short 2 octets de ndash 32 768 agrave 32 767

int 4 octets de ndash 2 147 483 648 agrave 2 147 483 647

long 8 octets de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

29

Dans certains cas il est inteacuteressant de repreacutesenter une valeur entiegravere sous forme octale ouhexadeacutecimale comme pour lrsquoaffichage des caractegraveres de la table Unicode (voir au chapitre 2laquoCommuniquer une informationraquo la section laquoAfficher les caractegraveres accentueacutesraquo)

Pour repreacutesenter un nombre sous forme octale il est neacutecessaire de placer un zeacutero audeacutebut du nombre Pour la repreacutesentation sous forme hexadeacutecimale les caractegraveres 0xdoivent ecirctre placeacutes en deacutebut de valeur

Dans le langage Java tous les types de la cateacutegorie entier ont un signe (+ ou ndash)

Cateacutegorie reacuteel (flottant)

La cateacutegorie reacuteel permet lrsquoemploi de nombres agrave virgule appeleacutes nombres reacuteels ou encoreflottants

Deux types composent cette cateacutegorie le type float et le type double Une expressionnumeacuterique de cette cateacutegorie peut srsquoeacutecrire en notation deacutecimale ou exponentielle

bull La notation deacutecimale contient obligatoirement un point symbolisant le caractegraverelaquo virgule raquo du chiffre agrave virgule Les valeurs 673 -3 ou 64 sont des valeurs reacuteellesutilisant la notation deacutecimale

bull La notation exponentielle utilise la lettre E pour deacuteterminer ougrave se trouve la valeur delrsquoexposant (puissance de 10) Les valeurs 876E4 et 65E-12 sont des valeurs utilisantla notation exponentielle

Dans les deux cas le nombre reacuteel est suivi de la lettre F (pour float) ou D (pour double)Les caractegraveres minuscules f ou d sont eacutegalement autoriseacutes La distinction entre float etdouble srsquoeffectue sur le nombre drsquooctets utiliseacute pour coder lrsquoinformation Il en reacutesulteune preacutecision plus ou moins grande suivant le type utiliseacute

Exemple

bull La valeur 215F repreacutesente un simple flottant (type float)

bull La valeur 135E22 repreacutesente aussi un flottant de grande taille

bull La valeur 676F est une valeur de type float de taille simple

bull La valeur 4634E+234D correspond agrave un flottant de double preacutecision (type double)

En langage Java toute valeur numeacuterique reacuteelle est deacutefinie par deacutefaut en double preacuteci-sion Par conseacutequent la lettre d (ou D) placeacutee en fin de valeur nrsquoest pas neacutecessaire Parcontre degraves que lrsquoon utilise une variable float la lettre f (ou F) est indispensable souspeine drsquoerreur de compilation

Valeur deacutecimale Valeur octale Valeur hexadeacutecimale

45 055 0x2d

Type Nombre drsquooctets Eacuteventail des valeurs

float 4 octets de 140239846e-45F agrave 3402823347e38F

double 8 octets de 494065645841246544e-324D agrave 179769313486231570e308D

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

30

Comment choisir un type de variable plutocirct qursquoun autre Sachant qursquoune variable de type int (codeacutee sur 4 octets) peut prendre toutes les valeursde lrsquointervalle [ndash21474836482147483647] et donc prendre en particulier toutes lesvaleurs comprises entre ndash32768 et 32767 (type short) ou mecircme entre ndash128 et 127 (typebyte) posons-nous les questions suivantes

bull Pourquoi ne pas deacuteclarer toutes les variables entiegraveres drsquoun programme en type long(le type long nous offrant le plus grand choix de valeurs entiegraveres)

bull Pourquoi ne pas deacuteclarer les variables reacuteelles drsquoun programme en type double plutocirctqursquoen float

Pour reacutepondre agrave ces questions examinons le nombre drsquooctets utiliseacutes par un programmede gestion de comptes bancaires Pour simplifier supposons que le programme garde enmeacutemoire les 10 derniegraveres opeacuterations bancaires et le solde de chaque compte Imaginonsenfin que notre banque gegravere 50 000 comptes

Pour stocker les 10 derniegraveres opeacuterations nous devons deacuteclarer 10 variables plus 1 pourle solde du compte soit 11 variables Les valeurs sont des montants en francs et centi-mes donc des valeurs reacuteelles

bull Si nous deacuteclarons lrsquoensemble de ces variables en type double (8 octets) le pro-gramme utilise alors 50 000 times 11 times 8 octets soit 44 000 000 octets soit 44 meacutega-octets de la meacutemoire de lrsquoordinateur

bull Si nous choisissons de prendre des variables de type float (ce qui reste coheacuterentpuisque les montants en francs nrsquoont pas besoin drsquoecirctre drsquoune preacutecision extrecircme) notreprogramme nrsquoutilise plus que 22 meacutegaoctets soit deux fois moins que preacuteceacutedemment

Bien entendu cet exemple simpliste nrsquoa pour seul objectif que de montrer lrsquoeffet duchoix du type de variable sur le taux drsquooccupation de la meacutemoire de lrsquoordinateur Ilexiste en reacutealiteacute un grand nombre de techniques pour optimiser la gestion de lameacutemoire de lrsquoordinateur

Remarquons cependant que la premiegravere deacutemarche pour geacuterer au mieux la meacutemoire delrsquoordinateur consiste agrave bien choisir le type de ses variables Si lrsquoon sait que par deacutefini-tion une variable ne deacutepasse jamais pour un programme donneacute la valeur numeacuterique120 celle-ci doit ecirctre deacuteclareacutee avec le type byte

Deacuteclarer une variableLa deacutefinition drsquoune variable dans un programme est reacutealiseacutee par lrsquointermeacutediaire delrsquoinstruction de deacuteclaration des variables Au cours de cette instruction le program-meur donne le type et le nom de la variable Pour deacuteclarer une variable il suffit drsquoeacutecrirelrsquoinstruction selon la syntaxe suivante

type nomdevariable

ou

type nomdevariable1 nomdevariable2

ougrave type correspond agrave lrsquoun des mots-cleacutes agrave choisir parmi ceux donneacutes aux sections preacuteceacute-dentes (boolean char String byte short int long float ou double) Si deux variables

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

31

de mecircme type sont agrave deacuteclarer il nrsquoest pas besoin de reacutepeacuteter le type une virgule seacuteparantles deux noms suffisant agrave les distinguer

Pour expliquer agrave lrsquoordinateur que lrsquoinstruction de deacuteclaration est termineacutee pour le typedonneacute un point virgule () est placeacute obligatoirement agrave la fin de la ligne drsquoinstruction

Exemple

float f1 f2 Deacuteclaration de deux variables de type float

une virgule seacutepare les deux noms de variables

long CodeBar Deacuteclaration drsquoune variable de type long

int test Deacuteclaration drsquoune variable de type int

char choix tmp Deacuteclaration de deux variables de type char

boolean OK Deacuteclaration drsquoune variable de type boolean

Les instructions de deacuteclaration peuvent ecirctre placeacutees indiffeacuteremment au deacutebut ou encours de programme Une fois la variable deacuteclareacutee lrsquointerpreacuteteur Java reacuteserve au coursde lrsquoexeacutecution du programme un emplacement meacutemoire correspondant en taille agrave celledemandeacutee par le type Il associe ensuite le nom de la variable agrave lrsquoadresse de lrsquoemplace-ment meacutemoire

Agrave cette eacutetape du programme remarquons que lrsquoemplacement ainsi deacutefini est vide Silrsquoon souhaite afficher son contenu sans y avoir preacutealablement deacuteposeacute de valeur lecompilateur eacutemet le message drsquoerreur suivant Variable may not have been initia-lized Cette erreur indique que la variable dont on souhaite afficher le contenu nrsquoa paseacuteteacute initialiseacutee Comme lrsquointerpreacuteteur Java ne peut afficher un emplacement meacutemoirevide lrsquoexeacutecution du programme nrsquoest pas possible

Lrsquoinstruction drsquoaffectationUne fois la variable deacuteclareacutee il est neacutecessaire de stocker une valeur agrave lrsquoemplacementmeacutemoire deacutesigneacute Pour ce faire nous utilisons lrsquoinstruction drsquoaffectation qui nouspermet drsquoinitialiser ou de modifier en cours drsquoexeacutecution du programme le contenu delrsquoemplacement meacutemoire (le contenu drsquoune variable nrsquoeacutetant par deacutefinition pas constant)

Rocircle et meacutecanisme de lrsquoaffectation

Lrsquoaffectation est le meacutecanisme qui permet de placer une valeur dans un emplacementmeacutemoire Elle a pour forme

Variable = Valeur

ou encore

Variable = Expression matheacutematique

Le signe eacutegal (=) symbolise le fait qursquoune valeur est placeacutee dans une variable Pour eacutevitertoute confusion sur ce signe matheacutematique bien connu nous prendrons lrsquohabitude de letraduire par les termes prend la valeur

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

32

Examinons les exemples suivants en supposant que les variables n et p soient deacuteclareacuteesde type entier

n = 4 n prend la valeur 4 p = 5n+1 calcule la valeur de lrsquoexpression matheacutematique soit 54+1

range la valeur obtenue dans la variable repreacutesenteacutee par p

Lrsquoinstruction drsquoaffectation srsquoeffectue dans lrsquoordre suivant

1 Calcule la valeur de lrsquoexpression figurant agrave droite du signe eacutegal

2 Range le reacutesultat obtenu dans la variable mentionneacutee agrave gauche du signe eacutegal

Drsquoune maniegravere geacuteneacuterale il est inteacuteressant de remarquer que la variable placeacutee agrave droite dusigne = nrsquoest jamais modifieacutee alors que celle qui est agrave gauche lrsquoest toujours Comme unevariable de type simple ne peut stocker qursquoune seule valeur agrave la fois si la variable situeacuteeagrave gauche possegravede une valeur avant lrsquoaffectation cette valeur est purement et simplementremplaceacutee par la valeur situeacutee agrave droite du signe =

Exemple

a = 1 b = a + 3 a = 3

Lorsqursquoon deacutebute en programmation une bonne meacutethode pour comprendre ce quereacutealise un programme consiste agrave eacutecrire pour chaque instruction exeacutecuteacutee un eacutetat detoutes les variables deacuteclareacutees Il suffit pour cela de construire un tableau dont chaquecolonne repreacutesente une variable deacuteclareacutee dans le programme et chaque ligne une instruc-tion de ce mecircme programme Soit pour notre exemple

Le tableau est composeacute des deux colonnes a et b et des trois lignes associeacutees aux instruc-tions drsquoaffectation du programme Ce tableau montre que les instructions a = 1 et a = 3font que la valeur initiale de a (1) est effaceacutee et eacutecraseacutee par la valeur 3

Deacuteclaration et affectation Comme nous lrsquoavons vu agrave la section laquo Deacuteclarer une variable raquo la deacuteclaration est utiliseacuteepour reacuteserver un emplacement meacutemoire Une fois reacuteserveacute lrsquoemplacement reste videjusqursquoagrave ce qursquoune valeur y soit placeacutee par lrsquointermeacutediaire de lrsquoaffectation

Il est cependant risqueacute de deacuteclarer une variable sans lui donner de valeur initiale Eneffet le compilateur Java veacuterifie strictement si toutes les variables contiennent unevaleur ou non Une erreur de compilation est deacutetecteacutee degraves qursquoune seule variable necontient pas de valeur agrave un moment donneacute du programme

instruction a b

a = 1 1 -

b = a + 3 1 4

a = 3 3 4

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

33

Initialiser une variable

Pour eacuteviter toute erreur de compilation une bonne habitude consiste agrave initialiser toutesles variables au moment de leur deacuteclaration en proceacutedant de la faccedilon suivante

float f1 = 00f f2 = 12f Initialisation de deux floatlong CodeBar = 123456789 Initialisation drsquoun longint test = 0 Initialisation drsquoune variable de type intboolean OK = true Initialisation drsquoun boolean

De cette faccedilon les variables fl f2 CodeBar et OK sont deacuteclareacutees Le compilateurreacuteserve un emplacement meacutemoire pour chacune drsquoentre elles Gracircce au signe drsquoaffecta-tion le compilateur place dans chacun des emplacements meacutemoire respectifs les valeursdonneacutees

Initialiser une variable de type char

Les variables de type char srsquoinitialisent drsquoune faccedilon particuliegravere Supposons que lrsquoonsouhaite deacuteclarer et placer le caractegravere n dans une variable choix de type char Pour celaeacutecrivons lrsquoinstruction de deacuteclaration et drsquoinitialisation suivante

char choix = n

Pour le compilateur cette instruction est probleacutematique car il considegravere n non pascomme le laquo caractegravere n raquo mais comme une variable appeleacutee n

Pour lever cette ambiguiumlteacute nous devons entourer le caractegravere n drsquoapostrophes de lafaccedilon suivante

char choix = rsquonrsquo

Ainsi des donneacutees telles que rsquoarsquo rsquorsquo rsquo$rsquo rsquo3rsquo rsquorsquo ou rsquorsquo sont consideacutereacutees comme descaractegraveres

Par contre c = rsquoabrsquo ne peut srsquoeacutecrire car rsquoabrsquo nrsquoest pas un caractegravere mais un mot dedeux caractegraveres Nous devons dans ce cas utiliser une variable de type String

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Quelques confusions agrave eacuteviter Le symbole de lrsquoaffectation est le signe eacutegal (=) Ce signe tregraves largement utiliseacute danslrsquoeacutecriture drsquoeacutequations matheacutematiques est source de confusion lorsqursquoil est employeacute agravecontre-sens

Pour mieux nous faire comprendre eacutetudions trois cas

1 a = a + 1

Si cette expression est impossible agrave eacutecrire drsquoun point de vue matheacutematique elle esttregraves largement utiliseacutee dans le langage informatique Elle signifie

ndash calculer lrsquoexpression a + 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

34

ndash ranger le reacutesultat dans a

Ce qui revient agrave augmenter de 1 la valeur de a

2 a + 5 = 3

Cette expression nrsquoa aucun sens drsquoun point de vue informatique Il nrsquoest pas possiblede placer une valeur agrave lrsquointeacuterieur drsquoune expression matheacutematique puisque aucunemplacement meacutemoire nrsquoest attribueacute agrave une expression matheacutematique

3 a = b et b = a

Agrave lrsquoinverse de lrsquoeacutecriture matheacutematique ces deux instructions ne sont pas eacutequiva-lentes La premiegravere place le contenu de b dans a tandis que la seconde place lecontenu de a dans b

Eacutechanger les valeurs de deux variablesNous souhaitons eacutechanger les valeurs de deux variables de mecircme type appeleacutees a et b crsquoest-agrave-dire que nous voulons que a prenne la valeur de b et que b prenne celle de a Lapratique courante de lrsquoeacutecriture des expressions matheacutematiques fait que dans un premiertemps nous eacutecrivions les instructions suivantes

a = b b = a

Veacuterifions sur un exemple si lrsquoexeacutecution de ces deux instructions eacutechange les valeurs dea et de b Pour cela supposons que les variables a et b contiennent initialement respecti-vement 2 et 8

Du fait du meacutecanisme de lrsquoaffectation la premiegravere instruction a = b deacutetruit la valeur dea en placcedilant la valeur de b dans la case meacutemoire a Lorsque la seconde instruction b = aest reacutealiseacutee la valeur placeacutee dans la variable b est celle contenue agrave cet instant dans lavariable a crsquoest-agrave-dire la valeur de b Il nrsquoy a donc pas eacutechange car la valeur de a adisparu par eacutecrasement lors de lrsquoexeacutecution de la premiegravere instruction

Une solution consiste agrave utiliser une variable suppleacutementaire destineacutee agrave contenir tempo-rairement une copie de la valeur de a avant que cette derniegravere soit eacutecraseacutee par la valeurde b Pour eacutevoquer le caractegravere temporaire de la copie nous appellerons cette nouvellevariable tmp (nous aurions pu choisir tout aussi bien tempo ou ttt) Voici le deacuteroulementdes opeacuterations

tmp = a a = b b = tmp

a b

valeur initiale 2 8

a = b 8 8

b = a 8 8

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

35

Veacuterifions qursquoil y a reacuteellement eacutechange en supposant que nos variables a et b contiennentinitialement respectivement 2 et 8

Agrave la lecture de ce tableau nous constatons qursquoil y a bien eacutechange des valeurs entre a etb La valeur de a est copieacutee dans un premier temps dans la variable tmp La valeur de apeut degraves lors ecirctre effaceacutee par celle de b Pour finir gracircce agrave la variable tmp la variable breacutecupegravere lrsquoancienne valeur de a

Une autre solution vous est proposeacutee dans la feuille drsquoexercices placeacutee agrave la fin du chapitre

Les opeacuterateurs arithmeacutetiquesEacutecrire un programme nrsquoest pas uniquement eacutechanger des valeurs mais crsquoest aussi calcu-ler des eacutequations matheacutematiques plus ou moins complexes Pour exprimer une opeacutera-tion le langage Java utilise des caractegraveres qui symbolisent les opeacuterateurs arithmeacutetiques

Exemple

Soient a b c trois variables de mecircme type

bull Lrsquoopeacuteration drsquoaddition srsquoeacutecrit a = b + 4

bull Lrsquoopeacuteration de soustraction srsquoeacutecrit a = b ndash 5

bull Lrsquoopeacuteration de division srsquoeacutecrit a = b 2 et non pas a =

bull Lrsquoopeacuteration de multiplication srsquoeacutecrit a = b 4 et non pas a = 4b ou a = a x b

bull Lrsquoopeacuteration de modulo srsquoeacutecrit a = b 3

Le modulo drsquoune valeur correspond au reste de la division entiegravere Ainsi 5 2 = 1

Il srsquoagit de calculer la division en srsquoarrecirctant degraves que le valeur du reste devient infeacuterieureau diviseur de faccedilon agrave trouver un reacutesultat en nombre entier Lrsquoopeacuterateur nrsquoexiste paspour les reacuteels pour lesquels la notion de division entiegravere nrsquoexiste pas

a b tmp

valeur initiale 2 8 _

tmp = a 2 8 2

a = b 8 8 2

b = tmp 8 2 2

Symbole Opeacuteration

+ addition

- soustraction

multiplication

division

modulo

b2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

36

Lrsquoensemble de ces opeacuterateurs est utiliseacute pour calculer des expressions matheacutematiquescourantes Le reacutesultat de ces expressions nrsquoest cependant pas toujours celui auquel onsrsquoattend Trois pheacutenomegravenes ont une influence non neacutegligeable sur la valeur du reacutesultatdrsquoun calcul Ce sont

bull La prioriteacute des opeacuterateurs entre eux

bull Le type drsquoune expression matheacutematique

bull La transformation de types

La prioriteacute des opeacuterateurs entre euxLorsqursquoune expression arithmeacutetique est composeacutee de plusieurs opeacuterations lrsquoordina-teur doit pouvoir deacuteterminer quel est lrsquoordre des opeacuterations agrave effectuer Le calcul delrsquoexpression a ndash b c d peut signifier a priori

bull calculer la soustraction puis la division et pour finir la multiplication soit le calcul ((a - b) c) d

bull calculer la multiplication puis la division et pour finir la soustraction crsquoest-agrave-direlrsquoexpression a ndash (b (c d))

Afin drsquoeacuteviter toute ambiguiumlteacute il existe des regravegles de prioriteacute entre les opeacuterateurs regraveglesbaseacutees sur la deacutefinition de deux groupes drsquoopeacuterateurs

Les groupes eacutetant ainsi deacutefinis les opeacuterations sont reacutealiseacutees sachant que

bull Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacuterateurs(sens de lecture)

bull Le deuxiegraveme groupe a prioriteacute sur le premier

Lrsquoexpression a - b c d est calculeacutee de la faccedilon suivante

Cela signifie que lrsquoexpression est calculeacutee de la faccedilon suivante

a - (b c d)

Remarquons que les parenthegraveses permettent de modifier les regravegles de prioriteacute en forccedilantle calcul preacutealable de lrsquoexpression qui se trouve agrave lrsquointeacuterieur des parenthegraveses Ellesoffrent en outre une meilleure lisibiliteacute de lrsquoexpression

Groupe 1 Groupe 2

+ ndash

Prioriteacute Opeacuterateur

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la division apparaicirct dans le sens de la lecture avant la multiplication

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la multiplication suit la division

Groupe 1 - La soustraction est la derniegravere opeacuteration agrave exeacutecuter car elle est du groupe 1

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

37

Le type drsquoune expression matheacutematiqueLe reacutesultat drsquoune expression matheacutematique peut ecirctre deacutetermineacute agrave partir du type de varia-bles (termes) qui composent lrsquoexpression

De ce fait pour un mecircme calcul le reacutesultat diffegravere selon qursquoil est effectueacute agrave lrsquoaide de varia-bles de type reacuteel ou de type entier

Exemple diviser deux entiers

int x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type entier Par conseacutequent lrsquoopeacuteration effec-tueacutee a pour reacutesultat une valeur entiegravere mecircme si lrsquoopeacuteration demandeacutee nrsquoa pas forceacutementun reacutesultat entier Soit pour notre exemple 2 et non 25 Cela ne correspond pas toujoursau reacutesultat attendu par le programmeur deacutebutant

Exemple diviser deux reacuteels

double x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type reacuteel Par conseacutequent lrsquoopeacuteration effectueacuteedonne un reacutesultat de type reacuteel Ce reacutesultat correspond agrave la valeur geacuteneacuteralement attenduede ce type drsquoopeacuteration

La transformation de types Les termes drsquoune opeacuteration ne sont pas neacutecessairement tous du mecircme type Pour eacutecrireune opeacuteration toutes les combinaisons entre les diffeacuterentes cateacutegories de types peuventse preacutesenter

Terme Opeacuteration Terme Reacutesultat

Entier + - Entier Entier

Reacuteel + - Reacuteel Reacuteel

x y z

valeur initiale 5 2 -

z = x y 5 2 2

x y z

valeur initiale 5 2 -

z = x y 5 2 25

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

38

Lrsquoordinateur ne sait calculer une expression matheacutematique que lorsque toutes les varia-bles de lrsquoexpression sont du mecircme type En effet les opeacuterateurs arithmeacutetiques ne sontdeacutefinis que pour des variables de type identiqueLorsque tel nrsquoest pas le cas crsquoest-agrave-dire si lrsquoexpression est mixte lrsquoordinateur doit trans-former le type de certaines variables pour que tous les membres de lrsquoexpression devien-nent de mecircme typeCette transformation appeleacutee conversion drsquoajustement de type se reacutealise suivant unehieacuterarchie bien deacutetermineacutee qui permet de ne pas perdre drsquoinformation On dit que lecompilateur respecte lrsquointeacutegraliteacute des donneacutees La conversion drsquoun nombre reacuteel en nombre entier par exemple ne peut se reacutealiser qursquoensupprimant les nombres situeacutes apregraves la virgule et en ne gardant que la partie entiegravere dunombre Une telle conversion ne garantit pas lrsquointeacutegraliteacute des donneacutees car il y a perte dedonneacuteesCrsquoest pourquoi du fait du codage des donneacutees et du nombre drsquooctets utiliseacute pour cecodage le compilateur effectue automatiquement la conversion des donneacutees selonlrsquoordre suivant

byte -gt short -gt int -gt long -gt float -gt double

De cette faccedilon il est toujours possible de convertir un byte en long ou un int en floatPar contre il est impossible de transformer un float en short sans perte drsquoinformation

Exemple

int a = 4 result_int float x = 20f result_float result_float = a x result_int = a x

La troisiegraveme instruction montre que le calcul drsquoune opeacuteration dont les termes sont detype int et float donne pour reacutesultat un float La derniegravere instruction reacutevegravele que si lereacutesultat drsquoune opeacuteration est de type float il nrsquoest pas possible de le stocker dans unevariable de type int En effet la division drsquoun entier par un reacuteel est une opeacuterationtoujours possible agrave reacutealiser (le reacutesultat est de type reacuteel) mais lrsquoaffectation directe de cereacutesultat dans une variable entiegravere est impossible du fait que la conversion entraicircne uneperte drsquoinformation

Terme Opeacuteration Terme Reacutesultat

byte + - int int

int + - double double

a x result_float result_int

a = 4 4 _ _ _

x = 20f 4 20f _ _

result_float = ax 4 20f 20f _

result_int = ax 4 20f _ Impossible degraves la compilation

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

39

Une telle instruction provoque agrave la compilation une erreur dont le message est Incom-patible type for = Explicit cast needed to convert float to int Celasignifie laquo Type incompatible de part et drsquoautre du signe = Pour convertir un float enint il est neacutecessaire de le formuler explicitement par lrsquointermeacutediaire drsquoun cast raquo

Le cast

La conversion avec perte drsquoinformation est autoriseacutee dans certain cas gracircce au meacuteca-nisme du cast Il peut ecirctre utile de transformer un nombre reacuteel en entier par exemplepour calculer sa partie entiegravere Pour cela le compilateur demande de convertir explicite-ment les termes de lrsquoopeacuteration dans le type souhaiteacute en placcedilant devant la variable oulrsquoopeacuteration le type de conversion deacutesireacute Ainsi pour transformer un float en int ilsuffit de placer le terme (int) devant la variable ou lrsquoopeacuteration de type float

Exemple

int a = 5 result float x = 20f result = (int) a x

La derniegravere instruction montre que la conversion float vers int est autoriseacutee malgreacute laperte drsquoinformation (le chiffre 5 placeacute apregraves la virgule disparaicirct) Cette conversion nrsquoestpossible que si elle est preacuteciseacutement indiqueacutee au compilateur

Calculer des statistiques sur des opeacuterations bancairesPour reacutesumer en pratique lrsquoensemble des notions abordeacutees dans ce chapitre nous allonseacutecrire un programme dont le sujet se rapporte au thegraveme du projet eacutenonceacute agrave la fin duchapitre introductif laquo Naissance drsquoun programme raquo

Cahier des chargesLrsquoobjectif de ce programme est drsquoeacutetablir des statistiques sur lrsquoutilisation des diffeacuterentsmodes de paiement effectueacutes sur un compte bancaire Nous supposons que les moyenstechniques pour deacutebiter un compte sont au nombre de trois la Carte Bleue le cheacutequieret le virement Pour eacutevaluer le taux drsquoutilisation de ces trois moyens de paiement nousdevons calculer le pourcentage drsquoutilisation de chaque technique par rapport aux autresPar exemple pour connaicirctre le pourcentage drsquoutilisation de la Carte Bleue nous utili-sons le calcul suivant

Nombre de paiements par Carte Bleue Nombre total de paiements 100

a x result

a = 5 5 _ _

x = 20f 5 20f _

result = (int) a x 5 20f 2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

40

Liste des opeacuterations

Partant du principe de deacutecomposition drsquoun problegraveme en sous-tacircches plus simples agrave reacuteali-ser distinguons pour reacutesoudre la question les quatre actions suivantes

1 Deacuteterminer le nombre de deacutebits par Carte Bleue chegraveque et virement Comme ilsrsquoagit du premier programme concernant ce thegraveme nous nrsquoavons pas encore saisi devaleur ni de ligne comptable Crsquoest pourquoi nous demandons agrave lrsquoutilisateur decommuniquer au programme ces trois informations par lrsquointermeacutediaire du clavier

2 Calculer le nombre total de paiements effectueacutes

3 Calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du virement

4 Afficher lrsquoensemble des reacutesultats

Dans un premier temps nous traiterons seacutepareacutement chacun de ces points afin de lesanalyser entiegraverement Pour finir nous eacutecrirons le programme dans son inteacutegraliteacute enregroupant chacun des points eacutetudieacutes

1 Il srsquoagit drsquoeacutecrire les instructions qui permettent agrave lrsquoutilisateur de communiquer desinformations agrave lrsquoordinateur agrave lrsquoaide du clavier Nous avons vu au chapitre introduc-tif un exemple de saisie drsquoune valeur au clavier (voir laquo Calcul de la circonfeacuterencedrsquoun cercle raquo) Cette opeacuteration se reacutealise en deux temps drsquoabord lrsquoaffichage agravelrsquoeacutecran drsquoun message informant lrsquoutilisateur drsquoune demande de saisie de valeur puisla saisie effective de lrsquoinformation Pour notre problegraveme ces deux points se tradui-sent de la faccedilon suivante

Systemoutprint( Nombre de paiement par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques eacutemis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei()

Chaque appel de la fonction Systemoutprint() affiche agrave lrsquoeacutecran le message placeacuteentre guillemets Trois messages sont afficheacutes chacun indiquant respectivement agravequel mode de paiement est associeacutee la valeur saisie par lrsquoutilisateur

Les valeurs agrave saisir correspondent aux nombres de deacutebits dans chaque mode de paie-ment Ces valeurs sont de type entier La fonction Lirei() donne lrsquoordre agrave lrsquoordi-nateur drsquoattendre la saisie drsquoune valeur entiegravere La saisie est effective lorsquelrsquoutilisateur valide sa reacuteponse en appuyant sur la touche laquo Entreacutee raquo du clavier Troisvaleurs sont agrave saisir et il est neacutecessaire drsquoappeler trois fois la fonction Lirei()

Pour plus drsquoinformations sur la fonction Lirei() voir le chapitre 2 laquo Communiquer uneinformation raquo

Une fois saisie chaque valeur doit ecirctre stockeacutee dans un emplacement meacutemoiredistinct Ces emplacements meacutemoire correspondent aux trois variables nbCB nbChe-que et nbVirement et sont deacuteclareacutes en deacutebut de programme gracircce agrave lrsquoinstruction

int nbCB = 0 nbCheque = 0 nbVirement = 0

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

41

2 Pour calculer le nombre total de paiements effectueacutes il suffit de faire la somme detoutes les opeacuterations de deacutebit pour tous les types de paiement soit lrsquoinstruction

nbDebit = nbCB + nbCheque + nbVirement

La variable nbDebit permet la meacutemorisation du nombre total drsquoopeacuterations effec-tueacutees quel que soit le mode de paiement Elle doit ecirctre deacuteclareacutee en mecircme temps queles autres variables du mecircme type

int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0

3 Pour calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du vire-ment nous allons drsquoabord eacutetudier le mode Carte Bleue puis appliquer cette analyseaux autres modes de paiement Rappelons que la formule du calcul de pourcentagepour la Carte Bleue est

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Soit en utilisant les variables deacuteclareacutees au point 1 nbCB nbDebit 100

Examinons sur un exemple numeacuterique le reacutesultat drsquoun tel calcul Supposons pourcela que nous ayons effectueacute 10 retraits Carte Bleue sur un total de 40 retraits Nousobtenons le calcul suivant 10 40 100 Soit 0 100 crsquoest-agrave-dire 0 La divisionest la premiegravere opeacuteration exeacutecuteacutee parce qursquoelle est du mecircme groupe que la multipli-cation et qursquoelle apparaicirct en premier dans lrsquoopeacuteration De surcroicirct les valeurs eacutetantde type entier la division a pour reacutesultat un nombre entier Ici 1040 a pour reacutesultat 0

Pour corriger cette erreur de calcul lrsquoideacutee est de reacutealiser une division sur des valeursreacuteelles et non sur des entiers Pour cela nous utilisons le meacutecanisme du cast quiplaceacute devant la variable nbCB transforme cette derniegravere en variable de type reacuteel etpermet la division en reacuteel Pour stocker le reacutesultat de cette opeacuteration nous deacuteclaronsune variable de type float nommeacutee prctCB

Lrsquoinstruction

prctCB = (float) nbCB nbDebit 100

permet de trouver un reacutesultat coheacuterent Veacuterifions cela sur un exemple numeacuteriqueSupposons que nous ayons effectueacute 10 deacutebits par Carte Bleue sur un total de20 retraits Gracircce au cast la valeur 10 correspondant agrave nbCB est transformeacutee en 100La division par 20 a donc un reacutesultat reacuteel eacutegal agrave 05 Le taux drsquoutilisation de la CarteBleue est donc de 05 100 soit 50

Pour eacutetablir le pourcentage relatif aux modes cheacutequier et virement il suffit drsquoappli-quer le mecircme calcul en utilisant des variables approprieacutees aux deux autres moyensde paiement En nommant prctCh et prctVi les variables associeacutees aux modes depaiement par chegraveque et par virement automatique le taux drsquoutilisation pour chacunde ces modes srsquoeacutecrit

prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

4 Lrsquoaffichage des reacutesultats srsquoeffectue par lrsquointermeacutediaire de la fonction Systemoutprint() Les valeurs calculeacutees sont commenteacutees de la faccedilon suivante

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

42

Systemoutprintln( Vous avez emis + nbDebit + ordres de debit ) Systemoutprintln( dont + prctCB + par Carte Bleue ) Systemoutprintln( + prctCh + par cheque ) Systemoutprintln( + prctVi + par virement )

Le programme final srsquoeacutecrit en regroupant lrsquoensemble des instructions deacutefinies preacuteceacutedem-ment et en les inseacuterant dans une classe agrave lrsquointeacuterieur de la fonction main()

Le code source complet

public class Statistique public static void main (String [] arg) int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0 float prctCB prctCh prctVi Systemoutprint( Nombre de paiements par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques emis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei() nbDebit = nbCB + nbCheque + nbVirement prctCB = (float) nbCB nbDebit 100 prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

Systemoutprintln(Vous avez emis + nbDebit + ordres de debit) Systemoutprintln(dont + prctCB + par Carte Bleue) Systemoutprintln( + prctCh + par cheque) Systemoutprintln( + prctVi + par virement)

Reacutesultat de lrsquoexeacutecutionAgrave lrsquoexeacutecution de ce programme nous avons agrave lrsquoeacutecran lrsquoaffichage suivant (les caractegraveresgriseacutes sont des valeurs choisies par lrsquoutilisateur)

Nombre de paiements par Carte Bleue 55Nombre de cheques emis 1100Nombre de virements automatiques 55Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

43

ReacutesumeacuteUne variable est caracteacuteriseacutee par un nom et un type Le nom sert agrave repeacuterer unemplacement meacutemoire Le type deacutetermine la taille de cet emplacement ainsi que lamaniegravere dont lrsquoinformation est codeacutee les opeacuterations autoriseacutees et lrsquointervalle desvaleurs repreacutesentables

Il existe plusieurs types simples dont les plus utiliseacutes sont les suivants

bull int Preacutesente les entiers variant pour le langage Java entre ndash 2 147 483 648 et2 147 483 647

bull double Deacutecrit de maniegravere approcheacutee les nombres reacuteels dont la valeur absolue estgrande Les variables de type double se notent soit sous forme deacutecimale (677ndash92 048 ou 22) soit sous forme exponentielle 314E4 325707e2 ndash45567E-5

bull char Deacutesigne les caractegraveres Les valeurs de type caractegravere se notent en placcedilantentre apostrophes le caractegravere lui-mecircme

Lrsquoinstruction drsquoaffectation permet de placer une valeur dans une variable Elle estde la forme variable = expression

Elle calcule drsquoabord la valeur de lrsquoexpression mentionneacutee agrave droite du signe = puiselle lrsquoaffecte agrave la variable placeacutee agrave gauche du signe

Il est conseilleacute drsquoattribuer une valeur initiale agrave une variable au moment de sa deacutecla-ration Par exemple int i = 6 ou char c = rsquonrsquo

Pour calculer des expressions matheacutematiques il existe cinq opeacuterateursarithmeacutetiques + -

Ces opeacuterateurs sont utiliseacutes respectivement pour lrsquoaddition la soustraction la multi-plication la division et le modulo (reste de la division entiegravere) Les expressionsarithmeacutetiques sont calculeacutees agrave partir des regravegles suivantes

bull Entier + - entier donne un entier

bull Reacuteel + - reacuteel donne un reacuteel

bull Les opeacuterations mixtes du type entier + - reacuteel ou reacuteel + - entier

donnent un reacutesultat dans la mesure ougrave la valeur reacutesultante nrsquoest pas deacutenatureacutee par laconversion des types Les conversions sont effectueacutees automatiquement dans le senssuivant

byte -gt short -gt int -gt long -gt float -gt double

Un int peut donc ecirctre transformeacute en un double Lrsquoinverse nrsquoest possible que lorsquele mode de conversion est explicitement deacutecrit dans lrsquoexpression comme dans n =(int) x ougrave n est de type int et x de type double

Lrsquoinformation ainsi transformeacutee est tronqueacutee pour ecirctre codeacutee sur moins drsquooctets

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

44

ExercicesRepeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction

Observez ce qui suit et indiquez ce qui est ou nrsquoest pas une deacuteclaration et ce qui estou nrsquoest pas valide

a int i j valeur b limite - j = 1024 c val = valeur 16 d char char e j + 1 f int X g float A h A = X 2 i X = A 2 j X = X 2

Comprendre le meacutecanisme de lrsquoaffectation

Quelles sont les valeurs des variables A B C apregraves lrsquoexeacutecution de chacun desextraits de programme suivants

bull Il existe des regravegles de prioriteacute entre les opeacuterateurs Pour cela deux groupesdrsquoopeacuterateurs sont deacutefinis

Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacutera-teurs

Le second groupe a prioriteacute sur le premier

Les parenthegraveses permettent la modification des prioriteacutes

a b

float A = 35f

float B = 15f

float C

C = A + B

B = A + C

A = B

double A = 01

double B = 11

double C D

B = A

C = B

D = C

A = D

Groupe 1 Groupe 2

+ -

11

12

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

45

Quelles sont les valeurs des variables a b et c valeur x y et z apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Comprendre le meacutecanisme drsquoeacutechange de valeursDans chacun des cas quelles sont les valeurs des variables a et b apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Laquelle des options suivantes permet drsquoeacutechanger les valeurs des deux variables aet b

a = b b = a t = a a = b b = t t = a b = a t = b

Soit trois variables a b et c (entiegraveres) Eacutecrivez les instructions permutant lesvaleurs de sorte que la valeur de a passe dans b celle de b dans c et celle de c dansa Nrsquoutilisez qursquoune (et une seule) variable entiegravere suppleacutementaire nommeacutee tmp

Quel est lrsquoeffet des instructions suivantes sur les variables a et b (pour vous aiderinitialisez a agrave 2 et b agrave 5)

a = a + b b = a ndash b a = a ndash b

Calculer des expressions mixtesDonnez les valeurs des expressions suivantes sachant que i et j sont de type int etx et y de type double (x = 20 y = 30)

a i = 100 6 b j = 100 6 c i = 5 8 d (3 i - 2 j) (2 x - y)e 2 ((i 5) + (4 (j - 3)) (i + j - 2))f (i - 3 j) (x + 2 y) (i - j)

a b c

int a = 5 b

b = a + 4

a = a + 1

b = a ndash 4

int valeur = 2

valeur = valeur + 1

valeur = valeur 2

valeur = valeur 5

int x = 2 y = 10 z

z = x + y

x = 5

z = z ndash x

1 2

int a = 5

int b = 7

a = b

b = a

int a = 5

int b = 7

b = a

a = b

13

14

15

16

17

18

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

46

Donnez le type et la valeur des expressions suivantes sachant que n p r s et t sontde type int (n = 10 p = 7 r = 8 s = 7 t = 21) et que x est de type float(x = 20f )

Comprendre le meacutecanisme du castSoit les deacuteclarations suivantes

int valeur = 7 chiffre = 2 i1 i2 float f1 f2

Quelles sont les valeurs attribueacutees agrave i1 i2 f1 et f2 apregraves le calcul de

i1 = valeur chiffre i2 = chiffre valeur f1 = (float) (valeur chiffre) f2 = (float) (valeur chiffre) + 05f i1 = (int) f1 i2 = (int) f2 f1 = (float) valeur (float) chiffre f2 = (float) valeur (float) chiffre + 05f i1 = (int) f1 i2 = (int) f2

Le projet laquo Gestion drsquoun compte bancaire raquoDeacuteterminer les variables neacutecessaires au programmeLe programme de gestion drsquoun compte bancaire ne peut srsquoeacutecrire et srsquoexeacutecuter sansaucune variable Pour pouvoir deacutefinir toutes les variables neacutecessaires agrave la bonne marchedu programme nous devons examiner attentivement le cahier des charges deacutecrit auchapitre introductif laquo Naissance drsquoun programme raquo

La section laquo Les objets manipuleacutes raquo nous donne une premiegravere ideacutee des variables agrave deacutecla-rer Toutes les donneacutees relatives au compte bancaire y sont deacutecrites

Un compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero de compte

bull un type de compte (courant eacutepargne joint etc)

a b

x + n p

x + n p

(x + n) p

5 n

(n + 1) n

(n + 10) n

r + s t

r + t s

( r + t ) s

r + t s

(r + t) s

r + s r + s

(r + s) ( r + s)

r + s t

19

110

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

47

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Compte tenu de ces informations donnez un nom et un type Java pour chaque donneacuteedeacutefinie ci-dessus

Remarquons que le type qui repreacutesente les suites de caractegraveres (String) nrsquoa pas encoreeacuteteacute eacutetudieacute ni toutes ses fonctionnaliteacutes Il est possible de transformer pour lrsquoinstant lesdonneacutees Type du compte Thegraveme et Moyen de paiement en caractegraveres simples Par exem-ple le caractegravere C caracteacuterise le type du compte Courant le caractegravere J le compte Jointet le caractegravere E le compte Epargne

De la mecircme faccedilon la donneacutee Numeacutero du compte peut ecirctre transformeacutee dans un premiertemps en type long

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Suite de caractegraveres

Type du compte Courant Suite de caractegraveres

Valeur ndash152030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Suite de caractegraveres

Moyen de paiement CB Suite de caractegraveres

copy copyright Eacuteditions Eyrolles

2Communiquer

une information

Un programme nrsquoa drsquointeacuterecirct que srsquoil produit un reacutesultat Pour communiquer ce reacutesultatlrsquoordinateur utilise lrsquoeacutecran Cette action qui consiste agrave afficher un message est appeleacuteeopeacuteration de sortie ou drsquoeacutecriture de donneacutees

Parallegravelement un programme ne produit de reacutesultats que si lrsquoutilisateur lui fournit aupreacutealable des informations Ces informations ou donneacutees sont transmises auprogramme le plus souvent par lrsquointermeacutediaire drsquoun clavier Dans le jargon informati-que cette opeacuteration est appeleacutee opeacuteration de saisie drsquoentreacutee ou encore de lecture dedonneacutees

Dans ce chapitre nous commenccedilons par eacutetudier les fonctionnaliteacutes proposeacutees par lelangage Java pour geacuterer les opeacuterations drsquoentreacutee-sortie (laquo La bibliothegraveque System raquo)

Agrave la section laquo Lrsquoaffichage de donneacutees raquo nous examinons ensuite comment afficher agravelrsquoeacutecran des messages et des donneacutees Enfin agrave la section laquo La saisie de donneacutees raquo nousproposons une technique de saisie de valeurs au clavier

La bibliothegraveque SystemNous lrsquoavons vu dans les exemples des chapitres preacuteceacutedents lrsquoaffichage de valeurs ou detexte est reacutealiseacute par lrsquoutilisation drsquoune fonction preacutedeacutefinie du langage Java Cette fonc-tion a pour nom drsquoappel Systemoutprint()

Pourquoi un nom si complexe pour reacutealiser une action aussi laquo simple raquo que lrsquoaffichagede donneacutees

Le langage Java est accompagneacute drsquoun ensemble de bibliothegraveques de programmes preacuteeacute-crits qui eacutepargnent au programmeur drsquoavoir agrave reacuteeacutecrire ce qui a deacutejagrave eacuteteacute fait depuis lesdeacutebuts de lrsquoegravere informatique Ces bibliothegraveques portent chacune un nom qui renseigne

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

50

sur leur fonctionnaliteacute Ainsi la bibliothegraveque ougrave se trouve lrsquoensemble des fonctions decalcul matheacutematique srsquoappelle Math et celle relative agrave la gestion des eacuteleacutements de basniveau (eacutecran clavier etc) impliquant le systegraveme de lrsquoordinateur srsquoappelle System

La gestion de lrsquoaffichage drsquoun message agrave lrsquoeacutecran ou la saisie de valeurs au clavier fontpartie des fonctions impliquant le systegraveme de lrsquoordinateur Crsquoest pourquoi le nomdrsquoappel de telles fonctions a pour premier terme System

Les opeacuterations drsquoentreacutee ou de sortie de donneacutees impliquent le systegraveme de lrsquoordinateurmais sont en rapport inverse lrsquoune de lrsquoautre Pour dissocier ces opeacuterations la librairieSystem est composeacutee de deux sous-ensembles in et out Lrsquoaffichage est une opeacuterationde sortie et fait donc partie des eacuteleacutements out de la classe System Le point () qui relie lemot System agrave out permet drsquoexpliquer agrave lrsquoordinateur que lrsquoon souhaite acceacuteder au sous-ensemble out de la librairie System plutocirct qursquoau sous-ensemble in Pour finir nousfaisons appel dans le sous-ensemble out agrave la fonction print qui affiche un message agravelrsquoeacutecran Le nom de la fonction print signifie imprimer car au tout deacutebut de lrsquoinformati-que les ordinateurs nrsquoavaient pas drsquoeacutecran et les reacutesultats drsquoun calcul eacutetaient imprimeacutessur papier ou sur carte informatique

La notation point () est une eacutecriture courante en programmation objet Comme nous leverrons au chapitre 7 laquo Les classes et les objets raquo elle offre le moyen drsquoacceacuteder agrave desprogrammes ou agrave des donneacutees speacutecifiques

Notons que dans la classe System se trouve aussi le sous-ensemble err qui permetdrsquoafficher les erreurs eacuteventuelles drsquoun programme sur la sortie standard des erreurs Cetype de sortie nrsquoest deacutefini que dans le monde Unix et la sortie err est identique agrave lasortie out dans le monde Dos

Lrsquoaffichage de donneacuteesLe principe geacuteneacuteral pour lrsquoaffichage drsquoun message est de placer ce dernier en paramegravetrede la fonction Systemoutprint() crsquoest-agrave-dire agrave lrsquointeacuterieur des parenthegraveses qui suiventle terme Systemoutprint Plusieurs possibiliteacutes existent quant agrave la forme et agrave la syntaxede ce message et nous les preacutesentons ci-apregraves

Affichage de la valeur drsquoune variableSoit la variable entiegravere valeur Lrsquoaffichage de son contenu agrave lrsquoeacutecran est reacutealiseacute par

int valeur = 22 Systemoutprint(valeur)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

22

Affichage drsquoun commentaireLe fait drsquoeacutecrire une valeur numeacuterique sans autre commentaire nrsquoa que peu drsquointeacuterecirctPour expliquer un reacutesultat il est possible drsquoajouter du texte avant ou apregraves la variablecomme dans lrsquoexemple

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

51

Systemoutprint( Le montant srsquoeleve a + valeur)

ou

Systemoutprint(valeur + correspond au montant total )

Pour ajouter un commentaire avant ou apregraves une variable il suffit de le placer entreguillemets ( ) et de lrsquoaccrocher agrave la variable agrave lrsquoaide du signe + De cette faccedilon lecompilateur est capable de distinguer le texte agrave afficher du nom de la variable Toutcaractegravere placeacute entre guillemets est un message alors qursquoun mot non entoureacute de guille-mets correspond au nom drsquoune variable

En reprenant la mecircme variable valeur qursquoagrave lrsquoexemple preacuteceacutedent le reacutesultat afficheacute pourle premier exemple est

Le montant srsquoeleve a 22

Ou encore pour le deuxiegraveme exemple

22 correspond au montant total

Affichage de plusieurs variablesOn peut afficher le contenu de plusieurs variables en utilisant la mecircme technique Lescommentaires sont placeacutes entre guillemets et les variables sont preacuteceacutedeacutees entoureacutees ousuivies du caractegravere + Le signe + reacuteunit chaque terme de lrsquoaffichage au suivant ou aupreacuteceacutedent Pour afficher le contenu de deux variables

int v = 5 s = 220

nous eacutecrivons

Systemoutprint(v + elements valent au total + s + francs )

Lrsquoexeacutecution de cette instruction a pour reacutesultat

5 elements valent au total 220 francs

Affichage de la valeur drsquoune expression arithmeacutetiqueDans une instruction drsquoaffichage il est possible drsquoafficher directement le reacutesultat drsquouneexpression matheacutematique sans qursquoelle ait eacuteteacute calculeacutee auparavant Par exemple nouspouvons eacutecrire

int a = 10 b = 5 Systemoutprint(a + fois + b + est egal a + a b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

10 fois 5 est egal a 50

Mais attention cette expression est calculeacutee au cours de lrsquoexeacutecution de lrsquoinstructionelle nrsquoest pas meacutemoriseacutee dans un emplacement meacutemoire Le reacutesultat ne peut donc pasecirctre reacuteutiliseacute dans un autre calcul

Remarquons en outre que lrsquoeacutecriture drsquoune expression matheacutematique agrave lrsquointeacuterieur de lafonction drsquoaffichage peut ecirctre source de confusion pour le compilateur surtout si

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

52

lrsquoexpression matheacutematique comporte un ou plusieurs signes + En remplaccedilant danslrsquoexemple preacuteceacutedent le signe par + nous obtenons

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + a + b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche de la faccedilon suivante

10 plus 5 est egal a 105

Lrsquoordinateur ne peut pas afficher la somme de a et de b parce que lorsque le signe + estplaceacute dans la fonction drsquoaffichage il a pour rocircle de reacuteunir des valeurs et du texte sur unemecircme ligne drsquoaffichage et non drsquoadditionner deux valeurs 105 nrsquoest que la reacuteunion de 10et de 5 On dit qursquoil srsquoagit drsquoune opeacuteration de concateacutenation

Pour afficher le reacutesultat drsquoune addition il est neacutecessaire de placer entre parenthegraveses lecalcul agrave afficher Par exemple

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + (a + b))

Le reacutesultat agrave lrsquoeacutecran est

10 plus 5 est egal a 15

Affichage drsquoun texteNous pouvons aussi afficher un simple texte sans utiliser de variable

Systemoutprint(Qui seme le vent recolte la tempete )

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

Qui seme le vent recolte la tempete

Pour changer de ligne

Remarquons que lrsquoinstruction Systemoutprint affiche les informations agrave la suite decelles qui ont eacuteteacute afficheacutees par un preacuteceacutedent Systemoutprint Il nrsquoy a pas de passageagrave la ligne entre deux instructions drsquoaffichage Ainsi les instructions

Systemoutprint(Qui seme le vent ) Systemoutprint(recolte la tempete )

ont le mecircme reacutesultat agrave lrsquoeacutecran que celle de lrsquoexemple preacuteceacutedent

Qui seme le vent recolte la tempete

Pour obtenir un passage agrave la ligne il est neacutecessaire drsquoutiliser la fonction

Systemoutprintln()

Ainsi les instructions

Systemoutprintln(Qui seme le vent ) Systemoutprint(recolte la tempete )

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

53

ont pour reacutesultat

Qui seme le vent recolte la tempete

Les caractegraveres speacuteciaux

La table Unicode deacutefinit tous les caractegraveres textuels (alphanumeacuteriques) et semi-graphi-ques (voir au chapitre 1 laquo Stocker une information raquo la section laquo Les types de base enJava ndash Cateacutegorie caractegravere raquo) Les caractegraveres speacuteciaux sont deacutefinis entre les 128e et 256e

caractegraveres de cette table Ils correspondent agrave des caractegraveres nrsquoexistant pas sur le claviermais qui sont neacuteanmoins utiles Les caractegraveres accentueacutes font aussi partie des caractegraveresspeacuteciaux les claviers Qwerty ameacutericains ne posseacutedant pas ce type de caractegraveres

Pour afficher un message avec des caractegraveres nrsquoexistant pas sur le clavier ou avec descaractegraveres accentueacutes la meacutethode consiste agrave inseacuterer agrave lrsquointeacuterieur du message le codeUnicode du caractegravere souhaiteacute Ce code srsquoobtient en placcedilant derriegravere les caractegraveres u00la valeur hexadeacutecimale de la position du caractegravere dans la table Unicode Par exemple lecaractegravere A majuscule est deacutefini en position 65 dans la table Unicode Son code Unicodesrsquoeacutecrit u0041 car 41 est la valeur hexadeacutecimale de 65

Lrsquoaffichage de caractegraveres accentueacutes et plus geacuteneacuteralement de tout caractegravere speacutecial resteprobleacutematique Surtout si le programme doit fonctionner sur des ordinateurs diffeacuterentsEn effet les codes de ces caractegraveres font partie des extensions qui diffegraverent suivant lespays ou les environnements de travail Dans ces extensions les caractegraveres ne sont pastoujours deacutefinis agrave la mecircme position dans la table Unicode Le caractegravere eacute est deacutefini enposition 234 dans la table Unicode drsquoUnix alors qursquoil est en position 200 dans la tableUnicode du systegraveme Mac OS Les caractegraveres speacuteciaux et par conseacutequent les caractegraveresaccentueacutes nrsquoont pas toujours un code Unicode identique drsquoun environnement agrave un autre

Par exemple les caractegraveres eacute egrave et ecirc ont les codes Unicode suivants

Le message laquo Qui segraveme le vent reacutecolte la tempecircte raquo srsquoeacutecrit donc diffeacuteremmentsuivant lrsquoenvironnement utiliseacute

Exemple sous Windows ou Unix

Systemoutprint(Qui su00e8me le vent )Systemoutprint(ru00e9colte la tempu00eate )

Exemple sous Dos

Systemoutprint(Qui su008ame le vent )Systemoutprint(ru0082colte la tempu0088te )

Environnement eacute egrave ecirc

Unix u00e9 u00e8 u00ea

Dos u0082 u008a u0088

Windows u00e9 u00e8 u00ea

Mac OS u00c8 u00cb u00cd

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

54

Exemple sous MacOS

Systemoutprint(Qui su00cbme le vent )Systemoutprint(ru00c8colte la tempu00cdte )

Pour connaicirctre le code Unicode drsquoun caractegravere donneacute en fonction de votre environnement detravail vous pouvez utiliser lrsquoexemple deacutecrit agrave la section laquo La boucle for raquo du chapitre 4 laquo Faire desreacutepeacutetitions raquo

La saisie de donneacuteesJava est un langage conccedilu avant tout pour ecirctre exeacutecuteacute dans un environnement Internet etutilisant des programmes essentiellement axeacutes sur le concept drsquointerface graphique(gestion des boutons menus fenecirctres etc) Dans ce type drsquoenvironnement la saisie dedonneacutees est geacutereacutee par des fenecirctres speacutecialiseacutees appeleacutees fenecirctres de dialogue

Lrsquoobjectif de cet ouvrage est drsquoinitier le lecteur au langage Java et surtout de lui fairecomprendre comment construire et eacutelaborer un programme Pour cet apprentissage(algorithme et langage) il nrsquoest pas recommandeacute de se lancer dans lrsquoeacutecriture deprogrammes utilisant des boutons des menus et autres fenecirctres sans avoir eacutetudieacute aupreacutealable toute la libraire AWT (Abstract Windowing Toolkit) de Java Cette librairiefacilite il est vrai la construction drsquoapplications graphiques mais elle complique etalourdit lrsquoeacutecriture des programmes

Pour plus de deacutetails sur la librairie AWT reportez-vous au chapitre 11 laquo Dessiner des objets raquo

Crsquoest pourquoi nous avons deacutelibeacutereacutement choisi de travailler dans un environnement nongraphique plus simple agrave programmer

Dans cet environnement le langage Java propose la fonction Systeminread() quipermet la saisie de donneacutees au clavier sans lrsquointermeacutediaire de fenecirctres graphiques Cettefonction est deacutefinie dans la bibliothegraveque System agrave lrsquointeacuterieur du sous-ensemble in Elleutilise le programme de lecture au clavier read()

La fonction Systeminread() permet de reacutecupeacuterer un et un seul caractegravere saisi auclavier Si lrsquoutilisateur souhaite saisir des valeurs ou des noms composeacutes de plusieurscaractegraveres le programme doit contenir autant drsquoinstructions Systeminread() que decaractegraveres agrave saisir Le nombre de caractegraveres agrave saisir variant suivant lrsquoutilisation delrsquoapplication cette fonction nrsquoest pas directement utilisable de cette faccedilon

La classe LirejavaCrsquoest pourquoi nous proposons au lecteur un ensemble de fonctions de lecture quipermettent de saisir autant de caractegraveres que souhaiteacute Pour terminer la saisie il suffit dela valider en appuyant sur la touche entreacutee du clavier De plus il existe autant de fonc-tions de lecture que de types de variables Il est tregraves facile de saisir des valeurs numeacuteri-ques de type entier (byte short int et long) ou reacuteel (float et double) et des caractegraveresde type char ou String

Pour ce faire la technique consiste agrave utiliser comme nom de fonction le nom Lire()ougrave correspond agrave la premiegravere lettre du type de la variable agrave saisir Pour saisir un entier

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

55

nous utilisons la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute int repreacute-sentant le type entier) Lire est le nom de la bibliothegraveque des fonctions de saisie devaleurs au clavier Elle est deacutefinie dans le fichier Lirejava Vous trouverez ce fichierdans le CD-Rom livreacute avec cet ouvrage

Dans ce fichier que tout lecteur peut consulter agrave lrsquoaide drsquoun eacutediteur de texte est deacutefinilrsquoensemble des fonctions qui facilitent la saisie des donneacutees au clavier Ces fonctions seronteacutetudieacutees et analyseacutees au fur et agrave mesure de lrsquoavancement des connaissances mais pour vousfamiliariser rapidement avec leur emploi vous trouverez ci-dessous un programme simpleet complet qui utilise toutes les fonctions de saisie proposeacutees par lrsquoauteur

Exemple code source complet

public class TestLire public static void main (String [] Arg) Deacuteclaration des variables les noms sont choisis pour une meilleure lisibiliteacute du programme drsquoautres noms auraient pu ecirctre retenus byte val_byte short val_short int val_int long val_long float val_float double val_double char val_char String val_String Saisir une valeur de type byte Systemoutprintln(Entrez un byte ) val_byte = Lireb() Saisir une valeur de type short Systemoutprintln(Entrez un short ) val_short = Lires() Saisir une valeur de type int Systemoutprintln(Entrez un int ) val_int = Lirei() Saisir une valeur de type long Systemoutprintln(Entrez un long ) val_long = Lirel() Saisir une valeur de type float Systemoutprintln(Entrez un float ) val_float = Liref() Saisir une valeur de type double Systemoutprintln(Entrez un double ) val_double = Lired() Saisir une valeur de type String Systemoutprintln(Entrez un String ) val_String = LireS() Saisir une valeur de type char Systemoutprintln(Entrez un char ) val_char = Lirec() Afficher les diffeacuterentes valeurs saisies au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

56

Systemoutprintln(vous avez entre le byte + val_byte) Systemoutprintln(vous avez entre le short + val_short) Systemoutprintln(vous avez entre lrsquoentier + val_int) Systemoutprintln(vous avez entre le long + val_long) Systemoutprintln(vous avez entre le float + val_float) Systemoutprintln(vous avez entre le double + val_double) Systemoutprintln(vous avez entre le caractere + val_char) Systemoutprintln(vous avez entre le String + val_String)

Apregraves la deacuteclaration des variables le programme demande la saisie de valeurs drsquouncertain type Lrsquoutilisateur fournit la valeur correspondant au type demandeacute et valide lasaisie en appuyant sur la touche Entreacutee du clavier Une fois saisies les valeurs sont affi-cheacutees agrave lrsquoeacutecran

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez un byte 110000Entrez un short --3300556600Entrez un int 112255669988Entrez un long 9988776688776655Entrez un float 331144115599Entrez un double 112233887766445533009977443322Entrez un String EExxeemmppllee Entrez un char AAvous avez entre le byte 100 vous avez entre le short -30560vous avez entre lrsquoentier 125698vous avez entre le long 98768765vous avez entre le float 314159vous avez entre le double 123876453097432vous avez entre le caractere Avous avez entre le String Exemple

ReacutesumeacutePour communiquer une information lrsquoordinateur affiche un message agrave lrsquoeacutecran Ondit qursquoil reacutealise une opeacuteration de sortie (out) ou drsquoeacutecriture de donneacutees Agrave lrsquoinverselorsque lrsquoutilisateur communique des donneacutees au programme par lrsquointermeacutediaire duclavier il effectue une opeacuteration drsquoentreacutee (in) ou de lecture de donneacutees

Dans le langage Java les opeacuterations de sortie sont reacutealiseacutees gracircce agrave lrsquoinstructionSystemoutprint() qui permet drsquoafficher des informations agrave lrsquoeacutecran

Par exemple lrsquoinstruction

Systemoutprint(F + francs valent + E + euros)

affiche agrave lrsquoeacutecran le contenu de la variable F suivi du texte laquo francs valent raquo puis lecontenu de la variable E suivi du texte laquo euros raquo

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

57

Exercices

Comprendre les opeacuterations de sortie

Soit un programme Java contenant les deacuteclarations

int i = 223 j = 135 float a = 3355f b = 205f char R = rsquoRrsquo T = rsquoTrsquo

Deacutecrivez lrsquoaffichage geacuteneacutereacute par chacune des instructions suivantes

Systemoutprintln(Vous avez entre + i)

Systemoutprintln(Pour un montant de + a + le total vaut + i + j)

Systemoutprint(Apres reduction de + b + vous gagnez )

Systemoutprintln( (ab)100 + euros)

Systemoutprint( La variable R = + R + et T = + T)

Pour distinguer le commentaire du nom de variable le commentaire est placeacute entreguillemets Le contenu de la variable est afficheacute en reacuteunissant la variable aucommentaire agrave lrsquoaide du signe +

Pour afficher des reacutesultats sur plusieurs lignes il convient drsquoutiliser lrsquoinstruction

Systemoutprintln()

Dans le langage Java les opeacuterations drsquoentreacutee ne sont pas aussi simples drsquoemploi dufait qursquoelles sont le plus souvent reacutealiseacutees agrave lrsquoaide de fenecirctres graphiques geacuteneacuterantdes programmes plus complexes agrave eacutecrire

Crsquoest la raison pour laquelle lrsquoauteur propose un ensemble de fonctions de lecturequi permettent la saisie de valeurs de tout type Par exemple pour saisir un entier ilsuffit drsquoutiliser la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute intrepreacutesentant le type entier) Les fonctions de lecture ont pour nom drsquoappel

Lireb() pour saisir une valeur de type byte

Lires() pour saisir une valeur de type short

Lirei() pour saisir une valeur de type int

Lirel() pour saisir une valeur de type long

Liref() pour saisir une valeur de type float

Lired() pour saisir une valeur de type double

LireS() pour saisir une valeur de type String

Lirec() pour saisir une valeur de type char

21

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

58

En tenant compte des deacuteclarations de variables suivantes eacutecrivez les instructionsSystemoutprint() de faccedilon agrave obtenir lrsquoaffichage suivant

Notez que la racine carreacutee de x srsquoobtient par la fonction Mathsqrt(x) et que ab se calcule avec lameacutethode Mathpow(ab)

Comprendre les opeacuterations drsquoentreacuteePour chacun des deux programmes suivants et compte tenu des informations four-nies par lrsquoutilisateur quelles sont les valeurs afficheacutees agrave lrsquoeacutecran

Observer et comprendre la structure drsquoun programme JavaEn prenant exemple sur la structure suivante eacutecrivez un programme Euro quiconvertisse des francs en euros (Rappel 1 euro = 6559 57 francs)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe public static void main(String [] argument) Deacuteclarer les variables repreacutesentant les francs et les euros ainsi que le taux de conversion helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher et Saisir le nombre de francs helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le nombre drsquoeuros helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat suivant lrsquoexemple donneacute ci-dessous helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

double x = 4 y = 2 double x = 9 y = 3

x = 40 et y = 20Racine carreacutee de 40 = 2040 a la puissance 20 = 160

x = 90 et y = 30Racine carreacutee de 90 = 3090 a la puissance 30 = 7290

Lrsquoutilisateur fournit au clavier 2 puis 3 puis 4 Lrsquoutilisateur fournit au clavier 2

int X Y

X = Lirei()

Y = Lirei()

X = Lirei()

X = X+Y

Systemoutprint( X = + X)

Systemoutprint( Y = + Y)

int X Y

X = Lirei()

Y = 0

X = X+Y

Systemoutprintln( X = + X)

Systemoutprintln( Y = + Y)

22

23

24

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

59

Lrsquoaffichage du reacutesultat se fera sous la forme suivante

Nombre de francs 112200Conversion FE 66555599 5577Nombre drsquoeuros 1188229933

Le projet laquo Gestion drsquoun compte bancaire raquoAfficher le menu principal ainsi que ses optionsLrsquoobjectif du premier programme est drsquoeacutecrire toutes les instructions qui permettentlrsquoaffichage des menus deacutefinis dans le cahier des charges deacutecrit au chapitre introductiflaquo Naissance drsquoun programme raquo ainsi que la saisie des donneacutees demandeacutees Leprogramme construit affiche tous les messages de toutes les options sans controcircle sur lechoix de lrsquoutilisateur

bull Le menu principal srsquoaffiche de la faccedilon suivante 1 Creer un compte2 Afficher un compte3 Creer une ligne comptable4 Sortir5 De lrsquoaideVotre choix

bull Une fois le menu afficheacute le programme attend la saisie du choix de lrsquoutilisateur

bull Lrsquooption 1 du menu principal a pour affichage

Type du compte [Types possibles courant joint eacutepargne] Numero du compte Premiegravere valeur creditee Taux de placement

bull Lrsquooption 2 reacutealise les opeacuterations suivantes

ndash Affiche la demande de saisie du numeacutero du compte que lrsquoutilisateur souhaiteconsulter

ndash Saisit le numeacutero de compte

bull Lrsquooption 3 affiche laquo option non programmee raquo

bull Lrsquooption 4 termine lrsquoexeacutecution du programme Pour cela utilisez la fonction JavaSystemexit(0)

bull Avec lrsquooption 5 le programme affiche une ligne drsquoexplication pour chaque option dumenu principal

copy copyright Eacuteditions Eyrolles

3Faire des choix

Une fois les variables deacutefinies et les valeurs stockeacutees en meacutemoire lrsquoordinateur estcapable de les tester ou de les comparer de faccedilon agrave reacutealiser une instruction plutocirct qursquouneautre suivant le reacutesultat de la comparaison

Le programme nrsquoest alors plus exeacutecuteacute de faccedilon seacutequentielle (de la premiegravere lignejusqursquoagrave la derniegravere) Lrsquoordre est rompu une ou plusieurs instructions eacutetant ignoreacutees enfonction du reacutesultat du test Le programme peut srsquoexeacutecuter en tenant compte decontraintes imposeacutees par le programmeur

Dans ce chapitre nous abordons la notion de choix ou de test en reprenant lrsquoalgorithmedu cafeacute chaud pour le transformer en un algorithme du cafeacute chaud sucreacute ou non(laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

Ensuite agrave la section laquo Lrsquoinstruction if-else raquo nous eacutetudions la structure if-elseproposeacutee par le langage Java qui permet de reacutealiser des choix

Enfin agrave la section laquo Lrsquoinstruction switch ou comment faire des choix multiples raquo nousexaminons le concept de choix multiples par lrsquointermeacutediaire de la structure switch

Lrsquoalgorithme du cafeacute chaud sucreacute ou non

Pour mieux comprendre la notion de choix nous allons reprendre lrsquoalgorithme du cafeacutechaud pour le transformer en algorithme du cafeacute chaud sucreacute ou non Lrsquoeacutenonceacute ainsitransformeacute nous oblige agrave modifier la liste des objets manipuleacutes ainsi que celle des opeacutera-tions agrave reacutealiser

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

62

Deacutefinition des objets manipuleacutesPour obtenir du cafeacute sucreacute nous devons ajouter agrave notre liste un nouvel ingreacutedient lesucre et un nouvel ustensile la petite cuillegravere

cafeacute moulufiltreeaucafetiegravere eacutelectriquetasseeacutelectriciteacutetablesucrepetite cuillegravere

Liste des opeacuterationsDe la mecircme faccedilon nous devons modifier la liste des opeacuterations de faccedilon qursquoelle prenneen compte les nouvelles donneacutees

Verser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtre Prendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique

un filtre un morceau de sucre une petite cuillegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute soit precirct Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le sucre

dans la tasse la petite cuillegravere dans la tasse

Ordonner la liste des opeacuterationsAinsi modifieacutee la liste des opeacuterations doit ecirctre reacuteordonneacutee afin de rechercher le momentle mieux adapteacute pour ajouter les nouvelles opeacuterations

bull En deacutecidant de prendre le sucre et la petite cuillegravere en mecircme temps que le cafeacute et lefiltre nous placcedilons les nouvelles instructions laquo prendrehellip raquo entre les instructions 2 et3 deacutefinies agrave la section laquo Ordonner la liste des opeacuterations raquo du chapitre introductiflaquo Naissance drsquoun programme raquo

bull En deacutecidant de poser le sucre et la petite cuillegravere dans la tasse avant drsquoy verser le cafeacutenous eacutecrivons les nouvelles instructions laquo poserhellip raquo avant lrsquoinstruction 15 du mecircmeexemple

Nous obtenons la liste des opeacuterations suivantes

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un morceau de sucre4 Prendre une petite cuillegravere5 Prendre un filtre6 Verser le cafeacute dans le filtre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

63

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Poser le sucre dans la tasse15 Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Eacutecrite ainsi cette marche agrave suivre nous permet drsquoobtenir un cafeacute chaud sucreacute Elle nenous autorise pas agrave choisir entre sucreacute ou non Pour cela nous devons introduire un testen posant une condition devant chaque instruction concernant la prise du sucre crsquoest-agrave-dire

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table

2 Prendre du cafeacute

3 Si (cafeacute sucreacute) Prendre un morceau de sucre4 Si (cafeacute sucreacute) Prendre une petite cuillegravere5 Prendre un filtre

6 Verser le cafeacute dans le filtre

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Si (cafeacute sucreacute) Poser le sucre dans la tasse15 Si (cafeacute sucreacute) Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Dans cette situation nous obtenons du cafeacute sucreacute ou non selon notre choix Remarquonscependant que le test Si (cafeacute sucreacute) est identique pour les instructions 3 4 14 et 15Pour cette raison et sachant que chaque test repreacutesente un coucirct en termes de tempsdrsquoexeacutecution il est conseilleacute de regrouper au mecircme endroit toutes les instructions rela-tives agrave un mecircme test

Crsquoest pourquoi nous distinguons deux blocs drsquoinstructions distincts

bull les instructions soumises agrave la condition de cafeacute sucreacute (II Preacuteparer le sucre)

bull les instructions reacutealisables quelle que soit la condition (I Preacuteparer le cafeacute)copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

64

Dans ce cas la nouvelle solution srsquoeacutecrit

La reacutealisation du bloc I Preacuteparer le cafeacute nous permet drsquoobtenir du cafeacute chaudEnsuite en exeacutecutant le test Si (cafeacute sucreacute) deux solutions sont possibles

bull La proposition (cafeacute sucreacute) est vraie et alors les instructions 1 agrave 4 du blocII Preacuteparer le sucre sont exeacutecuteacutees Nous obtenons du cafeacute chaud sucreacute

bull La proposition (cafeacute sucreacute) est fausse et les instructions qui suivent ne sont pasexeacutecuteacutees Nous obtenons un cafeacute non sucreacute

Pour programmer un choix nous avons eacutecrit une condition devant les instructionsconcerneacutees En programmation il en est de mecircme Le langage Java propose plusieursinstructions de test agrave savoir la structure if-else que nous eacutetudions ci-apregraves et la struc-ture switch que nous analysons agrave la section laquo Lrsquoinstruction switch ou comment faire deschoix multiples raquo un peu plus loin dans ce chapitre

Lrsquoinstruction if-elseLrsquoinstruction if-else se traduit en franccedilais par les termes si-sinon Elle permet deprogrammer un choix en placcedilant derriegravere le terme if une condition comme nous avonsplaceacute une condition derriegravere le terme si de lrsquoalgorithme du cafeacute chaud sucreacute ou non

Lrsquoinstruction if-else se construit de la faccedilon suivante

bull en suivant une syntaxe ou forme preacutecise du langage Java (voir laquo Syntaxe drsquoif-else raquo)

bull en preacutecisant la condition agrave tester (voir laquo Comment eacutecrire une condition raquo)

Nous preacutesentons en fin de cette section un exemple de programme qui recherche la plusgrande des deux valeurs saisies au clavier (voir laquo Rechercher le plus grand de deuxeacuteleacutements raquo)

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un filtre4 Verser le cafeacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le cafeacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 Eteindre la cafetiegravere13 Verser le cafeacute dans la tasse

I Preacuteparer le cafeacute

Si (cafeacute sucreacute)

1 Prendre un morceau de sucre2 Prendre une petite cuillegravere3 Poser le sucre dans la tasse4 Poser la petite cuillegravere dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

65

Syntaxe drsquoif-elseLrsquoeacutecriture de lrsquoinstruction if-else obeacuteit aux regravegles de syntaxe suivantes

if (condition) si la condition est vraie faire plusieurs instructions faitelse sinon (la condition ci-dessus est fausse) faire plusieurs instructions fait

bull Si la condition situeacutee apregraves le mot-cleacute if et placeacutee obligatoirement entre parenthegravesesest vraie alors les instructions placeacutees dans le bloc deacutefini par les accolades ouvrante etfermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves le mot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs peut ecirctre exeacutecuteacute agrave la fois selon que la conditionest veacuterifieacutee ou non

Remarquons que

bull La ligne drsquoinstruction if(condition)ou else ne se termine jamais par un point-virgule ()

bull Les accolades et deacutefinissent un bloc drsquoinstructions Cela permet de regrouperensemble toutes les instructions relatives agrave un mecircme test

bull Lrsquoeacutecriture du bloc else nrsquoest pas obligatoire Il est possible de nrsquoeacutecrire qursquoun bloc ifsans programmer drsquoinstruction dans le cas ougrave la condition nrsquoest pas veacuterifieacutee (commedans lrsquoalgorithme du cafeacute chaud sucreacute ou non) En drsquoautres termes il peut y avoir desif sans else

bull Srsquoil existe un bloc else celui-ci est obligatoirement laquo accrocheacute raquo agrave un if Autrementdit il ne peut y avoir drsquoelse sans if

bull Le langage Java propose une syntaxe simplifieacutee lorsqursquoil nrsquoy a qursquoune seule instruc-tion agrave exeacutecuter dans lrsquoun des deux blocs if ou else Dans ce cas les accoladesouvrante et fermante ne sont pas obligatoires

if (condition) une seule instruction else une seule instruction

ou

if (condition) faire plusieurs instructions faitelse une seule instruction

ou encore

if (condition) une seule instruction else faire

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

66

plusieurs instructions fait

Une fois connue la syntaxe geacuteneacuterale de la structure if-else nous devons eacutecrire la condi-tion (placeacutee entre parenthegraveses juste apregraves if) permettant agrave lrsquoordinateur drsquoexeacutecuter le test

Comment eacutecrire une conditionLrsquoeacutecriture drsquoune condition en Java fait appel aux notions drsquoopeacuterateurs relationnels etconditionnels

Les opeacuterateurs relationnels

Une condition est formeacutee par lrsquoeacutecriture de la comparaison de deux expressions uneexpression pouvant ecirctre une valeur numeacuterique ou une expression arithmeacutetique Pourcomparer deux expressions le langage Java dispose de six symboles repreacutesentant lesopeacuterateurs relationnels traditionnels en matheacutematiques

Un opeacuterateur relationnel permet de comparer deux expressions de mecircme type Il nrsquoestpas possible de comparer un reacuteel avec un entier ou un entier avec un caractegravere

Lorsqursquoil srsquoagit de comparer deux expressions composeacutees drsquoopeacuterateurs arithmeacutetiques (+- ) les opeacuterateurs relationnels sont moins prioritaires par rapport aux opeacuterateursarithmeacutetiques De cette faccedilon les expressions matheacutematiques sont drsquoabord calculeacuteesavant drsquoecirctre compareacutees

Notons que pour tester lrsquoeacutegaliteacute entre deux expressions nous devons utiliser le symbole== et non pas un simple = En effet en Java le signe = nrsquoest pas un signe drsquoeacutegaliteacute au sensde la comparaison mais le signe de lrsquoaffectation qui permet de placer une valeur dansune variable

Exemple

int a = 3 b = 5 char lettre = rsquoirsquo car = rsquojrsquo

bull La condition (a = b) est vraie car 3 est diffeacuterent de 5

bull La condition (a + 2 == b) est vraie car 3 + 2 vaut 5

bull La condition (a + 8 lt 2 b)est fausse car 3 + 8 est plus grand que 2 5

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt==

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

67

bull La condition (lettre lt= car) est vraie car le caractegravere rsquoirsquo est placeacute avant rsquojrsquo danslrsquoordre alphabeacutetique

bull La condition (lettre == rsquowrsquo) est fausse car le caractegravere rsquoirsquo est diffeacuterent du carac-tegravere rsquowrsquo

Les opeacuterateurs logiques

Les opeacuterateurs logiques sont utiliseacutes pour associer plusieurs conditions simples et decette faccedilon creacuteer des conditions multiples en un seul test Il existe trois grands opeacutera-teurs logiques symboliseacutes par les caractegraveres suivants

Exemples

int x = 3 y = 5 z = 2 r = 6

bull Sachant que la condition (x lt y) ampamp (z lt r) est vraie si les deux expressions(x lt y) et (z lt r) sont toutes les deux vraies et devient fausse si lrsquoune des deuxexpressions est fausse lrsquoexpression donneacutee en exemple est vraie En effet (3 lt 5) estvraie et (2 lt 6) est vraie

bull Sachant que la condition (x gt y) || (z lt r) est vraie si lrsquoune des expressions(x gt y) ou (z lt r) est vraie et devient fausse si les deux expressions sont fausseslrsquoexpression donneacutee en exemple est vraie car (3 gt 5) est fausse mais (2 lt 6) estvraie

bull Sachant que la condition (z lt r) est vraie si lrsquoexpression (z lt r) est fausse etdevient fausse si lrsquoexpression est vraie alors lrsquoexpression donneacutee en exemple estfausse car (2 lt 6) est vraie

Rechercher le plus grand de deux eacuteleacutementsPour mettre en pratique les notions theacuteoriques abordeacutees aux deux sections preacuteceacutedentesnous allons eacutecrire un programme qui affiche dans lrsquoordre croissant deux valeurs entiegraveressaisies au clavier et recherche la plus grande des deux Pour cela nous devons

1 Demander la saisie de deux valeurs au clavier

2 Tester si la premiegravere valeur saisie est plus grande que la seconde

a Si tel est le cas

ndash afficher dans lrsquoordre croissant en affichant la seconde valeur saisie puis lapremiegravere

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la premiegraverevaleur

Opeacuterateur Signification

ampamp||

NON logiqueET logiqueOU logique

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

68

b Sinon

ndash afficher dans lrsquoordre croissant en affichant la premiegravere valeur saisie puis laseconde

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la secondevaleur

3 Afficher la plus grande des valeurs

Nous devons dans un premier temps deacuteclarer trois variables entiegraveres deux pour lesvaleurs agrave saisir et une pour stocker la plus grande des deux Nous eacutecrivons lrsquoinstructionde deacuteclaration suivante

int premiegravere deuxiegraveme laPlusGrande

1 La saisie des deux valeurs est ensuite reacutealiseacutee par (voir le chapitre 2 laquo Communiquerune information raquo)

Systemoutprint(Entrer une valeur ) premiegravere = Lirei() Systemoutprint(Entrer une deuxieme valeur ) deuxiegraveme = Lirei()

2 Pour tester si la premiegravere valeur saisie est plus grande que la seconde lrsquoinstructionif srsquoeacutecrit

if (premiegravere gt deuxiegraveme)

a Deux instructions composent ce test lrsquoaffichage dans lrsquoordre croissant puis lestockage de la plus grande valeur Il est donc neacutecessaire de les placer dans un blocdeacutefini par une ouvrante et une fermante

Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(deuxiegraveme + + premiegravere) Stocker la plus grande dans une variable speacutecifique laPlusGrande = premiegravere

b De la mecircme faccedilon le cas contraire est deacutecrit par lrsquoinstruction else et est composeacutede deux instructions Nous avons donc

else Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(premiegravere + + deuxiegraveme) Stocker la plus grande dans une variable speacutecifique laPlusGrande = deuxiegraveme

3 Nous affichons enfin la plus grande valeur par lrsquoinstruction

Systemoutprintln(La plus grande valeur est + laPlusGrande)

Ce message est afficheacute dans tous les cas et lrsquoinstruction est donc placeacutee en dehors detoute structure conditionnelle

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

69

Pour finir le programme est placeacute dans une fonction main() et une classe que nousappelons Maximum puisqursquoil srsquoagit ici de trouver la valeur maximale de deux valeurs Decette faccedilon le programme peut ecirctre compileacute et exeacutecuteacute

Exemple code source complet

public class Maximum Le fichier srsquoappelle Maximumjava public static void main (String [] parametre) int premiegravere deuxiegraveme laPlusGrande Systemoutprintln(Entrer une valeur ) premiegravere = Lirei() Systemoutprintln(Entrer une deuxieme valeur ) deuxiegraveme = Lirei() if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere else Systemoutprintln(premiegravere + + deuxiegraveme) laPlusGrande = deuxiegraveme Systemoutprintln(La plus grande valeur est + laPlusGrande) Fin du main () Fin de la Class Maximum

Reacutesultat de lrsquoexeacutecution

(Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur)

Entrer une valeur 33Entrer une deuxieme valeur 553 5La plus grande valeur est 5

La premiegravere valeur eacutetant plus petite que la seconde le programme exeacutecute les instruc-tions placeacutees dans le bloc else

Deux erreurs agrave eacuteviterDeux types drsquoerreurs sont agrave eacuteviter par le programmeur deacutebutant Il srsquoagit des erreursissues drsquoune mauvaise construction des blocs if ou else et drsquoun placement incorrect dupoint-virgule

La construction de blocs

Reprenons lrsquoexemple preacuteceacutedent en lrsquoeacutecrivant comme suit

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

70

else Systemoutprintln(premiegravere+ +deuxiegraveme) laPlusGrande = deuxiegraveme

En exeacutecutant pas agrave pas cet extrait de programme nous remarquons qursquoil nrsquoy a pasdrsquoaccolade () ouvrante derriegravere lrsquoinstruction if Cette derniegravere ne possegravede donc pas debloc composeacute de plusieurs instructions Seule lrsquoinstruction drsquoaffichageSystemoutprintln(deuxiegraveme + + premiegravere) se situe dans if Lrsquoexeacutecutiondrsquoif srsquoachegraveve donc juste apregraves lrsquoaffichage des valeurs dans lrsquoordre croissant

Ensuite lrsquoinstruction lePlusGrand = premiegravere est theacuteoriquement exeacutecuteacutee en dehorsde toute condition Cependant lrsquoinstruction suivante est else alors que lrsquoinstruction ifsrsquoest acheveacutee preacuteceacutedemment Le compilateur ne peut attribuer ce else agrave un if Il y adonc erreur de compilation du type rsquoelsersquo without rsquoifrsquo

De la mecircme faccedilon il y a erreur de compilation lorsque le programme est construit sur laforme suivante

if (premiegravere gt deuxiegraveme) Leplusgrand = premiegravere else

Le point-virgule

Dans le langage Java le point-virgule constitue une instruction agrave part entiegravere qui repreacute-sente lrsquoinstruction vide Par conseacutequent eacutecrire le programme suivant ne provoqueaucune erreur agrave la compilation

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere)

Lrsquoexeacutecution de cet extrait de programme a pour reacutesultat

Si premiegravere est plus grand que deuxiegraveme lrsquoordinateur exeacutecute le (point-virgule) situeacuteimmeacutediatement apregraves la condition crsquoest-agrave-dire rien Lrsquoinstruction if est termineacutee puisqursquoilnrsquoy a pas drsquoaccolades ouvrante et fermante Seule lrsquoinstruction est soumise agrave if

Le message affichant les valeurs par ordre croissant ne fait pas partie du test Il est doncafficheacute quelles que soient les valeurs de premiegravere et deuxiegraveme

Des if-else imbriqueacutes Dans le cas de choix arborescents ndash un choix eacutetant fait drsquoautres choix sont agrave faire etainsi de suite ndash il est possible de placer des structures if-else agrave lrsquointeacuterieur drsquoif-elseOn dit alors que les structures if-else sont imbriqueacutees les unes dans les autres

Lorsque ces imbrications sont nombreuses il est possible de les repreacutesenter agrave lrsquoaide drsquoungraphique de structure arborescente dont voici un exemple

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

71

Quand il y a moins drsquoelse que drsquoif Une instruction if peut ne pas contenir drsquoinstruction else Dans de tels cas il peutparaicirctre difficile de savoir agrave quel if est associeacute le dernier else Comparons les deuxexemples suivants

Imbrications drsquoif else Repreacutesentation du choix arborescent

if (Condition 1) if (Condition 2) instruction A else instruction B else instruction C

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else

instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

72

Du premier au deuxiegraveme exemple par le jeu des fermetures drsquoaccolades le dernier blocelse est deacuteplaceacute drsquoun bloc vers le haut Ce deacuteplacement modifie la structure arbores-cente Les algorithmes associeacutes ont des reacutesultats totalement diffeacuterents

Pour deacuteterminer une relation if-else remarquons qursquoun laquo bloc else raquo se rapportetoujours au dernier laquo bloc if raquo rencontreacute auquel un else nrsquoa pas encore eacuteteacute attribueacute

Les blocs if et else eacutetant deacutelimiteacutes par les accolades ouvrantes et fermantes il est conseilleacutepour eacuteviter toute erreur de bien relier chaque parenthegravese ouvrante avec sa fermante

Lrsquoinstruction switch ou comment faire des choix multiplesLorsque le nombre de choix possible est plus grand que deux lrsquoutilisation de la structureif-else devient rapidement fastidieuse Les imbrications des blocs demandent agrave ecirctreveacuterifieacutees avec preacutecision sous peine drsquoerreur de compilation ou drsquoexeacutecution

Crsquoest pourquoi le langage Java propose lrsquoinstruction switch (traduire par selon ousuivant) qui permet de programmer des choix multiples selon une syntaxe plus claire

Construction du switchLrsquoeacutecriture de lrsquoinstruction switch obeacuteit aux regravegles de syntaxe suivantes

switch (valeur) case eacutetiquette 1 Une ou plusieurs instructions

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

73

break case eacutetiquette 2 case eacutetiquette 3 Une ou plusieurs instructions break default Une ou plusieurs instructions

La variable valeur est eacutevalueacutee Suivant cette valeur le programme recherche lrsquoeacutetiquettecorrespondant agrave la valeur obtenue et deacutefinie agrave partir des instructions case eacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variable valeuril exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrer le mot-cleacutebreak

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecute lesinstructions de lrsquoeacutetiquette default

Drsquoune maniegravere geacuteneacuterale remarquons que

bull Le type de la variable valeur ne peut ecirctre que char ou int byte short ou long Ilnrsquoest donc pas possible de tester des valeurs reacuteelles ou des mots

bull Une eacutetiquette peut contenir aucune une ou plusieurs instructions

bull Lrsquoinstruction break permet de sortir du bloc switch Srsquoil nrsquoy a pas de break pour uneeacutetiquette donneacutee le programme exeacutecute les instructions de lrsquoeacutetiquette suivante

Calculer le nombre de jours drsquoun mois donneacutePour mettre en pratique les notions theacuteoriques abordeacutees agrave la section preacuteceacutedente nousallons eacutecrire un programme qui calcule et affiche le nombre de jours drsquoun mois donneacute

Le nombre de jours dans un mois peut varier entre les valeurs 28 29 30 ou 31 suivant lemois et lrsquoanneacutee Les mois de janvier mars mai juillet aoucirct octobre et deacutecembre sont desmois de 31 jours Les mois drsquoavril juin septembre et novembre sont des mois de 30 joursSeul le mois de feacutevrier est particulier puisque son nombre de jours est de 29 jours pour lesanneacutees bissextiles et de 28 jours dans le cas contraire Sachant cela nous devons

bull Demander la saisie au clavier du numeacutero du mois ainsi que de lrsquoanneacutee rechercheacutee

bull Creacuteer autant drsquoeacutetiquettes qursquoil y a de mois dans une anneacutee crsquoest-agrave-dire 12 Comptetenu du fonctionnement de la structure switch chaque eacutetiquette est une valeur entiegraverecorrespondant au numeacutero du mois de lrsquoanneacutee (1 pour janvier 2 pour feacutevrier etc)

bull Regrouper les eacutetiquettes relatives aux mois agrave 31 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Regrouper les eacutetiquettes relatives aux mois agrave 30 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Pour lrsquoeacutetiquette relative au mois de feacutevrier tester la valeur de lrsquoanneacutee pour savoir silrsquoanneacutee concerneacutee est bissextile ou non Une anneacutee est bissextile tous les quatre anssauf lorsque le milleacutesime est divisible par 100 et non pas par 400 En drsquoautres termespour qursquoune anneacutee soit bissextile il suffit que lrsquoanneacutee soit un nombre divisible par 4 et

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

74

non divisible par 100 ou alors par 400 Dans tous les autres cas lrsquoanneacutee nrsquoest pasbissextile

Compte tenu de toutes ces remarques nous devons dans un premier temps deacuteclarer troisvariables entiegraveres une pour repreacutesenter le mois la deuxiegraveme lrsquoanneacutee et la troisiegraveme lenombre de jours par mois Sachant que le mois et le nombre de jours par mois ne deacutepas-sent jamais la valeur 127 nous pouvons les deacuteclarer de type byte Pour lrsquoanneacutee le typeshort suffit (agrave moins drsquoecirctre tregraves optimiste et de vouloir eacuteviter le bug de lrsquoan 32767 )puisque les valeurs de ce type peuvent aller jusqursquoagrave 32767

Exemple code source complet

public class JourParMois Le fichier srsquoappelle JourParMoisjava public static void main (String [] parametre) byte mois nbjours = 0 short anneacutee Systemoutprintln(De quel mois srsquoagit-il ) mois = Lireb() Systemoutprintln(De quelle annee ) anneacutee = Lires() switch(mois) case 1 case 3 Pour les mois agrave 31 jours case 5 case 7 case 8 case 10 case 12 nbjours = 31 break case 4 case 6 Pour les mois agrave 30 jours case 9 case 11 nbjours = 30 break case 2 Pour le cas particulier du mois de feacutevrier if (anneacutee 4 == 0 ampamp anneacutee 100 = 0 || anneacutee 400 == 0) nbjours = 29 else nbjours = 28 break default En cas drsquoerreur de frappe Systemoutprintln(Impossible ce mois nrsquoexiste pas ) Systemexit(0) Systemoutprint( En + annee + le mois ndeg + mois) Systemoutprintln( a + nbjours + jours ) Fin du main() Fin de la class JourParMois

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

75

Exeacutecution 1

De quel mois srsquoagit-il 55De quelle annee 11999999En 1999 le mois ndeg 5 a 31 jours

Le programme recherche lrsquoeacutetiquette 5 Il exeacutecute les instructions qui suivent jusqursquoagraverencontrer un break Pour lrsquoeacutetiquette 5 le programme exeacutecute les instructions deseacutetiquettes 7 8 10 et 12 car ces eacutetiquettes ne possegravedent ni instructions ni break Seulelrsquoeacutetiquette 12 possegravede une instruction qui affecte la valeur 31 agrave la variable nbjoursLrsquoinstruction break qui suit permet de sortir de la structure switch Le programmeexeacutecute enfin lrsquoinstruction situeacutee immeacutediatement apregraves le switch crsquoest-agrave-dire lrsquoaffichagedu message annonccedilant le reacutesultat

Exeacutecution 2

De quel mois srsquoagit-il 22De quelle annee 22000000En 2000 le mois ndeg 2 a 29 jours

Ici le programme va directement agrave lrsquoeacutetiquette 2 qui est composeacutee drsquoun test sur lrsquoanneacuteepour savoir si lrsquoanneacutee est bissextile Une anneacutee est bissextile lorsque son milleacutesime estdivisible par 4 agrave lrsquoexception des anneacutees dont le milleacutesime est divisible par 100 et non paspar 400 La valeur 2000 est divisible par 4 100 et 400 puisque le reste de la divisionentiegravere () de 2000 par 4 100 ou 400 est nul La variable nbjours prend donc la valeur29 Le programme sort ensuite du switch gracircce agrave lrsquoinstruction break qui suit et exeacutecutepour finir lrsquoaffichage du reacutesultat

Exeacutecution 3

De quel mois srsquoagit-il 1155De quelle annee 11999999Impossible ce mois nrsquoexiste pas

Lrsquoeacutetiquette 15 nrsquoeacutetant pas deacutefinie dans le bloc switch le programme exeacutecute les instruc-tions qui composent lrsquoeacutetiquette default Le programme affiche un message drsquoerreur ettermine son exeacutecution gracircce agrave lrsquoinstruction Systemexit(0)

Remarquons que gracircce agrave lrsquoeacutetiquette default le programme connaicirct les instructions agraveexeacutecuter dans le cas de choix laquo anormaux raquo (erreur de frappe par exemple ou valeursaisie nrsquoentrant pas dans lrsquointervalle des valeurs possibles traiteacutees par le programme) Decette faccedilon il devient possible de preacutevenir drsquoeacuteventuelles erreurs pouvant causer lrsquoarrecirctbrutal de lrsquoexeacutecution du programme

Comment choisir entre if-else et switch

La structure switch ne permet de tester que des eacutegaliteacutes de valeurs entiegraveres (byte shortint ou long) ou de type caractegravere (char) Elle ne peut donc pas ecirctre utiliseacutee pour

bull Tester des valeurs reacuteelles (float ou double) ou des mots (String)

bull Rechercher si la valeur est plus grande plus petite ou diffeacuterente drsquoune certaine eacutetiquettecopy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

76

Par contre lrsquoinstruction if-else peut ecirctre employeacutee dans tous les cas en testant tout typede variable selon toute condition

Remarquons cependant que

bull Si une condition parmi drsquoautres conditions envisageacutees a une plus grande probabiliteacutedrsquoecirctre satisfaite celle-ci doit ecirctre placeacutee en premier test dans une structure if else defaccedilon agrave eacuteviter agrave lrsquoordinateur drsquoeffectuer de trop nombreux tests inutiles

bull Si toutes les conditions ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees lastructure switch est plus efficace Elle ne demande qursquoune seule eacutevaluation alors quedans les instructions if-else imbriqueacutees chaque condition doit ecirctre eacutevalueacutee

ReacutesumeacuteLrsquoinstruction if else (traduction si sinon) permet de programmer des choix Defaccedilon geacuteneacuterale lrsquoinstruction if else srsquoeacutecrit

bull Si la condition situeacutee apregraves le mot-cleacute if (placeacutee obligatoirement entre paren-thegraveses) est vraie alors les instructions placeacutees dans le bloc deacutefini par les accoladesouvrante et fermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves lemot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs est exeacutecuteacute selon que la condition est veacuterifieacuteeou non De plus cette condition fait intervenir des

bull Opeacuterateurs relationnels

if (condition)

si la condition est vraie

faire

plusieurs instructions

fait

else sinon

faire

plusieurs instructions

fait

Ou encore

if (condition) une seule instruction

else une seule instruction

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt= =

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

77

ExercicesComprendre les niveaux drsquoimbrication

Exeacutecutez agrave la main (crsquoest-agrave-dire ligne par ligne) ce programme Pour cela voussupposerez que la valeur saisie au clavier soit 4 Quel est le reacutesultat afficheacute

public class Racine public static void main (String [] parametre) double x r

bull Opeacuterateurs logiques

Lorsque plusieurs instructions if-else sont imbriqueacutees les unes dans les autres unelse se rapporte toujours au dernier bloc if rencontreacute auquel un else nrsquoa pas encoreeacuteteacute attribueacute

Lrsquoinstruction switch (traduction selon ou suivant) permet de programmer deschoix multiples Elle a pour syntaxe

switch(valeur) le type de la variable est char ou int case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch default suite drsquoinstructions

La variable valeur est eacutevalueacutee Suivant cette eacutevaluation le programme recherchelrsquoeacutetiquette correspondant agrave la valeur eacutevalueacutee et deacutefinie agrave partir des instructions caseeacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variablevaleur il exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrerle mot-cleacute break

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecuteles instructions de lrsquoeacutetiquette default

Lrsquoinstruction if-else est utiliseacutee lorsque lrsquoune des conditions envisageacutees a unegrande probabiliteacute drsquoecirctre satisfaite Si toutes les conditions ont une probabiliteacute drsquoecirctrereacutealiseacutees on utilise plutocirct la structure switch

Opeacuterateur Signification

NON logique

ampamp ET logique

|| OU logique

31

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

78

Systemoutprint(Entrer un chiffre ) x = Lired() if (x gt = 0) r = Mathsqrt(x) else r = Mathsqrt(-x) Systemoutprint(Pour +x+ Le resultat est +r) Fin du main () Fin de la Class Racine

Mecircme question en supposant la valeur saisie eacutegale agrave ndash 9

Construire une arborescence de choixReprenez et modifiez le programme Maximum donneacute dans ce chapitre de faccedilon qursquoilaffiche un message lorsque les deux valeurs saisies au clavier sont eacutegales

Repreacutesentez graphiquement les choix arborescents suivants

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

Eacutecrivez un programme qui reacutesolve les eacutequations du second degreacute agrave lrsquoaide de struc-tures if-else imbriqueacutees

Soit lrsquoeacutequation ax2 + bx + c = 0 ougrave a b et c repreacutesentent les trois coefficientsentiers de lrsquoeacutequation Pour trouver les solutions reacuteelles x si elles existent

a Eacutetablissez lrsquoarbre des choix associeacutes

1 a = 0 11 b = 0 111 c = 0 tout reacuteel est solution

32

33

34

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

79

112 c = 0 pas de solution 12 b = 0 une seule solution x = - c b 2 a = 0 21 b2 - 4ac gt= 0 deux solutions x1 = - b + Mathsqrt(b b ndash 4 a c) 2 a x2 = - b - Mathsqrt(b b ndash 4 a c) 2 a 22 b2 - 4ac lt 0 pas de solution dans les reacuteels

b Deacuteterminez les diffeacuterentes variables agrave deacuteclarer

c Agrave partir de lrsquoarbre des choix eacutecrivez les instructions if-else suivies du testcorrespondant

d Placez dans chaque bloc if ou else les instructions de calcul et drsquoaffichageapproprieacutees

e Placez lrsquoensemble de ces instructions dans une fonction main() et une classeportant le nom SecondDegre

Manipuler les choix multiples geacuterer les caractegraveresEn utilisant la structure switch eacutecrire un programme qui simule une machine agravecalculer dont les opeacuterations soient lrsquoaddition (+) la soustraction (ndash) la multiplica-tion () et la division ()

a En cours drsquoexeacutecution le programme demande agrave lrsquoutilisateur drsquoentrer deuxvaleurs numeacuteriques puis le caractegravere correspondant agrave lrsquoopeacuteration agrave effectuerSuivant le caractegravere entreacute (+ndash) le programme affiche lrsquoopeacuteration effectueacuteeainsi que le reacutesultat

Lrsquoexeacutecution du programme peut par exemple avoir lrsquoallure suivante (les valeursgriseacutees sont celles saisies par lrsquoutilisateur)

Entrez la premiere valeur 22Entrez la seconde valeur 33Type de lrsquooperation (+ - ) Cette operation a pour resultat 2 3 = 6

b Apregraves avoir eacutecrit et exeacutecuteacute le programme avec diffeacuterentes valeurs saisissezdans cet ordre les valeurs suivantes 2 0 puis Que se passe-t-il Pourquoi

c Modifiez le programme de faccedilon agrave ne plus rencontrer cette situation en coursdrsquoexeacutecution

Le projet laquo Gestion drsquoun compte bancaire raquoAcceacuteder agrave un menu suivant lrsquooption choisieLrsquoobjectif est drsquoameacuteliorer le programme reacutealiseacute agrave la fin du chapitre 2 laquo Communiquerune information raquo afin drsquoafficher chaque menu en fonction de lrsquooption choisie par lrsquoutili-sateur

a Apregraves lrsquoaffichage du menu principal le programme teste la valeur entreacutee par lrsquoutili-sateur et affiche lrsquooption correspondante Sachant que toutes les options du menu

35

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

80

principal ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees quelle est lastructure de test la plus approprieacutee

b Modifiez le programme en fonction de la structure de test choisi et placez lesinstructions drsquoaffichage et de saisie dans les options correspondantes

c Pour lrsquooption 1 testez le type du compte afin de saisir le taux drsquoeacutepargne

d Pour lrsquooption 2 demandez au programme de veacuterifier que le numeacutero du compte saisipar lrsquoutilisateur existe de faccedilon agrave

bull Afficher le numeacutero du compte le type la valeur initiale et son taux dans le casdrsquoun compte drsquoeacutepargne si le compte existe

bull Afficher un message indiquant que le numeacutero du compte nrsquoest pas valide si lecompte nrsquoexiste pas

copy copyright Eacuteditions Eyrolles

4Faire des reacutepeacutetitions

La notion de reacutepeacutetition est une des notions fondamentales de la programmation En effetbeaucoup de traitements informatiques sont reacutepeacutetitifs Par exemple la creacuteation drsquounagenda eacutelectronique neacutecessite de saisir un nom un preacutenom et un numeacutero de teacuteleacutephoneautant de fois qursquoil y a de personnes dans lrsquoagenda

Dans de tels cas la solution nrsquoest pas drsquoeacutecrire un programme qui comporte autantdrsquoinstructions de saisie qursquoil y a de personnes mais de faire reacutepeacuteter par le programme lejeu drsquoinstructions neacutecessaires agrave la saisie drsquoune seule personne Pour ce faire le program-meur utilise des instructions speacutecifiques appeleacutees structures de reacutepeacutetition ou bouclesqui permettent de deacuteterminer la ou les instructions agrave reacutepeacuteter

Dans ce chapitre nous abordons la notion de reacutepeacutetition agrave partir drsquoun exemple imageacute(laquo Combien de sucre dans votre cafeacute raquo)

Nous eacutetudions ensuite les diffeacuterentes structures de boucles proposeacutees par le langage Java(sections laquo La boucle dowhile raquo laquo La boucle while raquo et laquo La boucle for raquo) Pourchacune de ces structures nous preacutesentons et analysons un exemple afin drsquoexaminer lesdiffeacuterentes techniques de programmation associeacutees aux structures reacutepeacutetitives

Combien de sucre dans votre cafeacute

Pour bien comprendre la notion de reacutepeacutetition ou de boucle nous allons ameacuteliorer lrsquoalgo-rithme du cafeacute chaud sucreacute de sorte que le programme demande agrave lrsquoutilisateur deprendre un morceau de sucre autant de fois qursquoil le souhaite Pour cela nous reprenonsuniquement le bloc drsquoinstructions II Preacuteparer le sucre (voir au chapitre 3 laquo Fairedes choix raquo la section laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

82

Lrsquoexeacutecution du bloc drsquoinstructions II Preacuteparer le sucre nous permet de mettre un seulmorceau de sucre dans la tasse Si nous deacutesirons mettre plus de sucre nous devonsexeacutecuter les instructions 3 et 4 autant de fois que nous souhaitons de morceaux de sucreRemarquons que dans ce bloc les instructions 1 et 2 ne sont pas agrave reacutepeacuteter sous peinedrsquoavoir autant de petites cuillegraveres que de morceaux de sucre dans la tasse La marche agravesuivre devient degraves lors

Prendre une petite cuillegravere Poser la petite cuillegravere dans la tasseDeacutebut reacutepeacuteter 1 Prendre un morceau de sucre 2 Poser le sucre dans la tasse 3 Poser la question Souhaitez-vous un autre morceau de sucre 4 Attendre la reacuteponseTant que la reacuteponse est OUI retourner agrave Deacutebut reacutepeacuteter

Analysons les reacutesultats possibles de cette nouvelle marche agrave suivre

bull Dans tous les cas nous prenons et posons une petite cuillegravere

bull Ensuite nous entrons sans condition dans une structure de reacutepeacutetition

bull Nous prenons et posons un morceau de sucre quelle que soit la suite des opeacuterationsDe cette faccedilon si nous sortons de la boucle le cafeacute est quand mecircme sucreacute

bull Puis le programme nous demande si nous souhaitons agrave nouveau un morceau de sucre

bull Si notre reacuteponse est OUI le programme retourne au deacutebut de la structure reacutepeacutetitiveplace le sucre dans la tasse et demande de nouveau si nous souhaitons du sucre etc

bull Si la reacuteponse est neacutegative la reacutepeacutetition srsquoarrecircte ainsi que la marche agrave suivre

Pour eacutecrire une boucle nous constatons que

bull Il est neacutecessaire de deacuteterminer ougrave se trouve le deacutebut de la boucle et ougrave se situe la fin(Deacutebut reacutepeacuteter et Tant que pour notre exemple)

bull La sortie de la structure reacutepeacutetitive est soumise agrave la reacutealisation ou non drsquoune condition(la reacuteponse fournie est-elle affirmative ou non )

bull Le reacutesultat du test de sortie de boucle est modifiable par une instruction placeacutee agrave lrsquointeacute-rieur de la boucle (la valeur de la reacuteponse est modifieacutee par lrsquoinstruction 4 Attendrela reacuteponse)

Dans le langage informatique la construction drsquoune reacutepeacutetition ou boucle suit le mecircmemodegravele

Instructions Bloc drsquoinstructions

Si (cafeacute sucreacute)

1 Prendre une petite cuillegravere

2 Poser la petite cuillegravere dans la tasse

3 Prendre un morceau de sucre

4 Poser le sucre dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

83

Dans le langage Java il existe trois types de boucles qui sont deacutecrites par les construc-tions suivantes

Dans la suite de ce chapitre nous allons pour chacune de ces boucles

bull Eacutetudier la syntaxe

bull Analyser les principes de fonctionnement

bull Donner un exemple qui introduise un concept fondamental de la programmation agravesavoir le compteur de boucle lrsquoaccumulation de valeurs ou la recherche drsquoune donneacuteeparmi un ensemble drsquoinformations

La boucle dowhile La boucle dohellipwhile est une structure reacutepeacutetitive dont les instructions sont exeacutecuteacuteesavant mecircme de tester la condition drsquoexeacutecution de la boucle Pour construire une tellestructure il est neacutecessaire de suivre les regravegles de syntaxe deacutecrites ci-apregraves

Syntaxe La boucle dohellipwhile se traduit par les termes faire tant que Cette structure srsquoeacutecritde deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit de la faccedilonsuivante

do une seule instruction while (expression conditionnelle)

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave commence et se termine laboucle

do plusieurs instructions while (expression conditionnelle)

Principes de fonctionnementAinsi deacutecrite la boucle dohellipwhile srsquoexeacutecute selon les principes suivants

bull Les instructions situeacutees agrave lrsquointeacuterieur de la boucle sont exeacutecuteacutees tant que lrsquoexpressionconditionnelle placeacutee entre parenthegraveses() est vraie

Type de boucle Signification

dowhile

while

for

Faire tant queTant que Pour

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

84

bull Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression conditionnelleest examineacutee en fin de boucle apregraves exeacutecution des instructions

bull Si la condition mentionneacutee entre parenthegraveses reste toujours vraie les instructions de laboucle sont reacutepeacuteteacutees agrave lrsquoinfini On dit que le programme laquo boucle raquo

bull Une instruction modifiant le reacutesultat du test de sortie de boucle est placeacutee agrave lrsquointeacuterieurde la boucle de faccedilon agrave stopper les reacutepeacutetitions au moment souhaiteacute

bull Remarquons qursquoun point-virgule est placeacute agrave la fin de lrsquoinstruction while (expres-sion)

Un distributeur automatique de cafeacuteLrsquoobjectif de cet exemple est double apprendre agrave construire une boucle dohellipwhile eteacutetudier comment compter et accumuler des valeurs

Le comptage des valeurs quelles qursquoelles soient est une technique tregraves utiliseacutee en infor-matique Il existe deux faccedilons de compter

bull Le comptage drsquoun certain nombre de valeurs Par exemple le programme compte lenombre de notes drsquoun eacutetudiant

bull Lrsquoaccumulation de valeurs Le programme calcule la somme des notes drsquoun eacutetudiant(les notes sont accumuleacutees)

Le calcul de la moyenne des notes drsquoun eacutetudiant srsquoeffectue en divisant lrsquoaccumulationdes notes par le nombre (comptage) de notes obtenues

Pour bien comprendre ces diffeacuterentes techniques nous allons eacutecrire un programme dontlrsquoobjectif est de simuler de faccedilon simplifieacutee un distributeur automatique de cafeacute

Cahier des charges

Pour obtenir un cafeacute lrsquoutilisateur introduit un certain nombre de piegraveces de monnaie dansle distributeur Pour simplifier nous supposons que lrsquoappareil nrsquoaccepte que les piegraveces de1 2 et 5 F Lorsqursquoune piegravece est introduite le distributeur affiche la valeur totaleengageacutee ainsi que le nombre de piegraveces par cateacutegorie (nombre de piegraveces de 1 F 2 F et5 F) La machine preacutepare un cafeacute degraves que la somme totale introduite vaut ou deacutepasse leprix du cafeacute Nous prenons pour hypothegravese que le prix drsquoun cafeacute soit de 3 F La machinerend la monnaie srsquoil y a lieu

Apregraves lecture et analyse du cahier des charges nous remarquons que la deacutemarche sedeacuteroule en trois temps

1 Introduction une agrave une des piegraveces dans le distributeur

2 Agrave chaque piegravece fournie calcul et affichage

a Du nombre de piegraveces de 1 F 2 F et 5 F

b De la somme engageacutee

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

b Oui alors preacuteparer le cafeacute et rendre la monnaie copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

85

Pour eacutecrire le programme nous allons nous attacher agrave reacutesoudre dans lrsquoordre chacun deces points

1 Construire la boucle et introduire les piegraveces

Les points 1 et 3a deacutecrivent la structure de la boucle Lrsquointroduction des piegraveces dansle distributeur est une opeacuteration reacutepeacutetitive qui srsquoarrecircte lorsque lrsquoutilisateur a placeacutesuffisamment drsquoargent dans le distributeur crsquoest-agrave-dire lorsque le montant totalengageacute vaut ou deacutepasse la somme de 3 F Par conseacutequent lrsquoallure geacuteneacuterale de lastructure reacutepeacutetitive est la suivante

Deacutebut reacutepeacuteter Entrer une piegravece de monnaie Compter la somme engageacuteeTant que la somme engageacutee ne deacutepasse pas 3 F retourner agrave Deacutebut reacutepeacuteter

En langage Java cette structure est traduite en reprenant la syntaxe de la boucledohellipwhile crsquoest-agrave-dire par

do Deacutebut de boucle Entrer les piegraveces de monnaie Compter la somme engageacuteewhile (somme engageacutee lt 3 F) Fin de boucle

De cette faccedilon la boucle est exeacutecuteacutee tant que la somme engageacutee est infeacuterieure agrave 3 FDegraves que cette somme vaut ou deacutepasse 3 F la condition somme engageacutee lt 3 F nrsquoestplus veacuterifieacutee et le programme sort de la boucle

Ensuite pour simuler lrsquointroduction des piegraveces de monnaie dans le distributeur leprogramme demande agrave lrsquoutilisateur de saisir au clavier la valeur de chaque piegraveceentreacutee Nous eacutecrivons donc

Systemoutprintln(valeur de la piece entree )piegravece = Lireb()

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

2 Compter le nombre de piegraveces et la somme totale engageacutee

Pour compter le nombre de piegraveces de 1 F 2 F et 5 F le programme doit pouvoirdistinguer les diffeacuterentes piegraveces introduites Pour cela nous deacuteclarons autant devariables qursquoil y a de cateacutegories de piegraveces soit

byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece totalReccedilu = 0

Les variables dont le nom commence par nb repreacutesentent le nombre de piegraveces pourchacune des cateacutegories La variable piegravece deacutesigne quant agrave elle la valeur de la piegravecesaisie au clavier Enfin la variable totalReccedilu repreacutesente la somme totale engageacutee encours drsquoexeacutecution de la boucle Ces variables sont deacuteclareacutees de type byte (leurvaleur ne deacutepasse jamais 127)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

86

a Pour compter seacutepareacutement les piegraveces de 1 F de 2 F et de 5 F la meilleure meacutethodeconsiste agrave placer dans la boucle dohellipwhile une structure switch distinguant troiscas

switch (piegravece) case 1 Compter les piegraveces de 1 F break case 2 Compter les piegraveces de 2 F break case 5 Compter les piegraveces de 5 F break default Systemoutprintln (Piece impossible)

Suivant la valeur de la piegravece engageacutee le programme compte le nombre de piegravecespour chacune des cateacutegories en utilisant une instruction du type

a = a + 1

ougrave a repreacutesente lrsquoobjet agrave compter Si la variable a est initialiseacutee agrave 0 la nouvellevaleur de a apregraves affectation vaut 1

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Quelquesconfusions agrave eacuteviter raquo

Placeacute dans une structure reacutepeacutetitive le nombre drsquoobjets repreacutesenteacutes par a augmentede 1 agrave chaque tour de boucle En informatique on dit que a est increacutementeacute de 1Pour compter le nombre de piegraveces de 1 F 2 F et 5 F il suffit de remplacer la varia-ble a par nbPiegravece1F nbPiegravece2F ou nbPiegravece5F Nous obtenons ainsi pour chaquecateacutegorie de piegraveces les instructions suivantes

nbPiegravece1F = nbPiegravece1F + 1nbPiegravece2F = nbPiegravece2F + 1nbPiegravece5F = nbPiegravece5F + 1

b Ces instructions sont ensuite placeacutees dans les eacutetiquettes 1 2 et 5 de la structure switch

Pour mieux comprendre lrsquoeacutevolution de la valeur de ces variables reportez-vous agrave la sectionlaquo Reacutesultat de lrsquoexeacutecution raquo

Pour calculer la somme engageacutee agrave chaque piegravece introduite la technique est leacutegegravere-ment diffeacuterente de la preacuteceacutedente En effet la somme engageacutee doit ecirctre augmenteacuteenon plus du nombre de piegraveces introduites mais de la valeur de la piegravece introduiteLrsquoincreacutement nrsquoest plus de 1 mais de la valeur de la piegravece Comme la variable piegravecerepreacutesente la valeur de la piegravece lrsquoinstruction drsquoaccumulation est la suivante

totalReccedilu = totalReccedilu + piegravece

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

87

Ainsi la variable totalReccedilu initialiseacutee agrave zeacutero augmente progressivement de lavaleur de chaque piegravece engageacutee par accumulation de la valeur preacuteceacutedente detotalReccedilu avec la valeur de la piegravece entreacutee

Ce calcul est reacutealiseacute quelle que soit la valeur de la piegravece Par conseacutequent cetteinstruction est placeacutee en dehors de la structure switch mais agrave lrsquointeacuterieur de laboucle Le montant total engageacute est modifieacute chaque fois qursquoune nouvelle piegravece de1 F 2 F ou 5 F est introduite

Pour eacuteviter drsquoaccumuler dans totalReccedilu la valeur drsquoune piegravece non autoriseacutee nousdevons modifier la valeur de la piegravece dans lrsquoeacutetiquette default de la structureswitch par lrsquoinstruction

default piegravece = 0 Systemoutprintln (Piece impossible)

Lorsqursquoune mauvaise piegravece est introduite la variable piegravece prend la valeur 0 Decette faccedilon lrsquoinstruction drsquoaccumulation est reacutealiseacutee quelle que soit la valeur dela piegravece puisque la variable totalReccedilu nrsquoest pas modifieacutee par lrsquoaccumulationdrsquoune piegravece valant 0 F

Pour mieux comprendre lrsquoeacutevolution de la valeur de la variable totalReccedilu reportez-vous agrave lasection laquo Reacutesultat de lrsquoexeacutecution raquo

Une fois le nombre de piegraveces compteacute et le montant total calculeacute le programmeaffiche les diffeacuterentes valeurs agrave lrsquoaide des instructions suivantes

Systemoutprintln(Vous avez entre )Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F)Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F)Systemoutprintln(Soit au total + totalReccedilu + F)

Lrsquoensemble de ces instructions est placeacute avant le test de sortie de boucle puisque lesvaleurs calculeacutees sont afficheacutees chaque fois que lrsquoutilisateur entre une piegravece

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

Il srsquoagit de deacuteterminer la condition de sortie ou non de la boucle Cette opeacuterationest deacutecrite au point 1

Remarquons cependant que gracircce agrave lrsquoinstruction drsquoaccumulationtotalReccedilu = totalReccedilu + piegravece

la valeur de la variable totalReccedilu est augmenteacutee agrave chaque tour de boucle Parconseacutequent le reacutesultat de la condition de sortie de boucle (totalReccedilu lt 3) nereste pas toujours vrai Le programme peut sortir de la boucle

b Oui alors preacuteparer le cafeacute et rendre la monnaie

Lorsque lrsquoutilisateur a entreacute suffisamment de piegraveces de monnaie le programmeaffiche un message qui annonce que le cafeacute est precirct agrave lrsquoaide de lrsquoinstruction

Systemoutprintln(Je vous verse 1 cafe )

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

88

Pour deacutetecter un trop-perccedilu le programme teste si totalReccedilu deacutepasse la valeur duprix du cafeacute Si tel est le cas il calcule la monnaie agrave rendre et affiche un messageen conseacutequence Ces actions sont reacutealiseacutees par les instructions

if (totalReccedilu gt 3)Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Exemple code source

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class CompteurMonnaie public static void main(String [] arg) byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece byte totalReccedilu = 0 Systemoutprintln(Pour obtenir un cafe entrez au moins 3 F) Systemoutprintln(Je rends la monnaie ) do Systemoutprintln(valeur de la piece entree ) piegravece = Lireb() switch (piegravece) case 1 nbPiegravece1F = nbPiegravece1F + 1 break case 2 nbPiegravece2F = nbPiegravece2F + 1 break case 5 nbPiegravece5F = nbPiegravece5F + 1 break default piegravece = 0 Systemoutprintln (Piece impossible) totalReccedilu = totalReccedilu + piegravece Systemoutprintln(Vous avez entre ) Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F) Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F) Systemoutprintln(Soit au total + totalReccedilu + F) while (totalReccedilu lt 3) Systemoutprintln(Je vous verse 1 cafe ) if (totalReccedilu gt 3)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

89

Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Reacutesultat de lrsquoexeacutecution

La boucle whileLe langage Java propose une autre structure reacutepeacutetitive analogue agrave la boucle dohellipwhilemais dont la deacutecision de poursuivre la reacutepeacutetition srsquoeffectue en deacutebut de boucle Il srsquoagitde la boucle while

Syntaxe

La boucle while srsquoeacutecrit de deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructionsqursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

while (expression conditionnelle) une seule instruction

Agrave lrsquoeacutecranpiegravece nb

Piegravece1Fnb

Piegravece2Fnb

Piegravece5FtotalReccedilu

Valeurs initiales au deacutebut de lrsquoexeacutecution - 0 0 0 0

Valeur de la piece entree 2Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

2 0 1car 0 + 1

0 2car 0 + 2

Valeur de la piece entree 10Piece impossible Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

10 0

0 1 0 2car2 + 0

Valeur de la piece entree 5Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 1 piece(s) de 5 FSoit au total 7 F

5 0 1 1car 0 + 1 = 1

7car 2 + 5

Je vous verse 1 cafeet vous rends 4 F

5 0 1 1 7

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

90

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave deacutebute et se termine la boucle

while (expression conditionelle) plusieurs instructions

Principes de fonctionnementLe terme while se traduit par tant que La structure reacutepeacutetitive srsquoexeacutecute selon les prin-cipes suivants

bull Tant que lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses reste vraie la ou les instructionscomposant la boucle sont exeacutecuteacutees

bull Le programme sort de la boucle degraves que lrsquoexpression agrave lrsquointeacuterieur des parenthegravesesdevient fausse

bull Une instruction est placeacutee agrave lrsquointeacuterieur de la boucle pour modifier le reacutesultat du test agravelrsquoentreacutee de la boucle de faccedilon agrave stopper les reacutepeacutetitions

bull Si lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses est fausse degraves le deacutepart les instructions nesont jamais exeacutecuteacutees

bull Observons qursquoagrave lrsquoinverse de la boucle dohellipwhile il nrsquoy a pas de point-virgule agrave la finde lrsquoinstruction while (expression)

Saisir un nombre entier au clavierLrsquoobjectif de cet exemple est drsquoapprendre agrave eacutecrire une boucle while et de comprendrecomment reacutealiser la saisie drsquoun entier au clavier telle qursquoelle est reacutealiseacutee dans leprogramme Lirejava

Nous avons deacutejagrave remarqueacute (voir au chapitre 2 laquo Communiquer une information raquo lasection laquo La saisie de donneacutees raquo) que la fonction Systeminread() ne permettait desaisir qursquoun seul caractegravere agrave la fois au clavier Pour saisir un nombre composeacute deplusieurs chiffres ou un mot constitueacute de plusieurs caractegraveres nous devons faire appel agravela fonction Systeminread() autant de fois qursquoil y a de caractegraveres agrave saisir

Cette saisie de caractegraveres est donc une opeacuteration reacutepeacutetitive qui doit srsquoarrecircter lorsque lavaleur numeacuterique ou le mot est entiegraverement entreacute Lrsquoordinateur nrsquoest pas agrave mecircme dedeacuteterminer quand la saisie est termineacutee Lrsquoutilisateur confirme qursquoil a fini drsquoentrer desvaleurs en appuyant sur une touche caracteacuteristique du clavier Cette touche utiliseacutee pourpasser agrave la ligne dans les logiciels de traitement de texte est communeacutement appeleacutee latouche laquo Entreacutee raquo

Notre but eacutetant de saisir une valeur numeacuterique entiegravere nous devons traduire lrsquoensembledes caractegraveres saisis de faccedilon agrave les stocker non plus dans un String mais dans unevariable de type int Si cette traduction nrsquoest pas reacutealiseacutee il nrsquoest pas possible drsquoaddi-tionner ou de diviser les caractegraveres lus agrave la maniegravere des valeurs numeacuteriques Par exemplele fait drsquoadditionner la suite de caractegraveres 123 avec la valeur 4 a pour reacutesultat 1234 Par

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

91

contre apregraves traduction des caractegraveres en valeur numeacuterique la mecircme opeacuteration donnepour reacutesultat 127

Cahier des charges

Nous venons de lrsquoobserver pour confirmer que nous nrsquoavons plus de caractegravere agrave saisirnous devons appuyer sur la touche laquo Entreacutee raquo du clavier Pour saisir une valeur numeacute-rique entiegravere la liste des opeacuterations srsquoexprime sous la forme de la structure reacutepeacutetitivesuivante

1 Tant que le caractegravere saisi nrsquoest pas le caractegravere laquo Entreacutee raquo

a Lire un caractegravere

b Stocker le caractegravere lu dans un mot

Retourner en 1

2 Tous les caractegraveres eacutetant saisis les traduire en un nombre entier

Pour eacutecrire le programme en langage Java reprenons cette marche agrave suivre point parpoint

1 La boucle tant que est traduite en Java par la construction suivante

while (C = rsquonrsquo) Lire un caractegravere au clavier Stocker le caractegravere dans un mot

En Java le caractegravere laquo Entreacutee raquo est symboliseacute par le caractegravere rsquonrsquo sur des ordina-teurs de type Unix ou Macintosh Sur un PC la touche laquo Entreacutee raquo correspond agrave laseacuterie de caractegraveres rsquorrsquo et rsquonrsquo Afin de rendre compatible le programme avec tousles ordinateurs nous allons tester la condition de sortie de boucle sur le caractegraverersquonrsquo puisque celui-ci est commun agrave tous les mondes qursquoils soient Unix Macintoshou PC De cette faccedilon en eacutecrivant while (C = rsquonrsquo) ougrave C repreacutesente le caractegraverelu nous exprimons en langage informatique la phrase tant que le caractegravere saisinrsquoest pas le caractegravere laquo Entreacutee raquo

La premiegravere fois que le programme entre dans la boucle aucun caractegravere nrsquoa encoreeacuteteacute saisi Il est donc neacutecessaire drsquoinitialiser la variable C agrave un caractegravere diffeacuterent dersquonrsquo de faccedilon agrave assurer que la condition drsquoentreacutee dans la boucle soit au moins veacuteri-fieacutee la premiegravere fois Pour cela nous deacuteclarons C en deacutebut de programme de la faccedilonsuivante

char C =rsquo0rsquo

Par cette instruction nous initialisons la variable C au caractegravere nul (rsquo0rsquo) Nousaurions pu lrsquoinitialiser agrave tout autre caractegravere agrave condition que celui-ci fucirct diffeacuterent dersquonrsquo Le choix du caractegravere nul nrsquoest ici reacutealiseacute que parce que en geacuteneacuteral les varia-bles de type entier ou reacuteel sont initialiseacutees agrave 0 ou 00 En Java le caractegravere rsquo0rsquo estlrsquoeacutequivalent de la valeur numeacuterique nulle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

92

a Pour lire un caractegravere au clavier lrsquoinstruction est la suivante

C = (char) Systeminread()

La fonction Systeminread() attend que lrsquoutilisateur appuie sur une touche duclavier Cela fait elle retourne en reacutesultat la valeur entiegravere correspondant aucaractegravere associeacute agrave la touche du clavier Pour traduire cette valeur entiegravere en codecaractegravere il est neacutecessaire de placer le cast (char) devant la fonction De cettefaccedilon la variable C contient le code Unicode du caractegravere saisi

b Stocker le caractegravere lu dans un mot

Lrsquoobjectif est de lire plusieurs caractegraveres drsquoaffileacutee Nous devons donc stocker dansune variable de type String chaque caractegravere au fur et agrave mesure de la saisie (voirau chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String uneapproche vers la notion drsquoobjet raquo) Gracircce au type String plusieurs caractegraverespeuvent ecirctre stockeacutes sous un mecircme nom de variable La meacutethode consiste agrave accu-muler dans une variable les valeurs lues en utilisant lrsquoinstruction

tmp = tmp + C

Cette instruction permet drsquoaccumuler les valeurs saisies en les placcedilant les unesderriegravere les autres dans la variable tmp En effet lorsque deux caractegraveres sont addi-tionneacutes ceux-ci sont placeacutes dans la variable lrsquoun apregraves lrsquoautre dans lrsquoordredrsquoexeacutecution de lrsquoopeacuteration Lrsquoaddition du caractegravere rsquoersquo et du caractegravere rsquotrsquo a pourreacutesultat le mot et Dans le jargon informatique lrsquoaddition de caractegraveres est aussiappeleacutee la concateacutenation de caractegraveres

En deacutebut de programme la variable tmp ne doit pas contenir de caractegravere Celavient du fait que la premiegravere fois qursquoun caractegravere lu est placeacute dans la variable tmpil doit correspondre au tout premier caractegravere du mot stockeacute dans la variable tmpCrsquoest pourquoi la variable tmp doit ecirctre deacuteclareacutee de la faccedilon suivante ( corres-pondant agrave un mot vide de caractegravere)

String tmp =

Lorsque au final lrsquoutilisateur appuie sur la touche laquo Entreacutee raquo pour valider la fin dela saisie le programme (sur PC) reccediloit la suite de caractegraveres rsquorrsquo et rsquonrsquo Lavariable tmp contient en deacutefinitive la suite des caractegraveres saisis plus les caractegraveresrsquorrsquo et rsquonrsquo Or nous souhaitons transformer cette suite de caractegraveres en valeurnumeacuterique Pour cela nous devons eacuteliminer les caractegraveres rsquorrsquo et rsquonrsquo qui empecirc-chent cette transformation

Pour plus drsquoinformations reportez-vous au paragraphe laquo 2 Traduire les caractegraveres en un nombreentier raquo un peu plus loin dans ce chapitre

Lrsquoaccumulation des caractegraveres ne se reacutealise donc qursquoagrave la condition que le caractegraveresaisi ne soit eacutegal ni agrave rsquorrsquo ni agrave rsquonrsquo

Pour reacutesumer la boucle srsquoeacutecrit

String tmp = char C =rsquo0rsquowhile (C = rsquonrsquo)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

93

C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

Pour mieux comprendre en pratique le deacuteroulement de cette boucle examinonslrsquoeacutevolution des variables agrave partir drsquoun exemple Nous supposons que lrsquoutilisateurentre les caractegraveres 2 8 et laquo Entreacutee raquo

c tmp Explication

String tmp = 0 - Initialisation

char C =rsquo0rsquo 0 Initialisation

while (C = rsquonrsquo)

0 C eacutetant initialiseacute au caractegravere lsquo0rsquo C est diffeacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 2 Le programme attend la saisie drsquoune valeur au cla-vier Nous supposons que le caractegravere saisi soit 2

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

2 2 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo la concateacute-nation est exeacutecuteacutee La variable tmp eacutetant initialiseacutee agrave la chaicircne vide () lrsquoopeacuteration + rsquo2rsquo stocke le caracegravere 2 en premiegravere position dans la variable tmp

2 2 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

2 2 La variable C contient la valeur 2 C est donc diffeacute-rent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 8 2 Nous entrons le caractegravere 8

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

8 28 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo lrsquoopeacuteration rsquo2rsquo + rsquo8rsquo est exeacutecuteacutee et stocke le mot 28 dans la variable tmp

8 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

8 28 La variable C contient le caractegravere 8 C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C=(char)Systeminread() r 28 Nous appuyons sur la touche laquo Entreacutee raquo Sur PC le premier caractegravere entreacute est rsquorrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp+C

r 28 C vaut rsquorrsquo La condition nrsquoeacutetant pas veacuterifieacutee il nrsquoy a pas accumulation du caractegravere dans tmp

r 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

r 28 La variable C contient le caractegravere r C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

94

2 Traduire les caractegraveres en un nombre entier

Pour traduire un ensemble de caractegraveres en une valeur numeacuterique le langage Javapropose un certain nombre de fonctions Dans notre cas il srsquoagit de traduire un moten une valeur entiegravere de type int La fonction Java IntegerparseInt() permet unetelle traduction Lrsquoinstruction est la suivante

valeur = IntegerparseInt(tmp)

valeur est une variable deacuteclareacutee de type int et tmp est le mot qui contient les carac-tegraveres agrave traduire La variable tmp ne doit contenir que des caractegraveres repreacutesentant deschiffres Si tel nrsquoest pas le cas le programme srsquoarrecircte avec un message drsquoerreur agravelrsquoexeacutecution Par exemple si lrsquoutilisateur entre le mot deux au lieux du caractegravere 2lrsquointerpreacuteteur Java affiche le message suivant

javalangNumberFormatException deuxat javalangIntegerparseInt (compiled Code)

Ce message indique que le format du nombre saisi ne correspond pas au formatattendu par la fonction IntegerparseInt() Nous aurions obtenu le mecircme typedrsquoerreur en stockant les caractegraveres rsquorrsquo ou rsquonrsquo dans la variable tmp

Pour connaicirctre les autres fonctions permettant de traduire une chaicircne de caractegraveresen valeur numeacuterique de type double float long ou byte vous pouvez consulter agravelrsquoaide drsquoun eacutediteur de texte le fichier Lirejava qui emploie toutes ces fonctions

Pour finir le programme affiche les diffeacuterents reacutesultats agrave lrsquoaide de la fonctionSystemoutprintln Cet affichage est reacutealiseacute agrave la fin du code source complet ci-dessous

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class LireUnEntier public static void main (String [] param) throws javaioIOException

c tmp Explication

C = (char)Systeminread() n 28 Le caractegravere suivant envoyeacute par la touche laquo Entreacutee raquo est rsquonrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

n 28 C vaut rsquonrsquo La condition nrsquoest pas veacuterifieacutee et il nrsquoy a pas accumulation du caractegravere dans tmp

n 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C =rsquonrsquo)

n 28 La variable C contient le caractegravere n La condition placeacutee entre () nrsquoest plus veacuterifieacutee Le programme sort de la boucle et passe agrave lrsquoeacutetape suivante

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

95

String tmp = char C= rsquo0rsquo int valeur Systemoutprint(Entrez des chiffres et appuyez sur ) Systemoutprintln(la touche Entree pour valider la saisie ) while (C = rsquonrsquo) C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C Systemoutprintln(Vous avez entre + tmp) valeur = IntegerparseInt(tmp) Systemoutprintln(Crsquoest a dire + valeur + en entier) Fin du main () Fin de la Class LireUnEntier

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant les valeurssaisies le programme donne un reacutesultat diffeacuterent

Exeacutecution 1

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2288Vous avez entre 28Crsquoest a dire 28 en entier

La premiegravere valeur 28 afficheacutee est un mot Lrsquoaddition de cette valeur avec le nombre 4 apour reacutesultat 284 La deuxiegraveme valeur afficheacutee est un nombre et la mecircme addition a pourreacutesultat 32

Exeacutecution 2

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie ttrrooiissjavalangNumberFormatException troisat javalangIntegerparseInt (compiled Code)

Le mot trois nrsquoest pas un nombre mais un mot sans signification particuliegravere pourlrsquoordinateur lrsquointerpreacuteteur Java ne peut traduire ce mot en un nombre entier

Exeacutecution 3

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2255javalangNumberFormatException 25at javalangIntegerparseInt (compiled Code)

Le mot 25 nrsquoa pas le format drsquoun nombre entier mais drsquoun nombre reacuteel La fonctionIntegerparseInt() ne peut le traduire en un nombre entier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

96

La boucle for Lrsquoinstruction for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations (de tours) agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

Syntaxe La boucle for srsquoeacutecrit elle aussi de deux faccedilons diffeacuterentes en fonction du nombredrsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

for (initialisation condition increacutement) une seule instruction

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par deuxaccolades ouvrante et fermante de sorte agrave deacuteterminer ougrave deacutebute et se termine la boucle

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepareacuteesobligatoirement par des points-virgules () Ces instructions deacutefinissent une variable ouindice qui controcircle le bon deacuteroulement de la boucle Ainsi

bull Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle(exemple i = 0 i eacutetant lrsquoindice) Elle est la premiegravere instruction exeacutecuteacutee agrave lrsquoentreacuteede la boucle

bull Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle(exemple i lt 10) Elle est examineacutee avant chaque tour de boucle y compris aupremier tour de boucle

bull Increacutement est lrsquoinstruction qui permet de modifier le reacutesultat du test preacuteceacutedent enaugmentant ou diminuant la valeur de la variable testeacutee Lrsquoincreacutement peut ecirctreaugmenteacute ou diminueacute de N N est appeleacute le pas drsquoincreacutementation (exemple i = i + 2) Cette instruction est exeacutecuteacutee agrave la fin de chaque tour de boucle

Principes de fonctionnementLes boucles for reacutealisent un nombre preacutecis de boucles deacutependant de la valeur initiale dela valeur finale et du pas drsquoincreacutementation Voyons sur diffeacuterents exemples comment cesboucles sont exeacutecuteacutees (tableau suivant)

Remarquons que

bull Le nombre de tours est identique dans chacune de ces boucles malgreacute une deacutefinitiondiffeacuterente pour chacune des instructions de controcircle

bull Lrsquoeacutecriture de lrsquoinstruction Increacutement qui augmente ou diminue de 1 la variable decontrocircle de la boucle peut ecirctre simplifieacutee En effet par convention lrsquoinstruction

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

97

i = i + 1 srsquoeacutecrit plus simplement i++ et lrsquoinstruction i-- a le mecircme reacutesultat quelrsquoinstruction i = i - 1

Rechercher le code Unicode drsquoun caractegravere donneacuteLrsquoobjectif de cet exemple est drsquoapprendre agrave construire une boucle for et de srsquoinitier agrave larecherche drsquoinformation dans un ensemble de donneacutees Pour cela nous allons eacutecrire unprogramme qui recherche dans la table Unicode le code drsquoun caractegravere donneacute par lrsquoutili-sateur Cette recherche srsquoeffectue en comparant chaque caractegravere de la table Unicode aucaractegravere saisi

Cahier des charges

La meacutethode est la suivante

1 Lire le caractegravere dont on souhaite connaicirctre le code Unicode

2 Pour chaque caractegravere de la table Unicode

Si le caractegravere Unicode est identique au caractegravere choisi afficher son code Unicode

Reprenons chaque point pour le traduire en un programme Java

1 Pour lire au clavier le caractegravere dont on souhaite connaicirctre le code Unicode lesinstructions sont les suivantes

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

Systemoutprintln(Quel caractere recherchez-vous )recherche = Lirec()

Ougrave la variable recherche est deacuteclareacutee de type char

2 Le programme parcourt la table Unicode caractegravere par caractegravere et recherche lecaractegravere souhaiteacute Cette opeacuteration est reacutepeacutetitive et srsquoexeacutecute autant de fois qursquoil y ade caractegraveres dans la table Unicode crsquoest-agrave-dire du caractegravere 0 au caractegravere 255

Pour plus drsquoinformations sur la table Unicode voir au chapitre 1 laquo Stocker une information raquo lasection laquo Cateacutegorie caractegravere raquo

Pour parcourir cette table la solution est drsquoutiliser une boucle for dont la valeur delrsquoindice varie de 1 en 1 dans lrsquointervalle [0 255] Cette boucle srsquoeacutecrit

for (i = 1 i lt 255 i++)

int i char c

Valeur initiale

Valeur finale

Pas drsquoincreacutementation

Nombre de boucles

Valeurs prises par i ou c

for (i = 0 i lt 5 i = i +1) 0 4 1 5 0 1 2 3 4

for (i = 4 i lt= 12 i = i + 2) 4 12 2 5 4 6 8 10 12

for (c = rsquoarsquo c lt rsquofrsquo c = c + 1) rsquoarsquo rsquoersquo 1 5 a b c d e

for (i = 5 i gt 0 i = i ndash 1) 5 0 ndash 1 5 5 4 3 2 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

98

La variable i deacuteclareacutee de type int repreacutesente lrsquoindice du caractegravere dans la tableUnicode Il y a eacutequivalence entre lrsquoindice et le caractegravere En effet un caractegravere estdeacutefini agrave partir drsquoune valeur numeacuterique

La seule diffeacuterence entre une valeur numeacuterique et un caractegravere provient du type decodage utiliseacute pour les repreacutesenter lrsquoun et lrsquoautre Pour connaicirctre le caractegravere corres-pondant agrave cet indice la meacutethode consiste agrave transformer la valeur de lrsquoindice en uncode caractegravere par lrsquointermeacutediaire du cast (char) Ainsi lrsquoinstruction

atrouver = (char) i

transforme lrsquoindice i de la table Unicode en son code caractegravere La variable atrou-ver deacuteclareacutee de type char prend la valeur de ce code

Connaissant le caractegravere agrave rechercher ainsi que le code caractegravere de chaque caractegraverede la table Unicode il suffit de les comparer pour savoir srsquoils sont identiques ou nonLrsquoinstruction srsquoeacutecrit sous la forme du test suivant

if (atrouver == recherche)

Si le caractegravere Unicode est identique au caractegravere choisi le programme affiche soncode Unicode agrave lrsquoaide des instructions

Systemoutprint(le code Unicode de + atrouver)Systemoutprintln( est u00 + IntegertoString(i16))

Rappelons que le code Unicode drsquoun caractegravere srsquoobtient en placcedilant derriegravere lescaractegraveres u00 la valeur hexadeacutecimale de la position du caractegravere dans la tableUnicode Pour afficher ce code nous devons donc traduire la variable i (qui corres-pond agrave la position du caractegravere dans la table Unicode) en valeur hexadeacutecimale Cettetraduction est reacutealiseacutee par la fonction

IntegertoString(valeur entiegravere base)

qui transforme le paramegravetre valeur entiegravere en une chaicircne de caractegraveres suivant lecodage donneacute par le paramegravetre base Si valeur entiegravere repreacutesente lrsquoindice i et quebase prenne la valeur 16 nous obtenons la valeur hexadeacutecimale de la position ducaractegravere trouveacute

La suite des caractegraveres u00 placeacutee dans la fonction Systemoutprintln est consi-deacutereacutee comme une seacutequence particuliegravere puisqursquoelle permet lrsquoaffichage des caractegraverespeacuteciaux Pour annuler le caractegravere speacutecifique de cette seacutequence il est neacutecessaire deplacer un premier devant u00

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classe commeci-dessous

public class QuelUnicode public static void main (String [] parametre)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

99

int i char recherche atrouver Systemoutprintln(Quel caractere recherchez-vous ) recherche = Lirec() for (i = 1 i lt 255 i++) atrouver = (char) i if (atrouver == recherche) Systemoutprint(le code Unicode de + atrouver) Systemoutprintln( est u00 + IntegertoString(i16)) Fin du if Fin du for Fin du main() Fin de QuelUnicode

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant lrsquoenviron-nement drsquoexeacutecution le programme donne des reacutesultats diffeacuterents

Exeacutecution sous Dos

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u0082

Exeacutecution sous Mac OS

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00c8

Exeacutecution sous Windows ou Unix

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00e9

Lrsquoexeacutecution du mecircme programme sur les diffeacuterents environnements montre bien que lecode Unicode drsquoun caractegravere speacutecial (par exemple accentueacute) nrsquoest pas le mecircme drsquounenvironnement agrave un autre

Quelle boucle choisir Chacune des trois boucles eacutetudieacutees dans ce chapitre permet de reacutepeacuteter un ensembledrsquoinstructions Cependant les diffeacuterentes proprieacuteteacutes de chacune drsquoentre elles font que leprogrammeur utilisera un type de boucle plutocirct qursquoun autre suivant le problegraveme agravereacutesoudre

Choisir entre une boucle do while et une boucle while

Les boucles do while et while se ressemblent beaucoup dans leur syntaxe et il paraicirctparfois difficile au programmeur deacutebutant de choisir lrsquoune plutocirct que lrsquoautre

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

100

Remarquons cependant que la diffeacuterence essentielle entre ces deux boucles reacuteside dans laposition du test de sortie de boucle Pour la boucle do while la sortie de boucle srsquoeffectueen fin de boucle alors que pour la boucle while la sortie de boucle se situe degraves lrsquoentreacutee dela boucle

De ce fait la boucle do while est plus souple agrave manipuler les instructions qui la composenteacutetant exeacutecuteacutees au moins une fois quoi qursquoil arrive Pour la boucle while il est neacutecessairede veiller agrave lrsquoinitialisation de la variable figurant dans le test drsquoentreacutee de boucle de faccedilon agraveecirctre sucircr drsquoexeacutecuter au moins une fois les instructions composant la boucle

Certains algorithmes demandent agrave ne jamais reacutepeacuteter sous certaines conditions unensemble drsquoinstructions Dans de tels cas la structure while est preacutefeacuterable agrave la structuredo while

Choisir entre la boucle for et while

Les boucles for et while sont eacutequivalentes En effet en examinant les deux boucles dutableau ci-dessous

nous constatons que pour chacune drsquoentre elles la boucle deacutebute avec i = 0 puis tantque i est infeacuterieur ou eacutegal agrave 10 i est increacutementeacute de 1

Malgreacute cette eacutequivalence pour choisir entre une boucle for et une boucle while remar-quons que

bull La boucle for est utiliseacutee quand on connaicirct agrave lrsquoavance le nombre drsquoiteacuterations agrave exeacutecuter

bull La boucle while est employeacutee lorsque le nombre drsquoiteacuterations est laisseacute au choix delrsquoutilisateur du programme ou deacutetermineacute agrave partir du reacutesultat drsquoun calcul reacutealiseacute aucours de la reacutepeacutetition

La boucle for La boucle while

int i

for (i = 0 i lt= 10 i = i+1 )

int i = 0

while (i lt= 10)

i = i+1

ReacutesumeacuteEn langage Java il existe trois types de structures pour reacutealiser des reacutepeacutetitions Ellessont deacutecrites par les instructions dowhile while et for

bull La boucle dowhile (faire tant que) permet drsquoexeacutecuter les instructions situeacuteesdans le bloc deacutefini par des tant que lrsquoexpression conditionnelle placeacutee entre ()est vraie

do plusieurs instructions while (expression)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

101

Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression condition-nelle est examineacutee en fin de boucle apregraves exeacutecution des instructions

bull La boucle while (tant que) permet drsquoexeacutecuter les instructions situeacutees dans le blocdeacutefini par tant que lrsquoexpression conditionnelle placeacutee entre () est vraie

while (expression) plusieurs instructions

Lrsquoexpression conditionnelle eacutetant examineacutee en deacutebut de boucle les instructionssitueacutees dans le bloc peuvent ne pas ecirctre exeacutecuteacutees si la condition nrsquoest pas veacuterifieacuteedegraves le deacutebut

bull La boucle for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepa-reacutees obligatoirement par des points-virgules () Ces instructions deacutefinissent unindice qui controcircle le bon deacuteroulement de la boucle Ainsi

ndash Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle

ndash Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle

ndash Increacutement permet drsquoaugmenter ou de diminuer de N la valeur de la variablerepreacutesentant lrsquoindice de la boucle N est appeleacute le pas drsquoincreacutementation

Agrave partir des structures reacutepeacutetitives nous avons eacutegalement abordeacute la notion de comp-tage de valeurs crsquoest-agrave-dire

bull Le comptage drsquoun certain nombre de valeurs (par exemple compter le nombre denotes drsquoun eacutetudiant) Pour cela il suffit drsquoemployer une variable entiegravere initialiseacuteeagrave 0 avant drsquoentamer la boucle La variable augmente de 1 agrave lrsquointeacuterieur de la boucleagrave lrsquoaide de lrsquoinstruction i = i + 1 (en supposant que i soit notre variable comp-teur) On dit alors que la variable i est increacutementeacutee de 1

bull Lrsquoaccumulation de valeurs (par exemple faire la somme des notes drsquoun eacutetudiant)Cette technique est reacutealiseacutee agrave lrsquoaide drsquoune variable entiegravere initialiseacutee agrave 0 avantdrsquoentamer la boucle La variable augmente de la valeur de la variable agrave accumuler(de la valeur de la note par exemple) agrave lrsquointeacuterieur de la boucle Cette augmentationsrsquoeffectue agrave lrsquoaide de lrsquoinstruction s = s + valeur en supposant que s soit notrevariable drsquoaccumulation et valeur la variable repreacutesentant la valeur agrave accumuler

Remarquons pour finir que lrsquoinstruction i++ est lrsquoeacutequivalent simplifieacute de i = i + 1tandis que i-- est lrsquoeacutequivalent simplifieacute de i = i ndash 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

102

ExercicesComprendre la boucle dohellipwhile

Afin drsquoexeacutecuter le programme suivant

public class Exercice1 public static void main (String [] argument) int abr Systemoutprintln(Entrer un entier ) a = Lirei() Systemoutprintln(Entrer un entier ) b = Lirei() do r = ab a = b b = r while (r =0 ) Systemoutprintln(Le resultat est + a)

a Examinez le code source (programme) repeacuterez les instructions concerneacutees parla boucle reacutepeacutetitive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie deboucle

c En supposant que lrsquoutilisateur entre les valeurs 30 et 42 exeacutecutez le programmeagrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

d En supposant que lrsquoutilisateur entre les valeurs 35 et 6 exeacutecutez le programme agravela main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

Apprendre agrave compter accumuler et rechercher une valeurEacutecrivez en franccedilais en faisant ressortir la structure reacutepeacutetitive de la marche agrave suivrele programme reacutesolvant les quatre points suivants

a Lire un nombre quelconque de valeurs entiegraveres non nulles La saisie des valeursse termine lorsqursquoon entre la valeur 0

b Afficher la plus grande des valeurs

c Afficher la plus petite des valeurs

d Calculer et afficher la moyenne de toutes les valeurs

41

42

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

103

Traduisez la marche agrave suivre preacuteceacutedente en un programme Java Utilisez pour celaune boucle dohellipwhile Pour trouver la plus grande ou la plus petite valeur vouspouvez vous aider de lrsquoexemple laquo Rechercher le plus grand de deux eacuteleacutements raquodeacutecrit au cours du chapitre 3 laquo Faire des choix raquo

Comprendre la boucle while traduire une marche agrave suivre en programme Java

Eacutecrivez un programme Devinette qui tire un nombre au hasard entre 0 et 10 etdemande agrave lrsquoutilisateur de trouver ce nombre Pour ce faire la meacutethode est lasuivante

a Tirer au hasard un nombre entre 0 et 10

b Lire un nombre

c Tant que le nombre lu est diffeacuterent du nombre tireacute au hasard

ndash Lire un nombre

ndash Compter le nombre de boucle

d Afficher un message de reacuteussite ainsi que le nombre de boucles

Reprenez chaque point eacutenonceacute ci-dessus et traduisez-le en langage Java Notezque pour tirer un nombre au hasard entre 0 et 10 lrsquoinstruction srsquoeacutecrit

i = (int) (10Mathrandom())

ougrave i est une variable entiegravere qui reccediloit la valeur tireacutee au hasard

Deacuteclarez toutes les variables utiliseacutees dans votre programme en veillant agrave ceqursquoelles soient bien initialiseacutees

Lorsque le programme Devinette fonctionne bien modifiez-le de faccedilon que

a Les valeurs tireacutees au hasard soient comprises entre 0 et 50

b Un message drsquoerreur srsquoaffiche si la reacuteponse est mauvaise

c Le programme indique si la valeur saisie au clavier est plus grande ou plus petiteque la valeur tireacutee au hasard

d Agrave titre de reacuteflexion comment faut-il srsquoy prendre pour trouver la valeur endonnant le moins de reacuteponses possibles

Comprendre la boucle forAfin drsquoexeacutecuter le programme suivant

public class Exercice8 public static void main (String [] parametre) long i b = 1 int a Systemoutprintln(Entrer un entier ) a = Lirei()

43

44

45

46

47

48

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

104

for (i = 2 i lt= a i++) b = b i Systemoutprintln(Le resultat vaut + b)

a Examinez le programme repeacuterez les instructions concerneacutees par la boucle reacutepeacute-titive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est la valeur initiale de i et quelle est sa valeur en sortie de boucle Combien de boucles sont reacutealiseacutees

c Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie de boucle

d En supposant que lrsquoutilisateur entre la valeur 6 exeacutecutez le programme agrave la main(pour vous aider construisez le tableau drsquoeacutevolution de chaque variable deacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

En utilisant une boucle for eacutecrivez un programme qui affiche lrsquoalphabet drsquoabordagrave lrsquoendroit puis agrave lrsquoenvers apregraves un passage agrave la ligne

Le projet laquo Gestion drsquoun compte bancaire raquoRendre le menu interactifUne fois lrsquoaffichage du menu reacutealiseacute agrave partir de lrsquoeacutenonceacute donneacute agrave la fin du chapitre 3laquo Faire des choix raquo le programme exeacutecuteacute donne agrave choisir parmi les cinq optionssuivantes

1 Creacuteation drsquoun compte2 Affichage drsquoun compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Si lrsquoutilisateur choisit lrsquooption 1 le programme lui demande de saisir les donneacuteesneacutecessaires agrave la creacuteation du compte (type numeacutero valeur initiale etc) Une fois lesdonneacutees saisies le programme srsquoarrecircte Il nrsquoest pas possible de choisir par exemplelrsquooption 2 pour afficher les valeurs saisies agrave lrsquoeacutetape preacuteceacutedente

Pour remeacutedier agrave cette situation il est neacutecessaire de placer les instructions concerneacutees agravelrsquointeacuterieur drsquoune boucle de faccedilon agrave voir reacuteapparaicirctre le menu une fois lrsquooption reacutealiseacuteePour cela vous devez

a Eacutecrire en franccedilais la structure reacutepeacutetitive afin de deacuteterminer la condition de sortie deboucle

b Choisir la structure reacutepeacutetitive parmi les trois proposeacutees par le langage Java

c Traduire la marche agrave suivre en programme Java en prenant soin drsquoinitialiser la varia-ble de controcircle de la boucle et en inseacuterant agrave lrsquointeacuterieur de la boucle toutes lesinstructions neacutecessaires agrave lrsquoaffichage du menu

49

copy copyright Eacuteditions Eyrolles

PARTIE 2

Initiation agrave la programmation orienteacutee objet

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

CHAPITRE 6

Fonctions notions avanceacutees 129

CHAPITRE 7

Les classes et les objets 149

CHAPITRE 8

Les principes du concept drsquoobjet 175

copy copyright Eacuteditions Eyrolles

5De lrsquoalgorithme parameacutetreacute

agrave lrsquoeacutecriture de fonctions

Lrsquoeacutetude des chapitres preacuteceacutedents montre qursquoun programme informatique est constitueacutedrsquoinstructions eacuteleacutementaires (affectation comparaison ou encore reacutepeacutetition) et de sous-programmes (calcul de la racine carreacutee affichage de donneacutees) appeleacutes fonctions ouencore meacutethodes

Ces instructions sont de nature suffisamment geacuteneacuterale pour srsquoadapter agrave nrsquoimporte quelproblegraveme En les utilisant agrave bon escient il est possible drsquoeacutecrire des programmes informa-tiques simples mais drsquoune grande utiliteacute

Dans le cadre du deacuteveloppement de logiciels de grande envergure les programmeurssouhaitent aussi deacutefinir leurs propres instructions adapteacutees au problegraveme qursquoils traitentPour cela les langages de programmation offrent la possibiliteacute de creacuteer des fonctionsspeacutecifiques diffeacuterentes des fonctions preacutedeacutefinies par le langage

Pour comprendre lrsquointeacuterecirct des fonctions nous analysons drsquoabord le concept drsquoalgorithmeparameacutetreacute agrave partir drsquoun exemple imageacute

Ensuite nous eacutetudions la bibliothegraveque de fonctions matheacutematiques deacutefinie dans lelangage Java (section laquo Des fonctions Java preacutedeacutefinies raquo) Cette eacutetude montre les prin-cipes drsquoutilisation de ces fonctions et explique comment eacutelaborer et construire vos fonc-tions (section laquo Construire ses propres fonctions raquo)

Pour finir nous examinons comment la construction et lrsquoutilisation de fonctions fonteacutevoluer la structure geacuteneacuterale drsquoun programme (section laquo Les fonctions au sein drsquounprogramme Java raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

108

Algorithme parameacutetreacuteCertains algorithmes peuvent ecirctre appliqueacutes agrave des problegravemes voisins en modifiantsimplement les donneacutees pour lesquels ils ont eacuteteacute construits En faisant varier certainesvaleurs le programme fournit un reacutesultat diffeacuterent du preacuteceacutedent Ces valeurs caracteacuteris-tiques du problegraveme agrave traiter sont appeleacutees paramegravetres du programme

Pour comprendre concregravetement ce concept nous allons reprendre lrsquoalgorithme du cafeacute chaudpour le transformer en un algorithme qui nous permettra de faire du theacute ou du cafeacute chaud

Faire un theacute chaud ou comment remplacer le cafeacute par du theacuteFaire un cafeacute chaud ou faire un theacute chaud est une opeacuteration agrave peu pregraves semblable Enreprenant la liste de toutes les opeacuterations neacutecessaires agrave la reacutealisation drsquoun cafeacute chaudnous remarquons qursquoen remplaccedilant simplement le mot cafeacute par le mot theacute nous obtenonsdu theacute chaud

Cette recette nrsquoest certes pas traditionnelle mais elle a le meacuterite drsquoecirctre peacutedagogiquementsimple Pour faire du cafeacute ou du theacute il suffit drsquoemployer la mecircme recette ou meacutethode enprenant comme ingreacutedient du cafeacute ou du theacute selon notre choix

Dans le monde reacuteel le fait de remplacer un ingreacutedient par un autre ne pose pas de diffi-culteacutes particuliegraveres Dans le monde informatique crsquoest plus complexe En effet lrsquoordina-teur ne fait qursquoexeacutecuter la marche agrave suivre fournie par le programmeur Dans notre caspour avoir du cafeacute ou du theacute le programmeur doit eacutecrire la marche agrave suivre pour chacunedes boissons La tacircche est fastidieuse puisque chacun des programmes se ressembletout en eacutetant diffeacuterent sur un deacutetail (cafeacute ou theacute)

Deacutefinir les paramegravetres

Pour eacuteviter drsquoavoir agrave recopier chaque fois des marches agrave suivre qui ne diffegraverent quesur un deacutetail lrsquoideacutee est de construire un algorithme geacuteneacuteral Cet algorithme ne varie

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du theacute3 Prendre un filtre4 Verser le theacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le theacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser le theacute dans la tasse

Preacuteparer le theacute

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

109

qursquoen fonction drsquoingreacutedients deacutetermineacutes qui font que le programme donne un reacutesultatdiffeacuterent

En geacuteneacuteralisant lrsquoalgorithme du theacute ou du cafeacute chaud on exprime une marche agrave suivrepermettant de reacutealiser une boisson chaude Pour obtenir un reacutesultat diffeacuterent (cafeacute ou theacute)il suffit de deacutefinir comme paramegravetre de lrsquoalgorithme lrsquoingreacutedient cafeacute ou theacute agrave choisir

La marche agrave suivre srsquoeacutecrit en remplaccedilant les mots cafeacute ou theacute par le mot ingreacutedient

Faire du cafeacute eacutequivaut donc agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (ingreacutedient) enutilisant comme ingreacutedient du cafeacute Lrsquoexeacutecution du bloc Preacuteparer (le cafeacute) a pour conseacute-quence de reacutealiser les instructions 2 4 9 et 13 du bloc drsquoinstructions avec comme ingreacute-dient du cafeacute Lrsquoinstruction 2 par exemple srsquoexeacutecute en remplaccedilant le terme ingreacutedientpar le cafeacute Au lieu de lire prendre ingreacutedient il faut lire prendre le cafeacute

De la mecircme faccedilon faire du theacute revient agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (letheacute) Le paramegravetre ingreacutedient correspond ici au theacute et les instructions 2 4 9 et 13 sontexeacutecuteacutees en conseacutequence

Suivant la valeur prise par le paramegravetre ingreacutedient lrsquoexeacutecution de cet algorithmefournit un reacutesultat diffeacuterent Ce peut ecirctre du cafeacute ou du theacute

Donner un nom au bloc drsquoinstructions

Nous constatons qursquoen parameacutetrant un algorithme nous nrsquoavons plus besoin de recopierplusieurs fois les instructions qui le composent pour obtenir un reacutesultat diffeacuterent

En donnant un nom au bloc drsquoinstructions correspondant agrave lrsquoalgorithme geacuteneacuteral Preacuteparer()nous deacutefinissons un sous-programme capable drsquoecirctre exeacutecuteacute autant de fois que neacuteces-saire Il suffit pour cela drsquoappeler le sous-programme par son nom

De plus gracircce au paramegravetre placeacute entre les parenthegraveses qui suivent le nom du sous-programme la fonction srsquoexeacutecute avec des valeurs diffeacuterentes modifiant de ce fait lereacutesultat

Instructions Nom du bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre ingreacutedient3 Prendre un filtre4 Verser ingreacutedient dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que ingreacutedient soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser ingreacutedient dans la tasse

Preacuteparer (ingreacutedient)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

110

Un algorithme parameacutetreacute est deacutefini par

bull un nom

bull un ou plusieurs paramegravetres

En fin drsquoexeacutecution il fournit

bull un reacutesultat qui diffegravere suivant la valeur du ou des paramegravetres

Dans le langage Java les algorithmes parameacutetreacutes srsquoappellent des fonctions ou encore desmeacutethodes Gracircce agrave elles il est possible de traduire un algorithme parameacutetreacute enprogramme informatique Avant drsquoexaminer comment eacutecrire ces algorithmes en langageJava nous allons tout drsquoabord eacutetudier les fonctions preacutedeacutefinies du langage Java de faccedilonagrave mieux comprendre comment elles srsquoutilisent

Des fonctions Java preacutedeacutefiniesUn grand nombre de programmes informatiques font appel agrave des calculs matheacutematiquessimples tels que le calcul drsquoun sinus ou drsquoune racine carreacutee Pour trouver la valeur drsquoun sinuspar exemple le programmeur nrsquoa pas fort heureusement agrave reacuteeacutecrire pour chaque programmelrsquoalgorithme matheacutematique du calcul drsquoun sinus Les fonctions matheacutematiques sont deacutejagraveprogrammeacutees

Le langage Java propose un ensemble de fonctions preacutedeacutefinies matheacutematiques ou autrestregraves utiles comme nous le verrons au cours des chapitres suivants Notre objectif nrsquoestpas de deacutecrire lrsquointeacutegraliteacute des fonctions disponibles car ce seul manuel nrsquoy suffirait pasNous souhaitons faire comprendre la manipulation de ces fonctions Pour ce faire nousallons eacutetudier une partie de la librairie matheacutematique de Java appeleacutee Math et deacuteter-miner ensuite les principes geacuteneacuteraux drsquoutilisation des fonctions

La librairie Math

La librairie matheacutematique du langage Java est composeacutee drsquoun ensemble de fonctionspreacutedeacutefinies qui permettent de calculer toutes sortes drsquoeacutequations matheacutematiques Parmices fonctions se trouvent les fonctions trigonomeacutetriques (sinus cosinus tangente etc)logarithmiques drsquoarrondis de calcul de puissances ou de racines carreacutees

Ces fonctions sont regroupeacutees dans la bibliothegraveque de programmes Math Le nom dechaque fonction deacutebute toujours par le terme Math suivi drsquoun point puis du nom de lafonction Ce nom commence toujours par une minuscule Voici une liste partielle desfonctions qui composent la librairie Math

Fonctions trigonomeacutetriques

Opeacuteration matheacutematique Fonction Java

Calculer le cosinus drsquoun angle (radian) Mathcos()

Calculer le sinus drsquoun angle (radian) Mathsin()

Calculer la tangente drsquoun angle (radian) Mathtan()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

111

Fonctions logarithmiques

Calcul drsquoarrondis

Autres calculs matheacutematiques

Divers

Exemples drsquoutilisationCes fonctions srsquoutilisent en placcedilant dans le programme Java le nom drsquoappel de la fonctionVoici en exemple un programme qui utilise lrsquoensemble des fonctions deacutecrites ci-dessus

Exemple code source complet

public class FonctionMateacutematique public static void main(String [] argument) double reacutesulat a b Systemoutprint(Entrez une premiere valeur ) a = Lired() Systemoutprint(Entrez une seconde valeur ) b = Lired()

Opeacuteration matheacutematique Fonction Java

Calculer le logarithme drsquoune valeur Mathlog()

Calculer lrsquoexponentielle drsquoun nombre Mathexp()

Opeacuteration Fonction Java

Arrondir agrave lrsquoentier infeacuterieur Mathfloor()

Arrondir agrave lrsquoentier supeacuterieur Mathceil()

Opeacuteration matheacutematique Fonction Java

Calculer la racine carreacutee drsquoun nombre Mathsqrt()

ab (a puissance b) Mathpow()

|a| (valeur absolue de a) Mathabs()

Opeacuteration Fonction Java

Trouver la plus grande de deux valeurs Mathmax()

Trouver la plus petite de deux valeurs Mathmin()

Tirer un nombre au hasard entre 0 et 1 Mathrandom()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

112

reacutesultat = Mathcos(a) Systemoutprintln(Cos( + a + ) = + reacutesultat) reacutesultat = Mathsin(a) Systemoutprintln(Sin( + a + ) = + reacutesultat) reacutesultat = Mathtan(a) Systemoutprintln(Tan( + a + ) = + reacutesultat) reacutesultat = Mathlog(a) Systemoutprintln(Log( + a + ) = + reacutesultat) reacutesultat = Mathexp(a) Systemoutprintln(Exp( + a + ) = + reacutesultat) reacutesultat = Mathfloor(a) Systemoutprintln(Floor( + a + ) = + reacutesultat) reacutesultat = Mathceil(a) Systemoutprintln(Ceil( + a + ) = + reacutesultat) reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat) reacutesultat = Mathpow(ab) Systemoutprintln(Pow( + a + + b +) = + reacutesultat) reacutesultat = Mathabs(a) Systemoutprintln(Abs( + a + ) = + reacutesultat) reacutesultat = Mathmax(ab) Systemoutprintln(Max( + a + + b + ) = + reacutesultat) reacutesultat = Mathmin(ab) Systemoutprintln(Min( + a + + b + ) = + reacutesultat) reacutesultat = Mathrandom() Systemoutprintln(Random() = + reacutesultat)

Une fois les instructions de ce programme compileacutees lrsquointerpreacuteteur Java les exeacutecute uneagrave une Le reacutesultat est le suivant

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez une premiere valeur 0011Entrez une seconde valeur 22Cos(01) = 09950041652780257Sin(01) = 009983341664682815Tan(01) = 010033467208545055Log(01) = -23025850929940455Exp(01) = 11051709180756477Floor(01) = 00Ceil(01) = 10Sqrt(01) = 0316227766011683794Pow(01 20) = 001Abs(01) = 01Max(01 20) = 20Min(01 20)= 01Random() = 06993848420032578

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

113

Principes de fonctionnementLrsquoeacutetude de ce programme met en eacutevidence plusieurs aspects importants concernantlrsquoutilisation des fonctions et leur mode de fonctionnement

Le nom des fonctions

bull Le nom de chaque fonction est deacutefini par le langage Java Pour connaicirctre le nom desdiffeacuterentes fonctions proposeacutees par le Java il est neacutecessaire de consulter lrsquoaide enligne du compilateur ou le site Internet de Sun (voir le CD-Rom livreacute avec cetouvrage) ou encore des livres plus speacutecifiques sur le langage Java et les bases dedonneacutees ou les reacuteseaux

bull Remarquons que lrsquoexeacutecution drsquoune fonction passe par lrsquoeacutecriture dans une instructiondu nom de la fonction choisie suivi de paramegravetres eacuteventuels placeacutes entre parenthegraveses

Meacutemoriser le reacutesultat drsquoune fonction

bull Pour meacutemoriser le reacutesultat du calcul la fonction est placeacutee dans une instructiondrsquoaffectation La fonction situeacutee agrave droite du signe = est exeacutecuteacutee en premier Apregravesquoi la variable situeacutee agrave gauche du signe = reacutecupegravere la valeur calculeacutee lors de lrsquoexeacutecu-tion de la fonction

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Rocircle et meacuteca-nisme de lrsquoaffectation raquo

bull Dans notre exemple toutes les fonctions de la bibliothegraveque Math fournissent enreacutesultat une valeur numeacuterique de type double En conseacutequence la variable reacutesultatqui reacutecupegravere le reacutesultat de chaque fonction est deacuteclareacutee de type double

Les paramegravetres drsquoune fonction

Les fonctions possegravedent zeacutero un voire deux paramegravetres Ainsi

bull La fonction Mathrandom() ne possegravede pas de paramegravetre Cette fonction donne enreacutesultat une valeur au hasard comprise entre 00 et 10 indeacutependamment de toutecondition Aucun paramegravetre nrsquoest donc neacutecessaire agrave sa bonne marche

Remarquons que mecircme si la fonction nrsquoa pas de paramegravetre il reste neacutecessaire deplacer des parenthegraveses ouvrante puis fermante derriegravere le nom drsquoappel de la fonctionSi aucune parenthegravese nrsquoest placeacutee le compilateur ne considegravere pas le termeMathrandom comme une fonction mais comme un nom de variable

Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante puisfermante

bull La fonction Mathsqrt()ne comporte qursquoun seul paramegravetre puisqursquoelle calcule laracine carreacutee drsquoun seul nombre agrave la fois Il est possible de placer entre parenthegraveses uneexpression matheacutematique plutocirct qursquoun paramegravetre Ainsi lrsquoexpression Mathsqrt(bb ndash 4ac) permet le calcul de la racine carreacutee du discriminant drsquoune eacutequation dusecond degreacute

Observons que le paramegravetre placeacute entre parenthegraveses dans la fonction Mathsqrt() estde type double De cette faccedilon il est possible de calculer la racine carreacutee de tout type

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

114

de valeur numeacuterique les types byte short int ou long se transformant sans difficulteacuteen type double

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo La transfor-mation de types raquo

Il nrsquoest pas permis de placer en paramegravetre un caractegravere une suite de caractegraveres ou unbooleacuteen Par exemple le fait drsquoeacutecrire Mathsqrt(Quatre) entraicircne une erreur encours de compilation lrsquoordinateur ne sachant pas transformer le mot laquo Quatre raquo en lavaleur numeacuterique 4 (message drsquoerreur Incompatible type for method Canrsquotconvert javalangString to double)

Dans lrsquoappel de la fonction le type des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir une erreur de compilation

bull La fonction Mathpow(ab) possegravede deux paramegravetres pour calculer ab (a agrave la puissanceb) Ces paramegravetres sont seacutepareacutes par une virgule Si les valeurs a et b sont inverseacuteesdans lrsquoappel de la fonction (Mathpow(ba)) le calcul effectueacute a pour reacutesultat ba (b agravela puissance a)

Dans lrsquoappel de la fonction lrsquoordre des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir un reacutesultat diffeacuterent de celui attendu

Les fonctions eacutetudieacutees dans cette section sont des fonctions preacutedeacutefinies par le langageJava Le programmeur les utilise en connaissant le reacutesultat qursquoil souhaite obtenir Lesprogrammes ainsi eacutecrits sont constitueacutes drsquoinstructions simples et drsquoappels agrave des fonc-tions connues du langage Java

Le langage Java offre aussi au programmeur la possibiliteacute drsquoeacutecrire ses propres fonctionsde faccedilon agrave obtenir diffeacuterents programmes adapteacutes au problegraveme qursquoil doit reacutesoudre Nouseacutetudions cette technique agrave la section qui suit

Construire ses propres fonctionsUne fonction deacuteveloppeacutee par un programmeur srsquoutilise de la mecircme faccedilon qursquoune fonc-tion preacutedeacutefinie Elle srsquoexeacutecute en placcedilant lrsquoinstruction drsquoappel agrave la fonction dans leprogramme Cette eacutetape est deacutecrite agrave la section laquo Appeler une fonction raquo

Pour que lrsquoordinateur puisse lire et exeacutecuter les instructions composant la fonction ilconvient de deacutefinir cette derniegravere crsquoest-agrave-dire drsquoeacutecrire une agrave une les instructions qui lacomposent Plusieurs eacutetapes sont neacutecessaires agrave cette deacutefinition Nous les eacutetudions agrave lasection laquo Deacutefinir une fonction raquo

Pour mieux cerner les difficulteacutes lieacutees agrave ces opeacuterations nous allons prendre comme exemplela creacuteation drsquoune fonction qui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Appeler une fonctionToute fonction possegravede un nom drsquoappel qui permet de lrsquoidentifier Ce nom est choisi defaccedilon agrave repreacutesenter et reacutesumer tout ce qui est reacutealiseacute par son intermeacutediaire Dans notreexemple nous devons calculer le peacuterimegravetre drsquoun cercle Nous appelons donc la fonctionqui reacutealise ce calcul crsquoest-agrave-dire peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

115

Drsquoune maniegravere geacuteneacuterale une fonction repreacutesente une action Crsquoest pourquoi le choixdrsquoun verbe comme nom de fonction permet de mieux symboliser les opeacuterations reacutealiseacuteesIci le terme peacuterimegravetre() nrsquoest pas un verbe mais il faut comprendre par peacuterimegravetre()lrsquoaction de calculer le peacuterimegravetre

Le nom de la fonction peacuterimegravetre() eacutetant deacutefini nous souhaitons calculer le peacuterimegravetredrsquoun cercle dont la valeur du rayon soit saisie au clavier Pour cela observons leprogramme qui calcule la racine carreacutee drsquoun nombre saisi au clavier

double reacutesulat aSystemoutprint(Entrez une valeur )a = Lired()reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat)

Lrsquoinstruction reacutesultat = Mathsqrt(a) calcule la racine carreacutee du nombre a dont lavaleur a eacuteteacute saisie au clavier agrave lrsquoinstruction preacuteceacutedente Elle place ensuite le reacutesultat dece calcul dans la variable reacutesultat

En modifiant le nom drsquoappel de la fonction Mathsqrt() par peacuterimegravetre() nous obte-nons un programme qui appelle la fonction peacuterimegravetre() et qui par conseacutequent calculele peacuterimegravetre drsquoun cercle dont la valeur du rayon a est saisie au clavier La valeur du peacuteri-megravetre est placeacutee dans la variable reacutesultat par lrsquointermeacutediaire du signe drsquoaffectation =

Pour notre exemple le programme drsquoappel agrave la fonction peacuterimegravetre() srsquoeacutecrit

public static void main(String [] parametre) Deacuteclaration des variables double reacutesultat int valeur Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat)

Le programme ainsi eacutecrit permet de calculer le peacuterimegravetre drsquoun cercle de rayon donneacute agravela seule condition de deacutefinir la fonction peacuterimegravetre()dans le programme En effet cettefonction nrsquoest pas preacutedeacutefinie dans le langage Java et il est neacutecessaire de deacutetailler lesinstructions qui la composent

Sans cette deacutefinition lrsquoordinateur nrsquoest pas agrave mecircme de deacuteterminer par lui-mecircme lesinstructions agrave exeacutecuter et le message drsquoerreur Method perimetre(int) not found inclass Cercle apparaicirct en cours de compilation

Deacutefinir une fonction La deacutefinition drsquoune fonction fournit agrave lrsquoordinateur les instructions agrave exeacutecuter lors delrsquoappel de la fonction Cette opeacuteration passe par les eacutetapes suivantes

bull deacuteterminer les instructions composant la fonction

bull associer le nom de la fonction aux instructions copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

116

bull eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction

bull preacuteciser le type de reacutesultat fourni par la fonction

De faccedilon agrave mieux comprendre le rocircle de chacune de ces eacutetapes deacutefinissons la fonctionqui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Deacuteterminer les instructions composant la fonctionPour seacutelectionner les instructions utiles au calcul du peacuterimegravetre drsquoun cercle reprenons leprogramme Cercle

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la section laquo Un premier programme enJava raquo

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double r p Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R r= Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Nous avons observeacute lors de la mise en œuvre drsquoalgorithmes parameacutetreacutes que la marcheagrave suivre deacutecrivant lrsquoalgorithme devait ecirctre la plus geacuteneacuterale possible (voir la sectionlaquo Deacutefinir les paramegravetres raquo) Crsquoest pourquoi pour notre cas seules les instructions

Deacuteclaration des variables double r p Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr

sont utiliseacutees dans la fonction de calcul du peacuterimegravetre drsquoun cercle Les instructions rela-tives agrave la demande de saisie drsquoune valeur au clavier ne sont pas agrave placer dans la fonctionPour vous en convaincre observez que lrsquoordinateur agrave lrsquoappel de la fonctionMathsqrt() ne demande pas de valeur agrave saisir Il ne fait que calculer la racine carreacuteedrsquoune valeur passeacutee en paramegravetre

Les instructions ainsi choisies sont placeacutees dans ce que lrsquoon appelle dans le jargon infor-matique le corps de la fonction et ce de la faccedilon suivante

Deacutefinition du corps de la fonction deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

117

Le corps de la fonction est deacutetermineacute par les accolades et Les instructions qui lecomposent sont ici des deacuteclarations de variables et des instructions drsquoaffectation Dansdrsquoautres cas peuvent aussi figurer des instructions de test de reacutepeacutetition etc

Associer le nom aux instructions

Une fois eacutecrit le corps de la fonction il est neacutecessaire de lrsquoassocier au nom drsquoappel de lafonction

Le nom drsquoune fonction est lieacute au bloc drsquoinstructions qui la compose gracircce agrave un en-tecirctede fonction Ce dernier a pour forme

public static type nomdelafonction (paramegravetres)

Lrsquoen-tecircte drsquoune fonction permet de preacuteciser

bull Le nom de la fonction (pour notre exemple le nomdelafonction est peacuterimegravetre)

bull Les paramegravetres eacuteventuels de la fonction

bull Le type de reacutesultat fourni par la fonction

Les mots-cleacutes public static sont agrave placer pour lrsquoinstant obligatoirement devant le typede reacutesultat de la fonction

Nous expliquons la preacutesence de ces termes agrave la section laquo Collectionner un nombre fixe drsquoobjets raquodu chapitre 9 laquo La ligne de commande raquo car ils sont lieacutes aux concepts de la programmation objet

Lrsquoen-tecircte drsquoune fonction se place comme son nom lrsquoindique au-dessus du corps de lafonction Pour notre exemple il se place de la faccedilon suivante

En-tecircte de la fonctionpublic static type peacuterimegravetre (paramegravetres) deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

De cette faccedilon le corps de la fonction est associeacute au nom peacuterimegravetre() Agrave lrsquoappel du nomde la fonction peacuterimegravetre() lrsquoordinateur exeacutecute les instructions placeacutees dans le corpsde la fonction

Eacutetablir les paramegravetres utiles

Comme nous venons de le voir le peacuterimegravetre du cercle est calculeacute agrave partir du rayon dontla valeur est saisie avant lrsquoappel de la fonction La valeur du rayon est placeacutee en para-megravetre de la fonction comme lors du calcul de la racine carreacutee drsquoun nombre

Le rayon du cercle est consideacutereacute comme le paramegravetre de la fonction peacuterimegravetre() etlrsquoen-tecircte de la fonction srsquoeacutecrit comme suit

public static type peacuterimegravetre (int r)

Comme la variable r est deacuteclareacutee agrave lrsquointeacuterieur des parenthegraveses de la fonction peacuteri-megravetre() elle est consideacutereacutee par le compilateur Java comme eacutetant le paramegravetre de lafonction peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

118

Lrsquoinstruction de deacuteclaration situeacutee dans le corps de la fonction doit ecirctre ainsi modifieacutee

double p

La variable r est deacuteclareacutee dans lrsquoen-tecircte de la fonction et elle ne peut donc ecirctre deacuteclareacuteeune deuxiegraveme fois agrave lrsquointeacuterieur de la fonction sous peine de provoquer une erreur decompilation (message drsquoerreur variable rsquorrsquo is already defined in this method)

Le paramegravetre r est aussi appeleacute paramegravetre formel Il prend la forme (la valeur) de lavariable donneacutee au moment de lrsquoappel de la fonction Pour bien comprendre cela rappe-lons-nous de lrsquoalgorithme du cafeacute ou du theacute chaud dans lequel nous avons utiliseacute unevariable ingreacutedient prenant la forme de cafeacute ou de theacute suivant ce que lrsquoon souhaitaitobtenir Ici r prend la valeur de la variable valeur lors de lrsquoappel de la fonctionreacutesultat = peacuterimegravetre(valeur) depuis la fonction main()

Remarquons aussi que le paramegravetre valeur fourni lors de lrsquoappel de la fonction peacuteri-megravetre () est appeleacute paramegravetre reacuteel ou encore paramegravetre effectif Crsquoest la valeur de ceparamegravetre qui est transmise au paramegravetre formel lors de lrsquoappel de la fonction

Preacuteciser le type de reacutesultat fourni

Une fois le peacuterimegravetre calculeacute gracircce agrave lrsquoinstruction

p = 2 MathPI r

la valeur contenue dans la variable p doit ecirctre transmise et placeacutee dans la variablereacutesultat deacuteclareacutee dans le programme deacutecrit agrave la section laquo Appeler une fonction raquo de cechapitre Pour ce faire les deux opeacuterations suivantes sont agrave reacutealiser

bull Placer une instruction return suivie de la variable contenant le reacutesultat en fin de fonc-tion Pour notre cas

return p

Agrave la lecture de cette instruction le programme sort de la fonction peacuterimegravetre() ettransmet la valeur contenue dans la variable p au programme qui a appeleacute la fonctionpeacuterimegravetre()

bull Speacutecifier le type de la valeur retourneacutee dans lrsquoen-tecircte de la fonction Pour notreexemple la valeur retourneacutee est contenue dans la variable p de type double Crsquoestpourquoi lrsquoen-tecircte de la fonction srsquoeacutecrit

public static double peacuterimegravetre (int r)

De cette faccedilon le compilateur sait agrave la seule lecture de lrsquoen-tecircte que la fonctiontransmet un reacutesultat de type double

La fonction peacuterimegravetre() srsquoeacutecrit en reacutesumeacute de la faccedilon suivante

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

119

Dans notre exemple la fonction peacuterimegravetre() utilise un seul paramegravetre et retourne unreacutesultat numeacuterique Dans drsquoautres situations le nombre de paramegravetres peut varier et lesfonctions peuvent avoir soit aucun soit plusieurs paramegravetres De la mecircme faccedilon unefonction peut ne pas retourner de reacutesultat

Les fonctions au sein drsquoun programme JavaAvec les fonctions nous voyons apparaicirctre la notion de fonctions appeleacutees et deprogrammes appelant des fonctions

Dans notre exemple la fonction peacuterimegravetre() est appeleacutee par la fonction main() Cettederniegravere est consideacutereacutee par lrsquoordinateur comme eacutetant le programme principal (le termeanglais main se traduit par principal) En effet la fonction main() est la premiegravere fonc-tion exeacutecuteacutee par lrsquoordinateur au lancement drsquoun programme Java

Toute fonction peut appeler ou ecirctre appeleacutee par une autre fonction Ainsi rien nrsquointerditque la fonction peacuterimegravetre()soit appeleacutee par une autre fonction que la fonction main()

Seule la fonction main() ne peut pas ecirctre appeleacutee par une autre fonction du programmeEn effet la fonction main() nrsquoest exeacutecuteacutee qursquoune seule fois et uniquement par lrsquointer-preacuteteur Java lors du lancement du programme

Comment placer plusieurs fonctions dans un programmeLes fonctions sont des programmes distincts les uns des autres Elles sont en outre deacutefi-nies seacutepareacutement les unes des autres Pour exeacutecuter un programme constitueacute de plusieursfonctions il est neacutecessaire pour lrsquoinstant de les regrouper dans un mecircme fichier unemecircme classe

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo Compilation et exeacutecution drsquoune appli-cation multifichier raquo

Pour des raisons peacutedagogiques les fonctions main() et peacuterimegravetre() ont eacuteteacute preacutesenteacuteesseacutepareacutement En reacutealiteacute ces deux fonctions sont placeacutees agrave lrsquointeacuterieur de la mecircme classeCercle (deacutefinie notamment au chapitre introductif laquo Naissance drsquoun programme raquo)

Le programme prend la forme suivante

public class Cercle Le fichier srsquoappelle Cerclejavapublic static void main(String [] parametre) Deacuteclaration des variables int valeur double reacutesultat Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat) fin de main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

120

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p fin de peacuterimegravetre() fin de class Cercle

En examinant la structure geacuteneacuterale de ce programme nous remarquons qursquoil existe deuxblocs drsquoinstructions seacutepareacutes nommeacutes main() et peacuterimegravetre() Ces deux blocs sont placeacutesagrave lrsquointeacuterieur drsquoun bloc repreacutesentant la classe Cercle comme illustreacute agrave la Figure 5-1

Nous observons que la structure de la fonction peacuterimegravetre() est tregraves voisine de celle dela fonction main() Elle est constitueacutee drsquoun en-tecircte suivi drsquoun corps formeacute drsquoun blocdeacutefini par des accolades ouvrante et fermante

Notons pour finir que la fonction main() est ici placeacutee avant la fonction peacuterimegravetre()mais qursquoil est aussi permis de lrsquoeacutecrire apregraves Lrsquoordre drsquoapparition des fonctions dans uneclasse importe peu et est laisseacute au choix du programmeur

Les diffeacuterentes formes drsquoune fonctionNous lrsquoavons deacutejagrave observeacute (voir la section laquo Principes de fonctionnement raquo de cechapitre) les fonctions peuvent posseacuteder zeacutero un voire plusieurs paramegravetres de diffeacute-rents types De la mecircme faccedilon elles peuvent fournir ou non un reacutesultat Suivant les casleur deacutefinition varie leacutegegraverement

Fonction avec reacutesultat

Comme nous lrsquoavons observeacute lors de la deacutefinition de la fonction peacuterimegravetre() toutefonction fournissant un reacutesultat possegravede un return placeacute dans le corps de la fonction

Figure 5ndash1

Les fonctions main() et peacuterimegravetre() agrave lrsquointeacuterieur de la classe Cercle

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

121

De plus lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond au typedu reacutesultat retourneacute

Si une fonction retourne en reacutesultat une variable de type int son en-tecircte srsquoeacutecrit publicstatic int nomdelafonction()

Remarquons qursquoune fonction ne retourne qursquoune et une seule valeur Il nrsquoest donc paspossible drsquoeacutecrire lrsquoinstruction return sous la forme return ab pour retourner deuxvaleurs au programme appelant Dans un tel cas le compilateur deacutetecte une erreur dutype laquo rsquorsquo expected raquo

Lorsqursquoune fonction fournit plusieurs reacutesultats la transmission des valeurs ne peut sereacutealiser par lrsquointermeacutediaire de lrsquoinstruction return Il est neacutecessaire dans ce casdrsquoemployer des techniques plus avanceacutees (voir le chapitre 7 laquo Les classes et lesobjets raquo)

Fonction sans reacutesultat

Une fonction peut ne pas fournir de reacutesultat Tel est en geacuteneacuteral le cas des fonctions utili-seacutees pour lrsquoaffichage de messages Par exemple la fonction menu() suivante ne fournitpas de reacutesultat et ne fait qursquoexeacutecuter les opeacuterations selon la valeur du paramegravetre choix

public static void menu (int choix) switch (choix) case 1 Saisie drsquoune personne break case 2 Afficher une personne break fin de menu()

Lrsquoen-tecircte public static void menu (int choix) mentionne que la fonction menu()neretourne pas de reacutesultat gracircce au mot-cleacute void placeacute devant le nom de la fonction

Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void et lrsquoinstructionreturn ne figure pas dans le corps de la fonction

Fonction agrave plusieurs paramegravetres

Prenons pour exemple une fonction max() qui fournit en reacutesultat la plus grande des deuxvaleurs donneacutees en paramegravetres

public class Maximum Le fichier srsquoappelle Maximumjava public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

122

Systemoutprint(Entrer une valeur ) v2 = Lirei() sup = max (v1v2) Systemoutprint(Le max de + v1 + et de + v2 + est + sup) fin de main()

public static int max (int a int b) int m = a if (b gt m) m = b return m fin de max() fin de class Maximum

La fonction max()possegravede un en-tecircte

public static int max (int a int b)

qui mentionne deux paramegravetres a et b de type entier Nous observons que

bull Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes par unevirgule Lrsquoen-tecircte drsquoune fonction peut alors prendre la forme suivante

public static int quelconque (int a char c double t)

bull Devant chaque paramegravetre est placeacute son type mecircme si deux paramegravetres conseacutecutifs sontde type identique Ainsi eacutecrire lrsquoen-tecircte de la fonction max() de la faccedilon suivante

public static int max (int a b)

nrsquoest pas possible et provoque une erreur de compilation de type Identifierexpected

Fonction sans paramegravetre

Une fonction peut ne pas avoir de paramegravetre Son en-tecircte ne possegravede alors aucun para-megravetre entre parenthegraveses

Ainsi la fonction sortie() suivante permet de sortir proprement de nrsquoimporte quelprogramme

public static void sortie () Systemoutprint(Au revoir et a bientot) Fonction Java qui permet de sortir proprement drsquoun programme Systemexit(0)

ReacutesumeacuteUn algorithme parameacutetreacute est une marche agrave suivre qui fournit un reacutesultat pouvantdiffeacuterer suivant la valeur du ou des paramegravetres Dans le langage Java les algorithmesparameacutetreacutes srsquoappellent des fonctions ou encore des meacutethodes

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

123

Le langage Java propose un ensemble de fonctions preacutedeacutefinies fort utiles Parmi ces fonc-tions se trouvent les fonctions matheacutematiques telles que Mathsqrt() pour calculer laracine carreacutee du nombre placeacute entre parenthegraveses ou Mathlog() pour le logarithme

Lrsquoeacutetude des fonctions matheacutematiques montre que

bull Pour exeacutecuter une fonction il est neacutecessaire drsquoeacutecrire dans une instruction le nomde la fonction choisie suivi des paramegravetres eacuteventuels placeacutes entre parenthegraveses

bull Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante etfermante

bull Le type et lrsquoordre des paramegravetres dans lrsquoappel de la fonction doivent ecirctrerespecteacutes sous peine drsquoobtenir une erreur de compilation ou drsquoexeacutecution

Le langage Java offre en outre au programmeur la possibiliteacute drsquoeacutecrire ses propresfonctions de faccedilon agrave obtenir des programmes bien adapteacutes au problegraveme qursquoil doitreacutesoudre La deacutefinition drsquoune fonction passe par plusieurs eacutetapes qui permettent de

bull Preacuteciser les instructions composant la fonction en les placcedilant dans le corps de lafonction Ce dernier est deacutetermineacute par des accolades

bull Associer le nom de la fonction aux instructions agrave lrsquoaide drsquoun en-tecircte qui preacutecise lenom de la fonction le type des paramegravetres (appeleacutes paramegravetres formels) et le typede reacutesultat retourneacute Cet en-tecircte se reacutedige sous la forme suivante

public static type nomdelafonction (paramegravetres)

bull Eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction en les deacuteclarant agrave lrsquointeacute-rieur des parenthegraveses placeacutees juste apregraves le nom de la fonction

ndash Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes parune virgule Devant chaque paramegravetre est placeacute son type mecircme si deux para-megravetres conseacutecutifs sont de type identique

ndash Lorsqursquoune fonction nrsquoa pas de paramegravetre son en-tecircte ne possegravede aucun para-megravetre entre parenthegraveses

bull Preacuteciser le type de reacutesultat fourni par la fonction dans lrsquoen-tecircte de la fonction etplacer lrsquoinstruction return degraves que le reacutesultat doit ecirctre transmis au programmeappelant la fonction

ndash Toute fonction fournissant un reacutesultat possegravede un return placeacute dans le corps dela fonction

ndash Lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond autype de reacutesultat retourneacute Remarquons qursquoune fonction ne retourne qursquoune etune seule valeur

ndash Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void etlrsquoinstruction return ne figure pas dans le corps de la fonction

Une fonction peut ecirctre appeleacutee (exeacutecuteacutee) depuis une autre fonction ou depuis la fonc-tion main() qui repreacutesente le programme principal Lrsquoappel drsquoune fonction est reacutealiseacuteen eacutecrivant une instruction composeacutee du nom de la fonction suivi entre parenthegravesesdrsquoune liste de paramegravetres

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

124

ExercicesApprendre agrave deacuteterminer les paramegravetres drsquoun algorithme

Pour eacutecrire lrsquoalgorithme permettant de reacutealiser une boisson plus ou moins sucreacuteeproceacutedez de la faccedilon suivante

a Eacutecrivez le bloc drsquoinstructions qui place un nombre deacutetermineacute de morceaux desucre dans une boisson chaude

b Deacuteterminez le paramegravetre qui permet de sucrer plus ou moins la boisson

c Donnez un nom agrave lrsquoalgorithme et preacutecisez le paramegravetre

d Eacutecrivez lrsquoalgorithme en utilisant le nom du paramegravetre

e Appelez lrsquoalgorithme parameacutetreacute par son nom en tenant compte du nombre demorceaux de sucre souhaiteacute

Comprendre lrsquoutilisation des fonctions Agrave la lecture du programme suivant

public class Fonction public static void main(String [] parametre) Deacuteclaration des variables int acompteur for (compteur = 0 compteur lt= 5 compteur++) a = calculer(compteur) Systemoutprint(a + a ) fin de main()

public static int calculer(int x) int y y = x x return y fin de fonc1() fin de class

a Deacutelimitez les trois blocs deacutefinissant la fonction main() la fonction calculer()et la classe Fonction

b Quel est le paramegravetre formel de la fonction calculer()

c Quelles sont les valeurs transmises au paramegravetre de la fonction calculer() lorsde son appel depuis la fonction main()

d Quels sont les reacutesultats produits par la fonction calculer()

e Quelles sont les valeurs transmises agrave la variable a

f Deacutecrivez lrsquoaffichage reacutealiseacute par la fonction main()

51

52

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

125

Soit la fonction

public static int f( int x) int resultat resultat = -x x + 3 x ndash 2 return resultat

a Eacutecrivez la fonction main() qui affiche le reacutesultat de la fonction f(x) pour x = 0

b Transformez la fonction main() de faccedilon agrave calculer et agrave afficher le reacutesultat de lafonction pour x entier variant entre -5 et 5 Utilisez pour cela dans la fonctionmain() une boucle for avec un indice variant entre -5 et 5

c Pour deacuteterminer le maximum de la fonction f(x) entre -5 et 5 calculez la valeurde f(x) pour chacune de ces valeurs et stockez le maximum dans une variable max

Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction

Deacuteterminez les erreurs de compilation des extraits de programmes suivants

a En utilisant la fonction max() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables double v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lired() Systemoutprint(Entrer une valeur ) v2 = Lired() sup = max (v1v2) Systemoutprint(Le max de + v1 + et + v2 + est + sup) fin de main()

b

public static int max (int a int b) float m = a if (m gt b) m = b return m fin de max()

c En utilisant la fonction menu() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 Systemoutprint(Entrer une valeur ) v1 = Lirei() v1 = menu (v2) fin de main()

53

54

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

126

d

public static void menu (int c) switch (c) return c

Eacutecrire une fonction simpleEacutecrivez la fonction pourcentage() qui permet de calculer les pourcentagesdrsquoutilisation de la Carte Bleue du cheacutequier et des virements automatiques sachantque la formule de calcul du pourcentage pour la Carte Bleue est comme nouslrsquoavons vu au chapitre 1 laquo Stocker une information raquo la suivante

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Suivez les eacutetapes deacutecrites dans le preacutesent chapitre

a Deacuteterminez les instructions composant la fonction

b Associez le nom de la fonction aux instructions

c Pour deacuteterminer les paramegravetres de la fonction recherchez les valeurs pouvantmodifier le reacutesultat du calcul

Aide lrsquoen-tecircte drsquoune fonction ayant deux paramegravetres entiers srsquoeacutecrit public static type nomdelafonction( int a int b)

d Preacutecisez le type de reacutesultat fourni par la fonction

e Eacutecrivez la fonction main() qui fait appel agrave la fonction pourcentage() et quipermette drsquoobtenir une exeacutecution telle que

Nombre de paiement par Carte Bleue 5Nombre de cheques emis 10Nombre de virements automatiques 5Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

Le projet laquo Gestion drsquoun compte bancaire raquoLe programme eacutecrit au chapitre 4 laquo Faire des reacutepeacutetitions raquo est suffisamment structureacutepour y placer des fonctions En effet chaque option du projet est un programme agrave partentiegravere et peut donc ecirctre deacutecrite sous forme de fonction

Dans le cadre de ce chapitre nous allons construire trois fonctions relativement simplesqui vont nous permettre de comprendre le meacutecanisme de construction des fonctions

55

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

127

Deacutefinir une fonction Les fonctions sans paramegravetre avec reacutesultatLa fonction menuPrincipal()affiche le menu principal du programme et demande lasaisie de lrsquooption choisie Cette valeur doit ecirctre communiqueacutee agrave la fonction main() pourexeacutecuter la structure switch qui suit cette fonction

a Deacutecrivez lrsquoen-tecircte de la fonction menuPrincipal() en prenant soin de preacuteciser letype correspondant agrave la valeur retourneacutee

b Placez les instructions relatives agrave lrsquoaffichage du menu et agrave la saisie de lrsquooption dansle corps de la fonction

c Veacuterifiez que lrsquoopeacuterateur return soit appliqueacute agrave la variable contenant le choix delrsquooption

Les fonctions sans paramegravetre ni reacutesultatLa fonction sortir() affiche un message de politesse avant de sortir proprement duprogramme Elle ne fournit pas de reacutesultat et nrsquoa pas non plus besoin de paramegravetrepuisque aucune valeur speacutecifique nrsquoest neacutecessaire agrave son exeacutecution

a Deacutecrivez lrsquoen-tecircte de la fonction sortir()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

La fonction alAide() affiche agrave lrsquoeacutecran une explication sur ce que reacutealise chaque optionde lrsquoapplication

a Deacutecrivez lrsquoen-tecircte de la fonction alAide()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Appeler une fonction Modifiez la fonction main() de votre programme de faccedilon agrave utiliser les trois fonctionsalAide() sortir() et menuPrincipal() deacutefinies aux eacutetapes preacuteceacutedentes

Lrsquoexeacutecution finale du programme doit ecirctre identique agrave celle du chapitre preacuteceacutedent Seulela structure interne du programme est modifieacutee ce dernier eacutetant composeacute de quatrelaquo blocs fonctions raquo

copy copyright Eacuteditions Eyrolles

6Fonctions notions avanceacutees

La creacuteation et lrsquoutilisation de fonctions deacutedieacutees agrave la reacutesolution drsquoun problegraveme donneacute sontnous lrsquoavons observeacute au chapitre preacuteceacutedent des opeacuterations fondamentales qui permet-tent le deacuteveloppement de logiciels dont le code source soit facilement reacuteutilisable

Ces fonctions transforment la structure geacuteneacuterale des programmes et apportent de ce faitde nouveaux concepts qursquoil est important de bien maicirctriser avant drsquoeacutetudier la program-mation objet

Nous commenccedilons par examiner (section laquo La structure drsquoun programme raquo) cesnouvelles notions telles que la visibiliteacute des variables les variables locales et les varia-bles de classe agrave partir drsquoexemples simples Pour chacune de ces notions nous observonsleur reacutepercussion sur le reacutesultat des diffeacuterents programmes donneacutes en exemple

Nous analysons ensuite (section laquo Les fonctions communiquent raquo) comment les fonc-tions eacutechangent des donneacutees par lrsquointermeacutediaire des paramegravetres et du retour de reacutesultatAgrave partir de cette analyse nous constatons que ces modes de communication ne permet-tent pas toujours drsquoobtenir lrsquoopeacuteration souhaiteacutee

La structure drsquoun programme Nous avons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Les fonctions au seindrsquoun programme Java raquo ) qursquoun programme eacutetait constitueacute drsquoune classe qui englobe unensemble de fonctions deacutefinissant chacune un bloc drsquoinstructions indeacutependant

En reacutealiteacute il existe trois principes fondamentaux qui reacutegissent la structure drsquounprogramme Java Ces principes sont deacutetailleacutes ci-dessous

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

130

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visibleen dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions de visibiliteacute des variables de variableslocales et de variables de classe Concregravetement ces trois notions sont attacheacutees au lieude deacuteclaration des variables comme lrsquoillustre la Figure 6-1

Pour mieux comprendre ces diffeacuterents concepts nous allons observer un programmecomposeacute de deux fonctions main() et modifier() et drsquoune variable nommeacutee valeurLa fonction modifier() a pour objectif de modifier le contenu de la variable valeurPour chaque exemple la variable valeur est deacuteclareacutee en un lieu diffeacuterent du programmeAgrave partir de ces variations le programme fournit un reacutesultat diffeacuterent que nous analysons

La visibiliteacute des variables

Apregraves eacutetude des trois proprieacuteteacutes eacutenonceacutees ci-dessus nous observons qursquoun programmeest constitueacute de deacuteclarations de variables et de fonctions Il existe de fait une notiondrsquoexteacuterieur et drsquointeacuterieur aux fonctions Les instructions eacuteleacutementaires de type affecta-tion test etc se situent toujours agrave lrsquointeacuterieur drsquoune fonction alors que la deacuteclaration devariables est une opeacuteration reacutealisable agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur drsquoune fonction

Figure 6ndash1

Les variables peuvent ecirctre deacuteclareacutees agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur des fonctions mais toujours dans une classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

131

De plus la troisiegraveme proprieacuteteacute eacutenumeacutereacutee ci-dessus exprime qursquoune fonction ne peut pasutiliser dans ses instructions une variable deacuteclareacutee dans une autre fonction Pour mieuxvisualiser cette proprieacuteteacute examinons le programme ci-dessous

Exemple code source complet

public class Visibilite public static void main(String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class Visibilite

Dans ce programme nous constatons que lrsquoinstruction valeur = 3 placeacutee dans lafonction modifier() cherche agrave modifier le contenu de la variable valeur deacuteclareacutee nonpas dans la fonction modifier() mais dans la fonction main()

Cette modification nrsquoest pas reacutealisable car la variable valeur nrsquoest deacutefinie qursquoagrave lrsquointeacute-rieur de la fonction main() Elle est donc invisible depuis la fonction modifier() Lesfonctions sont par deacutefinition des blocs distincts La fonction modifier()ne peut agir surla variable valeur qui nrsquoest visible qursquoagrave lrsquointeacuterieur de la fonction main()

Crsquoest pourquoi le fait drsquoeacutecrire lrsquoinstruction valeur = 3 dans la fonction modifier()provoque une erreur de compilation du type Line 12 Undefined variable valeur

Figure 6ndash2

Une variable deacuteclareacutee dans une fonction ne peut pas ecirctre utlisiseacutee par une autre fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

132

Variable locale agrave une fonctionLa deuxiegraveme proprieacuteteacute eacutenonceacutee preacuteceacutedemment eacutetablit qursquoune fonction est formeacuteedrsquoinstructions eacuteleacutementaires et notamment des instructions de deacuteclaration de variables

Par deacutefinition une variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est dite variable localeagrave la fonction Pour lrsquoexemple preacuteceacutedent la variable valeur est locale agrave la fonctionmain()

Les variables locales nrsquoexistent que pendant le temps de lrsquoexeacutecution de la fonction Ellesne sont pas modifiables depuis une autre fonction Nous lrsquoavons vu agrave la section preacuteceacute-dente le contenu de la variable valeur ne peut ecirctre modifieacute par une instruction situeacutee endehors de la fonction main()

Cependant le programmeur deacutebutant qui souhaite modifier agrave tout prix la variable valeurva chercher agrave corriger dans un premier temps lrsquoerreur de compilation eacutenonceacutee ci-dessusPour cela il deacuteclare une variable valeur agrave lrsquointeacuterieur de la fonction modifier() et uneautre agrave lrsquointeacuterieur de la fonction main() De cette faccedilon la variable valeur est deacutefiniedans chacune des fonctions et aucune erreur de compilation nrsquoest deacutetecteacutee Examinonsplus preacuteciseacutement ce que reacutealise un tel programme

Exemple code source complet

public class VariableLocale public static void main(String [] paramegravetre) deacuteclaration de variables locales int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableLocale

Pour bien comprendre ce qursquoeffectue ce programme construisons le tableau drsquoeacutevolution(voir au chapitre 1 laquo Stocker une information raquo la section laquo Lrsquoinstruction drsquoaffectation raquo)de chaque variable deacuteclareacutee dans le programme Cerclejava

Puisque les fonctions main() et modifier() sont des blocs drsquoinstructions seacutepareacuteslrsquointerpreacuteteur Java creacutee un emplacement meacutemoire pour chaque deacuteclaration de la variablevaleur Il existe deux cases meacutemoire valeur distinctes portant le mecircme nom Elles sont

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

133

distinctes parce qursquoelles nrsquoappartiennent pas agrave la mecircme fonction Le tableau des varia-bles deacuteclareacutees pour chaque fonction est le suivant

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()Valeur = 3 dans modifier()Valeur = 2 apres modifier()

Agrave lrsquoexeacutecution du programme le premier appel agrave la fonction Systemoutprintln() affi-che le contenu de la variable valeur deacutefinie dans la fonction main() soit 2

Le programme reacutealise ensuite les actions suivantes

bull Appeler la fonction modifier() qui affiche le contenu de la variable valeur deacutefinie agravelrsquointeacuterieur de cette fonction soit 3

bull Sortir de la fonction modifier() et deacutetruire la variable valeur locale agrave cette fonction

bull Retourner agrave la fonction main() et afficher de nouveau le contenu de la variable valeurdeacutefinie dans la fonction main() soit 2

La variable valeur est deacuteclareacutee deux fois dans chacune des deux fonctions et nous cons-tatons que la fonction modifier() ne change pas le contenu de la variable valeurdeacuteclareacutee dans la fonction main() En reacutealiteacute mecircme si ces deux variables portent le mecircmenom elles sont totalement diffeacuterentes et leur valeur est stockeacutee dans deux casesmeacutemoire distinctes

En cherchant agrave reacutesoudre une erreur de compilation nous nrsquoavons pas eacutecrit la fonction quimodifie la valeur drsquoune variable deacutefinie en dehors drsquoelle-mecircme Cette modification est

Variable locale agrave main() valeur Variable locale agrave modifier() valeur

valeur = 2 2 valeur = 3 3

Figure 6ndash3

Toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est une variable locale propre agrave cette fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

134

impossible dans la mesure ougrave la variable valeur nrsquoest connue que de la fonction etdrsquoaucune autre

Variable de classeEn examinant plus attentivement la premiegravere proprieacuteteacute deacutefinie au deacutebut de ce chapitre(voir section laquo La structure drsquoun programme raquo) nous remarquons que les classescontiennent eacutegalement des instructions de deacuteclaration en dehors de toute fonction Lesvariables ainsi deacuteclareacutees sont appeleacutee variables de classe Elles sont deacutefinies pourlrsquoensemble du programme et sont visibles depuis toutes les fonctions

La deacuteclaration des variables de classe se reacutealise comme deacutecrit ci-dessous

Exemple code source complet

public class VariableDeClasse deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableDeClasse

Figure 6-4

Une variable deacuteclareacutee en dehors de toute fonction est appeleacutee variable de classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

135

Gracircce agrave lrsquoinstruction static int valeur la variable valeur est deacutefinie pour tout leprogramme VariableDeClasse Le mot-cleacute static est important car lorsque lrsquointerpreacute-teur Java le rencontre il creacuteeacute une case meacutemoire en un seul exemplaire accessible depuisnrsquoimporte quelle meacutethode (voir au chapitre 8 laquo Les principes du concept Objet raquo lasection laquo La communication objet raquo)

La repreacutesentation par blocs du programme (voir Figure 6-4) montre que la variablevaleur est visible tout au long du programme

Puisque la variable valeur est deacuteclareacutee agrave lrsquoexteacuterieur des fonctions main() et modifier()elle est deacutefinie comme eacutetant une variable de la classe VariableDeClasse La variablevaleur existe tout le temps de lrsquoexeacutecution du programme et les fonctions deacutefinies agravelrsquointeacuterieur de la classe peuvent lrsquoutiliser et modifier son contenu

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()

Valeur = 3 dans modifier()

Valeur = 3 apres modifier()

La variable valeur eacutetant une variable de classe lrsquoordinateur ne creacutee qursquoun seul emplace-ment meacutemoire Le tableau drsquoeacutevolution de la variable est le suivant

Puisqursquoil nrsquoexiste qursquoune seule case meacutemoire nommeacutee valeur celle-ci est commune agravetoutes les fonctions du programme qui peuvent y deacuteposer une valeur Lorsque la fonc-tion modifier() place 3 dans la case meacutemoire valeur elle eacutecrase la valeur 2 que lafonction main() avait preacuteceacutedemment placeacutee

En utilisant le concept de variable de classe nous pouvons eacutecrire une fonction quimodifie le contenu drsquoune variable deacutefinie en dehors de la fonction

Quelques preacutecisions sur les variables de classe

Puisque les variables locales ne sont pas modifiables depuis drsquoautres fonctions et que agravelrsquoinverse les variables de classe sont vues depuis toutes les fonctions du programme leprogrammeur deacutebutant aura tendance pour se simplifier la vie agrave nrsquoutiliser que des varia-bles de classe

Or lrsquoutilisation abusive de ce type de variables comporte plusieurs inconveacutenients quenous deacutetaillons ci-dessous

Variable de classe valeur

valeur = 2 dans la fonction main() 2

valeur = 3 dans la fonction modifier() 3

valeur = 3 dans la fonction main() 3

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

136

Deacuteclarer plusieurs variables portant le mecircme nom

Lrsquoemploi systeacutematique des variables de classe peut ecirctre source drsquoerreurs surtoutlorsqursquoon prend lrsquohabitude de deacuteclarer des variables portant le mecircme nom Observons leprogramme suivant

public class MemeNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(valeur + dans modifier() avant la deacuteclaration) Deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(valeur + dans modifier() apres la declaration) fin de modifier fin de class MemeNom

Dans ce programme la variable valeur est deacuteclareacutee deux fois une fois comme varia-ble de classe et une autre fois comme variable locale agrave la fonction modifier() Riennrsquointerdit de deacuteclarer plusieurs fois une variable portant le mecircme nom dans des blocsdrsquoinstructions diffeacuterents

Le fait de deacuteclarer deux fois la mecircme variable nrsquoest cependant pas sans conseacutequencesur le reacutesultat du programme

Dans la fonction modifier() les deux variables valeur coexistent et repreacutesententdeux cases meacutemoire distinctes Lorsque lrsquoinstruction valeur = 3 est exeacutecuteacuteelrsquointerpreacuteteur Java ne peut placer la valeur numeacuterique 3 dans les deux cases meacutemoireagrave la fois Il est obligeacute de choisir Dans un tel cas la regravegle veut que ce soit la variablelocale qui soit prise en compte et non la variable de classe

Le reacutesultat final du programme est le suivant

Valeur = 2 avant modifier()2 dans modifier() avant la declaration3 dans modifier() apregraves la dclarationValeur = 2 apregraves modifier()

La modification nrsquoest valable que localement Lorsque le programme retourne agrave la fonc-tion main() la variable locale nrsquoexiste plus Le programme affiche le contenu de lavariable de classe soit 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

137

Le veacuteritable nom drsquoune variable de classe

Une variable de classe se diffeacuterencie des variables locales par son nom Lorsqursquounevariable de classe est deacuteclareacutee lrsquoordinateur lui donne un nom qui lui permet de la distin-guer des autres variables

Ce nom est constitueacute du nom de la classe suivi drsquoun point puis du nom de la variabledeacuteclareacutee Pour lrsquoexemple suivant la variable de classe valeur srsquoappelle en fait Verita-bleNomvaleur Le programme peut srsquoeacutecrire de la faccedilon suivante

public class VeritableNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) VeritableNomvaleur = 2 Systemoutprintln(VeritableNomvaleur + avant modifier() ) modifier() Systemoutprintln(VeritableNomvaleur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(Variable de classe + VeritableNomvaleur ) Deacuteclaration de variables locales int valeur = 3 Systemoutprintln(Variable locale + valeur ) VeritableNomvaleur = 3 Systemoutprintln(Variable de classe + VeritableNomvaleur ) fin de modifier fin de class VeritableNom

En eacutecrivant la variable de classe par son nom veacuteritable lrsquoambiguiumlteacute sur lrsquoemploi de lavariable de classe ou de la variable locale est leveacutee et lrsquoexeacutecution du programme a lereacutesultat suivant

2 avant modifier()Variable de classe 2Variable locale 3Variable de classe 33 apregraves modifier()

Pour eacuteviter toute meacuteprise il est recommandeacute drsquoutiliser les variables de classe avec parci-monie et chaque fois avec leur nom complet En pratique seules les variables qui preacutesen-tent un inteacuterecirct geacuteneacuteral pour le programme sont agrave deacuteclarer comme variables de classe

De lrsquoindeacutependance des fonctions

Comme nous lrsquoavons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Algorithmeparameacutetreacute raquo) une fonction est avant tout un sous-programme indeacutependant capabledrsquoecirctre exeacutecuteacute autant de fois que neacutecessaire et traitant des donneacutees diffeacuterentes

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

138

En construisant des fonctions qui utilisent des variables de classe nous creacuteons des fonc-tions qui ne sont plus des modules de programmes indeacutependants mais des extraits deprogrammes travaillant tous sur le mecircme jeu de variables

Cette deacutependance aux variables de classe nuit au programme car il est neacutecessaire pourreacuteutiliser de telles fonctions de modifier tous les noms des variables de classe de faccedilonagrave les rendre compatibles avec les nouveaux programmes

En cas de deacuteveloppement de logiciels importants comportant des centaines de milliersdrsquoinstructions la transformation et lrsquoameacutelioration des fonctionnaliteacutes du programme setrouvent fortement compromises Lrsquoensemble du code doit ecirctre examineacute preacuteciseacutement afinde deacuteterminer ougrave se trouve la variable de classe concerneacutee par la transformation envi-sageacutee

Dans ce cadre il convient de prendre les regravegles suivantes

bull Utiliser les variables de classe en nombre limiteacute le choix de ce type de variablesrsquoeffectuant en fonction de lrsquoimportance de la variable dans le programme Unevariable est consideacutereacutee comme une variable de classe lorsqursquoelle est commune agrave ungrand nombre de fonctions

bull Eacutecrire un programme de faccedilon modulaire chaque fonction travaillant de faccedilon indeacute-pendante agrave partir de valeurs transmises agrave lrsquoaide des techniques eacutetudieacutees agrave la sectionsuivante

Les fonctions communiquentLrsquoemploi systeacutematique des variables de classe peut ecirctre comme nous venons de le voirsource drsquoerreurs Pour limiter leur utilisation il existe des techniques simples qui fontque deux fonctions communiquent le contenu drsquoune case meacutemoire locale de lrsquoune desfonctions agrave une case meacutemoire locale de lrsquoautre

Ces techniques sont baseacutees sur le parameacutetrage des fonctions et sur le retour de reacutesultat

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Pour mieux cerner le fonctionnement de chacune de ces techniques nous allons leseacutetudier agrave lrsquoaide drsquoun programme composeacute de deux fonctions main() et tripler() etdrsquoune variable valeur locale agrave la fonction main() La fonction tripler() a pourobjectif de multiplier par trois le contenu de la variable valeur

Le passage de paramegravetres par valeurNotre contrainte est cette fois de nrsquoutiliser que des variables locales Nous supposonsdonc que la variable valeur soit locale agrave la fonction main() Pour multiplier par troiscette valeur la fonction tripler() doit connaicirctre effectivement le contenu de la variablevaleur

La fonction main() doit communiquer pour cela le contenu de la variable valeur agrave lafonction modifier() Cette communication est reacutealiseacutee en passant le contenu de lavariable au paramegravetre de la fonction tripler() Examinons le programme ci-dessous

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

139

Exemple code source complet

public class ParValeur public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static void tripler (int valeur) Systemoutprintln(Valeur = + valeur + dans tripler() ) valeur = 3 valeur Systemoutprintln(Valeur = + valeur + dans tripler() ) fin de tripler fin de class ParValeur

Dans ce programme deux variables valeurs sont deacuteclareacutees La premiegravere est locale agrave lafonction main() tandis que la seconde est locale agrave la fonction tripler() Cependantcomme la seconde est deacuteclareacutee dans lrsquoen-tecircte de la fonction elle est consideacutereacutee commevariable locale agrave la fonction et surtout comme paramegravetre formel de la fonctiontripler()

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Deacutefinir unefonction raquo

De cette faccedilon lorsque la fonction tripler() est appeleacutee depuis la fonction main()avec comme valeur de paramegravetre le contenu de valeur soit 2 la variable valeur localede tripler() prend la valeur 2 (voir Figure 6-5)

Figure 6-5

Gracircce au paramegravetre le contenu drsquoune variable locale agrave la fonction appelante main() est transmis agrave la fonction appeleacutee tripler()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

140

Ensuite la variable valeur locale agrave la fonction tripler() est multiplieacutee par trois gracircceagrave lrsquoinstruction valeur = 3 valeur La variable valeur vaut donc 6 dans la fonctiontripler() Lorsque le programme sort de la fonction tripler() et retourne agrave la fonctionmain() il deacutetruit la variable locale de la fonction tripler() et affiche le contenu de lavariable valeur locale agrave la fonction main() soit encore 2

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()Valeur = 2 dans tripler()Valeur = 6 dans tripler() Valeur = 2 apres tripler()

Gracircce au paramegravetre de la fonction tripler() le contenu de la variable valeur locale agravela fonction main() est transmis agrave la fonction tripler() Une fois la fonction exeacutecuteacuteenous constatons que la variable valeur de la fonction main() nrsquoest pas modifieacutee pourautant

En effet la valeur passeacutee en paramegravetre est copieacutee dans la case meacutemoire associeacutee au para-megravetre Mecircme si le paramegravetre porte le mecircme nom que la variable il srsquoagit de deux casesmeacutemoire distinctes La modification reste donc locale agrave la fonction

Lorsqursquoune fonction communique le contenu drsquoune variable agrave une autre fonction parlrsquointermeacutediaire drsquoun paramegravetre on dit que le paramegravetre est passeacute par valeur Ce typede transmission de donneacutees ne permet pas de modifier dans la fonction appelante lecontenu de la variable passeacutee en paramegravetre

Le reacutesultat drsquoune fonction Pour garder le reacutesultat de la modification du contenu drsquoune variable en sortie de fonctionune technique consiste agrave retourner la valeur calculeacutee par lrsquointermeacutediaire de lrsquoinstructionreturn

Examinons le programme ci-dessous qui utilise cette technique

Exemple code source complet

public class Resultat public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) valeur = tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static int tripler (int v) Systemoutprintln(v = + v + dans tripler() )

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

141

int reacutesultat = 3v Systemoutprintln(Resultat = + reacutesultat + dans tripler() ) return reacutesultat fin de tripler

fin de class Resultat

Ici le contenu de la variable valeur est passeacute au paramegravetre v de la fonction tripler()Puisque le paramegravetre formel (v) correspond agrave une case meacutemoire distincte de la variableeffectivement passeacutee (valeur) il est plus judicieux de le deacuteclarer sous un autre nomdrsquoappel que celui de la variable de faccedilon agrave ne pas les confondre En geacuteneacuteral et tant quecela reste possible nous avons pour convention de donner comme nom drsquoappel du para-megravetre formel la premiegravere lettre du paramegravetre reacuteel Pour notre exemple valeur est leparamegravetre reacuteel Le paramegravetre formel srsquoappelle donc v

Une fois le calcul reacutealiseacute agrave lrsquointeacuterieur de la fonction tripler() la valeur reacutesultanteplaceacutee dans la variable reacutesultat est transmise agrave la fonction main() qui a appeleacute la fonc-tion tripler() Cette transmission est reacutealiseacutee gracircce agrave lrsquoinstruction return reacutesultatLe contenu du reacutesultat est alors placeacute dans la variable valeur gracircce au signe drsquoaffectation= comme lrsquoillustre la Figure 6-6

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()v = 2 dans tripler() Resultat = 6 dans tripler()Valeur = 6 apregraves tripler()

Gracircce agrave la technique du retour de reacutesultat et du passage de paramegravetre par valeur les fonc-tions peuvent eacutechanger les contenus de variables Les variables locales sont donc exploi-

Figure 6-6

Gracircce au retour de reacutesultat le contenu drsquoune variable locale agrave la fonction appeleacutee tripler() est transmis agrave la fonction appelante main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

142

tables aussi facilement que les variables de classe tout en eacutevitant les inconveacutenients lieacutesagrave ces derniegraveres

Lorsqursquoil y a plusieurs reacutesultats agrave retournerUne difficulteacute subsiste le retour de reacutesultat ne peut se reacutealiser que sur une seule valeurIl nrsquoest pas possible de retourner plusieurs valeurs agrave la fois Si lrsquoon souhaite eacutecrire lrsquoalgo-rithme qui eacutechange le contenu de deux variables (voir au chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) sous forme de fonc-tion nous nous trouvons confronteacute au problegraveme deacutecrit dans lrsquoexemple ci-dessous

Exemple code source complet

public class PlusieursResultats public static void main (String [] arg) int a b Systemoutprint(Entrer une valeur pour a ) a = Lirei() Systemoutprint(Entrer une valeur pour b ) b = Lirei() Systemoutprintln( a = +a+ b = +b) eacutechange (ab) Systemoutprintln(Apres echange) Systemoutprintln( a = +a+ b = +b) public static void eacutechange(int x int y) int tmp = x x = y y = tmp

La fonction eacutechange()reacutealise theacuteoriquement lrsquoeacutechange du contenu des deux variablespasseacutees en paramegravetres Si a prend la valeur 1 et que b vaille 2 apregraves exeacutecution de la fonc-tion eacutechange() a doit prendre la valeur de b soit 1 et b la valeur de a soit 2

Reacutesultat de lrsquoexeacutecution

Examinons le reacutesultat de lrsquoexeacutecution de ce programme en supposant que les caractegraveresgriseacutes soient les valeurs choisies par lrsquoutilisateur

Entrer une valeur pour a 11Entrer une valeur pour b 22a = 1 b = 2Apres echangea = 1 b = 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

143

Nous le constatons agrave lrsquoexeacutecution aucun eacutechange nrsquoa eacuteteacute reacutealiseacute Il nrsquoy a rien drsquoeacutetonnantagrave cela puisque le passage des paramegravetres est un passage par valeur et qursquoil ne modifiepas le contenu des paramegravetres reacuteels a et b passeacutes agrave la fonction eacutechange()

La solution qui consiste agrave retourner le reacutesultat est impossible En effet il serait neacutecessairede retourner les deux variables eacutechangeacutees et il nrsquoest pas possible drsquoeacutecrire return x y la syntaxe de cette instruction nrsquoeacutetant pas valide

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Dans lrsquoeacutetat actuel de nos connaissances nous ne sommes pas agrave mecircme de reacutecupeacuterer diffeacute-rentes valeurs modifieacutees au sein drsquoune fonction En reacutealiteacute seul le concept drsquoobjet permetde reacutealiser un tel exploit Nous lrsquoeacutetudions au chapitre suivant

ReacutesumeacuteUn programme Java est structureacute selon les trois principes fondamentaux suivants

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visi-ble en dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions suivantes

bull Visibiliteacute toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction nrsquoest visible quedans cette fonction et ne peut ecirctre utiliseacutee dans une autre fonction

bull Variable locale toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est unevariable locale agrave cette fonction Ces variables nrsquoexistent que le temps de lrsquoexeacutecu-tion de la fonction et elles ne sont pas modifiables depuis une autre fonction

bull Variable de classe les variables deacuteclareacutees en dehors de toute fonction sont appe-leacutees des variables de classe Ces variables sont deacutefinies pour lrsquoensemble duprogramme et elles sont visibles et modifiables par toutes les fonctions de laclasse

Lorsqursquoune variable de classe et une variable locale portant le mecircme nom coexistentagrave lrsquointeacuterieur drsquoune fonction la regravegle veut que ce soit la variable locale qui soit priseen compte et non la variable de classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

144

ExercicesRepeacuterer les variables locales et les variables de classe

En observant le programme suivant

public class Calculette public static double reacutesultat

public static void main( String [] argument) int a b menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calculer() afficher() public static void calculer() char opeacuteration switch (opeacuteration) case rsquo+rsquo reacutesultat = a + b break case rsquo-rsquo reacutesultat = a ndash b break case rsquorsquo reacutesultat = a b

Les fonctions sont des blocs drsquoinstructions distinctes Pour communiquer le contenudrsquoune case meacutemoire (variable) locale de lrsquoune agrave une case meacutemoire locale de lrsquoautrefonction il est neacutecessaire drsquoutiliser les techniques suivantes

bull Les paramegravetres des fonctions lorsqursquoune fonction communique le contenudrsquoune variable agrave une autre fonction par lrsquointermeacutediaire drsquoun paramegravetre on dit quele paramegravetre est passeacute par valeur Ce type de transmission de donneacutees ne permetpas de modifier dans la fonction appelante le contenu de la variable passeacutee enparamegravetre

bull Le retour de reacutesultat pour garder en reacutesultat la modification du contenu drsquounevariable en sortie de fonction une technique consiste agrave retourner la valeurcalculeacutee par lrsquointermeacutediaire de lrsquoinstruction return

Ces deux modes de communication ne permettent pas de reacutecupeacuterer plusieursdonneacutees modifieacutees agrave lrsquointeacuterieur drsquoune fonction Seul le concept drsquoobjet eacutetudieacute auchapitre suivant permet de reacutealiser cette opeacuteration

61

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

145

break case rsquorsquo reacutesultat = a b break

public static void afficher() char opeacuteration Systemoutprint(a + +opeacuteration + + b + = + reacutesultat) public static void menu() char opeacuteration Systemoutprintln(Je sais compter entrez lrsquooperation choisie) Systemoutprintln( + pour additionner ) Systemoutprintln( - pour soustraire ) Systemoutprintln( pour pultiplier ) Systemoutprintln( pour diviser ) Systemoutprintln( (+ - ) ) opeacuteration = Lirec()

a Recherchez les diffeacuterentes fonctions deacutefinies dans la classe Calculette

b Dessinez le programme sous forme de scheacutema en repreacutesentant les fonctions agravelrsquoaide de blocs Placez les variables dans les blocs ougrave elles sont deacuteclareacutees

c Agrave lrsquoaide du scheacutema deacuteterminez les variables locales agrave chacune des fonctionsainsi que les variables de classe

d Apregraves exeacutecution de la fonction menu() et lecture des deux valeurs numeacuteriques a etb la fonction calculer() peut-elle reacutealiser lrsquoopeacuteration demandeacutee Pourquoi

e Mecircme question pour la fonction afficher()

Communiquer des valeurs agrave lrsquoappel drsquoune fonctionPour corriger le programme Calculette nous supposons que les variables reacutesul-tat et opeacuteration soient deacuteclareacutees en tant que variables de classe et non plus loca-lement aux fonctions afficher() et menu()

a Modifiez le scheacutema reacutealiseacute en 61b en tenant compte de ces nouvelles deacuteclara-tions

b Quelle technique doit-on utiliser pour que les fonctions calculer() et affi-cher() connaissent le contenu des variables a et b afin drsquoeffectuer ensuite lesinstructions qui les composent

c Eacutecrivez les fonctions en utilisant cette technique

62

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

146

Transmettre un reacutesultat agrave la fonction appelanteNous supposons que le programme Calculette ne contienne plus de variables declasse Les variables reacutesultat et opeacuteration sont maintenant deacuteclareacutees localementaux fonctions qui les utilisent

a Quelles sont les conseacutequences de cette nouvelle hypothegravese sur le reacutesultat duprogramme

b Comment la fonction calculer() peut-elle connaicirctre lrsquoopeacuterateur choisi parlrsquoutilisateur dans la fonction menu()

c Transformez la fonction menu() de sorte que lrsquoopeacuterateur soit transmis agrave la fonc-tion main()

d Modifiez la fonction calculer() de faccedilon agrave lui transmettre lrsquoopeacuterateur fournipar la fonction menu()

e Comment la fonction afficher() peut-elle connaicirctre le reacutesultat de la fonctioncalculer()

f Transformez la fonction calculer() de sorte que le reacutesultat soit transmis agrave lafonction main()

g Modifiez la fonction afficher() de faccedilon agrave lui transmettre le reacutesultat fourni parla fonction calculer()

Le projet laquo Gestion drsquoun compte bancaire raquoAu chapitre preacuteceacutedent nous avons construit trois fonctions alAide() sortir() etmenuPrincipal() qui ameacuteliorent la lisibiliteacute du programme Ces fonctions concernentsurtout lrsquoaffichage de messages de dialogue de lrsquoapplication vers lrsquoutilisateur (menuaide etc) Elles reacutealisent lrsquointerface entre lrsquoutilisateur et lrsquoapplication sans transformerles donneacutees propres agrave chaque compte bancaire

Pour reacutealiser les opeacuterations de creacuteation et drsquoaffichage drsquoun compte (options 1 et 2 dumenu) nous allons ici construire des fonctions qui modifient transforment les donneacuteesdrsquoun compte

Comprendre la visibiliteacute des variablesLa fonction afficherCpte() reacutealise lrsquooption 2 du menu principal de notre applicationCette fonction affiche lrsquoensemble des caracteacuteristiques drsquoun compte soit son numeacutero sontype son taux srsquoil srsquoagit drsquoun compte drsquoeacutepargne et sa valeur courante Nous supposonsque lrsquoensemble de ces valeurs aient eacuteteacute preacutealablement saisies en option 1

Les variables locales

Une premiegravere solution pourrait srsquoeacutecrire

public static void afficherCpte() long num char type

63

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

147

double taux double val Systemoutprint(Le compte ndeg + num + est un compte ) if (type == rsquoCrsquo) Systemoutprintln( courant ) else if (type == rsquoJrsquo) Systemoutprintln( joint ) else if (type == rsquoErsquo) affiche son taux dans le cas drsquoun compte drsquoeacutepargne Systemoutprintln( epargne dont le taux est + taux) Systemoutprintln( Valeur initiale + val)

bull Quelles valeurs sont afficheacutees par cette fonction Pourquoi

Les variables de classe

Pour corriger la fonction preacuteceacutedente il est neacutecessaire que la fonction ait accegraves auxvaleurs stockeacutees lors de lrsquooption 1

Une premiegravere solution consiste agrave deacutefinir les variables agrave afficher comme variables de classe

a Transformez votre programme et deacuteclarez les variables num type taux et valcomme variables de classe

b Retirez les deacuteclarations des variables num type taux et val dans la fonction affi-cherCpte() de faccedilon agrave eacuteviter qursquoelles soient encore utiliseacutees par lrsquointerpreacuteteurcomme variables locales

c Exeacutecutez votre programme et veacuterifiez que la fonction affiche correctement les valeurs

Le passage de paramegravetres par valeur

Une seconde solution revient agrave deacuteclarer les variables num type taux et val en paramegrave-tres de la fonction drsquoaffichage de faccedilon agrave transmettre les valeurs saisies depuis la fonc-tion main() (option 1) agrave la fonction afficherCpte()

a Deacutecrivez lrsquoen-tecircte de la fonction afficherCpte() en prenant soin de deacuteclarer enparamegravetre une variable pour chaque caracteacuteristique du compte agrave transmettre agrave lafonction

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Les limites du retour de reacutesultatLa fonction creacuteerCpte() rassemble les instructions de lrsquooption 1 soit lrsquoaffichage demessages et la saisie au clavier des valeurs caracteacuteristiques drsquoun compte

a Recherchez quel doit ecirctre le reacutesultat de la fonction agrave transmettre agrave la fonction main()

b Pour deacutecrire lrsquoen-tecircte de la fonction creacuteerCpte() est-il possible de deacuteterminer letype agrave placer dans lrsquoen-tecircte de la fonction Pourquoi

copy copyright Eacuteditions Eyrolles

7Les classeset les objets

Lrsquoeacutetude du chapitre 6 laquo Fonctions notions avanceacutees raquo montre que si une fonctionfournit plusieurs reacutesultats ceux-ci ne peuvent pas ecirctre transmis au programme appelantPour contourner cette difficulteacute il est neacutecessaire drsquoutiliser des objets au sens de laprogrammation objet

Pour faire comprendre les principes fondamentaux de la notion drsquoobjet nous eacutetudions(section laquo La classe String une approche vers la notion drsquoobjet raquo) comment deacutefinir etgeacuterer des objets de type String Ce type permet la repreacutesentation des mots en tant quesuites de caractegraveres Agrave partir de cette eacutetude nous analysons les instructions qui font appelaux objets String afin drsquoen comprendre les principes de notation et drsquoutilisation

Nous examinons ensuite (section laquo Construire et utiliser ses propres classes raquo) commentdeacutefinir de nouveaux types de donneacutees Pour cela nous deacuteterminons les caracteacuteristiquessyntaxiques drsquoune classe et observons comment manipuler des objets agrave lrsquointeacuterieur drsquouneapplication et comment utiliser les meacutethodes qui leurs sont associeacutees

La classe String une approche vers la notion drsquoobjetLa classe String est une classe preacutedeacutefinie du langage Java Elle permet de deacutefinir deslaquo variables raquo contenant des suites de caractegraveres autrement dit des mots ou dans lejargon informatique des chaicircnes de caractegraveres Nous eacutetudions comment deacutefinir ceslaquo variables raquo agrave la section ci-dessous

La classe String est un type de donneacutees composeacute drsquoun grand nombre drsquooutils oumeacutethodes qui facilitent lrsquoutilisation des chaicircnes de caractegraveres (voir la section laquo Les diffeacute-rentes meacutethodes de la classe String raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

150

Manipuler des mots en programmationLrsquoutilisation des chaicircnes de caractegraveres apporte beaucoup agrave la convivialiteacute desprogrammes informatiques Il serait impensable aujourdrsquohui de creacuteer un logiciel degestion du personnel sans pouvoir deacutefinir le nom et le preacutenom de chaque employeacute Dansle mecircme ordre drsquoideacutee que serait la recherche drsquoinformations sur Internet sans cesfameuses chaicircnes de caractegraveres

Gracircce aux chaicircnes de caractegraveres nous oublions le langage binaire et il devient aiseacute decommuniquer avec lrsquoordinateur dans notre propre langue Pourtant lrsquoutilisation de cesfameuses chaicircnes a longtemps eacuteteacute source de difficulteacutes

Les mots neacutecessitent un type de donneacutees particulier du fait qursquoun mot possegravede par natureun nombre quelconque de caractegraveres Agrave la diffeacuterence des formats int double ou char leschaicircnes de caractegraveres ne peuvent a priori ecirctre repreacutesenteacutees par un nombre fixe de casesmeacutemoire

Deacuteclaration drsquoune chaicircne de caractegraveres

Tout comme nous deacuteclarons des variables pour stocker des valeurs entiegraveres ou reacuteellesnous devons deacuteclarer une variable pour meacutemoriser la suite des caractegraveres drsquoun mot oudrsquoune phrase Le type de cette variable est le type String

Le type String nrsquoest pas un type simple puisqursquoil permet de regrouper sous un seul nomde variable plusieurs donneacutees crsquoest-agrave-dire lrsquoensemble des caractegraveres drsquoun mot

Pour eacuteviter les difficulteacutes lieacutees agrave la variation du nombre de caractegraveres dans un mot lelangage Java fixe la longueur du mot en fonction de sa deacuteclaration Cela fait le contenudu mot ne peut plus ecirctre modifieacute En deacuteclarant un objet de type String il est possible enmecircme temps de lrsquoinitialiser en lui affectant des caractegraveres placeacutes entre guillemets

La deacuteclaration suivante permet de creacuteer un objet appeleacute mot qui contient la chaicircne decaractegraveres exemple

String mot = exemple

Remarquons que la variable mot nrsquoest pas un ensemble de sept cases meacutemoire contenantles sept caractegraveres du mot exemple Lors de la deacuteclaration de la variable mot lrsquointerpreacute-teur Java creacutee une case qui contient lrsquoadresse de la case ougrave se trouve le premier caractegraveredu mot exemple (voir Figure 7-1)

Lorsque lrsquoordinateur souhaite afficher la variable mot il va rechercher lrsquoinformation sesituant agrave lrsquoadresse stockeacutee dans la case meacutemoire mot On dit alors que la variable motpointe sur la case qui contient la suite de caractegraveres

Figure 7ndash1

Seul un objet de type String contenant le mot exemple existe mot et second font tous deux reacutefeacuterence agrave cet objet unique

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

151

Les variables de type String ne contiennent pas directement lrsquoinformation qui les carac-teacuterise mais seulement lrsquoadresse ougrave trouver cette information Degraves lors ces variables nesrsquoappellent plus des variables mais des objets

Les objets au sens de la programmation objet ne sont pas des laquo variables raquo de typesimple (int long double char etc) Ils correspondent agrave un type qui permet deregrouper plusieurs donneacutees sous une mecircme adresse

Lorsqursquoun objet second est deacuteclareacute comme ci-dessous il contient la mecircme adresse (reacutefeacute-rence) que lrsquoobjet mot

String second = mot

Si le programme modifie le contenu de lrsquoobjet mot en lui affectant par exemple unenouvelle chaicircne lrsquointerpreacuteteur ne modifie pas la case pointeacutee par mot dans la mesure ougravepar deacutefinition le contenu drsquoun mot ne peut ecirctre modifieacute

mot = nouveau

Il creacutee en reacutealiteacute une nouvelle adresse et lui associe la nouvelle chaicircne de caractegraveresPour notre exemple lrsquoobjet mot est associeacute agrave la chaicircne de caractegraveres rsquonouveaursquo etsecond reste associeacute agrave rsquoexemplersquo

Les diffeacuterentes meacutethodes de la classe StringLrsquoutilisation des mots dans un programme est aujourdrsquohui incontournable Il ne srsquoagitcertes pas simplement drsquoafficher des mots mais de les traiter de la faccedilon la plus intelli-gente possible Ces traitements sont par exemple le tri alphabeacutetique ou encore larecherche de mots particuliers dans un texte

Pour reacutealiser ces opeacuterations la langage Java propose un ensemble de meacutethodes preacutedeacutefi-nies Les meacutethodes drsquoune classe sont comparables aux fonctions mais la terminologielaquo objet raquo les appelle meacutethodes

Ces meacutethodes offrent la possibiliteacute de traiter rapidement et simplement lrsquoinformationtextuelle Nous deacutecrivons ci-dessous regroupeacutees par thegraveme une grande partie desmeacutethodes deacutefinies dans la classe String Nous donnons en exemple pour chaque thegravemeun programme qui utilise ces meacutethodes

Figure 7ndash2

La modification de mot entraicircne la creacuteation drsquoune nouvelle chaicircne de caractegraveres et drsquoune nouvelle reacutefeacuterence automatiquement attribueacutees agrave mot Lrsquoobjet second conserve la preacuteceacutedente reacutefeacuterence

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

152

Recherche de mots et de caractegraveres

Exemple de recherche de mots et de caractegraveres

public class Rechercher public static void main(String [] argument) String phrase = Mieux vaut tard que jamais String soumo = int place Systemoutprintln(Vous avez dit + phrase) soumo = phrasesubstring(1115) Systemoutprintln(De 11 a 15 la sous chaine est + soumo) for ( int i = 0 i lt 5 i++) Systemoutprintln(en + i + il y a + phrasecharAt(i))

Systemoutprintln(Entrez un mot ) soumo = LireS()

if(phraseendsWith(soumo)) Systemoutprintln(La phrase se termine avec + soumo) else Systemoutprintln(La phrase ne finit pas avec + soumo)

place = phraseindexOf(soumo) if (place == -1) Systemoutprintln(Ce mot nrsquoexiste pas dans + phrase) else Systemoutprintln(soumo+ est a la position + place)

Opeacuteration Fonction Java

Recherche si le mot se termine par le ou les caractegraveres passeacutes en paramegravetres endsWith()

Recherche si le mot commence par le ou les caractegraveres passeacutes en paramegravetres startsWith()

Recherche le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Le premier carac-tegravere occupe la position 0 et le dernier la position length()-1 (voir ci-dessous la des-cription de length())

charAt()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir du deacutebut du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

indexOf()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir de la fin du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

lastIndexOf()

Extrait une sous-chaicircne drsquoun mot substring()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

153

Reacutesultat de lrsquoexeacutecution

Exeacutecution 1

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot tardLa phrase ne finit pas avec ttaarrdd

tard est a la position 11

Phrase et soumo sont deux objets de type String initialiseacutes respectivement agrave Mieuxvaut tard que jamais et (mot ne comportant pas de caractegravere)

Lrsquoinstruction soumo = phrasesubstring(1115) recherche la sous-chaicircne situeacutee entreles caractegraveres 11 et 15 de lrsquoobjet phrase Cela fait elle place lrsquoensemble de ces caractegraveresdans lrsquoobjet soumo

Gracircce agrave lrsquoinstruction phrasecharAt(i) placeacutee dans lrsquoinstruction drsquoaffichageSystemoutprint le programme affiche les cinq premiers caractegraveres de lrsquoobjet phrasei variant de 0 agrave 4

Ensuite phraseendsWith(soumo) permet de savoir si lrsquoobjet phrase se termine avec lasuite de caractegraveres saisie au clavier et stockeacutee dans lrsquoobjet soumo Le reacutesultat de lameacutethode endsWith() est true si la chaicircne se termine par lrsquoargument et false dans le cascontraire Pour notre exemple soumo vaut tard et la meacutethode retourne false Leprogramme exeacutecute donc lrsquoinstruction placeacutee dans le bloc else associeacute au testif(phrase endsWith(soumo))

Pour finir lrsquoinstruction phraseindexOf(soumo) recherche si lrsquoobjet soumo est contenudans lrsquoobjet phrase Si tel est le cas elle retourne la position du premier caractegravere trouveacutesinon elle retourne ndash1 Ici tard est deacutetecteacute dans mieux vaut tard que jamais enposition 11

Exeacutecution 2

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot maisLa phrase se termine avec mmaaiiss

mais est a la position 22copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

154

Si lrsquoutilisateur saisit mais au lieu de tard le test if (phraseendsWith(soumo)) estvrai la meacutethode endsWith()retournant true Le programme exeacutecute donc lrsquoinstructionplaceacutee dans le bloc if

Exeacutecution 3

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot OOKKLa phrase ne finit pas avec OKCe mot nrsquoexiste pas dans Mieux vaut tard que jamais

Si lrsquoutilisateur saisit OK au lieu de mais le test if (phraseendsWith(soumo)) estfaux et la meacutethode endsWith() retourne false Le programme exeacutecute lrsquoinstructionplaceacutee dans le bloc else De plus lrsquoinstruction phraseindexOf(soumo) retourne ndash1car OK nrsquoest pas deacutetecteacute dans mieux vaut tard que jamais Le programme exeacutecutealors le bloc else associeacute

Comparaison de mots

Exemple de comparaison de mots

public class Comparer public static void main(String [] argument) String prvb1 = Le mieux est lrsquoennemi du bien String prvb2 =Le Mieux Est lrsquoEnnemi du bien

Opeacuteration Fonction Java

Compare deux mots et retourne une valeur bull Nulle si les deux mots sont identiquesbull Positive si le premier mot est plus grand (placeacute apregraves) le deuxiegraveme mot (dans le dictionnaire)bull Neacutegative si le premier mot est plus petit (placeacute avant) le deuxiegraveme mot (dans le dictionnaire)

compareTo()

Compare la valeur de deux mots Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equals()

Compare la valeur de deux mots sans diffeacuterencier les majuscules des minus-cules Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equalsIgnoreCase()

Deacutetermine si deux portions de chaicircnes sont identiques Dans lrsquoaffirmative elle renvoie true

regionMatches()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

155

Systemoutprintln(1 + prvb1) Systemoutprintln(2 + prvb2) Systemoutprintln(Comparons les 10 premiers caracteres )

Systemoutprint(En tenant compte des majuscules ) if (prvb1regionMatches(false 0 prvb2 0 10)) Systemoutprintln(Les 10 premiers cars sont identiques) else Systemoutprintln(Il y a des differences sur les 10 premiers cars) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1regionMatches(18 prvb2 18 6)) Systemoutprintln(Les cars de 18 a 24 sont identiques) else Systemoutprintln(Il y a des differences)

if (prvb1compareTo(prvb2) == 0) Systemoutprintln(Les deux chaines sont identiques) else if (prvb1compareTo(prvb2) lt 0) Systemoutprint(prvb1 + est avant + prvb2) else Systemoutprint(prvb1 + est apres + prvb2) Systemoutprintln(dans le dictionnaire) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1equalsIgnoreCase(prvb2)) Systemoutprintln(Les deux chaines sont identiques) else Systemoutprintln(Les deux chaines sont differentes)

Reacutesultat de lrsquoexeacutecution

1 Le mieux est lrsquoennemi du bien 2 Le Mieux Est lrsquoEnnemi du bien Comparons les 10 premiers caracteres En tenant compte des majuscules Il y a des differences sur les 10 premierscarsSans tenir compte des majuscules Les cars de 18 a 24 sont identiquesLe mieux est lrsquoennemi du bien est apres Le Mieux Est lrsquoEnnemi du bien dansle dictionnaireSans tenir compte des majuscules Les deux chaines sont identiques

Les objets prvb1 et pvrb2 sont initialiseacutes respectivement agrave Le mieux est lrsquoennemi dubien et Le Mieux Est lrsquoEnnemi du bien

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

156

La meacutethode regionMatches() srsquoutilise soit avec quatre paramegravetres soit avec cinq para-megravetres Dans ce programme nous donnons en exemple les deux appels possibles

bull Le premier appel agrave la meacutethode utilise cinq paramegravetres (regionMatches(false 0prvb2 0 10)) Le premier paramegravetre est un booleacuteen qui srsquoil est eacutegal agrave falsepermet de reacutealiser la comparaison des deux mots en tenant compte de la preacutesence desmajuscules Pour notre cas la meacutethode deacutetermine si les deux portions de chaicircne prvb1et pvrb2 (correspondant au troisiegraveme paramegravetre de la meacutethode) sont identiques entenant compte des majuscules

Cette recherche est reacutealiseacutee agrave partir de la valeur speacutecifieacutee par le deuxiegraveme paramegravetre(soit 0 crsquoest-agrave-dire le premier caractegravere de prvb1) Le quatriegraveme paramegravetre repreacutesentela position du premier caractegravere agrave comparer dans lrsquoobjet prvb2 Le cinquiegraveme est lenombre de caractegraveres conseacutecutifs agrave comparer Pour notre exemple le programmerecherche srsquoil y a des similitudes entre prvb1 et prvb2 agrave partir du deacutebut des deuxmots et ce sur les dix caractegraveres suivants

bull Le deuxiegraveme appel agrave la meacutethode est composeacute de quatre paramegravetres (regionMat-ches(18 prvb2 18 6)) En fait ces quatre paramegravetres correspondent aux quatrederniers paramegravetres de lrsquoappel deacutecrit preacuteceacutedemment Le booleacuteen figurant dans lrsquoappelpreacuteceacutedant nrsquoexiste plus car par deacutefaut cette meacutethode travaille sans tenir compte desmajuscules Elle est donc eacutequivalente agrave lrsquoappel de la meacutethode suivante prvb1regionMatches(true 18 prvb2 18 6)

Ensuite lrsquoinstruction prvb1compareTo(prvb2) compare les objets prvb1 et prvb2 etdeacutetermine srsquoils sont identiques ou placeacutes avant ou apregraves dans lrsquoordre alphabeacutetique

Pour finir lrsquoinstruction prvb1equalsIgnoreCase(prvb2) veacuterifie si les deux objetsprvb1 et prvb2 sont identiques ou non sans tenir compte de la preacutesence des majuscules

Transformation de formats

Exemple de transformation de format

public class Transformer public static void main(String [] argument)

Opeacuteration Fonction Java

Transforme en minuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toLowerCase()

Transforme en majuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toUpperCase()

La meacutethode place (concategravene) la chaicircne speacutecifieacutee en paramegravetre agrave la suite de la chaicircne sur laquelle la meacutethode est appliqueacutee

concat()

Remplace systeacutematiquement dans la chaicircne sur laquelle la meacutethode est appliqueacutee tous les caractegraveres donneacutes en premier argument par le caractegravere donneacute en deuxiegraveme argument

replace()

Calcule le nombre de caractegraveres de la chaicircne sur laquelle la meacutethode est appliqueacutee length()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

157

String phrase = Qui dort String verbe = dine String p1 = p2 = p3 = p4 = int nbcar Systemoutprintln(1 + phrase) Systemoutprintln(2 + verbe) p1 = phrasetoUpperCase() Systemoutprintln(En majuscules + p1) p2 = phrasetoLowerCase() Systemoutprintln(En minuscules + p2) p3 = phraseconcat(verbe) nbcar = p3length() Systemoutprint(Apres concat() ) Systemoutprintln(p3 + possede + nbcar + caracteres) p4 = p3replace(rsquoirsquorsquoarsquo) Systemoutprintln(Apres replace() + p3 + devient + p4)

Reacutesultat de lrsquoexeacutecution

1 Qui dort2 dine En majuscules QUI DORT En minuscules qui dort Apres concat() Qui dort dine possede 13 caracteresApres replace() Qui dort dine devient Qua dort dane

Les objets phrase et verbe sont initialiseacutes respectivement agrave Qui dort et dineLrsquoinstruction p1 = phrasetoUpperCase() transforme en majuscules le contenu dephrase et place cette transformation dans lrsquoobjet p1

Lrsquoinstruction p2 = phrasetoLowerCase() place dans p2 le contenu de phrase trans-formeacute en minuscules Notons que pour chacune de ces instructions lrsquoobjet phrase nrsquoestjamais modifieacute

Lrsquoinstruction p3 = phraseconcat(verbe) place en bout de lrsquoobjet phrase le motcontenu dans verbe Cela fait le reacutesultat de cette opeacuteration est affecteacute agrave lrsquoobjet p3Lrsquoobjet phrase nrsquoest pas modifieacute

Ensuite lrsquoinstruction nbcar = p3length() calcule la longueur de lrsquoobjet p3 crsquoest-agrave-dire le nombre de caractegraveres constituant lrsquoobjet p3

Pour finir lrsquoinstruction p4 = p3replace(rsquoirsquo rsquoarsquo) remplace tous les caractegraveres rsquoirsquode p3 par des rsquoarsquo et place le reacutesultat de cette transformation dans lrsquoobjet p4 Lrsquoobjet p3nrsquoest pas modifieacute

Appliquer une meacutethode agrave un objet Lrsquoobservation des exemples preacuteceacutedents montre que lrsquoappel drsquoune meacutethode de la classeString ne srsquoeacutecrit pas comme une simple instruction drsquoappel agrave une meacutethode (fonction)telle que nous lrsquoavons eacutetudieacutee jusqursquoagrave preacutesent

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

158

Comparons lrsquoappel agrave une meacutethode de la classe Math agrave celui drsquoune meacutethode de la classeString

Par exemple pour calculer la valeur absolue drsquoune variable x les instructions sont lessuivantes

double x = 4 yy = Mathabs(x)

Pour transformer un mot en lettres majuscules les instructions sont

String mot = petit MOTMOT = mottoUpperCase()

Comme nous le constatons dans le premier cas la fonction Mathabs() srsquoapplique agrave lavariable x en passant la valeur de x en paramegravetre En effet les variables x et y ne sont pasdes objets au sens de la programmation objet Elles sont de type double et repreacutesententsimplement le nom drsquoune case meacutemoire dans laquelle lrsquoinformation est stockeacutee Aucunemeacutethode aucun traitement ne sont associeacutes agrave cette information

Dans la seconde eacutecriture la meacutethode toUpperCase() est appliqueacutee agrave lrsquoobjet mot parlrsquointermeacutediaire drsquoun point () placeacute entre le nom de lrsquoobjet et la meacutethode Les objets motet MOT ne peuvent ecirctre consideacutereacutes comme des variables Ils sont de type String Lrsquoinfor-mation repreacutesenteacutee par ce type nrsquoest pas simple Elle repreacutesente (voir Figure 7-3) leseacuteleacutements suivants

bull Drsquoune part une reacutefeacuterence (une adresse) vers un ensemble de caractegraveres stockeacutes dansplusieurs cases meacutemoire distinctes

bull Drsquoautre part un ensemble de meacutethodes propres qui lui sont applicables Ces meacutethodessont lrsquoeacutequivalent drsquoune boite agrave outils qui opegravere uniquement sur les objets de typeString

Quelle qursquoelle soit une classe correspond agrave un type qui speacutecifie une association dedonneacutees (informations ou valeurs de tout type) et de meacutethodes (outils drsquoaccegraves et de trans-formation des donneacutees) Ces meacutethodes deacutefinies agrave lrsquointeacuterieur drsquoune classe ne peuventsrsquoappliquer qursquoaux donneacutees de cette mecircme classe

Gracircce agrave cette association une classe permet la deacutefinition de nouveaux types de donneacuteesqui structurent lrsquoinformation agrave traiter (voir dans ce chapitre la section laquo Construire etutiliser ses propres classes raquo)

Figure 7ndash3

La classe String deacutefinit lrsquoassociation de donneacutees et de meacutethodes applicables agrave ces donneacutees

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

159

Principes de notation

Agrave cause de cette diffeacuterence fondamentale de repreacutesentation de lrsquoinformation lrsquoemploides meacutethodes agrave travers les objets utilise une syntaxe particuliegravere

Pour un objet de type String cette syntaxe est la suivante

Deacuteclaration et initialisationString objet = La meacutethode srsquoapplique agrave objetobjetnomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

Pour appliquer une meacutethode agrave un objet il suffit de placer derriegravere le nom de lrsquoobjet unpoint suivi du nom de la meacutethode et de ces paramegravetres Remarquons que par conven-tion

bull Tout nom de meacutethode commence par une minuscule

bull Si le nom de la meacutethode est composeacute de plusieurs mots ceux-ci voient leur premiercaractegravere passer en majuscule

bull Le nom drsquoune classe commence toujours par une majuscule

Gracircce agrave cette eacutecriture lrsquoobjet est associeacute agrave la meacutethode de faccedilon agrave pouvoir modifierlrsquoinformation (les donneacutees) contenue dans lrsquoobjet Cette technique permet de reacutecupeacutererles diffeacuterentes donneacutees modifieacutees localement par une meacutethode Elle est le principe debase du concept drsquoobjet deacutecrit et commenteacute au chapitre suivant

Construire et utiliser ses propres classes Lrsquoeacutetude de la classe String montre qursquoune classe correspond agrave un type de donneacutees Cetype est composeacute de donneacutees et de meacutethodes exploitant ces donneacutees La classe Stringest un type preacutedeacutefini du langage Java

Il existe drsquoautres types preacutedeacutefinis de classes dans le langage Java Ces classes sont desoutils preacutecieux et efficaces qui simplifient le deacuteveloppement des applications Diffeacute-rentes classes sont examineacutees dans la troisiegraveme partie de cet ouvrage

Lrsquointeacuterecirct des classes reacuteside aussi dans la possibiliteacute de deacutefinir des types structureacutespropres agrave un programme Gracircce agrave cette faculteacute le programme se deacuteveloppe de faccedilon plussucircre les objets qursquoil utilise eacutetant deacutefinis en fonction du problegraveme agrave reacutesoudre

Avant drsquoeacutetudier reacuteellement lrsquointeacuterecirct de la programmation objet et ses conseacutequences surles modes de programmation (voir le chapitre 8 laquo Les principes du concept drsquoobjet raquo)nous examinons dans les sections qui suivent comment creacuteer des types speacutecifiques etutiliser les objets associeacutes agrave ces nouveaux types

Deacutefinir une classe et un type

Deacutefinir une classe crsquoest construire un type structureacute de donneacutees Avant de comprendreles avantages drsquoune telle construction nous abordons ici la notion de type structureacute (etdonc de classe) drsquoun point de vue syntaxique

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

160

Pour deacutefinir un type il suffit drsquoeacutecrire une classe qui par deacutefinition est constitueacutee dedonneacutees et de meacutethodes (voir Figure 7-3) La construction drsquoune classe est reacutealiseacutee selonles deux principes suivants

1 Deacutefinition des donneacutees agrave lrsquoaide drsquoinstructions de deacuteclaration de variables etoudrsquoobjets Ces variables sont de type simple tel que nous lrsquoavons utiliseacute jusqursquoagravepreacutesent (int char etc) ou de type composeacute preacutedeacutefini ou non (String etc)

Ces donneacutees deacutecrivent les informations caracteacuteristiques de lrsquoobjet que lrsquoon souhaitedeacutefinir Elles sont aussi appeleacutees communeacutement champ attribut ou membre de laclasse

2 Construction des meacutethodes deacutefinies par le programmeur Ce sont les meacutethodesassocieacutees aux donneacutees Elles se construisent comme de simples fonctions compo-seacutees drsquoun en-tecircte et drsquoinstructions comme nous lrsquoavons vu aux chapitres preacuteceacutedents

Ces meacutethodes repreacutesentent tous les traitements et comportements de lrsquoobjet que lrsquooncherche agrave deacutecrire

En deacutefinissant de nouveaux types nous deacuteterminons les caracteacuteristiques propres auxobjets que lrsquoon souhaite programmer Un type drsquoobjet correspond agrave lrsquoensemble desdonneacutees traiteacutees par le programme regroupeacutees par thegraveme

Un objet peut ecirctre une personne si lrsquoapplication agrave deacutevelopper gegravere le personnel drsquounesocieacuteteacute ou un livre srsquoil srsquoagit drsquoune application destineacutee agrave la gestion drsquoune biblio-thegraveque Remarquons que lrsquoobjet personne peut aussi ecirctre utiliseacute dans le cadre drsquoun logi-ciel pour bibliothegraveque puisqursquoun lecteur empruntant un livre est aussi une personne

Construire un type Cercle

Examinons sur un exemple simple la deacutemarche de construction drsquoun type structureacuteObservons pour cela comment construire le type de donneacutees qui deacutecrive au mieux larepreacutesentation drsquoun cercle quelconque

Cette reacutealisation passe par deux eacutetapes laquo Rechercher les caracteacuteristiques propres agrave toutcercle raquo et laquo Deacutefinir le comportement de tout cercle raquo

Rechercher les caracteacuteristiques propres agrave tout cercle

Drsquoune maniegravere geacuteneacuterale tout cercle est deacutefini gracircce agrave son rayon Si lrsquoon souhaite afficherce cercle il est en outre neacutecessaire de connaicirctre sa position agrave lrsquoeacutecran Pour simplifiernous supposons que la position drsquoun cercle soit deacutetermineacutee gracircce aux coordonneacutees deson centre

Les caracteacuteristiques drsquoun cercle sont son rayon et sa position agrave lrsquoeacutecran crsquoest-agrave-dire lescoordonneacutees en x (abscisse) et en y (ordonneacutee) du centre du cercle Ces trois donneacuteessont repreacutesentables agrave lrsquoaide de valeurs numeacuteriques que nous choisissons pour simplifierde type int

Pour deacuteclarer les donneacutees drsquoun cercle nous eacutecrivons les deacuteclarations suivantes

public int x y position du centre du cerclepublic int r rayon

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

161

Deacutefinir le comportement de tout cercle

Drsquoun point de vue informatique plusieurs opeacuterations peuvent ecirctre appliqueacutees agrave uncercle Un cercle peut ecirctre deacuteplaceacute ou agrandi (voir les meacutethodes deacuteplacer() etagrandir() dans le code source ci-dessous) Ces opeacuterations modifient la valeur du rayonou des coordonneacutees du centre du cercle agrave lrsquoeacutecran

Crsquoest pourquoi il est neacutecessaire de deacutefinir une meacutethode qui affiche agrave lrsquoeacutecran les donneacutees(rayon position) drsquoun cercle avant ou apregraves transformation (voir la meacutethode affi-cher()dans le code source ci-dessous)

La meacutethode de calcul du peacuterimegravetre drsquoun cercle peut ecirctre utile (voir la meacutethode peacuteri-megravetre() dans le code source ci-dessous)

La classe descriptive du type Cercle

public class Cercle public int x y position du centre public int r rayon

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Cercle centre en + x + + y) Systemoutprintln( de rayon + r)

public double peacuterimegravetre() Calcul du peacuterimegravetre drsquoun cercle return 2MathPIr public void deacuteplacer(int nx int ny) Deacuteplace le centre du cercle en (nx ny) Ces coordonneacutees eacutetant x = nx passeacutees en paramegravetres de la fonction y = ny public void agrandir(int nr) Augmente la valeur courante du rayon avec la valeur passeacutee en paramegravetre r = r + nr Fin de la classe Cercle

La classe Cercle deacutecrite agrave lrsquointeacuterieur drsquoun fichier appeleacute Cerclejava deacutefinit un type dedonneacutees composeacute de trois attributs caracteacuteristiques des cercles agrave savoir la position ducentre en abscisse et ordonneacutee et le rayon ainsi que quatre comportements diffeacuterents Sadescription par bloc est repreacutesenteacutee agrave la Figure 7-4

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

162

Quelques observations

Suivant la description de la Figure 7-4 nous constatons que les donneacutees x y et r sontdeacuteclareacutees en dehors de toute fonction Par conseacutequent chaque meacutethode a accegraves agrave toutmoment aux valeurs qursquoelle contient soit pour les consulter soit pour les modifier

Les meacutethodes afficher() et peacuterimegravetre() ne font que consulter le contenu des donneacuteesx y et r pour les afficher ou les utiliser en vue drsquoobtenir un nouveau reacutesultat

Au contraire les meacutethodes deacuteplacer() et agrandir() modifient le contenu des donneacuteesx y et r Ces modifications reacutealiseacutees agrave lrsquointeacuterieur drsquoune meacutethode sont aussi visiblesdepuis les autres meacutethodes de la classe

Il existe donc deux types de meacutethodes les meacutethodes qui permettent drsquoacceacuteder auxdonneacutees de la classe et celles qui modifient ces donneacutees

Voir au chapitre 8 laquo Les principes du concept drsquoobjet raquo la section laquo Les meacutethodes drsquoaccegraves auxdonneacutees raquo

En comparant les programmes construits aux chapitres preacuteceacutedents agrave celui-ci nous cons-tatons les deux diffeacuterences fondamentales suivantes

bull Le mot-cleacute static a disparu de toutes les instructions de deacuteclaration Cette disparitionnrsquoest pas sans conseacutequence sur le deacuteroulement du programme Elle permet de creacuteernon plus de simples variables mais des objets (voir au chapitre 8 laquo Les principes duconcept drsquoobjet raquo la section laquo Les donneacutees static raquo)

bull Une classe deacutefinissant un type structureacute ne possegravede pas de fonction main() La deacutefini-tion drsquoune classe nrsquoest pas la mecircme chose que la reacutealisation drsquoune application Uneclasse est une entiteacute agrave part entiegravere qui deacutefinit globalement de quoi est constitueacute unobjet et preacutecise les opeacuterations qursquoil est possible de lui appliquer

Figure 7ndash4

Les donneacutees x y et r du type Cercle sont deacuteclareacutees en dehors de toute fonction Nrsquoimporte quelle modification de ces donneacutees est donc visible par lrsquoensemble des meacutethodes de la classe

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

163

Bien entendu une classe est deacutefinie pour ecirctre utiliseacutee dans un programme exeacutecutable(une application) qui contient une fonction main() Nous abordons plus en deacutetail cetteopeacuteration agrave la section suivante

Deacutefinir un objetApregraves avoir deacutefini un nouveau type structureacute lrsquoeacutetape suivante consiste agrave eacutecrire une applica-tion qui utilise effectivement un laquoobjetraquo de ce type Pour cela le programmeur doit deacuteclarerles objets utiles agrave lrsquoapplication et faire en sorte que lrsquoespace meacutemoire neacutecessaire soit reacuteserveacute

Deacuteclarer un objet

Cette opeacuteration simple srsquoeacutecrit comme une instruction de deacuteclaration avec cette diffeacute-rence que le type de la variable nrsquoest plus un type simple preacutedeacutefini mais un type structureacutetel que nous lrsquoavons construit preacuteceacutedemment Ainsi dans

Deacuteclaration drsquoun objet choseTypeDeLrsquoObjet chose

TypeDeLrsquoObjet correspond agrave une classe deacutefinie par le programmeur Pour notre exemplela deacuteclaration drsquoun cercle A est reacutealiseacutee par lrsquoinstruction

Cercle A

Cette deacuteclaration creacutee une case meacutemoire nommeacutee A destineacutee agrave contenir une reacutefeacuterencevers lrsquoadresse ougrave sont stockeacutees les informations concernant le cercle A Agrave ce stadeaucune adresse nrsquoest encore deacutetermineacutee

Reacuteserver lrsquoespace meacutemoire agrave lrsquoaide de lrsquoopeacuterateur new

Agrave cette eacutetape les informations caracteacuterisant lrsquoobjet A ne peuvent ecirctre stockeacutees carlrsquoespace meacutemoire servant agrave ce stockage nrsquoest pas encore reacuteserveacute Crsquoest lrsquoopeacuterateur newqui reacutealise cette reacuteservation

Lrsquoopeacuterateur new est un programme Java qui gegravere de lui-mecircme la reacuteservation de lrsquoespacemeacutemoire Lorsqursquoon applique cet opeacuterateur agrave un objet il deacutetermine combien drsquooctets luisont neacutecessaires pour stocker lrsquoinformation contenue dans la classe

Cet opeacuterateur srsquoapplique en eacutecrivant agrave la suite du terme new le nom du type de lrsquoobjetdeacuteclareacute suivi de deux parenthegraveses

Reacuteserver de lrsquoespace meacutemoire pour lrsquoobjet chosechose = new TypeDeLrsquoObjet()

Figure 7ndash5

La deacuteclaration drsquoun objet reacuteserve une case meacutemoire destineacutee agrave contenir lrsquoadresse meacutemoire ougrave seront stockeacutees les informations Lrsquoespace meacutemoire et lrsquoadresse ne sont pas encore reacuteserveacutes pour reacutealiser ce stockage

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

164

Pour notre exemple la reacuteservation de lrsquoespace meacutemoire pour deacutefinir le cercle A srsquoeacutecrit

A = new Cercle()

Remarquons qursquoil est possible de deacuteclarer et de reacuteserver de lrsquoespace meacutemoire en uneseule instruction

Cercle A = new Cercle()

En eacutecrivant une telle instruction nous observons que pour chaque objet deacuteclareacute lrsquoopeacutera-teur new reacuteserve suffisamment drsquoespace meacutemoire pour stocker les donneacutees de la classe etpour copier les meacutethodes associeacutees Il deacutetermine aussi lrsquoadresse ougrave sera stockeacutelrsquoensemble de ces informations (lrsquoespace meacutemoire pour lrsquoobjet A est illustreacute agrave laFigure 7-6)

Lors de cette reacuteservation lrsquointerpreacuteteur initialise les donneacutees de la classe agrave 0 pour lesentiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les char et agrave null pour les String Pour notreexemple A est un cercle de rayon nul centreacute en (0 0)

Lrsquoobjet ainsi deacutefini est un repreacutesentant particulier de la classe caracteacuteriseacute par lrsquoensemblede ses donneacutees Dans le jargon informatique on dit que lrsquoobjet A est une instance de laclasse Cercle Les donneacutees qui le caracteacuterisent agrave savoir x y et r sont appeleacutees desvariables drsquoinstance

Une instance est donc en meacutemoire un programme agrave part entiegravere composeacute de variableset de fonctions Sa structure est telle qursquoil ne peut srsquoexeacutecuter et se transformer (crsquoest-agrave-dire modifier ses propres donneacutees) qursquoagrave lrsquointeacuterieur de cet espace Crsquoest pourquoi il estconsideacutereacute comme une entiteacute indeacutependante ou laquo objet raquo

Manipuler un objet

Lrsquoobjet ainsi deacutefini est entiegraverement deacutetermineacute par ses donneacutees et ses meacutethodes Il est degraveslors possible de modifier les valeurs qui le caracteacuterisent et drsquoexploiter ses meacutethodes

Figure 7ndash6

Pour chaque objet creacuteeacute lrsquoopeacuterateur new reacuteserve un espace meacutemoire suffisamment grand pour y stocker les donneacutees et les meacutethodes descriptives de la classe Lrsquoadresse est alors deacutetermineacutee

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

165

Acceacuteder aux donneacutees de la classe

Pour acceacuteder agrave une donneacutee de la classe de faccedilon agrave la modifier il suffit drsquoeacutecrire

Acceacuteder agrave un membre de la classechosenomDeLaDonneacutee = valeur du bon type

en supposant que le champ nomDeLaDonneacutee soit deacutefini dans la classe correspondant autype de lrsquoobjet chose

Pour notre exemple la saisie au clavier des valeurs caracteacuterisant le cercle A srsquoeacutecrit de lafaccedilon suivante

Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon )Ar = Lirei()

Les cases meacutemoire repreacutesentant les variables drsquoinstance (x y et r) de lrsquoobjet A sont acces-sibles via lrsquoopeacuterateur point ()

Acceacuteder aux meacutethodes de la classe

Pour appliquer une meacutethode de la classe agrave un objet particulier la syntaxe utilise le mecircmeprincipe de notation

appliquer une meacutethode agrave lrsquoobjet chosechosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la meacutethode ait preacutealablement eacuteteacute deacutefinie pour le type de lrsquoobjet chosePour notre exemple lrsquoapplication de la meacutethode peacuterimegravetre() agrave lrsquoobjet A srsquoeacutecrit

double p = Apeacuterimegravetre()

Une application qui utilise des objets CercleLrsquoexemple suivant montre comment exploiter dans une application lrsquoensemble desdonneacutees et des meacutethodes deacutefinies dans la classe Cercle

Exemple code source complet

public class FaireDesCercles public static void main(String [] arg) Cercle A = new Cercle() Aaffiche() Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon ) Ar = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

166

Aaffiche() double p = Apeacuterimegravetre() Systemoutprintln( Votre cercle a pour perimetre + p) Adeacuteplacer(5 10) Systemoutprintln( Apres deplacement ) Aaffiche() Aagrandir(10) Systemoutprintln( Apres agrandissement ) Aaffiche()

Compilation et exeacutecution drsquoune application multifichiers

Lrsquoapplication FaireDesCercles deacutecrite dans le fichier FaireDesCerclesjava utilise letype Cercle deacutefini dans le fichier Cerclejava Deux fichiers distincts sont donc neacuteces-saires agrave la deacutefinition drsquoun programme qui utilise des objets Cercle

Bien que cela puisse paraicirctre curieux pour un deacutebutant lrsquoapplication FaireDesCerclessrsquoexeacutecute correctement malgreacute cette seacuteparation des fichiers Examinons comment fonc-tionne lrsquoordinateur dans un tel cas

Nous lrsquoavons deacutejagrave observeacute (voir au chapitre introductif laquo Naissance drsquoun programme raquola section laquo Exeacutecuter un programme raquo) deux phases sont neacutecessaires pour exeacutecuter unprogramme Java la phase de compilation et la phase drsquointerpreacutetation Si lrsquoapplicationest conccedilue avec plusieurs fichiers ces deux phases sont aussi indispensables

Phase de compilation

Lors de la compilation drsquoun programme constitueacute de plusieurs fichiers la question sepose de savoir comment compiler lrsquoensemble de ces fichiers

Pour simplifier la tacircche de la personne qui deacuteveloppe des applications le compilateurJava est construit de faccedilon que seul le programme qui contient la fonction main() soit agravecompiler

Au cours de la compilation le compilateur constate de lui-mecircme au moment de la deacutecla-ration de lrsquoobjet que lrsquoapplication utilise des objets drsquoun type non preacutedeacutefini par lelangage Java

Agrave partir de ce constat il recherche dans le reacutepertoire ougrave se trouve lrsquoapplication qursquoilcompile le fichier dont le nom corresponde au nouveau type qursquoil vient de deacutetecter etdont lrsquoextension soit java Tout programme Java a pour nom le nom de la classe (du type)qursquoil deacutefinit

Pour notre exemple en compilant lrsquoapplication FaireDesCercles gracircce agrave la commande

javac FaireDesCerclesjava

le compilateur deacutetecte le type Cercle Il recherche alors le fichier Cerclejava dans lereacutepertoire ougrave se trouve lrsquoapplication

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

167

bull Si le compilateur trouve ce fichier il le compile aussi En fin de compilation deuxfichiers ont eacuteteacute traiteacutes FaireDesCerclesjava et Cerclejava Si le compilateur nedeacutetecte aucune erreur le reacutepertoire contient les fichiers correpondant au pseudo-codeet qui ont pour nom FaireDesCerclesclass et Cercleclass

bull Srsquoil ne trouve pas le fichier Cerclejava il provoque une erreur de compilation dutype Class Cercle not found

Pour corriger cette erreur il est possible de speacutecifier au compilateur ougrave il peut trouver lefichier rechercheacute en deacutefinissant une variable drsquoenvironnement classpath Cette variableindique au compilateur quels sont les reacutepertoires susceptibles de contenir desprogrammes Java Cette deacutefinition se reacutealise de faccedilon diffeacuterente suivant le systegravemeutiliseacute PC Macintosh ou station Unix (voir sur le CD-Rom la section laquo Construire sonenvironnement de travail raquo)

Phase drsquointerpreacutetation

Une fois le programme compileacute lrsquoexeacutecution du programme est reacutealiseacutee gracircce agrave lrsquointer-preacuteteur de la machine virtuelle Java (JVM) qui exeacutecute le pseudo-code associeacute auprogramme contenant la fonction main() Pour notre exemple la commande est

java FaireDesCercles

Lorsque lrsquointerpreacuteteur trouve en cours drsquoexeacutecution la deacuteclaration drsquoun objet de type nonpreacutedeacutefini il recherche par lrsquointermeacutediaire du chargeur de classe (un programme aussi appeleacuteclass loader deacutefini dans la JVM) le pseudo-code associeacute au type de lrsquoobjet et deacutefini dans unfichier dont lrsquoextension est class Pour notre exemple le chargeur de classe recherche lefichier Cercleclass Une fois trouveacute il charge le code en meacutemoire pour lrsquoexeacutecuter

Analyse des reacutesultats de lrsquoapplication

Au cours des sections preacuteceacutedentes nous avons observeacute que tout objet deacuteclareacute contenaitune adresse correspondant agrave lrsquoadresse ougrave sont stockeacutees les informations relatives agrave cetobjet Pour acceacuteder aux donneacutees et meacutethodes de chaque objet il suffit de passer parlrsquoopeacuterateur laquo raquo

Gracircce agrave cette nouvelle faccedilon de stocker lrsquoinformation les transformations drsquoun objet parlrsquointermeacutediaire drsquoune meacutethode de sa classe sont visibles pour tous les objets de la mecircmeclasse Autrement dit si une meacutethode fournit plusieurs reacutesultats ces modifications sontvisibles en dehors de la meacutethode et pour toute lrsquoapplication

Pour mieux comprendre cette technique examinons comment srsquoexeacutecute le programmeFaireDesCercles Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur

Entrez la position en x 1100Entrez la position en y 1100Entrez le rayon 55

Les valeurs saisies au clavier par lrsquoutilisateur sont directement stockeacutees en Ax Ay etAr gracircce aux instructions Ax = Lirei()

Cercle centre en 1010de rayon 5

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

168

La meacutethode afficher() est appliqueacutee agrave lrsquoobjet A (Aafficher()) Elle consulte etaffiche les donneacutees associeacutees agrave cet objet soit 10 pour x (en reacutealiteacute Ax) 10 pour y (enreacutealiteacute Ay) et 5 pour Az

Votre cercle a pour perimetre 3141592653589793

De la mecircme faccedilon la meacutethode peacuterimegravetre() est appliqueacutee agrave lrsquoobjet A (Apeacuterimegravetre())Lrsquoexpression 2MathPI r deacutefinie dans la meacutethode est donc calculeacutee pour r (Ar)valant 5

Apregraves deplacement Cercle centre en 5 2de rayon 5

Lrsquoinstruction Adeacuteplacer(5 2) passe les nouvelles coordonneacutees de la position du centredu cercle en paramegravetres Les donneacutees x et y de lrsquoobjet A sont modifieacutees en conseacutequence(voir Figure 7-7)

Apres agrandissement Cercle centre en 5 2de rayon 15

Lrsquoinstruction Aagrandir(10) passe en paramegravetre la valeur drsquoaccroissement du rayon ducercle La donneacutee r de lrsquoobjet A est augmenteacutee de cette valeur (voir Figure 7-7)

Agrave chaque appel de la meacutethode afficher() appliqueacutee agrave lrsquoobjet A les valeurs courantesdes donneacutees (x y et r) de lrsquoobjet A sont afficheacutees

Observons que lorsque lrsquoobjet A est deacuteplaceacute les deux coordonneacutees x et y de son centresont modifieacutees La meacutethode deacuteplacer() modifie le contenu des deux variablesdrsquoinstance x et y de lrsquoobjet A Cette transformation est visible en dehors de lrsquoobjet lui-mecircme puisque la meacutethode afficher() affiche agrave lrsquoeacutecran le reacutesultat de cette modification

Figure 7ndash7

Les meacutethodes appliqueacutees agrave un objet exploitent les donneacutees relatives agrave cet objet

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

169

ReacutesumeacuteLa classe String est une classe preacutedeacutefinie du langage Java qui deacutefinit deslaquo variables raquo contenant des suites de caractegraveres (des mots ou des chaicircnes de carac-tegraveres)

La classe String est un type de donneacutees composeacute de meacutethodes qui permettent larecherche de mots ou de caractegraveres dans un texte Les mots peuvent aussi ecirctrecompareacutes suivant lrsquoordre alphabeacutetique ou transformeacutes en drsquoautres formats

Lrsquoeacutetude des objets de type String montre qursquoune classe est une association de donneacutees(information ou valeur de tout type) et de meacutethodes (outils drsquoaccegraves et de transformationdes donneacutees) Deacutefinies dans une classe ces meacutethodes ne peuvent srsquoappliquer qursquoauxdonneacutees de cette mecircme classe

Le langage Java offre la possibiliteacute au programmeur de deacutevelopper ses propresclasses Construire une classe crsquoest deacutefinir un nouveau type Pour cela il est neacuteces-saire de proceacuteder de la faccedilon suivante

bull Deacuteterminer les caracteacuteristiques communes agrave ce que lrsquoon souhaite deacutecrire Ce sontles donneacutees les attributs les proprieacuteteacutes ou encore les membres de la classe

bull Deacutefinir toutes les opeacuterations et traitements reacutealisables sur ces eacuteleacutements Cesopeacuterations sont aussi appeleacutees meacutethodes ou encore comportements

Une classe deacutefinissant un type structureacute nrsquoest pas une application directement exeacutecu-table Elle ne contient pas de fonction main()

Les types structureacutes sont utiliseacutes dans les applications en deacuteclarant des laquo variables raquodont le type correspond au nom de la classe deacutefinie preacuteceacutedemment comme le montrelrsquoinstruction suivante

TypeDeLrsquoObjet chose = new TypeDeLrsquoObjet()

Lrsquoopeacuterateur new deacutetermine lrsquoadresse ougrave stocker les informations relatives agrave lavariable deacuteclareacutee Il reacuteserve lrsquoespace meacutemoire neacutecessaire pour stocker les donneacutees etles meacutethodes de la classe Les donneacutees sont initialiseacutees agrave 0 pour les entiers agrave 00pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pour tous les autres types struc-tureacutes

Agrave cette eacutetape la variable est appeleacutee un objet dans le jargon informatique Un objetest donc un eacuteleacutement particulier qui repreacutesente une classe deacutefinissant un type struc-tureacute On dit aussi que crsquoest une instance de la classe Les donneacutees (proprieacuteteacutes ou attri-buts) qui la deacutefinissent sont appeleacutees variables drsquoinstance

Lrsquoaccegraves aux variables drsquoinstance ainsi qursquoaux meacutethodes de la classe se fait parlrsquointermeacutediaire de lrsquoopeacuterateur point () comme le montre lrsquoexemple suivant

chosenomDeLaDonneacutee = valeur du bon type chosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la donneacutee et la meacutethode aient eacuteteacute preacutealablement deacutefinies pour letype de lrsquoobjet chose

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

170

ExercicesUtiliser les objets de la classe String

Eacutecrivez un programme qui reacutealise les opeacuterations suivantes

a Demander la saisie drsquoune phrase

b Afficher la phrase en majuscules

c Compter le nombre de laquo a raquo dans la phrase puis srsquoil y en a transformer tous leslaquo a raquo en laquo raquo

d Tester si entre le cinquiegraveme caractegravere et le douziegraveme se trouve une seacutequence decaractegraveres preacutealablement saisie au clavier

Eacutecrivez un programme qui permet drsquoobtenir les actions suivantes

a Saisir des mots jusqursquoagrave ce que lrsquoutilisateur entre le mot laquo Fin raquo

b Afficher parmi les mot saisis le premier dans lrsquoordre alphabeacutetique

c Afficher parmi les mot saisis le dernier dans lrsquoordre alphabeacutetique

Le mot Fin ne doit pas ecirctre pris en compte dans la liste des mots saisis

Creacuteer une classe drsquoobjetsLrsquoobjectif est de deacutefinir une repreacutesentation drsquoun objet Personne

a Sachant qursquoune personne est deacutefinie agrave partir de son nom son preacutenom et son acircgedeacutefinissez les donneacutees de la classe Personne

b Eacutecrivez une application MesAmis qui utilise un objet Untel de type Personne etqui demande la saisie au clavier de ses nom preacutenom et acircge

Consulter les variables drsquoinstancePour deacutefinir les comportements drsquoun objet de type Personne

a Dans la classe Personne deacutecrivez la meacutethode preacutesentezVous() qui affiche lescaracteacuteristiques de la personne concerneacutee

b Modifiez lrsquoapplication de faccedilon agrave afficher les caracteacuteristiques de lrsquoobjet Untel

c Dans la classe Personne deacutecrivez la meacutethode quelEstVotreNom() qui permetde connaicirctre le nom de la personne concerneacutee

d Dans la classe Personne deacutecrivez la meacutethode quelEstVotreAge() qui permetde connaicirctre lrsquoacircge de la personne concerneacutee

e Modifiez lrsquoapplication de faccedilon agrave afficher le nom puis lrsquoacircge drsquoUntel

71

72

73

74

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

171

Analyser les reacutesultats drsquoune application objetPour bien comprendre ce que reacutealise lrsquoapplication FaireDesPoints observez lesdeux programmes suivants

public class Point Le fichier srsquoappelle Pointjava int x y public void creacuteer() Systemoutprint(Entrez lrsquoabscisse ) x = Lirei() Systemoutprint(Entrez lrsquoordonnee ) y = Lirei() public void afficher() Systemoutprintln(x + x + y + y) public void deacuteplacer( int nx int ny) x = nx y = ny fin de la class Point

public class FaireDesPoints Le fichier srsquoappelle FaireDesPointsjava public static void main( String [] arg) Point P = new Point() Pafficher() Pcreacuteer() P afficher() Pdeacuteplacer(10 12) Pafficher()

fin de la class FaireDesPoints

a Quel est le programme qui correspond agrave lrsquoapplication

b Quel est le programme deacutefinissant le type Point

c Recherchez les attributs de la classe Point et donnez leur nom

d Combien de meacutethodes sont-elles deacutefinies dans la classe Point Donnez leurnom

e Quels sont les objets utiliseacutes par lrsquoapplication FaireDesPoints Que valentleurs donneacutees x et y apregraves exeacutecution de lrsquoinstruction deacuteclaration

75

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

172

f Sur la repreacutesentation graphique ci-dessous placez pour lrsquoobjet P la valeur initialeainsi que le nom des meacutethodes

g Agrave lrsquoappel de la meacutethode creacuteer() comment les valeurs sont-elles affecteacutees auxattributs des objets concerneacutes Modifiez les cases concerneacutees sur la repreacutesenta-tion graphique

h Mecircme question pour la meacutethode deacuteplacer()

i Quel est le reacutesultat final de lrsquoapplication

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter les chaicircnes de caractegraveresLe type drsquoun compte et son numeacutero ne sont plus deacutefinis respectivement comme char etlong mais comme deux objets de type String Le type drsquoun compte peut donc prendremaintenant les thegravemes courant joint ou eacutepargne

a Saisissez le type du compte de faccedilon que lrsquoutilisateur entre au clavier C J ou E Leprogramme place dans la variable type les chaicircnes courant joint ou eacutepargne enfonction de la lettre saisie

b Saisissez le numeacutero de compte sous la forme drsquoune chaicircne de caractegraveres

c Transformez tous les tests faisant appel aux variables type et numeacutero de faccedilon agravetester non plus sur des caractegraveres mais sur des String

Deacutefinir le type CompteDans un fichier nommeacute Comptejava deacutefinissez la classe Compte en proceacutedant de lafaccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerCpte() en reprenant les instructions de lrsquooption 1 deacutecrites au chapitrepreacuteceacutedent Placez-les sous lrsquoen-tecircte de la fonction qui a pour forme public void

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

173

creacuteerCpte() La meacutethode ne possegravede ni paramegravetre ni type de retour car elle nefait que modifier les donneacutees caracteacuteristiques drsquoun compte deacuteclareacute en dehors de lameacutethode

ndash afficherCpte() en reprenant la fonction eacutecrite au chapitre preacuteceacutedent et en suppri-mant le mot-cleacute static Les variables num type taux et val ne sont agrave deacuteclarer ni agravelrsquointeacuterieur ni en paramegravetre de la meacutethode Elles sont deacutefinies comme donneacutees de laclasse compte en dehors de la meacutethode

Construire lrsquoapplication ProjetDans un fichier nommeacute Projetjava eacutecrivez lrsquoapplication contenant la fonction main()en proceacutedant de la faccedilon suivante

a Faites appel aux fonctions alAide() sortir() et menuPrincipal()

b Creacuteez un objet de type Compte gracircce agrave lrsquoinstruction de deacuteclaration Compte c = newCompte()

c Dans les options approprieacutees du menu appelez les meacutethodes de la classe Comptecomme ccreacuteerCpte() ou cafficherCpte()

d Agrave lrsquoexeacutecution du programme remarquez que la meacutethode afficherCpte() affiche lesdiffeacuterentes valeurs du compte modifieacutees par la meacutethode creacuteerCpte() Une meacutethodepar lrsquointermeacutediaire drsquoun objet peut par conseacutequent transmettre plusieurs reacutesultats

Deacutefinir le type LigneComptableDans un fichier nommeacute LigneComptablejava deacutefinissez la classe LigneComptable enproceacutedant de la faccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la deacutefinition de lrsquooption 3 agrave la sectionlaquo Le projet ldquoGestion drsquoun compte bancairerdquo raquo

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerLigneComptable() qui demande la saisie au clavier des valeurs correspon-dant aux donneacutees de la classe LigneComptable

ndash afficherLigne() qui affiche les donneacutees caracteacuteristiques drsquoune ligne comptable

Modifier le type CompteDans le fichier Comptejava

a Deacutefinissez une nouvelle donneacutee (variable drsquoinstance) deacutecrivant une ligne comptableen eacutecrivant la deacuteclaration LigneComptable ligne au mecircme niveau que typenumeacutero etc

b Eacutecrivez la meacutethode creacuteerLigne() qui permet les actions suivantes

ndash creacuteer en meacutemoire lrsquoobjet ligne gracircce agrave lrsquoinstruction de deacuteclaration ligne = newLigneComptable()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

174

ndash faire appel agrave la meacutethode creacuteerLigneComptable() par lrsquointermeacutediaire de lrsquoobjetligne de faccedilon agrave enregistrer les valeurs numeacuteriques associeacutees agrave la ligne creacuteeacutee

ndash modifier la valeur courante du compte agrave partir de la valeur (deacutebit ou creacutedit) saisiedans la meacutethode creacuteerLigneComptable()

c Modifiez la meacutethode afficherCpte() de faccedilon agrave afficher les informations stockeacuteesdans ligne en utilisant lrsquoinstruction ligneafficherLigne()

Modifier lrsquoapplication Projeta Dans le fichier nommeacute Projetjava modifiez lrsquooption 3 de lrsquoapplication de faccedilon

qursquoune ligne comptable soit creacuteeacutee pour le compte C deacutefini agrave lrsquooption 1

b Agrave lrsquoexeacutecution de lrsquoapplication que se passe-t-il si lrsquoutilisateur ayant creacuteeacute un compteaffiche ce dernier sans avoir jamais creacuteeacute de ligne comptable Pourquoi

c Comment faire pour remeacutedier agrave cette situation

copy copyright Eacuteditions Eyrolles

8Les principes

du concept drsquoobjet

Au cours du chapitre preacuteceacutedent nous avons examineacute comment mettre en place des objetsagrave lrsquointeacuterieur drsquoun programme Java Cette eacutetude a montreacute combien la structure geacuteneacuteraledes programmes se trouvait modifieacutee par lrsquoemploi des objetsEn reacutealiteacute les objets sont beaucoup plus qursquoune structure syntaxique Ils sont reacutegis pardes principes essentiels qui constituent les fondements de la programmation objet Dansce chapitre nous eacutetudions avec preacutecision lrsquoensemble de ces principes Nous deacuteterminons drsquoabord (section laquo La communication objet raquo) les caracteacuteristiquesdrsquoune donneacutee static et eacutevaluons leurs conseacutequences sur la construction des objets enmeacutemoire Nous analysons eacutegalement la technique du passage de paramegravetres par reacutefeacute-rence Nous observons qursquoil est possible avec la technologie objet qursquoune meacutethode trans-mette plusieurs reacutesultats agrave une autre meacutethodeNous expliquons ensuite (section laquo Les objets controcirclent leur fonctionnement raquo) leconcept drsquoencapsulation des donneacutees et nous examinons pourquoi et comment les objetsprotegravegent leurs donneacutees Enfin nous deacutefinissons (section laquo Lrsquoheacuteritage raquo) la notion drsquoheacuteritage entre classes Nousobservons combien cette notion est utile puisqursquoelle permet de reacuteutiliser des programmestout en apportant des variations dans le comportement des objets heacuteritants

La communication objetEn deacutefinissant un type ou une classe le deacuteveloppeur creacutee un modegravele qui deacutecrit les fonc-tionnaliteacutes des objets utiliseacutes par le programme Les objets sont creacuteeacutes en meacutemoire agrave partirde ce modegravele par copie des donneacutees et des meacutethodes Cette copie est reacutealiseacutee lors de la reacuteservation des emplacements meacutemoire gracircce agrave lrsquoopeacutera-teur new qui initialise les donneacutees de lrsquoobjet et fournit en retour lrsquoadresse ougrave se trouventles informations stockeacutees

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

176

La question est de comprendre pourquoi lrsquointerpreacuteteur reacutealise cette copie en meacutemoirealors que cela lui eacutetait impossible auparavant

Les donneacutees staticLa reacuteponse agrave cette interrogation se trouve dans lrsquoobservation des diffeacuterents programmesproposeacutes dans ce manuel (voir les chapitres 6 laquoFonctions notions avanceacuteesraquo et 7 laquoLesclasses et les objetsraquo) Comme nous lrsquoavons deacutejagrave constateacute (voir au chapitre preacuteceacutedent lasection laquoConstruire et utiliser ses propres classesraquo) le mot-cleacute static nrsquoest plus utiliseacutelors de la description drsquoun type alors qursquoil eacutetait preacutesent dans tous les programmes preacuteceacutedantce chapitre

Crsquoest donc la preacutesence ou lrsquoabsence de ce mot-cleacute qui fait que lrsquointerpreacuteteur construiseou non des objets en meacutemoire

Lorsque lrsquointerpreacuteteur rencontre le mot-cleacute static devant une variable ou une meacutethode ilreacuteserve un seul et unique emplacement meacutemoire pour y stoker la valeur ou le pseudo-codeassocieacutes Cet espace meacutemoire est communeacutement accessible pour tous les objets du mecircmetype

Lorsque le mot-cleacute static nrsquoapparaicirct pas lrsquointerpreacuteteur reacuteserve agrave chaque appel de lrsquoopeacutera-teur new un espace meacutemoire pour y charger les donneacutees et les pseudo-codes deacutecrits dans laclasse

Exemple compter des cercles

Pour bien comprendre la diffeacuterence entre une donneacutee static et une donneacutee non staticnous allons modifier la classe Cercle de faccedilon qursquoil soit possible de connaicirctre le nombredrsquoobjets Cercle creacuteeacutes en cours drsquoapplication

Pour ce faire lrsquoideacutee est drsquoeacutecrire une meacutethode creacuteer() qui permette drsquoune part de saisirdes valeurs x y et r pour chaque cercle agrave creacuteer et drsquoautre part drsquoincreacutementer un comp-teur de cercles

La variable repreacutesentant ce compteur doit ecirctre indeacutependante des objets creacuteeacutes de sorteque sa valeur ne soit pas ecirctre reacuteinitialiseacutee agrave zeacutero agrave chaque creacuteation drsquoobjet Cette variabledoit cependant ecirctre accessible pour chaque objet de faccedilon qursquoelle puisse srsquoincreacutementerde 1 agrave chaque appel de la meacutethode creacuteer()

Pour reacutealiser ces contraintes le compteur de cercles doit ecirctre une variable de classecrsquoest-agrave-dire une variable deacuteclareacutee avec le mot-cleacute static Examinons tout cela dans leprogramme suivant

public class Cercle public int x y r position du centre et rayon public static int nombre nombre de cercle

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Rayon )

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

177

r = Lirei()

nombre ++

et toutes les autres meacutethodes de la classe Cercle deacutefinies au

chapitre preacuteceacutedent

Fin de la classe Cercle

Les donneacutees deacutefinies dans la classe Cercle sont de deux sortes les variablesdrsquoinstance x y et r et la variable de classe nombre Seul le mot-cleacute static permet dediffeacuterencier leur cateacutegorie

Gracircce au mot-cleacute static la variable de classe nombre est un espace meacutemoire communaccessible pour tous les objets creacuteeacutes Pour faire appel agrave cette variable il suffit delrsquoappeler par son nom veacuteritable (voir au chapitre 6 laquo Fonctions notions avanceacutees raquo lasection laquo Variable de classe raquo) crsquoest-agrave-dire nombre si elle est utiliseacutee dans la classeCercle ou Cerclenombre si elle est utiliseacutee en dehors de cette classe

Exeacutecution de lrsquoapplication CompterDesCercles

Pour mieux saisir la diffeacuterence entre les variables drsquoinstance (non static) et les varia-bles de classe (static) observons comment fonctionne lrsquoapplication CompterDesCer-cles

public class CompterDesCercles public static void main(String [] arg)

Cercle A = new Cercle()

Acreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Cercle B = new Cercle()

Bcreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Fin de la classe CompterDesCercles

Dans ce programme deux objets de type Cercle sont creacuteeacutes agrave partir du modegravele deacutefini parle type Cercle Chaque objet est un repreacutesentant particulier ou une instance de la classeCercle de position et de rayon speacutecifiques

Lorsque lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new les donneacutees x y et r sontinitialiseacutees agrave 0 au moment de la reacuteservation de lrsquoespace meacutemoire La variable de classenombre est elle aussi creacuteeacutee en meacutemoire et sa valeur est eacutegalement initialiseacutee agrave 0

Lors de lrsquoexeacutecution de lrsquoinstruction Acreacuteer() les valeurs des variables x y et r delrsquoinstance A sont saisies au clavier (x = Lirei() hellip) La variable de classe nombre estincreacutementeacutee de 1 (nombre++) Le nombre de cercles est alors de 1 (voir lrsquoobjet A deacutecrit agravela Figure 8-1)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

178

De la mecircme faccedilon lrsquoobjet B est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new Les donneacutees xy et r sont elles aussi initialiseacutees agrave 0

Pour la variable de classe nombre en revanche cette initialisation nrsquoest pas reacutealiseacutee Lapreacutesence du mot-cleacute static fait que la variable de classe nombre qui existe deacutejagrave enmeacutemoire ne peut ecirctre reacuteinitialiseacutee directement par lrsquointerpreacuteteur

Il y a donc non pas reacuteservation drsquoun nouvel emplacement meacutemoire mais preacuteservationdu mecircme emplacement meacutemoire avec conservation de la valeur calculeacutee agrave lrsquoeacutetape preacuteceacute-dente soit 1

Apregraves saisie des donneacutees x y et r de lrsquoinstance B lrsquoinstruction nombre++ fait passer lavaleur de Cerclenombre agrave 2 (voir lrsquoobjet B deacutecrit agrave la Figure 8-1)

Nrsquoexistant qursquoen un seul exemplaire la variable de classe nombre permet le comptage dunombre de cercles creacuteeacutes Lrsquoincreacutementation de cette valeur est reacutealiseacutee indeacutependammentde lrsquoobjet la variable eacutetant commune agrave tous les objets creacuteeacutes

Le passage de paramegravetres par reacutefeacuterenceLa communication des donneacutees entre les objets passe avant tout par lrsquointermeacutediaire desvariables drsquoinstance Nous lrsquoavons observeacute agrave la section preacuteceacutedente lorsqursquoune meacutethodeappliqueacutee agrave un objet modifie les valeurs de plusieurs donneacutees de cet objet cette modifi-cation est visible en dehors de la meacutethode et de lrsquoobjet lui-mecircme

Il existe cependant une autre technique qui permette la modification des donneacutees drsquounobjet le passage de paramegravetres par reacutefeacuterence

Ce proceacutedeacute est utiliseacute lorsqursquoon passe en paramegravetre drsquoune meacutethode non plus une simplevariable (de type int char ou double) mais un objet Dans cette situation lrsquoobjet eacutetantdeacutefini par son adresse (reacutefeacuterence) la valeur passeacutee en paramegravetre nrsquoest plus la valeurreacuteelle de la variable mais lrsquoadresse de lrsquoobjet

Gracircce agrave cela les modifications apporteacutees sur lrsquoobjet passeacute en paramegravetre et reacutealiseacutees agravelrsquointeacuterieur de la meacutethode sont visibles en dehors mecircme de la meacutethode

Figure 8-1

La variable de classe Cerclenombre est creacuteeacutee en meacutemoire avec lrsquoobjet A Gracircce au mot-cleacute static il y a non pas reacuteservation drsquoun nouvel espace meacutemoire (pour la variable nombre) lors de la creacuteation de lrsquoobjet B mais preacuteservation de lrsquoespace meacutemoire ainsi que de la valeur stockeacutee

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

179

Eacutechanger la position de deux cercles

Pour comprendre en pratique le meacutecanisme du passage de paramegravetres par reacutefeacuterencenous allons eacutecrire une application qui eacutechange la position des centres de deux cerclesdonneacutes

Pour cela nous utilisons le meacutecanisme drsquoeacutechange de valeurs (voir le chapitre 1laquo Stocker une information raquo) en lrsquoappliquant agrave la coordonneacutee x puis agrave la coordonneacutee ydes centres des deux cercles agrave eacutechanger

Examinons la meacutethode eacutechanger() dont le code ci-dessous srsquoinsegravere dans la classe Cercle

Voir au chapitre 7 laquoLes classes et les objets raquo la section laquoLa classe descriptive du type Cercleraquo

public void eacutechanger(Cercle autre) Eacutechange la position drsquoun int tmp cercle avec celle du cercle donneacute en paramegravetre tmp = x eacutechanger la position en x x = autrex autrex = tmp tmp = y eacutechanger la position en y y = autrey autrey = tmp

Pour eacutechanger les coordonneacutees des centres de deux cercles la meacutethode eacutechanger() doitavoir accegraves aux valeurs des coordonneacutees des deux centres des cercles concerneacutes

Si par exemple la meacutethode est appliqueacutee au cercle B (Beacutechanger()) ce sont les varia-bles drsquoinstance x et y de lrsquoobjet B qui sont modifieacutees par les coordonneacutees du centre ducercle A La meacutethode doit donc connaicirctre les coordonneacutees du cercle A Pour ce faire il estneacutecessaire de passer ces valeurs en paramegravetres de la fonction

La technique consiste agrave passer en paramegravetres non pas les valeurs x et y du cercle aveclequel lrsquoeacutechange est reacutealiseacute mais un objet de type Cercle Dans notre exemple ce para-megravetre srsquoappelle autre Crsquoest le paramegravetre formel de la meacutethode repreacutesentant nrsquoimportequel cercle et il peut donc repreacutesenter par exemple le cercle A

Le fait drsquoeacutechanger les coordonneacutees des centres de deux cercles revient agrave eacutechanger les coor-donneacutees du couple (x y) du cercle sur lequel on applique la meacutethode (Bx By) avec lescoordonneacutees (autrex autrey) du cercle passeacute en paramegravetre de la meacutethode (Ax Ay)

Examinons maintenant comment srsquoopegravere effectivement lrsquoeacutechange en exeacutecutant lrsquoappli-cation suivante

public class EchangerDesCercles public static void main(String [] arg) Cercle A = new Cercle() Acreacuteer() Systemoutprintln(Le cercle A ) Aafficher()

Cercle B = new Cercle() Bcreacuteer() Systemoutprintln(Le cercle B )

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

180

B afficher() Beacutechanger(A) Systemoutprintln(Apres echange ) Systemoutprintln(Le cercle A ) Aafficher() Systemoutprintln(Le cercle B ) Bafficher()

Exeacutecution de lrsquoapplication EchangerDesCercles

Nous supposons que lrsquoutilisateur ait saisi les valeurs suivantes pour le cercle A

Position en x 22Position en y 22Rayon 22Le cercle A Centre en 2 2Rayon 2

et pour le cercle B

Position en x 55Position en y 55Rayon 55Le cercle B Centre en 5 5Rayon 5

Lrsquoinstruction Beacutechanger(A) eacutechange les coordonneacutees (x y) de lrsquoobjet B avec celles delrsquoobjet A Crsquoest donc le pseudo-codede lrsquoobjet B qui est interpreacuteteacute comme illustreacute agrave laFigure 8-2

Figure 8-2

Lrsquoinstruction Beacutechanger(A) fait appel agrave la meacutethode eacutechanger() de lrsquoobjet B Les donneacutees x y et r utiliseacutees par cette meacutethode sont celles de lrsquoobjet B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

181

Examinons le tableau drsquoeacutevolution des variables deacuteclareacutees pour le pseudo-code de lrsquoobjet B

bull Agrave lrsquoentreacutee de la meacutethode la variable tmp est deacuteclareacutee sans ecirctre initialiseacutee

bull La meacutethode est appliqueacutee agrave lrsquoobjet B Les variables x et y de lrsquoinstance B ont pourvaleurs respectives 5 et 5

bull Lrsquoobjet autre est simplement deacuteclareacute en paramegravetre de la fonction eacutechanger(Cercleautre) Lrsquoopeacuterateur new nrsquoeacutetant pas appliqueacute agrave cet objet aucun espace meacutemoiresuppleacutementaire nrsquoest alloueacute

Comme autre repreacutesente un objet de type Cercle il ne peut contenir qursquoune adresseet non pas une simple valeur numeacuterique Cette adresse est celle du paramegravetre effec-tivement passeacute lors de lrsquoappel de la meacutethode

Pour notre exemple lrsquoobjet A est passeacute en paramegravetre de la meacutethode (Beacutechanger(A))La case meacutemoire de la variable autre prend donc pour valeur lrsquoadresse de lrsquoobjet A

bull La variable tmp prend ensuite la valeur de la coordonneacutee x de lrsquoobjet B soit 5

instruction tmp x y autre

valeurs initiales - 5 5 0x11022033

instruction tmp x autre autrex (Ax)

tmp = x 5 5 0x11022033 2

x = autrex 5 2 0x11022033 2

autrex = tmp 5 2 0x11022033 5

Figure 8-3

Lrsquoobjet autre est le paramegravetre formel de la meacutethode eacutechanger() En eacutecrivant Beacutechanger(A) lrsquoobjet autre stocke la reacutefeacuterence meacutemoriseacutee en A De cette faccedilon autrex repreacutesente eacutegalement Ax La variable x de lrsquoinstance B prend la valeur de Ax gracircce agrave lrsquoinstruction x = autrex

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

182

bull Lorsque lrsquoinstruction x = autrex est exeacutecuteacutee la coordonneacutee x de lrsquoobjet B prend lavaleur de la coordonneacutee x de lrsquoobjet autrex Puisque autre correspond agrave lrsquoadresse delrsquoobjet A le fait de consulter le contenu de autrex revient en reacutealiteacute agrave consulter lecontenu de Ax (voir Figure 8-3) La variable drsquoinstance Ax contenant la valeur 2x (Bx) prend la valeur 2

bull Pour finir lrsquoeacutechange sur les abscisses autrex prend la valeur stockeacutee dans tmpComme autre et A correspondent agrave la mecircme adresse modifier autrex crsquoest aussimodifier Ax (voir Figure 8-4) Une fois exeacutecuteacute autrex = tmp la variable x delrsquoinstance A vaut par conseacutequent 5

Lrsquoensemble de ces opeacuterations est ensuite reacutealiseacute sur la coordonneacutee y des cercles B et A viaautre

Lrsquoexeacutecution finale du programme a pour reacutesultat

Apres echange Le cercle A Centreacute en 5 5Rayon 2Le cercle B Centre en 2 2Rayon 5

instruction tmp y autre autrey (Ay)

tmp = y 5 5 0x11022033 2

y = autrey 5 2 0x11022033 2

autrey = tmp 5 2 0x11022033 5

Figure 8-4

autre et A deacutefinissent la mecircme reacutefeacuterence ou adresse Crsquoest pourquoi le fait de modifier autrex revient aussi agrave modifier Ax Ainsi lrsquoinstruction autrex = tmp fait que Ax prend la valeur stockeacutee dans tmp

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

183

Au final nous constatons agrave lrsquoobservation des tableaux drsquoeacutevolution des variables que lesdonneacutees x et y de B ont pris la valeur des donneacutees x et y de A soit 2 pour x et 2 pour yParallegravelement le cercle A a eacuteteacute transformeacute par lrsquointermeacutediaire de la reacutefeacuterence stockeacuteedans autre et a pris les coordonneacutees x et y du cercle B soit 5 pour x et 5 pour y

En reacutesumeacute gracircce agrave la technique du passage de paramegravetres par reacutefeacuterence tout objetpasseacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethode ses donneacutees transfor-meacutees par la meacutethode Cette transformation est alors visible pour tous les objets delrsquoapplication

Les objets controcirclent leur fonctionnementLrsquoun des objectifs de la programmation objet est de simuler agrave lrsquoaide drsquoun programmeinformatique la manipulation des objets reacuteels par lrsquoecirctre humain Les objets reacuteels formentun tout et leur manipulation neacutecessite la plupart du temps un outil ou une interface decommunication

Par exemple quand nous prenons un ascenseur nous appuyons sur le bouton drsquoappelpour ouvrir les portes ou pour nous rendre jusqursquoagrave lrsquoeacutetage deacutesireacute Lrsquointerface de commu-nication est ici le bouton drsquoappel Nul nrsquoaurait lrsquoideacutee de prendre la teacuteleacutecommande de sateacuteleacutevision pour appeler un ascenseur

De la mecircme faccedilon la preacuteparation drsquoune omelette neacutecessite de casser des œufs Pourbriser la coquille drsquoun œuf nous pouvons utiliser lrsquooutil couteau Un marteau pourraitecirctre eacutegalement utiliseacute mais son usage nrsquoest pas vraiment adapteacute agrave la situation

Comme nous le constatons agrave travers ces exemples les objets reacuteels sont manipuleacutes parlrsquointermeacutediaire drsquointerfaces approprieacutees Lrsquoutilisation drsquoun outil inadapteacute fait quelrsquoobjet ne reacutepond pas agrave nos attentes ou qursquoil se brise deacutefinitivement

Tout comme nous manipulons les objets reacuteels les applications informatiques manipulentdes objets virtuels deacutefinis par le programmeur Cette manipulation neacutecessite des outilsaussi bien adapteacutes que nos outils reacuteels Sans controcircle sur le bien-fondeacute drsquoune manipula-tion lrsquoapplication risque de fournir de mauvais reacutesultats ou pire de cesser brutalementson exeacutecution

La notion drsquoencapsulation

Pour reacutealiser lrsquoadeacutequation entre un outil et la manipulation drsquoun objet la programmationobjet utilise le concept drsquoencapsulation

Par ce terme il faut entendre que les donneacutees drsquoun objet sont proteacutegeacutees tout comme lemeacutedicament est proteacutegeacute par la fine pellicule de sa capsule Gracircce agrave cette protection il nepeut y avoir transformation involontaire des donneacutees de lrsquoobjet

Lrsquoencapsulation passe par le controcircle des donneacutees et des comportements de lrsquoobjet Cecontrocircle est eacutetabli agrave travers la protection des donneacutees (voir la section suivante) lrsquoaccegravescontrocircleacute aux donneacutees (voir la section laquo Les meacutethodes drsquoaccegraves aux donneacutees raquo) et la notionde constructeur de classe (voir la section laquo Les constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

184

La protection des donneacuteesLe langage Java fournit les niveaux de protection suivants pour les membres drsquoune classe(donneacutees et meacutethodes)

bull Protection public Les membres (donneacutees et meacutethodes) drsquoune classe deacuteclareacutes publicsont accessibles pour tous les objets de lrsquoapplication Les donneacutees peuvent ecirctre modi-fieacutees par une meacutethode de la classe drsquoune autre classe ou depuis la fonction main()

bull Protection private Les membres de la classe deacuteclareacutes private ne sont accessiblesque pour les meacutethodes de la mecircme classe Les donneacutees ne peuvent ecirctre initialiseacutees oumodifieacutees que par lrsquointermeacutediaire drsquoune meacutethode de la classe Les donneacutees oumeacutethodes ne peuvent ecirctre appeleacutees par la fonction main()

bull Protection protected Tout comme les membres priveacutes les membres deacuteclareacutesprotected ne sont accessibles que pour les meacutethodes de la mecircme classe Ils sont aussiaccessibles par les fonctions membres drsquoune sous-classe (voir la sectionlaquo Lrsquoheacuteritage raquo)

Par deacutefaut lorsque les donneacutees sont deacuteclareacutees sans type de protection leur protection estpublic Les donneacutees sont alors accessibles depuis toute lrsquoapplication

Proteacuteger les donneacutees drsquoun cercle

Pour proteacuteger les donneacutees de la classe Cercle il suffit de remplacer le mot-cleacute publicpreacuteceacutedant la deacuteclaration des variables drsquoinstance par le mot private Observons lanouvelle classe CerclePrive dont les donneacutees sont ainsi proteacutegeacutees

public class CerclePrive private int x y r position du centre et rayon

public void afficher() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void deacuteplacer(int nx int ny) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets Fin de la classe CerclePrive

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

185

Les donneacutees x y et r de la classe CerclePrive sont proteacutegeacutees gracircce au mot-cleacute privateEacutetudions les conseacutequences drsquoune telle protection sur la phase de compilation de lrsquoappli-cation FaireDesCerclesPrives

public class FaireDesCerclesPrives public static void main(String [] arg) CerclePrive A = new CerclePrive() Aafficher() Systemoutprintln( Entrez le rayon ) Ar = Lirei() Systemoutprintln( Le cercle est de rayon + Ar)

Compilation de lrsquoapplication FaireDesCerclesPrives

Les donneacutees x y et r de la classe CerclePrive sont deacuteclareacutees priveacutees Par deacutefinition cesdonneacutees ne sont donc pas accessibles en dehors de la classe ougrave elles sont deacutefinies

Or en eacutecrivant dans la fonction main() lrsquoinstruction Ar = Lirei() le programmeurdemande drsquoacceacuteder depuis la classe FaireDesCerclesPrives agrave la valeur de r de faccedilonagrave la modifier Cet accegraves est impossible car r est deacutefini en mode private dans la classeCerclePrive et non dans la classe FaireDesCerclesPrives

Crsquoest pourquoi le compilateur deacutetecte lrsquoerreur Variable x in class CerclePrive notaccessible from class FaireDesCerclesPrives

Les meacutethodes drsquoaccegraves aux donneacuteesLorsque les donneacutees sont totalement proteacutegeacutees crsquoest-agrave-dire deacuteclareacutees private agrave lrsquointeacute-rieur drsquoune classe elles ne sont plus accessibles depuis une autre classe ou depuis lafonction main() Pour connaicirctre ou modifier la valeur drsquoune donneacutee il est neacutecessaire decreacuteer agrave lrsquointeacuterieur de la classe des meacutethodes drsquoaccegraves agrave ces donneacutees

Figure 8-5

Lorsque les donneacutees drsquoun objet sont proteacutegeacutees lrsquoobjet possegravede ses propres meacutethodes qui permettent soit de consulter la valeur reacuteelle de ses donneacutees soit de modifier les donneacutees La validiteacute de ces modifications est controcircleacutee par les meacutethodes deacutefinies dans la classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

186

Les donneacutees priveacutees ne peuvent ecirctre consulteacutees ou modifieacutees que par des meacutethodes de laclasse ougrave elles sont deacuteclareacutees

De cette faccedilon gracircce agrave lrsquoaccegraves aux donneacutees par lrsquointermeacutediaire de meacutethodes approprieacuteeslrsquoobjet permet non seulement la consultation de la valeur de ses donneacutees mais aussilrsquoautorisation ou non suivant ses propres critegraveres de leur modification

Les meacutethodes drsquoune classe reacutealisent les modes drsquoaccegraves suivants

bull Accegraves en consultation La meacutethode fournit la valeur de la donneacutee mais ne peut lamodifier Ce type de meacutethode est aussi appeleacute accesseur en consultation

bull Accegraves en modification La meacutethode modifie la valeur de la donneacutee Cette modificationest reacutealiseacutee apregraves validation par la meacutethode On parle aussi drsquoaccesseur en modification

Controcircler les donneacutees drsquoun cercle

Dans lrsquoexemple suivant nous prenons pour hypothegravese que le rayon drsquoun cercle ne puissejamais ecirctre neacutegatif ni deacutepasser la taille de lrsquoeacutecran Ces conditions doivent ecirctre veacuterifieacuteespour toutes les meacutethodes qui peuvent modifier la valeur du rayon drsquoun cercle

Comme nous lrsquoavons deacutejagrave remarqueacute (voir au chapitre 7 laquo Les classes et les objets raquo lasection laquo Quelques observations raquo) les meacutethodes afficher() et peacuterimegravetre() ne fontque consulter le contenu des donneacutees x y et r

Les meacutethodes deacuteplacer() agrandir() et creacuteer() en revanche modifient le contenudes donneacutees x y et r La meacutethode deacuteplacer() nrsquoayant pas drsquoinfluence sur la donneacutee rseules les meacutethodes agrandir() et creacuteer() doivent controcircler la valeur du rayon de sorteque cette derniegravere ne puisse ecirctre neacutegative ou supeacuterieure agrave la taille de lrsquoeacutecran Examinonsla classe CercleControle suivante qui prend en compte ces nouvelles contraintes

public class CercleControle private int x y r position du centre et rayon public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt 600)

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Centre en + x + + y) Systemoutprintln( Rayon + r)

public void agrandir(int nr) if (r + nr lt 0) r = 0 else if ( r + nr gt 600) r = 600 else r = r + nr

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

187

Fin de la classe CercleControle

La meacutethode creacuteer() controcircle la valeur du rayon lors de sa saisie en demandant de saisirune valeur pour le rayon tant que la valeur saisie est neacutegative ou plus grande que 600(taille supposeacutee de lrsquoeacutecran) Degraves que la valeur saisie est comprise entre 0 et 600 la fonc-tion creacuteer() cesse son exeacutecution Agrave la sortie de cette fonction nous sommes certainsque le rayon est compris entre 0 et 600

De la mecircme faccedilon la meacutethode agrandir() autorise que la valeur du rayon soitaugmenteacutee de la valeur passeacutee en paramegravetre agrave condition que cette augmentation nedeacutepasse pas la taille de lrsquoeacutecran ou que la diminution nrsquoentraicircne pas un rayon neacutegatif si lavaleur passeacutee en paramegravetre est neacutegative Dans ces deux cas la valeur du rayon est forceacuteerespectivement agrave la taille de lrsquoeacutecran ou agrave 0

Exeacutecution de lrsquoapplication FaireDesCerclesControlesPour veacuterifier que tous les objets Cercle controcirclent bien la valeur de leur rayon exami-nons lrsquoexeacutecution de lrsquoapplication suivante

public class FaireDesCerclesControles public static void main(String [] arg) CercleControle A = new CercleControle() Acreacuteer() Aafficher() Systemoutprint(Entrer une valeur drsquoagrandissement ) int plus = Lirei() Aagrandir(plus) Systemoutprintln(Apres agrandissement ) Aafficher()

Lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new La valeur du rayon est initialiseacutee agrave 0Agrave lrsquoappel de la meacutethode creacuteer() les variables drsquoinstance x et y sont saisies au claviercomme suit

Position en x 55Position en y 55

Ensuite si lrsquoutilisateur saisit pour le rayon une valeur neacutegative

Rayon --33

ou supeacuterieure agrave 600

Rayon 665544

le programme demande de nouveau de saisir une valeur pour le rayon Lrsquoapplicationcesse cette reacutepeacutetition lorsque lrsquoutilisateur entre une valeur comprise entre 0 et 600comme suit

Rayon 220000Centre 5 5 Rayon 200

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

188

Apregraves affichage des donneacutees du cercle A le programme demande

Entrer une valeur drsquoagrandissement 445500

La valeur du rayon vaut 200 + 450 soit 650 Ce nouveau rayon eacutetant supeacuterieur agrave 600 lavaleur du rayon est bloqueacutee par le programme agrave 600 Lrsquoaffichage des donneacutees fournit

Apres agrandissement Centre 5 5 Rayon 600

La notion de constante

Drsquoune maniegravere geacuteneacuterale en programmation objet les variables drsquoinstance ne sont quetregraves rarement deacuteclareacutees en public Pour des raisons de seacutecuriteacute tout objet se doit decontrocircler les transformations opeacutereacutees par lrsquoapplication sur lui-mecircme Crsquoest pourquoi lesdonneacutees drsquoune classe sont le plus souvent deacuteclareacutees en mode private

Il existe des donneacutees appeleacutees constantes qui parce qursquoelles sont importantes doiventecirctre visibles par toutes les meacutethodes de lrsquoapplication Ces donneacutees sont deacuteclareacutees enmode public Du fait de leur invariabiliteacute lrsquoapplication ne peut modifier leur contenu

Pour notre exemple la valeur 600 correspondant agrave la taille (largeur et hauteur) supposeacuteede lrsquoeacutecran peut ecirctre consideacutereacutee comme une donneacutee constante de lrsquoapplication

Il suffit de deacuteclarer les variables laquo constantes raquo agrave lrsquoaide du mot-cleacute final Ainsi la taillede lrsquoeacutecran peut ecirctre deacutefinie de la faccedilon suivante

public final int TailleEcran = 600

Notons que la taille de lrsquoeacutecran est une valeur indeacutependante de lrsquoobjet Cercle Quelle quesoit la forme agrave dessiner (carreacute cercle etc) la taille de lrsquoeacutecran est toujours la mecircme Crsquoestpourquoi il est logique de deacuteclarer la variable TailleEcran comme constante de classe agravelrsquoaide du mot-cleacute static

public final static int TailleEcran = 600

De cette faccedilon la variable TailleEcran est accessible en consultation depuis toutelrsquoapplication mais elle ne peut en aucun cas ecirctre modifieacutee eacutetant deacuteclareacutee final

Les meacutethodes creacuteer() et agrandir() srsquoeacutecrivent alors de la faccedilon suivante

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt TailleEcran)

public void agrandir(int nr) if (r + nr lt 0) r = 0

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

189

else if ( r + nr gt TailleEcran) r = TailleEcran else r = r + nr

Des meacutethodes invisibles

Comme nous lrsquoavons observeacute preacuteceacutedemment les donneacutees drsquoune classe sont geacuteneacuterale-ment deacuteclareacutees en mode private Les meacutethodes quant agrave elles sont le plus souventdeacuteclareacutees public car ce sont elles qui permettent lrsquoaccegraves aux donneacutees proteacutegeacutees Danscertains cas particuliers il peut arriver que certaines meacutethodes soient deacutefinies en modeprivate Elles deviennent alors inaccessibles depuis les classes exteacuterieures

Ainsi le controcircle systeacutematique des donneacutees est toujours reacutealiseacute par lrsquoobjet lui-mecircme etnon par lrsquoapplication qui utilise les objets Par conseacutequent les meacutethodes qui ont pourcharge de reacutealiser cette veacuterification peuvent ecirctre deacutefinies comme meacutethodes internes agrave laclasse puisqursquoelles ne sont jamais appeleacutees par lrsquoapplication

Par exemple le controcircle de la validiteacute de la valeur du rayon nrsquoest pas reacutealiseacutee par lrsquoappli-cation FaireDesCercles mais correspond agrave une opeacuteration interne agrave la classe Cercle Cecontrocircle est reacutealiseacute diffeacuteremment suivant que le cercle est agrave creacuteer ou agrave agrandir (voir lesmeacutethodes creacuteer() et agrandir() ci-dessus)

bull Soit le rayon nrsquoest pas encore connu et la veacuterification srsquoeffectue degraves la saisie de lavaleur Crsquoest ce que reacutealise la meacutethode suivante

private int rayonVeacuterifieacute() int tmp do Systemoutprint( Rayon ) tmp = Lirei() while ( tmp lt 0 || tmp gt TailleEcran) return tmp

bull Soit le rayon est deacutejagrave connu auquel cas la veacuterification est reacutealiseacutee agrave partir de la valeurpasseacutee en paramegravetre de la meacutethode

private int rayonVeacuterifieacute (int tmp) if (tmp lt 0) return 0 else if ( tmp gt TailleEcran) return TailleEcran else return tmp

Les meacutethodes rayonVeacuterifieacute() sont appeleacutees meacutethodes drsquoimpleacutementation car ellessont deacuteclareacutees en mode priveacute Leur existence nrsquoest connue drsquoaucune autre classe Seulesles meacutethodes de la classe Cercle peuvent les exploiter et elles ne sont pas directementexeacutecutables par lrsquoapplication Elle sont cependant tregraves utiles agrave lrsquointeacuterieur de la classe ougraveelles sont deacutefinies (voir les sections laquo Les constructeurs raquo et laquo Lrsquoheacuteritage raquo)

Remarquons en outre que nous venons de deacutefinir deux meacutethodes portant le nom rayon-Veacuterifieacute() Le langage Java nrsquointerdit pas la deacutefinition de meacutethodes portant le mecircmenom Dans cette situation on dit que ces meacutethodes sont surchargeacutees (voir la sectionlaquo La surcharge de constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

190

Les constructeursGracircce aux diffeacuterents niveaux de protection et aux meacutethodes controcirclant lrsquoaccegraves auxdonneacutees il devient possible de construire des outils approprieacutes aux objets manipuleacutes

Cependant la protection des donneacutees drsquoune classe passe aussi par la notion de construc-teurs drsquoobjets En effet les constructeurs sont utiliseacutes pour initialiser correctement lesdonneacutees drsquoun objet au moment de la creacuteation de lrsquoobjet en meacutemoire

Le constructeur par deacutefaut

Le langage Java deacutefinit pour chaque classe construite par le programmeur un construc-teur par deacutefaut Celui-ci initialise lors de la creacuteation drsquoun objet toutes les donneacutees de cetobjet agrave 0 pour les entiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pourles String ou autres types structureacutes

Le constructeur par deacutefaut est appeleacute par lrsquoopeacuterateur new lors de la reacuteservation delrsquoespace meacutemoire Ainsi lorsque nous eacutecrivons

Cercle C = new Cercle()

nous utilisons le terme Cercle() qui repreacutesente en reacutealiteacute le constructeur par deacutefaut (ilne possegravede pas de paramegravetre) de la classe Cercle

Un constructeur est une meacutethode puisqursquoil y a des parenthegraveses () derriegravere son nomdrsquoappel qui porte le nom de la classe associeacutee au type de lrsquoobjet deacuteclareacute

Deacutefinir le constructeur drsquoune classe

Lrsquoutilisation du constructeur par deacutefaut permet drsquoinitialiser systeacutematiquement lesdonneacutees drsquoune classe Lrsquoinitialisation proposeacutee peut parfois ne pas ecirctre conforme auxvaleurs demandeacutees par le type

Dans ce cas le langage Java offre la possibiliteacute de deacutefinir un constructeur propre agrave laclasse de lrsquoobjet utiliseacute Cette deacutefinition est reacutealiseacutee en eacutecrivant une meacutethode portant lemecircme nom que sa classe Les instructions qui la composent permettent drsquoinitialiser lesdonneacutees de la classe conformeacutement aux valeurs demandeacutees par le type choisi

Par exemple le constructeur de la classe Cercle peut srsquoeacutecrire de la faccedilon suivante

public Cercle() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() r = rayonVeacuterifieacute()

En observant la structure du constructeur Cercle() nous constatons qursquoun constructeurnrsquoest pas typeacute Aucun type de retour nrsquoest placeacute dans son en-tecircte Mais attention le faitdrsquoeacutecrire lrsquoen-tecircte public void Cercle() ou encore public int Cercle() a pour reacutesultatde creacuteer une simple meacutethode qui a pour nom Cercle() et qui nrsquoest pas celle appeleacutee parlrsquoopeacuterateur new Il ne srsquoagit donc pas drsquoun constructeur

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

191

Une fois correctement deacutefini le constructeur est appeleacute par lrsquoopeacuterateur new comme pourle constructeur par deacutefaut Lrsquoinstruction

Cercle A = new Cercle()

fait appel au constructeur deacutefini ci-dessus Le programme exeacutecuteacute demande degraves la creacutea-tion de lrsquoobjet A de saisir les donneacutees le concernant avec une veacuterification concernant lavaleur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute() De cette faccedilon lrsquoapplication estsucircre drsquoexploiter des objets dont la valeur est valide degraves leur initialisation

Remarquons que

bull Lorsqursquoun constructeur est deacutefini par le programmeur le constructeur proposeacute pardeacutefaut par le langage Java nrsquoexiste plus

bull La meacutethode creacuteer() et le constructeur ainsi deacutefinis ont un rocircle identique La meacutethodecreacuteer() devient par conseacutequent inutile

La surcharge de constructeurs

Le langage Java permet la deacutefinition de plusieurs constructeurs ou meacutethodes agrave lrsquointeacute-rieur drsquoune mecircme classe du fait que la construction des objets peut se reacutealiser de diffeacute-rentes faccedilons Lorsqursquoil existe plusieurs constructeurs on dit que le constructeur estsurchargeacute

Dans la classe Cercle il est possible de deacutefinir deux constructeurs suppleacutementaires

public Cercle(int centrex int centrey) x = centrex y = centreypublic Cercle(int centrex int centrey int rayon) this( centrex centrey) r = rayonVeacuterifieacute(rayon)

Pour deacuteterminer quel constructeur doit ecirctre utiliseacute lrsquointerpreacuteteur Java regarde lors deson appel la liste des paramegravetres deacutefinis dans chaque constructeur La construction destrois objets A B et C suivants fait appel aux trois constructeurs deacutefinis preacuteceacutedemment

Cercle A = new Cercle()Cercle B = new Cercle(10 10)Cercle c = new Cercle(10 10 30)

Lors de la deacuteclaration de lrsquoobjet A le constructeur appeleacute est celui qui ne possegravede pas deparamegravetre (le constructeur par deacutefaut deacutefini agrave la section laquo Deacutefinir le constructeur drsquouneclasse raquo) et les valeurs du centre et du rayon du cercle A sont celles saisies au clavier parlrsquoutilisateur

La creacuteation de lrsquoobjet B fait appel au constructeur qui possegravede deux paramegravetres de typeentier Les valeurs du centre et du rayon du cercle B sont donc celles passeacutees en para-megravetre du constructeur soit (10 10) pour (Bx By) Aucune valeur nrsquoeacutetant preacuteciseacutee pourle rayon Br est automatiquement initialiseacute agrave 0

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

192

Le mot-cleacute this

La creacuteation de lrsquoobjet C est reacutealiseacutee par le constructeur qui possegravede trois paramegravetresentiers Ces paramegravetres permettent lrsquoinitialisation de toutes les donneacutees deacutefinies dans laclasse Cercle

Remarquons que gracircce agrave lrsquoinstruction this(centrex centrey) le constructeur posseacute-dant deux paramegravetres est appeleacute agrave lrsquointeacuterieur du constructeur posseacutedant trois paramegravetres

Le mot-cleacute this() repreacutesente lrsquoappel au second constructeur de la mecircme classe posseacutedantdeux paramegravetres entiers puisque this() est appeleacute avec deux paramegravetres entiers Il permetlrsquoutilisation du constructeur preacuteceacutedent pour initialiser les coordonneacutees du centre avantdrsquoinitialiser correctement la valeur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute(rayon) quiest elle-mecircme surchargeacutee Comme pour les constructeurs le compilateur choisit lameacutethode rayonVeacuterifieacute() deacutefinie avec un paramegravetre entier

Pour finir remarquons que le terme this() doit toujours ecirctre placeacute comme premiegravereinstruction du constructeur qui lrsquoutilise

LrsquoheacuteritageLrsquoheacuteritage est le dernier concept fondamental de la programmation objet eacutetudieacutee dans cechapitre Ce concept permet la reacuteutilisation des fonctionnaliteacutes drsquoune classe tout enapportant certaines variations speacutecifiques de lrsquoobjet heacuteritant

Avec lrsquoheacuteritage les meacutethodes deacutefinies pour un ensemble de donneacutees sont reacuteutilisablespour des variantes de cet ensemble Par exemple si nous supposons qursquoune classe Formedeacutefinisse un ensemble de comportements propres agrave toute forme geacuteomeacutetrique alors

bull Ces comportements peuvent ecirctre reacuteutiliseacutes par la classe Cercle qui est une formegeacuteomeacutetrique particuliegravere Cette reacuteutilisation est effectueacutee sans avoir agrave modifier lesinstructions de la classe Forme

bull Il est possible drsquoajouter drsquoautres comportements speacutecifiques des objets Cercle Cesnouveaux comportements sont valides uniquement pour la classe Cercle et non pourla classe Forme

La relation laquo est un raquo

En pratique pour deacuteterminer si une classe B heacuterite drsquoune classe A il suffit de savoir srsquoilexiste une relation laquo est un raquo entre B et A Si tel est le cas la syntaxe de deacuteclaration est lasuivante

class B extends A donneacutees et meacutethodes de la classe B

Dans ce cas on dit que

bull B est une sous-classe de A ou encore une classe deacuteriveacutee de A

bull A est une super-classe ou encore une classe de base copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

193

Un cercle laquo est une raquo forme geacuteomeacutetrique

En supposant que la classe Forme possegravede des caracteacuteristiques communes agrave chaque typede forme geacuteomeacutetrique (les coordonneacutees drsquoaffichage agrave lrsquoeacutecran la couleur etc) ainsi quedes comportements communs (afficher deacuteplacer etc) la classe Forme srsquoeacutecrit de la faccedilonsuivante

public class Forme protected int x y private couleur

public Forme() Le constructeur de la classe Forme Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Couleur de la forme ) couleur = Lirei()

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Position en + x + + y) Systemoutprintln( Couleur + couleur)

public void deacuteplacer(int nx int ny) Deacuteplace les coordonneacutees de la x = nx forme en (nx ny) passeacutees en y = ny paramegravetre de la fonction Fin de la classe Forme

Sachant qursquoun objet Cercle laquo est une raquo forme geacuteomeacutetrique particuliegravere la classe Cercleheacuterite de la classe Forme en eacutecrivant

public class Cercle extends Forme private int r rayon

public Cercle() Le constructeur de la classe Cercle Systemoutprint( Rayon ) r = rayonVeacuterifieacute()private int rayonVeacuterifieacute() Voir la section Des meacutethodes invisibles private int rayonVeacuterifieacute (int tmp) Voir la section Des meacutethodes invisibles

public void afficher() Affichage des donneacutees de la classe superafficher() Systemoutprintln( Rayon + r)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

194

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) Augmente la valeur courante du r = rayonVeacuterifieacute(r + nr) rayon avec la valeur passeacutee en paramegravetre Fin de la classe Cercle

Un cercle est une forme geacuteomeacutetrique (Cercle extends Forme) qui possegravede un rayon(private int r) et des comportements propres aux cercles soit par exemple le calculdu peacuterimegravetre (peacuterimegravetre()) ou encore la modification de sa taille (agrandir()) Uncercle peut ecirctre deacuteplaceacute comme toute forme geacuteomeacutetrique Les meacutethodes de la classeForme restent donc opeacuterationnelles pour les objets Cercle

En examinant de plus pregraves les classes Cercle et Forme nous remarquons que

bull La notion de constructeur existe aussi pour les classes deacuteriveacutees (voir la section laquo Leconstructeur drsquoune classe heacuteriteacutee raquo)

bull Les donneacutees x y sont deacuteclareacutees protected (voir la section laquo La protection desdonneacutees heacuteriteacutees raquo)

bull La fonction afficher() existe sous deux formes diffeacuterentes dans la classe Forme et laclasse Cercle Il srsquoagit lagrave du concept de polymorphisme (voir la section laquo Lepolymorphisme raquo)

Le constructeur drsquoune classe heacuteriteacuteeLes classes deacuteriveacutees possegravedent leurs propres constructeurs qui sont appeleacutes par lrsquoopeacutera-teur new comme dans

Cercle A = new Cercle( )

Pour construire un objet deacuteriveacute il est indispensable de construire drsquoabord lrsquoobjet associeacuteagrave la classe megravere Pour construire un objet Cercle nous devons deacutefinir ses coordonneacuteeset sa couleur Le constructeur de la classe Cercle doit appeler le constructeur de la classeForme

Par deacutefaut srsquoil nrsquoy a pas drsquoappel explicite au constructeur de la classe supeacuterieure commecrsquoest le cas pour notre exemple le compilateur recherche de lui-mecircme le constructeurpar deacutefaut (sans paramegravetre) de la classe supeacuterieure En construisant lrsquoobjet A lrsquointerpreacute-teur exeacutecute aussi le constructeur par deacutefaut de la classe Forme Lrsquoensemble des donneacuteesdu cercle (x y couleur et r) est alors correctement initialiseacute par saisie des valeurs auclavier

Ce fonctionnement pose problegraveme lorsqursquoil nrsquoexiste pas de constructeur par deacutefautSupposons que nous remplacions le constructeur de la classe Forme par

public Forme(int nx int ny) Le nouveau constructeur de la x = nx classe Forme

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

195

y = ny couleur = 0

Dans cette situation lors de la construction de lrsquoobjet A le compilateur recherche leconstructeur par deacutefaut de la classe supeacuterieure soit Forme() sans paramegravetre Ne le trou-vant pas il annonce une erreur du type no constructor matching Forme() found inclass Forme

Le mot-cleacute super

Pour eacuteviter ce type drsquoerreur la solution consiste agrave appeler directement le constructeur dela classe megravere depuis le constructeur de la classe

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) Systemoutprint( Rayon ) r = rayonVeacuterifieacute()

De cette faccedilon comme le terme super() qui repreacutesente le constructeur de la classesupeacuterieure possegravedant deux entiers en paramegravetres lrsquointerpreacuteteur peut finalement cons-truire lrsquoobjet A (Cercle A = new Cercle(5 5)) par appel du constructeur de la classeForme agrave lrsquointeacuterieur du constructeur de la classe Cercle

Remarquons que le terme super est obligatoirement la premiegravere instruction du construc-teur de la classe deacuteriveacutee La liste des paramegravetres (deux int) permet de preacuteciser au compi-lateur quel est le constructeur utiliseacute en cas de surcharge de constructeurs

La protection des donneacutees heacuteriteacuteesEn heacuteritant de la classe A la classe B heacuterite des donneacutees et meacutethodes de la classe A Celane veut pas forceacutement dire que la classe B ait accegraves agrave toutes les donneacutees et meacutethodes dela classe A En effet heacuteritage nrsquoest pas synonyme drsquoaccessibiliteacute

Lorsqursquoune donneacutee de la classe supeacuterieure est deacuteclareacutee en mode private la classedeacuteriveacutee ne peut ni consulter ni modifier directement cette donneacutee heacuteriteacutee Lrsquoaccegraves ne peutse reacutealiser qursquoau travers des meacutethodes de la classe supeacuterieure

Pour notre exemple la donneacutee couleur eacutetant deacuteclareacutee private dans la classe Forme leconstructeur suivant geacutenegravere lrsquoerreur variable couleur in class Forme not acces-sible from class Cercle

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) couleur = 20 r = 10

Il est possible gracircce agrave la protection protected drsquoautoriser lrsquoaccegraves en consultation etmodification des donneacutees de la classe supeacuterieure Toutes les donneacutees de la classe A sontalors accessibles depuis la classe B mais pas depuis une autre classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

196

Dans notre exemple si la donneacutee couleur est deacuteclareacutee protected dans la classe Formealors le constructeur de la classe Cercle peut modifier sa valeur

Le polymorphismeLa notion de polymorphisme deacutecoule directement de lrsquoheacuteritage Par polymorphisme ilfaut comprendre qursquoune meacutethode peut se comporter diffeacuteremment suivant lrsquoobjet surlequel elle est appliqueacutee

Lorsqursquoune mecircme meacutethode est deacutefinie agrave la fois dans la classe megravere et dans la classe fillelrsquoexeacutecution de la forme (meacutethode) choisie est reacutealiseacutee en fonction de lrsquoobjet associeacute agravelrsquoappel et non plus suivant le nombre et le type des paramegravetres comme crsquoest le cas lorsde la surcharge de meacutethodes agrave lrsquointeacuterieur drsquoune mecircme classe

Pour notre exemple la meacutethode afficher() est deacutecrite dans la classe Forme et dans laclasse Cercle Cette double deacutefinition ne correspond pas agrave une veacuteritable surcharge defonctions Ici les deux meacutethodes afficher() sont deacutefinies sans aucun paramegravetre Lechoix de la meacutethode ne peut donc srsquoeffectuer sur la diffeacuterence des paramegravetres Il esteffectueacute par rapport agrave lrsquoobjet sur lequel la meacutethode est appliqueacutee Observons lrsquoexeacutecutiondu programme suivant

public class FormerDesCercles public static void main(String [] arg) Cercle A = new Cercle(5 5) Aafficher() Forme F = new Forme (10 10 3) Fafficher()

Lrsquoappel du constructeur de lrsquoobjet A nous demande de saisir la valeur du rayon

Rayon 7

La meacutethode afficher() est appliqueacutee agrave A Puisque A est de type Cercle lrsquoaffichagecorrespond agrave celui reacutealiseacute par la meacutethode deacutefinie dans la classe Cercle soit

Position en 5 5Couleur 20Rayon 7

La forme F est ensuite creacuteeacutee puis afficheacutee agrave lrsquoaide la meacutethode afficher() de la classeForme F eacutetant de type Forme

Position en 10 1Couleur 3

Remarquons que lorsqursquoune meacutethode heacuteriteacutee est deacutefinie une deuxiegraveme fois dans laclasse deacuteriveacutee lrsquoheacuteritage est supprimeacute Le fait drsquoeacutecrire Aafficher() ne permet plusdrsquoappeler directement la meacutethode afficher() de la classe Forme

Pour appeler la meacutethode deacutefinie dans la classe supeacuterieure la solution consiste agrave utiliserle terme super qui recherche la meacutethode agrave exeacutecuter en remontant dans la hieacuterarchie

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

197

Dans notre exemple superafficher() permet drsquoappeler la meacutethode afficher() de laclasse Forme

Gracircce agrave cette technique si la meacutethode drsquoaffichage pour une Forme est transformeacutee cettetransformation est automatiquement reacutepercuteacutee pour un Cercle

ReacutesumeacuteLorsque lrsquointerpreacuteteur Java rencontre le mot-cleacute static devant une variable (variablede classe) il reacuteserve un seul et unique emplacement meacutemoire pour cette variable Si cemot-cleacute est absent lrsquointerpreacuteteur peut construire en meacutemoire la variable deacuteclareacutee nonstatic (variable drsquoinstance) en plusieurs exemplaires Cette preacutesence ou cetteabsence du mot-cleacute static permet de diffeacuterencier les variables des objets

Les objets sont deacutefinis en meacutemoire par lrsquointermeacutediaire drsquoune adresse (reacutefeacuterence)Lorsqursquoun objet est passeacute en paramegravetre drsquoune fonction la valeur passeacutee au paramegravetreformel est lrsquoadresse de lrsquoobjet De cette faccedilon si la meacutethode transforme les donneacutees duparamegravetre formel elle modifie aussi les donneacutees de lrsquoobjet effectivement passeacute en para-megravetre Ainsi tout objet passeacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethodeses donneacutees transformeacutees par la meacutethode Ce mode de transmission des donneacutees estappeleacute passage de paramegravetres par reacutefeacuterence

Lrsquoobjectif principal de la programmation objet est drsquoeacutecrire des programmes quicontrocirclent par eux-mecircmes le bien-fondeacute des opeacuterations qui leur sont appliqueacutees Cecontrocircle est reacutealiseacute gracircce au principe drsquoencapsulation des donneacutees Par ce terme ilfaut comprendre que les donneacutees drsquoun objet sont proteacutegeacutees de la mecircme faccedilon qursquounmeacutedicament est proteacutegeacute par la fine capsule qui lrsquoentoure Lrsquoencapsulation passe parle controcircle des donneacutees et des comportements de lrsquoobjet agrave travers les niveaux deprotection lrsquoaccegraves controcircleacute aux donneacutees et la notion de constructeur de classe

Le langage Java propose trois niveaux de protection public private et protectedLorsqursquoune donneacutee est totalement proteacutegeacutee (private) elle ne peut ecirctre modifieacutee quepar les meacutethodes de la classe ougrave la donneacutee est deacutefinie

On distingue les meacutethodes qui consultent la valeur drsquoune donneacutee sans pouvoir lamodifier (accesseur en consultation) et celles qui modifient apregraves controcircle et vali-dation la valeur de la donneacutee (accesseur en modification)

Les constructeurs sont des meacutethodes particuliegraveres deacuteclareacutees uniquement public quiportent le mecircme nom que la classe ougrave ils sont deacutefinis Ils permettent le controcircle et lavalidation des donneacutees degraves leur initialisation

Par deacutefaut si aucun constructeur nrsquoest deacutefini dans une classe le langage Javapropose un constructeur par deacutefaut qui initialise toutes les donneacutees de la classe agrave 0ou agrave null si les donneacutees sont des objets Si un constructeur est deacutefini le construc-teur par deacutefaut nrsquoexiste plus

Lrsquoheacuteritage permet la reacuteutilisation des objets et de leur comportement tout en apportantde leacutegegraveres variations Il se traduit par le principe suivant on dit qursquoune classe B heacuteritedrsquoune classe A (B eacutetant une sous-classe de A) lorsqursquoil est possible de mettre la relationlaquo est un raquo entre B et A

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

198

Le projet laquo Gestion drsquoun compte bancaire raquoEncapsuler les donneacutees drsquoun compte bancaireLa protection priveacutee et lrsquoaccegraves aux donneacutees

a Deacuteclarez toutes les variables drsquoinstance des types Compte et LigneComptable enmode private Que se passe-t-il lors de la phase de compilation de lrsquoapplicationProjet

Pour remeacutedier agrave cette situation la solution est de construire des meacutethodes drsquoaccegraves auxdonneacutees de la classe Compte et LigneComptable Ces meacutethodes ont pour objectif defournir au programme appelant la valeur de la donneacutee rechercheacutee Par exemple lafonction quelTypeDeCompte() suivante fournit en retour le type du compte rechercheacute

public String quelTypeDeCompte() return typeCpte

b Eacutecrivez suivant le mecircme modegravele toutes les meacutethodes drsquoaccegraves aux donneacuteesval_courante taux numeacuteroCpte etc

c Modifiez lrsquoapplication Projet et la classe Compte de faccedilon agrave pouvoir acceacuteder auxdonneacutees numeacuteroCpte de la classe Compte et aux valeurs de la classe LigneComptable

Le controcircle des donneacutees

Lrsquoencapsulation des donneacutees permet le controcircle de la validiteacute des donneacutees saisies pour unobjet Un compte bancaire ne peut ecirctre que de trois types Epargne Courant ou JointIl est donc neacutecessaire au moment de la saisie du type du compte de controcircler lrsquoexacti-tude du type entreacute La meacutethode controcircleType() suivante reacutealise ce controcircle

private String controcircleType() char tmpc String tmpS = Courant do Systemoutprint(Type du compte [Types possibles C(ourant) ) Systemoutprint(J(oint) E(pargne)] ) tmpc = Lirec() while ( tmpc = rsquoCrsquo ampamp tmpc = rsquoJrsquo ampamp tmpc = rsquoErsquo) switch (tmpc) case rsquoCrsquo tmpS = Courant break

De cette faccedilon toutes les meacutethodes ainsi que les donneacutees deacuteclareacutees public ouprotected de la classe A sont applicables agrave la classe B La syntaxe de deacuteclaration drsquounesous-classe est la suivante

class B extends A donneacutees et meacutethodes de la classe B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

199

case rsquoJrsquo tmpS = Joint break case rsquoErsquo tmpS = Epargne break return tmpS

Agrave la sortie de la fonction nous sommes certains que le type retourneacute correspond auxtypes autoriseacutes par le cahier des charges

a Dans la classe Compte sachant que la valeur initiale ne peut ecirctre neacutegative agrave la creacutea-tion drsquoun compte eacutecrivez la meacutethode controcircleValinit()

b Dans la classe LigneComptable eacutecrivez les meacutethodes controcircleMotif() et controcirc-leMode() qui veacuterifient respectivement le motif (Salaire Loyer AlimentationDivers) et le mode (CB Virement Chegraveque) de paiement pour une ligne comptable

Pour controcircler la validiteacute de la date voir la section laquo Le projethellip raquo du chapitre 10 laquo Collectionner unnombre indeacutetermineacute drsquoobjets raquo

c Modifiez les meacutethodes creacuteerCpte() et creacuteerLigneComptable() de faccedilon que lesdonneacutees des classes Compte() et LigneComptable() soient valides

Les constructeurs de classe

Les constructeurs Compte() et LigneComptable() srsquoinspirent pour une grande part desmeacutethodes creacuteerCpte() et creacuteerLigneComptable()

a Remplacez directement creacuteerCpte() par Compte() Que se passe-t-il lors delrsquoexeacutecution du programme

b Deacuteplacez lrsquoappel au constructeur dans lrsquooption 1 de faccedilon agrave construire lrsquoobjet aumoment de sa creacuteation Que se passe-t-il en phase de compilation Pourquoi

c Utilisez la notion de surcharge de constructeur pour construire un objet C de deuxfaccedilons

bull Les valeurs initiales du compte sont passeacutees en paramegravetre

bull Les valeurs initiales sont saisies au clavier comme le fait la meacutethode creacuteerCpte()

d Agrave lrsquoaide de ces deux constructeurs modifiez lrsquoapplication Projet de faccedilon agrave pouvoirlrsquoexeacutecuter correctement

Comprendre lrsquoheacuteritageProtection des donneacutees heacuteriteacutees

Sachant qursquoun compte drsquoeacutepargne est un compte bancaire ayant un taux de reacutemuneacuteration

a Eacutecrivez la classe CpteEpargne en prenant soin de deacuteclarer la nouvelle donneacutee enmode private

b Modifiez le type Compte de faccedilon agrave supprimer tout ce qui fait appel au comptedrsquoeacutepargne (donneacutee et meacutethodes)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

200

Un compte drsquoeacutepargne modifie la valeur courante par le calcul des inteacuterecircts en fonc-tion du taux drsquoeacutepargne Il ne peut ni modifier son numeacutero ni son type

c Quels modes de protection doit-on appliquer aux diffeacuterentes donneacutees heacuteriteacutees de laclasse Compte

Le controcircle des donneacutees drsquoun compte drsquoeacutepargneSachant que le taux drsquoun compte drsquoeacutepargne ne peut ecirctre neacutegatif eacutecrivez la meacutethodecontrocircleTaux()

Le constructeur drsquoune classe deacuteriveacuteeEn supposant que le constructeur de la classe CpteEpargne srsquoeacutecrive de la faccedilon suivante

public CpteEpargne() super(Epargne) taux = controcircleTaux()

a Recherchez agrave quel constructeur de la classe Compte fait appel CpteEpargne() Pour-quoi

b Modifiez ce constructeur de faccedilon que la donneacutee typeCpte prenne la valeur Epargne

Le polymorphisme De la meacutethode afficherCpte()

a Dans la classe CpteEpargne eacutecrivez la meacutethode afficherCpte() sachant qursquoaffi-cher les donneacutees drsquoun compte drsquoeacutepargne revient agrave afficher les donneacutees drsquoun comptesuivi du taux drsquoeacutepargne

De lrsquoobjet C deacuteclareacute de type Compte

b Dans lrsquoapplication Projet modifiez lrsquooption 1 de faccedilon agrave demander agrave lrsquoutilisateursrsquoil souhaite creacuteer un compte simple ou un compte drsquoeacutepargne Selon la reacuteponseconstruisez lrsquoobjet C en appelant le constructeur approprieacute

copy copyright Eacuteditions Eyrolles

PARTIE 3

Les outils et techniques orienteacutes objet

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

CHAPITRE 11

Dessiner des objets 259

copy copyright Eacuteditions Eyrolles

9Collectionner

un nombre fixe drsquoobjets

Comme nous lrsquoavons observeacute tout au long de cet ouvrage lrsquoatout principal de lrsquoordina-teur est sa capaciteacute agrave manipuler un grand nombre de donneacutees pour en extraire denouvelles informations Or les structures de stockage eacutetudieacutees jusqursquoici telles que varia-bles ou objets ne permettent pas drsquoappliquer de traitements systeacutematiques sur desensembles de valeurs

Crsquoest pourquoi nous eacutetudions dans ce chapitre une nouvelle structure de donneacutees lestableaux qui permettent le stockage drsquoun nombre fini de valeurs

Dans un premier temps nous eacutetudions laquo Les tableaux agrave une dimension raquo et observonscomment les deacuteclarer et les manipuler Pour mieux comprendre la manipulation de cesstructures nous analysons ensuite agrave la section laquo Quelques techniques utiles raquo diffeacute-rentes techniques de programmation appliqueacutees aux tableaux agrave une dimension telles quela recherche drsquoune valeur dans un tableau ou le tri drsquoun tableau

Pour finir nous examinons agrave la section laquo Les tableaux agrave deux dimensions raquo commentconstruire et manipuler des tableaux bidimensionnels agrave travers un exemple drsquoaffichagede formes geacuteomeacutetriques

Les tableaux agrave une dimensionLrsquoeacutetude du chapitre 1 laquo Stocker une information raquo montre que pour manipuler plusieursvaleurs agrave lrsquointeacuterieur drsquoun programme vous devez deacuteclarer autant de variables que devaleurs agrave traiter Ainsi pour stoker les huit notes drsquoun eacutelegraveve donneacute la technique consisteagrave deacuteclarer huit variables comme suit

double note1 note2 note3 note4 note5 note6 note7 note8 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

204

Le fait de deacuteclarer autant de variables qursquoil y a de valeurs preacutesente les inconveacutenientssuivants

bull Si le nombre de notes est modifieacute il est neacutecessaire de

ndash Deacuteclarer de nouvelles variables

ndash Placer ces variables dans le programme afin de les traiter en plus des autres notes

ndash Compiler agrave nouveau le programme pour que lrsquointerpreacuteteur puisse prendre encompte ces modifications

bull Il faut trouver un nom de variable pour chaque valeur traiteacutee Imaginez deacuteclarer1 000 variables portant un nom diffeacuterent

Ces inconveacutenients majeurs sont reacutesolus gracircce aux tableaux En effet les tableaux sontdes structures de donneacutees qui regroupent sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Les tableaux sont proposeacutes par tous les langages deprogrammation Ils sont construits par assemblage drsquoune suite finie de cases meacutemoirecomme illustreacute agrave la Figure 9-1

Chaque case repreacutesente lrsquoespace meacutemoire neacutecessaire au stockage drsquoune et une seulevaleur Remarquez que les cases sont reacuteserveacutees en meacutemoire de faccedilon contigueuml

Deacuteclarer un tableauComme toute variable utiliseacutee dans un programme un tableau doit ecirctre deacuteclareacute afin de

bull donner un nom agrave lrsquoensemble des valeurs agrave regrouper

bull deacutefinir la taille du tableau de faccedilon agrave preacuteciser le nombre de valeurs agrave regrouper

bull deacuteterminer le type de valeur agrave meacutemoriser

La syntaxe de deacuteclaration drsquoun tableau est la suivante

TypeDuTableau [] nomDuTableau nomDuTableau = new TypeDuTableau [tailleDuTableau]

En placcedilant dans la premiegravere instruction les crochets [] entre le type et le nom de la variablevous indiquez au compilateur que la variable nomDuTableau repreacutesente un tableau Agrave cetteeacutetape le compilateur reacuteserve un espace meacutemoire portant le nom du tableau Cet espacemeacutemoire est susceptible de contenir lrsquoadresse de la premiegravere case du tableau

Ensuite dans la seconde instruction lrsquoopeacuterateur new reacuteserve autant de cases meacutemoireconseacutecutives qursquoil est indiqueacute entre les [] situeacutes en fin drsquoinstruction soit tailleDuTableau

Figure 9-1

Lrsquoopeacuterateur new reacuteserve le nombre de cases meacutemoire demandeacute ([8]) et meacutemorise lrsquoadresse de la premiegravere case meacutemoire dans la variable notes gracircce au signe drsquoaffectation

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

205

Lrsquoopeacuterateur new deacutetermine enfin lrsquoadresse de la premiegravere case du tableau et la stockegracircce au signe drsquoaffectation dans la case nomDuTableau creacuteeacutee agrave lrsquoeacutetape preacuteceacutedente

Exemple Deacuteclarer un tableau de huit notes

double [] notes notes = new double[8]

Ces deux instructions reacutealisent la deacuteclaration drsquoun tableau ayant pour nom note Il estcomposeacute de 8 cases meacutemoire pouvant stocker des valeurs de type double (voir Figure 9-1)

Autres exemples de deacuteclaration

deacuteclarer un tableau de 5 entiersint [] valeur valeur = new int[5] deacuteclarer un tableau de 30 reacuteels de simple preacutecision float [] reel reel = new float[30] deacuteclarer un tableau de 80 caractegravereschar [] mot mot = new char[80]

Remarques

bull Le nombre de cases reacuteserveacutees correspond au nombre maximal de valeurs agrave traiterLorsque la taille du tableau est fixeacutee apregraves exeacutecution de lrsquoopeacuterateur new il nrsquoest pluspossible de la modifier en cours drsquoexeacutecution du programme

Cependant il est possible de ne pas fixer deacutefinitivement la taille du tableau avantcompilation en placcedilant une variable entre les [] au lieu drsquoune valeur numeacuterique Eneffet il suffit drsquoeacutecrire

double [] notesint nbNotes Systemoutprintln(Combien voulez-vous saisir de notes ) nbNotes = Lirei() notes = new double[nbNotes]

De cette faccedilon lrsquoutilisateur saisit le nombre de valeurs qursquoil souhaite traiter avant lareacuteservation effective des espaces meacutemoire par lrsquoopeacuterateur new Le programme peutdonc voir la taille du tableau varier drsquoune exeacutecution agrave lrsquoautre

bull Les tableaux sont des objets En effet les tableaux sont deacutefinis agrave lrsquoaide drsquoune adressedeacutetermineacutee par lrsquoopeacuterateur new Les tableaux sont donc des objets au mecircme titre queles String et autres objets deacutefinis aux chapitres preacuteceacutedents

Les objets sont caracteacuteriseacutes par leurs donneacutees et les meacutethodes qui leur sont applica-bles Une donneacutee caracteacuteristique des tableaux est leur taille crsquoest-agrave-dire le nombre decases Ainsi pour connaicirctre la taille drsquoun tableau il suffit de placer le terme lengthderriegravere le nom du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

206

Par exemple lrsquoinstruction suivante

Systemoutprint(Nombre de notes = + noteslength)

affiche agrave lrsquoeacutecran Nombre de notes = 8

bull Lrsquoinstruction de deacuteclaration

double [] notes = new double[8]

est eacutequivalente agrave la suite drsquoinstructions

double [] notes notes = new double[8]

Manipuler un tableauUn tableau est un ensemble de cases meacutemoire Chaque case constituant un eacuteleacutement dutableau est identique agrave une variable Il est possible de manipuler chaque case du tableaude faccedilon agrave

bull placer une valeur dans une case du tableau agrave lrsquoaide de lrsquoaffectation

bull utiliser un eacuteleacutement du tableau dans le calcul drsquoune expression matheacutematique

bull afficher un eacuteleacutement du tableau

Acceacuteder aux eacuteleacutements drsquoun tableau

Sachant que nomDuTableau[0] repreacutesente la premiegravere case du tableau lrsquoaccegraves agrave la niegravemecase srsquoeacutecrit nomDuTableau[n]

Par exemple lrsquoinstruction

note[0] = 10

meacutemorise la premiegravere note drsquoun eacutetudiant dans la premiegravere case du tableau (notes[0])De la mecircme faccedilon la deuxiegraveme note est stockeacutee gracircce agrave lrsquoaffectation

note[1] = 5

Et ainsi de suite jusqursquoagrave stoker la huitiegraveme et derniegravere note agrave lrsquoaide de lrsquoinstruction

note[7] = 9

Figure 9-2

Note est le nom du tableau et les notes 10 5 hellip 9 sont des valeurs placeacutees agrave lrsquoaide du signe drsquoaffectation dans les cases numeacuteroteacutees respectivement 0 1 hellip 7 (indices)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

207

Les valeurs placeacutees entre les crochets [] sont appeleacutees les indices du tableau Remar-quez que la premiegravere case du tableau est numeacuteroteacutee agrave partir de 0 et non de 1 (voirFigure 9-2) Lrsquoindice du tableau varie donc entre 0 et length-1 Les eacuteleacutements drsquountableau eacutetant ordonneacutes gracircce aux indices il est possible drsquoy acceacuteder agrave lrsquoaide de construc-tions iteacuteratives (boucle for) comme le montre lrsquoexemple suivant

Exemple Extrait drsquoun programme

Systemoutprint(Combien de notes voulez-vous saisir )int nombre = Lirei()notes = new double [nombre]for (int i = 0 i lt noteslength i++) Systemoutprint(Entrer la note ndeg + (i + 1)+ ) notes[i] = Lired()

Exemple Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Combien de notes voulez-vous saisir 44Entrer la note ndeg 1 1144Entrer la note ndeg 2 1100Entrer la note ndeg 3 1122Entrer la note ndeg 4 88

Une fois le nombre de notes deacutetermineacute gracircce aux deux premiegraveres instructions leprogramme entre dans une boucle for La variable i correspond au compteur de boucleElle varie entre 0 et noteslength-1 (soit 3) puisque la condition de continuationpreacutecise que i doit ecirctre strictement infeacuterieure agrave noteslength (soit 4)

Agrave chaque tour de boucle la variable i prend la valeur de lrsquoindice du tableau (notes[i])Les valeurs saisies au clavier sont alors placeacutees une agrave une dans chaque case du tableau

Parce qursquoil nrsquoest pas courant de compter des valeurs agrave partir de 0 lrsquoaffichage demandantdrsquoentrer une note deacutebute agrave 1 et non agrave 0 gracircce agrave lrsquoexpression (i+1) placeacutee dans lameacutethode Systemoutprint() Il ne srsquoagit lagrave que drsquoun artifice de preacutesentation lapremiegravere note eacutetant stockeacutee en reacutealiteacute en note[0]

Remarquez que lrsquoutilisation de la donneacutee length permet drsquoeacuteviter tout problegraveme dedeacutepassement de taille En effet si un tableau est composeacute de quatre cases il nrsquoest paspossible de placer une valeur agrave lrsquoindice 4 ou 5 Le fait drsquoeacutecrire notes[4] geacutenegravere uneerreur drsquoexeacutecution du type javalangArrayIndexOutOfBoundsException qui montreque lrsquointerpreacuteteur Java a deacutetecteacute que lrsquoindice du tableau eacutetait en dehors des limites deacutefi-nies au moment de sa creacuteation

Initialiser un tableau

Lors de la deacuteclaration drsquoun tableau il est possible de lrsquoinitialiser directement de la faccedilonsuivante

double [] notes = 10 125 5 85 16 0 13 7 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

208

Les cases meacutemoire sont reacuteserveacutees et initialiseacutees dans lrsquoordre agrave lrsquoaide des valeurs placeacuteesentre les et seacutepareacutees par des virgules De cette faccedilon le tableau notes contient lesvaleurs suivantes

notes[0] vaut 10 notes[4] vaut 16

notes[1] vaut 125 notes[5] vaut 0

notes[2] vaut 5 notes[6] vaut 13

notes[3] vaut 85 notes[7] vaut 7

Remarquez que la donneacutee noteslength prend automatiquement la valeur 8

Les tableaux et les opeacuterations arithmeacutetiques

La somme la soustraction la division ou la multiplication directes de deux tableaux sontdes opeacuterations impossibles En effet chaque opeacuteration doit ecirctre reacutealiseacutee eacuteleacutement pareacuteleacutement comme le montre le tableau suivant

Quelques techniques utilesLe stockage et lrsquoutilisation des donneacutees agrave travers la structure des tableaux offrent denombreux avantages Elles requiegraverent aussi certaines techniques de manipulation quisont deacuteveloppeacutees ci-apregraves

La ligne de commandeAu cours du chapitre laquo Naissance drsquoun programme raquo vous avez ducirc admettre un certainnombre de termes du langage Java et en particulier la syntaxe de lrsquoinstruction suivante

public static void main(String [] argument)

Cette instruction correspond agrave la deacutefinition de lrsquoen-tecircte de la fonction main() Vous ecirctesen mesure maintenant de deacutechiffrer chacun de ses termes pour en comprendre lrsquoutiliteacute

bull Le mot cleacute public preacutecise au compilateur que la fonction main() est accessible depuislrsquoexteacuterieur de la classe ougrave elle est deacutefinie En particulier lrsquointerpreacuteteur Java peut yacceacuteder pour lrsquoexeacutecuter

bull Le terme static explique que la fonction main() ne peut pas ecirctre copieacutee plusieurs foisen meacutemoire Elle ne peut pas ecirctre associeacutee agrave un objet ni ecirctre instancieacutee crsquoest-agrave-direqursquoil nrsquoest pas possible drsquoeacutecrire unObjetmain()

bull La fonction main() ne fournit pas de reacutesultat et crsquoest pourquoi elle est deacutefinie commevoid

Correcte Impossible

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]for (i = 0 i lt 10 i++)somme[i] = tab1[i] + tab2[i]

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]

somme = tab1 + tab2

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

209

bull Pour finir elle possegravede entre () un paramegravetre deacutefini comme tableau de type StringCe paramegravetre est utiliseacute pour passer des donneacutees en ligne de commande lors dulancement de la commande drsquoexeacutecution du programme

Qursquoest-ce qursquoune ligne de commande

Une ligne de commande est eacutecrite au clavier sous la forme drsquoune instruction preacutecise Crsquoestun ordre transmis agrave lrsquoordinateur par lrsquoutilisateur Sous Unix les commandes sont tregraves utili-seacutees Elles le sont beaucoup moins sous Windows et sont inexistantes sous Mac OS Crsquoestpourquoi les utilisateurs de stations de travail Unix nrsquoont aucune difficulteacute agrave comprendrece qursquoest une commande ce qui nrsquoest pas le cas des utilisateurs de PC (sous Windows) oude Macintosh

Aujourdrsquohui gracircce aux eacutecrans graphiques lrsquoutilisateur communique facilement aveclrsquoordinateur Pour savoir ce que contient un dossier il lui suffit drsquoouvrir la fenecirctre asso-cieacutee agrave ce dossier Les ordres passeacutes agrave lrsquoordinateur sont essentiellement des ordres geacuteneacutereacutespar la souris au travers de fenecirctres graphiques

Les lignes de commande sont eacutequivalentes bien que moins conviviales agrave cette commu-nication graphique Elles permettent surtout drsquoobtenir des reacutesultats plus preacutecis Ainsi lescommandes

bull ls java dans une fenecirctre de commandes Unix

bull dir java dans une fenecirctre laquo commandes MSDOS raquo

ont pour reacutesultat drsquoafficher tous les noms de fichiers finissant par java contenus dans lereacutepertoire courant

Plus preacuteciseacutement remarquez qursquoune commande srsquoeacutecrit toujours de la faccedilon suivante

nomDeLaCommande paramegravetresEventuels

Le nom drsquoune commande correspond au nom du programme qui reacutealise lrsquoactionsouhaiteacutee Les paramegravetres sont utiliseacutes pour affiner son reacutesultat Dans notre exemplejava est un paramegravetre des commandes ls ou dir qui permet drsquoexpliquer agrave lrsquoordina-teur que vous souhaitez voir srsquoafficher uniquement les noms de fichiers finissant parjava

Passer des paramegravetres agrave un programme Java

De la mecircme faccedilon comme expliqueacute agrave la section laquo Exeacutecuter un programme raquo duchapitre introductif laquo Naissance drsquoun programme raquo lrsquoexeacutecution drsquoun programme Java endehors drsquoun environnement de travail passe aussi par une commande dont la syntaxe est

java nomdelrsquoapplication

Lrsquointerpreacuteteur Java autorise aussi la commande

java nomdelrsquoapplication p0 p1 p2hellip pN

Dans ce cas les valeurs p0 p1 p2 hellip pN toutes seacutepareacutees par des espaces sont consideacute-reacutees comme paramegravetres de la commande java nomdelrsquoapplication Ces derniers sonttransmis agrave la fonction main() par lrsquointermeacutediaire du tableau de String deacutefini en para-megravetre de la fonction

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

210

Si lrsquoen-tecircte est de la forme

public static void main(String [] argument)

le paramegravetre p0 est stockeacute en argument[0] p1 en argument[1] hellip et pN en argument[N]Les valeurs ainsi passeacutees sont meacutemoriseacutees sous forme de chaicircnes de caractegraveres

Exemple Une commande qui calcule

Pour mieux comprendre cette transmission de valeurs reprenons le corrigeacute de lrsquoexer-cice 3 du Chapitre 6 laquo Fonctions notions avanceacutees raquo qui simule une calculette Trans-formons ce programme de sorte qursquoil puisse effectuer lrsquoopeacuteration agrave partir de valeurspasseacutees en paramegravetres lors de la commande drsquoexeacutecution du programme Supposons quecette commande srsquoeacutecrive

java Calculette 1 + 2

Lrsquoordre des paramegravetres ainsi passeacutes est important En effet nous devons traiter les para-megravetres de la fonction main() de la faccedilon suivante

bull Les premier et troisiegraveme paramegravetres doivent ecirctre interpreacuteteacutes comme eacutetant les valeursnumeacuteriques de lrsquoopeacuteration agrave calculer

bull Le deuxiegraveme paramegravetre doit correspondre agrave lrsquoopeacuterateur

Sachant cela le programme srsquoeacutecrit de la faccedilon suivante

Exemple Le code source

public class Calculette public static void main(String [] argument) int a b char opeacuterateur double calcul if (argumentlength gt 0) a = IntegerparseInt(argument[0]) opeacuterateur = argument[1]charAt(0) b = IntegerparseInt(argument[2]) else opeacuterateur = menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calcul = calculer(a b opeacuterateur ) afficher(a b opeacuterateur calcul) public static double calculer (int x int y char o) voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

public static void afficher(int x int y char o double r) copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

211

voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees public static char menu() voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

Pour traiter les paramegravetres passeacutes en ligne de commande il est neacutecessaire de deacutetecter sides paramegravetres ont eacuteteacute effectivement passeacutes Pour ce faire lrsquoideacutee est de regarder la tailledu tableau argument de la faccedilon suivante

bull Si celle-ci nrsquoest pas nulle (supeacuterieure strictement agrave 0) cela signifie que le tableaucontient des paramegravetres passeacutes en ligne de commande Dans ce cas nous traitonschacun des arguments de sorte que le calcul puisse ecirctre effectueacute

Les eacuteleacutements argument[0] et argument[2] contiennent par hypothegravese les deux valeursnumeacuteriques Or celles-ci sont stockeacutees sous forme de suites de caractegraveres le tableauargument eacutetant de type String Les valeurs doivent donc ecirctre laquo traduites raquo en formatnumeacuterique Comme nous souhaitons obtenir des valeurs entiegraveres la meacutethode proposeacuteepar le langage Java a pour nom IntegerparseInt() Ainsi les instructions

a = IntegerparseInt(argument[0])b = IntegerparseInt(argument[2])

permettent la traduction de la suite de caractegraveres contenue dans argument[0] et argu-ment[2] en valeurs numeacuteriques et de placer ces valeurs dans les variables a et b deacutecla-reacutees de type int Compte tenu des paramegravetres passeacutes en ligne de commande lesvariables a et b ont donc pour valeurs respectives 1 et 2

Le caractegravere correspondant agrave lrsquoopeacuterateur est stockeacute dans argument[1] Nous devonsle transformer en char puisqursquoun opeacuterateur est formeacute drsquoun seul caractegravere Cette trans-formation est reacutealiseacutee par une meacutethode de la classe String appeleacutee charAt() quiretourne le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Ainsi lrsquoinstruction

opeacuterateur = argument[1]charAt(0)

place dans la variable opeacuterateur le premier caractegravere du mot stockeacute dans argument[1]soit pour notre exemple le caractegravere +

bull Si la taille du tableau argument est nulle cela signifie qursquoaucun paramegravetre nrsquoa eacuteteacutetransmis Le bloc else est exeacutecuteacute et les valeurs sont saisies au clavier comme celaeacutetait le cas en fin de correction de lrsquoexercice 3 du Chapitre 6

Pour finir lorsque les valeurs choisies sont placeacutees dans les variables a b et opeacuterateuragrave lrsquoaide des paramegravetres ou du clavier le calcul de lrsquoopeacuteration est reacutealiseacute et le reacutesultat estafficheacute Dans lrsquoexemple vous obtenez

java Calculette 1 + 21 + 2 = 3

Preacutecisons en outre que cette commande doit ecirctre obligatoirement lanceacutee dans le reacuteper-toire ougrave se trouve le fichier Calculetteclass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

212

Trier un ensemble de donneacutees Lrsquoatout principal de lrsquoordinateur est sa faculteacute agrave traiter un tregraves grand nombre de donneacuteesen des temps tregraves rapides Ces traitements sont par exemple la recherche drsquoeacuteleacutementsdans un ensemble en suivant des contraintes choisies par lrsquoutilisateur ou encore le tridrsquoeacuteleacutements en fonction drsquoun critegravere deacutetermineacute

Pour comprendre le fonctionnement interne de ces traitements nous eacutetudions ici lrsquoalgo-rithme du laquo tri par extraction simple raquo qui utilise les techniques de recherche drsquouneacuteleacutement dans un ensemble de donneacutees drsquoeacutechange de valeurs et de tri

Cahier des charges

Lrsquoobjectif du programme est de reacutealiser le classement par moyenne drsquoune classedrsquoeacutetudiants Pour cela nous devons tout drsquoabord deacutefinir ce qursquoest un eacutetudiant (voir lasection laquo La classe Etudiant raquo) pour deacutecrire ensuite une classe drsquoeacutetudiants (voir lasection laquo La classe Classe raquo) Cela fait il devient possible de trier une classe drsquoeacutetudiantsselon leur moyenne (voir la section laquo La meacutethode du tri par extraction simple raquo)

La classe Etudiant

Un eacutetudiant est deacutefini par son nom (String) son preacutenom (String) un ensemble de notes(un tableau de double) et une moyenne (double) Ces caracteacuteristiques constituentlrsquoensemble des donneacutees du type Etudiant

Les comportements drsquoun eacutetudiant permettent lrsquoinitialisation et lrsquoaffichage de ses caracteacute-ristiques ainsi que le calcul de sa moyenne

Par conseacutequent nous deacutecrivons comme suit la classe Etudiant

public class Etudiant Les donneacutees caracteacuteristiques private String nom preacutenom private double [] notes moyenne

Les comportements public Etudiant() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() Systemoutprint(Entrer le preacutenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Combien de notes pour lrsquoetudiant ) Systemoutprint(preacutenom + + nom + ) int nombre = Lirei() notes = new double [nombre] for (int i = 0 i lt noteslength i ++) Systemoutprint(Entrer la note ndeg + (i + 1) + ) notes[i] = Lired() moyenne = calculMoyenne() private double calculMoyenne() double somme = 00 for(int i = 0 i lt noteslength i++) somme = somme + notes[i]

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

213

return sommenoteslength public void afficheUnEtudiant() Systemoutprint(Les notes de + preacutenom + + nom + sont ) for (int i = 0 i lt noteslength i++) Systemoutprint(

+notes[i]) Systemoutprintln() Systemoutprintln(Sa moyenne vaut + moyenne) public double quelleMoyenne() return moyenne Fin de class Etudiant

La classe Etudiant deacutefinit les quatre meacutethodes suivantes

bull Etudiant() Crsquoest le constructeur de la classe qui permet drsquoinitialiser lrsquoensemble desdonneacutees de la classe Etudiant en demandant la saisie au clavier des nom et preacutenom delrsquoeacutetudiant ainsi que de lrsquoensemble de ses notes Le nombre de notes peut varier drsquouneacutetudiant agrave un autre puisque la valeur nombre est saisie en cours drsquoexeacutecution

bull calculMoyenne() Une fois les donneacutees saisies le programme calcule la moyenne agravelrsquointeacuterieur du constructeur gracircce agrave la meacutethode calculMoyenne() Cette meacutethode estdeacuteclareacutee en private car pour des raisons de seacutecuriteacute ce calcul ne peut ecirctre reacutealiseacuteqursquoagrave lrsquointeacuterieur de la classe Etudiant

bull afficheUnEtudiant() Affiche agrave lrsquoeacutecran les caracteacuteristiques drsquoun eacutetudiant

bull quelleMoyenne() La donneacutee moyenne eacutetant proteacutegeacutee (private) la meacutethode quelle-Moyenne() permet lrsquoaccegraves en consultation depuis lrsquoexteacuterieur de la classe de la valeurmeacutemoriseacutee

La classe Classe

Une classe drsquoeacutetudiants est deacutefinie par un ensemble drsquoeacutetudiants crsquoest-agrave-dire un tableaudrsquoobjets Etudiant

Les comportements drsquoune classe permettent lrsquoinitialisation lrsquoaffichage de ses donneacuteesainsi que le classement des eacutetudiants dans lrsquoordre croissant des moyennes

La classe Classe est deacutecrite comme suit

public class Classe private Etudiant [] liste public Classe() Systemoutprint(Nombre drsquoetudiants ) int nbetudiants = Lirei() liste = new Etudiant[nbetudiants] for(int i = 0 i lt listelength i++) liste[i] = new Etudiant() public void afficheLesEtudiants() for (int i = 0 i lt listelength i++) liste[i]afficheUnEtudiant() Fin de class Classe

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

214

La donneacutee liste de la classe est un tableau drsquoobjets de type Etudiant Il srsquoagit donc lagravedrsquoun tableau particulier puisque chaque case du tableau ne correspond pas agrave une valeurnumeacuterique simple mais agrave lrsquoensemble des donneacutees caracteacuteristiques drsquoun eacutetudiant

En reacutealiteacute chaque case du tableau liste contient lrsquoadresse drsquoun objet de type Etudiantcomme illustreacute agrave la Figure 9-3 Cette opeacuteration est effectueacutee par le constructeurClasse()

Ce dernier reacutealise la creacuteation du tableau en deux eacutetapes Ainsi lrsquoinstruction

liste = new Etudiant[nbetudiants]

creacutee une case meacutemoire liste qui contient lrsquoadresse de la premiegravere case meacutemoire dutableau Ce tableau est de type Etudiant Il est donc destineacute agrave stocker les adresses desobjets de type Etudiant

Ensuite la boucle

for(int i = 0 i lt listelength i++) liste[i] = new Etudiant()

reacutealise en faisant appel au constructeur de la classe Etudiant la creacuteation en meacutemoiredes objets de type Etudiant ainsi que la saisie des informations relatives agrave chaqueeacutetudiant

Pour finir chaque adresse produite par lrsquoopeacuterateur new dans la boucle for est placeacutee danschacune des cases meacutemoire du tableau liste (liste[i])

La meacutethode afficheLesEtudiants() permet lrsquoaffichage des informations relatives auxeacutetudiants en faisant appel agrave la meacutethode afficheUnEtudiant() qui affiche les caracteacuteris-tiques drsquoun eacutetudiant agrave la fois

Figure 9-3

Le tableau Liste est un tableau drsquoobjets Chaque case du tableau meacutemorise lrsquoadresse drsquoun objet Etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

215

La meacutethode du tri par extraction simple

Gracircce aux classes Etudiant et Classe nous sommes en mesure de creacuteer un ensembledrsquoeacutetudiants posseacutedant chacun un nombre de notes et une moyenne Notre objectif eacutetantdrsquoafficher un classement des eacutetudiants par ordre croissant des moyennes examinonscomment trier lrsquoensemble des moyennes drsquoune classe

Lrsquoalgorithme du tri par extraction simple se deacutecrit de la faccedilon suivante (voir Figure 9-4)

bull Parcourir lrsquoensemble des moyennes de la classe afin de trouver la plus petite

bull Une fois trouveacutee eacutechanger cette valeur avec celle placeacutee au tout deacutebut du tableau defaccedilon agrave ecirctre sucircr que la moyenne la plus faible se trouve en deacutebut du tableau

bull Recommencer ce mecircme traitement sur lrsquoensemble des moyennes moins la premiegraverepuisqursquoelle vient drsquoecirctre traiteacutee

Deux eacutetapes sont neacutecessaire pour traduire cet algorithme en langage Java Elles sontdeacutecrites ci-apregraves aux sections laquo Recherche du plus petit eacuteleacutement dans une liste raquo etlaquo Echange de la plus petite valeur avec un eacuteleacutement de la liste raquo

Recherche du plus petit eacuteleacutement dans une liste

Pour trouver la plus petite valeur drsquoun ensemble de valeurs il suffit de comparer chaquevaleur de la liste avec celle tout drsquoabord situeacutee en deacutebut de liste puis avec une plus petitesi elle existe dans la liste Crsquoest ce que reacutealise la boucle suivante

int indiceDuMin = 0 for(int j = 1 j lt listelength j++) if (liste[j]quelleMoyenne() lt liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j

Ainsi chaque valeur du tableau (j variant de 1 agrave listelength) est compareacutee avec lapremiegravere valeur du tableau (indiceDuMin valant 0 en deacutebut de boucle) Si la comparaisonmontre que la valeur placeacutee agrave lrsquoindice j est plus petite que celle placeacutee en indiceDuMinalors lrsquoindice de cette plus petite valeur est stockeacutee dans la variable indiceDuMin Le testsuivant compare la valeur suivante avec la plus petite valeur qui vient drsquoecirctre deacutetecteacutee

Figure 9-4

a Parcours du tableau entier afin de deacuteterminer la plus petite valeur puis eacutechange de cette derniegravere avec la valeur stockeacutee en premiegravere position dans le tableau b Mecircme traitement agrave partir de la deuxiegraveme case du tableau c Mecircme traitement agrave partir de la troisiegraveme case du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

216

Gracircce agrave cette boucle la recherche de la plus petite valeur est reacutealiseacutee sur lrsquointeacutegraliteacute dutableau Or dans lrsquoalgorithme du tri preacutesenteacute ci-dessus cette recherche doit ecirctre reacutealiseacuteedans un premier temps sur lrsquointeacutegraliteacute de la liste puis agrave partir du deuxiegraveme eacuteleacutementensuite agrave partir du troisiegraveme eacuteleacutement etc

Cette boucle de recherche doit ecirctre placeacutee agrave lrsquointeacuterieur drsquoune meacutethode de faccedilon agravepouvoir ecirctre exeacutecuteacutee plusieurs fois chacune des exeacutecutions variant en fonction drsquounparamegravetre qui preacutecise lrsquoindice ougrave deacutebute la recherche La meacutethode ouEstLePlusPetit()preacutesenteacutee ci-dessous et agrave inseacuterer dans la classe Classe reacutealise cette recherche

private int ouEstLePlusPetit(int debut) int indiceDuMin = debut j for(j = debut+1 j lt listelength j++) if (liste[j]quelleMoyenne() lt

liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j return indiceDuMin

Lorsque le programme sort de la boucle for indiceDuMin repreacutesente lrsquoindice de la pluspetite moyenne dans le tableau liste Cette valeur est alors retourneacutee agrave la fonction appe-lante qui lrsquoutilise pour reacutealiser lrsquoeacutechange des valeurs

Notez que la meacutethode ouEstLePlusPetit() est deacuteclareacutee en mode private Cettemeacutethode nrsquoest pas un comportement caracteacuteristique drsquoune classe drsquoeacutetudiants mais untraitement interne destineacute agrave obtenir un classement de lrsquoensemble des eacutetudiants

Eacutechange de la plus petite valeur avec un eacuteleacutement de la liste

Connaissant lrsquoindice ougrave se trouve la plus petite moyenne nous devons eacutechanger cettevaleur avec celle correspondant au deacutebut de la recherche Ce traitement est reacutealiseacute surlrsquoensemble des eacutetudiants en faisant varier lrsquoindice du deacutebut de recherche de la premiegraverevaleur du tableau jusqursquoagrave la derniegravere La meacutethode classerParMoyenne() qui srsquoinsegraveredans la classe Classe reacutealise ces opeacuterations

public void classerParMoyenne() int indiceDuPlusPetit Etudiant tmp for(int i = 0 i lt listelength i ++) indiceDuPlusPetit = ouEstLePlusPetit(i) tmp = liste[i] liste[i] = liste[indiceDuPlusPetit] liste[indiceDuPlusPetit] = tmp

Gracircce agrave la boucle for le programme parcourt lrsquoensemble des eacutetudiants de la classeAinsi pour chaque eacutetudiant de la liste la boucle reacutealise

bull la recherche de la plus petite moyenne (ouEstLePlusPetit()) agrave partir de lrsquoindice icorrespondant agrave lrsquoindice de deacutebut de recherche

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

217

bull lrsquoeacutechange dans la liste des donneacutees concernant lrsquoeacutetudiant ayant la plus petite moyenne(indiceDuPlusPetit) avec les donneacutees de lrsquoeacutetudiant placeacute agrave lrsquoindice i (indice dudeacutebut de recherche)

Sans revenir sur le meacutecanisme drsquoeacutechange des donneacutees (voir au Chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) observez quegracircce au regroupement des donneacutees sous forme drsquoobjets les opeacuterations reacutealisent nonseulement lrsquoeacutechange des moyennes des eacutetudiants mais aussi lrsquoensemble des donneacuteesdeacutecrivant chaque eacutetudiant crsquoest-agrave-dire ses nom preacutenoms et notes En effet ce sont ici lesadresses de chaque objet laquo Etudiant raquo qui sont eacutechangeacutees et non pas simplement lesmoyennes

Lrsquoapplication GestionClasse

Afin de veacuterifier le bon fonctionnement des classes Etudiant et Classe il est neacutecessairede construire une application qui utilise des instances de ces classes Examinez la classeGestionClasse composeacutee drsquoune fonction main() dans laquelle est deacuteclareacute un objet Cde type Classe

public class GestionClasse public static void main(String [] argument) Classe C = new Classe() Systemoutprintln(------------- Reacutecapitulatif -------------) CafficheLesEtudiants() CclasserParMoyenne() Systemoutprintln(------------- Classement ----------------) CafficheLesEtudiants() Fin de class GestionClasse

En appelant le constructeur Classe() le programme demande la saisie du nombredrsquoeacutetudiants Puis pour chaque eacutetudiant il fait appel au constructeur Etudiant() quidemande la saisie des nom preacutenom et notes de lrsquoeacutetudiant concerneacute

Agrave la sortie du constructeur Classe() le programme est en mesure drsquoafficher gracircce agravelrsquoinstruction CafficheLesEtudiants() toutes les informations relatives agrave chaqueeacutetudiant de la classe C

Ensuite les eacutetudiants sont classeacutes par ordre croissant de moyenne gracircce agrave lrsquoappel de lameacutethode classerParMoyenne() appliqueacutee agrave la classe C Lrsquoaffichage de la liste deseacutetudiants permet ensuite de veacuterifier que le tri a eacuteteacute correctement reacutealiseacute

Exeacutecution de lrsquoapplication reacutesultats

Nombre drsquoetudiants 44Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant CCeelliinneeCombien de notes pour lrsquoetudiant Celine B 22Entrer la note ndeg 1 1133Entrer la note ndeg 2 1155Entrer le nom de lrsquoetudiant FFEntrer le preacutenom de lrsquoetudiant NNiiccoollaass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

218

Combien de notes pour lrsquoetudiant Nicolas F 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1188Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant EEllooddiieeCombien de notes pour lrsquoetudiant Elodie B 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1166Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant AArrnnaauuddCombien de notes pour lrsquoetudiant Arnaud B 22Entrer la note ndeg 1 1100Entrer la note ndeg 2 1122------------------ Reacutecapitulatif ------------------Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Nicolas F sont 160 180Sa moyenne vaut 170Les notes de Elodie B sont 160 160Sa moyenne vaut 170Les notes de Arnaud B sont 100 120Sa moyenne vaut 110------------------ Classement ------------------ Les notes de Arnaud B sont 100 120Sa moyenne vaut 11Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Elodie B sont 160 160Sa moyenne vaut 160Les notes de Nicolas F sont 160 180Sa moyenne vaut 170

Les tableaux agrave deux dimensionsVous venez de voir les tableaux agrave une seule dimension repreacutesenteacutes comme une liste hori-zontale ou verticale drsquoeacuteleacutements de mecircme type Il est possible avec Java de travailleraussi avec des tableaux de deux trois voire n dimensions Pour simplifier nous allonseacutetudier les tableaux agrave deux dimensions

Par deacutefinition un tableau agrave deux dimensions srsquoorganise non plus sur une seule ligne maissur des lignes et des colonnes Le croisement drsquoune ligne et drsquoune colonne deacutetermine uneacuteleacutement donneacute du tableau

Deacuteclaration drsquoun tableau agrave deux dimensionsPour deacuteclarer un tableau agrave deux dimensions la syntaxe est la suivante

int [][] donneacutee = new int [3][5]

La syntaxe est pratiquement identique agrave la deacuteclaration drsquoun tableau agrave une dimension Laseule diffeacuterence consiste en lrsquoajout de [] suppleacutementaires pour signifier au compilateurque le tableau est composeacute de deux dimensions

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

219

Les valeurs numeacuteriques placeacutees entre [] derriegravere lrsquoopeacuterateur new indiquent respective-ment le nombre de lignes puis de colonnes

Lrsquoinstruction de deacuteclaration deacutecrite ci-dessus reacuteserve en meacutemoire un tableau nommeacutedonneacutee composeacute de 3 lignes et de 5 colonnes Chaque eacuteleacutement du tableau eacutetant un entierlrsquoopeacuterateur new reacuteserve 3 5 soit 15 cases meacutemoire de la taille drsquoun entier

Remarquez que le nombre de lignes drsquoun tableau est donneacute par lrsquoexpressiondonneacuteelength alors que le nombre de colonnes est deacutetermineacute par lrsquoexpressiondonneacutee[0]length En effet le nombre de colonnes drsquoun tableau correspond au nombredrsquoeacuteleacutements placeacutes sur une ligne (voir Figure 9-5)

Acceacuteder aux eacuteleacutements drsquoun tableauPour initialiser modifier ou consulter la valeur drsquoun eacuteleacutement drsquoun tableau il convientdrsquoutiliser deux indices un indice pour les lignes et un indice pour les colonnes Chaqueindice eacutetant controcircleacute par une boucle for la technique consiste agrave imbriquer deux bouclesde la faccedilon suivante

for (int i = 0 i lt donneacuteelength i++) for (int j = 0 j lt donneacutee[0]length j++) donneacutee[i][j]) = uneValeur

La boucle j est imbriqueacutee dans la boucle i Les variables i et j sont les compteurs deboucles qui controcirclent respectivement les lignes et colonnes du tableau donneacutee

Pour mieux comprendre les meacutecanismes de manipulation des tableaux et en particulierle deacuteroulement des valeurs des indices agrave lrsquointeacuterieur des boucles for examinonslrsquoexemple suivant

Exemple Dessiner un sapin

Les tableaux agrave deux dimensions sont tregraves souvent utiliseacutes pour stocker les images Eneffet une image afficheacutee agrave lrsquoeacutecran correspond en reacutealiteacute agrave une surface deacutecoupeacutee en lignes

Figure 9-5

Un tableau srsquoorganise sur des lignes et des colonnes numeacuteroteacutees agrave partir de [0][0]

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

220

et colonnes La donneacutee numeacuterique se situant agrave la croiseacutee de ces lignes et colonnes repreacute-sente un point de lrsquoimage et a pour valeur la couleur drsquoaffichage agrave lrsquoeacutecran

Cahier des charges

Lrsquoobjectif de cet exemple est de dessiner agrave lrsquoeacutecran un sapin de Noeumll deacutecoreacute commelrsquoillustre la figure suivante

Pour simplifier agrave lrsquoextrecircme la lisibiliteacute du programme nous nrsquoutilisons que de simplescaractegraveres alphanumeacuteriques pour afficher notre sapin Crsquoest pourquoi son affichage resteassez sommaire Pour voir de plus laquo jolis raquo sapins reportez-vous au Chapitre 11laquo Dessiner des objets raquo

Creacuteer et afficher un triangle composeacute de trois lignes

Fidegraveles au principe de deacutecomposition drsquoun problegraveme nous allons chercher dans unpremier temps agrave afficher la forme suivante

Lrsquoaffichage de cette forme correspond agrave un triangle Sa structure interne est deacutefinie enmeacutemoire agrave lrsquoaide drsquoun tableau agrave deux dimensions Il srsquoagit drsquoun tableau composeacute de3 lignes et de 5 colonnes comme lrsquoillustre le tableau suivant

001000111011111

Ce tableau est constitueacute de valeurs numeacuteriques placeacutees de telle faccedilon que le programmedessine un triangle en affichant un point lorsque la valeur du tableau vaut 1 et sinon uneespace

Pour reacutealiser astucieusement lrsquoinitialisation de ce tableau examinons lrsquoemplacement desvaleurs par rapport aux indices du tableau Sachant qursquoun tableau est toujours initialiseacute agrave0 lors de sa creacuteation en meacutemoire par lrsquoopeacuterateur new observez uniquement les indicescorrespondant aux valeurs eacutegales agrave 1

LigneColonne [0] [1] [2] [3] [4]

[0] 0 0 1 0 0

[1] 0 1 1 1 0

[2] 1 1 1 1 1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

221

Remarquez agrave la colonne [2] que toutes les valeurs sont initialiseacutees agrave 1 Cette colonnecorrespond en reacutealiteacute agrave la colonne du milieu du tableau En supposant que lrsquoensemble desvaleurs soit stockeacute dans un tableau nommeacutee sapin lrsquoindice de cette colonne est obtenugracircce agrave lrsquoinstruction

int [][] sapin = new int [3][5]

int milieu = sapin[0]length 2

Lrsquoexpression sapin[0]length correspondant au nombre de colonnes soit 5 la variablemilieu prend pour valeur 52 soit 2 en entier

Ensuite les valeurs situeacutees de part et drsquoautre de cette colonne sont elles aussi initialiseacuteesagrave 1 Pour la ligne numeacutero [1] seul un eacuteleacutement agrave droite et agrave gauche du milieu est initia-liseacute agrave 1 Pour la ligne numeacutero [2] deux eacuteleacutements agrave droite et agrave gauche valent 1

Il y a donc correacutelation entre le nombre de valeurs agrave initialiser et le numeacutero de la ligne surlaquelle lrsquoinitialisation est effectueacutee Crsquoest pourquoi le traitement se reacutealise de la faccedilonsuivante

for ( int i = 0 i lt sapinlength i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = 1

La variable i partant de 0 jusqursquoagrave sapinlength (soit 3) examine toutes les lignes dutableau Pour chaque ligne gracircce agrave la seconde boucle en j les valeurs du tableau sontinitialiseacutees agrave 1 de part et drsquoautre du milieu Pour mieux comprendre le deacuteroulement desopeacuterations examinez le tableau drsquoeacutevolution des variables

i j milieu tab[i][milieu+j]

0 0 2 tab[0][0 + 2] = 1

0 1 2 sortie de boucle

1 -1 2 tab[1][-1 + 2] = 1

1 0 2 tab[1][0 + 2] = 1

1 1 2 tab[1][1 + 2] = 1

1 2 2 sortie de boucle

2 -2 2 tab[2][-2 + 2] = 1

2 -1 2 tab[2][-1 + 2] = 1

2 0 2 tab[2][0 + 2] = 1

2 1 2 tab[2][1 + 2] = 1

2 2 2 tab[2][2 + 2] = 1

2 3 2 sortie de boucle

3 2 sortie de boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

222

Une fois le tableau creacuteeacute et initialiseacute en meacutemoire lrsquoaffichage du dessin srsquoeffectue entestant la valeur de chaque point du tableau Si la valeur est nulle une espace est afficheacuteesinon un point est afficheacute Traduite en Java cette marche agrave suivre srsquoeacutecrit agrave lrsquoaide de deuxboucles imbriqueacutees comme suit

for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) if(sapin[i][j] == 0) Systemoutprint( ) else Systemoutprint() Systemoutprintln()

Lrsquoindice i repreacutesente les lignes tandis que j repreacutesente les colonnes Gracircce aux bouclesimbriqueacutees chaque intersection des lignes et colonnes est consulteacutee de faccedilon agrave afficherle caractegravere correspondant agrave la valeur stockeacutee Lorsque la boucle i est termineacutee celasignifie que tous les eacuteleacutements (colonnes) de la ligne i ont eacuteteacute afficheacutes et il est neacutecessairede passer agrave la ligne suivante de lrsquoeacutecran gracircce agrave lrsquoinstruction Systemoutprintln()

Creacuteer un triangle composeacute de n lignes

Nous avons creacuteeacute un triangle agrave 3 lignes composeacute de 5 colonnes Si nous souhaitons ajouterune nouvelle ligne nous devons obligatoirement ajouter deux colonnes suppleacutementairesLa relation entre le nombre de lignes et de colonnes srsquoexprime selon lrsquoeacutequation

Nombre de colonnes = 2 Nombre de lignes ndash 1

Pour un triangle posseacutedant 3 lignes vous obtenez 2 3 - 1 = 5 colonnes Pour untriangle composeacute de 4 lignes vous obtenez 2 4 - 1 = 7 colonnes Lrsquoeacutequation restevalide pour un triangle agrave une ligne puisque le nombre de colonnes vaut 2 1 - 1 = 1

Les instructions suivantes permettent de creacuteer un triangle dont le nombre de lignes estdeacutetermineacute par lrsquoutilisateur

public class Sapin public static void main(String [] arg) Systemoutprint(Nombre de ligne ) int nl = Lirei() if (nl lt= 0) Systemoutprintln(Le nombre de lignes doit ecirctre supeacuterieur a 0 ) Systemexit(0) int nc = 2nl-1 int [][] sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int i = 0 i lt nl i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = +1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

223

Fin de la fonction main() Fin de la classe Sapin

Placer des deacutecorations au hasard

Cela fait nous sommes en mesure drsquoafficher le sapin sans deacutecoration puisque pourchaque eacuteleacutement du tableau valant 1 un point est afficheacute Pour ajouter quelques deacutecora-tions lrsquoideacutee est de placer au hasard drsquoautres valeurs que 1 Ainsi lrsquoaffichage peut ecirctremoduleacute en fonction de la valeur rencontreacutee

Pour placer dans notre sapin de nouvelles valeurs au hasard comprises entre 1 et 6 parexemple il suffit de modifier lrsquoinitialisation du tableau de la faccedilon suivante

for ( int i = 0 i lt nl i++)

for ( int j = -i j lt= i j++) sapin[i][milieu + j] = (int ) (5 Mathrandom() + 1)

Lrsquoaffichage du sapin se deacuteroule ensuite comme suit

for (int i = 0 i lt sapinlength i++)

for (int j = 0 j lt sapin[0]length j++) switch (sapin[i][j]) case 0 Systemoutprint( ) break case 2 Systemoutprint() break default Systemoutprint() Systemoutprintln()

Suivant la valeur contenue en sapin[i][j] le programme affiche une espace un pointou un Remarquez que les valeurs 1 3 4 5 et 6 affichent toutes un point Seule la valeur2 permet lrsquoaffichage drsquoune guirlande Ce choix a pour effet drsquoafficher volontairementplus de points que de guirlandes de faccedilon agrave obtenir un sapin qui ne soit pas tropsurchargeacute

Attention aux boucles imbriqueacutees

Pour manipuler des tableaux agrave deux dimensions le programmeur utilise deux bouclesfor imbriqueacutees Dans ce cas une boucle for est placeacutee agrave lrsquointeacuterieur drsquoune premiegravereboucle for Ce type drsquoeacutecriture neacutecessite attention car certaines erreurs peuvent empecirc-cher le bon deacuteroulement du programme

Une erreur drsquoinattention commise en particulier agrave cause des faciliteacutes du copier-collerpeut aboutir agrave programmer deux boucles imbriqueacutees qui utilisent la mecircme variablecomme compteur de boucles

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

224

Ainsi en eacutecrivant

Le compteur de boucles i est deacuteclareacute agrave lrsquoexteacuterieur des boucles Les deux boucles utilisentla mecircme case meacutemoire pour stocker les variations de la valeur de i

En entrant dans la Boucle 1 i prend la valeur 1 de mecircme qursquoen entrant dans la Boucle 2Puis i est increacutementeacute de 1 agrave chaque tour de la Boucle 2 jusqursquoagrave ce que i deacutepasse la valeur4 La Boucle 2 est alors termineacutee i vaut par conseacutequent 5 On entre agrave nouveau dans laBoucle 1 i est increacutementeacute de 1 (i vaut 6) puis testeacute 6 eacutetant supeacuterieur agrave 3 la Boucle 1 esttermineacutee La Boucle 1 nrsquoest donc parcourue qursquoune seule fois au lieu de trois

Remarquez que

bull Si le compteur de boucles est deacuteclareacutee agrave lrsquointeacuterieur de la boucle comme suit

for(int i = 1 i lt= 3 i= i+1) Boucle 1 for( int i = 1 i lt= 4 i= i+1) Boucle 2

alors le compilateur deacutetecte une erreur du type Variable rsquoirsquo is already definedin this method En effet le fait de deacuteclarer un compteur de boucles portant le mecircmenom dans chaque boucle revient agrave deacuteclarer dans un mecircme bloc de programme deuxvariables portant le mecircme nom

bull Lrsquoeacutecriture de deux boucles non imbriqueacutees utilisant la mecircme variable comme comp-teur de boucles nrsquoest pas une erreur

for( int i = 1 i lt= 3 i= i+1) Premier for 4 toursfor( int i = 1 i lt= 6 i= i+1) Deuxiegraveme for 7 tours

Lrsquoemploi drsquoune mecircme variable de compteur pour deux boucles disjointes est correct Eneffet la variable i est deacuteclareacutee dans la boucle Elle nrsquoexiste en meacutemoire que le tempsdrsquoutilisation de la boucle Lorsque i est agrave nouveau deacuteclareacutee dans la deuxiegraveme boucle lavariable i preacuteceacutedente nrsquoexiste deacutejagrave plus Cette maniegravere de programmer est courante carelle facilite la lecture des boucles Tregraves souvent les compteurs de boucles ont pour nomi j ou k

Boucles imbriqueacutees (i est compteur de boucles) Variation de la variable i

int ifor(i = 1 i lt= 3 i= i+1) Boucle 1 for(i = 1 i lt= 4 i= i+1) Boucle 2

Boucle 1 i = 1 i lt= 3 Boucle 2 i = 1 i lt= 4 Boucle 2 i = 2 i lt= 4 Boucle 2 i = 3 i lt= 4 Boucle 2 i = 4 i lt= 4 Boucle 2 i = 5 i gt 4Boucle 1 i = 6 i gt 3

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

225

ReacutesumeacuteLes tableaux sont utiliseacutes pour regrouper sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Un tableau est deacutefini par

bull un nom

bull un type

bull le nombre de dimensions

bull une taille pour chacune des dimensions

Deacuteclaration drsquoun tableau Comme toute variable un tableau doit ecirctre deacuteclareacute La syntaxe est la suivante

bull Pour un tableau agrave une dimension

float [] donnee = new float [5]

Cette instruction deacuteclare un tableau composeacute de nombres reacuteels de simple preacuteci-sion appeleacute donnee Lrsquoopeacuterateur new reacuteserve 5 cases meacutemoire de 4 octets chacune

bull Pour un tableau agrave deux dimensions

int [][] valeur = new int [3][2]

Cette instruction deacuteclare un tableau agrave deux dimensions composeacute de nombresentiers appeleacute valeur Lrsquoopeacuterateur new reacuteserve 3 2 = 6 cases meacutemoire de 4octets chacune

La taille drsquoun tableau est une valeur entiegravere deacutefinie soit agrave lrsquointeacuterieur du programmesoit saisie au clavier lors de lrsquoexeacutecution du programme Une fois la taille fixeacutee parlrsquoopeacuterateur new il nrsquoest plus possible de la modifier en cours drsquoexeacutecution

Un tableau nrsquoest pas neacutecessairement de type simple (int double etc) Il peut ecirctrede type structureacute (String ou type deacutefini par le programmeur etc) Dans ce cas letableau est un tableau drsquoobjets stockant dans chacune de ses cases lrsquoadresse drsquounobjet agrave meacutemoriser

Pour acceacuteder agrave une case (eacuteleacutement) du tableau il suffit de placer derriegravere le nom dutableau le numeacutero de la case (indice) entre [] Chaque indice est une expressionentiegravere La premiegravere valeur drsquoun tableau est stockeacutee agrave lrsquoindice 0 du tableau et non agravelrsquoindice 1

for (int i = 0 i lt donneelength i++) Systemoutprintln( + donnee[i])

Ainsi la boucle for ci-dessus permet drsquoacceacuteder agrave chaque eacuteleacutement du tableau Pourne pas deacutepasser la taille du tableau il est conseilleacute drsquoutiliser la donneacutee length quicorrespond agrave la longueur du tableau Le programme deacutepasse la taille du tableaulorsque la valeur de lrsquoindice est supeacuterieure agrave la taille deacuteclareacutee du tableau Lrsquointer-preacuteteur deacutetecte alors une erreur du type javalangArrayIndexOutOfBounds-Exception

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

226

Exercices Les tableaux agrave une dimension

Qursquoaffiche le programme suivant

int i int [] valeur = new int[6] valeur [0] = 1 for (i = 1 i lt valeurlength i++) valeur[i] = valeur[i-1]+2 for (i = 0 i lt valeurlength i++) Systemoutprint(valeur[+i+] = + valeur[i])

Eacutecrivez un programme qui

a Stocke dans un tableau des valeurs entiegraveres passeacutees en paramegravetres de la ligne decommande

b Calcule la somme de ces valeurs

c Calcule la moyenne de ces valeurs

d Recherche la plus grande valeur du tableau

e Deacutetermine la position de la plus grande valeur

f Affiche le nombre de valeurs supeacuterieures agrave la moyenne

Les tableaux drsquoobjetsEn reprenant la classe Cercle deacutefinie au Chapitre 8 laquo Les principes du conceptdrsquoobjet raquo eacutecrivez un programme qui

a Creacutee un tableau de type Cercle dont la taille soit choisie par lrsquoutilisateur Si lenombre de cercles creacuteeacutes est infeacuterieur agrave 4 le programme initialise par deacutefaut lataille du tableau agrave 4

b Initialise les donneacutees de chaque tableau agrave lrsquoaide du constructeur par deacutefaut de laclasse Cercle

c Deacuteplace le cercle ndeg 1 en 20 20

d Agrandit le cercle ndeg 2 de 50

e Eacutechange le cercle ndeg 0 avec le ndeg 3

f Permute les cercles de faccedilon que le cercle 0 soit stockeacute en 1 le cercle 1 en 2 hellipet le cercle 3 en 0

91

92

93

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

227

Les tableaux agrave deux dimensionsEacutecrivez un programme qui

a Agrave lrsquoaide de boucles imbriqueacutees initialise la matrice 7 7 aux valeurs suivantes

1 0 0 1 0 0 10 1 0 1 0 1 00 0 1 1 1 0 01 1 1 1 1 1 10 0 1 1 1 0 00 1 0 1 0 1 01 0 0 1 0 0 1

Les compteurs de boucles seront astucieusement choisis afin drsquoinitialiser automatiquementle tableau

b Affiche agrave lrsquoeacutecran le tableau en remplaccedilant les valeurs

0 par un espace ( )

1 par un asteacuterisque ()

Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor

Afin drsquoexeacutecuter le programme suivant

public class Exercice5 public static void main (String [] parametre) int ij N = 5 char C Systemoutprint(Entrer un caractegravere ) C = Lirec() for (i = 1 i lt N i++) for (j = 1 j lt N j++) if (i lt j) Systemoutprint(C) else Systemoutprint( )

a Examinez le code source repeacuterez les instructions concerneacutees par les deuxboucles reacutepeacutetitives et deacuteterminez les instructions de deacutebut et de fin de boucle

b Quelles sont les instructions qui permettent de modifier le reacutesultat du test desortie de boucle

c En supposant que lrsquoutilisateur entre la valeur laquo raquo exeacutecutez le programmesuivant agrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaquevariable deacuteclareacutee)

d Quel est le reacutesultat afficheacute agrave lrsquoeacutecran

94

95

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

228

En construisant le tableau drsquoeacutevolution de la variable i que constatez-vous lors delrsquoexeacutecution de ces boucles

for(i = 1 i lt= 5 i = i+1) for(i = 1 i lt= 2 i= i+1) Systemoutprint(i = +i)

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter dix lignes comptablesLrsquoobjectif est de traiter non plus une seule ligne comptable mais dix lignes comptablesPour cela vous devez dans un premier temps modifier la deacuteclaration de la donneacuteeligne dans la classe Compte comme suit

private LigneComptable [] ligne

Comme le nombre de lignes comptables est fixeacute dans le cahier des charges il est possiblede deacutefinir une constante comme suit

public static final int NBLigne = 10

NBLigne repreacutesente le nombre maximal de lignes comptables agrave traiter Les lignes comp-tables eacutetant creacuteeacutees au fur et agrave mesure des opeacuterations reacutealiseacutees par lrsquoutilisateur il estneacutecessaire de deacutefinir une variable (nbLigneReacuteel) qui compte le nombre de lignes comp-tables effectivement creacuteeacutees en cours drsquoexeacutecution du programme

La gestion des lignes comptables entraicircne la modification des meacutethodes Compte()creacuteerLigne() et afficherCompte()

Transformer les constructeurs Compte()

Dans chaque constructeur

a Agrave lrsquoaide de lrsquoopeacuterateur new creacuteer en meacutemoire la donneacutee ligne sous forme drsquountableau de dix lignes comptables

b Initialiser la variable nbLigneReacuteel agrave ndash1 puisqursquoaucune ligne nrsquoa encore eacuteteacute saisie

Transformer la meacutethode creacuteerLigne()

Lorsque le nombre de lignes comptables traiteacute est supeacuterieur agrave 10 le programme doiteffacer la premiegravere ligne traiteacutee de faccedilon agrave deacutecaler les suivantes (la deuxiegraveme allant enpremiegravere position la troisiegraveme en deuxiegraveme position etc) afin de pouvoir stocker lanouvelle ligne en derniegravere position du tableau ligne

96

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

229

La meacutethode creacuteerLigne() reacutealise ce traitement de la faccedilon suivante

a Increacutemente nbLigneReacuteel de 1

b Si le nombre de lignes creacuteeacutees est infeacuterieur agrave NBLigne creacutee en meacutemoire une lignecomptable gracircce au constructeur de la classe LigneComptable et stocke en meacutemoireson adresse dans le tableau ligne

c Si le nombre de lignes est supeacuterieur agrave NBLigne deacutecale toutes les lignes vers le hautgracircce agrave la meacutethode deacutecalerLesLignes() deacutecrite ci-dessous et stocke la nouvelleligne comptable en derniegravere position (NBLigne ndash 1) du tableau ligne

private void deacutecalerLesLignes() for(int i = 1 i lt NBLigne i++) ligne[i-1] = ligne[i]

d Modifie la valeur courante du compte en fonction du creacutedit ou deacutebit reacutealiseacute par lanouvelle ligne comptable

Transformer la meacutethode afficherCompte()Modifier la meacutethode afficherCompte() de faccedilon agrave afficher lrsquoensemble des lignes saisiesen cours drsquoexeacutecution du programme

copy copyright Eacuteditions Eyrolles

10Collectionner un nombre

indeacutetermineacute drsquoobjets

Comme nous lrsquoavons vu au cours du chapitre preacuteceacutedent les tableaux permettent la mani-pulation rapide et efficace drsquoun ensemble de donneacutees Cependant leur principal inconveacute-nient est drsquoecirctre de taille fixe Ainsi lrsquoajout drsquoun eacuteleacutement dans un tableau demande unegestion rigoureuse des indices afin drsquoeacuteviter que ces derniers ne prennent une valeur supeacute-rieure agrave la taille du tableau

Pour pallier cette difficulteacute majeure pour un grand nombre de programmes le langageJava propose plusieurs outils de manipulation des donneacutees en meacutemoire vive au fur et agravemesure des besoins de lrsquoapplication Ces outils sont preacutesenteacutes et analyseacutes agrave la sectionlaquo La programmation dynamique raquo

En outre lorsqursquoun programme utilise des collections importantes de donneacutees il doit lesarchiver de faccedilon agrave ne pas les voir disparaicirctre apregraves lrsquoarrecirct de lrsquoapplication ou de lrsquoordi-nateur Le langage Java offre diffeacuterentes meacutethodes pour reacutealiser ce stockage de donneacuteesElles sont eacutetudieacutees agrave la section laquo Lrsquoarchivage de donneacutees raquo

La programmation dynamiqueAgrave la diffeacuterence de la programmation statique dans laquelle le nombre de donneacutees geacutereacutepar lrsquoapplication est fixeacute une fois pour toutes lors de lrsquoexeacutecution du programme laprogrammation dynamique offre lrsquoavantage de geacuterer un nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Cette technique se montre tregraves utile lorsque le nombre drsquoobjets agrave traiter nrsquoest pas connuni deacutefinissable avant lrsquoexeacutecution du programme Par exemple tous les logiciels degestion et crsquoest une grande part des programmes informatiques se doivent de geacuterer lesdonneacutees qursquoils traitent de faccedilon dynamique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

232

En effet sans programmation dynamique vous pourriez voir une bibliothegraveque refuser denouveaux lecteurs sous preacutetexte que le logiciel qursquoelle utilise ne serait pas en mesure detraiter plus de 50 000 inscriptions ou encore voir un logiciel de traitement de textesrsquointerrompre parce qursquoil lui serait impossible de geacuterer la saisie et lrsquoaffichage de plus10 000 caractegraveres

Pour eacuteviter de telles situations le langage Java propose diffeacuterents outils qui gegraverent dyna-miquement les donneacutees drsquoun programme En particulier il existe des objets de typeVector dont nous analysons les caracteacuteristiques agrave la section laquo Les vecteurs raquo Les objetsde type Hashtable eacutetudieacutes agrave la section laquo Les dictionnaires raquo offrent aussi lrsquoavantage degeacuterer les donneacutees de faccedilon dynamique tout en organisant lrsquoinformation de faccedilon agrave faci-liter son exploitation

Les vecteursLes vecteurs sont des objets de type Vector un type preacutedeacutefini du langage Java Lagestion des vecteurs est assez similaire agrave la gestion drsquoun tableau puisque le programmecreacutee une liste par ajout de donneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Lesdonneacutees sont enregistreacutees dans leur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteurpermet de retrouver lrsquoinformation

Manipulation drsquoun vecteur

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Ainsi deacuteclareacute liste est un objet de type Vector auquel on peut appliquer des meacutethodesde la classe Vector Ces meacutethodes deacutecrites au tableau ci-dessous permettent lrsquoajout lasuppression ou la modification drsquoune donneacutee dans le vecteur (liste par exemple)

Opeacuteration Fonction Java

Ajoute un eacuteleacutement objet en fin de liste add(objet)

Insegravere un eacuteleacutement objet dans la liste agrave lrsquoindice speacutecifieacute en paramegravetre add(indice objet)

Ajoute un eacuteleacutement objet en fin de liste et augmente sa taille de un addElement(objet)

Retourne lrsquoeacuteleacutement stockeacute agrave lrsquoindice speacutecifieacute en paramegravetre elementAt(indice)

Supprime tous les eacuteleacutements de la liste clear()

Retourne lrsquoindice dans la liste du premier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

indexOf(objet)

Retourne lrsquoindice dans la liste du dernier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

lastIndexOf()

Supprime lrsquoobjet dont lrsquoindice est speacutecifieacute en paramegravetre remove(indice)

Supprime tous les eacuteleacutements compris entre les indices i (valeur comprise) et j (valeur non comprise)

removeRange(i j)

Remplace lrsquoeacuteleacutement situeacute en position i par lrsquoobjet speacutecifieacute en paramegravetre setElementAt(objet i)

Retourne le nombre drsquoeacuteleacutements placeacutes dans la liste size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

233

Exemple Creacuteer un nombre indeacutetermineacute drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation des vecteurs reprenons lrsquoexemple de la classedrsquoeacutetudiants (voir au chapitre preacuteceacutedent laquo Collectionner un nombre fixe drsquoobjets raquo lasection laquo Trier un ensemble de donneacutees raquo) de faccedilon que le programme traite non plus unnombre fixe drsquoeacutetudiants mais un nombre indeacutetermineacute

La classe Etudiant nrsquoest pas agrave modifier puisque lrsquoobjectif est de transformer unique-ment la gestion en meacutemoire des eacutetudiants La correction se porte donc sur la classeClasse ougrave la liste drsquoeacutetudiants doit ecirctre deacuteclareacutee de type Vector au lieu drsquoecirctre deacuteclareacuteesous forme de tableau Examinons la nouvelle classe Classe

import javautil public class Classe private Vector liste public Classe() liste = new Vector() public void ajouteUnEtudiant() listeaddElement(new Etudiant()) public void afficheLesEtudiants() int nbEtudiants = listesize() if (nbEtudiants gt 0) Etudiant tmp for (int i = 0 i lt nbEtudiants i ++) tmp = (Etudiant) listeelementAt(i) tmpafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste) Fin de Classe

Les outils comme Vector sont proposeacutes par le langage Java Ils sont deacutefinis agrave lrsquointeacuterieurde classes qui ne sont pas par deacutefaut directement accessibles par le compilateur Crsquoestpourquoi le programmeur doit preacuteciser au compilateur ougrave se situe la librairie du langageJava deacutefinissant lrsquooutil utiliseacute (package) Pour ce faire il doit placer une instructionimport en premiegravere ligne du fichier qui utilise lrsquooutil souhaiteacute

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placer lrsquoinstruc-tion importjavautil en tecircte du fichier En effet si cette instruction fait deacutefaut lecompilateur deacutetecte une erreur du type Class Vector not found

Cela fait la donneacutee liste deacuteclareacutee de type Vector doit ecirctre manipuleacutee en tant que telledans chaque meacutethode de la classe Les trois meacutethodes suivantes sont deacutefinies agravelrsquointeacuterieur de celle-ci

bull Le constructeur Classe() qui fait appel au constructeur de la classe Vector afin dedeacuteterminer lrsquoadresse du premier eacuteleacutement de la liste

bull La meacutethode ajouteUnEtudiant() qui place un eacuteleacutement dans la liste gracircce agrave lameacutethode addElement() Lrsquoeacuteleacutement ajouteacute agrave la liste est un objet de type Etudiant creacuteeacutepar lrsquointermeacutediaire du constructeur Etudiant() qui demande la saisie au clavier des

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

234

donneacutees caracteacuteristiques de lrsquoeacutetudiant agrave construire Cela fait la taille de la liste estautomatiquement augmenteacutee de 1 par lrsquointerpeacuterteur

Observez que lrsquoajout drsquoun eacuteleacutement dans un vecteur nrsquoest possible que si lrsquoeacuteleacutement estun objet Il nrsquoest en effet pas possible drsquoajouter une valeur de type simple telle queint float ou double Pour reacutealiser une telle opeacuteration il est neacutecessaire de transformerles types simples en leur homologue structureacute Par exemple le type simple int peutecirctre repreacutesenteacute par le type Integer deacutefinissant un objet contenant une valeur numeacute-rique entiegravere (pour plus de preacutecisions voir lrsquoexercice 1 en fin de chapitre)

bull La meacutethode afficheLesEtudiants() parcourt lrsquoensemble de la liste gracircce agrave lameacutethode elementAt() qui fournit en reacutesultat lrsquoeacuteleacutement stockeacute agrave la position speacutecifieacuteeen paramegravetre soit i Ce reacutesultat pour ecirctre consultable doit obligatoirement ecirctrelaquo casteacute raquo en Etudiant (voir au Chapitre 1 laquo Stocker une information raquo la section laquo Latransformation de types raquo) En effet un vecteur a la capaciteacute de meacutemoriser nrsquoimportequel type drsquoobjet preacutedeacutefini ou non Il est donc neacutecessaire drsquoindiquer au compilateur agravequel type correspond lrsquoobjet extrait

Lrsquoindice i variant de 0 jusqursquoagrave la taille effective (nbEtudiants) de la liste lrsquoensembledes eacutetudiants contenus dans la liste est afficheacute

Exemple Lrsquoapplication GestionClasse

Observons lrsquoapplication GestionClasse qui deacutefinit et utilise un objet Classe

public class GestionClasse public static void main(String [] argument) byte choix = 0 Classe C = new Classe() do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Affiche la classe) Systemoutprintln(3 Pour sortir) Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 CafficheLesEtudiants() break case 3 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 3)

Le nombre drsquoeacutetudiants agrave traiter nrsquoest pas deacutetermineacute agrave lrsquoavance Crsquoest pourquoi lrsquoapplica-tion GestionClasse reacutealise gracircce agrave la mise en place drsquoune boucle dohellipwhile la saisie desdonneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Le programme laisse le choix agravelrsquoutilisateur de saisir de nouveaux eacutetudiants ou drsquoafficher ceux effectivement saisisLrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

235

1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Il nrsquoy a pas drsquoetudiant dans cette liste1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant MMEntrer le prenom de lrsquoetudiant SSaannddrraaCombien de notes pour lrsquoetudiant Sandra M 22Entrer la note ndeg 1 1155Entrer la note ndeg 2 11331 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant PPhhiilliippppeeEntrer le prenom de lrsquoetudiant TTCombien de notes pour lrsquoetudiant Philippe T 2Entrer la note ndeg 1 1122Entrer la note ndeg 2 881 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Les notes de Sandra M sont 150 130Sa moyenne vaut 140Les notes de Philippe T sont 120 80Sa moyenne vaut 1001 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 33

Lrsquoutilisation drsquoobjets du type Vector est souple et facilite amplement la vie du program-meur lorsque ce dernier souhaite eacutecrire une application qui gegravere des donneacutees de faccedilondynamique Les meacutethodes de la classe Vector permettent aussi la recherche ou lrsquoinser-tion de nouveaux eacuteleacutements gracircce en particulier agrave la meacutethode indexOf(objet) quiretrouve lrsquoindice de lrsquoobjet speacutecifieacute en paramegravetre dans la liste

Cependant lorsque la liste meacutemorise des objets complexes tels que les donneacutees caracteacute-ristiques drsquoun eacutetudiant la recherche drsquoun eacutetudiant particulier nrsquoest pas simple En effetil est neacutecessaire de fournir au programme toutes les donneacutees de lrsquoeacutetudiant (nom preacutenomnotes et moyenne) de faccedilon agrave ecirctre sucircr de le retrouver dans la liste La meacutethodeindexOf(objet) ne retrouve lrsquoobjet speacutecifieacute en paramegravetre qursquoagrave la seule condition qursquoilsoit totalement identique agrave celui stockeacute dans la liste

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

236

Les dictionnaires

Pour ameacuteliorer la recherche drsquoeacuteleacutements complexes dans une liste la technique consisteagrave organiser les donneacutees non plus par rapport agrave un indice mais par rapport agrave une cleacute expli-cite De cette faccedilon la recherche drsquoun objet dans la liste srsquoeffectue non plus surlrsquoensemble des donneacutees qui le composent mais sur une cleacute unique qui lui est associeacutee

Lrsquoorganisation de donneacutees par association drsquoune cleacute agrave un ensemble de donneacutees estappeleacutee un dictionnaire Dans un dictionnaire chaque deacutefinition est associeacutee au motqursquoelle deacutefinit et non pas agrave sa position (numeacuterique) dans le dictionnaire

Manipulation drsquoun dictionnaire

Le type Hashtable proposeacute par le langage Java permet de reacutealiser simplement lrsquoassocia-tion cleacute-eacuteleacutement Les meacutethodes associeacutees agrave ce type sont la creacuteation la suppression laconsultation ou la modification drsquoune association

Pour utiliser un dictionnaire il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Hashtable listeClasseacutee = new Hashtable ()

Ainsi deacuteclareacute listeClasseacutee est un objet de type Hashtable sur lequel on peut appli-quer des meacutethodes de la classe Hashtable Les meacutethodes les plus couramment utiliseacuteessont deacutecrites au tableau ci-apregraves

Exemple Creacuteer un dictionnaire drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation de tels objets modifions le programme de gestiondrsquoune classe drsquoeacutetudiants de faccedilon agrave organiser les donneacutees agrave partir drsquoune cleacute deacutefinie par leprogramme

Deacutefinir une cleacute drsquoassociation

En supposant qursquoun eacutetudiant soit totalement identifiable par son nom et son preacutenom lacleacute drsquoassociation des donneacutees est deacutefinie comme eacutetant une chaicircne de caractegraveres majus-cules dont le premier caractegravere coiumlncide avec le premier caractegravere du preacutenom delrsquoeacutetudiant et dont les caractegraveres suivants correspondent au nom de lrsquoeacutetudiant

De cette faccedilon chaque cleacute est deacutetermineacutee par programme indeacutependamment de lrsquoutilisa-teur en fonction des informations fournies par ce dernier

Opeacuteration Fonction Java

Place dans le dictionnaire lrsquoassociation cleacutendashobjet put(cleacute objet)

Retourne lrsquoobjet associeacute agrave la cleacute speacutecifieacutee en paramegravetre get(cleacute)

Supprime dans le dictionnaire lrsquoassociation cleacutendashobjet agrave partir de la cleacute speacutecifieacutee en paramegravetre

remove(cleacute)

Retourne le nombre drsquoassociations deacutefinies dans le dictionnaire size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

237

La traduction de cet algorithme en langage Java est la suivante

private String creacuteerUneCleacute(Etudiant e) String tmp tmp = (equelPreacutenom())charAt(0) + equelNom() return tmptoUpperCase()

Agrave partir des donneacutees drsquoun eacutetudiant e passeacutees en paramegravetres la meacutethode creacuteerUneCleacute()retourne une chaicircne de caractegraveres majuscules (tmptoUpperCase()) composeacutee dupremier caractegravere du preacutenom de lrsquoeacutetudiant ((equelPreacutenom())charAt(0)) suivi de sonnom (equelNom()) Remarquez que les donneacutees nom et preacutenom de la classe Etudiantsont priveacutees et qursquoil est donc neacutecessaire drsquoutiliser les meacutethodes drsquoaccegraves en consultation(quelPreacutenom() et quelNom()) pour connaicirctre le contenu de ces donneacutees Ces meacutethodesagrave inseacuterer dans le fichier Etudiantjava sont deacutecrites comme suit

public String quelNom() return nompublic String quelPreacutenom() return preacutenom

La creacuteation drsquoune cleacute peut eacutegalement ecirctre reacutealiseacutee simplement agrave partir des nom et preacutenomde lrsquoeacutetudiant stockeacutes non pas dans un objet Etudiant mais dans deux String distinctsLa meacutethode creacuteerUneCleacute() est alors surchargeacutee de la faccedilon suivante

private String creacuteerUneCleacute(String p String n) String tmp tmp = pcharAt(0)+ n return tmptoUpperCase()

Les deux meacutethodes creacuteerUneCleacute() agrave inseacuterer dans la classe Classe sont deacuteclareacutees enmode private car elles constituent un traitement interne propre au mode de stockage delrsquoinformation Lrsquoapplication et lrsquoutilisateur nrsquoont nullement besoin drsquoen connaicirctre lrsquoexis-tence pour creacuteer la liste des eacutetudiants drsquoune classe

Creacuteation du dictionnaire

Pour creacuteer le dictionnaire drsquoune classe drsquoeacutetudiants nous devons tout drsquoabord deacutefinir unobjet de type Hashtable puis stocker dans cet objet les eacutetudiants en les associant agrave leurcleacute Ces deux opeacuterations sont reacutealiseacutees dans le programme suivant

import javautilpublic class Classe private Hashtable listeClasseacutee public Classe() listeClasseacutee = new Hashtable() public void ajouteUnEtudiant() Etudiant nouveau = new Etudiant() String cleacute = creacuteerUneCleacute(nouveau)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

238

if (listeClasseacuteeget(cleacute)== null) listeClasseacuteeput(cleacute nouveau) else Systemoutprintln(Cet etudiant a deja ete saisi )

Ce programme est constitueacute des deux meacutethodes suivantes

bull Le constructeur Classe() qui fait appel au constructeur de la classe Hashtable afinde deacuteterminer lrsquoadresse du premier eacuteleacutement de la listeClasseacutee

bull ajouteUnEtudiant() qui place un eacuteleacutement dans le dictionnaire gracircce agrave la meacutethodeput(cleacute nouveau) qui ajoute lrsquoassociation cleacute-nouveau dans le dictionnairelisteClasseacutee Lrsquoobjet nouveau est de type Etudiant Il est creacuteeacute par lrsquointermeacutediaire duconstructeur Etudiant() et cleacute est aussi un objet de type String calculeacute agrave partir de lameacutethode creacuteerUneCleacute()

Lrsquoajout successif de deux associations ayant la mecircme cleacute a pour reacutesultat de deacutetruire lapremiegravere association Crsquoest pourquoi il convient de tester avant de placer le nouveleacutetudiant dans le dictionnaire si ce dernier nrsquoest pas deacutejagrave deacutefini dans la listeClasseacuteeCrsquoest ce que reacutealise le test suivant

if (listeClasseacuteeget(cleacute) == null) listeClasseacuteeput(cleacute nouveau)

En effet en testant le reacutesultat de la meacutethode get(cleacute) le programme recherche dansle dictionnaire srsquoil existe un eacutetudiant associeacute agrave la cleacute calculeacutee correspondant agravelrsquoeacutetudiant que lrsquoon souhaite inseacuterer dans la liste (nouveau) Si cette associationnrsquoexiste pas lrsquoeacuteleacutement retourneacute par la meacutethode est null et lrsquointerpreacuteteur ajoute lanouvelle association cleacutendashnouveau dans le dictionnaire Dans le cas contraire leprogramme affiche un message preacutecisant que lrsquoeacutetudiant existe deacutejagrave

Rechercher et supprimer un eacuteleacutement du dictionnaire

Une fois le dictionnaire reacutealiseacute les opeacuterations permettant la recherche ou la suppressiondrsquoun eacutetudiant sont deacutecrites par les meacutethodes suivantes agrave inseacuterer dans le fichierClassejava

public void rechercheUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute = null) eClasseacuteafficheUnEtudiant() else Systemoutprintln(p + + n + est inconnu ) public void supprimeUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute= null) listeClasseacuteeremove(cleacute) Systemoutprintln(p + + n + a ete supprime ) else Systemoutprintln(p + + n + est inconnu )

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

239

Ces meacutethodes fonctionnent toutes deux sur le mecircme modegravele Les nom et preacutenom delrsquoeacutetudiant agrave traiter sont fournis en paramegravetres des meacutethodes afin de calculer la cleacute drsquoasso-ciation Ensuite lrsquoeacutetudiant est rechercheacute dans la liste agrave partir de cette cleacute (get(cleacute))

Srsquoil est trouveacute il est soit afficheacute (eClasseacuteafficheUnEtudiant() pour la meacutethoderechercheUnEtudiant()) soit supprimeacute (listeClasseacuteeremove(cleacute) pour la meacutethodesupprimeUnEtudiant())

Afficher un dictionnaire

Pour afficher tous les eacuteleacutements drsquoun dictionnaire nous devons le parcourir eacuteleacutement pareacuteleacutement Il existe diffeacuterentes techniques pour reacutealiser ce parcours Nous vous en propo-sons une qui utilise un outil du langage Java deacutefini par la classe Enumeration

Une eacutenumeacuteration est un outil du package javautil qui facilite le parcours de listes dedonneacutees quelles qursquoelles soient Ainsi pour se deacuteplacer dans une eacutenumeacuteration drsquoobjetsil suffit drsquoutiliser les meacutethodes hasMoreElements() et nextElement() La premiegraveremeacutethode deacutetermine srsquoil existe encore des eacuteleacutements dans lrsquoeacutenumeacuteration tandis que laseconde permet lrsquoaccegraves agrave lrsquoeacuteleacutement suivant dans lrsquoeacutenumeacuteration

La meacutethode afficheLesEtudiants() utilise cette technique pour reacutealiser la parcours dela listeClasseacutee

public void afficheLesEtudiants() if(listeClasseacuteesize() = 0) Enumeration enumEtudiant = listeClasseacuteekeys() while (enumEtudianthasMoreElements()) String cleacute = (String) enumEtudiantnextElement() Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) eClasseacuteafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste)

Lrsquoeacutenumeacuteration est deacutefinie gracircce agrave la meacutethode keys() de la classe Hashtable qui renvoiesous forme drsquoeacutenumeacuteration la liste des cleacutes effectivement stockeacutees Le parcours de cetteeacutenumeacuteration est ensuite reacutealiseacute agrave lrsquoaide drsquoune boucle while testant srsquoil existe encore descleacutes dans la liste (enumEtudianthasMoreElements()) Si tel est le cas le programmepasse agrave lrsquoeacuteleacutement suivant dans la liste (enumEtudiantnextElement()) Il recherchealors lrsquoeacutetudiant associeacute agrave cette cleacute (listeClasseacuteeget(cleacute)) et lrsquoaffiche(eClasseacuteafficheUnEtudiant())

Exemple Lrsquoapplication GestionClasse

La gestion des eacutetudiants drsquoune classe est totalement acheveacutee en eacutecrivant lrsquoapplicationGestionClasse comme suit

public class GestionClasse public static void main (String [] argument) byte choix = 0 Classe C = new Classe()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

240

String preacutenom nom do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CsupprimeUnEtudiant(preacutenom nom) break case 3 CafficheLesEtudiants() break case 4 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CrechercheUnEtudiant(preacutenom nom) break case 5 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while ( choix = 5)

Chaque option du menu utilise une meacutethode de la classe Classe Ces options offrent lapossibiliteacute drsquoajouter de supprimer et de consulter tout ou partie du dictionnaire formeacuteau fur et agrave mesure des choix de lrsquoutilisateur Lrsquoexeacutecution de cette application peut avoirpar exemple pour reacutesultat agrave lrsquoeacutecran

1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant RREntrer le prenom de lrsquoetudiant SSyyllvvaaiinnCombien de notes pour lrsquoetudiant Sylvain R 2Entrer la note ndeg 1 1155Entrer la note ndeg 2 11441 Ajoute un etudiant2 Supprime un etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

241

3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant CCEntrer le prenom de lrsquoetudiant GGaaeelllleeCombien de notes pour lrsquoetudiant Gaelle C 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 11221 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche CCEntrer le nom de lrsquoeacutetudiant recherche GGaaeelllleeC Gaelle est inconnu 1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche GGaaeelllleeEntrer le nom de lrsquoeacutetudiant recherche CC Les notes de Gaelle C sont 160 120Sa moyenne vaut 1401 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 55

Lors du premier choix 4 lrsquoutilisateur a inverseacute les nom et preacutenom de lrsquoeacutetudiante La cleacutequi en deacutecoule nrsquoexiste pas dans le dictionnaire Le programme ne peut donc pasretrouver les informations concernant cette eacutetudiante

Ainsi gracircce aux objets de type Hashtable il est possible drsquoorganiser sans beaucoupdrsquoefforts de programmation des donneacutees de faccedilon agrave pouvoir rechercher modifier ousupprimer un eacuteleacutement dans une liste

Pourtant lrsquoapplication GestionClasse possegravede encore un inconveacutenient majeur elleperd la meacutemoirehellip En effet agrave chaque exeacutecution les donneacutees doivent de nouveau ecirctresaisies au clavier Les donneacutees stockeacutees dans la meacutemoire vive de lrsquoordinateur se perdentagrave lrsquoarrecirct du programme Pour corriger ce deacutefaut le programme doit pouvoir enregistrerles informations traiteacutees dans un fichier sur le disque dur Cet enregistrement desdonneacutees est aussi appeleacute archivage de donneacutees

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

242

Lrsquoarchivage de donneacuteesLa notion drsquoarchivage de donneacutees est tregraves importante puisque gracircce agrave elle les informa-tions traiteacutees sont stockeacutees sous forme de fichiers sur le disque dur Les informationsainsi stockeacutees perdent leur volatiliteacute et peuvent ecirctre reacuteutiliseacutees apregraves un arrecirct momentaneacutedu programme ou de lrsquoordinateur Pour archiver des donneacutees le langage Java utilise leconcept de flux ou en anglais stream

La notion de fluxLorsque nous communiquons des informations agrave lrsquoordinateur nous effectuons uneopeacuteration drsquoentreacutee (voir le Chapitre 2 laquo Communiquer une information raquo) Cettecommunication utilise un flux entrant qui est en quelque sorte la concreacutetisation infor-matique du courant eacutelectrique passant du clavier agrave la meacutemoire vive de lrsquoordinateurSymeacutetriquement il existe un flux sortant permettant de faire passer une informationstockeacutee en meacutemoire vive agrave lrsquoeacutecran de lrsquoordinateur

Dans le jargon informatique on dit que les flux reliant la meacutemoire vive agrave lrsquoeacutecran ou auclavier utilisent des flux standards drsquoentreacutee-sortie De faccedilon similaire il existe drsquoautrestypes de flux qui relient la meacutemoire vive non plus agrave lrsquoeacutecran ou au clavier mais au disquedur de lrsquoordinateur Ce sont les flux de fichiers

Ces flux sont aussi caracteacuteriseacutes par leur direction entrante ou sortante Un flux de fichiersortant est un flux drsquoeacutecriture qui reacutealise la creacuteation et lrsquoenregistrement de donneacutees dansun fichier Symeacutetriquement un flux de fichier entrant est un flux de lecture qui permetlrsquoinitialisation des variables ou objets du programme en meacutemoire vive gracircce aux valeurspreacuteceacutedemment enregistreacutees sur le disque dur

Ces flux sont deacutefinis agrave travers des objets preacutedeacutefinis du langage Java (package javaio)Il en existe un tregraves grand nombre offrant tous des outils permettant le stockage et le trai-tement de donneacutees sous diverses formes

Notre objectif nrsquoest pas de les deacutecrire tous mecircme succinctement mais de preacutesenterconcregravetement deux techniques drsquoarchivage afin drsquoen comprendre les diffeacuterents meacuteca-nismes Crsquoest pourquoi notre eacutetude porte sur les fichiers stockant lrsquoinformation sous laforme de caractegraveres (voir ci-dessous la section laquo Les fichiers textes raquo) ainsi que sur lesfichiers stockant des objets (voir la section laquo Les fichiers drsquoobjets raquo)

Les fichiers textesPuisqursquoil existe deux faccedilons drsquoacceacuteder agrave un fichier (lecture ou eacutecriture) les outilsproposeacutes par le langage Java reproduisent ces deux modes drsquoaccegraves Pour manipuler desfichiers nous devons donc deacuteclarer deux objets diffeacuterents qui vont nous permettre de lireou drsquoeacutecrire dans un fichier

Ainsi la deacuteclaration

BufferedWriter fW

deacutefinit un objet fW de type BufferedWriter utiliseacute pour eacutecrire (Writer) crsquoest-agrave-direenregistrer des donneacutees dans un fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

243

Par contre la deacuteclaration

BufferedReader fR

deacutefinit un objet fR de type BufferedReader utiliseacute pour lire (Reader) les donneacutees conte-nues dans un fichier afin de les placer dans des variables (en meacutemoire vive) Ces objetset les meacutethodes associeacutees sont deacutefinis dans le package javaio Il convient donc deplacer lrsquoinstruction import javaio en en-tecircte des classes qui font appel agrave cesoutils

Exemple Une classe pour lire et eacutecrire du texte

Lrsquoobjectif de cet exemple est de creacuteer une classe Fichier composeacutee drsquooutils simplifiantla manipulation des fichiers en lecture et en eacutecriture Les donneacutees de cette classe deacutefinis-sent deux objets de type BufferedWriter et BufferedReader et drsquoune variable de typechar qui meacutemorise le mode de traitement utiliseacute (lecture ou eacutecriture)

import javaiopublic class Fichier private BufferedWriter fW private BufferedReader fR private char mode

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouverturedu flux puis traitement des donneacutees parcourant le flux et pour finir fermeture du fluxChacune de ces eacutetapes est deacutecrite au cours des sections suivantes

Ouverture du flux

Pour eacutecrire ou lire dans un fichier il neacutecessaire avant tout drsquoouvrir le flux en indiquantsi ce flux est entrant (lecture) ou sortant (eacutecriture) La meacutethode ouvrir() deacutecrite ci-dessous reacutealise cette opeacuteration Elle doit ecirctre inseacutereacutee dans la classe Fichier

public void ouvrir(String nomDuFichier String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fR = new BufferedReader(new FileReader(new File(nomDuFichier))) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les deux points importants suivants sont agrave observer dans lrsquoen-tecircte de la meacutethodeouvrir()

bull Le premier concerne le terme throws IOException dont la preacutesence est obligatoirepour toutes les meacutethodes qui manipulent des opeacuterations drsquoentreacutee-sortie Succincte-ment cette clause indique au compilateur que la meacutethode ainsi deacutefinie est susceptiblede traiter ou de propager une eacuteventuelle erreur du type IOException qui pourraitapparaicirctre en cours drsquoexeacutecution

Vour plus de preacutecisions voir la section laquo Geacuterer les exceptions raquo en fin de chapitre copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

244

bull Le second point important est relatif aux informations transmises agrave la meacutethodeouvrir() Le premier paramegravetre speacutecifie le nom du fichier auquel est associeacute le fluxtandis que le second indique le mode drsquoouverture du flux (entrant ou sortant) Ce para-megravetre peut prendre diffeacuterentes valeurs telles que Ecriture E Write ou encoreW pour le mode sortant et Lecture L Read ou encore R pour le modeentrant Ces mots peuvent ecirctre eacutecrits indiffeacuteremment en majuscules ou en minusculesEn effet la variable drsquoinstance mode est initialiseacutee agrave partir du premier caractegravere(charAt(0)) du paramegravetre s et est automatiquement transformeacutee en majuscules(stoUpperCase())

Cela fait le flux est ouvert en lecture ou en eacutecriture en fonction de la variable drsquoinstancemode Ainsi

bull Si mode vaut L ou R lrsquoouverture du fichier est reacutealiseacutee en lecture gracircce agrave lrsquoinstruction

fR = new BufferedReader(new FileReader(new File(nomDuFichier)))

Cette instruction relativement deacuteconcertante pour le programmeur deacutebutant reacutealiseplusieurs opeacuterations afin de deacuteterminer ougrave se situe le deacutebut du fichier speacutecifieacute en para-megravetre

La premiegravere opeacuteration new File(nomDuFichier) permet drsquoobtenir une repreacutesentationlogique du fichier (existe-t-il ou non sur le disque dur ) Ensuite lrsquoappel au construc-teur FileReader() permet lrsquoouverture du fichier en lecture caractegravere par caractegravere Ilfournit en retour lrsquoadresse du deacutebut du fichier

Cependant ce mode de lecture nrsquoautorise pas la lecture de plusieurs caractegraveres agrave lafois Crsquoest pourquoi il est neacutecessaire de faire appel agrave un troisiegraveme constructeur Buffe-redReader() qui permet la lecture du fichier ligne par ligne Lrsquoadresse du deacutebut dufichier est alors meacutemoriseacutee gracircce au signe drsquoaffectation dans lrsquoobjet fR

bull Si mode vaut E ou W lrsquoouverture du fichier est reacutealiseacutee en eacutecriture gracircce agrave lrsquoinstruction

fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les opeacuterations reacutealiseacutees sont eacutequivalentes agrave celles deacutecrites ci-dessus en remplaccedilant lemode lecture par le mode eacutecriture Cependant

bull Si le fichier speacutecifieacute en paramegravetre nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alors lefichier est creacuteeacute et lrsquoadresse du deacutebut du fichier est stockeacutee dans lrsquoobjet fW

ndash Si le chemin drsquoaccegraves nrsquoest pas valide le fichier nrsquoest pas creacuteeacute et une erreur du typeFileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute Lrsquoadresse dudeacutebut du fichier est alors stockeacutee dans lrsquoobjet fW

Traitement du fichier

Une fois le fichier ouvert les traitements reacutealisables sur lui sont lrsquoeacutecriture et la lecture dedonneacutees dans le fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

245

bull Lrsquoeacutecriture dans un fichier est reacutealiseacutee par la meacutethode suivante

public void ecrire(int tmp) throws IOException String chaine = chaine = chainevalueOf(tmp) if (chaine = null) fWwrite(chaine0chainelength()) fWnewLine()

La meacutethode ecrire() prend en paramegravetre la valeur agrave enregistrer dans le fichierComme il srsquoagit drsquoun entier et que le fichier est un fichier texte la valeur stockeacutee danstmp est convertie en String gracircce agrave lrsquoinstruction chaine = chainevalueOf(tmp)

Ensuite lrsquoeacutecriture de cette chaicircne dans le fichier est reacutealiseacutee par lrsquoinstructionfWwrite(chaine 0 chainelength()) La meacutethode write() envoie dans le fluxfW la chaicircne speacutecifieacutee en premier paramegravetre Les deuxiegraveme et troisiegraveme paramegravetrespreacutecisent respectivement agrave partir de quel caractegravere (0) commence lrsquoeacutecriture dans lefichier et combien de caractegraveres (chainelength) sont eacutecrits Pour notre exemplelrsquointeacutegraliteacute de la chaine est eacutecrite dans le fichier

Pour finir la meacutethode newLine()envoie dans le flux fW un caractegravere permettant depasser agrave la ligne suivante du fichier

bull La lecture dans un fichier est deacutecrite par la meacutethode

public String lire() throws IOException String chaine = fRreadLine() return chaine

Lrsquoopeacuteration de lecture est reacutealiseacutee par la meacutethode readLine() qui envoie tout drsquoabordla ligne lue sur le flux fR puis passe automatiquement agrave la ligne suivante dans le fichierLa chaicircne de caractegraveres chaine reacutecupegravere alors la suite des caractegraveres lus Pour finir lachaicircne est retourneacutee agrave la meacutethode appelante

Fermeture du flux

Une fois que tous les traitements ont eacuteteacute reacutealiseacutes le flux peut ecirctre naturellement fermeacutegracircce agrave la meacutethode

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWclose()

Suivant le mode drsquoouverture speacutecifieacute par la variable drsquoinstance mode (initialiseacutee lors delrsquoexeacutecution de la meacutethode ouvrir()) le flux fR ou fW est fermeacute gracircce agrave la meacutethodeclose()

Exemple Lrsquoapplication GestionFichier

Lrsquoapplication suivante utilise les meacutethodes deacutecrites ci-dessus pour creacuteer et manipuler unfichier dont le nom est saisi au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

246

public class GestionFichier public static void main (String [] arg) throws IOException Fichier f = new Fichier() Systemoutprint( Entrer le nom du fichier ) String nomFichier = LireS() fouvrir(nomFichier Ecriture) for (int i = 0 i lt 5 i++) fecrire(i) ffermer()

fouvrir(nomFichierLecture) String chaine = do chaine = flire() if (chaine = null) Systemoutprintln(chaine) while (chaine = null) ffermer()

Lrsquoinstruction fouvrir(nomFichier Ecriture) ouvre le fichier nomFichier en eacutecri-ture afin drsquoy eacutecrire une suite de valeurs entiegraveres (fecrire(i)) comprises entre 0 et 4 Lefichier est fermeacute (ffermer()) apregraves exeacutecution de la boucle for

Pour veacuterifier que les opeacuterations drsquoeacutecriture se sont bien deacuterouleacutees le fichier est ouvert enlecture (fouvrir(nomFichierLecture)) et gracircce agrave une boucle dohellipwhile chaqueligne du fichier est lue par flire() et meacutemoriseacutee dans une variable chaine afin drsquoecirctreafficheacutee La lecture de ce fichier prend fin lorsqursquoune chaicircne null est deacutetecteacutee (while(chaine = null)) Le fichier peut alors ecirctre fermeacute (ffermer())

Lrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

Entrer le nom du fichier VVaalleeuurrssttxxtt

01234

Le fichier Valeurstxt est creacuteeacute dans le mecircme reacutepertoire que celui ougrave se trouve lrsquoappli-cation GestionFichierclass Comme il srsquoagit drsquoun fichier texte il peut ecirctre ouvert parnrsquoimporte quel eacutediteur de texte (WordPad sous Windows vi sous Unix ou encore Teach-Text sous Mac OS) Crsquoest lagrave un des inteacuterecircts des fichiers textes

Remarquez cependant que les donneacutees manipuleacutees par un programme ne se reacutesumentgeacuteneacuteralement pas agrave de simples valeurs entiegraveres Le plus souvent une application travailleavec des objets complexes mecirclant plusieurs types de donneacutees Crsquoest pourquoi il est inteacute-ressant de pouvoir archiver non pas la suite des donneacutees relatives agrave un objet ligne parligne mais lrsquoobjet lui-mecircme en tant que tel Cette technique est examineacutee agrave la sectionsuivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

247

Les fichiers drsquoobjetsLe langage Java propose des outils permettant le stockage ainsi que la lecture drsquoobjetsdans un fichier Ces outils font appel agrave des meacutecanismes appeleacutes meacutecanismes de seacuterialisa-tion Ils utilisent des flux speacutecifiques deacutefinis par les classes ObjectOutputStream etObjectInputStream du package javaio

La seacuterialisation des objets

Un objet est seacuterialiseacute afin de pouvoir ecirctre transporteacute sur un flux de fichier entrant ousortant Gracircce agrave cette technique un objet peut ecirctre directement stockeacute dans un fichier(eacutecriture) ou reconstruit agrave lrsquoidentique en meacutemoire vive par lecture du fichier

Les meacutecanismes de seacuterialisation-deacuteseacuterialisation sont fournis par lrsquointermeacutediaire desclasses ObjectOutputStream et ObjectInputStream gracircce aux meacutethodes writeOb-ject() (seacuterialisation) et readObject() (deacuteseacuterialisation) Ces outils sont applicables agravetous les objets preacutedeacutefinis du langage Java tels que les String les vecteurs (Vector) ouencore les dictionnaires (Hashtable)

Lorsque vous souhaitez seacuterialiser un objet dont le type est deacutefini par le programmeur ilest neacutecessaire de rendre cet objet seacuterialisable Pour cela il suffit drsquoindiquer au compila-teur que la classe autorise la seacuterialisation en utilisant la syntaxe suivante

public class Exemple implements Serializable Donneacutees et meacutethodes

De cette faccedilon tous les objets deacuteclareacutes de type Exemple peuvent ecirctre lus ou eacutecrits dansdes fichiers drsquoobjets Remarquez que lrsquoobjectif de la seacuterialisation est de placer dans unflux toutes les informations relatives agrave un objet Par conseacutequent seules les variablesdrsquoinstance sont prises en compte lors drsquoune seacuterialisation alors que les variables declasses (deacutefinies en static) ne peuvent ecirctre seacuterialiseacutees En effet une variable de classeest commune agrave tous les objets de lrsquoapplication et non pas speacutecifique drsquoun seul objet

Exemple Archiver une classe drsquoeacutetudiants

Pour bien comprendre comment utiliser ces outils drsquoarchivage drsquoobjets modifionslrsquoapplication GestionClasse de sorte qursquoelle puisse lire et stocker automatiquementlrsquoensemble des donneacutees du dictionnaire listeClasseacutee dans un fichier portant le nom deClassedat

Nous devons tout drsquoabord rendre seacuterialisable les objets que nous souhaitons sauvegarderCrsquoest pourquoi il convient de modifier les en-tecirctes des classes Etudiant et Classe de lafaccedilon suivante

public class Etudiant implements Serializable voir la section Les dictionnairespublic class Classe implements Serializable voir la section Les dictionnaires

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

248

Agrave deacutefaut vous obtenez une erreur drsquoexeacutecution du type NotSerializableExceptionindiquant que lrsquoobjet de type Etudiant ou Classe ne peut ecirctre seacuterialiseacute

Ensuite les opeacuterations drsquoarchivage drsquoobjets utilisent les mecircmes concepts que ceuxdeacutecrits agrave la section preacuteceacutedente agrave savoir ouverture du fichier puis lecture ou eacutecriture desobjets et pour finir fermeture du fichier Crsquoest pourquoi nous allons modifier la classeFichier pour y manipuler non plus des fichiers textes mais des fichiers drsquoobjets

import javaiopublic class FichierEtudiant private ObjectOutputStream ofW private ObjectInputStream ofR private String nomDuFichier = Classedat private char mode

Les donneacutees de la classe FichierEtudiant sont deux objets repreacutesentant des flux drsquoeacutecri-ture (ofW) de lecture (ofR) drsquoobjets ainsi qursquoun caractegravere (mode) repreacutesentant le typedrsquoouverture du fichier et une chaicircne de caractegraveres (nomDuFichier) ougrave se trouve meacutemo-riseacute le nom de fichier de sauvegarde des donneacutees (Classedat)

Ouverture du flux (entrant ou sortant)

public void ouvrir(String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) ofR = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) ofW = new ObjectOutputStream(new FileOutputStream(nomDuFichier))

Lrsquoouverture du fichier Classedat en lecture est reacutealiseacutee gracircce aux constructeurs desclasses FileInputStream et ObjectInputStream alors que lrsquoouverture en eacutecriture esteffectueacutee par les constructeurs ObjectOutputStream() et FileOutputStream() Enreacutesultat les flux ofW et ofR contiennent les adresses de deacutebut de fichier

Traitement du fichier

Lrsquoobjectif est drsquoarchiver lrsquoensemble des donneacutees relatives agrave une classe drsquoeacutetudiants Lameacutethode ecrire() prend en paramegravetre un objet tmp de type Classe de sorte que lrsquoinfor-mation lui soit transmise depuis lrsquoapplication GestionClasse Lrsquoobjet transmis est alorsarchiveacute gracircce agrave la meacutethode writeObject(tmp)

public void ecrire(Classe tmp) throws IOException if (tmp = null) ofWwriteObject(tmp)

Inversement la meacutethode lire() lit lrsquoobjet stockeacute dans le fichier Classedat et letransmet en retour agrave lrsquoapplication GestionClasse sous forme drsquoobjet de type ClasseLrsquoen-tecircte de la meacutethode a pour type le type Classe Lrsquoobjet retourneacute est lu gracircce agrave lameacutethode readObject()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

249

public Classe lire() throws IOException ClassNotFoundException Classe tmp = (Classe) ofRreadObject() return tmp

Observons que

bull La meacutethode lire() traite obligatoirement un nouveau type drsquoexception ClassNot-FoundException En effet la meacutethode readObject() transmet ce type drsquoexceptionlorsque le fichier lu ne contient pas drsquoobjet mais tout autre chose

Pour plus de preacutecisions sur la gestion des exceptions voir la section laquo Geacuterer les exceptions raquo en finde chapitre

bull La meacutethode readObject() lit sur le flux un objet quel que soit son type Il est doncneacutecessaire de speacutecifier par lrsquointermeacutediaire drsquoun laquo cast raquo le format de lrsquoobjet lu (voirau Chapitre 1 laquo Stocker une information raquo la section laquo La transformation de type raquo)Pour notre exemple lrsquoobjet lu est transmis agrave lrsquoobjet tmp par lrsquointermeacutediaire drsquoun cast(Classe) qui reacutealise la transformation de lrsquoobjet au bon format

Fermeture du flux

La fermeture drsquoun flux est reacutealiseacutee par la meacutethode close() de la mecircme faccedilon qursquoun fluxde fichier texte

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRoclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWoclose()

Exemple Lrsquoapplication GestionClasse

Lrsquoapplication GestionClasse a pour contrainte de reacutealiser les actions suivantes

bull Une lecture automatique du fichier laquo classedat raquo degraves lrsquoouverture du programme afindrsquoinitialiser lrsquoobjet C (type Classe) agrave la liste drsquoeacutetudiants saisie lors drsquoune preacuteceacutedenteexeacutecution

bull Une sauvegarde automatique dans le fichier laquo classedat raquo lorsque lrsquoutilisateurchoisit de sortir du programme

Ces deux contraintes sont reacutealiseacutees par lrsquoapplication suivante

import javaiopublic class GestionClasse public static void main (String [] argument) throws IOException ClassNotFoundException byte choix = 0 Classe C = new Classe() FichierEtudiant F = new FichierEtudiant() Fouvrir(Lecture) C = Flire() Ffermer() String preacutenom nom do

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

250

Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) pour les options 1 2 3 4 voir Exemple Creacuteer un dictionnaire drsquoeacutetudiants case 1 Ajoute un etudiant case 2 Supprime un etudiant case 3 Affiche les etudiants case 4 Affiche un etudiant case 5 Systemoutprintln(Sauvegarde des donnees dans

Classedat) Fouvrir(Ecriture) Fecrire(C) Ffermer() Systemexit(0) break default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 5) Fin de la classe GestionClasse

Lrsquoexeacutecution de cette application montre qursquoune difficulteacute subsiste En effet lors de latoute premiegravere exeacutecution du programme lrsquointerpreacuteteur affiche le message suivant

javaioFileNotFoundException Classedat (Le fichier speacutecifieacute est introuvable) at javaioFileInputStreamopen(Native Method) at javaioFileInputStreamltinitgt(FileInputStreamjava68) at FichierEtudiantouvrir(FichierEtudiantjava14) at GestionClassemain(Compiled Code)

Lrsquoerreur FileNotFoundException est transmise agrave la meacutethode main() via la meacutethodeFileInputStreamopen() gracircce agrave la clause throws IOException

En effet le fichier Classedat nrsquoexiste pas encore puisque crsquoest la premiegravere fois que leprogramme est exeacutecuteacute Lrsquooption 5 nrsquoa pu ecirctre exeacutecuteacutee et aucune sauvegarde nrsquoa donceacuteteacute reacutealiseacutee Tant que le programme ne peut ecirctre exeacutecuteacute dans son inteacutegraliteacute aucunfichier de sauvegarde ne peut ecirctre creacuteeacute

Pour contourner cet obstacle la solution consiste agrave empecirccher les erreurs de remonterdrsquoune meacutethode agrave lrsquoautre gracircce agrave la clause throws tout en geacuterant de faccedilon explicitechaque erreur qui pourrait survenir Cette solution est examineacutee agrave la section suivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

251

Geacuterer les exceptionsPlutocirct que de laisser lrsquoerreur se propager (avec la clause throws) le langage Java proposedes outils de capture des erreurs afin de les traiter directement agrave lrsquointeacuterieur des meacutethodessusceptibles de les deacutetecter Cette capture est reacutealiseacutee par lrsquointermeacutediaire des instructionstryhellipcatch

La meacutethode ouvrir()

Examinons le meacutecanisme de ces instructions sur la meacutethode ouvrir() proposeacutee agrave lasection preacuteceacutedente Comme observeacute preacuteceacutedemment cette meacutethode pose problegravemepuisqursquoelle propage lrsquoerreur FileNotFoundException lors de la toute premiegravere exeacutecutionde lrsquoapplication GestionClasse Pour eacuteviter cette propagation lrsquoideacutee est de placer lecouple drsquoinstructions tryhellipcatch de la faccedilon suivante

public boolean ouvrir(String s) try mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRo = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWo = new ObjectOutputStream(new FileOutputStream(nomDuFichier)) return true catch (IOException e) return false

La meacutethode srsquoexeacutecute alors de la faccedilon suivante comme expliqueacute ci-apregravesLes instructions qui composent le bloc try (en franccedilais essayer) sont exeacutecuteacutees

bull Si aucune erreur nrsquoest transmise par les diffeacuterents constructeurs qui reacutealisent lrsquoouver-ture du fichier le programme sort de la meacutethode ouvrir() en retournant un booleacuteende valeur eacutegale agrave true

bull Si une erreur est propageacutee par lrsquoun des constructeurs les instructions placeacutees dans lebloc catch (capture) sont exeacutecuteacutees agrave condition que lrsquoerreur deacutetecteacutee soit du mecircmetype que celui placeacute entre parenthegraveses derriegravere le terme catch Lrsquoerreur FileNotFoun-dException eacutetant du type IOException le programme sort de la meacutethode ouvrir()en retournant un booleacuteen de valeur eacutegale agrave false Aucun fichier nrsquoest donc ouvert

Puisque la meacutethode ouvrir() capture et traite elle-mecircme les erreurs eacuteventuelles la preacutesencede la clause throws devient inutile et elle nrsquoapparaicirct plus dans lrsquoen-tecircte de la meacutethode

Gracircce au traitement des erreurs en interne les instructions relatives agrave lrsquoouverture dufichier en lecture dans lrsquoapplication GestionClasse peuvent ecirctre modifieacutees de la faccedilonsuivante

FichierEtudiant F = new FichierEtudiant()if (Fouvrir(L)) C = Flire() Ffermer()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

252

Le fichier est ouvert gracircce agrave lrsquoinstruction Fouvrir() Si le reacutesultat de la meacutethode vauttrue cela signifie que le fichier classedat existe et est ouvert Les instructions delecture du fichier situeacutees dans le bloc if peuvent ecirctre exeacutecuteacutees Agrave lrsquoinverse si le reacutesultatvaut false aucune instruction nrsquoest exeacutecuteacutee Le menu permettant la saisie de nouveauxeacutetudiants peut alors ecirctre afficheacute

La meacutethode lire()

La meacutethode lire() est susceptible de lever plusieurs types drsquoexception via la meacutethodereadObject() En effet cette derniegravere est susceptible de deacutetecter des erreurs du typeIOException ou ClassNotFoundException

La capture de ces exceptions est reacutealiseacutee en deacutefinissant autant de blocs catch qursquoil y adrsquoerreurs deacutetecteacutees La meacutethode lire() traite ces erreurs de la faccedilon suivante

public Classe lire() try Classe tmp = (Classe) fRoreadObject() return tmp catch (IOException e) Systemoutprintln(nomDuFichier + Erreur de lecture ) catch (ClassNotFoundException e) Systemoutprintln(nomDuFichier + nrsquoest pas du bon format ) return null

Il est ainsi possible de deacutefinir deux blocs catch successifs parameacutetreacutes en fonction destypes drsquoerreurs susceptibles drsquoecirctre deacutetecteacutes Le programme reacuteagit diffeacuteremment suivantlrsquoerreur captureacutee

ReacutesumeacuteLa programmation dynamique permet la gestion drsquoun nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Pour ce faire le langage Java propose diffeacuterents outils tels que les objets de typeVector ou encore de type Hashtable

Les objets de type Vector autorisent la creacuteation drsquoune liste par ajout de donneacutees au furet agrave mesure des besoins de lrsquoutilisateur Les donneacutees sont en geacuteneacuteral enregistreacutees dansleur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteur permet de retrouver lrsquoinformation

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Pour ajouter un objet agrave la liste il suffit drsquoeacutecrire listeaddElement(objet) Il nrsquoestpas possible drsquoajouter une valeur autre qursquoun objet (telle que les variables de typeint par exemple)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

253

Lorsque que lrsquoobjet est inseacutereacute dans la liste la taille de cette derniegravere est augmenteacuteede un La meacutethode size() calcule le nombre drsquoeacuteleacutements dans la liste et la meacutethodeelementAt(indice) permet de retrouver lrsquoobjet stockeacute agrave lrsquoindice speacutecifieacute en para-megravetre

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placerlrsquoinstruction importjavautil en tecircte du fichier En effet si cette instructionfait deacutefaut le compilateur deacutetecte une erreur du type Class Vector not found

La recherche drsquoeacuteleacutements complexes dans une liste est plus rapide lorsque lesdonneacutees sont organiseacutees non plus par rapport agrave un indice mais par rapport agrave une cleacuteexplicite Les objets de type Hashtable proposent ce type drsquoorganisation desdonneacutees Pour cela il suffit de deacuteclarer une liste comme

Hashtable liste = new Hashtable ()

Les meacutethodes put(cleacute objet) et get(cleacute) permettent respectivement de placerdans la liste (dictionnaire) lrsquoassociation cleacutendashobjet et de retrouver lrsquoobjet associeacute agravela cleacute speacutecifieacutee en paramegravetre

Pour eacuteviter que les donneacutees stockeacutees en meacutemoire vive de lrsquoordinateur ne se perdentagrave lrsquoarrecirct de lrsquoapplication il est neacutecessaire de les archiver sous forme de fichiers sur ledisque dur Pour cela le langage Java utilise le concept de flux de fichier (en anglaisstream) qui est en quelque sorte la concreacutetisation informatique du courant eacutelec-trique passant de la meacutemoire vive au disque dur de lrsquoordinateur

Il existe diffeacuterents types de flux de fichiers

bull Drsquoune part les flux entrant pour lire les donneacutees sur le disque dur et les placer enmeacutemoire vive et les flux sortant qui eacutecrivent les donneacutees de la meacutemoire vive surle disque dur

bull Drsquoautre part les fichiers de type texte (BufferedWriter BufferedReader) qui nefont que manipuler des donneacutees de type String et les fichiers drsquoobjets (Objec-tOutputStream ObjectInputStream) qui manipulent tout type drsquoobjet

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouver-ture du flux traitement des donneacutees parcourant le flux puis fermeture du fluxLorsqursquoun fichier est ouvert en eacutecriture

bull Si le fichier nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alorsle fichier est creacuteeacute

ndash Si le chemin drsquoaccegraves nrsquoest pas valide alors le fichier nrsquoest pas creacuteeacute et uneerreur du type FileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute

Lorsqursquoune erreur est deacutetecteacutee par les meacutethodes associeacutees au flux le coupledrsquoinstructions tryhellipcatch permet la capture de lrsquoexception afin de lui associer untraitement speacutecifique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

254

ExercicesComprendre les vecteurs

Lrsquoobjectif est de stocker les notes drsquoun eacutetudiant sous la forme drsquoun vecteur

a Deacutefinissez un objet note de type Vector comme variable drsquoinstance de laclasse Etudiant

b Modifiez le constructeur de la classe Etudiant afin de saisir les notes et de lesplacer dans le vecteur

Prenez garde que seul un objet peut ecirctre stockeacute dans un vecteur Une note eacutetantde type double (type simple) ne peut pas ecirctre directement placeacutee dans levecteur Il est neacutecessaire de la transformer en objet de type Double Lrsquoappel auconstructeur de la classe Double permet cette transformation

Par exemple lrsquoinstruction new Double(Lired()) permet la transformationdirecte drsquoune valeur double saisie au clavier en un objet de type Double

c La meacutethode calculMoyenne() doit calculer la moyenne des notes agrave partir desnotes saisies dans le constructeur Le programme doit par conseacutequent parcourirlrsquoensemble du vecteur note afin drsquoen calculer la somme Puisque ces valeurssont stockeacutees sous la forme drsquoobjets Double il est neacutecessaire pour reacutealiser cecalcul de les transformer de nouveau en type simple double Pour cela ilconvient drsquoappliquer la meacutethode doubleValue() agrave lrsquoobjet de type Double

d Dans la meacutethode afficheUnEtudiant() modifiez lrsquoaffichage des notes enparcourant non plus le tableau mais le vecteur note

Comprendre les dictionnaires

Lrsquoobjectif est drsquoeacutecrire une meacutethode modifieUnEtudiant() qui modifie les notesdrsquoun eacutetudiant stockeacute dans un dictionnaire Cette meacutethode fonctionne dans lrsquoensem-ble comme la meacutethode ajouteUnEtudiant() (voir la section laquo Les dictionnaires raquode ce chapitre)

a Cependant la meacutethode doit connaicirctre les nom et preacutenom de lrsquoeacutetudiant agrave modifierCes donneacutees lui sont transmises par paramegravetre

b Ensuite connaissant les nom et preacutenom le programme calcule la cleacute et veacuterifie silrsquoeacutetudiant existe dans la liste

c Srsquoil existe la modification consiste agrave lui donner de nouvelles notes Pour celalrsquoideacutee est drsquoeacutecrire un deuxiegraveme constructeur Etudiant() dont les paramegravetressont les nom et preacutenom de lrsquoeacutetudiant Le corps du constructeur ne fait ensuite questocker dans les variables drsquoinstance approprieacutees les nom et preacutenom passeacutes enparamegravetres sans avoir agrave les ressaisir puis saisir les nouvelles notes et enfincalculer la moyenne

d Modifiez lrsquoapplication GestionClasse de faccedilon agrave inteacutegrer au menu cettenouvelle option

101

102

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

255

Geacuterer les erreursLrsquoobjectif est de capturer toutes les erreurs (IOException) possibles dans la classeFichierEtudiant deacutecrite au cours de ce chapitre

a Reprenez la classe FichierEtudiant et geacuterez la deacutetection des erreurs pour lesmeacutethode fermer() et ecrire() en deacutefinissant des blocs catch et try appro-prieacutes

b Lorsque toutes les meacutethodes de la classe FichierEtudiant gegraverent les excep-tions plus aucune clause throws ne doit apparaicirctre sur lrsquoen-tecircte des meacutethodes ycompris pour la meacutethode main() de lrsquoapplication GestionClasse Modifiezlrsquoapplication GestionClasse en tenant compte de cette remarque

Le projet laquo Gestion drsquoun compte bancaire raquoLes comptes sous forme de dictionnaireLa classe ListeCompte

En reprenant la classe Classe preacutesenteacutee au cours de ce chapitre eacutecrire la classeListeCompte dont la donneacutee est une liste de type Hashtable La classe ListeCompte estcomposeacutee des meacutethodes suivantes

a ListeCompte() qui fait appel au constructeur de la classe Hashtable

b ajouteUnCompte(String t) qui permet la creacuteation drsquoun compte courant joint oudrsquoeacutepargne Afin de faire appel au constructeur approprieacute (Compte() ou CpteEpar-gne()) faire passer en paramegravetre de la meacutethode ajouteUnCompte() une chaicircne decaractegraveres speacutecifiant le type du compte agrave creacuteer Par exemple lorsque le paramegravetre dela meacutethode vaut E un compte drsquoeacutepargne est creacuteeacute alors que srsquoil vaut A (commeAutre) un compte ordinaire est creacuteeacute

Lorsque le compte est creacuteeacute inseacuterez-le dans le dictionnaire en prenant comme cleacutedrsquoassociation son numeacutero de compte

c ajouteUneLigne() qui ajoute une ligne au compte dont le numeacutero est speacutecifieacute enparamegravetre de la meacutethode Pour cela faites appel agrave la meacutethode creacuteerLigne() de laclasse Compte

d Les meacutethodes rechercheUnCompte() supprimeUnCompte() et afficheLesComp-tes() sont agrave eacutecrire en srsquoinspirant des meacutethodes eacutequivalentes de la classe Classe

Lrsquoapplication Projet

Dans lrsquoapplication Projet deacuteclarer lrsquoobjet C comme eacutetant du type ListeCompte Puis

a Dans chaque option du menu faire appel aux meacutethodes de la classe ListeCompte

b Lors de lrsquoajout drsquoun compte ne pas omettre de speacutecifier en paramegravetre le type ducompte (A ou E)

c Ajouter lrsquooption de suppression drsquoun compte (option 5) et lrsquoaffichage de la liste detous les comptes (option 3) Modifier lrsquoaffichage du menu et le switch de faccedilon agravetenir compte de ces nouvelles options Remarquez qursquoil nrsquoest plus besoin de tester

103

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

256

lrsquoexistence du compte avant de lrsquoafficher ou de le supprimer puisque ce sont lesmeacutethodes de la classe ListeCompte qui srsquoen chargent directement

La sauvegarde des comptes bancaires

La classe FichierCompte

Pour sauvegarder les donneacutees saisies pour chaque compte reprendre la classe FichierE-tudiant deacutecrite dans ce chapitre

a Modifier le nom de la classe par FichierCompte et remplacer le nom du fichier desauvegarde par laquo Comptedat raquo

b Dans les meacutethodes lire() et ecrire() remplacer lrsquoobjet lu ou eacutecrit par un objet detype ListeCompte

c Ne pas oublier de rendre seacuterialisable lrsquoensemble des classes neacutecessaires agrave la cons-truction de la liste des comptes

Lrsquoapplication Projet

Modifier lrsquoapplication de faccedilon agrave

a lire le fichier laquo Comptedat raquo avant de proposer lrsquoajout la suppression ou lrsquoaffichagedes comptes

b reacutealiser une sauvegarde automatique agrave la sortie du programme (option 6)

La mise en place des dates dans les lignes comptables

Chaque ligne comptable est deacutefinie par un ensemble de donneacutees dont la date de reacutealisa-tion de lrsquoopeacuteration Pour lrsquoinstant cette date est saisie sous forme drsquoun String sansaucun controcircle sur le format reacuteellement saisi (jourmoisan) Lrsquoobjectif est drsquoeacutecrire unemeacutethode qui veacuterifie si les valeurs saisies correspondent au format demandeacute

Rechercher des meacutethodes dans les diffeacuterents packages

Pour effectuer ce controcircle le langage Java propose un certain nombre drsquooutils deacutefinisdans les packages du JDK En particulier il existe des outils qui transforment une chaicircnede caractegraveres en objet Date Cette transformation est reacutealiseacutee agrave partir drsquoun format deacutefinipar le programmeur

Pour trouver ces diffeacuterents outils les deux solutions suivantes sont possibles

a Soit rechercher dans lrsquoarborescence du JDK fourni avec le CD-Rom (jdk13docsapijava) tous les fichiers contenant le mot Date afin de deacuteterminer les diffeacuterentspackages concerneacutes par ce type drsquoinformation Puis pour tous les fichiers trouveacutesexaminer les diffeacuterentes meacutethodes proposeacutees de faccedilon agrave trouver celle susceptible dereacutepondre agrave votre attente

b Soit se connecter sur Internet par exemple agrave lrsquoadresse httpforum2javasuncomforum de faccedilon agrave y rechercher des exemples utilisant des objets de type Date

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

257

Eacutecrire la meacutethode controcircleDate()Lrsquoalgorithme permettant le controcircle du format de la date est le suivant

a Saisir une date comme une suite de caractegraveres (String)

b Traduire cette chaicircne en objet Date gracircce aux meacutethodes trouveacutees agrave lrsquoeacutetape preacuteceacute-dente

c Capturer les erreurs propageacutees par cette meacutethode afin drsquoincreacutementer un compteurdrsquoessai de saisie de la date

d Reacutepeacuteter ces deux derniers points tant que la date nrsquoest pas correctement traduite(lrsquoobjet date restant eacutegal agrave null) Au bout de trois essais la date est initialiseacutee agrave ladate courante du systegraveme de lrsquoordinateur

e En sortie de boucle la date correspond au format demandeacute Elle peut ecirctre traduite entype String pour ecirctre ensuite stockeacutee dans la donneacutee date de la classe LigneComp-table

copy copyright Eacuteditions Eyrolles

11Dessiner des objets

Le langage Java srsquoest surtout fait connaicirctre en proposant pour Internet des outils de deacuteve-loppement drsquoapplications graphiques multiplates-formes crsquoest-agrave-dire fonctionnant surdes ordinateurs de tout type Ces programmes sont exeacutecuteacutes agrave travers un navigateur Webde faccedilon transparente pour lrsquointernaute que lrsquoordinateur utiliseacute soit un Mac un PC ouune station Unix

Ces applications utilisent des composants graphiques deacutefinis dans la librairie graphiqueAWT (Abstract Windowing Toolkit) Dans ce chapitre nous eacutetudions drsquoabord agrave lasection laquo La librairie AWT raquo comment utiliser les outils de ce package Nous abordonsensuite agrave la section laquo Les eacuteveacutenements raquo la gestion des eacuteveacutenements en analysantcomment associer une action ou un comportement agrave un composant graphique Pourfinir nous construisons agrave la section laquo Les applets raquo une application directement exeacutecu-table par un navigateur Web

La librairie AWTLa librairie AWT est un package du JDK (Java Development Kit) qui propose unensemble drsquooutils de creacuteation drsquoapplications graphiques crsquoest-agrave-dire drsquoapplications dontle mode de communication avec lrsquoutilisateur srsquoeacutetablit agrave travers des eacuteleacutements graphiquestels que boutons menus fenecirctres etc

Notre objectif nrsquoest pas de deacutecrire lrsquointeacutegraliteacute de la librairie AWT mais de preacutesenter aulecteur un certain nombre drsquoexemples afin de lui donner une bonne vision de lrsquoutilisationde ces outils ainsi qursquoune certaine meacutethodologie Pour cela nous reprenons lrsquoexempledu sapin de Noeumll deacutecoreacute deacutecrit agrave la section laquo Les tableaux agrave deux dimensions raquo duchapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Cette fois le sapin nrsquoest plusafficheacute agrave lrsquoaide de simples caractegraveres mais avec des composants graphiques utilisant lesmeacutethodes preacutedeacutefinies de lalibrairie AWT

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

260

Les fenecirctresLrsquoaffichage drsquoun outil graphique quel qursquoil soit (bouton menu etc) est toujours reacutealiseacutedans une fenecirctre Toute application graphique srsquoexeacutecute agrave lrsquointeacuterieur drsquoune zone deacuteli-miteacutee appeleacutee fenecirctre principale dans laquelle sont placeacutes barres drsquooutils menus etzones de texte ou de dessin

Cette fenecirctre deacutelimite le cadre drsquoexeacutecution du programme et tout eacuteleacutement se situant endehors de la fenecirctre fait partie drsquoune autre application La fenecirctre possegravede un bord et unebarre de titre dans laquelle se situent des boutons de fermeture et de mise en icocircne oudrsquoagrandissement comme illustreacute agrave la Figure 11-1 Elle peut ecirctre deacuteplaceacutee ou agrandiesans que le programmeur ait agrave geacuterer lui-mecircme ces actions

En langage Java la fenecirctre principale est deacutefinie gracircce agrave la classe Frame Observez leprogramme suivant qui deacutecrit comment deacutefinir et afficher une Frame

Exemple Une fenecirctre

import javaawtclass Fenetre public final static int HT = 300 public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() FsetTitle(Une fenetre) met le titre FsetSize(HT LG) taille de la fenecirctre FsetBackground(Colorgray) Fshow() affiche la fenecirctre

Figure 11-1

La fenecirctre principale deacutelimite le lieu drsquoexeacutecution du programme Elle est constitueacutee drsquoune bordure et drsquoune barre de titre

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

261

Nous constatons tout drsquoabord que la toute premiegravere instruction drsquoun programme quiutilise des objets graphiques est obligatoirement une instruction drsquoimport du package dela librairie AWT (import javaawt ) En effet comme pour les vecteurs et lesdictionnaires les outils de la librairie graphique ne sont pas directement connus ducompilateur

Apregraves avoir deacutefini deux constantes HT et LG pour la hauteur et la largeur de la fenecirctre lafonction main() deacuteclare et construit un objet F de type Frame (Frame F = newFrame()) Comme toute classe la classe Frame propose un ensemble de meacutethodes quipermettent la transformation de ses caracteacuteristiques notamment les suivantes

bull setTitle() qui place la chaicircne de caractegraveres speacutecifieacutee en paramegravetre dans la barre detitre de la fenecirctre

bull setSize() qui deacutefinit la hauteur et la largeur de la fenecirctre

bull setBackground() qui donne une couleur de fond agrave la fenecirctre

Cela fait la fenecirctre est deacutefinie en meacutemoire mais nrsquoest pas encore afficheacutee agrave lrsquoeacutecran Pourreacutealiser cet affichage la meacutethode show() deacutefinie par la classe Frame est appliqueacutee agrave lrsquoobjet F

Pour connaicirctre en deacutetail lrsquoensemble des fonctionnaliteacutes de la classe Frame reportez-vousau fichier Cjdk13docsapijavaawtFramehtml apregraves installation du JDK et desa documentation

Exemple Reacutesultat de lrsquoexeacutecution

Lors de lrsquoexeacutecution de ce programme la fenecirctre ayant pour titre laquo Une fenetre raquo appa-raicirct agrave lrsquoeacutecran comme illustreacute agrave la Figure 11-1

Le dessinUne fois afficheacutee la fenecirctre nrsquoest pas encore directement fonctionnelle et il nrsquoest paspossible drsquoy afficher un dessin ou drsquoy eacutecrire un texte Il nrsquoest pas non plus possible defermer la fenecirctre en cliquant sur le bouton de fermeture situeacute dans la barre de titre

En effet lrsquoaffichage drsquoun dessin ne peut ecirctre reacutealiseacute que par lrsquointermeacutediaire drsquoun objet detype Canvas

En outre pour fermer la fenecirctre drsquoun simple clic sur le bouton approprieacute le programmedoit ecirctre capable drsquoentendre les clics de la souris Nous eacutetudions ce concept agrave la sectionlaquo Les eacuteveacutenements raquo en fin de chapitre

Exemple Dessiner un sapin de Noeumll

Lrsquoobjectif de cet exemple est de reacutealiser lrsquoaffichage drsquoun sapin deacutecoreacute en mode graphiqueFidegravele agrave la meacutethode de travail qui consiste agrave deacutecouper un problegraveme en plusieurs tacircchesindeacutependantes nous allons reacutealiser lrsquoaffichage du sapin de Noeumll eacutetape par eacutetape

Prenons pour hypothegravese qursquoun sapin est formeacute de triangles disposeacutes agrave lrsquoeacutecran de faccedilonque leur juxtaposition reacutealise une forme de sapin Nous placerons ensuite la deacutecorationdu sapin en modifiant la couleur de certains triangles

Nous devons concevoir dans un premier temps un programme qui dessine un simpletriangle de couleur verte

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

262

Dessiner un triangle

Pour cela nous deacutefinissons une classe Dessin qui heacuterite de la classe Canvas (classDessin extends Canvas) De cette faccedilon un objet de type Dessin correspond agrave unezone drsquoaffichage ougrave il est possible de dessiner des formes geacuteomeacutetriques (point droiterectangle etc) Examinons attentivement cette classe

import javaawtpublic class Dessin extends Canvas public Dessin() setBackground(Colorwhite) setForeground(Colorgreen) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) public void paint (Graphics g) new Triangle(g)

La classe Dessin est composeacutee des deux meacutethodes suivantes

bull Le constructeur Dessin() qui initialise une partie des caracteacuteristiques drsquoun objetCanvas agrave savoir

ndash La couleur de fond La meacutethode setBackground(Colorwhite) place la couleurblanche en fond de la zone de dessin (Canvas)

ndash La couleur drsquoavant-plan La meacutethode setForeground(Colorgreen) assigne lacouleur verte aux formes geacuteomeacutetriques dessineacutees dans la zone de dessin

ndash Le curseur La meacutethode setCursor(new Cursor(CursorCROSSHAIR_CURSOR))affiche un curseur en forme de croix lorsque le curseur de la souris se situe dans lazone de dessin

bull La meacutethode paint() qui est une meacutethode preacutedeacutefinie de la classe Canvas Cette meacutethodeest appeleacutee par lrsquointerpreacuteteur degraves qursquoil lui est neacutecessaire drsquoafficher un objet graphiqueElle est appeleacutee lors de lrsquoaffichage de la fenecirctre principale ou lorsque cette derniegravere reacuteap-paraicirct apregraves avoir eacuteteacute partiellement ou totalement cacheacutee par une autre fenecirctre

La meacutethode paint() utilise en paramegravetre un objet g de type Graphics de faccedilon agravedrsquoobtenir des informations sur le contexte graphique deacutefini par lrsquoapplication Le contextegraphique est lrsquoensemble des informations utiles agrave lrsquoaffichage drsquoun objet La couleur etla forme des caractegraveres (fonte) par exemple font partie du contexte graphique

Ainsi lorsque lrsquointerpreacuteteur affiche une fenecirctre il transmet agrave la meacutethode paint() parlrsquointermeacutediaire du paramegravetre g toutes les caracteacuteristiques de lrsquoaffichage En particulier il luitransmet sa couleur drsquoavant-plan initialiseacutee agrave colorgreen dans le constructeur Dessin()

Pour finir lrsquoexeacutecution de la meacutethode paint() reacutealise lrsquoaffichage du triangle gracircce agrave lrsquoappeldu constructeur de la classe Triangle (new Triangle(g)) dont voici la description

import javaawtpublic class Triangle private int centreX = FenetreLG2 private int centreY = FenetreHT2 private int [] xPoints = centreX centreX + 10 centreX - 10

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

263

private int [] yPoints = centreY - 10 centreY + 10 centreY + 10 int nPoints = 3 public Triangle(Graphics g) gfillPolygon(xPoints yPoints nPoints)

Les donneacutees de la classe Triangle correspondent agrave deux tableaux drsquoentiers deacutefinissantles sommets drsquoun triangle centreacute comme illustreacute agrave la Figure 11-2

Le sommet A est deacutefini par le couple de coordonneacutees (xPoints[0] yPoints[0]) lesommet B par (xPoints[1] yPoints[1]) et C par (xPoints[2] yPoints[2]) Lestableaux deacutefinissent ainsi les sommets drsquoun polygone (triangle) centreacute par rapport agrave lafenecirctre principale de lrsquoapplication Notez que les coordonneacutees des sommets sont deacutefiniespar rapport agrave lrsquoorigine de lrsquoobjet Canvas laquelle est situeacutee par deacutefaut dans le coin supeacute-rieur gauche de cet objet

Lrsquoaffichage du triangle est reacutealiseacute gracircce agrave la meacutethode fillPolygon(xPoints yPointsnPoints) qui remplit de couleur le polygone speacutecifieacute en paramegravetre La couleur deremplissage est deacutetermineacutee par lrsquointermeacutediaire de lrsquoobjet g sur lequel la meacutethode estappliqueacutee

Lrsquoapplication Fenetre

Sans modification de lrsquoapplication Fenetre telle que deacutefinie agrave la section preacuteceacutedente dece chapitre (voir laquo Les fenecirctres raquo) aucun triangle nrsquoapparaicirct En effet avant drsquoexeacutecuter leprogramme nous devons ajouter agrave la fenecirctre le composant Dessin de sorte que lrsquoappli-cation puisse associer lrsquoobjet de type Canvas agrave la Frame F

Figure 11-2

Le triangle est construit agrave partir des sommets A B et C dont les coordonneacutees sont calculeacutees par rapport agrave lrsquoorigine de la zone de dessin situeacutee en haut et agrave gauche

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

264

Pour cela il suffit drsquoajouter lrsquoinstruction Fadd(new dessin()) comme lrsquoillustre lrsquoextraitde programme suivant

class Fenetre hellip Frame F = new Frame() FsetTitle(Un triangle) hellip Fadd(new Dessin()) Fshow() affiche la fenecirctre

La meacutethode add() ajoute un composant graphique agrave la fenecirctre principale Ce composantest deacutefini par la classe Dessin Une fois F afficheacutee gracircce agrave la meacutethode show la meacutethodepaint() est exeacutecuteacutee automatiquement et le triangle srsquoaffiche

La construction du sapin

Sachant maintenant afficher un simple triangle nous pouvons construire le sapin par juxta-position drsquoun ensemble de triangles Pour reacutealiser le bon positionnement des trianglesutilisons la technique deacuteveloppeacutee agrave la section laquo Les tableaux agrave deux dimensions raquo duChapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Analysons la classe Arbre quireprend ce proceacutedeacute

import javaawtclass Arbre private int [][] sapin private Color deacutecoration public Arbre(int nl Color c) int nc = 2nl-1 deacutecoration = c sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int j = 0 j lt nl j++) for ( int i = -j i lt= j i++) sapin[j][milieu+i] = (int ) (5Mathrandom()+1) public void dessine(Graphics g) Color Vert = Colorgreen for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) switch(sapin[i][j]) case 1 new Triangle(i j g deacutecoration) break case 2 Vert = Vertbrighter() new Triangle(i j g Vert) break case 3 Vert = Vertdarker() new Triangle(i j g Vert) break

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

265

case 4 Vert = Vertbrighter() new Triangle(i j g Vert) break case 5 Vert = Vertdarker() new Triangle(i j g Vert) break case 6 Vert = Vertbrighter() new Triangle(i j g Vert) break

La classe Arbre est composeacutee de deux donneacutees le tableau drsquoentiers agrave deux dimensionssapin et la couleur deacutecoration Elle comporte en outre les deux meacutethodes suivantes

bull Le constructeur Arbre() qui initialise la couleur de la deacutecoration et le tableausapin qui utilise la mecircme technique que le sapin afficheacute en caractegraveres graphiques Lesparamegravetres du constructeur rendent possible la creacuteation de sapins de taille et decouleur diffeacuterentes

bull La meacutethode dessine() qui en parcourant le tableau sapin creacutee un triangle agrave lrsquoaide duconstructeur de la classe Triangle pour toute valeur sapin[i][j] diffeacuterente de 0Gracircce aux paramegravetres du nouveau constructeur Triangle() le triangle est afficheacute agravelrsquoeacutecran en fonction de sa position dans le tableau (indices i et j) et de la valeur dutableau (sapin[i][j]) Remarquez les meacutethodes darker() et brighter() quipermettent de foncer ou drsquoeacuteclaircir la couleur sur laquelle la meacutethode est appliqueacuteeGracircce agrave ces meacutethodes le sapin nrsquoapparaicirct pas drsquoun vert uniforme

Les paramegravetres du constructeur de la classe Triangle sont donc modifieacutes de faccedilon agrave neplus afficher un seul triangle vert au centre de la fenecirctre mais un triangle drsquoune couleuret drsquoune position donneacutees Pour reacutealiser cela le constructeur est deacutefini avec un ensemblede paramegravetres caracteacuterisant la position en x et y agrave lrsquoeacutecran ainsi que la couleur drsquoaffichagedu triangle Examinons cette modification dans la classe Triangle ci-dessous

import javaawtpublic class Triangle private int pX = FenetreLG2-50 private int pY = FenetreHT2-50 private int [] xPoints = 0 10 -10 private int [] yPoints = -10 10 10 private int nPoints = 3 public Triangle(int col int lig Graphics g Color c) for (int i = 0 i lt nPoints i++) xPoints[i] = xPoints[i]+(5lig) + pX yPoints[i] = yPoints[i]+(15col) + pY gsetColor(c) gfillPolygon(xPoints yPoints nPoints)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

266

Chaque triangle afficheacute ne se trouve plus au centre de la fenecirctre mais agrave une positionspeacutecifieacutee en paramegravetre Cette position est deacutetermineacutee par les eacuteleacutements suivants

bull un point de reacutefeacuterence (pX pY) deacutefini en fonction de la taille de la fenecirctre

bull la position (i j) du triangle dans le tableau sapin

Ces valeurs sont transmises au constructeur gracircce aux paramegravetres col et lig Ces valeurseacutetant connues les sommets du polygone sont calculeacutes de faccedilon agrave afficher ce dernier aubon endroit agrave lrsquoeacutecran Comme tous les triangles prennent un certain espace en hauteur eten largeur il est neacutecessaire drsquoappliquer un coefficient (5 et 10) aux indices lig et colpour que chaque triangle ne se superpose pas trop agrave ses voisins

Le dessin du sapin

Pour que le sapin construit en meacutemoire srsquoaffiche ce dernier doit ecirctre placeacute dans la fenecirctrede dessin Crsquoest ce que reacutealise la classe Dessin suivante

import javaawtpublic class Dessin extends Canvas private Color couleur = Colorgreen public final static Color couleurFond = Colorwhite private Arbre A public Dessin() setBackground(couleurFond) setForeground(couleur) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) A = new Arbre(8 Coloryellow) public void paint (Graphics g) Adessine(g)

Cette classe reprend en grande partie lrsquoarchitecture de la classe Dessin deacutecrite agrave lasection laquo Dessiner un triangle raquo au deacutebut de ce chapitre Pour remplacer le triangle parun sapin le constructeur Dessin() creacutee en meacutemoire un objet A de type Arbre Lameacutethode paint() appelle ensuite la meacutethode dessine() par lrsquointermeacutediaire de lrsquoobjet Apour lrsquoafficher agrave lrsquoeacutecran

Remarquez que lrsquoapplication Fenecirctre nrsquoest pas agrave modifier Lorsque lrsquoapplication estexeacutecuteacutee une fenecirctre srsquoaffiche avec son composant de type Dessin Ce dernier creacutee enmeacutemoire un objet A de type Arbre puis la meacutethode paint() est automatiquementappeleacutee par lrsquointerpreacuteteur Le sapin est alors afficheacute

Les eacuteleacutements de communication graphiqueOutre les composants drsquoaffichage tels que les Frame et les Canvas la librairie AWTpropose des outils de communication graphique comme les boutons et les menus

Ces outils offrent la possibiliteacute drsquoeacutecrire des applications munies drsquoune interfacegraphique reacuteellement interactive Lrsquoutilisateur manipule directement les objets proposeacutespar lrsquointerface et cette derniegravere reacuteagit en fonction des actions de lrsquoutilisateur Puisqursquoil

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

267

nrsquoest pas possible de savoir agrave lrsquoavance quel objet va ecirctre manipuleacute chaque composantdoit ecirctre programmeacute de faccedilon agrave reacuteagir directement aux manipulations de lrsquoutilisateurChaque manipulation est consideacutereacutee comme un eacuteveacutenement auquel est associeacute un traite-ment crsquoest-agrave-dire une action

Afin drsquoeacutetudier ces diffeacuterents concepts nous allons ameacuteliorer lrsquoapplication du sapin deNoeumll en y inseacuterant deux boutons un premier bouton pour afficher un sapin avec denouvelles deacutecorations et un second pour quitter lrsquoapplication

Les boutons

Les boutons sont les composants de communication les plus utiliseacutes pour creacuteer des inter-faces graphiques Gracircce agrave eux par un simple clic lrsquoutilisateur valide son souhait de voirreacutealiser le traitement proposeacute par le bouton

Les boutons sont deacutefinis dans la librairie AWT par la classe Button Pour afficher un boutonil suffit de lrsquoajouter agrave une fenecirctre comme nous lrsquoavons deacutejagrave fait pour dessiner un objetCanvas Examinons la classe Fenetre dans laquelle nous allons inseacuterer deux boutons

import javaawtclass Fenetre public final static int HT = 300public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() hellip Fadd(new Dessin()) Fadd(new Button(Nouveau)) Fadd(new Button(Quitter)) Fshow()

Dans cet exemple deux boutons portant les noms de laquo Quitter raquo et laquo Nouveau raquo sontajouteacutes agrave la fenecirctre F gracircce agrave la meacutethode add() Lorsque le programme est exeacutecuteacute lrsquoaffi-chage reacutesultant est celui illustreacute agrave la Figure 11-3

Figure 11-3

Les composants graphiques srsquoaffichent en se superposant les uns aux autres Crsquoest pourquoi le dernier bouton cache les autres composants

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

268

Chaque composant (Canvas et Button) est ajouteacute agrave la fenecirctre sans que soient speacutecifieacutes nisa position ni sa taille Dans cette situation lrsquointerpreacuteteur affiche les composants en lessuperposant dans leur ordre drsquoarriveacutee Le dernier bouton laquo Quitter raquo cache par conseacute-quent le composant Dessin ainsi que le bouton Nouveau

Les conteneurs

Pour corriger cette erreur il convient lorsque vous souhaitez afficher plusieurs composantsgraphiques de placer ces derniers agrave lrsquointeacuterieur drsquoun conteneur (en anglais container)

Un conteneur est une sorte de boicircte qui contient tous les eacuteleacutements de communicationutiliseacutes dans lrsquoapplication La plus part des boicirctes agrave outils proposeacutees dans les logicielsreacutecents sont des conteneurs Remarquez que seules les Frame ne peuvent ecirctre placeacuteesdans un conteneur

Un conteneur est deacutefini par la classe Panel du package javaawt Examinons commentlrsquoutiliser dans le programme suivant

import javaawtpublic class DesBoutons extends Panel public DesBoutons() initialisation setBackground(ColorlightGray) Les boutons Button bNouveau = new Button (Nouveau) thisadd(bNouveau) Button bQuitter = new Button (Quitter) thisadd(bQuitter)

La classe DesBoutons est deacutefinie comme classe heacuteritant de la classe Panel (DesBoutonsextends Panel) Elle est composeacutee drsquoun constructeur qui creacutee en meacutemoire deuxboutons bNouveau et bQuitter et les ajoute ensuite au conteneur gracircce agrave la meacutethodeadd() Par deacutefaut les boutons sont afficheacutes au centre du Panel par ordre drsquoarriveacutee

Remarquez lrsquoapplication du terme this aux meacutethodes add() Facultatif ce termeindique agrave lrsquointerpreacuteteur qursquoil doit ajouter ces objets (les boutons) agrave lrsquoobjet qursquoil est entrain de construire crsquoest-agrave-dire au Panel nommeacute DesBoutons Lrsquoexpression this repreacute-sente lrsquoobjet qui se construit en meacutemoire

Une fois deacutefini le conteneur doit ecirctre ajouteacute agrave la fenecirctre Pour eacuteviter toute superpositiondu conteneur agrave lrsquoobjet Canvas il est possible drsquoindiquer agrave lrsquointerpreacuteteur comment afficherles eacuteleacutements les uns par rapport aux autres Utilisons agrave cette fin les termes SouthNorth Center East et West en paramegravetre de la meacutethode add()

Le programme Fenetre ci-dessous utilise cette technique pour afficher correctement lesdeux boutons

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame()

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

269

Fadd(new Dessin() Center) Fadd(new DesBoutons() South) Fshow()

Gracircce aux paramegravetres Center et South les composants srsquoaffichent correctement lafenecirctre de dessin au-dessus de la boite agrave boutons comme illustreacute agrave la Figure 11-4

Notre application possegravede maintenant deux boutons Pourtant lorsque lrsquoutilisateurclique sur lrsquoun ou lrsquoautre de ces boutons rien ne se passe lrsquoaffichage de nouveauxsapins nrsquoest pas effectueacute et il nrsquoest pas non plus possible de quitter lrsquoapplication encliquant sur le bouton Quitter

Crsquoest qursquoil ne suffit pas drsquoafficher un bouton avec un texte correspondant agrave lrsquoaction souhaiteacuteepour voir cette action se reacutealiser La classe Button ne fait que deacutefinir les attributs graphiquesdes boutons Pour associer un bouton agrave une action il faut encore geacuterer les eacuteveacutenements

Les eacuteveacutenementsEn langage Java la gestion des eacuteveacutenements est reacutealiseacutee par lrsquointermeacutediaire drsquoobjetsspeacutecifiques appeleacutes eacutecouteurs (en anglais listener) De faccedilon simplifieacutee on peut direque lorsque lrsquoutilisateur clique sur un bouton ou sur une commande de menu le compo-sant concerneacute eacutemet un eacuteveacutenement agrave lrsquoattention de lrsquoeacutecouteur

Le traitement de cet eacuteveacutenement est reacutealiseacute par lrsquoeacutecouteur drsquoeacuteveacutenement (Eventlistener)et non pas par le composant lui-mecircme Le langage Java gegravere les eacuteveacutenements en suivantun modegravele dit laquo par deacuteleacutegation raquo (en anglais delegation model) le traitement de lrsquoeacuteveacutene-ment eacutetant deacuteleacutegueacute agrave un autre composant que celui qui lrsquoa perccedilu

Les types drsquoeacuteveacutenementsChaque composant graphique eacutemet un eacuteveacutenement propre agrave sa classe et il existe doncplusieurs types drsquoeacuteveacutenements On distingue les Eacuteveacutenements de bas niveau et les Eacuteveacutene-ments de haut niveau

Figure 11-4

Une fois la position des composants deacutefinie par rapport aux bords de la fenecirctre principale chaque composant srsquoaffiche correctement

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

270

Eacuteveacutenements de bas niveau

Les eacuteveacutenements de bas niveau sont les eacuteveacutenements creacuteeacutes agrave partir de la souris du clavierou drsquoune fenecirctre Le tableau suivant reacutesume les types drsquoeacuteveacutenements de bas niveau lesplus utiliseacutes

Pour geacuterer un eacuteveacutenement lieacute agrave la souris par exemple il convient de deacutefinir un eacutecouteurde type MouseListener et de deacutecrire le comportement de lrsquoapplication pour chaquemeacutethode associeacutee agrave cet eacutecouteur

Eacuteveacutenements de haut niveau

Les eacuteveacutenements de haut niveau sont lieacutes non plus aux comportements du composantgraphique mais agrave ses actions possibles Ainsi un clic de souris sur un bouton ne geacutenegravereplus un eacuteveacutenement speacutecifique du composant mais un comportement deacutefini par leprogrammeur

Eacutecouteur Comportement agrave programmer

MouseListener

Eacutecoute les eacuteveacutene-ments lieacutes agrave la souris

mousePressed(MouseEvent) Appeleacute lors drsquoune pression sur un bouton de la souris

mouseReleased(MouseEvent) Appeleacute lorsqursquoun bouton de la souris est relacirccheacute

mouseExited(MouseEvent) Appeleacute lorsque la souris sort de la fenecirctre

mouseEntered(MouseEvent) Appeleacute lorsque la souris entre dans la fenecirctre

mouseClicked(MouseEvent) Appeleacute lors drsquoun simple clic de souris

MouseMotionListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la souris lorsqursquoelle se deacuteplace

mouseDragged(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton enfonceacute

mouseMoved(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton relacirccheacute

WindowListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la fenecirctre

windowClosing(WindowEvent) Appeleacute lorsque la fenecirctre est en train de se fermer

windowClosed(WindowEvent) Appeleacute lorsque la fenecirctre est fermeacutee

windowOpened(WindowEvent) Appeleacute lors de lrsquoouverture de la fenecirc-tre

windowIconified(WindowEvent) Appeleacute lorsque la fenecirctre est mise sous forme drsquoicocircne

windowDeiconified(WindowEvent) Appeleacute lorsque lrsquoicocircne est agrandie agrave la taille de la fenecirctre

windowActived(WindowEvent) Appeleacute lorsque la fenecirctre est activeacutee et reccediloit les eacuteveacutenements du clavier

windowDeactived(WindowEvent) Appeleacute lorsque la fenecirctre est deacutesacti-veacutee et perd les eacuteveacutenements du clavier

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

271

Ainsi une action est associeacutee agrave un bouton en deacutefinissant un eacutecouteur drsquoaction qui parlrsquointermeacutediaire de la meacutethode actionPerformed reacutealise lrsquoaction souhaiteacutee

Exemple Associer un bouton agrave une actionLorsque lrsquoutilisateur clique sur les boutons Nouveau ou Quitter de lrsquoapplicationdeacuteveloppeacutee dans ce chapitre il souhaite voir se reacutealiser deux actions distinctes soitlrsquoaffichage drsquoun nouveau sapin soit la fermeture de la fenecirctre

Chaque clic de souris sur un bouton est associeacute agrave une action speacutecifique qui utilise uneacuteveacutenement de haut niveau Par conseacutequent chaque bouton doit ecirctre muni drsquoun eacutecouteurdrsquoaction Cela est reacutealiseacute dans la classe DesBoutons comme ci-dessous

import javaawtimport javaawteventpublic class DesBoutons extends Panel public DesBoutons(Dessin d) hellip Button bNouveau = new Button (Nouveau) Button bQuitter = new Button (Quitter) bNouveauaddActionListener(new GestionAction(1 d)) thisadd(bNouveau) bQuitteraddActionListener(new GestionAction(2 d)) thisadd(bQuitter)

Remarquez lrsquoinstruction drsquoimport (import javaawtevent) qui indique au compi-lateur le package ougrave sont deacutefinies les meacutethodes de gestion des eacuteveacutenements utiliseacutees dansla classe

La mise en place des eacutecouteurs drsquoactions est reacutealiseacutee gracircce agrave la meacutethode addAction-Listener()

Le constructeur GestionAction() placeacute en paramegravetre de la meacutethode addActionLis-tener() permet de preacuteciser quel comportement doit adopter lrsquoapplication en fonctiondu bouton qui eacutemet lrsquoeacuteveacutenement En effet les paramegravetres de ce constructeur transmettentagrave la fois une valeur entiegravere diffeacuterente (1 ou 2) suivant le bouton eacutemetteur (bNouveau oubQuitter) et lrsquoadresse de lrsquoobjet (d) sur lequel est dessineacute le sapin Examinons commentsont geacutereacutes ces paramegravetres dans la classe GestionAction

import javaawtimport javaawteventpublic class GestionAction implements ActionListener private int n private Dessin d

Eacutecouteur Comportement agrave programmer

ActionListenerEacutecoute les eacuteveacutenements drsquoaction

actionPerformed(ActionEvent) Appeleacute lorsqursquoune action est eacutemise

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

272

public GestionAction( int n Dessin d) thisn = n thisd = d public void actionPerformed(ActionEvent e) switch (n) case 1 dnouveau() break case 2 Systemexit(0) break

La classe GestionAction fait appel agrave plusieurs notions importantes deacuteveloppeacutees dansles sections qui suivent

Le terme implements

La classe GestionAction impleacutemente la classe ActionListener (GestionActionimplements ActionListener) elle nrsquoen heacuterite pas

En reacutealiteacute la classe ActionListener comme tous les autres listener nrsquoest pas veacuterita-blement une classe Il srsquoagit en fait drsquoune classe abstraite

Les meacutethodes deacutefinies par un listener ne peuvent pas ecirctre preacutedeacutefinies par le langageJava Une action crsquoest-agrave-dire un comportement associeacute agrave un bouton ne peut ecirctre deacutecriteque par le programmeur selon la faccedilon dont il conccediloit son application On dit alors quela classe ActionListener ainsi que tous les autres listener est une interface quideacutefinit simplement les diffeacuterents modes de comportement

Lorsqursquoune classe deacuterive drsquoune interface le terme implements doit ecirctre utiliseacute au lieu duterme extends

De plus lorsqursquoune classe impleacutemente une interface le compilateur Java exige dedeacutecrire lrsquointeacutegraliteacute des meacutethodes deacutefinies par lrsquointerface En effet dans le cas ougrave lrsquounedes meacutethodes nrsquoest pas deacutefinie le compilateur indique une erreur en preacutecisant le nom dela meacutethode manquante

Dans notre exemple lrsquointerface ActionListener ne deacutefinit qursquoune seule meacutethode(actionPerformed()) Nous nrsquoavons donc aucune difficulteacute agrave deacutecrire lrsquointeacutegraliteacute desmeacutethodes proposeacutees par cette interface

Le terme this

La classe GestionAction possegravede deux variables drsquoinstance n et d de faccedilon agrave meacutemoriserla valeur respective transmise par les boutons ainsi que lrsquoadresse de la zone graphiqueougrave le sapin est dessineacute Ces valeurs sont initialiseacutees par lrsquointermeacutediaire des paramegravetres duconstructeur GestionAction() qui sont eacutegalement nommeacutes n et d

Pour eacuteviter toute confusion entre les donneacutees de la classe et les paramegravetres du construc-teur il est neacutecessaire drsquoemployer le terme this Ce terme appliqueacute agrave n et d preacutecise aucompilateur qursquoil srsquoagit des variables de lrsquoinstance qui se construit Sans this lesmecircmes noms de variables correspondraient aux paramegravetres du constructeur

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

273

La meacutethode actionPerformed()

Une fois les donneacutees initialiseacutees la meacutethode actionPerformed() est automatiquementexeacutecuteacutee par lrsquointerpreacuteteur lorsqursquoune action est eacutemise par lrsquoun des boutons suite agrave unclic de lrsquoutilisateur Cette derniegravere reacutealise alors suivant la valeur transmise au construc-teur (1 ou 2) soit la sortie du programme soit lrsquoaffichage drsquoun nouveau sapin gracircce agrave lameacutethode nouveau() (agrave inseacuterer dans la classe Dessin) deacutecrite ci-dessous

public void nouveau() A = new Arbre(6 Colorred) repaint()

Agrave lrsquoexeacutecution de cette meacutethode lrsquoobjet A est recalculeacute agrave lrsquoaide du constructeur Arbre()Ensuite la meacutethode repaint() efface automatiquement la zone drsquoaffichage d sur laque-lle la meacutethode est appliqueacutee et appelle la meacutethode paint() deacutefinie dans la classe Dessin

La donneacutee Dessin d

Le bouton bNouveau a une incidence sur la zone de dessin puisqursquoun nouveau sapin doitecirctre afficheacute dans cette zone suite agrave un clic sur le bouton Cet effet est reacutealiseacute par le biaisde la meacutethode nouveau() appliqueacutee agrave lrsquoobjet d de type Dessin dans la meacutethodeactionPerformed() Lrsquoobjet d est deacuteclareacute comme variable drsquoinstance de la classeGestionAction Il contient lrsquoadresse de la zone drsquoaffichage creacuteeacutee dans lrsquoapplicationFenetre comme lrsquoillustre lrsquoextrait de programme suivant

public class Fenetre hellip public static void main(String [] arg) Frame F = new Frame() hellip Dessin page = new Dessin() Fadd(page Center) Fadd(new DesBoutons(page) South)

La construction de lrsquoobjet page a pour reacutesultat de stocker en meacutemoire lrsquoadresse ducomposant graphique de type Canvas Une fois cette adresse transmise au constructeurde la classe DesBoutons ce dernier peut transmettre agrave son tour lrsquoadresse de lrsquoobjet pageau constructeur de la classe GestionAction par lrsquointermeacutediaire du paramegravetre formel d detype Dessin Gracircce agrave la transmission de lrsquoadresse de la zone graphique en paramegravetre desconstructeurs les nouveaux sapins srsquoaffichent dans le composant graphique approprieacute

Exemple Fermer une fenecirctre Pour fermer une fenecirctre en cliquant directement sur lrsquoicocircne de fermeture de la fenecirctresitueacutee dans la barre de titre lrsquoeacuteveacutenement laquo clic sur le bouton de fermeture de la fenecirctre raquodoit ecirctre associeacute agrave lrsquoinstruction qui permet de stopper lrsquoexeacutecution du programmeComme le preacutecise le tableau de description des eacutecouteurs lrsquoeacuteveacutenement laquo clic sur lebouton de fermeture de la fenecirctre raquo est un eacuteveacutenement de bas niveau geacutereacute par lrsquoeacutecouteurWindowListener

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

274

En effet lorsque lrsquoutilisateur ferme la fenecirctre par lrsquointermeacutediaire de lrsquoicocircne approprieacutee cedernier eacutemet un eacuteveacutenement de fermeture de fenecirctre En recevant cet eacuteveacutenement lrsquoeacutecouteurdes eacuteveacutenements de fenecirctre (WindowListener) exeacutecute automatiquement la meacutethodewindowClosing()

Par conseacutequent le programme qui reacutealise la fermeture drsquoune fenecirctre doit effectuer lesdeux opeacuterations suivantes

bull placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre dans le composant graphique autoriseacute agraveecirctre fermeacute de la sorte

bull programmer la meacutethode windowClosing() en y inseacuterant lrsquoinstruction Systemexit(0)de faccedilon agrave sortir de lrsquoapplication

Placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre

Le premier point est reacutealiseacute dans la classe Fenetre de la faccedilon suivante

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame() hellip FaddWindowListener(new GestionFenetre()) Fshow()

Une fois la meacutethode addWindowListener() appliqueacutee agrave la fenecirctre F cette derniegravere est agravemecircme drsquoeacutecouter les eacuteveacutenements eacutemis par ses propres composants

Programmer la meacutethode windowClosing()

Le second point est reacutesolu gracircce agrave lrsquoappel du constructeur GestionFenetre() en para-megravetre de la meacutethode addWindowListener() ce dernier deacutefinissant le comportementadopteacute en face de lrsquoeacuteveacutenement entendu Examinons plus attentivement la classeGestionFenetre

import javaawteventpublic class GestionFenetre extends WindowAdapter public void windowClosing(WindowEvent e) Systemexit(0)

Remarquez que la classe GestionFenetre heacuterite de la classe WindowAdapter au lieudrsquoimpleacutementer lrsquointerface WindowListener

Lrsquoeacutecouteur WindowListener possegravede sept comportements speacutecifiques (voir preacuteceacutedem-ment le tableau des eacuteveacutenements de bas niveau) Si nous impleacutementons directement cetteinterface comme nous lrsquoavons fait pour ActionListener nous sommes contraints par lecompilateur Java agrave deacutefinir lrsquoensemble des sept comportements

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

275

Or pour fermer la fenecirctre un seul comportement est agrave retenir celui deacutefini par lameacutethode windowClosing() En utilisant un laquo Adapter raquo plutocirct qursquoun laquo Listener raquo nousnrsquoavons plus lrsquoobligation de deacutefinir lrsquointeacutegraliteacute des sept comportements mais unique-ment la ou les meacutethodes de votre choix Pour notre exemple seule la meacutethode window-Closing() nous inteacuteresse Crsquoest pourquoi elle seule est deacutecrite dans la classe Gestion-Fenetre

Ainsi lorsque lrsquoutilisateur clique sur lrsquoicocircne de fermeture de la fenecirctre un eacuteveacutenement defermeture de fenecirctre est eacutemis Lrsquoeacuteveacutenement est capteacute et traiteacute par lrsquoeacutecouteur WindowLis-tener qui exeacutecute automatiquement la meacutethode windowClosing() Celle-ci terminelrsquoexeacutecution de lrsquoapplication gracircce agrave lrsquoinstruction Systemexit(0)

Quelques principes

Lrsquoanalyse des exemples preacuteceacutedents montre que la gestion drsquoun eacuteveacutenement quel qursquoil soitpasse par les trois eacutetapes suivantes

bull Deacuteterminer le composant qui eacutemet lrsquoeacuteveacutenement et lui associer un eacutecouteur Cette asso-ciation est reacutealiseacutee par une meacutethode ayant pour nom addxxxListener() ougrave xxx repreacute-sente le composant eacutemetteur (Window Mouse etc)

bull Creacuteer une classe gestionDelEvenement qui impleacutemente lrsquointerface xxxListener(implements) ou deacuterive de la classe xxxAdapter (extends) selon que vous souhaitieztraiter tout ou partie des meacutethodes proposeacutees par lrsquoeacutecouteur

bull Deacutevelopper les meacutethodes souhaiteacutees crsquoest-agrave-dire deacutecrire les instructions composantles meacutethodes deacutefinies par lrsquointerface utiliseacutee

Les appletsLes applications deacuteveloppeacutees dans cet ouvrage sont jusqursquoagrave preacutesent des programmesexeacutecuteacutes directement sur le systegraveme drsquoexploitation de la machine par lrsquointerpreacuteteur JavaCes applications sont appeleacutees applications autonomes

Le langage Java offre la possibiliteacute de creacuteer des applications exeacutecutables par lrsquointermeacute-diaire drsquoun navigateur Web tel que Netscape ou Internet Explorer

Ces applications appeleacutees des applets raccourci des termes application et Internetsont exeacutecutables sur le reacuteseau Internet Une applet ne peut srsquoexeacutecuter qursquoau travers drsquounnavigateur et nrsquoest donc pas une application autonome

Le support drsquoexeacutecution drsquoun navigateur Web est la page HTML (HyperText MarkupLanguage) Crsquoest pourquoi une applet doit ecirctre inseacutereacutee dans une page HTML pour ecirctre lueet exeacutecuteacutee

Une page HTML

Une page HTML est un fichier texte constitueacute de balises (mots cleacutes) indiquant au navi-gateur la faccedilon dont il doit afficher le contenu de la page (mise en page) Lrsquoexemple quisuit deacutecrit le plus petit fichier utilisable pour exeacutecuter une applet Java

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

276

Exemple Lrsquoapplet defaulthtm

ltHTMLgt ltHEADgt ltTITLEgtUn sapin de NoelltTITLEgt ltHEADgt ltBODYgt ltAPPLET CODE=Fenetre WIDTH=300 HEIGHT=300gt ltAPPLETgt ltBODYgtltHTMLgt

Une page HTML est donc un fichier deacutebutant toujours par la balise ltHTMLgt et se termi-nant par sa balise inverse ltHTMLgt Elle est constitueacutee des deux grands blocs suivants

bull Lrsquoen-tecircte composeacute des balises ltHEADgt et ltHEADgt Dans votre exemple lrsquoen-tecirctepermet drsquoaffecter un titre agrave la page entre les balises ltTITLEgt et ltTITLEgt

bull Le corps deacutefini par les balises ltBODYgt et ltBODYgt qui deacutecrit le contenu de la pageLrsquoinsertion drsquoune applet est toujours effectueacutee dans le corps de la page Il suffitdrsquoutiliser pour cela la balise ltAPLLETgt composeacutee des trois paramegravetres CODE WIDTH etHEIGHT qui indiquent au navigateur le nom du fichier de lrsquoapplet agrave exeacutecuter ainsi quesa largeur et sa hauteur

Le fichier eacutecrit est sauvegardeacute sous un nom ayant lrsquoextension htm Par deacutefaut tous lesnavigateurs lisent les pages HTML portant le nom defaulthtm Par conseacutequent sauve-gardons la page HTML deacutecrite ci-dessus dans un fichier portant ce nom

Construire une appletUne applet diffegravere drsquoune application autonome par plusieurs aspects

bull La fonction main() disparaicirct pour ecirctre remplaceacutee par la meacutethode init()

bull La classe ougrave se situe la meacutethode init() heacuterite de la classe Applet

bull Le support drsquoaffichage des composants graphiques nrsquoest plus une Frame Le naviga-teur se charge drsquoafficher tous les composants graphiques Il possegravede eacutegalement unebarre de titre des bords et des boutons Lrsquoutilisation drsquoune Frame devient donc inutile

bull Lrsquoinstruction setTitle(Un sapin de Noel) est eacutegalement inutile puisque le titre dela fenecirctre est maintenant geacutereacute par la page HTML Il srsquoaffiche dans la barre de titre dunavigateur

Exemple Un sapin de Noeumll en applet

Lrsquoapplet Fenetre srsquoeacutecrit maintenant de la faccedilon suivante

import javaawtimport javaappletpublic class Fenetre extends Applet public final static int HT = 300 public final static int LG = 300 public void init() Dessin D setSize(HT LG)

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

277

setBackground(ColordarkGray) setLayout(new BorderLayout()) add(D = new Dessin() Center) add(new DesBoutons(D) South)

Notez lrsquoinstruction drsquoimport (import javaapplet) qui indique au compilateur ougravese trouve le package deacutefinissant les applets

Lrsquoapplet est afficheacutee par le navigateur qui exeacutecute en premier lieu la meacutethode init()tout comme lrsquointerpreacuteteur Java exeacutecute la fonction main() dans le cas drsquoune applicationJava autonome

Les instructions de la fonction init()sont exeacutecuteacutees ligne agrave ligne et le reacutesultat est eacutequi-valent dans la forme agrave lrsquoapplication deacutecrite preacuteceacutedemment Remarquons cependant que

bull Les meacutethodes ne sont pas appliqueacutees agrave un objet F de type Frame mais agrave lrsquoobjet qui esten train de se construire crsquoest-agrave-dire agrave lrsquoapplet elle-mecircme

bull Un BorderLayout est ajouteacute par lrsquointermeacutediaire de la meacutethode setLayout() La miseen page (en anglais layout) correspond agrave une strateacutegie drsquoaffichage des composantsgraphiques Par exemple pour un Panel ou une Applet la strateacutegie par deacutefaut est leFlowLayout crsquoest-agrave-dire lrsquoaffichage centreacute des composants dans leur ordre drsquoarriveacutee

Pour une Frame la strateacutegie drsquoaffichage est le BorderLayout qui permet lrsquoaffichage desobjets par rapport aux bords de lrsquoobjet Ces bords sont nommeacutes East North West etSouth Lrsquoajout drsquoun composant dans un objet dont la strateacutegie drsquoaffichage est le Border-Layout est reacutealiseacute en indiquant en paramegravetre le bord dont il doit srsquoapprocher le plusCrsquoest ce que nous avons reacutealiseacute sans le savoir dans lrsquoapplication Fenetre de la sectionpreacuteceacutedente

Lrsquoapplet par deacutefaut ne travaille pas avec un BorderLayout mais avec un FlowLayoutSans modification du gestionnaire de mise en page (Layout Manager) lrsquoapplet affiche lescomposants dans leur ordre drsquoarriveacutee soit drsquoabord la fenecirctre de dessin puis la boicircte agraveboutons en superposition enfin le sapin disparaissant sous les boutons

Gracircce agrave la mise en place du BorderLayout (setLayout(new BorderLayout())) lrsquoaffi-chage est corrigeacute et tous les eacuteleacutements se trouvent agrave leur place comme illustreacute agrave laFigure 11-5

Lrsquoutilitaire AppletViewer

Lrsquoexeacutecution drsquoune applet srsquoeffectue en geacuteneacuteral en chargeant la page HTML correspon-dante dans un navigateur Lrsquoaffichage srsquoexeacutecute automatiquement

Une solution plus rapide consiste cependant agrave faire appel agrave lrsquoutilitaire AppletViewerlivreacute avec le JDK AppletViewer exeacutecute une applet sans lrsquoenvironnement du navigateurPour lrsquoutiliser il suffit drsquoeacutecrire une ligne de commande dans une fenecirctre de commandesMS-DOS (environnement Windows) ou dans une fenecirctre de script (environnementUnix)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

278

Cette commande est la suivante

appletviewer defaulthtm

Lrsquoexeacutecution de cette commande a pour reacutesultat lrsquoaffichage de lrsquoapplet illustreacutee agrave laFigure 11-5

ReacutesumeacuteLrsquoessentiel des composants graphiques deacuteveloppeacutes par le langage Java est deacutefinidans la librairie AWT (Abstract Windowing Toolkit)

Le support principal drsquoaffichage drsquoune application graphique est la Frame Cettederniegravere est composeacutee des eacuteleacutements suivants

bull une barre de titre posseacutedant des boutons pour la fermeture lrsquoagrandissement et lamise en icocircne de la fenecirctre

bull des bords deacutelimitant la zone drsquoexeacutecution de lrsquoapplication

Pour dessiner ou afficher du texte dans une Frame il convient drsquoutiliser des objets detype Canvas ou TextArea Le contexte graphique deacutefinissant les attributs drsquoaffichagetels que la couleur le type de fonte etc est geacutereacute par la classe Graphics

Les interfaces graphiques sont construites agrave lrsquoaide des eacuteleacutements de communicationgraphique suivants

bull composants graphiques tels que boutons (Button) et menus

bull eacuteveacutenements associant par exemple un clic de souris sur un bouton agrave une action

On distingue les eacuteveacutenements de haut niveau (un clic est associeacute agrave une action) et leseacuteveacutenements de bas niveau (un clic sur un composant eacutemet un eacuteveacutenement propre agrave cecomposant)

Figure 11-5

Gracircce agrave lrsquoutilitaire AppletViewer il est possible drsquoafficher une applet en dehors de tout navigateur Web

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

279

ExercicesLrsquoobjectif de cet exercice est drsquoameacuteliorer le programme reacutealiseacute tout au long de cechapitre Lrsquointerface graphique agrave construire propose une case agrave cocher (en anglais checkbox) permettant de reacutepondre aux conditions suivantes

bull Si la case Taille fixe est cocheacutee les nouveaux sapins de taille constante sontdessineacutes avec une guirlande formeacutee de cercles de diffeacuterentes couleurs

bull Si la case nrsquoest pas cocheacutee les nouveaux sapins sont eacutegalement dessineacutes mais avecune taille variable

Pour construire cette application nous vous proposons de suivre les diffeacuterentes eacutetapesdeacutecrites ci-dessous

Comprendre les techniques drsquoaffichage graphiquePour afficher un sapin de taille diffeacuterente chaque fois que lrsquoutilisateur clique sur lebouton Nouveau

a Recherchez dans lrsquoensemble des classes de lrsquoapplication Fenetre la meacutethodeassocieacutee au clic sur le bouton Nouveau

b Modifiez cette meacutethode de faccedilon que lrsquoarbre se construise avec une taille aleacutea-toire variant entre 3 et 10 par exemple

Le langage Java propose en outre des composants graphiques speacutecifiques appeleacutesApplet (application sur Internet) deacutefinis dans le package javaapplet

Une applet nrsquoest pas exeacutecuteacutee par lrsquointerpreacuteteur Java mais par le navigateur agrave traversune page HTML (HyperText Markup Language) qui est un fichier texte constitueacute debalises (mots cleacutes) indiquant au navigateur comment il doit mettre en page les infor-mations contenues dans le fichier

Pour ecirctre exeacutecutable le programme deacutefinissant lrsquoapplet doit faire appel agrave la meacutethodeinit() en lieu et place de la fonction main()

Figure 11-6

Lrsquoapplication propose une case agrave cocher pour deacuteterminer si la taille des nouveaux sapins doit ecirctre fixe ou non

111

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

280

c Une fois ces modifications reacutealiseacutees compilez lrsquoapplication et veacuterifiez le bonfonctionnement du bouton Nouveau

Pour dessiner une guirlande de cercles de couleurs diffeacuterentes

a Avant drsquoafficher une guirlande modifiez les classes Triangle et Arbre de sorteque le sapin ne soit afficheacute qursquoagrave lrsquoaide de triangles verts Veacuterifiez lrsquoexeacutecution duprogramme

b Pour afficher une guirlande de couleur rouge creacuteez une classe Boule en vousinspirant de la classe Triangle

Notez que la meacutethode fillOval(x y l h) permet lrsquoaffichage de cerclesremplis Elle srsquoapplique agrave un objet Graphics comme la meacutethode fillPoly-gon() Les paramegravetres x et y repreacutesentent la position agrave lrsquoeacutecran du coin supeacuterieurgauche du rectangle englobant le cercle l et h repreacutesentant la largeur et lahauteur de ce mecircme rectangle

c Modifiez ensuite la meacutethode dessine() de la classe Arbre de faccedilon agrave construireet agrave afficher par-dessus le sapin des objets Boule lorsque le tableau sapin vaut 1

Compilez et exeacutecutez le programme afin de veacuterifier le bon affichage de la guir-lande

d Pour afficher une guirlande de couleurs diffeacuterentes deacutefinissez dans la classeBoule un tableau de plusieurs couleurs comme suit

Color [] couleur = Colorred Colorblue Coloryellow Colorcyan Colormagenta

Le choix de la couleur est ensuite effectueacute dans le constructeur de la classe Bouleen tirant au hasard une valeur comprise entre 0 et 5 Cette valeur est utiliseacuteecomme indice du tableau de couleurs pour initialiser la couleur drsquoaffichage(setColor()) agrave la couleur du tableau cor respondant agrave lrsquoindice tireacute au hasard

Apprendre agrave geacuterer les eacuteveacutenements

Placer une case agrave cocher dans la boicircte agrave boutons

a Sachant que la classe deacutecrivant les cases agrave cocher a pour nom Checkbox ajoutezun objet de ce type dans la boicircte agrave boutons de lrsquoapplication Fenecirctre Le texte(laquo Taille fixe raquo) suivant la case agrave cocher est placeacute en paramegravetre du construc-teur de la classe

b Lrsquoeacutecouteur drsquoeacuteveacutenement associeacute aux objets de type Checkbox srsquoappelantItemListener ajoutez cet eacutecouteur agrave la case agrave cocher

Associer lrsquoeacuteveacutenement agrave lrsquoaction Lorsque la case est cocheacutee les nouveaux sapinsafficheacutes par le bouton Nouveau sont de taille fixe Inversement lorsque la casenrsquoest pas cocheacutee les sapins sont de taille aleacuteatoire Lrsquoeacutetat de la case agrave cocher a doncune influence sur lrsquoaffichage du sapin geacutereacute par le bouton Nouveau Crsquoest pourquoiil est logique de geacuterer lrsquoeacutecouteur ItemListener dans la mecircme classe qursquoAction-Listener

112

113

114

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

281

a Sachant que lrsquointerface ItemListener ne deacutefinit qursquoun seul comportementitemStateChanged() modifiez lrsquoen-tecircte de la classe GestionAction de faccedilonqursquoelle impleacutemente les deux interfaces ActionListener et ItemListener enseacuteparant les deux termes par une virgule

b Analysez la meacutethode itemStateChanged() deacutecrite ci-dessous et deacuteterminezcomment deacuteclarer la variable OK pour qursquoelle puisse ecirctre eacutegalement visible delrsquoobjet bNouveau

public void itemStateChanged(ItemEvent e) if(egetStateChange() == ItemEventSELECTED) OK = false else OK = true

c Sachant que les sapins de taille aleacuteatoire sont afficheacutes par lrsquointermeacutediaire de lameacutethode nouveau() (classe Dessin) modifiez la meacutethode de faccedilon que la tailledu sapin soit fixe ou aleacuteatoire en fonction de la valeur de la variable OK

Le projet laquo Gestion drsquoun compte bancaire raquoLrsquoobjectif est de reacutealiser des statistiques sur les comptes bancaires enregistreacutes dans lesfichiers creacuteeacutes au chapitre preacuteceacutedent Le reacutesultat de ces statistiques est afficheacute dans unefenecirctre comme illustreacute agrave la Figure 11-7

Calcul de statistiquesLes classes ListeCompte et Compte

En reprenant la fonction pourcentage() reacutealiseacutee en exercice agrave la fin du Chapitre 5 laquo Delrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo et sachant que lrsquoobjectif est decalculer en pourcentage les deacutepenses reacutealiseacutees en fonction du motif de la deacutepense

a Deacuteterminer toutes les donneacutees deacutefinies dans les classes Compte et LigneComptableneacutecessaires aux calculs des statistiques drsquoun compte

Figure 11-7

Histogramme empileacute du compte ndeg 2552

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

282

b Veacuterifier que ces donneacutees soient accessibles depuis lrsquoexteacuterieur de la classe Si tel nrsquoestpas le cas eacutecrire les meacutethodes drsquoaccegraves en consultation pour chacune drsquoentre elles

c Apregraves modifications compiler et exeacutecuter le programme de faccedilon agrave creacuteer un fichierde comptes (Comptedat)

La meacutethode statParMotif()

a En reprenant lrsquoalgorithme de calcul de statistiques proposeacute en exemple du Chapi-tre 1 laquo Stocker un information raquo eacutecrire la meacutethode statParMotif() qui calcule lepourcentage des deacutepenses en fonction du motif enregistreacute

b Sachant que cette meacutethode est deacutefinie agrave lrsquointeacuterieur drsquoune classe appeleacutee Stat deacuteter-miner les variables drsquoinstance de cette classe

c Avant de passer agrave lrsquoaffichage graphique eacutecrire une application qui

bull lise le fichier laquo Comptedat raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente

bull utilise la meacutethode statParMotif() pour calculer et afficher agrave lrsquoeacutecran les statisti-ques drsquoun compte donneacute

d Veacuterifier la validiteacute des calculs reacutealiseacutes

Lrsquointerface graphiquePour calculer les statistiques drsquoun compte lrsquoutilisateur doit fournir le numeacutero du comptechoisi Apregraves lecture du fichier Comptedat et connaissant ce numeacutero lrsquoapplicationveacuterifie srsquoil existe en meacutemoire Si tel est le cas elle affiche dans une fenecirctre le reacutesultatsous forme drsquohistogrammes empileacutes Dans le cas contraire elle affiche un message indi-quant que ce compte nrsquoest pas connu et attend la saisie drsquoun nouveau numeacutero

Deux eacutetapes sont donc agrave reacutealiser la saisie drsquoun numeacutero de compte et lrsquoaffichage delrsquohistogramme

Lrsquoaffichage de lrsquohistogramme

Pour afficher lrsquohistogramme empileacute il est neacutecessaire de connaicirctre les pourcentages dedeacutepenses en fonction des motifs deacuteclareacutes Ces valeurs sont calculeacutees dans la classe Statconstruite preacuteceacutedemment

a En srsquoinspirant de la meacutethode dessine() preacutesenteacutee en exemple au cours de ce chapi-tre eacutecrire dans la classe Stat la meacutethode dessine() de faccedilon agrave afficher

bull un premier rectangle de hauteur 100 et de largeur 50 repreacutesentant lrsquouniteacute de creacutedit(100)

bull des rectangles de couleur et de hauteur diffeacuterentes suivant les pourcentages calcu-leacutes par la meacutethode statParMotif()

Noter que lrsquoaffichage drsquoun rectangle rempli srsquoeffectue par lrsquointermeacutediaire de lameacutethode fillRect(x y l h) ougrave x et y repreacutesentent la position agrave lrsquoeacutecran ducoin supeacuterieur gauche du rectangle et l et h sa largeur et sa hauteur Lrsquoaffichagedrsquoun texte est reacutealiseacute par la meacutethode drawString(texte x y) ougrave texte est unobjet de type String dans lequel sont placeacutes les caractegraveres agrave afficher x et y deacutefinis-sant la position de ce texte agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

283

b Deacutefinir une fenecirctre composeacutee drsquoune zone de dessin et drsquoun bouton Quitter

c Lrsquoaffichage de lrsquohistogramme eacutetant reacutealiseacute dans la zone de dessin

bull Le constructeur de la fenecirctre doit prendre en paramegravetre un objet de type Stat defaccedilon agrave le transmettre au constructeur de la zone de dessin

bull La meacutethode paint() deacutefinie dans la classe repreacutesentant la zone de dessin fait appelagrave la meacutethode sdessine() ougrave s est un objet de type Stat initialiseacute dans le cons-tructeur de la zone de dessin

d Le bouton Quitter et lrsquoicocircne de fermeture situeacutee dans la barre de titre de la fenecirctreayant la mecircme fonctionnaliteacute (quitter lrsquoapplication et fermer la fenecirctre)

bull Creacuteer une classe GestionQuitter qui impleacutemente lrsquoeacutecouteur ActionListener etdeacuterive de la classe WindowAdapter

bull Deacutefinir les meacutethodes correspondant au comportement de fermeture drsquoapplication

La saisie drsquoun numeacutero de compteLa classe Saisie deacutecrite ci-dessous permet la saisie drsquoune chaicircne de caractegraveres parlrsquointermeacutediaire drsquoune fenecirctre de saisie

import javaawtimport javaawteventpublic class Saisie implements ActionListener TextField reacuteponse public Saisie () Frame F = new Frame (Saisie de valeurs) FsetSize(300 50) FsetBackground(Colorwhite) FsetLayout(new BorderLayout()) Fadd (new Label(Valeur ) West) reacuteponse = new TextField(10) Fadd(reacuteponse East) reacuteponseaddActionListener(this) Fshow() public void actionPerformed(ActionEvent evt) String numeacutero = reacuteponsegetText() Systemoutprintln(numeacutero)poundpoundpound accent poundpoundpound

Observer et analyser cette classe et transformer la meacutethode actionPerformed() defaccedilon agrave calculer puis agrave afficher lrsquohistogramme cumuleacute si le numeacutero de compte lu dans lafenecirctre de saisie correspond agrave un compte enregistreacute dans le fichier Comptedat

copy copyright Eacuteditions Eyrolles

Contenu et exploitationdu CD-Rom

Le CD-Rom fourni avec cet ouvrage est composeacute de

bull Deux fichiers au format PDF

ndash outilsPDF

ndash corrigesPDF

bull Quatre dossiers (reacutepertoires)

ndash Java2

ndash Winzip

ndash Acrobat

ndash Sources

bull Un fichier Lirejava

Le fichier outilsPDF

ATTENTION Ce fichier est agrave lire avant drsquoinstaller le JDK et de compiler votrepremier programme Java

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) deacutecrit

bull comment installer le JDK

bull comment construire son propre environnement de travail

Vous y trouverez eacutegalement des adresses Internet depuis lesquelles vous pourrez teacuteleacute-charger des environnements de deacuteveloppement pour MacOS Unix ou Windows

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageCONTENU ET EXPLOITATION DU CD

286

Le fichier corrigesPDF

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) preacutesente pour chaquechapitre du livre

bull le reacutesumeacute

bull les exemples

bull le corrigeacute commenteacute et expliqueacute des exercices

bull le corrigeacute commenteacute et expliqueacute du projet

Le dossier Java2

Dans ce dossier sont placeacutes les programmes drsquoinstallation du JDK et sa documentationau format compresseacute

bull Pour installer le JDK lisez le fichier outilsPDF

bull Pour deacutecompresser la documentation utilisez lrsquoutilitaire Winzip

Le dossier Winzip

Dans ce dossier se trouve lrsquooutil drsquoinstallation de lrsquoapplication Winzip

bull Pour installer le logiciel et pour deacutecompresser la documentation Java lisez le fichieroutilsPDF

Le dossier Acrobat

Ce dossier contient lrsquooutil drsquoinstallation de lrsquoapplication Acrobat Reader Ce logicielvous permet de lire les fichiers au format PDF par exemple le fichier corrigesPDF quidonne les corrigeacutes des exercices et du projet

bull Pour installer cette application double-cliquez sur lrsquoicocircne drsquoinstallation situeacutee dans ledossier Acrobat et validez les requecirctes du programme drsquoinstallation

Le dossier Sources

Le dossier Source se compose de trois sous-reacutepertoires exemples exercices et projetCeux-ci contiennent respectivement douze sous-reacutepertoires un pour chacun des chapitres

introduction chapitre1 chapitre2 chapitre3 hellip chapitre11

Chacun de ces reacutepertoires contient les fichiers source des programmes correspondant

bull aux exemples Ainsi pour retrouver les programmes donneacutes en exemple au chapitre 1allez dans le reacutepertoire sourcesexempleschapitre1

bull aux exercices corrigeacutes Ainsi pour retrouver le programme de lrsquoexercice 2 du chapitre4 allez dans le reacutepertoire sourcesexerciceschapitre4

bull au projet Ainsi pour retrouver le corrigeacute du projet du chapitre 5 allez dans le reacuteper-toire sourcesprojetchapitre5

Le fichier Lirejava

Tregraves utiliseacute tout au long de lrsquoouvrage ce fichier est agrave copier sur votre disque dur Pourplus de preacutecision reportez-vous agrave la rubrique laquo Construire son propre environnement detravail raquo du fichier outilsPDF

copy copyright Eacuteditions Eyrolles

Index

A

Accegravesdonneacutees 165en consultation 186 213 237en modification 162 186meacutethode 165

Accesseur 186Accumulation 84 86 92 101Action 267Adresse 5 9 150 158 182Affectation 31 34 43Afficher 10Algorithme 1 4 20

parameacutetreacute 110 122Analyse descendante 2Applet 275

Layout 277AppletViewer 277Application 163

exemple 165 179 185 187multifichiers 166

Archivage 242Attribut 169

B

Binaire Voir Code Bloc 14

if-else 72 77instruction 63 81 109 129 132 144

boolean 27Bouton Voir Classe Buttonbreak 75 77

Voir switch byte 28 74 85 94

CCanvas exemple 262case Voir switch Case meacutemoire 5 9Cast 39 41 92 98 234 249

exemple 39catch 252

Voir Exception char 27 33 43class 17Classe 13

abstraite 272deacutefinir 159deacuteriveacutee 192super 192

Classe Appletexemple 276init() 277

Classe BufferedReader 243readLine() 245

Classe BufferedWriter 242close() 245newLine() 245write() 245

Classe Canvas 261exemple 266paint() 262setbackground() 262setCursor() 262setForeground() 262

Classe Checkbox 280Classe Color

brighter() 265darker() 265diffeacuterentes couleurs 280setColor() 265white 262

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

288

Classe DoubledoubleValue() 254

Classe Enumeration 239hasMoreElement 239nextElement 239

Classe Frame 261add() 264addWindowListener() 274setBackground() 261setSize() 261setTitle() 261show() 261

Classe Graphics 262drawString() 282fillOval() 280fillPolygon() 263fillrect() 282

Classe Hashtableget() 236 238keys() 239put() 236 238remove() 236 239size() 236

Classe IntegerparseInt() 94 95 211toString 98

Classe Lire 11 90b() s() i() l() 57f() d() S() c() 57

Classe Mathabs() 111ceil() 111cos() 110exemple 111exp() 111floor() 111log() 111max() 111min() 111PI 11pow() 58 111 114random() 103 111 113 223 264sin() 110sqrt() 58 78 111 113 115tan() 110

Classe ObjectInputStream 248close() 249readObject() 248

Classe ObjectOutputStream 248close() 249writeObject() 248

Classe Paneladd() 268addActionListener() 271exemple 268repaint() 273

Classe String 92 149charAt() 152 153 211 237compareTo() 154 156concat() 156 157endsWith() 152 153 154equals() 154equalsIgnoreCase() 154 156exemple 152 154 156indexOf() 152 153 154lastIndexOf() 152length() 156 157 245regionMatches() 154 156replace() 156startsWith() 152substring() 152 153toLowerCase() 156 157toUpperCase() 156 157 237valueOf() 245

Classe Systeminread() 54 90 92outprint() 10 49 50 56outprintln() 52 57 98err 50exit() 59 275

Classe TextField 283getText() 283

Classe Vectoradd() 232addElement() 232 233clear() 232elementAt() 232 234indexOf() 232 235lastIndexOf() 232remove() 232setElementAt() 232size() 232

Classe WindowAdapterwindowClosing() 274

Classpath 167Cleacute Voir Dictionnaire

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

289

Codebinaire 8 15pseudo 15 16 167 176 180source 14 102Unicode 53 97 98 99

Commandejava 16 17javac 16 17MS-DOS 17 209

Commentaires 12Compilateur 14 21Compilation multifichiers 166Comportement 161 169 183 212Comptage 84 101Concateacutenation 52 92Condition 66Constante 188Constructeur 214 217

exemple 190 191par deacutefaut 190 194surcharge 195

Conteneur Voir Classe Panel Controcircle des donneacutees

exemple 186

DDeacuteclaration

objet 163variables 9 10

default 75 77Voir switch

Dictionnaire 236Cleacute 236 241Exemple 239Exemple creacuteer un dictionnaire 237Exemple creacuteer une cleacute 237Exemple rechercher un eacuteleacutement 238Exemple supprimer un eacuteleacutement 238

dowhile 83 100 234choisir 99exemple 88syntaxe 83

Dos 17 50 53 99double 10 29 43 94 113

EEacutechanger 217

des objets 179des valeurs 34exemple 34

Encapsulation 183EntreacuteeSortie 7 49 56Erreur

Class not found 167 233else without if 70expected 121FileNotFoundException 244 250Identifier expected 122Incompatible type for = Explicit cast 39Incompatible type for method 114javalangArrayIndexOutOfBoundsException 207javalangNumberFormatException 94 95Methode not found in class 115no constructor matching 195NotSerializableException 248Undefined variable 131variable in class not accessible 195Variable is already defined 224variable is already defined in this method 118variable may not have been initialized 31Variable not accessible from class 185

Eacutetiquette 75 77 Voir switch Eacuteveacutenement 267

bas niveau 270haut niveau 270Voir Interface

EventListener 269Exception

ClassNotFoundException 249 252Exemple de capture 251IOException 243

Exempleaffectation 32calcul de statistiques 42cast 39Cercle controcircleacute 186Cercle et fonction 119Cercle objet 161 165Cercle proteacutegeacute 184Cercle simple 13Compter des cercles 176Compteur de monnaie 88Constructeur par deacutefaut 190Controcircle du rayon 189Deacuteclaration 31Deacuteclaration de tableaux 205Fonction

max() 121matheacutematique 111

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

290

Exemple (suite)Gestion dexception 251 252Heacuteritage 193La classe Arbre 264La classe Classe 213 233La classe DesBoutons 268 271La classe Dessin 262 266La classe Etudiant 212La classe Fenetre 260 267 276La classe GestionAction 271La classe GestionClasse 217 234 239 249La classe GestionFenetre 274La classe GestionFichier 245La classe String 152 154 156La classe Triangle 262 265Ligne de commande 210Lire au clavier 55Lire un entier 94Nombre de jours par mois 74Passage par valeur 139Quel code Unicode 98Reacutesultat dune fonction 140Trouver le plus grand nombre 69Un sapin en mode caractegravere 222Une page HTML 276Variable de classe 134Variable locale 132Visibiliteacute 131

extends 192 194 262 268exemple 193

FFenecirctre 260Fichier

dobjets 247exemple 245 249ouvrir 243texte 242

final 188float 29 94Flux 242

de fichier 242entrantsortant 242 243

Fonction 110appel 114corps 116deacutefinition 115en-tecircte 117

Fonction (suite)exemple 119 121 122main() 119nom 113 117paramegravetre 113 117 121 144reacutesultat 113 120 144sans paramegravetre 122sans reacutesultat 121type 118 123

Fonction main() 13 163en-tecircte 208

for 96 101 207choisir 100exemple 99imbrication 219 223syntaxe 96

Frame Exemple 260

HHashtable

Exemple 239syntaxe 236Voir Dictionnaire

Heacuteritage 192Hexadeacutecimale 29 98HTML 275

exemple 276

Ii-- 97i++ 97if-else 64 76

bloc 72choisir 76erreur 69exemple 69imbrication 70syntaxe 65

implements 272Serializable 247

import 261Increacutementation 34 86 96 101 176 178Indice Voir Tableau Initialisation 33 91Instance 164Instructions 5 6int 28 43 90

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

291

Interface 272ActionListener 271

actionPerformed() 271 272 273exemple 271

graphique 266ItemListener 280

itemStateChanged() 281MouseListener 270

mouseClicked() 270mouseEntered() 270mouseExited() 270mousePressed() 270mouseReleased() 270

MouseMotionListener 270mouseDragged() 270mouseMoved() 270

WindowListener 270 273exemple 274windowActived() 270windowClosed() 270windowClosing() 270 274windowDeactived() 270windowDeiconified() 270windowIconified() 270windowOpened() 270

Interpreacuteteur 15 21 167

Jjava 16 167

paramegravetre 209javac 166JDK 16 259JVM 15

LLayout

BorderLayout() 277FlowLayout() 277

length 221Voir Tableau

length() Voir Classe String Ligne de commande 209long 28 94

MMac OS 16 53 54 91 99 209

TeachText 246Meacutemoire centrale 5 21

Meacutethode 110 151dimpleacutementation 189invisible 189 213 216

exemple 189Lire 54

modulo 35

Nnew 163 194 204 214 219null 164 238 246

OObjet 164

deacutefinition 151Octet 27Opeacuterateur 43

ampamp || 67+ - 35logique 67 77prioriteacute 36relationnel 66 76

PPackage 233

javaapplet 277javaawt 261javaawtevent 271javaio 242javautil 233 239

Panelexemple 271Layout 277

Paramegravetre 108formel 118 139 141 179 273objet 181passage par reacutefeacuterence 178 183passage par valeur 138 140reacuteel 141effectif 118

PC 91polymorphisme 196Principe de fonctionnement

Applet 276dowhile 83fonction 113for 96Gestion dun eacuteveacutenement 275if-else 65if-else imbriqueacutes 70

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

292

Principe de fonctionnement (suite)ouvrir un fichier

en eacutecriture 244en lecture 244

page HTML 276switch 73tableau 205trycatch 251variable de classe 138while 90

Principe de notationobjet 159

Prioriteacute 44Programmation dynamique 231Proprieacuteteacute 169protected 195Protection des donneacutees

exemple 184private 184 189protected 184public 184

Pseudo-code Voir Code public 208

RReacutefeacuterence 151 158Relation est un 192 193Reacuteservation dun espace meacutemoire Voir new return 118 120 121 123 140 143

SSDK Voir JDKSeacuterialisation

Voir Fichier dobjets short 28 74static 135 162 176 208 247stream Voir Flux String 209Structure dun programme 13 129super 195 197 200Surcharge 191

de constructeur 195de meacutethodes 189 237

switch 72 74 77 87choisir 75exemple 74syntaxe 72

Syntaxe deacutefinition 8

TTableau 204

2 dimensions 218dobjets 214 225deacuteclaration 204 218 225exemple 207indice 207 219 221initialisation 207length 205 207 219taille 205 211

Tableau dobjetsexemple 213

Taille tableau 205this 192 268 272throws 250 251

Voir Exception Tri par extraction 215try Voir Exception Type 158

choisir 30conversion 38deacutefinition 26Integer 234objet 151 163simple 151structureacute 27 160 162

Type de donneacutees 7

UUnicode Voir Code Uniteacute centrale 5 21Unix 15 16 17 50 53 91 99 209 277

vi 246

VVariable

dinstance 164 177de classe 134 136 137 143 177deacuteclaration 30 32 130 203deacutefinition 25 43invisible 131locale 132 133 135 143static 135 176tableau deacutevolution 93 132 135 183 221veacuteritable nom 137

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

293

Vecteur Exemple 233 234Vector

syntaxe 232Voir Vecteur

Visibiliteacute 143void 121 123 208

Wwhile 89 91 101

choisir 99exemple 94syntaxe 89

Windows 16 17 53 99 209 277WordPad 246

copy copyright Eacuteditions Eyrolles

  • LE LIVRE DE JAVA PREMIER LANGAGE
  • AVANT-PROPOS ORGANISATION DE LOUVRAGE
  • TABLE DES MATIERES
  • INTRODUCTION NAISSANCE DUN PROGRAMME
  • PARTIE 1 LES OUTILS ET TECHNIQUES DE BASE
  • CHAPITRE 1 STOCKER UNE INFORMATION
  • CHAPITRE 2 COMMUNIQUER UNE INFORMATION
  • CHAPITRE 3 FAIRE DES CHOIX
  • CHAPITRE 4 FAIRE DES REPETITIONS
  • PARTIE 2 INITIATION A LA PROGRAMMATION ORIENTEE OBJET
  • CHAPITRE 5 DE LALGORITHME PARAMETRE A LECRITURE DE FONCTIONS
  • CHAPITRE 6 FONCTIONS NOTIONS AVANCEES
  • CHAPITRE 7 LES CLASSES ET LES OBJETS
  • CHAPITRE 8 LES PRINCIPES DU CONCEPT DOBJET
  • PARTIE 3 LES OUTILS ET TECHNIQUES ORIENTES OBJET
  • CHAPITRE 9 COLLECTIONNER UN NOMBRE FIXE DOBJETS
  • CHAPITRE 10 COLLECTIONNER UN NOMBRE INDETERMINE DOBJETS
  • CHAPITRE 11 DESSINER DES OBJETS
  • CONTENU ET EXPLOITATION DU CD-ROM
  • INDEX
Page 2: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen

Le livre deJavapremier langage

CHEZ LE MEcircME EacuteDITEUR

DANS LA MEcircME COLLECTION

C DELANNOY ndash Le livre du C premier langage Pour les deacutebutants en programmation Ndeg8838 1994 280 pages

P CHALEacuteAT D CHARNAY ndash Programmation HTML et JavaScript Ndeg9182 1998 460 pages

C DELANNOY ndash Programmer en langage C Avec exercices corrigeacutesNdeg8985 1996 296 pages

C DELANNOY ndash La reacutefeacuterence du C norme ANSIISO Ndeg9036 1998 950 pages

C DELANNOY ndash Programmer en langage C++Ndeg9138 5e eacutedition 2000 648 pages

C DELANNOY ndash Apprendre le C++ avec Visual C++ 6Ndeg9088 1999 496 pages

C DELANNOY ndash Exercices en langage C++ Ndeg9067 2e eacutedition 1999 296 pages

C DELANNOY ndash Programmer en Turbo Pascal 70Ndeg8986 1993-1997 368 pages

PROGRAMMATION INTERNET

A PATZER et al ndash Programmation Java cocircteacute serveur Servlets JSP et EJB Ndeg9109 2000 984 pages

P CHAN ndash Le dictionnaire officiel Java 2 Ndeg9089 1999 890 pages

N MCFARLANE ndash JavaScript professionnelNdeg9141 2000 950 pages

J-C BERNADAC F KNAB ndash Construire une application XML Ndeg9081 1999 500 pages

A HOMER D SUSSMAN B FRANCIS ndash ASP 30 professionnel Ndeg9151 2000 1 150 pages

L LACROIX N LEPRINCE C BOGGERO C LAUER ndash Programmation Web avec PHP Ndeg9113 2000 382 pages

Anne Tasso

Le livre deJavapremier langage

EacuteDITIONS EYROLLES61 Bld Saint-Germain75240 Paris Cedex 05

wwweditions-eyrollescom

Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effetexpresseacutement la photocopie agrave usage collectif sans autorisation des ayantsdroit Or cette pratique sest geacuteneacuteraliseacutee notamment dans les eacutetablissementsdenseignement provoquant une baisse brutale des achats de livres au pointque la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et deles faire eacutediter correctement est aujourdhui menaceacutee

En application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou par-tiellement le preacutesent ouvrage sur quelque support que ce soit sans autorisation de lEacutedi-teur ou du Centre Franccedilais dexploitation du droit de Copie 20 rue des Grands Augustins75006 Pariscopy Eacuteditions Eyrolles 2001 Version eBook (ISBN) de louvrage 2-212-28032-7

DANGER

LEPHOTOCOPILLAGE

TUE LE LIVRE

Sun Sun Microsystems le logo Sun Java JDK sont des marques de fabriqueou des marques deacuteposeacutees de Sun Microsystems Inc

AVANT-PROPOS

Organisation de lrsquoouvrage

Ce livre est tout particuliegraverement destineacute aux deacutebutants qui souhaitent aborder lrsquoappren-tissage de la programmation en utilisant le langage Java comme premier langage

Les concepts fondamentaux de la programmation y sont preacutesenteacutes de faccedilon eacutevolutivegracircce agrave un deacutecoupage de lrsquoouvrage en trois parties chacune couvrant un aspect diffeacuterentdes outils et techniques de programmation

Le chapitre introductif laquo Naissance drsquoun programme raquo constitue le preacutealable neacutecessaireagrave la bonne compreacutehension des parties suivantes Il introduit aux meacutecanismes de cons-truction drsquoun algorithme compte tenu du fonctionnement interne de lrsquoordinateur etexplique les notions de langage informatique de compilation et drsquoexeacutecution agrave travers unexemple de programme eacutecrit en Java

La premiegravere partie concerne lrsquoeacutetude des laquo Outils et techniques de base raquo

bull Le chapitre 1 laquo Stocker une information raquo aborde la notion de variables et detypes Il preacutesente comment stocker une donneacutee en meacutemoire calculer des expressionsmatheacutematiques ou eacutechanger deux valeurs et montre comment le type drsquoune variablepeut influencer sur le reacutesultat drsquoun calcul

bull Le chapitre 2 laquo Communiquer une information raquo explique comment transmettre desvaleurs agrave lrsquoordinateur par lrsquointermeacutediaire du clavier et montre comment lrsquoordinateurfournit des reacutesultats en affichant des messages agrave lrsquoeacutecran

bull Le chapitre 3 laquo Faire des choix raquo examine comment tester des valeurs et prendre desdeacutecisions en fonction du reacutesultat Il traite de la comparaison de valeurs ainsi que delrsquoarborescence de choix

bull Le chapitre 4 laquo Faire des reacutepeacutetitions raquo est consacreacute agrave lrsquoeacutetude des outils de reacutepeacutetition etdrsquoiteacuteration Il aborde les notions drsquoincreacutementation et drsquoaccumulation de valeurs(compter et faire la somme drsquoune collection de valeurs)

La deuxiegraveme partie laquo Initiation agrave la programmation orienteacutee objet raquo introduit lesconcepts fondamentaux indispensables agrave la programmation objet

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageAVANT-PROPOS

VI

bull Le chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo montre lrsquointeacuterecirctde lrsquoemploi de fonctions dans la programmation Il examine les diffeacuterentes eacutetapes deleur creacuteation

bull Le chapitre 6 laquo Fonctions notions avanceacutees raquo deacutecrit tregraves preacuteciseacutement comment mani-puler les fonctions et leurs paramegravetres Il deacutefinit les termes de variable locale et declasse et explique le passage de paramegravetres par valeur

bull Le chapitre 7 laquo Les classes et les objets raquo explique agrave partir de lrsquoeacutetude de la classeString ce que sont les classes et les objets dans le langage Java Il montre ensuitecomment deacutefinir de nouvelles classes et construire des objets propres agrave lrsquoapplicationdeacuteveloppeacutee

bull Le chapitre 8 laquo Les principes du concept drsquoobjet raquo deacuteveloppe plus particuliegraverementcomment les objets se communiquent lrsquoinformation en expliquant notamment le prin-cipe du passage de paramegravetres par reacutefeacuterence Il deacutecrit ensuite les principes fondateursde la notion drsquoobjet crsquoest-agrave-dire lrsquoencapsulation des donneacutees (protection et controcircledes donneacutees constructeur de classe) ainsi que lrsquoheacuteritage entre classes

La troisiegraveme partie laquo Outils et techniques orienteacutes objet raquo donne tous les deacutetails surlrsquoorganisation le traitement et lrsquoexploitation intelligente des objets

bull Le chapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo concerne lrsquoorganisation desdonneacutees sous la forme drsquoun tableau de taille fixe

bull Le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo preacutesente les diffeacute-rents outils qui permettent drsquoorganiser dynamiquement en meacutemoire les ensembles dedonneacutees de mecircme nature Il est eacutegalement consacreacute aux diffeacuterentes techniquesdrsquoarchivage et agrave la faccedilon drsquoacceacuteder aux informations stockeacutees sous forme de fichiers

bull Le chapitre 11 laquo Dessiner des objets raquo couvre une grande partie des outils graphiquesproposeacutes par le langage Java Il analyse le concept eacuteveacutenement-action et deacutecritcomment reacutealiser une applet

Ce livre contient eacutegalement en annexe

bull Un guide drsquoutilisation du CD-Rom expliquant comment utiliser les outils proposeacutesdans le CD-Rom

bull Un index qui vous aidera agrave retrouver une information sur un thegraveme que vous recher-chiez (les mots-cleacutes du langage les exemples les principes de fonctionnement lesclasses et leurs meacutethodes etc)

copy copyright Eacuteditions Eyrolles

Table des matiegraveres

Avant-propos organisation de lrsquoouvrage V

Introduction naissance drsquoun programme 1

Construire un algorithme 1

Exemple lrsquoalgorithme du cafeacute chaud 2Vers une meacutethode 4

Passer de lrsquoalgorithme au programme 4

Qursquoest-ce qursquoun ordinateur 4Un premier programme en Java ou comment parler agrave un ordinateur 9

Exeacutecuter un programme 14

Compiler ou traduire en langage machine 14Compiler un programme eacutecrit en Java 15Les environnements de deacuteveloppement 17

Le projet laquo Gestion drsquoun compte bancaire raquo 17

Cahier des charges 18Les objets manipuleacutes 19La liste des ordres 20

Reacutesumeacute 20

Exercices 21

Apprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes 21Observer et comprendre la structure drsquoun programme Java 21Eacutecrire un premier programme Java 22

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

VIII

PARTIE 1

Les outils et techniques de base 23

CHAPITRE 1

Stocker une information 25

La notion de variable 25

Les noms de variables 26La notion de type 26Les types de base en Java 27Comment choisir un type de variable plutocirct qursquoun autre 30Deacuteclarer une variable 30

Lrsquoinstruction drsquoaffectation 31

Rocircle et meacutecanisme de lrsquoaffectation 31Deacuteclaration et affectation 32Quelques confusions agrave eacuteviter 33Eacutechanger les valeurs de deux variables 34

Les opeacuterateurs arithmeacutetiques 35

La prioriteacute des opeacuterateurs entre eux 36Le type drsquoune expression matheacutematique 37La transformation de types 37

Calculer des statistiques sur des opeacuterations bancaires 39

Cahier des charges 39Le code source complet 42Reacutesultat de lrsquoexeacutecution 42

Reacutesumeacute 43

Exercices 44

Repeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction 44Comprendre le meacutecanisme de lrsquoaffectation 44Comprendre le meacutecanisme drsquoeacutechange de valeurs 45Calculer des expressions mixtes 45Comprendre le meacutecanisme du cast 46

Le projet laquo Gestion drsquoun compte bancaire raquo 46

Deacuteterminer les variables neacutecessaires au programme 46

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

IX

CHAPITRE 2

Communiquer une information 49

La bibliothegraveque System 49

Lrsquoaffichage de donneacutees 50

Affichage de la valeur drsquoune variable 50Affichage drsquoun commentaire 50Affichage de plusieurs variables 51Affichage de la valeur drsquoune expression arithmeacutetique 51Affichage drsquoun texte 52

La saisie de donneacutees 54

La classe Lirejava 54

Reacutesumeacute 56

Exercices 57

Comprendre les opeacuterations de sortie 57Comprendre les opeacuterations drsquoentreacutee 58Observer et comprendre la structure drsquoun programme Java 58

Le projet laquo Gestion drsquoun compte bancaire raquo 59

Afficher le menu principal ainsi que ses options 59

CHAPITRE 3

Faire des choix 61

Lrsquoalgorithme du cafeacute chaud sucreacute ou non 61

Deacutefinition des objets manipuleacutes 62Liste des opeacuterations 62Ordonner la liste des opeacuterations 62

Lrsquoinstruction if-else 64

Syntaxe drsquoif-else 65Comment eacutecrire une condition 66Rechercher le plus grand de deux eacuteleacutements 67Deux erreurs agrave eacuteviter 69Des if-else imbriqueacutes 70

Lrsquoinstruction switch ou comment faire des choix multiples 72

Construction du switch 72Calculer le nombre de jours drsquoun mois donneacute 73Comment choisir entre if-else et switch 75

Reacutesumeacute 76copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

X

Exercices 77

Comprendre les niveaux drsquoimbrication 77Construire une arborescence de choix 78Manipuler les choix multiples geacuterer les caractegraveres 79

Le projet laquo Gestion drsquoun compte bancaire raquo 79

Acceacuteder agrave un menu suivant lrsquooption choisie 79

CHAPITRE 4

Faire des reacutepeacutetitions 81

Combien de sucre dans votre cafeacute 81

La boucle dowhile 8 3

Syntaxe 83Principes de fonctionnement 83Un distributeur automatique de cafeacute 84

La boucle while 89

Syntaxe 89Principes de fonctionnement 90Saisir un nombre entier au clavier 90

La boucle for 96

Syntaxe 96Principes de fonctionnement 96Rechercher le code Unicode drsquoun caractegravere donneacute 97Quelle boucle choisir 99

Reacutesumeacute 100

Exercices 102

Comprendre la boucle dohellipwhile 102Apprendre agrave compter accumuler et rechercher une valeur 102Comprendre la boucle while traduire une marche agrave suivre en programme Java 103Comprendre la boucle for 103

Le projet laquo Gestion drsquoun compte bancaire raquo 104

Rendre le menu interactif 104

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XI

PARTIE 2

Initiation agrave la programmation orienteacutee objet 105

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

Algorithme parameacutetreacute 108

Faire un theacute chaud ou comment remplacer le cafeacute par du theacute 108

Des fonctions Java preacutedeacutefinies 110

La librairie Math 110Exemples drsquoutilisation 111Principes de fonctionnement 113

Construire ses propres fonctions 114

Appeler une fonction 114Deacutefinir une fonction 115

Les fonctions au sein drsquoun programme Java 119

Comment placer plusieurs fonctions dans un programme 119Les diffeacuterentes formes drsquoune fonction 120

Reacutesumeacute 122

Exercices 124

Apprendre agrave deacuteterminer les paramegravetres drsquoun algorithme 124Comprendre lrsquoutilisation des fonctions 124Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction 125Eacutecrire une fonction simple 126

Le projet laquo Gestion drsquoun compte bancaire raquo 126

Deacutefinir une fonction 127Appeler une fonction 127

CHAPITRE 6

Fonctions notions avanceacutees 129

La structure drsquoun programme 129

La visibiliteacute des variables 130Variable locale agrave une fonction 132Variable de classe 134Quelques preacutecisions sur les variables de classe 135

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XII

Les fonctions communiquent 138

Le passage de paramegravetres par valeur 138Le reacutesultat drsquoune fonction 140Lorsqursquoil y a plusieurs reacutesultats agrave retourner 142

Reacutesumeacute 143

Exercices 144

Repeacuterer les variables locales et les variables de classe 144Communiquer des valeurs agrave lrsquoappel drsquoune fonction 145Transmettre un reacutesultat agrave la fonction appelante 146

Le projet laquo Gestion drsquoun compte bancaire raquo 146

Comprendre la visibiliteacute des variables 146Les limites du retour de reacutesultat 147

CHAPITRE 7

Les classes et les objets 149

La classe String une approche vers la notion drsquoobjet 149

Manipuler des mots en programmation 150Les diffeacuterentes meacutethodes de la classe String 151Appliquer une meacutethode agrave un objet 157

Construire et utiliser ses propres classes 159

Deacutefinir une classe et un type 159Deacutefinir un objet 163Manipuler un objet 164Une application qui utilise des objets Cercle 165

Reacutesumeacute 169

Exercices 170

Utiliser les objets de la classe String 170Creacuteer une classe drsquoobjets 170Consulter les variables drsquoinstance 170Analyser les reacutesultats drsquoune application objet 171

Le projet laquo Gestion drsquoun compte bancaire raquo 172

Traiter les chaicircnes de caractegraveres 172Deacutefinir le type Compte 172Construire lrsquoapplication Projet 173Deacutefinir le type LigneComptable 173Modifier le type Compte 173Modifier lrsquoapplication Projet 174

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIII

CHAPITRE 8

Les principes du concept drsquoobjet 175

La communication objet 175

Les donneacutees static 176Le passage de paramegravetres par reacutefeacuterence 178

Les objets controcirclent leur fonctionnement 183

La notion drsquoencapsulation 183La protection des donneacutees 184Les meacutethodes drsquoaccegraves aux donneacutees 185Les constructeurs 190

Lrsquoheacuteritage 192

La relation laquo est un raquo 192Le constructeur drsquoune classe heacuteriteacutee 194La protection des donneacutees heacuteriteacutees 195Le polymorphisme 196

Reacutesumeacute 197

Le projet laquo Gestion drsquoun compte bancaire raquo 198

Encapsuler les donneacutees drsquoun compte bancaire 198Comprendre lrsquoheacuteritage 199

PARTIE 3

Les outils et techniques orienteacutes objet 201

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

Les tableaux agrave une dimension 203

Deacuteclarer un tableau 204Manipuler un tableau 206

Quelques techniques utiles 208

La ligne de commande 208Trier un ensemble de donneacutees 212

Les tableaux agrave deux dimensions 218

Deacuteclaration drsquoun tableau agrave deux dimensions 218Acceacuteder aux eacuteleacutements drsquoun tableau 219

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIV

Reacutesumeacute 225

Exercices 226

Les tableaux agrave une dimension 226Les tableaux drsquoobjets 226Les tableaux agrave deux dimensions 227Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor 227

Le projet laquo Gestion drsquoun compte bancaire raquo 228

Traiter dix lignes comptables 228

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

La programmation dynamique 231

Les vecteurs 232Les dictionnaires 236

Lrsquoarchivage de donneacutees 242

La notion de flux 242Les fichiers textes 242Les fichiers drsquoobjets 247Geacuterer les exceptions 251

Reacutesumeacute 252

Exercices 254

Comprendre les vecteurs 254Comprendre les dictionnaires 254Geacuterer les erreurs 255

Le projet laquo Gestion drsquoun compte bancaire raquo 255

Les comptes sous forme de dictionnaire 255La sauvegarde des comptes bancaires 256La mise en place des dates dans les lignes comptables 256

CHAPITRE 11

Dessiner des objets 259

La librairie AWT 259

Les fenecirctres 260Le dessin 261Les eacuteleacutements de communication graphique 266

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XV

Les eacuteveacutenements 269

Les types drsquoeacuteveacutenements 269Exemple Associer un bouton agrave une action 271Exemple Fermer une fenecirctre 273Quelques principes 275

Les applets 275

Une page HTML 275Construire une applet 276Lrsquoutilitaire AppletViewer 277

Reacutesumeacute 278

Exercices 279

Comprendre les techniques drsquoaffichage graphique 279Apprendre agrave geacuterer les eacuteveacutenements 280

Le projet laquo Gestion drsquoun compte bancaire raquo 281

Calcul de statistiques 281Lrsquointerface graphique 282

Contenu et exploitation du CD-Rom 285

Index 287

copy copyright Eacuteditions Eyrolles

INTRODUCTION

Naissance drsquoun programme

Aujourdrsquohui lrsquoinformatique en geacuteneacuteral et lrsquoordinateur en particulier sont drsquoun usagecourant Gracircce agrave Internet lrsquoinformatique donne accegraves agrave une information mondiale Elledonne aussi la possibiliteacute de traiter cette information pour analyser geacuterer preacutevoir ouconcevoir des eacuteveacutenements dans des domaines aussi divers que la meacuteteacuteo la meacutedecinelrsquoeacuteconomie la bureautique etc

Cette communication et ces traitements ne sont possibles qursquoau travers de lrsquooutil informa-tique Cependant toutes ces faculteacutes reacutesultent davantage de lrsquoapplication drsquoun programmereacutesidant sur lrsquoordinateur que de lrsquoordinateur lui-mecircme En fait le programme est agravelrsquoordinateur ce que lrsquoesprit est agrave lrsquoecirctre humain

Creacuteer une application crsquoest apporter de lrsquoesprit agrave lrsquoordinateur Pour que cet esprit donnesa pleine mesure il est certes neacutecessaire de bien connaicirctre le langage des ordinateursmais surtout il est indispensable de savoir programmer La programmation est lrsquoartdrsquoanalyser un problegraveme afin drsquoen extraire la marche agrave suivre lrsquoalgorithme susceptible dereacutesoudre ce problegraveme

Crsquoest pourquoi ce chapitre commence par aborder la notion drsquoalgorithme Agrave partir drsquounexemple tireacute de la vie courante nous deacuteterminons les eacutetapes essentielles agrave lrsquoeacutelabora-tion drsquoun programme (laquo Construire un algorithme raquo) Agrave la section suivante laquo Qursquoest-ceqursquoun ordinateur raquo nous examinons le rocircle et le fonctionnement de lrsquoordinateur dans lepassage de lrsquoalgorithme au programme Nous eacutetudions ensuite agrave travers un exemplesimple comment eacutecrire un programme en Java et lrsquoexeacutecuter (laquo Un premier programmeen Java ou comment parler agrave un ordinateur raquo) Enfin nous deacutecrivons agrave la section Leprojet laquo Gestion drsquoun compte bancaire raquo le cahier des charges de lrsquoapplication projet quele lecteur assidu peut reacutealiser en suivant les exercices deacutecrits agrave la fin de chaque chapitre

Construire un algorithmeUn ordinateur muni de lrsquoapplication adeacutequate traite une information Il sait calculercompter trier ou rechercher lrsquoinformation dans la mesure ougrave un programmeur lui adonneacute les ordres agrave exeacutecuter et la marche agrave suivre pour arriver au reacutesultat

Cette marche agrave suivre srsquoappelle un algorithme copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

2

Deacuteterminer lrsquoalgorithme crsquoest trouver un cheminement de tacircches agrave fournir agrave lrsquoordinateurpour qursquoil les exeacutecute Voyons comment srsquoy prendre pour construire cette marche agravesuivre

Ne faire qursquoune seule chose agrave la fois

Avant de reacutealiser une application concregravete telle que celle proposeacutee en projet dans cetouvrage neacutecessairement complexe par la diversiteacute des tacircches qursquoelle doit reacutealisersimplifions-nous la tacircche en ne cherchant agrave reacutesoudre qursquoun problegraveme agrave la fois

Consideacuterons que creacuteer une application crsquoest deacutecomposer cette derniegravere en plusieurssous-applications qui agrave leur tour se deacutecomposent en micro-applications jusqursquoagravedescendre au niveau le plus eacuteleacutementaire Cette deacutemarche est appeleacutee analyse descen-dante Elle est le principe de base de toute construction algorithmique

Pour bien comprendre cette deacutemarche penchons-nous sur un problegraveme reacuteel et simple agravereacutesoudre comment faire un cafeacute chaud non sucreacute

Exemple lrsquoalgorithme du cafeacute chaudConstruire un algorithme crsquoest avant tout analyser lrsquoeacutenonceacute du problegraveme afin de deacutefinirlrsquoensemble des objets agrave manipuler pour obtenir un reacutesultat

Deacutefinition des objets manipuleacutes

Analysons lrsquoeacutenonceacute suivant

Comment faire un cafeacute chaud non sucreacute

Chaque mot a son importance et laquo non sucreacute raquo est aussi important que laquo cafeacute raquo oulaquo chaud raquo Le terme laquo non sucreacute raquo implique qursquoil ne soit pas neacutecessaire de prendre dusucre ni une petite cuillegravere

Remarquons que tous les ingreacutedients et ustensiles neacutecessaires ne sont pas citeacutes danslrsquoeacutenonceacute En particulier nous ne savons pas si nous disposons drsquoune cafetiegravere eacutelectriqueou non Pour reacutesoudre notre problegraveme nous devons prendre certaines deacutecisions et cesderniegraveres vont avoir une influence sur lrsquoallure geacuteneacuterale de notre algorithme

Supposons que pour reacutealiser notre cafeacute nous soyons en possession des ustensiles etingreacutedients suivants

cafeacute moulufiltreeaupichet cafetiegravere eacutelectriquetasseeacutelectriciteacutetable

En fixant la liste des ingreacutedients et des ustensiles nous deacutefinissons un environnementune base de travail Nous sommes ainsi en mesure drsquoeacutetablir une liste de toutes les actionsagrave mener pour reacutesoudre le problegraveme et de construire la marche agrave suivre permettantdrsquoobtenir un cafeacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

3

Liste des opeacuterationsVerser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtreRemplir le pichet drsquoeauPrendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique un filtre le pichet de la cafetiegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute remplisse le pichet Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le pichet dans la cafetiegravere

Cette eacutenumeacuteration est une description de toutes les actions neacutecessaires agrave la reacutealisationdrsquoun cafeacute chaud

Chaque action est un fragment du problegraveme donneacute et ne peut plus ecirctre deacutecoupeacutee Chaqueaction est eacuteleacutementaire par rapport agrave lrsquoenvironnement que nous nous sommes donneacute

En deacutefinissant lrsquoensemble des actions possibles nous creacuteons un langage minimal quinous permet de reacutealiser le cafeacute Ce langage est composeacute de verbes (Prendre PoserVerser Faire Attendrehellip) et drsquoobjets (Cafeacute moulu Eau Filtre Tassehellip)

La taille du langage crsquoest-agrave-dire le nombre de mots qursquoil renferme est deacutetermineacutee parlrsquoenvironnement Pour cet exemple nous avons en preacutecisant les hypothegraveses volontaire-ment choisi un environnement restreint Nous aurions pu deacutecrire des tacircches commelaquoprendre un contrat EDFraquo ou laquoplanter une graine de cafeacuteraquo mais elles ne sont pas utiles agravenotre objectif peacutedagogique

Telle que nous lrsquoavons deacutecrite la liste des opeacuterations ne nous permet pas encore de faireun cafeacute chaud En suivant cette liste tout y est mais dans le deacutesordre Pour reacutealiser cefameux cafeacute nous devons ordonner cette liste

Ordonner la liste des opeacuterations1 Prendre une cafetiegravere eacutelectrique2 Poser la cafetiegravere sur la table3 Prendre un filtre4 Poser le filtre dans la cafetiegravere5 Prendre du cafeacute moulu6 Verser le cafeacute moulu dans le filtre7 Prendre le pichet de la cafetiegravere8 Remplir le pichet drsquoeau 9 Verser lrsquoeau dans la cafetiegravere10 Poser le pichet dans la cafetiegravere 11 Brancher la cafetiegravere12 Allumer la cafetiegravere13 Attendre que le cafeacute remplisse le pichet14 Prendre une tasse15 Poser la tasse sur la table16 Eteindre la cafetiegravere17 Prendre le pichet de la cafetiegravere18 Verser le cafeacute dans la tasse

Lrsquoexeacutecution de lrsquoensemble ordonneacute de ces tacircches nous permet maintenant drsquoobtenir ducafeacute chaud non sucreacute

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

4

Remarquons que lrsquoordre drsquoexeacutecution de cette marche agrave suivre est important En effet silrsquoutilisateur reacutealise lrsquoopeacuteration 10 (Allumer la cafetiegravere) avant lrsquoopeacuteration 8 (Verserlrsquoeau dans la cafetiegravere) le reacutesultat est sensiblement diffeacuterent La marche agrave suivreainsi deacutesordonneacutee risque de deacuteteacuteriorer la cafetiegravere eacutelectrique

Cet exemple tireacute de la vie courante montre que pour reacutesoudre un problegraveme il est essen-tiel de deacutefinir les objets utiliseacutes puis de trouver la suite logique de tous les ordres neacuteces-saires agrave la reacutesolution dudit problegraveme

Vers une meacutethodeLa tacircche consistant agrave deacutecrire comment reacutesoudre un problegraveme nrsquoest pas simple Elledeacutepend en partie du niveau de difficulteacute du problegraveme et reacuteclame un savoir-faire la faccedilonde proceacuteder pour deacutecouper un problegraveme en actions eacuteleacutementaires

Pour aborder dans les meilleures conditions possibles la tacircche difficile drsquoeacutelaborationdrsquoun algorithme nous devons tout drsquoabord

bull deacuteterminer les objets utiles agrave la reacutesolution du problegraveme

bull construire et ordonner la liste de toutes les actions neacutecessaires agrave cette reacutesolution

Pour cela il est neacutecessaire

bull drsquoanalyser en deacutetail la tacircche agrave reacutesoudre

bull de fractionner le problegraveme en actions distinctes et eacuteleacutementaires

Ce fractionnement est reacutealiseacute en tenant compte du choix des hypothegraveses de travail Ceshypothegraveses imposent un ensemble de contraintes qui permettent de savoir si lrsquoactiondeacutecrite est eacuteleacutementaire et peut ne plus ecirctre deacutecoupeacutee

Cela fait nous avons construit un algorithme

Passer de lrsquoalgorithme au programmePour construire un algorithme nous avons deacutefini des hypothegraveses de travail crsquoest-agrave-diresupposeacute une base de connaissances minimales neacutecessaires agrave la reacutesolution du problegravemeAinsi le fait de prendre lrsquohypothegravese drsquoavoir du cafeacute moulu nous autorise agrave ne pas deacutecrirelrsquoensemble des tacircches preacuteceacutedant lrsquoacquisition du cafeacute moulu Crsquoest donc la connaissance delrsquoenvironnement de travail qui deacutetermine en grande partie la construction de lrsquoalgorithme

Pour passer de lrsquoalgorithme au programme le choix de lrsquoenvironnement de travail nrsquoestplus de notre ressort Jusqursquoagrave preacutesent nous avons supposeacute que lrsquoexeacutecutant eacutetait humainMaintenant notre exeacutecutant est lrsquoordinateur Pour eacutecrire un programme nous devonssavoir ce dont est capable un ordinateur et connaicirctre son fonctionnement de faccedilon agraveeacutetablir les connaissances et capaciteacutes de cet exeacutecutant

Qursquoest-ce qursquoun ordinateur Notre intention nrsquoest pas de deacutecrire en deacutetail le fonctionnement de lrsquoordinateur et de cescomposants mais drsquoen donner une image simplifieacutee

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

5

Pour tenter de comprendre comment travaille lrsquoordinateur et surtout comment il seprogramme nous allons scheacutematiser agrave lrsquoextrecircme ses meacutecanismes de fonctionnement

Un ordinateur est composeacute de deux parties distinctes la meacutemoire centrale et lrsquouniteacutecentrale

La meacutemoire centrale permet de meacutemoriser toutes les informations neacutecessaires agrave lrsquoexeacutecu-tion drsquoun programme Ces informations correspondent agrave des donneacutees ou agrave des ordres agraveexeacutecuter (instructions) Les ordres placeacutes en meacutemoire sont effectueacutes par lrsquouniteacutecentrale la partie active de lrsquoordinateur

Lorsqursquoun ordinateur exeacutecute un programme son travail consiste en grande partie agravegeacuterer la meacutemoire soit pour y lire une instruction soit pour y stocker une information Ence sens nous pouvons voir lrsquoordinateur comme un robot qui sait agir en fonction desordres qui lui sont fournis Ces actions en nombre limiteacute sont deacutecrites ci-dessous

Deacuteposer ou lire une information dans une case meacutemoire

La meacutemoire est formeacutee drsquoeacuteleacutements ou cases qui possegravedent chacune un numeacutero (uneadresse) Chaque case meacutemoire est en quelque sorte une boicircte aux lettres pouvant conte-nir une information (une lettre) Pour y deacuteposer cette information lrsquoordinateur (lefacteur) doit connaicirctre lrsquoadresse de la boicircte Lorsque le robot place une information dansune case meacutemoire il meacutemorise lrsquoadresse ougrave se situe celle-ci afin de retrouver lrsquoinforma-tion en temps neacutecessaire

Le robot sait deacuteposer une information dans une case mais il ne sait pas la retirer (au sensde prendre un courrier deacuteposeacute dans une boicircte aux lettres) Lorsque le robot prend lrsquoinfor-mation deacuteposeacutee dans une case meacutemoire il ne fait que la lire En aucun cas il ne la retireni ne lrsquoefface Lrsquoinformation lue reste toujours dans la case meacutemoire

Pour effacer une information drsquoune case meacutemoire il est neacutecessaire de placer unenouvelle information dans cette mecircme case Ainsi la nouvelle donneacutee remplace lrsquoancienneet lrsquoinformation preacuteceacutedente est deacutetruite

Figure Indash1

La meacutemoire de lrsquoordi-nateur est composeacutee de cases posseacutedant une adresse et pouvant contenir agrave tout moment une valeur

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

6

Exeacutecuter des opeacuterations simples telles que lrsquoaddition ou la soustraction

Le robot lit et exeacutecute les opeacuterations dans lrsquoordre ougrave elles lui sont fournies Pour faireune addition il va chercher les valeurs agrave additionner dans les cases meacutemoire approprieacutees(stockeacutees par exemple aux adresses a et b) et reacutealise ensuite lrsquoopeacuteration demandeacutee Ilenregistre alors le reacutesultat de cette opeacuteration dans une case drsquoadresse c De telles opeacutera-tions sont deacutecrites agrave lrsquoaide drsquoordres appeleacutes aussi instructions

Comparer des valeurs

Le robot est capable de comparer deux valeurs entre elles pour deacuteterminer si lrsquounedrsquoentre elle est plus grande plus petite eacutegale ou diffeacuterente de lrsquoautre valeur Gracircce agrave lacomparaison le robot est capable de tester une condition et drsquoexeacutecuter un ordre plutocirctqursquoun autre en fonction du reacutesultat du test

La reacutealisation drsquoune comparaison ou drsquoun test fait que le robot ne peut plus exeacutecuter lesinstructions dans leur ordre drsquoapparition En effet suivant le reacutesultat du test il doitrompre lrsquoordre de la marche agrave suivre en sautant une ou plusieurs instructions Crsquoestpourquoi il existe des instructions particuliegraveres dites de branchement Gracircce agrave ce typedrsquoinstructions le robot est agrave mecircme non seulement de sauter des ordres mais aussi derevenir agrave un ensemble drsquoopeacuterations afin de les reacutepeacuteter

Figure Indash2

Le programme exeacutecute les instructions dans lrsquoordre de leur apparition

Figure Indash3

Suivant le reacutesultat du test lrsquoordinateur exeacutecute lrsquoune ou lrsquoautre instruction en sautant celle qursquoil ne doit pas exeacutecuter

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

7

Communiquer une information eacuteleacutementaire

Un programme est essentiellement un outil qui traite lrsquoinformation Cette informationest transmise agrave lrsquoordinateur par lrsquoutilisateur Lrsquoinformation est saisie par lrsquointermeacutediairedu clavier ou de la souris Cette transmission de donneacutees agrave lrsquoordinateur est appeleacuteecommunication drsquoentreacutee (input en anglais) On parle aussi de saisie ou encore de lecturede donneacutees

Apregraves traitement le programme fournit un reacutesultat agrave lrsquoutilisateur soit par lrsquointermeacutediairede lrsquoeacutecran soit sous forme de fichiers que lrsquoon peut ensuite imprimer

Il srsquoagit alors de communication de sortie (output) ou encore drsquoaffichage ou drsquoeacutecriturede donneacutees

Coder lrsquoinformation

De par la nature de ses composants eacutelectroniques le robot ne perccediloit que deux eacutetats composant allumeacute et composant eacuteteint De cette perception deacutecoule le langage binairequi utilise par convention les deux symboles 0 (eacuteteint) et 1 (allumeacute)

Ne connaissant que le 0 et le 1 lrsquoordinateur utilise un code pour repreacutesenter une infor-mation aussi simple qursquoun nombre entier ou un caractegravere Ce code est un programmequi diffeacuterencie chaque type drsquoinformation et transforme une information (donneacutee numeacute-rique ou alphabeacutetique) en valeurs binaires Agrave lrsquoinverse ce programme sait aussi transfor-mer un nombre binaire en valeur numeacuterique ou alphabeacutetique Il existe autant de codesque de types drsquoinformations Cette diffeacuterenciation du codage (en fonction de ce qui doitecirctre repreacutesenteacute) introduit le concept de type de donneacutees

Signalons en outre que toute information fournie agrave lrsquoordinateur est au bout du comptecodeacutee en binaire Lrsquoinformation peut ecirctre un simple nombre ou une instruction deprogramme

Figure Indash4

La saisie au clavier drsquoune valeur correspond agrave une opeacuteration drsquoentreacutee et lrsquoaffichage drsquoun reacutesultat agrave une opeacuteration de sortie

Figure Indash5

Toute information est codeacutee en binaire Il existe autant de codes que de types drsquoinformations

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

8

Exemple

Pour additionner deux nombres lrsquoordinateur fait appel aux trois eacuteleacutements qui lui sontneacutecessaires pour reacutealiser cette opeacuteration Ces eacuteleacutements sont les suivants

bull Le code binaire repreacutesentant lrsquoopeacuteration drsquoaddition (par exemple 0101)

bull Lrsquoadresse de la case meacutemoire ougrave est stockeacute le premier nombre (par exemple 011101)

bull Lrsquoadresse de la case meacutemoire ougrave se trouve la deuxiegraveme valeur (par exemple 010101)

Pour finir lrsquoinstruction drsquoaddition de ces deux nombres srsquoeacutecrit en assemblant les troiscodes binaires (soit dans notre exemple 0101011101010101)

Remarquons que le code binaire associeacute agrave chaque code drsquoopeacuteration (addition test etc)nrsquoest pas neacutecessairement identique drsquoun ordinateur agrave un autre Ce code binaire est deacuteter-mineacute par le constructeur de lrsquoordinateur De ce fait une instruction telle que lrsquoadditionde deux nombres nrsquoa pas le mecircme code binaire drsquoune machine agrave une autre Il existedonc pour un mecircme programme un code binaire qui diffegravere suivant le type drsquoordinateurutiliseacute

Lrsquoordinateur nrsquoest qursquoun exeacutecutant

En pratique le robot est tregraves habile agrave reacutealiser lrsquoensemble des tacircches eacutenonceacutees ci-dessusIl les exeacutecute beaucoup plus rapidement qursquoun ecirctre humain

En revanche le robot nrsquoest pas doueacute drsquointelligence Il nrsquoest ni capable de choisir uneaction plutocirct qursquoune autre ni apte agrave exeacutecuter de lui-mecircme lrsquoensemble de ces actionsPour qursquoil puisse exeacutecuter une instruction il faut qursquoun ecirctre humain deacutetermine lrsquoinstruc-tion la plus approprieacutee et lui donne lrsquoordre de lrsquoexeacutecuter

Le robot est un exeacutecutant capable de comprendre des ordres Compte tenu de ses capaci-teacutes limiteacutees les ordres ne peuvent pas lui ecirctre donneacutes dans le langage naturel propre agravelrsquoecirctre humain En effet le robot ne comprend pas le sens des ordres qursquoil exeacutecute maisseulement leur forme Chaque ordre doit ecirctre eacutecrit avec des mots particuliers et uneforme ou syntaxe preacuteeacutetablie Lrsquoensemble de ces mots constitue un langage informati-que Les langages C C++ Pascal Basic Fortran Cobol et Java sont des langages deprogrammation constitueacutes de mots et drsquoordres dont la syntaxe diffegravere selon le langage

Pour eacutecrire un programme il est neacutecessaire de connaicirctre un de ces langages de faccedilon agravetraduire un algorithme en un programme composeacute drsquoordres

Figure Indash6

Pour un mecircme programme le code binaire diffegravere en fonction de lrsquoordinateur utiliseacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

9

Un premier programme en Java ou comment parler agrave un ordinateurPour creacuteer une application nous allons avoir agrave deacutecrire une liste ordonneacutee drsquoopeacuterationsdans un langage compreacutehensible par lrsquoordinateur La contrainte est de taille et se porteessentiellement sur la faccedilon de deacutefinir et de repreacutesenter les objets neacutecessaires agrave la reacutesolu-tion du problegraveme en fonction du langage de lrsquoordinateur

Pour bien comprendre la difficulteacute du travail agrave accomplir regardons comment fairecalculer agrave un ordinateur la circonfeacuterence drsquoun cercle de rayon quelconque

Calcul de la circonfeacuterence drsquoun cercle

Lrsquoexercice consiste agrave calculer le peacuterimegravetre drsquoun cercle de rayon quelconque Noussupposons que lrsquoutilisateur emploie le clavier pour transmettre au programme la valeurdu rayon

Deacutefinition des objets manipuleacutes

Pour calculer la circonfeacuterence du cercle lrsquoordinateur a besoin de stocker dans ses casesmeacutemoire la valeur du rayon ainsi que celle du peacuterimegravetre Les objets agrave manipuler sontdeux valeurs numeacuteriques appartenant agrave lrsquoensemble des reacuteels Nous appelons P lavaleur correspondant au peacuterimegravetre et R la valeur du rayon

La liste des opeacuterations

La circonfeacuterence drsquoun cercle est calculeacutee agrave partir de la formule P = 2 times π times R

La valeur du rayon est fournie par lrsquoutilisateur agrave lrsquoaide du clavier Elle nrsquoest donc pasconnue au moment de lrsquoeacutecriture du programme En conseacutequence il est neacutecessairedrsquoeacutecrire lrsquoordre (instruction) de saisie au clavier avant de calculer la circonfeacuterence

La liste des opeacuterations est la suivante

1 Reacuteserver deux cases meacutemoire pour y stocker les valeurs correspondant au rayon (R) et au peacuterimegravetre (P)

2 Demander agrave lrsquoutilisateur de saisir la valeur du rayon au clavier et la placer dans la case meacutemoire associeacutee

3 Connaissant la valeur du rayon calculer la circonfeacuterence4 Afficher le reacutesultat

La valeur du rayon puis apregraves calcul celle de la circonfeacuterence sont les donneacutees princi-pales de ce programme Lrsquoordinateur doit les stocker en meacutemoire pour les utiliser

Lrsquoopeacuteration 1 consiste agrave donner un nom aux cases meacutemoire qui vont servir agrave stocker cesdonneacutees Lors de cette opeacuteration appeleacutee deacuteclaration de variables lrsquoordinateur reacuteserveune case meacutemoire pour chaque nom de variable deacutefini Ici ces variables ont pour nom Pet R Au cours de cette reacuteservation drsquoemplacements meacutemoire lrsquoordinateur associe le nomde la variable et lrsquoadresse reacuteelle de la case meacutemoire

Pour le programmeur le nom et lrsquoadresse drsquoune case ne font qursquoun car il ne manipuleles variables que par leur nom alors que lrsquoordinateur travaille avec leur adresse Endonnant un nom agrave une case lrsquoecirctre humain sait facilement identifier les objets qursquoil mani-pule alors qursquoil lui serait peacutenible de manipuler les adresses binaires correspondantes

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

10

Inversement en associant un nom agrave une adresse codeacutee en binaire lrsquoordinateur peut veacuteri-tablement manipuler ces objets

Lrsquoopeacuteration 2 permet de saisir au clavier la valeur du rayon Pour que lrsquoutilisateur noninitieacute sache agrave quoi correspond la valeur saisie il est neacutecessaire avant de proceacuteder agrave cettesaisie drsquoafficher un message explicatif agrave lrsquoeacutecran Lrsquoopeacuteration 2 se deacutecompose en deuxinstructions eacuteleacutementaires agrave savoir

Afficher un message demandant agrave lrsquoutilisateur du programme de saisir une valeur pour le rayonUne fois la valeur saisie par lrsquoutilisateur la placer dans sa case meacutemoire

Les opeacuterations 3 et 4 sont des actions eacuteleacutementaires directement traduisibles en langageinformatique

La traduction en Java

Une application ou programme ne srsquoeacutecrit pas en une seule fois Nous verrons agrave lalecture de cet ouvrage que programmer crsquoest toujours deacutecomposer une difficulteacute endiffeacuterentes tacircches plus aiseacutees agrave reacutealiser Cette deacutecomposition srsquoapplique aussi bien pourconstruire un algorithme que pour lrsquoeacutecriture du programme lui-mecircme

Drsquoune maniegravere geacuteneacuterale la meilleure faccedilon de proceacuteder pour fabriquer un programmerevient agrave eacutecrire une premiegravere eacutebauche et agrave la tester De ces tests il ressort des fautes agravecorriger et surtout de nouvelles ideacutees Le programme final consiste en lrsquoassemblage detoutes ces corrections et de ces ameacuteliorations

Pour traduire la marche agrave suivre deacutefinie preacuteceacutedemment selon les regravegles de syntaxe dulangage Java nous allons utiliser cette mecircme deacutemarche Nous nous inteacuteresserons dansun premier temps agrave la traduction du cœur du programme (opeacuterations 1 agrave 4 deacutecrites agrave lasection preacuteceacutedente) Nous verrons pour finir comment inseacuterer lrsquoensemble de ces instruc-tions dans une structure de programme Java

bull Lrsquoopeacuteration 1 consiste agrave deacuteclarer les variables utiliseacutees pour le calcul de la circonfeacute-rence Cette opeacuteration se traduit par lrsquoinstruction

double R P

Par cette instruction le programme demande agrave lrsquoordinateur de reacuteserver deux casesmeacutemoire nommeacutees R et P pour y stocker les valeurs du rayon et de la circonfeacuterenceLe mot reacuteserveacute double permet de preacuteciser que les valeurs numeacuteriques sont reacuteelleslaquo avec une double preacutecision raquo crsquoest-agrave-dire avec une preacutecision pouvant aller jusqursquoagrave17 chiffres apregraves la virgule

Pour plus drsquoinformations sur la deacutefinition des types de variables reportez-vous au chapitre 1laquo Stocker une information raquo

bull Pour reacutealiser lrsquoopeacuteration 2 nous devons faire afficher un message demandant agrave lrsquoutili-sateur de saisir une valeur Cette opeacuteration se traduit par lrsquoinstruction

Systemoutprint(Valeur du rayon )

Systemoutprint() est ce que lrsquoon appelle un programme ou une fonction preacutedeacutefini

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

11

par le langage Java Ce programme permet drsquoeacutecrire agrave lrsquoeacutecran le message speacutecifieacute agravelrsquointeacuterieur des parenthegraveses Le message afficheacute est ici un fragment de texte appeleacutedans le jargon informatique une chaicircne de caractegraveres Pour que lrsquoordinateur com-prenne que la chaicircne de caractegraveres nrsquoest pas un nom de variable mais un texte agraveafficher il faut placer entre guillemets ( ) tous les caractegraveres composant la chaicircne

bull Lrsquoopeacuteration 2 est termineacutee lorsque la valeur demandeacutee est effectivement saisie etstockeacutee en meacutemoire Pour ce faire nous devons eacutecrire lrsquoinstruction suivante

R = Lired()

Lired()est un programme proposeacute par lrsquoauteur qui permet de communiquer unevaleur numeacuterique au programme par lrsquointermeacutediaire du clavier Ce programme estune fonction qui donne lrsquoordre agrave lrsquoordinateur drsquoattendre la saisie drsquoune valeur de dou-ble preacutecision La saisie est effective lorsque lrsquoutilisateur valide sa reacuteponse en appuy-ant sur la touche entreacutee du clavier Cette fonction nrsquoeacutetant pas preacutedeacutefinie par lelangage Java elle figure dans le CD-Rom livreacute avec le manuel

Une fois la valeur saisie elle est placeacutee dans la variable R gracircce au signe =

Pour plus de preacutecisions sur les deux meacutethodes Systemoutprint() et Lired()reportez-vous au chapitre 2 laquo Communiquer une information raquo Pour le signe = voir le chapitre 1laquo Stocker une information raquo

bull Lrsquoopeacuteration 3 permet de calculer la valeur de la circonfeacuterence Elle se traduit de lafaccedilon suivante

P = 2 MathPI R

Le signe est le symbole qui caracteacuterise lrsquoopeacuteration de multiplication MathPI est leterme qui repreacutesente la valeur numeacuterique du nombre π avec une preacutecision de17 chiffres apregraves la virgule Le mot-cleacute Math deacutesigne la bibliothegraveque de matheacutema-tiques accompagnant le langage Java Cette bibliothegraveque contient outre des con-stantes telles que π des fonctions standards comme sqrt() (racine carreacutee) ou sin()(sinus) Une fois les opeacuterations de multiplication effectueacutees la valeur calculeacutee estplaceacutee dans la variable P gracircce au signe =

bull La derniegravere opeacuteration (4) de notre programme a pour rocircle drsquoafficher le reacutesultat ducalcul preacuteceacutedent Cet affichage est reacutealiseacute gracircce agrave lrsquoinstruction

Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Ce deuxiegraveme appel agrave la fonction Systemoutprint() est plus complexe que le pre-mier Il meacutelange lrsquoaffichage de chaicircnes de caractegraveres (texte entre guillemets) et decontenu de variables

Si les caractegraveres R et P ne sont pas placeacutes entre guillemets crsquoest pour que lrsquoordinateurles interpregravete non pas comme des caractegraveres agrave afficher mais comme les variables quiont eacuteteacute deacuteclareacutees en deacutebut de programme De ce fait il affiche le contenu des vari-ables et non les lettres R et P

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

12

Les signes + qui apparaissent dans lrsquoexpression Le cercle de rayon + R + apour perimetre + P indiquent que chaque eacuteleacutement du message doit ecirctreafficheacute en le collant aux autres drsquoabord la chaicircne de caractegraveres Le cercle derayon puis la valeur de R puis la chaicircne a pour peacuterimegravetre et pour finir lavaleur de P

En reacutesumeacute la partie centrale du programme contient les cinq instructions suivantes

double R P Systemoutprint(Valeur du rayon ) R = Lired() P = 2 MathPI R Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Pour ameacuteliorer la lisibiliteacute du programme il est possible drsquoinseacuterer dans le programmedes commentaires comme suit

Deacuteclaration des variablesdouble R P Afficher le message Valeur du rayon agrave lrsquoeacutecranSystemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable RR = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacuteeP = 2 MathPI R Afficher le reacutesultatSystemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Les lignes du programme qui deacutebutent par les signes sont consideacutereacutees par lrsquoordinateurnon pas comme des ordres agrave exeacutecuter mais comme des lignes de commentaire Ellespermettent drsquoexpliquer en langage naturel ce que reacutealise lrsquoinstruction associeacutee

Eacutecrites de la sorte ces instructions constituent le cœur de notre programme Elles nepeuvent cependant pas encore ecirctre interpreacuteteacutees correctement par lrsquoordinateur En effetcelui-ci exeacutecute les instructions drsquoun programme dans lrsquoordre de leur arriveacutee Une appli-cation doit donc ecirctre constitueacutee drsquoune instruction qui caracteacuterise le deacutebut du programmePour ce faire nous devons eacutecrire notre programme ainsi

public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2 MathPI R Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la fonction main()

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

13

La ligne public static void main(String [] argument) est lrsquoinstruction qui permetdrsquoindiquer agrave lrsquoordinateur le deacutebut du programme Ce deacutebut est identifieacute par ce que lrsquoonappelle la fonction main() crsquoest-agrave-dire la fonction principale du programme De cettefaccedilon lorsque le programme est exeacutecuteacute lrsquoordinateur recherche le mot-cleacute main Unefois ce mot-cleacute trouveacute lrsquoordinateur exeacutecute une agrave une chaque instruction constituant lafonction

Les autres mots-cleacutes tels que public static ou void deacuteterminent certaines caracteacuteris-tiques de la fonction main() Ces mots-cleacutes obligatoirement placeacutes et eacutecrits dans cetordre sont expliqueacutes au fur et agrave mesure de leur apparition dans le livre et plus particuliegrave-rement agrave la section laquo Quelques techniques utiles raquo du chapitre laquo Collectionner un nombrefixe dobjets raquo

Pour finir nous devons inseacuterer la fonction main() dans ce qui est appeleacute une classe JavaEn programmation objet un programme nrsquoest exeacutecutable que srsquoil est deacutefini agrave lrsquointeacuterieurdrsquoune classe Une classe est une entiteacute interpreacuteteacutee par lrsquoordinateur comme eacutetant uneuniteacute de programme qursquoil peut exeacutecuter degraves qursquoun utilisateur le souhaite

Aucun programme ne peut ecirctre eacutecrit en dehors drsquoune classe Nous devons donc placer lafonction main() agrave lrsquointeacuterieur drsquoune classe deacutefinie par lrsquoinstruction public class Cercle comme suit

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2MathPIR Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la classe Cercle

Nous obtenons ainsi le programme dans son inteacutegraliteacute La ligne public class Cerclepermet de deacutefinir une classe Puisque notre programme effectue des opeacuterations sur uncercle nous avons choisi drsquoappeler cette classe Cercle Nous aurions pu lui donner untout autre nom comme Rond ou Exemple Ainsi deacutefinie la classe Cercle devient unprogramme agrave part entiegravere

Pour voir le reacutesultat de lrsquoexeacutecution de ce programme reportez-vous agrave la section laquo Exemple surplate-forme Unix raquo ci-apregraves

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

14

En observant la Figure 7 nous remarquons que ce programme de mecircme que tous ceuxagrave venir est constitueacute de deux blocs encastreacutes deacutefinis par les deux lignes public classCercle et public static void main(String [] argument)

Ces deux blocs constituent la charpente principale et neacutecessaire agrave tout programme eacutecritavec le langage Java Cet exemple montre en outre que les mots reacuteserveacutes par le langageJava sont nombreux et varieacutes et qursquoils constituent une partie du langage Java

Si la syntaxe crsquoest-agrave-dire la forme de ces instructions peut paraicirctre eacutetrange de primeabord nous verrons agrave la lecture de cet ouvrage que leur emploi obeacuteit agrave des regravegles strictesEn apprenant ces regravegles et en les appliquant vous pourrez vous initier aux techniques deconstruction drsquoun programme qui reviennent agrave deacutecomposer un problegraveme en actionseacuteleacutementaires puis agrave traduire celles-ci agrave lrsquoaide du langage Java

Exeacutecuter un programmeNous avons eacutecrit un programme constitueacute drsquoordres dont la syntaxe obeacuteit agrave des regraveglesstrictes Pour obtenir le reacutesultat des calculs deacutecrits dans le programme nous devons lefaire lire par lrsquoordinateur crsquoest-agrave-dire lrsquoexeacutecuter

Pour cela nous devons traduire le programme en langage machine En effet nouslrsquoavons vu lrsquoordinateur ne comprend qursquoun seul langage le langage binaire

Compiler ou traduire en langage machineCette traduction du code source (le programme eacutecrit en langage informatique) en codemachine exeacutecutable (le code binaire) est reacutealiseacutee par un programme appeleacute compila-teur Lrsquoopeacuteration de compilation consiste agrave lancer un programme qui lit chaque instruc-tion du code source et veacuterifie si celles-ci ont une syntaxe correcte Srsquoil nrsquoy a pas drsquoerreurle compilateur creacutee un code binaire directement exeacutecutable par lrsquoordinateur

Il existe autant de compilateurs que de langages Un programme eacutecrit en langage Pascalest traduit en binaire agrave lrsquoaide drsquoun compilateur Pascal et un programme eacutecrit en Java estcompileacute par un compilateur Java Le compilateur Java ne travaille pas tout agrave fait commeun compilateur classique traduisant un code source en code exeacutecutable Pour mieuxcomprendre cette diffeacuterence voyons son fonctionnement et comment lrsquoutiliser

Figure Indash7

Un programme Java est constitueacute de deux blocs encastreacutes Le premier bloc repreacutesente la classe associeacutee au programme tandis que le second deacutetermine la fonction principale

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

15

Compiler un programme eacutecrit en Java

Lrsquoobjectif premier de J Gosling le creacuteateur du langage Java a eacuteteacute de reacutealiser un langageindeacutependant de lrsquoordinateur Dans cette optique un programme eacutecrit sur PC par exem-ple doit pouvoir srsquoexeacutecuter sur un PC (de type IBM) un Macintosh (Apple) ou unestation Unix (de type Sun) et ce sans reacuteeacutecriture ni compilation du code source

Or le code binaire est speacutecifique de chaque machine comme nous lrsquoavons vu agrave lasection laquo Coder lrsquoinformation raquo Il est impossible de faire tourner un mecircme programmesource drsquoune machine agrave une autre sans le compiler agrave nouveau En effet lors de lanouvelle compilation des erreurs apparaissent dues aux diffeacuterences de mateacuteriel infor-matique Pour corriger cet inconveacutenient majeur lrsquoideacutee de JGosling a eacuteteacute de creacuteer uncode intermeacutediaire entre le code source et le code binaire Ce code intermeacutediaire estappeleacute pseudo-code ou encore byte code

En effet en creacuteant un pseudo-code identique pour tous les ordinateurs il est possibledrsquoexeacutecuter ce code sur diffeacuterentes machines sans avoir agrave le recompiler Cette exeacutecutionest reacutealiseacutee par un programme speacutecifique de la machine utiliseacutee qui interpregravete et exeacutecutele pseudo-code compte tenu des ressources propres de lrsquoordinateur

Ce programme srsquoappelle un interpreacuteteur Java Il en existe autant que de types drsquoordina-teurs (plates-formes) Lrsquoensemble des ces interpreacuteteurs constitue ce que lrsquoon appelle lamachine virtuelle Java ou JVM (Java Virtual Machine)

Le compilateur Java ne creacutee pas de code binaire agrave la diffeacuterencedes autres compilateurstels que les compilateurs C ou C++ Il fabrique un pseudo-code qui est ensuite inter-preacuteteacute par un programme speacutecifique de lrsquoordinateur Ce dernier programme transforme lepseudo-code en code directement exeacutecutable par lrsquoordinateur choisi Lrsquoavantage drsquoun telsystegraveme est que le deacuteveloppeur drsquoapplications est certain de creacuteer des programmes tota-lement compatibles avec les diffeacuterents ordinateurs du marcheacute sans avoir agrave reacuteeacutecrire unepartie du code

Le kit de deacuteveloppement Java (JDK)

Le tout premier compilateur Java a eacuteteacute eacutecrit par J Gosling agrave lrsquoinitiative de Sun le cons-tructeur de stations de travail sous Unix au deacutebut des anneacutees 90

Figure Indash8

Le compilateur (javac) transforme le code source en pseudo-code Ce dernier est exeacutecuteacute gracircce agrave un interpreacuteteur (java) speacutecifique de chaque type de machine Lrsquoensemble des interpreacuteteurs constitue la JVM

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

16

Aujourdrsquohui le compilateur Java est teacuteleacutechargeable depuis le site Internet de Sun Il estfourni avec le kit de deacuteveloppement Java (JDK Java Development Kit ou encore SDKSandard Development Kit) Cet environnement est disponible sur les ordinateurs de typeSolaris PC sous Windows 9598 ou NT et Mac OS Si vous souhaitez installer le JDK survotre machine consultez sur le CD-Rom fourni avec louvrage le fichier laquo outils raquo

Le JDK est ce que lrsquoon appelle une boicircte agrave outils de deacuteveloppement drsquoapplications Celarevient agrave dire qursquoil est constitueacute drsquooutils ou programmes que lrsquoon utilise sous forme decommande ou ordre Pour transmettre une commande agrave un ordinateur le programmeurdoit saisir le nom de cette commande au clavier dans une fenecirctre speacutecifique du typedrsquoordinateur utiliseacute Les deux principales commandes agrave connaicirctre pour cet ouvrage sontles commandes de compilation (javac) et drsquoexeacutecution (java)

Exemple sur plate-forme Unix

La marche agrave suivre est la suivante

1 Entrez le programme qui calcule la circonfeacuterence drsquoun cercle (exemple donneacute agrave lasection laquo Eacutecrire un programme raquo) agrave lrsquoaide drsquoun eacutediteur de texte crsquoest-agrave-dire un logi-ciel permettant de saisir du texte au clavier Les eacutediteurs de texte les plus couram-ment utiliseacutes sous Unix sont vi et emacs

2 Sauvegardez votre programme en choisissant comme nom de fichier celui qui suitles termes public class Pour notre exemple nous avons eacutecrit public classCercle Le fichier est donc agrave sauvegarder sous le nom Cerclejava

3 Agrave partir du CD-Rom fourni avec lrsquoouvrage copiez le fichier Lirejava dans votrereacutepertoire de travail La preacutesence de ce fichier est neacutecessaire pour que lrsquoordinateurdemande la saisie drsquoune valeur au clavier Pour plus drsquoinformations reportez-vousau chapitre 2 laquo Communiquer une information raquo

4 Lancez lrsquoordre de compilation en saisissant sous Unix la commande

javac Cerclejava

La compilation est lanceacutee Le compilateur exeacutecute sa tacircche et compile les fichiersCerclejava et Lirejava Au final si aucune erreur nrsquoest deacutetecteacutee le compilateurcreacutee un nouveau fichier appeleacute Cercleclass ainsi qursquoun fichier Lireclass Cesdeux fichiers correspondent au pseudo-code relatif agrave chacun des programmes com-pileacutes

5 Exeacutecutez le programme en lanccedilant la commande

java Cercle

La commande java lance le programme qui interpregravete le pseudo-code creacuteeacute agrave lrsquoeacutetapepreacuteceacutedente Ce programme traduit le pseudo-code dans le code binaire conforme agrave lamachine sur laquelle il est lanceacute Apregraves exeacutecution le reacutesultat obtenu agrave lrsquoeacutecran est

Valeur du rayon 55Le cercle de rayon 5 a pour perimetre 3141592653589793

ougrave 55 est une valeur entreacutee au clavier par lrsquoutilisateurcopy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

17

Pour exeacutecuter un programme les deux eacutetapes suivantes sont neacutecessaires

bull La compilation du programme agrave lrsquoaide de la commande javac suivie du nom duprogramme Une fois la commande reacutealiseacutee le pseudo-code est creacuteeacute et enregistreacute dansun fichier dont le nom correspond au nom du programme suivi de lrsquoextensionlaquo class raquo

bull Lrsquoexeacutecution du programme en appelant lrsquointerpreacuteteur au moyen de la commandejava suivie du nom du programme (sans extension) Cette commande interpregravete lefichier laquo class raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente et exeacutecute le programme

Les environnements de deacuteveloppementLe JDK fournit un ensemble de commandes pour compiler et interpreacuteter Crsquoest un environ-nement courant et facile drsquoemploi dans le monde Unix Il lrsquoest beaucoup moins en revan-che sous Windows 9598NT En effet lrsquoeacutecriture drsquoune commande telle que donner lrsquoordrede compiler un programme ne peut se reacutealiser qursquoen ouvrant une fenecirctre laquo CommandesMS-DOS raquo

Un certain nombre drsquoenvironnements de programmation permettent cependant drsquoeacutecrirede compiler puis drsquoexeacutecuter de faccedilon conviviale un programme Java Citons agrave titredrsquoexemples les environnements de travail tels que le logiciel Kawa (Tek-Tools) sur PCou Visual Cafeacute (Symantec) sur Macintosh

Ces logiciels offrent sous forme drsquointerface graphique conviviale un ensemble drsquooutilsde deacuteveloppement drsquoapplications Les outils les plus utiliseacutes sont en geacuteneacuteral lessuivants

bull Lrsquoeacutediteur de texte pour eacutecrire le programme

bull Les menus et boicirctes agrave outils pour lancer la compilation et lrsquoexeacutecution

bull La fenecirctre de compilation qui affiche les eacuteventuelles erreurs de syntaxe

bull La fenecirctre drsquoexeacutecution qui affiche les messages et reacutesultats du programme en cours

bull La fenecirctre qui visualise les projets en cours dans le cas drsquoun programme deacutefini agrave partirde plusieurs fichiers diffeacuterents

Vous trouverez toutes les informations neacutecessaires au teacuteleacutechargement de ces interfaces dans lefichier laquo Outils raquo preacutesent sur le CD-Rom fourni avec louvrage

Le projet laquo Gestion drsquoun compte bancaire raquo Pour vous permettre de mieux maicirctriser les diffeacuterentes notions abordeacutees dans cetouvrage nous vous proposons de construire une application plus eacutelaboreacutee que lessimples exercices appliqueacutes donneacutes en fin de chapitre

Dans ce projet nous avons volontairement eacuteviteacute lrsquoemploi drsquointerfaces graphiques Bienqursquoattrayantes ces derniegraveres sont difficiles agrave maicirctriser pour des deacutebutants en program-mation Le projet consiste agrave bacirctir une application autour du concept de menu interactifAgrave lrsquoheure du tout-graphique il nrsquoest pas vain drsquoapprendre agrave eacutecrire des menus laquo texte raquoLe fait de passer par cet apprentissage permet drsquoappreacutehender toutes les notions fonda-

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

18

mentales de la programmation sans avoir agrave srsquoeacutevertuer agrave eacutetudier la syntaxe de toutes lesmeacutethodes de la librairie graphique Java

Cahier des chargesIl srsquoagit drsquoeacutecrire une application interactive qui permet de geacuterer lrsquoensemble des comptesbancaires drsquoune personne Les fonctionnaliteacutes fournies par le programme de gestion decomptes bancaires sont les suivantes

Creacuteation Suppression drsquoun compteAffichage drsquoun compte donneacuteSaisie drsquoune ligne comptable pour un compte donneacuteCalcul de statistiquesSauvegarde des donneacutees (ndeg de compte lignes comptables)

Niveau 1 programme interactif sous forme de choix dans un menu

Lrsquoexeacutecution du programme affiche le menu suivant

1 Creacuteer un compte2 Afficher un compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Lrsquoutilisateur choisit une valeur pour exeacutecuter lrsquoopeacuteration souhaiteacutee

bull Si lrsquoutilisateur choisit lrsquooption 1 les informations agrave fournir concernent

Le type du compte [Types possibles Compte courant joint eacutepargne]Le numeacutero du compteLa premiegravere valeur creacutediteacutee Le taux de placement dans le cas drsquoun compte eacutepargne

bull Si lrsquoutilisateur choisit lrsquooption 2 le programme affiche les caracteacuteristiques drsquouncompte (type valeur courante taux) ainsi que les dix derniegraveres opeacuterations compta-bles dans lrsquoordre des dates ougrave ont eacuteteacute effectueacutees les opeacuterations

bull Pour lrsquooption 3 il srsquoagit de fournir des informations pour creacuteer une ligne comptableCes informations sont les suivantes

Le numeacutero du compte concerneacute (avec veacuterification de son existence)La somme agrave creacutediter (valeur positive) ou agrave deacutebiter (valeur neacutegative)La date de lrsquoopeacuterationLe motif de lrsquoachat ou de la vente [thegravemes possibles Salaire Loyer

Alimentation Divers]Le mode de paiement[Types possibles CB ndeg du Chegraveque Virement]

bull Lrsquooption 4 Sortir du menu geacuteneacuteral permet de sortir du programme

bull Lrsquooption 5 Aide du menu geacuteneacuteral affiche une information relative agrave chaque option dumenu

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

19

Niveau 2 structure de donneacutees optimiseacutee en termes drsquoutilisation de la meacutemoire

bull Le programme doit pouvoir geacuterer autant de comptes que neacutecessaire Pour chaquecompte le nombre drsquoopeacuterations comptables doit ecirctre infini et est donc indeacuteterminableau moment de lrsquoeacutecriture du programme

bull En conseacutequence la reacuteservation des cases meacutemoire ne peut pas ecirctre reacutealiseacutee de faccedilondeacutefinitive en tout deacutebut de programme Agrave chaque ligne comptable et agrave chaque nouveaucompte creacuteeacutes le programme doit ecirctre capable de reacuteserver lui-mecircme le nombre suffi-sant drsquoemplacements meacutemoire pour la bonne marche du programme Lorsque leprogramme gegravere lui-mecircme la reacuteservation des emplacements meacutemoire on dit qursquoilgegravere sa meacutemoire de maniegravere dynamique

bull Lrsquooption permettant la suppression drsquoun compte est deacutependante de la faccedilon dont eststockeacutee lrsquoinformation Cette option ne peut ecirctre abordeacutee avant drsquoavoir choisi le modede gestion des emplacements meacutemoire

bull Lrsquooption 5 Sortir du menu geacuteneacuteral doit controcircler la sauvegarde de lrsquoinformation Lesdonneacutees sont sauvegardeacutees sur disque sous forme drsquoun fichier portant le nom comptedat

Niveau 3 srsquoinitier aux graphiques

Un nouveau choix est ajouteacute agrave lrsquooption 2 Afficher un compte du menu geacuteneacuteral ilsrsquoagit drsquoafficher les statistiques pour un compte donneacute sous diffeacuterentes formes graphi-ques (histogramme camembert etc)

Les objets manipuleacutesUn compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero du compte

bull un type de compte ( courant eacutepargne joint etc)

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Nous verrons au chapitre 1 laquo Stocker une information raquo puis tout au long du chapitre 7laquo Les classes et les objets raquo comment deacutefinir et repreacutesenter les objets utiles et neacutecessai-res agrave la reacutealisation de cette application

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Caractegravere

Type du compte Courant Caractegravere

Valeur ndash 1 52030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Caractegravere

Moyen de paiement CB Caractegravere

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

20

La liste des ordresPour creacuteer une application de gestion de comptes bancaires nous devons deacutecomposerlrsquoensemble de ses fonctionnaliteacutes en tacircches eacuteleacutementaires Pour ce faire nous partageonslrsquoapplication en trois niveaux de difficulteacute croissante Les niveaux 1 et 2 doivent ecirctreabordeacutes dans cet ordre et sont neacutecessaires agrave la reacutealisation du niveau 3 La mise en œuvredu niveau 1 permet de reacutealiser les actions suivantes

bull construire un menu (voir les chapitres 2 laquo Communiquer une information raquo et 3laquo Faire des choix raquo)

bull creacuteer des comptes diffeacuterents ou saisir plusieurs lignes comptables (voir leschapitres 4 laquo Faire des reacutepeacutetitions raquo et 9 laquo Collectionner un nombre fixe drsquoobjets raquo)

bull deacutefinir les comptes et les lignes comptables comme des objets informatiques au sensde la programmation objet (voir les chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecri-ture drsquoune fonction raquo et 7 laquo Les classes et les objets raquo)

Pour reacutesoudre le niveau 2 nous allons apprendre les tacircches suivantes

bull geacuterer la meacutemoire de lrsquoordinateur (voir les chapitres 9 laquo Collectionner un nombre fixedrsquoobjets raquo et 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

bull sauvegarder des informations pour que celles-ci ne disparaissent pas une fois lrsquoordi-nateur eacuteteint (voir le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

Le niveau 3 va nous initier aux opeacuterations suivantes bull calculer des statistiques (voir les chapitres 1 laquo Stocker une information raquo et 9

laquo Collectionner un nombre fixe drsquoobjets raquo)

bull dessiner en particulier des histogrammes (voir le chapitre 11 laquo Dessiner desobjets raquo)

Lrsquoeacutetude eacutetape par eacutetape de lrsquoensemble de cet ouvrage va nous permettre de reacutealiser cetteapplication

ReacutesumeacuteEn informatique reacutesoudre un problegraveme crsquoest trouver la suite logique de tous lesordres neacutecessaires agrave la solution dudit problegraveme Cette suite logique est appeleacutee algo-rithme

La construction drsquoun algorithme passe par lrsquoanalyse du problegraveme avec pour objectifde le deacutecouper en une succession de tacircches simplifieacutees et distinctes Ainsi agrave partir delrsquoeacutenonceacute clair preacutecis et eacutecrit en franccedilais drsquoun problegraveme nous devons accomplir lesdeux opeacuterations suivantes

bull Deacutecomposer lrsquoeacutenonceacute en eacutetapes distinctes qui conduisent agrave lrsquoalgorithme

bull Deacutefinir les objets manipuleacutes par lrsquoalgorithme

Une fois lrsquoalgorithme construit il faut laquo eacutecrire le programme raquo crsquoest-agrave-dire traduirelrsquoalgorithme de faccedilon qursquoil soit compris par lrsquoordinateur En effet un programmecrsquoest un algorithme traduit dans un langage compreacutehensible par les ordinateurs

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

21

ExercicesApprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes

Eacutecrivez la marche agrave suivre qui explique comment accrocher un tableau au centredrsquoun mur Pour cela vous devez

a Deacutefinir les objets neacutecessaires agrave la reacutesolution du problegraveme

b Eacutetablir la liste des opeacuterations

c Ordonner cette liste

Plusieurs solutions sont possibles mais chacune doit rester logique agrave lrsquoeacutegard des hypothegraveses prisesen a Par exemple un clou et une perceuse ne vont pas ensemble

Observer et comprendre la structure drsquoun programme JavaObservez le programme suivant

public class Premier

Un ordinateur est composeacute des deux eacuteleacutements principaux suivants

bull La meacutemoire centrale qui sert agrave meacutemoriser des ordres ainsi que des informationsmanipuleacutees par le programme Scheacutematiquement on peut dire qursquoelle estcomposeacutee drsquoemplacements repeacutereacutes chacun par un nom (cocircteacute programmeur) et parune adresse (cocircteacute ordinateur)

bull Lrsquouniteacute centrale qui exeacutecute une agrave une les instructions du programme dans leurordre de lecture Elle constitue la partie active de lrsquoordinateur Ces actions ennombre limiteacute sont les suivantes

ndash deacuteposer une information dans une case meacutemoire

ndash exeacutecuter des opeacuterations simples telles que lrsquoaddition la soustraction etc

ndash comparer des valeurs

ndash communiquer une information eacuteleacutementaire par lrsquointermeacutediaire du clavier ou delrsquoeacutecran

ndash coder lrsquoinformation

Du fait de la technologie toutes les informations manipuleacutees par un ordinateur sontcodeacutees en binaire (0 ou 1) Pour srsquoaffranchir du langage machine binaire on faitappel agrave un langage de programmation dit eacutevolueacute tel que les langages Pascal C ouJava Un tel programme se compose drsquoinstructions deacutefinies par le langage dontlrsquoenchaicircnement reacutealise la solution du problegraveme poseacute

Pour traduire ce programme dans le langage binaire directement exeacutecutable par lrsquoordi-nateur nous devons utiliser un programme approprieacute appeleacute compilateur ou interpreacute-teur Dans cet ouvrage nous nous proposons drsquoeacutetudier comment construire unprogramme en prenant comme support de langage le langage et le compilateur Java

I1

I2

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

22

public static void main(String [] argument) double a Systemoutprint(Entrer une valeur ) a = Lired() Systemoutprint( Vous avez entre + a)

a Repeacuterez les instructions deacutefinissant la fonction main() et celles deacutelimitant la classePremier

b Recherchez les instructions drsquoaffichage

c Quel est le rocircle de lrsquoinstruction double a

d Deacutecrivez lrsquoexeacutecution de ce programme en supposant que lrsquoutilisateur entre auclavier la valeur 10

En suivant la structure ci-dessous et en vous aidant du programme donneacute agrave lasection laquo Calcul de la circonfeacuterence drsquoun cercle raquo eacutecrivez un programme quicalcule le peacuterimegravetre drsquoun carreacute (rappel peacuterimegravetre = 4 times cocircteacute)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe

public static void main(String [] argument) Deacuteclaration des variables repreacutesentant le peacuterimegravetre et le cocircteacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le message Valeur du cocircteacute agrave lrsquoeacutecran helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Lire au clavier une valeur placer cette valeur dans la variable correspondante helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le peacuterimegravetre du carreacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

Eacutecrire un premier programme JavaEn suivant la structure de lrsquoexercice preacuteceacutedent eacutecrivez un programme qui calculela surface drsquoun rectangle (rappel surface = largeur times longueur)

En observant la formule

a Combien de variables faut-il deacuteclarer pour exeacutecuter le calcul

b Combien de valeurs faut-il saisir au clavier

I3

I4

copy copyright Eacuteditions Eyrolles

PARTIE 1

Les outils et techniques de base

CHAPITRE 1

Stocker une information 25

CHAPITRE 2

Communiquer une information 49

CHAPITRE 3

Faire des choix 61

CHAPITRE 4

Faire des reacutepeacutetitions 81

copy copyright Eacuteditions Eyrolles

1Stocker une information

En deacutecrivant au chapitre introductif laquo Naissance drsquoun programme raquo lrsquoalgorithme deconfection drsquoun cafeacute chaud non sucreacute nous avons constateacute que la toute premiegravere eacutetapepour construire une marche agrave suivre consistait agrave deacuteterminer les objets utiles agrave la reacutesolutiondu problegraveme En effet pour faire du cafeacute nous devons prendre le cafeacute lrsquoeau le filtre etc

De la mecircme faccedilon lorsqursquoun deacuteveloppeur drsquoapplications conccediloit un programme il doit nonpas laquoprendreraquo au sens litteacuteral du mot les donneacutees numeacuteriques mais deacutefinir ces donneacuteesainsi que les objets neacutecessaires agrave la reacutealisation du programme Cette deacutefinition consiste agravenommer ces objets et agrave deacutecrire leur contenu afin qursquoils puissent ecirctre stockeacutes en meacutemoire

Crsquoest pourquoi nous eacutetudions dans ce chapitre ce qursquoest une variable et comment la deacutefi-nir (laquo La notion de variable raquo) Nous examinons ensuite agrave la section laquo Lrsquoinstructiondrsquoaffectation raquo comment placer une valeur dans une variable par lrsquointermeacutediaire delrsquoinstruction drsquoaffectation Enfin nous analysons lrsquoincidence du type des variables sur lereacutesultat drsquoun calcul arithmeacutetique (laquo Les opeacuterateurs arithmeacutetiques raquo)

Afin de clarifier les explications vous trouverez tout au long du chapitre des exemplessimples et concis Ces exemples ne sont pas des programmes complets mais de simplesextraits qui eacuteclairent un point preacutecis du concept abordeacute Vous trouverez en fin de chapi-tre (laquo Calculer des statistiques sur des opeacuterations bancaires raquo) un programme entier quiaborde et reacutesume toutes les notions rencontreacutees au fil de ce chapitre

La notion de variableUne variable permet la manipulation de donneacutees et de valeurs Elle est caracteacuteriseacutee parles eacuteleacutements suivants

bull Un nom qui sert agrave repeacuterer un emplacement en meacutemoire dans lequel une valeur estplaceacutee Le choix du nom drsquoune variable est libre Il existe cependant des contraintesque nous preacutesentons agrave la section laquo Les noms de variables raquo

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

26

bull Un type qui deacutetermine la faccedilon dont est traduite la valeur en code binaire ainsi que lataille de lrsquoemplacement meacutemoire Nous examinons ce concept agrave la section laquo La notionde type raquo Plusieurs types simples sont preacutedeacutefinis dans le langage Java et nous endeacutetaillons les caracteacuteristiques agrave la section laquo Les types de base en Java raquo

Les noms de variablesLe choix des noms de variables nrsquoest pas limiteacute Il est toutefois recommandeacute drsquoutiliserdes noms eacutevocateurs Par exemple les noms des variables utiliseacutees dans une applicationqui gegravere les codes-barres de produits vendus en magasin sont plus certainementlaquo article prix codebarre raquo que laquo xyz1 xyz2 xyz3 raquo Les premiers en effet eacutevoquentmieux lrsquoinformation stockeacutee que les seconds

Les contraintes suivantes sont agrave respecter dans lrsquoeacutecriture des noms de variables

bull Le premier caractegravere drsquoune variable doit obligatoirement ecirctre diffeacuterent drsquoun chiffre

bull Aucun espace ne peut figurer dans un nom

bull Les majuscules sont diffeacuterentes des minuscules et tout nom de variable posseacutedant unemajuscule est diffeacuterent du mecircme nom eacutecrit en minuscule

bull Les caractegraveres amp ~ rsquo ( ) [ ] - | ` ^ = sect ltgt pound ainsi que et ne peuvent ecirctre utiliseacutes dans lrsquoeacutecriture drsquoun nom de variable

bull Tout autre caractegravere peut ecirctre utiliseacute y compris les caractegraveres accentueacutes le caractegraverede soulignement (_) et les caractegraveres $ et micro

bull Le nombre de lettres composant le nom drsquoune variable est indeacutefini Neacuteanmoinslrsquoobjectif drsquoun nom de variable eacutetant de renseigner le programmeur sur le contenu dela variable il nrsquoest pas courant de rencontrer des noms de variables de plus de trentelettres

Exemples

La notion de typeUn programme doit geacuterer des informations de nature diverse Ainsi les valeurs tellesque 123 ou 24 sont de type numeacuterique tandis que Spinoza est un mot composeacute de carac-tegraveres Si lrsquoecirctre humain sait drsquoun simple coup drsquoœil faire la distinction entre un nombreet un mot lrsquoordinateur nrsquoen est pas capable Le programmeur doit donc laquo expliquer raquo agravelrsquoordinateur la nature de chaque donneacutee Cette explication passe par la notion de type

Le type drsquoune valeur permet de diffeacuterencier la nature de lrsquoinformation stockeacutee dans unevariable

Nom de variable autoriseacute Nom de variable interdit

compte

num_2 ( _ et non pas - )undeux (et non pas un deux)VALEUR_temporaire

Val$solde

pourquoipas caractegravere interdit2001espace pas de chiffre en deacutebut de variable-plus caractegravere - interditadresse caractegravere interditahah caractegravere interdit

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

27

Agrave chaque type sont associeacutes les eacuteleacutements suivants

bull Un code speacutecifique permettant la traduction de lrsquoinformation en binaire et reacuteciproque-ment

bull Un ensemble drsquoopeacuterations reacutealisables en fonction du type de variable utiliseacute Parexemple si la division est une opeacuteration coheacuterente pour deux valeurs numeacuteriques ellene lrsquoest pas pour deux valeurs de type caractegravere

bull Un intervalle de valeurs possibles deacutependant du codage utiliseacute Par deacutefinition agravechaque type correspond un mecircme nombre drsquooctets et par conseacutequent un nombrelimiteacute de valeurs diffeacuterentes

En effet un octet est un regroupement de 8 bits sachant qursquoun bit ne peut ecirctre qursquoun 0 ouun 1 Lorsqursquoune donneacutee est codeacutee sur 1 octet elle peut prendre les valeurs 00000000(8 zeacuteros) ou encore 111111111 (8 un) et toutes les valeurs intermeacutediaires entre ces deuxextrecircmes (par exemple 10101010 11110000 ou 10010110)

En fait une donneacutee codeacutee sur 8 bits peut par le jeu des combinaisons de 0 et de 1 pren-dre 28 valeurs diffeacuterentes soit 256 valeurs possibles comprises entre ndash 128 et 127Lrsquointervalle [ndash 128 127] est en effet composeacute de 256 valeurs et possegravede autant devaleurs positives que neacutegatives

Pour repreacutesenter la valeur numeacuterique 120 un codage sur 1 octet suffit mais pour repreacute-senter la valeur 250 1 octet ne suffit pas et il est neacutecessaire drsquoutiliser un codage sur2 octets

Les types de base en JavaChaque langage de programmation propose un ensemble de types de base permettant lamanipulation de valeurs numeacuteriques entiegraveres reacuteelles ou caractegraveres Ces types sont

bull repreacutesenteacutes par un mot-cleacute preacutedeacutefini par le langage

bull dits simples car agrave un instant donneacute une variable de type simple ne peut contenirqursquoune et une seule valeur

Agrave lrsquoopposeacute il existe des types appeleacutes types structureacutes qui permettent le stockage sousun mecircme nom de variable de plusieurs valeurs de mecircme type ou non Il srsquoagit destableaux des classes des vecteurs ou encore des dictionnaires Ces types structureacutes sonten geacuteneacuteral deacutefinis par le programmeur Nous les eacutetudions en deacutetail dans la troisiegravemepartie de cet ouvrage intituleacutee laquo Outils et techniques orienteacutes objet raquo

Pour seacutelectionner un type plutocirct qursquoun autre le langage Java deacutefinit huit types simplesqui appartiennent selon ce qursquoils repreacutesentent agrave lrsquoune ou lrsquoautre des quatre cateacutegoriessuivantes logique texte entier reacuteel

Cateacutegorie logique

Il srsquoagit du type boolean Les valeurs logiques ont deux eacutetats laquo true raquo (vrai) oulaquo false raquo (faux) Elles ne peuvent prendre aucune autre valeur que ces deux eacutetats

Cateacutegorie caractegravere

Deux types deacutefinissent cette cateacutegorie le type char et le type String copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

28

Le type char permet de repreacutesenter les caractegraveres isoleacutes alors que le type String sert agravedeacutecrire des seacutequences de caractegraveres En ce sens il ne srsquoagit pas drsquoun type simple

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Pour deacutecrire une variable de type char lrsquoordinateur utilise un code sur 2 octets De cettefaccedilon il lui est possible drsquoutiliser jusqursquoagrave 216 caractegraveres soit 65 536 caractegraveres diffeacute-rents En reacutealiteacute Java utilise une table de correspondance appeleacutee jeu de caractegraveresUnicode Cette table associe un caractegravere agrave une valeur numeacuterique

Par exemple dans la table Unicode le caractegravere A majuscule a pour valeur deacutecimale 65et le caractegravere a minuscule la valeur deacutecimale 97

La table Unicode est organiseacutee comme suit

bull Les 31 premiers caractegraveres ne peuvent ecirctre afficheacutes (tabulation saut de ligne bipsonore etc)

bull Les caractegraveres compris entre le 32e et le 127e correspondent aux caractegraveres du codeASCII (American Standard Code for Information Interchange) qui eacutetait jusqursquoagravepreacutesent le code deacutefinissant tout caractegravere Dans cet intervalle tous les caractegraveres debase sont deacutefinis crsquoest-agrave-dire lrsquoensemble des lettres de lrsquoalphabet en minuscules et enmajuscules ainsi que les signes de ponctuation et les symboles matheacutematiques

bull Les caractegraveres compris entre le 128e et le 256e caractegraveres correspondent agrave des carac-tegraveres speacuteciaux comme les caractegraveres accentueacutes en minuscules et en majuscules et lescaractegraveres semi graphiques Les codes de ces caractegraveres font partie des extensions quipeuvent diffeacuterer selon les pays ou les environnements de travail Ces extensions sontdeacutefinies agrave partir du jeu de caractegraveres employeacute par votre environnement et diffegraverentdonc drsquoun type drsquoordinateur agrave un autre

Pour connaicirctre le code Unicode drsquoun caractegravere accentueacute sur votre ordinateur reportez-vous agravelrsquoexemple de la section laquo La boucle for raquo du chapitre 4 laquo Faire des reacutepeacutetitions raquo

bull Agrave partir du 257e caractegravere il est possible de deacutefinir son propre jeu de caractegraveres dansla table Unicode de faccedilon agrave repreacutesenter par exemple des caractegraveres arabes chinoisou japonais

Cateacutegorie entier

Cette cateacutegorie contient quatre types distincts byte short int long Chacun de cestypes autorise la manipulation de valeurs numeacuteriques entiegraveres positives ou neacutegativesLeur diffeacuterence reacuteside essentiellement dans le nombre drsquooctets utiliseacute pour coder lecontenu de la variable

Type Nombre drsquooctets Eacuteventail de valeurs

byte 1 octet de ndash 128 agrave 127

short 2 octets de ndash 32 768 agrave 32 767

int 4 octets de ndash 2 147 483 648 agrave 2 147 483 647

long 8 octets de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

29

Dans certains cas il est inteacuteressant de repreacutesenter une valeur entiegravere sous forme octale ouhexadeacutecimale comme pour lrsquoaffichage des caractegraveres de la table Unicode (voir au chapitre 2laquoCommuniquer une informationraquo la section laquoAfficher les caractegraveres accentueacutesraquo)

Pour repreacutesenter un nombre sous forme octale il est neacutecessaire de placer un zeacutero audeacutebut du nombre Pour la repreacutesentation sous forme hexadeacutecimale les caractegraveres 0xdoivent ecirctre placeacutes en deacutebut de valeur

Dans le langage Java tous les types de la cateacutegorie entier ont un signe (+ ou ndash)

Cateacutegorie reacuteel (flottant)

La cateacutegorie reacuteel permet lrsquoemploi de nombres agrave virgule appeleacutes nombres reacuteels ou encoreflottants

Deux types composent cette cateacutegorie le type float et le type double Une expressionnumeacuterique de cette cateacutegorie peut srsquoeacutecrire en notation deacutecimale ou exponentielle

bull La notation deacutecimale contient obligatoirement un point symbolisant le caractegraverelaquo virgule raquo du chiffre agrave virgule Les valeurs 673 -3 ou 64 sont des valeurs reacuteellesutilisant la notation deacutecimale

bull La notation exponentielle utilise la lettre E pour deacuteterminer ougrave se trouve la valeur delrsquoexposant (puissance de 10) Les valeurs 876E4 et 65E-12 sont des valeurs utilisantla notation exponentielle

Dans les deux cas le nombre reacuteel est suivi de la lettre F (pour float) ou D (pour double)Les caractegraveres minuscules f ou d sont eacutegalement autoriseacutes La distinction entre float etdouble srsquoeffectue sur le nombre drsquooctets utiliseacute pour coder lrsquoinformation Il en reacutesulteune preacutecision plus ou moins grande suivant le type utiliseacute

Exemple

bull La valeur 215F repreacutesente un simple flottant (type float)

bull La valeur 135E22 repreacutesente aussi un flottant de grande taille

bull La valeur 676F est une valeur de type float de taille simple

bull La valeur 4634E+234D correspond agrave un flottant de double preacutecision (type double)

En langage Java toute valeur numeacuterique reacuteelle est deacutefinie par deacutefaut en double preacuteci-sion Par conseacutequent la lettre d (ou D) placeacutee en fin de valeur nrsquoest pas neacutecessaire Parcontre degraves que lrsquoon utilise une variable float la lettre f (ou F) est indispensable souspeine drsquoerreur de compilation

Valeur deacutecimale Valeur octale Valeur hexadeacutecimale

45 055 0x2d

Type Nombre drsquooctets Eacuteventail des valeurs

float 4 octets de 140239846e-45F agrave 3402823347e38F

double 8 octets de 494065645841246544e-324D agrave 179769313486231570e308D

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

30

Comment choisir un type de variable plutocirct qursquoun autre Sachant qursquoune variable de type int (codeacutee sur 4 octets) peut prendre toutes les valeursde lrsquointervalle [ndash21474836482147483647] et donc prendre en particulier toutes lesvaleurs comprises entre ndash32768 et 32767 (type short) ou mecircme entre ndash128 et 127 (typebyte) posons-nous les questions suivantes

bull Pourquoi ne pas deacuteclarer toutes les variables entiegraveres drsquoun programme en type long(le type long nous offrant le plus grand choix de valeurs entiegraveres)

bull Pourquoi ne pas deacuteclarer les variables reacuteelles drsquoun programme en type double plutocirctqursquoen float

Pour reacutepondre agrave ces questions examinons le nombre drsquooctets utiliseacutes par un programmede gestion de comptes bancaires Pour simplifier supposons que le programme garde enmeacutemoire les 10 derniegraveres opeacuterations bancaires et le solde de chaque compte Imaginonsenfin que notre banque gegravere 50 000 comptes

Pour stocker les 10 derniegraveres opeacuterations nous devons deacuteclarer 10 variables plus 1 pourle solde du compte soit 11 variables Les valeurs sont des montants en francs et centi-mes donc des valeurs reacuteelles

bull Si nous deacuteclarons lrsquoensemble de ces variables en type double (8 octets) le pro-gramme utilise alors 50 000 times 11 times 8 octets soit 44 000 000 octets soit 44 meacutega-octets de la meacutemoire de lrsquoordinateur

bull Si nous choisissons de prendre des variables de type float (ce qui reste coheacuterentpuisque les montants en francs nrsquoont pas besoin drsquoecirctre drsquoune preacutecision extrecircme) notreprogramme nrsquoutilise plus que 22 meacutegaoctets soit deux fois moins que preacuteceacutedemment

Bien entendu cet exemple simpliste nrsquoa pour seul objectif que de montrer lrsquoeffet duchoix du type de variable sur le taux drsquooccupation de la meacutemoire de lrsquoordinateur Ilexiste en reacutealiteacute un grand nombre de techniques pour optimiser la gestion de lameacutemoire de lrsquoordinateur

Remarquons cependant que la premiegravere deacutemarche pour geacuterer au mieux la meacutemoire delrsquoordinateur consiste agrave bien choisir le type de ses variables Si lrsquoon sait que par deacutefini-tion une variable ne deacutepasse jamais pour un programme donneacute la valeur numeacuterique120 celle-ci doit ecirctre deacuteclareacutee avec le type byte

Deacuteclarer une variableLa deacutefinition drsquoune variable dans un programme est reacutealiseacutee par lrsquointermeacutediaire delrsquoinstruction de deacuteclaration des variables Au cours de cette instruction le program-meur donne le type et le nom de la variable Pour deacuteclarer une variable il suffit drsquoeacutecrirelrsquoinstruction selon la syntaxe suivante

type nomdevariable

ou

type nomdevariable1 nomdevariable2

ougrave type correspond agrave lrsquoun des mots-cleacutes agrave choisir parmi ceux donneacutes aux sections preacuteceacute-dentes (boolean char String byte short int long float ou double) Si deux variables

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

31

de mecircme type sont agrave deacuteclarer il nrsquoest pas besoin de reacutepeacuteter le type une virgule seacuteparantles deux noms suffisant agrave les distinguer

Pour expliquer agrave lrsquoordinateur que lrsquoinstruction de deacuteclaration est termineacutee pour le typedonneacute un point virgule () est placeacute obligatoirement agrave la fin de la ligne drsquoinstruction

Exemple

float f1 f2 Deacuteclaration de deux variables de type float

une virgule seacutepare les deux noms de variables

long CodeBar Deacuteclaration drsquoune variable de type long

int test Deacuteclaration drsquoune variable de type int

char choix tmp Deacuteclaration de deux variables de type char

boolean OK Deacuteclaration drsquoune variable de type boolean

Les instructions de deacuteclaration peuvent ecirctre placeacutees indiffeacuteremment au deacutebut ou encours de programme Une fois la variable deacuteclareacutee lrsquointerpreacuteteur Java reacuteserve au coursde lrsquoexeacutecution du programme un emplacement meacutemoire correspondant en taille agrave celledemandeacutee par le type Il associe ensuite le nom de la variable agrave lrsquoadresse de lrsquoemplace-ment meacutemoire

Agrave cette eacutetape du programme remarquons que lrsquoemplacement ainsi deacutefini est vide Silrsquoon souhaite afficher son contenu sans y avoir preacutealablement deacuteposeacute de valeur lecompilateur eacutemet le message drsquoerreur suivant Variable may not have been initia-lized Cette erreur indique que la variable dont on souhaite afficher le contenu nrsquoa paseacuteteacute initialiseacutee Comme lrsquointerpreacuteteur Java ne peut afficher un emplacement meacutemoirevide lrsquoexeacutecution du programme nrsquoest pas possible

Lrsquoinstruction drsquoaffectationUne fois la variable deacuteclareacutee il est neacutecessaire de stocker une valeur agrave lrsquoemplacementmeacutemoire deacutesigneacute Pour ce faire nous utilisons lrsquoinstruction drsquoaffectation qui nouspermet drsquoinitialiser ou de modifier en cours drsquoexeacutecution du programme le contenu delrsquoemplacement meacutemoire (le contenu drsquoune variable nrsquoeacutetant par deacutefinition pas constant)

Rocircle et meacutecanisme de lrsquoaffectation

Lrsquoaffectation est le meacutecanisme qui permet de placer une valeur dans un emplacementmeacutemoire Elle a pour forme

Variable = Valeur

ou encore

Variable = Expression matheacutematique

Le signe eacutegal (=) symbolise le fait qursquoune valeur est placeacutee dans une variable Pour eacutevitertoute confusion sur ce signe matheacutematique bien connu nous prendrons lrsquohabitude de letraduire par les termes prend la valeur

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

32

Examinons les exemples suivants en supposant que les variables n et p soient deacuteclareacuteesde type entier

n = 4 n prend la valeur 4 p = 5n+1 calcule la valeur de lrsquoexpression matheacutematique soit 54+1

range la valeur obtenue dans la variable repreacutesenteacutee par p

Lrsquoinstruction drsquoaffectation srsquoeffectue dans lrsquoordre suivant

1 Calcule la valeur de lrsquoexpression figurant agrave droite du signe eacutegal

2 Range le reacutesultat obtenu dans la variable mentionneacutee agrave gauche du signe eacutegal

Drsquoune maniegravere geacuteneacuterale il est inteacuteressant de remarquer que la variable placeacutee agrave droite dusigne = nrsquoest jamais modifieacutee alors que celle qui est agrave gauche lrsquoest toujours Comme unevariable de type simple ne peut stocker qursquoune seule valeur agrave la fois si la variable situeacuteeagrave gauche possegravede une valeur avant lrsquoaffectation cette valeur est purement et simplementremplaceacutee par la valeur situeacutee agrave droite du signe =

Exemple

a = 1 b = a + 3 a = 3

Lorsqursquoon deacutebute en programmation une bonne meacutethode pour comprendre ce quereacutealise un programme consiste agrave eacutecrire pour chaque instruction exeacutecuteacutee un eacutetat detoutes les variables deacuteclareacutees Il suffit pour cela de construire un tableau dont chaquecolonne repreacutesente une variable deacuteclareacutee dans le programme et chaque ligne une instruc-tion de ce mecircme programme Soit pour notre exemple

Le tableau est composeacute des deux colonnes a et b et des trois lignes associeacutees aux instruc-tions drsquoaffectation du programme Ce tableau montre que les instructions a = 1 et a = 3font que la valeur initiale de a (1) est effaceacutee et eacutecraseacutee par la valeur 3

Deacuteclaration et affectation Comme nous lrsquoavons vu agrave la section laquo Deacuteclarer une variable raquo la deacuteclaration est utiliseacuteepour reacuteserver un emplacement meacutemoire Une fois reacuteserveacute lrsquoemplacement reste videjusqursquoagrave ce qursquoune valeur y soit placeacutee par lrsquointermeacutediaire de lrsquoaffectation

Il est cependant risqueacute de deacuteclarer une variable sans lui donner de valeur initiale Eneffet le compilateur Java veacuterifie strictement si toutes les variables contiennent unevaleur ou non Une erreur de compilation est deacutetecteacutee degraves qursquoune seule variable necontient pas de valeur agrave un moment donneacute du programme

instruction a b

a = 1 1 -

b = a + 3 1 4

a = 3 3 4

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

33

Initialiser une variable

Pour eacuteviter toute erreur de compilation une bonne habitude consiste agrave initialiser toutesles variables au moment de leur deacuteclaration en proceacutedant de la faccedilon suivante

float f1 = 00f f2 = 12f Initialisation de deux floatlong CodeBar = 123456789 Initialisation drsquoun longint test = 0 Initialisation drsquoune variable de type intboolean OK = true Initialisation drsquoun boolean

De cette faccedilon les variables fl f2 CodeBar et OK sont deacuteclareacutees Le compilateurreacuteserve un emplacement meacutemoire pour chacune drsquoentre elles Gracircce au signe drsquoaffecta-tion le compilateur place dans chacun des emplacements meacutemoire respectifs les valeursdonneacutees

Initialiser une variable de type char

Les variables de type char srsquoinitialisent drsquoune faccedilon particuliegravere Supposons que lrsquoonsouhaite deacuteclarer et placer le caractegravere n dans une variable choix de type char Pour celaeacutecrivons lrsquoinstruction de deacuteclaration et drsquoinitialisation suivante

char choix = n

Pour le compilateur cette instruction est probleacutematique car il considegravere n non pascomme le laquo caractegravere n raquo mais comme une variable appeleacutee n

Pour lever cette ambiguiumlteacute nous devons entourer le caractegravere n drsquoapostrophes de lafaccedilon suivante

char choix = rsquonrsquo

Ainsi des donneacutees telles que rsquoarsquo rsquorsquo rsquo$rsquo rsquo3rsquo rsquorsquo ou rsquorsquo sont consideacutereacutees comme descaractegraveres

Par contre c = rsquoabrsquo ne peut srsquoeacutecrire car rsquoabrsquo nrsquoest pas un caractegravere mais un mot dedeux caractegraveres Nous devons dans ce cas utiliser une variable de type String

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Quelques confusions agrave eacuteviter Le symbole de lrsquoaffectation est le signe eacutegal (=) Ce signe tregraves largement utiliseacute danslrsquoeacutecriture drsquoeacutequations matheacutematiques est source de confusion lorsqursquoil est employeacute agravecontre-sens

Pour mieux nous faire comprendre eacutetudions trois cas

1 a = a + 1

Si cette expression est impossible agrave eacutecrire drsquoun point de vue matheacutematique elle esttregraves largement utiliseacutee dans le langage informatique Elle signifie

ndash calculer lrsquoexpression a + 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

34

ndash ranger le reacutesultat dans a

Ce qui revient agrave augmenter de 1 la valeur de a

2 a + 5 = 3

Cette expression nrsquoa aucun sens drsquoun point de vue informatique Il nrsquoest pas possiblede placer une valeur agrave lrsquointeacuterieur drsquoune expression matheacutematique puisque aucunemplacement meacutemoire nrsquoest attribueacute agrave une expression matheacutematique

3 a = b et b = a

Agrave lrsquoinverse de lrsquoeacutecriture matheacutematique ces deux instructions ne sont pas eacutequiva-lentes La premiegravere place le contenu de b dans a tandis que la seconde place lecontenu de a dans b

Eacutechanger les valeurs de deux variablesNous souhaitons eacutechanger les valeurs de deux variables de mecircme type appeleacutees a et b crsquoest-agrave-dire que nous voulons que a prenne la valeur de b et que b prenne celle de a Lapratique courante de lrsquoeacutecriture des expressions matheacutematiques fait que dans un premiertemps nous eacutecrivions les instructions suivantes

a = b b = a

Veacuterifions sur un exemple si lrsquoexeacutecution de ces deux instructions eacutechange les valeurs dea et de b Pour cela supposons que les variables a et b contiennent initialement respecti-vement 2 et 8

Du fait du meacutecanisme de lrsquoaffectation la premiegravere instruction a = b deacutetruit la valeur dea en placcedilant la valeur de b dans la case meacutemoire a Lorsque la seconde instruction b = aest reacutealiseacutee la valeur placeacutee dans la variable b est celle contenue agrave cet instant dans lavariable a crsquoest-agrave-dire la valeur de b Il nrsquoy a donc pas eacutechange car la valeur de a adisparu par eacutecrasement lors de lrsquoexeacutecution de la premiegravere instruction

Une solution consiste agrave utiliser une variable suppleacutementaire destineacutee agrave contenir tempo-rairement une copie de la valeur de a avant que cette derniegravere soit eacutecraseacutee par la valeurde b Pour eacutevoquer le caractegravere temporaire de la copie nous appellerons cette nouvellevariable tmp (nous aurions pu choisir tout aussi bien tempo ou ttt) Voici le deacuteroulementdes opeacuterations

tmp = a a = b b = tmp

a b

valeur initiale 2 8

a = b 8 8

b = a 8 8

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

35

Veacuterifions qursquoil y a reacuteellement eacutechange en supposant que nos variables a et b contiennentinitialement respectivement 2 et 8

Agrave la lecture de ce tableau nous constatons qursquoil y a bien eacutechange des valeurs entre a etb La valeur de a est copieacutee dans un premier temps dans la variable tmp La valeur de apeut degraves lors ecirctre effaceacutee par celle de b Pour finir gracircce agrave la variable tmp la variable breacutecupegravere lrsquoancienne valeur de a

Une autre solution vous est proposeacutee dans la feuille drsquoexercices placeacutee agrave la fin du chapitre

Les opeacuterateurs arithmeacutetiquesEacutecrire un programme nrsquoest pas uniquement eacutechanger des valeurs mais crsquoest aussi calcu-ler des eacutequations matheacutematiques plus ou moins complexes Pour exprimer une opeacutera-tion le langage Java utilise des caractegraveres qui symbolisent les opeacuterateurs arithmeacutetiques

Exemple

Soient a b c trois variables de mecircme type

bull Lrsquoopeacuteration drsquoaddition srsquoeacutecrit a = b + 4

bull Lrsquoopeacuteration de soustraction srsquoeacutecrit a = b ndash 5

bull Lrsquoopeacuteration de division srsquoeacutecrit a = b 2 et non pas a =

bull Lrsquoopeacuteration de multiplication srsquoeacutecrit a = b 4 et non pas a = 4b ou a = a x b

bull Lrsquoopeacuteration de modulo srsquoeacutecrit a = b 3

Le modulo drsquoune valeur correspond au reste de la division entiegravere Ainsi 5 2 = 1

Il srsquoagit de calculer la division en srsquoarrecirctant degraves que le valeur du reste devient infeacuterieureau diviseur de faccedilon agrave trouver un reacutesultat en nombre entier Lrsquoopeacuterateur nrsquoexiste paspour les reacuteels pour lesquels la notion de division entiegravere nrsquoexiste pas

a b tmp

valeur initiale 2 8 _

tmp = a 2 8 2

a = b 8 8 2

b = tmp 8 2 2

Symbole Opeacuteration

+ addition

- soustraction

multiplication

division

modulo

b2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

36

Lrsquoensemble de ces opeacuterateurs est utiliseacute pour calculer des expressions matheacutematiquescourantes Le reacutesultat de ces expressions nrsquoest cependant pas toujours celui auquel onsrsquoattend Trois pheacutenomegravenes ont une influence non neacutegligeable sur la valeur du reacutesultatdrsquoun calcul Ce sont

bull La prioriteacute des opeacuterateurs entre eux

bull Le type drsquoune expression matheacutematique

bull La transformation de types

La prioriteacute des opeacuterateurs entre euxLorsqursquoune expression arithmeacutetique est composeacutee de plusieurs opeacuterations lrsquoordina-teur doit pouvoir deacuteterminer quel est lrsquoordre des opeacuterations agrave effectuer Le calcul delrsquoexpression a ndash b c d peut signifier a priori

bull calculer la soustraction puis la division et pour finir la multiplication soit le calcul ((a - b) c) d

bull calculer la multiplication puis la division et pour finir la soustraction crsquoest-agrave-direlrsquoexpression a ndash (b (c d))

Afin drsquoeacuteviter toute ambiguiumlteacute il existe des regravegles de prioriteacute entre les opeacuterateurs regraveglesbaseacutees sur la deacutefinition de deux groupes drsquoopeacuterateurs

Les groupes eacutetant ainsi deacutefinis les opeacuterations sont reacutealiseacutees sachant que

bull Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacuterateurs(sens de lecture)

bull Le deuxiegraveme groupe a prioriteacute sur le premier

Lrsquoexpression a - b c d est calculeacutee de la faccedilon suivante

Cela signifie que lrsquoexpression est calculeacutee de la faccedilon suivante

a - (b c d)

Remarquons que les parenthegraveses permettent de modifier les regravegles de prioriteacute en forccedilantle calcul preacutealable de lrsquoexpression qui se trouve agrave lrsquointeacuterieur des parenthegraveses Ellesoffrent en outre une meilleure lisibiliteacute de lrsquoexpression

Groupe 1 Groupe 2

+ ndash

Prioriteacute Opeacuterateur

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la division apparaicirct dans le sens de la lecture avant la multiplication

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la multiplication suit la division

Groupe 1 - La soustraction est la derniegravere opeacuteration agrave exeacutecuter car elle est du groupe 1

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

37

Le type drsquoune expression matheacutematiqueLe reacutesultat drsquoune expression matheacutematique peut ecirctre deacutetermineacute agrave partir du type de varia-bles (termes) qui composent lrsquoexpression

De ce fait pour un mecircme calcul le reacutesultat diffegravere selon qursquoil est effectueacute agrave lrsquoaide de varia-bles de type reacuteel ou de type entier

Exemple diviser deux entiers

int x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type entier Par conseacutequent lrsquoopeacuteration effec-tueacutee a pour reacutesultat une valeur entiegravere mecircme si lrsquoopeacuteration demandeacutee nrsquoa pas forceacutementun reacutesultat entier Soit pour notre exemple 2 et non 25 Cela ne correspond pas toujoursau reacutesultat attendu par le programmeur deacutebutant

Exemple diviser deux reacuteels

double x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type reacuteel Par conseacutequent lrsquoopeacuteration effectueacuteedonne un reacutesultat de type reacuteel Ce reacutesultat correspond agrave la valeur geacuteneacuteralement attenduede ce type drsquoopeacuteration

La transformation de types Les termes drsquoune opeacuteration ne sont pas neacutecessairement tous du mecircme type Pour eacutecrireune opeacuteration toutes les combinaisons entre les diffeacuterentes cateacutegories de types peuventse preacutesenter

Terme Opeacuteration Terme Reacutesultat

Entier + - Entier Entier

Reacuteel + - Reacuteel Reacuteel

x y z

valeur initiale 5 2 -

z = x y 5 2 2

x y z

valeur initiale 5 2 -

z = x y 5 2 25

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

38

Lrsquoordinateur ne sait calculer une expression matheacutematique que lorsque toutes les varia-bles de lrsquoexpression sont du mecircme type En effet les opeacuterateurs arithmeacutetiques ne sontdeacutefinis que pour des variables de type identiqueLorsque tel nrsquoest pas le cas crsquoest-agrave-dire si lrsquoexpression est mixte lrsquoordinateur doit trans-former le type de certaines variables pour que tous les membres de lrsquoexpression devien-nent de mecircme typeCette transformation appeleacutee conversion drsquoajustement de type se reacutealise suivant unehieacuterarchie bien deacutetermineacutee qui permet de ne pas perdre drsquoinformation On dit que lecompilateur respecte lrsquointeacutegraliteacute des donneacutees La conversion drsquoun nombre reacuteel en nombre entier par exemple ne peut se reacutealiser qursquoensupprimant les nombres situeacutes apregraves la virgule et en ne gardant que la partie entiegravere dunombre Une telle conversion ne garantit pas lrsquointeacutegraliteacute des donneacutees car il y a perte dedonneacuteesCrsquoest pourquoi du fait du codage des donneacutees et du nombre drsquooctets utiliseacute pour cecodage le compilateur effectue automatiquement la conversion des donneacutees selonlrsquoordre suivant

byte -gt short -gt int -gt long -gt float -gt double

De cette faccedilon il est toujours possible de convertir un byte en long ou un int en floatPar contre il est impossible de transformer un float en short sans perte drsquoinformation

Exemple

int a = 4 result_int float x = 20f result_float result_float = a x result_int = a x

La troisiegraveme instruction montre que le calcul drsquoune opeacuteration dont les termes sont detype int et float donne pour reacutesultat un float La derniegravere instruction reacutevegravele que si lereacutesultat drsquoune opeacuteration est de type float il nrsquoest pas possible de le stocker dans unevariable de type int En effet la division drsquoun entier par un reacuteel est une opeacuterationtoujours possible agrave reacutealiser (le reacutesultat est de type reacuteel) mais lrsquoaffectation directe de cereacutesultat dans une variable entiegravere est impossible du fait que la conversion entraicircne uneperte drsquoinformation

Terme Opeacuteration Terme Reacutesultat

byte + - int int

int + - double double

a x result_float result_int

a = 4 4 _ _ _

x = 20f 4 20f _ _

result_float = ax 4 20f 20f _

result_int = ax 4 20f _ Impossible degraves la compilation

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

39

Une telle instruction provoque agrave la compilation une erreur dont le message est Incom-patible type for = Explicit cast needed to convert float to int Celasignifie laquo Type incompatible de part et drsquoautre du signe = Pour convertir un float enint il est neacutecessaire de le formuler explicitement par lrsquointermeacutediaire drsquoun cast raquo

Le cast

La conversion avec perte drsquoinformation est autoriseacutee dans certain cas gracircce au meacuteca-nisme du cast Il peut ecirctre utile de transformer un nombre reacuteel en entier par exemplepour calculer sa partie entiegravere Pour cela le compilateur demande de convertir explicite-ment les termes de lrsquoopeacuteration dans le type souhaiteacute en placcedilant devant la variable oulrsquoopeacuteration le type de conversion deacutesireacute Ainsi pour transformer un float en int ilsuffit de placer le terme (int) devant la variable ou lrsquoopeacuteration de type float

Exemple

int a = 5 result float x = 20f result = (int) a x

La derniegravere instruction montre que la conversion float vers int est autoriseacutee malgreacute laperte drsquoinformation (le chiffre 5 placeacute apregraves la virgule disparaicirct) Cette conversion nrsquoestpossible que si elle est preacuteciseacutement indiqueacutee au compilateur

Calculer des statistiques sur des opeacuterations bancairesPour reacutesumer en pratique lrsquoensemble des notions abordeacutees dans ce chapitre nous allonseacutecrire un programme dont le sujet se rapporte au thegraveme du projet eacutenonceacute agrave la fin duchapitre introductif laquo Naissance drsquoun programme raquo

Cahier des chargesLrsquoobjectif de ce programme est drsquoeacutetablir des statistiques sur lrsquoutilisation des diffeacuterentsmodes de paiement effectueacutes sur un compte bancaire Nous supposons que les moyenstechniques pour deacutebiter un compte sont au nombre de trois la Carte Bleue le cheacutequieret le virement Pour eacutevaluer le taux drsquoutilisation de ces trois moyens de paiement nousdevons calculer le pourcentage drsquoutilisation de chaque technique par rapport aux autresPar exemple pour connaicirctre le pourcentage drsquoutilisation de la Carte Bleue nous utili-sons le calcul suivant

Nombre de paiements par Carte Bleue Nombre total de paiements 100

a x result

a = 5 5 _ _

x = 20f 5 20f _

result = (int) a x 5 20f 2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

40

Liste des opeacuterations

Partant du principe de deacutecomposition drsquoun problegraveme en sous-tacircches plus simples agrave reacuteali-ser distinguons pour reacutesoudre la question les quatre actions suivantes

1 Deacuteterminer le nombre de deacutebits par Carte Bleue chegraveque et virement Comme ilsrsquoagit du premier programme concernant ce thegraveme nous nrsquoavons pas encore saisi devaleur ni de ligne comptable Crsquoest pourquoi nous demandons agrave lrsquoutilisateur decommuniquer au programme ces trois informations par lrsquointermeacutediaire du clavier

2 Calculer le nombre total de paiements effectueacutes

3 Calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du virement

4 Afficher lrsquoensemble des reacutesultats

Dans un premier temps nous traiterons seacutepareacutement chacun de ces points afin de lesanalyser entiegraverement Pour finir nous eacutecrirons le programme dans son inteacutegraliteacute enregroupant chacun des points eacutetudieacutes

1 Il srsquoagit drsquoeacutecrire les instructions qui permettent agrave lrsquoutilisateur de communiquer desinformations agrave lrsquoordinateur agrave lrsquoaide du clavier Nous avons vu au chapitre introduc-tif un exemple de saisie drsquoune valeur au clavier (voir laquo Calcul de la circonfeacuterencedrsquoun cercle raquo) Cette opeacuteration se reacutealise en deux temps drsquoabord lrsquoaffichage agravelrsquoeacutecran drsquoun message informant lrsquoutilisateur drsquoune demande de saisie de valeur puisla saisie effective de lrsquoinformation Pour notre problegraveme ces deux points se tradui-sent de la faccedilon suivante

Systemoutprint( Nombre de paiement par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques eacutemis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei()

Chaque appel de la fonction Systemoutprint() affiche agrave lrsquoeacutecran le message placeacuteentre guillemets Trois messages sont afficheacutes chacun indiquant respectivement agravequel mode de paiement est associeacutee la valeur saisie par lrsquoutilisateur

Les valeurs agrave saisir correspondent aux nombres de deacutebits dans chaque mode de paie-ment Ces valeurs sont de type entier La fonction Lirei() donne lrsquoordre agrave lrsquoordi-nateur drsquoattendre la saisie drsquoune valeur entiegravere La saisie est effective lorsquelrsquoutilisateur valide sa reacuteponse en appuyant sur la touche laquo Entreacutee raquo du clavier Troisvaleurs sont agrave saisir et il est neacutecessaire drsquoappeler trois fois la fonction Lirei()

Pour plus drsquoinformations sur la fonction Lirei() voir le chapitre 2 laquo Communiquer uneinformation raquo

Une fois saisie chaque valeur doit ecirctre stockeacutee dans un emplacement meacutemoiredistinct Ces emplacements meacutemoire correspondent aux trois variables nbCB nbChe-que et nbVirement et sont deacuteclareacutes en deacutebut de programme gracircce agrave lrsquoinstruction

int nbCB = 0 nbCheque = 0 nbVirement = 0

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

41

2 Pour calculer le nombre total de paiements effectueacutes il suffit de faire la somme detoutes les opeacuterations de deacutebit pour tous les types de paiement soit lrsquoinstruction

nbDebit = nbCB + nbCheque + nbVirement

La variable nbDebit permet la meacutemorisation du nombre total drsquoopeacuterations effec-tueacutees quel que soit le mode de paiement Elle doit ecirctre deacuteclareacutee en mecircme temps queles autres variables du mecircme type

int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0

3 Pour calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du vire-ment nous allons drsquoabord eacutetudier le mode Carte Bleue puis appliquer cette analyseaux autres modes de paiement Rappelons que la formule du calcul de pourcentagepour la Carte Bleue est

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Soit en utilisant les variables deacuteclareacutees au point 1 nbCB nbDebit 100

Examinons sur un exemple numeacuterique le reacutesultat drsquoun tel calcul Supposons pourcela que nous ayons effectueacute 10 retraits Carte Bleue sur un total de 40 retraits Nousobtenons le calcul suivant 10 40 100 Soit 0 100 crsquoest-agrave-dire 0 La divisionest la premiegravere opeacuteration exeacutecuteacutee parce qursquoelle est du mecircme groupe que la multipli-cation et qursquoelle apparaicirct en premier dans lrsquoopeacuteration De surcroicirct les valeurs eacutetantde type entier la division a pour reacutesultat un nombre entier Ici 1040 a pour reacutesultat 0

Pour corriger cette erreur de calcul lrsquoideacutee est de reacutealiser une division sur des valeursreacuteelles et non sur des entiers Pour cela nous utilisons le meacutecanisme du cast quiplaceacute devant la variable nbCB transforme cette derniegravere en variable de type reacuteel etpermet la division en reacuteel Pour stocker le reacutesultat de cette opeacuteration nous deacuteclaronsune variable de type float nommeacutee prctCB

Lrsquoinstruction

prctCB = (float) nbCB nbDebit 100

permet de trouver un reacutesultat coheacuterent Veacuterifions cela sur un exemple numeacuteriqueSupposons que nous ayons effectueacute 10 deacutebits par Carte Bleue sur un total de20 retraits Gracircce au cast la valeur 10 correspondant agrave nbCB est transformeacutee en 100La division par 20 a donc un reacutesultat reacuteel eacutegal agrave 05 Le taux drsquoutilisation de la CarteBleue est donc de 05 100 soit 50

Pour eacutetablir le pourcentage relatif aux modes cheacutequier et virement il suffit drsquoappli-quer le mecircme calcul en utilisant des variables approprieacutees aux deux autres moyensde paiement En nommant prctCh et prctVi les variables associeacutees aux modes depaiement par chegraveque et par virement automatique le taux drsquoutilisation pour chacunde ces modes srsquoeacutecrit

prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

4 Lrsquoaffichage des reacutesultats srsquoeffectue par lrsquointermeacutediaire de la fonction Systemoutprint() Les valeurs calculeacutees sont commenteacutees de la faccedilon suivante

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

42

Systemoutprintln( Vous avez emis + nbDebit + ordres de debit ) Systemoutprintln( dont + prctCB + par Carte Bleue ) Systemoutprintln( + prctCh + par cheque ) Systemoutprintln( + prctVi + par virement )

Le programme final srsquoeacutecrit en regroupant lrsquoensemble des instructions deacutefinies preacuteceacutedem-ment et en les inseacuterant dans une classe agrave lrsquointeacuterieur de la fonction main()

Le code source complet

public class Statistique public static void main (String [] arg) int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0 float prctCB prctCh prctVi Systemoutprint( Nombre de paiements par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques emis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei() nbDebit = nbCB + nbCheque + nbVirement prctCB = (float) nbCB nbDebit 100 prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

Systemoutprintln(Vous avez emis + nbDebit + ordres de debit) Systemoutprintln(dont + prctCB + par Carte Bleue) Systemoutprintln( + prctCh + par cheque) Systemoutprintln( + prctVi + par virement)

Reacutesultat de lrsquoexeacutecutionAgrave lrsquoexeacutecution de ce programme nous avons agrave lrsquoeacutecran lrsquoaffichage suivant (les caractegraveresgriseacutes sont des valeurs choisies par lrsquoutilisateur)

Nombre de paiements par Carte Bleue 55Nombre de cheques emis 1100Nombre de virements automatiques 55Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

43

ReacutesumeacuteUne variable est caracteacuteriseacutee par un nom et un type Le nom sert agrave repeacuterer unemplacement meacutemoire Le type deacutetermine la taille de cet emplacement ainsi que lamaniegravere dont lrsquoinformation est codeacutee les opeacuterations autoriseacutees et lrsquointervalle desvaleurs repreacutesentables

Il existe plusieurs types simples dont les plus utiliseacutes sont les suivants

bull int Preacutesente les entiers variant pour le langage Java entre ndash 2 147 483 648 et2 147 483 647

bull double Deacutecrit de maniegravere approcheacutee les nombres reacuteels dont la valeur absolue estgrande Les variables de type double se notent soit sous forme deacutecimale (677ndash92 048 ou 22) soit sous forme exponentielle 314E4 325707e2 ndash45567E-5

bull char Deacutesigne les caractegraveres Les valeurs de type caractegravere se notent en placcedilantentre apostrophes le caractegravere lui-mecircme

Lrsquoinstruction drsquoaffectation permet de placer une valeur dans une variable Elle estde la forme variable = expression

Elle calcule drsquoabord la valeur de lrsquoexpression mentionneacutee agrave droite du signe = puiselle lrsquoaffecte agrave la variable placeacutee agrave gauche du signe

Il est conseilleacute drsquoattribuer une valeur initiale agrave une variable au moment de sa deacutecla-ration Par exemple int i = 6 ou char c = rsquonrsquo

Pour calculer des expressions matheacutematiques il existe cinq opeacuterateursarithmeacutetiques + -

Ces opeacuterateurs sont utiliseacutes respectivement pour lrsquoaddition la soustraction la multi-plication la division et le modulo (reste de la division entiegravere) Les expressionsarithmeacutetiques sont calculeacutees agrave partir des regravegles suivantes

bull Entier + - entier donne un entier

bull Reacuteel + - reacuteel donne un reacuteel

bull Les opeacuterations mixtes du type entier + - reacuteel ou reacuteel + - entier

donnent un reacutesultat dans la mesure ougrave la valeur reacutesultante nrsquoest pas deacutenatureacutee par laconversion des types Les conversions sont effectueacutees automatiquement dans le senssuivant

byte -gt short -gt int -gt long -gt float -gt double

Un int peut donc ecirctre transformeacute en un double Lrsquoinverse nrsquoest possible que lorsquele mode de conversion est explicitement deacutecrit dans lrsquoexpression comme dans n =(int) x ougrave n est de type int et x de type double

Lrsquoinformation ainsi transformeacutee est tronqueacutee pour ecirctre codeacutee sur moins drsquooctets

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

44

ExercicesRepeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction

Observez ce qui suit et indiquez ce qui est ou nrsquoest pas une deacuteclaration et ce qui estou nrsquoest pas valide

a int i j valeur b limite - j = 1024 c val = valeur 16 d char char e j + 1 f int X g float A h A = X 2 i X = A 2 j X = X 2

Comprendre le meacutecanisme de lrsquoaffectation

Quelles sont les valeurs des variables A B C apregraves lrsquoexeacutecution de chacun desextraits de programme suivants

bull Il existe des regravegles de prioriteacute entre les opeacuterateurs Pour cela deux groupesdrsquoopeacuterateurs sont deacutefinis

Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacutera-teurs

Le second groupe a prioriteacute sur le premier

Les parenthegraveses permettent la modification des prioriteacutes

a b

float A = 35f

float B = 15f

float C

C = A + B

B = A + C

A = B

double A = 01

double B = 11

double C D

B = A

C = B

D = C

A = D

Groupe 1 Groupe 2

+ -

11

12

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

45

Quelles sont les valeurs des variables a b et c valeur x y et z apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Comprendre le meacutecanisme drsquoeacutechange de valeursDans chacun des cas quelles sont les valeurs des variables a et b apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Laquelle des options suivantes permet drsquoeacutechanger les valeurs des deux variables aet b

a = b b = a t = a a = b b = t t = a b = a t = b

Soit trois variables a b et c (entiegraveres) Eacutecrivez les instructions permutant lesvaleurs de sorte que la valeur de a passe dans b celle de b dans c et celle de c dansa Nrsquoutilisez qursquoune (et une seule) variable entiegravere suppleacutementaire nommeacutee tmp

Quel est lrsquoeffet des instructions suivantes sur les variables a et b (pour vous aiderinitialisez a agrave 2 et b agrave 5)

a = a + b b = a ndash b a = a ndash b

Calculer des expressions mixtesDonnez les valeurs des expressions suivantes sachant que i et j sont de type int etx et y de type double (x = 20 y = 30)

a i = 100 6 b j = 100 6 c i = 5 8 d (3 i - 2 j) (2 x - y)e 2 ((i 5) + (4 (j - 3)) (i + j - 2))f (i - 3 j) (x + 2 y) (i - j)

a b c

int a = 5 b

b = a + 4

a = a + 1

b = a ndash 4

int valeur = 2

valeur = valeur + 1

valeur = valeur 2

valeur = valeur 5

int x = 2 y = 10 z

z = x + y

x = 5

z = z ndash x

1 2

int a = 5

int b = 7

a = b

b = a

int a = 5

int b = 7

b = a

a = b

13

14

15

16

17

18

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

46

Donnez le type et la valeur des expressions suivantes sachant que n p r s et t sontde type int (n = 10 p = 7 r = 8 s = 7 t = 21) et que x est de type float(x = 20f )

Comprendre le meacutecanisme du castSoit les deacuteclarations suivantes

int valeur = 7 chiffre = 2 i1 i2 float f1 f2

Quelles sont les valeurs attribueacutees agrave i1 i2 f1 et f2 apregraves le calcul de

i1 = valeur chiffre i2 = chiffre valeur f1 = (float) (valeur chiffre) f2 = (float) (valeur chiffre) + 05f i1 = (int) f1 i2 = (int) f2 f1 = (float) valeur (float) chiffre f2 = (float) valeur (float) chiffre + 05f i1 = (int) f1 i2 = (int) f2

Le projet laquo Gestion drsquoun compte bancaire raquoDeacuteterminer les variables neacutecessaires au programmeLe programme de gestion drsquoun compte bancaire ne peut srsquoeacutecrire et srsquoexeacutecuter sansaucune variable Pour pouvoir deacutefinir toutes les variables neacutecessaires agrave la bonne marchedu programme nous devons examiner attentivement le cahier des charges deacutecrit auchapitre introductif laquo Naissance drsquoun programme raquo

La section laquo Les objets manipuleacutes raquo nous donne une premiegravere ideacutee des variables agrave deacutecla-rer Toutes les donneacutees relatives au compte bancaire y sont deacutecrites

Un compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero de compte

bull un type de compte (courant eacutepargne joint etc)

a b

x + n p

x + n p

(x + n) p

5 n

(n + 1) n

(n + 10) n

r + s t

r + t s

( r + t ) s

r + t s

(r + t) s

r + s r + s

(r + s) ( r + s)

r + s t

19

110

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

47

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Compte tenu de ces informations donnez un nom et un type Java pour chaque donneacuteedeacutefinie ci-dessus

Remarquons que le type qui repreacutesente les suites de caractegraveres (String) nrsquoa pas encoreeacuteteacute eacutetudieacute ni toutes ses fonctionnaliteacutes Il est possible de transformer pour lrsquoinstant lesdonneacutees Type du compte Thegraveme et Moyen de paiement en caractegraveres simples Par exem-ple le caractegravere C caracteacuterise le type du compte Courant le caractegravere J le compte Jointet le caractegravere E le compte Epargne

De la mecircme faccedilon la donneacutee Numeacutero du compte peut ecirctre transformeacutee dans un premiertemps en type long

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Suite de caractegraveres

Type du compte Courant Suite de caractegraveres

Valeur ndash152030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Suite de caractegraveres

Moyen de paiement CB Suite de caractegraveres

copy copyright Eacuteditions Eyrolles

2Communiquer

une information

Un programme nrsquoa drsquointeacuterecirct que srsquoil produit un reacutesultat Pour communiquer ce reacutesultatlrsquoordinateur utilise lrsquoeacutecran Cette action qui consiste agrave afficher un message est appeleacuteeopeacuteration de sortie ou drsquoeacutecriture de donneacutees

Parallegravelement un programme ne produit de reacutesultats que si lrsquoutilisateur lui fournit aupreacutealable des informations Ces informations ou donneacutees sont transmises auprogramme le plus souvent par lrsquointermeacutediaire drsquoun clavier Dans le jargon informati-que cette opeacuteration est appeleacutee opeacuteration de saisie drsquoentreacutee ou encore de lecture dedonneacutees

Dans ce chapitre nous commenccedilons par eacutetudier les fonctionnaliteacutes proposeacutees par lelangage Java pour geacuterer les opeacuterations drsquoentreacutee-sortie (laquo La bibliothegraveque System raquo)

Agrave la section laquo Lrsquoaffichage de donneacutees raquo nous examinons ensuite comment afficher agravelrsquoeacutecran des messages et des donneacutees Enfin agrave la section laquo La saisie de donneacutees raquo nousproposons une technique de saisie de valeurs au clavier

La bibliothegraveque SystemNous lrsquoavons vu dans les exemples des chapitres preacuteceacutedents lrsquoaffichage de valeurs ou detexte est reacutealiseacute par lrsquoutilisation drsquoune fonction preacutedeacutefinie du langage Java Cette fonc-tion a pour nom drsquoappel Systemoutprint()

Pourquoi un nom si complexe pour reacutealiser une action aussi laquo simple raquo que lrsquoaffichagede donneacutees

Le langage Java est accompagneacute drsquoun ensemble de bibliothegraveques de programmes preacuteeacute-crits qui eacutepargnent au programmeur drsquoavoir agrave reacuteeacutecrire ce qui a deacutejagrave eacuteteacute fait depuis lesdeacutebuts de lrsquoegravere informatique Ces bibliothegraveques portent chacune un nom qui renseigne

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

50

sur leur fonctionnaliteacute Ainsi la bibliothegraveque ougrave se trouve lrsquoensemble des fonctions decalcul matheacutematique srsquoappelle Math et celle relative agrave la gestion des eacuteleacutements de basniveau (eacutecran clavier etc) impliquant le systegraveme de lrsquoordinateur srsquoappelle System

La gestion de lrsquoaffichage drsquoun message agrave lrsquoeacutecran ou la saisie de valeurs au clavier fontpartie des fonctions impliquant le systegraveme de lrsquoordinateur Crsquoest pourquoi le nomdrsquoappel de telles fonctions a pour premier terme System

Les opeacuterations drsquoentreacutee ou de sortie de donneacutees impliquent le systegraveme de lrsquoordinateurmais sont en rapport inverse lrsquoune de lrsquoautre Pour dissocier ces opeacuterations la librairieSystem est composeacutee de deux sous-ensembles in et out Lrsquoaffichage est une opeacuterationde sortie et fait donc partie des eacuteleacutements out de la classe System Le point () qui relie lemot System agrave out permet drsquoexpliquer agrave lrsquoordinateur que lrsquoon souhaite acceacuteder au sous-ensemble out de la librairie System plutocirct qursquoau sous-ensemble in Pour finir nousfaisons appel dans le sous-ensemble out agrave la fonction print qui affiche un message agravelrsquoeacutecran Le nom de la fonction print signifie imprimer car au tout deacutebut de lrsquoinformati-que les ordinateurs nrsquoavaient pas drsquoeacutecran et les reacutesultats drsquoun calcul eacutetaient imprimeacutessur papier ou sur carte informatique

La notation point () est une eacutecriture courante en programmation objet Comme nous leverrons au chapitre 7 laquo Les classes et les objets raquo elle offre le moyen drsquoacceacuteder agrave desprogrammes ou agrave des donneacutees speacutecifiques

Notons que dans la classe System se trouve aussi le sous-ensemble err qui permetdrsquoafficher les erreurs eacuteventuelles drsquoun programme sur la sortie standard des erreurs Cetype de sortie nrsquoest deacutefini que dans le monde Unix et la sortie err est identique agrave lasortie out dans le monde Dos

Lrsquoaffichage de donneacuteesLe principe geacuteneacuteral pour lrsquoaffichage drsquoun message est de placer ce dernier en paramegravetrede la fonction Systemoutprint() crsquoest-agrave-dire agrave lrsquointeacuterieur des parenthegraveses qui suiventle terme Systemoutprint Plusieurs possibiliteacutes existent quant agrave la forme et agrave la syntaxede ce message et nous les preacutesentons ci-apregraves

Affichage de la valeur drsquoune variableSoit la variable entiegravere valeur Lrsquoaffichage de son contenu agrave lrsquoeacutecran est reacutealiseacute par

int valeur = 22 Systemoutprint(valeur)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

22

Affichage drsquoun commentaireLe fait drsquoeacutecrire une valeur numeacuterique sans autre commentaire nrsquoa que peu drsquointeacuterecirctPour expliquer un reacutesultat il est possible drsquoajouter du texte avant ou apregraves la variablecomme dans lrsquoexemple

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

51

Systemoutprint( Le montant srsquoeleve a + valeur)

ou

Systemoutprint(valeur + correspond au montant total )

Pour ajouter un commentaire avant ou apregraves une variable il suffit de le placer entreguillemets ( ) et de lrsquoaccrocher agrave la variable agrave lrsquoaide du signe + De cette faccedilon lecompilateur est capable de distinguer le texte agrave afficher du nom de la variable Toutcaractegravere placeacute entre guillemets est un message alors qursquoun mot non entoureacute de guille-mets correspond au nom drsquoune variable

En reprenant la mecircme variable valeur qursquoagrave lrsquoexemple preacuteceacutedent le reacutesultat afficheacute pourle premier exemple est

Le montant srsquoeleve a 22

Ou encore pour le deuxiegraveme exemple

22 correspond au montant total

Affichage de plusieurs variablesOn peut afficher le contenu de plusieurs variables en utilisant la mecircme technique Lescommentaires sont placeacutes entre guillemets et les variables sont preacuteceacutedeacutees entoureacutees ousuivies du caractegravere + Le signe + reacuteunit chaque terme de lrsquoaffichage au suivant ou aupreacuteceacutedent Pour afficher le contenu de deux variables

int v = 5 s = 220

nous eacutecrivons

Systemoutprint(v + elements valent au total + s + francs )

Lrsquoexeacutecution de cette instruction a pour reacutesultat

5 elements valent au total 220 francs

Affichage de la valeur drsquoune expression arithmeacutetiqueDans une instruction drsquoaffichage il est possible drsquoafficher directement le reacutesultat drsquouneexpression matheacutematique sans qursquoelle ait eacuteteacute calculeacutee auparavant Par exemple nouspouvons eacutecrire

int a = 10 b = 5 Systemoutprint(a + fois + b + est egal a + a b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

10 fois 5 est egal a 50

Mais attention cette expression est calculeacutee au cours de lrsquoexeacutecution de lrsquoinstructionelle nrsquoest pas meacutemoriseacutee dans un emplacement meacutemoire Le reacutesultat ne peut donc pasecirctre reacuteutiliseacute dans un autre calcul

Remarquons en outre que lrsquoeacutecriture drsquoune expression matheacutematique agrave lrsquointeacuterieur de lafonction drsquoaffichage peut ecirctre source de confusion pour le compilateur surtout si

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

52

lrsquoexpression matheacutematique comporte un ou plusieurs signes + En remplaccedilant danslrsquoexemple preacuteceacutedent le signe par + nous obtenons

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + a + b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche de la faccedilon suivante

10 plus 5 est egal a 105

Lrsquoordinateur ne peut pas afficher la somme de a et de b parce que lorsque le signe + estplaceacute dans la fonction drsquoaffichage il a pour rocircle de reacuteunir des valeurs et du texte sur unemecircme ligne drsquoaffichage et non drsquoadditionner deux valeurs 105 nrsquoest que la reacuteunion de 10et de 5 On dit qursquoil srsquoagit drsquoune opeacuteration de concateacutenation

Pour afficher le reacutesultat drsquoune addition il est neacutecessaire de placer entre parenthegraveses lecalcul agrave afficher Par exemple

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + (a + b))

Le reacutesultat agrave lrsquoeacutecran est

10 plus 5 est egal a 15

Affichage drsquoun texteNous pouvons aussi afficher un simple texte sans utiliser de variable

Systemoutprint(Qui seme le vent recolte la tempete )

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

Qui seme le vent recolte la tempete

Pour changer de ligne

Remarquons que lrsquoinstruction Systemoutprint affiche les informations agrave la suite decelles qui ont eacuteteacute afficheacutees par un preacuteceacutedent Systemoutprint Il nrsquoy a pas de passageagrave la ligne entre deux instructions drsquoaffichage Ainsi les instructions

Systemoutprint(Qui seme le vent ) Systemoutprint(recolte la tempete )

ont le mecircme reacutesultat agrave lrsquoeacutecran que celle de lrsquoexemple preacuteceacutedent

Qui seme le vent recolte la tempete

Pour obtenir un passage agrave la ligne il est neacutecessaire drsquoutiliser la fonction

Systemoutprintln()

Ainsi les instructions

Systemoutprintln(Qui seme le vent ) Systemoutprint(recolte la tempete )

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

53

ont pour reacutesultat

Qui seme le vent recolte la tempete

Les caractegraveres speacuteciaux

La table Unicode deacutefinit tous les caractegraveres textuels (alphanumeacuteriques) et semi-graphi-ques (voir au chapitre 1 laquo Stocker une information raquo la section laquo Les types de base enJava ndash Cateacutegorie caractegravere raquo) Les caractegraveres speacuteciaux sont deacutefinis entre les 128e et 256e

caractegraveres de cette table Ils correspondent agrave des caractegraveres nrsquoexistant pas sur le claviermais qui sont neacuteanmoins utiles Les caractegraveres accentueacutes font aussi partie des caractegraveresspeacuteciaux les claviers Qwerty ameacutericains ne posseacutedant pas ce type de caractegraveres

Pour afficher un message avec des caractegraveres nrsquoexistant pas sur le clavier ou avec descaractegraveres accentueacutes la meacutethode consiste agrave inseacuterer agrave lrsquointeacuterieur du message le codeUnicode du caractegravere souhaiteacute Ce code srsquoobtient en placcedilant derriegravere les caractegraveres u00la valeur hexadeacutecimale de la position du caractegravere dans la table Unicode Par exemple lecaractegravere A majuscule est deacutefini en position 65 dans la table Unicode Son code Unicodesrsquoeacutecrit u0041 car 41 est la valeur hexadeacutecimale de 65

Lrsquoaffichage de caractegraveres accentueacutes et plus geacuteneacuteralement de tout caractegravere speacutecial resteprobleacutematique Surtout si le programme doit fonctionner sur des ordinateurs diffeacuterentsEn effet les codes de ces caractegraveres font partie des extensions qui diffegraverent suivant lespays ou les environnements de travail Dans ces extensions les caractegraveres ne sont pastoujours deacutefinis agrave la mecircme position dans la table Unicode Le caractegravere eacute est deacutefini enposition 234 dans la table Unicode drsquoUnix alors qursquoil est en position 200 dans la tableUnicode du systegraveme Mac OS Les caractegraveres speacuteciaux et par conseacutequent les caractegraveresaccentueacutes nrsquoont pas toujours un code Unicode identique drsquoun environnement agrave un autre

Par exemple les caractegraveres eacute egrave et ecirc ont les codes Unicode suivants

Le message laquo Qui segraveme le vent reacutecolte la tempecircte raquo srsquoeacutecrit donc diffeacuteremmentsuivant lrsquoenvironnement utiliseacute

Exemple sous Windows ou Unix

Systemoutprint(Qui su00e8me le vent )Systemoutprint(ru00e9colte la tempu00eate )

Exemple sous Dos

Systemoutprint(Qui su008ame le vent )Systemoutprint(ru0082colte la tempu0088te )

Environnement eacute egrave ecirc

Unix u00e9 u00e8 u00ea

Dos u0082 u008a u0088

Windows u00e9 u00e8 u00ea

Mac OS u00c8 u00cb u00cd

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

54

Exemple sous MacOS

Systemoutprint(Qui su00cbme le vent )Systemoutprint(ru00c8colte la tempu00cdte )

Pour connaicirctre le code Unicode drsquoun caractegravere donneacute en fonction de votre environnement detravail vous pouvez utiliser lrsquoexemple deacutecrit agrave la section laquo La boucle for raquo du chapitre 4 laquo Faire desreacutepeacutetitions raquo

La saisie de donneacuteesJava est un langage conccedilu avant tout pour ecirctre exeacutecuteacute dans un environnement Internet etutilisant des programmes essentiellement axeacutes sur le concept drsquointerface graphique(gestion des boutons menus fenecirctres etc) Dans ce type drsquoenvironnement la saisie dedonneacutees est geacutereacutee par des fenecirctres speacutecialiseacutees appeleacutees fenecirctres de dialogue

Lrsquoobjectif de cet ouvrage est drsquoinitier le lecteur au langage Java et surtout de lui fairecomprendre comment construire et eacutelaborer un programme Pour cet apprentissage(algorithme et langage) il nrsquoest pas recommandeacute de se lancer dans lrsquoeacutecriture deprogrammes utilisant des boutons des menus et autres fenecirctres sans avoir eacutetudieacute aupreacutealable toute la libraire AWT (Abstract Windowing Toolkit) de Java Cette librairiefacilite il est vrai la construction drsquoapplications graphiques mais elle complique etalourdit lrsquoeacutecriture des programmes

Pour plus de deacutetails sur la librairie AWT reportez-vous au chapitre 11 laquo Dessiner des objets raquo

Crsquoest pourquoi nous avons deacutelibeacutereacutement choisi de travailler dans un environnement nongraphique plus simple agrave programmer

Dans cet environnement le langage Java propose la fonction Systeminread() quipermet la saisie de donneacutees au clavier sans lrsquointermeacutediaire de fenecirctres graphiques Cettefonction est deacutefinie dans la bibliothegraveque System agrave lrsquointeacuterieur du sous-ensemble in Elleutilise le programme de lecture au clavier read()

La fonction Systeminread() permet de reacutecupeacuterer un et un seul caractegravere saisi auclavier Si lrsquoutilisateur souhaite saisir des valeurs ou des noms composeacutes de plusieurscaractegraveres le programme doit contenir autant drsquoinstructions Systeminread() que decaractegraveres agrave saisir Le nombre de caractegraveres agrave saisir variant suivant lrsquoutilisation delrsquoapplication cette fonction nrsquoest pas directement utilisable de cette faccedilon

La classe LirejavaCrsquoest pourquoi nous proposons au lecteur un ensemble de fonctions de lecture quipermettent de saisir autant de caractegraveres que souhaiteacute Pour terminer la saisie il suffit dela valider en appuyant sur la touche entreacutee du clavier De plus il existe autant de fonc-tions de lecture que de types de variables Il est tregraves facile de saisir des valeurs numeacuteri-ques de type entier (byte short int et long) ou reacuteel (float et double) et des caractegraveresde type char ou String

Pour ce faire la technique consiste agrave utiliser comme nom de fonction le nom Lire()ougrave correspond agrave la premiegravere lettre du type de la variable agrave saisir Pour saisir un entier

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

55

nous utilisons la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute int repreacute-sentant le type entier) Lire est le nom de la bibliothegraveque des fonctions de saisie devaleurs au clavier Elle est deacutefinie dans le fichier Lirejava Vous trouverez ce fichierdans le CD-Rom livreacute avec cet ouvrage

Dans ce fichier que tout lecteur peut consulter agrave lrsquoaide drsquoun eacutediteur de texte est deacutefinilrsquoensemble des fonctions qui facilitent la saisie des donneacutees au clavier Ces fonctions seronteacutetudieacutees et analyseacutees au fur et agrave mesure de lrsquoavancement des connaissances mais pour vousfamiliariser rapidement avec leur emploi vous trouverez ci-dessous un programme simpleet complet qui utilise toutes les fonctions de saisie proposeacutees par lrsquoauteur

Exemple code source complet

public class TestLire public static void main (String [] Arg) Deacuteclaration des variables les noms sont choisis pour une meilleure lisibiliteacute du programme drsquoautres noms auraient pu ecirctre retenus byte val_byte short val_short int val_int long val_long float val_float double val_double char val_char String val_String Saisir une valeur de type byte Systemoutprintln(Entrez un byte ) val_byte = Lireb() Saisir une valeur de type short Systemoutprintln(Entrez un short ) val_short = Lires() Saisir une valeur de type int Systemoutprintln(Entrez un int ) val_int = Lirei() Saisir une valeur de type long Systemoutprintln(Entrez un long ) val_long = Lirel() Saisir une valeur de type float Systemoutprintln(Entrez un float ) val_float = Liref() Saisir une valeur de type double Systemoutprintln(Entrez un double ) val_double = Lired() Saisir une valeur de type String Systemoutprintln(Entrez un String ) val_String = LireS() Saisir une valeur de type char Systemoutprintln(Entrez un char ) val_char = Lirec() Afficher les diffeacuterentes valeurs saisies au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

56

Systemoutprintln(vous avez entre le byte + val_byte) Systemoutprintln(vous avez entre le short + val_short) Systemoutprintln(vous avez entre lrsquoentier + val_int) Systemoutprintln(vous avez entre le long + val_long) Systemoutprintln(vous avez entre le float + val_float) Systemoutprintln(vous avez entre le double + val_double) Systemoutprintln(vous avez entre le caractere + val_char) Systemoutprintln(vous avez entre le String + val_String)

Apregraves la deacuteclaration des variables le programme demande la saisie de valeurs drsquouncertain type Lrsquoutilisateur fournit la valeur correspondant au type demandeacute et valide lasaisie en appuyant sur la touche Entreacutee du clavier Une fois saisies les valeurs sont affi-cheacutees agrave lrsquoeacutecran

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez un byte 110000Entrez un short --3300556600Entrez un int 112255669988Entrez un long 9988776688776655Entrez un float 331144115599Entrez un double 112233887766445533009977443322Entrez un String EExxeemmppllee Entrez un char AAvous avez entre le byte 100 vous avez entre le short -30560vous avez entre lrsquoentier 125698vous avez entre le long 98768765vous avez entre le float 314159vous avez entre le double 123876453097432vous avez entre le caractere Avous avez entre le String Exemple

ReacutesumeacutePour communiquer une information lrsquoordinateur affiche un message agrave lrsquoeacutecran Ondit qursquoil reacutealise une opeacuteration de sortie (out) ou drsquoeacutecriture de donneacutees Agrave lrsquoinverselorsque lrsquoutilisateur communique des donneacutees au programme par lrsquointermeacutediaire duclavier il effectue une opeacuteration drsquoentreacutee (in) ou de lecture de donneacutees

Dans le langage Java les opeacuterations de sortie sont reacutealiseacutees gracircce agrave lrsquoinstructionSystemoutprint() qui permet drsquoafficher des informations agrave lrsquoeacutecran

Par exemple lrsquoinstruction

Systemoutprint(F + francs valent + E + euros)

affiche agrave lrsquoeacutecran le contenu de la variable F suivi du texte laquo francs valent raquo puis lecontenu de la variable E suivi du texte laquo euros raquo

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

57

Exercices

Comprendre les opeacuterations de sortie

Soit un programme Java contenant les deacuteclarations

int i = 223 j = 135 float a = 3355f b = 205f char R = rsquoRrsquo T = rsquoTrsquo

Deacutecrivez lrsquoaffichage geacuteneacutereacute par chacune des instructions suivantes

Systemoutprintln(Vous avez entre + i)

Systemoutprintln(Pour un montant de + a + le total vaut + i + j)

Systemoutprint(Apres reduction de + b + vous gagnez )

Systemoutprintln( (ab)100 + euros)

Systemoutprint( La variable R = + R + et T = + T)

Pour distinguer le commentaire du nom de variable le commentaire est placeacute entreguillemets Le contenu de la variable est afficheacute en reacuteunissant la variable aucommentaire agrave lrsquoaide du signe +

Pour afficher des reacutesultats sur plusieurs lignes il convient drsquoutiliser lrsquoinstruction

Systemoutprintln()

Dans le langage Java les opeacuterations drsquoentreacutee ne sont pas aussi simples drsquoemploi dufait qursquoelles sont le plus souvent reacutealiseacutees agrave lrsquoaide de fenecirctres graphiques geacuteneacuterantdes programmes plus complexes agrave eacutecrire

Crsquoest la raison pour laquelle lrsquoauteur propose un ensemble de fonctions de lecturequi permettent la saisie de valeurs de tout type Par exemple pour saisir un entier ilsuffit drsquoutiliser la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute intrepreacutesentant le type entier) Les fonctions de lecture ont pour nom drsquoappel

Lireb() pour saisir une valeur de type byte

Lires() pour saisir une valeur de type short

Lirei() pour saisir une valeur de type int

Lirel() pour saisir une valeur de type long

Liref() pour saisir une valeur de type float

Lired() pour saisir une valeur de type double

LireS() pour saisir une valeur de type String

Lirec() pour saisir une valeur de type char

21

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

58

En tenant compte des deacuteclarations de variables suivantes eacutecrivez les instructionsSystemoutprint() de faccedilon agrave obtenir lrsquoaffichage suivant

Notez que la racine carreacutee de x srsquoobtient par la fonction Mathsqrt(x) et que ab se calcule avec lameacutethode Mathpow(ab)

Comprendre les opeacuterations drsquoentreacuteePour chacun des deux programmes suivants et compte tenu des informations four-nies par lrsquoutilisateur quelles sont les valeurs afficheacutees agrave lrsquoeacutecran

Observer et comprendre la structure drsquoun programme JavaEn prenant exemple sur la structure suivante eacutecrivez un programme Euro quiconvertisse des francs en euros (Rappel 1 euro = 6559 57 francs)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe public static void main(String [] argument) Deacuteclarer les variables repreacutesentant les francs et les euros ainsi que le taux de conversion helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher et Saisir le nombre de francs helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le nombre drsquoeuros helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat suivant lrsquoexemple donneacute ci-dessous helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

double x = 4 y = 2 double x = 9 y = 3

x = 40 et y = 20Racine carreacutee de 40 = 2040 a la puissance 20 = 160

x = 90 et y = 30Racine carreacutee de 90 = 3090 a la puissance 30 = 7290

Lrsquoutilisateur fournit au clavier 2 puis 3 puis 4 Lrsquoutilisateur fournit au clavier 2

int X Y

X = Lirei()

Y = Lirei()

X = Lirei()

X = X+Y

Systemoutprint( X = + X)

Systemoutprint( Y = + Y)

int X Y

X = Lirei()

Y = 0

X = X+Y

Systemoutprintln( X = + X)

Systemoutprintln( Y = + Y)

22

23

24

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

59

Lrsquoaffichage du reacutesultat se fera sous la forme suivante

Nombre de francs 112200Conversion FE 66555599 5577Nombre drsquoeuros 1188229933

Le projet laquo Gestion drsquoun compte bancaire raquoAfficher le menu principal ainsi que ses optionsLrsquoobjectif du premier programme est drsquoeacutecrire toutes les instructions qui permettentlrsquoaffichage des menus deacutefinis dans le cahier des charges deacutecrit au chapitre introductiflaquo Naissance drsquoun programme raquo ainsi que la saisie des donneacutees demandeacutees Leprogramme construit affiche tous les messages de toutes les options sans controcircle sur lechoix de lrsquoutilisateur

bull Le menu principal srsquoaffiche de la faccedilon suivante 1 Creer un compte2 Afficher un compte3 Creer une ligne comptable4 Sortir5 De lrsquoaideVotre choix

bull Une fois le menu afficheacute le programme attend la saisie du choix de lrsquoutilisateur

bull Lrsquooption 1 du menu principal a pour affichage

Type du compte [Types possibles courant joint eacutepargne] Numero du compte Premiegravere valeur creditee Taux de placement

bull Lrsquooption 2 reacutealise les opeacuterations suivantes

ndash Affiche la demande de saisie du numeacutero du compte que lrsquoutilisateur souhaiteconsulter

ndash Saisit le numeacutero de compte

bull Lrsquooption 3 affiche laquo option non programmee raquo

bull Lrsquooption 4 termine lrsquoexeacutecution du programme Pour cela utilisez la fonction JavaSystemexit(0)

bull Avec lrsquooption 5 le programme affiche une ligne drsquoexplication pour chaque option dumenu principal

copy copyright Eacuteditions Eyrolles

3Faire des choix

Une fois les variables deacutefinies et les valeurs stockeacutees en meacutemoire lrsquoordinateur estcapable de les tester ou de les comparer de faccedilon agrave reacutealiser une instruction plutocirct qursquouneautre suivant le reacutesultat de la comparaison

Le programme nrsquoest alors plus exeacutecuteacute de faccedilon seacutequentielle (de la premiegravere lignejusqursquoagrave la derniegravere) Lrsquoordre est rompu une ou plusieurs instructions eacutetant ignoreacutees enfonction du reacutesultat du test Le programme peut srsquoexeacutecuter en tenant compte decontraintes imposeacutees par le programmeur

Dans ce chapitre nous abordons la notion de choix ou de test en reprenant lrsquoalgorithmedu cafeacute chaud pour le transformer en un algorithme du cafeacute chaud sucreacute ou non(laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

Ensuite agrave la section laquo Lrsquoinstruction if-else raquo nous eacutetudions la structure if-elseproposeacutee par le langage Java qui permet de reacutealiser des choix

Enfin agrave la section laquo Lrsquoinstruction switch ou comment faire des choix multiples raquo nousexaminons le concept de choix multiples par lrsquointermeacutediaire de la structure switch

Lrsquoalgorithme du cafeacute chaud sucreacute ou non

Pour mieux comprendre la notion de choix nous allons reprendre lrsquoalgorithme du cafeacutechaud pour le transformer en algorithme du cafeacute chaud sucreacute ou non Lrsquoeacutenonceacute ainsitransformeacute nous oblige agrave modifier la liste des objets manipuleacutes ainsi que celle des opeacutera-tions agrave reacutealiser

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

62

Deacutefinition des objets manipuleacutesPour obtenir du cafeacute sucreacute nous devons ajouter agrave notre liste un nouvel ingreacutedient lesucre et un nouvel ustensile la petite cuillegravere

cafeacute moulufiltreeaucafetiegravere eacutelectriquetasseeacutelectriciteacutetablesucrepetite cuillegravere

Liste des opeacuterationsDe la mecircme faccedilon nous devons modifier la liste des opeacuterations de faccedilon qursquoelle prenneen compte les nouvelles donneacutees

Verser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtre Prendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique

un filtre un morceau de sucre une petite cuillegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute soit precirct Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le sucre

dans la tasse la petite cuillegravere dans la tasse

Ordonner la liste des opeacuterationsAinsi modifieacutee la liste des opeacuterations doit ecirctre reacuteordonneacutee afin de rechercher le momentle mieux adapteacute pour ajouter les nouvelles opeacuterations

bull En deacutecidant de prendre le sucre et la petite cuillegravere en mecircme temps que le cafeacute et lefiltre nous placcedilons les nouvelles instructions laquo prendrehellip raquo entre les instructions 2 et3 deacutefinies agrave la section laquo Ordonner la liste des opeacuterations raquo du chapitre introductiflaquo Naissance drsquoun programme raquo

bull En deacutecidant de poser le sucre et la petite cuillegravere dans la tasse avant drsquoy verser le cafeacutenous eacutecrivons les nouvelles instructions laquo poserhellip raquo avant lrsquoinstruction 15 du mecircmeexemple

Nous obtenons la liste des opeacuterations suivantes

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un morceau de sucre4 Prendre une petite cuillegravere5 Prendre un filtre6 Verser le cafeacute dans le filtre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

63

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Poser le sucre dans la tasse15 Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Eacutecrite ainsi cette marche agrave suivre nous permet drsquoobtenir un cafeacute chaud sucreacute Elle nenous autorise pas agrave choisir entre sucreacute ou non Pour cela nous devons introduire un testen posant une condition devant chaque instruction concernant la prise du sucre crsquoest-agrave-dire

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table

2 Prendre du cafeacute

3 Si (cafeacute sucreacute) Prendre un morceau de sucre4 Si (cafeacute sucreacute) Prendre une petite cuillegravere5 Prendre un filtre

6 Verser le cafeacute dans le filtre

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Si (cafeacute sucreacute) Poser le sucre dans la tasse15 Si (cafeacute sucreacute) Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Dans cette situation nous obtenons du cafeacute sucreacute ou non selon notre choix Remarquonscependant que le test Si (cafeacute sucreacute) est identique pour les instructions 3 4 14 et 15Pour cette raison et sachant que chaque test repreacutesente un coucirct en termes de tempsdrsquoexeacutecution il est conseilleacute de regrouper au mecircme endroit toutes les instructions rela-tives agrave un mecircme test

Crsquoest pourquoi nous distinguons deux blocs drsquoinstructions distincts

bull les instructions soumises agrave la condition de cafeacute sucreacute (II Preacuteparer le sucre)

bull les instructions reacutealisables quelle que soit la condition (I Preacuteparer le cafeacute)copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

64

Dans ce cas la nouvelle solution srsquoeacutecrit

La reacutealisation du bloc I Preacuteparer le cafeacute nous permet drsquoobtenir du cafeacute chaudEnsuite en exeacutecutant le test Si (cafeacute sucreacute) deux solutions sont possibles

bull La proposition (cafeacute sucreacute) est vraie et alors les instructions 1 agrave 4 du blocII Preacuteparer le sucre sont exeacutecuteacutees Nous obtenons du cafeacute chaud sucreacute

bull La proposition (cafeacute sucreacute) est fausse et les instructions qui suivent ne sont pasexeacutecuteacutees Nous obtenons un cafeacute non sucreacute

Pour programmer un choix nous avons eacutecrit une condition devant les instructionsconcerneacutees En programmation il en est de mecircme Le langage Java propose plusieursinstructions de test agrave savoir la structure if-else que nous eacutetudions ci-apregraves et la struc-ture switch que nous analysons agrave la section laquo Lrsquoinstruction switch ou comment faire deschoix multiples raquo un peu plus loin dans ce chapitre

Lrsquoinstruction if-elseLrsquoinstruction if-else se traduit en franccedilais par les termes si-sinon Elle permet deprogrammer un choix en placcedilant derriegravere le terme if une condition comme nous avonsplaceacute une condition derriegravere le terme si de lrsquoalgorithme du cafeacute chaud sucreacute ou non

Lrsquoinstruction if-else se construit de la faccedilon suivante

bull en suivant une syntaxe ou forme preacutecise du langage Java (voir laquo Syntaxe drsquoif-else raquo)

bull en preacutecisant la condition agrave tester (voir laquo Comment eacutecrire une condition raquo)

Nous preacutesentons en fin de cette section un exemple de programme qui recherche la plusgrande des deux valeurs saisies au clavier (voir laquo Rechercher le plus grand de deuxeacuteleacutements raquo)

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un filtre4 Verser le cafeacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le cafeacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 Eteindre la cafetiegravere13 Verser le cafeacute dans la tasse

I Preacuteparer le cafeacute

Si (cafeacute sucreacute)

1 Prendre un morceau de sucre2 Prendre une petite cuillegravere3 Poser le sucre dans la tasse4 Poser la petite cuillegravere dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

65

Syntaxe drsquoif-elseLrsquoeacutecriture de lrsquoinstruction if-else obeacuteit aux regravegles de syntaxe suivantes

if (condition) si la condition est vraie faire plusieurs instructions faitelse sinon (la condition ci-dessus est fausse) faire plusieurs instructions fait

bull Si la condition situeacutee apregraves le mot-cleacute if et placeacutee obligatoirement entre parenthegravesesest vraie alors les instructions placeacutees dans le bloc deacutefini par les accolades ouvrante etfermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves le mot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs peut ecirctre exeacutecuteacute agrave la fois selon que la conditionest veacuterifieacutee ou non

Remarquons que

bull La ligne drsquoinstruction if(condition)ou else ne se termine jamais par un point-virgule ()

bull Les accolades et deacutefinissent un bloc drsquoinstructions Cela permet de regrouperensemble toutes les instructions relatives agrave un mecircme test

bull Lrsquoeacutecriture du bloc else nrsquoest pas obligatoire Il est possible de nrsquoeacutecrire qursquoun bloc ifsans programmer drsquoinstruction dans le cas ougrave la condition nrsquoest pas veacuterifieacutee (commedans lrsquoalgorithme du cafeacute chaud sucreacute ou non) En drsquoautres termes il peut y avoir desif sans else

bull Srsquoil existe un bloc else celui-ci est obligatoirement laquo accrocheacute raquo agrave un if Autrementdit il ne peut y avoir drsquoelse sans if

bull Le langage Java propose une syntaxe simplifieacutee lorsqursquoil nrsquoy a qursquoune seule instruc-tion agrave exeacutecuter dans lrsquoun des deux blocs if ou else Dans ce cas les accoladesouvrante et fermante ne sont pas obligatoires

if (condition) une seule instruction else une seule instruction

ou

if (condition) faire plusieurs instructions faitelse une seule instruction

ou encore

if (condition) une seule instruction else faire

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

66

plusieurs instructions fait

Une fois connue la syntaxe geacuteneacuterale de la structure if-else nous devons eacutecrire la condi-tion (placeacutee entre parenthegraveses juste apregraves if) permettant agrave lrsquoordinateur drsquoexeacutecuter le test

Comment eacutecrire une conditionLrsquoeacutecriture drsquoune condition en Java fait appel aux notions drsquoopeacuterateurs relationnels etconditionnels

Les opeacuterateurs relationnels

Une condition est formeacutee par lrsquoeacutecriture de la comparaison de deux expressions uneexpression pouvant ecirctre une valeur numeacuterique ou une expression arithmeacutetique Pourcomparer deux expressions le langage Java dispose de six symboles repreacutesentant lesopeacuterateurs relationnels traditionnels en matheacutematiques

Un opeacuterateur relationnel permet de comparer deux expressions de mecircme type Il nrsquoestpas possible de comparer un reacuteel avec un entier ou un entier avec un caractegravere

Lorsqursquoil srsquoagit de comparer deux expressions composeacutees drsquoopeacuterateurs arithmeacutetiques (+- ) les opeacuterateurs relationnels sont moins prioritaires par rapport aux opeacuterateursarithmeacutetiques De cette faccedilon les expressions matheacutematiques sont drsquoabord calculeacuteesavant drsquoecirctre compareacutees

Notons que pour tester lrsquoeacutegaliteacute entre deux expressions nous devons utiliser le symbole== et non pas un simple = En effet en Java le signe = nrsquoest pas un signe drsquoeacutegaliteacute au sensde la comparaison mais le signe de lrsquoaffectation qui permet de placer une valeur dansune variable

Exemple

int a = 3 b = 5 char lettre = rsquoirsquo car = rsquojrsquo

bull La condition (a = b) est vraie car 3 est diffeacuterent de 5

bull La condition (a + 2 == b) est vraie car 3 + 2 vaut 5

bull La condition (a + 8 lt 2 b)est fausse car 3 + 8 est plus grand que 2 5

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt==

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

67

bull La condition (lettre lt= car) est vraie car le caractegravere rsquoirsquo est placeacute avant rsquojrsquo danslrsquoordre alphabeacutetique

bull La condition (lettre == rsquowrsquo) est fausse car le caractegravere rsquoirsquo est diffeacuterent du carac-tegravere rsquowrsquo

Les opeacuterateurs logiques

Les opeacuterateurs logiques sont utiliseacutes pour associer plusieurs conditions simples et decette faccedilon creacuteer des conditions multiples en un seul test Il existe trois grands opeacutera-teurs logiques symboliseacutes par les caractegraveres suivants

Exemples

int x = 3 y = 5 z = 2 r = 6

bull Sachant que la condition (x lt y) ampamp (z lt r) est vraie si les deux expressions(x lt y) et (z lt r) sont toutes les deux vraies et devient fausse si lrsquoune des deuxexpressions est fausse lrsquoexpression donneacutee en exemple est vraie En effet (3 lt 5) estvraie et (2 lt 6) est vraie

bull Sachant que la condition (x gt y) || (z lt r) est vraie si lrsquoune des expressions(x gt y) ou (z lt r) est vraie et devient fausse si les deux expressions sont fausseslrsquoexpression donneacutee en exemple est vraie car (3 gt 5) est fausse mais (2 lt 6) estvraie

bull Sachant que la condition (z lt r) est vraie si lrsquoexpression (z lt r) est fausse etdevient fausse si lrsquoexpression est vraie alors lrsquoexpression donneacutee en exemple estfausse car (2 lt 6) est vraie

Rechercher le plus grand de deux eacuteleacutementsPour mettre en pratique les notions theacuteoriques abordeacutees aux deux sections preacuteceacutedentesnous allons eacutecrire un programme qui affiche dans lrsquoordre croissant deux valeurs entiegraveressaisies au clavier et recherche la plus grande des deux Pour cela nous devons

1 Demander la saisie de deux valeurs au clavier

2 Tester si la premiegravere valeur saisie est plus grande que la seconde

a Si tel est le cas

ndash afficher dans lrsquoordre croissant en affichant la seconde valeur saisie puis lapremiegravere

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la premiegraverevaleur

Opeacuterateur Signification

ampamp||

NON logiqueET logiqueOU logique

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

68

b Sinon

ndash afficher dans lrsquoordre croissant en affichant la premiegravere valeur saisie puis laseconde

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la secondevaleur

3 Afficher la plus grande des valeurs

Nous devons dans un premier temps deacuteclarer trois variables entiegraveres deux pour lesvaleurs agrave saisir et une pour stocker la plus grande des deux Nous eacutecrivons lrsquoinstructionde deacuteclaration suivante

int premiegravere deuxiegraveme laPlusGrande

1 La saisie des deux valeurs est ensuite reacutealiseacutee par (voir le chapitre 2 laquo Communiquerune information raquo)

Systemoutprint(Entrer une valeur ) premiegravere = Lirei() Systemoutprint(Entrer une deuxieme valeur ) deuxiegraveme = Lirei()

2 Pour tester si la premiegravere valeur saisie est plus grande que la seconde lrsquoinstructionif srsquoeacutecrit

if (premiegravere gt deuxiegraveme)

a Deux instructions composent ce test lrsquoaffichage dans lrsquoordre croissant puis lestockage de la plus grande valeur Il est donc neacutecessaire de les placer dans un blocdeacutefini par une ouvrante et une fermante

Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(deuxiegraveme + + premiegravere) Stocker la plus grande dans une variable speacutecifique laPlusGrande = premiegravere

b De la mecircme faccedilon le cas contraire est deacutecrit par lrsquoinstruction else et est composeacutede deux instructions Nous avons donc

else Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(premiegravere + + deuxiegraveme) Stocker la plus grande dans une variable speacutecifique laPlusGrande = deuxiegraveme

3 Nous affichons enfin la plus grande valeur par lrsquoinstruction

Systemoutprintln(La plus grande valeur est + laPlusGrande)

Ce message est afficheacute dans tous les cas et lrsquoinstruction est donc placeacutee en dehors detoute structure conditionnelle

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

69

Pour finir le programme est placeacute dans une fonction main() et une classe que nousappelons Maximum puisqursquoil srsquoagit ici de trouver la valeur maximale de deux valeurs Decette faccedilon le programme peut ecirctre compileacute et exeacutecuteacute

Exemple code source complet

public class Maximum Le fichier srsquoappelle Maximumjava public static void main (String [] parametre) int premiegravere deuxiegraveme laPlusGrande Systemoutprintln(Entrer une valeur ) premiegravere = Lirei() Systemoutprintln(Entrer une deuxieme valeur ) deuxiegraveme = Lirei() if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere else Systemoutprintln(premiegravere + + deuxiegraveme) laPlusGrande = deuxiegraveme Systemoutprintln(La plus grande valeur est + laPlusGrande) Fin du main () Fin de la Class Maximum

Reacutesultat de lrsquoexeacutecution

(Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur)

Entrer une valeur 33Entrer une deuxieme valeur 553 5La plus grande valeur est 5

La premiegravere valeur eacutetant plus petite que la seconde le programme exeacutecute les instruc-tions placeacutees dans le bloc else

Deux erreurs agrave eacuteviterDeux types drsquoerreurs sont agrave eacuteviter par le programmeur deacutebutant Il srsquoagit des erreursissues drsquoune mauvaise construction des blocs if ou else et drsquoun placement incorrect dupoint-virgule

La construction de blocs

Reprenons lrsquoexemple preacuteceacutedent en lrsquoeacutecrivant comme suit

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

70

else Systemoutprintln(premiegravere+ +deuxiegraveme) laPlusGrande = deuxiegraveme

En exeacutecutant pas agrave pas cet extrait de programme nous remarquons qursquoil nrsquoy a pasdrsquoaccolade () ouvrante derriegravere lrsquoinstruction if Cette derniegravere ne possegravede donc pas debloc composeacute de plusieurs instructions Seule lrsquoinstruction drsquoaffichageSystemoutprintln(deuxiegraveme + + premiegravere) se situe dans if Lrsquoexeacutecutiondrsquoif srsquoachegraveve donc juste apregraves lrsquoaffichage des valeurs dans lrsquoordre croissant

Ensuite lrsquoinstruction lePlusGrand = premiegravere est theacuteoriquement exeacutecuteacutee en dehorsde toute condition Cependant lrsquoinstruction suivante est else alors que lrsquoinstruction ifsrsquoest acheveacutee preacuteceacutedemment Le compilateur ne peut attribuer ce else agrave un if Il y adonc erreur de compilation du type rsquoelsersquo without rsquoifrsquo

De la mecircme faccedilon il y a erreur de compilation lorsque le programme est construit sur laforme suivante

if (premiegravere gt deuxiegraveme) Leplusgrand = premiegravere else

Le point-virgule

Dans le langage Java le point-virgule constitue une instruction agrave part entiegravere qui repreacute-sente lrsquoinstruction vide Par conseacutequent eacutecrire le programme suivant ne provoqueaucune erreur agrave la compilation

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere)

Lrsquoexeacutecution de cet extrait de programme a pour reacutesultat

Si premiegravere est plus grand que deuxiegraveme lrsquoordinateur exeacutecute le (point-virgule) situeacuteimmeacutediatement apregraves la condition crsquoest-agrave-dire rien Lrsquoinstruction if est termineacutee puisqursquoilnrsquoy a pas drsquoaccolades ouvrante et fermante Seule lrsquoinstruction est soumise agrave if

Le message affichant les valeurs par ordre croissant ne fait pas partie du test Il est doncafficheacute quelles que soient les valeurs de premiegravere et deuxiegraveme

Des if-else imbriqueacutes Dans le cas de choix arborescents ndash un choix eacutetant fait drsquoautres choix sont agrave faire etainsi de suite ndash il est possible de placer des structures if-else agrave lrsquointeacuterieur drsquoif-elseOn dit alors que les structures if-else sont imbriqueacutees les unes dans les autres

Lorsque ces imbrications sont nombreuses il est possible de les repreacutesenter agrave lrsquoaide drsquoungraphique de structure arborescente dont voici un exemple

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

71

Quand il y a moins drsquoelse que drsquoif Une instruction if peut ne pas contenir drsquoinstruction else Dans de tels cas il peutparaicirctre difficile de savoir agrave quel if est associeacute le dernier else Comparons les deuxexemples suivants

Imbrications drsquoif else Repreacutesentation du choix arborescent

if (Condition 1) if (Condition 2) instruction A else instruction B else instruction C

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else

instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

72

Du premier au deuxiegraveme exemple par le jeu des fermetures drsquoaccolades le dernier blocelse est deacuteplaceacute drsquoun bloc vers le haut Ce deacuteplacement modifie la structure arbores-cente Les algorithmes associeacutes ont des reacutesultats totalement diffeacuterents

Pour deacuteterminer une relation if-else remarquons qursquoun laquo bloc else raquo se rapportetoujours au dernier laquo bloc if raquo rencontreacute auquel un else nrsquoa pas encore eacuteteacute attribueacute

Les blocs if et else eacutetant deacutelimiteacutes par les accolades ouvrantes et fermantes il est conseilleacutepour eacuteviter toute erreur de bien relier chaque parenthegravese ouvrante avec sa fermante

Lrsquoinstruction switch ou comment faire des choix multiplesLorsque le nombre de choix possible est plus grand que deux lrsquoutilisation de la structureif-else devient rapidement fastidieuse Les imbrications des blocs demandent agrave ecirctreveacuterifieacutees avec preacutecision sous peine drsquoerreur de compilation ou drsquoexeacutecution

Crsquoest pourquoi le langage Java propose lrsquoinstruction switch (traduire par selon ousuivant) qui permet de programmer des choix multiples selon une syntaxe plus claire

Construction du switchLrsquoeacutecriture de lrsquoinstruction switch obeacuteit aux regravegles de syntaxe suivantes

switch (valeur) case eacutetiquette 1 Une ou plusieurs instructions

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

73

break case eacutetiquette 2 case eacutetiquette 3 Une ou plusieurs instructions break default Une ou plusieurs instructions

La variable valeur est eacutevalueacutee Suivant cette valeur le programme recherche lrsquoeacutetiquettecorrespondant agrave la valeur obtenue et deacutefinie agrave partir des instructions case eacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variable valeuril exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrer le mot-cleacutebreak

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecute lesinstructions de lrsquoeacutetiquette default

Drsquoune maniegravere geacuteneacuterale remarquons que

bull Le type de la variable valeur ne peut ecirctre que char ou int byte short ou long Ilnrsquoest donc pas possible de tester des valeurs reacuteelles ou des mots

bull Une eacutetiquette peut contenir aucune une ou plusieurs instructions

bull Lrsquoinstruction break permet de sortir du bloc switch Srsquoil nrsquoy a pas de break pour uneeacutetiquette donneacutee le programme exeacutecute les instructions de lrsquoeacutetiquette suivante

Calculer le nombre de jours drsquoun mois donneacutePour mettre en pratique les notions theacuteoriques abordeacutees agrave la section preacuteceacutedente nousallons eacutecrire un programme qui calcule et affiche le nombre de jours drsquoun mois donneacute

Le nombre de jours dans un mois peut varier entre les valeurs 28 29 30 ou 31 suivant lemois et lrsquoanneacutee Les mois de janvier mars mai juillet aoucirct octobre et deacutecembre sont desmois de 31 jours Les mois drsquoavril juin septembre et novembre sont des mois de 30 joursSeul le mois de feacutevrier est particulier puisque son nombre de jours est de 29 jours pour lesanneacutees bissextiles et de 28 jours dans le cas contraire Sachant cela nous devons

bull Demander la saisie au clavier du numeacutero du mois ainsi que de lrsquoanneacutee rechercheacutee

bull Creacuteer autant drsquoeacutetiquettes qursquoil y a de mois dans une anneacutee crsquoest-agrave-dire 12 Comptetenu du fonctionnement de la structure switch chaque eacutetiquette est une valeur entiegraverecorrespondant au numeacutero du mois de lrsquoanneacutee (1 pour janvier 2 pour feacutevrier etc)

bull Regrouper les eacutetiquettes relatives aux mois agrave 31 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Regrouper les eacutetiquettes relatives aux mois agrave 30 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Pour lrsquoeacutetiquette relative au mois de feacutevrier tester la valeur de lrsquoanneacutee pour savoir silrsquoanneacutee concerneacutee est bissextile ou non Une anneacutee est bissextile tous les quatre anssauf lorsque le milleacutesime est divisible par 100 et non pas par 400 En drsquoautres termespour qursquoune anneacutee soit bissextile il suffit que lrsquoanneacutee soit un nombre divisible par 4 et

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

74

non divisible par 100 ou alors par 400 Dans tous les autres cas lrsquoanneacutee nrsquoest pasbissextile

Compte tenu de toutes ces remarques nous devons dans un premier temps deacuteclarer troisvariables entiegraveres une pour repreacutesenter le mois la deuxiegraveme lrsquoanneacutee et la troisiegraveme lenombre de jours par mois Sachant que le mois et le nombre de jours par mois ne deacutepas-sent jamais la valeur 127 nous pouvons les deacuteclarer de type byte Pour lrsquoanneacutee le typeshort suffit (agrave moins drsquoecirctre tregraves optimiste et de vouloir eacuteviter le bug de lrsquoan 32767 )puisque les valeurs de ce type peuvent aller jusqursquoagrave 32767

Exemple code source complet

public class JourParMois Le fichier srsquoappelle JourParMoisjava public static void main (String [] parametre) byte mois nbjours = 0 short anneacutee Systemoutprintln(De quel mois srsquoagit-il ) mois = Lireb() Systemoutprintln(De quelle annee ) anneacutee = Lires() switch(mois) case 1 case 3 Pour les mois agrave 31 jours case 5 case 7 case 8 case 10 case 12 nbjours = 31 break case 4 case 6 Pour les mois agrave 30 jours case 9 case 11 nbjours = 30 break case 2 Pour le cas particulier du mois de feacutevrier if (anneacutee 4 == 0 ampamp anneacutee 100 = 0 || anneacutee 400 == 0) nbjours = 29 else nbjours = 28 break default En cas drsquoerreur de frappe Systemoutprintln(Impossible ce mois nrsquoexiste pas ) Systemexit(0) Systemoutprint( En + annee + le mois ndeg + mois) Systemoutprintln( a + nbjours + jours ) Fin du main() Fin de la class JourParMois

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

75

Exeacutecution 1

De quel mois srsquoagit-il 55De quelle annee 11999999En 1999 le mois ndeg 5 a 31 jours

Le programme recherche lrsquoeacutetiquette 5 Il exeacutecute les instructions qui suivent jusqursquoagraverencontrer un break Pour lrsquoeacutetiquette 5 le programme exeacutecute les instructions deseacutetiquettes 7 8 10 et 12 car ces eacutetiquettes ne possegravedent ni instructions ni break Seulelrsquoeacutetiquette 12 possegravede une instruction qui affecte la valeur 31 agrave la variable nbjoursLrsquoinstruction break qui suit permet de sortir de la structure switch Le programmeexeacutecute enfin lrsquoinstruction situeacutee immeacutediatement apregraves le switch crsquoest-agrave-dire lrsquoaffichagedu message annonccedilant le reacutesultat

Exeacutecution 2

De quel mois srsquoagit-il 22De quelle annee 22000000En 2000 le mois ndeg 2 a 29 jours

Ici le programme va directement agrave lrsquoeacutetiquette 2 qui est composeacutee drsquoun test sur lrsquoanneacuteepour savoir si lrsquoanneacutee est bissextile Une anneacutee est bissextile lorsque son milleacutesime estdivisible par 4 agrave lrsquoexception des anneacutees dont le milleacutesime est divisible par 100 et non paspar 400 La valeur 2000 est divisible par 4 100 et 400 puisque le reste de la divisionentiegravere () de 2000 par 4 100 ou 400 est nul La variable nbjours prend donc la valeur29 Le programme sort ensuite du switch gracircce agrave lrsquoinstruction break qui suit et exeacutecutepour finir lrsquoaffichage du reacutesultat

Exeacutecution 3

De quel mois srsquoagit-il 1155De quelle annee 11999999Impossible ce mois nrsquoexiste pas

Lrsquoeacutetiquette 15 nrsquoeacutetant pas deacutefinie dans le bloc switch le programme exeacutecute les instruc-tions qui composent lrsquoeacutetiquette default Le programme affiche un message drsquoerreur ettermine son exeacutecution gracircce agrave lrsquoinstruction Systemexit(0)

Remarquons que gracircce agrave lrsquoeacutetiquette default le programme connaicirct les instructions agraveexeacutecuter dans le cas de choix laquo anormaux raquo (erreur de frappe par exemple ou valeursaisie nrsquoentrant pas dans lrsquointervalle des valeurs possibles traiteacutees par le programme) Decette faccedilon il devient possible de preacutevenir drsquoeacuteventuelles erreurs pouvant causer lrsquoarrecirctbrutal de lrsquoexeacutecution du programme

Comment choisir entre if-else et switch

La structure switch ne permet de tester que des eacutegaliteacutes de valeurs entiegraveres (byte shortint ou long) ou de type caractegravere (char) Elle ne peut donc pas ecirctre utiliseacutee pour

bull Tester des valeurs reacuteelles (float ou double) ou des mots (String)

bull Rechercher si la valeur est plus grande plus petite ou diffeacuterente drsquoune certaine eacutetiquettecopy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

76

Par contre lrsquoinstruction if-else peut ecirctre employeacutee dans tous les cas en testant tout typede variable selon toute condition

Remarquons cependant que

bull Si une condition parmi drsquoautres conditions envisageacutees a une plus grande probabiliteacutedrsquoecirctre satisfaite celle-ci doit ecirctre placeacutee en premier test dans une structure if else defaccedilon agrave eacuteviter agrave lrsquoordinateur drsquoeffectuer de trop nombreux tests inutiles

bull Si toutes les conditions ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees lastructure switch est plus efficace Elle ne demande qursquoune seule eacutevaluation alors quedans les instructions if-else imbriqueacutees chaque condition doit ecirctre eacutevalueacutee

ReacutesumeacuteLrsquoinstruction if else (traduction si sinon) permet de programmer des choix Defaccedilon geacuteneacuterale lrsquoinstruction if else srsquoeacutecrit

bull Si la condition situeacutee apregraves le mot-cleacute if (placeacutee obligatoirement entre paren-thegraveses) est vraie alors les instructions placeacutees dans le bloc deacutefini par les accoladesouvrante et fermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves lemot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs est exeacutecuteacute selon que la condition est veacuterifieacuteeou non De plus cette condition fait intervenir des

bull Opeacuterateurs relationnels

if (condition)

si la condition est vraie

faire

plusieurs instructions

fait

else sinon

faire

plusieurs instructions

fait

Ou encore

if (condition) une seule instruction

else une seule instruction

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt= =

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

77

ExercicesComprendre les niveaux drsquoimbrication

Exeacutecutez agrave la main (crsquoest-agrave-dire ligne par ligne) ce programme Pour cela voussupposerez que la valeur saisie au clavier soit 4 Quel est le reacutesultat afficheacute

public class Racine public static void main (String [] parametre) double x r

bull Opeacuterateurs logiques

Lorsque plusieurs instructions if-else sont imbriqueacutees les unes dans les autres unelse se rapporte toujours au dernier bloc if rencontreacute auquel un else nrsquoa pas encoreeacuteteacute attribueacute

Lrsquoinstruction switch (traduction selon ou suivant) permet de programmer deschoix multiples Elle a pour syntaxe

switch(valeur) le type de la variable est char ou int case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch default suite drsquoinstructions

La variable valeur est eacutevalueacutee Suivant cette eacutevaluation le programme recherchelrsquoeacutetiquette correspondant agrave la valeur eacutevalueacutee et deacutefinie agrave partir des instructions caseeacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variablevaleur il exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrerle mot-cleacute break

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecuteles instructions de lrsquoeacutetiquette default

Lrsquoinstruction if-else est utiliseacutee lorsque lrsquoune des conditions envisageacutees a unegrande probabiliteacute drsquoecirctre satisfaite Si toutes les conditions ont une probabiliteacute drsquoecirctrereacutealiseacutees on utilise plutocirct la structure switch

Opeacuterateur Signification

NON logique

ampamp ET logique

|| OU logique

31

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

78

Systemoutprint(Entrer un chiffre ) x = Lired() if (x gt = 0) r = Mathsqrt(x) else r = Mathsqrt(-x) Systemoutprint(Pour +x+ Le resultat est +r) Fin du main () Fin de la Class Racine

Mecircme question en supposant la valeur saisie eacutegale agrave ndash 9

Construire une arborescence de choixReprenez et modifiez le programme Maximum donneacute dans ce chapitre de faccedilon qursquoilaffiche un message lorsque les deux valeurs saisies au clavier sont eacutegales

Repreacutesentez graphiquement les choix arborescents suivants

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

Eacutecrivez un programme qui reacutesolve les eacutequations du second degreacute agrave lrsquoaide de struc-tures if-else imbriqueacutees

Soit lrsquoeacutequation ax2 + bx + c = 0 ougrave a b et c repreacutesentent les trois coefficientsentiers de lrsquoeacutequation Pour trouver les solutions reacuteelles x si elles existent

a Eacutetablissez lrsquoarbre des choix associeacutes

1 a = 0 11 b = 0 111 c = 0 tout reacuteel est solution

32

33

34

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

79

112 c = 0 pas de solution 12 b = 0 une seule solution x = - c b 2 a = 0 21 b2 - 4ac gt= 0 deux solutions x1 = - b + Mathsqrt(b b ndash 4 a c) 2 a x2 = - b - Mathsqrt(b b ndash 4 a c) 2 a 22 b2 - 4ac lt 0 pas de solution dans les reacuteels

b Deacuteterminez les diffeacuterentes variables agrave deacuteclarer

c Agrave partir de lrsquoarbre des choix eacutecrivez les instructions if-else suivies du testcorrespondant

d Placez dans chaque bloc if ou else les instructions de calcul et drsquoaffichageapproprieacutees

e Placez lrsquoensemble de ces instructions dans une fonction main() et une classeportant le nom SecondDegre

Manipuler les choix multiples geacuterer les caractegraveresEn utilisant la structure switch eacutecrire un programme qui simule une machine agravecalculer dont les opeacuterations soient lrsquoaddition (+) la soustraction (ndash) la multiplica-tion () et la division ()

a En cours drsquoexeacutecution le programme demande agrave lrsquoutilisateur drsquoentrer deuxvaleurs numeacuteriques puis le caractegravere correspondant agrave lrsquoopeacuteration agrave effectuerSuivant le caractegravere entreacute (+ndash) le programme affiche lrsquoopeacuteration effectueacuteeainsi que le reacutesultat

Lrsquoexeacutecution du programme peut par exemple avoir lrsquoallure suivante (les valeursgriseacutees sont celles saisies par lrsquoutilisateur)

Entrez la premiere valeur 22Entrez la seconde valeur 33Type de lrsquooperation (+ - ) Cette operation a pour resultat 2 3 = 6

b Apregraves avoir eacutecrit et exeacutecuteacute le programme avec diffeacuterentes valeurs saisissezdans cet ordre les valeurs suivantes 2 0 puis Que se passe-t-il Pourquoi

c Modifiez le programme de faccedilon agrave ne plus rencontrer cette situation en coursdrsquoexeacutecution

Le projet laquo Gestion drsquoun compte bancaire raquoAcceacuteder agrave un menu suivant lrsquooption choisieLrsquoobjectif est drsquoameacuteliorer le programme reacutealiseacute agrave la fin du chapitre 2 laquo Communiquerune information raquo afin drsquoafficher chaque menu en fonction de lrsquooption choisie par lrsquoutili-sateur

a Apregraves lrsquoaffichage du menu principal le programme teste la valeur entreacutee par lrsquoutili-sateur et affiche lrsquooption correspondante Sachant que toutes les options du menu

35

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

80

principal ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees quelle est lastructure de test la plus approprieacutee

b Modifiez le programme en fonction de la structure de test choisi et placez lesinstructions drsquoaffichage et de saisie dans les options correspondantes

c Pour lrsquooption 1 testez le type du compte afin de saisir le taux drsquoeacutepargne

d Pour lrsquooption 2 demandez au programme de veacuterifier que le numeacutero du compte saisipar lrsquoutilisateur existe de faccedilon agrave

bull Afficher le numeacutero du compte le type la valeur initiale et son taux dans le casdrsquoun compte drsquoeacutepargne si le compte existe

bull Afficher un message indiquant que le numeacutero du compte nrsquoest pas valide si lecompte nrsquoexiste pas

copy copyright Eacuteditions Eyrolles

4Faire des reacutepeacutetitions

La notion de reacutepeacutetition est une des notions fondamentales de la programmation En effetbeaucoup de traitements informatiques sont reacutepeacutetitifs Par exemple la creacuteation drsquounagenda eacutelectronique neacutecessite de saisir un nom un preacutenom et un numeacutero de teacuteleacutephoneautant de fois qursquoil y a de personnes dans lrsquoagenda

Dans de tels cas la solution nrsquoest pas drsquoeacutecrire un programme qui comporte autantdrsquoinstructions de saisie qursquoil y a de personnes mais de faire reacutepeacuteter par le programme lejeu drsquoinstructions neacutecessaires agrave la saisie drsquoune seule personne Pour ce faire le program-meur utilise des instructions speacutecifiques appeleacutees structures de reacutepeacutetition ou bouclesqui permettent de deacuteterminer la ou les instructions agrave reacutepeacuteter

Dans ce chapitre nous abordons la notion de reacutepeacutetition agrave partir drsquoun exemple imageacute(laquo Combien de sucre dans votre cafeacute raquo)

Nous eacutetudions ensuite les diffeacuterentes structures de boucles proposeacutees par le langage Java(sections laquo La boucle dowhile raquo laquo La boucle while raquo et laquo La boucle for raquo) Pourchacune de ces structures nous preacutesentons et analysons un exemple afin drsquoexaminer lesdiffeacuterentes techniques de programmation associeacutees aux structures reacutepeacutetitives

Combien de sucre dans votre cafeacute

Pour bien comprendre la notion de reacutepeacutetition ou de boucle nous allons ameacuteliorer lrsquoalgo-rithme du cafeacute chaud sucreacute de sorte que le programme demande agrave lrsquoutilisateur deprendre un morceau de sucre autant de fois qursquoil le souhaite Pour cela nous reprenonsuniquement le bloc drsquoinstructions II Preacuteparer le sucre (voir au chapitre 3 laquo Fairedes choix raquo la section laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

82

Lrsquoexeacutecution du bloc drsquoinstructions II Preacuteparer le sucre nous permet de mettre un seulmorceau de sucre dans la tasse Si nous deacutesirons mettre plus de sucre nous devonsexeacutecuter les instructions 3 et 4 autant de fois que nous souhaitons de morceaux de sucreRemarquons que dans ce bloc les instructions 1 et 2 ne sont pas agrave reacutepeacuteter sous peinedrsquoavoir autant de petites cuillegraveres que de morceaux de sucre dans la tasse La marche agravesuivre devient degraves lors

Prendre une petite cuillegravere Poser la petite cuillegravere dans la tasseDeacutebut reacutepeacuteter 1 Prendre un morceau de sucre 2 Poser le sucre dans la tasse 3 Poser la question Souhaitez-vous un autre morceau de sucre 4 Attendre la reacuteponseTant que la reacuteponse est OUI retourner agrave Deacutebut reacutepeacuteter

Analysons les reacutesultats possibles de cette nouvelle marche agrave suivre

bull Dans tous les cas nous prenons et posons une petite cuillegravere

bull Ensuite nous entrons sans condition dans une structure de reacutepeacutetition

bull Nous prenons et posons un morceau de sucre quelle que soit la suite des opeacuterationsDe cette faccedilon si nous sortons de la boucle le cafeacute est quand mecircme sucreacute

bull Puis le programme nous demande si nous souhaitons agrave nouveau un morceau de sucre

bull Si notre reacuteponse est OUI le programme retourne au deacutebut de la structure reacutepeacutetitiveplace le sucre dans la tasse et demande de nouveau si nous souhaitons du sucre etc

bull Si la reacuteponse est neacutegative la reacutepeacutetition srsquoarrecircte ainsi que la marche agrave suivre

Pour eacutecrire une boucle nous constatons que

bull Il est neacutecessaire de deacuteterminer ougrave se trouve le deacutebut de la boucle et ougrave se situe la fin(Deacutebut reacutepeacuteter et Tant que pour notre exemple)

bull La sortie de la structure reacutepeacutetitive est soumise agrave la reacutealisation ou non drsquoune condition(la reacuteponse fournie est-elle affirmative ou non )

bull Le reacutesultat du test de sortie de boucle est modifiable par une instruction placeacutee agrave lrsquointeacute-rieur de la boucle (la valeur de la reacuteponse est modifieacutee par lrsquoinstruction 4 Attendrela reacuteponse)

Dans le langage informatique la construction drsquoune reacutepeacutetition ou boucle suit le mecircmemodegravele

Instructions Bloc drsquoinstructions

Si (cafeacute sucreacute)

1 Prendre une petite cuillegravere

2 Poser la petite cuillegravere dans la tasse

3 Prendre un morceau de sucre

4 Poser le sucre dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

83

Dans le langage Java il existe trois types de boucles qui sont deacutecrites par les construc-tions suivantes

Dans la suite de ce chapitre nous allons pour chacune de ces boucles

bull Eacutetudier la syntaxe

bull Analyser les principes de fonctionnement

bull Donner un exemple qui introduise un concept fondamental de la programmation agravesavoir le compteur de boucle lrsquoaccumulation de valeurs ou la recherche drsquoune donneacuteeparmi un ensemble drsquoinformations

La boucle dowhile La boucle dohellipwhile est une structure reacutepeacutetitive dont les instructions sont exeacutecuteacuteesavant mecircme de tester la condition drsquoexeacutecution de la boucle Pour construire une tellestructure il est neacutecessaire de suivre les regravegles de syntaxe deacutecrites ci-apregraves

Syntaxe La boucle dohellipwhile se traduit par les termes faire tant que Cette structure srsquoeacutecritde deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit de la faccedilonsuivante

do une seule instruction while (expression conditionnelle)

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave commence et se termine laboucle

do plusieurs instructions while (expression conditionnelle)

Principes de fonctionnementAinsi deacutecrite la boucle dohellipwhile srsquoexeacutecute selon les principes suivants

bull Les instructions situeacutees agrave lrsquointeacuterieur de la boucle sont exeacutecuteacutees tant que lrsquoexpressionconditionnelle placeacutee entre parenthegraveses() est vraie

Type de boucle Signification

dowhile

while

for

Faire tant queTant que Pour

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

84

bull Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression conditionnelleest examineacutee en fin de boucle apregraves exeacutecution des instructions

bull Si la condition mentionneacutee entre parenthegraveses reste toujours vraie les instructions de laboucle sont reacutepeacuteteacutees agrave lrsquoinfini On dit que le programme laquo boucle raquo

bull Une instruction modifiant le reacutesultat du test de sortie de boucle est placeacutee agrave lrsquointeacuterieurde la boucle de faccedilon agrave stopper les reacutepeacutetitions au moment souhaiteacute

bull Remarquons qursquoun point-virgule est placeacute agrave la fin de lrsquoinstruction while (expres-sion)

Un distributeur automatique de cafeacuteLrsquoobjectif de cet exemple est double apprendre agrave construire une boucle dohellipwhile eteacutetudier comment compter et accumuler des valeurs

Le comptage des valeurs quelles qursquoelles soient est une technique tregraves utiliseacutee en infor-matique Il existe deux faccedilons de compter

bull Le comptage drsquoun certain nombre de valeurs Par exemple le programme compte lenombre de notes drsquoun eacutetudiant

bull Lrsquoaccumulation de valeurs Le programme calcule la somme des notes drsquoun eacutetudiant(les notes sont accumuleacutees)

Le calcul de la moyenne des notes drsquoun eacutetudiant srsquoeffectue en divisant lrsquoaccumulationdes notes par le nombre (comptage) de notes obtenues

Pour bien comprendre ces diffeacuterentes techniques nous allons eacutecrire un programme dontlrsquoobjectif est de simuler de faccedilon simplifieacutee un distributeur automatique de cafeacute

Cahier des charges

Pour obtenir un cafeacute lrsquoutilisateur introduit un certain nombre de piegraveces de monnaie dansle distributeur Pour simplifier nous supposons que lrsquoappareil nrsquoaccepte que les piegraveces de1 2 et 5 F Lorsqursquoune piegravece est introduite le distributeur affiche la valeur totaleengageacutee ainsi que le nombre de piegraveces par cateacutegorie (nombre de piegraveces de 1 F 2 F et5 F) La machine preacutepare un cafeacute degraves que la somme totale introduite vaut ou deacutepasse leprix du cafeacute Nous prenons pour hypothegravese que le prix drsquoun cafeacute soit de 3 F La machinerend la monnaie srsquoil y a lieu

Apregraves lecture et analyse du cahier des charges nous remarquons que la deacutemarche sedeacuteroule en trois temps

1 Introduction une agrave une des piegraveces dans le distributeur

2 Agrave chaque piegravece fournie calcul et affichage

a Du nombre de piegraveces de 1 F 2 F et 5 F

b De la somme engageacutee

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

b Oui alors preacuteparer le cafeacute et rendre la monnaie copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

85

Pour eacutecrire le programme nous allons nous attacher agrave reacutesoudre dans lrsquoordre chacun deces points

1 Construire la boucle et introduire les piegraveces

Les points 1 et 3a deacutecrivent la structure de la boucle Lrsquointroduction des piegraveces dansle distributeur est une opeacuteration reacutepeacutetitive qui srsquoarrecircte lorsque lrsquoutilisateur a placeacutesuffisamment drsquoargent dans le distributeur crsquoest-agrave-dire lorsque le montant totalengageacute vaut ou deacutepasse la somme de 3 F Par conseacutequent lrsquoallure geacuteneacuterale de lastructure reacutepeacutetitive est la suivante

Deacutebut reacutepeacuteter Entrer une piegravece de monnaie Compter la somme engageacuteeTant que la somme engageacutee ne deacutepasse pas 3 F retourner agrave Deacutebut reacutepeacuteter

En langage Java cette structure est traduite en reprenant la syntaxe de la boucledohellipwhile crsquoest-agrave-dire par

do Deacutebut de boucle Entrer les piegraveces de monnaie Compter la somme engageacuteewhile (somme engageacutee lt 3 F) Fin de boucle

De cette faccedilon la boucle est exeacutecuteacutee tant que la somme engageacutee est infeacuterieure agrave 3 FDegraves que cette somme vaut ou deacutepasse 3 F la condition somme engageacutee lt 3 F nrsquoestplus veacuterifieacutee et le programme sort de la boucle

Ensuite pour simuler lrsquointroduction des piegraveces de monnaie dans le distributeur leprogramme demande agrave lrsquoutilisateur de saisir au clavier la valeur de chaque piegraveceentreacutee Nous eacutecrivons donc

Systemoutprintln(valeur de la piece entree )piegravece = Lireb()

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

2 Compter le nombre de piegraveces et la somme totale engageacutee

Pour compter le nombre de piegraveces de 1 F 2 F et 5 F le programme doit pouvoirdistinguer les diffeacuterentes piegraveces introduites Pour cela nous deacuteclarons autant devariables qursquoil y a de cateacutegories de piegraveces soit

byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece totalReccedilu = 0

Les variables dont le nom commence par nb repreacutesentent le nombre de piegraveces pourchacune des cateacutegories La variable piegravece deacutesigne quant agrave elle la valeur de la piegravecesaisie au clavier Enfin la variable totalReccedilu repreacutesente la somme totale engageacutee encours drsquoexeacutecution de la boucle Ces variables sont deacuteclareacutees de type byte (leurvaleur ne deacutepasse jamais 127)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

86

a Pour compter seacutepareacutement les piegraveces de 1 F de 2 F et de 5 F la meilleure meacutethodeconsiste agrave placer dans la boucle dohellipwhile une structure switch distinguant troiscas

switch (piegravece) case 1 Compter les piegraveces de 1 F break case 2 Compter les piegraveces de 2 F break case 5 Compter les piegraveces de 5 F break default Systemoutprintln (Piece impossible)

Suivant la valeur de la piegravece engageacutee le programme compte le nombre de piegravecespour chacune des cateacutegories en utilisant une instruction du type

a = a + 1

ougrave a repreacutesente lrsquoobjet agrave compter Si la variable a est initialiseacutee agrave 0 la nouvellevaleur de a apregraves affectation vaut 1

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Quelquesconfusions agrave eacuteviter raquo

Placeacute dans une structure reacutepeacutetitive le nombre drsquoobjets repreacutesenteacutes par a augmentede 1 agrave chaque tour de boucle En informatique on dit que a est increacutementeacute de 1Pour compter le nombre de piegraveces de 1 F 2 F et 5 F il suffit de remplacer la varia-ble a par nbPiegravece1F nbPiegravece2F ou nbPiegravece5F Nous obtenons ainsi pour chaquecateacutegorie de piegraveces les instructions suivantes

nbPiegravece1F = nbPiegravece1F + 1nbPiegravece2F = nbPiegravece2F + 1nbPiegravece5F = nbPiegravece5F + 1

b Ces instructions sont ensuite placeacutees dans les eacutetiquettes 1 2 et 5 de la structure switch

Pour mieux comprendre lrsquoeacutevolution de la valeur de ces variables reportez-vous agrave la sectionlaquo Reacutesultat de lrsquoexeacutecution raquo

Pour calculer la somme engageacutee agrave chaque piegravece introduite la technique est leacutegegravere-ment diffeacuterente de la preacuteceacutedente En effet la somme engageacutee doit ecirctre augmenteacuteenon plus du nombre de piegraveces introduites mais de la valeur de la piegravece introduiteLrsquoincreacutement nrsquoest plus de 1 mais de la valeur de la piegravece Comme la variable piegravecerepreacutesente la valeur de la piegravece lrsquoinstruction drsquoaccumulation est la suivante

totalReccedilu = totalReccedilu + piegravece

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

87

Ainsi la variable totalReccedilu initialiseacutee agrave zeacutero augmente progressivement de lavaleur de chaque piegravece engageacutee par accumulation de la valeur preacuteceacutedente detotalReccedilu avec la valeur de la piegravece entreacutee

Ce calcul est reacutealiseacute quelle que soit la valeur de la piegravece Par conseacutequent cetteinstruction est placeacutee en dehors de la structure switch mais agrave lrsquointeacuterieur de laboucle Le montant total engageacute est modifieacute chaque fois qursquoune nouvelle piegravece de1 F 2 F ou 5 F est introduite

Pour eacuteviter drsquoaccumuler dans totalReccedilu la valeur drsquoune piegravece non autoriseacutee nousdevons modifier la valeur de la piegravece dans lrsquoeacutetiquette default de la structureswitch par lrsquoinstruction

default piegravece = 0 Systemoutprintln (Piece impossible)

Lorsqursquoune mauvaise piegravece est introduite la variable piegravece prend la valeur 0 Decette faccedilon lrsquoinstruction drsquoaccumulation est reacutealiseacutee quelle que soit la valeur dela piegravece puisque la variable totalReccedilu nrsquoest pas modifieacutee par lrsquoaccumulationdrsquoune piegravece valant 0 F

Pour mieux comprendre lrsquoeacutevolution de la valeur de la variable totalReccedilu reportez-vous agrave lasection laquo Reacutesultat de lrsquoexeacutecution raquo

Une fois le nombre de piegraveces compteacute et le montant total calculeacute le programmeaffiche les diffeacuterentes valeurs agrave lrsquoaide des instructions suivantes

Systemoutprintln(Vous avez entre )Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F)Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F)Systemoutprintln(Soit au total + totalReccedilu + F)

Lrsquoensemble de ces instructions est placeacute avant le test de sortie de boucle puisque lesvaleurs calculeacutees sont afficheacutees chaque fois que lrsquoutilisateur entre une piegravece

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

Il srsquoagit de deacuteterminer la condition de sortie ou non de la boucle Cette opeacuterationest deacutecrite au point 1

Remarquons cependant que gracircce agrave lrsquoinstruction drsquoaccumulationtotalReccedilu = totalReccedilu + piegravece

la valeur de la variable totalReccedilu est augmenteacutee agrave chaque tour de boucle Parconseacutequent le reacutesultat de la condition de sortie de boucle (totalReccedilu lt 3) nereste pas toujours vrai Le programme peut sortir de la boucle

b Oui alors preacuteparer le cafeacute et rendre la monnaie

Lorsque lrsquoutilisateur a entreacute suffisamment de piegraveces de monnaie le programmeaffiche un message qui annonce que le cafeacute est precirct agrave lrsquoaide de lrsquoinstruction

Systemoutprintln(Je vous verse 1 cafe )

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

88

Pour deacutetecter un trop-perccedilu le programme teste si totalReccedilu deacutepasse la valeur duprix du cafeacute Si tel est le cas il calcule la monnaie agrave rendre et affiche un messageen conseacutequence Ces actions sont reacutealiseacutees par les instructions

if (totalReccedilu gt 3)Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Exemple code source

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class CompteurMonnaie public static void main(String [] arg) byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece byte totalReccedilu = 0 Systemoutprintln(Pour obtenir un cafe entrez au moins 3 F) Systemoutprintln(Je rends la monnaie ) do Systemoutprintln(valeur de la piece entree ) piegravece = Lireb() switch (piegravece) case 1 nbPiegravece1F = nbPiegravece1F + 1 break case 2 nbPiegravece2F = nbPiegravece2F + 1 break case 5 nbPiegravece5F = nbPiegravece5F + 1 break default piegravece = 0 Systemoutprintln (Piece impossible) totalReccedilu = totalReccedilu + piegravece Systemoutprintln(Vous avez entre ) Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F) Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F) Systemoutprintln(Soit au total + totalReccedilu + F) while (totalReccedilu lt 3) Systemoutprintln(Je vous verse 1 cafe ) if (totalReccedilu gt 3)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

89

Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Reacutesultat de lrsquoexeacutecution

La boucle whileLe langage Java propose une autre structure reacutepeacutetitive analogue agrave la boucle dohellipwhilemais dont la deacutecision de poursuivre la reacutepeacutetition srsquoeffectue en deacutebut de boucle Il srsquoagitde la boucle while

Syntaxe

La boucle while srsquoeacutecrit de deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructionsqursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

while (expression conditionnelle) une seule instruction

Agrave lrsquoeacutecranpiegravece nb

Piegravece1Fnb

Piegravece2Fnb

Piegravece5FtotalReccedilu

Valeurs initiales au deacutebut de lrsquoexeacutecution - 0 0 0 0

Valeur de la piece entree 2Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

2 0 1car 0 + 1

0 2car 0 + 2

Valeur de la piece entree 10Piece impossible Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

10 0

0 1 0 2car2 + 0

Valeur de la piece entree 5Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 1 piece(s) de 5 FSoit au total 7 F

5 0 1 1car 0 + 1 = 1

7car 2 + 5

Je vous verse 1 cafeet vous rends 4 F

5 0 1 1 7

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

90

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave deacutebute et se termine la boucle

while (expression conditionelle) plusieurs instructions

Principes de fonctionnementLe terme while se traduit par tant que La structure reacutepeacutetitive srsquoexeacutecute selon les prin-cipes suivants

bull Tant que lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses reste vraie la ou les instructionscomposant la boucle sont exeacutecuteacutees

bull Le programme sort de la boucle degraves que lrsquoexpression agrave lrsquointeacuterieur des parenthegravesesdevient fausse

bull Une instruction est placeacutee agrave lrsquointeacuterieur de la boucle pour modifier le reacutesultat du test agravelrsquoentreacutee de la boucle de faccedilon agrave stopper les reacutepeacutetitions

bull Si lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses est fausse degraves le deacutepart les instructions nesont jamais exeacutecuteacutees

bull Observons qursquoagrave lrsquoinverse de la boucle dohellipwhile il nrsquoy a pas de point-virgule agrave la finde lrsquoinstruction while (expression)

Saisir un nombre entier au clavierLrsquoobjectif de cet exemple est drsquoapprendre agrave eacutecrire une boucle while et de comprendrecomment reacutealiser la saisie drsquoun entier au clavier telle qursquoelle est reacutealiseacutee dans leprogramme Lirejava

Nous avons deacutejagrave remarqueacute (voir au chapitre 2 laquo Communiquer une information raquo lasection laquo La saisie de donneacutees raquo) que la fonction Systeminread() ne permettait desaisir qursquoun seul caractegravere agrave la fois au clavier Pour saisir un nombre composeacute deplusieurs chiffres ou un mot constitueacute de plusieurs caractegraveres nous devons faire appel agravela fonction Systeminread() autant de fois qursquoil y a de caractegraveres agrave saisir

Cette saisie de caractegraveres est donc une opeacuteration reacutepeacutetitive qui doit srsquoarrecircter lorsque lavaleur numeacuterique ou le mot est entiegraverement entreacute Lrsquoordinateur nrsquoest pas agrave mecircme dedeacuteterminer quand la saisie est termineacutee Lrsquoutilisateur confirme qursquoil a fini drsquoentrer desvaleurs en appuyant sur une touche caracteacuteristique du clavier Cette touche utiliseacutee pourpasser agrave la ligne dans les logiciels de traitement de texte est communeacutement appeleacutee latouche laquo Entreacutee raquo

Notre but eacutetant de saisir une valeur numeacuterique entiegravere nous devons traduire lrsquoensembledes caractegraveres saisis de faccedilon agrave les stocker non plus dans un String mais dans unevariable de type int Si cette traduction nrsquoest pas reacutealiseacutee il nrsquoest pas possible drsquoaddi-tionner ou de diviser les caractegraveres lus agrave la maniegravere des valeurs numeacuteriques Par exemplele fait drsquoadditionner la suite de caractegraveres 123 avec la valeur 4 a pour reacutesultat 1234 Par

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

91

contre apregraves traduction des caractegraveres en valeur numeacuterique la mecircme opeacuteration donnepour reacutesultat 127

Cahier des charges

Nous venons de lrsquoobserver pour confirmer que nous nrsquoavons plus de caractegravere agrave saisirnous devons appuyer sur la touche laquo Entreacutee raquo du clavier Pour saisir une valeur numeacute-rique entiegravere la liste des opeacuterations srsquoexprime sous la forme de la structure reacutepeacutetitivesuivante

1 Tant que le caractegravere saisi nrsquoest pas le caractegravere laquo Entreacutee raquo

a Lire un caractegravere

b Stocker le caractegravere lu dans un mot

Retourner en 1

2 Tous les caractegraveres eacutetant saisis les traduire en un nombre entier

Pour eacutecrire le programme en langage Java reprenons cette marche agrave suivre point parpoint

1 La boucle tant que est traduite en Java par la construction suivante

while (C = rsquonrsquo) Lire un caractegravere au clavier Stocker le caractegravere dans un mot

En Java le caractegravere laquo Entreacutee raquo est symboliseacute par le caractegravere rsquonrsquo sur des ordina-teurs de type Unix ou Macintosh Sur un PC la touche laquo Entreacutee raquo correspond agrave laseacuterie de caractegraveres rsquorrsquo et rsquonrsquo Afin de rendre compatible le programme avec tousles ordinateurs nous allons tester la condition de sortie de boucle sur le caractegraverersquonrsquo puisque celui-ci est commun agrave tous les mondes qursquoils soient Unix Macintoshou PC De cette faccedilon en eacutecrivant while (C = rsquonrsquo) ougrave C repreacutesente le caractegraverelu nous exprimons en langage informatique la phrase tant que le caractegravere saisinrsquoest pas le caractegravere laquo Entreacutee raquo

La premiegravere fois que le programme entre dans la boucle aucun caractegravere nrsquoa encoreeacuteteacute saisi Il est donc neacutecessaire drsquoinitialiser la variable C agrave un caractegravere diffeacuterent dersquonrsquo de faccedilon agrave assurer que la condition drsquoentreacutee dans la boucle soit au moins veacuteri-fieacutee la premiegravere fois Pour cela nous deacuteclarons C en deacutebut de programme de la faccedilonsuivante

char C =rsquo0rsquo

Par cette instruction nous initialisons la variable C au caractegravere nul (rsquo0rsquo) Nousaurions pu lrsquoinitialiser agrave tout autre caractegravere agrave condition que celui-ci fucirct diffeacuterent dersquonrsquo Le choix du caractegravere nul nrsquoest ici reacutealiseacute que parce que en geacuteneacuteral les varia-bles de type entier ou reacuteel sont initialiseacutees agrave 0 ou 00 En Java le caractegravere rsquo0rsquo estlrsquoeacutequivalent de la valeur numeacuterique nulle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

92

a Pour lire un caractegravere au clavier lrsquoinstruction est la suivante

C = (char) Systeminread()

La fonction Systeminread() attend que lrsquoutilisateur appuie sur une touche duclavier Cela fait elle retourne en reacutesultat la valeur entiegravere correspondant aucaractegravere associeacute agrave la touche du clavier Pour traduire cette valeur entiegravere en codecaractegravere il est neacutecessaire de placer le cast (char) devant la fonction De cettefaccedilon la variable C contient le code Unicode du caractegravere saisi

b Stocker le caractegravere lu dans un mot

Lrsquoobjectif est de lire plusieurs caractegraveres drsquoaffileacutee Nous devons donc stocker dansune variable de type String chaque caractegravere au fur et agrave mesure de la saisie (voirau chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String uneapproche vers la notion drsquoobjet raquo) Gracircce au type String plusieurs caractegraverespeuvent ecirctre stockeacutes sous un mecircme nom de variable La meacutethode consiste agrave accu-muler dans une variable les valeurs lues en utilisant lrsquoinstruction

tmp = tmp + C

Cette instruction permet drsquoaccumuler les valeurs saisies en les placcedilant les unesderriegravere les autres dans la variable tmp En effet lorsque deux caractegraveres sont addi-tionneacutes ceux-ci sont placeacutes dans la variable lrsquoun apregraves lrsquoautre dans lrsquoordredrsquoexeacutecution de lrsquoopeacuteration Lrsquoaddition du caractegravere rsquoersquo et du caractegravere rsquotrsquo a pourreacutesultat le mot et Dans le jargon informatique lrsquoaddition de caractegraveres est aussiappeleacutee la concateacutenation de caractegraveres

En deacutebut de programme la variable tmp ne doit pas contenir de caractegravere Celavient du fait que la premiegravere fois qursquoun caractegravere lu est placeacute dans la variable tmpil doit correspondre au tout premier caractegravere du mot stockeacute dans la variable tmpCrsquoest pourquoi la variable tmp doit ecirctre deacuteclareacutee de la faccedilon suivante ( corres-pondant agrave un mot vide de caractegravere)

String tmp =

Lorsque au final lrsquoutilisateur appuie sur la touche laquo Entreacutee raquo pour valider la fin dela saisie le programme (sur PC) reccediloit la suite de caractegraveres rsquorrsquo et rsquonrsquo Lavariable tmp contient en deacutefinitive la suite des caractegraveres saisis plus les caractegraveresrsquorrsquo et rsquonrsquo Or nous souhaitons transformer cette suite de caractegraveres en valeurnumeacuterique Pour cela nous devons eacuteliminer les caractegraveres rsquorrsquo et rsquonrsquo qui empecirc-chent cette transformation

Pour plus drsquoinformations reportez-vous au paragraphe laquo 2 Traduire les caractegraveres en un nombreentier raquo un peu plus loin dans ce chapitre

Lrsquoaccumulation des caractegraveres ne se reacutealise donc qursquoagrave la condition que le caractegraveresaisi ne soit eacutegal ni agrave rsquorrsquo ni agrave rsquonrsquo

Pour reacutesumer la boucle srsquoeacutecrit

String tmp = char C =rsquo0rsquowhile (C = rsquonrsquo)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

93

C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

Pour mieux comprendre en pratique le deacuteroulement de cette boucle examinonslrsquoeacutevolution des variables agrave partir drsquoun exemple Nous supposons que lrsquoutilisateurentre les caractegraveres 2 8 et laquo Entreacutee raquo

c tmp Explication

String tmp = 0 - Initialisation

char C =rsquo0rsquo 0 Initialisation

while (C = rsquonrsquo)

0 C eacutetant initialiseacute au caractegravere lsquo0rsquo C est diffeacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 2 Le programme attend la saisie drsquoune valeur au cla-vier Nous supposons que le caractegravere saisi soit 2

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

2 2 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo la concateacute-nation est exeacutecuteacutee La variable tmp eacutetant initialiseacutee agrave la chaicircne vide () lrsquoopeacuteration + rsquo2rsquo stocke le caracegravere 2 en premiegravere position dans la variable tmp

2 2 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

2 2 La variable C contient la valeur 2 C est donc diffeacute-rent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 8 2 Nous entrons le caractegravere 8

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

8 28 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo lrsquoopeacuteration rsquo2rsquo + rsquo8rsquo est exeacutecuteacutee et stocke le mot 28 dans la variable tmp

8 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

8 28 La variable C contient le caractegravere 8 C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C=(char)Systeminread() r 28 Nous appuyons sur la touche laquo Entreacutee raquo Sur PC le premier caractegravere entreacute est rsquorrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp+C

r 28 C vaut rsquorrsquo La condition nrsquoeacutetant pas veacuterifieacutee il nrsquoy a pas accumulation du caractegravere dans tmp

r 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

r 28 La variable C contient le caractegravere r C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

94

2 Traduire les caractegraveres en un nombre entier

Pour traduire un ensemble de caractegraveres en une valeur numeacuterique le langage Javapropose un certain nombre de fonctions Dans notre cas il srsquoagit de traduire un moten une valeur entiegravere de type int La fonction Java IntegerparseInt() permet unetelle traduction Lrsquoinstruction est la suivante

valeur = IntegerparseInt(tmp)

valeur est une variable deacuteclareacutee de type int et tmp est le mot qui contient les carac-tegraveres agrave traduire La variable tmp ne doit contenir que des caractegraveres repreacutesentant deschiffres Si tel nrsquoest pas le cas le programme srsquoarrecircte avec un message drsquoerreur agravelrsquoexeacutecution Par exemple si lrsquoutilisateur entre le mot deux au lieux du caractegravere 2lrsquointerpreacuteteur Java affiche le message suivant

javalangNumberFormatException deuxat javalangIntegerparseInt (compiled Code)

Ce message indique que le format du nombre saisi ne correspond pas au formatattendu par la fonction IntegerparseInt() Nous aurions obtenu le mecircme typedrsquoerreur en stockant les caractegraveres rsquorrsquo ou rsquonrsquo dans la variable tmp

Pour connaicirctre les autres fonctions permettant de traduire une chaicircne de caractegraveresen valeur numeacuterique de type double float long ou byte vous pouvez consulter agravelrsquoaide drsquoun eacutediteur de texte le fichier Lirejava qui emploie toutes ces fonctions

Pour finir le programme affiche les diffeacuterents reacutesultats agrave lrsquoaide de la fonctionSystemoutprintln Cet affichage est reacutealiseacute agrave la fin du code source complet ci-dessous

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class LireUnEntier public static void main (String [] param) throws javaioIOException

c tmp Explication

C = (char)Systeminread() n 28 Le caractegravere suivant envoyeacute par la touche laquo Entreacutee raquo est rsquonrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

n 28 C vaut rsquonrsquo La condition nrsquoest pas veacuterifieacutee et il nrsquoy a pas accumulation du caractegravere dans tmp

n 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C =rsquonrsquo)

n 28 La variable C contient le caractegravere n La condition placeacutee entre () nrsquoest plus veacuterifieacutee Le programme sort de la boucle et passe agrave lrsquoeacutetape suivante

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

95

String tmp = char C= rsquo0rsquo int valeur Systemoutprint(Entrez des chiffres et appuyez sur ) Systemoutprintln(la touche Entree pour valider la saisie ) while (C = rsquonrsquo) C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C Systemoutprintln(Vous avez entre + tmp) valeur = IntegerparseInt(tmp) Systemoutprintln(Crsquoest a dire + valeur + en entier) Fin du main () Fin de la Class LireUnEntier

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant les valeurssaisies le programme donne un reacutesultat diffeacuterent

Exeacutecution 1

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2288Vous avez entre 28Crsquoest a dire 28 en entier

La premiegravere valeur 28 afficheacutee est un mot Lrsquoaddition de cette valeur avec le nombre 4 apour reacutesultat 284 La deuxiegraveme valeur afficheacutee est un nombre et la mecircme addition a pourreacutesultat 32

Exeacutecution 2

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie ttrrooiissjavalangNumberFormatException troisat javalangIntegerparseInt (compiled Code)

Le mot trois nrsquoest pas un nombre mais un mot sans signification particuliegravere pourlrsquoordinateur lrsquointerpreacuteteur Java ne peut traduire ce mot en un nombre entier

Exeacutecution 3

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2255javalangNumberFormatException 25at javalangIntegerparseInt (compiled Code)

Le mot 25 nrsquoa pas le format drsquoun nombre entier mais drsquoun nombre reacuteel La fonctionIntegerparseInt() ne peut le traduire en un nombre entier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

96

La boucle for Lrsquoinstruction for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations (de tours) agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

Syntaxe La boucle for srsquoeacutecrit elle aussi de deux faccedilons diffeacuterentes en fonction du nombredrsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

for (initialisation condition increacutement) une seule instruction

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par deuxaccolades ouvrante et fermante de sorte agrave deacuteterminer ougrave deacutebute et se termine la boucle

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepareacuteesobligatoirement par des points-virgules () Ces instructions deacutefinissent une variable ouindice qui controcircle le bon deacuteroulement de la boucle Ainsi

bull Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle(exemple i = 0 i eacutetant lrsquoindice) Elle est la premiegravere instruction exeacutecuteacutee agrave lrsquoentreacuteede la boucle

bull Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle(exemple i lt 10) Elle est examineacutee avant chaque tour de boucle y compris aupremier tour de boucle

bull Increacutement est lrsquoinstruction qui permet de modifier le reacutesultat du test preacuteceacutedent enaugmentant ou diminuant la valeur de la variable testeacutee Lrsquoincreacutement peut ecirctreaugmenteacute ou diminueacute de N N est appeleacute le pas drsquoincreacutementation (exemple i = i + 2) Cette instruction est exeacutecuteacutee agrave la fin de chaque tour de boucle

Principes de fonctionnementLes boucles for reacutealisent un nombre preacutecis de boucles deacutependant de la valeur initiale dela valeur finale et du pas drsquoincreacutementation Voyons sur diffeacuterents exemples comment cesboucles sont exeacutecuteacutees (tableau suivant)

Remarquons que

bull Le nombre de tours est identique dans chacune de ces boucles malgreacute une deacutefinitiondiffeacuterente pour chacune des instructions de controcircle

bull Lrsquoeacutecriture de lrsquoinstruction Increacutement qui augmente ou diminue de 1 la variable decontrocircle de la boucle peut ecirctre simplifieacutee En effet par convention lrsquoinstruction

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

97

i = i + 1 srsquoeacutecrit plus simplement i++ et lrsquoinstruction i-- a le mecircme reacutesultat quelrsquoinstruction i = i - 1

Rechercher le code Unicode drsquoun caractegravere donneacuteLrsquoobjectif de cet exemple est drsquoapprendre agrave construire une boucle for et de srsquoinitier agrave larecherche drsquoinformation dans un ensemble de donneacutees Pour cela nous allons eacutecrire unprogramme qui recherche dans la table Unicode le code drsquoun caractegravere donneacute par lrsquoutili-sateur Cette recherche srsquoeffectue en comparant chaque caractegravere de la table Unicode aucaractegravere saisi

Cahier des charges

La meacutethode est la suivante

1 Lire le caractegravere dont on souhaite connaicirctre le code Unicode

2 Pour chaque caractegravere de la table Unicode

Si le caractegravere Unicode est identique au caractegravere choisi afficher son code Unicode

Reprenons chaque point pour le traduire en un programme Java

1 Pour lire au clavier le caractegravere dont on souhaite connaicirctre le code Unicode lesinstructions sont les suivantes

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

Systemoutprintln(Quel caractere recherchez-vous )recherche = Lirec()

Ougrave la variable recherche est deacuteclareacutee de type char

2 Le programme parcourt la table Unicode caractegravere par caractegravere et recherche lecaractegravere souhaiteacute Cette opeacuteration est reacutepeacutetitive et srsquoexeacutecute autant de fois qursquoil y ade caractegraveres dans la table Unicode crsquoest-agrave-dire du caractegravere 0 au caractegravere 255

Pour plus drsquoinformations sur la table Unicode voir au chapitre 1 laquo Stocker une information raquo lasection laquo Cateacutegorie caractegravere raquo

Pour parcourir cette table la solution est drsquoutiliser une boucle for dont la valeur delrsquoindice varie de 1 en 1 dans lrsquointervalle [0 255] Cette boucle srsquoeacutecrit

for (i = 1 i lt 255 i++)

int i char c

Valeur initiale

Valeur finale

Pas drsquoincreacutementation

Nombre de boucles

Valeurs prises par i ou c

for (i = 0 i lt 5 i = i +1) 0 4 1 5 0 1 2 3 4

for (i = 4 i lt= 12 i = i + 2) 4 12 2 5 4 6 8 10 12

for (c = rsquoarsquo c lt rsquofrsquo c = c + 1) rsquoarsquo rsquoersquo 1 5 a b c d e

for (i = 5 i gt 0 i = i ndash 1) 5 0 ndash 1 5 5 4 3 2 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

98

La variable i deacuteclareacutee de type int repreacutesente lrsquoindice du caractegravere dans la tableUnicode Il y a eacutequivalence entre lrsquoindice et le caractegravere En effet un caractegravere estdeacutefini agrave partir drsquoune valeur numeacuterique

La seule diffeacuterence entre une valeur numeacuterique et un caractegravere provient du type decodage utiliseacute pour les repreacutesenter lrsquoun et lrsquoautre Pour connaicirctre le caractegravere corres-pondant agrave cet indice la meacutethode consiste agrave transformer la valeur de lrsquoindice en uncode caractegravere par lrsquointermeacutediaire du cast (char) Ainsi lrsquoinstruction

atrouver = (char) i

transforme lrsquoindice i de la table Unicode en son code caractegravere La variable atrou-ver deacuteclareacutee de type char prend la valeur de ce code

Connaissant le caractegravere agrave rechercher ainsi que le code caractegravere de chaque caractegraverede la table Unicode il suffit de les comparer pour savoir srsquoils sont identiques ou nonLrsquoinstruction srsquoeacutecrit sous la forme du test suivant

if (atrouver == recherche)

Si le caractegravere Unicode est identique au caractegravere choisi le programme affiche soncode Unicode agrave lrsquoaide des instructions

Systemoutprint(le code Unicode de + atrouver)Systemoutprintln( est u00 + IntegertoString(i16))

Rappelons que le code Unicode drsquoun caractegravere srsquoobtient en placcedilant derriegravere lescaractegraveres u00 la valeur hexadeacutecimale de la position du caractegravere dans la tableUnicode Pour afficher ce code nous devons donc traduire la variable i (qui corres-pond agrave la position du caractegravere dans la table Unicode) en valeur hexadeacutecimale Cettetraduction est reacutealiseacutee par la fonction

IntegertoString(valeur entiegravere base)

qui transforme le paramegravetre valeur entiegravere en une chaicircne de caractegraveres suivant lecodage donneacute par le paramegravetre base Si valeur entiegravere repreacutesente lrsquoindice i et quebase prenne la valeur 16 nous obtenons la valeur hexadeacutecimale de la position ducaractegravere trouveacute

La suite des caractegraveres u00 placeacutee dans la fonction Systemoutprintln est consi-deacutereacutee comme une seacutequence particuliegravere puisqursquoelle permet lrsquoaffichage des caractegraverespeacuteciaux Pour annuler le caractegravere speacutecifique de cette seacutequence il est neacutecessaire deplacer un premier devant u00

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classe commeci-dessous

public class QuelUnicode public static void main (String [] parametre)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

99

int i char recherche atrouver Systemoutprintln(Quel caractere recherchez-vous ) recherche = Lirec() for (i = 1 i lt 255 i++) atrouver = (char) i if (atrouver == recherche) Systemoutprint(le code Unicode de + atrouver) Systemoutprintln( est u00 + IntegertoString(i16)) Fin du if Fin du for Fin du main() Fin de QuelUnicode

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant lrsquoenviron-nement drsquoexeacutecution le programme donne des reacutesultats diffeacuterents

Exeacutecution sous Dos

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u0082

Exeacutecution sous Mac OS

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00c8

Exeacutecution sous Windows ou Unix

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00e9

Lrsquoexeacutecution du mecircme programme sur les diffeacuterents environnements montre bien que lecode Unicode drsquoun caractegravere speacutecial (par exemple accentueacute) nrsquoest pas le mecircme drsquounenvironnement agrave un autre

Quelle boucle choisir Chacune des trois boucles eacutetudieacutees dans ce chapitre permet de reacutepeacuteter un ensembledrsquoinstructions Cependant les diffeacuterentes proprieacuteteacutes de chacune drsquoentre elles font que leprogrammeur utilisera un type de boucle plutocirct qursquoun autre suivant le problegraveme agravereacutesoudre

Choisir entre une boucle do while et une boucle while

Les boucles do while et while se ressemblent beaucoup dans leur syntaxe et il paraicirctparfois difficile au programmeur deacutebutant de choisir lrsquoune plutocirct que lrsquoautre

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

100

Remarquons cependant que la diffeacuterence essentielle entre ces deux boucles reacuteside dans laposition du test de sortie de boucle Pour la boucle do while la sortie de boucle srsquoeffectueen fin de boucle alors que pour la boucle while la sortie de boucle se situe degraves lrsquoentreacutee dela boucle

De ce fait la boucle do while est plus souple agrave manipuler les instructions qui la composenteacutetant exeacutecuteacutees au moins une fois quoi qursquoil arrive Pour la boucle while il est neacutecessairede veiller agrave lrsquoinitialisation de la variable figurant dans le test drsquoentreacutee de boucle de faccedilon agraveecirctre sucircr drsquoexeacutecuter au moins une fois les instructions composant la boucle

Certains algorithmes demandent agrave ne jamais reacutepeacuteter sous certaines conditions unensemble drsquoinstructions Dans de tels cas la structure while est preacutefeacuterable agrave la structuredo while

Choisir entre la boucle for et while

Les boucles for et while sont eacutequivalentes En effet en examinant les deux boucles dutableau ci-dessous

nous constatons que pour chacune drsquoentre elles la boucle deacutebute avec i = 0 puis tantque i est infeacuterieur ou eacutegal agrave 10 i est increacutementeacute de 1

Malgreacute cette eacutequivalence pour choisir entre une boucle for et une boucle while remar-quons que

bull La boucle for est utiliseacutee quand on connaicirct agrave lrsquoavance le nombre drsquoiteacuterations agrave exeacutecuter

bull La boucle while est employeacutee lorsque le nombre drsquoiteacuterations est laisseacute au choix delrsquoutilisateur du programme ou deacutetermineacute agrave partir du reacutesultat drsquoun calcul reacutealiseacute aucours de la reacutepeacutetition

La boucle for La boucle while

int i

for (i = 0 i lt= 10 i = i+1 )

int i = 0

while (i lt= 10)

i = i+1

ReacutesumeacuteEn langage Java il existe trois types de structures pour reacutealiser des reacutepeacutetitions Ellessont deacutecrites par les instructions dowhile while et for

bull La boucle dowhile (faire tant que) permet drsquoexeacutecuter les instructions situeacuteesdans le bloc deacutefini par des tant que lrsquoexpression conditionnelle placeacutee entre ()est vraie

do plusieurs instructions while (expression)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

101

Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression condition-nelle est examineacutee en fin de boucle apregraves exeacutecution des instructions

bull La boucle while (tant que) permet drsquoexeacutecuter les instructions situeacutees dans le blocdeacutefini par tant que lrsquoexpression conditionnelle placeacutee entre () est vraie

while (expression) plusieurs instructions

Lrsquoexpression conditionnelle eacutetant examineacutee en deacutebut de boucle les instructionssitueacutees dans le bloc peuvent ne pas ecirctre exeacutecuteacutees si la condition nrsquoest pas veacuterifieacuteedegraves le deacutebut

bull La boucle for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepa-reacutees obligatoirement par des points-virgules () Ces instructions deacutefinissent unindice qui controcircle le bon deacuteroulement de la boucle Ainsi

ndash Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle

ndash Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle

ndash Increacutement permet drsquoaugmenter ou de diminuer de N la valeur de la variablerepreacutesentant lrsquoindice de la boucle N est appeleacute le pas drsquoincreacutementation

Agrave partir des structures reacutepeacutetitives nous avons eacutegalement abordeacute la notion de comp-tage de valeurs crsquoest-agrave-dire

bull Le comptage drsquoun certain nombre de valeurs (par exemple compter le nombre denotes drsquoun eacutetudiant) Pour cela il suffit drsquoemployer une variable entiegravere initialiseacuteeagrave 0 avant drsquoentamer la boucle La variable augmente de 1 agrave lrsquointeacuterieur de la boucleagrave lrsquoaide de lrsquoinstruction i = i + 1 (en supposant que i soit notre variable comp-teur) On dit alors que la variable i est increacutementeacutee de 1

bull Lrsquoaccumulation de valeurs (par exemple faire la somme des notes drsquoun eacutetudiant)Cette technique est reacutealiseacutee agrave lrsquoaide drsquoune variable entiegravere initialiseacutee agrave 0 avantdrsquoentamer la boucle La variable augmente de la valeur de la variable agrave accumuler(de la valeur de la note par exemple) agrave lrsquointeacuterieur de la boucle Cette augmentationsrsquoeffectue agrave lrsquoaide de lrsquoinstruction s = s + valeur en supposant que s soit notrevariable drsquoaccumulation et valeur la variable repreacutesentant la valeur agrave accumuler

Remarquons pour finir que lrsquoinstruction i++ est lrsquoeacutequivalent simplifieacute de i = i + 1tandis que i-- est lrsquoeacutequivalent simplifieacute de i = i ndash 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

102

ExercicesComprendre la boucle dohellipwhile

Afin drsquoexeacutecuter le programme suivant

public class Exercice1 public static void main (String [] argument) int abr Systemoutprintln(Entrer un entier ) a = Lirei() Systemoutprintln(Entrer un entier ) b = Lirei() do r = ab a = b b = r while (r =0 ) Systemoutprintln(Le resultat est + a)

a Examinez le code source (programme) repeacuterez les instructions concerneacutees parla boucle reacutepeacutetitive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie deboucle

c En supposant que lrsquoutilisateur entre les valeurs 30 et 42 exeacutecutez le programmeagrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

d En supposant que lrsquoutilisateur entre les valeurs 35 et 6 exeacutecutez le programme agravela main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

Apprendre agrave compter accumuler et rechercher une valeurEacutecrivez en franccedilais en faisant ressortir la structure reacutepeacutetitive de la marche agrave suivrele programme reacutesolvant les quatre points suivants

a Lire un nombre quelconque de valeurs entiegraveres non nulles La saisie des valeursse termine lorsqursquoon entre la valeur 0

b Afficher la plus grande des valeurs

c Afficher la plus petite des valeurs

d Calculer et afficher la moyenne de toutes les valeurs

41

42

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

103

Traduisez la marche agrave suivre preacuteceacutedente en un programme Java Utilisez pour celaune boucle dohellipwhile Pour trouver la plus grande ou la plus petite valeur vouspouvez vous aider de lrsquoexemple laquo Rechercher le plus grand de deux eacuteleacutements raquodeacutecrit au cours du chapitre 3 laquo Faire des choix raquo

Comprendre la boucle while traduire une marche agrave suivre en programme Java

Eacutecrivez un programme Devinette qui tire un nombre au hasard entre 0 et 10 etdemande agrave lrsquoutilisateur de trouver ce nombre Pour ce faire la meacutethode est lasuivante

a Tirer au hasard un nombre entre 0 et 10

b Lire un nombre

c Tant que le nombre lu est diffeacuterent du nombre tireacute au hasard

ndash Lire un nombre

ndash Compter le nombre de boucle

d Afficher un message de reacuteussite ainsi que le nombre de boucles

Reprenez chaque point eacutenonceacute ci-dessus et traduisez-le en langage Java Notezque pour tirer un nombre au hasard entre 0 et 10 lrsquoinstruction srsquoeacutecrit

i = (int) (10Mathrandom())

ougrave i est une variable entiegravere qui reccediloit la valeur tireacutee au hasard

Deacuteclarez toutes les variables utiliseacutees dans votre programme en veillant agrave ceqursquoelles soient bien initialiseacutees

Lorsque le programme Devinette fonctionne bien modifiez-le de faccedilon que

a Les valeurs tireacutees au hasard soient comprises entre 0 et 50

b Un message drsquoerreur srsquoaffiche si la reacuteponse est mauvaise

c Le programme indique si la valeur saisie au clavier est plus grande ou plus petiteque la valeur tireacutee au hasard

d Agrave titre de reacuteflexion comment faut-il srsquoy prendre pour trouver la valeur endonnant le moins de reacuteponses possibles

Comprendre la boucle forAfin drsquoexeacutecuter le programme suivant

public class Exercice8 public static void main (String [] parametre) long i b = 1 int a Systemoutprintln(Entrer un entier ) a = Lirei()

43

44

45

46

47

48

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

104

for (i = 2 i lt= a i++) b = b i Systemoutprintln(Le resultat vaut + b)

a Examinez le programme repeacuterez les instructions concerneacutees par la boucle reacutepeacute-titive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est la valeur initiale de i et quelle est sa valeur en sortie de boucle Combien de boucles sont reacutealiseacutees

c Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie de boucle

d En supposant que lrsquoutilisateur entre la valeur 6 exeacutecutez le programme agrave la main(pour vous aider construisez le tableau drsquoeacutevolution de chaque variable deacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

En utilisant une boucle for eacutecrivez un programme qui affiche lrsquoalphabet drsquoabordagrave lrsquoendroit puis agrave lrsquoenvers apregraves un passage agrave la ligne

Le projet laquo Gestion drsquoun compte bancaire raquoRendre le menu interactifUne fois lrsquoaffichage du menu reacutealiseacute agrave partir de lrsquoeacutenonceacute donneacute agrave la fin du chapitre 3laquo Faire des choix raquo le programme exeacutecuteacute donne agrave choisir parmi les cinq optionssuivantes

1 Creacuteation drsquoun compte2 Affichage drsquoun compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Si lrsquoutilisateur choisit lrsquooption 1 le programme lui demande de saisir les donneacuteesneacutecessaires agrave la creacuteation du compte (type numeacutero valeur initiale etc) Une fois lesdonneacutees saisies le programme srsquoarrecircte Il nrsquoest pas possible de choisir par exemplelrsquooption 2 pour afficher les valeurs saisies agrave lrsquoeacutetape preacuteceacutedente

Pour remeacutedier agrave cette situation il est neacutecessaire de placer les instructions concerneacutees agravelrsquointeacuterieur drsquoune boucle de faccedilon agrave voir reacuteapparaicirctre le menu une fois lrsquooption reacutealiseacuteePour cela vous devez

a Eacutecrire en franccedilais la structure reacutepeacutetitive afin de deacuteterminer la condition de sortie deboucle

b Choisir la structure reacutepeacutetitive parmi les trois proposeacutees par le langage Java

c Traduire la marche agrave suivre en programme Java en prenant soin drsquoinitialiser la varia-ble de controcircle de la boucle et en inseacuterant agrave lrsquointeacuterieur de la boucle toutes lesinstructions neacutecessaires agrave lrsquoaffichage du menu

49

copy copyright Eacuteditions Eyrolles

PARTIE 2

Initiation agrave la programmation orienteacutee objet

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

CHAPITRE 6

Fonctions notions avanceacutees 129

CHAPITRE 7

Les classes et les objets 149

CHAPITRE 8

Les principes du concept drsquoobjet 175

copy copyright Eacuteditions Eyrolles

5De lrsquoalgorithme parameacutetreacute

agrave lrsquoeacutecriture de fonctions

Lrsquoeacutetude des chapitres preacuteceacutedents montre qursquoun programme informatique est constitueacutedrsquoinstructions eacuteleacutementaires (affectation comparaison ou encore reacutepeacutetition) et de sous-programmes (calcul de la racine carreacutee affichage de donneacutees) appeleacutes fonctions ouencore meacutethodes

Ces instructions sont de nature suffisamment geacuteneacuterale pour srsquoadapter agrave nrsquoimporte quelproblegraveme En les utilisant agrave bon escient il est possible drsquoeacutecrire des programmes informa-tiques simples mais drsquoune grande utiliteacute

Dans le cadre du deacuteveloppement de logiciels de grande envergure les programmeurssouhaitent aussi deacutefinir leurs propres instructions adapteacutees au problegraveme qursquoils traitentPour cela les langages de programmation offrent la possibiliteacute de creacuteer des fonctionsspeacutecifiques diffeacuterentes des fonctions preacutedeacutefinies par le langage

Pour comprendre lrsquointeacuterecirct des fonctions nous analysons drsquoabord le concept drsquoalgorithmeparameacutetreacute agrave partir drsquoun exemple imageacute

Ensuite nous eacutetudions la bibliothegraveque de fonctions matheacutematiques deacutefinie dans lelangage Java (section laquo Des fonctions Java preacutedeacutefinies raquo) Cette eacutetude montre les prin-cipes drsquoutilisation de ces fonctions et explique comment eacutelaborer et construire vos fonc-tions (section laquo Construire ses propres fonctions raquo)

Pour finir nous examinons comment la construction et lrsquoutilisation de fonctions fonteacutevoluer la structure geacuteneacuterale drsquoun programme (section laquo Les fonctions au sein drsquounprogramme Java raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

108

Algorithme parameacutetreacuteCertains algorithmes peuvent ecirctre appliqueacutes agrave des problegravemes voisins en modifiantsimplement les donneacutees pour lesquels ils ont eacuteteacute construits En faisant varier certainesvaleurs le programme fournit un reacutesultat diffeacuterent du preacuteceacutedent Ces valeurs caracteacuteris-tiques du problegraveme agrave traiter sont appeleacutees paramegravetres du programme

Pour comprendre concregravetement ce concept nous allons reprendre lrsquoalgorithme du cafeacute chaudpour le transformer en un algorithme qui nous permettra de faire du theacute ou du cafeacute chaud

Faire un theacute chaud ou comment remplacer le cafeacute par du theacuteFaire un cafeacute chaud ou faire un theacute chaud est une opeacuteration agrave peu pregraves semblable Enreprenant la liste de toutes les opeacuterations neacutecessaires agrave la reacutealisation drsquoun cafeacute chaudnous remarquons qursquoen remplaccedilant simplement le mot cafeacute par le mot theacute nous obtenonsdu theacute chaud

Cette recette nrsquoest certes pas traditionnelle mais elle a le meacuterite drsquoecirctre peacutedagogiquementsimple Pour faire du cafeacute ou du theacute il suffit drsquoemployer la mecircme recette ou meacutethode enprenant comme ingreacutedient du cafeacute ou du theacute selon notre choix

Dans le monde reacuteel le fait de remplacer un ingreacutedient par un autre ne pose pas de diffi-culteacutes particuliegraveres Dans le monde informatique crsquoest plus complexe En effet lrsquoordina-teur ne fait qursquoexeacutecuter la marche agrave suivre fournie par le programmeur Dans notre caspour avoir du cafeacute ou du theacute le programmeur doit eacutecrire la marche agrave suivre pour chacunedes boissons La tacircche est fastidieuse puisque chacun des programmes se ressembletout en eacutetant diffeacuterent sur un deacutetail (cafeacute ou theacute)

Deacutefinir les paramegravetres

Pour eacuteviter drsquoavoir agrave recopier chaque fois des marches agrave suivre qui ne diffegraverent quesur un deacutetail lrsquoideacutee est de construire un algorithme geacuteneacuteral Cet algorithme ne varie

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du theacute3 Prendre un filtre4 Verser le theacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le theacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser le theacute dans la tasse

Preacuteparer le theacute

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

109

qursquoen fonction drsquoingreacutedients deacutetermineacutes qui font que le programme donne un reacutesultatdiffeacuterent

En geacuteneacuteralisant lrsquoalgorithme du theacute ou du cafeacute chaud on exprime une marche agrave suivrepermettant de reacutealiser une boisson chaude Pour obtenir un reacutesultat diffeacuterent (cafeacute ou theacute)il suffit de deacutefinir comme paramegravetre de lrsquoalgorithme lrsquoingreacutedient cafeacute ou theacute agrave choisir

La marche agrave suivre srsquoeacutecrit en remplaccedilant les mots cafeacute ou theacute par le mot ingreacutedient

Faire du cafeacute eacutequivaut donc agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (ingreacutedient) enutilisant comme ingreacutedient du cafeacute Lrsquoexeacutecution du bloc Preacuteparer (le cafeacute) a pour conseacute-quence de reacutealiser les instructions 2 4 9 et 13 du bloc drsquoinstructions avec comme ingreacute-dient du cafeacute Lrsquoinstruction 2 par exemple srsquoexeacutecute en remplaccedilant le terme ingreacutedientpar le cafeacute Au lieu de lire prendre ingreacutedient il faut lire prendre le cafeacute

De la mecircme faccedilon faire du theacute revient agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (letheacute) Le paramegravetre ingreacutedient correspond ici au theacute et les instructions 2 4 9 et 13 sontexeacutecuteacutees en conseacutequence

Suivant la valeur prise par le paramegravetre ingreacutedient lrsquoexeacutecution de cet algorithmefournit un reacutesultat diffeacuterent Ce peut ecirctre du cafeacute ou du theacute

Donner un nom au bloc drsquoinstructions

Nous constatons qursquoen parameacutetrant un algorithme nous nrsquoavons plus besoin de recopierplusieurs fois les instructions qui le composent pour obtenir un reacutesultat diffeacuterent

En donnant un nom au bloc drsquoinstructions correspondant agrave lrsquoalgorithme geacuteneacuteral Preacuteparer()nous deacutefinissons un sous-programme capable drsquoecirctre exeacutecuteacute autant de fois que neacuteces-saire Il suffit pour cela drsquoappeler le sous-programme par son nom

De plus gracircce au paramegravetre placeacute entre les parenthegraveses qui suivent le nom du sous-programme la fonction srsquoexeacutecute avec des valeurs diffeacuterentes modifiant de ce fait lereacutesultat

Instructions Nom du bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre ingreacutedient3 Prendre un filtre4 Verser ingreacutedient dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que ingreacutedient soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser ingreacutedient dans la tasse

Preacuteparer (ingreacutedient)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

110

Un algorithme parameacutetreacute est deacutefini par

bull un nom

bull un ou plusieurs paramegravetres

En fin drsquoexeacutecution il fournit

bull un reacutesultat qui diffegravere suivant la valeur du ou des paramegravetres

Dans le langage Java les algorithmes parameacutetreacutes srsquoappellent des fonctions ou encore desmeacutethodes Gracircce agrave elles il est possible de traduire un algorithme parameacutetreacute enprogramme informatique Avant drsquoexaminer comment eacutecrire ces algorithmes en langageJava nous allons tout drsquoabord eacutetudier les fonctions preacutedeacutefinies du langage Java de faccedilonagrave mieux comprendre comment elles srsquoutilisent

Des fonctions Java preacutedeacutefiniesUn grand nombre de programmes informatiques font appel agrave des calculs matheacutematiquessimples tels que le calcul drsquoun sinus ou drsquoune racine carreacutee Pour trouver la valeur drsquoun sinuspar exemple le programmeur nrsquoa pas fort heureusement agrave reacuteeacutecrire pour chaque programmelrsquoalgorithme matheacutematique du calcul drsquoun sinus Les fonctions matheacutematiques sont deacutejagraveprogrammeacutees

Le langage Java propose un ensemble de fonctions preacutedeacutefinies matheacutematiques ou autrestregraves utiles comme nous le verrons au cours des chapitres suivants Notre objectif nrsquoestpas de deacutecrire lrsquointeacutegraliteacute des fonctions disponibles car ce seul manuel nrsquoy suffirait pasNous souhaitons faire comprendre la manipulation de ces fonctions Pour ce faire nousallons eacutetudier une partie de la librairie matheacutematique de Java appeleacutee Math et deacuteter-miner ensuite les principes geacuteneacuteraux drsquoutilisation des fonctions

La librairie Math

La librairie matheacutematique du langage Java est composeacutee drsquoun ensemble de fonctionspreacutedeacutefinies qui permettent de calculer toutes sortes drsquoeacutequations matheacutematiques Parmices fonctions se trouvent les fonctions trigonomeacutetriques (sinus cosinus tangente etc)logarithmiques drsquoarrondis de calcul de puissances ou de racines carreacutees

Ces fonctions sont regroupeacutees dans la bibliothegraveque de programmes Math Le nom dechaque fonction deacutebute toujours par le terme Math suivi drsquoun point puis du nom de lafonction Ce nom commence toujours par une minuscule Voici une liste partielle desfonctions qui composent la librairie Math

Fonctions trigonomeacutetriques

Opeacuteration matheacutematique Fonction Java

Calculer le cosinus drsquoun angle (radian) Mathcos()

Calculer le sinus drsquoun angle (radian) Mathsin()

Calculer la tangente drsquoun angle (radian) Mathtan()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

111

Fonctions logarithmiques

Calcul drsquoarrondis

Autres calculs matheacutematiques

Divers

Exemples drsquoutilisationCes fonctions srsquoutilisent en placcedilant dans le programme Java le nom drsquoappel de la fonctionVoici en exemple un programme qui utilise lrsquoensemble des fonctions deacutecrites ci-dessus

Exemple code source complet

public class FonctionMateacutematique public static void main(String [] argument) double reacutesulat a b Systemoutprint(Entrez une premiere valeur ) a = Lired() Systemoutprint(Entrez une seconde valeur ) b = Lired()

Opeacuteration matheacutematique Fonction Java

Calculer le logarithme drsquoune valeur Mathlog()

Calculer lrsquoexponentielle drsquoun nombre Mathexp()

Opeacuteration Fonction Java

Arrondir agrave lrsquoentier infeacuterieur Mathfloor()

Arrondir agrave lrsquoentier supeacuterieur Mathceil()

Opeacuteration matheacutematique Fonction Java

Calculer la racine carreacutee drsquoun nombre Mathsqrt()

ab (a puissance b) Mathpow()

|a| (valeur absolue de a) Mathabs()

Opeacuteration Fonction Java

Trouver la plus grande de deux valeurs Mathmax()

Trouver la plus petite de deux valeurs Mathmin()

Tirer un nombre au hasard entre 0 et 1 Mathrandom()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

112

reacutesultat = Mathcos(a) Systemoutprintln(Cos( + a + ) = + reacutesultat) reacutesultat = Mathsin(a) Systemoutprintln(Sin( + a + ) = + reacutesultat) reacutesultat = Mathtan(a) Systemoutprintln(Tan( + a + ) = + reacutesultat) reacutesultat = Mathlog(a) Systemoutprintln(Log( + a + ) = + reacutesultat) reacutesultat = Mathexp(a) Systemoutprintln(Exp( + a + ) = + reacutesultat) reacutesultat = Mathfloor(a) Systemoutprintln(Floor( + a + ) = + reacutesultat) reacutesultat = Mathceil(a) Systemoutprintln(Ceil( + a + ) = + reacutesultat) reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat) reacutesultat = Mathpow(ab) Systemoutprintln(Pow( + a + + b +) = + reacutesultat) reacutesultat = Mathabs(a) Systemoutprintln(Abs( + a + ) = + reacutesultat) reacutesultat = Mathmax(ab) Systemoutprintln(Max( + a + + b + ) = + reacutesultat) reacutesultat = Mathmin(ab) Systemoutprintln(Min( + a + + b + ) = + reacutesultat) reacutesultat = Mathrandom() Systemoutprintln(Random() = + reacutesultat)

Une fois les instructions de ce programme compileacutees lrsquointerpreacuteteur Java les exeacutecute uneagrave une Le reacutesultat est le suivant

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez une premiere valeur 0011Entrez une seconde valeur 22Cos(01) = 09950041652780257Sin(01) = 009983341664682815Tan(01) = 010033467208545055Log(01) = -23025850929940455Exp(01) = 11051709180756477Floor(01) = 00Ceil(01) = 10Sqrt(01) = 0316227766011683794Pow(01 20) = 001Abs(01) = 01Max(01 20) = 20Min(01 20)= 01Random() = 06993848420032578

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

113

Principes de fonctionnementLrsquoeacutetude de ce programme met en eacutevidence plusieurs aspects importants concernantlrsquoutilisation des fonctions et leur mode de fonctionnement

Le nom des fonctions

bull Le nom de chaque fonction est deacutefini par le langage Java Pour connaicirctre le nom desdiffeacuterentes fonctions proposeacutees par le Java il est neacutecessaire de consulter lrsquoaide enligne du compilateur ou le site Internet de Sun (voir le CD-Rom livreacute avec cetouvrage) ou encore des livres plus speacutecifiques sur le langage Java et les bases dedonneacutees ou les reacuteseaux

bull Remarquons que lrsquoexeacutecution drsquoune fonction passe par lrsquoeacutecriture dans une instructiondu nom de la fonction choisie suivi de paramegravetres eacuteventuels placeacutes entre parenthegraveses

Meacutemoriser le reacutesultat drsquoune fonction

bull Pour meacutemoriser le reacutesultat du calcul la fonction est placeacutee dans une instructiondrsquoaffectation La fonction situeacutee agrave droite du signe = est exeacutecuteacutee en premier Apregravesquoi la variable situeacutee agrave gauche du signe = reacutecupegravere la valeur calculeacutee lors de lrsquoexeacutecu-tion de la fonction

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Rocircle et meacuteca-nisme de lrsquoaffectation raquo

bull Dans notre exemple toutes les fonctions de la bibliothegraveque Math fournissent enreacutesultat une valeur numeacuterique de type double En conseacutequence la variable reacutesultatqui reacutecupegravere le reacutesultat de chaque fonction est deacuteclareacutee de type double

Les paramegravetres drsquoune fonction

Les fonctions possegravedent zeacutero un voire deux paramegravetres Ainsi

bull La fonction Mathrandom() ne possegravede pas de paramegravetre Cette fonction donne enreacutesultat une valeur au hasard comprise entre 00 et 10 indeacutependamment de toutecondition Aucun paramegravetre nrsquoest donc neacutecessaire agrave sa bonne marche

Remarquons que mecircme si la fonction nrsquoa pas de paramegravetre il reste neacutecessaire deplacer des parenthegraveses ouvrante puis fermante derriegravere le nom drsquoappel de la fonctionSi aucune parenthegravese nrsquoest placeacutee le compilateur ne considegravere pas le termeMathrandom comme une fonction mais comme un nom de variable

Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante puisfermante

bull La fonction Mathsqrt()ne comporte qursquoun seul paramegravetre puisqursquoelle calcule laracine carreacutee drsquoun seul nombre agrave la fois Il est possible de placer entre parenthegraveses uneexpression matheacutematique plutocirct qursquoun paramegravetre Ainsi lrsquoexpression Mathsqrt(bb ndash 4ac) permet le calcul de la racine carreacutee du discriminant drsquoune eacutequation dusecond degreacute

Observons que le paramegravetre placeacute entre parenthegraveses dans la fonction Mathsqrt() estde type double De cette faccedilon il est possible de calculer la racine carreacutee de tout type

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

114

de valeur numeacuterique les types byte short int ou long se transformant sans difficulteacuteen type double

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo La transfor-mation de types raquo

Il nrsquoest pas permis de placer en paramegravetre un caractegravere une suite de caractegraveres ou unbooleacuteen Par exemple le fait drsquoeacutecrire Mathsqrt(Quatre) entraicircne une erreur encours de compilation lrsquoordinateur ne sachant pas transformer le mot laquo Quatre raquo en lavaleur numeacuterique 4 (message drsquoerreur Incompatible type for method Canrsquotconvert javalangString to double)

Dans lrsquoappel de la fonction le type des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir une erreur de compilation

bull La fonction Mathpow(ab) possegravede deux paramegravetres pour calculer ab (a agrave la puissanceb) Ces paramegravetres sont seacutepareacutes par une virgule Si les valeurs a et b sont inverseacuteesdans lrsquoappel de la fonction (Mathpow(ba)) le calcul effectueacute a pour reacutesultat ba (b agravela puissance a)

Dans lrsquoappel de la fonction lrsquoordre des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir un reacutesultat diffeacuterent de celui attendu

Les fonctions eacutetudieacutees dans cette section sont des fonctions preacutedeacutefinies par le langageJava Le programmeur les utilise en connaissant le reacutesultat qursquoil souhaite obtenir Lesprogrammes ainsi eacutecrits sont constitueacutes drsquoinstructions simples et drsquoappels agrave des fonc-tions connues du langage Java

Le langage Java offre aussi au programmeur la possibiliteacute drsquoeacutecrire ses propres fonctionsde faccedilon agrave obtenir diffeacuterents programmes adapteacutes au problegraveme qursquoil doit reacutesoudre Nouseacutetudions cette technique agrave la section qui suit

Construire ses propres fonctionsUne fonction deacuteveloppeacutee par un programmeur srsquoutilise de la mecircme faccedilon qursquoune fonc-tion preacutedeacutefinie Elle srsquoexeacutecute en placcedilant lrsquoinstruction drsquoappel agrave la fonction dans leprogramme Cette eacutetape est deacutecrite agrave la section laquo Appeler une fonction raquo

Pour que lrsquoordinateur puisse lire et exeacutecuter les instructions composant la fonction ilconvient de deacutefinir cette derniegravere crsquoest-agrave-dire drsquoeacutecrire une agrave une les instructions qui lacomposent Plusieurs eacutetapes sont neacutecessaires agrave cette deacutefinition Nous les eacutetudions agrave lasection laquo Deacutefinir une fonction raquo

Pour mieux cerner les difficulteacutes lieacutees agrave ces opeacuterations nous allons prendre comme exemplela creacuteation drsquoune fonction qui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Appeler une fonctionToute fonction possegravede un nom drsquoappel qui permet de lrsquoidentifier Ce nom est choisi defaccedilon agrave repreacutesenter et reacutesumer tout ce qui est reacutealiseacute par son intermeacutediaire Dans notreexemple nous devons calculer le peacuterimegravetre drsquoun cercle Nous appelons donc la fonctionqui reacutealise ce calcul crsquoest-agrave-dire peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

115

Drsquoune maniegravere geacuteneacuterale une fonction repreacutesente une action Crsquoest pourquoi le choixdrsquoun verbe comme nom de fonction permet de mieux symboliser les opeacuterations reacutealiseacuteesIci le terme peacuterimegravetre() nrsquoest pas un verbe mais il faut comprendre par peacuterimegravetre()lrsquoaction de calculer le peacuterimegravetre

Le nom de la fonction peacuterimegravetre() eacutetant deacutefini nous souhaitons calculer le peacuterimegravetredrsquoun cercle dont la valeur du rayon soit saisie au clavier Pour cela observons leprogramme qui calcule la racine carreacutee drsquoun nombre saisi au clavier

double reacutesulat aSystemoutprint(Entrez une valeur )a = Lired()reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat)

Lrsquoinstruction reacutesultat = Mathsqrt(a) calcule la racine carreacutee du nombre a dont lavaleur a eacuteteacute saisie au clavier agrave lrsquoinstruction preacuteceacutedente Elle place ensuite le reacutesultat dece calcul dans la variable reacutesultat

En modifiant le nom drsquoappel de la fonction Mathsqrt() par peacuterimegravetre() nous obte-nons un programme qui appelle la fonction peacuterimegravetre() et qui par conseacutequent calculele peacuterimegravetre drsquoun cercle dont la valeur du rayon a est saisie au clavier La valeur du peacuteri-megravetre est placeacutee dans la variable reacutesultat par lrsquointermeacutediaire du signe drsquoaffectation =

Pour notre exemple le programme drsquoappel agrave la fonction peacuterimegravetre() srsquoeacutecrit

public static void main(String [] parametre) Deacuteclaration des variables double reacutesultat int valeur Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat)

Le programme ainsi eacutecrit permet de calculer le peacuterimegravetre drsquoun cercle de rayon donneacute agravela seule condition de deacutefinir la fonction peacuterimegravetre()dans le programme En effet cettefonction nrsquoest pas preacutedeacutefinie dans le langage Java et il est neacutecessaire de deacutetailler lesinstructions qui la composent

Sans cette deacutefinition lrsquoordinateur nrsquoest pas agrave mecircme de deacuteterminer par lui-mecircme lesinstructions agrave exeacutecuter et le message drsquoerreur Method perimetre(int) not found inclass Cercle apparaicirct en cours de compilation

Deacutefinir une fonction La deacutefinition drsquoune fonction fournit agrave lrsquoordinateur les instructions agrave exeacutecuter lors delrsquoappel de la fonction Cette opeacuteration passe par les eacutetapes suivantes

bull deacuteterminer les instructions composant la fonction

bull associer le nom de la fonction aux instructions copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

116

bull eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction

bull preacuteciser le type de reacutesultat fourni par la fonction

De faccedilon agrave mieux comprendre le rocircle de chacune de ces eacutetapes deacutefinissons la fonctionqui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Deacuteterminer les instructions composant la fonctionPour seacutelectionner les instructions utiles au calcul du peacuterimegravetre drsquoun cercle reprenons leprogramme Cercle

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la section laquo Un premier programme enJava raquo

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double r p Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R r= Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Nous avons observeacute lors de la mise en œuvre drsquoalgorithmes parameacutetreacutes que la marcheagrave suivre deacutecrivant lrsquoalgorithme devait ecirctre la plus geacuteneacuterale possible (voir la sectionlaquo Deacutefinir les paramegravetres raquo) Crsquoest pourquoi pour notre cas seules les instructions

Deacuteclaration des variables double r p Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr

sont utiliseacutees dans la fonction de calcul du peacuterimegravetre drsquoun cercle Les instructions rela-tives agrave la demande de saisie drsquoune valeur au clavier ne sont pas agrave placer dans la fonctionPour vous en convaincre observez que lrsquoordinateur agrave lrsquoappel de la fonctionMathsqrt() ne demande pas de valeur agrave saisir Il ne fait que calculer la racine carreacuteedrsquoune valeur passeacutee en paramegravetre

Les instructions ainsi choisies sont placeacutees dans ce que lrsquoon appelle dans le jargon infor-matique le corps de la fonction et ce de la faccedilon suivante

Deacutefinition du corps de la fonction deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

117

Le corps de la fonction est deacutetermineacute par les accolades et Les instructions qui lecomposent sont ici des deacuteclarations de variables et des instructions drsquoaffectation Dansdrsquoautres cas peuvent aussi figurer des instructions de test de reacutepeacutetition etc

Associer le nom aux instructions

Une fois eacutecrit le corps de la fonction il est neacutecessaire de lrsquoassocier au nom drsquoappel de lafonction

Le nom drsquoune fonction est lieacute au bloc drsquoinstructions qui la compose gracircce agrave un en-tecirctede fonction Ce dernier a pour forme

public static type nomdelafonction (paramegravetres)

Lrsquoen-tecircte drsquoune fonction permet de preacuteciser

bull Le nom de la fonction (pour notre exemple le nomdelafonction est peacuterimegravetre)

bull Les paramegravetres eacuteventuels de la fonction

bull Le type de reacutesultat fourni par la fonction

Les mots-cleacutes public static sont agrave placer pour lrsquoinstant obligatoirement devant le typede reacutesultat de la fonction

Nous expliquons la preacutesence de ces termes agrave la section laquo Collectionner un nombre fixe drsquoobjets raquodu chapitre 9 laquo La ligne de commande raquo car ils sont lieacutes aux concepts de la programmation objet

Lrsquoen-tecircte drsquoune fonction se place comme son nom lrsquoindique au-dessus du corps de lafonction Pour notre exemple il se place de la faccedilon suivante

En-tecircte de la fonctionpublic static type peacuterimegravetre (paramegravetres) deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

De cette faccedilon le corps de la fonction est associeacute au nom peacuterimegravetre() Agrave lrsquoappel du nomde la fonction peacuterimegravetre() lrsquoordinateur exeacutecute les instructions placeacutees dans le corpsde la fonction

Eacutetablir les paramegravetres utiles

Comme nous venons de le voir le peacuterimegravetre du cercle est calculeacute agrave partir du rayon dontla valeur est saisie avant lrsquoappel de la fonction La valeur du rayon est placeacutee en para-megravetre de la fonction comme lors du calcul de la racine carreacutee drsquoun nombre

Le rayon du cercle est consideacutereacute comme le paramegravetre de la fonction peacuterimegravetre() etlrsquoen-tecircte de la fonction srsquoeacutecrit comme suit

public static type peacuterimegravetre (int r)

Comme la variable r est deacuteclareacutee agrave lrsquointeacuterieur des parenthegraveses de la fonction peacuteri-megravetre() elle est consideacutereacutee par le compilateur Java comme eacutetant le paramegravetre de lafonction peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

118

Lrsquoinstruction de deacuteclaration situeacutee dans le corps de la fonction doit ecirctre ainsi modifieacutee

double p

La variable r est deacuteclareacutee dans lrsquoen-tecircte de la fonction et elle ne peut donc ecirctre deacuteclareacuteeune deuxiegraveme fois agrave lrsquointeacuterieur de la fonction sous peine de provoquer une erreur decompilation (message drsquoerreur variable rsquorrsquo is already defined in this method)

Le paramegravetre r est aussi appeleacute paramegravetre formel Il prend la forme (la valeur) de lavariable donneacutee au moment de lrsquoappel de la fonction Pour bien comprendre cela rappe-lons-nous de lrsquoalgorithme du cafeacute ou du theacute chaud dans lequel nous avons utiliseacute unevariable ingreacutedient prenant la forme de cafeacute ou de theacute suivant ce que lrsquoon souhaitaitobtenir Ici r prend la valeur de la variable valeur lors de lrsquoappel de la fonctionreacutesultat = peacuterimegravetre(valeur) depuis la fonction main()

Remarquons aussi que le paramegravetre valeur fourni lors de lrsquoappel de la fonction peacuteri-megravetre () est appeleacute paramegravetre reacuteel ou encore paramegravetre effectif Crsquoest la valeur de ceparamegravetre qui est transmise au paramegravetre formel lors de lrsquoappel de la fonction

Preacuteciser le type de reacutesultat fourni

Une fois le peacuterimegravetre calculeacute gracircce agrave lrsquoinstruction

p = 2 MathPI r

la valeur contenue dans la variable p doit ecirctre transmise et placeacutee dans la variablereacutesultat deacuteclareacutee dans le programme deacutecrit agrave la section laquo Appeler une fonction raquo de cechapitre Pour ce faire les deux opeacuterations suivantes sont agrave reacutealiser

bull Placer une instruction return suivie de la variable contenant le reacutesultat en fin de fonc-tion Pour notre cas

return p

Agrave la lecture de cette instruction le programme sort de la fonction peacuterimegravetre() ettransmet la valeur contenue dans la variable p au programme qui a appeleacute la fonctionpeacuterimegravetre()

bull Speacutecifier le type de la valeur retourneacutee dans lrsquoen-tecircte de la fonction Pour notreexemple la valeur retourneacutee est contenue dans la variable p de type double Crsquoestpourquoi lrsquoen-tecircte de la fonction srsquoeacutecrit

public static double peacuterimegravetre (int r)

De cette faccedilon le compilateur sait agrave la seule lecture de lrsquoen-tecircte que la fonctiontransmet un reacutesultat de type double

La fonction peacuterimegravetre() srsquoeacutecrit en reacutesumeacute de la faccedilon suivante

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

119

Dans notre exemple la fonction peacuterimegravetre() utilise un seul paramegravetre et retourne unreacutesultat numeacuterique Dans drsquoautres situations le nombre de paramegravetres peut varier et lesfonctions peuvent avoir soit aucun soit plusieurs paramegravetres De la mecircme faccedilon unefonction peut ne pas retourner de reacutesultat

Les fonctions au sein drsquoun programme JavaAvec les fonctions nous voyons apparaicirctre la notion de fonctions appeleacutees et deprogrammes appelant des fonctions

Dans notre exemple la fonction peacuterimegravetre() est appeleacutee par la fonction main() Cettederniegravere est consideacutereacutee par lrsquoordinateur comme eacutetant le programme principal (le termeanglais main se traduit par principal) En effet la fonction main() est la premiegravere fonc-tion exeacutecuteacutee par lrsquoordinateur au lancement drsquoun programme Java

Toute fonction peut appeler ou ecirctre appeleacutee par une autre fonction Ainsi rien nrsquointerditque la fonction peacuterimegravetre()soit appeleacutee par une autre fonction que la fonction main()

Seule la fonction main() ne peut pas ecirctre appeleacutee par une autre fonction du programmeEn effet la fonction main() nrsquoest exeacutecuteacutee qursquoune seule fois et uniquement par lrsquointer-preacuteteur Java lors du lancement du programme

Comment placer plusieurs fonctions dans un programmeLes fonctions sont des programmes distincts les uns des autres Elles sont en outre deacutefi-nies seacutepareacutement les unes des autres Pour exeacutecuter un programme constitueacute de plusieursfonctions il est neacutecessaire pour lrsquoinstant de les regrouper dans un mecircme fichier unemecircme classe

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo Compilation et exeacutecution drsquoune appli-cation multifichier raquo

Pour des raisons peacutedagogiques les fonctions main() et peacuterimegravetre() ont eacuteteacute preacutesenteacuteesseacutepareacutement En reacutealiteacute ces deux fonctions sont placeacutees agrave lrsquointeacuterieur de la mecircme classeCercle (deacutefinie notamment au chapitre introductif laquo Naissance drsquoun programme raquo)

Le programme prend la forme suivante

public class Cercle Le fichier srsquoappelle Cerclejavapublic static void main(String [] parametre) Deacuteclaration des variables int valeur double reacutesultat Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat) fin de main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

120

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p fin de peacuterimegravetre() fin de class Cercle

En examinant la structure geacuteneacuterale de ce programme nous remarquons qursquoil existe deuxblocs drsquoinstructions seacutepareacutes nommeacutes main() et peacuterimegravetre() Ces deux blocs sont placeacutesagrave lrsquointeacuterieur drsquoun bloc repreacutesentant la classe Cercle comme illustreacute agrave la Figure 5-1

Nous observons que la structure de la fonction peacuterimegravetre() est tregraves voisine de celle dela fonction main() Elle est constitueacutee drsquoun en-tecircte suivi drsquoun corps formeacute drsquoun blocdeacutefini par des accolades ouvrante et fermante

Notons pour finir que la fonction main() est ici placeacutee avant la fonction peacuterimegravetre()mais qursquoil est aussi permis de lrsquoeacutecrire apregraves Lrsquoordre drsquoapparition des fonctions dans uneclasse importe peu et est laisseacute au choix du programmeur

Les diffeacuterentes formes drsquoune fonctionNous lrsquoavons deacutejagrave observeacute (voir la section laquo Principes de fonctionnement raquo de cechapitre) les fonctions peuvent posseacuteder zeacutero un voire plusieurs paramegravetres de diffeacute-rents types De la mecircme faccedilon elles peuvent fournir ou non un reacutesultat Suivant les casleur deacutefinition varie leacutegegraverement

Fonction avec reacutesultat

Comme nous lrsquoavons observeacute lors de la deacutefinition de la fonction peacuterimegravetre() toutefonction fournissant un reacutesultat possegravede un return placeacute dans le corps de la fonction

Figure 5ndash1

Les fonctions main() et peacuterimegravetre() agrave lrsquointeacuterieur de la classe Cercle

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

121

De plus lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond au typedu reacutesultat retourneacute

Si une fonction retourne en reacutesultat une variable de type int son en-tecircte srsquoeacutecrit publicstatic int nomdelafonction()

Remarquons qursquoune fonction ne retourne qursquoune et une seule valeur Il nrsquoest donc paspossible drsquoeacutecrire lrsquoinstruction return sous la forme return ab pour retourner deuxvaleurs au programme appelant Dans un tel cas le compilateur deacutetecte une erreur dutype laquo rsquorsquo expected raquo

Lorsqursquoune fonction fournit plusieurs reacutesultats la transmission des valeurs ne peut sereacutealiser par lrsquointermeacutediaire de lrsquoinstruction return Il est neacutecessaire dans ce casdrsquoemployer des techniques plus avanceacutees (voir le chapitre 7 laquo Les classes et lesobjets raquo)

Fonction sans reacutesultat

Une fonction peut ne pas fournir de reacutesultat Tel est en geacuteneacuteral le cas des fonctions utili-seacutees pour lrsquoaffichage de messages Par exemple la fonction menu() suivante ne fournitpas de reacutesultat et ne fait qursquoexeacutecuter les opeacuterations selon la valeur du paramegravetre choix

public static void menu (int choix) switch (choix) case 1 Saisie drsquoune personne break case 2 Afficher une personne break fin de menu()

Lrsquoen-tecircte public static void menu (int choix) mentionne que la fonction menu()neretourne pas de reacutesultat gracircce au mot-cleacute void placeacute devant le nom de la fonction

Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void et lrsquoinstructionreturn ne figure pas dans le corps de la fonction

Fonction agrave plusieurs paramegravetres

Prenons pour exemple une fonction max() qui fournit en reacutesultat la plus grande des deuxvaleurs donneacutees en paramegravetres

public class Maximum Le fichier srsquoappelle Maximumjava public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

122

Systemoutprint(Entrer une valeur ) v2 = Lirei() sup = max (v1v2) Systemoutprint(Le max de + v1 + et de + v2 + est + sup) fin de main()

public static int max (int a int b) int m = a if (b gt m) m = b return m fin de max() fin de class Maximum

La fonction max()possegravede un en-tecircte

public static int max (int a int b)

qui mentionne deux paramegravetres a et b de type entier Nous observons que

bull Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes par unevirgule Lrsquoen-tecircte drsquoune fonction peut alors prendre la forme suivante

public static int quelconque (int a char c double t)

bull Devant chaque paramegravetre est placeacute son type mecircme si deux paramegravetres conseacutecutifs sontde type identique Ainsi eacutecrire lrsquoen-tecircte de la fonction max() de la faccedilon suivante

public static int max (int a b)

nrsquoest pas possible et provoque une erreur de compilation de type Identifierexpected

Fonction sans paramegravetre

Une fonction peut ne pas avoir de paramegravetre Son en-tecircte ne possegravede alors aucun para-megravetre entre parenthegraveses

Ainsi la fonction sortie() suivante permet de sortir proprement de nrsquoimporte quelprogramme

public static void sortie () Systemoutprint(Au revoir et a bientot) Fonction Java qui permet de sortir proprement drsquoun programme Systemexit(0)

ReacutesumeacuteUn algorithme parameacutetreacute est une marche agrave suivre qui fournit un reacutesultat pouvantdiffeacuterer suivant la valeur du ou des paramegravetres Dans le langage Java les algorithmesparameacutetreacutes srsquoappellent des fonctions ou encore des meacutethodes

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

123

Le langage Java propose un ensemble de fonctions preacutedeacutefinies fort utiles Parmi ces fonc-tions se trouvent les fonctions matheacutematiques telles que Mathsqrt() pour calculer laracine carreacutee du nombre placeacute entre parenthegraveses ou Mathlog() pour le logarithme

Lrsquoeacutetude des fonctions matheacutematiques montre que

bull Pour exeacutecuter une fonction il est neacutecessaire drsquoeacutecrire dans une instruction le nomde la fonction choisie suivi des paramegravetres eacuteventuels placeacutes entre parenthegraveses

bull Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante etfermante

bull Le type et lrsquoordre des paramegravetres dans lrsquoappel de la fonction doivent ecirctrerespecteacutes sous peine drsquoobtenir une erreur de compilation ou drsquoexeacutecution

Le langage Java offre en outre au programmeur la possibiliteacute drsquoeacutecrire ses propresfonctions de faccedilon agrave obtenir des programmes bien adapteacutes au problegraveme qursquoil doitreacutesoudre La deacutefinition drsquoune fonction passe par plusieurs eacutetapes qui permettent de

bull Preacuteciser les instructions composant la fonction en les placcedilant dans le corps de lafonction Ce dernier est deacutetermineacute par des accolades

bull Associer le nom de la fonction aux instructions agrave lrsquoaide drsquoun en-tecircte qui preacutecise lenom de la fonction le type des paramegravetres (appeleacutes paramegravetres formels) et le typede reacutesultat retourneacute Cet en-tecircte se reacutedige sous la forme suivante

public static type nomdelafonction (paramegravetres)

bull Eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction en les deacuteclarant agrave lrsquointeacute-rieur des parenthegraveses placeacutees juste apregraves le nom de la fonction

ndash Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes parune virgule Devant chaque paramegravetre est placeacute son type mecircme si deux para-megravetres conseacutecutifs sont de type identique

ndash Lorsqursquoune fonction nrsquoa pas de paramegravetre son en-tecircte ne possegravede aucun para-megravetre entre parenthegraveses

bull Preacuteciser le type de reacutesultat fourni par la fonction dans lrsquoen-tecircte de la fonction etplacer lrsquoinstruction return degraves que le reacutesultat doit ecirctre transmis au programmeappelant la fonction

ndash Toute fonction fournissant un reacutesultat possegravede un return placeacute dans le corps dela fonction

ndash Lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond autype de reacutesultat retourneacute Remarquons qursquoune fonction ne retourne qursquoune etune seule valeur

ndash Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void etlrsquoinstruction return ne figure pas dans le corps de la fonction

Une fonction peut ecirctre appeleacutee (exeacutecuteacutee) depuis une autre fonction ou depuis la fonc-tion main() qui repreacutesente le programme principal Lrsquoappel drsquoune fonction est reacutealiseacuteen eacutecrivant une instruction composeacutee du nom de la fonction suivi entre parenthegravesesdrsquoune liste de paramegravetres

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

124

ExercicesApprendre agrave deacuteterminer les paramegravetres drsquoun algorithme

Pour eacutecrire lrsquoalgorithme permettant de reacutealiser une boisson plus ou moins sucreacuteeproceacutedez de la faccedilon suivante

a Eacutecrivez le bloc drsquoinstructions qui place un nombre deacutetermineacute de morceaux desucre dans une boisson chaude

b Deacuteterminez le paramegravetre qui permet de sucrer plus ou moins la boisson

c Donnez un nom agrave lrsquoalgorithme et preacutecisez le paramegravetre

d Eacutecrivez lrsquoalgorithme en utilisant le nom du paramegravetre

e Appelez lrsquoalgorithme parameacutetreacute par son nom en tenant compte du nombre demorceaux de sucre souhaiteacute

Comprendre lrsquoutilisation des fonctions Agrave la lecture du programme suivant

public class Fonction public static void main(String [] parametre) Deacuteclaration des variables int acompteur for (compteur = 0 compteur lt= 5 compteur++) a = calculer(compteur) Systemoutprint(a + a ) fin de main()

public static int calculer(int x) int y y = x x return y fin de fonc1() fin de class

a Deacutelimitez les trois blocs deacutefinissant la fonction main() la fonction calculer()et la classe Fonction

b Quel est le paramegravetre formel de la fonction calculer()

c Quelles sont les valeurs transmises au paramegravetre de la fonction calculer() lorsde son appel depuis la fonction main()

d Quels sont les reacutesultats produits par la fonction calculer()

e Quelles sont les valeurs transmises agrave la variable a

f Deacutecrivez lrsquoaffichage reacutealiseacute par la fonction main()

51

52

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

125

Soit la fonction

public static int f( int x) int resultat resultat = -x x + 3 x ndash 2 return resultat

a Eacutecrivez la fonction main() qui affiche le reacutesultat de la fonction f(x) pour x = 0

b Transformez la fonction main() de faccedilon agrave calculer et agrave afficher le reacutesultat de lafonction pour x entier variant entre -5 et 5 Utilisez pour cela dans la fonctionmain() une boucle for avec un indice variant entre -5 et 5

c Pour deacuteterminer le maximum de la fonction f(x) entre -5 et 5 calculez la valeurde f(x) pour chacune de ces valeurs et stockez le maximum dans une variable max

Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction

Deacuteterminez les erreurs de compilation des extraits de programmes suivants

a En utilisant la fonction max() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables double v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lired() Systemoutprint(Entrer une valeur ) v2 = Lired() sup = max (v1v2) Systemoutprint(Le max de + v1 + et + v2 + est + sup) fin de main()

b

public static int max (int a int b) float m = a if (m gt b) m = b return m fin de max()

c En utilisant la fonction menu() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 Systemoutprint(Entrer une valeur ) v1 = Lirei() v1 = menu (v2) fin de main()

53

54

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

126

d

public static void menu (int c) switch (c) return c

Eacutecrire une fonction simpleEacutecrivez la fonction pourcentage() qui permet de calculer les pourcentagesdrsquoutilisation de la Carte Bleue du cheacutequier et des virements automatiques sachantque la formule de calcul du pourcentage pour la Carte Bleue est comme nouslrsquoavons vu au chapitre 1 laquo Stocker une information raquo la suivante

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Suivez les eacutetapes deacutecrites dans le preacutesent chapitre

a Deacuteterminez les instructions composant la fonction

b Associez le nom de la fonction aux instructions

c Pour deacuteterminer les paramegravetres de la fonction recherchez les valeurs pouvantmodifier le reacutesultat du calcul

Aide lrsquoen-tecircte drsquoune fonction ayant deux paramegravetres entiers srsquoeacutecrit public static type nomdelafonction( int a int b)

d Preacutecisez le type de reacutesultat fourni par la fonction

e Eacutecrivez la fonction main() qui fait appel agrave la fonction pourcentage() et quipermette drsquoobtenir une exeacutecution telle que

Nombre de paiement par Carte Bleue 5Nombre de cheques emis 10Nombre de virements automatiques 5Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

Le projet laquo Gestion drsquoun compte bancaire raquoLe programme eacutecrit au chapitre 4 laquo Faire des reacutepeacutetitions raquo est suffisamment structureacutepour y placer des fonctions En effet chaque option du projet est un programme agrave partentiegravere et peut donc ecirctre deacutecrite sous forme de fonction

Dans le cadre de ce chapitre nous allons construire trois fonctions relativement simplesqui vont nous permettre de comprendre le meacutecanisme de construction des fonctions

55

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

127

Deacutefinir une fonction Les fonctions sans paramegravetre avec reacutesultatLa fonction menuPrincipal()affiche le menu principal du programme et demande lasaisie de lrsquooption choisie Cette valeur doit ecirctre communiqueacutee agrave la fonction main() pourexeacutecuter la structure switch qui suit cette fonction

a Deacutecrivez lrsquoen-tecircte de la fonction menuPrincipal() en prenant soin de preacuteciser letype correspondant agrave la valeur retourneacutee

b Placez les instructions relatives agrave lrsquoaffichage du menu et agrave la saisie de lrsquooption dansle corps de la fonction

c Veacuterifiez que lrsquoopeacuterateur return soit appliqueacute agrave la variable contenant le choix delrsquooption

Les fonctions sans paramegravetre ni reacutesultatLa fonction sortir() affiche un message de politesse avant de sortir proprement duprogramme Elle ne fournit pas de reacutesultat et nrsquoa pas non plus besoin de paramegravetrepuisque aucune valeur speacutecifique nrsquoest neacutecessaire agrave son exeacutecution

a Deacutecrivez lrsquoen-tecircte de la fonction sortir()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

La fonction alAide() affiche agrave lrsquoeacutecran une explication sur ce que reacutealise chaque optionde lrsquoapplication

a Deacutecrivez lrsquoen-tecircte de la fonction alAide()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Appeler une fonction Modifiez la fonction main() de votre programme de faccedilon agrave utiliser les trois fonctionsalAide() sortir() et menuPrincipal() deacutefinies aux eacutetapes preacuteceacutedentes

Lrsquoexeacutecution finale du programme doit ecirctre identique agrave celle du chapitre preacuteceacutedent Seulela structure interne du programme est modifieacutee ce dernier eacutetant composeacute de quatrelaquo blocs fonctions raquo

copy copyright Eacuteditions Eyrolles

6Fonctions notions avanceacutees

La creacuteation et lrsquoutilisation de fonctions deacutedieacutees agrave la reacutesolution drsquoun problegraveme donneacute sontnous lrsquoavons observeacute au chapitre preacuteceacutedent des opeacuterations fondamentales qui permet-tent le deacuteveloppement de logiciels dont le code source soit facilement reacuteutilisable

Ces fonctions transforment la structure geacuteneacuterale des programmes et apportent de ce faitde nouveaux concepts qursquoil est important de bien maicirctriser avant drsquoeacutetudier la program-mation objet

Nous commenccedilons par examiner (section laquo La structure drsquoun programme raquo) cesnouvelles notions telles que la visibiliteacute des variables les variables locales et les varia-bles de classe agrave partir drsquoexemples simples Pour chacune de ces notions nous observonsleur reacutepercussion sur le reacutesultat des diffeacuterents programmes donneacutes en exemple

Nous analysons ensuite (section laquo Les fonctions communiquent raquo) comment les fonc-tions eacutechangent des donneacutees par lrsquointermeacutediaire des paramegravetres et du retour de reacutesultatAgrave partir de cette analyse nous constatons que ces modes de communication ne permet-tent pas toujours drsquoobtenir lrsquoopeacuteration souhaiteacutee

La structure drsquoun programme Nous avons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Les fonctions au seindrsquoun programme Java raquo ) qursquoun programme eacutetait constitueacute drsquoune classe qui englobe unensemble de fonctions deacutefinissant chacune un bloc drsquoinstructions indeacutependant

En reacutealiteacute il existe trois principes fondamentaux qui reacutegissent la structure drsquounprogramme Java Ces principes sont deacutetailleacutes ci-dessous

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

130

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visibleen dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions de visibiliteacute des variables de variableslocales et de variables de classe Concregravetement ces trois notions sont attacheacutees au lieude deacuteclaration des variables comme lrsquoillustre la Figure 6-1

Pour mieux comprendre ces diffeacuterents concepts nous allons observer un programmecomposeacute de deux fonctions main() et modifier() et drsquoune variable nommeacutee valeurLa fonction modifier() a pour objectif de modifier le contenu de la variable valeurPour chaque exemple la variable valeur est deacuteclareacutee en un lieu diffeacuterent du programmeAgrave partir de ces variations le programme fournit un reacutesultat diffeacuterent que nous analysons

La visibiliteacute des variables

Apregraves eacutetude des trois proprieacuteteacutes eacutenonceacutees ci-dessus nous observons qursquoun programmeest constitueacute de deacuteclarations de variables et de fonctions Il existe de fait une notiondrsquoexteacuterieur et drsquointeacuterieur aux fonctions Les instructions eacuteleacutementaires de type affecta-tion test etc se situent toujours agrave lrsquointeacuterieur drsquoune fonction alors que la deacuteclaration devariables est une opeacuteration reacutealisable agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur drsquoune fonction

Figure 6ndash1

Les variables peuvent ecirctre deacuteclareacutees agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur des fonctions mais toujours dans une classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

131

De plus la troisiegraveme proprieacuteteacute eacutenumeacutereacutee ci-dessus exprime qursquoune fonction ne peut pasutiliser dans ses instructions une variable deacuteclareacutee dans une autre fonction Pour mieuxvisualiser cette proprieacuteteacute examinons le programme ci-dessous

Exemple code source complet

public class Visibilite public static void main(String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class Visibilite

Dans ce programme nous constatons que lrsquoinstruction valeur = 3 placeacutee dans lafonction modifier() cherche agrave modifier le contenu de la variable valeur deacuteclareacutee nonpas dans la fonction modifier() mais dans la fonction main()

Cette modification nrsquoest pas reacutealisable car la variable valeur nrsquoest deacutefinie qursquoagrave lrsquointeacute-rieur de la fonction main() Elle est donc invisible depuis la fonction modifier() Lesfonctions sont par deacutefinition des blocs distincts La fonction modifier()ne peut agir surla variable valeur qui nrsquoest visible qursquoagrave lrsquointeacuterieur de la fonction main()

Crsquoest pourquoi le fait drsquoeacutecrire lrsquoinstruction valeur = 3 dans la fonction modifier()provoque une erreur de compilation du type Line 12 Undefined variable valeur

Figure 6ndash2

Une variable deacuteclareacutee dans une fonction ne peut pas ecirctre utlisiseacutee par une autre fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

132

Variable locale agrave une fonctionLa deuxiegraveme proprieacuteteacute eacutenonceacutee preacuteceacutedemment eacutetablit qursquoune fonction est formeacuteedrsquoinstructions eacuteleacutementaires et notamment des instructions de deacuteclaration de variables

Par deacutefinition une variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est dite variable localeagrave la fonction Pour lrsquoexemple preacuteceacutedent la variable valeur est locale agrave la fonctionmain()

Les variables locales nrsquoexistent que pendant le temps de lrsquoexeacutecution de la fonction Ellesne sont pas modifiables depuis une autre fonction Nous lrsquoavons vu agrave la section preacuteceacute-dente le contenu de la variable valeur ne peut ecirctre modifieacute par une instruction situeacutee endehors de la fonction main()

Cependant le programmeur deacutebutant qui souhaite modifier agrave tout prix la variable valeurva chercher agrave corriger dans un premier temps lrsquoerreur de compilation eacutenonceacutee ci-dessusPour cela il deacuteclare une variable valeur agrave lrsquointeacuterieur de la fonction modifier() et uneautre agrave lrsquointeacuterieur de la fonction main() De cette faccedilon la variable valeur est deacutefiniedans chacune des fonctions et aucune erreur de compilation nrsquoest deacutetecteacutee Examinonsplus preacuteciseacutement ce que reacutealise un tel programme

Exemple code source complet

public class VariableLocale public static void main(String [] paramegravetre) deacuteclaration de variables locales int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableLocale

Pour bien comprendre ce qursquoeffectue ce programme construisons le tableau drsquoeacutevolution(voir au chapitre 1 laquo Stocker une information raquo la section laquo Lrsquoinstruction drsquoaffectation raquo)de chaque variable deacuteclareacutee dans le programme Cerclejava

Puisque les fonctions main() et modifier() sont des blocs drsquoinstructions seacutepareacuteslrsquointerpreacuteteur Java creacutee un emplacement meacutemoire pour chaque deacuteclaration de la variablevaleur Il existe deux cases meacutemoire valeur distinctes portant le mecircme nom Elles sont

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

133

distinctes parce qursquoelles nrsquoappartiennent pas agrave la mecircme fonction Le tableau des varia-bles deacuteclareacutees pour chaque fonction est le suivant

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()Valeur = 3 dans modifier()Valeur = 2 apres modifier()

Agrave lrsquoexeacutecution du programme le premier appel agrave la fonction Systemoutprintln() affi-che le contenu de la variable valeur deacutefinie dans la fonction main() soit 2

Le programme reacutealise ensuite les actions suivantes

bull Appeler la fonction modifier() qui affiche le contenu de la variable valeur deacutefinie agravelrsquointeacuterieur de cette fonction soit 3

bull Sortir de la fonction modifier() et deacutetruire la variable valeur locale agrave cette fonction

bull Retourner agrave la fonction main() et afficher de nouveau le contenu de la variable valeurdeacutefinie dans la fonction main() soit 2

La variable valeur est deacuteclareacutee deux fois dans chacune des deux fonctions et nous cons-tatons que la fonction modifier() ne change pas le contenu de la variable valeurdeacuteclareacutee dans la fonction main() En reacutealiteacute mecircme si ces deux variables portent le mecircmenom elles sont totalement diffeacuterentes et leur valeur est stockeacutee dans deux casesmeacutemoire distinctes

En cherchant agrave reacutesoudre une erreur de compilation nous nrsquoavons pas eacutecrit la fonction quimodifie la valeur drsquoune variable deacutefinie en dehors drsquoelle-mecircme Cette modification est

Variable locale agrave main() valeur Variable locale agrave modifier() valeur

valeur = 2 2 valeur = 3 3

Figure 6ndash3

Toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est une variable locale propre agrave cette fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

134

impossible dans la mesure ougrave la variable valeur nrsquoest connue que de la fonction etdrsquoaucune autre

Variable de classeEn examinant plus attentivement la premiegravere proprieacuteteacute deacutefinie au deacutebut de ce chapitre(voir section laquo La structure drsquoun programme raquo) nous remarquons que les classescontiennent eacutegalement des instructions de deacuteclaration en dehors de toute fonction Lesvariables ainsi deacuteclareacutees sont appeleacutee variables de classe Elles sont deacutefinies pourlrsquoensemble du programme et sont visibles depuis toutes les fonctions

La deacuteclaration des variables de classe se reacutealise comme deacutecrit ci-dessous

Exemple code source complet

public class VariableDeClasse deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableDeClasse

Figure 6-4

Une variable deacuteclareacutee en dehors de toute fonction est appeleacutee variable de classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

135

Gracircce agrave lrsquoinstruction static int valeur la variable valeur est deacutefinie pour tout leprogramme VariableDeClasse Le mot-cleacute static est important car lorsque lrsquointerpreacute-teur Java le rencontre il creacuteeacute une case meacutemoire en un seul exemplaire accessible depuisnrsquoimporte quelle meacutethode (voir au chapitre 8 laquo Les principes du concept Objet raquo lasection laquo La communication objet raquo)

La repreacutesentation par blocs du programme (voir Figure 6-4) montre que la variablevaleur est visible tout au long du programme

Puisque la variable valeur est deacuteclareacutee agrave lrsquoexteacuterieur des fonctions main() et modifier()elle est deacutefinie comme eacutetant une variable de la classe VariableDeClasse La variablevaleur existe tout le temps de lrsquoexeacutecution du programme et les fonctions deacutefinies agravelrsquointeacuterieur de la classe peuvent lrsquoutiliser et modifier son contenu

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()

Valeur = 3 dans modifier()

Valeur = 3 apres modifier()

La variable valeur eacutetant une variable de classe lrsquoordinateur ne creacutee qursquoun seul emplace-ment meacutemoire Le tableau drsquoeacutevolution de la variable est le suivant

Puisqursquoil nrsquoexiste qursquoune seule case meacutemoire nommeacutee valeur celle-ci est commune agravetoutes les fonctions du programme qui peuvent y deacuteposer une valeur Lorsque la fonc-tion modifier() place 3 dans la case meacutemoire valeur elle eacutecrase la valeur 2 que lafonction main() avait preacuteceacutedemment placeacutee

En utilisant le concept de variable de classe nous pouvons eacutecrire une fonction quimodifie le contenu drsquoune variable deacutefinie en dehors de la fonction

Quelques preacutecisions sur les variables de classe

Puisque les variables locales ne sont pas modifiables depuis drsquoautres fonctions et que agravelrsquoinverse les variables de classe sont vues depuis toutes les fonctions du programme leprogrammeur deacutebutant aura tendance pour se simplifier la vie agrave nrsquoutiliser que des varia-bles de classe

Or lrsquoutilisation abusive de ce type de variables comporte plusieurs inconveacutenients quenous deacutetaillons ci-dessous

Variable de classe valeur

valeur = 2 dans la fonction main() 2

valeur = 3 dans la fonction modifier() 3

valeur = 3 dans la fonction main() 3

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

136

Deacuteclarer plusieurs variables portant le mecircme nom

Lrsquoemploi systeacutematique des variables de classe peut ecirctre source drsquoerreurs surtoutlorsqursquoon prend lrsquohabitude de deacuteclarer des variables portant le mecircme nom Observons leprogramme suivant

public class MemeNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(valeur + dans modifier() avant la deacuteclaration) Deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(valeur + dans modifier() apres la declaration) fin de modifier fin de class MemeNom

Dans ce programme la variable valeur est deacuteclareacutee deux fois une fois comme varia-ble de classe et une autre fois comme variable locale agrave la fonction modifier() Riennrsquointerdit de deacuteclarer plusieurs fois une variable portant le mecircme nom dans des blocsdrsquoinstructions diffeacuterents

Le fait de deacuteclarer deux fois la mecircme variable nrsquoest cependant pas sans conseacutequencesur le reacutesultat du programme

Dans la fonction modifier() les deux variables valeur coexistent et repreacutesententdeux cases meacutemoire distinctes Lorsque lrsquoinstruction valeur = 3 est exeacutecuteacuteelrsquointerpreacuteteur Java ne peut placer la valeur numeacuterique 3 dans les deux cases meacutemoireagrave la fois Il est obligeacute de choisir Dans un tel cas la regravegle veut que ce soit la variablelocale qui soit prise en compte et non la variable de classe

Le reacutesultat final du programme est le suivant

Valeur = 2 avant modifier()2 dans modifier() avant la declaration3 dans modifier() apregraves la dclarationValeur = 2 apregraves modifier()

La modification nrsquoest valable que localement Lorsque le programme retourne agrave la fonc-tion main() la variable locale nrsquoexiste plus Le programme affiche le contenu de lavariable de classe soit 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

137

Le veacuteritable nom drsquoune variable de classe

Une variable de classe se diffeacuterencie des variables locales par son nom Lorsqursquounevariable de classe est deacuteclareacutee lrsquoordinateur lui donne un nom qui lui permet de la distin-guer des autres variables

Ce nom est constitueacute du nom de la classe suivi drsquoun point puis du nom de la variabledeacuteclareacutee Pour lrsquoexemple suivant la variable de classe valeur srsquoappelle en fait Verita-bleNomvaleur Le programme peut srsquoeacutecrire de la faccedilon suivante

public class VeritableNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) VeritableNomvaleur = 2 Systemoutprintln(VeritableNomvaleur + avant modifier() ) modifier() Systemoutprintln(VeritableNomvaleur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(Variable de classe + VeritableNomvaleur ) Deacuteclaration de variables locales int valeur = 3 Systemoutprintln(Variable locale + valeur ) VeritableNomvaleur = 3 Systemoutprintln(Variable de classe + VeritableNomvaleur ) fin de modifier fin de class VeritableNom

En eacutecrivant la variable de classe par son nom veacuteritable lrsquoambiguiumlteacute sur lrsquoemploi de lavariable de classe ou de la variable locale est leveacutee et lrsquoexeacutecution du programme a lereacutesultat suivant

2 avant modifier()Variable de classe 2Variable locale 3Variable de classe 33 apregraves modifier()

Pour eacuteviter toute meacuteprise il est recommandeacute drsquoutiliser les variables de classe avec parci-monie et chaque fois avec leur nom complet En pratique seules les variables qui preacutesen-tent un inteacuterecirct geacuteneacuteral pour le programme sont agrave deacuteclarer comme variables de classe

De lrsquoindeacutependance des fonctions

Comme nous lrsquoavons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Algorithmeparameacutetreacute raquo) une fonction est avant tout un sous-programme indeacutependant capabledrsquoecirctre exeacutecuteacute autant de fois que neacutecessaire et traitant des donneacutees diffeacuterentes

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

138

En construisant des fonctions qui utilisent des variables de classe nous creacuteons des fonc-tions qui ne sont plus des modules de programmes indeacutependants mais des extraits deprogrammes travaillant tous sur le mecircme jeu de variables

Cette deacutependance aux variables de classe nuit au programme car il est neacutecessaire pourreacuteutiliser de telles fonctions de modifier tous les noms des variables de classe de faccedilonagrave les rendre compatibles avec les nouveaux programmes

En cas de deacuteveloppement de logiciels importants comportant des centaines de milliersdrsquoinstructions la transformation et lrsquoameacutelioration des fonctionnaliteacutes du programme setrouvent fortement compromises Lrsquoensemble du code doit ecirctre examineacute preacuteciseacutement afinde deacuteterminer ougrave se trouve la variable de classe concerneacutee par la transformation envi-sageacutee

Dans ce cadre il convient de prendre les regravegles suivantes

bull Utiliser les variables de classe en nombre limiteacute le choix de ce type de variablesrsquoeffectuant en fonction de lrsquoimportance de la variable dans le programme Unevariable est consideacutereacutee comme une variable de classe lorsqursquoelle est commune agrave ungrand nombre de fonctions

bull Eacutecrire un programme de faccedilon modulaire chaque fonction travaillant de faccedilon indeacute-pendante agrave partir de valeurs transmises agrave lrsquoaide des techniques eacutetudieacutees agrave la sectionsuivante

Les fonctions communiquentLrsquoemploi systeacutematique des variables de classe peut ecirctre comme nous venons de le voirsource drsquoerreurs Pour limiter leur utilisation il existe des techniques simples qui fontque deux fonctions communiquent le contenu drsquoune case meacutemoire locale de lrsquoune desfonctions agrave une case meacutemoire locale de lrsquoautre

Ces techniques sont baseacutees sur le parameacutetrage des fonctions et sur le retour de reacutesultat

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Pour mieux cerner le fonctionnement de chacune de ces techniques nous allons leseacutetudier agrave lrsquoaide drsquoun programme composeacute de deux fonctions main() et tripler() etdrsquoune variable valeur locale agrave la fonction main() La fonction tripler() a pourobjectif de multiplier par trois le contenu de la variable valeur

Le passage de paramegravetres par valeurNotre contrainte est cette fois de nrsquoutiliser que des variables locales Nous supposonsdonc que la variable valeur soit locale agrave la fonction main() Pour multiplier par troiscette valeur la fonction tripler() doit connaicirctre effectivement le contenu de la variablevaleur

La fonction main() doit communiquer pour cela le contenu de la variable valeur agrave lafonction modifier() Cette communication est reacutealiseacutee en passant le contenu de lavariable au paramegravetre de la fonction tripler() Examinons le programme ci-dessous

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

139

Exemple code source complet

public class ParValeur public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static void tripler (int valeur) Systemoutprintln(Valeur = + valeur + dans tripler() ) valeur = 3 valeur Systemoutprintln(Valeur = + valeur + dans tripler() ) fin de tripler fin de class ParValeur

Dans ce programme deux variables valeurs sont deacuteclareacutees La premiegravere est locale agrave lafonction main() tandis que la seconde est locale agrave la fonction tripler() Cependantcomme la seconde est deacuteclareacutee dans lrsquoen-tecircte de la fonction elle est consideacutereacutee commevariable locale agrave la fonction et surtout comme paramegravetre formel de la fonctiontripler()

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Deacutefinir unefonction raquo

De cette faccedilon lorsque la fonction tripler() est appeleacutee depuis la fonction main()avec comme valeur de paramegravetre le contenu de valeur soit 2 la variable valeur localede tripler() prend la valeur 2 (voir Figure 6-5)

Figure 6-5

Gracircce au paramegravetre le contenu drsquoune variable locale agrave la fonction appelante main() est transmis agrave la fonction appeleacutee tripler()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

140

Ensuite la variable valeur locale agrave la fonction tripler() est multiplieacutee par trois gracircceagrave lrsquoinstruction valeur = 3 valeur La variable valeur vaut donc 6 dans la fonctiontripler() Lorsque le programme sort de la fonction tripler() et retourne agrave la fonctionmain() il deacutetruit la variable locale de la fonction tripler() et affiche le contenu de lavariable valeur locale agrave la fonction main() soit encore 2

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()Valeur = 2 dans tripler()Valeur = 6 dans tripler() Valeur = 2 apres tripler()

Gracircce au paramegravetre de la fonction tripler() le contenu de la variable valeur locale agravela fonction main() est transmis agrave la fonction tripler() Une fois la fonction exeacutecuteacuteenous constatons que la variable valeur de la fonction main() nrsquoest pas modifieacutee pourautant

En effet la valeur passeacutee en paramegravetre est copieacutee dans la case meacutemoire associeacutee au para-megravetre Mecircme si le paramegravetre porte le mecircme nom que la variable il srsquoagit de deux casesmeacutemoire distinctes La modification reste donc locale agrave la fonction

Lorsqursquoune fonction communique le contenu drsquoune variable agrave une autre fonction parlrsquointermeacutediaire drsquoun paramegravetre on dit que le paramegravetre est passeacute par valeur Ce typede transmission de donneacutees ne permet pas de modifier dans la fonction appelante lecontenu de la variable passeacutee en paramegravetre

Le reacutesultat drsquoune fonction Pour garder le reacutesultat de la modification du contenu drsquoune variable en sortie de fonctionune technique consiste agrave retourner la valeur calculeacutee par lrsquointermeacutediaire de lrsquoinstructionreturn

Examinons le programme ci-dessous qui utilise cette technique

Exemple code source complet

public class Resultat public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) valeur = tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static int tripler (int v) Systemoutprintln(v = + v + dans tripler() )

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

141

int reacutesultat = 3v Systemoutprintln(Resultat = + reacutesultat + dans tripler() ) return reacutesultat fin de tripler

fin de class Resultat

Ici le contenu de la variable valeur est passeacute au paramegravetre v de la fonction tripler()Puisque le paramegravetre formel (v) correspond agrave une case meacutemoire distincte de la variableeffectivement passeacutee (valeur) il est plus judicieux de le deacuteclarer sous un autre nomdrsquoappel que celui de la variable de faccedilon agrave ne pas les confondre En geacuteneacuteral et tant quecela reste possible nous avons pour convention de donner comme nom drsquoappel du para-megravetre formel la premiegravere lettre du paramegravetre reacuteel Pour notre exemple valeur est leparamegravetre reacuteel Le paramegravetre formel srsquoappelle donc v

Une fois le calcul reacutealiseacute agrave lrsquointeacuterieur de la fonction tripler() la valeur reacutesultanteplaceacutee dans la variable reacutesultat est transmise agrave la fonction main() qui a appeleacute la fonc-tion tripler() Cette transmission est reacutealiseacutee gracircce agrave lrsquoinstruction return reacutesultatLe contenu du reacutesultat est alors placeacute dans la variable valeur gracircce au signe drsquoaffectation= comme lrsquoillustre la Figure 6-6

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()v = 2 dans tripler() Resultat = 6 dans tripler()Valeur = 6 apregraves tripler()

Gracircce agrave la technique du retour de reacutesultat et du passage de paramegravetre par valeur les fonc-tions peuvent eacutechanger les contenus de variables Les variables locales sont donc exploi-

Figure 6-6

Gracircce au retour de reacutesultat le contenu drsquoune variable locale agrave la fonction appeleacutee tripler() est transmis agrave la fonction appelante main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

142

tables aussi facilement que les variables de classe tout en eacutevitant les inconveacutenients lieacutesagrave ces derniegraveres

Lorsqursquoil y a plusieurs reacutesultats agrave retournerUne difficulteacute subsiste le retour de reacutesultat ne peut se reacutealiser que sur une seule valeurIl nrsquoest pas possible de retourner plusieurs valeurs agrave la fois Si lrsquoon souhaite eacutecrire lrsquoalgo-rithme qui eacutechange le contenu de deux variables (voir au chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) sous forme de fonc-tion nous nous trouvons confronteacute au problegraveme deacutecrit dans lrsquoexemple ci-dessous

Exemple code source complet

public class PlusieursResultats public static void main (String [] arg) int a b Systemoutprint(Entrer une valeur pour a ) a = Lirei() Systemoutprint(Entrer une valeur pour b ) b = Lirei() Systemoutprintln( a = +a+ b = +b) eacutechange (ab) Systemoutprintln(Apres echange) Systemoutprintln( a = +a+ b = +b) public static void eacutechange(int x int y) int tmp = x x = y y = tmp

La fonction eacutechange()reacutealise theacuteoriquement lrsquoeacutechange du contenu des deux variablespasseacutees en paramegravetres Si a prend la valeur 1 et que b vaille 2 apregraves exeacutecution de la fonc-tion eacutechange() a doit prendre la valeur de b soit 1 et b la valeur de a soit 2

Reacutesultat de lrsquoexeacutecution

Examinons le reacutesultat de lrsquoexeacutecution de ce programme en supposant que les caractegraveresgriseacutes soient les valeurs choisies par lrsquoutilisateur

Entrer une valeur pour a 11Entrer une valeur pour b 22a = 1 b = 2Apres echangea = 1 b = 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

143

Nous le constatons agrave lrsquoexeacutecution aucun eacutechange nrsquoa eacuteteacute reacutealiseacute Il nrsquoy a rien drsquoeacutetonnantagrave cela puisque le passage des paramegravetres est un passage par valeur et qursquoil ne modifiepas le contenu des paramegravetres reacuteels a et b passeacutes agrave la fonction eacutechange()

La solution qui consiste agrave retourner le reacutesultat est impossible En effet il serait neacutecessairede retourner les deux variables eacutechangeacutees et il nrsquoest pas possible drsquoeacutecrire return x y la syntaxe de cette instruction nrsquoeacutetant pas valide

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Dans lrsquoeacutetat actuel de nos connaissances nous ne sommes pas agrave mecircme de reacutecupeacuterer diffeacute-rentes valeurs modifieacutees au sein drsquoune fonction En reacutealiteacute seul le concept drsquoobjet permetde reacutealiser un tel exploit Nous lrsquoeacutetudions au chapitre suivant

ReacutesumeacuteUn programme Java est structureacute selon les trois principes fondamentaux suivants

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visi-ble en dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions suivantes

bull Visibiliteacute toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction nrsquoest visible quedans cette fonction et ne peut ecirctre utiliseacutee dans une autre fonction

bull Variable locale toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est unevariable locale agrave cette fonction Ces variables nrsquoexistent que le temps de lrsquoexeacutecu-tion de la fonction et elles ne sont pas modifiables depuis une autre fonction

bull Variable de classe les variables deacuteclareacutees en dehors de toute fonction sont appe-leacutees des variables de classe Ces variables sont deacutefinies pour lrsquoensemble duprogramme et elles sont visibles et modifiables par toutes les fonctions de laclasse

Lorsqursquoune variable de classe et une variable locale portant le mecircme nom coexistentagrave lrsquointeacuterieur drsquoune fonction la regravegle veut que ce soit la variable locale qui soit priseen compte et non la variable de classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

144

ExercicesRepeacuterer les variables locales et les variables de classe

En observant le programme suivant

public class Calculette public static double reacutesultat

public static void main( String [] argument) int a b menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calculer() afficher() public static void calculer() char opeacuteration switch (opeacuteration) case rsquo+rsquo reacutesultat = a + b break case rsquo-rsquo reacutesultat = a ndash b break case rsquorsquo reacutesultat = a b

Les fonctions sont des blocs drsquoinstructions distinctes Pour communiquer le contenudrsquoune case meacutemoire (variable) locale de lrsquoune agrave une case meacutemoire locale de lrsquoautrefonction il est neacutecessaire drsquoutiliser les techniques suivantes

bull Les paramegravetres des fonctions lorsqursquoune fonction communique le contenudrsquoune variable agrave une autre fonction par lrsquointermeacutediaire drsquoun paramegravetre on dit quele paramegravetre est passeacute par valeur Ce type de transmission de donneacutees ne permetpas de modifier dans la fonction appelante le contenu de la variable passeacutee enparamegravetre

bull Le retour de reacutesultat pour garder en reacutesultat la modification du contenu drsquounevariable en sortie de fonction une technique consiste agrave retourner la valeurcalculeacutee par lrsquointermeacutediaire de lrsquoinstruction return

Ces deux modes de communication ne permettent pas de reacutecupeacuterer plusieursdonneacutees modifieacutees agrave lrsquointeacuterieur drsquoune fonction Seul le concept drsquoobjet eacutetudieacute auchapitre suivant permet de reacutealiser cette opeacuteration

61

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

145

break case rsquorsquo reacutesultat = a b break

public static void afficher() char opeacuteration Systemoutprint(a + +opeacuteration + + b + = + reacutesultat) public static void menu() char opeacuteration Systemoutprintln(Je sais compter entrez lrsquooperation choisie) Systemoutprintln( + pour additionner ) Systemoutprintln( - pour soustraire ) Systemoutprintln( pour pultiplier ) Systemoutprintln( pour diviser ) Systemoutprintln( (+ - ) ) opeacuteration = Lirec()

a Recherchez les diffeacuterentes fonctions deacutefinies dans la classe Calculette

b Dessinez le programme sous forme de scheacutema en repreacutesentant les fonctions agravelrsquoaide de blocs Placez les variables dans les blocs ougrave elles sont deacuteclareacutees

c Agrave lrsquoaide du scheacutema deacuteterminez les variables locales agrave chacune des fonctionsainsi que les variables de classe

d Apregraves exeacutecution de la fonction menu() et lecture des deux valeurs numeacuteriques a etb la fonction calculer() peut-elle reacutealiser lrsquoopeacuteration demandeacutee Pourquoi

e Mecircme question pour la fonction afficher()

Communiquer des valeurs agrave lrsquoappel drsquoune fonctionPour corriger le programme Calculette nous supposons que les variables reacutesul-tat et opeacuteration soient deacuteclareacutees en tant que variables de classe et non plus loca-lement aux fonctions afficher() et menu()

a Modifiez le scheacutema reacutealiseacute en 61b en tenant compte de ces nouvelles deacuteclara-tions

b Quelle technique doit-on utiliser pour que les fonctions calculer() et affi-cher() connaissent le contenu des variables a et b afin drsquoeffectuer ensuite lesinstructions qui les composent

c Eacutecrivez les fonctions en utilisant cette technique

62

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

146

Transmettre un reacutesultat agrave la fonction appelanteNous supposons que le programme Calculette ne contienne plus de variables declasse Les variables reacutesultat et opeacuteration sont maintenant deacuteclareacutees localementaux fonctions qui les utilisent

a Quelles sont les conseacutequences de cette nouvelle hypothegravese sur le reacutesultat duprogramme

b Comment la fonction calculer() peut-elle connaicirctre lrsquoopeacuterateur choisi parlrsquoutilisateur dans la fonction menu()

c Transformez la fonction menu() de sorte que lrsquoopeacuterateur soit transmis agrave la fonc-tion main()

d Modifiez la fonction calculer() de faccedilon agrave lui transmettre lrsquoopeacuterateur fournipar la fonction menu()

e Comment la fonction afficher() peut-elle connaicirctre le reacutesultat de la fonctioncalculer()

f Transformez la fonction calculer() de sorte que le reacutesultat soit transmis agrave lafonction main()

g Modifiez la fonction afficher() de faccedilon agrave lui transmettre le reacutesultat fourni parla fonction calculer()

Le projet laquo Gestion drsquoun compte bancaire raquoAu chapitre preacuteceacutedent nous avons construit trois fonctions alAide() sortir() etmenuPrincipal() qui ameacuteliorent la lisibiliteacute du programme Ces fonctions concernentsurtout lrsquoaffichage de messages de dialogue de lrsquoapplication vers lrsquoutilisateur (menuaide etc) Elles reacutealisent lrsquointerface entre lrsquoutilisateur et lrsquoapplication sans transformerles donneacutees propres agrave chaque compte bancaire

Pour reacutealiser les opeacuterations de creacuteation et drsquoaffichage drsquoun compte (options 1 et 2 dumenu) nous allons ici construire des fonctions qui modifient transforment les donneacuteesdrsquoun compte

Comprendre la visibiliteacute des variablesLa fonction afficherCpte() reacutealise lrsquooption 2 du menu principal de notre applicationCette fonction affiche lrsquoensemble des caracteacuteristiques drsquoun compte soit son numeacutero sontype son taux srsquoil srsquoagit drsquoun compte drsquoeacutepargne et sa valeur courante Nous supposonsque lrsquoensemble de ces valeurs aient eacuteteacute preacutealablement saisies en option 1

Les variables locales

Une premiegravere solution pourrait srsquoeacutecrire

public static void afficherCpte() long num char type

63

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

147

double taux double val Systemoutprint(Le compte ndeg + num + est un compte ) if (type == rsquoCrsquo) Systemoutprintln( courant ) else if (type == rsquoJrsquo) Systemoutprintln( joint ) else if (type == rsquoErsquo) affiche son taux dans le cas drsquoun compte drsquoeacutepargne Systemoutprintln( epargne dont le taux est + taux) Systemoutprintln( Valeur initiale + val)

bull Quelles valeurs sont afficheacutees par cette fonction Pourquoi

Les variables de classe

Pour corriger la fonction preacuteceacutedente il est neacutecessaire que la fonction ait accegraves auxvaleurs stockeacutees lors de lrsquooption 1

Une premiegravere solution consiste agrave deacutefinir les variables agrave afficher comme variables de classe

a Transformez votre programme et deacuteclarez les variables num type taux et valcomme variables de classe

b Retirez les deacuteclarations des variables num type taux et val dans la fonction affi-cherCpte() de faccedilon agrave eacuteviter qursquoelles soient encore utiliseacutees par lrsquointerpreacuteteurcomme variables locales

c Exeacutecutez votre programme et veacuterifiez que la fonction affiche correctement les valeurs

Le passage de paramegravetres par valeur

Une seconde solution revient agrave deacuteclarer les variables num type taux et val en paramegrave-tres de la fonction drsquoaffichage de faccedilon agrave transmettre les valeurs saisies depuis la fonc-tion main() (option 1) agrave la fonction afficherCpte()

a Deacutecrivez lrsquoen-tecircte de la fonction afficherCpte() en prenant soin de deacuteclarer enparamegravetre une variable pour chaque caracteacuteristique du compte agrave transmettre agrave lafonction

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Les limites du retour de reacutesultatLa fonction creacuteerCpte() rassemble les instructions de lrsquooption 1 soit lrsquoaffichage demessages et la saisie au clavier des valeurs caracteacuteristiques drsquoun compte

a Recherchez quel doit ecirctre le reacutesultat de la fonction agrave transmettre agrave la fonction main()

b Pour deacutecrire lrsquoen-tecircte de la fonction creacuteerCpte() est-il possible de deacuteterminer letype agrave placer dans lrsquoen-tecircte de la fonction Pourquoi

copy copyright Eacuteditions Eyrolles

7Les classeset les objets

Lrsquoeacutetude du chapitre 6 laquo Fonctions notions avanceacutees raquo montre que si une fonctionfournit plusieurs reacutesultats ceux-ci ne peuvent pas ecirctre transmis au programme appelantPour contourner cette difficulteacute il est neacutecessaire drsquoutiliser des objets au sens de laprogrammation objet

Pour faire comprendre les principes fondamentaux de la notion drsquoobjet nous eacutetudions(section laquo La classe String une approche vers la notion drsquoobjet raquo) comment deacutefinir etgeacuterer des objets de type String Ce type permet la repreacutesentation des mots en tant quesuites de caractegraveres Agrave partir de cette eacutetude nous analysons les instructions qui font appelaux objets String afin drsquoen comprendre les principes de notation et drsquoutilisation

Nous examinons ensuite (section laquo Construire et utiliser ses propres classes raquo) commentdeacutefinir de nouveaux types de donneacutees Pour cela nous deacuteterminons les caracteacuteristiquessyntaxiques drsquoune classe et observons comment manipuler des objets agrave lrsquointeacuterieur drsquouneapplication et comment utiliser les meacutethodes qui leurs sont associeacutees

La classe String une approche vers la notion drsquoobjetLa classe String est une classe preacutedeacutefinie du langage Java Elle permet de deacutefinir deslaquo variables raquo contenant des suites de caractegraveres autrement dit des mots ou dans lejargon informatique des chaicircnes de caractegraveres Nous eacutetudions comment deacutefinir ceslaquo variables raquo agrave la section ci-dessous

La classe String est un type de donneacutees composeacute drsquoun grand nombre drsquooutils oumeacutethodes qui facilitent lrsquoutilisation des chaicircnes de caractegraveres (voir la section laquo Les diffeacute-rentes meacutethodes de la classe String raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

150

Manipuler des mots en programmationLrsquoutilisation des chaicircnes de caractegraveres apporte beaucoup agrave la convivialiteacute desprogrammes informatiques Il serait impensable aujourdrsquohui de creacuteer un logiciel degestion du personnel sans pouvoir deacutefinir le nom et le preacutenom de chaque employeacute Dansle mecircme ordre drsquoideacutee que serait la recherche drsquoinformations sur Internet sans cesfameuses chaicircnes de caractegraveres

Gracircce aux chaicircnes de caractegraveres nous oublions le langage binaire et il devient aiseacute decommuniquer avec lrsquoordinateur dans notre propre langue Pourtant lrsquoutilisation de cesfameuses chaicircnes a longtemps eacuteteacute source de difficulteacutes

Les mots neacutecessitent un type de donneacutees particulier du fait qursquoun mot possegravede par natureun nombre quelconque de caractegraveres Agrave la diffeacuterence des formats int double ou char leschaicircnes de caractegraveres ne peuvent a priori ecirctre repreacutesenteacutees par un nombre fixe de casesmeacutemoire

Deacuteclaration drsquoune chaicircne de caractegraveres

Tout comme nous deacuteclarons des variables pour stocker des valeurs entiegraveres ou reacuteellesnous devons deacuteclarer une variable pour meacutemoriser la suite des caractegraveres drsquoun mot oudrsquoune phrase Le type de cette variable est le type String

Le type String nrsquoest pas un type simple puisqursquoil permet de regrouper sous un seul nomde variable plusieurs donneacutees crsquoest-agrave-dire lrsquoensemble des caractegraveres drsquoun mot

Pour eacuteviter les difficulteacutes lieacutees agrave la variation du nombre de caractegraveres dans un mot lelangage Java fixe la longueur du mot en fonction de sa deacuteclaration Cela fait le contenudu mot ne peut plus ecirctre modifieacute En deacuteclarant un objet de type String il est possible enmecircme temps de lrsquoinitialiser en lui affectant des caractegraveres placeacutes entre guillemets

La deacuteclaration suivante permet de creacuteer un objet appeleacute mot qui contient la chaicircne decaractegraveres exemple

String mot = exemple

Remarquons que la variable mot nrsquoest pas un ensemble de sept cases meacutemoire contenantles sept caractegraveres du mot exemple Lors de la deacuteclaration de la variable mot lrsquointerpreacute-teur Java creacutee une case qui contient lrsquoadresse de la case ougrave se trouve le premier caractegraveredu mot exemple (voir Figure 7-1)

Lorsque lrsquoordinateur souhaite afficher la variable mot il va rechercher lrsquoinformation sesituant agrave lrsquoadresse stockeacutee dans la case meacutemoire mot On dit alors que la variable motpointe sur la case qui contient la suite de caractegraveres

Figure 7ndash1

Seul un objet de type String contenant le mot exemple existe mot et second font tous deux reacutefeacuterence agrave cet objet unique

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

151

Les variables de type String ne contiennent pas directement lrsquoinformation qui les carac-teacuterise mais seulement lrsquoadresse ougrave trouver cette information Degraves lors ces variables nesrsquoappellent plus des variables mais des objets

Les objets au sens de la programmation objet ne sont pas des laquo variables raquo de typesimple (int long double char etc) Ils correspondent agrave un type qui permet deregrouper plusieurs donneacutees sous une mecircme adresse

Lorsqursquoun objet second est deacuteclareacute comme ci-dessous il contient la mecircme adresse (reacutefeacute-rence) que lrsquoobjet mot

String second = mot

Si le programme modifie le contenu de lrsquoobjet mot en lui affectant par exemple unenouvelle chaicircne lrsquointerpreacuteteur ne modifie pas la case pointeacutee par mot dans la mesure ougravepar deacutefinition le contenu drsquoun mot ne peut ecirctre modifieacute

mot = nouveau

Il creacutee en reacutealiteacute une nouvelle adresse et lui associe la nouvelle chaicircne de caractegraveresPour notre exemple lrsquoobjet mot est associeacute agrave la chaicircne de caractegraveres rsquonouveaursquo etsecond reste associeacute agrave rsquoexemplersquo

Les diffeacuterentes meacutethodes de la classe StringLrsquoutilisation des mots dans un programme est aujourdrsquohui incontournable Il ne srsquoagitcertes pas simplement drsquoafficher des mots mais de les traiter de la faccedilon la plus intelli-gente possible Ces traitements sont par exemple le tri alphabeacutetique ou encore larecherche de mots particuliers dans un texte

Pour reacutealiser ces opeacuterations la langage Java propose un ensemble de meacutethodes preacutedeacutefi-nies Les meacutethodes drsquoune classe sont comparables aux fonctions mais la terminologielaquo objet raquo les appelle meacutethodes

Ces meacutethodes offrent la possibiliteacute de traiter rapidement et simplement lrsquoinformationtextuelle Nous deacutecrivons ci-dessous regroupeacutees par thegraveme une grande partie desmeacutethodes deacutefinies dans la classe String Nous donnons en exemple pour chaque thegravemeun programme qui utilise ces meacutethodes

Figure 7ndash2

La modification de mot entraicircne la creacuteation drsquoune nouvelle chaicircne de caractegraveres et drsquoune nouvelle reacutefeacuterence automatiquement attribueacutees agrave mot Lrsquoobjet second conserve la preacuteceacutedente reacutefeacuterence

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

152

Recherche de mots et de caractegraveres

Exemple de recherche de mots et de caractegraveres

public class Rechercher public static void main(String [] argument) String phrase = Mieux vaut tard que jamais String soumo = int place Systemoutprintln(Vous avez dit + phrase) soumo = phrasesubstring(1115) Systemoutprintln(De 11 a 15 la sous chaine est + soumo) for ( int i = 0 i lt 5 i++) Systemoutprintln(en + i + il y a + phrasecharAt(i))

Systemoutprintln(Entrez un mot ) soumo = LireS()

if(phraseendsWith(soumo)) Systemoutprintln(La phrase se termine avec + soumo) else Systemoutprintln(La phrase ne finit pas avec + soumo)

place = phraseindexOf(soumo) if (place == -1) Systemoutprintln(Ce mot nrsquoexiste pas dans + phrase) else Systemoutprintln(soumo+ est a la position + place)

Opeacuteration Fonction Java

Recherche si le mot se termine par le ou les caractegraveres passeacutes en paramegravetres endsWith()

Recherche si le mot commence par le ou les caractegraveres passeacutes en paramegravetres startsWith()

Recherche le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Le premier carac-tegravere occupe la position 0 et le dernier la position length()-1 (voir ci-dessous la des-cription de length())

charAt()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir du deacutebut du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

indexOf()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir de la fin du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

lastIndexOf()

Extrait une sous-chaicircne drsquoun mot substring()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

153

Reacutesultat de lrsquoexeacutecution

Exeacutecution 1

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot tardLa phrase ne finit pas avec ttaarrdd

tard est a la position 11

Phrase et soumo sont deux objets de type String initialiseacutes respectivement agrave Mieuxvaut tard que jamais et (mot ne comportant pas de caractegravere)

Lrsquoinstruction soumo = phrasesubstring(1115) recherche la sous-chaicircne situeacutee entreles caractegraveres 11 et 15 de lrsquoobjet phrase Cela fait elle place lrsquoensemble de ces caractegraveresdans lrsquoobjet soumo

Gracircce agrave lrsquoinstruction phrasecharAt(i) placeacutee dans lrsquoinstruction drsquoaffichageSystemoutprint le programme affiche les cinq premiers caractegraveres de lrsquoobjet phrasei variant de 0 agrave 4

Ensuite phraseendsWith(soumo) permet de savoir si lrsquoobjet phrase se termine avec lasuite de caractegraveres saisie au clavier et stockeacutee dans lrsquoobjet soumo Le reacutesultat de lameacutethode endsWith() est true si la chaicircne se termine par lrsquoargument et false dans le cascontraire Pour notre exemple soumo vaut tard et la meacutethode retourne false Leprogramme exeacutecute donc lrsquoinstruction placeacutee dans le bloc else associeacute au testif(phrase endsWith(soumo))

Pour finir lrsquoinstruction phraseindexOf(soumo) recherche si lrsquoobjet soumo est contenudans lrsquoobjet phrase Si tel est le cas elle retourne la position du premier caractegravere trouveacutesinon elle retourne ndash1 Ici tard est deacutetecteacute dans mieux vaut tard que jamais enposition 11

Exeacutecution 2

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot maisLa phrase se termine avec mmaaiiss

mais est a la position 22copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

154

Si lrsquoutilisateur saisit mais au lieu de tard le test if (phraseendsWith(soumo)) estvrai la meacutethode endsWith()retournant true Le programme exeacutecute donc lrsquoinstructionplaceacutee dans le bloc if

Exeacutecution 3

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot OOKKLa phrase ne finit pas avec OKCe mot nrsquoexiste pas dans Mieux vaut tard que jamais

Si lrsquoutilisateur saisit OK au lieu de mais le test if (phraseendsWith(soumo)) estfaux et la meacutethode endsWith() retourne false Le programme exeacutecute lrsquoinstructionplaceacutee dans le bloc else De plus lrsquoinstruction phraseindexOf(soumo) retourne ndash1car OK nrsquoest pas deacutetecteacute dans mieux vaut tard que jamais Le programme exeacutecutealors le bloc else associeacute

Comparaison de mots

Exemple de comparaison de mots

public class Comparer public static void main(String [] argument) String prvb1 = Le mieux est lrsquoennemi du bien String prvb2 =Le Mieux Est lrsquoEnnemi du bien

Opeacuteration Fonction Java

Compare deux mots et retourne une valeur bull Nulle si les deux mots sont identiquesbull Positive si le premier mot est plus grand (placeacute apregraves) le deuxiegraveme mot (dans le dictionnaire)bull Neacutegative si le premier mot est plus petit (placeacute avant) le deuxiegraveme mot (dans le dictionnaire)

compareTo()

Compare la valeur de deux mots Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equals()

Compare la valeur de deux mots sans diffeacuterencier les majuscules des minus-cules Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equalsIgnoreCase()

Deacutetermine si deux portions de chaicircnes sont identiques Dans lrsquoaffirmative elle renvoie true

regionMatches()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

155

Systemoutprintln(1 + prvb1) Systemoutprintln(2 + prvb2) Systemoutprintln(Comparons les 10 premiers caracteres )

Systemoutprint(En tenant compte des majuscules ) if (prvb1regionMatches(false 0 prvb2 0 10)) Systemoutprintln(Les 10 premiers cars sont identiques) else Systemoutprintln(Il y a des differences sur les 10 premiers cars) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1regionMatches(18 prvb2 18 6)) Systemoutprintln(Les cars de 18 a 24 sont identiques) else Systemoutprintln(Il y a des differences)

if (prvb1compareTo(prvb2) == 0) Systemoutprintln(Les deux chaines sont identiques) else if (prvb1compareTo(prvb2) lt 0) Systemoutprint(prvb1 + est avant + prvb2) else Systemoutprint(prvb1 + est apres + prvb2) Systemoutprintln(dans le dictionnaire) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1equalsIgnoreCase(prvb2)) Systemoutprintln(Les deux chaines sont identiques) else Systemoutprintln(Les deux chaines sont differentes)

Reacutesultat de lrsquoexeacutecution

1 Le mieux est lrsquoennemi du bien 2 Le Mieux Est lrsquoEnnemi du bien Comparons les 10 premiers caracteres En tenant compte des majuscules Il y a des differences sur les 10 premierscarsSans tenir compte des majuscules Les cars de 18 a 24 sont identiquesLe mieux est lrsquoennemi du bien est apres Le Mieux Est lrsquoEnnemi du bien dansle dictionnaireSans tenir compte des majuscules Les deux chaines sont identiques

Les objets prvb1 et pvrb2 sont initialiseacutes respectivement agrave Le mieux est lrsquoennemi dubien et Le Mieux Est lrsquoEnnemi du bien

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

156

La meacutethode regionMatches() srsquoutilise soit avec quatre paramegravetres soit avec cinq para-megravetres Dans ce programme nous donnons en exemple les deux appels possibles

bull Le premier appel agrave la meacutethode utilise cinq paramegravetres (regionMatches(false 0prvb2 0 10)) Le premier paramegravetre est un booleacuteen qui srsquoil est eacutegal agrave falsepermet de reacutealiser la comparaison des deux mots en tenant compte de la preacutesence desmajuscules Pour notre cas la meacutethode deacutetermine si les deux portions de chaicircne prvb1et pvrb2 (correspondant au troisiegraveme paramegravetre de la meacutethode) sont identiques entenant compte des majuscules

Cette recherche est reacutealiseacutee agrave partir de la valeur speacutecifieacutee par le deuxiegraveme paramegravetre(soit 0 crsquoest-agrave-dire le premier caractegravere de prvb1) Le quatriegraveme paramegravetre repreacutesentela position du premier caractegravere agrave comparer dans lrsquoobjet prvb2 Le cinquiegraveme est lenombre de caractegraveres conseacutecutifs agrave comparer Pour notre exemple le programmerecherche srsquoil y a des similitudes entre prvb1 et prvb2 agrave partir du deacutebut des deuxmots et ce sur les dix caractegraveres suivants

bull Le deuxiegraveme appel agrave la meacutethode est composeacute de quatre paramegravetres (regionMat-ches(18 prvb2 18 6)) En fait ces quatre paramegravetres correspondent aux quatrederniers paramegravetres de lrsquoappel deacutecrit preacuteceacutedemment Le booleacuteen figurant dans lrsquoappelpreacuteceacutedant nrsquoexiste plus car par deacutefaut cette meacutethode travaille sans tenir compte desmajuscules Elle est donc eacutequivalente agrave lrsquoappel de la meacutethode suivante prvb1regionMatches(true 18 prvb2 18 6)

Ensuite lrsquoinstruction prvb1compareTo(prvb2) compare les objets prvb1 et prvb2 etdeacutetermine srsquoils sont identiques ou placeacutes avant ou apregraves dans lrsquoordre alphabeacutetique

Pour finir lrsquoinstruction prvb1equalsIgnoreCase(prvb2) veacuterifie si les deux objetsprvb1 et prvb2 sont identiques ou non sans tenir compte de la preacutesence des majuscules

Transformation de formats

Exemple de transformation de format

public class Transformer public static void main(String [] argument)

Opeacuteration Fonction Java

Transforme en minuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toLowerCase()

Transforme en majuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toUpperCase()

La meacutethode place (concategravene) la chaicircne speacutecifieacutee en paramegravetre agrave la suite de la chaicircne sur laquelle la meacutethode est appliqueacutee

concat()

Remplace systeacutematiquement dans la chaicircne sur laquelle la meacutethode est appliqueacutee tous les caractegraveres donneacutes en premier argument par le caractegravere donneacute en deuxiegraveme argument

replace()

Calcule le nombre de caractegraveres de la chaicircne sur laquelle la meacutethode est appliqueacutee length()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

157

String phrase = Qui dort String verbe = dine String p1 = p2 = p3 = p4 = int nbcar Systemoutprintln(1 + phrase) Systemoutprintln(2 + verbe) p1 = phrasetoUpperCase() Systemoutprintln(En majuscules + p1) p2 = phrasetoLowerCase() Systemoutprintln(En minuscules + p2) p3 = phraseconcat(verbe) nbcar = p3length() Systemoutprint(Apres concat() ) Systemoutprintln(p3 + possede + nbcar + caracteres) p4 = p3replace(rsquoirsquorsquoarsquo) Systemoutprintln(Apres replace() + p3 + devient + p4)

Reacutesultat de lrsquoexeacutecution

1 Qui dort2 dine En majuscules QUI DORT En minuscules qui dort Apres concat() Qui dort dine possede 13 caracteresApres replace() Qui dort dine devient Qua dort dane

Les objets phrase et verbe sont initialiseacutes respectivement agrave Qui dort et dineLrsquoinstruction p1 = phrasetoUpperCase() transforme en majuscules le contenu dephrase et place cette transformation dans lrsquoobjet p1

Lrsquoinstruction p2 = phrasetoLowerCase() place dans p2 le contenu de phrase trans-formeacute en minuscules Notons que pour chacune de ces instructions lrsquoobjet phrase nrsquoestjamais modifieacute

Lrsquoinstruction p3 = phraseconcat(verbe) place en bout de lrsquoobjet phrase le motcontenu dans verbe Cela fait le reacutesultat de cette opeacuteration est affecteacute agrave lrsquoobjet p3Lrsquoobjet phrase nrsquoest pas modifieacute

Ensuite lrsquoinstruction nbcar = p3length() calcule la longueur de lrsquoobjet p3 crsquoest-agrave-dire le nombre de caractegraveres constituant lrsquoobjet p3

Pour finir lrsquoinstruction p4 = p3replace(rsquoirsquo rsquoarsquo) remplace tous les caractegraveres rsquoirsquode p3 par des rsquoarsquo et place le reacutesultat de cette transformation dans lrsquoobjet p4 Lrsquoobjet p3nrsquoest pas modifieacute

Appliquer une meacutethode agrave un objet Lrsquoobservation des exemples preacuteceacutedents montre que lrsquoappel drsquoune meacutethode de la classeString ne srsquoeacutecrit pas comme une simple instruction drsquoappel agrave une meacutethode (fonction)telle que nous lrsquoavons eacutetudieacutee jusqursquoagrave preacutesent

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

158

Comparons lrsquoappel agrave une meacutethode de la classe Math agrave celui drsquoune meacutethode de la classeString

Par exemple pour calculer la valeur absolue drsquoune variable x les instructions sont lessuivantes

double x = 4 yy = Mathabs(x)

Pour transformer un mot en lettres majuscules les instructions sont

String mot = petit MOTMOT = mottoUpperCase()

Comme nous le constatons dans le premier cas la fonction Mathabs() srsquoapplique agrave lavariable x en passant la valeur de x en paramegravetre En effet les variables x et y ne sont pasdes objets au sens de la programmation objet Elles sont de type double et repreacutesententsimplement le nom drsquoune case meacutemoire dans laquelle lrsquoinformation est stockeacutee Aucunemeacutethode aucun traitement ne sont associeacutes agrave cette information

Dans la seconde eacutecriture la meacutethode toUpperCase() est appliqueacutee agrave lrsquoobjet mot parlrsquointermeacutediaire drsquoun point () placeacute entre le nom de lrsquoobjet et la meacutethode Les objets motet MOT ne peuvent ecirctre consideacutereacutes comme des variables Ils sont de type String Lrsquoinfor-mation repreacutesenteacutee par ce type nrsquoest pas simple Elle repreacutesente (voir Figure 7-3) leseacuteleacutements suivants

bull Drsquoune part une reacutefeacuterence (une adresse) vers un ensemble de caractegraveres stockeacutes dansplusieurs cases meacutemoire distinctes

bull Drsquoautre part un ensemble de meacutethodes propres qui lui sont applicables Ces meacutethodessont lrsquoeacutequivalent drsquoune boite agrave outils qui opegravere uniquement sur les objets de typeString

Quelle qursquoelle soit une classe correspond agrave un type qui speacutecifie une association dedonneacutees (informations ou valeurs de tout type) et de meacutethodes (outils drsquoaccegraves et de trans-formation des donneacutees) Ces meacutethodes deacutefinies agrave lrsquointeacuterieur drsquoune classe ne peuventsrsquoappliquer qursquoaux donneacutees de cette mecircme classe

Gracircce agrave cette association une classe permet la deacutefinition de nouveaux types de donneacuteesqui structurent lrsquoinformation agrave traiter (voir dans ce chapitre la section laquo Construire etutiliser ses propres classes raquo)

Figure 7ndash3

La classe String deacutefinit lrsquoassociation de donneacutees et de meacutethodes applicables agrave ces donneacutees

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

159

Principes de notation

Agrave cause de cette diffeacuterence fondamentale de repreacutesentation de lrsquoinformation lrsquoemploides meacutethodes agrave travers les objets utilise une syntaxe particuliegravere

Pour un objet de type String cette syntaxe est la suivante

Deacuteclaration et initialisationString objet = La meacutethode srsquoapplique agrave objetobjetnomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

Pour appliquer une meacutethode agrave un objet il suffit de placer derriegravere le nom de lrsquoobjet unpoint suivi du nom de la meacutethode et de ces paramegravetres Remarquons que par conven-tion

bull Tout nom de meacutethode commence par une minuscule

bull Si le nom de la meacutethode est composeacute de plusieurs mots ceux-ci voient leur premiercaractegravere passer en majuscule

bull Le nom drsquoune classe commence toujours par une majuscule

Gracircce agrave cette eacutecriture lrsquoobjet est associeacute agrave la meacutethode de faccedilon agrave pouvoir modifierlrsquoinformation (les donneacutees) contenue dans lrsquoobjet Cette technique permet de reacutecupeacutererles diffeacuterentes donneacutees modifieacutees localement par une meacutethode Elle est le principe debase du concept drsquoobjet deacutecrit et commenteacute au chapitre suivant

Construire et utiliser ses propres classes Lrsquoeacutetude de la classe String montre qursquoune classe correspond agrave un type de donneacutees Cetype est composeacute de donneacutees et de meacutethodes exploitant ces donneacutees La classe Stringest un type preacutedeacutefini du langage Java

Il existe drsquoautres types preacutedeacutefinis de classes dans le langage Java Ces classes sont desoutils preacutecieux et efficaces qui simplifient le deacuteveloppement des applications Diffeacute-rentes classes sont examineacutees dans la troisiegraveme partie de cet ouvrage

Lrsquointeacuterecirct des classes reacuteside aussi dans la possibiliteacute de deacutefinir des types structureacutespropres agrave un programme Gracircce agrave cette faculteacute le programme se deacuteveloppe de faccedilon plussucircre les objets qursquoil utilise eacutetant deacutefinis en fonction du problegraveme agrave reacutesoudre

Avant drsquoeacutetudier reacuteellement lrsquointeacuterecirct de la programmation objet et ses conseacutequences surles modes de programmation (voir le chapitre 8 laquo Les principes du concept drsquoobjet raquo)nous examinons dans les sections qui suivent comment creacuteer des types speacutecifiques etutiliser les objets associeacutes agrave ces nouveaux types

Deacutefinir une classe et un type

Deacutefinir une classe crsquoest construire un type structureacute de donneacutees Avant de comprendreles avantages drsquoune telle construction nous abordons ici la notion de type structureacute (etdonc de classe) drsquoun point de vue syntaxique

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

160

Pour deacutefinir un type il suffit drsquoeacutecrire une classe qui par deacutefinition est constitueacutee dedonneacutees et de meacutethodes (voir Figure 7-3) La construction drsquoune classe est reacutealiseacutee selonles deux principes suivants

1 Deacutefinition des donneacutees agrave lrsquoaide drsquoinstructions de deacuteclaration de variables etoudrsquoobjets Ces variables sont de type simple tel que nous lrsquoavons utiliseacute jusqursquoagravepreacutesent (int char etc) ou de type composeacute preacutedeacutefini ou non (String etc)

Ces donneacutees deacutecrivent les informations caracteacuteristiques de lrsquoobjet que lrsquoon souhaitedeacutefinir Elles sont aussi appeleacutees communeacutement champ attribut ou membre de laclasse

2 Construction des meacutethodes deacutefinies par le programmeur Ce sont les meacutethodesassocieacutees aux donneacutees Elles se construisent comme de simples fonctions compo-seacutees drsquoun en-tecircte et drsquoinstructions comme nous lrsquoavons vu aux chapitres preacuteceacutedents

Ces meacutethodes repreacutesentent tous les traitements et comportements de lrsquoobjet que lrsquooncherche agrave deacutecrire

En deacutefinissant de nouveaux types nous deacuteterminons les caracteacuteristiques propres auxobjets que lrsquoon souhaite programmer Un type drsquoobjet correspond agrave lrsquoensemble desdonneacutees traiteacutees par le programme regroupeacutees par thegraveme

Un objet peut ecirctre une personne si lrsquoapplication agrave deacutevelopper gegravere le personnel drsquounesocieacuteteacute ou un livre srsquoil srsquoagit drsquoune application destineacutee agrave la gestion drsquoune biblio-thegraveque Remarquons que lrsquoobjet personne peut aussi ecirctre utiliseacute dans le cadre drsquoun logi-ciel pour bibliothegraveque puisqursquoun lecteur empruntant un livre est aussi une personne

Construire un type Cercle

Examinons sur un exemple simple la deacutemarche de construction drsquoun type structureacuteObservons pour cela comment construire le type de donneacutees qui deacutecrive au mieux larepreacutesentation drsquoun cercle quelconque

Cette reacutealisation passe par deux eacutetapes laquo Rechercher les caracteacuteristiques propres agrave toutcercle raquo et laquo Deacutefinir le comportement de tout cercle raquo

Rechercher les caracteacuteristiques propres agrave tout cercle

Drsquoune maniegravere geacuteneacuterale tout cercle est deacutefini gracircce agrave son rayon Si lrsquoon souhaite afficherce cercle il est en outre neacutecessaire de connaicirctre sa position agrave lrsquoeacutecran Pour simplifiernous supposons que la position drsquoun cercle soit deacutetermineacutee gracircce aux coordonneacutees deson centre

Les caracteacuteristiques drsquoun cercle sont son rayon et sa position agrave lrsquoeacutecran crsquoest-agrave-dire lescoordonneacutees en x (abscisse) et en y (ordonneacutee) du centre du cercle Ces trois donneacuteessont repreacutesentables agrave lrsquoaide de valeurs numeacuteriques que nous choisissons pour simplifierde type int

Pour deacuteclarer les donneacutees drsquoun cercle nous eacutecrivons les deacuteclarations suivantes

public int x y position du centre du cerclepublic int r rayon

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

161

Deacutefinir le comportement de tout cercle

Drsquoun point de vue informatique plusieurs opeacuterations peuvent ecirctre appliqueacutees agrave uncercle Un cercle peut ecirctre deacuteplaceacute ou agrandi (voir les meacutethodes deacuteplacer() etagrandir() dans le code source ci-dessous) Ces opeacuterations modifient la valeur du rayonou des coordonneacutees du centre du cercle agrave lrsquoeacutecran

Crsquoest pourquoi il est neacutecessaire de deacutefinir une meacutethode qui affiche agrave lrsquoeacutecran les donneacutees(rayon position) drsquoun cercle avant ou apregraves transformation (voir la meacutethode affi-cher()dans le code source ci-dessous)

La meacutethode de calcul du peacuterimegravetre drsquoun cercle peut ecirctre utile (voir la meacutethode peacuteri-megravetre() dans le code source ci-dessous)

La classe descriptive du type Cercle

public class Cercle public int x y position du centre public int r rayon

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Cercle centre en + x + + y) Systemoutprintln( de rayon + r)

public double peacuterimegravetre() Calcul du peacuterimegravetre drsquoun cercle return 2MathPIr public void deacuteplacer(int nx int ny) Deacuteplace le centre du cercle en (nx ny) Ces coordonneacutees eacutetant x = nx passeacutees en paramegravetres de la fonction y = ny public void agrandir(int nr) Augmente la valeur courante du rayon avec la valeur passeacutee en paramegravetre r = r + nr Fin de la classe Cercle

La classe Cercle deacutecrite agrave lrsquointeacuterieur drsquoun fichier appeleacute Cerclejava deacutefinit un type dedonneacutees composeacute de trois attributs caracteacuteristiques des cercles agrave savoir la position ducentre en abscisse et ordonneacutee et le rayon ainsi que quatre comportements diffeacuterents Sadescription par bloc est repreacutesenteacutee agrave la Figure 7-4

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

162

Quelques observations

Suivant la description de la Figure 7-4 nous constatons que les donneacutees x y et r sontdeacuteclareacutees en dehors de toute fonction Par conseacutequent chaque meacutethode a accegraves agrave toutmoment aux valeurs qursquoelle contient soit pour les consulter soit pour les modifier

Les meacutethodes afficher() et peacuterimegravetre() ne font que consulter le contenu des donneacuteesx y et r pour les afficher ou les utiliser en vue drsquoobtenir un nouveau reacutesultat

Au contraire les meacutethodes deacuteplacer() et agrandir() modifient le contenu des donneacuteesx y et r Ces modifications reacutealiseacutees agrave lrsquointeacuterieur drsquoune meacutethode sont aussi visiblesdepuis les autres meacutethodes de la classe

Il existe donc deux types de meacutethodes les meacutethodes qui permettent drsquoacceacuteder auxdonneacutees de la classe et celles qui modifient ces donneacutees

Voir au chapitre 8 laquo Les principes du concept drsquoobjet raquo la section laquo Les meacutethodes drsquoaccegraves auxdonneacutees raquo

En comparant les programmes construits aux chapitres preacuteceacutedents agrave celui-ci nous cons-tatons les deux diffeacuterences fondamentales suivantes

bull Le mot-cleacute static a disparu de toutes les instructions de deacuteclaration Cette disparitionnrsquoest pas sans conseacutequence sur le deacuteroulement du programme Elle permet de creacuteernon plus de simples variables mais des objets (voir au chapitre 8 laquo Les principes duconcept drsquoobjet raquo la section laquo Les donneacutees static raquo)

bull Une classe deacutefinissant un type structureacute ne possegravede pas de fonction main() La deacutefini-tion drsquoune classe nrsquoest pas la mecircme chose que la reacutealisation drsquoune application Uneclasse est une entiteacute agrave part entiegravere qui deacutefinit globalement de quoi est constitueacute unobjet et preacutecise les opeacuterations qursquoil est possible de lui appliquer

Figure 7ndash4

Les donneacutees x y et r du type Cercle sont deacuteclareacutees en dehors de toute fonction Nrsquoimporte quelle modification de ces donneacutees est donc visible par lrsquoensemble des meacutethodes de la classe

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

163

Bien entendu une classe est deacutefinie pour ecirctre utiliseacutee dans un programme exeacutecutable(une application) qui contient une fonction main() Nous abordons plus en deacutetail cetteopeacuteration agrave la section suivante

Deacutefinir un objetApregraves avoir deacutefini un nouveau type structureacute lrsquoeacutetape suivante consiste agrave eacutecrire une applica-tion qui utilise effectivement un laquoobjetraquo de ce type Pour cela le programmeur doit deacuteclarerles objets utiles agrave lrsquoapplication et faire en sorte que lrsquoespace meacutemoire neacutecessaire soit reacuteserveacute

Deacuteclarer un objet

Cette opeacuteration simple srsquoeacutecrit comme une instruction de deacuteclaration avec cette diffeacute-rence que le type de la variable nrsquoest plus un type simple preacutedeacutefini mais un type structureacutetel que nous lrsquoavons construit preacuteceacutedemment Ainsi dans

Deacuteclaration drsquoun objet choseTypeDeLrsquoObjet chose

TypeDeLrsquoObjet correspond agrave une classe deacutefinie par le programmeur Pour notre exemplela deacuteclaration drsquoun cercle A est reacutealiseacutee par lrsquoinstruction

Cercle A

Cette deacuteclaration creacutee une case meacutemoire nommeacutee A destineacutee agrave contenir une reacutefeacuterencevers lrsquoadresse ougrave sont stockeacutees les informations concernant le cercle A Agrave ce stadeaucune adresse nrsquoest encore deacutetermineacutee

Reacuteserver lrsquoespace meacutemoire agrave lrsquoaide de lrsquoopeacuterateur new

Agrave cette eacutetape les informations caracteacuterisant lrsquoobjet A ne peuvent ecirctre stockeacutees carlrsquoespace meacutemoire servant agrave ce stockage nrsquoest pas encore reacuteserveacute Crsquoest lrsquoopeacuterateur newqui reacutealise cette reacuteservation

Lrsquoopeacuterateur new est un programme Java qui gegravere de lui-mecircme la reacuteservation de lrsquoespacemeacutemoire Lorsqursquoon applique cet opeacuterateur agrave un objet il deacutetermine combien drsquooctets luisont neacutecessaires pour stocker lrsquoinformation contenue dans la classe

Cet opeacuterateur srsquoapplique en eacutecrivant agrave la suite du terme new le nom du type de lrsquoobjetdeacuteclareacute suivi de deux parenthegraveses

Reacuteserver de lrsquoespace meacutemoire pour lrsquoobjet chosechose = new TypeDeLrsquoObjet()

Figure 7ndash5

La deacuteclaration drsquoun objet reacuteserve une case meacutemoire destineacutee agrave contenir lrsquoadresse meacutemoire ougrave seront stockeacutees les informations Lrsquoespace meacutemoire et lrsquoadresse ne sont pas encore reacuteserveacutes pour reacutealiser ce stockage

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

164

Pour notre exemple la reacuteservation de lrsquoespace meacutemoire pour deacutefinir le cercle A srsquoeacutecrit

A = new Cercle()

Remarquons qursquoil est possible de deacuteclarer et de reacuteserver de lrsquoespace meacutemoire en uneseule instruction

Cercle A = new Cercle()

En eacutecrivant une telle instruction nous observons que pour chaque objet deacuteclareacute lrsquoopeacutera-teur new reacuteserve suffisamment drsquoespace meacutemoire pour stocker les donneacutees de la classe etpour copier les meacutethodes associeacutees Il deacutetermine aussi lrsquoadresse ougrave sera stockeacutelrsquoensemble de ces informations (lrsquoespace meacutemoire pour lrsquoobjet A est illustreacute agrave laFigure 7-6)

Lors de cette reacuteservation lrsquointerpreacuteteur initialise les donneacutees de la classe agrave 0 pour lesentiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les char et agrave null pour les String Pour notreexemple A est un cercle de rayon nul centreacute en (0 0)

Lrsquoobjet ainsi deacutefini est un repreacutesentant particulier de la classe caracteacuteriseacute par lrsquoensemblede ses donneacutees Dans le jargon informatique on dit que lrsquoobjet A est une instance de laclasse Cercle Les donneacutees qui le caracteacuterisent agrave savoir x y et r sont appeleacutees desvariables drsquoinstance

Une instance est donc en meacutemoire un programme agrave part entiegravere composeacute de variableset de fonctions Sa structure est telle qursquoil ne peut srsquoexeacutecuter et se transformer (crsquoest-agrave-dire modifier ses propres donneacutees) qursquoagrave lrsquointeacuterieur de cet espace Crsquoest pourquoi il estconsideacutereacute comme une entiteacute indeacutependante ou laquo objet raquo

Manipuler un objet

Lrsquoobjet ainsi deacutefini est entiegraverement deacutetermineacute par ses donneacutees et ses meacutethodes Il est degraveslors possible de modifier les valeurs qui le caracteacuterisent et drsquoexploiter ses meacutethodes

Figure 7ndash6

Pour chaque objet creacuteeacute lrsquoopeacuterateur new reacuteserve un espace meacutemoire suffisamment grand pour y stocker les donneacutees et les meacutethodes descriptives de la classe Lrsquoadresse est alors deacutetermineacutee

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

165

Acceacuteder aux donneacutees de la classe

Pour acceacuteder agrave une donneacutee de la classe de faccedilon agrave la modifier il suffit drsquoeacutecrire

Acceacuteder agrave un membre de la classechosenomDeLaDonneacutee = valeur du bon type

en supposant que le champ nomDeLaDonneacutee soit deacutefini dans la classe correspondant autype de lrsquoobjet chose

Pour notre exemple la saisie au clavier des valeurs caracteacuterisant le cercle A srsquoeacutecrit de lafaccedilon suivante

Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon )Ar = Lirei()

Les cases meacutemoire repreacutesentant les variables drsquoinstance (x y et r) de lrsquoobjet A sont acces-sibles via lrsquoopeacuterateur point ()

Acceacuteder aux meacutethodes de la classe

Pour appliquer une meacutethode de la classe agrave un objet particulier la syntaxe utilise le mecircmeprincipe de notation

appliquer une meacutethode agrave lrsquoobjet chosechosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la meacutethode ait preacutealablement eacuteteacute deacutefinie pour le type de lrsquoobjet chosePour notre exemple lrsquoapplication de la meacutethode peacuterimegravetre() agrave lrsquoobjet A srsquoeacutecrit

double p = Apeacuterimegravetre()

Une application qui utilise des objets CercleLrsquoexemple suivant montre comment exploiter dans une application lrsquoensemble desdonneacutees et des meacutethodes deacutefinies dans la classe Cercle

Exemple code source complet

public class FaireDesCercles public static void main(String [] arg) Cercle A = new Cercle() Aaffiche() Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon ) Ar = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

166

Aaffiche() double p = Apeacuterimegravetre() Systemoutprintln( Votre cercle a pour perimetre + p) Adeacuteplacer(5 10) Systemoutprintln( Apres deplacement ) Aaffiche() Aagrandir(10) Systemoutprintln( Apres agrandissement ) Aaffiche()

Compilation et exeacutecution drsquoune application multifichiers

Lrsquoapplication FaireDesCercles deacutecrite dans le fichier FaireDesCerclesjava utilise letype Cercle deacutefini dans le fichier Cerclejava Deux fichiers distincts sont donc neacuteces-saires agrave la deacutefinition drsquoun programme qui utilise des objets Cercle

Bien que cela puisse paraicirctre curieux pour un deacutebutant lrsquoapplication FaireDesCerclessrsquoexeacutecute correctement malgreacute cette seacuteparation des fichiers Examinons comment fonc-tionne lrsquoordinateur dans un tel cas

Nous lrsquoavons deacutejagrave observeacute (voir au chapitre introductif laquo Naissance drsquoun programme raquola section laquo Exeacutecuter un programme raquo) deux phases sont neacutecessaires pour exeacutecuter unprogramme Java la phase de compilation et la phase drsquointerpreacutetation Si lrsquoapplicationest conccedilue avec plusieurs fichiers ces deux phases sont aussi indispensables

Phase de compilation

Lors de la compilation drsquoun programme constitueacute de plusieurs fichiers la question sepose de savoir comment compiler lrsquoensemble de ces fichiers

Pour simplifier la tacircche de la personne qui deacuteveloppe des applications le compilateurJava est construit de faccedilon que seul le programme qui contient la fonction main() soit agravecompiler

Au cours de la compilation le compilateur constate de lui-mecircme au moment de la deacutecla-ration de lrsquoobjet que lrsquoapplication utilise des objets drsquoun type non preacutedeacutefini par lelangage Java

Agrave partir de ce constat il recherche dans le reacutepertoire ougrave se trouve lrsquoapplication qursquoilcompile le fichier dont le nom corresponde au nouveau type qursquoil vient de deacutetecter etdont lrsquoextension soit java Tout programme Java a pour nom le nom de la classe (du type)qursquoil deacutefinit

Pour notre exemple en compilant lrsquoapplication FaireDesCercles gracircce agrave la commande

javac FaireDesCerclesjava

le compilateur deacutetecte le type Cercle Il recherche alors le fichier Cerclejava dans lereacutepertoire ougrave se trouve lrsquoapplication

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

167

bull Si le compilateur trouve ce fichier il le compile aussi En fin de compilation deuxfichiers ont eacuteteacute traiteacutes FaireDesCerclesjava et Cerclejava Si le compilateur nedeacutetecte aucune erreur le reacutepertoire contient les fichiers correpondant au pseudo-codeet qui ont pour nom FaireDesCerclesclass et Cercleclass

bull Srsquoil ne trouve pas le fichier Cerclejava il provoque une erreur de compilation dutype Class Cercle not found

Pour corriger cette erreur il est possible de speacutecifier au compilateur ougrave il peut trouver lefichier rechercheacute en deacutefinissant une variable drsquoenvironnement classpath Cette variableindique au compilateur quels sont les reacutepertoires susceptibles de contenir desprogrammes Java Cette deacutefinition se reacutealise de faccedilon diffeacuterente suivant le systegravemeutiliseacute PC Macintosh ou station Unix (voir sur le CD-Rom la section laquo Construire sonenvironnement de travail raquo)

Phase drsquointerpreacutetation

Une fois le programme compileacute lrsquoexeacutecution du programme est reacutealiseacutee gracircce agrave lrsquointer-preacuteteur de la machine virtuelle Java (JVM) qui exeacutecute le pseudo-code associeacute auprogramme contenant la fonction main() Pour notre exemple la commande est

java FaireDesCercles

Lorsque lrsquointerpreacuteteur trouve en cours drsquoexeacutecution la deacuteclaration drsquoun objet de type nonpreacutedeacutefini il recherche par lrsquointermeacutediaire du chargeur de classe (un programme aussi appeleacuteclass loader deacutefini dans la JVM) le pseudo-code associeacute au type de lrsquoobjet et deacutefini dans unfichier dont lrsquoextension est class Pour notre exemple le chargeur de classe recherche lefichier Cercleclass Une fois trouveacute il charge le code en meacutemoire pour lrsquoexeacutecuter

Analyse des reacutesultats de lrsquoapplication

Au cours des sections preacuteceacutedentes nous avons observeacute que tout objet deacuteclareacute contenaitune adresse correspondant agrave lrsquoadresse ougrave sont stockeacutees les informations relatives agrave cetobjet Pour acceacuteder aux donneacutees et meacutethodes de chaque objet il suffit de passer parlrsquoopeacuterateur laquo raquo

Gracircce agrave cette nouvelle faccedilon de stocker lrsquoinformation les transformations drsquoun objet parlrsquointermeacutediaire drsquoune meacutethode de sa classe sont visibles pour tous les objets de la mecircmeclasse Autrement dit si une meacutethode fournit plusieurs reacutesultats ces modifications sontvisibles en dehors de la meacutethode et pour toute lrsquoapplication

Pour mieux comprendre cette technique examinons comment srsquoexeacutecute le programmeFaireDesCercles Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur

Entrez la position en x 1100Entrez la position en y 1100Entrez le rayon 55

Les valeurs saisies au clavier par lrsquoutilisateur sont directement stockeacutees en Ax Ay etAr gracircce aux instructions Ax = Lirei()

Cercle centre en 1010de rayon 5

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

168

La meacutethode afficher() est appliqueacutee agrave lrsquoobjet A (Aafficher()) Elle consulte etaffiche les donneacutees associeacutees agrave cet objet soit 10 pour x (en reacutealiteacute Ax) 10 pour y (enreacutealiteacute Ay) et 5 pour Az

Votre cercle a pour perimetre 3141592653589793

De la mecircme faccedilon la meacutethode peacuterimegravetre() est appliqueacutee agrave lrsquoobjet A (Apeacuterimegravetre())Lrsquoexpression 2MathPI r deacutefinie dans la meacutethode est donc calculeacutee pour r (Ar)valant 5

Apregraves deplacement Cercle centre en 5 2de rayon 5

Lrsquoinstruction Adeacuteplacer(5 2) passe les nouvelles coordonneacutees de la position du centredu cercle en paramegravetres Les donneacutees x et y de lrsquoobjet A sont modifieacutees en conseacutequence(voir Figure 7-7)

Apres agrandissement Cercle centre en 5 2de rayon 15

Lrsquoinstruction Aagrandir(10) passe en paramegravetre la valeur drsquoaccroissement du rayon ducercle La donneacutee r de lrsquoobjet A est augmenteacutee de cette valeur (voir Figure 7-7)

Agrave chaque appel de la meacutethode afficher() appliqueacutee agrave lrsquoobjet A les valeurs courantesdes donneacutees (x y et r) de lrsquoobjet A sont afficheacutees

Observons que lorsque lrsquoobjet A est deacuteplaceacute les deux coordonneacutees x et y de son centresont modifieacutees La meacutethode deacuteplacer() modifie le contenu des deux variablesdrsquoinstance x et y de lrsquoobjet A Cette transformation est visible en dehors de lrsquoobjet lui-mecircme puisque la meacutethode afficher() affiche agrave lrsquoeacutecran le reacutesultat de cette modification

Figure 7ndash7

Les meacutethodes appliqueacutees agrave un objet exploitent les donneacutees relatives agrave cet objet

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

169

ReacutesumeacuteLa classe String est une classe preacutedeacutefinie du langage Java qui deacutefinit deslaquo variables raquo contenant des suites de caractegraveres (des mots ou des chaicircnes de carac-tegraveres)

La classe String est un type de donneacutees composeacute de meacutethodes qui permettent larecherche de mots ou de caractegraveres dans un texte Les mots peuvent aussi ecirctrecompareacutes suivant lrsquoordre alphabeacutetique ou transformeacutes en drsquoautres formats

Lrsquoeacutetude des objets de type String montre qursquoune classe est une association de donneacutees(information ou valeur de tout type) et de meacutethodes (outils drsquoaccegraves et de transformationdes donneacutees) Deacutefinies dans une classe ces meacutethodes ne peuvent srsquoappliquer qursquoauxdonneacutees de cette mecircme classe

Le langage Java offre la possibiliteacute au programmeur de deacutevelopper ses propresclasses Construire une classe crsquoest deacutefinir un nouveau type Pour cela il est neacuteces-saire de proceacuteder de la faccedilon suivante

bull Deacuteterminer les caracteacuteristiques communes agrave ce que lrsquoon souhaite deacutecrire Ce sontles donneacutees les attributs les proprieacuteteacutes ou encore les membres de la classe

bull Deacutefinir toutes les opeacuterations et traitements reacutealisables sur ces eacuteleacutements Cesopeacuterations sont aussi appeleacutees meacutethodes ou encore comportements

Une classe deacutefinissant un type structureacute nrsquoest pas une application directement exeacutecu-table Elle ne contient pas de fonction main()

Les types structureacutes sont utiliseacutes dans les applications en deacuteclarant des laquo variables raquodont le type correspond au nom de la classe deacutefinie preacuteceacutedemment comme le montrelrsquoinstruction suivante

TypeDeLrsquoObjet chose = new TypeDeLrsquoObjet()

Lrsquoopeacuterateur new deacutetermine lrsquoadresse ougrave stocker les informations relatives agrave lavariable deacuteclareacutee Il reacuteserve lrsquoespace meacutemoire neacutecessaire pour stocker les donneacutees etles meacutethodes de la classe Les donneacutees sont initialiseacutees agrave 0 pour les entiers agrave 00pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pour tous les autres types struc-tureacutes

Agrave cette eacutetape la variable est appeleacutee un objet dans le jargon informatique Un objetest donc un eacuteleacutement particulier qui repreacutesente une classe deacutefinissant un type struc-tureacute On dit aussi que crsquoest une instance de la classe Les donneacutees (proprieacuteteacutes ou attri-buts) qui la deacutefinissent sont appeleacutees variables drsquoinstance

Lrsquoaccegraves aux variables drsquoinstance ainsi qursquoaux meacutethodes de la classe se fait parlrsquointermeacutediaire de lrsquoopeacuterateur point () comme le montre lrsquoexemple suivant

chosenomDeLaDonneacutee = valeur du bon type chosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la donneacutee et la meacutethode aient eacuteteacute preacutealablement deacutefinies pour letype de lrsquoobjet chose

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

170

ExercicesUtiliser les objets de la classe String

Eacutecrivez un programme qui reacutealise les opeacuterations suivantes

a Demander la saisie drsquoune phrase

b Afficher la phrase en majuscules

c Compter le nombre de laquo a raquo dans la phrase puis srsquoil y en a transformer tous leslaquo a raquo en laquo raquo

d Tester si entre le cinquiegraveme caractegravere et le douziegraveme se trouve une seacutequence decaractegraveres preacutealablement saisie au clavier

Eacutecrivez un programme qui permet drsquoobtenir les actions suivantes

a Saisir des mots jusqursquoagrave ce que lrsquoutilisateur entre le mot laquo Fin raquo

b Afficher parmi les mot saisis le premier dans lrsquoordre alphabeacutetique

c Afficher parmi les mot saisis le dernier dans lrsquoordre alphabeacutetique

Le mot Fin ne doit pas ecirctre pris en compte dans la liste des mots saisis

Creacuteer une classe drsquoobjetsLrsquoobjectif est de deacutefinir une repreacutesentation drsquoun objet Personne

a Sachant qursquoune personne est deacutefinie agrave partir de son nom son preacutenom et son acircgedeacutefinissez les donneacutees de la classe Personne

b Eacutecrivez une application MesAmis qui utilise un objet Untel de type Personne etqui demande la saisie au clavier de ses nom preacutenom et acircge

Consulter les variables drsquoinstancePour deacutefinir les comportements drsquoun objet de type Personne

a Dans la classe Personne deacutecrivez la meacutethode preacutesentezVous() qui affiche lescaracteacuteristiques de la personne concerneacutee

b Modifiez lrsquoapplication de faccedilon agrave afficher les caracteacuteristiques de lrsquoobjet Untel

c Dans la classe Personne deacutecrivez la meacutethode quelEstVotreNom() qui permetde connaicirctre le nom de la personne concerneacutee

d Dans la classe Personne deacutecrivez la meacutethode quelEstVotreAge() qui permetde connaicirctre lrsquoacircge de la personne concerneacutee

e Modifiez lrsquoapplication de faccedilon agrave afficher le nom puis lrsquoacircge drsquoUntel

71

72

73

74

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

171

Analyser les reacutesultats drsquoune application objetPour bien comprendre ce que reacutealise lrsquoapplication FaireDesPoints observez lesdeux programmes suivants

public class Point Le fichier srsquoappelle Pointjava int x y public void creacuteer() Systemoutprint(Entrez lrsquoabscisse ) x = Lirei() Systemoutprint(Entrez lrsquoordonnee ) y = Lirei() public void afficher() Systemoutprintln(x + x + y + y) public void deacuteplacer( int nx int ny) x = nx y = ny fin de la class Point

public class FaireDesPoints Le fichier srsquoappelle FaireDesPointsjava public static void main( String [] arg) Point P = new Point() Pafficher() Pcreacuteer() P afficher() Pdeacuteplacer(10 12) Pafficher()

fin de la class FaireDesPoints

a Quel est le programme qui correspond agrave lrsquoapplication

b Quel est le programme deacutefinissant le type Point

c Recherchez les attributs de la classe Point et donnez leur nom

d Combien de meacutethodes sont-elles deacutefinies dans la classe Point Donnez leurnom

e Quels sont les objets utiliseacutes par lrsquoapplication FaireDesPoints Que valentleurs donneacutees x et y apregraves exeacutecution de lrsquoinstruction deacuteclaration

75

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

172

f Sur la repreacutesentation graphique ci-dessous placez pour lrsquoobjet P la valeur initialeainsi que le nom des meacutethodes

g Agrave lrsquoappel de la meacutethode creacuteer() comment les valeurs sont-elles affecteacutees auxattributs des objets concerneacutes Modifiez les cases concerneacutees sur la repreacutesenta-tion graphique

h Mecircme question pour la meacutethode deacuteplacer()

i Quel est le reacutesultat final de lrsquoapplication

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter les chaicircnes de caractegraveresLe type drsquoun compte et son numeacutero ne sont plus deacutefinis respectivement comme char etlong mais comme deux objets de type String Le type drsquoun compte peut donc prendremaintenant les thegravemes courant joint ou eacutepargne

a Saisissez le type du compte de faccedilon que lrsquoutilisateur entre au clavier C J ou E Leprogramme place dans la variable type les chaicircnes courant joint ou eacutepargne enfonction de la lettre saisie

b Saisissez le numeacutero de compte sous la forme drsquoune chaicircne de caractegraveres

c Transformez tous les tests faisant appel aux variables type et numeacutero de faccedilon agravetester non plus sur des caractegraveres mais sur des String

Deacutefinir le type CompteDans un fichier nommeacute Comptejava deacutefinissez la classe Compte en proceacutedant de lafaccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerCpte() en reprenant les instructions de lrsquooption 1 deacutecrites au chapitrepreacuteceacutedent Placez-les sous lrsquoen-tecircte de la fonction qui a pour forme public void

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

173

creacuteerCpte() La meacutethode ne possegravede ni paramegravetre ni type de retour car elle nefait que modifier les donneacutees caracteacuteristiques drsquoun compte deacuteclareacute en dehors de lameacutethode

ndash afficherCpte() en reprenant la fonction eacutecrite au chapitre preacuteceacutedent et en suppri-mant le mot-cleacute static Les variables num type taux et val ne sont agrave deacuteclarer ni agravelrsquointeacuterieur ni en paramegravetre de la meacutethode Elles sont deacutefinies comme donneacutees de laclasse compte en dehors de la meacutethode

Construire lrsquoapplication ProjetDans un fichier nommeacute Projetjava eacutecrivez lrsquoapplication contenant la fonction main()en proceacutedant de la faccedilon suivante

a Faites appel aux fonctions alAide() sortir() et menuPrincipal()

b Creacuteez un objet de type Compte gracircce agrave lrsquoinstruction de deacuteclaration Compte c = newCompte()

c Dans les options approprieacutees du menu appelez les meacutethodes de la classe Comptecomme ccreacuteerCpte() ou cafficherCpte()

d Agrave lrsquoexeacutecution du programme remarquez que la meacutethode afficherCpte() affiche lesdiffeacuterentes valeurs du compte modifieacutees par la meacutethode creacuteerCpte() Une meacutethodepar lrsquointermeacutediaire drsquoun objet peut par conseacutequent transmettre plusieurs reacutesultats

Deacutefinir le type LigneComptableDans un fichier nommeacute LigneComptablejava deacutefinissez la classe LigneComptable enproceacutedant de la faccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la deacutefinition de lrsquooption 3 agrave la sectionlaquo Le projet ldquoGestion drsquoun compte bancairerdquo raquo

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerLigneComptable() qui demande la saisie au clavier des valeurs correspon-dant aux donneacutees de la classe LigneComptable

ndash afficherLigne() qui affiche les donneacutees caracteacuteristiques drsquoune ligne comptable

Modifier le type CompteDans le fichier Comptejava

a Deacutefinissez une nouvelle donneacutee (variable drsquoinstance) deacutecrivant une ligne comptableen eacutecrivant la deacuteclaration LigneComptable ligne au mecircme niveau que typenumeacutero etc

b Eacutecrivez la meacutethode creacuteerLigne() qui permet les actions suivantes

ndash creacuteer en meacutemoire lrsquoobjet ligne gracircce agrave lrsquoinstruction de deacuteclaration ligne = newLigneComptable()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

174

ndash faire appel agrave la meacutethode creacuteerLigneComptable() par lrsquointermeacutediaire de lrsquoobjetligne de faccedilon agrave enregistrer les valeurs numeacuteriques associeacutees agrave la ligne creacuteeacutee

ndash modifier la valeur courante du compte agrave partir de la valeur (deacutebit ou creacutedit) saisiedans la meacutethode creacuteerLigneComptable()

c Modifiez la meacutethode afficherCpte() de faccedilon agrave afficher les informations stockeacuteesdans ligne en utilisant lrsquoinstruction ligneafficherLigne()

Modifier lrsquoapplication Projeta Dans le fichier nommeacute Projetjava modifiez lrsquooption 3 de lrsquoapplication de faccedilon

qursquoune ligne comptable soit creacuteeacutee pour le compte C deacutefini agrave lrsquooption 1

b Agrave lrsquoexeacutecution de lrsquoapplication que se passe-t-il si lrsquoutilisateur ayant creacuteeacute un compteaffiche ce dernier sans avoir jamais creacuteeacute de ligne comptable Pourquoi

c Comment faire pour remeacutedier agrave cette situation

copy copyright Eacuteditions Eyrolles

8Les principes

du concept drsquoobjet

Au cours du chapitre preacuteceacutedent nous avons examineacute comment mettre en place des objetsagrave lrsquointeacuterieur drsquoun programme Java Cette eacutetude a montreacute combien la structure geacuteneacuteraledes programmes se trouvait modifieacutee par lrsquoemploi des objetsEn reacutealiteacute les objets sont beaucoup plus qursquoune structure syntaxique Ils sont reacutegis pardes principes essentiels qui constituent les fondements de la programmation objet Dansce chapitre nous eacutetudions avec preacutecision lrsquoensemble de ces principes Nous deacuteterminons drsquoabord (section laquo La communication objet raquo) les caracteacuteristiquesdrsquoune donneacutee static et eacutevaluons leurs conseacutequences sur la construction des objets enmeacutemoire Nous analysons eacutegalement la technique du passage de paramegravetres par reacutefeacute-rence Nous observons qursquoil est possible avec la technologie objet qursquoune meacutethode trans-mette plusieurs reacutesultats agrave une autre meacutethodeNous expliquons ensuite (section laquo Les objets controcirclent leur fonctionnement raquo) leconcept drsquoencapsulation des donneacutees et nous examinons pourquoi et comment les objetsprotegravegent leurs donneacutees Enfin nous deacutefinissons (section laquo Lrsquoheacuteritage raquo) la notion drsquoheacuteritage entre classes Nousobservons combien cette notion est utile puisqursquoelle permet de reacuteutiliser des programmestout en apportant des variations dans le comportement des objets heacuteritants

La communication objetEn deacutefinissant un type ou une classe le deacuteveloppeur creacutee un modegravele qui deacutecrit les fonc-tionnaliteacutes des objets utiliseacutes par le programme Les objets sont creacuteeacutes en meacutemoire agrave partirde ce modegravele par copie des donneacutees et des meacutethodes Cette copie est reacutealiseacutee lors de la reacuteservation des emplacements meacutemoire gracircce agrave lrsquoopeacutera-teur new qui initialise les donneacutees de lrsquoobjet et fournit en retour lrsquoadresse ougrave se trouventles informations stockeacutees

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

176

La question est de comprendre pourquoi lrsquointerpreacuteteur reacutealise cette copie en meacutemoirealors que cela lui eacutetait impossible auparavant

Les donneacutees staticLa reacuteponse agrave cette interrogation se trouve dans lrsquoobservation des diffeacuterents programmesproposeacutes dans ce manuel (voir les chapitres 6 laquoFonctions notions avanceacuteesraquo et 7 laquoLesclasses et les objetsraquo) Comme nous lrsquoavons deacutejagrave constateacute (voir au chapitre preacuteceacutedent lasection laquoConstruire et utiliser ses propres classesraquo) le mot-cleacute static nrsquoest plus utiliseacutelors de la description drsquoun type alors qursquoil eacutetait preacutesent dans tous les programmes preacuteceacutedantce chapitre

Crsquoest donc la preacutesence ou lrsquoabsence de ce mot-cleacute qui fait que lrsquointerpreacuteteur construiseou non des objets en meacutemoire

Lorsque lrsquointerpreacuteteur rencontre le mot-cleacute static devant une variable ou une meacutethode ilreacuteserve un seul et unique emplacement meacutemoire pour y stoker la valeur ou le pseudo-codeassocieacutes Cet espace meacutemoire est communeacutement accessible pour tous les objets du mecircmetype

Lorsque le mot-cleacute static nrsquoapparaicirct pas lrsquointerpreacuteteur reacuteserve agrave chaque appel de lrsquoopeacutera-teur new un espace meacutemoire pour y charger les donneacutees et les pseudo-codes deacutecrits dans laclasse

Exemple compter des cercles

Pour bien comprendre la diffeacuterence entre une donneacutee static et une donneacutee non staticnous allons modifier la classe Cercle de faccedilon qursquoil soit possible de connaicirctre le nombredrsquoobjets Cercle creacuteeacutes en cours drsquoapplication

Pour ce faire lrsquoideacutee est drsquoeacutecrire une meacutethode creacuteer() qui permette drsquoune part de saisirdes valeurs x y et r pour chaque cercle agrave creacuteer et drsquoautre part drsquoincreacutementer un comp-teur de cercles

La variable repreacutesentant ce compteur doit ecirctre indeacutependante des objets creacuteeacutes de sorteque sa valeur ne soit pas ecirctre reacuteinitialiseacutee agrave zeacutero agrave chaque creacuteation drsquoobjet Cette variabledoit cependant ecirctre accessible pour chaque objet de faccedilon qursquoelle puisse srsquoincreacutementerde 1 agrave chaque appel de la meacutethode creacuteer()

Pour reacutealiser ces contraintes le compteur de cercles doit ecirctre une variable de classecrsquoest-agrave-dire une variable deacuteclareacutee avec le mot-cleacute static Examinons tout cela dans leprogramme suivant

public class Cercle public int x y r position du centre et rayon public static int nombre nombre de cercle

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Rayon )

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

177

r = Lirei()

nombre ++

et toutes les autres meacutethodes de la classe Cercle deacutefinies au

chapitre preacuteceacutedent

Fin de la classe Cercle

Les donneacutees deacutefinies dans la classe Cercle sont de deux sortes les variablesdrsquoinstance x y et r et la variable de classe nombre Seul le mot-cleacute static permet dediffeacuterencier leur cateacutegorie

Gracircce au mot-cleacute static la variable de classe nombre est un espace meacutemoire communaccessible pour tous les objets creacuteeacutes Pour faire appel agrave cette variable il suffit delrsquoappeler par son nom veacuteritable (voir au chapitre 6 laquo Fonctions notions avanceacutees raquo lasection laquo Variable de classe raquo) crsquoest-agrave-dire nombre si elle est utiliseacutee dans la classeCercle ou Cerclenombre si elle est utiliseacutee en dehors de cette classe

Exeacutecution de lrsquoapplication CompterDesCercles

Pour mieux saisir la diffeacuterence entre les variables drsquoinstance (non static) et les varia-bles de classe (static) observons comment fonctionne lrsquoapplication CompterDesCer-cles

public class CompterDesCercles public static void main(String [] arg)

Cercle A = new Cercle()

Acreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Cercle B = new Cercle()

Bcreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Fin de la classe CompterDesCercles

Dans ce programme deux objets de type Cercle sont creacuteeacutes agrave partir du modegravele deacutefini parle type Cercle Chaque objet est un repreacutesentant particulier ou une instance de la classeCercle de position et de rayon speacutecifiques

Lorsque lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new les donneacutees x y et r sontinitialiseacutees agrave 0 au moment de la reacuteservation de lrsquoespace meacutemoire La variable de classenombre est elle aussi creacuteeacutee en meacutemoire et sa valeur est eacutegalement initialiseacutee agrave 0

Lors de lrsquoexeacutecution de lrsquoinstruction Acreacuteer() les valeurs des variables x y et r delrsquoinstance A sont saisies au clavier (x = Lirei() hellip) La variable de classe nombre estincreacutementeacutee de 1 (nombre++) Le nombre de cercles est alors de 1 (voir lrsquoobjet A deacutecrit agravela Figure 8-1)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

178

De la mecircme faccedilon lrsquoobjet B est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new Les donneacutees xy et r sont elles aussi initialiseacutees agrave 0

Pour la variable de classe nombre en revanche cette initialisation nrsquoest pas reacutealiseacutee Lapreacutesence du mot-cleacute static fait que la variable de classe nombre qui existe deacutejagrave enmeacutemoire ne peut ecirctre reacuteinitialiseacutee directement par lrsquointerpreacuteteur

Il y a donc non pas reacuteservation drsquoun nouvel emplacement meacutemoire mais preacuteservationdu mecircme emplacement meacutemoire avec conservation de la valeur calculeacutee agrave lrsquoeacutetape preacuteceacute-dente soit 1

Apregraves saisie des donneacutees x y et r de lrsquoinstance B lrsquoinstruction nombre++ fait passer lavaleur de Cerclenombre agrave 2 (voir lrsquoobjet B deacutecrit agrave la Figure 8-1)

Nrsquoexistant qursquoen un seul exemplaire la variable de classe nombre permet le comptage dunombre de cercles creacuteeacutes Lrsquoincreacutementation de cette valeur est reacutealiseacutee indeacutependammentde lrsquoobjet la variable eacutetant commune agrave tous les objets creacuteeacutes

Le passage de paramegravetres par reacutefeacuterenceLa communication des donneacutees entre les objets passe avant tout par lrsquointermeacutediaire desvariables drsquoinstance Nous lrsquoavons observeacute agrave la section preacuteceacutedente lorsqursquoune meacutethodeappliqueacutee agrave un objet modifie les valeurs de plusieurs donneacutees de cet objet cette modifi-cation est visible en dehors de la meacutethode et de lrsquoobjet lui-mecircme

Il existe cependant une autre technique qui permette la modification des donneacutees drsquounobjet le passage de paramegravetres par reacutefeacuterence

Ce proceacutedeacute est utiliseacute lorsqursquoon passe en paramegravetre drsquoune meacutethode non plus une simplevariable (de type int char ou double) mais un objet Dans cette situation lrsquoobjet eacutetantdeacutefini par son adresse (reacutefeacuterence) la valeur passeacutee en paramegravetre nrsquoest plus la valeurreacuteelle de la variable mais lrsquoadresse de lrsquoobjet

Gracircce agrave cela les modifications apporteacutees sur lrsquoobjet passeacute en paramegravetre et reacutealiseacutees agravelrsquointeacuterieur de la meacutethode sont visibles en dehors mecircme de la meacutethode

Figure 8-1

La variable de classe Cerclenombre est creacuteeacutee en meacutemoire avec lrsquoobjet A Gracircce au mot-cleacute static il y a non pas reacuteservation drsquoun nouvel espace meacutemoire (pour la variable nombre) lors de la creacuteation de lrsquoobjet B mais preacuteservation de lrsquoespace meacutemoire ainsi que de la valeur stockeacutee

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

179

Eacutechanger la position de deux cercles

Pour comprendre en pratique le meacutecanisme du passage de paramegravetres par reacutefeacuterencenous allons eacutecrire une application qui eacutechange la position des centres de deux cerclesdonneacutes

Pour cela nous utilisons le meacutecanisme drsquoeacutechange de valeurs (voir le chapitre 1laquo Stocker une information raquo) en lrsquoappliquant agrave la coordonneacutee x puis agrave la coordonneacutee ydes centres des deux cercles agrave eacutechanger

Examinons la meacutethode eacutechanger() dont le code ci-dessous srsquoinsegravere dans la classe Cercle

Voir au chapitre 7 laquoLes classes et les objets raquo la section laquoLa classe descriptive du type Cercleraquo

public void eacutechanger(Cercle autre) Eacutechange la position drsquoun int tmp cercle avec celle du cercle donneacute en paramegravetre tmp = x eacutechanger la position en x x = autrex autrex = tmp tmp = y eacutechanger la position en y y = autrey autrey = tmp

Pour eacutechanger les coordonneacutees des centres de deux cercles la meacutethode eacutechanger() doitavoir accegraves aux valeurs des coordonneacutees des deux centres des cercles concerneacutes

Si par exemple la meacutethode est appliqueacutee au cercle B (Beacutechanger()) ce sont les varia-bles drsquoinstance x et y de lrsquoobjet B qui sont modifieacutees par les coordonneacutees du centre ducercle A La meacutethode doit donc connaicirctre les coordonneacutees du cercle A Pour ce faire il estneacutecessaire de passer ces valeurs en paramegravetres de la fonction

La technique consiste agrave passer en paramegravetres non pas les valeurs x et y du cercle aveclequel lrsquoeacutechange est reacutealiseacute mais un objet de type Cercle Dans notre exemple ce para-megravetre srsquoappelle autre Crsquoest le paramegravetre formel de la meacutethode repreacutesentant nrsquoimportequel cercle et il peut donc repreacutesenter par exemple le cercle A

Le fait drsquoeacutechanger les coordonneacutees des centres de deux cercles revient agrave eacutechanger les coor-donneacutees du couple (x y) du cercle sur lequel on applique la meacutethode (Bx By) avec lescoordonneacutees (autrex autrey) du cercle passeacute en paramegravetre de la meacutethode (Ax Ay)

Examinons maintenant comment srsquoopegravere effectivement lrsquoeacutechange en exeacutecutant lrsquoappli-cation suivante

public class EchangerDesCercles public static void main(String [] arg) Cercle A = new Cercle() Acreacuteer() Systemoutprintln(Le cercle A ) Aafficher()

Cercle B = new Cercle() Bcreacuteer() Systemoutprintln(Le cercle B )

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

180

B afficher() Beacutechanger(A) Systemoutprintln(Apres echange ) Systemoutprintln(Le cercle A ) Aafficher() Systemoutprintln(Le cercle B ) Bafficher()

Exeacutecution de lrsquoapplication EchangerDesCercles

Nous supposons que lrsquoutilisateur ait saisi les valeurs suivantes pour le cercle A

Position en x 22Position en y 22Rayon 22Le cercle A Centre en 2 2Rayon 2

et pour le cercle B

Position en x 55Position en y 55Rayon 55Le cercle B Centre en 5 5Rayon 5

Lrsquoinstruction Beacutechanger(A) eacutechange les coordonneacutees (x y) de lrsquoobjet B avec celles delrsquoobjet A Crsquoest donc le pseudo-codede lrsquoobjet B qui est interpreacuteteacute comme illustreacute agrave laFigure 8-2

Figure 8-2

Lrsquoinstruction Beacutechanger(A) fait appel agrave la meacutethode eacutechanger() de lrsquoobjet B Les donneacutees x y et r utiliseacutees par cette meacutethode sont celles de lrsquoobjet B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

181

Examinons le tableau drsquoeacutevolution des variables deacuteclareacutees pour le pseudo-code de lrsquoobjet B

bull Agrave lrsquoentreacutee de la meacutethode la variable tmp est deacuteclareacutee sans ecirctre initialiseacutee

bull La meacutethode est appliqueacutee agrave lrsquoobjet B Les variables x et y de lrsquoinstance B ont pourvaleurs respectives 5 et 5

bull Lrsquoobjet autre est simplement deacuteclareacute en paramegravetre de la fonction eacutechanger(Cercleautre) Lrsquoopeacuterateur new nrsquoeacutetant pas appliqueacute agrave cet objet aucun espace meacutemoiresuppleacutementaire nrsquoest alloueacute

Comme autre repreacutesente un objet de type Cercle il ne peut contenir qursquoune adresseet non pas une simple valeur numeacuterique Cette adresse est celle du paramegravetre effec-tivement passeacute lors de lrsquoappel de la meacutethode

Pour notre exemple lrsquoobjet A est passeacute en paramegravetre de la meacutethode (Beacutechanger(A))La case meacutemoire de la variable autre prend donc pour valeur lrsquoadresse de lrsquoobjet A

bull La variable tmp prend ensuite la valeur de la coordonneacutee x de lrsquoobjet B soit 5

instruction tmp x y autre

valeurs initiales - 5 5 0x11022033

instruction tmp x autre autrex (Ax)

tmp = x 5 5 0x11022033 2

x = autrex 5 2 0x11022033 2

autrex = tmp 5 2 0x11022033 5

Figure 8-3

Lrsquoobjet autre est le paramegravetre formel de la meacutethode eacutechanger() En eacutecrivant Beacutechanger(A) lrsquoobjet autre stocke la reacutefeacuterence meacutemoriseacutee en A De cette faccedilon autrex repreacutesente eacutegalement Ax La variable x de lrsquoinstance B prend la valeur de Ax gracircce agrave lrsquoinstruction x = autrex

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

182

bull Lorsque lrsquoinstruction x = autrex est exeacutecuteacutee la coordonneacutee x de lrsquoobjet B prend lavaleur de la coordonneacutee x de lrsquoobjet autrex Puisque autre correspond agrave lrsquoadresse delrsquoobjet A le fait de consulter le contenu de autrex revient en reacutealiteacute agrave consulter lecontenu de Ax (voir Figure 8-3) La variable drsquoinstance Ax contenant la valeur 2x (Bx) prend la valeur 2

bull Pour finir lrsquoeacutechange sur les abscisses autrex prend la valeur stockeacutee dans tmpComme autre et A correspondent agrave la mecircme adresse modifier autrex crsquoest aussimodifier Ax (voir Figure 8-4) Une fois exeacutecuteacute autrex = tmp la variable x delrsquoinstance A vaut par conseacutequent 5

Lrsquoensemble de ces opeacuterations est ensuite reacutealiseacute sur la coordonneacutee y des cercles B et A viaautre

Lrsquoexeacutecution finale du programme a pour reacutesultat

Apres echange Le cercle A Centreacute en 5 5Rayon 2Le cercle B Centre en 2 2Rayon 5

instruction tmp y autre autrey (Ay)

tmp = y 5 5 0x11022033 2

y = autrey 5 2 0x11022033 2

autrey = tmp 5 2 0x11022033 5

Figure 8-4

autre et A deacutefinissent la mecircme reacutefeacuterence ou adresse Crsquoest pourquoi le fait de modifier autrex revient aussi agrave modifier Ax Ainsi lrsquoinstruction autrex = tmp fait que Ax prend la valeur stockeacutee dans tmp

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

183

Au final nous constatons agrave lrsquoobservation des tableaux drsquoeacutevolution des variables que lesdonneacutees x et y de B ont pris la valeur des donneacutees x et y de A soit 2 pour x et 2 pour yParallegravelement le cercle A a eacuteteacute transformeacute par lrsquointermeacutediaire de la reacutefeacuterence stockeacuteedans autre et a pris les coordonneacutees x et y du cercle B soit 5 pour x et 5 pour y

En reacutesumeacute gracircce agrave la technique du passage de paramegravetres par reacutefeacuterence tout objetpasseacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethode ses donneacutees transfor-meacutees par la meacutethode Cette transformation est alors visible pour tous les objets delrsquoapplication

Les objets controcirclent leur fonctionnementLrsquoun des objectifs de la programmation objet est de simuler agrave lrsquoaide drsquoun programmeinformatique la manipulation des objets reacuteels par lrsquoecirctre humain Les objets reacuteels formentun tout et leur manipulation neacutecessite la plupart du temps un outil ou une interface decommunication

Par exemple quand nous prenons un ascenseur nous appuyons sur le bouton drsquoappelpour ouvrir les portes ou pour nous rendre jusqursquoagrave lrsquoeacutetage deacutesireacute Lrsquointerface de commu-nication est ici le bouton drsquoappel Nul nrsquoaurait lrsquoideacutee de prendre la teacuteleacutecommande de sateacuteleacutevision pour appeler un ascenseur

De la mecircme faccedilon la preacuteparation drsquoune omelette neacutecessite de casser des œufs Pourbriser la coquille drsquoun œuf nous pouvons utiliser lrsquooutil couteau Un marteau pourraitecirctre eacutegalement utiliseacute mais son usage nrsquoest pas vraiment adapteacute agrave la situation

Comme nous le constatons agrave travers ces exemples les objets reacuteels sont manipuleacutes parlrsquointermeacutediaire drsquointerfaces approprieacutees Lrsquoutilisation drsquoun outil inadapteacute fait quelrsquoobjet ne reacutepond pas agrave nos attentes ou qursquoil se brise deacutefinitivement

Tout comme nous manipulons les objets reacuteels les applications informatiques manipulentdes objets virtuels deacutefinis par le programmeur Cette manipulation neacutecessite des outilsaussi bien adapteacutes que nos outils reacuteels Sans controcircle sur le bien-fondeacute drsquoune manipula-tion lrsquoapplication risque de fournir de mauvais reacutesultats ou pire de cesser brutalementson exeacutecution

La notion drsquoencapsulation

Pour reacutealiser lrsquoadeacutequation entre un outil et la manipulation drsquoun objet la programmationobjet utilise le concept drsquoencapsulation

Par ce terme il faut entendre que les donneacutees drsquoun objet sont proteacutegeacutees tout comme lemeacutedicament est proteacutegeacute par la fine pellicule de sa capsule Gracircce agrave cette protection il nepeut y avoir transformation involontaire des donneacutees de lrsquoobjet

Lrsquoencapsulation passe par le controcircle des donneacutees et des comportements de lrsquoobjet Cecontrocircle est eacutetabli agrave travers la protection des donneacutees (voir la section suivante) lrsquoaccegravescontrocircleacute aux donneacutees (voir la section laquo Les meacutethodes drsquoaccegraves aux donneacutees raquo) et la notionde constructeur de classe (voir la section laquo Les constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

184

La protection des donneacuteesLe langage Java fournit les niveaux de protection suivants pour les membres drsquoune classe(donneacutees et meacutethodes)

bull Protection public Les membres (donneacutees et meacutethodes) drsquoune classe deacuteclareacutes publicsont accessibles pour tous les objets de lrsquoapplication Les donneacutees peuvent ecirctre modi-fieacutees par une meacutethode de la classe drsquoune autre classe ou depuis la fonction main()

bull Protection private Les membres de la classe deacuteclareacutes private ne sont accessiblesque pour les meacutethodes de la mecircme classe Les donneacutees ne peuvent ecirctre initialiseacutees oumodifieacutees que par lrsquointermeacutediaire drsquoune meacutethode de la classe Les donneacutees oumeacutethodes ne peuvent ecirctre appeleacutees par la fonction main()

bull Protection protected Tout comme les membres priveacutes les membres deacuteclareacutesprotected ne sont accessibles que pour les meacutethodes de la mecircme classe Ils sont aussiaccessibles par les fonctions membres drsquoune sous-classe (voir la sectionlaquo Lrsquoheacuteritage raquo)

Par deacutefaut lorsque les donneacutees sont deacuteclareacutees sans type de protection leur protection estpublic Les donneacutees sont alors accessibles depuis toute lrsquoapplication

Proteacuteger les donneacutees drsquoun cercle

Pour proteacuteger les donneacutees de la classe Cercle il suffit de remplacer le mot-cleacute publicpreacuteceacutedant la deacuteclaration des variables drsquoinstance par le mot private Observons lanouvelle classe CerclePrive dont les donneacutees sont ainsi proteacutegeacutees

public class CerclePrive private int x y r position du centre et rayon

public void afficher() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void deacuteplacer(int nx int ny) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets Fin de la classe CerclePrive

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

185

Les donneacutees x y et r de la classe CerclePrive sont proteacutegeacutees gracircce au mot-cleacute privateEacutetudions les conseacutequences drsquoune telle protection sur la phase de compilation de lrsquoappli-cation FaireDesCerclesPrives

public class FaireDesCerclesPrives public static void main(String [] arg) CerclePrive A = new CerclePrive() Aafficher() Systemoutprintln( Entrez le rayon ) Ar = Lirei() Systemoutprintln( Le cercle est de rayon + Ar)

Compilation de lrsquoapplication FaireDesCerclesPrives

Les donneacutees x y et r de la classe CerclePrive sont deacuteclareacutees priveacutees Par deacutefinition cesdonneacutees ne sont donc pas accessibles en dehors de la classe ougrave elles sont deacutefinies

Or en eacutecrivant dans la fonction main() lrsquoinstruction Ar = Lirei() le programmeurdemande drsquoacceacuteder depuis la classe FaireDesCerclesPrives agrave la valeur de r de faccedilonagrave la modifier Cet accegraves est impossible car r est deacutefini en mode private dans la classeCerclePrive et non dans la classe FaireDesCerclesPrives

Crsquoest pourquoi le compilateur deacutetecte lrsquoerreur Variable x in class CerclePrive notaccessible from class FaireDesCerclesPrives

Les meacutethodes drsquoaccegraves aux donneacuteesLorsque les donneacutees sont totalement proteacutegeacutees crsquoest-agrave-dire deacuteclareacutees private agrave lrsquointeacute-rieur drsquoune classe elles ne sont plus accessibles depuis une autre classe ou depuis lafonction main() Pour connaicirctre ou modifier la valeur drsquoune donneacutee il est neacutecessaire decreacuteer agrave lrsquointeacuterieur de la classe des meacutethodes drsquoaccegraves agrave ces donneacutees

Figure 8-5

Lorsque les donneacutees drsquoun objet sont proteacutegeacutees lrsquoobjet possegravede ses propres meacutethodes qui permettent soit de consulter la valeur reacuteelle de ses donneacutees soit de modifier les donneacutees La validiteacute de ces modifications est controcircleacutee par les meacutethodes deacutefinies dans la classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

186

Les donneacutees priveacutees ne peuvent ecirctre consulteacutees ou modifieacutees que par des meacutethodes de laclasse ougrave elles sont deacuteclareacutees

De cette faccedilon gracircce agrave lrsquoaccegraves aux donneacutees par lrsquointermeacutediaire de meacutethodes approprieacuteeslrsquoobjet permet non seulement la consultation de la valeur de ses donneacutees mais aussilrsquoautorisation ou non suivant ses propres critegraveres de leur modification

Les meacutethodes drsquoune classe reacutealisent les modes drsquoaccegraves suivants

bull Accegraves en consultation La meacutethode fournit la valeur de la donneacutee mais ne peut lamodifier Ce type de meacutethode est aussi appeleacute accesseur en consultation

bull Accegraves en modification La meacutethode modifie la valeur de la donneacutee Cette modificationest reacutealiseacutee apregraves validation par la meacutethode On parle aussi drsquoaccesseur en modification

Controcircler les donneacutees drsquoun cercle

Dans lrsquoexemple suivant nous prenons pour hypothegravese que le rayon drsquoun cercle ne puissejamais ecirctre neacutegatif ni deacutepasser la taille de lrsquoeacutecran Ces conditions doivent ecirctre veacuterifieacuteespour toutes les meacutethodes qui peuvent modifier la valeur du rayon drsquoun cercle

Comme nous lrsquoavons deacutejagrave remarqueacute (voir au chapitre 7 laquo Les classes et les objets raquo lasection laquo Quelques observations raquo) les meacutethodes afficher() et peacuterimegravetre() ne fontque consulter le contenu des donneacutees x y et r

Les meacutethodes deacuteplacer() agrandir() et creacuteer() en revanche modifient le contenudes donneacutees x y et r La meacutethode deacuteplacer() nrsquoayant pas drsquoinfluence sur la donneacutee rseules les meacutethodes agrandir() et creacuteer() doivent controcircler la valeur du rayon de sorteque cette derniegravere ne puisse ecirctre neacutegative ou supeacuterieure agrave la taille de lrsquoeacutecran Examinonsla classe CercleControle suivante qui prend en compte ces nouvelles contraintes

public class CercleControle private int x y r position du centre et rayon public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt 600)

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Centre en + x + + y) Systemoutprintln( Rayon + r)

public void agrandir(int nr) if (r + nr lt 0) r = 0 else if ( r + nr gt 600) r = 600 else r = r + nr

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

187

Fin de la classe CercleControle

La meacutethode creacuteer() controcircle la valeur du rayon lors de sa saisie en demandant de saisirune valeur pour le rayon tant que la valeur saisie est neacutegative ou plus grande que 600(taille supposeacutee de lrsquoeacutecran) Degraves que la valeur saisie est comprise entre 0 et 600 la fonc-tion creacuteer() cesse son exeacutecution Agrave la sortie de cette fonction nous sommes certainsque le rayon est compris entre 0 et 600

De la mecircme faccedilon la meacutethode agrandir() autorise que la valeur du rayon soitaugmenteacutee de la valeur passeacutee en paramegravetre agrave condition que cette augmentation nedeacutepasse pas la taille de lrsquoeacutecran ou que la diminution nrsquoentraicircne pas un rayon neacutegatif si lavaleur passeacutee en paramegravetre est neacutegative Dans ces deux cas la valeur du rayon est forceacuteerespectivement agrave la taille de lrsquoeacutecran ou agrave 0

Exeacutecution de lrsquoapplication FaireDesCerclesControlesPour veacuterifier que tous les objets Cercle controcirclent bien la valeur de leur rayon exami-nons lrsquoexeacutecution de lrsquoapplication suivante

public class FaireDesCerclesControles public static void main(String [] arg) CercleControle A = new CercleControle() Acreacuteer() Aafficher() Systemoutprint(Entrer une valeur drsquoagrandissement ) int plus = Lirei() Aagrandir(plus) Systemoutprintln(Apres agrandissement ) Aafficher()

Lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new La valeur du rayon est initialiseacutee agrave 0Agrave lrsquoappel de la meacutethode creacuteer() les variables drsquoinstance x et y sont saisies au claviercomme suit

Position en x 55Position en y 55

Ensuite si lrsquoutilisateur saisit pour le rayon une valeur neacutegative

Rayon --33

ou supeacuterieure agrave 600

Rayon 665544

le programme demande de nouveau de saisir une valeur pour le rayon Lrsquoapplicationcesse cette reacutepeacutetition lorsque lrsquoutilisateur entre une valeur comprise entre 0 et 600comme suit

Rayon 220000Centre 5 5 Rayon 200

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

188

Apregraves affichage des donneacutees du cercle A le programme demande

Entrer une valeur drsquoagrandissement 445500

La valeur du rayon vaut 200 + 450 soit 650 Ce nouveau rayon eacutetant supeacuterieur agrave 600 lavaleur du rayon est bloqueacutee par le programme agrave 600 Lrsquoaffichage des donneacutees fournit

Apres agrandissement Centre 5 5 Rayon 600

La notion de constante

Drsquoune maniegravere geacuteneacuterale en programmation objet les variables drsquoinstance ne sont quetregraves rarement deacuteclareacutees en public Pour des raisons de seacutecuriteacute tout objet se doit decontrocircler les transformations opeacutereacutees par lrsquoapplication sur lui-mecircme Crsquoest pourquoi lesdonneacutees drsquoune classe sont le plus souvent deacuteclareacutees en mode private

Il existe des donneacutees appeleacutees constantes qui parce qursquoelles sont importantes doiventecirctre visibles par toutes les meacutethodes de lrsquoapplication Ces donneacutees sont deacuteclareacutees enmode public Du fait de leur invariabiliteacute lrsquoapplication ne peut modifier leur contenu

Pour notre exemple la valeur 600 correspondant agrave la taille (largeur et hauteur) supposeacuteede lrsquoeacutecran peut ecirctre consideacutereacutee comme une donneacutee constante de lrsquoapplication

Il suffit de deacuteclarer les variables laquo constantes raquo agrave lrsquoaide du mot-cleacute final Ainsi la taillede lrsquoeacutecran peut ecirctre deacutefinie de la faccedilon suivante

public final int TailleEcran = 600

Notons que la taille de lrsquoeacutecran est une valeur indeacutependante de lrsquoobjet Cercle Quelle quesoit la forme agrave dessiner (carreacute cercle etc) la taille de lrsquoeacutecran est toujours la mecircme Crsquoestpourquoi il est logique de deacuteclarer la variable TailleEcran comme constante de classe agravelrsquoaide du mot-cleacute static

public final static int TailleEcran = 600

De cette faccedilon la variable TailleEcran est accessible en consultation depuis toutelrsquoapplication mais elle ne peut en aucun cas ecirctre modifieacutee eacutetant deacuteclareacutee final

Les meacutethodes creacuteer() et agrandir() srsquoeacutecrivent alors de la faccedilon suivante

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt TailleEcran)

public void agrandir(int nr) if (r + nr lt 0) r = 0

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

189

else if ( r + nr gt TailleEcran) r = TailleEcran else r = r + nr

Des meacutethodes invisibles

Comme nous lrsquoavons observeacute preacuteceacutedemment les donneacutees drsquoune classe sont geacuteneacuterale-ment deacuteclareacutees en mode private Les meacutethodes quant agrave elles sont le plus souventdeacuteclareacutees public car ce sont elles qui permettent lrsquoaccegraves aux donneacutees proteacutegeacutees Danscertains cas particuliers il peut arriver que certaines meacutethodes soient deacutefinies en modeprivate Elles deviennent alors inaccessibles depuis les classes exteacuterieures

Ainsi le controcircle systeacutematique des donneacutees est toujours reacutealiseacute par lrsquoobjet lui-mecircme etnon par lrsquoapplication qui utilise les objets Par conseacutequent les meacutethodes qui ont pourcharge de reacutealiser cette veacuterification peuvent ecirctre deacutefinies comme meacutethodes internes agrave laclasse puisqursquoelles ne sont jamais appeleacutees par lrsquoapplication

Par exemple le controcircle de la validiteacute de la valeur du rayon nrsquoest pas reacutealiseacutee par lrsquoappli-cation FaireDesCercles mais correspond agrave une opeacuteration interne agrave la classe Cercle Cecontrocircle est reacutealiseacute diffeacuteremment suivant que le cercle est agrave creacuteer ou agrave agrandir (voir lesmeacutethodes creacuteer() et agrandir() ci-dessus)

bull Soit le rayon nrsquoest pas encore connu et la veacuterification srsquoeffectue degraves la saisie de lavaleur Crsquoest ce que reacutealise la meacutethode suivante

private int rayonVeacuterifieacute() int tmp do Systemoutprint( Rayon ) tmp = Lirei() while ( tmp lt 0 || tmp gt TailleEcran) return tmp

bull Soit le rayon est deacutejagrave connu auquel cas la veacuterification est reacutealiseacutee agrave partir de la valeurpasseacutee en paramegravetre de la meacutethode

private int rayonVeacuterifieacute (int tmp) if (tmp lt 0) return 0 else if ( tmp gt TailleEcran) return TailleEcran else return tmp

Les meacutethodes rayonVeacuterifieacute() sont appeleacutees meacutethodes drsquoimpleacutementation car ellessont deacuteclareacutees en mode priveacute Leur existence nrsquoest connue drsquoaucune autre classe Seulesles meacutethodes de la classe Cercle peuvent les exploiter et elles ne sont pas directementexeacutecutables par lrsquoapplication Elle sont cependant tregraves utiles agrave lrsquointeacuterieur de la classe ougraveelles sont deacutefinies (voir les sections laquo Les constructeurs raquo et laquo Lrsquoheacuteritage raquo)

Remarquons en outre que nous venons de deacutefinir deux meacutethodes portant le nom rayon-Veacuterifieacute() Le langage Java nrsquointerdit pas la deacutefinition de meacutethodes portant le mecircmenom Dans cette situation on dit que ces meacutethodes sont surchargeacutees (voir la sectionlaquo La surcharge de constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

190

Les constructeursGracircce aux diffeacuterents niveaux de protection et aux meacutethodes controcirclant lrsquoaccegraves auxdonneacutees il devient possible de construire des outils approprieacutes aux objets manipuleacutes

Cependant la protection des donneacutees drsquoune classe passe aussi par la notion de construc-teurs drsquoobjets En effet les constructeurs sont utiliseacutes pour initialiser correctement lesdonneacutees drsquoun objet au moment de la creacuteation de lrsquoobjet en meacutemoire

Le constructeur par deacutefaut

Le langage Java deacutefinit pour chaque classe construite par le programmeur un construc-teur par deacutefaut Celui-ci initialise lors de la creacuteation drsquoun objet toutes les donneacutees de cetobjet agrave 0 pour les entiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pourles String ou autres types structureacutes

Le constructeur par deacutefaut est appeleacute par lrsquoopeacuterateur new lors de la reacuteservation delrsquoespace meacutemoire Ainsi lorsque nous eacutecrivons

Cercle C = new Cercle()

nous utilisons le terme Cercle() qui repreacutesente en reacutealiteacute le constructeur par deacutefaut (ilne possegravede pas de paramegravetre) de la classe Cercle

Un constructeur est une meacutethode puisqursquoil y a des parenthegraveses () derriegravere son nomdrsquoappel qui porte le nom de la classe associeacutee au type de lrsquoobjet deacuteclareacute

Deacutefinir le constructeur drsquoune classe

Lrsquoutilisation du constructeur par deacutefaut permet drsquoinitialiser systeacutematiquement lesdonneacutees drsquoune classe Lrsquoinitialisation proposeacutee peut parfois ne pas ecirctre conforme auxvaleurs demandeacutees par le type

Dans ce cas le langage Java offre la possibiliteacute de deacutefinir un constructeur propre agrave laclasse de lrsquoobjet utiliseacute Cette deacutefinition est reacutealiseacutee en eacutecrivant une meacutethode portant lemecircme nom que sa classe Les instructions qui la composent permettent drsquoinitialiser lesdonneacutees de la classe conformeacutement aux valeurs demandeacutees par le type choisi

Par exemple le constructeur de la classe Cercle peut srsquoeacutecrire de la faccedilon suivante

public Cercle() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() r = rayonVeacuterifieacute()

En observant la structure du constructeur Cercle() nous constatons qursquoun constructeurnrsquoest pas typeacute Aucun type de retour nrsquoest placeacute dans son en-tecircte Mais attention le faitdrsquoeacutecrire lrsquoen-tecircte public void Cercle() ou encore public int Cercle() a pour reacutesultatde creacuteer une simple meacutethode qui a pour nom Cercle() et qui nrsquoest pas celle appeleacutee parlrsquoopeacuterateur new Il ne srsquoagit donc pas drsquoun constructeur

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

191

Une fois correctement deacutefini le constructeur est appeleacute par lrsquoopeacuterateur new comme pourle constructeur par deacutefaut Lrsquoinstruction

Cercle A = new Cercle()

fait appel au constructeur deacutefini ci-dessus Le programme exeacutecuteacute demande degraves la creacutea-tion de lrsquoobjet A de saisir les donneacutees le concernant avec une veacuterification concernant lavaleur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute() De cette faccedilon lrsquoapplication estsucircre drsquoexploiter des objets dont la valeur est valide degraves leur initialisation

Remarquons que

bull Lorsqursquoun constructeur est deacutefini par le programmeur le constructeur proposeacute pardeacutefaut par le langage Java nrsquoexiste plus

bull La meacutethode creacuteer() et le constructeur ainsi deacutefinis ont un rocircle identique La meacutethodecreacuteer() devient par conseacutequent inutile

La surcharge de constructeurs

Le langage Java permet la deacutefinition de plusieurs constructeurs ou meacutethodes agrave lrsquointeacute-rieur drsquoune mecircme classe du fait que la construction des objets peut se reacutealiser de diffeacute-rentes faccedilons Lorsqursquoil existe plusieurs constructeurs on dit que le constructeur estsurchargeacute

Dans la classe Cercle il est possible de deacutefinir deux constructeurs suppleacutementaires

public Cercle(int centrex int centrey) x = centrex y = centreypublic Cercle(int centrex int centrey int rayon) this( centrex centrey) r = rayonVeacuterifieacute(rayon)

Pour deacuteterminer quel constructeur doit ecirctre utiliseacute lrsquointerpreacuteteur Java regarde lors deson appel la liste des paramegravetres deacutefinis dans chaque constructeur La construction destrois objets A B et C suivants fait appel aux trois constructeurs deacutefinis preacuteceacutedemment

Cercle A = new Cercle()Cercle B = new Cercle(10 10)Cercle c = new Cercle(10 10 30)

Lors de la deacuteclaration de lrsquoobjet A le constructeur appeleacute est celui qui ne possegravede pas deparamegravetre (le constructeur par deacutefaut deacutefini agrave la section laquo Deacutefinir le constructeur drsquouneclasse raquo) et les valeurs du centre et du rayon du cercle A sont celles saisies au clavier parlrsquoutilisateur

La creacuteation de lrsquoobjet B fait appel au constructeur qui possegravede deux paramegravetres de typeentier Les valeurs du centre et du rayon du cercle B sont donc celles passeacutees en para-megravetre du constructeur soit (10 10) pour (Bx By) Aucune valeur nrsquoeacutetant preacuteciseacutee pourle rayon Br est automatiquement initialiseacute agrave 0

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

192

Le mot-cleacute this

La creacuteation de lrsquoobjet C est reacutealiseacutee par le constructeur qui possegravede trois paramegravetresentiers Ces paramegravetres permettent lrsquoinitialisation de toutes les donneacutees deacutefinies dans laclasse Cercle

Remarquons que gracircce agrave lrsquoinstruction this(centrex centrey) le constructeur posseacute-dant deux paramegravetres est appeleacute agrave lrsquointeacuterieur du constructeur posseacutedant trois paramegravetres

Le mot-cleacute this() repreacutesente lrsquoappel au second constructeur de la mecircme classe posseacutedantdeux paramegravetres entiers puisque this() est appeleacute avec deux paramegravetres entiers Il permetlrsquoutilisation du constructeur preacuteceacutedent pour initialiser les coordonneacutees du centre avantdrsquoinitialiser correctement la valeur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute(rayon) quiest elle-mecircme surchargeacutee Comme pour les constructeurs le compilateur choisit lameacutethode rayonVeacuterifieacute() deacutefinie avec un paramegravetre entier

Pour finir remarquons que le terme this() doit toujours ecirctre placeacute comme premiegravereinstruction du constructeur qui lrsquoutilise

LrsquoheacuteritageLrsquoheacuteritage est le dernier concept fondamental de la programmation objet eacutetudieacutee dans cechapitre Ce concept permet la reacuteutilisation des fonctionnaliteacutes drsquoune classe tout enapportant certaines variations speacutecifiques de lrsquoobjet heacuteritant

Avec lrsquoheacuteritage les meacutethodes deacutefinies pour un ensemble de donneacutees sont reacuteutilisablespour des variantes de cet ensemble Par exemple si nous supposons qursquoune classe Formedeacutefinisse un ensemble de comportements propres agrave toute forme geacuteomeacutetrique alors

bull Ces comportements peuvent ecirctre reacuteutiliseacutes par la classe Cercle qui est une formegeacuteomeacutetrique particuliegravere Cette reacuteutilisation est effectueacutee sans avoir agrave modifier lesinstructions de la classe Forme

bull Il est possible drsquoajouter drsquoautres comportements speacutecifiques des objets Cercle Cesnouveaux comportements sont valides uniquement pour la classe Cercle et non pourla classe Forme

La relation laquo est un raquo

En pratique pour deacuteterminer si une classe B heacuterite drsquoune classe A il suffit de savoir srsquoilexiste une relation laquo est un raquo entre B et A Si tel est le cas la syntaxe de deacuteclaration est lasuivante

class B extends A donneacutees et meacutethodes de la classe B

Dans ce cas on dit que

bull B est une sous-classe de A ou encore une classe deacuteriveacutee de A

bull A est une super-classe ou encore une classe de base copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

193

Un cercle laquo est une raquo forme geacuteomeacutetrique

En supposant que la classe Forme possegravede des caracteacuteristiques communes agrave chaque typede forme geacuteomeacutetrique (les coordonneacutees drsquoaffichage agrave lrsquoeacutecran la couleur etc) ainsi quedes comportements communs (afficher deacuteplacer etc) la classe Forme srsquoeacutecrit de la faccedilonsuivante

public class Forme protected int x y private couleur

public Forme() Le constructeur de la classe Forme Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Couleur de la forme ) couleur = Lirei()

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Position en + x + + y) Systemoutprintln( Couleur + couleur)

public void deacuteplacer(int nx int ny) Deacuteplace les coordonneacutees de la x = nx forme en (nx ny) passeacutees en y = ny paramegravetre de la fonction Fin de la classe Forme

Sachant qursquoun objet Cercle laquo est une raquo forme geacuteomeacutetrique particuliegravere la classe Cercleheacuterite de la classe Forme en eacutecrivant

public class Cercle extends Forme private int r rayon

public Cercle() Le constructeur de la classe Cercle Systemoutprint( Rayon ) r = rayonVeacuterifieacute()private int rayonVeacuterifieacute() Voir la section Des meacutethodes invisibles private int rayonVeacuterifieacute (int tmp) Voir la section Des meacutethodes invisibles

public void afficher() Affichage des donneacutees de la classe superafficher() Systemoutprintln( Rayon + r)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

194

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) Augmente la valeur courante du r = rayonVeacuterifieacute(r + nr) rayon avec la valeur passeacutee en paramegravetre Fin de la classe Cercle

Un cercle est une forme geacuteomeacutetrique (Cercle extends Forme) qui possegravede un rayon(private int r) et des comportements propres aux cercles soit par exemple le calculdu peacuterimegravetre (peacuterimegravetre()) ou encore la modification de sa taille (agrandir()) Uncercle peut ecirctre deacuteplaceacute comme toute forme geacuteomeacutetrique Les meacutethodes de la classeForme restent donc opeacuterationnelles pour les objets Cercle

En examinant de plus pregraves les classes Cercle et Forme nous remarquons que

bull La notion de constructeur existe aussi pour les classes deacuteriveacutees (voir la section laquo Leconstructeur drsquoune classe heacuteriteacutee raquo)

bull Les donneacutees x y sont deacuteclareacutees protected (voir la section laquo La protection desdonneacutees heacuteriteacutees raquo)

bull La fonction afficher() existe sous deux formes diffeacuterentes dans la classe Forme et laclasse Cercle Il srsquoagit lagrave du concept de polymorphisme (voir la section laquo Lepolymorphisme raquo)

Le constructeur drsquoune classe heacuteriteacuteeLes classes deacuteriveacutees possegravedent leurs propres constructeurs qui sont appeleacutes par lrsquoopeacutera-teur new comme dans

Cercle A = new Cercle( )

Pour construire un objet deacuteriveacute il est indispensable de construire drsquoabord lrsquoobjet associeacuteagrave la classe megravere Pour construire un objet Cercle nous devons deacutefinir ses coordonneacuteeset sa couleur Le constructeur de la classe Cercle doit appeler le constructeur de la classeForme

Par deacutefaut srsquoil nrsquoy a pas drsquoappel explicite au constructeur de la classe supeacuterieure commecrsquoest le cas pour notre exemple le compilateur recherche de lui-mecircme le constructeurpar deacutefaut (sans paramegravetre) de la classe supeacuterieure En construisant lrsquoobjet A lrsquointerpreacute-teur exeacutecute aussi le constructeur par deacutefaut de la classe Forme Lrsquoensemble des donneacuteesdu cercle (x y couleur et r) est alors correctement initialiseacute par saisie des valeurs auclavier

Ce fonctionnement pose problegraveme lorsqursquoil nrsquoexiste pas de constructeur par deacutefautSupposons que nous remplacions le constructeur de la classe Forme par

public Forme(int nx int ny) Le nouveau constructeur de la x = nx classe Forme

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

195

y = ny couleur = 0

Dans cette situation lors de la construction de lrsquoobjet A le compilateur recherche leconstructeur par deacutefaut de la classe supeacuterieure soit Forme() sans paramegravetre Ne le trou-vant pas il annonce une erreur du type no constructor matching Forme() found inclass Forme

Le mot-cleacute super

Pour eacuteviter ce type drsquoerreur la solution consiste agrave appeler directement le constructeur dela classe megravere depuis le constructeur de la classe

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) Systemoutprint( Rayon ) r = rayonVeacuterifieacute()

De cette faccedilon comme le terme super() qui repreacutesente le constructeur de la classesupeacuterieure possegravedant deux entiers en paramegravetres lrsquointerpreacuteteur peut finalement cons-truire lrsquoobjet A (Cercle A = new Cercle(5 5)) par appel du constructeur de la classeForme agrave lrsquointeacuterieur du constructeur de la classe Cercle

Remarquons que le terme super est obligatoirement la premiegravere instruction du construc-teur de la classe deacuteriveacutee La liste des paramegravetres (deux int) permet de preacuteciser au compi-lateur quel est le constructeur utiliseacute en cas de surcharge de constructeurs

La protection des donneacutees heacuteriteacuteesEn heacuteritant de la classe A la classe B heacuterite des donneacutees et meacutethodes de la classe A Celane veut pas forceacutement dire que la classe B ait accegraves agrave toutes les donneacutees et meacutethodes dela classe A En effet heacuteritage nrsquoest pas synonyme drsquoaccessibiliteacute

Lorsqursquoune donneacutee de la classe supeacuterieure est deacuteclareacutee en mode private la classedeacuteriveacutee ne peut ni consulter ni modifier directement cette donneacutee heacuteriteacutee Lrsquoaccegraves ne peutse reacutealiser qursquoau travers des meacutethodes de la classe supeacuterieure

Pour notre exemple la donneacutee couleur eacutetant deacuteclareacutee private dans la classe Forme leconstructeur suivant geacutenegravere lrsquoerreur variable couleur in class Forme not acces-sible from class Cercle

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) couleur = 20 r = 10

Il est possible gracircce agrave la protection protected drsquoautoriser lrsquoaccegraves en consultation etmodification des donneacutees de la classe supeacuterieure Toutes les donneacutees de la classe A sontalors accessibles depuis la classe B mais pas depuis une autre classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

196

Dans notre exemple si la donneacutee couleur est deacuteclareacutee protected dans la classe Formealors le constructeur de la classe Cercle peut modifier sa valeur

Le polymorphismeLa notion de polymorphisme deacutecoule directement de lrsquoheacuteritage Par polymorphisme ilfaut comprendre qursquoune meacutethode peut se comporter diffeacuteremment suivant lrsquoobjet surlequel elle est appliqueacutee

Lorsqursquoune mecircme meacutethode est deacutefinie agrave la fois dans la classe megravere et dans la classe fillelrsquoexeacutecution de la forme (meacutethode) choisie est reacutealiseacutee en fonction de lrsquoobjet associeacute agravelrsquoappel et non plus suivant le nombre et le type des paramegravetres comme crsquoest le cas lorsde la surcharge de meacutethodes agrave lrsquointeacuterieur drsquoune mecircme classe

Pour notre exemple la meacutethode afficher() est deacutecrite dans la classe Forme et dans laclasse Cercle Cette double deacutefinition ne correspond pas agrave une veacuteritable surcharge defonctions Ici les deux meacutethodes afficher() sont deacutefinies sans aucun paramegravetre Lechoix de la meacutethode ne peut donc srsquoeffectuer sur la diffeacuterence des paramegravetres Il esteffectueacute par rapport agrave lrsquoobjet sur lequel la meacutethode est appliqueacutee Observons lrsquoexeacutecutiondu programme suivant

public class FormerDesCercles public static void main(String [] arg) Cercle A = new Cercle(5 5) Aafficher() Forme F = new Forme (10 10 3) Fafficher()

Lrsquoappel du constructeur de lrsquoobjet A nous demande de saisir la valeur du rayon

Rayon 7

La meacutethode afficher() est appliqueacutee agrave A Puisque A est de type Cercle lrsquoaffichagecorrespond agrave celui reacutealiseacute par la meacutethode deacutefinie dans la classe Cercle soit

Position en 5 5Couleur 20Rayon 7

La forme F est ensuite creacuteeacutee puis afficheacutee agrave lrsquoaide la meacutethode afficher() de la classeForme F eacutetant de type Forme

Position en 10 1Couleur 3

Remarquons que lorsqursquoune meacutethode heacuteriteacutee est deacutefinie une deuxiegraveme fois dans laclasse deacuteriveacutee lrsquoheacuteritage est supprimeacute Le fait drsquoeacutecrire Aafficher() ne permet plusdrsquoappeler directement la meacutethode afficher() de la classe Forme

Pour appeler la meacutethode deacutefinie dans la classe supeacuterieure la solution consiste agrave utiliserle terme super qui recherche la meacutethode agrave exeacutecuter en remontant dans la hieacuterarchie

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

197

Dans notre exemple superafficher() permet drsquoappeler la meacutethode afficher() de laclasse Forme

Gracircce agrave cette technique si la meacutethode drsquoaffichage pour une Forme est transformeacutee cettetransformation est automatiquement reacutepercuteacutee pour un Cercle

ReacutesumeacuteLorsque lrsquointerpreacuteteur Java rencontre le mot-cleacute static devant une variable (variablede classe) il reacuteserve un seul et unique emplacement meacutemoire pour cette variable Si cemot-cleacute est absent lrsquointerpreacuteteur peut construire en meacutemoire la variable deacuteclareacutee nonstatic (variable drsquoinstance) en plusieurs exemplaires Cette preacutesence ou cetteabsence du mot-cleacute static permet de diffeacuterencier les variables des objets

Les objets sont deacutefinis en meacutemoire par lrsquointermeacutediaire drsquoune adresse (reacutefeacuterence)Lorsqursquoun objet est passeacute en paramegravetre drsquoune fonction la valeur passeacutee au paramegravetreformel est lrsquoadresse de lrsquoobjet De cette faccedilon si la meacutethode transforme les donneacutees duparamegravetre formel elle modifie aussi les donneacutees de lrsquoobjet effectivement passeacute en para-megravetre Ainsi tout objet passeacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethodeses donneacutees transformeacutees par la meacutethode Ce mode de transmission des donneacutees estappeleacute passage de paramegravetres par reacutefeacuterence

Lrsquoobjectif principal de la programmation objet est drsquoeacutecrire des programmes quicontrocirclent par eux-mecircmes le bien-fondeacute des opeacuterations qui leur sont appliqueacutees Cecontrocircle est reacutealiseacute gracircce au principe drsquoencapsulation des donneacutees Par ce terme ilfaut comprendre que les donneacutees drsquoun objet sont proteacutegeacutees de la mecircme faccedilon qursquounmeacutedicament est proteacutegeacute par la fine capsule qui lrsquoentoure Lrsquoencapsulation passe parle controcircle des donneacutees et des comportements de lrsquoobjet agrave travers les niveaux deprotection lrsquoaccegraves controcircleacute aux donneacutees et la notion de constructeur de classe

Le langage Java propose trois niveaux de protection public private et protectedLorsqursquoune donneacutee est totalement proteacutegeacutee (private) elle ne peut ecirctre modifieacutee quepar les meacutethodes de la classe ougrave la donneacutee est deacutefinie

On distingue les meacutethodes qui consultent la valeur drsquoune donneacutee sans pouvoir lamodifier (accesseur en consultation) et celles qui modifient apregraves controcircle et vali-dation la valeur de la donneacutee (accesseur en modification)

Les constructeurs sont des meacutethodes particuliegraveres deacuteclareacutees uniquement public quiportent le mecircme nom que la classe ougrave ils sont deacutefinis Ils permettent le controcircle et lavalidation des donneacutees degraves leur initialisation

Par deacutefaut si aucun constructeur nrsquoest deacutefini dans une classe le langage Javapropose un constructeur par deacutefaut qui initialise toutes les donneacutees de la classe agrave 0ou agrave null si les donneacutees sont des objets Si un constructeur est deacutefini le construc-teur par deacutefaut nrsquoexiste plus

Lrsquoheacuteritage permet la reacuteutilisation des objets et de leur comportement tout en apportantde leacutegegraveres variations Il se traduit par le principe suivant on dit qursquoune classe B heacuteritedrsquoune classe A (B eacutetant une sous-classe de A) lorsqursquoil est possible de mettre la relationlaquo est un raquo entre B et A

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

198

Le projet laquo Gestion drsquoun compte bancaire raquoEncapsuler les donneacutees drsquoun compte bancaireLa protection priveacutee et lrsquoaccegraves aux donneacutees

a Deacuteclarez toutes les variables drsquoinstance des types Compte et LigneComptable enmode private Que se passe-t-il lors de la phase de compilation de lrsquoapplicationProjet

Pour remeacutedier agrave cette situation la solution est de construire des meacutethodes drsquoaccegraves auxdonneacutees de la classe Compte et LigneComptable Ces meacutethodes ont pour objectif defournir au programme appelant la valeur de la donneacutee rechercheacutee Par exemple lafonction quelTypeDeCompte() suivante fournit en retour le type du compte rechercheacute

public String quelTypeDeCompte() return typeCpte

b Eacutecrivez suivant le mecircme modegravele toutes les meacutethodes drsquoaccegraves aux donneacuteesval_courante taux numeacuteroCpte etc

c Modifiez lrsquoapplication Projet et la classe Compte de faccedilon agrave pouvoir acceacuteder auxdonneacutees numeacuteroCpte de la classe Compte et aux valeurs de la classe LigneComptable

Le controcircle des donneacutees

Lrsquoencapsulation des donneacutees permet le controcircle de la validiteacute des donneacutees saisies pour unobjet Un compte bancaire ne peut ecirctre que de trois types Epargne Courant ou JointIl est donc neacutecessaire au moment de la saisie du type du compte de controcircler lrsquoexacti-tude du type entreacute La meacutethode controcircleType() suivante reacutealise ce controcircle

private String controcircleType() char tmpc String tmpS = Courant do Systemoutprint(Type du compte [Types possibles C(ourant) ) Systemoutprint(J(oint) E(pargne)] ) tmpc = Lirec() while ( tmpc = rsquoCrsquo ampamp tmpc = rsquoJrsquo ampamp tmpc = rsquoErsquo) switch (tmpc) case rsquoCrsquo tmpS = Courant break

De cette faccedilon toutes les meacutethodes ainsi que les donneacutees deacuteclareacutees public ouprotected de la classe A sont applicables agrave la classe B La syntaxe de deacuteclaration drsquounesous-classe est la suivante

class B extends A donneacutees et meacutethodes de la classe B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

199

case rsquoJrsquo tmpS = Joint break case rsquoErsquo tmpS = Epargne break return tmpS

Agrave la sortie de la fonction nous sommes certains que le type retourneacute correspond auxtypes autoriseacutes par le cahier des charges

a Dans la classe Compte sachant que la valeur initiale ne peut ecirctre neacutegative agrave la creacutea-tion drsquoun compte eacutecrivez la meacutethode controcircleValinit()

b Dans la classe LigneComptable eacutecrivez les meacutethodes controcircleMotif() et controcirc-leMode() qui veacuterifient respectivement le motif (Salaire Loyer AlimentationDivers) et le mode (CB Virement Chegraveque) de paiement pour une ligne comptable

Pour controcircler la validiteacute de la date voir la section laquo Le projethellip raquo du chapitre 10 laquo Collectionner unnombre indeacutetermineacute drsquoobjets raquo

c Modifiez les meacutethodes creacuteerCpte() et creacuteerLigneComptable() de faccedilon que lesdonneacutees des classes Compte() et LigneComptable() soient valides

Les constructeurs de classe

Les constructeurs Compte() et LigneComptable() srsquoinspirent pour une grande part desmeacutethodes creacuteerCpte() et creacuteerLigneComptable()

a Remplacez directement creacuteerCpte() par Compte() Que se passe-t-il lors delrsquoexeacutecution du programme

b Deacuteplacez lrsquoappel au constructeur dans lrsquooption 1 de faccedilon agrave construire lrsquoobjet aumoment de sa creacuteation Que se passe-t-il en phase de compilation Pourquoi

c Utilisez la notion de surcharge de constructeur pour construire un objet C de deuxfaccedilons

bull Les valeurs initiales du compte sont passeacutees en paramegravetre

bull Les valeurs initiales sont saisies au clavier comme le fait la meacutethode creacuteerCpte()

d Agrave lrsquoaide de ces deux constructeurs modifiez lrsquoapplication Projet de faccedilon agrave pouvoirlrsquoexeacutecuter correctement

Comprendre lrsquoheacuteritageProtection des donneacutees heacuteriteacutees

Sachant qursquoun compte drsquoeacutepargne est un compte bancaire ayant un taux de reacutemuneacuteration

a Eacutecrivez la classe CpteEpargne en prenant soin de deacuteclarer la nouvelle donneacutee enmode private

b Modifiez le type Compte de faccedilon agrave supprimer tout ce qui fait appel au comptedrsquoeacutepargne (donneacutee et meacutethodes)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

200

Un compte drsquoeacutepargne modifie la valeur courante par le calcul des inteacuterecircts en fonc-tion du taux drsquoeacutepargne Il ne peut ni modifier son numeacutero ni son type

c Quels modes de protection doit-on appliquer aux diffeacuterentes donneacutees heacuteriteacutees de laclasse Compte

Le controcircle des donneacutees drsquoun compte drsquoeacutepargneSachant que le taux drsquoun compte drsquoeacutepargne ne peut ecirctre neacutegatif eacutecrivez la meacutethodecontrocircleTaux()

Le constructeur drsquoune classe deacuteriveacuteeEn supposant que le constructeur de la classe CpteEpargne srsquoeacutecrive de la faccedilon suivante

public CpteEpargne() super(Epargne) taux = controcircleTaux()

a Recherchez agrave quel constructeur de la classe Compte fait appel CpteEpargne() Pour-quoi

b Modifiez ce constructeur de faccedilon que la donneacutee typeCpte prenne la valeur Epargne

Le polymorphisme De la meacutethode afficherCpte()

a Dans la classe CpteEpargne eacutecrivez la meacutethode afficherCpte() sachant qursquoaffi-cher les donneacutees drsquoun compte drsquoeacutepargne revient agrave afficher les donneacutees drsquoun comptesuivi du taux drsquoeacutepargne

De lrsquoobjet C deacuteclareacute de type Compte

b Dans lrsquoapplication Projet modifiez lrsquooption 1 de faccedilon agrave demander agrave lrsquoutilisateursrsquoil souhaite creacuteer un compte simple ou un compte drsquoeacutepargne Selon la reacuteponseconstruisez lrsquoobjet C en appelant le constructeur approprieacute

copy copyright Eacuteditions Eyrolles

PARTIE 3

Les outils et techniques orienteacutes objet

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

CHAPITRE 11

Dessiner des objets 259

copy copyright Eacuteditions Eyrolles

9Collectionner

un nombre fixe drsquoobjets

Comme nous lrsquoavons observeacute tout au long de cet ouvrage lrsquoatout principal de lrsquoordina-teur est sa capaciteacute agrave manipuler un grand nombre de donneacutees pour en extraire denouvelles informations Or les structures de stockage eacutetudieacutees jusqursquoici telles que varia-bles ou objets ne permettent pas drsquoappliquer de traitements systeacutematiques sur desensembles de valeurs

Crsquoest pourquoi nous eacutetudions dans ce chapitre une nouvelle structure de donneacutees lestableaux qui permettent le stockage drsquoun nombre fini de valeurs

Dans un premier temps nous eacutetudions laquo Les tableaux agrave une dimension raquo et observonscomment les deacuteclarer et les manipuler Pour mieux comprendre la manipulation de cesstructures nous analysons ensuite agrave la section laquo Quelques techniques utiles raquo diffeacute-rentes techniques de programmation appliqueacutees aux tableaux agrave une dimension telles quela recherche drsquoune valeur dans un tableau ou le tri drsquoun tableau

Pour finir nous examinons agrave la section laquo Les tableaux agrave deux dimensions raquo commentconstruire et manipuler des tableaux bidimensionnels agrave travers un exemple drsquoaffichagede formes geacuteomeacutetriques

Les tableaux agrave une dimensionLrsquoeacutetude du chapitre 1 laquo Stocker une information raquo montre que pour manipuler plusieursvaleurs agrave lrsquointeacuterieur drsquoun programme vous devez deacuteclarer autant de variables que devaleurs agrave traiter Ainsi pour stoker les huit notes drsquoun eacutelegraveve donneacute la technique consisteagrave deacuteclarer huit variables comme suit

double note1 note2 note3 note4 note5 note6 note7 note8 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

204

Le fait de deacuteclarer autant de variables qursquoil y a de valeurs preacutesente les inconveacutenientssuivants

bull Si le nombre de notes est modifieacute il est neacutecessaire de

ndash Deacuteclarer de nouvelles variables

ndash Placer ces variables dans le programme afin de les traiter en plus des autres notes

ndash Compiler agrave nouveau le programme pour que lrsquointerpreacuteteur puisse prendre encompte ces modifications

bull Il faut trouver un nom de variable pour chaque valeur traiteacutee Imaginez deacuteclarer1 000 variables portant un nom diffeacuterent

Ces inconveacutenients majeurs sont reacutesolus gracircce aux tableaux En effet les tableaux sontdes structures de donneacutees qui regroupent sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Les tableaux sont proposeacutes par tous les langages deprogrammation Ils sont construits par assemblage drsquoune suite finie de cases meacutemoirecomme illustreacute agrave la Figure 9-1

Chaque case repreacutesente lrsquoespace meacutemoire neacutecessaire au stockage drsquoune et une seulevaleur Remarquez que les cases sont reacuteserveacutees en meacutemoire de faccedilon contigueuml

Deacuteclarer un tableauComme toute variable utiliseacutee dans un programme un tableau doit ecirctre deacuteclareacute afin de

bull donner un nom agrave lrsquoensemble des valeurs agrave regrouper

bull deacutefinir la taille du tableau de faccedilon agrave preacuteciser le nombre de valeurs agrave regrouper

bull deacuteterminer le type de valeur agrave meacutemoriser

La syntaxe de deacuteclaration drsquoun tableau est la suivante

TypeDuTableau [] nomDuTableau nomDuTableau = new TypeDuTableau [tailleDuTableau]

En placcedilant dans la premiegravere instruction les crochets [] entre le type et le nom de la variablevous indiquez au compilateur que la variable nomDuTableau repreacutesente un tableau Agrave cetteeacutetape le compilateur reacuteserve un espace meacutemoire portant le nom du tableau Cet espacemeacutemoire est susceptible de contenir lrsquoadresse de la premiegravere case du tableau

Ensuite dans la seconde instruction lrsquoopeacuterateur new reacuteserve autant de cases meacutemoireconseacutecutives qursquoil est indiqueacute entre les [] situeacutes en fin drsquoinstruction soit tailleDuTableau

Figure 9-1

Lrsquoopeacuterateur new reacuteserve le nombre de cases meacutemoire demandeacute ([8]) et meacutemorise lrsquoadresse de la premiegravere case meacutemoire dans la variable notes gracircce au signe drsquoaffectation

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

205

Lrsquoopeacuterateur new deacutetermine enfin lrsquoadresse de la premiegravere case du tableau et la stockegracircce au signe drsquoaffectation dans la case nomDuTableau creacuteeacutee agrave lrsquoeacutetape preacuteceacutedente

Exemple Deacuteclarer un tableau de huit notes

double [] notes notes = new double[8]

Ces deux instructions reacutealisent la deacuteclaration drsquoun tableau ayant pour nom note Il estcomposeacute de 8 cases meacutemoire pouvant stocker des valeurs de type double (voir Figure 9-1)

Autres exemples de deacuteclaration

deacuteclarer un tableau de 5 entiersint [] valeur valeur = new int[5] deacuteclarer un tableau de 30 reacuteels de simple preacutecision float [] reel reel = new float[30] deacuteclarer un tableau de 80 caractegravereschar [] mot mot = new char[80]

Remarques

bull Le nombre de cases reacuteserveacutees correspond au nombre maximal de valeurs agrave traiterLorsque la taille du tableau est fixeacutee apregraves exeacutecution de lrsquoopeacuterateur new il nrsquoest pluspossible de la modifier en cours drsquoexeacutecution du programme

Cependant il est possible de ne pas fixer deacutefinitivement la taille du tableau avantcompilation en placcedilant une variable entre les [] au lieu drsquoune valeur numeacuterique Eneffet il suffit drsquoeacutecrire

double [] notesint nbNotes Systemoutprintln(Combien voulez-vous saisir de notes ) nbNotes = Lirei() notes = new double[nbNotes]

De cette faccedilon lrsquoutilisateur saisit le nombre de valeurs qursquoil souhaite traiter avant lareacuteservation effective des espaces meacutemoire par lrsquoopeacuterateur new Le programme peutdonc voir la taille du tableau varier drsquoune exeacutecution agrave lrsquoautre

bull Les tableaux sont des objets En effet les tableaux sont deacutefinis agrave lrsquoaide drsquoune adressedeacutetermineacutee par lrsquoopeacuterateur new Les tableaux sont donc des objets au mecircme titre queles String et autres objets deacutefinis aux chapitres preacuteceacutedents

Les objets sont caracteacuteriseacutes par leurs donneacutees et les meacutethodes qui leur sont applica-bles Une donneacutee caracteacuteristique des tableaux est leur taille crsquoest-agrave-dire le nombre decases Ainsi pour connaicirctre la taille drsquoun tableau il suffit de placer le terme lengthderriegravere le nom du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

206

Par exemple lrsquoinstruction suivante

Systemoutprint(Nombre de notes = + noteslength)

affiche agrave lrsquoeacutecran Nombre de notes = 8

bull Lrsquoinstruction de deacuteclaration

double [] notes = new double[8]

est eacutequivalente agrave la suite drsquoinstructions

double [] notes notes = new double[8]

Manipuler un tableauUn tableau est un ensemble de cases meacutemoire Chaque case constituant un eacuteleacutement dutableau est identique agrave une variable Il est possible de manipuler chaque case du tableaude faccedilon agrave

bull placer une valeur dans une case du tableau agrave lrsquoaide de lrsquoaffectation

bull utiliser un eacuteleacutement du tableau dans le calcul drsquoune expression matheacutematique

bull afficher un eacuteleacutement du tableau

Acceacuteder aux eacuteleacutements drsquoun tableau

Sachant que nomDuTableau[0] repreacutesente la premiegravere case du tableau lrsquoaccegraves agrave la niegravemecase srsquoeacutecrit nomDuTableau[n]

Par exemple lrsquoinstruction

note[0] = 10

meacutemorise la premiegravere note drsquoun eacutetudiant dans la premiegravere case du tableau (notes[0])De la mecircme faccedilon la deuxiegraveme note est stockeacutee gracircce agrave lrsquoaffectation

note[1] = 5

Et ainsi de suite jusqursquoagrave stoker la huitiegraveme et derniegravere note agrave lrsquoaide de lrsquoinstruction

note[7] = 9

Figure 9-2

Note est le nom du tableau et les notes 10 5 hellip 9 sont des valeurs placeacutees agrave lrsquoaide du signe drsquoaffectation dans les cases numeacuteroteacutees respectivement 0 1 hellip 7 (indices)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

207

Les valeurs placeacutees entre les crochets [] sont appeleacutees les indices du tableau Remar-quez que la premiegravere case du tableau est numeacuteroteacutee agrave partir de 0 et non de 1 (voirFigure 9-2) Lrsquoindice du tableau varie donc entre 0 et length-1 Les eacuteleacutements drsquountableau eacutetant ordonneacutes gracircce aux indices il est possible drsquoy acceacuteder agrave lrsquoaide de construc-tions iteacuteratives (boucle for) comme le montre lrsquoexemple suivant

Exemple Extrait drsquoun programme

Systemoutprint(Combien de notes voulez-vous saisir )int nombre = Lirei()notes = new double [nombre]for (int i = 0 i lt noteslength i++) Systemoutprint(Entrer la note ndeg + (i + 1)+ ) notes[i] = Lired()

Exemple Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Combien de notes voulez-vous saisir 44Entrer la note ndeg 1 1144Entrer la note ndeg 2 1100Entrer la note ndeg 3 1122Entrer la note ndeg 4 88

Une fois le nombre de notes deacutetermineacute gracircce aux deux premiegraveres instructions leprogramme entre dans une boucle for La variable i correspond au compteur de boucleElle varie entre 0 et noteslength-1 (soit 3) puisque la condition de continuationpreacutecise que i doit ecirctre strictement infeacuterieure agrave noteslength (soit 4)

Agrave chaque tour de boucle la variable i prend la valeur de lrsquoindice du tableau (notes[i])Les valeurs saisies au clavier sont alors placeacutees une agrave une dans chaque case du tableau

Parce qursquoil nrsquoest pas courant de compter des valeurs agrave partir de 0 lrsquoaffichage demandantdrsquoentrer une note deacutebute agrave 1 et non agrave 0 gracircce agrave lrsquoexpression (i+1) placeacutee dans lameacutethode Systemoutprint() Il ne srsquoagit lagrave que drsquoun artifice de preacutesentation lapremiegravere note eacutetant stockeacutee en reacutealiteacute en note[0]

Remarquez que lrsquoutilisation de la donneacutee length permet drsquoeacuteviter tout problegraveme dedeacutepassement de taille En effet si un tableau est composeacute de quatre cases il nrsquoest paspossible de placer une valeur agrave lrsquoindice 4 ou 5 Le fait drsquoeacutecrire notes[4] geacutenegravere uneerreur drsquoexeacutecution du type javalangArrayIndexOutOfBoundsException qui montreque lrsquointerpreacuteteur Java a deacutetecteacute que lrsquoindice du tableau eacutetait en dehors des limites deacutefi-nies au moment de sa creacuteation

Initialiser un tableau

Lors de la deacuteclaration drsquoun tableau il est possible de lrsquoinitialiser directement de la faccedilonsuivante

double [] notes = 10 125 5 85 16 0 13 7 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

208

Les cases meacutemoire sont reacuteserveacutees et initialiseacutees dans lrsquoordre agrave lrsquoaide des valeurs placeacuteesentre les et seacutepareacutees par des virgules De cette faccedilon le tableau notes contient lesvaleurs suivantes

notes[0] vaut 10 notes[4] vaut 16

notes[1] vaut 125 notes[5] vaut 0

notes[2] vaut 5 notes[6] vaut 13

notes[3] vaut 85 notes[7] vaut 7

Remarquez que la donneacutee noteslength prend automatiquement la valeur 8

Les tableaux et les opeacuterations arithmeacutetiques

La somme la soustraction la division ou la multiplication directes de deux tableaux sontdes opeacuterations impossibles En effet chaque opeacuteration doit ecirctre reacutealiseacutee eacuteleacutement pareacuteleacutement comme le montre le tableau suivant

Quelques techniques utilesLe stockage et lrsquoutilisation des donneacutees agrave travers la structure des tableaux offrent denombreux avantages Elles requiegraverent aussi certaines techniques de manipulation quisont deacuteveloppeacutees ci-apregraves

La ligne de commandeAu cours du chapitre laquo Naissance drsquoun programme raquo vous avez ducirc admettre un certainnombre de termes du langage Java et en particulier la syntaxe de lrsquoinstruction suivante

public static void main(String [] argument)

Cette instruction correspond agrave la deacutefinition de lrsquoen-tecircte de la fonction main() Vous ecirctesen mesure maintenant de deacutechiffrer chacun de ses termes pour en comprendre lrsquoutiliteacute

bull Le mot cleacute public preacutecise au compilateur que la fonction main() est accessible depuislrsquoexteacuterieur de la classe ougrave elle est deacutefinie En particulier lrsquointerpreacuteteur Java peut yacceacuteder pour lrsquoexeacutecuter

bull Le terme static explique que la fonction main() ne peut pas ecirctre copieacutee plusieurs foisen meacutemoire Elle ne peut pas ecirctre associeacutee agrave un objet ni ecirctre instancieacutee crsquoest-agrave-direqursquoil nrsquoest pas possible drsquoeacutecrire unObjetmain()

bull La fonction main() ne fournit pas de reacutesultat et crsquoest pourquoi elle est deacutefinie commevoid

Correcte Impossible

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]for (i = 0 i lt 10 i++)somme[i] = tab1[i] + tab2[i]

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]

somme = tab1 + tab2

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

209

bull Pour finir elle possegravede entre () un paramegravetre deacutefini comme tableau de type StringCe paramegravetre est utiliseacute pour passer des donneacutees en ligne de commande lors dulancement de la commande drsquoexeacutecution du programme

Qursquoest-ce qursquoune ligne de commande

Une ligne de commande est eacutecrite au clavier sous la forme drsquoune instruction preacutecise Crsquoestun ordre transmis agrave lrsquoordinateur par lrsquoutilisateur Sous Unix les commandes sont tregraves utili-seacutees Elles le sont beaucoup moins sous Windows et sont inexistantes sous Mac OS Crsquoestpourquoi les utilisateurs de stations de travail Unix nrsquoont aucune difficulteacute agrave comprendrece qursquoest une commande ce qui nrsquoest pas le cas des utilisateurs de PC (sous Windows) oude Macintosh

Aujourdrsquohui gracircce aux eacutecrans graphiques lrsquoutilisateur communique facilement aveclrsquoordinateur Pour savoir ce que contient un dossier il lui suffit drsquoouvrir la fenecirctre asso-cieacutee agrave ce dossier Les ordres passeacutes agrave lrsquoordinateur sont essentiellement des ordres geacuteneacutereacutespar la souris au travers de fenecirctres graphiques

Les lignes de commande sont eacutequivalentes bien que moins conviviales agrave cette commu-nication graphique Elles permettent surtout drsquoobtenir des reacutesultats plus preacutecis Ainsi lescommandes

bull ls java dans une fenecirctre de commandes Unix

bull dir java dans une fenecirctre laquo commandes MSDOS raquo

ont pour reacutesultat drsquoafficher tous les noms de fichiers finissant par java contenus dans lereacutepertoire courant

Plus preacuteciseacutement remarquez qursquoune commande srsquoeacutecrit toujours de la faccedilon suivante

nomDeLaCommande paramegravetresEventuels

Le nom drsquoune commande correspond au nom du programme qui reacutealise lrsquoactionsouhaiteacutee Les paramegravetres sont utiliseacutes pour affiner son reacutesultat Dans notre exemplejava est un paramegravetre des commandes ls ou dir qui permet drsquoexpliquer agrave lrsquoordina-teur que vous souhaitez voir srsquoafficher uniquement les noms de fichiers finissant parjava

Passer des paramegravetres agrave un programme Java

De la mecircme faccedilon comme expliqueacute agrave la section laquo Exeacutecuter un programme raquo duchapitre introductif laquo Naissance drsquoun programme raquo lrsquoexeacutecution drsquoun programme Java endehors drsquoun environnement de travail passe aussi par une commande dont la syntaxe est

java nomdelrsquoapplication

Lrsquointerpreacuteteur Java autorise aussi la commande

java nomdelrsquoapplication p0 p1 p2hellip pN

Dans ce cas les valeurs p0 p1 p2 hellip pN toutes seacutepareacutees par des espaces sont consideacute-reacutees comme paramegravetres de la commande java nomdelrsquoapplication Ces derniers sonttransmis agrave la fonction main() par lrsquointermeacutediaire du tableau de String deacutefini en para-megravetre de la fonction

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

210

Si lrsquoen-tecircte est de la forme

public static void main(String [] argument)

le paramegravetre p0 est stockeacute en argument[0] p1 en argument[1] hellip et pN en argument[N]Les valeurs ainsi passeacutees sont meacutemoriseacutees sous forme de chaicircnes de caractegraveres

Exemple Une commande qui calcule

Pour mieux comprendre cette transmission de valeurs reprenons le corrigeacute de lrsquoexer-cice 3 du Chapitre 6 laquo Fonctions notions avanceacutees raquo qui simule une calculette Trans-formons ce programme de sorte qursquoil puisse effectuer lrsquoopeacuteration agrave partir de valeurspasseacutees en paramegravetres lors de la commande drsquoexeacutecution du programme Supposons quecette commande srsquoeacutecrive

java Calculette 1 + 2

Lrsquoordre des paramegravetres ainsi passeacutes est important En effet nous devons traiter les para-megravetres de la fonction main() de la faccedilon suivante

bull Les premier et troisiegraveme paramegravetres doivent ecirctre interpreacuteteacutes comme eacutetant les valeursnumeacuteriques de lrsquoopeacuteration agrave calculer

bull Le deuxiegraveme paramegravetre doit correspondre agrave lrsquoopeacuterateur

Sachant cela le programme srsquoeacutecrit de la faccedilon suivante

Exemple Le code source

public class Calculette public static void main(String [] argument) int a b char opeacuterateur double calcul if (argumentlength gt 0) a = IntegerparseInt(argument[0]) opeacuterateur = argument[1]charAt(0) b = IntegerparseInt(argument[2]) else opeacuterateur = menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calcul = calculer(a b opeacuterateur ) afficher(a b opeacuterateur calcul) public static double calculer (int x int y char o) voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

public static void afficher(int x int y char o double r) copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

211

voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees public static char menu() voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

Pour traiter les paramegravetres passeacutes en ligne de commande il est neacutecessaire de deacutetecter sides paramegravetres ont eacuteteacute effectivement passeacutes Pour ce faire lrsquoideacutee est de regarder la tailledu tableau argument de la faccedilon suivante

bull Si celle-ci nrsquoest pas nulle (supeacuterieure strictement agrave 0) cela signifie que le tableaucontient des paramegravetres passeacutes en ligne de commande Dans ce cas nous traitonschacun des arguments de sorte que le calcul puisse ecirctre effectueacute

Les eacuteleacutements argument[0] et argument[2] contiennent par hypothegravese les deux valeursnumeacuteriques Or celles-ci sont stockeacutees sous forme de suites de caractegraveres le tableauargument eacutetant de type String Les valeurs doivent donc ecirctre laquo traduites raquo en formatnumeacuterique Comme nous souhaitons obtenir des valeurs entiegraveres la meacutethode proposeacuteepar le langage Java a pour nom IntegerparseInt() Ainsi les instructions

a = IntegerparseInt(argument[0])b = IntegerparseInt(argument[2])

permettent la traduction de la suite de caractegraveres contenue dans argument[0] et argu-ment[2] en valeurs numeacuteriques et de placer ces valeurs dans les variables a et b deacutecla-reacutees de type int Compte tenu des paramegravetres passeacutes en ligne de commande lesvariables a et b ont donc pour valeurs respectives 1 et 2

Le caractegravere correspondant agrave lrsquoopeacuterateur est stockeacute dans argument[1] Nous devonsle transformer en char puisqursquoun opeacuterateur est formeacute drsquoun seul caractegravere Cette trans-formation est reacutealiseacutee par une meacutethode de la classe String appeleacutee charAt() quiretourne le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Ainsi lrsquoinstruction

opeacuterateur = argument[1]charAt(0)

place dans la variable opeacuterateur le premier caractegravere du mot stockeacute dans argument[1]soit pour notre exemple le caractegravere +

bull Si la taille du tableau argument est nulle cela signifie qursquoaucun paramegravetre nrsquoa eacuteteacutetransmis Le bloc else est exeacutecuteacute et les valeurs sont saisies au clavier comme celaeacutetait le cas en fin de correction de lrsquoexercice 3 du Chapitre 6

Pour finir lorsque les valeurs choisies sont placeacutees dans les variables a b et opeacuterateuragrave lrsquoaide des paramegravetres ou du clavier le calcul de lrsquoopeacuteration est reacutealiseacute et le reacutesultat estafficheacute Dans lrsquoexemple vous obtenez

java Calculette 1 + 21 + 2 = 3

Preacutecisons en outre que cette commande doit ecirctre obligatoirement lanceacutee dans le reacuteper-toire ougrave se trouve le fichier Calculetteclass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

212

Trier un ensemble de donneacutees Lrsquoatout principal de lrsquoordinateur est sa faculteacute agrave traiter un tregraves grand nombre de donneacuteesen des temps tregraves rapides Ces traitements sont par exemple la recherche drsquoeacuteleacutementsdans un ensemble en suivant des contraintes choisies par lrsquoutilisateur ou encore le tridrsquoeacuteleacutements en fonction drsquoun critegravere deacutetermineacute

Pour comprendre le fonctionnement interne de ces traitements nous eacutetudions ici lrsquoalgo-rithme du laquo tri par extraction simple raquo qui utilise les techniques de recherche drsquouneacuteleacutement dans un ensemble de donneacutees drsquoeacutechange de valeurs et de tri

Cahier des charges

Lrsquoobjectif du programme est de reacutealiser le classement par moyenne drsquoune classedrsquoeacutetudiants Pour cela nous devons tout drsquoabord deacutefinir ce qursquoest un eacutetudiant (voir lasection laquo La classe Etudiant raquo) pour deacutecrire ensuite une classe drsquoeacutetudiants (voir lasection laquo La classe Classe raquo) Cela fait il devient possible de trier une classe drsquoeacutetudiantsselon leur moyenne (voir la section laquo La meacutethode du tri par extraction simple raquo)

La classe Etudiant

Un eacutetudiant est deacutefini par son nom (String) son preacutenom (String) un ensemble de notes(un tableau de double) et une moyenne (double) Ces caracteacuteristiques constituentlrsquoensemble des donneacutees du type Etudiant

Les comportements drsquoun eacutetudiant permettent lrsquoinitialisation et lrsquoaffichage de ses caracteacute-ristiques ainsi que le calcul de sa moyenne

Par conseacutequent nous deacutecrivons comme suit la classe Etudiant

public class Etudiant Les donneacutees caracteacuteristiques private String nom preacutenom private double [] notes moyenne

Les comportements public Etudiant() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() Systemoutprint(Entrer le preacutenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Combien de notes pour lrsquoetudiant ) Systemoutprint(preacutenom + + nom + ) int nombre = Lirei() notes = new double [nombre] for (int i = 0 i lt noteslength i ++) Systemoutprint(Entrer la note ndeg + (i + 1) + ) notes[i] = Lired() moyenne = calculMoyenne() private double calculMoyenne() double somme = 00 for(int i = 0 i lt noteslength i++) somme = somme + notes[i]

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

213

return sommenoteslength public void afficheUnEtudiant() Systemoutprint(Les notes de + preacutenom + + nom + sont ) for (int i = 0 i lt noteslength i++) Systemoutprint(

+notes[i]) Systemoutprintln() Systemoutprintln(Sa moyenne vaut + moyenne) public double quelleMoyenne() return moyenne Fin de class Etudiant

La classe Etudiant deacutefinit les quatre meacutethodes suivantes

bull Etudiant() Crsquoest le constructeur de la classe qui permet drsquoinitialiser lrsquoensemble desdonneacutees de la classe Etudiant en demandant la saisie au clavier des nom et preacutenom delrsquoeacutetudiant ainsi que de lrsquoensemble de ses notes Le nombre de notes peut varier drsquouneacutetudiant agrave un autre puisque la valeur nombre est saisie en cours drsquoexeacutecution

bull calculMoyenne() Une fois les donneacutees saisies le programme calcule la moyenne agravelrsquointeacuterieur du constructeur gracircce agrave la meacutethode calculMoyenne() Cette meacutethode estdeacuteclareacutee en private car pour des raisons de seacutecuriteacute ce calcul ne peut ecirctre reacutealiseacuteqursquoagrave lrsquointeacuterieur de la classe Etudiant

bull afficheUnEtudiant() Affiche agrave lrsquoeacutecran les caracteacuteristiques drsquoun eacutetudiant

bull quelleMoyenne() La donneacutee moyenne eacutetant proteacutegeacutee (private) la meacutethode quelle-Moyenne() permet lrsquoaccegraves en consultation depuis lrsquoexteacuterieur de la classe de la valeurmeacutemoriseacutee

La classe Classe

Une classe drsquoeacutetudiants est deacutefinie par un ensemble drsquoeacutetudiants crsquoest-agrave-dire un tableaudrsquoobjets Etudiant

Les comportements drsquoune classe permettent lrsquoinitialisation lrsquoaffichage de ses donneacuteesainsi que le classement des eacutetudiants dans lrsquoordre croissant des moyennes

La classe Classe est deacutecrite comme suit

public class Classe private Etudiant [] liste public Classe() Systemoutprint(Nombre drsquoetudiants ) int nbetudiants = Lirei() liste = new Etudiant[nbetudiants] for(int i = 0 i lt listelength i++) liste[i] = new Etudiant() public void afficheLesEtudiants() for (int i = 0 i lt listelength i++) liste[i]afficheUnEtudiant() Fin de class Classe

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

214

La donneacutee liste de la classe est un tableau drsquoobjets de type Etudiant Il srsquoagit donc lagravedrsquoun tableau particulier puisque chaque case du tableau ne correspond pas agrave une valeurnumeacuterique simple mais agrave lrsquoensemble des donneacutees caracteacuteristiques drsquoun eacutetudiant

En reacutealiteacute chaque case du tableau liste contient lrsquoadresse drsquoun objet de type Etudiantcomme illustreacute agrave la Figure 9-3 Cette opeacuteration est effectueacutee par le constructeurClasse()

Ce dernier reacutealise la creacuteation du tableau en deux eacutetapes Ainsi lrsquoinstruction

liste = new Etudiant[nbetudiants]

creacutee une case meacutemoire liste qui contient lrsquoadresse de la premiegravere case meacutemoire dutableau Ce tableau est de type Etudiant Il est donc destineacute agrave stocker les adresses desobjets de type Etudiant

Ensuite la boucle

for(int i = 0 i lt listelength i++) liste[i] = new Etudiant()

reacutealise en faisant appel au constructeur de la classe Etudiant la creacuteation en meacutemoiredes objets de type Etudiant ainsi que la saisie des informations relatives agrave chaqueeacutetudiant

Pour finir chaque adresse produite par lrsquoopeacuterateur new dans la boucle for est placeacutee danschacune des cases meacutemoire du tableau liste (liste[i])

La meacutethode afficheLesEtudiants() permet lrsquoaffichage des informations relatives auxeacutetudiants en faisant appel agrave la meacutethode afficheUnEtudiant() qui affiche les caracteacuteris-tiques drsquoun eacutetudiant agrave la fois

Figure 9-3

Le tableau Liste est un tableau drsquoobjets Chaque case du tableau meacutemorise lrsquoadresse drsquoun objet Etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

215

La meacutethode du tri par extraction simple

Gracircce aux classes Etudiant et Classe nous sommes en mesure de creacuteer un ensembledrsquoeacutetudiants posseacutedant chacun un nombre de notes et une moyenne Notre objectif eacutetantdrsquoafficher un classement des eacutetudiants par ordre croissant des moyennes examinonscomment trier lrsquoensemble des moyennes drsquoune classe

Lrsquoalgorithme du tri par extraction simple se deacutecrit de la faccedilon suivante (voir Figure 9-4)

bull Parcourir lrsquoensemble des moyennes de la classe afin de trouver la plus petite

bull Une fois trouveacutee eacutechanger cette valeur avec celle placeacutee au tout deacutebut du tableau defaccedilon agrave ecirctre sucircr que la moyenne la plus faible se trouve en deacutebut du tableau

bull Recommencer ce mecircme traitement sur lrsquoensemble des moyennes moins la premiegraverepuisqursquoelle vient drsquoecirctre traiteacutee

Deux eacutetapes sont neacutecessaire pour traduire cet algorithme en langage Java Elles sontdeacutecrites ci-apregraves aux sections laquo Recherche du plus petit eacuteleacutement dans une liste raquo etlaquo Echange de la plus petite valeur avec un eacuteleacutement de la liste raquo

Recherche du plus petit eacuteleacutement dans une liste

Pour trouver la plus petite valeur drsquoun ensemble de valeurs il suffit de comparer chaquevaleur de la liste avec celle tout drsquoabord situeacutee en deacutebut de liste puis avec une plus petitesi elle existe dans la liste Crsquoest ce que reacutealise la boucle suivante

int indiceDuMin = 0 for(int j = 1 j lt listelength j++) if (liste[j]quelleMoyenne() lt liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j

Ainsi chaque valeur du tableau (j variant de 1 agrave listelength) est compareacutee avec lapremiegravere valeur du tableau (indiceDuMin valant 0 en deacutebut de boucle) Si la comparaisonmontre que la valeur placeacutee agrave lrsquoindice j est plus petite que celle placeacutee en indiceDuMinalors lrsquoindice de cette plus petite valeur est stockeacutee dans la variable indiceDuMin Le testsuivant compare la valeur suivante avec la plus petite valeur qui vient drsquoecirctre deacutetecteacutee

Figure 9-4

a Parcours du tableau entier afin de deacuteterminer la plus petite valeur puis eacutechange de cette derniegravere avec la valeur stockeacutee en premiegravere position dans le tableau b Mecircme traitement agrave partir de la deuxiegraveme case du tableau c Mecircme traitement agrave partir de la troisiegraveme case du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

216

Gracircce agrave cette boucle la recherche de la plus petite valeur est reacutealiseacutee sur lrsquointeacutegraliteacute dutableau Or dans lrsquoalgorithme du tri preacutesenteacute ci-dessus cette recherche doit ecirctre reacutealiseacuteedans un premier temps sur lrsquointeacutegraliteacute de la liste puis agrave partir du deuxiegraveme eacuteleacutementensuite agrave partir du troisiegraveme eacuteleacutement etc

Cette boucle de recherche doit ecirctre placeacutee agrave lrsquointeacuterieur drsquoune meacutethode de faccedilon agravepouvoir ecirctre exeacutecuteacutee plusieurs fois chacune des exeacutecutions variant en fonction drsquounparamegravetre qui preacutecise lrsquoindice ougrave deacutebute la recherche La meacutethode ouEstLePlusPetit()preacutesenteacutee ci-dessous et agrave inseacuterer dans la classe Classe reacutealise cette recherche

private int ouEstLePlusPetit(int debut) int indiceDuMin = debut j for(j = debut+1 j lt listelength j++) if (liste[j]quelleMoyenne() lt

liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j return indiceDuMin

Lorsque le programme sort de la boucle for indiceDuMin repreacutesente lrsquoindice de la pluspetite moyenne dans le tableau liste Cette valeur est alors retourneacutee agrave la fonction appe-lante qui lrsquoutilise pour reacutealiser lrsquoeacutechange des valeurs

Notez que la meacutethode ouEstLePlusPetit() est deacuteclareacutee en mode private Cettemeacutethode nrsquoest pas un comportement caracteacuteristique drsquoune classe drsquoeacutetudiants mais untraitement interne destineacute agrave obtenir un classement de lrsquoensemble des eacutetudiants

Eacutechange de la plus petite valeur avec un eacuteleacutement de la liste

Connaissant lrsquoindice ougrave se trouve la plus petite moyenne nous devons eacutechanger cettevaleur avec celle correspondant au deacutebut de la recherche Ce traitement est reacutealiseacute surlrsquoensemble des eacutetudiants en faisant varier lrsquoindice du deacutebut de recherche de la premiegraverevaleur du tableau jusqursquoagrave la derniegravere La meacutethode classerParMoyenne() qui srsquoinsegraveredans la classe Classe reacutealise ces opeacuterations

public void classerParMoyenne() int indiceDuPlusPetit Etudiant tmp for(int i = 0 i lt listelength i ++) indiceDuPlusPetit = ouEstLePlusPetit(i) tmp = liste[i] liste[i] = liste[indiceDuPlusPetit] liste[indiceDuPlusPetit] = tmp

Gracircce agrave la boucle for le programme parcourt lrsquoensemble des eacutetudiants de la classeAinsi pour chaque eacutetudiant de la liste la boucle reacutealise

bull la recherche de la plus petite moyenne (ouEstLePlusPetit()) agrave partir de lrsquoindice icorrespondant agrave lrsquoindice de deacutebut de recherche

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

217

bull lrsquoeacutechange dans la liste des donneacutees concernant lrsquoeacutetudiant ayant la plus petite moyenne(indiceDuPlusPetit) avec les donneacutees de lrsquoeacutetudiant placeacute agrave lrsquoindice i (indice dudeacutebut de recherche)

Sans revenir sur le meacutecanisme drsquoeacutechange des donneacutees (voir au Chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) observez quegracircce au regroupement des donneacutees sous forme drsquoobjets les opeacuterations reacutealisent nonseulement lrsquoeacutechange des moyennes des eacutetudiants mais aussi lrsquoensemble des donneacuteesdeacutecrivant chaque eacutetudiant crsquoest-agrave-dire ses nom preacutenoms et notes En effet ce sont ici lesadresses de chaque objet laquo Etudiant raquo qui sont eacutechangeacutees et non pas simplement lesmoyennes

Lrsquoapplication GestionClasse

Afin de veacuterifier le bon fonctionnement des classes Etudiant et Classe il est neacutecessairede construire une application qui utilise des instances de ces classes Examinez la classeGestionClasse composeacutee drsquoune fonction main() dans laquelle est deacuteclareacute un objet Cde type Classe

public class GestionClasse public static void main(String [] argument) Classe C = new Classe() Systemoutprintln(------------- Reacutecapitulatif -------------) CafficheLesEtudiants() CclasserParMoyenne() Systemoutprintln(------------- Classement ----------------) CafficheLesEtudiants() Fin de class GestionClasse

En appelant le constructeur Classe() le programme demande la saisie du nombredrsquoeacutetudiants Puis pour chaque eacutetudiant il fait appel au constructeur Etudiant() quidemande la saisie des nom preacutenom et notes de lrsquoeacutetudiant concerneacute

Agrave la sortie du constructeur Classe() le programme est en mesure drsquoafficher gracircce agravelrsquoinstruction CafficheLesEtudiants() toutes les informations relatives agrave chaqueeacutetudiant de la classe C

Ensuite les eacutetudiants sont classeacutes par ordre croissant de moyenne gracircce agrave lrsquoappel de lameacutethode classerParMoyenne() appliqueacutee agrave la classe C Lrsquoaffichage de la liste deseacutetudiants permet ensuite de veacuterifier que le tri a eacuteteacute correctement reacutealiseacute

Exeacutecution de lrsquoapplication reacutesultats

Nombre drsquoetudiants 44Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant CCeelliinneeCombien de notes pour lrsquoetudiant Celine B 22Entrer la note ndeg 1 1133Entrer la note ndeg 2 1155Entrer le nom de lrsquoetudiant FFEntrer le preacutenom de lrsquoetudiant NNiiccoollaass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

218

Combien de notes pour lrsquoetudiant Nicolas F 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1188Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant EEllooddiieeCombien de notes pour lrsquoetudiant Elodie B 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1166Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant AArrnnaauuddCombien de notes pour lrsquoetudiant Arnaud B 22Entrer la note ndeg 1 1100Entrer la note ndeg 2 1122------------------ Reacutecapitulatif ------------------Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Nicolas F sont 160 180Sa moyenne vaut 170Les notes de Elodie B sont 160 160Sa moyenne vaut 170Les notes de Arnaud B sont 100 120Sa moyenne vaut 110------------------ Classement ------------------ Les notes de Arnaud B sont 100 120Sa moyenne vaut 11Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Elodie B sont 160 160Sa moyenne vaut 160Les notes de Nicolas F sont 160 180Sa moyenne vaut 170

Les tableaux agrave deux dimensionsVous venez de voir les tableaux agrave une seule dimension repreacutesenteacutes comme une liste hori-zontale ou verticale drsquoeacuteleacutements de mecircme type Il est possible avec Java de travailleraussi avec des tableaux de deux trois voire n dimensions Pour simplifier nous allonseacutetudier les tableaux agrave deux dimensions

Par deacutefinition un tableau agrave deux dimensions srsquoorganise non plus sur une seule ligne maissur des lignes et des colonnes Le croisement drsquoune ligne et drsquoune colonne deacutetermine uneacuteleacutement donneacute du tableau

Deacuteclaration drsquoun tableau agrave deux dimensionsPour deacuteclarer un tableau agrave deux dimensions la syntaxe est la suivante

int [][] donneacutee = new int [3][5]

La syntaxe est pratiquement identique agrave la deacuteclaration drsquoun tableau agrave une dimension Laseule diffeacuterence consiste en lrsquoajout de [] suppleacutementaires pour signifier au compilateurque le tableau est composeacute de deux dimensions

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

219

Les valeurs numeacuteriques placeacutees entre [] derriegravere lrsquoopeacuterateur new indiquent respective-ment le nombre de lignes puis de colonnes

Lrsquoinstruction de deacuteclaration deacutecrite ci-dessus reacuteserve en meacutemoire un tableau nommeacutedonneacutee composeacute de 3 lignes et de 5 colonnes Chaque eacuteleacutement du tableau eacutetant un entierlrsquoopeacuterateur new reacuteserve 3 5 soit 15 cases meacutemoire de la taille drsquoun entier

Remarquez que le nombre de lignes drsquoun tableau est donneacute par lrsquoexpressiondonneacuteelength alors que le nombre de colonnes est deacutetermineacute par lrsquoexpressiondonneacutee[0]length En effet le nombre de colonnes drsquoun tableau correspond au nombredrsquoeacuteleacutements placeacutes sur une ligne (voir Figure 9-5)

Acceacuteder aux eacuteleacutements drsquoun tableauPour initialiser modifier ou consulter la valeur drsquoun eacuteleacutement drsquoun tableau il convientdrsquoutiliser deux indices un indice pour les lignes et un indice pour les colonnes Chaqueindice eacutetant controcircleacute par une boucle for la technique consiste agrave imbriquer deux bouclesde la faccedilon suivante

for (int i = 0 i lt donneacuteelength i++) for (int j = 0 j lt donneacutee[0]length j++) donneacutee[i][j]) = uneValeur

La boucle j est imbriqueacutee dans la boucle i Les variables i et j sont les compteurs deboucles qui controcirclent respectivement les lignes et colonnes du tableau donneacutee

Pour mieux comprendre les meacutecanismes de manipulation des tableaux et en particulierle deacuteroulement des valeurs des indices agrave lrsquointeacuterieur des boucles for examinonslrsquoexemple suivant

Exemple Dessiner un sapin

Les tableaux agrave deux dimensions sont tregraves souvent utiliseacutes pour stocker les images Eneffet une image afficheacutee agrave lrsquoeacutecran correspond en reacutealiteacute agrave une surface deacutecoupeacutee en lignes

Figure 9-5

Un tableau srsquoorganise sur des lignes et des colonnes numeacuteroteacutees agrave partir de [0][0]

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

220

et colonnes La donneacutee numeacuterique se situant agrave la croiseacutee de ces lignes et colonnes repreacute-sente un point de lrsquoimage et a pour valeur la couleur drsquoaffichage agrave lrsquoeacutecran

Cahier des charges

Lrsquoobjectif de cet exemple est de dessiner agrave lrsquoeacutecran un sapin de Noeumll deacutecoreacute commelrsquoillustre la figure suivante

Pour simplifier agrave lrsquoextrecircme la lisibiliteacute du programme nous nrsquoutilisons que de simplescaractegraveres alphanumeacuteriques pour afficher notre sapin Crsquoest pourquoi son affichage resteassez sommaire Pour voir de plus laquo jolis raquo sapins reportez-vous au Chapitre 11laquo Dessiner des objets raquo

Creacuteer et afficher un triangle composeacute de trois lignes

Fidegraveles au principe de deacutecomposition drsquoun problegraveme nous allons chercher dans unpremier temps agrave afficher la forme suivante

Lrsquoaffichage de cette forme correspond agrave un triangle Sa structure interne est deacutefinie enmeacutemoire agrave lrsquoaide drsquoun tableau agrave deux dimensions Il srsquoagit drsquoun tableau composeacute de3 lignes et de 5 colonnes comme lrsquoillustre le tableau suivant

001000111011111

Ce tableau est constitueacute de valeurs numeacuteriques placeacutees de telle faccedilon que le programmedessine un triangle en affichant un point lorsque la valeur du tableau vaut 1 et sinon uneespace

Pour reacutealiser astucieusement lrsquoinitialisation de ce tableau examinons lrsquoemplacement desvaleurs par rapport aux indices du tableau Sachant qursquoun tableau est toujours initialiseacute agrave0 lors de sa creacuteation en meacutemoire par lrsquoopeacuterateur new observez uniquement les indicescorrespondant aux valeurs eacutegales agrave 1

LigneColonne [0] [1] [2] [3] [4]

[0] 0 0 1 0 0

[1] 0 1 1 1 0

[2] 1 1 1 1 1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

221

Remarquez agrave la colonne [2] que toutes les valeurs sont initialiseacutees agrave 1 Cette colonnecorrespond en reacutealiteacute agrave la colonne du milieu du tableau En supposant que lrsquoensemble desvaleurs soit stockeacute dans un tableau nommeacutee sapin lrsquoindice de cette colonne est obtenugracircce agrave lrsquoinstruction

int [][] sapin = new int [3][5]

int milieu = sapin[0]length 2

Lrsquoexpression sapin[0]length correspondant au nombre de colonnes soit 5 la variablemilieu prend pour valeur 52 soit 2 en entier

Ensuite les valeurs situeacutees de part et drsquoautre de cette colonne sont elles aussi initialiseacuteesagrave 1 Pour la ligne numeacutero [1] seul un eacuteleacutement agrave droite et agrave gauche du milieu est initia-liseacute agrave 1 Pour la ligne numeacutero [2] deux eacuteleacutements agrave droite et agrave gauche valent 1

Il y a donc correacutelation entre le nombre de valeurs agrave initialiser et le numeacutero de la ligne surlaquelle lrsquoinitialisation est effectueacutee Crsquoest pourquoi le traitement se reacutealise de la faccedilonsuivante

for ( int i = 0 i lt sapinlength i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = 1

La variable i partant de 0 jusqursquoagrave sapinlength (soit 3) examine toutes les lignes dutableau Pour chaque ligne gracircce agrave la seconde boucle en j les valeurs du tableau sontinitialiseacutees agrave 1 de part et drsquoautre du milieu Pour mieux comprendre le deacuteroulement desopeacuterations examinez le tableau drsquoeacutevolution des variables

i j milieu tab[i][milieu+j]

0 0 2 tab[0][0 + 2] = 1

0 1 2 sortie de boucle

1 -1 2 tab[1][-1 + 2] = 1

1 0 2 tab[1][0 + 2] = 1

1 1 2 tab[1][1 + 2] = 1

1 2 2 sortie de boucle

2 -2 2 tab[2][-2 + 2] = 1

2 -1 2 tab[2][-1 + 2] = 1

2 0 2 tab[2][0 + 2] = 1

2 1 2 tab[2][1 + 2] = 1

2 2 2 tab[2][2 + 2] = 1

2 3 2 sortie de boucle

3 2 sortie de boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

222

Une fois le tableau creacuteeacute et initialiseacute en meacutemoire lrsquoaffichage du dessin srsquoeffectue entestant la valeur de chaque point du tableau Si la valeur est nulle une espace est afficheacuteesinon un point est afficheacute Traduite en Java cette marche agrave suivre srsquoeacutecrit agrave lrsquoaide de deuxboucles imbriqueacutees comme suit

for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) if(sapin[i][j] == 0) Systemoutprint( ) else Systemoutprint() Systemoutprintln()

Lrsquoindice i repreacutesente les lignes tandis que j repreacutesente les colonnes Gracircce aux bouclesimbriqueacutees chaque intersection des lignes et colonnes est consulteacutee de faccedilon agrave afficherle caractegravere correspondant agrave la valeur stockeacutee Lorsque la boucle i est termineacutee celasignifie que tous les eacuteleacutements (colonnes) de la ligne i ont eacuteteacute afficheacutes et il est neacutecessairede passer agrave la ligne suivante de lrsquoeacutecran gracircce agrave lrsquoinstruction Systemoutprintln()

Creacuteer un triangle composeacute de n lignes

Nous avons creacuteeacute un triangle agrave 3 lignes composeacute de 5 colonnes Si nous souhaitons ajouterune nouvelle ligne nous devons obligatoirement ajouter deux colonnes suppleacutementairesLa relation entre le nombre de lignes et de colonnes srsquoexprime selon lrsquoeacutequation

Nombre de colonnes = 2 Nombre de lignes ndash 1

Pour un triangle posseacutedant 3 lignes vous obtenez 2 3 - 1 = 5 colonnes Pour untriangle composeacute de 4 lignes vous obtenez 2 4 - 1 = 7 colonnes Lrsquoeacutequation restevalide pour un triangle agrave une ligne puisque le nombre de colonnes vaut 2 1 - 1 = 1

Les instructions suivantes permettent de creacuteer un triangle dont le nombre de lignes estdeacutetermineacute par lrsquoutilisateur

public class Sapin public static void main(String [] arg) Systemoutprint(Nombre de ligne ) int nl = Lirei() if (nl lt= 0) Systemoutprintln(Le nombre de lignes doit ecirctre supeacuterieur a 0 ) Systemexit(0) int nc = 2nl-1 int [][] sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int i = 0 i lt nl i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = +1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

223

Fin de la fonction main() Fin de la classe Sapin

Placer des deacutecorations au hasard

Cela fait nous sommes en mesure drsquoafficher le sapin sans deacutecoration puisque pourchaque eacuteleacutement du tableau valant 1 un point est afficheacute Pour ajouter quelques deacutecora-tions lrsquoideacutee est de placer au hasard drsquoautres valeurs que 1 Ainsi lrsquoaffichage peut ecirctremoduleacute en fonction de la valeur rencontreacutee

Pour placer dans notre sapin de nouvelles valeurs au hasard comprises entre 1 et 6 parexemple il suffit de modifier lrsquoinitialisation du tableau de la faccedilon suivante

for ( int i = 0 i lt nl i++)

for ( int j = -i j lt= i j++) sapin[i][milieu + j] = (int ) (5 Mathrandom() + 1)

Lrsquoaffichage du sapin se deacuteroule ensuite comme suit

for (int i = 0 i lt sapinlength i++)

for (int j = 0 j lt sapin[0]length j++) switch (sapin[i][j]) case 0 Systemoutprint( ) break case 2 Systemoutprint() break default Systemoutprint() Systemoutprintln()

Suivant la valeur contenue en sapin[i][j] le programme affiche une espace un pointou un Remarquez que les valeurs 1 3 4 5 et 6 affichent toutes un point Seule la valeur2 permet lrsquoaffichage drsquoune guirlande Ce choix a pour effet drsquoafficher volontairementplus de points que de guirlandes de faccedilon agrave obtenir un sapin qui ne soit pas tropsurchargeacute

Attention aux boucles imbriqueacutees

Pour manipuler des tableaux agrave deux dimensions le programmeur utilise deux bouclesfor imbriqueacutees Dans ce cas une boucle for est placeacutee agrave lrsquointeacuterieur drsquoune premiegravereboucle for Ce type drsquoeacutecriture neacutecessite attention car certaines erreurs peuvent empecirc-cher le bon deacuteroulement du programme

Une erreur drsquoinattention commise en particulier agrave cause des faciliteacutes du copier-collerpeut aboutir agrave programmer deux boucles imbriqueacutees qui utilisent la mecircme variablecomme compteur de boucles

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

224

Ainsi en eacutecrivant

Le compteur de boucles i est deacuteclareacute agrave lrsquoexteacuterieur des boucles Les deux boucles utilisentla mecircme case meacutemoire pour stocker les variations de la valeur de i

En entrant dans la Boucle 1 i prend la valeur 1 de mecircme qursquoen entrant dans la Boucle 2Puis i est increacutementeacute de 1 agrave chaque tour de la Boucle 2 jusqursquoagrave ce que i deacutepasse la valeur4 La Boucle 2 est alors termineacutee i vaut par conseacutequent 5 On entre agrave nouveau dans laBoucle 1 i est increacutementeacute de 1 (i vaut 6) puis testeacute 6 eacutetant supeacuterieur agrave 3 la Boucle 1 esttermineacutee La Boucle 1 nrsquoest donc parcourue qursquoune seule fois au lieu de trois

Remarquez que

bull Si le compteur de boucles est deacuteclareacutee agrave lrsquointeacuterieur de la boucle comme suit

for(int i = 1 i lt= 3 i= i+1) Boucle 1 for( int i = 1 i lt= 4 i= i+1) Boucle 2

alors le compilateur deacutetecte une erreur du type Variable rsquoirsquo is already definedin this method En effet le fait de deacuteclarer un compteur de boucles portant le mecircmenom dans chaque boucle revient agrave deacuteclarer dans un mecircme bloc de programme deuxvariables portant le mecircme nom

bull Lrsquoeacutecriture de deux boucles non imbriqueacutees utilisant la mecircme variable comme comp-teur de boucles nrsquoest pas une erreur

for( int i = 1 i lt= 3 i= i+1) Premier for 4 toursfor( int i = 1 i lt= 6 i= i+1) Deuxiegraveme for 7 tours

Lrsquoemploi drsquoune mecircme variable de compteur pour deux boucles disjointes est correct Eneffet la variable i est deacuteclareacutee dans la boucle Elle nrsquoexiste en meacutemoire que le tempsdrsquoutilisation de la boucle Lorsque i est agrave nouveau deacuteclareacutee dans la deuxiegraveme boucle lavariable i preacuteceacutedente nrsquoexiste deacutejagrave plus Cette maniegravere de programmer est courante carelle facilite la lecture des boucles Tregraves souvent les compteurs de boucles ont pour nomi j ou k

Boucles imbriqueacutees (i est compteur de boucles) Variation de la variable i

int ifor(i = 1 i lt= 3 i= i+1) Boucle 1 for(i = 1 i lt= 4 i= i+1) Boucle 2

Boucle 1 i = 1 i lt= 3 Boucle 2 i = 1 i lt= 4 Boucle 2 i = 2 i lt= 4 Boucle 2 i = 3 i lt= 4 Boucle 2 i = 4 i lt= 4 Boucle 2 i = 5 i gt 4Boucle 1 i = 6 i gt 3

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

225

ReacutesumeacuteLes tableaux sont utiliseacutes pour regrouper sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Un tableau est deacutefini par

bull un nom

bull un type

bull le nombre de dimensions

bull une taille pour chacune des dimensions

Deacuteclaration drsquoun tableau Comme toute variable un tableau doit ecirctre deacuteclareacute La syntaxe est la suivante

bull Pour un tableau agrave une dimension

float [] donnee = new float [5]

Cette instruction deacuteclare un tableau composeacute de nombres reacuteels de simple preacuteci-sion appeleacute donnee Lrsquoopeacuterateur new reacuteserve 5 cases meacutemoire de 4 octets chacune

bull Pour un tableau agrave deux dimensions

int [][] valeur = new int [3][2]

Cette instruction deacuteclare un tableau agrave deux dimensions composeacute de nombresentiers appeleacute valeur Lrsquoopeacuterateur new reacuteserve 3 2 = 6 cases meacutemoire de 4octets chacune

La taille drsquoun tableau est une valeur entiegravere deacutefinie soit agrave lrsquointeacuterieur du programmesoit saisie au clavier lors de lrsquoexeacutecution du programme Une fois la taille fixeacutee parlrsquoopeacuterateur new il nrsquoest plus possible de la modifier en cours drsquoexeacutecution

Un tableau nrsquoest pas neacutecessairement de type simple (int double etc) Il peut ecirctrede type structureacute (String ou type deacutefini par le programmeur etc) Dans ce cas letableau est un tableau drsquoobjets stockant dans chacune de ses cases lrsquoadresse drsquounobjet agrave meacutemoriser

Pour acceacuteder agrave une case (eacuteleacutement) du tableau il suffit de placer derriegravere le nom dutableau le numeacutero de la case (indice) entre [] Chaque indice est une expressionentiegravere La premiegravere valeur drsquoun tableau est stockeacutee agrave lrsquoindice 0 du tableau et non agravelrsquoindice 1

for (int i = 0 i lt donneelength i++) Systemoutprintln( + donnee[i])

Ainsi la boucle for ci-dessus permet drsquoacceacuteder agrave chaque eacuteleacutement du tableau Pourne pas deacutepasser la taille du tableau il est conseilleacute drsquoutiliser la donneacutee length quicorrespond agrave la longueur du tableau Le programme deacutepasse la taille du tableaulorsque la valeur de lrsquoindice est supeacuterieure agrave la taille deacuteclareacutee du tableau Lrsquointer-preacuteteur deacutetecte alors une erreur du type javalangArrayIndexOutOfBounds-Exception

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

226

Exercices Les tableaux agrave une dimension

Qursquoaffiche le programme suivant

int i int [] valeur = new int[6] valeur [0] = 1 for (i = 1 i lt valeurlength i++) valeur[i] = valeur[i-1]+2 for (i = 0 i lt valeurlength i++) Systemoutprint(valeur[+i+] = + valeur[i])

Eacutecrivez un programme qui

a Stocke dans un tableau des valeurs entiegraveres passeacutees en paramegravetres de la ligne decommande

b Calcule la somme de ces valeurs

c Calcule la moyenne de ces valeurs

d Recherche la plus grande valeur du tableau

e Deacutetermine la position de la plus grande valeur

f Affiche le nombre de valeurs supeacuterieures agrave la moyenne

Les tableaux drsquoobjetsEn reprenant la classe Cercle deacutefinie au Chapitre 8 laquo Les principes du conceptdrsquoobjet raquo eacutecrivez un programme qui

a Creacutee un tableau de type Cercle dont la taille soit choisie par lrsquoutilisateur Si lenombre de cercles creacuteeacutes est infeacuterieur agrave 4 le programme initialise par deacutefaut lataille du tableau agrave 4

b Initialise les donneacutees de chaque tableau agrave lrsquoaide du constructeur par deacutefaut de laclasse Cercle

c Deacuteplace le cercle ndeg 1 en 20 20

d Agrandit le cercle ndeg 2 de 50

e Eacutechange le cercle ndeg 0 avec le ndeg 3

f Permute les cercles de faccedilon que le cercle 0 soit stockeacute en 1 le cercle 1 en 2 hellipet le cercle 3 en 0

91

92

93

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

227

Les tableaux agrave deux dimensionsEacutecrivez un programme qui

a Agrave lrsquoaide de boucles imbriqueacutees initialise la matrice 7 7 aux valeurs suivantes

1 0 0 1 0 0 10 1 0 1 0 1 00 0 1 1 1 0 01 1 1 1 1 1 10 0 1 1 1 0 00 1 0 1 0 1 01 0 0 1 0 0 1

Les compteurs de boucles seront astucieusement choisis afin drsquoinitialiser automatiquementle tableau

b Affiche agrave lrsquoeacutecran le tableau en remplaccedilant les valeurs

0 par un espace ( )

1 par un asteacuterisque ()

Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor

Afin drsquoexeacutecuter le programme suivant

public class Exercice5 public static void main (String [] parametre) int ij N = 5 char C Systemoutprint(Entrer un caractegravere ) C = Lirec() for (i = 1 i lt N i++) for (j = 1 j lt N j++) if (i lt j) Systemoutprint(C) else Systemoutprint( )

a Examinez le code source repeacuterez les instructions concerneacutees par les deuxboucles reacutepeacutetitives et deacuteterminez les instructions de deacutebut et de fin de boucle

b Quelles sont les instructions qui permettent de modifier le reacutesultat du test desortie de boucle

c En supposant que lrsquoutilisateur entre la valeur laquo raquo exeacutecutez le programmesuivant agrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaquevariable deacuteclareacutee)

d Quel est le reacutesultat afficheacute agrave lrsquoeacutecran

94

95

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

228

En construisant le tableau drsquoeacutevolution de la variable i que constatez-vous lors delrsquoexeacutecution de ces boucles

for(i = 1 i lt= 5 i = i+1) for(i = 1 i lt= 2 i= i+1) Systemoutprint(i = +i)

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter dix lignes comptablesLrsquoobjectif est de traiter non plus une seule ligne comptable mais dix lignes comptablesPour cela vous devez dans un premier temps modifier la deacuteclaration de la donneacuteeligne dans la classe Compte comme suit

private LigneComptable [] ligne

Comme le nombre de lignes comptables est fixeacute dans le cahier des charges il est possiblede deacutefinir une constante comme suit

public static final int NBLigne = 10

NBLigne repreacutesente le nombre maximal de lignes comptables agrave traiter Les lignes comp-tables eacutetant creacuteeacutees au fur et agrave mesure des opeacuterations reacutealiseacutees par lrsquoutilisateur il estneacutecessaire de deacutefinir une variable (nbLigneReacuteel) qui compte le nombre de lignes comp-tables effectivement creacuteeacutees en cours drsquoexeacutecution du programme

La gestion des lignes comptables entraicircne la modification des meacutethodes Compte()creacuteerLigne() et afficherCompte()

Transformer les constructeurs Compte()

Dans chaque constructeur

a Agrave lrsquoaide de lrsquoopeacuterateur new creacuteer en meacutemoire la donneacutee ligne sous forme drsquountableau de dix lignes comptables

b Initialiser la variable nbLigneReacuteel agrave ndash1 puisqursquoaucune ligne nrsquoa encore eacuteteacute saisie

Transformer la meacutethode creacuteerLigne()

Lorsque le nombre de lignes comptables traiteacute est supeacuterieur agrave 10 le programme doiteffacer la premiegravere ligne traiteacutee de faccedilon agrave deacutecaler les suivantes (la deuxiegraveme allant enpremiegravere position la troisiegraveme en deuxiegraveme position etc) afin de pouvoir stocker lanouvelle ligne en derniegravere position du tableau ligne

96

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

229

La meacutethode creacuteerLigne() reacutealise ce traitement de la faccedilon suivante

a Increacutemente nbLigneReacuteel de 1

b Si le nombre de lignes creacuteeacutees est infeacuterieur agrave NBLigne creacutee en meacutemoire une lignecomptable gracircce au constructeur de la classe LigneComptable et stocke en meacutemoireson adresse dans le tableau ligne

c Si le nombre de lignes est supeacuterieur agrave NBLigne deacutecale toutes les lignes vers le hautgracircce agrave la meacutethode deacutecalerLesLignes() deacutecrite ci-dessous et stocke la nouvelleligne comptable en derniegravere position (NBLigne ndash 1) du tableau ligne

private void deacutecalerLesLignes() for(int i = 1 i lt NBLigne i++) ligne[i-1] = ligne[i]

d Modifie la valeur courante du compte en fonction du creacutedit ou deacutebit reacutealiseacute par lanouvelle ligne comptable

Transformer la meacutethode afficherCompte()Modifier la meacutethode afficherCompte() de faccedilon agrave afficher lrsquoensemble des lignes saisiesen cours drsquoexeacutecution du programme

copy copyright Eacuteditions Eyrolles

10Collectionner un nombre

indeacutetermineacute drsquoobjets

Comme nous lrsquoavons vu au cours du chapitre preacuteceacutedent les tableaux permettent la mani-pulation rapide et efficace drsquoun ensemble de donneacutees Cependant leur principal inconveacute-nient est drsquoecirctre de taille fixe Ainsi lrsquoajout drsquoun eacuteleacutement dans un tableau demande unegestion rigoureuse des indices afin drsquoeacuteviter que ces derniers ne prennent une valeur supeacute-rieure agrave la taille du tableau

Pour pallier cette difficulteacute majeure pour un grand nombre de programmes le langageJava propose plusieurs outils de manipulation des donneacutees en meacutemoire vive au fur et agravemesure des besoins de lrsquoapplication Ces outils sont preacutesenteacutes et analyseacutes agrave la sectionlaquo La programmation dynamique raquo

En outre lorsqursquoun programme utilise des collections importantes de donneacutees il doit lesarchiver de faccedilon agrave ne pas les voir disparaicirctre apregraves lrsquoarrecirct de lrsquoapplication ou de lrsquoordi-nateur Le langage Java offre diffeacuterentes meacutethodes pour reacutealiser ce stockage de donneacuteesElles sont eacutetudieacutees agrave la section laquo Lrsquoarchivage de donneacutees raquo

La programmation dynamiqueAgrave la diffeacuterence de la programmation statique dans laquelle le nombre de donneacutees geacutereacutepar lrsquoapplication est fixeacute une fois pour toutes lors de lrsquoexeacutecution du programme laprogrammation dynamique offre lrsquoavantage de geacuterer un nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Cette technique se montre tregraves utile lorsque le nombre drsquoobjets agrave traiter nrsquoest pas connuni deacutefinissable avant lrsquoexeacutecution du programme Par exemple tous les logiciels degestion et crsquoest une grande part des programmes informatiques se doivent de geacuterer lesdonneacutees qursquoils traitent de faccedilon dynamique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

232

En effet sans programmation dynamique vous pourriez voir une bibliothegraveque refuser denouveaux lecteurs sous preacutetexte que le logiciel qursquoelle utilise ne serait pas en mesure detraiter plus de 50 000 inscriptions ou encore voir un logiciel de traitement de textesrsquointerrompre parce qursquoil lui serait impossible de geacuterer la saisie et lrsquoaffichage de plus10 000 caractegraveres

Pour eacuteviter de telles situations le langage Java propose diffeacuterents outils qui gegraverent dyna-miquement les donneacutees drsquoun programme En particulier il existe des objets de typeVector dont nous analysons les caracteacuteristiques agrave la section laquo Les vecteurs raquo Les objetsde type Hashtable eacutetudieacutes agrave la section laquo Les dictionnaires raquo offrent aussi lrsquoavantage degeacuterer les donneacutees de faccedilon dynamique tout en organisant lrsquoinformation de faccedilon agrave faci-liter son exploitation

Les vecteursLes vecteurs sont des objets de type Vector un type preacutedeacutefini du langage Java Lagestion des vecteurs est assez similaire agrave la gestion drsquoun tableau puisque le programmecreacutee une liste par ajout de donneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Lesdonneacutees sont enregistreacutees dans leur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteurpermet de retrouver lrsquoinformation

Manipulation drsquoun vecteur

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Ainsi deacuteclareacute liste est un objet de type Vector auquel on peut appliquer des meacutethodesde la classe Vector Ces meacutethodes deacutecrites au tableau ci-dessous permettent lrsquoajout lasuppression ou la modification drsquoune donneacutee dans le vecteur (liste par exemple)

Opeacuteration Fonction Java

Ajoute un eacuteleacutement objet en fin de liste add(objet)

Insegravere un eacuteleacutement objet dans la liste agrave lrsquoindice speacutecifieacute en paramegravetre add(indice objet)

Ajoute un eacuteleacutement objet en fin de liste et augmente sa taille de un addElement(objet)

Retourne lrsquoeacuteleacutement stockeacute agrave lrsquoindice speacutecifieacute en paramegravetre elementAt(indice)

Supprime tous les eacuteleacutements de la liste clear()

Retourne lrsquoindice dans la liste du premier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

indexOf(objet)

Retourne lrsquoindice dans la liste du dernier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

lastIndexOf()

Supprime lrsquoobjet dont lrsquoindice est speacutecifieacute en paramegravetre remove(indice)

Supprime tous les eacuteleacutements compris entre les indices i (valeur comprise) et j (valeur non comprise)

removeRange(i j)

Remplace lrsquoeacuteleacutement situeacute en position i par lrsquoobjet speacutecifieacute en paramegravetre setElementAt(objet i)

Retourne le nombre drsquoeacuteleacutements placeacutes dans la liste size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

233

Exemple Creacuteer un nombre indeacutetermineacute drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation des vecteurs reprenons lrsquoexemple de la classedrsquoeacutetudiants (voir au chapitre preacuteceacutedent laquo Collectionner un nombre fixe drsquoobjets raquo lasection laquo Trier un ensemble de donneacutees raquo) de faccedilon que le programme traite non plus unnombre fixe drsquoeacutetudiants mais un nombre indeacutetermineacute

La classe Etudiant nrsquoest pas agrave modifier puisque lrsquoobjectif est de transformer unique-ment la gestion en meacutemoire des eacutetudiants La correction se porte donc sur la classeClasse ougrave la liste drsquoeacutetudiants doit ecirctre deacuteclareacutee de type Vector au lieu drsquoecirctre deacuteclareacuteesous forme de tableau Examinons la nouvelle classe Classe

import javautil public class Classe private Vector liste public Classe() liste = new Vector() public void ajouteUnEtudiant() listeaddElement(new Etudiant()) public void afficheLesEtudiants() int nbEtudiants = listesize() if (nbEtudiants gt 0) Etudiant tmp for (int i = 0 i lt nbEtudiants i ++) tmp = (Etudiant) listeelementAt(i) tmpafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste) Fin de Classe

Les outils comme Vector sont proposeacutes par le langage Java Ils sont deacutefinis agrave lrsquointeacuterieurde classes qui ne sont pas par deacutefaut directement accessibles par le compilateur Crsquoestpourquoi le programmeur doit preacuteciser au compilateur ougrave se situe la librairie du langageJava deacutefinissant lrsquooutil utiliseacute (package) Pour ce faire il doit placer une instructionimport en premiegravere ligne du fichier qui utilise lrsquooutil souhaiteacute

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placer lrsquoinstruc-tion importjavautil en tecircte du fichier En effet si cette instruction fait deacutefaut lecompilateur deacutetecte une erreur du type Class Vector not found

Cela fait la donneacutee liste deacuteclareacutee de type Vector doit ecirctre manipuleacutee en tant que telledans chaque meacutethode de la classe Les trois meacutethodes suivantes sont deacutefinies agravelrsquointeacuterieur de celle-ci

bull Le constructeur Classe() qui fait appel au constructeur de la classe Vector afin dedeacuteterminer lrsquoadresse du premier eacuteleacutement de la liste

bull La meacutethode ajouteUnEtudiant() qui place un eacuteleacutement dans la liste gracircce agrave lameacutethode addElement() Lrsquoeacuteleacutement ajouteacute agrave la liste est un objet de type Etudiant creacuteeacutepar lrsquointermeacutediaire du constructeur Etudiant() qui demande la saisie au clavier des

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

234

donneacutees caracteacuteristiques de lrsquoeacutetudiant agrave construire Cela fait la taille de la liste estautomatiquement augmenteacutee de 1 par lrsquointerpeacuterteur

Observez que lrsquoajout drsquoun eacuteleacutement dans un vecteur nrsquoest possible que si lrsquoeacuteleacutement estun objet Il nrsquoest en effet pas possible drsquoajouter une valeur de type simple telle queint float ou double Pour reacutealiser une telle opeacuteration il est neacutecessaire de transformerles types simples en leur homologue structureacute Par exemple le type simple int peutecirctre repreacutesenteacute par le type Integer deacutefinissant un objet contenant une valeur numeacute-rique entiegravere (pour plus de preacutecisions voir lrsquoexercice 1 en fin de chapitre)

bull La meacutethode afficheLesEtudiants() parcourt lrsquoensemble de la liste gracircce agrave lameacutethode elementAt() qui fournit en reacutesultat lrsquoeacuteleacutement stockeacute agrave la position speacutecifieacuteeen paramegravetre soit i Ce reacutesultat pour ecirctre consultable doit obligatoirement ecirctrelaquo casteacute raquo en Etudiant (voir au Chapitre 1 laquo Stocker une information raquo la section laquo Latransformation de types raquo) En effet un vecteur a la capaciteacute de meacutemoriser nrsquoimportequel type drsquoobjet preacutedeacutefini ou non Il est donc neacutecessaire drsquoindiquer au compilateur agravequel type correspond lrsquoobjet extrait

Lrsquoindice i variant de 0 jusqursquoagrave la taille effective (nbEtudiants) de la liste lrsquoensembledes eacutetudiants contenus dans la liste est afficheacute

Exemple Lrsquoapplication GestionClasse

Observons lrsquoapplication GestionClasse qui deacutefinit et utilise un objet Classe

public class GestionClasse public static void main(String [] argument) byte choix = 0 Classe C = new Classe() do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Affiche la classe) Systemoutprintln(3 Pour sortir) Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 CafficheLesEtudiants() break case 3 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 3)

Le nombre drsquoeacutetudiants agrave traiter nrsquoest pas deacutetermineacute agrave lrsquoavance Crsquoest pourquoi lrsquoapplica-tion GestionClasse reacutealise gracircce agrave la mise en place drsquoune boucle dohellipwhile la saisie desdonneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Le programme laisse le choix agravelrsquoutilisateur de saisir de nouveaux eacutetudiants ou drsquoafficher ceux effectivement saisisLrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

235

1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Il nrsquoy a pas drsquoetudiant dans cette liste1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant MMEntrer le prenom de lrsquoetudiant SSaannddrraaCombien de notes pour lrsquoetudiant Sandra M 22Entrer la note ndeg 1 1155Entrer la note ndeg 2 11331 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant PPhhiilliippppeeEntrer le prenom de lrsquoetudiant TTCombien de notes pour lrsquoetudiant Philippe T 2Entrer la note ndeg 1 1122Entrer la note ndeg 2 881 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Les notes de Sandra M sont 150 130Sa moyenne vaut 140Les notes de Philippe T sont 120 80Sa moyenne vaut 1001 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 33

Lrsquoutilisation drsquoobjets du type Vector est souple et facilite amplement la vie du program-meur lorsque ce dernier souhaite eacutecrire une application qui gegravere des donneacutees de faccedilondynamique Les meacutethodes de la classe Vector permettent aussi la recherche ou lrsquoinser-tion de nouveaux eacuteleacutements gracircce en particulier agrave la meacutethode indexOf(objet) quiretrouve lrsquoindice de lrsquoobjet speacutecifieacute en paramegravetre dans la liste

Cependant lorsque la liste meacutemorise des objets complexes tels que les donneacutees caracteacute-ristiques drsquoun eacutetudiant la recherche drsquoun eacutetudiant particulier nrsquoest pas simple En effetil est neacutecessaire de fournir au programme toutes les donneacutees de lrsquoeacutetudiant (nom preacutenomnotes et moyenne) de faccedilon agrave ecirctre sucircr de le retrouver dans la liste La meacutethodeindexOf(objet) ne retrouve lrsquoobjet speacutecifieacute en paramegravetre qursquoagrave la seule condition qursquoilsoit totalement identique agrave celui stockeacute dans la liste

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

236

Les dictionnaires

Pour ameacuteliorer la recherche drsquoeacuteleacutements complexes dans une liste la technique consisteagrave organiser les donneacutees non plus par rapport agrave un indice mais par rapport agrave une cleacute expli-cite De cette faccedilon la recherche drsquoun objet dans la liste srsquoeffectue non plus surlrsquoensemble des donneacutees qui le composent mais sur une cleacute unique qui lui est associeacutee

Lrsquoorganisation de donneacutees par association drsquoune cleacute agrave un ensemble de donneacutees estappeleacutee un dictionnaire Dans un dictionnaire chaque deacutefinition est associeacutee au motqursquoelle deacutefinit et non pas agrave sa position (numeacuterique) dans le dictionnaire

Manipulation drsquoun dictionnaire

Le type Hashtable proposeacute par le langage Java permet de reacutealiser simplement lrsquoassocia-tion cleacute-eacuteleacutement Les meacutethodes associeacutees agrave ce type sont la creacuteation la suppression laconsultation ou la modification drsquoune association

Pour utiliser un dictionnaire il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Hashtable listeClasseacutee = new Hashtable ()

Ainsi deacuteclareacute listeClasseacutee est un objet de type Hashtable sur lequel on peut appli-quer des meacutethodes de la classe Hashtable Les meacutethodes les plus couramment utiliseacuteessont deacutecrites au tableau ci-apregraves

Exemple Creacuteer un dictionnaire drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation de tels objets modifions le programme de gestiondrsquoune classe drsquoeacutetudiants de faccedilon agrave organiser les donneacutees agrave partir drsquoune cleacute deacutefinie par leprogramme

Deacutefinir une cleacute drsquoassociation

En supposant qursquoun eacutetudiant soit totalement identifiable par son nom et son preacutenom lacleacute drsquoassociation des donneacutees est deacutefinie comme eacutetant une chaicircne de caractegraveres majus-cules dont le premier caractegravere coiumlncide avec le premier caractegravere du preacutenom delrsquoeacutetudiant et dont les caractegraveres suivants correspondent au nom de lrsquoeacutetudiant

De cette faccedilon chaque cleacute est deacutetermineacutee par programme indeacutependamment de lrsquoutilisa-teur en fonction des informations fournies par ce dernier

Opeacuteration Fonction Java

Place dans le dictionnaire lrsquoassociation cleacutendashobjet put(cleacute objet)

Retourne lrsquoobjet associeacute agrave la cleacute speacutecifieacutee en paramegravetre get(cleacute)

Supprime dans le dictionnaire lrsquoassociation cleacutendashobjet agrave partir de la cleacute speacutecifieacutee en paramegravetre

remove(cleacute)

Retourne le nombre drsquoassociations deacutefinies dans le dictionnaire size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

237

La traduction de cet algorithme en langage Java est la suivante

private String creacuteerUneCleacute(Etudiant e) String tmp tmp = (equelPreacutenom())charAt(0) + equelNom() return tmptoUpperCase()

Agrave partir des donneacutees drsquoun eacutetudiant e passeacutees en paramegravetres la meacutethode creacuteerUneCleacute()retourne une chaicircne de caractegraveres majuscules (tmptoUpperCase()) composeacutee dupremier caractegravere du preacutenom de lrsquoeacutetudiant ((equelPreacutenom())charAt(0)) suivi de sonnom (equelNom()) Remarquez que les donneacutees nom et preacutenom de la classe Etudiantsont priveacutees et qursquoil est donc neacutecessaire drsquoutiliser les meacutethodes drsquoaccegraves en consultation(quelPreacutenom() et quelNom()) pour connaicirctre le contenu de ces donneacutees Ces meacutethodesagrave inseacuterer dans le fichier Etudiantjava sont deacutecrites comme suit

public String quelNom() return nompublic String quelPreacutenom() return preacutenom

La creacuteation drsquoune cleacute peut eacutegalement ecirctre reacutealiseacutee simplement agrave partir des nom et preacutenomde lrsquoeacutetudiant stockeacutes non pas dans un objet Etudiant mais dans deux String distinctsLa meacutethode creacuteerUneCleacute() est alors surchargeacutee de la faccedilon suivante

private String creacuteerUneCleacute(String p String n) String tmp tmp = pcharAt(0)+ n return tmptoUpperCase()

Les deux meacutethodes creacuteerUneCleacute() agrave inseacuterer dans la classe Classe sont deacuteclareacutees enmode private car elles constituent un traitement interne propre au mode de stockage delrsquoinformation Lrsquoapplication et lrsquoutilisateur nrsquoont nullement besoin drsquoen connaicirctre lrsquoexis-tence pour creacuteer la liste des eacutetudiants drsquoune classe

Creacuteation du dictionnaire

Pour creacuteer le dictionnaire drsquoune classe drsquoeacutetudiants nous devons tout drsquoabord deacutefinir unobjet de type Hashtable puis stocker dans cet objet les eacutetudiants en les associant agrave leurcleacute Ces deux opeacuterations sont reacutealiseacutees dans le programme suivant

import javautilpublic class Classe private Hashtable listeClasseacutee public Classe() listeClasseacutee = new Hashtable() public void ajouteUnEtudiant() Etudiant nouveau = new Etudiant() String cleacute = creacuteerUneCleacute(nouveau)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

238

if (listeClasseacuteeget(cleacute)== null) listeClasseacuteeput(cleacute nouveau) else Systemoutprintln(Cet etudiant a deja ete saisi )

Ce programme est constitueacute des deux meacutethodes suivantes

bull Le constructeur Classe() qui fait appel au constructeur de la classe Hashtable afinde deacuteterminer lrsquoadresse du premier eacuteleacutement de la listeClasseacutee

bull ajouteUnEtudiant() qui place un eacuteleacutement dans le dictionnaire gracircce agrave la meacutethodeput(cleacute nouveau) qui ajoute lrsquoassociation cleacute-nouveau dans le dictionnairelisteClasseacutee Lrsquoobjet nouveau est de type Etudiant Il est creacuteeacute par lrsquointermeacutediaire duconstructeur Etudiant() et cleacute est aussi un objet de type String calculeacute agrave partir de lameacutethode creacuteerUneCleacute()

Lrsquoajout successif de deux associations ayant la mecircme cleacute a pour reacutesultat de deacutetruire lapremiegravere association Crsquoest pourquoi il convient de tester avant de placer le nouveleacutetudiant dans le dictionnaire si ce dernier nrsquoest pas deacutejagrave deacutefini dans la listeClasseacuteeCrsquoest ce que reacutealise le test suivant

if (listeClasseacuteeget(cleacute) == null) listeClasseacuteeput(cleacute nouveau)

En effet en testant le reacutesultat de la meacutethode get(cleacute) le programme recherche dansle dictionnaire srsquoil existe un eacutetudiant associeacute agrave la cleacute calculeacutee correspondant agravelrsquoeacutetudiant que lrsquoon souhaite inseacuterer dans la liste (nouveau) Si cette associationnrsquoexiste pas lrsquoeacuteleacutement retourneacute par la meacutethode est null et lrsquointerpreacuteteur ajoute lanouvelle association cleacutendashnouveau dans le dictionnaire Dans le cas contraire leprogramme affiche un message preacutecisant que lrsquoeacutetudiant existe deacutejagrave

Rechercher et supprimer un eacuteleacutement du dictionnaire

Une fois le dictionnaire reacutealiseacute les opeacuterations permettant la recherche ou la suppressiondrsquoun eacutetudiant sont deacutecrites par les meacutethodes suivantes agrave inseacuterer dans le fichierClassejava

public void rechercheUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute = null) eClasseacuteafficheUnEtudiant() else Systemoutprintln(p + + n + est inconnu ) public void supprimeUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute= null) listeClasseacuteeremove(cleacute) Systemoutprintln(p + + n + a ete supprime ) else Systemoutprintln(p + + n + est inconnu )

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

239

Ces meacutethodes fonctionnent toutes deux sur le mecircme modegravele Les nom et preacutenom delrsquoeacutetudiant agrave traiter sont fournis en paramegravetres des meacutethodes afin de calculer la cleacute drsquoasso-ciation Ensuite lrsquoeacutetudiant est rechercheacute dans la liste agrave partir de cette cleacute (get(cleacute))

Srsquoil est trouveacute il est soit afficheacute (eClasseacuteafficheUnEtudiant() pour la meacutethoderechercheUnEtudiant()) soit supprimeacute (listeClasseacuteeremove(cleacute) pour la meacutethodesupprimeUnEtudiant())

Afficher un dictionnaire

Pour afficher tous les eacuteleacutements drsquoun dictionnaire nous devons le parcourir eacuteleacutement pareacuteleacutement Il existe diffeacuterentes techniques pour reacutealiser ce parcours Nous vous en propo-sons une qui utilise un outil du langage Java deacutefini par la classe Enumeration

Une eacutenumeacuteration est un outil du package javautil qui facilite le parcours de listes dedonneacutees quelles qursquoelles soient Ainsi pour se deacuteplacer dans une eacutenumeacuteration drsquoobjetsil suffit drsquoutiliser les meacutethodes hasMoreElements() et nextElement() La premiegraveremeacutethode deacutetermine srsquoil existe encore des eacuteleacutements dans lrsquoeacutenumeacuteration tandis que laseconde permet lrsquoaccegraves agrave lrsquoeacuteleacutement suivant dans lrsquoeacutenumeacuteration

La meacutethode afficheLesEtudiants() utilise cette technique pour reacutealiser la parcours dela listeClasseacutee

public void afficheLesEtudiants() if(listeClasseacuteesize() = 0) Enumeration enumEtudiant = listeClasseacuteekeys() while (enumEtudianthasMoreElements()) String cleacute = (String) enumEtudiantnextElement() Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) eClasseacuteafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste)

Lrsquoeacutenumeacuteration est deacutefinie gracircce agrave la meacutethode keys() de la classe Hashtable qui renvoiesous forme drsquoeacutenumeacuteration la liste des cleacutes effectivement stockeacutees Le parcours de cetteeacutenumeacuteration est ensuite reacutealiseacute agrave lrsquoaide drsquoune boucle while testant srsquoil existe encore descleacutes dans la liste (enumEtudianthasMoreElements()) Si tel est le cas le programmepasse agrave lrsquoeacuteleacutement suivant dans la liste (enumEtudiantnextElement()) Il recherchealors lrsquoeacutetudiant associeacute agrave cette cleacute (listeClasseacuteeget(cleacute)) et lrsquoaffiche(eClasseacuteafficheUnEtudiant())

Exemple Lrsquoapplication GestionClasse

La gestion des eacutetudiants drsquoune classe est totalement acheveacutee en eacutecrivant lrsquoapplicationGestionClasse comme suit

public class GestionClasse public static void main (String [] argument) byte choix = 0 Classe C = new Classe()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

240

String preacutenom nom do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CsupprimeUnEtudiant(preacutenom nom) break case 3 CafficheLesEtudiants() break case 4 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CrechercheUnEtudiant(preacutenom nom) break case 5 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while ( choix = 5)

Chaque option du menu utilise une meacutethode de la classe Classe Ces options offrent lapossibiliteacute drsquoajouter de supprimer et de consulter tout ou partie du dictionnaire formeacuteau fur et agrave mesure des choix de lrsquoutilisateur Lrsquoexeacutecution de cette application peut avoirpar exemple pour reacutesultat agrave lrsquoeacutecran

1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant RREntrer le prenom de lrsquoetudiant SSyyllvvaaiinnCombien de notes pour lrsquoetudiant Sylvain R 2Entrer la note ndeg 1 1155Entrer la note ndeg 2 11441 Ajoute un etudiant2 Supprime un etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

241

3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant CCEntrer le prenom de lrsquoetudiant GGaaeelllleeCombien de notes pour lrsquoetudiant Gaelle C 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 11221 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche CCEntrer le nom de lrsquoeacutetudiant recherche GGaaeelllleeC Gaelle est inconnu 1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche GGaaeelllleeEntrer le nom de lrsquoeacutetudiant recherche CC Les notes de Gaelle C sont 160 120Sa moyenne vaut 1401 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 55

Lors du premier choix 4 lrsquoutilisateur a inverseacute les nom et preacutenom de lrsquoeacutetudiante La cleacutequi en deacutecoule nrsquoexiste pas dans le dictionnaire Le programme ne peut donc pasretrouver les informations concernant cette eacutetudiante

Ainsi gracircce aux objets de type Hashtable il est possible drsquoorganiser sans beaucoupdrsquoefforts de programmation des donneacutees de faccedilon agrave pouvoir rechercher modifier ousupprimer un eacuteleacutement dans une liste

Pourtant lrsquoapplication GestionClasse possegravede encore un inconveacutenient majeur elleperd la meacutemoirehellip En effet agrave chaque exeacutecution les donneacutees doivent de nouveau ecirctresaisies au clavier Les donneacutees stockeacutees dans la meacutemoire vive de lrsquoordinateur se perdentagrave lrsquoarrecirct du programme Pour corriger ce deacutefaut le programme doit pouvoir enregistrerles informations traiteacutees dans un fichier sur le disque dur Cet enregistrement desdonneacutees est aussi appeleacute archivage de donneacutees

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

242

Lrsquoarchivage de donneacuteesLa notion drsquoarchivage de donneacutees est tregraves importante puisque gracircce agrave elle les informa-tions traiteacutees sont stockeacutees sous forme de fichiers sur le disque dur Les informationsainsi stockeacutees perdent leur volatiliteacute et peuvent ecirctre reacuteutiliseacutees apregraves un arrecirct momentaneacutedu programme ou de lrsquoordinateur Pour archiver des donneacutees le langage Java utilise leconcept de flux ou en anglais stream

La notion de fluxLorsque nous communiquons des informations agrave lrsquoordinateur nous effectuons uneopeacuteration drsquoentreacutee (voir le Chapitre 2 laquo Communiquer une information raquo) Cettecommunication utilise un flux entrant qui est en quelque sorte la concreacutetisation infor-matique du courant eacutelectrique passant du clavier agrave la meacutemoire vive de lrsquoordinateurSymeacutetriquement il existe un flux sortant permettant de faire passer une informationstockeacutee en meacutemoire vive agrave lrsquoeacutecran de lrsquoordinateur

Dans le jargon informatique on dit que les flux reliant la meacutemoire vive agrave lrsquoeacutecran ou auclavier utilisent des flux standards drsquoentreacutee-sortie De faccedilon similaire il existe drsquoautrestypes de flux qui relient la meacutemoire vive non plus agrave lrsquoeacutecran ou au clavier mais au disquedur de lrsquoordinateur Ce sont les flux de fichiers

Ces flux sont aussi caracteacuteriseacutes par leur direction entrante ou sortante Un flux de fichiersortant est un flux drsquoeacutecriture qui reacutealise la creacuteation et lrsquoenregistrement de donneacutees dansun fichier Symeacutetriquement un flux de fichier entrant est un flux de lecture qui permetlrsquoinitialisation des variables ou objets du programme en meacutemoire vive gracircce aux valeurspreacuteceacutedemment enregistreacutees sur le disque dur

Ces flux sont deacutefinis agrave travers des objets preacutedeacutefinis du langage Java (package javaio)Il en existe un tregraves grand nombre offrant tous des outils permettant le stockage et le trai-tement de donneacutees sous diverses formes

Notre objectif nrsquoest pas de les deacutecrire tous mecircme succinctement mais de preacutesenterconcregravetement deux techniques drsquoarchivage afin drsquoen comprendre les diffeacuterents meacuteca-nismes Crsquoest pourquoi notre eacutetude porte sur les fichiers stockant lrsquoinformation sous laforme de caractegraveres (voir ci-dessous la section laquo Les fichiers textes raquo) ainsi que sur lesfichiers stockant des objets (voir la section laquo Les fichiers drsquoobjets raquo)

Les fichiers textesPuisqursquoil existe deux faccedilons drsquoacceacuteder agrave un fichier (lecture ou eacutecriture) les outilsproposeacutes par le langage Java reproduisent ces deux modes drsquoaccegraves Pour manipuler desfichiers nous devons donc deacuteclarer deux objets diffeacuterents qui vont nous permettre de lireou drsquoeacutecrire dans un fichier

Ainsi la deacuteclaration

BufferedWriter fW

deacutefinit un objet fW de type BufferedWriter utiliseacute pour eacutecrire (Writer) crsquoest-agrave-direenregistrer des donneacutees dans un fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

243

Par contre la deacuteclaration

BufferedReader fR

deacutefinit un objet fR de type BufferedReader utiliseacute pour lire (Reader) les donneacutees conte-nues dans un fichier afin de les placer dans des variables (en meacutemoire vive) Ces objetset les meacutethodes associeacutees sont deacutefinis dans le package javaio Il convient donc deplacer lrsquoinstruction import javaio en en-tecircte des classes qui font appel agrave cesoutils

Exemple Une classe pour lire et eacutecrire du texte

Lrsquoobjectif de cet exemple est de creacuteer une classe Fichier composeacutee drsquooutils simplifiantla manipulation des fichiers en lecture et en eacutecriture Les donneacutees de cette classe deacutefinis-sent deux objets de type BufferedWriter et BufferedReader et drsquoune variable de typechar qui meacutemorise le mode de traitement utiliseacute (lecture ou eacutecriture)

import javaiopublic class Fichier private BufferedWriter fW private BufferedReader fR private char mode

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouverturedu flux puis traitement des donneacutees parcourant le flux et pour finir fermeture du fluxChacune de ces eacutetapes est deacutecrite au cours des sections suivantes

Ouverture du flux

Pour eacutecrire ou lire dans un fichier il neacutecessaire avant tout drsquoouvrir le flux en indiquantsi ce flux est entrant (lecture) ou sortant (eacutecriture) La meacutethode ouvrir() deacutecrite ci-dessous reacutealise cette opeacuteration Elle doit ecirctre inseacutereacutee dans la classe Fichier

public void ouvrir(String nomDuFichier String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fR = new BufferedReader(new FileReader(new File(nomDuFichier))) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les deux points importants suivants sont agrave observer dans lrsquoen-tecircte de la meacutethodeouvrir()

bull Le premier concerne le terme throws IOException dont la preacutesence est obligatoirepour toutes les meacutethodes qui manipulent des opeacuterations drsquoentreacutee-sortie Succincte-ment cette clause indique au compilateur que la meacutethode ainsi deacutefinie est susceptiblede traiter ou de propager une eacuteventuelle erreur du type IOException qui pourraitapparaicirctre en cours drsquoexeacutecution

Vour plus de preacutecisions voir la section laquo Geacuterer les exceptions raquo en fin de chapitre copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

244

bull Le second point important est relatif aux informations transmises agrave la meacutethodeouvrir() Le premier paramegravetre speacutecifie le nom du fichier auquel est associeacute le fluxtandis que le second indique le mode drsquoouverture du flux (entrant ou sortant) Ce para-megravetre peut prendre diffeacuterentes valeurs telles que Ecriture E Write ou encoreW pour le mode sortant et Lecture L Read ou encore R pour le modeentrant Ces mots peuvent ecirctre eacutecrits indiffeacuteremment en majuscules ou en minusculesEn effet la variable drsquoinstance mode est initialiseacutee agrave partir du premier caractegravere(charAt(0)) du paramegravetre s et est automatiquement transformeacutee en majuscules(stoUpperCase())

Cela fait le flux est ouvert en lecture ou en eacutecriture en fonction de la variable drsquoinstancemode Ainsi

bull Si mode vaut L ou R lrsquoouverture du fichier est reacutealiseacutee en lecture gracircce agrave lrsquoinstruction

fR = new BufferedReader(new FileReader(new File(nomDuFichier)))

Cette instruction relativement deacuteconcertante pour le programmeur deacutebutant reacutealiseplusieurs opeacuterations afin de deacuteterminer ougrave se situe le deacutebut du fichier speacutecifieacute en para-megravetre

La premiegravere opeacuteration new File(nomDuFichier) permet drsquoobtenir une repreacutesentationlogique du fichier (existe-t-il ou non sur le disque dur ) Ensuite lrsquoappel au construc-teur FileReader() permet lrsquoouverture du fichier en lecture caractegravere par caractegravere Ilfournit en retour lrsquoadresse du deacutebut du fichier

Cependant ce mode de lecture nrsquoautorise pas la lecture de plusieurs caractegraveres agrave lafois Crsquoest pourquoi il est neacutecessaire de faire appel agrave un troisiegraveme constructeur Buffe-redReader() qui permet la lecture du fichier ligne par ligne Lrsquoadresse du deacutebut dufichier est alors meacutemoriseacutee gracircce au signe drsquoaffectation dans lrsquoobjet fR

bull Si mode vaut E ou W lrsquoouverture du fichier est reacutealiseacutee en eacutecriture gracircce agrave lrsquoinstruction

fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les opeacuterations reacutealiseacutees sont eacutequivalentes agrave celles deacutecrites ci-dessus en remplaccedilant lemode lecture par le mode eacutecriture Cependant

bull Si le fichier speacutecifieacute en paramegravetre nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alors lefichier est creacuteeacute et lrsquoadresse du deacutebut du fichier est stockeacutee dans lrsquoobjet fW

ndash Si le chemin drsquoaccegraves nrsquoest pas valide le fichier nrsquoest pas creacuteeacute et une erreur du typeFileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute Lrsquoadresse dudeacutebut du fichier est alors stockeacutee dans lrsquoobjet fW

Traitement du fichier

Une fois le fichier ouvert les traitements reacutealisables sur lui sont lrsquoeacutecriture et la lecture dedonneacutees dans le fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

245

bull Lrsquoeacutecriture dans un fichier est reacutealiseacutee par la meacutethode suivante

public void ecrire(int tmp) throws IOException String chaine = chaine = chainevalueOf(tmp) if (chaine = null) fWwrite(chaine0chainelength()) fWnewLine()

La meacutethode ecrire() prend en paramegravetre la valeur agrave enregistrer dans le fichierComme il srsquoagit drsquoun entier et que le fichier est un fichier texte la valeur stockeacutee danstmp est convertie en String gracircce agrave lrsquoinstruction chaine = chainevalueOf(tmp)

Ensuite lrsquoeacutecriture de cette chaicircne dans le fichier est reacutealiseacutee par lrsquoinstructionfWwrite(chaine 0 chainelength()) La meacutethode write() envoie dans le fluxfW la chaicircne speacutecifieacutee en premier paramegravetre Les deuxiegraveme et troisiegraveme paramegravetrespreacutecisent respectivement agrave partir de quel caractegravere (0) commence lrsquoeacutecriture dans lefichier et combien de caractegraveres (chainelength) sont eacutecrits Pour notre exemplelrsquointeacutegraliteacute de la chaine est eacutecrite dans le fichier

Pour finir la meacutethode newLine()envoie dans le flux fW un caractegravere permettant depasser agrave la ligne suivante du fichier

bull La lecture dans un fichier est deacutecrite par la meacutethode

public String lire() throws IOException String chaine = fRreadLine() return chaine

Lrsquoopeacuteration de lecture est reacutealiseacutee par la meacutethode readLine() qui envoie tout drsquoabordla ligne lue sur le flux fR puis passe automatiquement agrave la ligne suivante dans le fichierLa chaicircne de caractegraveres chaine reacutecupegravere alors la suite des caractegraveres lus Pour finir lachaicircne est retourneacutee agrave la meacutethode appelante

Fermeture du flux

Une fois que tous les traitements ont eacuteteacute reacutealiseacutes le flux peut ecirctre naturellement fermeacutegracircce agrave la meacutethode

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWclose()

Suivant le mode drsquoouverture speacutecifieacute par la variable drsquoinstance mode (initialiseacutee lors delrsquoexeacutecution de la meacutethode ouvrir()) le flux fR ou fW est fermeacute gracircce agrave la meacutethodeclose()

Exemple Lrsquoapplication GestionFichier

Lrsquoapplication suivante utilise les meacutethodes deacutecrites ci-dessus pour creacuteer et manipuler unfichier dont le nom est saisi au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

246

public class GestionFichier public static void main (String [] arg) throws IOException Fichier f = new Fichier() Systemoutprint( Entrer le nom du fichier ) String nomFichier = LireS() fouvrir(nomFichier Ecriture) for (int i = 0 i lt 5 i++) fecrire(i) ffermer()

fouvrir(nomFichierLecture) String chaine = do chaine = flire() if (chaine = null) Systemoutprintln(chaine) while (chaine = null) ffermer()

Lrsquoinstruction fouvrir(nomFichier Ecriture) ouvre le fichier nomFichier en eacutecri-ture afin drsquoy eacutecrire une suite de valeurs entiegraveres (fecrire(i)) comprises entre 0 et 4 Lefichier est fermeacute (ffermer()) apregraves exeacutecution de la boucle for

Pour veacuterifier que les opeacuterations drsquoeacutecriture se sont bien deacuterouleacutees le fichier est ouvert enlecture (fouvrir(nomFichierLecture)) et gracircce agrave une boucle dohellipwhile chaqueligne du fichier est lue par flire() et meacutemoriseacutee dans une variable chaine afin drsquoecirctreafficheacutee La lecture de ce fichier prend fin lorsqursquoune chaicircne null est deacutetecteacutee (while(chaine = null)) Le fichier peut alors ecirctre fermeacute (ffermer())

Lrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

Entrer le nom du fichier VVaalleeuurrssttxxtt

01234

Le fichier Valeurstxt est creacuteeacute dans le mecircme reacutepertoire que celui ougrave se trouve lrsquoappli-cation GestionFichierclass Comme il srsquoagit drsquoun fichier texte il peut ecirctre ouvert parnrsquoimporte quel eacutediteur de texte (WordPad sous Windows vi sous Unix ou encore Teach-Text sous Mac OS) Crsquoest lagrave un des inteacuterecircts des fichiers textes

Remarquez cependant que les donneacutees manipuleacutees par un programme ne se reacutesumentgeacuteneacuteralement pas agrave de simples valeurs entiegraveres Le plus souvent une application travailleavec des objets complexes mecirclant plusieurs types de donneacutees Crsquoest pourquoi il est inteacute-ressant de pouvoir archiver non pas la suite des donneacutees relatives agrave un objet ligne parligne mais lrsquoobjet lui-mecircme en tant que tel Cette technique est examineacutee agrave la sectionsuivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

247

Les fichiers drsquoobjetsLe langage Java propose des outils permettant le stockage ainsi que la lecture drsquoobjetsdans un fichier Ces outils font appel agrave des meacutecanismes appeleacutes meacutecanismes de seacuterialisa-tion Ils utilisent des flux speacutecifiques deacutefinis par les classes ObjectOutputStream etObjectInputStream du package javaio

La seacuterialisation des objets

Un objet est seacuterialiseacute afin de pouvoir ecirctre transporteacute sur un flux de fichier entrant ousortant Gracircce agrave cette technique un objet peut ecirctre directement stockeacute dans un fichier(eacutecriture) ou reconstruit agrave lrsquoidentique en meacutemoire vive par lecture du fichier

Les meacutecanismes de seacuterialisation-deacuteseacuterialisation sont fournis par lrsquointermeacutediaire desclasses ObjectOutputStream et ObjectInputStream gracircce aux meacutethodes writeOb-ject() (seacuterialisation) et readObject() (deacuteseacuterialisation) Ces outils sont applicables agravetous les objets preacutedeacutefinis du langage Java tels que les String les vecteurs (Vector) ouencore les dictionnaires (Hashtable)

Lorsque vous souhaitez seacuterialiser un objet dont le type est deacutefini par le programmeur ilest neacutecessaire de rendre cet objet seacuterialisable Pour cela il suffit drsquoindiquer au compila-teur que la classe autorise la seacuterialisation en utilisant la syntaxe suivante

public class Exemple implements Serializable Donneacutees et meacutethodes

De cette faccedilon tous les objets deacuteclareacutes de type Exemple peuvent ecirctre lus ou eacutecrits dansdes fichiers drsquoobjets Remarquez que lrsquoobjectif de la seacuterialisation est de placer dans unflux toutes les informations relatives agrave un objet Par conseacutequent seules les variablesdrsquoinstance sont prises en compte lors drsquoune seacuterialisation alors que les variables declasses (deacutefinies en static) ne peuvent ecirctre seacuterialiseacutees En effet une variable de classeest commune agrave tous les objets de lrsquoapplication et non pas speacutecifique drsquoun seul objet

Exemple Archiver une classe drsquoeacutetudiants

Pour bien comprendre comment utiliser ces outils drsquoarchivage drsquoobjets modifionslrsquoapplication GestionClasse de sorte qursquoelle puisse lire et stocker automatiquementlrsquoensemble des donneacutees du dictionnaire listeClasseacutee dans un fichier portant le nom deClassedat

Nous devons tout drsquoabord rendre seacuterialisable les objets que nous souhaitons sauvegarderCrsquoest pourquoi il convient de modifier les en-tecirctes des classes Etudiant et Classe de lafaccedilon suivante

public class Etudiant implements Serializable voir la section Les dictionnairespublic class Classe implements Serializable voir la section Les dictionnaires

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

248

Agrave deacutefaut vous obtenez une erreur drsquoexeacutecution du type NotSerializableExceptionindiquant que lrsquoobjet de type Etudiant ou Classe ne peut ecirctre seacuterialiseacute

Ensuite les opeacuterations drsquoarchivage drsquoobjets utilisent les mecircmes concepts que ceuxdeacutecrits agrave la section preacuteceacutedente agrave savoir ouverture du fichier puis lecture ou eacutecriture desobjets et pour finir fermeture du fichier Crsquoest pourquoi nous allons modifier la classeFichier pour y manipuler non plus des fichiers textes mais des fichiers drsquoobjets

import javaiopublic class FichierEtudiant private ObjectOutputStream ofW private ObjectInputStream ofR private String nomDuFichier = Classedat private char mode

Les donneacutees de la classe FichierEtudiant sont deux objets repreacutesentant des flux drsquoeacutecri-ture (ofW) de lecture (ofR) drsquoobjets ainsi qursquoun caractegravere (mode) repreacutesentant le typedrsquoouverture du fichier et une chaicircne de caractegraveres (nomDuFichier) ougrave se trouve meacutemo-riseacute le nom de fichier de sauvegarde des donneacutees (Classedat)

Ouverture du flux (entrant ou sortant)

public void ouvrir(String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) ofR = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) ofW = new ObjectOutputStream(new FileOutputStream(nomDuFichier))

Lrsquoouverture du fichier Classedat en lecture est reacutealiseacutee gracircce aux constructeurs desclasses FileInputStream et ObjectInputStream alors que lrsquoouverture en eacutecriture esteffectueacutee par les constructeurs ObjectOutputStream() et FileOutputStream() Enreacutesultat les flux ofW et ofR contiennent les adresses de deacutebut de fichier

Traitement du fichier

Lrsquoobjectif est drsquoarchiver lrsquoensemble des donneacutees relatives agrave une classe drsquoeacutetudiants Lameacutethode ecrire() prend en paramegravetre un objet tmp de type Classe de sorte que lrsquoinfor-mation lui soit transmise depuis lrsquoapplication GestionClasse Lrsquoobjet transmis est alorsarchiveacute gracircce agrave la meacutethode writeObject(tmp)

public void ecrire(Classe tmp) throws IOException if (tmp = null) ofWwriteObject(tmp)

Inversement la meacutethode lire() lit lrsquoobjet stockeacute dans le fichier Classedat et letransmet en retour agrave lrsquoapplication GestionClasse sous forme drsquoobjet de type ClasseLrsquoen-tecircte de la meacutethode a pour type le type Classe Lrsquoobjet retourneacute est lu gracircce agrave lameacutethode readObject()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

249

public Classe lire() throws IOException ClassNotFoundException Classe tmp = (Classe) ofRreadObject() return tmp

Observons que

bull La meacutethode lire() traite obligatoirement un nouveau type drsquoexception ClassNot-FoundException En effet la meacutethode readObject() transmet ce type drsquoexceptionlorsque le fichier lu ne contient pas drsquoobjet mais tout autre chose

Pour plus de preacutecisions sur la gestion des exceptions voir la section laquo Geacuterer les exceptions raquo en finde chapitre

bull La meacutethode readObject() lit sur le flux un objet quel que soit son type Il est doncneacutecessaire de speacutecifier par lrsquointermeacutediaire drsquoun laquo cast raquo le format de lrsquoobjet lu (voirau Chapitre 1 laquo Stocker une information raquo la section laquo La transformation de type raquo)Pour notre exemple lrsquoobjet lu est transmis agrave lrsquoobjet tmp par lrsquointermeacutediaire drsquoun cast(Classe) qui reacutealise la transformation de lrsquoobjet au bon format

Fermeture du flux

La fermeture drsquoun flux est reacutealiseacutee par la meacutethode close() de la mecircme faccedilon qursquoun fluxde fichier texte

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRoclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWoclose()

Exemple Lrsquoapplication GestionClasse

Lrsquoapplication GestionClasse a pour contrainte de reacutealiser les actions suivantes

bull Une lecture automatique du fichier laquo classedat raquo degraves lrsquoouverture du programme afindrsquoinitialiser lrsquoobjet C (type Classe) agrave la liste drsquoeacutetudiants saisie lors drsquoune preacuteceacutedenteexeacutecution

bull Une sauvegarde automatique dans le fichier laquo classedat raquo lorsque lrsquoutilisateurchoisit de sortir du programme

Ces deux contraintes sont reacutealiseacutees par lrsquoapplication suivante

import javaiopublic class GestionClasse public static void main (String [] argument) throws IOException ClassNotFoundException byte choix = 0 Classe C = new Classe() FichierEtudiant F = new FichierEtudiant() Fouvrir(Lecture) C = Flire() Ffermer() String preacutenom nom do

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

250

Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) pour les options 1 2 3 4 voir Exemple Creacuteer un dictionnaire drsquoeacutetudiants case 1 Ajoute un etudiant case 2 Supprime un etudiant case 3 Affiche les etudiants case 4 Affiche un etudiant case 5 Systemoutprintln(Sauvegarde des donnees dans

Classedat) Fouvrir(Ecriture) Fecrire(C) Ffermer() Systemexit(0) break default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 5) Fin de la classe GestionClasse

Lrsquoexeacutecution de cette application montre qursquoune difficulteacute subsiste En effet lors de latoute premiegravere exeacutecution du programme lrsquointerpreacuteteur affiche le message suivant

javaioFileNotFoundException Classedat (Le fichier speacutecifieacute est introuvable) at javaioFileInputStreamopen(Native Method) at javaioFileInputStreamltinitgt(FileInputStreamjava68) at FichierEtudiantouvrir(FichierEtudiantjava14) at GestionClassemain(Compiled Code)

Lrsquoerreur FileNotFoundException est transmise agrave la meacutethode main() via la meacutethodeFileInputStreamopen() gracircce agrave la clause throws IOException

En effet le fichier Classedat nrsquoexiste pas encore puisque crsquoest la premiegravere fois que leprogramme est exeacutecuteacute Lrsquooption 5 nrsquoa pu ecirctre exeacutecuteacutee et aucune sauvegarde nrsquoa donceacuteteacute reacutealiseacutee Tant que le programme ne peut ecirctre exeacutecuteacute dans son inteacutegraliteacute aucunfichier de sauvegarde ne peut ecirctre creacuteeacute

Pour contourner cet obstacle la solution consiste agrave empecirccher les erreurs de remonterdrsquoune meacutethode agrave lrsquoautre gracircce agrave la clause throws tout en geacuterant de faccedilon explicitechaque erreur qui pourrait survenir Cette solution est examineacutee agrave la section suivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

251

Geacuterer les exceptionsPlutocirct que de laisser lrsquoerreur se propager (avec la clause throws) le langage Java proposedes outils de capture des erreurs afin de les traiter directement agrave lrsquointeacuterieur des meacutethodessusceptibles de les deacutetecter Cette capture est reacutealiseacutee par lrsquointermeacutediaire des instructionstryhellipcatch

La meacutethode ouvrir()

Examinons le meacutecanisme de ces instructions sur la meacutethode ouvrir() proposeacutee agrave lasection preacuteceacutedente Comme observeacute preacuteceacutedemment cette meacutethode pose problegravemepuisqursquoelle propage lrsquoerreur FileNotFoundException lors de la toute premiegravere exeacutecutionde lrsquoapplication GestionClasse Pour eacuteviter cette propagation lrsquoideacutee est de placer lecouple drsquoinstructions tryhellipcatch de la faccedilon suivante

public boolean ouvrir(String s) try mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRo = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWo = new ObjectOutputStream(new FileOutputStream(nomDuFichier)) return true catch (IOException e) return false

La meacutethode srsquoexeacutecute alors de la faccedilon suivante comme expliqueacute ci-apregravesLes instructions qui composent le bloc try (en franccedilais essayer) sont exeacutecuteacutees

bull Si aucune erreur nrsquoest transmise par les diffeacuterents constructeurs qui reacutealisent lrsquoouver-ture du fichier le programme sort de la meacutethode ouvrir() en retournant un booleacuteende valeur eacutegale agrave true

bull Si une erreur est propageacutee par lrsquoun des constructeurs les instructions placeacutees dans lebloc catch (capture) sont exeacutecuteacutees agrave condition que lrsquoerreur deacutetecteacutee soit du mecircmetype que celui placeacute entre parenthegraveses derriegravere le terme catch Lrsquoerreur FileNotFoun-dException eacutetant du type IOException le programme sort de la meacutethode ouvrir()en retournant un booleacuteen de valeur eacutegale agrave false Aucun fichier nrsquoest donc ouvert

Puisque la meacutethode ouvrir() capture et traite elle-mecircme les erreurs eacuteventuelles la preacutesencede la clause throws devient inutile et elle nrsquoapparaicirct plus dans lrsquoen-tecircte de la meacutethode

Gracircce au traitement des erreurs en interne les instructions relatives agrave lrsquoouverture dufichier en lecture dans lrsquoapplication GestionClasse peuvent ecirctre modifieacutees de la faccedilonsuivante

FichierEtudiant F = new FichierEtudiant()if (Fouvrir(L)) C = Flire() Ffermer()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

252

Le fichier est ouvert gracircce agrave lrsquoinstruction Fouvrir() Si le reacutesultat de la meacutethode vauttrue cela signifie que le fichier classedat existe et est ouvert Les instructions delecture du fichier situeacutees dans le bloc if peuvent ecirctre exeacutecuteacutees Agrave lrsquoinverse si le reacutesultatvaut false aucune instruction nrsquoest exeacutecuteacutee Le menu permettant la saisie de nouveauxeacutetudiants peut alors ecirctre afficheacute

La meacutethode lire()

La meacutethode lire() est susceptible de lever plusieurs types drsquoexception via la meacutethodereadObject() En effet cette derniegravere est susceptible de deacutetecter des erreurs du typeIOException ou ClassNotFoundException

La capture de ces exceptions est reacutealiseacutee en deacutefinissant autant de blocs catch qursquoil y adrsquoerreurs deacutetecteacutees La meacutethode lire() traite ces erreurs de la faccedilon suivante

public Classe lire() try Classe tmp = (Classe) fRoreadObject() return tmp catch (IOException e) Systemoutprintln(nomDuFichier + Erreur de lecture ) catch (ClassNotFoundException e) Systemoutprintln(nomDuFichier + nrsquoest pas du bon format ) return null

Il est ainsi possible de deacutefinir deux blocs catch successifs parameacutetreacutes en fonction destypes drsquoerreurs susceptibles drsquoecirctre deacutetecteacutes Le programme reacuteagit diffeacuteremment suivantlrsquoerreur captureacutee

ReacutesumeacuteLa programmation dynamique permet la gestion drsquoun nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Pour ce faire le langage Java propose diffeacuterents outils tels que les objets de typeVector ou encore de type Hashtable

Les objets de type Vector autorisent la creacuteation drsquoune liste par ajout de donneacutees au furet agrave mesure des besoins de lrsquoutilisateur Les donneacutees sont en geacuteneacuteral enregistreacutees dansleur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteur permet de retrouver lrsquoinformation

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Pour ajouter un objet agrave la liste il suffit drsquoeacutecrire listeaddElement(objet) Il nrsquoestpas possible drsquoajouter une valeur autre qursquoun objet (telle que les variables de typeint par exemple)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

253

Lorsque que lrsquoobjet est inseacutereacute dans la liste la taille de cette derniegravere est augmenteacuteede un La meacutethode size() calcule le nombre drsquoeacuteleacutements dans la liste et la meacutethodeelementAt(indice) permet de retrouver lrsquoobjet stockeacute agrave lrsquoindice speacutecifieacute en para-megravetre

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placerlrsquoinstruction importjavautil en tecircte du fichier En effet si cette instructionfait deacutefaut le compilateur deacutetecte une erreur du type Class Vector not found

La recherche drsquoeacuteleacutements complexes dans une liste est plus rapide lorsque lesdonneacutees sont organiseacutees non plus par rapport agrave un indice mais par rapport agrave une cleacuteexplicite Les objets de type Hashtable proposent ce type drsquoorganisation desdonneacutees Pour cela il suffit de deacuteclarer une liste comme

Hashtable liste = new Hashtable ()

Les meacutethodes put(cleacute objet) et get(cleacute) permettent respectivement de placerdans la liste (dictionnaire) lrsquoassociation cleacutendashobjet et de retrouver lrsquoobjet associeacute agravela cleacute speacutecifieacutee en paramegravetre

Pour eacuteviter que les donneacutees stockeacutees en meacutemoire vive de lrsquoordinateur ne se perdentagrave lrsquoarrecirct de lrsquoapplication il est neacutecessaire de les archiver sous forme de fichiers sur ledisque dur Pour cela le langage Java utilise le concept de flux de fichier (en anglaisstream) qui est en quelque sorte la concreacutetisation informatique du courant eacutelec-trique passant de la meacutemoire vive au disque dur de lrsquoordinateur

Il existe diffeacuterents types de flux de fichiers

bull Drsquoune part les flux entrant pour lire les donneacutees sur le disque dur et les placer enmeacutemoire vive et les flux sortant qui eacutecrivent les donneacutees de la meacutemoire vive surle disque dur

bull Drsquoautre part les fichiers de type texte (BufferedWriter BufferedReader) qui nefont que manipuler des donneacutees de type String et les fichiers drsquoobjets (Objec-tOutputStream ObjectInputStream) qui manipulent tout type drsquoobjet

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouver-ture du flux traitement des donneacutees parcourant le flux puis fermeture du fluxLorsqursquoun fichier est ouvert en eacutecriture

bull Si le fichier nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alorsle fichier est creacuteeacute

ndash Si le chemin drsquoaccegraves nrsquoest pas valide alors le fichier nrsquoest pas creacuteeacute et uneerreur du type FileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute

Lorsqursquoune erreur est deacutetecteacutee par les meacutethodes associeacutees au flux le coupledrsquoinstructions tryhellipcatch permet la capture de lrsquoexception afin de lui associer untraitement speacutecifique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

254

ExercicesComprendre les vecteurs

Lrsquoobjectif est de stocker les notes drsquoun eacutetudiant sous la forme drsquoun vecteur

a Deacutefinissez un objet note de type Vector comme variable drsquoinstance de laclasse Etudiant

b Modifiez le constructeur de la classe Etudiant afin de saisir les notes et de lesplacer dans le vecteur

Prenez garde que seul un objet peut ecirctre stockeacute dans un vecteur Une note eacutetantde type double (type simple) ne peut pas ecirctre directement placeacutee dans levecteur Il est neacutecessaire de la transformer en objet de type Double Lrsquoappel auconstructeur de la classe Double permet cette transformation

Par exemple lrsquoinstruction new Double(Lired()) permet la transformationdirecte drsquoune valeur double saisie au clavier en un objet de type Double

c La meacutethode calculMoyenne() doit calculer la moyenne des notes agrave partir desnotes saisies dans le constructeur Le programme doit par conseacutequent parcourirlrsquoensemble du vecteur note afin drsquoen calculer la somme Puisque ces valeurssont stockeacutees sous la forme drsquoobjets Double il est neacutecessaire pour reacutealiser cecalcul de les transformer de nouveau en type simple double Pour cela ilconvient drsquoappliquer la meacutethode doubleValue() agrave lrsquoobjet de type Double

d Dans la meacutethode afficheUnEtudiant() modifiez lrsquoaffichage des notes enparcourant non plus le tableau mais le vecteur note

Comprendre les dictionnaires

Lrsquoobjectif est drsquoeacutecrire une meacutethode modifieUnEtudiant() qui modifie les notesdrsquoun eacutetudiant stockeacute dans un dictionnaire Cette meacutethode fonctionne dans lrsquoensem-ble comme la meacutethode ajouteUnEtudiant() (voir la section laquo Les dictionnaires raquode ce chapitre)

a Cependant la meacutethode doit connaicirctre les nom et preacutenom de lrsquoeacutetudiant agrave modifierCes donneacutees lui sont transmises par paramegravetre

b Ensuite connaissant les nom et preacutenom le programme calcule la cleacute et veacuterifie silrsquoeacutetudiant existe dans la liste

c Srsquoil existe la modification consiste agrave lui donner de nouvelles notes Pour celalrsquoideacutee est drsquoeacutecrire un deuxiegraveme constructeur Etudiant() dont les paramegravetressont les nom et preacutenom de lrsquoeacutetudiant Le corps du constructeur ne fait ensuite questocker dans les variables drsquoinstance approprieacutees les nom et preacutenom passeacutes enparamegravetres sans avoir agrave les ressaisir puis saisir les nouvelles notes et enfincalculer la moyenne

d Modifiez lrsquoapplication GestionClasse de faccedilon agrave inteacutegrer au menu cettenouvelle option

101

102

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

255

Geacuterer les erreursLrsquoobjectif est de capturer toutes les erreurs (IOException) possibles dans la classeFichierEtudiant deacutecrite au cours de ce chapitre

a Reprenez la classe FichierEtudiant et geacuterez la deacutetection des erreurs pour lesmeacutethode fermer() et ecrire() en deacutefinissant des blocs catch et try appro-prieacutes

b Lorsque toutes les meacutethodes de la classe FichierEtudiant gegraverent les excep-tions plus aucune clause throws ne doit apparaicirctre sur lrsquoen-tecircte des meacutethodes ycompris pour la meacutethode main() de lrsquoapplication GestionClasse Modifiezlrsquoapplication GestionClasse en tenant compte de cette remarque

Le projet laquo Gestion drsquoun compte bancaire raquoLes comptes sous forme de dictionnaireLa classe ListeCompte

En reprenant la classe Classe preacutesenteacutee au cours de ce chapitre eacutecrire la classeListeCompte dont la donneacutee est une liste de type Hashtable La classe ListeCompte estcomposeacutee des meacutethodes suivantes

a ListeCompte() qui fait appel au constructeur de la classe Hashtable

b ajouteUnCompte(String t) qui permet la creacuteation drsquoun compte courant joint oudrsquoeacutepargne Afin de faire appel au constructeur approprieacute (Compte() ou CpteEpar-gne()) faire passer en paramegravetre de la meacutethode ajouteUnCompte() une chaicircne decaractegraveres speacutecifiant le type du compte agrave creacuteer Par exemple lorsque le paramegravetre dela meacutethode vaut E un compte drsquoeacutepargne est creacuteeacute alors que srsquoil vaut A (commeAutre) un compte ordinaire est creacuteeacute

Lorsque le compte est creacuteeacute inseacuterez-le dans le dictionnaire en prenant comme cleacutedrsquoassociation son numeacutero de compte

c ajouteUneLigne() qui ajoute une ligne au compte dont le numeacutero est speacutecifieacute enparamegravetre de la meacutethode Pour cela faites appel agrave la meacutethode creacuteerLigne() de laclasse Compte

d Les meacutethodes rechercheUnCompte() supprimeUnCompte() et afficheLesComp-tes() sont agrave eacutecrire en srsquoinspirant des meacutethodes eacutequivalentes de la classe Classe

Lrsquoapplication Projet

Dans lrsquoapplication Projet deacuteclarer lrsquoobjet C comme eacutetant du type ListeCompte Puis

a Dans chaque option du menu faire appel aux meacutethodes de la classe ListeCompte

b Lors de lrsquoajout drsquoun compte ne pas omettre de speacutecifier en paramegravetre le type ducompte (A ou E)

c Ajouter lrsquooption de suppression drsquoun compte (option 5) et lrsquoaffichage de la liste detous les comptes (option 3) Modifier lrsquoaffichage du menu et le switch de faccedilon agravetenir compte de ces nouvelles options Remarquez qursquoil nrsquoest plus besoin de tester

103

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

256

lrsquoexistence du compte avant de lrsquoafficher ou de le supprimer puisque ce sont lesmeacutethodes de la classe ListeCompte qui srsquoen chargent directement

La sauvegarde des comptes bancaires

La classe FichierCompte

Pour sauvegarder les donneacutees saisies pour chaque compte reprendre la classe FichierE-tudiant deacutecrite dans ce chapitre

a Modifier le nom de la classe par FichierCompte et remplacer le nom du fichier desauvegarde par laquo Comptedat raquo

b Dans les meacutethodes lire() et ecrire() remplacer lrsquoobjet lu ou eacutecrit par un objet detype ListeCompte

c Ne pas oublier de rendre seacuterialisable lrsquoensemble des classes neacutecessaires agrave la cons-truction de la liste des comptes

Lrsquoapplication Projet

Modifier lrsquoapplication de faccedilon agrave

a lire le fichier laquo Comptedat raquo avant de proposer lrsquoajout la suppression ou lrsquoaffichagedes comptes

b reacutealiser une sauvegarde automatique agrave la sortie du programme (option 6)

La mise en place des dates dans les lignes comptables

Chaque ligne comptable est deacutefinie par un ensemble de donneacutees dont la date de reacutealisa-tion de lrsquoopeacuteration Pour lrsquoinstant cette date est saisie sous forme drsquoun String sansaucun controcircle sur le format reacuteellement saisi (jourmoisan) Lrsquoobjectif est drsquoeacutecrire unemeacutethode qui veacuterifie si les valeurs saisies correspondent au format demandeacute

Rechercher des meacutethodes dans les diffeacuterents packages

Pour effectuer ce controcircle le langage Java propose un certain nombre drsquooutils deacutefinisdans les packages du JDK En particulier il existe des outils qui transforment une chaicircnede caractegraveres en objet Date Cette transformation est reacutealiseacutee agrave partir drsquoun format deacutefinipar le programmeur

Pour trouver ces diffeacuterents outils les deux solutions suivantes sont possibles

a Soit rechercher dans lrsquoarborescence du JDK fourni avec le CD-Rom (jdk13docsapijava) tous les fichiers contenant le mot Date afin de deacuteterminer les diffeacuterentspackages concerneacutes par ce type drsquoinformation Puis pour tous les fichiers trouveacutesexaminer les diffeacuterentes meacutethodes proposeacutees de faccedilon agrave trouver celle susceptible dereacutepondre agrave votre attente

b Soit se connecter sur Internet par exemple agrave lrsquoadresse httpforum2javasuncomforum de faccedilon agrave y rechercher des exemples utilisant des objets de type Date

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

257

Eacutecrire la meacutethode controcircleDate()Lrsquoalgorithme permettant le controcircle du format de la date est le suivant

a Saisir une date comme une suite de caractegraveres (String)

b Traduire cette chaicircne en objet Date gracircce aux meacutethodes trouveacutees agrave lrsquoeacutetape preacuteceacute-dente

c Capturer les erreurs propageacutees par cette meacutethode afin drsquoincreacutementer un compteurdrsquoessai de saisie de la date

d Reacutepeacuteter ces deux derniers points tant que la date nrsquoest pas correctement traduite(lrsquoobjet date restant eacutegal agrave null) Au bout de trois essais la date est initialiseacutee agrave ladate courante du systegraveme de lrsquoordinateur

e En sortie de boucle la date correspond au format demandeacute Elle peut ecirctre traduite entype String pour ecirctre ensuite stockeacutee dans la donneacutee date de la classe LigneComp-table

copy copyright Eacuteditions Eyrolles

11Dessiner des objets

Le langage Java srsquoest surtout fait connaicirctre en proposant pour Internet des outils de deacuteve-loppement drsquoapplications graphiques multiplates-formes crsquoest-agrave-dire fonctionnant surdes ordinateurs de tout type Ces programmes sont exeacutecuteacutes agrave travers un navigateur Webde faccedilon transparente pour lrsquointernaute que lrsquoordinateur utiliseacute soit un Mac un PC ouune station Unix

Ces applications utilisent des composants graphiques deacutefinis dans la librairie graphiqueAWT (Abstract Windowing Toolkit) Dans ce chapitre nous eacutetudions drsquoabord agrave lasection laquo La librairie AWT raquo comment utiliser les outils de ce package Nous abordonsensuite agrave la section laquo Les eacuteveacutenements raquo la gestion des eacuteveacutenements en analysantcomment associer une action ou un comportement agrave un composant graphique Pourfinir nous construisons agrave la section laquo Les applets raquo une application directement exeacutecu-table par un navigateur Web

La librairie AWTLa librairie AWT est un package du JDK (Java Development Kit) qui propose unensemble drsquooutils de creacuteation drsquoapplications graphiques crsquoest-agrave-dire drsquoapplications dontle mode de communication avec lrsquoutilisateur srsquoeacutetablit agrave travers des eacuteleacutements graphiquestels que boutons menus fenecirctres etc

Notre objectif nrsquoest pas de deacutecrire lrsquointeacutegraliteacute de la librairie AWT mais de preacutesenter aulecteur un certain nombre drsquoexemples afin de lui donner une bonne vision de lrsquoutilisationde ces outils ainsi qursquoune certaine meacutethodologie Pour cela nous reprenons lrsquoexempledu sapin de Noeumll deacutecoreacute deacutecrit agrave la section laquo Les tableaux agrave deux dimensions raquo duchapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Cette fois le sapin nrsquoest plusafficheacute agrave lrsquoaide de simples caractegraveres mais avec des composants graphiques utilisant lesmeacutethodes preacutedeacutefinies de lalibrairie AWT

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

260

Les fenecirctresLrsquoaffichage drsquoun outil graphique quel qursquoil soit (bouton menu etc) est toujours reacutealiseacutedans une fenecirctre Toute application graphique srsquoexeacutecute agrave lrsquointeacuterieur drsquoune zone deacuteli-miteacutee appeleacutee fenecirctre principale dans laquelle sont placeacutes barres drsquooutils menus etzones de texte ou de dessin

Cette fenecirctre deacutelimite le cadre drsquoexeacutecution du programme et tout eacuteleacutement se situant endehors de la fenecirctre fait partie drsquoune autre application La fenecirctre possegravede un bord et unebarre de titre dans laquelle se situent des boutons de fermeture et de mise en icocircne oudrsquoagrandissement comme illustreacute agrave la Figure 11-1 Elle peut ecirctre deacuteplaceacutee ou agrandiesans que le programmeur ait agrave geacuterer lui-mecircme ces actions

En langage Java la fenecirctre principale est deacutefinie gracircce agrave la classe Frame Observez leprogramme suivant qui deacutecrit comment deacutefinir et afficher une Frame

Exemple Une fenecirctre

import javaawtclass Fenetre public final static int HT = 300 public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() FsetTitle(Une fenetre) met le titre FsetSize(HT LG) taille de la fenecirctre FsetBackground(Colorgray) Fshow() affiche la fenecirctre

Figure 11-1

La fenecirctre principale deacutelimite le lieu drsquoexeacutecution du programme Elle est constitueacutee drsquoune bordure et drsquoune barre de titre

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

261

Nous constatons tout drsquoabord que la toute premiegravere instruction drsquoun programme quiutilise des objets graphiques est obligatoirement une instruction drsquoimport du package dela librairie AWT (import javaawt ) En effet comme pour les vecteurs et lesdictionnaires les outils de la librairie graphique ne sont pas directement connus ducompilateur

Apregraves avoir deacutefini deux constantes HT et LG pour la hauteur et la largeur de la fenecirctre lafonction main() deacuteclare et construit un objet F de type Frame (Frame F = newFrame()) Comme toute classe la classe Frame propose un ensemble de meacutethodes quipermettent la transformation de ses caracteacuteristiques notamment les suivantes

bull setTitle() qui place la chaicircne de caractegraveres speacutecifieacutee en paramegravetre dans la barre detitre de la fenecirctre

bull setSize() qui deacutefinit la hauteur et la largeur de la fenecirctre

bull setBackground() qui donne une couleur de fond agrave la fenecirctre

Cela fait la fenecirctre est deacutefinie en meacutemoire mais nrsquoest pas encore afficheacutee agrave lrsquoeacutecran Pourreacutealiser cet affichage la meacutethode show() deacutefinie par la classe Frame est appliqueacutee agrave lrsquoobjet F

Pour connaicirctre en deacutetail lrsquoensemble des fonctionnaliteacutes de la classe Frame reportez-vousau fichier Cjdk13docsapijavaawtFramehtml apregraves installation du JDK et desa documentation

Exemple Reacutesultat de lrsquoexeacutecution

Lors de lrsquoexeacutecution de ce programme la fenecirctre ayant pour titre laquo Une fenetre raquo appa-raicirct agrave lrsquoeacutecran comme illustreacute agrave la Figure 11-1

Le dessinUne fois afficheacutee la fenecirctre nrsquoest pas encore directement fonctionnelle et il nrsquoest paspossible drsquoy afficher un dessin ou drsquoy eacutecrire un texte Il nrsquoest pas non plus possible defermer la fenecirctre en cliquant sur le bouton de fermeture situeacute dans la barre de titre

En effet lrsquoaffichage drsquoun dessin ne peut ecirctre reacutealiseacute que par lrsquointermeacutediaire drsquoun objet detype Canvas

En outre pour fermer la fenecirctre drsquoun simple clic sur le bouton approprieacute le programmedoit ecirctre capable drsquoentendre les clics de la souris Nous eacutetudions ce concept agrave la sectionlaquo Les eacuteveacutenements raquo en fin de chapitre

Exemple Dessiner un sapin de Noeumll

Lrsquoobjectif de cet exemple est de reacutealiser lrsquoaffichage drsquoun sapin deacutecoreacute en mode graphiqueFidegravele agrave la meacutethode de travail qui consiste agrave deacutecouper un problegraveme en plusieurs tacircchesindeacutependantes nous allons reacutealiser lrsquoaffichage du sapin de Noeumll eacutetape par eacutetape

Prenons pour hypothegravese qursquoun sapin est formeacute de triangles disposeacutes agrave lrsquoeacutecran de faccedilonque leur juxtaposition reacutealise une forme de sapin Nous placerons ensuite la deacutecorationdu sapin en modifiant la couleur de certains triangles

Nous devons concevoir dans un premier temps un programme qui dessine un simpletriangle de couleur verte

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

262

Dessiner un triangle

Pour cela nous deacutefinissons une classe Dessin qui heacuterite de la classe Canvas (classDessin extends Canvas) De cette faccedilon un objet de type Dessin correspond agrave unezone drsquoaffichage ougrave il est possible de dessiner des formes geacuteomeacutetriques (point droiterectangle etc) Examinons attentivement cette classe

import javaawtpublic class Dessin extends Canvas public Dessin() setBackground(Colorwhite) setForeground(Colorgreen) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) public void paint (Graphics g) new Triangle(g)

La classe Dessin est composeacutee des deux meacutethodes suivantes

bull Le constructeur Dessin() qui initialise une partie des caracteacuteristiques drsquoun objetCanvas agrave savoir

ndash La couleur de fond La meacutethode setBackground(Colorwhite) place la couleurblanche en fond de la zone de dessin (Canvas)

ndash La couleur drsquoavant-plan La meacutethode setForeground(Colorgreen) assigne lacouleur verte aux formes geacuteomeacutetriques dessineacutees dans la zone de dessin

ndash Le curseur La meacutethode setCursor(new Cursor(CursorCROSSHAIR_CURSOR))affiche un curseur en forme de croix lorsque le curseur de la souris se situe dans lazone de dessin

bull La meacutethode paint() qui est une meacutethode preacutedeacutefinie de la classe Canvas Cette meacutethodeest appeleacutee par lrsquointerpreacuteteur degraves qursquoil lui est neacutecessaire drsquoafficher un objet graphiqueElle est appeleacutee lors de lrsquoaffichage de la fenecirctre principale ou lorsque cette derniegravere reacuteap-paraicirct apregraves avoir eacuteteacute partiellement ou totalement cacheacutee par une autre fenecirctre

La meacutethode paint() utilise en paramegravetre un objet g de type Graphics de faccedilon agravedrsquoobtenir des informations sur le contexte graphique deacutefini par lrsquoapplication Le contextegraphique est lrsquoensemble des informations utiles agrave lrsquoaffichage drsquoun objet La couleur etla forme des caractegraveres (fonte) par exemple font partie du contexte graphique

Ainsi lorsque lrsquointerpreacuteteur affiche une fenecirctre il transmet agrave la meacutethode paint() parlrsquointermeacutediaire du paramegravetre g toutes les caracteacuteristiques de lrsquoaffichage En particulier il luitransmet sa couleur drsquoavant-plan initialiseacutee agrave colorgreen dans le constructeur Dessin()

Pour finir lrsquoexeacutecution de la meacutethode paint() reacutealise lrsquoaffichage du triangle gracircce agrave lrsquoappeldu constructeur de la classe Triangle (new Triangle(g)) dont voici la description

import javaawtpublic class Triangle private int centreX = FenetreLG2 private int centreY = FenetreHT2 private int [] xPoints = centreX centreX + 10 centreX - 10

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

263

private int [] yPoints = centreY - 10 centreY + 10 centreY + 10 int nPoints = 3 public Triangle(Graphics g) gfillPolygon(xPoints yPoints nPoints)

Les donneacutees de la classe Triangle correspondent agrave deux tableaux drsquoentiers deacutefinissantles sommets drsquoun triangle centreacute comme illustreacute agrave la Figure 11-2

Le sommet A est deacutefini par le couple de coordonneacutees (xPoints[0] yPoints[0]) lesommet B par (xPoints[1] yPoints[1]) et C par (xPoints[2] yPoints[2]) Lestableaux deacutefinissent ainsi les sommets drsquoun polygone (triangle) centreacute par rapport agrave lafenecirctre principale de lrsquoapplication Notez que les coordonneacutees des sommets sont deacutefiniespar rapport agrave lrsquoorigine de lrsquoobjet Canvas laquelle est situeacutee par deacutefaut dans le coin supeacute-rieur gauche de cet objet

Lrsquoaffichage du triangle est reacutealiseacute gracircce agrave la meacutethode fillPolygon(xPoints yPointsnPoints) qui remplit de couleur le polygone speacutecifieacute en paramegravetre La couleur deremplissage est deacutetermineacutee par lrsquointermeacutediaire de lrsquoobjet g sur lequel la meacutethode estappliqueacutee

Lrsquoapplication Fenetre

Sans modification de lrsquoapplication Fenetre telle que deacutefinie agrave la section preacuteceacutedente dece chapitre (voir laquo Les fenecirctres raquo) aucun triangle nrsquoapparaicirct En effet avant drsquoexeacutecuter leprogramme nous devons ajouter agrave la fenecirctre le composant Dessin de sorte que lrsquoappli-cation puisse associer lrsquoobjet de type Canvas agrave la Frame F

Figure 11-2

Le triangle est construit agrave partir des sommets A B et C dont les coordonneacutees sont calculeacutees par rapport agrave lrsquoorigine de la zone de dessin situeacutee en haut et agrave gauche

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

264

Pour cela il suffit drsquoajouter lrsquoinstruction Fadd(new dessin()) comme lrsquoillustre lrsquoextraitde programme suivant

class Fenetre hellip Frame F = new Frame() FsetTitle(Un triangle) hellip Fadd(new Dessin()) Fshow() affiche la fenecirctre

La meacutethode add() ajoute un composant graphique agrave la fenecirctre principale Ce composantest deacutefini par la classe Dessin Une fois F afficheacutee gracircce agrave la meacutethode show la meacutethodepaint() est exeacutecuteacutee automatiquement et le triangle srsquoaffiche

La construction du sapin

Sachant maintenant afficher un simple triangle nous pouvons construire le sapin par juxta-position drsquoun ensemble de triangles Pour reacutealiser le bon positionnement des trianglesutilisons la technique deacuteveloppeacutee agrave la section laquo Les tableaux agrave deux dimensions raquo duChapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Analysons la classe Arbre quireprend ce proceacutedeacute

import javaawtclass Arbre private int [][] sapin private Color deacutecoration public Arbre(int nl Color c) int nc = 2nl-1 deacutecoration = c sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int j = 0 j lt nl j++) for ( int i = -j i lt= j i++) sapin[j][milieu+i] = (int ) (5Mathrandom()+1) public void dessine(Graphics g) Color Vert = Colorgreen for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) switch(sapin[i][j]) case 1 new Triangle(i j g deacutecoration) break case 2 Vert = Vertbrighter() new Triangle(i j g Vert) break case 3 Vert = Vertdarker() new Triangle(i j g Vert) break

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

265

case 4 Vert = Vertbrighter() new Triangle(i j g Vert) break case 5 Vert = Vertdarker() new Triangle(i j g Vert) break case 6 Vert = Vertbrighter() new Triangle(i j g Vert) break

La classe Arbre est composeacutee de deux donneacutees le tableau drsquoentiers agrave deux dimensionssapin et la couleur deacutecoration Elle comporte en outre les deux meacutethodes suivantes

bull Le constructeur Arbre() qui initialise la couleur de la deacutecoration et le tableausapin qui utilise la mecircme technique que le sapin afficheacute en caractegraveres graphiques Lesparamegravetres du constructeur rendent possible la creacuteation de sapins de taille et decouleur diffeacuterentes

bull La meacutethode dessine() qui en parcourant le tableau sapin creacutee un triangle agrave lrsquoaide duconstructeur de la classe Triangle pour toute valeur sapin[i][j] diffeacuterente de 0Gracircce aux paramegravetres du nouveau constructeur Triangle() le triangle est afficheacute agravelrsquoeacutecran en fonction de sa position dans le tableau (indices i et j) et de la valeur dutableau (sapin[i][j]) Remarquez les meacutethodes darker() et brighter() quipermettent de foncer ou drsquoeacuteclaircir la couleur sur laquelle la meacutethode est appliqueacuteeGracircce agrave ces meacutethodes le sapin nrsquoapparaicirct pas drsquoun vert uniforme

Les paramegravetres du constructeur de la classe Triangle sont donc modifieacutes de faccedilon agrave neplus afficher un seul triangle vert au centre de la fenecirctre mais un triangle drsquoune couleuret drsquoune position donneacutees Pour reacutealiser cela le constructeur est deacutefini avec un ensemblede paramegravetres caracteacuterisant la position en x et y agrave lrsquoeacutecran ainsi que la couleur drsquoaffichagedu triangle Examinons cette modification dans la classe Triangle ci-dessous

import javaawtpublic class Triangle private int pX = FenetreLG2-50 private int pY = FenetreHT2-50 private int [] xPoints = 0 10 -10 private int [] yPoints = -10 10 10 private int nPoints = 3 public Triangle(int col int lig Graphics g Color c) for (int i = 0 i lt nPoints i++) xPoints[i] = xPoints[i]+(5lig) + pX yPoints[i] = yPoints[i]+(15col) + pY gsetColor(c) gfillPolygon(xPoints yPoints nPoints)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

266

Chaque triangle afficheacute ne se trouve plus au centre de la fenecirctre mais agrave une positionspeacutecifieacutee en paramegravetre Cette position est deacutetermineacutee par les eacuteleacutements suivants

bull un point de reacutefeacuterence (pX pY) deacutefini en fonction de la taille de la fenecirctre

bull la position (i j) du triangle dans le tableau sapin

Ces valeurs sont transmises au constructeur gracircce aux paramegravetres col et lig Ces valeurseacutetant connues les sommets du polygone sont calculeacutes de faccedilon agrave afficher ce dernier aubon endroit agrave lrsquoeacutecran Comme tous les triangles prennent un certain espace en hauteur eten largeur il est neacutecessaire drsquoappliquer un coefficient (5 et 10) aux indices lig et colpour que chaque triangle ne se superpose pas trop agrave ses voisins

Le dessin du sapin

Pour que le sapin construit en meacutemoire srsquoaffiche ce dernier doit ecirctre placeacute dans la fenecirctrede dessin Crsquoest ce que reacutealise la classe Dessin suivante

import javaawtpublic class Dessin extends Canvas private Color couleur = Colorgreen public final static Color couleurFond = Colorwhite private Arbre A public Dessin() setBackground(couleurFond) setForeground(couleur) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) A = new Arbre(8 Coloryellow) public void paint (Graphics g) Adessine(g)

Cette classe reprend en grande partie lrsquoarchitecture de la classe Dessin deacutecrite agrave lasection laquo Dessiner un triangle raquo au deacutebut de ce chapitre Pour remplacer le triangle parun sapin le constructeur Dessin() creacutee en meacutemoire un objet A de type Arbre Lameacutethode paint() appelle ensuite la meacutethode dessine() par lrsquointermeacutediaire de lrsquoobjet Apour lrsquoafficher agrave lrsquoeacutecran

Remarquez que lrsquoapplication Fenecirctre nrsquoest pas agrave modifier Lorsque lrsquoapplication estexeacutecuteacutee une fenecirctre srsquoaffiche avec son composant de type Dessin Ce dernier creacutee enmeacutemoire un objet A de type Arbre puis la meacutethode paint() est automatiquementappeleacutee par lrsquointerpreacuteteur Le sapin est alors afficheacute

Les eacuteleacutements de communication graphiqueOutre les composants drsquoaffichage tels que les Frame et les Canvas la librairie AWTpropose des outils de communication graphique comme les boutons et les menus

Ces outils offrent la possibiliteacute drsquoeacutecrire des applications munies drsquoune interfacegraphique reacuteellement interactive Lrsquoutilisateur manipule directement les objets proposeacutespar lrsquointerface et cette derniegravere reacuteagit en fonction des actions de lrsquoutilisateur Puisqursquoil

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

267

nrsquoest pas possible de savoir agrave lrsquoavance quel objet va ecirctre manipuleacute chaque composantdoit ecirctre programmeacute de faccedilon agrave reacuteagir directement aux manipulations de lrsquoutilisateurChaque manipulation est consideacutereacutee comme un eacuteveacutenement auquel est associeacute un traite-ment crsquoest-agrave-dire une action

Afin drsquoeacutetudier ces diffeacuterents concepts nous allons ameacuteliorer lrsquoapplication du sapin deNoeumll en y inseacuterant deux boutons un premier bouton pour afficher un sapin avec denouvelles deacutecorations et un second pour quitter lrsquoapplication

Les boutons

Les boutons sont les composants de communication les plus utiliseacutes pour creacuteer des inter-faces graphiques Gracircce agrave eux par un simple clic lrsquoutilisateur valide son souhait de voirreacutealiser le traitement proposeacute par le bouton

Les boutons sont deacutefinis dans la librairie AWT par la classe Button Pour afficher un boutonil suffit de lrsquoajouter agrave une fenecirctre comme nous lrsquoavons deacutejagrave fait pour dessiner un objetCanvas Examinons la classe Fenetre dans laquelle nous allons inseacuterer deux boutons

import javaawtclass Fenetre public final static int HT = 300public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() hellip Fadd(new Dessin()) Fadd(new Button(Nouveau)) Fadd(new Button(Quitter)) Fshow()

Dans cet exemple deux boutons portant les noms de laquo Quitter raquo et laquo Nouveau raquo sontajouteacutes agrave la fenecirctre F gracircce agrave la meacutethode add() Lorsque le programme est exeacutecuteacute lrsquoaffi-chage reacutesultant est celui illustreacute agrave la Figure 11-3

Figure 11-3

Les composants graphiques srsquoaffichent en se superposant les uns aux autres Crsquoest pourquoi le dernier bouton cache les autres composants

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

268

Chaque composant (Canvas et Button) est ajouteacute agrave la fenecirctre sans que soient speacutecifieacutes nisa position ni sa taille Dans cette situation lrsquointerpreacuteteur affiche les composants en lessuperposant dans leur ordre drsquoarriveacutee Le dernier bouton laquo Quitter raquo cache par conseacute-quent le composant Dessin ainsi que le bouton Nouveau

Les conteneurs

Pour corriger cette erreur il convient lorsque vous souhaitez afficher plusieurs composantsgraphiques de placer ces derniers agrave lrsquointeacuterieur drsquoun conteneur (en anglais container)

Un conteneur est une sorte de boicircte qui contient tous les eacuteleacutements de communicationutiliseacutes dans lrsquoapplication La plus part des boicirctes agrave outils proposeacutees dans les logicielsreacutecents sont des conteneurs Remarquez que seules les Frame ne peuvent ecirctre placeacuteesdans un conteneur

Un conteneur est deacutefini par la classe Panel du package javaawt Examinons commentlrsquoutiliser dans le programme suivant

import javaawtpublic class DesBoutons extends Panel public DesBoutons() initialisation setBackground(ColorlightGray) Les boutons Button bNouveau = new Button (Nouveau) thisadd(bNouveau) Button bQuitter = new Button (Quitter) thisadd(bQuitter)

La classe DesBoutons est deacutefinie comme classe heacuteritant de la classe Panel (DesBoutonsextends Panel) Elle est composeacutee drsquoun constructeur qui creacutee en meacutemoire deuxboutons bNouveau et bQuitter et les ajoute ensuite au conteneur gracircce agrave la meacutethodeadd() Par deacutefaut les boutons sont afficheacutes au centre du Panel par ordre drsquoarriveacutee

Remarquez lrsquoapplication du terme this aux meacutethodes add() Facultatif ce termeindique agrave lrsquointerpreacuteteur qursquoil doit ajouter ces objets (les boutons) agrave lrsquoobjet qursquoil est entrain de construire crsquoest-agrave-dire au Panel nommeacute DesBoutons Lrsquoexpression this repreacute-sente lrsquoobjet qui se construit en meacutemoire

Une fois deacutefini le conteneur doit ecirctre ajouteacute agrave la fenecirctre Pour eacuteviter toute superpositiondu conteneur agrave lrsquoobjet Canvas il est possible drsquoindiquer agrave lrsquointerpreacuteteur comment afficherles eacuteleacutements les uns par rapport aux autres Utilisons agrave cette fin les termes SouthNorth Center East et West en paramegravetre de la meacutethode add()

Le programme Fenetre ci-dessous utilise cette technique pour afficher correctement lesdeux boutons

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame()

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

269

Fadd(new Dessin() Center) Fadd(new DesBoutons() South) Fshow()

Gracircce aux paramegravetres Center et South les composants srsquoaffichent correctement lafenecirctre de dessin au-dessus de la boite agrave boutons comme illustreacute agrave la Figure 11-4

Notre application possegravede maintenant deux boutons Pourtant lorsque lrsquoutilisateurclique sur lrsquoun ou lrsquoautre de ces boutons rien ne se passe lrsquoaffichage de nouveauxsapins nrsquoest pas effectueacute et il nrsquoest pas non plus possible de quitter lrsquoapplication encliquant sur le bouton Quitter

Crsquoest qursquoil ne suffit pas drsquoafficher un bouton avec un texte correspondant agrave lrsquoaction souhaiteacuteepour voir cette action se reacutealiser La classe Button ne fait que deacutefinir les attributs graphiquesdes boutons Pour associer un bouton agrave une action il faut encore geacuterer les eacuteveacutenements

Les eacuteveacutenementsEn langage Java la gestion des eacuteveacutenements est reacutealiseacutee par lrsquointermeacutediaire drsquoobjetsspeacutecifiques appeleacutes eacutecouteurs (en anglais listener) De faccedilon simplifieacutee on peut direque lorsque lrsquoutilisateur clique sur un bouton ou sur une commande de menu le compo-sant concerneacute eacutemet un eacuteveacutenement agrave lrsquoattention de lrsquoeacutecouteur

Le traitement de cet eacuteveacutenement est reacutealiseacute par lrsquoeacutecouteur drsquoeacuteveacutenement (Eventlistener)et non pas par le composant lui-mecircme Le langage Java gegravere les eacuteveacutenements en suivantun modegravele dit laquo par deacuteleacutegation raquo (en anglais delegation model) le traitement de lrsquoeacuteveacutene-ment eacutetant deacuteleacutegueacute agrave un autre composant que celui qui lrsquoa perccedilu

Les types drsquoeacuteveacutenementsChaque composant graphique eacutemet un eacuteveacutenement propre agrave sa classe et il existe doncplusieurs types drsquoeacuteveacutenements On distingue les Eacuteveacutenements de bas niveau et les Eacuteveacutene-ments de haut niveau

Figure 11-4

Une fois la position des composants deacutefinie par rapport aux bords de la fenecirctre principale chaque composant srsquoaffiche correctement

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

270

Eacuteveacutenements de bas niveau

Les eacuteveacutenements de bas niveau sont les eacuteveacutenements creacuteeacutes agrave partir de la souris du clavierou drsquoune fenecirctre Le tableau suivant reacutesume les types drsquoeacuteveacutenements de bas niveau lesplus utiliseacutes

Pour geacuterer un eacuteveacutenement lieacute agrave la souris par exemple il convient de deacutefinir un eacutecouteurde type MouseListener et de deacutecrire le comportement de lrsquoapplication pour chaquemeacutethode associeacutee agrave cet eacutecouteur

Eacuteveacutenements de haut niveau

Les eacuteveacutenements de haut niveau sont lieacutes non plus aux comportements du composantgraphique mais agrave ses actions possibles Ainsi un clic de souris sur un bouton ne geacutenegravereplus un eacuteveacutenement speacutecifique du composant mais un comportement deacutefini par leprogrammeur

Eacutecouteur Comportement agrave programmer

MouseListener

Eacutecoute les eacuteveacutene-ments lieacutes agrave la souris

mousePressed(MouseEvent) Appeleacute lors drsquoune pression sur un bouton de la souris

mouseReleased(MouseEvent) Appeleacute lorsqursquoun bouton de la souris est relacirccheacute

mouseExited(MouseEvent) Appeleacute lorsque la souris sort de la fenecirctre

mouseEntered(MouseEvent) Appeleacute lorsque la souris entre dans la fenecirctre

mouseClicked(MouseEvent) Appeleacute lors drsquoun simple clic de souris

MouseMotionListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la souris lorsqursquoelle se deacuteplace

mouseDragged(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton enfonceacute

mouseMoved(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton relacirccheacute

WindowListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la fenecirctre

windowClosing(WindowEvent) Appeleacute lorsque la fenecirctre est en train de se fermer

windowClosed(WindowEvent) Appeleacute lorsque la fenecirctre est fermeacutee

windowOpened(WindowEvent) Appeleacute lors de lrsquoouverture de la fenecirc-tre

windowIconified(WindowEvent) Appeleacute lorsque la fenecirctre est mise sous forme drsquoicocircne

windowDeiconified(WindowEvent) Appeleacute lorsque lrsquoicocircne est agrandie agrave la taille de la fenecirctre

windowActived(WindowEvent) Appeleacute lorsque la fenecirctre est activeacutee et reccediloit les eacuteveacutenements du clavier

windowDeactived(WindowEvent) Appeleacute lorsque la fenecirctre est deacutesacti-veacutee et perd les eacuteveacutenements du clavier

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

271

Ainsi une action est associeacutee agrave un bouton en deacutefinissant un eacutecouteur drsquoaction qui parlrsquointermeacutediaire de la meacutethode actionPerformed reacutealise lrsquoaction souhaiteacutee

Exemple Associer un bouton agrave une actionLorsque lrsquoutilisateur clique sur les boutons Nouveau ou Quitter de lrsquoapplicationdeacuteveloppeacutee dans ce chapitre il souhaite voir se reacutealiser deux actions distinctes soitlrsquoaffichage drsquoun nouveau sapin soit la fermeture de la fenecirctre

Chaque clic de souris sur un bouton est associeacute agrave une action speacutecifique qui utilise uneacuteveacutenement de haut niveau Par conseacutequent chaque bouton doit ecirctre muni drsquoun eacutecouteurdrsquoaction Cela est reacutealiseacute dans la classe DesBoutons comme ci-dessous

import javaawtimport javaawteventpublic class DesBoutons extends Panel public DesBoutons(Dessin d) hellip Button bNouveau = new Button (Nouveau) Button bQuitter = new Button (Quitter) bNouveauaddActionListener(new GestionAction(1 d)) thisadd(bNouveau) bQuitteraddActionListener(new GestionAction(2 d)) thisadd(bQuitter)

Remarquez lrsquoinstruction drsquoimport (import javaawtevent) qui indique au compi-lateur le package ougrave sont deacutefinies les meacutethodes de gestion des eacuteveacutenements utiliseacutees dansla classe

La mise en place des eacutecouteurs drsquoactions est reacutealiseacutee gracircce agrave la meacutethode addAction-Listener()

Le constructeur GestionAction() placeacute en paramegravetre de la meacutethode addActionLis-tener() permet de preacuteciser quel comportement doit adopter lrsquoapplication en fonctiondu bouton qui eacutemet lrsquoeacuteveacutenement En effet les paramegravetres de ce constructeur transmettentagrave la fois une valeur entiegravere diffeacuterente (1 ou 2) suivant le bouton eacutemetteur (bNouveau oubQuitter) et lrsquoadresse de lrsquoobjet (d) sur lequel est dessineacute le sapin Examinons commentsont geacutereacutes ces paramegravetres dans la classe GestionAction

import javaawtimport javaawteventpublic class GestionAction implements ActionListener private int n private Dessin d

Eacutecouteur Comportement agrave programmer

ActionListenerEacutecoute les eacuteveacutenements drsquoaction

actionPerformed(ActionEvent) Appeleacute lorsqursquoune action est eacutemise

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

272

public GestionAction( int n Dessin d) thisn = n thisd = d public void actionPerformed(ActionEvent e) switch (n) case 1 dnouveau() break case 2 Systemexit(0) break

La classe GestionAction fait appel agrave plusieurs notions importantes deacuteveloppeacutees dansles sections qui suivent

Le terme implements

La classe GestionAction impleacutemente la classe ActionListener (GestionActionimplements ActionListener) elle nrsquoen heacuterite pas

En reacutealiteacute la classe ActionListener comme tous les autres listener nrsquoest pas veacuterita-blement une classe Il srsquoagit en fait drsquoune classe abstraite

Les meacutethodes deacutefinies par un listener ne peuvent pas ecirctre preacutedeacutefinies par le langageJava Une action crsquoest-agrave-dire un comportement associeacute agrave un bouton ne peut ecirctre deacutecriteque par le programmeur selon la faccedilon dont il conccediloit son application On dit alors quela classe ActionListener ainsi que tous les autres listener est une interface quideacutefinit simplement les diffeacuterents modes de comportement

Lorsqursquoune classe deacuterive drsquoune interface le terme implements doit ecirctre utiliseacute au lieu duterme extends

De plus lorsqursquoune classe impleacutemente une interface le compilateur Java exige dedeacutecrire lrsquointeacutegraliteacute des meacutethodes deacutefinies par lrsquointerface En effet dans le cas ougrave lrsquounedes meacutethodes nrsquoest pas deacutefinie le compilateur indique une erreur en preacutecisant le nom dela meacutethode manquante

Dans notre exemple lrsquointerface ActionListener ne deacutefinit qursquoune seule meacutethode(actionPerformed()) Nous nrsquoavons donc aucune difficulteacute agrave deacutecrire lrsquointeacutegraliteacute desmeacutethodes proposeacutees par cette interface

Le terme this

La classe GestionAction possegravede deux variables drsquoinstance n et d de faccedilon agrave meacutemoriserla valeur respective transmise par les boutons ainsi que lrsquoadresse de la zone graphiqueougrave le sapin est dessineacute Ces valeurs sont initialiseacutees par lrsquointermeacutediaire des paramegravetres duconstructeur GestionAction() qui sont eacutegalement nommeacutes n et d

Pour eacuteviter toute confusion entre les donneacutees de la classe et les paramegravetres du construc-teur il est neacutecessaire drsquoemployer le terme this Ce terme appliqueacute agrave n et d preacutecise aucompilateur qursquoil srsquoagit des variables de lrsquoinstance qui se construit Sans this lesmecircmes noms de variables correspondraient aux paramegravetres du constructeur

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

273

La meacutethode actionPerformed()

Une fois les donneacutees initialiseacutees la meacutethode actionPerformed() est automatiquementexeacutecuteacutee par lrsquointerpreacuteteur lorsqursquoune action est eacutemise par lrsquoun des boutons suite agrave unclic de lrsquoutilisateur Cette derniegravere reacutealise alors suivant la valeur transmise au construc-teur (1 ou 2) soit la sortie du programme soit lrsquoaffichage drsquoun nouveau sapin gracircce agrave lameacutethode nouveau() (agrave inseacuterer dans la classe Dessin) deacutecrite ci-dessous

public void nouveau() A = new Arbre(6 Colorred) repaint()

Agrave lrsquoexeacutecution de cette meacutethode lrsquoobjet A est recalculeacute agrave lrsquoaide du constructeur Arbre()Ensuite la meacutethode repaint() efface automatiquement la zone drsquoaffichage d sur laque-lle la meacutethode est appliqueacutee et appelle la meacutethode paint() deacutefinie dans la classe Dessin

La donneacutee Dessin d

Le bouton bNouveau a une incidence sur la zone de dessin puisqursquoun nouveau sapin doitecirctre afficheacute dans cette zone suite agrave un clic sur le bouton Cet effet est reacutealiseacute par le biaisde la meacutethode nouveau() appliqueacutee agrave lrsquoobjet d de type Dessin dans la meacutethodeactionPerformed() Lrsquoobjet d est deacuteclareacute comme variable drsquoinstance de la classeGestionAction Il contient lrsquoadresse de la zone drsquoaffichage creacuteeacutee dans lrsquoapplicationFenetre comme lrsquoillustre lrsquoextrait de programme suivant

public class Fenetre hellip public static void main(String [] arg) Frame F = new Frame() hellip Dessin page = new Dessin() Fadd(page Center) Fadd(new DesBoutons(page) South)

La construction de lrsquoobjet page a pour reacutesultat de stocker en meacutemoire lrsquoadresse ducomposant graphique de type Canvas Une fois cette adresse transmise au constructeurde la classe DesBoutons ce dernier peut transmettre agrave son tour lrsquoadresse de lrsquoobjet pageau constructeur de la classe GestionAction par lrsquointermeacutediaire du paramegravetre formel d detype Dessin Gracircce agrave la transmission de lrsquoadresse de la zone graphique en paramegravetre desconstructeurs les nouveaux sapins srsquoaffichent dans le composant graphique approprieacute

Exemple Fermer une fenecirctre Pour fermer une fenecirctre en cliquant directement sur lrsquoicocircne de fermeture de la fenecirctresitueacutee dans la barre de titre lrsquoeacuteveacutenement laquo clic sur le bouton de fermeture de la fenecirctre raquodoit ecirctre associeacute agrave lrsquoinstruction qui permet de stopper lrsquoexeacutecution du programmeComme le preacutecise le tableau de description des eacutecouteurs lrsquoeacuteveacutenement laquo clic sur lebouton de fermeture de la fenecirctre raquo est un eacuteveacutenement de bas niveau geacutereacute par lrsquoeacutecouteurWindowListener

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

274

En effet lorsque lrsquoutilisateur ferme la fenecirctre par lrsquointermeacutediaire de lrsquoicocircne approprieacutee cedernier eacutemet un eacuteveacutenement de fermeture de fenecirctre En recevant cet eacuteveacutenement lrsquoeacutecouteurdes eacuteveacutenements de fenecirctre (WindowListener) exeacutecute automatiquement la meacutethodewindowClosing()

Par conseacutequent le programme qui reacutealise la fermeture drsquoune fenecirctre doit effectuer lesdeux opeacuterations suivantes

bull placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre dans le composant graphique autoriseacute agraveecirctre fermeacute de la sorte

bull programmer la meacutethode windowClosing() en y inseacuterant lrsquoinstruction Systemexit(0)de faccedilon agrave sortir de lrsquoapplication

Placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre

Le premier point est reacutealiseacute dans la classe Fenetre de la faccedilon suivante

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame() hellip FaddWindowListener(new GestionFenetre()) Fshow()

Une fois la meacutethode addWindowListener() appliqueacutee agrave la fenecirctre F cette derniegravere est agravemecircme drsquoeacutecouter les eacuteveacutenements eacutemis par ses propres composants

Programmer la meacutethode windowClosing()

Le second point est reacutesolu gracircce agrave lrsquoappel du constructeur GestionFenetre() en para-megravetre de la meacutethode addWindowListener() ce dernier deacutefinissant le comportementadopteacute en face de lrsquoeacuteveacutenement entendu Examinons plus attentivement la classeGestionFenetre

import javaawteventpublic class GestionFenetre extends WindowAdapter public void windowClosing(WindowEvent e) Systemexit(0)

Remarquez que la classe GestionFenetre heacuterite de la classe WindowAdapter au lieudrsquoimpleacutementer lrsquointerface WindowListener

Lrsquoeacutecouteur WindowListener possegravede sept comportements speacutecifiques (voir preacuteceacutedem-ment le tableau des eacuteveacutenements de bas niveau) Si nous impleacutementons directement cetteinterface comme nous lrsquoavons fait pour ActionListener nous sommes contraints par lecompilateur Java agrave deacutefinir lrsquoensemble des sept comportements

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

275

Or pour fermer la fenecirctre un seul comportement est agrave retenir celui deacutefini par lameacutethode windowClosing() En utilisant un laquo Adapter raquo plutocirct qursquoun laquo Listener raquo nousnrsquoavons plus lrsquoobligation de deacutefinir lrsquointeacutegraliteacute des sept comportements mais unique-ment la ou les meacutethodes de votre choix Pour notre exemple seule la meacutethode window-Closing() nous inteacuteresse Crsquoest pourquoi elle seule est deacutecrite dans la classe Gestion-Fenetre

Ainsi lorsque lrsquoutilisateur clique sur lrsquoicocircne de fermeture de la fenecirctre un eacuteveacutenement defermeture de fenecirctre est eacutemis Lrsquoeacuteveacutenement est capteacute et traiteacute par lrsquoeacutecouteur WindowLis-tener qui exeacutecute automatiquement la meacutethode windowClosing() Celle-ci terminelrsquoexeacutecution de lrsquoapplication gracircce agrave lrsquoinstruction Systemexit(0)

Quelques principes

Lrsquoanalyse des exemples preacuteceacutedents montre que la gestion drsquoun eacuteveacutenement quel qursquoil soitpasse par les trois eacutetapes suivantes

bull Deacuteterminer le composant qui eacutemet lrsquoeacuteveacutenement et lui associer un eacutecouteur Cette asso-ciation est reacutealiseacutee par une meacutethode ayant pour nom addxxxListener() ougrave xxx repreacute-sente le composant eacutemetteur (Window Mouse etc)

bull Creacuteer une classe gestionDelEvenement qui impleacutemente lrsquointerface xxxListener(implements) ou deacuterive de la classe xxxAdapter (extends) selon que vous souhaitieztraiter tout ou partie des meacutethodes proposeacutees par lrsquoeacutecouteur

bull Deacutevelopper les meacutethodes souhaiteacutees crsquoest-agrave-dire deacutecrire les instructions composantles meacutethodes deacutefinies par lrsquointerface utiliseacutee

Les appletsLes applications deacuteveloppeacutees dans cet ouvrage sont jusqursquoagrave preacutesent des programmesexeacutecuteacutes directement sur le systegraveme drsquoexploitation de la machine par lrsquointerpreacuteteur JavaCes applications sont appeleacutees applications autonomes

Le langage Java offre la possibiliteacute de creacuteer des applications exeacutecutables par lrsquointermeacute-diaire drsquoun navigateur Web tel que Netscape ou Internet Explorer

Ces applications appeleacutees des applets raccourci des termes application et Internetsont exeacutecutables sur le reacuteseau Internet Une applet ne peut srsquoexeacutecuter qursquoau travers drsquounnavigateur et nrsquoest donc pas une application autonome

Le support drsquoexeacutecution drsquoun navigateur Web est la page HTML (HyperText MarkupLanguage) Crsquoest pourquoi une applet doit ecirctre inseacutereacutee dans une page HTML pour ecirctre lueet exeacutecuteacutee

Une page HTML

Une page HTML est un fichier texte constitueacute de balises (mots cleacutes) indiquant au navi-gateur la faccedilon dont il doit afficher le contenu de la page (mise en page) Lrsquoexemple quisuit deacutecrit le plus petit fichier utilisable pour exeacutecuter une applet Java

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

276

Exemple Lrsquoapplet defaulthtm

ltHTMLgt ltHEADgt ltTITLEgtUn sapin de NoelltTITLEgt ltHEADgt ltBODYgt ltAPPLET CODE=Fenetre WIDTH=300 HEIGHT=300gt ltAPPLETgt ltBODYgtltHTMLgt

Une page HTML est donc un fichier deacutebutant toujours par la balise ltHTMLgt et se termi-nant par sa balise inverse ltHTMLgt Elle est constitueacutee des deux grands blocs suivants

bull Lrsquoen-tecircte composeacute des balises ltHEADgt et ltHEADgt Dans votre exemple lrsquoen-tecirctepermet drsquoaffecter un titre agrave la page entre les balises ltTITLEgt et ltTITLEgt

bull Le corps deacutefini par les balises ltBODYgt et ltBODYgt qui deacutecrit le contenu de la pageLrsquoinsertion drsquoune applet est toujours effectueacutee dans le corps de la page Il suffitdrsquoutiliser pour cela la balise ltAPLLETgt composeacutee des trois paramegravetres CODE WIDTH etHEIGHT qui indiquent au navigateur le nom du fichier de lrsquoapplet agrave exeacutecuter ainsi quesa largeur et sa hauteur

Le fichier eacutecrit est sauvegardeacute sous un nom ayant lrsquoextension htm Par deacutefaut tous lesnavigateurs lisent les pages HTML portant le nom defaulthtm Par conseacutequent sauve-gardons la page HTML deacutecrite ci-dessus dans un fichier portant ce nom

Construire une appletUne applet diffegravere drsquoune application autonome par plusieurs aspects

bull La fonction main() disparaicirct pour ecirctre remplaceacutee par la meacutethode init()

bull La classe ougrave se situe la meacutethode init() heacuterite de la classe Applet

bull Le support drsquoaffichage des composants graphiques nrsquoest plus une Frame Le naviga-teur se charge drsquoafficher tous les composants graphiques Il possegravede eacutegalement unebarre de titre des bords et des boutons Lrsquoutilisation drsquoune Frame devient donc inutile

bull Lrsquoinstruction setTitle(Un sapin de Noel) est eacutegalement inutile puisque le titre dela fenecirctre est maintenant geacutereacute par la page HTML Il srsquoaffiche dans la barre de titre dunavigateur

Exemple Un sapin de Noeumll en applet

Lrsquoapplet Fenetre srsquoeacutecrit maintenant de la faccedilon suivante

import javaawtimport javaappletpublic class Fenetre extends Applet public final static int HT = 300 public final static int LG = 300 public void init() Dessin D setSize(HT LG)

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

277

setBackground(ColordarkGray) setLayout(new BorderLayout()) add(D = new Dessin() Center) add(new DesBoutons(D) South)

Notez lrsquoinstruction drsquoimport (import javaapplet) qui indique au compilateur ougravese trouve le package deacutefinissant les applets

Lrsquoapplet est afficheacutee par le navigateur qui exeacutecute en premier lieu la meacutethode init()tout comme lrsquointerpreacuteteur Java exeacutecute la fonction main() dans le cas drsquoune applicationJava autonome

Les instructions de la fonction init()sont exeacutecuteacutees ligne agrave ligne et le reacutesultat est eacutequi-valent dans la forme agrave lrsquoapplication deacutecrite preacuteceacutedemment Remarquons cependant que

bull Les meacutethodes ne sont pas appliqueacutees agrave un objet F de type Frame mais agrave lrsquoobjet qui esten train de se construire crsquoest-agrave-dire agrave lrsquoapplet elle-mecircme

bull Un BorderLayout est ajouteacute par lrsquointermeacutediaire de la meacutethode setLayout() La miseen page (en anglais layout) correspond agrave une strateacutegie drsquoaffichage des composantsgraphiques Par exemple pour un Panel ou une Applet la strateacutegie par deacutefaut est leFlowLayout crsquoest-agrave-dire lrsquoaffichage centreacute des composants dans leur ordre drsquoarriveacutee

Pour une Frame la strateacutegie drsquoaffichage est le BorderLayout qui permet lrsquoaffichage desobjets par rapport aux bords de lrsquoobjet Ces bords sont nommeacutes East North West etSouth Lrsquoajout drsquoun composant dans un objet dont la strateacutegie drsquoaffichage est le Border-Layout est reacutealiseacute en indiquant en paramegravetre le bord dont il doit srsquoapprocher le plusCrsquoest ce que nous avons reacutealiseacute sans le savoir dans lrsquoapplication Fenetre de la sectionpreacuteceacutedente

Lrsquoapplet par deacutefaut ne travaille pas avec un BorderLayout mais avec un FlowLayoutSans modification du gestionnaire de mise en page (Layout Manager) lrsquoapplet affiche lescomposants dans leur ordre drsquoarriveacutee soit drsquoabord la fenecirctre de dessin puis la boicircte agraveboutons en superposition enfin le sapin disparaissant sous les boutons

Gracircce agrave la mise en place du BorderLayout (setLayout(new BorderLayout())) lrsquoaffi-chage est corrigeacute et tous les eacuteleacutements se trouvent agrave leur place comme illustreacute agrave laFigure 11-5

Lrsquoutilitaire AppletViewer

Lrsquoexeacutecution drsquoune applet srsquoeffectue en geacuteneacuteral en chargeant la page HTML correspon-dante dans un navigateur Lrsquoaffichage srsquoexeacutecute automatiquement

Une solution plus rapide consiste cependant agrave faire appel agrave lrsquoutilitaire AppletViewerlivreacute avec le JDK AppletViewer exeacutecute une applet sans lrsquoenvironnement du navigateurPour lrsquoutiliser il suffit drsquoeacutecrire une ligne de commande dans une fenecirctre de commandesMS-DOS (environnement Windows) ou dans une fenecirctre de script (environnementUnix)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

278

Cette commande est la suivante

appletviewer defaulthtm

Lrsquoexeacutecution de cette commande a pour reacutesultat lrsquoaffichage de lrsquoapplet illustreacutee agrave laFigure 11-5

ReacutesumeacuteLrsquoessentiel des composants graphiques deacuteveloppeacutes par le langage Java est deacutefinidans la librairie AWT (Abstract Windowing Toolkit)

Le support principal drsquoaffichage drsquoune application graphique est la Frame Cettederniegravere est composeacutee des eacuteleacutements suivants

bull une barre de titre posseacutedant des boutons pour la fermeture lrsquoagrandissement et lamise en icocircne de la fenecirctre

bull des bords deacutelimitant la zone drsquoexeacutecution de lrsquoapplication

Pour dessiner ou afficher du texte dans une Frame il convient drsquoutiliser des objets detype Canvas ou TextArea Le contexte graphique deacutefinissant les attributs drsquoaffichagetels que la couleur le type de fonte etc est geacutereacute par la classe Graphics

Les interfaces graphiques sont construites agrave lrsquoaide des eacuteleacutements de communicationgraphique suivants

bull composants graphiques tels que boutons (Button) et menus

bull eacuteveacutenements associant par exemple un clic de souris sur un bouton agrave une action

On distingue les eacuteveacutenements de haut niveau (un clic est associeacute agrave une action) et leseacuteveacutenements de bas niveau (un clic sur un composant eacutemet un eacuteveacutenement propre agrave cecomposant)

Figure 11-5

Gracircce agrave lrsquoutilitaire AppletViewer il est possible drsquoafficher une applet en dehors de tout navigateur Web

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

279

ExercicesLrsquoobjectif de cet exercice est drsquoameacuteliorer le programme reacutealiseacute tout au long de cechapitre Lrsquointerface graphique agrave construire propose une case agrave cocher (en anglais checkbox) permettant de reacutepondre aux conditions suivantes

bull Si la case Taille fixe est cocheacutee les nouveaux sapins de taille constante sontdessineacutes avec une guirlande formeacutee de cercles de diffeacuterentes couleurs

bull Si la case nrsquoest pas cocheacutee les nouveaux sapins sont eacutegalement dessineacutes mais avecune taille variable

Pour construire cette application nous vous proposons de suivre les diffeacuterentes eacutetapesdeacutecrites ci-dessous

Comprendre les techniques drsquoaffichage graphiquePour afficher un sapin de taille diffeacuterente chaque fois que lrsquoutilisateur clique sur lebouton Nouveau

a Recherchez dans lrsquoensemble des classes de lrsquoapplication Fenetre la meacutethodeassocieacutee au clic sur le bouton Nouveau

b Modifiez cette meacutethode de faccedilon que lrsquoarbre se construise avec une taille aleacutea-toire variant entre 3 et 10 par exemple

Le langage Java propose en outre des composants graphiques speacutecifiques appeleacutesApplet (application sur Internet) deacutefinis dans le package javaapplet

Une applet nrsquoest pas exeacutecuteacutee par lrsquointerpreacuteteur Java mais par le navigateur agrave traversune page HTML (HyperText Markup Language) qui est un fichier texte constitueacute debalises (mots cleacutes) indiquant au navigateur comment il doit mettre en page les infor-mations contenues dans le fichier

Pour ecirctre exeacutecutable le programme deacutefinissant lrsquoapplet doit faire appel agrave la meacutethodeinit() en lieu et place de la fonction main()

Figure 11-6

Lrsquoapplication propose une case agrave cocher pour deacuteterminer si la taille des nouveaux sapins doit ecirctre fixe ou non

111

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

280

c Une fois ces modifications reacutealiseacutees compilez lrsquoapplication et veacuterifiez le bonfonctionnement du bouton Nouveau

Pour dessiner une guirlande de cercles de couleurs diffeacuterentes

a Avant drsquoafficher une guirlande modifiez les classes Triangle et Arbre de sorteque le sapin ne soit afficheacute qursquoagrave lrsquoaide de triangles verts Veacuterifiez lrsquoexeacutecution duprogramme

b Pour afficher une guirlande de couleur rouge creacuteez une classe Boule en vousinspirant de la classe Triangle

Notez que la meacutethode fillOval(x y l h) permet lrsquoaffichage de cerclesremplis Elle srsquoapplique agrave un objet Graphics comme la meacutethode fillPoly-gon() Les paramegravetres x et y repreacutesentent la position agrave lrsquoeacutecran du coin supeacuterieurgauche du rectangle englobant le cercle l et h repreacutesentant la largeur et lahauteur de ce mecircme rectangle

c Modifiez ensuite la meacutethode dessine() de la classe Arbre de faccedilon agrave construireet agrave afficher par-dessus le sapin des objets Boule lorsque le tableau sapin vaut 1

Compilez et exeacutecutez le programme afin de veacuterifier le bon affichage de la guir-lande

d Pour afficher une guirlande de couleurs diffeacuterentes deacutefinissez dans la classeBoule un tableau de plusieurs couleurs comme suit

Color [] couleur = Colorred Colorblue Coloryellow Colorcyan Colormagenta

Le choix de la couleur est ensuite effectueacute dans le constructeur de la classe Bouleen tirant au hasard une valeur comprise entre 0 et 5 Cette valeur est utiliseacuteecomme indice du tableau de couleurs pour initialiser la couleur drsquoaffichage(setColor()) agrave la couleur du tableau cor respondant agrave lrsquoindice tireacute au hasard

Apprendre agrave geacuterer les eacuteveacutenements

Placer une case agrave cocher dans la boicircte agrave boutons

a Sachant que la classe deacutecrivant les cases agrave cocher a pour nom Checkbox ajoutezun objet de ce type dans la boicircte agrave boutons de lrsquoapplication Fenecirctre Le texte(laquo Taille fixe raquo) suivant la case agrave cocher est placeacute en paramegravetre du construc-teur de la classe

b Lrsquoeacutecouteur drsquoeacuteveacutenement associeacute aux objets de type Checkbox srsquoappelantItemListener ajoutez cet eacutecouteur agrave la case agrave cocher

Associer lrsquoeacuteveacutenement agrave lrsquoaction Lorsque la case est cocheacutee les nouveaux sapinsafficheacutes par le bouton Nouveau sont de taille fixe Inversement lorsque la casenrsquoest pas cocheacutee les sapins sont de taille aleacuteatoire Lrsquoeacutetat de la case agrave cocher a doncune influence sur lrsquoaffichage du sapin geacutereacute par le bouton Nouveau Crsquoest pourquoiil est logique de geacuterer lrsquoeacutecouteur ItemListener dans la mecircme classe qursquoAction-Listener

112

113

114

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

281

a Sachant que lrsquointerface ItemListener ne deacutefinit qursquoun seul comportementitemStateChanged() modifiez lrsquoen-tecircte de la classe GestionAction de faccedilonqursquoelle impleacutemente les deux interfaces ActionListener et ItemListener enseacuteparant les deux termes par une virgule

b Analysez la meacutethode itemStateChanged() deacutecrite ci-dessous et deacuteterminezcomment deacuteclarer la variable OK pour qursquoelle puisse ecirctre eacutegalement visible delrsquoobjet bNouveau

public void itemStateChanged(ItemEvent e) if(egetStateChange() == ItemEventSELECTED) OK = false else OK = true

c Sachant que les sapins de taille aleacuteatoire sont afficheacutes par lrsquointermeacutediaire de lameacutethode nouveau() (classe Dessin) modifiez la meacutethode de faccedilon que la tailledu sapin soit fixe ou aleacuteatoire en fonction de la valeur de la variable OK

Le projet laquo Gestion drsquoun compte bancaire raquoLrsquoobjectif est de reacutealiser des statistiques sur les comptes bancaires enregistreacutes dans lesfichiers creacuteeacutes au chapitre preacuteceacutedent Le reacutesultat de ces statistiques est afficheacute dans unefenecirctre comme illustreacute agrave la Figure 11-7

Calcul de statistiquesLes classes ListeCompte et Compte

En reprenant la fonction pourcentage() reacutealiseacutee en exercice agrave la fin du Chapitre 5 laquo Delrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo et sachant que lrsquoobjectif est decalculer en pourcentage les deacutepenses reacutealiseacutees en fonction du motif de la deacutepense

a Deacuteterminer toutes les donneacutees deacutefinies dans les classes Compte et LigneComptableneacutecessaires aux calculs des statistiques drsquoun compte

Figure 11-7

Histogramme empileacute du compte ndeg 2552

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

282

b Veacuterifier que ces donneacutees soient accessibles depuis lrsquoexteacuterieur de la classe Si tel nrsquoestpas le cas eacutecrire les meacutethodes drsquoaccegraves en consultation pour chacune drsquoentre elles

c Apregraves modifications compiler et exeacutecuter le programme de faccedilon agrave creacuteer un fichierde comptes (Comptedat)

La meacutethode statParMotif()

a En reprenant lrsquoalgorithme de calcul de statistiques proposeacute en exemple du Chapi-tre 1 laquo Stocker un information raquo eacutecrire la meacutethode statParMotif() qui calcule lepourcentage des deacutepenses en fonction du motif enregistreacute

b Sachant que cette meacutethode est deacutefinie agrave lrsquointeacuterieur drsquoune classe appeleacutee Stat deacuteter-miner les variables drsquoinstance de cette classe

c Avant de passer agrave lrsquoaffichage graphique eacutecrire une application qui

bull lise le fichier laquo Comptedat raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente

bull utilise la meacutethode statParMotif() pour calculer et afficher agrave lrsquoeacutecran les statisti-ques drsquoun compte donneacute

d Veacuterifier la validiteacute des calculs reacutealiseacutes

Lrsquointerface graphiquePour calculer les statistiques drsquoun compte lrsquoutilisateur doit fournir le numeacutero du comptechoisi Apregraves lecture du fichier Comptedat et connaissant ce numeacutero lrsquoapplicationveacuterifie srsquoil existe en meacutemoire Si tel est le cas elle affiche dans une fenecirctre le reacutesultatsous forme drsquohistogrammes empileacutes Dans le cas contraire elle affiche un message indi-quant que ce compte nrsquoest pas connu et attend la saisie drsquoun nouveau numeacutero

Deux eacutetapes sont donc agrave reacutealiser la saisie drsquoun numeacutero de compte et lrsquoaffichage delrsquohistogramme

Lrsquoaffichage de lrsquohistogramme

Pour afficher lrsquohistogramme empileacute il est neacutecessaire de connaicirctre les pourcentages dedeacutepenses en fonction des motifs deacuteclareacutes Ces valeurs sont calculeacutees dans la classe Statconstruite preacuteceacutedemment

a En srsquoinspirant de la meacutethode dessine() preacutesenteacutee en exemple au cours de ce chapi-tre eacutecrire dans la classe Stat la meacutethode dessine() de faccedilon agrave afficher

bull un premier rectangle de hauteur 100 et de largeur 50 repreacutesentant lrsquouniteacute de creacutedit(100)

bull des rectangles de couleur et de hauteur diffeacuterentes suivant les pourcentages calcu-leacutes par la meacutethode statParMotif()

Noter que lrsquoaffichage drsquoun rectangle rempli srsquoeffectue par lrsquointermeacutediaire de lameacutethode fillRect(x y l h) ougrave x et y repreacutesentent la position agrave lrsquoeacutecran ducoin supeacuterieur gauche du rectangle et l et h sa largeur et sa hauteur Lrsquoaffichagedrsquoun texte est reacutealiseacute par la meacutethode drawString(texte x y) ougrave texte est unobjet de type String dans lequel sont placeacutes les caractegraveres agrave afficher x et y deacutefinis-sant la position de ce texte agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

283

b Deacutefinir une fenecirctre composeacutee drsquoune zone de dessin et drsquoun bouton Quitter

c Lrsquoaffichage de lrsquohistogramme eacutetant reacutealiseacute dans la zone de dessin

bull Le constructeur de la fenecirctre doit prendre en paramegravetre un objet de type Stat defaccedilon agrave le transmettre au constructeur de la zone de dessin

bull La meacutethode paint() deacutefinie dans la classe repreacutesentant la zone de dessin fait appelagrave la meacutethode sdessine() ougrave s est un objet de type Stat initialiseacute dans le cons-tructeur de la zone de dessin

d Le bouton Quitter et lrsquoicocircne de fermeture situeacutee dans la barre de titre de la fenecirctreayant la mecircme fonctionnaliteacute (quitter lrsquoapplication et fermer la fenecirctre)

bull Creacuteer une classe GestionQuitter qui impleacutemente lrsquoeacutecouteur ActionListener etdeacuterive de la classe WindowAdapter

bull Deacutefinir les meacutethodes correspondant au comportement de fermeture drsquoapplication

La saisie drsquoun numeacutero de compteLa classe Saisie deacutecrite ci-dessous permet la saisie drsquoune chaicircne de caractegraveres parlrsquointermeacutediaire drsquoune fenecirctre de saisie

import javaawtimport javaawteventpublic class Saisie implements ActionListener TextField reacuteponse public Saisie () Frame F = new Frame (Saisie de valeurs) FsetSize(300 50) FsetBackground(Colorwhite) FsetLayout(new BorderLayout()) Fadd (new Label(Valeur ) West) reacuteponse = new TextField(10) Fadd(reacuteponse East) reacuteponseaddActionListener(this) Fshow() public void actionPerformed(ActionEvent evt) String numeacutero = reacuteponsegetText() Systemoutprintln(numeacutero)poundpoundpound accent poundpoundpound

Observer et analyser cette classe et transformer la meacutethode actionPerformed() defaccedilon agrave calculer puis agrave afficher lrsquohistogramme cumuleacute si le numeacutero de compte lu dans lafenecirctre de saisie correspond agrave un compte enregistreacute dans le fichier Comptedat

copy copyright Eacuteditions Eyrolles

Contenu et exploitationdu CD-Rom

Le CD-Rom fourni avec cet ouvrage est composeacute de

bull Deux fichiers au format PDF

ndash outilsPDF

ndash corrigesPDF

bull Quatre dossiers (reacutepertoires)

ndash Java2

ndash Winzip

ndash Acrobat

ndash Sources

bull Un fichier Lirejava

Le fichier outilsPDF

ATTENTION Ce fichier est agrave lire avant drsquoinstaller le JDK et de compiler votrepremier programme Java

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) deacutecrit

bull comment installer le JDK

bull comment construire son propre environnement de travail

Vous y trouverez eacutegalement des adresses Internet depuis lesquelles vous pourrez teacuteleacute-charger des environnements de deacuteveloppement pour MacOS Unix ou Windows

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageCONTENU ET EXPLOITATION DU CD

286

Le fichier corrigesPDF

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) preacutesente pour chaquechapitre du livre

bull le reacutesumeacute

bull les exemples

bull le corrigeacute commenteacute et expliqueacute des exercices

bull le corrigeacute commenteacute et expliqueacute du projet

Le dossier Java2

Dans ce dossier sont placeacutes les programmes drsquoinstallation du JDK et sa documentationau format compresseacute

bull Pour installer le JDK lisez le fichier outilsPDF

bull Pour deacutecompresser la documentation utilisez lrsquoutilitaire Winzip

Le dossier Winzip

Dans ce dossier se trouve lrsquooutil drsquoinstallation de lrsquoapplication Winzip

bull Pour installer le logiciel et pour deacutecompresser la documentation Java lisez le fichieroutilsPDF

Le dossier Acrobat

Ce dossier contient lrsquooutil drsquoinstallation de lrsquoapplication Acrobat Reader Ce logicielvous permet de lire les fichiers au format PDF par exemple le fichier corrigesPDF quidonne les corrigeacutes des exercices et du projet

bull Pour installer cette application double-cliquez sur lrsquoicocircne drsquoinstallation situeacutee dans ledossier Acrobat et validez les requecirctes du programme drsquoinstallation

Le dossier Sources

Le dossier Source se compose de trois sous-reacutepertoires exemples exercices et projetCeux-ci contiennent respectivement douze sous-reacutepertoires un pour chacun des chapitres

introduction chapitre1 chapitre2 chapitre3 hellip chapitre11

Chacun de ces reacutepertoires contient les fichiers source des programmes correspondant

bull aux exemples Ainsi pour retrouver les programmes donneacutes en exemple au chapitre 1allez dans le reacutepertoire sourcesexempleschapitre1

bull aux exercices corrigeacutes Ainsi pour retrouver le programme de lrsquoexercice 2 du chapitre4 allez dans le reacutepertoire sourcesexerciceschapitre4

bull au projet Ainsi pour retrouver le corrigeacute du projet du chapitre 5 allez dans le reacuteper-toire sourcesprojetchapitre5

Le fichier Lirejava

Tregraves utiliseacute tout au long de lrsquoouvrage ce fichier est agrave copier sur votre disque dur Pourplus de preacutecision reportez-vous agrave la rubrique laquo Construire son propre environnement detravail raquo du fichier outilsPDF

copy copyright Eacuteditions Eyrolles

Index

A

Accegravesdonneacutees 165en consultation 186 213 237en modification 162 186meacutethode 165

Accesseur 186Accumulation 84 86 92 101Action 267Adresse 5 9 150 158 182Affectation 31 34 43Afficher 10Algorithme 1 4 20

parameacutetreacute 110 122Analyse descendante 2Applet 275

Layout 277AppletViewer 277Application 163

exemple 165 179 185 187multifichiers 166

Archivage 242Attribut 169

B

Binaire Voir Code Bloc 14

if-else 72 77instruction 63 81 109 129 132 144

boolean 27Bouton Voir Classe Buttonbreak 75 77

Voir switch byte 28 74 85 94

CCanvas exemple 262case Voir switch Case meacutemoire 5 9Cast 39 41 92 98 234 249

exemple 39catch 252

Voir Exception char 27 33 43class 17Classe 13

abstraite 272deacutefinir 159deacuteriveacutee 192super 192

Classe Appletexemple 276init() 277

Classe BufferedReader 243readLine() 245

Classe BufferedWriter 242close() 245newLine() 245write() 245

Classe Canvas 261exemple 266paint() 262setbackground() 262setCursor() 262setForeground() 262

Classe Checkbox 280Classe Color

brighter() 265darker() 265diffeacuterentes couleurs 280setColor() 265white 262

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

288

Classe DoubledoubleValue() 254

Classe Enumeration 239hasMoreElement 239nextElement 239

Classe Frame 261add() 264addWindowListener() 274setBackground() 261setSize() 261setTitle() 261show() 261

Classe Graphics 262drawString() 282fillOval() 280fillPolygon() 263fillrect() 282

Classe Hashtableget() 236 238keys() 239put() 236 238remove() 236 239size() 236

Classe IntegerparseInt() 94 95 211toString 98

Classe Lire 11 90b() s() i() l() 57f() d() S() c() 57

Classe Mathabs() 111ceil() 111cos() 110exemple 111exp() 111floor() 111log() 111max() 111min() 111PI 11pow() 58 111 114random() 103 111 113 223 264sin() 110sqrt() 58 78 111 113 115tan() 110

Classe ObjectInputStream 248close() 249readObject() 248

Classe ObjectOutputStream 248close() 249writeObject() 248

Classe Paneladd() 268addActionListener() 271exemple 268repaint() 273

Classe String 92 149charAt() 152 153 211 237compareTo() 154 156concat() 156 157endsWith() 152 153 154equals() 154equalsIgnoreCase() 154 156exemple 152 154 156indexOf() 152 153 154lastIndexOf() 152length() 156 157 245regionMatches() 154 156replace() 156startsWith() 152substring() 152 153toLowerCase() 156 157toUpperCase() 156 157 237valueOf() 245

Classe Systeminread() 54 90 92outprint() 10 49 50 56outprintln() 52 57 98err 50exit() 59 275

Classe TextField 283getText() 283

Classe Vectoradd() 232addElement() 232 233clear() 232elementAt() 232 234indexOf() 232 235lastIndexOf() 232remove() 232setElementAt() 232size() 232

Classe WindowAdapterwindowClosing() 274

Classpath 167Cleacute Voir Dictionnaire

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

289

Codebinaire 8 15pseudo 15 16 167 176 180source 14 102Unicode 53 97 98 99

Commandejava 16 17javac 16 17MS-DOS 17 209

Commentaires 12Compilateur 14 21Compilation multifichiers 166Comportement 161 169 183 212Comptage 84 101Concateacutenation 52 92Condition 66Constante 188Constructeur 214 217

exemple 190 191par deacutefaut 190 194surcharge 195

Conteneur Voir Classe Panel Controcircle des donneacutees

exemple 186

DDeacuteclaration

objet 163variables 9 10

default 75 77Voir switch

Dictionnaire 236Cleacute 236 241Exemple 239Exemple creacuteer un dictionnaire 237Exemple creacuteer une cleacute 237Exemple rechercher un eacuteleacutement 238Exemple supprimer un eacuteleacutement 238

dowhile 83 100 234choisir 99exemple 88syntaxe 83

Dos 17 50 53 99double 10 29 43 94 113

EEacutechanger 217

des objets 179des valeurs 34exemple 34

Encapsulation 183EntreacuteeSortie 7 49 56Erreur

Class not found 167 233else without if 70expected 121FileNotFoundException 244 250Identifier expected 122Incompatible type for = Explicit cast 39Incompatible type for method 114javalangArrayIndexOutOfBoundsException 207javalangNumberFormatException 94 95Methode not found in class 115no constructor matching 195NotSerializableException 248Undefined variable 131variable in class not accessible 195Variable is already defined 224variable is already defined in this method 118variable may not have been initialized 31Variable not accessible from class 185

Eacutetiquette 75 77 Voir switch Eacuteveacutenement 267

bas niveau 270haut niveau 270Voir Interface

EventListener 269Exception

ClassNotFoundException 249 252Exemple de capture 251IOException 243

Exempleaffectation 32calcul de statistiques 42cast 39Cercle controcircleacute 186Cercle et fonction 119Cercle objet 161 165Cercle proteacutegeacute 184Cercle simple 13Compter des cercles 176Compteur de monnaie 88Constructeur par deacutefaut 190Controcircle du rayon 189Deacuteclaration 31Deacuteclaration de tableaux 205Fonction

max() 121matheacutematique 111

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

290

Exemple (suite)Gestion dexception 251 252Heacuteritage 193La classe Arbre 264La classe Classe 213 233La classe DesBoutons 268 271La classe Dessin 262 266La classe Etudiant 212La classe Fenetre 260 267 276La classe GestionAction 271La classe GestionClasse 217 234 239 249La classe GestionFenetre 274La classe GestionFichier 245La classe String 152 154 156La classe Triangle 262 265Ligne de commande 210Lire au clavier 55Lire un entier 94Nombre de jours par mois 74Passage par valeur 139Quel code Unicode 98Reacutesultat dune fonction 140Trouver le plus grand nombre 69Un sapin en mode caractegravere 222Une page HTML 276Variable de classe 134Variable locale 132Visibiliteacute 131

extends 192 194 262 268exemple 193

FFenecirctre 260Fichier

dobjets 247exemple 245 249ouvrir 243texte 242

final 188float 29 94Flux 242

de fichier 242entrantsortant 242 243

Fonction 110appel 114corps 116deacutefinition 115en-tecircte 117

Fonction (suite)exemple 119 121 122main() 119nom 113 117paramegravetre 113 117 121 144reacutesultat 113 120 144sans paramegravetre 122sans reacutesultat 121type 118 123

Fonction main() 13 163en-tecircte 208

for 96 101 207choisir 100exemple 99imbrication 219 223syntaxe 96

Frame Exemple 260

HHashtable

Exemple 239syntaxe 236Voir Dictionnaire

Heacuteritage 192Hexadeacutecimale 29 98HTML 275

exemple 276

Ii-- 97i++ 97if-else 64 76

bloc 72choisir 76erreur 69exemple 69imbrication 70syntaxe 65

implements 272Serializable 247

import 261Increacutementation 34 86 96 101 176 178Indice Voir Tableau Initialisation 33 91Instance 164Instructions 5 6int 28 43 90

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

291

Interface 272ActionListener 271

actionPerformed() 271 272 273exemple 271

graphique 266ItemListener 280

itemStateChanged() 281MouseListener 270

mouseClicked() 270mouseEntered() 270mouseExited() 270mousePressed() 270mouseReleased() 270

MouseMotionListener 270mouseDragged() 270mouseMoved() 270

WindowListener 270 273exemple 274windowActived() 270windowClosed() 270windowClosing() 270 274windowDeactived() 270windowDeiconified() 270windowIconified() 270windowOpened() 270

Interpreacuteteur 15 21 167

Jjava 16 167

paramegravetre 209javac 166JDK 16 259JVM 15

LLayout

BorderLayout() 277FlowLayout() 277

length 221Voir Tableau

length() Voir Classe String Ligne de commande 209long 28 94

MMac OS 16 53 54 91 99 209

TeachText 246Meacutemoire centrale 5 21

Meacutethode 110 151dimpleacutementation 189invisible 189 213 216

exemple 189Lire 54

modulo 35

Nnew 163 194 204 214 219null 164 238 246

OObjet 164

deacutefinition 151Octet 27Opeacuterateur 43

ampamp || 67+ - 35logique 67 77prioriteacute 36relationnel 66 76

PPackage 233

javaapplet 277javaawt 261javaawtevent 271javaio 242javautil 233 239

Panelexemple 271Layout 277

Paramegravetre 108formel 118 139 141 179 273objet 181passage par reacutefeacuterence 178 183passage par valeur 138 140reacuteel 141effectif 118

PC 91polymorphisme 196Principe de fonctionnement

Applet 276dowhile 83fonction 113for 96Gestion dun eacuteveacutenement 275if-else 65if-else imbriqueacutes 70

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

292

Principe de fonctionnement (suite)ouvrir un fichier

en eacutecriture 244en lecture 244

page HTML 276switch 73tableau 205trycatch 251variable de classe 138while 90

Principe de notationobjet 159

Prioriteacute 44Programmation dynamique 231Proprieacuteteacute 169protected 195Protection des donneacutees

exemple 184private 184 189protected 184public 184

Pseudo-code Voir Code public 208

RReacutefeacuterence 151 158Relation est un 192 193Reacuteservation dun espace meacutemoire Voir new return 118 120 121 123 140 143

SSDK Voir JDKSeacuterialisation

Voir Fichier dobjets short 28 74static 135 162 176 208 247stream Voir Flux String 209Structure dun programme 13 129super 195 197 200Surcharge 191

de constructeur 195de meacutethodes 189 237

switch 72 74 77 87choisir 75exemple 74syntaxe 72

Syntaxe deacutefinition 8

TTableau 204

2 dimensions 218dobjets 214 225deacuteclaration 204 218 225exemple 207indice 207 219 221initialisation 207length 205 207 219taille 205 211

Tableau dobjetsexemple 213

Taille tableau 205this 192 268 272throws 250 251

Voir Exception Tri par extraction 215try Voir Exception Type 158

choisir 30conversion 38deacutefinition 26Integer 234objet 151 163simple 151structureacute 27 160 162

Type de donneacutees 7

UUnicode Voir Code Uniteacute centrale 5 21Unix 15 16 17 50 53 91 99 209 277

vi 246

VVariable

dinstance 164 177de classe 134 136 137 143 177deacuteclaration 30 32 130 203deacutefinition 25 43invisible 131locale 132 133 135 143static 135 176tableau deacutevolution 93 132 135 183 221veacuteritable nom 137

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

293

Vecteur Exemple 233 234Vector

syntaxe 232Voir Vecteur

Visibiliteacute 143void 121 123 208

Wwhile 89 91 101

choisir 99exemple 94syntaxe 89

Windows 16 17 53 99 209 277WordPad 246

copy copyright Eacuteditions Eyrolles

  • LE LIVRE DE JAVA PREMIER LANGAGE
  • AVANT-PROPOS ORGANISATION DE LOUVRAGE
  • TABLE DES MATIERES
  • INTRODUCTION NAISSANCE DUN PROGRAMME
  • PARTIE 1 LES OUTILS ET TECHNIQUES DE BASE
  • CHAPITRE 1 STOCKER UNE INFORMATION
  • CHAPITRE 2 COMMUNIQUER UNE INFORMATION
  • CHAPITRE 3 FAIRE DES CHOIX
  • CHAPITRE 4 FAIRE DES REPETITIONS
  • PARTIE 2 INITIATION A LA PROGRAMMATION ORIENTEE OBJET
  • CHAPITRE 5 DE LALGORITHME PARAMETRE A LECRITURE DE FONCTIONS
  • CHAPITRE 6 FONCTIONS NOTIONS AVANCEES
  • CHAPITRE 7 LES CLASSES ET LES OBJETS
  • CHAPITRE 8 LES PRINCIPES DU CONCEPT DOBJET
  • PARTIE 3 LES OUTILS ET TECHNIQUES ORIENTES OBJET
  • CHAPITRE 9 COLLECTIONNER UN NOMBRE FIXE DOBJETS
  • CHAPITRE 10 COLLECTIONNER UN NOMBRE INDETERMINE DOBJETS
  • CHAPITRE 11 DESSINER DES OBJETS
  • CONTENU ET EXPLOITATION DU CD-ROM
  • INDEX
Page 3: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen

CHEZ LE MEcircME EacuteDITEUR

DANS LA MEcircME COLLECTION

C DELANNOY ndash Le livre du C premier langage Pour les deacutebutants en programmation Ndeg8838 1994 280 pages

P CHALEacuteAT D CHARNAY ndash Programmation HTML et JavaScript Ndeg9182 1998 460 pages

C DELANNOY ndash Programmer en langage C Avec exercices corrigeacutesNdeg8985 1996 296 pages

C DELANNOY ndash La reacutefeacuterence du C norme ANSIISO Ndeg9036 1998 950 pages

C DELANNOY ndash Programmer en langage C++Ndeg9138 5e eacutedition 2000 648 pages

C DELANNOY ndash Apprendre le C++ avec Visual C++ 6Ndeg9088 1999 496 pages

C DELANNOY ndash Exercices en langage C++ Ndeg9067 2e eacutedition 1999 296 pages

C DELANNOY ndash Programmer en Turbo Pascal 70Ndeg8986 1993-1997 368 pages

PROGRAMMATION INTERNET

A PATZER et al ndash Programmation Java cocircteacute serveur Servlets JSP et EJB Ndeg9109 2000 984 pages

P CHAN ndash Le dictionnaire officiel Java 2 Ndeg9089 1999 890 pages

N MCFARLANE ndash JavaScript professionnelNdeg9141 2000 950 pages

J-C BERNADAC F KNAB ndash Construire une application XML Ndeg9081 1999 500 pages

A HOMER D SUSSMAN B FRANCIS ndash ASP 30 professionnel Ndeg9151 2000 1 150 pages

L LACROIX N LEPRINCE C BOGGERO C LAUER ndash Programmation Web avec PHP Ndeg9113 2000 382 pages

Anne Tasso

Le livre deJavapremier langage

EacuteDITIONS EYROLLES61 Bld Saint-Germain75240 Paris Cedex 05

wwweditions-eyrollescom

Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effetexpresseacutement la photocopie agrave usage collectif sans autorisation des ayantsdroit Or cette pratique sest geacuteneacuteraliseacutee notamment dans les eacutetablissementsdenseignement provoquant une baisse brutale des achats de livres au pointque la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et deles faire eacutediter correctement est aujourdhui menaceacutee

En application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou par-tiellement le preacutesent ouvrage sur quelque support que ce soit sans autorisation de lEacutedi-teur ou du Centre Franccedilais dexploitation du droit de Copie 20 rue des Grands Augustins75006 Pariscopy Eacuteditions Eyrolles 2001 Version eBook (ISBN) de louvrage 2-212-28032-7

DANGER

LEPHOTOCOPILLAGE

TUE LE LIVRE

Sun Sun Microsystems le logo Sun Java JDK sont des marques de fabriqueou des marques deacuteposeacutees de Sun Microsystems Inc

AVANT-PROPOS

Organisation de lrsquoouvrage

Ce livre est tout particuliegraverement destineacute aux deacutebutants qui souhaitent aborder lrsquoappren-tissage de la programmation en utilisant le langage Java comme premier langage

Les concepts fondamentaux de la programmation y sont preacutesenteacutes de faccedilon eacutevolutivegracircce agrave un deacutecoupage de lrsquoouvrage en trois parties chacune couvrant un aspect diffeacuterentdes outils et techniques de programmation

Le chapitre introductif laquo Naissance drsquoun programme raquo constitue le preacutealable neacutecessaireagrave la bonne compreacutehension des parties suivantes Il introduit aux meacutecanismes de cons-truction drsquoun algorithme compte tenu du fonctionnement interne de lrsquoordinateur etexplique les notions de langage informatique de compilation et drsquoexeacutecution agrave travers unexemple de programme eacutecrit en Java

La premiegravere partie concerne lrsquoeacutetude des laquo Outils et techniques de base raquo

bull Le chapitre 1 laquo Stocker une information raquo aborde la notion de variables et detypes Il preacutesente comment stocker une donneacutee en meacutemoire calculer des expressionsmatheacutematiques ou eacutechanger deux valeurs et montre comment le type drsquoune variablepeut influencer sur le reacutesultat drsquoun calcul

bull Le chapitre 2 laquo Communiquer une information raquo explique comment transmettre desvaleurs agrave lrsquoordinateur par lrsquointermeacutediaire du clavier et montre comment lrsquoordinateurfournit des reacutesultats en affichant des messages agrave lrsquoeacutecran

bull Le chapitre 3 laquo Faire des choix raquo examine comment tester des valeurs et prendre desdeacutecisions en fonction du reacutesultat Il traite de la comparaison de valeurs ainsi que delrsquoarborescence de choix

bull Le chapitre 4 laquo Faire des reacutepeacutetitions raquo est consacreacute agrave lrsquoeacutetude des outils de reacutepeacutetition etdrsquoiteacuteration Il aborde les notions drsquoincreacutementation et drsquoaccumulation de valeurs(compter et faire la somme drsquoune collection de valeurs)

La deuxiegraveme partie laquo Initiation agrave la programmation orienteacutee objet raquo introduit lesconcepts fondamentaux indispensables agrave la programmation objet

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageAVANT-PROPOS

VI

bull Le chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo montre lrsquointeacuterecirctde lrsquoemploi de fonctions dans la programmation Il examine les diffeacuterentes eacutetapes deleur creacuteation

bull Le chapitre 6 laquo Fonctions notions avanceacutees raquo deacutecrit tregraves preacuteciseacutement comment mani-puler les fonctions et leurs paramegravetres Il deacutefinit les termes de variable locale et declasse et explique le passage de paramegravetres par valeur

bull Le chapitre 7 laquo Les classes et les objets raquo explique agrave partir de lrsquoeacutetude de la classeString ce que sont les classes et les objets dans le langage Java Il montre ensuitecomment deacutefinir de nouvelles classes et construire des objets propres agrave lrsquoapplicationdeacuteveloppeacutee

bull Le chapitre 8 laquo Les principes du concept drsquoobjet raquo deacuteveloppe plus particuliegraverementcomment les objets se communiquent lrsquoinformation en expliquant notamment le prin-cipe du passage de paramegravetres par reacutefeacuterence Il deacutecrit ensuite les principes fondateursde la notion drsquoobjet crsquoest-agrave-dire lrsquoencapsulation des donneacutees (protection et controcircledes donneacutees constructeur de classe) ainsi que lrsquoheacuteritage entre classes

La troisiegraveme partie laquo Outils et techniques orienteacutes objet raquo donne tous les deacutetails surlrsquoorganisation le traitement et lrsquoexploitation intelligente des objets

bull Le chapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo concerne lrsquoorganisation desdonneacutees sous la forme drsquoun tableau de taille fixe

bull Le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo preacutesente les diffeacute-rents outils qui permettent drsquoorganiser dynamiquement en meacutemoire les ensembles dedonneacutees de mecircme nature Il est eacutegalement consacreacute aux diffeacuterentes techniquesdrsquoarchivage et agrave la faccedilon drsquoacceacuteder aux informations stockeacutees sous forme de fichiers

bull Le chapitre 11 laquo Dessiner des objets raquo couvre une grande partie des outils graphiquesproposeacutes par le langage Java Il analyse le concept eacuteveacutenement-action et deacutecritcomment reacutealiser une applet

Ce livre contient eacutegalement en annexe

bull Un guide drsquoutilisation du CD-Rom expliquant comment utiliser les outils proposeacutesdans le CD-Rom

bull Un index qui vous aidera agrave retrouver une information sur un thegraveme que vous recher-chiez (les mots-cleacutes du langage les exemples les principes de fonctionnement lesclasses et leurs meacutethodes etc)

copy copyright Eacuteditions Eyrolles

Table des matiegraveres

Avant-propos organisation de lrsquoouvrage V

Introduction naissance drsquoun programme 1

Construire un algorithme 1

Exemple lrsquoalgorithme du cafeacute chaud 2Vers une meacutethode 4

Passer de lrsquoalgorithme au programme 4

Qursquoest-ce qursquoun ordinateur 4Un premier programme en Java ou comment parler agrave un ordinateur 9

Exeacutecuter un programme 14

Compiler ou traduire en langage machine 14Compiler un programme eacutecrit en Java 15Les environnements de deacuteveloppement 17

Le projet laquo Gestion drsquoun compte bancaire raquo 17

Cahier des charges 18Les objets manipuleacutes 19La liste des ordres 20

Reacutesumeacute 20

Exercices 21

Apprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes 21Observer et comprendre la structure drsquoun programme Java 21Eacutecrire un premier programme Java 22

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

VIII

PARTIE 1

Les outils et techniques de base 23

CHAPITRE 1

Stocker une information 25

La notion de variable 25

Les noms de variables 26La notion de type 26Les types de base en Java 27Comment choisir un type de variable plutocirct qursquoun autre 30Deacuteclarer une variable 30

Lrsquoinstruction drsquoaffectation 31

Rocircle et meacutecanisme de lrsquoaffectation 31Deacuteclaration et affectation 32Quelques confusions agrave eacuteviter 33Eacutechanger les valeurs de deux variables 34

Les opeacuterateurs arithmeacutetiques 35

La prioriteacute des opeacuterateurs entre eux 36Le type drsquoune expression matheacutematique 37La transformation de types 37

Calculer des statistiques sur des opeacuterations bancaires 39

Cahier des charges 39Le code source complet 42Reacutesultat de lrsquoexeacutecution 42

Reacutesumeacute 43

Exercices 44

Repeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction 44Comprendre le meacutecanisme de lrsquoaffectation 44Comprendre le meacutecanisme drsquoeacutechange de valeurs 45Calculer des expressions mixtes 45Comprendre le meacutecanisme du cast 46

Le projet laquo Gestion drsquoun compte bancaire raquo 46

Deacuteterminer les variables neacutecessaires au programme 46

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

IX

CHAPITRE 2

Communiquer une information 49

La bibliothegraveque System 49

Lrsquoaffichage de donneacutees 50

Affichage de la valeur drsquoune variable 50Affichage drsquoun commentaire 50Affichage de plusieurs variables 51Affichage de la valeur drsquoune expression arithmeacutetique 51Affichage drsquoun texte 52

La saisie de donneacutees 54

La classe Lirejava 54

Reacutesumeacute 56

Exercices 57

Comprendre les opeacuterations de sortie 57Comprendre les opeacuterations drsquoentreacutee 58Observer et comprendre la structure drsquoun programme Java 58

Le projet laquo Gestion drsquoun compte bancaire raquo 59

Afficher le menu principal ainsi que ses options 59

CHAPITRE 3

Faire des choix 61

Lrsquoalgorithme du cafeacute chaud sucreacute ou non 61

Deacutefinition des objets manipuleacutes 62Liste des opeacuterations 62Ordonner la liste des opeacuterations 62

Lrsquoinstruction if-else 64

Syntaxe drsquoif-else 65Comment eacutecrire une condition 66Rechercher le plus grand de deux eacuteleacutements 67Deux erreurs agrave eacuteviter 69Des if-else imbriqueacutes 70

Lrsquoinstruction switch ou comment faire des choix multiples 72

Construction du switch 72Calculer le nombre de jours drsquoun mois donneacute 73Comment choisir entre if-else et switch 75

Reacutesumeacute 76copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

X

Exercices 77

Comprendre les niveaux drsquoimbrication 77Construire une arborescence de choix 78Manipuler les choix multiples geacuterer les caractegraveres 79

Le projet laquo Gestion drsquoun compte bancaire raquo 79

Acceacuteder agrave un menu suivant lrsquooption choisie 79

CHAPITRE 4

Faire des reacutepeacutetitions 81

Combien de sucre dans votre cafeacute 81

La boucle dowhile 8 3

Syntaxe 83Principes de fonctionnement 83Un distributeur automatique de cafeacute 84

La boucle while 89

Syntaxe 89Principes de fonctionnement 90Saisir un nombre entier au clavier 90

La boucle for 96

Syntaxe 96Principes de fonctionnement 96Rechercher le code Unicode drsquoun caractegravere donneacute 97Quelle boucle choisir 99

Reacutesumeacute 100

Exercices 102

Comprendre la boucle dohellipwhile 102Apprendre agrave compter accumuler et rechercher une valeur 102Comprendre la boucle while traduire une marche agrave suivre en programme Java 103Comprendre la boucle for 103

Le projet laquo Gestion drsquoun compte bancaire raquo 104

Rendre le menu interactif 104

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XI

PARTIE 2

Initiation agrave la programmation orienteacutee objet 105

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

Algorithme parameacutetreacute 108

Faire un theacute chaud ou comment remplacer le cafeacute par du theacute 108

Des fonctions Java preacutedeacutefinies 110

La librairie Math 110Exemples drsquoutilisation 111Principes de fonctionnement 113

Construire ses propres fonctions 114

Appeler une fonction 114Deacutefinir une fonction 115

Les fonctions au sein drsquoun programme Java 119

Comment placer plusieurs fonctions dans un programme 119Les diffeacuterentes formes drsquoune fonction 120

Reacutesumeacute 122

Exercices 124

Apprendre agrave deacuteterminer les paramegravetres drsquoun algorithme 124Comprendre lrsquoutilisation des fonctions 124Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction 125Eacutecrire une fonction simple 126

Le projet laquo Gestion drsquoun compte bancaire raquo 126

Deacutefinir une fonction 127Appeler une fonction 127

CHAPITRE 6

Fonctions notions avanceacutees 129

La structure drsquoun programme 129

La visibiliteacute des variables 130Variable locale agrave une fonction 132Variable de classe 134Quelques preacutecisions sur les variables de classe 135

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XII

Les fonctions communiquent 138

Le passage de paramegravetres par valeur 138Le reacutesultat drsquoune fonction 140Lorsqursquoil y a plusieurs reacutesultats agrave retourner 142

Reacutesumeacute 143

Exercices 144

Repeacuterer les variables locales et les variables de classe 144Communiquer des valeurs agrave lrsquoappel drsquoune fonction 145Transmettre un reacutesultat agrave la fonction appelante 146

Le projet laquo Gestion drsquoun compte bancaire raquo 146

Comprendre la visibiliteacute des variables 146Les limites du retour de reacutesultat 147

CHAPITRE 7

Les classes et les objets 149

La classe String une approche vers la notion drsquoobjet 149

Manipuler des mots en programmation 150Les diffeacuterentes meacutethodes de la classe String 151Appliquer une meacutethode agrave un objet 157

Construire et utiliser ses propres classes 159

Deacutefinir une classe et un type 159Deacutefinir un objet 163Manipuler un objet 164Une application qui utilise des objets Cercle 165

Reacutesumeacute 169

Exercices 170

Utiliser les objets de la classe String 170Creacuteer une classe drsquoobjets 170Consulter les variables drsquoinstance 170Analyser les reacutesultats drsquoune application objet 171

Le projet laquo Gestion drsquoun compte bancaire raquo 172

Traiter les chaicircnes de caractegraveres 172Deacutefinir le type Compte 172Construire lrsquoapplication Projet 173Deacutefinir le type LigneComptable 173Modifier le type Compte 173Modifier lrsquoapplication Projet 174

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIII

CHAPITRE 8

Les principes du concept drsquoobjet 175

La communication objet 175

Les donneacutees static 176Le passage de paramegravetres par reacutefeacuterence 178

Les objets controcirclent leur fonctionnement 183

La notion drsquoencapsulation 183La protection des donneacutees 184Les meacutethodes drsquoaccegraves aux donneacutees 185Les constructeurs 190

Lrsquoheacuteritage 192

La relation laquo est un raquo 192Le constructeur drsquoune classe heacuteriteacutee 194La protection des donneacutees heacuteriteacutees 195Le polymorphisme 196

Reacutesumeacute 197

Le projet laquo Gestion drsquoun compte bancaire raquo 198

Encapsuler les donneacutees drsquoun compte bancaire 198Comprendre lrsquoheacuteritage 199

PARTIE 3

Les outils et techniques orienteacutes objet 201

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

Les tableaux agrave une dimension 203

Deacuteclarer un tableau 204Manipuler un tableau 206

Quelques techniques utiles 208

La ligne de commande 208Trier un ensemble de donneacutees 212

Les tableaux agrave deux dimensions 218

Deacuteclaration drsquoun tableau agrave deux dimensions 218Acceacuteder aux eacuteleacutements drsquoun tableau 219

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XIV

Reacutesumeacute 225

Exercices 226

Les tableaux agrave une dimension 226Les tableaux drsquoobjets 226Les tableaux agrave deux dimensions 227Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor 227

Le projet laquo Gestion drsquoun compte bancaire raquo 228

Traiter dix lignes comptables 228

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

La programmation dynamique 231

Les vecteurs 232Les dictionnaires 236

Lrsquoarchivage de donneacutees 242

La notion de flux 242Les fichiers textes 242Les fichiers drsquoobjets 247Geacuterer les exceptions 251

Reacutesumeacute 252

Exercices 254

Comprendre les vecteurs 254Comprendre les dictionnaires 254Geacuterer les erreurs 255

Le projet laquo Gestion drsquoun compte bancaire raquo 255

Les comptes sous forme de dictionnaire 255La sauvegarde des comptes bancaires 256La mise en place des dates dans les lignes comptables 256

CHAPITRE 11

Dessiner des objets 259

La librairie AWT 259

Les fenecirctres 260Le dessin 261Les eacuteleacutements de communication graphique 266

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageTABLE DES MATIEgraveRES

XV

Les eacuteveacutenements 269

Les types drsquoeacuteveacutenements 269Exemple Associer un bouton agrave une action 271Exemple Fermer une fenecirctre 273Quelques principes 275

Les applets 275

Une page HTML 275Construire une applet 276Lrsquoutilitaire AppletViewer 277

Reacutesumeacute 278

Exercices 279

Comprendre les techniques drsquoaffichage graphique 279Apprendre agrave geacuterer les eacuteveacutenements 280

Le projet laquo Gestion drsquoun compte bancaire raquo 281

Calcul de statistiques 281Lrsquointerface graphique 282

Contenu et exploitation du CD-Rom 285

Index 287

copy copyright Eacuteditions Eyrolles

INTRODUCTION

Naissance drsquoun programme

Aujourdrsquohui lrsquoinformatique en geacuteneacuteral et lrsquoordinateur en particulier sont drsquoun usagecourant Gracircce agrave Internet lrsquoinformatique donne accegraves agrave une information mondiale Elledonne aussi la possibiliteacute de traiter cette information pour analyser geacuterer preacutevoir ouconcevoir des eacuteveacutenements dans des domaines aussi divers que la meacuteteacuteo la meacutedecinelrsquoeacuteconomie la bureautique etc

Cette communication et ces traitements ne sont possibles qursquoau travers de lrsquooutil informa-tique Cependant toutes ces faculteacutes reacutesultent davantage de lrsquoapplication drsquoun programmereacutesidant sur lrsquoordinateur que de lrsquoordinateur lui-mecircme En fait le programme est agravelrsquoordinateur ce que lrsquoesprit est agrave lrsquoecirctre humain

Creacuteer une application crsquoest apporter de lrsquoesprit agrave lrsquoordinateur Pour que cet esprit donnesa pleine mesure il est certes neacutecessaire de bien connaicirctre le langage des ordinateursmais surtout il est indispensable de savoir programmer La programmation est lrsquoartdrsquoanalyser un problegraveme afin drsquoen extraire la marche agrave suivre lrsquoalgorithme susceptible dereacutesoudre ce problegraveme

Crsquoest pourquoi ce chapitre commence par aborder la notion drsquoalgorithme Agrave partir drsquounexemple tireacute de la vie courante nous deacuteterminons les eacutetapes essentielles agrave lrsquoeacutelabora-tion drsquoun programme (laquo Construire un algorithme raquo) Agrave la section suivante laquo Qursquoest-ceqursquoun ordinateur raquo nous examinons le rocircle et le fonctionnement de lrsquoordinateur dans lepassage de lrsquoalgorithme au programme Nous eacutetudions ensuite agrave travers un exemplesimple comment eacutecrire un programme en Java et lrsquoexeacutecuter (laquo Un premier programmeen Java ou comment parler agrave un ordinateur raquo) Enfin nous deacutecrivons agrave la section Leprojet laquo Gestion drsquoun compte bancaire raquo le cahier des charges de lrsquoapplication projet quele lecteur assidu peut reacutealiser en suivant les exercices deacutecrits agrave la fin de chaque chapitre

Construire un algorithmeUn ordinateur muni de lrsquoapplication adeacutequate traite une information Il sait calculercompter trier ou rechercher lrsquoinformation dans la mesure ougrave un programmeur lui adonneacute les ordres agrave exeacutecuter et la marche agrave suivre pour arriver au reacutesultat

Cette marche agrave suivre srsquoappelle un algorithme copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

2

Deacuteterminer lrsquoalgorithme crsquoest trouver un cheminement de tacircches agrave fournir agrave lrsquoordinateurpour qursquoil les exeacutecute Voyons comment srsquoy prendre pour construire cette marche agravesuivre

Ne faire qursquoune seule chose agrave la fois

Avant de reacutealiser une application concregravete telle que celle proposeacutee en projet dans cetouvrage neacutecessairement complexe par la diversiteacute des tacircches qursquoelle doit reacutealisersimplifions-nous la tacircche en ne cherchant agrave reacutesoudre qursquoun problegraveme agrave la fois

Consideacuterons que creacuteer une application crsquoest deacutecomposer cette derniegravere en plusieurssous-applications qui agrave leur tour se deacutecomposent en micro-applications jusqursquoagravedescendre au niveau le plus eacuteleacutementaire Cette deacutemarche est appeleacutee analyse descen-dante Elle est le principe de base de toute construction algorithmique

Pour bien comprendre cette deacutemarche penchons-nous sur un problegraveme reacuteel et simple agravereacutesoudre comment faire un cafeacute chaud non sucreacute

Exemple lrsquoalgorithme du cafeacute chaudConstruire un algorithme crsquoest avant tout analyser lrsquoeacutenonceacute du problegraveme afin de deacutefinirlrsquoensemble des objets agrave manipuler pour obtenir un reacutesultat

Deacutefinition des objets manipuleacutes

Analysons lrsquoeacutenonceacute suivant

Comment faire un cafeacute chaud non sucreacute

Chaque mot a son importance et laquo non sucreacute raquo est aussi important que laquo cafeacute raquo oulaquo chaud raquo Le terme laquo non sucreacute raquo implique qursquoil ne soit pas neacutecessaire de prendre dusucre ni une petite cuillegravere

Remarquons que tous les ingreacutedients et ustensiles neacutecessaires ne sont pas citeacutes danslrsquoeacutenonceacute En particulier nous ne savons pas si nous disposons drsquoune cafetiegravere eacutelectriqueou non Pour reacutesoudre notre problegraveme nous devons prendre certaines deacutecisions et cesderniegraveres vont avoir une influence sur lrsquoallure geacuteneacuterale de notre algorithme

Supposons que pour reacutealiser notre cafeacute nous soyons en possession des ustensiles etingreacutedients suivants

cafeacute moulufiltreeaupichet cafetiegravere eacutelectriquetasseeacutelectriciteacutetable

En fixant la liste des ingreacutedients et des ustensiles nous deacutefinissons un environnementune base de travail Nous sommes ainsi en mesure drsquoeacutetablir une liste de toutes les actionsagrave mener pour reacutesoudre le problegraveme et de construire la marche agrave suivre permettantdrsquoobtenir un cafeacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

3

Liste des opeacuterationsVerser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtreRemplir le pichet drsquoeauPrendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique un filtre le pichet de la cafetiegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute remplisse le pichet Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le pichet dans la cafetiegravere

Cette eacutenumeacuteration est une description de toutes les actions neacutecessaires agrave la reacutealisationdrsquoun cafeacute chaud

Chaque action est un fragment du problegraveme donneacute et ne peut plus ecirctre deacutecoupeacutee Chaqueaction est eacuteleacutementaire par rapport agrave lrsquoenvironnement que nous nous sommes donneacute

En deacutefinissant lrsquoensemble des actions possibles nous creacuteons un langage minimal quinous permet de reacutealiser le cafeacute Ce langage est composeacute de verbes (Prendre PoserVerser Faire Attendrehellip) et drsquoobjets (Cafeacute moulu Eau Filtre Tassehellip)

La taille du langage crsquoest-agrave-dire le nombre de mots qursquoil renferme est deacutetermineacutee parlrsquoenvironnement Pour cet exemple nous avons en preacutecisant les hypothegraveses volontaire-ment choisi un environnement restreint Nous aurions pu deacutecrire des tacircches commelaquoprendre un contrat EDFraquo ou laquoplanter une graine de cafeacuteraquo mais elles ne sont pas utiles agravenotre objectif peacutedagogique

Telle que nous lrsquoavons deacutecrite la liste des opeacuterations ne nous permet pas encore de faireun cafeacute chaud En suivant cette liste tout y est mais dans le deacutesordre Pour reacutealiser cefameux cafeacute nous devons ordonner cette liste

Ordonner la liste des opeacuterations1 Prendre une cafetiegravere eacutelectrique2 Poser la cafetiegravere sur la table3 Prendre un filtre4 Poser le filtre dans la cafetiegravere5 Prendre du cafeacute moulu6 Verser le cafeacute moulu dans le filtre7 Prendre le pichet de la cafetiegravere8 Remplir le pichet drsquoeau 9 Verser lrsquoeau dans la cafetiegravere10 Poser le pichet dans la cafetiegravere 11 Brancher la cafetiegravere12 Allumer la cafetiegravere13 Attendre que le cafeacute remplisse le pichet14 Prendre une tasse15 Poser la tasse sur la table16 Eteindre la cafetiegravere17 Prendre le pichet de la cafetiegravere18 Verser le cafeacute dans la tasse

Lrsquoexeacutecution de lrsquoensemble ordonneacute de ces tacircches nous permet maintenant drsquoobtenir ducafeacute chaud non sucreacute

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

4

Remarquons que lrsquoordre drsquoexeacutecution de cette marche agrave suivre est important En effet silrsquoutilisateur reacutealise lrsquoopeacuteration 10 (Allumer la cafetiegravere) avant lrsquoopeacuteration 8 (Verserlrsquoeau dans la cafetiegravere) le reacutesultat est sensiblement diffeacuterent La marche agrave suivreainsi deacutesordonneacutee risque de deacuteteacuteriorer la cafetiegravere eacutelectrique

Cet exemple tireacute de la vie courante montre que pour reacutesoudre un problegraveme il est essen-tiel de deacutefinir les objets utiliseacutes puis de trouver la suite logique de tous les ordres neacuteces-saires agrave la reacutesolution dudit problegraveme

Vers une meacutethodeLa tacircche consistant agrave deacutecrire comment reacutesoudre un problegraveme nrsquoest pas simple Elledeacutepend en partie du niveau de difficulteacute du problegraveme et reacuteclame un savoir-faire la faccedilonde proceacuteder pour deacutecouper un problegraveme en actions eacuteleacutementaires

Pour aborder dans les meilleures conditions possibles la tacircche difficile drsquoeacutelaborationdrsquoun algorithme nous devons tout drsquoabord

bull deacuteterminer les objets utiles agrave la reacutesolution du problegraveme

bull construire et ordonner la liste de toutes les actions neacutecessaires agrave cette reacutesolution

Pour cela il est neacutecessaire

bull drsquoanalyser en deacutetail la tacircche agrave reacutesoudre

bull de fractionner le problegraveme en actions distinctes et eacuteleacutementaires

Ce fractionnement est reacutealiseacute en tenant compte du choix des hypothegraveses de travail Ceshypothegraveses imposent un ensemble de contraintes qui permettent de savoir si lrsquoactiondeacutecrite est eacuteleacutementaire et peut ne plus ecirctre deacutecoupeacutee

Cela fait nous avons construit un algorithme

Passer de lrsquoalgorithme au programmePour construire un algorithme nous avons deacutefini des hypothegraveses de travail crsquoest-agrave-diresupposeacute une base de connaissances minimales neacutecessaires agrave la reacutesolution du problegravemeAinsi le fait de prendre lrsquohypothegravese drsquoavoir du cafeacute moulu nous autorise agrave ne pas deacutecrirelrsquoensemble des tacircches preacuteceacutedant lrsquoacquisition du cafeacute moulu Crsquoest donc la connaissance delrsquoenvironnement de travail qui deacutetermine en grande partie la construction de lrsquoalgorithme

Pour passer de lrsquoalgorithme au programme le choix de lrsquoenvironnement de travail nrsquoestplus de notre ressort Jusqursquoagrave preacutesent nous avons supposeacute que lrsquoexeacutecutant eacutetait humainMaintenant notre exeacutecutant est lrsquoordinateur Pour eacutecrire un programme nous devonssavoir ce dont est capable un ordinateur et connaicirctre son fonctionnement de faccedilon agraveeacutetablir les connaissances et capaciteacutes de cet exeacutecutant

Qursquoest-ce qursquoun ordinateur Notre intention nrsquoest pas de deacutecrire en deacutetail le fonctionnement de lrsquoordinateur et de cescomposants mais drsquoen donner une image simplifieacutee

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

5

Pour tenter de comprendre comment travaille lrsquoordinateur et surtout comment il seprogramme nous allons scheacutematiser agrave lrsquoextrecircme ses meacutecanismes de fonctionnement

Un ordinateur est composeacute de deux parties distinctes la meacutemoire centrale et lrsquouniteacutecentrale

La meacutemoire centrale permet de meacutemoriser toutes les informations neacutecessaires agrave lrsquoexeacutecu-tion drsquoun programme Ces informations correspondent agrave des donneacutees ou agrave des ordres agraveexeacutecuter (instructions) Les ordres placeacutes en meacutemoire sont effectueacutes par lrsquouniteacutecentrale la partie active de lrsquoordinateur

Lorsqursquoun ordinateur exeacutecute un programme son travail consiste en grande partie agravegeacuterer la meacutemoire soit pour y lire une instruction soit pour y stocker une information Ence sens nous pouvons voir lrsquoordinateur comme un robot qui sait agir en fonction desordres qui lui sont fournis Ces actions en nombre limiteacute sont deacutecrites ci-dessous

Deacuteposer ou lire une information dans une case meacutemoire

La meacutemoire est formeacutee drsquoeacuteleacutements ou cases qui possegravedent chacune un numeacutero (uneadresse) Chaque case meacutemoire est en quelque sorte une boicircte aux lettres pouvant conte-nir une information (une lettre) Pour y deacuteposer cette information lrsquoordinateur (lefacteur) doit connaicirctre lrsquoadresse de la boicircte Lorsque le robot place une information dansune case meacutemoire il meacutemorise lrsquoadresse ougrave se situe celle-ci afin de retrouver lrsquoinforma-tion en temps neacutecessaire

Le robot sait deacuteposer une information dans une case mais il ne sait pas la retirer (au sensde prendre un courrier deacuteposeacute dans une boicircte aux lettres) Lorsque le robot prend lrsquoinfor-mation deacuteposeacutee dans une case meacutemoire il ne fait que la lire En aucun cas il ne la retireni ne lrsquoefface Lrsquoinformation lue reste toujours dans la case meacutemoire

Pour effacer une information drsquoune case meacutemoire il est neacutecessaire de placer unenouvelle information dans cette mecircme case Ainsi la nouvelle donneacutee remplace lrsquoancienneet lrsquoinformation preacuteceacutedente est deacutetruite

Figure Indash1

La meacutemoire de lrsquoordi-nateur est composeacutee de cases posseacutedant une adresse et pouvant contenir agrave tout moment une valeur

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

6

Exeacutecuter des opeacuterations simples telles que lrsquoaddition ou la soustraction

Le robot lit et exeacutecute les opeacuterations dans lrsquoordre ougrave elles lui sont fournies Pour faireune addition il va chercher les valeurs agrave additionner dans les cases meacutemoire approprieacutees(stockeacutees par exemple aux adresses a et b) et reacutealise ensuite lrsquoopeacuteration demandeacutee Ilenregistre alors le reacutesultat de cette opeacuteration dans une case drsquoadresse c De telles opeacutera-tions sont deacutecrites agrave lrsquoaide drsquoordres appeleacutes aussi instructions

Comparer des valeurs

Le robot est capable de comparer deux valeurs entre elles pour deacuteterminer si lrsquounedrsquoentre elle est plus grande plus petite eacutegale ou diffeacuterente de lrsquoautre valeur Gracircce agrave lacomparaison le robot est capable de tester une condition et drsquoexeacutecuter un ordre plutocirctqursquoun autre en fonction du reacutesultat du test

La reacutealisation drsquoune comparaison ou drsquoun test fait que le robot ne peut plus exeacutecuter lesinstructions dans leur ordre drsquoapparition En effet suivant le reacutesultat du test il doitrompre lrsquoordre de la marche agrave suivre en sautant une ou plusieurs instructions Crsquoestpourquoi il existe des instructions particuliegraveres dites de branchement Gracircce agrave ce typedrsquoinstructions le robot est agrave mecircme non seulement de sauter des ordres mais aussi derevenir agrave un ensemble drsquoopeacuterations afin de les reacutepeacuteter

Figure Indash2

Le programme exeacutecute les instructions dans lrsquoordre de leur apparition

Figure Indash3

Suivant le reacutesultat du test lrsquoordinateur exeacutecute lrsquoune ou lrsquoautre instruction en sautant celle qursquoil ne doit pas exeacutecuter

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

7

Communiquer une information eacuteleacutementaire

Un programme est essentiellement un outil qui traite lrsquoinformation Cette informationest transmise agrave lrsquoordinateur par lrsquoutilisateur Lrsquoinformation est saisie par lrsquointermeacutediairedu clavier ou de la souris Cette transmission de donneacutees agrave lrsquoordinateur est appeleacuteecommunication drsquoentreacutee (input en anglais) On parle aussi de saisie ou encore de lecturede donneacutees

Apregraves traitement le programme fournit un reacutesultat agrave lrsquoutilisateur soit par lrsquointermeacutediairede lrsquoeacutecran soit sous forme de fichiers que lrsquoon peut ensuite imprimer

Il srsquoagit alors de communication de sortie (output) ou encore drsquoaffichage ou drsquoeacutecriturede donneacutees

Coder lrsquoinformation

De par la nature de ses composants eacutelectroniques le robot ne perccediloit que deux eacutetats composant allumeacute et composant eacuteteint De cette perception deacutecoule le langage binairequi utilise par convention les deux symboles 0 (eacuteteint) et 1 (allumeacute)

Ne connaissant que le 0 et le 1 lrsquoordinateur utilise un code pour repreacutesenter une infor-mation aussi simple qursquoun nombre entier ou un caractegravere Ce code est un programmequi diffeacuterencie chaque type drsquoinformation et transforme une information (donneacutee numeacute-rique ou alphabeacutetique) en valeurs binaires Agrave lrsquoinverse ce programme sait aussi transfor-mer un nombre binaire en valeur numeacuterique ou alphabeacutetique Il existe autant de codesque de types drsquoinformations Cette diffeacuterenciation du codage (en fonction de ce qui doitecirctre repreacutesenteacute) introduit le concept de type de donneacutees

Signalons en outre que toute information fournie agrave lrsquoordinateur est au bout du comptecodeacutee en binaire Lrsquoinformation peut ecirctre un simple nombre ou une instruction deprogramme

Figure Indash4

La saisie au clavier drsquoune valeur correspond agrave une opeacuteration drsquoentreacutee et lrsquoaffichage drsquoun reacutesultat agrave une opeacuteration de sortie

Figure Indash5

Toute information est codeacutee en binaire Il existe autant de codes que de types drsquoinformations

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

8

Exemple

Pour additionner deux nombres lrsquoordinateur fait appel aux trois eacuteleacutements qui lui sontneacutecessaires pour reacutealiser cette opeacuteration Ces eacuteleacutements sont les suivants

bull Le code binaire repreacutesentant lrsquoopeacuteration drsquoaddition (par exemple 0101)

bull Lrsquoadresse de la case meacutemoire ougrave est stockeacute le premier nombre (par exemple 011101)

bull Lrsquoadresse de la case meacutemoire ougrave se trouve la deuxiegraveme valeur (par exemple 010101)

Pour finir lrsquoinstruction drsquoaddition de ces deux nombres srsquoeacutecrit en assemblant les troiscodes binaires (soit dans notre exemple 0101011101010101)

Remarquons que le code binaire associeacute agrave chaque code drsquoopeacuteration (addition test etc)nrsquoest pas neacutecessairement identique drsquoun ordinateur agrave un autre Ce code binaire est deacuteter-mineacute par le constructeur de lrsquoordinateur De ce fait une instruction telle que lrsquoadditionde deux nombres nrsquoa pas le mecircme code binaire drsquoune machine agrave une autre Il existedonc pour un mecircme programme un code binaire qui diffegravere suivant le type drsquoordinateurutiliseacute

Lrsquoordinateur nrsquoest qursquoun exeacutecutant

En pratique le robot est tregraves habile agrave reacutealiser lrsquoensemble des tacircches eacutenonceacutees ci-dessusIl les exeacutecute beaucoup plus rapidement qursquoun ecirctre humain

En revanche le robot nrsquoest pas doueacute drsquointelligence Il nrsquoest ni capable de choisir uneaction plutocirct qursquoune autre ni apte agrave exeacutecuter de lui-mecircme lrsquoensemble de ces actionsPour qursquoil puisse exeacutecuter une instruction il faut qursquoun ecirctre humain deacutetermine lrsquoinstruc-tion la plus approprieacutee et lui donne lrsquoordre de lrsquoexeacutecuter

Le robot est un exeacutecutant capable de comprendre des ordres Compte tenu de ses capaci-teacutes limiteacutees les ordres ne peuvent pas lui ecirctre donneacutes dans le langage naturel propre agravelrsquoecirctre humain En effet le robot ne comprend pas le sens des ordres qursquoil exeacutecute maisseulement leur forme Chaque ordre doit ecirctre eacutecrit avec des mots particuliers et uneforme ou syntaxe preacuteeacutetablie Lrsquoensemble de ces mots constitue un langage informati-que Les langages C C++ Pascal Basic Fortran Cobol et Java sont des langages deprogrammation constitueacutes de mots et drsquoordres dont la syntaxe diffegravere selon le langage

Pour eacutecrire un programme il est neacutecessaire de connaicirctre un de ces langages de faccedilon agravetraduire un algorithme en un programme composeacute drsquoordres

Figure Indash6

Pour un mecircme programme le code binaire diffegravere en fonction de lrsquoordinateur utiliseacute

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

9

Un premier programme en Java ou comment parler agrave un ordinateurPour creacuteer une application nous allons avoir agrave deacutecrire une liste ordonneacutee drsquoopeacuterationsdans un langage compreacutehensible par lrsquoordinateur La contrainte est de taille et se porteessentiellement sur la faccedilon de deacutefinir et de repreacutesenter les objets neacutecessaires agrave la reacutesolu-tion du problegraveme en fonction du langage de lrsquoordinateur

Pour bien comprendre la difficulteacute du travail agrave accomplir regardons comment fairecalculer agrave un ordinateur la circonfeacuterence drsquoun cercle de rayon quelconque

Calcul de la circonfeacuterence drsquoun cercle

Lrsquoexercice consiste agrave calculer le peacuterimegravetre drsquoun cercle de rayon quelconque Noussupposons que lrsquoutilisateur emploie le clavier pour transmettre au programme la valeurdu rayon

Deacutefinition des objets manipuleacutes

Pour calculer la circonfeacuterence du cercle lrsquoordinateur a besoin de stocker dans ses casesmeacutemoire la valeur du rayon ainsi que celle du peacuterimegravetre Les objets agrave manipuler sontdeux valeurs numeacuteriques appartenant agrave lrsquoensemble des reacuteels Nous appelons P lavaleur correspondant au peacuterimegravetre et R la valeur du rayon

La liste des opeacuterations

La circonfeacuterence drsquoun cercle est calculeacutee agrave partir de la formule P = 2 times π times R

La valeur du rayon est fournie par lrsquoutilisateur agrave lrsquoaide du clavier Elle nrsquoest donc pasconnue au moment de lrsquoeacutecriture du programme En conseacutequence il est neacutecessairedrsquoeacutecrire lrsquoordre (instruction) de saisie au clavier avant de calculer la circonfeacuterence

La liste des opeacuterations est la suivante

1 Reacuteserver deux cases meacutemoire pour y stocker les valeurs correspondant au rayon (R) et au peacuterimegravetre (P)

2 Demander agrave lrsquoutilisateur de saisir la valeur du rayon au clavier et la placer dans la case meacutemoire associeacutee

3 Connaissant la valeur du rayon calculer la circonfeacuterence4 Afficher le reacutesultat

La valeur du rayon puis apregraves calcul celle de la circonfeacuterence sont les donneacutees princi-pales de ce programme Lrsquoordinateur doit les stocker en meacutemoire pour les utiliser

Lrsquoopeacuteration 1 consiste agrave donner un nom aux cases meacutemoire qui vont servir agrave stocker cesdonneacutees Lors de cette opeacuteration appeleacutee deacuteclaration de variables lrsquoordinateur reacuteserveune case meacutemoire pour chaque nom de variable deacutefini Ici ces variables ont pour nom Pet R Au cours de cette reacuteservation drsquoemplacements meacutemoire lrsquoordinateur associe le nomde la variable et lrsquoadresse reacuteelle de la case meacutemoire

Pour le programmeur le nom et lrsquoadresse drsquoune case ne font qursquoun car il ne manipuleles variables que par leur nom alors que lrsquoordinateur travaille avec leur adresse Endonnant un nom agrave une case lrsquoecirctre humain sait facilement identifier les objets qursquoil mani-pule alors qursquoil lui serait peacutenible de manipuler les adresses binaires correspondantes

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

10

Inversement en associant un nom agrave une adresse codeacutee en binaire lrsquoordinateur peut veacuteri-tablement manipuler ces objets

Lrsquoopeacuteration 2 permet de saisir au clavier la valeur du rayon Pour que lrsquoutilisateur noninitieacute sache agrave quoi correspond la valeur saisie il est neacutecessaire avant de proceacuteder agrave cettesaisie drsquoafficher un message explicatif agrave lrsquoeacutecran Lrsquoopeacuteration 2 se deacutecompose en deuxinstructions eacuteleacutementaires agrave savoir

Afficher un message demandant agrave lrsquoutilisateur du programme de saisir une valeur pour le rayonUne fois la valeur saisie par lrsquoutilisateur la placer dans sa case meacutemoire

Les opeacuterations 3 et 4 sont des actions eacuteleacutementaires directement traduisibles en langageinformatique

La traduction en Java

Une application ou programme ne srsquoeacutecrit pas en une seule fois Nous verrons agrave lalecture de cet ouvrage que programmer crsquoest toujours deacutecomposer une difficulteacute endiffeacuterentes tacircches plus aiseacutees agrave reacutealiser Cette deacutecomposition srsquoapplique aussi bien pourconstruire un algorithme que pour lrsquoeacutecriture du programme lui-mecircme

Drsquoune maniegravere geacuteneacuterale la meilleure faccedilon de proceacuteder pour fabriquer un programmerevient agrave eacutecrire une premiegravere eacutebauche et agrave la tester De ces tests il ressort des fautes agravecorriger et surtout de nouvelles ideacutees Le programme final consiste en lrsquoassemblage detoutes ces corrections et de ces ameacuteliorations

Pour traduire la marche agrave suivre deacutefinie preacuteceacutedemment selon les regravegles de syntaxe dulangage Java nous allons utiliser cette mecircme deacutemarche Nous nous inteacuteresserons dansun premier temps agrave la traduction du cœur du programme (opeacuterations 1 agrave 4 deacutecrites agrave lasection preacuteceacutedente) Nous verrons pour finir comment inseacuterer lrsquoensemble de ces instruc-tions dans une structure de programme Java

bull Lrsquoopeacuteration 1 consiste agrave deacuteclarer les variables utiliseacutees pour le calcul de la circonfeacute-rence Cette opeacuteration se traduit par lrsquoinstruction

double R P

Par cette instruction le programme demande agrave lrsquoordinateur de reacuteserver deux casesmeacutemoire nommeacutees R et P pour y stocker les valeurs du rayon et de la circonfeacuterenceLe mot reacuteserveacute double permet de preacuteciser que les valeurs numeacuteriques sont reacuteelleslaquo avec une double preacutecision raquo crsquoest-agrave-dire avec une preacutecision pouvant aller jusqursquoagrave17 chiffres apregraves la virgule

Pour plus drsquoinformations sur la deacutefinition des types de variables reportez-vous au chapitre 1laquo Stocker une information raquo

bull Pour reacutealiser lrsquoopeacuteration 2 nous devons faire afficher un message demandant agrave lrsquoutili-sateur de saisir une valeur Cette opeacuteration se traduit par lrsquoinstruction

Systemoutprint(Valeur du rayon )

Systemoutprint() est ce que lrsquoon appelle un programme ou une fonction preacutedeacutefini

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

11

par le langage Java Ce programme permet drsquoeacutecrire agrave lrsquoeacutecran le message speacutecifieacute agravelrsquointeacuterieur des parenthegraveses Le message afficheacute est ici un fragment de texte appeleacutedans le jargon informatique une chaicircne de caractegraveres Pour que lrsquoordinateur com-prenne que la chaicircne de caractegraveres nrsquoest pas un nom de variable mais un texte agraveafficher il faut placer entre guillemets ( ) tous les caractegraveres composant la chaicircne

bull Lrsquoopeacuteration 2 est termineacutee lorsque la valeur demandeacutee est effectivement saisie etstockeacutee en meacutemoire Pour ce faire nous devons eacutecrire lrsquoinstruction suivante

R = Lired()

Lired()est un programme proposeacute par lrsquoauteur qui permet de communiquer unevaleur numeacuterique au programme par lrsquointermeacutediaire du clavier Ce programme estune fonction qui donne lrsquoordre agrave lrsquoordinateur drsquoattendre la saisie drsquoune valeur de dou-ble preacutecision La saisie est effective lorsque lrsquoutilisateur valide sa reacuteponse en appuy-ant sur la touche entreacutee du clavier Cette fonction nrsquoeacutetant pas preacutedeacutefinie par lelangage Java elle figure dans le CD-Rom livreacute avec le manuel

Une fois la valeur saisie elle est placeacutee dans la variable R gracircce au signe =

Pour plus de preacutecisions sur les deux meacutethodes Systemoutprint() et Lired()reportez-vous au chapitre 2 laquo Communiquer une information raquo Pour le signe = voir le chapitre 1laquo Stocker une information raquo

bull Lrsquoopeacuteration 3 permet de calculer la valeur de la circonfeacuterence Elle se traduit de lafaccedilon suivante

P = 2 MathPI R

Le signe est le symbole qui caracteacuterise lrsquoopeacuteration de multiplication MathPI est leterme qui repreacutesente la valeur numeacuterique du nombre π avec une preacutecision de17 chiffres apregraves la virgule Le mot-cleacute Math deacutesigne la bibliothegraveque de matheacutema-tiques accompagnant le langage Java Cette bibliothegraveque contient outre des con-stantes telles que π des fonctions standards comme sqrt() (racine carreacutee) ou sin()(sinus) Une fois les opeacuterations de multiplication effectueacutees la valeur calculeacutee estplaceacutee dans la variable P gracircce au signe =

bull La derniegravere opeacuteration (4) de notre programme a pour rocircle drsquoafficher le reacutesultat ducalcul preacuteceacutedent Cet affichage est reacutealiseacute gracircce agrave lrsquoinstruction

Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Ce deuxiegraveme appel agrave la fonction Systemoutprint() est plus complexe que le pre-mier Il meacutelange lrsquoaffichage de chaicircnes de caractegraveres (texte entre guillemets) et decontenu de variables

Si les caractegraveres R et P ne sont pas placeacutes entre guillemets crsquoest pour que lrsquoordinateurles interpregravete non pas comme des caractegraveres agrave afficher mais comme les variables quiont eacuteteacute deacuteclareacutees en deacutebut de programme De ce fait il affiche le contenu des vari-ables et non les lettres R et P

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

12

Les signes + qui apparaissent dans lrsquoexpression Le cercle de rayon + R + apour perimetre + P indiquent que chaque eacuteleacutement du message doit ecirctreafficheacute en le collant aux autres drsquoabord la chaicircne de caractegraveres Le cercle derayon puis la valeur de R puis la chaicircne a pour peacuterimegravetre et pour finir lavaleur de P

En reacutesumeacute la partie centrale du programme contient les cinq instructions suivantes

double R P Systemoutprint(Valeur du rayon ) R = Lired() P = 2 MathPI R Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Pour ameacuteliorer la lisibiliteacute du programme il est possible drsquoinseacuterer dans le programmedes commentaires comme suit

Deacuteclaration des variablesdouble R P Afficher le message Valeur du rayon agrave lrsquoeacutecranSystemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable RR = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacuteeP = 2 MathPI R Afficher le reacutesultatSystemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Les lignes du programme qui deacutebutent par les signes sont consideacutereacutees par lrsquoordinateurnon pas comme des ordres agrave exeacutecuter mais comme des lignes de commentaire Ellespermettent drsquoexpliquer en langage naturel ce que reacutealise lrsquoinstruction associeacutee

Eacutecrites de la sorte ces instructions constituent le cœur de notre programme Elles nepeuvent cependant pas encore ecirctre interpreacuteteacutees correctement par lrsquoordinateur En effetcelui-ci exeacutecute les instructions drsquoun programme dans lrsquoordre de leur arriveacutee Une appli-cation doit donc ecirctre constitueacutee drsquoune instruction qui caracteacuterise le deacutebut du programmePour ce faire nous devons eacutecrire notre programme ainsi

public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2 MathPI R Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la fonction main()

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

13

La ligne public static void main(String [] argument) est lrsquoinstruction qui permetdrsquoindiquer agrave lrsquoordinateur le deacutebut du programme Ce deacutebut est identifieacute par ce que lrsquoonappelle la fonction main() crsquoest-agrave-dire la fonction principale du programme De cettefaccedilon lorsque le programme est exeacutecuteacute lrsquoordinateur recherche le mot-cleacute main Unefois ce mot-cleacute trouveacute lrsquoordinateur exeacutecute une agrave une chaque instruction constituant lafonction

Les autres mots-cleacutes tels que public static ou void deacuteterminent certaines caracteacuteris-tiques de la fonction main() Ces mots-cleacutes obligatoirement placeacutes et eacutecrits dans cetordre sont expliqueacutes au fur et agrave mesure de leur apparition dans le livre et plus particuliegrave-rement agrave la section laquo Quelques techniques utiles raquo du chapitre laquo Collectionner un nombrefixe dobjets raquo

Pour finir nous devons inseacuterer la fonction main() dans ce qui est appeleacute une classe JavaEn programmation objet un programme nrsquoest exeacutecutable que srsquoil est deacutefini agrave lrsquointeacuterieurdrsquoune classe Une classe est une entiteacute interpreacuteteacutee par lrsquoordinateur comme eacutetant uneuniteacute de programme qursquoil peut exeacutecuter degraves qursquoun utilisateur le souhaite

Aucun programme ne peut ecirctre eacutecrit en dehors drsquoune classe Nous devons donc placer lafonction main() agrave lrsquointeacuterieur drsquoune classe deacutefinie par lrsquoinstruction public class Cercle comme suit

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double R P Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R R = Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee P = 2MathPIR Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P) Fin de la classe Cercle

Nous obtenons ainsi le programme dans son inteacutegraliteacute La ligne public class Cerclepermet de deacutefinir une classe Puisque notre programme effectue des opeacuterations sur uncercle nous avons choisi drsquoappeler cette classe Cercle Nous aurions pu lui donner untout autre nom comme Rond ou Exemple Ainsi deacutefinie la classe Cercle devient unprogramme agrave part entiegravere

Pour voir le reacutesultat de lrsquoexeacutecution de ce programme reportez-vous agrave la section laquo Exemple surplate-forme Unix raquo ci-apregraves

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

14

En observant la Figure 7 nous remarquons que ce programme de mecircme que tous ceuxagrave venir est constitueacute de deux blocs encastreacutes deacutefinis par les deux lignes public classCercle et public static void main(String [] argument)

Ces deux blocs constituent la charpente principale et neacutecessaire agrave tout programme eacutecritavec le langage Java Cet exemple montre en outre que les mots reacuteserveacutes par le langageJava sont nombreux et varieacutes et qursquoils constituent une partie du langage Java

Si la syntaxe crsquoest-agrave-dire la forme de ces instructions peut paraicirctre eacutetrange de primeabord nous verrons agrave la lecture de cet ouvrage que leur emploi obeacuteit agrave des regravegles strictesEn apprenant ces regravegles et en les appliquant vous pourrez vous initier aux techniques deconstruction drsquoun programme qui reviennent agrave deacutecomposer un problegraveme en actionseacuteleacutementaires puis agrave traduire celles-ci agrave lrsquoaide du langage Java

Exeacutecuter un programmeNous avons eacutecrit un programme constitueacute drsquoordres dont la syntaxe obeacuteit agrave des regraveglesstrictes Pour obtenir le reacutesultat des calculs deacutecrits dans le programme nous devons lefaire lire par lrsquoordinateur crsquoest-agrave-dire lrsquoexeacutecuter

Pour cela nous devons traduire le programme en langage machine En effet nouslrsquoavons vu lrsquoordinateur ne comprend qursquoun seul langage le langage binaire

Compiler ou traduire en langage machineCette traduction du code source (le programme eacutecrit en langage informatique) en codemachine exeacutecutable (le code binaire) est reacutealiseacutee par un programme appeleacute compila-teur Lrsquoopeacuteration de compilation consiste agrave lancer un programme qui lit chaque instruc-tion du code source et veacuterifie si celles-ci ont une syntaxe correcte Srsquoil nrsquoy a pas drsquoerreurle compilateur creacutee un code binaire directement exeacutecutable par lrsquoordinateur

Il existe autant de compilateurs que de langages Un programme eacutecrit en langage Pascalest traduit en binaire agrave lrsquoaide drsquoun compilateur Pascal et un programme eacutecrit en Java estcompileacute par un compilateur Java Le compilateur Java ne travaille pas tout agrave fait commeun compilateur classique traduisant un code source en code exeacutecutable Pour mieuxcomprendre cette diffeacuterence voyons son fonctionnement et comment lrsquoutiliser

Figure Indash7

Un programme Java est constitueacute de deux blocs encastreacutes Le premier bloc repreacutesente la classe associeacutee au programme tandis que le second deacutetermine la fonction principale

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

15

Compiler un programme eacutecrit en Java

Lrsquoobjectif premier de J Gosling le creacuteateur du langage Java a eacuteteacute de reacutealiser un langageindeacutependant de lrsquoordinateur Dans cette optique un programme eacutecrit sur PC par exem-ple doit pouvoir srsquoexeacutecuter sur un PC (de type IBM) un Macintosh (Apple) ou unestation Unix (de type Sun) et ce sans reacuteeacutecriture ni compilation du code source

Or le code binaire est speacutecifique de chaque machine comme nous lrsquoavons vu agrave lasection laquo Coder lrsquoinformation raquo Il est impossible de faire tourner un mecircme programmesource drsquoune machine agrave une autre sans le compiler agrave nouveau En effet lors de lanouvelle compilation des erreurs apparaissent dues aux diffeacuterences de mateacuteriel infor-matique Pour corriger cet inconveacutenient majeur lrsquoideacutee de JGosling a eacuteteacute de creacuteer uncode intermeacutediaire entre le code source et le code binaire Ce code intermeacutediaire estappeleacute pseudo-code ou encore byte code

En effet en creacuteant un pseudo-code identique pour tous les ordinateurs il est possibledrsquoexeacutecuter ce code sur diffeacuterentes machines sans avoir agrave le recompiler Cette exeacutecutionest reacutealiseacutee par un programme speacutecifique de la machine utiliseacutee qui interpregravete et exeacutecutele pseudo-code compte tenu des ressources propres de lrsquoordinateur

Ce programme srsquoappelle un interpreacuteteur Java Il en existe autant que de types drsquoordina-teurs (plates-formes) Lrsquoensemble des ces interpreacuteteurs constitue ce que lrsquoon appelle lamachine virtuelle Java ou JVM (Java Virtual Machine)

Le compilateur Java ne creacutee pas de code binaire agrave la diffeacuterencedes autres compilateurstels que les compilateurs C ou C++ Il fabrique un pseudo-code qui est ensuite inter-preacuteteacute par un programme speacutecifique de lrsquoordinateur Ce dernier programme transforme lepseudo-code en code directement exeacutecutable par lrsquoordinateur choisi Lrsquoavantage drsquoun telsystegraveme est que le deacuteveloppeur drsquoapplications est certain de creacuteer des programmes tota-lement compatibles avec les diffeacuterents ordinateurs du marcheacute sans avoir agrave reacuteeacutecrire unepartie du code

Le kit de deacuteveloppement Java (JDK)

Le tout premier compilateur Java a eacuteteacute eacutecrit par J Gosling agrave lrsquoinitiative de Sun le cons-tructeur de stations de travail sous Unix au deacutebut des anneacutees 90

Figure Indash8

Le compilateur (javac) transforme le code source en pseudo-code Ce dernier est exeacutecuteacute gracircce agrave un interpreacuteteur (java) speacutecifique de chaque type de machine Lrsquoensemble des interpreacuteteurs constitue la JVM

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

16

Aujourdrsquohui le compilateur Java est teacuteleacutechargeable depuis le site Internet de Sun Il estfourni avec le kit de deacuteveloppement Java (JDK Java Development Kit ou encore SDKSandard Development Kit) Cet environnement est disponible sur les ordinateurs de typeSolaris PC sous Windows 9598 ou NT et Mac OS Si vous souhaitez installer le JDK survotre machine consultez sur le CD-Rom fourni avec louvrage le fichier laquo outils raquo

Le JDK est ce que lrsquoon appelle une boicircte agrave outils de deacuteveloppement drsquoapplications Celarevient agrave dire qursquoil est constitueacute drsquooutils ou programmes que lrsquoon utilise sous forme decommande ou ordre Pour transmettre une commande agrave un ordinateur le programmeurdoit saisir le nom de cette commande au clavier dans une fenecirctre speacutecifique du typedrsquoordinateur utiliseacute Les deux principales commandes agrave connaicirctre pour cet ouvrage sontles commandes de compilation (javac) et drsquoexeacutecution (java)

Exemple sur plate-forme Unix

La marche agrave suivre est la suivante

1 Entrez le programme qui calcule la circonfeacuterence drsquoun cercle (exemple donneacute agrave lasection laquo Eacutecrire un programme raquo) agrave lrsquoaide drsquoun eacutediteur de texte crsquoest-agrave-dire un logi-ciel permettant de saisir du texte au clavier Les eacutediteurs de texte les plus couram-ment utiliseacutes sous Unix sont vi et emacs

2 Sauvegardez votre programme en choisissant comme nom de fichier celui qui suitles termes public class Pour notre exemple nous avons eacutecrit public classCercle Le fichier est donc agrave sauvegarder sous le nom Cerclejava

3 Agrave partir du CD-Rom fourni avec lrsquoouvrage copiez le fichier Lirejava dans votrereacutepertoire de travail La preacutesence de ce fichier est neacutecessaire pour que lrsquoordinateurdemande la saisie drsquoune valeur au clavier Pour plus drsquoinformations reportez-vousau chapitre 2 laquo Communiquer une information raquo

4 Lancez lrsquoordre de compilation en saisissant sous Unix la commande

javac Cerclejava

La compilation est lanceacutee Le compilateur exeacutecute sa tacircche et compile les fichiersCerclejava et Lirejava Au final si aucune erreur nrsquoest deacutetecteacutee le compilateurcreacutee un nouveau fichier appeleacute Cercleclass ainsi qursquoun fichier Lireclass Cesdeux fichiers correspondent au pseudo-code relatif agrave chacun des programmes com-pileacutes

5 Exeacutecutez le programme en lanccedilant la commande

java Cercle

La commande java lance le programme qui interpregravete le pseudo-code creacuteeacute agrave lrsquoeacutetapepreacuteceacutedente Ce programme traduit le pseudo-code dans le code binaire conforme agrave lamachine sur laquelle il est lanceacute Apregraves exeacutecution le reacutesultat obtenu agrave lrsquoeacutecran est

Valeur du rayon 55Le cercle de rayon 5 a pour perimetre 3141592653589793

ougrave 55 est une valeur entreacutee au clavier par lrsquoutilisateurcopy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

17

Pour exeacutecuter un programme les deux eacutetapes suivantes sont neacutecessaires

bull La compilation du programme agrave lrsquoaide de la commande javac suivie du nom duprogramme Une fois la commande reacutealiseacutee le pseudo-code est creacuteeacute et enregistreacute dansun fichier dont le nom correspond au nom du programme suivi de lrsquoextensionlaquo class raquo

bull Lrsquoexeacutecution du programme en appelant lrsquointerpreacuteteur au moyen de la commandejava suivie du nom du programme (sans extension) Cette commande interpregravete lefichier laquo class raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente et exeacutecute le programme

Les environnements de deacuteveloppementLe JDK fournit un ensemble de commandes pour compiler et interpreacuteter Crsquoest un environ-nement courant et facile drsquoemploi dans le monde Unix Il lrsquoest beaucoup moins en revan-che sous Windows 9598NT En effet lrsquoeacutecriture drsquoune commande telle que donner lrsquoordrede compiler un programme ne peut se reacutealiser qursquoen ouvrant une fenecirctre laquo CommandesMS-DOS raquo

Un certain nombre drsquoenvironnements de programmation permettent cependant drsquoeacutecrirede compiler puis drsquoexeacutecuter de faccedilon conviviale un programme Java Citons agrave titredrsquoexemples les environnements de travail tels que le logiciel Kawa (Tek-Tools) sur PCou Visual Cafeacute (Symantec) sur Macintosh

Ces logiciels offrent sous forme drsquointerface graphique conviviale un ensemble drsquooutilsde deacuteveloppement drsquoapplications Les outils les plus utiliseacutes sont en geacuteneacuteral lessuivants

bull Lrsquoeacutediteur de texte pour eacutecrire le programme

bull Les menus et boicirctes agrave outils pour lancer la compilation et lrsquoexeacutecution

bull La fenecirctre de compilation qui affiche les eacuteventuelles erreurs de syntaxe

bull La fenecirctre drsquoexeacutecution qui affiche les messages et reacutesultats du programme en cours

bull La fenecirctre qui visualise les projets en cours dans le cas drsquoun programme deacutefini agrave partirde plusieurs fichiers diffeacuterents

Vous trouverez toutes les informations neacutecessaires au teacuteleacutechargement de ces interfaces dans lefichier laquo Outils raquo preacutesent sur le CD-Rom fourni avec louvrage

Le projet laquo Gestion drsquoun compte bancaire raquo Pour vous permettre de mieux maicirctriser les diffeacuterentes notions abordeacutees dans cetouvrage nous vous proposons de construire une application plus eacutelaboreacutee que lessimples exercices appliqueacutes donneacutes en fin de chapitre

Dans ce projet nous avons volontairement eacuteviteacute lrsquoemploi drsquointerfaces graphiques Bienqursquoattrayantes ces derniegraveres sont difficiles agrave maicirctriser pour des deacutebutants en program-mation Le projet consiste agrave bacirctir une application autour du concept de menu interactifAgrave lrsquoheure du tout-graphique il nrsquoest pas vain drsquoapprendre agrave eacutecrire des menus laquo texte raquoLe fait de passer par cet apprentissage permet drsquoappreacutehender toutes les notions fonda-

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

18

mentales de la programmation sans avoir agrave srsquoeacutevertuer agrave eacutetudier la syntaxe de toutes lesmeacutethodes de la librairie graphique Java

Cahier des chargesIl srsquoagit drsquoeacutecrire une application interactive qui permet de geacuterer lrsquoensemble des comptesbancaires drsquoune personne Les fonctionnaliteacutes fournies par le programme de gestion decomptes bancaires sont les suivantes

Creacuteation Suppression drsquoun compteAffichage drsquoun compte donneacuteSaisie drsquoune ligne comptable pour un compte donneacuteCalcul de statistiquesSauvegarde des donneacutees (ndeg de compte lignes comptables)

Niveau 1 programme interactif sous forme de choix dans un menu

Lrsquoexeacutecution du programme affiche le menu suivant

1 Creacuteer un compte2 Afficher un compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Lrsquoutilisateur choisit une valeur pour exeacutecuter lrsquoopeacuteration souhaiteacutee

bull Si lrsquoutilisateur choisit lrsquooption 1 les informations agrave fournir concernent

Le type du compte [Types possibles Compte courant joint eacutepargne]Le numeacutero du compteLa premiegravere valeur creacutediteacutee Le taux de placement dans le cas drsquoun compte eacutepargne

bull Si lrsquoutilisateur choisit lrsquooption 2 le programme affiche les caracteacuteristiques drsquouncompte (type valeur courante taux) ainsi que les dix derniegraveres opeacuterations compta-bles dans lrsquoordre des dates ougrave ont eacuteteacute effectueacutees les opeacuterations

bull Pour lrsquooption 3 il srsquoagit de fournir des informations pour creacuteer une ligne comptableCes informations sont les suivantes

Le numeacutero du compte concerneacute (avec veacuterification de son existence)La somme agrave creacutediter (valeur positive) ou agrave deacutebiter (valeur neacutegative)La date de lrsquoopeacuterationLe motif de lrsquoachat ou de la vente [thegravemes possibles Salaire Loyer

Alimentation Divers]Le mode de paiement[Types possibles CB ndeg du Chegraveque Virement]

bull Lrsquooption 4 Sortir du menu geacuteneacuteral permet de sortir du programme

bull Lrsquooption 5 Aide du menu geacuteneacuteral affiche une information relative agrave chaque option dumenu

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

19

Niveau 2 structure de donneacutees optimiseacutee en termes drsquoutilisation de la meacutemoire

bull Le programme doit pouvoir geacuterer autant de comptes que neacutecessaire Pour chaquecompte le nombre drsquoopeacuterations comptables doit ecirctre infini et est donc indeacuteterminableau moment de lrsquoeacutecriture du programme

bull En conseacutequence la reacuteservation des cases meacutemoire ne peut pas ecirctre reacutealiseacutee de faccedilondeacutefinitive en tout deacutebut de programme Agrave chaque ligne comptable et agrave chaque nouveaucompte creacuteeacutes le programme doit ecirctre capable de reacuteserver lui-mecircme le nombre suffi-sant drsquoemplacements meacutemoire pour la bonne marche du programme Lorsque leprogramme gegravere lui-mecircme la reacuteservation des emplacements meacutemoire on dit qursquoilgegravere sa meacutemoire de maniegravere dynamique

bull Lrsquooption permettant la suppression drsquoun compte est deacutependante de la faccedilon dont eststockeacutee lrsquoinformation Cette option ne peut ecirctre abordeacutee avant drsquoavoir choisi le modede gestion des emplacements meacutemoire

bull Lrsquooption 5 Sortir du menu geacuteneacuteral doit controcircler la sauvegarde de lrsquoinformation Lesdonneacutees sont sauvegardeacutees sur disque sous forme drsquoun fichier portant le nom comptedat

Niveau 3 srsquoinitier aux graphiques

Un nouveau choix est ajouteacute agrave lrsquooption 2 Afficher un compte du menu geacuteneacuteral ilsrsquoagit drsquoafficher les statistiques pour un compte donneacute sous diffeacuterentes formes graphi-ques (histogramme camembert etc)

Les objets manipuleacutesUn compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero du compte

bull un type de compte ( courant eacutepargne joint etc)

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Nous verrons au chapitre 1 laquo Stocker une information raquo puis tout au long du chapitre 7laquo Les classes et les objets raquo comment deacutefinir et repreacutesenter les objets utiles et neacutecessai-res agrave la reacutealisation de cette application

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Caractegravere

Type du compte Courant Caractegravere

Valeur ndash 1 52030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Caractegravere

Moyen de paiement CB Caractegravere

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

20

La liste des ordresPour creacuteer une application de gestion de comptes bancaires nous devons deacutecomposerlrsquoensemble de ses fonctionnaliteacutes en tacircches eacuteleacutementaires Pour ce faire nous partageonslrsquoapplication en trois niveaux de difficulteacute croissante Les niveaux 1 et 2 doivent ecirctreabordeacutes dans cet ordre et sont neacutecessaires agrave la reacutealisation du niveau 3 La mise en œuvredu niveau 1 permet de reacutealiser les actions suivantes

bull construire un menu (voir les chapitres 2 laquo Communiquer une information raquo et 3laquo Faire des choix raquo)

bull creacuteer des comptes diffeacuterents ou saisir plusieurs lignes comptables (voir leschapitres 4 laquo Faire des reacutepeacutetitions raquo et 9 laquo Collectionner un nombre fixe drsquoobjets raquo)

bull deacutefinir les comptes et les lignes comptables comme des objets informatiques au sensde la programmation objet (voir les chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecri-ture drsquoune fonction raquo et 7 laquo Les classes et les objets raquo)

Pour reacutesoudre le niveau 2 nous allons apprendre les tacircches suivantes

bull geacuterer la meacutemoire de lrsquoordinateur (voir les chapitres 9 laquo Collectionner un nombre fixedrsquoobjets raquo et 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

bull sauvegarder des informations pour que celles-ci ne disparaissent pas une fois lrsquoordi-nateur eacuteteint (voir le chapitre 10 laquo Collectionner un nombre indeacutetermineacute drsquoobjets raquo)

Le niveau 3 va nous initier aux opeacuterations suivantes bull calculer des statistiques (voir les chapitres 1 laquo Stocker une information raquo et 9

laquo Collectionner un nombre fixe drsquoobjets raquo)

bull dessiner en particulier des histogrammes (voir le chapitre 11 laquo Dessiner desobjets raquo)

Lrsquoeacutetude eacutetape par eacutetape de lrsquoensemble de cet ouvrage va nous permettre de reacutealiser cetteapplication

ReacutesumeacuteEn informatique reacutesoudre un problegraveme crsquoest trouver la suite logique de tous lesordres neacutecessaires agrave la solution dudit problegraveme Cette suite logique est appeleacutee algo-rithme

La construction drsquoun algorithme passe par lrsquoanalyse du problegraveme avec pour objectifde le deacutecouper en une succession de tacircches simplifieacutees et distinctes Ainsi agrave partir delrsquoeacutenonceacute clair preacutecis et eacutecrit en franccedilais drsquoun problegraveme nous devons accomplir lesdeux opeacuterations suivantes

bull Deacutecomposer lrsquoeacutenonceacute en eacutetapes distinctes qui conduisent agrave lrsquoalgorithme

bull Deacutefinir les objets manipuleacutes par lrsquoalgorithme

Une fois lrsquoalgorithme construit il faut laquo eacutecrire le programme raquo crsquoest-agrave-dire traduirelrsquoalgorithme de faccedilon qursquoil soit compris par lrsquoordinateur En effet un programmecrsquoest un algorithme traduit dans un langage compreacutehensible par les ordinateurs

copy copyright Eacuteditions Eyrolles

Naissance drsquoun programmeINTRODUCTION

21

ExercicesApprendre agrave deacutecomposer une tacircche en sous-tacircches distinctes

Eacutecrivez la marche agrave suivre qui explique comment accrocher un tableau au centredrsquoun mur Pour cela vous devez

a Deacutefinir les objets neacutecessaires agrave la reacutesolution du problegraveme

b Eacutetablir la liste des opeacuterations

c Ordonner cette liste

Plusieurs solutions sont possibles mais chacune doit rester logique agrave lrsquoeacutegard des hypothegraveses prisesen a Par exemple un clou et une perceuse ne vont pas ensemble

Observer et comprendre la structure drsquoun programme JavaObservez le programme suivant

public class Premier

Un ordinateur est composeacute des deux eacuteleacutements principaux suivants

bull La meacutemoire centrale qui sert agrave meacutemoriser des ordres ainsi que des informationsmanipuleacutees par le programme Scheacutematiquement on peut dire qursquoelle estcomposeacutee drsquoemplacements repeacutereacutes chacun par un nom (cocircteacute programmeur) et parune adresse (cocircteacute ordinateur)

bull Lrsquouniteacute centrale qui exeacutecute une agrave une les instructions du programme dans leurordre de lecture Elle constitue la partie active de lrsquoordinateur Ces actions ennombre limiteacute sont les suivantes

ndash deacuteposer une information dans une case meacutemoire

ndash exeacutecuter des opeacuterations simples telles que lrsquoaddition la soustraction etc

ndash comparer des valeurs

ndash communiquer une information eacuteleacutementaire par lrsquointermeacutediaire du clavier ou delrsquoeacutecran

ndash coder lrsquoinformation

Du fait de la technologie toutes les informations manipuleacutees par un ordinateur sontcodeacutees en binaire (0 ou 1) Pour srsquoaffranchir du langage machine binaire on faitappel agrave un langage de programmation dit eacutevolueacute tel que les langages Pascal C ouJava Un tel programme se compose drsquoinstructions deacutefinies par le langage dontlrsquoenchaicircnement reacutealise la solution du problegraveme poseacute

Pour traduire ce programme dans le langage binaire directement exeacutecutable par lrsquoordi-nateur nous devons utiliser un programme approprieacute appeleacute compilateur ou interpreacute-teur Dans cet ouvrage nous nous proposons drsquoeacutetudier comment construire unprogramme en prenant comme support de langage le langage et le compilateur Java

I1

I2

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINTRODUCTION

22

public static void main(String [] argument) double a Systemoutprint(Entrer une valeur ) a = Lired() Systemoutprint( Vous avez entre + a)

a Repeacuterez les instructions deacutefinissant la fonction main() et celles deacutelimitant la classePremier

b Recherchez les instructions drsquoaffichage

c Quel est le rocircle de lrsquoinstruction double a

d Deacutecrivez lrsquoexeacutecution de ce programme en supposant que lrsquoutilisateur entre auclavier la valeur 10

En suivant la structure ci-dessous et en vous aidant du programme donneacute agrave lasection laquo Calcul de la circonfeacuterence drsquoun cercle raquo eacutecrivez un programme quicalcule le peacuterimegravetre drsquoun carreacute (rappel peacuterimegravetre = 4 times cocircteacute)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe

public static void main(String [] argument) Deacuteclaration des variables repreacutesentant le peacuterimegravetre et le cocircteacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le message Valeur du cocircteacute agrave lrsquoeacutecran helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Lire au clavier une valeur placer cette valeur dans la variable correspondante helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le peacuterimegravetre du carreacute helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

Eacutecrire un premier programme JavaEn suivant la structure de lrsquoexercice preacuteceacutedent eacutecrivez un programme qui calculela surface drsquoun rectangle (rappel surface = largeur times longueur)

En observant la formule

a Combien de variables faut-il deacuteclarer pour exeacutecuter le calcul

b Combien de valeurs faut-il saisir au clavier

I3

I4

copy copyright Eacuteditions Eyrolles

PARTIE 1

Les outils et techniques de base

CHAPITRE 1

Stocker une information 25

CHAPITRE 2

Communiquer une information 49

CHAPITRE 3

Faire des choix 61

CHAPITRE 4

Faire des reacutepeacutetitions 81

copy copyright Eacuteditions Eyrolles

1Stocker une information

En deacutecrivant au chapitre introductif laquo Naissance drsquoun programme raquo lrsquoalgorithme deconfection drsquoun cafeacute chaud non sucreacute nous avons constateacute que la toute premiegravere eacutetapepour construire une marche agrave suivre consistait agrave deacuteterminer les objets utiles agrave la reacutesolutiondu problegraveme En effet pour faire du cafeacute nous devons prendre le cafeacute lrsquoeau le filtre etc

De la mecircme faccedilon lorsqursquoun deacuteveloppeur drsquoapplications conccediloit un programme il doit nonpas laquoprendreraquo au sens litteacuteral du mot les donneacutees numeacuteriques mais deacutefinir ces donneacuteesainsi que les objets neacutecessaires agrave la reacutealisation du programme Cette deacutefinition consiste agravenommer ces objets et agrave deacutecrire leur contenu afin qursquoils puissent ecirctre stockeacutes en meacutemoire

Crsquoest pourquoi nous eacutetudions dans ce chapitre ce qursquoest une variable et comment la deacutefi-nir (laquo La notion de variable raquo) Nous examinons ensuite agrave la section laquo Lrsquoinstructiondrsquoaffectation raquo comment placer une valeur dans une variable par lrsquointermeacutediaire delrsquoinstruction drsquoaffectation Enfin nous analysons lrsquoincidence du type des variables sur lereacutesultat drsquoun calcul arithmeacutetique (laquo Les opeacuterateurs arithmeacutetiques raquo)

Afin de clarifier les explications vous trouverez tout au long du chapitre des exemplessimples et concis Ces exemples ne sont pas des programmes complets mais de simplesextraits qui eacuteclairent un point preacutecis du concept abordeacute Vous trouverez en fin de chapi-tre (laquo Calculer des statistiques sur des opeacuterations bancaires raquo) un programme entier quiaborde et reacutesume toutes les notions rencontreacutees au fil de ce chapitre

La notion de variableUne variable permet la manipulation de donneacutees et de valeurs Elle est caracteacuteriseacutee parles eacuteleacutements suivants

bull Un nom qui sert agrave repeacuterer un emplacement en meacutemoire dans lequel une valeur estplaceacutee Le choix du nom drsquoune variable est libre Il existe cependant des contraintesque nous preacutesentons agrave la section laquo Les noms de variables raquo

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

26

bull Un type qui deacutetermine la faccedilon dont est traduite la valeur en code binaire ainsi que lataille de lrsquoemplacement meacutemoire Nous examinons ce concept agrave la section laquo La notionde type raquo Plusieurs types simples sont preacutedeacutefinis dans le langage Java et nous endeacutetaillons les caracteacuteristiques agrave la section laquo Les types de base en Java raquo

Les noms de variablesLe choix des noms de variables nrsquoest pas limiteacute Il est toutefois recommandeacute drsquoutiliserdes noms eacutevocateurs Par exemple les noms des variables utiliseacutees dans une applicationqui gegravere les codes-barres de produits vendus en magasin sont plus certainementlaquo article prix codebarre raquo que laquo xyz1 xyz2 xyz3 raquo Les premiers en effet eacutevoquentmieux lrsquoinformation stockeacutee que les seconds

Les contraintes suivantes sont agrave respecter dans lrsquoeacutecriture des noms de variables

bull Le premier caractegravere drsquoune variable doit obligatoirement ecirctre diffeacuterent drsquoun chiffre

bull Aucun espace ne peut figurer dans un nom

bull Les majuscules sont diffeacuterentes des minuscules et tout nom de variable posseacutedant unemajuscule est diffeacuterent du mecircme nom eacutecrit en minuscule

bull Les caractegraveres amp ~ rsquo ( ) [ ] - | ` ^ = sect ltgt pound ainsi que et ne peuvent ecirctre utiliseacutes dans lrsquoeacutecriture drsquoun nom de variable

bull Tout autre caractegravere peut ecirctre utiliseacute y compris les caractegraveres accentueacutes le caractegraverede soulignement (_) et les caractegraveres $ et micro

bull Le nombre de lettres composant le nom drsquoune variable est indeacutefini Neacuteanmoinslrsquoobjectif drsquoun nom de variable eacutetant de renseigner le programmeur sur le contenu dela variable il nrsquoest pas courant de rencontrer des noms de variables de plus de trentelettres

Exemples

La notion de typeUn programme doit geacuterer des informations de nature diverse Ainsi les valeurs tellesque 123 ou 24 sont de type numeacuterique tandis que Spinoza est un mot composeacute de carac-tegraveres Si lrsquoecirctre humain sait drsquoun simple coup drsquoœil faire la distinction entre un nombreet un mot lrsquoordinateur nrsquoen est pas capable Le programmeur doit donc laquo expliquer raquo agravelrsquoordinateur la nature de chaque donneacutee Cette explication passe par la notion de type

Le type drsquoune valeur permet de diffeacuterencier la nature de lrsquoinformation stockeacutee dans unevariable

Nom de variable autoriseacute Nom de variable interdit

compte

num_2 ( _ et non pas - )undeux (et non pas un deux)VALEUR_temporaire

Val$solde

pourquoipas caractegravere interdit2001espace pas de chiffre en deacutebut de variable-plus caractegravere - interditadresse caractegravere interditahah caractegravere interdit

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

27

Agrave chaque type sont associeacutes les eacuteleacutements suivants

bull Un code speacutecifique permettant la traduction de lrsquoinformation en binaire et reacuteciproque-ment

bull Un ensemble drsquoopeacuterations reacutealisables en fonction du type de variable utiliseacute Parexemple si la division est une opeacuteration coheacuterente pour deux valeurs numeacuteriques ellene lrsquoest pas pour deux valeurs de type caractegravere

bull Un intervalle de valeurs possibles deacutependant du codage utiliseacute Par deacutefinition agravechaque type correspond un mecircme nombre drsquooctets et par conseacutequent un nombrelimiteacute de valeurs diffeacuterentes

En effet un octet est un regroupement de 8 bits sachant qursquoun bit ne peut ecirctre qursquoun 0 ouun 1 Lorsqursquoune donneacutee est codeacutee sur 1 octet elle peut prendre les valeurs 00000000(8 zeacuteros) ou encore 111111111 (8 un) et toutes les valeurs intermeacutediaires entre ces deuxextrecircmes (par exemple 10101010 11110000 ou 10010110)

En fait une donneacutee codeacutee sur 8 bits peut par le jeu des combinaisons de 0 et de 1 pren-dre 28 valeurs diffeacuterentes soit 256 valeurs possibles comprises entre ndash 128 et 127Lrsquointervalle [ndash 128 127] est en effet composeacute de 256 valeurs et possegravede autant devaleurs positives que neacutegatives

Pour repreacutesenter la valeur numeacuterique 120 un codage sur 1 octet suffit mais pour repreacute-senter la valeur 250 1 octet ne suffit pas et il est neacutecessaire drsquoutiliser un codage sur2 octets

Les types de base en JavaChaque langage de programmation propose un ensemble de types de base permettant lamanipulation de valeurs numeacuteriques entiegraveres reacuteelles ou caractegraveres Ces types sont

bull repreacutesenteacutes par un mot-cleacute preacutedeacutefini par le langage

bull dits simples car agrave un instant donneacute une variable de type simple ne peut contenirqursquoune et une seule valeur

Agrave lrsquoopposeacute il existe des types appeleacutes types structureacutes qui permettent le stockage sousun mecircme nom de variable de plusieurs valeurs de mecircme type ou non Il srsquoagit destableaux des classes des vecteurs ou encore des dictionnaires Ces types structureacutes sonten geacuteneacuteral deacutefinis par le programmeur Nous les eacutetudions en deacutetail dans la troisiegravemepartie de cet ouvrage intituleacutee laquo Outils et techniques orienteacutes objet raquo

Pour seacutelectionner un type plutocirct qursquoun autre le langage Java deacutefinit huit types simplesqui appartiennent selon ce qursquoils repreacutesentent agrave lrsquoune ou lrsquoautre des quatre cateacutegoriessuivantes logique texte entier reacuteel

Cateacutegorie logique

Il srsquoagit du type boolean Les valeurs logiques ont deux eacutetats laquo true raquo (vrai) oulaquo false raquo (faux) Elles ne peuvent prendre aucune autre valeur que ces deux eacutetats

Cateacutegorie caractegravere

Deux types deacutefinissent cette cateacutegorie le type char et le type String copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

28

Le type char permet de repreacutesenter les caractegraveres isoleacutes alors que le type String sert agravedeacutecrire des seacutequences de caractegraveres En ce sens il ne srsquoagit pas drsquoun type simple

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Pour deacutecrire une variable de type char lrsquoordinateur utilise un code sur 2 octets De cettefaccedilon il lui est possible drsquoutiliser jusqursquoagrave 216 caractegraveres soit 65 536 caractegraveres diffeacute-rents En reacutealiteacute Java utilise une table de correspondance appeleacutee jeu de caractegraveresUnicode Cette table associe un caractegravere agrave une valeur numeacuterique

Par exemple dans la table Unicode le caractegravere A majuscule a pour valeur deacutecimale 65et le caractegravere a minuscule la valeur deacutecimale 97

La table Unicode est organiseacutee comme suit

bull Les 31 premiers caractegraveres ne peuvent ecirctre afficheacutes (tabulation saut de ligne bipsonore etc)

bull Les caractegraveres compris entre le 32e et le 127e correspondent aux caractegraveres du codeASCII (American Standard Code for Information Interchange) qui eacutetait jusqursquoagravepreacutesent le code deacutefinissant tout caractegravere Dans cet intervalle tous les caractegraveres debase sont deacutefinis crsquoest-agrave-dire lrsquoensemble des lettres de lrsquoalphabet en minuscules et enmajuscules ainsi que les signes de ponctuation et les symboles matheacutematiques

bull Les caractegraveres compris entre le 128e et le 256e caractegraveres correspondent agrave des carac-tegraveres speacuteciaux comme les caractegraveres accentueacutes en minuscules et en majuscules et lescaractegraveres semi graphiques Les codes de ces caractegraveres font partie des extensions quipeuvent diffeacuterer selon les pays ou les environnements de travail Ces extensions sontdeacutefinies agrave partir du jeu de caractegraveres employeacute par votre environnement et diffegraverentdonc drsquoun type drsquoordinateur agrave un autre

Pour connaicirctre le code Unicode drsquoun caractegravere accentueacute sur votre ordinateur reportez-vous agravelrsquoexemple de la section laquo La boucle for raquo du chapitre 4 laquo Faire des reacutepeacutetitions raquo

bull Agrave partir du 257e caractegravere il est possible de deacutefinir son propre jeu de caractegraveres dansla table Unicode de faccedilon agrave repreacutesenter par exemple des caractegraveres arabes chinoisou japonais

Cateacutegorie entier

Cette cateacutegorie contient quatre types distincts byte short int long Chacun de cestypes autorise la manipulation de valeurs numeacuteriques entiegraveres positives ou neacutegativesLeur diffeacuterence reacuteside essentiellement dans le nombre drsquooctets utiliseacute pour coder lecontenu de la variable

Type Nombre drsquooctets Eacuteventail de valeurs

byte 1 octet de ndash 128 agrave 127

short 2 octets de ndash 32 768 agrave 32 767

int 4 octets de ndash 2 147 483 648 agrave 2 147 483 647

long 8 octets de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

29

Dans certains cas il est inteacuteressant de repreacutesenter une valeur entiegravere sous forme octale ouhexadeacutecimale comme pour lrsquoaffichage des caractegraveres de la table Unicode (voir au chapitre 2laquoCommuniquer une informationraquo la section laquoAfficher les caractegraveres accentueacutesraquo)

Pour repreacutesenter un nombre sous forme octale il est neacutecessaire de placer un zeacutero audeacutebut du nombre Pour la repreacutesentation sous forme hexadeacutecimale les caractegraveres 0xdoivent ecirctre placeacutes en deacutebut de valeur

Dans le langage Java tous les types de la cateacutegorie entier ont un signe (+ ou ndash)

Cateacutegorie reacuteel (flottant)

La cateacutegorie reacuteel permet lrsquoemploi de nombres agrave virgule appeleacutes nombres reacuteels ou encoreflottants

Deux types composent cette cateacutegorie le type float et le type double Une expressionnumeacuterique de cette cateacutegorie peut srsquoeacutecrire en notation deacutecimale ou exponentielle

bull La notation deacutecimale contient obligatoirement un point symbolisant le caractegraverelaquo virgule raquo du chiffre agrave virgule Les valeurs 673 -3 ou 64 sont des valeurs reacuteellesutilisant la notation deacutecimale

bull La notation exponentielle utilise la lettre E pour deacuteterminer ougrave se trouve la valeur delrsquoexposant (puissance de 10) Les valeurs 876E4 et 65E-12 sont des valeurs utilisantla notation exponentielle

Dans les deux cas le nombre reacuteel est suivi de la lettre F (pour float) ou D (pour double)Les caractegraveres minuscules f ou d sont eacutegalement autoriseacutes La distinction entre float etdouble srsquoeffectue sur le nombre drsquooctets utiliseacute pour coder lrsquoinformation Il en reacutesulteune preacutecision plus ou moins grande suivant le type utiliseacute

Exemple

bull La valeur 215F repreacutesente un simple flottant (type float)

bull La valeur 135E22 repreacutesente aussi un flottant de grande taille

bull La valeur 676F est une valeur de type float de taille simple

bull La valeur 4634E+234D correspond agrave un flottant de double preacutecision (type double)

En langage Java toute valeur numeacuterique reacuteelle est deacutefinie par deacutefaut en double preacuteci-sion Par conseacutequent la lettre d (ou D) placeacutee en fin de valeur nrsquoest pas neacutecessaire Parcontre degraves que lrsquoon utilise une variable float la lettre f (ou F) est indispensable souspeine drsquoerreur de compilation

Valeur deacutecimale Valeur octale Valeur hexadeacutecimale

45 055 0x2d

Type Nombre drsquooctets Eacuteventail des valeurs

float 4 octets de 140239846e-45F agrave 3402823347e38F

double 8 octets de 494065645841246544e-324D agrave 179769313486231570e308D

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

30

Comment choisir un type de variable plutocirct qursquoun autre Sachant qursquoune variable de type int (codeacutee sur 4 octets) peut prendre toutes les valeursde lrsquointervalle [ndash21474836482147483647] et donc prendre en particulier toutes lesvaleurs comprises entre ndash32768 et 32767 (type short) ou mecircme entre ndash128 et 127 (typebyte) posons-nous les questions suivantes

bull Pourquoi ne pas deacuteclarer toutes les variables entiegraveres drsquoun programme en type long(le type long nous offrant le plus grand choix de valeurs entiegraveres)

bull Pourquoi ne pas deacuteclarer les variables reacuteelles drsquoun programme en type double plutocirctqursquoen float

Pour reacutepondre agrave ces questions examinons le nombre drsquooctets utiliseacutes par un programmede gestion de comptes bancaires Pour simplifier supposons que le programme garde enmeacutemoire les 10 derniegraveres opeacuterations bancaires et le solde de chaque compte Imaginonsenfin que notre banque gegravere 50 000 comptes

Pour stocker les 10 derniegraveres opeacuterations nous devons deacuteclarer 10 variables plus 1 pourle solde du compte soit 11 variables Les valeurs sont des montants en francs et centi-mes donc des valeurs reacuteelles

bull Si nous deacuteclarons lrsquoensemble de ces variables en type double (8 octets) le pro-gramme utilise alors 50 000 times 11 times 8 octets soit 44 000 000 octets soit 44 meacutega-octets de la meacutemoire de lrsquoordinateur

bull Si nous choisissons de prendre des variables de type float (ce qui reste coheacuterentpuisque les montants en francs nrsquoont pas besoin drsquoecirctre drsquoune preacutecision extrecircme) notreprogramme nrsquoutilise plus que 22 meacutegaoctets soit deux fois moins que preacuteceacutedemment

Bien entendu cet exemple simpliste nrsquoa pour seul objectif que de montrer lrsquoeffet duchoix du type de variable sur le taux drsquooccupation de la meacutemoire de lrsquoordinateur Ilexiste en reacutealiteacute un grand nombre de techniques pour optimiser la gestion de lameacutemoire de lrsquoordinateur

Remarquons cependant que la premiegravere deacutemarche pour geacuterer au mieux la meacutemoire delrsquoordinateur consiste agrave bien choisir le type de ses variables Si lrsquoon sait que par deacutefini-tion une variable ne deacutepasse jamais pour un programme donneacute la valeur numeacuterique120 celle-ci doit ecirctre deacuteclareacutee avec le type byte

Deacuteclarer une variableLa deacutefinition drsquoune variable dans un programme est reacutealiseacutee par lrsquointermeacutediaire delrsquoinstruction de deacuteclaration des variables Au cours de cette instruction le program-meur donne le type et le nom de la variable Pour deacuteclarer une variable il suffit drsquoeacutecrirelrsquoinstruction selon la syntaxe suivante

type nomdevariable

ou

type nomdevariable1 nomdevariable2

ougrave type correspond agrave lrsquoun des mots-cleacutes agrave choisir parmi ceux donneacutes aux sections preacuteceacute-dentes (boolean char String byte short int long float ou double) Si deux variables

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

31

de mecircme type sont agrave deacuteclarer il nrsquoest pas besoin de reacutepeacuteter le type une virgule seacuteparantles deux noms suffisant agrave les distinguer

Pour expliquer agrave lrsquoordinateur que lrsquoinstruction de deacuteclaration est termineacutee pour le typedonneacute un point virgule () est placeacute obligatoirement agrave la fin de la ligne drsquoinstruction

Exemple

float f1 f2 Deacuteclaration de deux variables de type float

une virgule seacutepare les deux noms de variables

long CodeBar Deacuteclaration drsquoune variable de type long

int test Deacuteclaration drsquoune variable de type int

char choix tmp Deacuteclaration de deux variables de type char

boolean OK Deacuteclaration drsquoune variable de type boolean

Les instructions de deacuteclaration peuvent ecirctre placeacutees indiffeacuteremment au deacutebut ou encours de programme Une fois la variable deacuteclareacutee lrsquointerpreacuteteur Java reacuteserve au coursde lrsquoexeacutecution du programme un emplacement meacutemoire correspondant en taille agrave celledemandeacutee par le type Il associe ensuite le nom de la variable agrave lrsquoadresse de lrsquoemplace-ment meacutemoire

Agrave cette eacutetape du programme remarquons que lrsquoemplacement ainsi deacutefini est vide Silrsquoon souhaite afficher son contenu sans y avoir preacutealablement deacuteposeacute de valeur lecompilateur eacutemet le message drsquoerreur suivant Variable may not have been initia-lized Cette erreur indique que la variable dont on souhaite afficher le contenu nrsquoa paseacuteteacute initialiseacutee Comme lrsquointerpreacuteteur Java ne peut afficher un emplacement meacutemoirevide lrsquoexeacutecution du programme nrsquoest pas possible

Lrsquoinstruction drsquoaffectationUne fois la variable deacuteclareacutee il est neacutecessaire de stocker une valeur agrave lrsquoemplacementmeacutemoire deacutesigneacute Pour ce faire nous utilisons lrsquoinstruction drsquoaffectation qui nouspermet drsquoinitialiser ou de modifier en cours drsquoexeacutecution du programme le contenu delrsquoemplacement meacutemoire (le contenu drsquoune variable nrsquoeacutetant par deacutefinition pas constant)

Rocircle et meacutecanisme de lrsquoaffectation

Lrsquoaffectation est le meacutecanisme qui permet de placer une valeur dans un emplacementmeacutemoire Elle a pour forme

Variable = Valeur

ou encore

Variable = Expression matheacutematique

Le signe eacutegal (=) symbolise le fait qursquoune valeur est placeacutee dans une variable Pour eacutevitertoute confusion sur ce signe matheacutematique bien connu nous prendrons lrsquohabitude de letraduire par les termes prend la valeur

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

32

Examinons les exemples suivants en supposant que les variables n et p soient deacuteclareacuteesde type entier

n = 4 n prend la valeur 4 p = 5n+1 calcule la valeur de lrsquoexpression matheacutematique soit 54+1

range la valeur obtenue dans la variable repreacutesenteacutee par p

Lrsquoinstruction drsquoaffectation srsquoeffectue dans lrsquoordre suivant

1 Calcule la valeur de lrsquoexpression figurant agrave droite du signe eacutegal

2 Range le reacutesultat obtenu dans la variable mentionneacutee agrave gauche du signe eacutegal

Drsquoune maniegravere geacuteneacuterale il est inteacuteressant de remarquer que la variable placeacutee agrave droite dusigne = nrsquoest jamais modifieacutee alors que celle qui est agrave gauche lrsquoest toujours Comme unevariable de type simple ne peut stocker qursquoune seule valeur agrave la fois si la variable situeacuteeagrave gauche possegravede une valeur avant lrsquoaffectation cette valeur est purement et simplementremplaceacutee par la valeur situeacutee agrave droite du signe =

Exemple

a = 1 b = a + 3 a = 3

Lorsqursquoon deacutebute en programmation une bonne meacutethode pour comprendre ce quereacutealise un programme consiste agrave eacutecrire pour chaque instruction exeacutecuteacutee un eacutetat detoutes les variables deacuteclareacutees Il suffit pour cela de construire un tableau dont chaquecolonne repreacutesente une variable deacuteclareacutee dans le programme et chaque ligne une instruc-tion de ce mecircme programme Soit pour notre exemple

Le tableau est composeacute des deux colonnes a et b et des trois lignes associeacutees aux instruc-tions drsquoaffectation du programme Ce tableau montre que les instructions a = 1 et a = 3font que la valeur initiale de a (1) est effaceacutee et eacutecraseacutee par la valeur 3

Deacuteclaration et affectation Comme nous lrsquoavons vu agrave la section laquo Deacuteclarer une variable raquo la deacuteclaration est utiliseacuteepour reacuteserver un emplacement meacutemoire Une fois reacuteserveacute lrsquoemplacement reste videjusqursquoagrave ce qursquoune valeur y soit placeacutee par lrsquointermeacutediaire de lrsquoaffectation

Il est cependant risqueacute de deacuteclarer une variable sans lui donner de valeur initiale Eneffet le compilateur Java veacuterifie strictement si toutes les variables contiennent unevaleur ou non Une erreur de compilation est deacutetecteacutee degraves qursquoune seule variable necontient pas de valeur agrave un moment donneacute du programme

instruction a b

a = 1 1 -

b = a + 3 1 4

a = 3 3 4

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

33

Initialiser une variable

Pour eacuteviter toute erreur de compilation une bonne habitude consiste agrave initialiser toutesles variables au moment de leur deacuteclaration en proceacutedant de la faccedilon suivante

float f1 = 00f f2 = 12f Initialisation de deux floatlong CodeBar = 123456789 Initialisation drsquoun longint test = 0 Initialisation drsquoune variable de type intboolean OK = true Initialisation drsquoun boolean

De cette faccedilon les variables fl f2 CodeBar et OK sont deacuteclareacutees Le compilateurreacuteserve un emplacement meacutemoire pour chacune drsquoentre elles Gracircce au signe drsquoaffecta-tion le compilateur place dans chacun des emplacements meacutemoire respectifs les valeursdonneacutees

Initialiser une variable de type char

Les variables de type char srsquoinitialisent drsquoune faccedilon particuliegravere Supposons que lrsquoonsouhaite deacuteclarer et placer le caractegravere n dans une variable choix de type char Pour celaeacutecrivons lrsquoinstruction de deacuteclaration et drsquoinitialisation suivante

char choix = n

Pour le compilateur cette instruction est probleacutematique car il considegravere n non pascomme le laquo caractegravere n raquo mais comme une variable appeleacutee n

Pour lever cette ambiguiumlteacute nous devons entourer le caractegravere n drsquoapostrophes de lafaccedilon suivante

char choix = rsquonrsquo

Ainsi des donneacutees telles que rsquoarsquo rsquorsquo rsquo$rsquo rsquo3rsquo rsquorsquo ou rsquorsquo sont consideacutereacutees comme descaractegraveres

Par contre c = rsquoabrsquo ne peut srsquoeacutecrire car rsquoabrsquo nrsquoest pas un caractegravere mais un mot dedeux caractegraveres Nous devons dans ce cas utiliser une variable de type String

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String une approche versla notion drsquoobjet raquo

Quelques confusions agrave eacuteviter Le symbole de lrsquoaffectation est le signe eacutegal (=) Ce signe tregraves largement utiliseacute danslrsquoeacutecriture drsquoeacutequations matheacutematiques est source de confusion lorsqursquoil est employeacute agravecontre-sens

Pour mieux nous faire comprendre eacutetudions trois cas

1 a = a + 1

Si cette expression est impossible agrave eacutecrire drsquoun point de vue matheacutematique elle esttregraves largement utiliseacutee dans le langage informatique Elle signifie

ndash calculer lrsquoexpression a + 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

34

ndash ranger le reacutesultat dans a

Ce qui revient agrave augmenter de 1 la valeur de a

2 a + 5 = 3

Cette expression nrsquoa aucun sens drsquoun point de vue informatique Il nrsquoest pas possiblede placer une valeur agrave lrsquointeacuterieur drsquoune expression matheacutematique puisque aucunemplacement meacutemoire nrsquoest attribueacute agrave une expression matheacutematique

3 a = b et b = a

Agrave lrsquoinverse de lrsquoeacutecriture matheacutematique ces deux instructions ne sont pas eacutequiva-lentes La premiegravere place le contenu de b dans a tandis que la seconde place lecontenu de a dans b

Eacutechanger les valeurs de deux variablesNous souhaitons eacutechanger les valeurs de deux variables de mecircme type appeleacutees a et b crsquoest-agrave-dire que nous voulons que a prenne la valeur de b et que b prenne celle de a Lapratique courante de lrsquoeacutecriture des expressions matheacutematiques fait que dans un premiertemps nous eacutecrivions les instructions suivantes

a = b b = a

Veacuterifions sur un exemple si lrsquoexeacutecution de ces deux instructions eacutechange les valeurs dea et de b Pour cela supposons que les variables a et b contiennent initialement respecti-vement 2 et 8

Du fait du meacutecanisme de lrsquoaffectation la premiegravere instruction a = b deacutetruit la valeur dea en placcedilant la valeur de b dans la case meacutemoire a Lorsque la seconde instruction b = aest reacutealiseacutee la valeur placeacutee dans la variable b est celle contenue agrave cet instant dans lavariable a crsquoest-agrave-dire la valeur de b Il nrsquoy a donc pas eacutechange car la valeur de a adisparu par eacutecrasement lors de lrsquoexeacutecution de la premiegravere instruction

Une solution consiste agrave utiliser une variable suppleacutementaire destineacutee agrave contenir tempo-rairement une copie de la valeur de a avant que cette derniegravere soit eacutecraseacutee par la valeurde b Pour eacutevoquer le caractegravere temporaire de la copie nous appellerons cette nouvellevariable tmp (nous aurions pu choisir tout aussi bien tempo ou ttt) Voici le deacuteroulementdes opeacuterations

tmp = a a = b b = tmp

a b

valeur initiale 2 8

a = b 8 8

b = a 8 8

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

35

Veacuterifions qursquoil y a reacuteellement eacutechange en supposant que nos variables a et b contiennentinitialement respectivement 2 et 8

Agrave la lecture de ce tableau nous constatons qursquoil y a bien eacutechange des valeurs entre a etb La valeur de a est copieacutee dans un premier temps dans la variable tmp La valeur de apeut degraves lors ecirctre effaceacutee par celle de b Pour finir gracircce agrave la variable tmp la variable breacutecupegravere lrsquoancienne valeur de a

Une autre solution vous est proposeacutee dans la feuille drsquoexercices placeacutee agrave la fin du chapitre

Les opeacuterateurs arithmeacutetiquesEacutecrire un programme nrsquoest pas uniquement eacutechanger des valeurs mais crsquoest aussi calcu-ler des eacutequations matheacutematiques plus ou moins complexes Pour exprimer une opeacutera-tion le langage Java utilise des caractegraveres qui symbolisent les opeacuterateurs arithmeacutetiques

Exemple

Soient a b c trois variables de mecircme type

bull Lrsquoopeacuteration drsquoaddition srsquoeacutecrit a = b + 4

bull Lrsquoopeacuteration de soustraction srsquoeacutecrit a = b ndash 5

bull Lrsquoopeacuteration de division srsquoeacutecrit a = b 2 et non pas a =

bull Lrsquoopeacuteration de multiplication srsquoeacutecrit a = b 4 et non pas a = 4b ou a = a x b

bull Lrsquoopeacuteration de modulo srsquoeacutecrit a = b 3

Le modulo drsquoune valeur correspond au reste de la division entiegravere Ainsi 5 2 = 1

Il srsquoagit de calculer la division en srsquoarrecirctant degraves que le valeur du reste devient infeacuterieureau diviseur de faccedilon agrave trouver un reacutesultat en nombre entier Lrsquoopeacuterateur nrsquoexiste paspour les reacuteels pour lesquels la notion de division entiegravere nrsquoexiste pas

a b tmp

valeur initiale 2 8 _

tmp = a 2 8 2

a = b 8 8 2

b = tmp 8 2 2

Symbole Opeacuteration

+ addition

- soustraction

multiplication

division

modulo

b2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

36

Lrsquoensemble de ces opeacuterateurs est utiliseacute pour calculer des expressions matheacutematiquescourantes Le reacutesultat de ces expressions nrsquoest cependant pas toujours celui auquel onsrsquoattend Trois pheacutenomegravenes ont une influence non neacutegligeable sur la valeur du reacutesultatdrsquoun calcul Ce sont

bull La prioriteacute des opeacuterateurs entre eux

bull Le type drsquoune expression matheacutematique

bull La transformation de types

La prioriteacute des opeacuterateurs entre euxLorsqursquoune expression arithmeacutetique est composeacutee de plusieurs opeacuterations lrsquoordina-teur doit pouvoir deacuteterminer quel est lrsquoordre des opeacuterations agrave effectuer Le calcul delrsquoexpression a ndash b c d peut signifier a priori

bull calculer la soustraction puis la division et pour finir la multiplication soit le calcul ((a - b) c) d

bull calculer la multiplication puis la division et pour finir la soustraction crsquoest-agrave-direlrsquoexpression a ndash (b (c d))

Afin drsquoeacuteviter toute ambiguiumlteacute il existe des regravegles de prioriteacute entre les opeacuterateurs regraveglesbaseacutees sur la deacutefinition de deux groupes drsquoopeacuterateurs

Les groupes eacutetant ainsi deacutefinis les opeacuterations sont reacutealiseacutees sachant que

bull Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacuterateurs(sens de lecture)

bull Le deuxiegraveme groupe a prioriteacute sur le premier

Lrsquoexpression a - b c d est calculeacutee de la faccedilon suivante

Cela signifie que lrsquoexpression est calculeacutee de la faccedilon suivante

a - (b c d)

Remarquons que les parenthegraveses permettent de modifier les regravegles de prioriteacute en forccedilantle calcul preacutealable de lrsquoexpression qui se trouve agrave lrsquointeacuterieur des parenthegraveses Ellesoffrent en outre une meilleure lisibiliteacute de lrsquoexpression

Groupe 1 Groupe 2

+ ndash

Prioriteacute Opeacuterateur

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la division apparaicirct dans le sens de la lecture avant la multiplication

Groupe 2 Le groupe 2 a prioriteacute sur le groupe 1 et la multiplication suit la division

Groupe 1 - La soustraction est la derniegravere opeacuteration agrave exeacutecuter car elle est du groupe 1

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

37

Le type drsquoune expression matheacutematiqueLe reacutesultat drsquoune expression matheacutematique peut ecirctre deacutetermineacute agrave partir du type de varia-bles (termes) qui composent lrsquoexpression

De ce fait pour un mecircme calcul le reacutesultat diffegravere selon qursquoil est effectueacute agrave lrsquoaide de varia-bles de type reacuteel ou de type entier

Exemple diviser deux entiers

int x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type entier Par conseacutequent lrsquoopeacuteration effec-tueacutee a pour reacutesultat une valeur entiegravere mecircme si lrsquoopeacuteration demandeacutee nrsquoa pas forceacutementun reacutesultat entier Soit pour notre exemple 2 et non 25 Cela ne correspond pas toujoursau reacutesultat attendu par le programmeur deacutebutant

Exemple diviser deux reacuteels

double x = 5 y = 2 z z = x y

Ici toutes les variables deacuteclareacutees sont de type reacuteel Par conseacutequent lrsquoopeacuteration effectueacuteedonne un reacutesultat de type reacuteel Ce reacutesultat correspond agrave la valeur geacuteneacuteralement attenduede ce type drsquoopeacuteration

La transformation de types Les termes drsquoune opeacuteration ne sont pas neacutecessairement tous du mecircme type Pour eacutecrireune opeacuteration toutes les combinaisons entre les diffeacuterentes cateacutegories de types peuventse preacutesenter

Terme Opeacuteration Terme Reacutesultat

Entier + - Entier Entier

Reacuteel + - Reacuteel Reacuteel

x y z

valeur initiale 5 2 -

z = x y 5 2 2

x y z

valeur initiale 5 2 -

z = x y 5 2 25

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

38

Lrsquoordinateur ne sait calculer une expression matheacutematique que lorsque toutes les varia-bles de lrsquoexpression sont du mecircme type En effet les opeacuterateurs arithmeacutetiques ne sontdeacutefinis que pour des variables de type identiqueLorsque tel nrsquoest pas le cas crsquoest-agrave-dire si lrsquoexpression est mixte lrsquoordinateur doit trans-former le type de certaines variables pour que tous les membres de lrsquoexpression devien-nent de mecircme typeCette transformation appeleacutee conversion drsquoajustement de type se reacutealise suivant unehieacuterarchie bien deacutetermineacutee qui permet de ne pas perdre drsquoinformation On dit que lecompilateur respecte lrsquointeacutegraliteacute des donneacutees La conversion drsquoun nombre reacuteel en nombre entier par exemple ne peut se reacutealiser qursquoensupprimant les nombres situeacutes apregraves la virgule et en ne gardant que la partie entiegravere dunombre Une telle conversion ne garantit pas lrsquointeacutegraliteacute des donneacutees car il y a perte dedonneacuteesCrsquoest pourquoi du fait du codage des donneacutees et du nombre drsquooctets utiliseacute pour cecodage le compilateur effectue automatiquement la conversion des donneacutees selonlrsquoordre suivant

byte -gt short -gt int -gt long -gt float -gt double

De cette faccedilon il est toujours possible de convertir un byte en long ou un int en floatPar contre il est impossible de transformer un float en short sans perte drsquoinformation

Exemple

int a = 4 result_int float x = 20f result_float result_float = a x result_int = a x

La troisiegraveme instruction montre que le calcul drsquoune opeacuteration dont les termes sont detype int et float donne pour reacutesultat un float La derniegravere instruction reacutevegravele que si lereacutesultat drsquoune opeacuteration est de type float il nrsquoest pas possible de le stocker dans unevariable de type int En effet la division drsquoun entier par un reacuteel est une opeacuterationtoujours possible agrave reacutealiser (le reacutesultat est de type reacuteel) mais lrsquoaffectation directe de cereacutesultat dans une variable entiegravere est impossible du fait que la conversion entraicircne uneperte drsquoinformation

Terme Opeacuteration Terme Reacutesultat

byte + - int int

int + - double double

a x result_float result_int

a = 4 4 _ _ _

x = 20f 4 20f _ _

result_float = ax 4 20f 20f _

result_int = ax 4 20f _ Impossible degraves la compilation

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

39

Une telle instruction provoque agrave la compilation une erreur dont le message est Incom-patible type for = Explicit cast needed to convert float to int Celasignifie laquo Type incompatible de part et drsquoautre du signe = Pour convertir un float enint il est neacutecessaire de le formuler explicitement par lrsquointermeacutediaire drsquoun cast raquo

Le cast

La conversion avec perte drsquoinformation est autoriseacutee dans certain cas gracircce au meacuteca-nisme du cast Il peut ecirctre utile de transformer un nombre reacuteel en entier par exemplepour calculer sa partie entiegravere Pour cela le compilateur demande de convertir explicite-ment les termes de lrsquoopeacuteration dans le type souhaiteacute en placcedilant devant la variable oulrsquoopeacuteration le type de conversion deacutesireacute Ainsi pour transformer un float en int ilsuffit de placer le terme (int) devant la variable ou lrsquoopeacuteration de type float

Exemple

int a = 5 result float x = 20f result = (int) a x

La derniegravere instruction montre que la conversion float vers int est autoriseacutee malgreacute laperte drsquoinformation (le chiffre 5 placeacute apregraves la virgule disparaicirct) Cette conversion nrsquoestpossible que si elle est preacuteciseacutement indiqueacutee au compilateur

Calculer des statistiques sur des opeacuterations bancairesPour reacutesumer en pratique lrsquoensemble des notions abordeacutees dans ce chapitre nous allonseacutecrire un programme dont le sujet se rapporte au thegraveme du projet eacutenonceacute agrave la fin duchapitre introductif laquo Naissance drsquoun programme raquo

Cahier des chargesLrsquoobjectif de ce programme est drsquoeacutetablir des statistiques sur lrsquoutilisation des diffeacuterentsmodes de paiement effectueacutes sur un compte bancaire Nous supposons que les moyenstechniques pour deacutebiter un compte sont au nombre de trois la Carte Bleue le cheacutequieret le virement Pour eacutevaluer le taux drsquoutilisation de ces trois moyens de paiement nousdevons calculer le pourcentage drsquoutilisation de chaque technique par rapport aux autresPar exemple pour connaicirctre le pourcentage drsquoutilisation de la Carte Bleue nous utili-sons le calcul suivant

Nombre de paiements par Carte Bleue Nombre total de paiements 100

a x result

a = 5 5 _ _

x = 20f 5 20f _

result = (int) a x 5 20f 2

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

40

Liste des opeacuterations

Partant du principe de deacutecomposition drsquoun problegraveme en sous-tacircches plus simples agrave reacuteali-ser distinguons pour reacutesoudre la question les quatre actions suivantes

1 Deacuteterminer le nombre de deacutebits par Carte Bleue chegraveque et virement Comme ilsrsquoagit du premier programme concernant ce thegraveme nous nrsquoavons pas encore saisi devaleur ni de ligne comptable Crsquoest pourquoi nous demandons agrave lrsquoutilisateur decommuniquer au programme ces trois informations par lrsquointermeacutediaire du clavier

2 Calculer le nombre total de paiements effectueacutes

3 Calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du virement

4 Afficher lrsquoensemble des reacutesultats

Dans un premier temps nous traiterons seacutepareacutement chacun de ces points afin de lesanalyser entiegraverement Pour finir nous eacutecrirons le programme dans son inteacutegraliteacute enregroupant chacun des points eacutetudieacutes

1 Il srsquoagit drsquoeacutecrire les instructions qui permettent agrave lrsquoutilisateur de communiquer desinformations agrave lrsquoordinateur agrave lrsquoaide du clavier Nous avons vu au chapitre introduc-tif un exemple de saisie drsquoune valeur au clavier (voir laquo Calcul de la circonfeacuterencedrsquoun cercle raquo) Cette opeacuteration se reacutealise en deux temps drsquoabord lrsquoaffichage agravelrsquoeacutecran drsquoun message informant lrsquoutilisateur drsquoune demande de saisie de valeur puisla saisie effective de lrsquoinformation Pour notre problegraveme ces deux points se tradui-sent de la faccedilon suivante

Systemoutprint( Nombre de paiement par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques eacutemis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei()

Chaque appel de la fonction Systemoutprint() affiche agrave lrsquoeacutecran le message placeacuteentre guillemets Trois messages sont afficheacutes chacun indiquant respectivement agravequel mode de paiement est associeacutee la valeur saisie par lrsquoutilisateur

Les valeurs agrave saisir correspondent aux nombres de deacutebits dans chaque mode de paie-ment Ces valeurs sont de type entier La fonction Lirei() donne lrsquoordre agrave lrsquoordi-nateur drsquoattendre la saisie drsquoune valeur entiegravere La saisie est effective lorsquelrsquoutilisateur valide sa reacuteponse en appuyant sur la touche laquo Entreacutee raquo du clavier Troisvaleurs sont agrave saisir et il est neacutecessaire drsquoappeler trois fois la fonction Lirei()

Pour plus drsquoinformations sur la fonction Lirei() voir le chapitre 2 laquo Communiquer uneinformation raquo

Une fois saisie chaque valeur doit ecirctre stockeacutee dans un emplacement meacutemoiredistinct Ces emplacements meacutemoire correspondent aux trois variables nbCB nbChe-que et nbVirement et sont deacuteclareacutes en deacutebut de programme gracircce agrave lrsquoinstruction

int nbCB = 0 nbCheque = 0 nbVirement = 0

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

41

2 Pour calculer le nombre total de paiements effectueacutes il suffit de faire la somme detoutes les opeacuterations de deacutebit pour tous les types de paiement soit lrsquoinstruction

nbDebit = nbCB + nbCheque + nbVirement

La variable nbDebit permet la meacutemorisation du nombre total drsquoopeacuterations effec-tueacutees quel que soit le mode de paiement Elle doit ecirctre deacuteclareacutee en mecircme temps queles autres variables du mecircme type

int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0

3 Pour calculer le pourcentage drsquoutilisation de la Carte Bleue du cheacutequier et du vire-ment nous allons drsquoabord eacutetudier le mode Carte Bleue puis appliquer cette analyseaux autres modes de paiement Rappelons que la formule du calcul de pourcentagepour la Carte Bleue est

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Soit en utilisant les variables deacuteclareacutees au point 1 nbCB nbDebit 100

Examinons sur un exemple numeacuterique le reacutesultat drsquoun tel calcul Supposons pourcela que nous ayons effectueacute 10 retraits Carte Bleue sur un total de 40 retraits Nousobtenons le calcul suivant 10 40 100 Soit 0 100 crsquoest-agrave-dire 0 La divisionest la premiegravere opeacuteration exeacutecuteacutee parce qursquoelle est du mecircme groupe que la multipli-cation et qursquoelle apparaicirct en premier dans lrsquoopeacuteration De surcroicirct les valeurs eacutetantde type entier la division a pour reacutesultat un nombre entier Ici 1040 a pour reacutesultat 0

Pour corriger cette erreur de calcul lrsquoideacutee est de reacutealiser une division sur des valeursreacuteelles et non sur des entiers Pour cela nous utilisons le meacutecanisme du cast quiplaceacute devant la variable nbCB transforme cette derniegravere en variable de type reacuteel etpermet la division en reacuteel Pour stocker le reacutesultat de cette opeacuteration nous deacuteclaronsune variable de type float nommeacutee prctCB

Lrsquoinstruction

prctCB = (float) nbCB nbDebit 100

permet de trouver un reacutesultat coheacuterent Veacuterifions cela sur un exemple numeacuteriqueSupposons que nous ayons effectueacute 10 deacutebits par Carte Bleue sur un total de20 retraits Gracircce au cast la valeur 10 correspondant agrave nbCB est transformeacutee en 100La division par 20 a donc un reacutesultat reacuteel eacutegal agrave 05 Le taux drsquoutilisation de la CarteBleue est donc de 05 100 soit 50

Pour eacutetablir le pourcentage relatif aux modes cheacutequier et virement il suffit drsquoappli-quer le mecircme calcul en utilisant des variables approprieacutees aux deux autres moyensde paiement En nommant prctCh et prctVi les variables associeacutees aux modes depaiement par chegraveque et par virement automatique le taux drsquoutilisation pour chacunde ces modes srsquoeacutecrit

prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

4 Lrsquoaffichage des reacutesultats srsquoeffectue par lrsquointermeacutediaire de la fonction Systemoutprint() Les valeurs calculeacutees sont commenteacutees de la faccedilon suivante

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

42

Systemoutprintln( Vous avez emis + nbDebit + ordres de debit ) Systemoutprintln( dont + prctCB + par Carte Bleue ) Systemoutprintln( + prctCh + par cheque ) Systemoutprintln( + prctVi + par virement )

Le programme final srsquoeacutecrit en regroupant lrsquoensemble des instructions deacutefinies preacuteceacutedem-ment et en les inseacuterant dans une classe agrave lrsquointeacuterieur de la fonction main()

Le code source complet

public class Statistique public static void main (String [] arg) int nbCB = 0 nbCheque = 0 nbVirement = 0 nbDebit = 0 float prctCB prctCh prctVi Systemoutprint( Nombre de paiements par Carte Bleue ) nbCB = Lirei() Systemoutprint( Nombre de cheques emis ) nbCheque = Lirei() Systemoutprint( Nombre de virements automatiques ) nbVirement = Lirei() nbDebit = nbCB + nbCheque + nbVirement prctCB = (float) nbCB nbDebit 100 prctCh = (float) nbCheque nbDebit 100 prctVi = (float) nbVirement nbDebit 100

Systemoutprintln(Vous avez emis + nbDebit + ordres de debit) Systemoutprintln(dont + prctCB + par Carte Bleue) Systemoutprintln( + prctCh + par cheque) Systemoutprintln( + prctVi + par virement)

Reacutesultat de lrsquoexeacutecutionAgrave lrsquoexeacutecution de ce programme nous avons agrave lrsquoeacutecran lrsquoaffichage suivant (les caractegraveresgriseacutes sont des valeurs choisies par lrsquoutilisateur)

Nombre de paiements par Carte Bleue 55Nombre de cheques emis 1100Nombre de virements automatiques 55Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

43

ReacutesumeacuteUne variable est caracteacuteriseacutee par un nom et un type Le nom sert agrave repeacuterer unemplacement meacutemoire Le type deacutetermine la taille de cet emplacement ainsi que lamaniegravere dont lrsquoinformation est codeacutee les opeacuterations autoriseacutees et lrsquointervalle desvaleurs repreacutesentables

Il existe plusieurs types simples dont les plus utiliseacutes sont les suivants

bull int Preacutesente les entiers variant pour le langage Java entre ndash 2 147 483 648 et2 147 483 647

bull double Deacutecrit de maniegravere approcheacutee les nombres reacuteels dont la valeur absolue estgrande Les variables de type double se notent soit sous forme deacutecimale (677ndash92 048 ou 22) soit sous forme exponentielle 314E4 325707e2 ndash45567E-5

bull char Deacutesigne les caractegraveres Les valeurs de type caractegravere se notent en placcedilantentre apostrophes le caractegravere lui-mecircme

Lrsquoinstruction drsquoaffectation permet de placer une valeur dans une variable Elle estde la forme variable = expression

Elle calcule drsquoabord la valeur de lrsquoexpression mentionneacutee agrave droite du signe = puiselle lrsquoaffecte agrave la variable placeacutee agrave gauche du signe

Il est conseilleacute drsquoattribuer une valeur initiale agrave une variable au moment de sa deacutecla-ration Par exemple int i = 6 ou char c = rsquonrsquo

Pour calculer des expressions matheacutematiques il existe cinq opeacuterateursarithmeacutetiques + -

Ces opeacuterateurs sont utiliseacutes respectivement pour lrsquoaddition la soustraction la multi-plication la division et le modulo (reste de la division entiegravere) Les expressionsarithmeacutetiques sont calculeacutees agrave partir des regravegles suivantes

bull Entier + - entier donne un entier

bull Reacuteel + - reacuteel donne un reacuteel

bull Les opeacuterations mixtes du type entier + - reacuteel ou reacuteel + - entier

donnent un reacutesultat dans la mesure ougrave la valeur reacutesultante nrsquoest pas deacutenatureacutee par laconversion des types Les conversions sont effectueacutees automatiquement dans le senssuivant

byte -gt short -gt int -gt long -gt float -gt double

Un int peut donc ecirctre transformeacute en un double Lrsquoinverse nrsquoest possible que lorsquele mode de conversion est explicitement deacutecrit dans lrsquoexpression comme dans n =(int) x ougrave n est de type int et x de type double

Lrsquoinformation ainsi transformeacutee est tronqueacutee pour ecirctre codeacutee sur moins drsquooctets

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

44

ExercicesRepeacuterer les instructions de deacuteclaration observer la syntaxe drsquoune instruction

Observez ce qui suit et indiquez ce qui est ou nrsquoest pas une deacuteclaration et ce qui estou nrsquoest pas valide

a int i j valeur b limite - j = 1024 c val = valeur 16 d char char e j + 1 f int X g float A h A = X 2 i X = A 2 j X = X 2

Comprendre le meacutecanisme de lrsquoaffectation

Quelles sont les valeurs des variables A B C apregraves lrsquoexeacutecution de chacun desextraits de programme suivants

bull Il existe des regravegles de prioriteacute entre les opeacuterateurs Pour cela deux groupesdrsquoopeacuterateurs sont deacutefinis

Dans un mecircme groupe lrsquoopeacuteration se fait dans lrsquoordre drsquoapparition des opeacutera-teurs

Le second groupe a prioriteacute sur le premier

Les parenthegraveses permettent la modification des prioriteacutes

a b

float A = 35f

float B = 15f

float C

C = A + B

B = A + C

A = B

double A = 01

double B = 11

double C D

B = A

C = B

D = C

A = D

Groupe 1 Groupe 2

+ -

11

12

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

45

Quelles sont les valeurs des variables a b et c valeur x y et z apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Comprendre le meacutecanisme drsquoeacutechange de valeursDans chacun des cas quelles sont les valeurs des variables a et b apregraves lrsquoexeacutecutionde chacune des instructions suivantes

Laquelle des options suivantes permet drsquoeacutechanger les valeurs des deux variables aet b

a = b b = a t = a a = b b = t t = a b = a t = b

Soit trois variables a b et c (entiegraveres) Eacutecrivez les instructions permutant lesvaleurs de sorte que la valeur de a passe dans b celle de b dans c et celle de c dansa Nrsquoutilisez qursquoune (et une seule) variable entiegravere suppleacutementaire nommeacutee tmp

Quel est lrsquoeffet des instructions suivantes sur les variables a et b (pour vous aiderinitialisez a agrave 2 et b agrave 5)

a = a + b b = a ndash b a = a ndash b

Calculer des expressions mixtesDonnez les valeurs des expressions suivantes sachant que i et j sont de type int etx et y de type double (x = 20 y = 30)

a i = 100 6 b j = 100 6 c i = 5 8 d (3 i - 2 j) (2 x - y)e 2 ((i 5) + (4 (j - 3)) (i + j - 2))f (i - 3 j) (x + 2 y) (i - j)

a b c

int a = 5 b

b = a + 4

a = a + 1

b = a ndash 4

int valeur = 2

valeur = valeur + 1

valeur = valeur 2

valeur = valeur 5

int x = 2 y = 10 z

z = x + y

x = 5

z = z ndash x

1 2

int a = 5

int b = 7

a = b

b = a

int a = 5

int b = 7

b = a

a = b

13

14

15

16

17

18

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

46

Donnez le type et la valeur des expressions suivantes sachant que n p r s et t sontde type int (n = 10 p = 7 r = 8 s = 7 t = 21) et que x est de type float(x = 20f )

Comprendre le meacutecanisme du castSoit les deacuteclarations suivantes

int valeur = 7 chiffre = 2 i1 i2 float f1 f2

Quelles sont les valeurs attribueacutees agrave i1 i2 f1 et f2 apregraves le calcul de

i1 = valeur chiffre i2 = chiffre valeur f1 = (float) (valeur chiffre) f2 = (float) (valeur chiffre) + 05f i1 = (int) f1 i2 = (int) f2 f1 = (float) valeur (float) chiffre f2 = (float) valeur (float) chiffre + 05f i1 = (int) f1 i2 = (int) f2

Le projet laquo Gestion drsquoun compte bancaire raquoDeacuteterminer les variables neacutecessaires au programmeLe programme de gestion drsquoun compte bancaire ne peut srsquoeacutecrire et srsquoexeacutecuter sansaucune variable Pour pouvoir deacutefinir toutes les variables neacutecessaires agrave la bonne marchedu programme nous devons examiner attentivement le cahier des charges deacutecrit auchapitre introductif laquo Naissance drsquoun programme raquo

La section laquo Les objets manipuleacutes raquo nous donne une premiegravere ideacutee des variables agrave deacutecla-rer Toutes les donneacutees relatives au compte bancaire y sont deacutecrites

Un compte bancaire est deacutefini par un ensemble de donneacutees

bull un numeacutero de compte

bull un type de compte (courant eacutepargne joint etc)

a b

x + n p

x + n p

(x + n) p

5 n

(n + 1) n

(n + 10) n

r + s t

r + t s

( r + t ) s

r + t s

(r + t) s

r + s r + s

(r + s) ( r + s)

r + s t

19

110

copy copyright Eacuteditions Eyrolles

Stocker une informationCHAPITRE 1

47

bull des lignes comptables posseacutedant chacune une valeur une date un thegraveme et un moyende paiement

Ces donneacutees peuvent ecirctre repreacutesenteacutees de la faccedilon suivante

Compte tenu de ces informations donnez un nom et un type Java pour chaque donneacuteedeacutefinie ci-dessus

Remarquons que le type qui repreacutesente les suites de caractegraveres (String) nrsquoa pas encoreeacuteteacute eacutetudieacute ni toutes ses fonctionnaliteacutes Il est possible de transformer pour lrsquoinstant lesdonneacutees Type du compte Thegraveme et Moyen de paiement en caractegraveres simples Par exem-ple le caractegravere C caracteacuterise le type du compte Courant le caractegravere J le compte Jointet le caractegravere E le compte Epargne

De la mecircme faccedilon la donneacutee Numeacutero du compte peut ecirctre transformeacutee dans un premiertemps en type long

Donneacutees Exemple Type de lrsquoobjet

Numeacutero du compte 4010205530 Suite de caractegraveres

Type du compte Courant Suite de caractegraveres

Valeur ndash152030 Numeacuterique

Date 04 03 1978 Date

Thegraveme Loyer Suite de caractegraveres

Moyen de paiement CB Suite de caractegraveres

copy copyright Eacuteditions Eyrolles

2Communiquer

une information

Un programme nrsquoa drsquointeacuterecirct que srsquoil produit un reacutesultat Pour communiquer ce reacutesultatlrsquoordinateur utilise lrsquoeacutecran Cette action qui consiste agrave afficher un message est appeleacuteeopeacuteration de sortie ou drsquoeacutecriture de donneacutees

Parallegravelement un programme ne produit de reacutesultats que si lrsquoutilisateur lui fournit aupreacutealable des informations Ces informations ou donneacutees sont transmises auprogramme le plus souvent par lrsquointermeacutediaire drsquoun clavier Dans le jargon informati-que cette opeacuteration est appeleacutee opeacuteration de saisie drsquoentreacutee ou encore de lecture dedonneacutees

Dans ce chapitre nous commenccedilons par eacutetudier les fonctionnaliteacutes proposeacutees par lelangage Java pour geacuterer les opeacuterations drsquoentreacutee-sortie (laquo La bibliothegraveque System raquo)

Agrave la section laquo Lrsquoaffichage de donneacutees raquo nous examinons ensuite comment afficher agravelrsquoeacutecran des messages et des donneacutees Enfin agrave la section laquo La saisie de donneacutees raquo nousproposons une technique de saisie de valeurs au clavier

La bibliothegraveque SystemNous lrsquoavons vu dans les exemples des chapitres preacuteceacutedents lrsquoaffichage de valeurs ou detexte est reacutealiseacute par lrsquoutilisation drsquoune fonction preacutedeacutefinie du langage Java Cette fonc-tion a pour nom drsquoappel Systemoutprint()

Pourquoi un nom si complexe pour reacutealiser une action aussi laquo simple raquo que lrsquoaffichagede donneacutees

Le langage Java est accompagneacute drsquoun ensemble de bibliothegraveques de programmes preacuteeacute-crits qui eacutepargnent au programmeur drsquoavoir agrave reacuteeacutecrire ce qui a deacutejagrave eacuteteacute fait depuis lesdeacutebuts de lrsquoegravere informatique Ces bibliothegraveques portent chacune un nom qui renseigne

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

50

sur leur fonctionnaliteacute Ainsi la bibliothegraveque ougrave se trouve lrsquoensemble des fonctions decalcul matheacutematique srsquoappelle Math et celle relative agrave la gestion des eacuteleacutements de basniveau (eacutecran clavier etc) impliquant le systegraveme de lrsquoordinateur srsquoappelle System

La gestion de lrsquoaffichage drsquoun message agrave lrsquoeacutecran ou la saisie de valeurs au clavier fontpartie des fonctions impliquant le systegraveme de lrsquoordinateur Crsquoest pourquoi le nomdrsquoappel de telles fonctions a pour premier terme System

Les opeacuterations drsquoentreacutee ou de sortie de donneacutees impliquent le systegraveme de lrsquoordinateurmais sont en rapport inverse lrsquoune de lrsquoautre Pour dissocier ces opeacuterations la librairieSystem est composeacutee de deux sous-ensembles in et out Lrsquoaffichage est une opeacuterationde sortie et fait donc partie des eacuteleacutements out de la classe System Le point () qui relie lemot System agrave out permet drsquoexpliquer agrave lrsquoordinateur que lrsquoon souhaite acceacuteder au sous-ensemble out de la librairie System plutocirct qursquoau sous-ensemble in Pour finir nousfaisons appel dans le sous-ensemble out agrave la fonction print qui affiche un message agravelrsquoeacutecran Le nom de la fonction print signifie imprimer car au tout deacutebut de lrsquoinformati-que les ordinateurs nrsquoavaient pas drsquoeacutecran et les reacutesultats drsquoun calcul eacutetaient imprimeacutessur papier ou sur carte informatique

La notation point () est une eacutecriture courante en programmation objet Comme nous leverrons au chapitre 7 laquo Les classes et les objets raquo elle offre le moyen drsquoacceacuteder agrave desprogrammes ou agrave des donneacutees speacutecifiques

Notons que dans la classe System se trouve aussi le sous-ensemble err qui permetdrsquoafficher les erreurs eacuteventuelles drsquoun programme sur la sortie standard des erreurs Cetype de sortie nrsquoest deacutefini que dans le monde Unix et la sortie err est identique agrave lasortie out dans le monde Dos

Lrsquoaffichage de donneacuteesLe principe geacuteneacuteral pour lrsquoaffichage drsquoun message est de placer ce dernier en paramegravetrede la fonction Systemoutprint() crsquoest-agrave-dire agrave lrsquointeacuterieur des parenthegraveses qui suiventle terme Systemoutprint Plusieurs possibiliteacutes existent quant agrave la forme et agrave la syntaxede ce message et nous les preacutesentons ci-apregraves

Affichage de la valeur drsquoune variableSoit la variable entiegravere valeur Lrsquoaffichage de son contenu agrave lrsquoeacutecran est reacutealiseacute par

int valeur = 22 Systemoutprint(valeur)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

22

Affichage drsquoun commentaireLe fait drsquoeacutecrire une valeur numeacuterique sans autre commentaire nrsquoa que peu drsquointeacuterecirctPour expliquer un reacutesultat il est possible drsquoajouter du texte avant ou apregraves la variablecomme dans lrsquoexemple

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

51

Systemoutprint( Le montant srsquoeleve a + valeur)

ou

Systemoutprint(valeur + correspond au montant total )

Pour ajouter un commentaire avant ou apregraves une variable il suffit de le placer entreguillemets ( ) et de lrsquoaccrocher agrave la variable agrave lrsquoaide du signe + De cette faccedilon lecompilateur est capable de distinguer le texte agrave afficher du nom de la variable Toutcaractegravere placeacute entre guillemets est un message alors qursquoun mot non entoureacute de guille-mets correspond au nom drsquoune variable

En reprenant la mecircme variable valeur qursquoagrave lrsquoexemple preacuteceacutedent le reacutesultat afficheacute pourle premier exemple est

Le montant srsquoeleve a 22

Ou encore pour le deuxiegraveme exemple

22 correspond au montant total

Affichage de plusieurs variablesOn peut afficher le contenu de plusieurs variables en utilisant la mecircme technique Lescommentaires sont placeacutes entre guillemets et les variables sont preacuteceacutedeacutees entoureacutees ousuivies du caractegravere + Le signe + reacuteunit chaque terme de lrsquoaffichage au suivant ou aupreacuteceacutedent Pour afficher le contenu de deux variables

int v = 5 s = 220

nous eacutecrivons

Systemoutprint(v + elements valent au total + s + francs )

Lrsquoexeacutecution de cette instruction a pour reacutesultat

5 elements valent au total 220 francs

Affichage de la valeur drsquoune expression arithmeacutetiqueDans une instruction drsquoaffichage il est possible drsquoafficher directement le reacutesultat drsquouneexpression matheacutematique sans qursquoelle ait eacuteteacute calculeacutee auparavant Par exemple nouspouvons eacutecrire

int a = 10 b = 5 Systemoutprint(a + fois + b + est egal a + a b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

10 fois 5 est egal a 50

Mais attention cette expression est calculeacutee au cours de lrsquoexeacutecution de lrsquoinstructionelle nrsquoest pas meacutemoriseacutee dans un emplacement meacutemoire Le reacutesultat ne peut donc pasecirctre reacuteutiliseacute dans un autre calcul

Remarquons en outre que lrsquoeacutecriture drsquoune expression matheacutematique agrave lrsquointeacuterieur de lafonction drsquoaffichage peut ecirctre source de confusion pour le compilateur surtout si

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

52

lrsquoexpression matheacutematique comporte un ou plusieurs signes + En remplaccedilant danslrsquoexemple preacuteceacutedent le signe par + nous obtenons

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + a + b)

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche de la faccedilon suivante

10 plus 5 est egal a 105

Lrsquoordinateur ne peut pas afficher la somme de a et de b parce que lorsque le signe + estplaceacute dans la fonction drsquoaffichage il a pour rocircle de reacuteunir des valeurs et du texte sur unemecircme ligne drsquoaffichage et non drsquoadditionner deux valeurs 105 nrsquoest que la reacuteunion de 10et de 5 On dit qursquoil srsquoagit drsquoune opeacuteration de concateacutenation

Pour afficher le reacutesultat drsquoune addition il est neacutecessaire de placer entre parenthegraveses lecalcul agrave afficher Par exemple

int a = 10 b = 5 Systemoutprint(a + plus + b + est egal a + (a + b))

Le reacutesultat agrave lrsquoeacutecran est

10 plus 5 est egal a 15

Affichage drsquoun texteNous pouvons aussi afficher un simple texte sans utiliser de variable

Systemoutprint(Qui seme le vent recolte la tempete )

Agrave lrsquoeacutecran le reacutesultat srsquoaffiche ainsi

Qui seme le vent recolte la tempete

Pour changer de ligne

Remarquons que lrsquoinstruction Systemoutprint affiche les informations agrave la suite decelles qui ont eacuteteacute afficheacutees par un preacuteceacutedent Systemoutprint Il nrsquoy a pas de passageagrave la ligne entre deux instructions drsquoaffichage Ainsi les instructions

Systemoutprint(Qui seme le vent ) Systemoutprint(recolte la tempete )

ont le mecircme reacutesultat agrave lrsquoeacutecran que celle de lrsquoexemple preacuteceacutedent

Qui seme le vent recolte la tempete

Pour obtenir un passage agrave la ligne il est neacutecessaire drsquoutiliser la fonction

Systemoutprintln()

Ainsi les instructions

Systemoutprintln(Qui seme le vent ) Systemoutprint(recolte la tempete )

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

53

ont pour reacutesultat

Qui seme le vent recolte la tempete

Les caractegraveres speacuteciaux

La table Unicode deacutefinit tous les caractegraveres textuels (alphanumeacuteriques) et semi-graphi-ques (voir au chapitre 1 laquo Stocker une information raquo la section laquo Les types de base enJava ndash Cateacutegorie caractegravere raquo) Les caractegraveres speacuteciaux sont deacutefinis entre les 128e et 256e

caractegraveres de cette table Ils correspondent agrave des caractegraveres nrsquoexistant pas sur le claviermais qui sont neacuteanmoins utiles Les caractegraveres accentueacutes font aussi partie des caractegraveresspeacuteciaux les claviers Qwerty ameacutericains ne posseacutedant pas ce type de caractegraveres

Pour afficher un message avec des caractegraveres nrsquoexistant pas sur le clavier ou avec descaractegraveres accentueacutes la meacutethode consiste agrave inseacuterer agrave lrsquointeacuterieur du message le codeUnicode du caractegravere souhaiteacute Ce code srsquoobtient en placcedilant derriegravere les caractegraveres u00la valeur hexadeacutecimale de la position du caractegravere dans la table Unicode Par exemple lecaractegravere A majuscule est deacutefini en position 65 dans la table Unicode Son code Unicodesrsquoeacutecrit u0041 car 41 est la valeur hexadeacutecimale de 65

Lrsquoaffichage de caractegraveres accentueacutes et plus geacuteneacuteralement de tout caractegravere speacutecial resteprobleacutematique Surtout si le programme doit fonctionner sur des ordinateurs diffeacuterentsEn effet les codes de ces caractegraveres font partie des extensions qui diffegraverent suivant lespays ou les environnements de travail Dans ces extensions les caractegraveres ne sont pastoujours deacutefinis agrave la mecircme position dans la table Unicode Le caractegravere eacute est deacutefini enposition 234 dans la table Unicode drsquoUnix alors qursquoil est en position 200 dans la tableUnicode du systegraveme Mac OS Les caractegraveres speacuteciaux et par conseacutequent les caractegraveresaccentueacutes nrsquoont pas toujours un code Unicode identique drsquoun environnement agrave un autre

Par exemple les caractegraveres eacute egrave et ecirc ont les codes Unicode suivants

Le message laquo Qui segraveme le vent reacutecolte la tempecircte raquo srsquoeacutecrit donc diffeacuteremmentsuivant lrsquoenvironnement utiliseacute

Exemple sous Windows ou Unix

Systemoutprint(Qui su00e8me le vent )Systemoutprint(ru00e9colte la tempu00eate )

Exemple sous Dos

Systemoutprint(Qui su008ame le vent )Systemoutprint(ru0082colte la tempu0088te )

Environnement eacute egrave ecirc

Unix u00e9 u00e8 u00ea

Dos u0082 u008a u0088

Windows u00e9 u00e8 u00ea

Mac OS u00c8 u00cb u00cd

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

54

Exemple sous MacOS

Systemoutprint(Qui su00cbme le vent )Systemoutprint(ru00c8colte la tempu00cdte )

Pour connaicirctre le code Unicode drsquoun caractegravere donneacute en fonction de votre environnement detravail vous pouvez utiliser lrsquoexemple deacutecrit agrave la section laquo La boucle for raquo du chapitre 4 laquo Faire desreacutepeacutetitions raquo

La saisie de donneacuteesJava est un langage conccedilu avant tout pour ecirctre exeacutecuteacute dans un environnement Internet etutilisant des programmes essentiellement axeacutes sur le concept drsquointerface graphique(gestion des boutons menus fenecirctres etc) Dans ce type drsquoenvironnement la saisie dedonneacutees est geacutereacutee par des fenecirctres speacutecialiseacutees appeleacutees fenecirctres de dialogue

Lrsquoobjectif de cet ouvrage est drsquoinitier le lecteur au langage Java et surtout de lui fairecomprendre comment construire et eacutelaborer un programme Pour cet apprentissage(algorithme et langage) il nrsquoest pas recommandeacute de se lancer dans lrsquoeacutecriture deprogrammes utilisant des boutons des menus et autres fenecirctres sans avoir eacutetudieacute aupreacutealable toute la libraire AWT (Abstract Windowing Toolkit) de Java Cette librairiefacilite il est vrai la construction drsquoapplications graphiques mais elle complique etalourdit lrsquoeacutecriture des programmes

Pour plus de deacutetails sur la librairie AWT reportez-vous au chapitre 11 laquo Dessiner des objets raquo

Crsquoest pourquoi nous avons deacutelibeacutereacutement choisi de travailler dans un environnement nongraphique plus simple agrave programmer

Dans cet environnement le langage Java propose la fonction Systeminread() quipermet la saisie de donneacutees au clavier sans lrsquointermeacutediaire de fenecirctres graphiques Cettefonction est deacutefinie dans la bibliothegraveque System agrave lrsquointeacuterieur du sous-ensemble in Elleutilise le programme de lecture au clavier read()

La fonction Systeminread() permet de reacutecupeacuterer un et un seul caractegravere saisi auclavier Si lrsquoutilisateur souhaite saisir des valeurs ou des noms composeacutes de plusieurscaractegraveres le programme doit contenir autant drsquoinstructions Systeminread() que decaractegraveres agrave saisir Le nombre de caractegraveres agrave saisir variant suivant lrsquoutilisation delrsquoapplication cette fonction nrsquoest pas directement utilisable de cette faccedilon

La classe LirejavaCrsquoest pourquoi nous proposons au lecteur un ensemble de fonctions de lecture quipermettent de saisir autant de caractegraveres que souhaiteacute Pour terminer la saisie il suffit dela valider en appuyant sur la touche entreacutee du clavier De plus il existe autant de fonc-tions de lecture que de types de variables Il est tregraves facile de saisir des valeurs numeacuteri-ques de type entier (byte short int et long) ou reacuteel (float et double) et des caractegraveresde type char ou String

Pour ce faire la technique consiste agrave utiliser comme nom de fonction le nom Lire()ougrave correspond agrave la premiegravere lettre du type de la variable agrave saisir Pour saisir un entier

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

55

nous utilisons la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute int repreacute-sentant le type entier) Lire est le nom de la bibliothegraveque des fonctions de saisie devaleurs au clavier Elle est deacutefinie dans le fichier Lirejava Vous trouverez ce fichierdans le CD-Rom livreacute avec cet ouvrage

Dans ce fichier que tout lecteur peut consulter agrave lrsquoaide drsquoun eacutediteur de texte est deacutefinilrsquoensemble des fonctions qui facilitent la saisie des donneacutees au clavier Ces fonctions seronteacutetudieacutees et analyseacutees au fur et agrave mesure de lrsquoavancement des connaissances mais pour vousfamiliariser rapidement avec leur emploi vous trouverez ci-dessous un programme simpleet complet qui utilise toutes les fonctions de saisie proposeacutees par lrsquoauteur

Exemple code source complet

public class TestLire public static void main (String [] Arg) Deacuteclaration des variables les noms sont choisis pour une meilleure lisibiliteacute du programme drsquoautres noms auraient pu ecirctre retenus byte val_byte short val_short int val_int long val_long float val_float double val_double char val_char String val_String Saisir une valeur de type byte Systemoutprintln(Entrez un byte ) val_byte = Lireb() Saisir une valeur de type short Systemoutprintln(Entrez un short ) val_short = Lires() Saisir une valeur de type int Systemoutprintln(Entrez un int ) val_int = Lirei() Saisir une valeur de type long Systemoutprintln(Entrez un long ) val_long = Lirel() Saisir une valeur de type float Systemoutprintln(Entrez un float ) val_float = Liref() Saisir une valeur de type double Systemoutprintln(Entrez un double ) val_double = Lired() Saisir une valeur de type String Systemoutprintln(Entrez un String ) val_String = LireS() Saisir une valeur de type char Systemoutprintln(Entrez un char ) val_char = Lirec() Afficher les diffeacuterentes valeurs saisies au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

56

Systemoutprintln(vous avez entre le byte + val_byte) Systemoutprintln(vous avez entre le short + val_short) Systemoutprintln(vous avez entre lrsquoentier + val_int) Systemoutprintln(vous avez entre le long + val_long) Systemoutprintln(vous avez entre le float + val_float) Systemoutprintln(vous avez entre le double + val_double) Systemoutprintln(vous avez entre le caractere + val_char) Systemoutprintln(vous avez entre le String + val_String)

Apregraves la deacuteclaration des variables le programme demande la saisie de valeurs drsquouncertain type Lrsquoutilisateur fournit la valeur correspondant au type demandeacute et valide lasaisie en appuyant sur la touche Entreacutee du clavier Une fois saisies les valeurs sont affi-cheacutees agrave lrsquoeacutecran

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez un byte 110000Entrez un short --3300556600Entrez un int 112255669988Entrez un long 9988776688776655Entrez un float 331144115599Entrez un double 112233887766445533009977443322Entrez un String EExxeemmppllee Entrez un char AAvous avez entre le byte 100 vous avez entre le short -30560vous avez entre lrsquoentier 125698vous avez entre le long 98768765vous avez entre le float 314159vous avez entre le double 123876453097432vous avez entre le caractere Avous avez entre le String Exemple

ReacutesumeacutePour communiquer une information lrsquoordinateur affiche un message agrave lrsquoeacutecran Ondit qursquoil reacutealise une opeacuteration de sortie (out) ou drsquoeacutecriture de donneacutees Agrave lrsquoinverselorsque lrsquoutilisateur communique des donneacutees au programme par lrsquointermeacutediaire duclavier il effectue une opeacuteration drsquoentreacutee (in) ou de lecture de donneacutees

Dans le langage Java les opeacuterations de sortie sont reacutealiseacutees gracircce agrave lrsquoinstructionSystemoutprint() qui permet drsquoafficher des informations agrave lrsquoeacutecran

Par exemple lrsquoinstruction

Systemoutprint(F + francs valent + E + euros)

affiche agrave lrsquoeacutecran le contenu de la variable F suivi du texte laquo francs valent raquo puis lecontenu de la variable E suivi du texte laquo euros raquo

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

57

Exercices

Comprendre les opeacuterations de sortie

Soit un programme Java contenant les deacuteclarations

int i = 223 j = 135 float a = 3355f b = 205f char R = rsquoRrsquo T = rsquoTrsquo

Deacutecrivez lrsquoaffichage geacuteneacutereacute par chacune des instructions suivantes

Systemoutprintln(Vous avez entre + i)

Systemoutprintln(Pour un montant de + a + le total vaut + i + j)

Systemoutprint(Apres reduction de + b + vous gagnez )

Systemoutprintln( (ab)100 + euros)

Systemoutprint( La variable R = + R + et T = + T)

Pour distinguer le commentaire du nom de variable le commentaire est placeacute entreguillemets Le contenu de la variable est afficheacute en reacuteunissant la variable aucommentaire agrave lrsquoaide du signe +

Pour afficher des reacutesultats sur plusieurs lignes il convient drsquoutiliser lrsquoinstruction

Systemoutprintln()

Dans le langage Java les opeacuterations drsquoentreacutee ne sont pas aussi simples drsquoemploi dufait qursquoelles sont le plus souvent reacutealiseacutees agrave lrsquoaide de fenecirctres graphiques geacuteneacuterantdes programmes plus complexes agrave eacutecrire

Crsquoest la raison pour laquelle lrsquoauteur propose un ensemble de fonctions de lecturequi permettent la saisie de valeurs de tout type Par exemple pour saisir un entier ilsuffit drsquoutiliser la fonction Lirei() (i eacutetant le premier caractegravere du mot-cleacute intrepreacutesentant le type entier) Les fonctions de lecture ont pour nom drsquoappel

Lireb() pour saisir une valeur de type byte

Lires() pour saisir une valeur de type short

Lirei() pour saisir une valeur de type int

Lirel() pour saisir une valeur de type long

Liref() pour saisir une valeur de type float

Lired() pour saisir une valeur de type double

LireS() pour saisir une valeur de type String

Lirec() pour saisir une valeur de type char

21

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

58

En tenant compte des deacuteclarations de variables suivantes eacutecrivez les instructionsSystemoutprint() de faccedilon agrave obtenir lrsquoaffichage suivant

Notez que la racine carreacutee de x srsquoobtient par la fonction Mathsqrt(x) et que ab se calcule avec lameacutethode Mathpow(ab)

Comprendre les opeacuterations drsquoentreacuteePour chacun des deux programmes suivants et compte tenu des informations four-nies par lrsquoutilisateur quelles sont les valeurs afficheacutees agrave lrsquoeacutecran

Observer et comprendre la structure drsquoun programme JavaEn prenant exemple sur la structure suivante eacutecrivez un programme Euro quiconvertisse des francs en euros (Rappel 1 euro = 6559 57 francs)

public class helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Donner un nom agrave la classe public static void main(String [] argument) Deacuteclarer les variables repreacutesentant les francs et les euros ainsi que le taux de conversion helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher et Saisir le nombre de francs helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Calculer le nombre drsquoeuros helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip Afficher le reacutesultat suivant lrsquoexemple donneacute ci-dessous helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

double x = 4 y = 2 double x = 9 y = 3

x = 40 et y = 20Racine carreacutee de 40 = 2040 a la puissance 20 = 160

x = 90 et y = 30Racine carreacutee de 90 = 3090 a la puissance 30 = 7290

Lrsquoutilisateur fournit au clavier 2 puis 3 puis 4 Lrsquoutilisateur fournit au clavier 2

int X Y

X = Lirei()

Y = Lirei()

X = Lirei()

X = X+Y

Systemoutprint( X = + X)

Systemoutprint( Y = + Y)

int X Y

X = Lirei()

Y = 0

X = X+Y

Systemoutprintln( X = + X)

Systemoutprintln( Y = + Y)

22

23

24

copy copyright Eacuteditions Eyrolles

Communiquer une informationCHAPITRE 2

59

Lrsquoaffichage du reacutesultat se fera sous la forme suivante

Nombre de francs 112200Conversion FE 66555599 5577Nombre drsquoeuros 1188229933

Le projet laquo Gestion drsquoun compte bancaire raquoAfficher le menu principal ainsi que ses optionsLrsquoobjectif du premier programme est drsquoeacutecrire toutes les instructions qui permettentlrsquoaffichage des menus deacutefinis dans le cahier des charges deacutecrit au chapitre introductiflaquo Naissance drsquoun programme raquo ainsi que la saisie des donneacutees demandeacutees Leprogramme construit affiche tous les messages de toutes les options sans controcircle sur lechoix de lrsquoutilisateur

bull Le menu principal srsquoaffiche de la faccedilon suivante 1 Creer un compte2 Afficher un compte3 Creer une ligne comptable4 Sortir5 De lrsquoaideVotre choix

bull Une fois le menu afficheacute le programme attend la saisie du choix de lrsquoutilisateur

bull Lrsquooption 1 du menu principal a pour affichage

Type du compte [Types possibles courant joint eacutepargne] Numero du compte Premiegravere valeur creditee Taux de placement

bull Lrsquooption 2 reacutealise les opeacuterations suivantes

ndash Affiche la demande de saisie du numeacutero du compte que lrsquoutilisateur souhaiteconsulter

ndash Saisit le numeacutero de compte

bull Lrsquooption 3 affiche laquo option non programmee raquo

bull Lrsquooption 4 termine lrsquoexeacutecution du programme Pour cela utilisez la fonction JavaSystemexit(0)

bull Avec lrsquooption 5 le programme affiche une ligne drsquoexplication pour chaque option dumenu principal

copy copyright Eacuteditions Eyrolles

3Faire des choix

Une fois les variables deacutefinies et les valeurs stockeacutees en meacutemoire lrsquoordinateur estcapable de les tester ou de les comparer de faccedilon agrave reacutealiser une instruction plutocirct qursquouneautre suivant le reacutesultat de la comparaison

Le programme nrsquoest alors plus exeacutecuteacute de faccedilon seacutequentielle (de la premiegravere lignejusqursquoagrave la derniegravere) Lrsquoordre est rompu une ou plusieurs instructions eacutetant ignoreacutees enfonction du reacutesultat du test Le programme peut srsquoexeacutecuter en tenant compte decontraintes imposeacutees par le programmeur

Dans ce chapitre nous abordons la notion de choix ou de test en reprenant lrsquoalgorithmedu cafeacute chaud pour le transformer en un algorithme du cafeacute chaud sucreacute ou non(laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

Ensuite agrave la section laquo Lrsquoinstruction if-else raquo nous eacutetudions la structure if-elseproposeacutee par le langage Java qui permet de reacutealiser des choix

Enfin agrave la section laquo Lrsquoinstruction switch ou comment faire des choix multiples raquo nousexaminons le concept de choix multiples par lrsquointermeacutediaire de la structure switch

Lrsquoalgorithme du cafeacute chaud sucreacute ou non

Pour mieux comprendre la notion de choix nous allons reprendre lrsquoalgorithme du cafeacutechaud pour le transformer en algorithme du cafeacute chaud sucreacute ou non Lrsquoeacutenonceacute ainsitransformeacute nous oblige agrave modifier la liste des objets manipuleacutes ainsi que celle des opeacutera-tions agrave reacutealiser

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

62

Deacutefinition des objets manipuleacutesPour obtenir du cafeacute sucreacute nous devons ajouter agrave notre liste un nouvel ingreacutedient lesucre et un nouvel ustensile la petite cuillegravere

cafeacute moulufiltreeaucafetiegravere eacutelectriquetasseeacutelectriciteacutetablesucrepetite cuillegravere

Liste des opeacuterationsDe la mecircme faccedilon nous devons modifier la liste des opeacuterations de faccedilon qursquoelle prenneen compte les nouvelles donneacutees

Verser lrsquoeau dans la cafetiegravere le cafeacute dans la tasse le cafeacute dans le filtre Prendre du cafeacute moulu une tasse de lrsquoeau une cafetiegravere eacutelectrique

un filtre un morceau de sucre une petite cuillegravere Brancher allumer ou eacuteteindre la cafetiegravere eacutelectrique Attendre que le cafeacute soit precirct Poser la tasse la cafetiegravere sur la table le filtre dans la cafetiegravere le sucre

dans la tasse la petite cuillegravere dans la tasse

Ordonner la liste des opeacuterationsAinsi modifieacutee la liste des opeacuterations doit ecirctre reacuteordonneacutee afin de rechercher le momentle mieux adapteacute pour ajouter les nouvelles opeacuterations

bull En deacutecidant de prendre le sucre et la petite cuillegravere en mecircme temps que le cafeacute et lefiltre nous placcedilons les nouvelles instructions laquo prendrehellip raquo entre les instructions 2 et3 deacutefinies agrave la section laquo Ordonner la liste des opeacuterations raquo du chapitre introductiflaquo Naissance drsquoun programme raquo

bull En deacutecidant de poser le sucre et la petite cuillegravere dans la tasse avant drsquoy verser le cafeacutenous eacutecrivons les nouvelles instructions laquo poserhellip raquo avant lrsquoinstruction 15 du mecircmeexemple

Nous obtenons la liste des opeacuterations suivantes

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un morceau de sucre4 Prendre une petite cuillegravere5 Prendre un filtre6 Verser le cafeacute dans le filtre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

63

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Poser le sucre dans la tasse15 Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Eacutecrite ainsi cette marche agrave suivre nous permet drsquoobtenir un cafeacute chaud sucreacute Elle nenous autorise pas agrave choisir entre sucreacute ou non Pour cela nous devons introduire un testen posant une condition devant chaque instruction concernant la prise du sucre crsquoest-agrave-dire

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table

2 Prendre du cafeacute

3 Si (cafeacute sucreacute) Prendre un morceau de sucre4 Si (cafeacute sucreacute) Prendre une petite cuillegravere5 Prendre un filtre

6 Verser le cafeacute dans le filtre

7 Prendre de lrsquoeau

8 Verser lrsquoeau dans la cafetiegravere

9 Brancher la cafetiegravere

10 Allumer la cafetiegravere

11 Attendre que le cafeacute soit precirct

12 Prendre une tasse

13 Poser la tasse sur la table

14 Si (cafeacute sucreacute) Poser le sucre dans la tasse15 Si (cafeacute sucreacute) Poser la petite cuillegravere dans la tasse16 Eteindre la cafetiegravere

17 Verser le cafeacute dans la tasse

Dans cette situation nous obtenons du cafeacute sucreacute ou non selon notre choix Remarquonscependant que le test Si (cafeacute sucreacute) est identique pour les instructions 3 4 14 et 15Pour cette raison et sachant que chaque test repreacutesente un coucirct en termes de tempsdrsquoexeacutecution il est conseilleacute de regrouper au mecircme endroit toutes les instructions rela-tives agrave un mecircme test

Crsquoest pourquoi nous distinguons deux blocs drsquoinstructions distincts

bull les instructions soumises agrave la condition de cafeacute sucreacute (II Preacuteparer le sucre)

bull les instructions reacutealisables quelle que soit la condition (I Preacuteparer le cafeacute)copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

64

Dans ce cas la nouvelle solution srsquoeacutecrit

La reacutealisation du bloc I Preacuteparer le cafeacute nous permet drsquoobtenir du cafeacute chaudEnsuite en exeacutecutant le test Si (cafeacute sucreacute) deux solutions sont possibles

bull La proposition (cafeacute sucreacute) est vraie et alors les instructions 1 agrave 4 du blocII Preacuteparer le sucre sont exeacutecuteacutees Nous obtenons du cafeacute chaud sucreacute

bull La proposition (cafeacute sucreacute) est fausse et les instructions qui suivent ne sont pasexeacutecuteacutees Nous obtenons un cafeacute non sucreacute

Pour programmer un choix nous avons eacutecrit une condition devant les instructionsconcerneacutees En programmation il en est de mecircme Le langage Java propose plusieursinstructions de test agrave savoir la structure if-else que nous eacutetudions ci-apregraves et la struc-ture switch que nous analysons agrave la section laquo Lrsquoinstruction switch ou comment faire deschoix multiples raquo un peu plus loin dans ce chapitre

Lrsquoinstruction if-elseLrsquoinstruction if-else se traduit en franccedilais par les termes si-sinon Elle permet deprogrammer un choix en placcedilant derriegravere le terme if une condition comme nous avonsplaceacute une condition derriegravere le terme si de lrsquoalgorithme du cafeacute chaud sucreacute ou non

Lrsquoinstruction if-else se construit de la faccedilon suivante

bull en suivant une syntaxe ou forme preacutecise du langage Java (voir laquo Syntaxe drsquoif-else raquo)

bull en preacutecisant la condition agrave tester (voir laquo Comment eacutecrire une condition raquo)

Nous preacutesentons en fin de cette section un exemple de programme qui recherche la plusgrande des deux valeurs saisies au clavier (voir laquo Rechercher le plus grand de deuxeacuteleacutements raquo)

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du cafeacute3 Prendre un filtre4 Verser le cafeacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le cafeacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 Eteindre la cafetiegravere13 Verser le cafeacute dans la tasse

I Preacuteparer le cafeacute

Si (cafeacute sucreacute)

1 Prendre un morceau de sucre2 Prendre une petite cuillegravere3 Poser le sucre dans la tasse4 Poser la petite cuillegravere dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

65

Syntaxe drsquoif-elseLrsquoeacutecriture de lrsquoinstruction if-else obeacuteit aux regravegles de syntaxe suivantes

if (condition) si la condition est vraie faire plusieurs instructions faitelse sinon (la condition ci-dessus est fausse) faire plusieurs instructions fait

bull Si la condition situeacutee apregraves le mot-cleacute if et placeacutee obligatoirement entre parenthegravesesest vraie alors les instructions placeacutees dans le bloc deacutefini par les accolades ouvrante etfermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves le mot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs peut ecirctre exeacutecuteacute agrave la fois selon que la conditionest veacuterifieacutee ou non

Remarquons que

bull La ligne drsquoinstruction if(condition)ou else ne se termine jamais par un point-virgule ()

bull Les accolades et deacutefinissent un bloc drsquoinstructions Cela permet de regrouperensemble toutes les instructions relatives agrave un mecircme test

bull Lrsquoeacutecriture du bloc else nrsquoest pas obligatoire Il est possible de nrsquoeacutecrire qursquoun bloc ifsans programmer drsquoinstruction dans le cas ougrave la condition nrsquoest pas veacuterifieacutee (commedans lrsquoalgorithme du cafeacute chaud sucreacute ou non) En drsquoautres termes il peut y avoir desif sans else

bull Srsquoil existe un bloc else celui-ci est obligatoirement laquo accrocheacute raquo agrave un if Autrementdit il ne peut y avoir drsquoelse sans if

bull Le langage Java propose une syntaxe simplifieacutee lorsqursquoil nrsquoy a qursquoune seule instruc-tion agrave exeacutecuter dans lrsquoun des deux blocs if ou else Dans ce cas les accoladesouvrante et fermante ne sont pas obligatoires

if (condition) une seule instruction else une seule instruction

ou

if (condition) faire plusieurs instructions faitelse une seule instruction

ou encore

if (condition) une seule instruction else faire

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

66

plusieurs instructions fait

Une fois connue la syntaxe geacuteneacuterale de la structure if-else nous devons eacutecrire la condi-tion (placeacutee entre parenthegraveses juste apregraves if) permettant agrave lrsquoordinateur drsquoexeacutecuter le test

Comment eacutecrire une conditionLrsquoeacutecriture drsquoune condition en Java fait appel aux notions drsquoopeacuterateurs relationnels etconditionnels

Les opeacuterateurs relationnels

Une condition est formeacutee par lrsquoeacutecriture de la comparaison de deux expressions uneexpression pouvant ecirctre une valeur numeacuterique ou une expression arithmeacutetique Pourcomparer deux expressions le langage Java dispose de six symboles repreacutesentant lesopeacuterateurs relationnels traditionnels en matheacutematiques

Un opeacuterateur relationnel permet de comparer deux expressions de mecircme type Il nrsquoestpas possible de comparer un reacuteel avec un entier ou un entier avec un caractegravere

Lorsqursquoil srsquoagit de comparer deux expressions composeacutees drsquoopeacuterateurs arithmeacutetiques (+- ) les opeacuterateurs relationnels sont moins prioritaires par rapport aux opeacuterateursarithmeacutetiques De cette faccedilon les expressions matheacutematiques sont drsquoabord calculeacuteesavant drsquoecirctre compareacutees

Notons que pour tester lrsquoeacutegaliteacute entre deux expressions nous devons utiliser le symbole== et non pas un simple = En effet en Java le signe = nrsquoest pas un signe drsquoeacutegaliteacute au sensde la comparaison mais le signe de lrsquoaffectation qui permet de placer une valeur dansune variable

Exemple

int a = 3 b = 5 char lettre = rsquoirsquo car = rsquojrsquo

bull La condition (a = b) est vraie car 3 est diffeacuterent de 5

bull La condition (a + 2 == b) est vraie car 3 + 2 vaut 5

bull La condition (a + 8 lt 2 b)est fausse car 3 + 8 est plus grand que 2 5

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt==

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

67

bull La condition (lettre lt= car) est vraie car le caractegravere rsquoirsquo est placeacute avant rsquojrsquo danslrsquoordre alphabeacutetique

bull La condition (lettre == rsquowrsquo) est fausse car le caractegravere rsquoirsquo est diffeacuterent du carac-tegravere rsquowrsquo

Les opeacuterateurs logiques

Les opeacuterateurs logiques sont utiliseacutes pour associer plusieurs conditions simples et decette faccedilon creacuteer des conditions multiples en un seul test Il existe trois grands opeacutera-teurs logiques symboliseacutes par les caractegraveres suivants

Exemples

int x = 3 y = 5 z = 2 r = 6

bull Sachant que la condition (x lt y) ampamp (z lt r) est vraie si les deux expressions(x lt y) et (z lt r) sont toutes les deux vraies et devient fausse si lrsquoune des deuxexpressions est fausse lrsquoexpression donneacutee en exemple est vraie En effet (3 lt 5) estvraie et (2 lt 6) est vraie

bull Sachant que la condition (x gt y) || (z lt r) est vraie si lrsquoune des expressions(x gt y) ou (z lt r) est vraie et devient fausse si les deux expressions sont fausseslrsquoexpression donneacutee en exemple est vraie car (3 gt 5) est fausse mais (2 lt 6) estvraie

bull Sachant que la condition (z lt r) est vraie si lrsquoexpression (z lt r) est fausse etdevient fausse si lrsquoexpression est vraie alors lrsquoexpression donneacutee en exemple estfausse car (2 lt 6) est vraie

Rechercher le plus grand de deux eacuteleacutementsPour mettre en pratique les notions theacuteoriques abordeacutees aux deux sections preacuteceacutedentesnous allons eacutecrire un programme qui affiche dans lrsquoordre croissant deux valeurs entiegraveressaisies au clavier et recherche la plus grande des deux Pour cela nous devons

1 Demander la saisie de deux valeurs au clavier

2 Tester si la premiegravere valeur saisie est plus grande que la seconde

a Si tel est le cas

ndash afficher dans lrsquoordre croissant en affichant la seconde valeur saisie puis lapremiegravere

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la premiegraverevaleur

Opeacuterateur Signification

ampamp||

NON logiqueET logiqueOU logique

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

68

b Sinon

ndash afficher dans lrsquoordre croissant en affichant la premiegravere valeur saisie puis laseconde

ndash stocker la plus grande des valeurs dans une variable speacutecifique soit la secondevaleur

3 Afficher la plus grande des valeurs

Nous devons dans un premier temps deacuteclarer trois variables entiegraveres deux pour lesvaleurs agrave saisir et une pour stocker la plus grande des deux Nous eacutecrivons lrsquoinstructionde deacuteclaration suivante

int premiegravere deuxiegraveme laPlusGrande

1 La saisie des deux valeurs est ensuite reacutealiseacutee par (voir le chapitre 2 laquo Communiquerune information raquo)

Systemoutprint(Entrer une valeur ) premiegravere = Lirei() Systemoutprint(Entrer une deuxieme valeur ) deuxiegraveme = Lirei()

2 Pour tester si la premiegravere valeur saisie est plus grande que la seconde lrsquoinstructionif srsquoeacutecrit

if (premiegravere gt deuxiegraveme)

a Deux instructions composent ce test lrsquoaffichage dans lrsquoordre croissant puis lestockage de la plus grande valeur Il est donc neacutecessaire de les placer dans un blocdeacutefini par une ouvrante et une fermante

Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(deuxiegraveme + + premiegravere) Stocker la plus grande dans une variable speacutecifique laPlusGrande = premiegravere

b De la mecircme faccedilon le cas contraire est deacutecrit par lrsquoinstruction else et est composeacutede deux instructions Nous avons donc

else Afficher les valeurs dans lrsquoordre croissant Systemoutprintln(premiegravere + + deuxiegraveme) Stocker la plus grande dans une variable speacutecifique laPlusGrande = deuxiegraveme

3 Nous affichons enfin la plus grande valeur par lrsquoinstruction

Systemoutprintln(La plus grande valeur est + laPlusGrande)

Ce message est afficheacute dans tous les cas et lrsquoinstruction est donc placeacutee en dehors detoute structure conditionnelle

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

69

Pour finir le programme est placeacute dans une fonction main() et une classe que nousappelons Maximum puisqursquoil srsquoagit ici de trouver la valeur maximale de deux valeurs Decette faccedilon le programme peut ecirctre compileacute et exeacutecuteacute

Exemple code source complet

public class Maximum Le fichier srsquoappelle Maximumjava public static void main (String [] parametre) int premiegravere deuxiegraveme laPlusGrande Systemoutprintln(Entrer une valeur ) premiegravere = Lirei() Systemoutprintln(Entrer une deuxieme valeur ) deuxiegraveme = Lirei() if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere else Systemoutprintln(premiegravere + + deuxiegraveme) laPlusGrande = deuxiegraveme Systemoutprintln(La plus grande valeur est + laPlusGrande) Fin du main () Fin de la Class Maximum

Reacutesultat de lrsquoexeacutecution

(Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur)

Entrer une valeur 33Entrer une deuxieme valeur 553 5La plus grande valeur est 5

La premiegravere valeur eacutetant plus petite que la seconde le programme exeacutecute les instruc-tions placeacutees dans le bloc else

Deux erreurs agrave eacuteviterDeux types drsquoerreurs sont agrave eacuteviter par le programmeur deacutebutant Il srsquoagit des erreursissues drsquoune mauvaise construction des blocs if ou else et drsquoun placement incorrect dupoint-virgule

La construction de blocs

Reprenons lrsquoexemple preacuteceacutedent en lrsquoeacutecrivant comme suit

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere) laPlusGrande = premiegravere

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

70

else Systemoutprintln(premiegravere+ +deuxiegraveme) laPlusGrande = deuxiegraveme

En exeacutecutant pas agrave pas cet extrait de programme nous remarquons qursquoil nrsquoy a pasdrsquoaccolade () ouvrante derriegravere lrsquoinstruction if Cette derniegravere ne possegravede donc pas debloc composeacute de plusieurs instructions Seule lrsquoinstruction drsquoaffichageSystemoutprintln(deuxiegraveme + + premiegravere) se situe dans if Lrsquoexeacutecutiondrsquoif srsquoachegraveve donc juste apregraves lrsquoaffichage des valeurs dans lrsquoordre croissant

Ensuite lrsquoinstruction lePlusGrand = premiegravere est theacuteoriquement exeacutecuteacutee en dehorsde toute condition Cependant lrsquoinstruction suivante est else alors que lrsquoinstruction ifsrsquoest acheveacutee preacuteceacutedemment Le compilateur ne peut attribuer ce else agrave un if Il y adonc erreur de compilation du type rsquoelsersquo without rsquoifrsquo

De la mecircme faccedilon il y a erreur de compilation lorsque le programme est construit sur laforme suivante

if (premiegravere gt deuxiegraveme) Leplusgrand = premiegravere else

Le point-virgule

Dans le langage Java le point-virgule constitue une instruction agrave part entiegravere qui repreacute-sente lrsquoinstruction vide Par conseacutequent eacutecrire le programme suivant ne provoqueaucune erreur agrave la compilation

if (premiegravere gt deuxiegraveme) Systemoutprintln(deuxiegraveme + + premiegravere)

Lrsquoexeacutecution de cet extrait de programme a pour reacutesultat

Si premiegravere est plus grand que deuxiegraveme lrsquoordinateur exeacutecute le (point-virgule) situeacuteimmeacutediatement apregraves la condition crsquoest-agrave-dire rien Lrsquoinstruction if est termineacutee puisqursquoilnrsquoy a pas drsquoaccolades ouvrante et fermante Seule lrsquoinstruction est soumise agrave if

Le message affichant les valeurs par ordre croissant ne fait pas partie du test Il est doncafficheacute quelles que soient les valeurs de premiegravere et deuxiegraveme

Des if-else imbriqueacutes Dans le cas de choix arborescents ndash un choix eacutetant fait drsquoautres choix sont agrave faire etainsi de suite ndash il est possible de placer des structures if-else agrave lrsquointeacuterieur drsquoif-elseOn dit alors que les structures if-else sont imbriqueacutees les unes dans les autres

Lorsque ces imbrications sont nombreuses il est possible de les repreacutesenter agrave lrsquoaide drsquoungraphique de structure arborescente dont voici un exemple

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

71

Quand il y a moins drsquoelse que drsquoif Une instruction if peut ne pas contenir drsquoinstruction else Dans de tels cas il peutparaicirctre difficile de savoir agrave quel if est associeacute le dernier else Comparons les deuxexemples suivants

Imbrications drsquoif else Repreacutesentation du choix arborescent

if (Condition 1) if (Condition 2) instruction A else instruction B else instruction C

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else

instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

72

Du premier au deuxiegraveme exemple par le jeu des fermetures drsquoaccolades le dernier blocelse est deacuteplaceacute drsquoun bloc vers le haut Ce deacuteplacement modifie la structure arbores-cente Les algorithmes associeacutes ont des reacutesultats totalement diffeacuterents

Pour deacuteterminer une relation if-else remarquons qursquoun laquo bloc else raquo se rapportetoujours au dernier laquo bloc if raquo rencontreacute auquel un else nrsquoa pas encore eacuteteacute attribueacute

Les blocs if et else eacutetant deacutelimiteacutes par les accolades ouvrantes et fermantes il est conseilleacutepour eacuteviter toute erreur de bien relier chaque parenthegravese ouvrante avec sa fermante

Lrsquoinstruction switch ou comment faire des choix multiplesLorsque le nombre de choix possible est plus grand que deux lrsquoutilisation de la structureif-else devient rapidement fastidieuse Les imbrications des blocs demandent agrave ecirctreveacuterifieacutees avec preacutecision sous peine drsquoerreur de compilation ou drsquoexeacutecution

Crsquoest pourquoi le langage Java propose lrsquoinstruction switch (traduire par selon ousuivant) qui permet de programmer des choix multiples selon une syntaxe plus claire

Construction du switchLrsquoeacutecriture de lrsquoinstruction switch obeacuteit aux regravegles de syntaxe suivantes

switch (valeur) case eacutetiquette 1 Une ou plusieurs instructions

Imbrications drsquoif else Arbre des choix

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

73

break case eacutetiquette 2 case eacutetiquette 3 Une ou plusieurs instructions break default Une ou plusieurs instructions

La variable valeur est eacutevalueacutee Suivant cette valeur le programme recherche lrsquoeacutetiquettecorrespondant agrave la valeur obtenue et deacutefinie agrave partir des instructions case eacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variable valeuril exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrer le mot-cleacutebreak

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecute lesinstructions de lrsquoeacutetiquette default

Drsquoune maniegravere geacuteneacuterale remarquons que

bull Le type de la variable valeur ne peut ecirctre que char ou int byte short ou long Ilnrsquoest donc pas possible de tester des valeurs reacuteelles ou des mots

bull Une eacutetiquette peut contenir aucune une ou plusieurs instructions

bull Lrsquoinstruction break permet de sortir du bloc switch Srsquoil nrsquoy a pas de break pour uneeacutetiquette donneacutee le programme exeacutecute les instructions de lrsquoeacutetiquette suivante

Calculer le nombre de jours drsquoun mois donneacutePour mettre en pratique les notions theacuteoriques abordeacutees agrave la section preacuteceacutedente nousallons eacutecrire un programme qui calcule et affiche le nombre de jours drsquoun mois donneacute

Le nombre de jours dans un mois peut varier entre les valeurs 28 29 30 ou 31 suivant lemois et lrsquoanneacutee Les mois de janvier mars mai juillet aoucirct octobre et deacutecembre sont desmois de 31 jours Les mois drsquoavril juin septembre et novembre sont des mois de 30 joursSeul le mois de feacutevrier est particulier puisque son nombre de jours est de 29 jours pour lesanneacutees bissextiles et de 28 jours dans le cas contraire Sachant cela nous devons

bull Demander la saisie au clavier du numeacutero du mois ainsi que de lrsquoanneacutee rechercheacutee

bull Creacuteer autant drsquoeacutetiquettes qursquoil y a de mois dans une anneacutee crsquoest-agrave-dire 12 Comptetenu du fonctionnement de la structure switch chaque eacutetiquette est une valeur entiegraverecorrespondant au numeacutero du mois de lrsquoanneacutee (1 pour janvier 2 pour feacutevrier etc)

bull Regrouper les eacutetiquettes relatives aux mois agrave 31 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Regrouper les eacutetiquettes relatives aux mois agrave 30 jours et stocker cette derniegravere valeurdans une variable speacutecifique

bull Pour lrsquoeacutetiquette relative au mois de feacutevrier tester la valeur de lrsquoanneacutee pour savoir silrsquoanneacutee concerneacutee est bissextile ou non Une anneacutee est bissextile tous les quatre anssauf lorsque le milleacutesime est divisible par 100 et non pas par 400 En drsquoautres termespour qursquoune anneacutee soit bissextile il suffit que lrsquoanneacutee soit un nombre divisible par 4 et

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

74

non divisible par 100 ou alors par 400 Dans tous les autres cas lrsquoanneacutee nrsquoest pasbissextile

Compte tenu de toutes ces remarques nous devons dans un premier temps deacuteclarer troisvariables entiegraveres une pour repreacutesenter le mois la deuxiegraveme lrsquoanneacutee et la troisiegraveme lenombre de jours par mois Sachant que le mois et le nombre de jours par mois ne deacutepas-sent jamais la valeur 127 nous pouvons les deacuteclarer de type byte Pour lrsquoanneacutee le typeshort suffit (agrave moins drsquoecirctre tregraves optimiste et de vouloir eacuteviter le bug de lrsquoan 32767 )puisque les valeurs de ce type peuvent aller jusqursquoagrave 32767

Exemple code source complet

public class JourParMois Le fichier srsquoappelle JourParMoisjava public static void main (String [] parametre) byte mois nbjours = 0 short anneacutee Systemoutprintln(De quel mois srsquoagit-il ) mois = Lireb() Systemoutprintln(De quelle annee ) anneacutee = Lires() switch(mois) case 1 case 3 Pour les mois agrave 31 jours case 5 case 7 case 8 case 10 case 12 nbjours = 31 break case 4 case 6 Pour les mois agrave 30 jours case 9 case 11 nbjours = 30 break case 2 Pour le cas particulier du mois de feacutevrier if (anneacutee 4 == 0 ampamp anneacutee 100 = 0 || anneacutee 400 == 0) nbjours = 29 else nbjours = 28 break default En cas drsquoerreur de frappe Systemoutprintln(Impossible ce mois nrsquoexiste pas ) Systemexit(0) Systemoutprint( En + annee + le mois ndeg + mois) Systemoutprintln( a + nbjours + jours ) Fin du main() Fin de la class JourParMois

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

75

Exeacutecution 1

De quel mois srsquoagit-il 55De quelle annee 11999999En 1999 le mois ndeg 5 a 31 jours

Le programme recherche lrsquoeacutetiquette 5 Il exeacutecute les instructions qui suivent jusqursquoagraverencontrer un break Pour lrsquoeacutetiquette 5 le programme exeacutecute les instructions deseacutetiquettes 7 8 10 et 12 car ces eacutetiquettes ne possegravedent ni instructions ni break Seulelrsquoeacutetiquette 12 possegravede une instruction qui affecte la valeur 31 agrave la variable nbjoursLrsquoinstruction break qui suit permet de sortir de la structure switch Le programmeexeacutecute enfin lrsquoinstruction situeacutee immeacutediatement apregraves le switch crsquoest-agrave-dire lrsquoaffichagedu message annonccedilant le reacutesultat

Exeacutecution 2

De quel mois srsquoagit-il 22De quelle annee 22000000En 2000 le mois ndeg 2 a 29 jours

Ici le programme va directement agrave lrsquoeacutetiquette 2 qui est composeacutee drsquoun test sur lrsquoanneacuteepour savoir si lrsquoanneacutee est bissextile Une anneacutee est bissextile lorsque son milleacutesime estdivisible par 4 agrave lrsquoexception des anneacutees dont le milleacutesime est divisible par 100 et non paspar 400 La valeur 2000 est divisible par 4 100 et 400 puisque le reste de la divisionentiegravere () de 2000 par 4 100 ou 400 est nul La variable nbjours prend donc la valeur29 Le programme sort ensuite du switch gracircce agrave lrsquoinstruction break qui suit et exeacutecutepour finir lrsquoaffichage du reacutesultat

Exeacutecution 3

De quel mois srsquoagit-il 1155De quelle annee 11999999Impossible ce mois nrsquoexiste pas

Lrsquoeacutetiquette 15 nrsquoeacutetant pas deacutefinie dans le bloc switch le programme exeacutecute les instruc-tions qui composent lrsquoeacutetiquette default Le programme affiche un message drsquoerreur ettermine son exeacutecution gracircce agrave lrsquoinstruction Systemexit(0)

Remarquons que gracircce agrave lrsquoeacutetiquette default le programme connaicirct les instructions agraveexeacutecuter dans le cas de choix laquo anormaux raquo (erreur de frappe par exemple ou valeursaisie nrsquoentrant pas dans lrsquointervalle des valeurs possibles traiteacutees par le programme) Decette faccedilon il devient possible de preacutevenir drsquoeacuteventuelles erreurs pouvant causer lrsquoarrecirctbrutal de lrsquoexeacutecution du programme

Comment choisir entre if-else et switch

La structure switch ne permet de tester que des eacutegaliteacutes de valeurs entiegraveres (byte shortint ou long) ou de type caractegravere (char) Elle ne peut donc pas ecirctre utiliseacutee pour

bull Tester des valeurs reacuteelles (float ou double) ou des mots (String)

bull Rechercher si la valeur est plus grande plus petite ou diffeacuterente drsquoune certaine eacutetiquettecopy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

76

Par contre lrsquoinstruction if-else peut ecirctre employeacutee dans tous les cas en testant tout typede variable selon toute condition

Remarquons cependant que

bull Si une condition parmi drsquoautres conditions envisageacutees a une plus grande probabiliteacutedrsquoecirctre satisfaite celle-ci doit ecirctre placeacutee en premier test dans une structure if else defaccedilon agrave eacuteviter agrave lrsquoordinateur drsquoeffectuer de trop nombreux tests inutiles

bull Si toutes les conditions ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees lastructure switch est plus efficace Elle ne demande qursquoune seule eacutevaluation alors quedans les instructions if-else imbriqueacutees chaque condition doit ecirctre eacutevalueacutee

ReacutesumeacuteLrsquoinstruction if else (traduction si sinon) permet de programmer des choix Defaccedilon geacuteneacuterale lrsquoinstruction if else srsquoeacutecrit

bull Si la condition situeacutee apregraves le mot-cleacute if (placeacutee obligatoirement entre paren-thegraveses) est vraie alors les instructions placeacutees dans le bloc deacutefini par les accoladesouvrante et fermante immeacutediatement apregraves sont exeacutecuteacutees

bull Si la condition est fausse alors les instructions deacutefinies dans le bloc situeacute apregraves lemot-cleacute else sont exeacutecuteacutees

De cette faccedilon un seul des deux blocs est exeacutecuteacute selon que la condition est veacuterifieacuteeou non De plus cette condition fait intervenir des

bull Opeacuterateurs relationnels

if (condition)

si la condition est vraie

faire

plusieurs instructions

fait

else sinon

faire

plusieurs instructions

fait

Ou encore

if (condition) une seule instruction

else une seule instruction

Opeacuterateur Signification pour des valeurs numeacuteriques

Signification pour des valeurs de type caractegravere

= =ltlt=gtgt= =

eacutegalinfeacuterieur strictement infeacuterieur ou eacutegal supeacuterieur strictement supeacuterieur ou eacutegal diffeacuterent

identiqueplus petit dans lrsquoordre alphabeacutetiqueplus petit ou identique dans lrsquoordre alphabeacutetiqueplus grand dans lrsquoordre alphabeacutetiqueplus grand ou identique dans lrsquoordre alphabeacutetiquediffeacuterent

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

77

ExercicesComprendre les niveaux drsquoimbrication

Exeacutecutez agrave la main (crsquoest-agrave-dire ligne par ligne) ce programme Pour cela voussupposerez que la valeur saisie au clavier soit 4 Quel est le reacutesultat afficheacute

public class Racine public static void main (String [] parametre) double x r

bull Opeacuterateurs logiques

Lorsque plusieurs instructions if-else sont imbriqueacutees les unes dans les autres unelse se rapporte toujours au dernier bloc if rencontreacute auquel un else nrsquoa pas encoreeacuteteacute attribueacute

Lrsquoinstruction switch (traduction selon ou suivant) permet de programmer deschoix multiples Elle a pour syntaxe

switch(valeur) le type de la variable est char ou int case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch case eacutetiquette suite drsquoinstructions break facultatif pour sortir du bloc switch default suite drsquoinstructions

La variable valeur est eacutevalueacutee Suivant cette eacutevaluation le programme recherchelrsquoeacutetiquette correspondant agrave la valeur eacutevalueacutee et deacutefinie agrave partir des instructions caseeacutetiquette

bull Si le programme trouve une eacutetiquette correspondant au contenu de la variablevaleur il exeacutecute la ou les instructions qui suivent lrsquoeacutetiquette jusqursquoagrave rencontrerle mot-cleacute break

bull Srsquoil nrsquoexiste pas drsquoeacutetiquette correspondant agrave valeur alors le programme exeacutecuteles instructions de lrsquoeacutetiquette default

Lrsquoinstruction if-else est utiliseacutee lorsque lrsquoune des conditions envisageacutees a unegrande probabiliteacute drsquoecirctre satisfaite Si toutes les conditions ont une probabiliteacute drsquoecirctrereacutealiseacutees on utilise plutocirct la structure switch

Opeacuterateur Signification

NON logique

ampamp ET logique

|| OU logique

31

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

78

Systemoutprint(Entrer un chiffre ) x = Lired() if (x gt = 0) r = Mathsqrt(x) else r = Mathsqrt(-x) Systemoutprint(Pour +x+ Le resultat est +r) Fin du main () Fin de la Class Racine

Mecircme question en supposant la valeur saisie eacutegale agrave ndash 9

Construire une arborescence de choixReprenez et modifiez le programme Maximum donneacute dans ce chapitre de faccedilon qursquoilaffiche un message lorsque les deux valeurs saisies au clavier sont eacutegales

Repreacutesentez graphiquement les choix arborescents suivants

if (Condition 1) if (Condition 2) if (Condition 3) instruction A else instruction B else instruction C

Eacutecrivez un programme qui reacutesolve les eacutequations du second degreacute agrave lrsquoaide de struc-tures if-else imbriqueacutees

Soit lrsquoeacutequation ax2 + bx + c = 0 ougrave a b et c repreacutesentent les trois coefficientsentiers de lrsquoeacutequation Pour trouver les solutions reacuteelles x si elles existent

a Eacutetablissez lrsquoarbre des choix associeacutes

1 a = 0 11 b = 0 111 c = 0 tout reacuteel est solution

32

33

34

copy copyright Eacuteditions Eyrolles

Faire des choixCHAPITRE 3

79

112 c = 0 pas de solution 12 b = 0 une seule solution x = - c b 2 a = 0 21 b2 - 4ac gt= 0 deux solutions x1 = - b + Mathsqrt(b b ndash 4 a c) 2 a x2 = - b - Mathsqrt(b b ndash 4 a c) 2 a 22 b2 - 4ac lt 0 pas de solution dans les reacuteels

b Deacuteterminez les diffeacuterentes variables agrave deacuteclarer

c Agrave partir de lrsquoarbre des choix eacutecrivez les instructions if-else suivies du testcorrespondant

d Placez dans chaque bloc if ou else les instructions de calcul et drsquoaffichageapproprieacutees

e Placez lrsquoensemble de ces instructions dans une fonction main() et une classeportant le nom SecondDegre

Manipuler les choix multiples geacuterer les caractegraveresEn utilisant la structure switch eacutecrire un programme qui simule une machine agravecalculer dont les opeacuterations soient lrsquoaddition (+) la soustraction (ndash) la multiplica-tion () et la division ()

a En cours drsquoexeacutecution le programme demande agrave lrsquoutilisateur drsquoentrer deuxvaleurs numeacuteriques puis le caractegravere correspondant agrave lrsquoopeacuteration agrave effectuerSuivant le caractegravere entreacute (+ndash) le programme affiche lrsquoopeacuteration effectueacuteeainsi que le reacutesultat

Lrsquoexeacutecution du programme peut par exemple avoir lrsquoallure suivante (les valeursgriseacutees sont celles saisies par lrsquoutilisateur)

Entrez la premiere valeur 22Entrez la seconde valeur 33Type de lrsquooperation (+ - ) Cette operation a pour resultat 2 3 = 6

b Apregraves avoir eacutecrit et exeacutecuteacute le programme avec diffeacuterentes valeurs saisissezdans cet ordre les valeurs suivantes 2 0 puis Que se passe-t-il Pourquoi

c Modifiez le programme de faccedilon agrave ne plus rencontrer cette situation en coursdrsquoexeacutecution

Le projet laquo Gestion drsquoun compte bancaire raquoAcceacuteder agrave un menu suivant lrsquooption choisieLrsquoobjectif est drsquoameacuteliorer le programme reacutealiseacute agrave la fin du chapitre 2 laquo Communiquerune information raquo afin drsquoafficher chaque menu en fonction de lrsquooption choisie par lrsquoutili-sateur

a Apregraves lrsquoaffichage du menu principal le programme teste la valeur entreacutee par lrsquoutili-sateur et affiche lrsquooption correspondante Sachant que toutes les options du menu

35

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

80

principal ont une probabiliteacute voisine ou eacutequivalente drsquoecirctre reacutealiseacutees quelle est lastructure de test la plus approprieacutee

b Modifiez le programme en fonction de la structure de test choisi et placez lesinstructions drsquoaffichage et de saisie dans les options correspondantes

c Pour lrsquooption 1 testez le type du compte afin de saisir le taux drsquoeacutepargne

d Pour lrsquooption 2 demandez au programme de veacuterifier que le numeacutero du compte saisipar lrsquoutilisateur existe de faccedilon agrave

bull Afficher le numeacutero du compte le type la valeur initiale et son taux dans le casdrsquoun compte drsquoeacutepargne si le compte existe

bull Afficher un message indiquant que le numeacutero du compte nrsquoest pas valide si lecompte nrsquoexiste pas

copy copyright Eacuteditions Eyrolles

4Faire des reacutepeacutetitions

La notion de reacutepeacutetition est une des notions fondamentales de la programmation En effetbeaucoup de traitements informatiques sont reacutepeacutetitifs Par exemple la creacuteation drsquounagenda eacutelectronique neacutecessite de saisir un nom un preacutenom et un numeacutero de teacuteleacutephoneautant de fois qursquoil y a de personnes dans lrsquoagenda

Dans de tels cas la solution nrsquoest pas drsquoeacutecrire un programme qui comporte autantdrsquoinstructions de saisie qursquoil y a de personnes mais de faire reacutepeacuteter par le programme lejeu drsquoinstructions neacutecessaires agrave la saisie drsquoune seule personne Pour ce faire le program-meur utilise des instructions speacutecifiques appeleacutees structures de reacutepeacutetition ou bouclesqui permettent de deacuteterminer la ou les instructions agrave reacutepeacuteter

Dans ce chapitre nous abordons la notion de reacutepeacutetition agrave partir drsquoun exemple imageacute(laquo Combien de sucre dans votre cafeacute raquo)

Nous eacutetudions ensuite les diffeacuterentes structures de boucles proposeacutees par le langage Java(sections laquo La boucle dowhile raquo laquo La boucle while raquo et laquo La boucle for raquo) Pourchacune de ces structures nous preacutesentons et analysons un exemple afin drsquoexaminer lesdiffeacuterentes techniques de programmation associeacutees aux structures reacutepeacutetitives

Combien de sucre dans votre cafeacute

Pour bien comprendre la notion de reacutepeacutetition ou de boucle nous allons ameacuteliorer lrsquoalgo-rithme du cafeacute chaud sucreacute de sorte que le programme demande agrave lrsquoutilisateur deprendre un morceau de sucre autant de fois qursquoil le souhaite Pour cela nous reprenonsuniquement le bloc drsquoinstructions II Preacuteparer le sucre (voir au chapitre 3 laquo Fairedes choix raquo la section laquo Lrsquoalgorithme du cafeacute chaud sucreacute ou non raquo)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

82

Lrsquoexeacutecution du bloc drsquoinstructions II Preacuteparer le sucre nous permet de mettre un seulmorceau de sucre dans la tasse Si nous deacutesirons mettre plus de sucre nous devonsexeacutecuter les instructions 3 et 4 autant de fois que nous souhaitons de morceaux de sucreRemarquons que dans ce bloc les instructions 1 et 2 ne sont pas agrave reacutepeacuteter sous peinedrsquoavoir autant de petites cuillegraveres que de morceaux de sucre dans la tasse La marche agravesuivre devient degraves lors

Prendre une petite cuillegravere Poser la petite cuillegravere dans la tasseDeacutebut reacutepeacuteter 1 Prendre un morceau de sucre 2 Poser le sucre dans la tasse 3 Poser la question Souhaitez-vous un autre morceau de sucre 4 Attendre la reacuteponseTant que la reacuteponse est OUI retourner agrave Deacutebut reacutepeacuteter

Analysons les reacutesultats possibles de cette nouvelle marche agrave suivre

bull Dans tous les cas nous prenons et posons une petite cuillegravere

bull Ensuite nous entrons sans condition dans une structure de reacutepeacutetition

bull Nous prenons et posons un morceau de sucre quelle que soit la suite des opeacuterationsDe cette faccedilon si nous sortons de la boucle le cafeacute est quand mecircme sucreacute

bull Puis le programme nous demande si nous souhaitons agrave nouveau un morceau de sucre

bull Si notre reacuteponse est OUI le programme retourne au deacutebut de la structure reacutepeacutetitiveplace le sucre dans la tasse et demande de nouveau si nous souhaitons du sucre etc

bull Si la reacuteponse est neacutegative la reacutepeacutetition srsquoarrecircte ainsi que la marche agrave suivre

Pour eacutecrire une boucle nous constatons que

bull Il est neacutecessaire de deacuteterminer ougrave se trouve le deacutebut de la boucle et ougrave se situe la fin(Deacutebut reacutepeacuteter et Tant que pour notre exemple)

bull La sortie de la structure reacutepeacutetitive est soumise agrave la reacutealisation ou non drsquoune condition(la reacuteponse fournie est-elle affirmative ou non )

bull Le reacutesultat du test de sortie de boucle est modifiable par une instruction placeacutee agrave lrsquointeacute-rieur de la boucle (la valeur de la reacuteponse est modifieacutee par lrsquoinstruction 4 Attendrela reacuteponse)

Dans le langage informatique la construction drsquoune reacutepeacutetition ou boucle suit le mecircmemodegravele

Instructions Bloc drsquoinstructions

Si (cafeacute sucreacute)

1 Prendre une petite cuillegravere

2 Poser la petite cuillegravere dans la tasse

3 Prendre un morceau de sucre

4 Poser le sucre dans la tasse

II Preacuteparer le sucre

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

83

Dans le langage Java il existe trois types de boucles qui sont deacutecrites par les construc-tions suivantes

Dans la suite de ce chapitre nous allons pour chacune de ces boucles

bull Eacutetudier la syntaxe

bull Analyser les principes de fonctionnement

bull Donner un exemple qui introduise un concept fondamental de la programmation agravesavoir le compteur de boucle lrsquoaccumulation de valeurs ou la recherche drsquoune donneacuteeparmi un ensemble drsquoinformations

La boucle dowhile La boucle dohellipwhile est une structure reacutepeacutetitive dont les instructions sont exeacutecuteacuteesavant mecircme de tester la condition drsquoexeacutecution de la boucle Pour construire une tellestructure il est neacutecessaire de suivre les regravegles de syntaxe deacutecrites ci-apregraves

Syntaxe La boucle dohellipwhile se traduit par les termes faire tant que Cette structure srsquoeacutecritde deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit de la faccedilonsuivante

do une seule instruction while (expression conditionnelle)

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave commence et se termine laboucle

do plusieurs instructions while (expression conditionnelle)

Principes de fonctionnementAinsi deacutecrite la boucle dohellipwhile srsquoexeacutecute selon les principes suivants

bull Les instructions situeacutees agrave lrsquointeacuterieur de la boucle sont exeacutecuteacutees tant que lrsquoexpressionconditionnelle placeacutee entre parenthegraveses() est vraie

Type de boucle Signification

dowhile

while

for

Faire tant queTant que Pour

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

84

bull Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression conditionnelleest examineacutee en fin de boucle apregraves exeacutecution des instructions

bull Si la condition mentionneacutee entre parenthegraveses reste toujours vraie les instructions de laboucle sont reacutepeacuteteacutees agrave lrsquoinfini On dit que le programme laquo boucle raquo

bull Une instruction modifiant le reacutesultat du test de sortie de boucle est placeacutee agrave lrsquointeacuterieurde la boucle de faccedilon agrave stopper les reacutepeacutetitions au moment souhaiteacute

bull Remarquons qursquoun point-virgule est placeacute agrave la fin de lrsquoinstruction while (expres-sion)

Un distributeur automatique de cafeacuteLrsquoobjectif de cet exemple est double apprendre agrave construire une boucle dohellipwhile eteacutetudier comment compter et accumuler des valeurs

Le comptage des valeurs quelles qursquoelles soient est une technique tregraves utiliseacutee en infor-matique Il existe deux faccedilons de compter

bull Le comptage drsquoun certain nombre de valeurs Par exemple le programme compte lenombre de notes drsquoun eacutetudiant

bull Lrsquoaccumulation de valeurs Le programme calcule la somme des notes drsquoun eacutetudiant(les notes sont accumuleacutees)

Le calcul de la moyenne des notes drsquoun eacutetudiant srsquoeffectue en divisant lrsquoaccumulationdes notes par le nombre (comptage) de notes obtenues

Pour bien comprendre ces diffeacuterentes techniques nous allons eacutecrire un programme dontlrsquoobjectif est de simuler de faccedilon simplifieacutee un distributeur automatique de cafeacute

Cahier des charges

Pour obtenir un cafeacute lrsquoutilisateur introduit un certain nombre de piegraveces de monnaie dansle distributeur Pour simplifier nous supposons que lrsquoappareil nrsquoaccepte que les piegraveces de1 2 et 5 F Lorsqursquoune piegravece est introduite le distributeur affiche la valeur totaleengageacutee ainsi que le nombre de piegraveces par cateacutegorie (nombre de piegraveces de 1 F 2 F et5 F) La machine preacutepare un cafeacute degraves que la somme totale introduite vaut ou deacutepasse leprix du cafeacute Nous prenons pour hypothegravese que le prix drsquoun cafeacute soit de 3 F La machinerend la monnaie srsquoil y a lieu

Apregraves lecture et analyse du cahier des charges nous remarquons que la deacutemarche sedeacuteroule en trois temps

1 Introduction une agrave une des piegraveces dans le distributeur

2 Agrave chaque piegravece fournie calcul et affichage

a Du nombre de piegraveces de 1 F 2 F et 5 F

b De la somme engageacutee

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

b Oui alors preacuteparer le cafeacute et rendre la monnaie copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

85

Pour eacutecrire le programme nous allons nous attacher agrave reacutesoudre dans lrsquoordre chacun deces points

1 Construire la boucle et introduire les piegraveces

Les points 1 et 3a deacutecrivent la structure de la boucle Lrsquointroduction des piegraveces dansle distributeur est une opeacuteration reacutepeacutetitive qui srsquoarrecircte lorsque lrsquoutilisateur a placeacutesuffisamment drsquoargent dans le distributeur crsquoest-agrave-dire lorsque le montant totalengageacute vaut ou deacutepasse la somme de 3 F Par conseacutequent lrsquoallure geacuteneacuterale de lastructure reacutepeacutetitive est la suivante

Deacutebut reacutepeacuteter Entrer une piegravece de monnaie Compter la somme engageacuteeTant que la somme engageacutee ne deacutepasse pas 3 F retourner agrave Deacutebut reacutepeacuteter

En langage Java cette structure est traduite en reprenant la syntaxe de la boucledohellipwhile crsquoest-agrave-dire par

do Deacutebut de boucle Entrer les piegraveces de monnaie Compter la somme engageacuteewhile (somme engageacutee lt 3 F) Fin de boucle

De cette faccedilon la boucle est exeacutecuteacutee tant que la somme engageacutee est infeacuterieure agrave 3 FDegraves que cette somme vaut ou deacutepasse 3 F la condition somme engageacutee lt 3 F nrsquoestplus veacuterifieacutee et le programme sort de la boucle

Ensuite pour simuler lrsquointroduction des piegraveces de monnaie dans le distributeur leprogramme demande agrave lrsquoutilisateur de saisir au clavier la valeur de chaque piegraveceentreacutee Nous eacutecrivons donc

Systemoutprintln(valeur de la piece entree )piegravece = Lireb()

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

2 Compter le nombre de piegraveces et la somme totale engageacutee

Pour compter le nombre de piegraveces de 1 F 2 F et 5 F le programme doit pouvoirdistinguer les diffeacuterentes piegraveces introduites Pour cela nous deacuteclarons autant devariables qursquoil y a de cateacutegories de piegraveces soit

byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece totalReccedilu = 0

Les variables dont le nom commence par nb repreacutesentent le nombre de piegraveces pourchacune des cateacutegories La variable piegravece deacutesigne quant agrave elle la valeur de la piegravecesaisie au clavier Enfin la variable totalReccedilu repreacutesente la somme totale engageacutee encours drsquoexeacutecution de la boucle Ces variables sont deacuteclareacutees de type byte (leurvaleur ne deacutepasse jamais 127)

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

86

a Pour compter seacutepareacutement les piegraveces de 1 F de 2 F et de 5 F la meilleure meacutethodeconsiste agrave placer dans la boucle dohellipwhile une structure switch distinguant troiscas

switch (piegravece) case 1 Compter les piegraveces de 1 F break case 2 Compter les piegraveces de 2 F break case 5 Compter les piegraveces de 5 F break default Systemoutprintln (Piece impossible)

Suivant la valeur de la piegravece engageacutee le programme compte le nombre de piegravecespour chacune des cateacutegories en utilisant une instruction du type

a = a + 1

ougrave a repreacutesente lrsquoobjet agrave compter Si la variable a est initialiseacutee agrave 0 la nouvellevaleur de a apregraves affectation vaut 1

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Quelquesconfusions agrave eacuteviter raquo

Placeacute dans une structure reacutepeacutetitive le nombre drsquoobjets repreacutesenteacutes par a augmentede 1 agrave chaque tour de boucle En informatique on dit que a est increacutementeacute de 1Pour compter le nombre de piegraveces de 1 F 2 F et 5 F il suffit de remplacer la varia-ble a par nbPiegravece1F nbPiegravece2F ou nbPiegravece5F Nous obtenons ainsi pour chaquecateacutegorie de piegraveces les instructions suivantes

nbPiegravece1F = nbPiegravece1F + 1nbPiegravece2F = nbPiegravece2F + 1nbPiegravece5F = nbPiegravece5F + 1

b Ces instructions sont ensuite placeacutees dans les eacutetiquettes 1 2 et 5 de la structure switch

Pour mieux comprendre lrsquoeacutevolution de la valeur de ces variables reportez-vous agrave la sectionlaquo Reacutesultat de lrsquoexeacutecution raquo

Pour calculer la somme engageacutee agrave chaque piegravece introduite la technique est leacutegegravere-ment diffeacuterente de la preacuteceacutedente En effet la somme engageacutee doit ecirctre augmenteacuteenon plus du nombre de piegraveces introduites mais de la valeur de la piegravece introduiteLrsquoincreacutement nrsquoest plus de 1 mais de la valeur de la piegravece Comme la variable piegravecerepreacutesente la valeur de la piegravece lrsquoinstruction drsquoaccumulation est la suivante

totalReccedilu = totalReccedilu + piegravece

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

87

Ainsi la variable totalReccedilu initialiseacutee agrave zeacutero augmente progressivement de lavaleur de chaque piegravece engageacutee par accumulation de la valeur preacuteceacutedente detotalReccedilu avec la valeur de la piegravece entreacutee

Ce calcul est reacutealiseacute quelle que soit la valeur de la piegravece Par conseacutequent cetteinstruction est placeacutee en dehors de la structure switch mais agrave lrsquointeacuterieur de laboucle Le montant total engageacute est modifieacute chaque fois qursquoune nouvelle piegravece de1 F 2 F ou 5 F est introduite

Pour eacuteviter drsquoaccumuler dans totalReccedilu la valeur drsquoune piegravece non autoriseacutee nousdevons modifier la valeur de la piegravece dans lrsquoeacutetiquette default de la structureswitch par lrsquoinstruction

default piegravece = 0 Systemoutprintln (Piece impossible)

Lorsqursquoune mauvaise piegravece est introduite la variable piegravece prend la valeur 0 Decette faccedilon lrsquoinstruction drsquoaccumulation est reacutealiseacutee quelle que soit la valeur dela piegravece puisque la variable totalReccedilu nrsquoest pas modifieacutee par lrsquoaccumulationdrsquoune piegravece valant 0 F

Pour mieux comprendre lrsquoeacutevolution de la valeur de la variable totalReccedilu reportez-vous agrave lasection laquo Reacutesultat de lrsquoexeacutecution raquo

Une fois le nombre de piegraveces compteacute et le montant total calculeacute le programmeaffiche les diffeacuterentes valeurs agrave lrsquoaide des instructions suivantes

Systemoutprintln(Vous avez entre )Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F)Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F)Systemoutprintln(Soit au total + totalReccedilu + F)

Lrsquoensemble de ces instructions est placeacute avant le test de sortie de boucle puisque lesvaleurs calculeacutees sont afficheacutees chaque fois que lrsquoutilisateur entre une piegravece

3 Y a-t-il suffisamment drsquoargent

a Non alors retourner en 1

Il srsquoagit de deacuteterminer la condition de sortie ou non de la boucle Cette opeacuterationest deacutecrite au point 1

Remarquons cependant que gracircce agrave lrsquoinstruction drsquoaccumulationtotalReccedilu = totalReccedilu + piegravece

la valeur de la variable totalReccedilu est augmenteacutee agrave chaque tour de boucle Parconseacutequent le reacutesultat de la condition de sortie de boucle (totalReccedilu lt 3) nereste pas toujours vrai Le programme peut sortir de la boucle

b Oui alors preacuteparer le cafeacute et rendre la monnaie

Lorsque lrsquoutilisateur a entreacute suffisamment de piegraveces de monnaie le programmeaffiche un message qui annonce que le cafeacute est precirct agrave lrsquoaide de lrsquoinstruction

Systemoutprintln(Je vous verse 1 cafe )

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

88

Pour deacutetecter un trop-perccedilu le programme teste si totalReccedilu deacutepasse la valeur duprix du cafeacute Si tel est le cas il calcule la monnaie agrave rendre et affiche un messageen conseacutequence Ces actions sont reacutealiseacutees par les instructions

if (totalReccedilu gt 3)Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Exemple code source

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class CompteurMonnaie public static void main(String [] arg) byte nbPiegravece1F = 0 nbPiegravece2F= 0 nbPiegravece5F=0 piegravece byte totalReccedilu = 0 Systemoutprintln(Pour obtenir un cafe entrez au moins 3 F) Systemoutprintln(Je rends la monnaie ) do Systemoutprintln(valeur de la piece entree ) piegravece = Lireb() switch (piegravece) case 1 nbPiegravece1F = nbPiegravece1F + 1 break case 2 nbPiegravece2F = nbPiegravece2F + 1 break case 5 nbPiegravece5F = nbPiegravece5F + 1 break default piegravece = 0 Systemoutprintln (Piece impossible) totalReccedilu = totalReccedilu + piegravece Systemoutprintln(Vous avez entre ) Systemoutprintln( + nbPiegravece1F + piece(s) de 1 F) Systemoutprintln( + nbPiegravece2F + piece(s) de 2 F) Systemoutprintln( + nbPiegravece5F + piece(s) de 5 F) Systemoutprintln(Soit au total + totalReccedilu + F) while (totalReccedilu lt 3) Systemoutprintln(Je vous verse 1 cafe ) if (totalReccedilu gt 3)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

89

Systemoutprintln(et vous rends + (totalReccedilu-3) + F )

Reacutesultat de lrsquoexeacutecution

La boucle whileLe langage Java propose une autre structure reacutepeacutetitive analogue agrave la boucle dohellipwhilemais dont la deacutecision de poursuivre la reacutepeacutetition srsquoeffectue en deacutebut de boucle Il srsquoagitde la boucle while

Syntaxe

La boucle while srsquoeacutecrit de deux faccedilons diffeacuterentes en fonction du nombre drsquoinstructionsqursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

while (expression conditionnelle) une seule instruction

Agrave lrsquoeacutecranpiegravece nb

Piegravece1Fnb

Piegravece2Fnb

Piegravece5FtotalReccedilu

Valeurs initiales au deacutebut de lrsquoexeacutecution - 0 0 0 0

Valeur de la piece entree 2Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

2 0 1car 0 + 1

0 2car 0 + 2

Valeur de la piece entree 10Piece impossible Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 0 piece(s) de 5 FSoit au total 2 F

10 0

0 1 0 2car2 + 0

Valeur de la piece entree 5Vous avez entre 0 piece(s) de 1 F 1 piece(s) de 2 F 1 piece(s) de 5 FSoit au total 7 F

5 0 1 1car 0 + 1 = 1

7car 2 + 5

Je vous verse 1 cafeet vous rends 4 F

5 0 1 1 7

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

90

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par desaccolades ouvrante et fermante de faccedilon agrave deacuteterminer ougrave deacutebute et se termine la boucle

while (expression conditionelle) plusieurs instructions

Principes de fonctionnementLe terme while se traduit par tant que La structure reacutepeacutetitive srsquoexeacutecute selon les prin-cipes suivants

bull Tant que lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses reste vraie la ou les instructionscomposant la boucle sont exeacutecuteacutees

bull Le programme sort de la boucle degraves que lrsquoexpression agrave lrsquointeacuterieur des parenthegravesesdevient fausse

bull Une instruction est placeacutee agrave lrsquointeacuterieur de la boucle pour modifier le reacutesultat du test agravelrsquoentreacutee de la boucle de faccedilon agrave stopper les reacutepeacutetitions

bull Si lrsquoexpression agrave lrsquointeacuterieur des parenthegraveses est fausse degraves le deacutepart les instructions nesont jamais exeacutecuteacutees

bull Observons qursquoagrave lrsquoinverse de la boucle dohellipwhile il nrsquoy a pas de point-virgule agrave la finde lrsquoinstruction while (expression)

Saisir un nombre entier au clavierLrsquoobjectif de cet exemple est drsquoapprendre agrave eacutecrire une boucle while et de comprendrecomment reacutealiser la saisie drsquoun entier au clavier telle qursquoelle est reacutealiseacutee dans leprogramme Lirejava

Nous avons deacutejagrave remarqueacute (voir au chapitre 2 laquo Communiquer une information raquo lasection laquo La saisie de donneacutees raquo) que la fonction Systeminread() ne permettait desaisir qursquoun seul caractegravere agrave la fois au clavier Pour saisir un nombre composeacute deplusieurs chiffres ou un mot constitueacute de plusieurs caractegraveres nous devons faire appel agravela fonction Systeminread() autant de fois qursquoil y a de caractegraveres agrave saisir

Cette saisie de caractegraveres est donc une opeacuteration reacutepeacutetitive qui doit srsquoarrecircter lorsque lavaleur numeacuterique ou le mot est entiegraverement entreacute Lrsquoordinateur nrsquoest pas agrave mecircme dedeacuteterminer quand la saisie est termineacutee Lrsquoutilisateur confirme qursquoil a fini drsquoentrer desvaleurs en appuyant sur une touche caracteacuteristique du clavier Cette touche utiliseacutee pourpasser agrave la ligne dans les logiciels de traitement de texte est communeacutement appeleacutee latouche laquo Entreacutee raquo

Notre but eacutetant de saisir une valeur numeacuterique entiegravere nous devons traduire lrsquoensembledes caractegraveres saisis de faccedilon agrave les stocker non plus dans un String mais dans unevariable de type int Si cette traduction nrsquoest pas reacutealiseacutee il nrsquoest pas possible drsquoaddi-tionner ou de diviser les caractegraveres lus agrave la maniegravere des valeurs numeacuteriques Par exemplele fait drsquoadditionner la suite de caractegraveres 123 avec la valeur 4 a pour reacutesultat 1234 Par

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

91

contre apregraves traduction des caractegraveres en valeur numeacuterique la mecircme opeacuteration donnepour reacutesultat 127

Cahier des charges

Nous venons de lrsquoobserver pour confirmer que nous nrsquoavons plus de caractegravere agrave saisirnous devons appuyer sur la touche laquo Entreacutee raquo du clavier Pour saisir une valeur numeacute-rique entiegravere la liste des opeacuterations srsquoexprime sous la forme de la structure reacutepeacutetitivesuivante

1 Tant que le caractegravere saisi nrsquoest pas le caractegravere laquo Entreacutee raquo

a Lire un caractegravere

b Stocker le caractegravere lu dans un mot

Retourner en 1

2 Tous les caractegraveres eacutetant saisis les traduire en un nombre entier

Pour eacutecrire le programme en langage Java reprenons cette marche agrave suivre point parpoint

1 La boucle tant que est traduite en Java par la construction suivante

while (C = rsquonrsquo) Lire un caractegravere au clavier Stocker le caractegravere dans un mot

En Java le caractegravere laquo Entreacutee raquo est symboliseacute par le caractegravere rsquonrsquo sur des ordina-teurs de type Unix ou Macintosh Sur un PC la touche laquo Entreacutee raquo correspond agrave laseacuterie de caractegraveres rsquorrsquo et rsquonrsquo Afin de rendre compatible le programme avec tousles ordinateurs nous allons tester la condition de sortie de boucle sur le caractegraverersquonrsquo puisque celui-ci est commun agrave tous les mondes qursquoils soient Unix Macintoshou PC De cette faccedilon en eacutecrivant while (C = rsquonrsquo) ougrave C repreacutesente le caractegraverelu nous exprimons en langage informatique la phrase tant que le caractegravere saisinrsquoest pas le caractegravere laquo Entreacutee raquo

La premiegravere fois que le programme entre dans la boucle aucun caractegravere nrsquoa encoreeacuteteacute saisi Il est donc neacutecessaire drsquoinitialiser la variable C agrave un caractegravere diffeacuterent dersquonrsquo de faccedilon agrave assurer que la condition drsquoentreacutee dans la boucle soit au moins veacuteri-fieacutee la premiegravere fois Pour cela nous deacuteclarons C en deacutebut de programme de la faccedilonsuivante

char C =rsquo0rsquo

Par cette instruction nous initialisons la variable C au caractegravere nul (rsquo0rsquo) Nousaurions pu lrsquoinitialiser agrave tout autre caractegravere agrave condition que celui-ci fucirct diffeacuterent dersquonrsquo Le choix du caractegravere nul nrsquoest ici reacutealiseacute que parce que en geacuteneacuteral les varia-bles de type entier ou reacuteel sont initialiseacutees agrave 0 ou 00 En Java le caractegravere rsquo0rsquo estlrsquoeacutequivalent de la valeur numeacuterique nulle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

92

a Pour lire un caractegravere au clavier lrsquoinstruction est la suivante

C = (char) Systeminread()

La fonction Systeminread() attend que lrsquoutilisateur appuie sur une touche duclavier Cela fait elle retourne en reacutesultat la valeur entiegravere correspondant aucaractegravere associeacute agrave la touche du clavier Pour traduire cette valeur entiegravere en codecaractegravere il est neacutecessaire de placer le cast (char) devant la fonction De cettefaccedilon la variable C contient le code Unicode du caractegravere saisi

b Stocker le caractegravere lu dans un mot

Lrsquoobjectif est de lire plusieurs caractegraveres drsquoaffileacutee Nous devons donc stocker dansune variable de type String chaque caractegravere au fur et agrave mesure de la saisie (voirau chapitre 7 laquo Les classes et les objets raquo la section laquo La classe String uneapproche vers la notion drsquoobjet raquo) Gracircce au type String plusieurs caractegraverespeuvent ecirctre stockeacutes sous un mecircme nom de variable La meacutethode consiste agrave accu-muler dans une variable les valeurs lues en utilisant lrsquoinstruction

tmp = tmp + C

Cette instruction permet drsquoaccumuler les valeurs saisies en les placcedilant les unesderriegravere les autres dans la variable tmp En effet lorsque deux caractegraveres sont addi-tionneacutes ceux-ci sont placeacutes dans la variable lrsquoun apregraves lrsquoautre dans lrsquoordredrsquoexeacutecution de lrsquoopeacuteration Lrsquoaddition du caractegravere rsquoersquo et du caractegravere rsquotrsquo a pourreacutesultat le mot et Dans le jargon informatique lrsquoaddition de caractegraveres est aussiappeleacutee la concateacutenation de caractegraveres

En deacutebut de programme la variable tmp ne doit pas contenir de caractegravere Celavient du fait que la premiegravere fois qursquoun caractegravere lu est placeacute dans la variable tmpil doit correspondre au tout premier caractegravere du mot stockeacute dans la variable tmpCrsquoest pourquoi la variable tmp doit ecirctre deacuteclareacutee de la faccedilon suivante ( corres-pondant agrave un mot vide de caractegravere)

String tmp =

Lorsque au final lrsquoutilisateur appuie sur la touche laquo Entreacutee raquo pour valider la fin dela saisie le programme (sur PC) reccediloit la suite de caractegraveres rsquorrsquo et rsquonrsquo Lavariable tmp contient en deacutefinitive la suite des caractegraveres saisis plus les caractegraveresrsquorrsquo et rsquonrsquo Or nous souhaitons transformer cette suite de caractegraveres en valeurnumeacuterique Pour cela nous devons eacuteliminer les caractegraveres rsquorrsquo et rsquonrsquo qui empecirc-chent cette transformation

Pour plus drsquoinformations reportez-vous au paragraphe laquo 2 Traduire les caractegraveres en un nombreentier raquo un peu plus loin dans ce chapitre

Lrsquoaccumulation des caractegraveres ne se reacutealise donc qursquoagrave la condition que le caractegraveresaisi ne soit eacutegal ni agrave rsquorrsquo ni agrave rsquonrsquo

Pour reacutesumer la boucle srsquoeacutecrit

String tmp = char C =rsquo0rsquowhile (C = rsquonrsquo)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

93

C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

Pour mieux comprendre en pratique le deacuteroulement de cette boucle examinonslrsquoeacutevolution des variables agrave partir drsquoun exemple Nous supposons que lrsquoutilisateurentre les caractegraveres 2 8 et laquo Entreacutee raquo

c tmp Explication

String tmp = 0 - Initialisation

char C =rsquo0rsquo 0 Initialisation

while (C = rsquonrsquo)

0 C eacutetant initialiseacute au caractegravere lsquo0rsquo C est diffeacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 2 Le programme attend la saisie drsquoune valeur au cla-vier Nous supposons que le caractegravere saisi soit 2

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

2 2 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo la concateacute-nation est exeacutecuteacutee La variable tmp eacutetant initialiseacutee agrave la chaicircne vide () lrsquoopeacuteration + rsquo2rsquo stocke le caracegravere 2 en premiegravere position dans la variable tmp

2 2 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

2 2 La variable C contient la valeur 2 C est donc diffeacute-rent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C = (char)Systeminread() 8 2 Nous entrons le caractegravere 8

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

8 28 Le caractegravere C eacutetant diffeacuterent de rsquorrsquo lrsquoopeacuteration rsquo2rsquo + rsquo8rsquo est exeacutecuteacutee et stocke le mot 28 dans la variable tmp

8 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

8 28 La variable C contient le caractegravere 8 C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

C=(char)Systeminread() r 28 Nous appuyons sur la touche laquo Entreacutee raquo Sur PC le premier caractegravere entreacute est rsquorrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp+C

r 28 C vaut rsquorrsquo La condition nrsquoeacutetant pas veacuterifieacutee il nrsquoy a pas accumulation du caractegravere dans tmp

r 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C = rsquonrsquo)

r 28 La variable C contient le caractegravere r C est donc dif-feacuterent du caractegravere rsquonrsquo La condition placeacutee entre () est veacuterifieacutee Le programme entre dans la boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

94

2 Traduire les caractegraveres en un nombre entier

Pour traduire un ensemble de caractegraveres en une valeur numeacuterique le langage Javapropose un certain nombre de fonctions Dans notre cas il srsquoagit de traduire un moten une valeur entiegravere de type int La fonction Java IntegerparseInt() permet unetelle traduction Lrsquoinstruction est la suivante

valeur = IntegerparseInt(tmp)

valeur est une variable deacuteclareacutee de type int et tmp est le mot qui contient les carac-tegraveres agrave traduire La variable tmp ne doit contenir que des caractegraveres repreacutesentant deschiffres Si tel nrsquoest pas le cas le programme srsquoarrecircte avec un message drsquoerreur agravelrsquoexeacutecution Par exemple si lrsquoutilisateur entre le mot deux au lieux du caractegravere 2lrsquointerpreacuteteur Java affiche le message suivant

javalangNumberFormatException deuxat javalangIntegerparseInt (compiled Code)

Ce message indique que le format du nombre saisi ne correspond pas au formatattendu par la fonction IntegerparseInt() Nous aurions obtenu le mecircme typedrsquoerreur en stockant les caractegraveres rsquorrsquo ou rsquonrsquo dans la variable tmp

Pour connaicirctre les autres fonctions permettant de traduire une chaicircne de caractegraveresen valeur numeacuterique de type double float long ou byte vous pouvez consulter agravelrsquoaide drsquoun eacutediteur de texte le fichier Lirejava qui emploie toutes ces fonctions

Pour finir le programme affiche les diffeacuterents reacutesultats agrave lrsquoaide de la fonctionSystemoutprintln Cet affichage est reacutealiseacute agrave la fin du code source complet ci-dessous

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classecomme ci-dessous

public class LireUnEntier public static void main (String [] param) throws javaioIOException

c tmp Explication

C = (char)Systeminread() n 28 Le caractegravere suivant envoyeacute par la touche laquo Entreacutee raquo est rsquonrsquo

if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C

n 28 C vaut rsquonrsquo La condition nrsquoest pas veacuterifieacutee et il nrsquoy a pas accumulation du caractegravere dans tmp

n 28 Fin de boucle Le programme retourne en deacutebut de boucle

while (C =rsquonrsquo)

n 28 La variable C contient le caractegravere n La condition placeacutee entre () nrsquoest plus veacuterifieacutee Le programme sort de la boucle et passe agrave lrsquoeacutetape suivante

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

95

String tmp = char C= rsquo0rsquo int valeur Systemoutprint(Entrez des chiffres et appuyez sur ) Systemoutprintln(la touche Entree pour valider la saisie ) while (C = rsquonrsquo) C = (char) Systeminread() if (C = rsquorrsquo ampamp C = rsquonrsquo) tmp = tmp + C Systemoutprintln(Vous avez entre + tmp) valeur = IntegerparseInt(tmp) Systemoutprintln(Crsquoest a dire + valeur + en entier) Fin du main () Fin de la Class LireUnEntier

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant les valeurssaisies le programme donne un reacutesultat diffeacuterent

Exeacutecution 1

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2288Vous avez entre 28Crsquoest a dire 28 en entier

La premiegravere valeur 28 afficheacutee est un mot Lrsquoaddition de cette valeur avec le nombre 4 apour reacutesultat 284 La deuxiegraveme valeur afficheacutee est un nombre et la mecircme addition a pourreacutesultat 32

Exeacutecution 2

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie ttrrooiissjavalangNumberFormatException troisat javalangIntegerparseInt (compiled Code)

Le mot trois nrsquoest pas un nombre mais un mot sans signification particuliegravere pourlrsquoordinateur lrsquointerpreacuteteur Java ne peut traduire ce mot en un nombre entier

Exeacutecution 3

Entrez des chiffres et appuyez sur la touche Entree pour valider la saisie 2255javalangNumberFormatException 25at javalangIntegerparseInt (compiled Code)

Le mot 25 nrsquoa pas le format drsquoun nombre entier mais drsquoun nombre reacuteel La fonctionIntegerparseInt() ne peut le traduire en un nombre entier

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

96

La boucle for Lrsquoinstruction for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations (de tours) agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

Syntaxe La boucle for srsquoeacutecrit elle aussi de deux faccedilons diffeacuterentes en fonction du nombredrsquoinstructions qursquoelle comprend

Dans le cas ougrave une seule instruction doit ecirctre reacutepeacuteteacutee la boucle srsquoeacutecrit

for (initialisation condition increacutement) une seule instruction

Si la boucle est composeacutee drsquoau moins deux instructions celles-ci sont encadreacutees par deuxaccolades ouvrante et fermante de sorte agrave deacuteterminer ougrave deacutebute et se termine la boucle

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepareacuteesobligatoirement par des points-virgules () Ces instructions deacutefinissent une variable ouindice qui controcircle le bon deacuteroulement de la boucle Ainsi

bull Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle(exemple i = 0 i eacutetant lrsquoindice) Elle est la premiegravere instruction exeacutecuteacutee agrave lrsquoentreacuteede la boucle

bull Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle(exemple i lt 10) Elle est examineacutee avant chaque tour de boucle y compris aupremier tour de boucle

bull Increacutement est lrsquoinstruction qui permet de modifier le reacutesultat du test preacuteceacutedent enaugmentant ou diminuant la valeur de la variable testeacutee Lrsquoincreacutement peut ecirctreaugmenteacute ou diminueacute de N N est appeleacute le pas drsquoincreacutementation (exemple i = i + 2) Cette instruction est exeacutecuteacutee agrave la fin de chaque tour de boucle

Principes de fonctionnementLes boucles for reacutealisent un nombre preacutecis de boucles deacutependant de la valeur initiale dela valeur finale et du pas drsquoincreacutementation Voyons sur diffeacuterents exemples comment cesboucles sont exeacutecuteacutees (tableau suivant)

Remarquons que

bull Le nombre de tours est identique dans chacune de ces boucles malgreacute une deacutefinitiondiffeacuterente pour chacune des instructions de controcircle

bull Lrsquoeacutecriture de lrsquoinstruction Increacutement qui augmente ou diminue de 1 la variable decontrocircle de la boucle peut ecirctre simplifieacutee En effet par convention lrsquoinstruction

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

97

i = i + 1 srsquoeacutecrit plus simplement i++ et lrsquoinstruction i-- a le mecircme reacutesultat quelrsquoinstruction i = i - 1

Rechercher le code Unicode drsquoun caractegravere donneacuteLrsquoobjectif de cet exemple est drsquoapprendre agrave construire une boucle for et de srsquoinitier agrave larecherche drsquoinformation dans un ensemble de donneacutees Pour cela nous allons eacutecrire unprogramme qui recherche dans la table Unicode le code drsquoun caractegravere donneacute par lrsquoutili-sateur Cette recherche srsquoeffectue en comparant chaque caractegravere de la table Unicode aucaractegravere saisi

Cahier des charges

La meacutethode est la suivante

1 Lire le caractegravere dont on souhaite connaicirctre le code Unicode

2 Pour chaque caractegravere de la table Unicode

Si le caractegravere Unicode est identique au caractegravere choisi afficher son code Unicode

Reprenons chaque point pour le traduire en un programme Java

1 Pour lire au clavier le caractegravere dont on souhaite connaicirctre le code Unicode lesinstructions sont les suivantes

Pour plus drsquoinformations voir le chapitre 2 laquo Communiquer une information raquo

Systemoutprintln(Quel caractere recherchez-vous )recherche = Lirec()

Ougrave la variable recherche est deacuteclareacutee de type char

2 Le programme parcourt la table Unicode caractegravere par caractegravere et recherche lecaractegravere souhaiteacute Cette opeacuteration est reacutepeacutetitive et srsquoexeacutecute autant de fois qursquoil y ade caractegraveres dans la table Unicode crsquoest-agrave-dire du caractegravere 0 au caractegravere 255

Pour plus drsquoinformations sur la table Unicode voir au chapitre 1 laquo Stocker une information raquo lasection laquo Cateacutegorie caractegravere raquo

Pour parcourir cette table la solution est drsquoutiliser une boucle for dont la valeur delrsquoindice varie de 1 en 1 dans lrsquointervalle [0 255] Cette boucle srsquoeacutecrit

for (i = 1 i lt 255 i++)

int i char c

Valeur initiale

Valeur finale

Pas drsquoincreacutementation

Nombre de boucles

Valeurs prises par i ou c

for (i = 0 i lt 5 i = i +1) 0 4 1 5 0 1 2 3 4

for (i = 4 i lt= 12 i = i + 2) 4 12 2 5 4 6 8 10 12

for (c = rsquoarsquo c lt rsquofrsquo c = c + 1) rsquoarsquo rsquoersquo 1 5 a b c d e

for (i = 5 i gt 0 i = i ndash 1) 5 0 ndash 1 5 5 4 3 2 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

98

La variable i deacuteclareacutee de type int repreacutesente lrsquoindice du caractegravere dans la tableUnicode Il y a eacutequivalence entre lrsquoindice et le caractegravere En effet un caractegravere estdeacutefini agrave partir drsquoune valeur numeacuterique

La seule diffeacuterence entre une valeur numeacuterique et un caractegravere provient du type decodage utiliseacute pour les repreacutesenter lrsquoun et lrsquoautre Pour connaicirctre le caractegravere corres-pondant agrave cet indice la meacutethode consiste agrave transformer la valeur de lrsquoindice en uncode caractegravere par lrsquointermeacutediaire du cast (char) Ainsi lrsquoinstruction

atrouver = (char) i

transforme lrsquoindice i de la table Unicode en son code caractegravere La variable atrou-ver deacuteclareacutee de type char prend la valeur de ce code

Connaissant le caractegravere agrave rechercher ainsi que le code caractegravere de chaque caractegraverede la table Unicode il suffit de les comparer pour savoir srsquoils sont identiques ou nonLrsquoinstruction srsquoeacutecrit sous la forme du test suivant

if (atrouver == recherche)

Si le caractegravere Unicode est identique au caractegravere choisi le programme affiche soncode Unicode agrave lrsquoaide des instructions

Systemoutprint(le code Unicode de + atrouver)Systemoutprintln( est u00 + IntegertoString(i16))

Rappelons que le code Unicode drsquoun caractegravere srsquoobtient en placcedilant derriegravere lescaractegraveres u00 la valeur hexadeacutecimale de la position du caractegravere dans la tableUnicode Pour afficher ce code nous devons donc traduire la variable i (qui corres-pond agrave la position du caractegravere dans la table Unicode) en valeur hexadeacutecimale Cettetraduction est reacutealiseacutee par la fonction

IntegertoString(valeur entiegravere base)

qui transforme le paramegravetre valeur entiegravere en une chaicircne de caractegraveres suivant lecodage donneacute par le paramegravetre base Si valeur entiegravere repreacutesente lrsquoindice i et quebase prenne la valeur 16 nous obtenons la valeur hexadeacutecimale de la position ducaractegravere trouveacute

La suite des caractegraveres u00 placeacutee dans la fonction Systemoutprintln est consi-deacutereacutee comme une seacutequence particuliegravere puisqursquoelle permet lrsquoaffichage des caractegraverespeacuteciaux Pour annuler le caractegravere speacutecifique de cette seacutequence il est neacutecessaire deplacer un premier devant u00

Exemple code source complet

Pour obtenir un programme agrave part entiegravere lrsquoensemble des instructions deacuteveloppeacutees aucours de la section preacuteceacutedente est agrave placer dans une fonction main() et une classe commeci-dessous

public class QuelUnicode public static void main (String [] parametre)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

99

int i char recherche atrouver Systemoutprintln(Quel caractere recherchez-vous ) recherche = Lirec() for (i = 1 i lt 255 i++) atrouver = (char) i if (atrouver == recherche) Systemoutprint(le code Unicode de + atrouver) Systemoutprintln( est u00 + IntegertoString(i16)) Fin du if Fin du for Fin du main() Fin de QuelUnicode

Reacutesultat de lrsquoexeacutecution

Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur Suivant lrsquoenviron-nement drsquoexeacutecution le programme donne des reacutesultats diffeacuterents

Exeacutecution sous Dos

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u0082

Exeacutecution sous Mac OS

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00c8

Exeacutecution sous Windows ou Unix

Quel caractere recherchez-vous eacuteeacutele code Unicode de eacute est u00e9

Lrsquoexeacutecution du mecircme programme sur les diffeacuterents environnements montre bien que lecode Unicode drsquoun caractegravere speacutecial (par exemple accentueacute) nrsquoest pas le mecircme drsquounenvironnement agrave un autre

Quelle boucle choisir Chacune des trois boucles eacutetudieacutees dans ce chapitre permet de reacutepeacuteter un ensembledrsquoinstructions Cependant les diffeacuterentes proprieacuteteacutes de chacune drsquoentre elles font que leprogrammeur utilisera un type de boucle plutocirct qursquoun autre suivant le problegraveme agravereacutesoudre

Choisir entre une boucle do while et une boucle while

Les boucles do while et while se ressemblent beaucoup dans leur syntaxe et il paraicirctparfois difficile au programmeur deacutebutant de choisir lrsquoune plutocirct que lrsquoautre

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

100

Remarquons cependant que la diffeacuterence essentielle entre ces deux boucles reacuteside dans laposition du test de sortie de boucle Pour la boucle do while la sortie de boucle srsquoeffectueen fin de boucle alors que pour la boucle while la sortie de boucle se situe degraves lrsquoentreacutee dela boucle

De ce fait la boucle do while est plus souple agrave manipuler les instructions qui la composenteacutetant exeacutecuteacutees au moins une fois quoi qursquoil arrive Pour la boucle while il est neacutecessairede veiller agrave lrsquoinitialisation de la variable figurant dans le test drsquoentreacutee de boucle de faccedilon agraveecirctre sucircr drsquoexeacutecuter au moins une fois les instructions composant la boucle

Certains algorithmes demandent agrave ne jamais reacutepeacuteter sous certaines conditions unensemble drsquoinstructions Dans de tels cas la structure while est preacutefeacuterable agrave la structuredo while

Choisir entre la boucle for et while

Les boucles for et while sont eacutequivalentes En effet en examinant les deux boucles dutableau ci-dessous

nous constatons que pour chacune drsquoentre elles la boucle deacutebute avec i = 0 puis tantque i est infeacuterieur ou eacutegal agrave 10 i est increacutementeacute de 1

Malgreacute cette eacutequivalence pour choisir entre une boucle for et une boucle while remar-quons que

bull La boucle for est utiliseacutee quand on connaicirct agrave lrsquoavance le nombre drsquoiteacuterations agrave exeacutecuter

bull La boucle while est employeacutee lorsque le nombre drsquoiteacuterations est laisseacute au choix delrsquoutilisateur du programme ou deacutetermineacute agrave partir du reacutesultat drsquoun calcul reacutealiseacute aucours de la reacutepeacutetition

La boucle for La boucle while

int i

for (i = 0 i lt= 10 i = i+1 )

int i = 0

while (i lt= 10)

i = i+1

ReacutesumeacuteEn langage Java il existe trois types de structures pour reacutealiser des reacutepeacutetitions Ellessont deacutecrites par les instructions dowhile while et for

bull La boucle dowhile (faire tant que) permet drsquoexeacutecuter les instructions situeacuteesdans le bloc deacutefini par des tant que lrsquoexpression conditionnelle placeacutee entre ()est vraie

do plusieurs instructions while (expression)

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

101

Les instructions sont exeacutecuteacutees au moins une fois puisque lrsquoexpression condition-nelle est examineacutee en fin de boucle apregraves exeacutecution des instructions

bull La boucle while (tant que) permet drsquoexeacutecuter les instructions situeacutees dans le blocdeacutefini par tant que lrsquoexpression conditionnelle placeacutee entre () est vraie

while (expression) plusieurs instructions

Lrsquoexpression conditionnelle eacutetant examineacutee en deacutebut de boucle les instructionssitueacutees dans le bloc peuvent ne pas ecirctre exeacutecuteacutees si la condition nrsquoest pas veacuterifieacuteedegraves le deacutebut

bull La boucle for permet drsquoeacutecrire des boucles dont on connaicirct agrave lrsquoavance le nombredrsquoiteacuterations agrave exeacutecuter Elle est eacutequivalente agrave lrsquoinstruction while mais est plussimple agrave eacutecrire

for (initialisation condition increacutement) plusieurs instructions

Les termes Initialisation Condition et Increacutement sont des instructions seacutepa-reacutees obligatoirement par des points-virgules () Ces instructions deacutefinissent unindice qui controcircle le bon deacuteroulement de la boucle Ainsi

ndash Initialisation permet drsquoinitialiser la variable repreacutesentant lrsquoindice de la boucle

ndash Condition deacutefinit la condition agrave veacuterifier pour continuer agrave exeacutecuter la boucle

ndash Increacutement permet drsquoaugmenter ou de diminuer de N la valeur de la variablerepreacutesentant lrsquoindice de la boucle N est appeleacute le pas drsquoincreacutementation

Agrave partir des structures reacutepeacutetitives nous avons eacutegalement abordeacute la notion de comp-tage de valeurs crsquoest-agrave-dire

bull Le comptage drsquoun certain nombre de valeurs (par exemple compter le nombre denotes drsquoun eacutetudiant) Pour cela il suffit drsquoemployer une variable entiegravere initialiseacuteeagrave 0 avant drsquoentamer la boucle La variable augmente de 1 agrave lrsquointeacuterieur de la boucleagrave lrsquoaide de lrsquoinstruction i = i + 1 (en supposant que i soit notre variable comp-teur) On dit alors que la variable i est increacutementeacutee de 1

bull Lrsquoaccumulation de valeurs (par exemple faire la somme des notes drsquoun eacutetudiant)Cette technique est reacutealiseacutee agrave lrsquoaide drsquoune variable entiegravere initialiseacutee agrave 0 avantdrsquoentamer la boucle La variable augmente de la valeur de la variable agrave accumuler(de la valeur de la note par exemple) agrave lrsquointeacuterieur de la boucle Cette augmentationsrsquoeffectue agrave lrsquoaide de lrsquoinstruction s = s + valeur en supposant que s soit notrevariable drsquoaccumulation et valeur la variable repreacutesentant la valeur agrave accumuler

Remarquons pour finir que lrsquoinstruction i++ est lrsquoeacutequivalent simplifieacute de i = i + 1tandis que i-- est lrsquoeacutequivalent simplifieacute de i = i ndash 1

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

102

ExercicesComprendre la boucle dohellipwhile

Afin drsquoexeacutecuter le programme suivant

public class Exercice1 public static void main (String [] argument) int abr Systemoutprintln(Entrer un entier ) a = Lirei() Systemoutprintln(Entrer un entier ) b = Lirei() do r = ab a = b b = r while (r =0 ) Systemoutprintln(Le resultat est + a)

a Examinez le code source (programme) repeacuterez les instructions concerneacutees parla boucle reacutepeacutetitive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie deboucle

c En supposant que lrsquoutilisateur entre les valeurs 30 et 42 exeacutecutez le programmeagrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

d En supposant que lrsquoutilisateur entre les valeurs 35 et 6 exeacutecutez le programme agravela main (pour vous aider construisez le tableau drsquoeacutevolution de chaque variabledeacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

Apprendre agrave compter accumuler et rechercher une valeurEacutecrivez en franccedilais en faisant ressortir la structure reacutepeacutetitive de la marche agrave suivrele programme reacutesolvant les quatre points suivants

a Lire un nombre quelconque de valeurs entiegraveres non nulles La saisie des valeursse termine lorsqursquoon entre la valeur 0

b Afficher la plus grande des valeurs

c Afficher la plus petite des valeurs

d Calculer et afficher la moyenne de toutes les valeurs

41

42

copy copyright Eacuteditions Eyrolles

Faire des reacutepeacutetitionsCHAPITRE 4

103

Traduisez la marche agrave suivre preacuteceacutedente en un programme Java Utilisez pour celaune boucle dohellipwhile Pour trouver la plus grande ou la plus petite valeur vouspouvez vous aider de lrsquoexemple laquo Rechercher le plus grand de deux eacuteleacutements raquodeacutecrit au cours du chapitre 3 laquo Faire des choix raquo

Comprendre la boucle while traduire une marche agrave suivre en programme Java

Eacutecrivez un programme Devinette qui tire un nombre au hasard entre 0 et 10 etdemande agrave lrsquoutilisateur de trouver ce nombre Pour ce faire la meacutethode est lasuivante

a Tirer au hasard un nombre entre 0 et 10

b Lire un nombre

c Tant que le nombre lu est diffeacuterent du nombre tireacute au hasard

ndash Lire un nombre

ndash Compter le nombre de boucle

d Afficher un message de reacuteussite ainsi que le nombre de boucles

Reprenez chaque point eacutenonceacute ci-dessus et traduisez-le en langage Java Notezque pour tirer un nombre au hasard entre 0 et 10 lrsquoinstruction srsquoeacutecrit

i = (int) (10Mathrandom())

ougrave i est une variable entiegravere qui reccediloit la valeur tireacutee au hasard

Deacuteclarez toutes les variables utiliseacutees dans votre programme en veillant agrave ceqursquoelles soient bien initialiseacutees

Lorsque le programme Devinette fonctionne bien modifiez-le de faccedilon que

a Les valeurs tireacutees au hasard soient comprises entre 0 et 50

b Un message drsquoerreur srsquoaffiche si la reacuteponse est mauvaise

c Le programme indique si la valeur saisie au clavier est plus grande ou plus petiteque la valeur tireacutee au hasard

d Agrave titre de reacuteflexion comment faut-il srsquoy prendre pour trouver la valeur endonnant le moins de reacuteponses possibles

Comprendre la boucle forAfin drsquoexeacutecuter le programme suivant

public class Exercice8 public static void main (String [] parametre) long i b = 1 int a Systemoutprintln(Entrer un entier ) a = Lirei()

43

44

45

46

47

48

copy copyright Eacuteditions Eyrolles

Les outils et techniques de basePARTIE 1

104

for (i = 2 i lt= a i++) b = b i Systemoutprintln(Le resultat vaut + b)

a Examinez le programme repeacuterez les instructions concerneacutees par la boucle reacutepeacute-titive et deacuteterminez les instructions de deacutebut et fin de boucle

b Quelle est la valeur initiale de i et quelle est sa valeur en sortie de boucle Combien de boucles sont reacutealiseacutees

c Quelle est lrsquoinstruction qui permet de modifier le reacutesultat du test de sortie de boucle

d En supposant que lrsquoutilisateur entre la valeur 6 exeacutecutez le programme agrave la main(pour vous aider construisez le tableau drsquoeacutevolution de chaque variable deacuteclareacutee)

e Quel est le calcul reacutealiseacute par ce programme

En utilisant une boucle for eacutecrivez un programme qui affiche lrsquoalphabet drsquoabordagrave lrsquoendroit puis agrave lrsquoenvers apregraves un passage agrave la ligne

Le projet laquo Gestion drsquoun compte bancaire raquoRendre le menu interactifUne fois lrsquoaffichage du menu reacutealiseacute agrave partir de lrsquoeacutenonceacute donneacute agrave la fin du chapitre 3laquo Faire des choix raquo le programme exeacutecuteacute donne agrave choisir parmi les cinq optionssuivantes

1 Creacuteation drsquoun compte2 Affichage drsquoun compte3 Creacuteer une ligne comptable4 Sortir5 De lrsquoaide

Votre choix

Si lrsquoutilisateur choisit lrsquooption 1 le programme lui demande de saisir les donneacuteesneacutecessaires agrave la creacuteation du compte (type numeacutero valeur initiale etc) Une fois lesdonneacutees saisies le programme srsquoarrecircte Il nrsquoest pas possible de choisir par exemplelrsquooption 2 pour afficher les valeurs saisies agrave lrsquoeacutetape preacuteceacutedente

Pour remeacutedier agrave cette situation il est neacutecessaire de placer les instructions concerneacutees agravelrsquointeacuterieur drsquoune boucle de faccedilon agrave voir reacuteapparaicirctre le menu une fois lrsquooption reacutealiseacuteePour cela vous devez

a Eacutecrire en franccedilais la structure reacutepeacutetitive afin de deacuteterminer la condition de sortie deboucle

b Choisir la structure reacutepeacutetitive parmi les trois proposeacutees par le langage Java

c Traduire la marche agrave suivre en programme Java en prenant soin drsquoinitialiser la varia-ble de controcircle de la boucle et en inseacuterant agrave lrsquointeacuterieur de la boucle toutes lesinstructions neacutecessaires agrave lrsquoaffichage du menu

49

copy copyright Eacuteditions Eyrolles

PARTIE 2

Initiation agrave la programmation orienteacutee objet

CHAPITRE 5

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions 107

CHAPITRE 6

Fonctions notions avanceacutees 129

CHAPITRE 7

Les classes et les objets 149

CHAPITRE 8

Les principes du concept drsquoobjet 175

copy copyright Eacuteditions Eyrolles

5De lrsquoalgorithme parameacutetreacute

agrave lrsquoeacutecriture de fonctions

Lrsquoeacutetude des chapitres preacuteceacutedents montre qursquoun programme informatique est constitueacutedrsquoinstructions eacuteleacutementaires (affectation comparaison ou encore reacutepeacutetition) et de sous-programmes (calcul de la racine carreacutee affichage de donneacutees) appeleacutes fonctions ouencore meacutethodes

Ces instructions sont de nature suffisamment geacuteneacuterale pour srsquoadapter agrave nrsquoimporte quelproblegraveme En les utilisant agrave bon escient il est possible drsquoeacutecrire des programmes informa-tiques simples mais drsquoune grande utiliteacute

Dans le cadre du deacuteveloppement de logiciels de grande envergure les programmeurssouhaitent aussi deacutefinir leurs propres instructions adapteacutees au problegraveme qursquoils traitentPour cela les langages de programmation offrent la possibiliteacute de creacuteer des fonctionsspeacutecifiques diffeacuterentes des fonctions preacutedeacutefinies par le langage

Pour comprendre lrsquointeacuterecirct des fonctions nous analysons drsquoabord le concept drsquoalgorithmeparameacutetreacute agrave partir drsquoun exemple imageacute

Ensuite nous eacutetudions la bibliothegraveque de fonctions matheacutematiques deacutefinie dans lelangage Java (section laquo Des fonctions Java preacutedeacutefinies raquo) Cette eacutetude montre les prin-cipes drsquoutilisation de ces fonctions et explique comment eacutelaborer et construire vos fonc-tions (section laquo Construire ses propres fonctions raquo)

Pour finir nous examinons comment la construction et lrsquoutilisation de fonctions fonteacutevoluer la structure geacuteneacuterale drsquoun programme (section laquo Les fonctions au sein drsquounprogramme Java raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

108

Algorithme parameacutetreacuteCertains algorithmes peuvent ecirctre appliqueacutes agrave des problegravemes voisins en modifiantsimplement les donneacutees pour lesquels ils ont eacuteteacute construits En faisant varier certainesvaleurs le programme fournit un reacutesultat diffeacuterent du preacuteceacutedent Ces valeurs caracteacuteris-tiques du problegraveme agrave traiter sont appeleacutees paramegravetres du programme

Pour comprendre concregravetement ce concept nous allons reprendre lrsquoalgorithme du cafeacute chaudpour le transformer en un algorithme qui nous permettra de faire du theacute ou du cafeacute chaud

Faire un theacute chaud ou comment remplacer le cafeacute par du theacuteFaire un cafeacute chaud ou faire un theacute chaud est une opeacuteration agrave peu pregraves semblable Enreprenant la liste de toutes les opeacuterations neacutecessaires agrave la reacutealisation drsquoun cafeacute chaudnous remarquons qursquoen remplaccedilant simplement le mot cafeacute par le mot theacute nous obtenonsdu theacute chaud

Cette recette nrsquoest certes pas traditionnelle mais elle a le meacuterite drsquoecirctre peacutedagogiquementsimple Pour faire du cafeacute ou du theacute il suffit drsquoemployer la mecircme recette ou meacutethode enprenant comme ingreacutedient du cafeacute ou du theacute selon notre choix

Dans le monde reacuteel le fait de remplacer un ingreacutedient par un autre ne pose pas de diffi-culteacutes particuliegraveres Dans le monde informatique crsquoest plus complexe En effet lrsquoordina-teur ne fait qursquoexeacutecuter la marche agrave suivre fournie par le programmeur Dans notre caspour avoir du cafeacute ou du theacute le programmeur doit eacutecrire la marche agrave suivre pour chacunedes boissons La tacircche est fastidieuse puisque chacun des programmes se ressembletout en eacutetant diffeacuterent sur un deacutetail (cafeacute ou theacute)

Deacutefinir les paramegravetres

Pour eacuteviter drsquoavoir agrave recopier chaque fois des marches agrave suivre qui ne diffegraverent quesur un deacutetail lrsquoideacutee est de construire un algorithme geacuteneacuteral Cet algorithme ne varie

Instructions Bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre du theacute3 Prendre un filtre4 Verser le theacute dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que le theacute soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser le theacute dans la tasse

Preacuteparer le theacute

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

109

qursquoen fonction drsquoingreacutedients deacutetermineacutes qui font que le programme donne un reacutesultatdiffeacuterent

En geacuteneacuteralisant lrsquoalgorithme du theacute ou du cafeacute chaud on exprime une marche agrave suivrepermettant de reacutealiser une boisson chaude Pour obtenir un reacutesultat diffeacuterent (cafeacute ou theacute)il suffit de deacutefinir comme paramegravetre de lrsquoalgorithme lrsquoingreacutedient cafeacute ou theacute agrave choisir

La marche agrave suivre srsquoeacutecrit en remplaccedilant les mots cafeacute ou theacute par le mot ingreacutedient

Faire du cafeacute eacutequivaut donc agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (ingreacutedient) enutilisant comme ingreacutedient du cafeacute Lrsquoexeacutecution du bloc Preacuteparer (le cafeacute) a pour conseacute-quence de reacutealiser les instructions 2 4 9 et 13 du bloc drsquoinstructions avec comme ingreacute-dient du cafeacute Lrsquoinstruction 2 par exemple srsquoexeacutecute en remplaccedilant le terme ingreacutedientpar le cafeacute Au lieu de lire prendre ingreacutedient il faut lire prendre le cafeacute

De la mecircme faccedilon faire du theacute revient agrave exeacutecuter le bloc drsquoinstructions Preacuteparer (letheacute) Le paramegravetre ingreacutedient correspond ici au theacute et les instructions 2 4 9 et 13 sontexeacutecuteacutees en conseacutequence

Suivant la valeur prise par le paramegravetre ingreacutedient lrsquoexeacutecution de cet algorithmefournit un reacutesultat diffeacuterent Ce peut ecirctre du cafeacute ou du theacute

Donner un nom au bloc drsquoinstructions

Nous constatons qursquoen parameacutetrant un algorithme nous nrsquoavons plus besoin de recopierplusieurs fois les instructions qui le composent pour obtenir un reacutesultat diffeacuterent

En donnant un nom au bloc drsquoinstructions correspondant agrave lrsquoalgorithme geacuteneacuteral Preacuteparer()nous deacutefinissons un sous-programme capable drsquoecirctre exeacutecuteacute autant de fois que neacuteces-saire Il suffit pour cela drsquoappeler le sous-programme par son nom

De plus gracircce au paramegravetre placeacute entre les parenthegraveses qui suivent le nom du sous-programme la fonction srsquoexeacutecute avec des valeurs diffeacuterentes modifiant de ce fait lereacutesultat

Instructions Nom du bloc drsquoinstructions

0 Prendre une cafetiegravere1 Poser la cafetiegravere sur la table2 Prendre ingreacutedient3 Prendre un filtre4 Verser ingreacutedient dans le filtre5 Prendre de lrsquoeau6 Verser lrsquoeau dans la cafetiegravere7 Brancher la cafetiegravere8 Allumer la cafetiegravere9 Attendre que ingreacutedient soit precirct10 Prendre une tasse11 Poser la tasse sur la table12 eacuteteindre la cafetiegravere13 Verser ingreacutedient dans la tasse

Preacuteparer (ingreacutedient)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

110

Un algorithme parameacutetreacute est deacutefini par

bull un nom

bull un ou plusieurs paramegravetres

En fin drsquoexeacutecution il fournit

bull un reacutesultat qui diffegravere suivant la valeur du ou des paramegravetres

Dans le langage Java les algorithmes parameacutetreacutes srsquoappellent des fonctions ou encore desmeacutethodes Gracircce agrave elles il est possible de traduire un algorithme parameacutetreacute enprogramme informatique Avant drsquoexaminer comment eacutecrire ces algorithmes en langageJava nous allons tout drsquoabord eacutetudier les fonctions preacutedeacutefinies du langage Java de faccedilonagrave mieux comprendre comment elles srsquoutilisent

Des fonctions Java preacutedeacutefiniesUn grand nombre de programmes informatiques font appel agrave des calculs matheacutematiquessimples tels que le calcul drsquoun sinus ou drsquoune racine carreacutee Pour trouver la valeur drsquoun sinuspar exemple le programmeur nrsquoa pas fort heureusement agrave reacuteeacutecrire pour chaque programmelrsquoalgorithme matheacutematique du calcul drsquoun sinus Les fonctions matheacutematiques sont deacutejagraveprogrammeacutees

Le langage Java propose un ensemble de fonctions preacutedeacutefinies matheacutematiques ou autrestregraves utiles comme nous le verrons au cours des chapitres suivants Notre objectif nrsquoestpas de deacutecrire lrsquointeacutegraliteacute des fonctions disponibles car ce seul manuel nrsquoy suffirait pasNous souhaitons faire comprendre la manipulation de ces fonctions Pour ce faire nousallons eacutetudier une partie de la librairie matheacutematique de Java appeleacutee Math et deacuteter-miner ensuite les principes geacuteneacuteraux drsquoutilisation des fonctions

La librairie Math

La librairie matheacutematique du langage Java est composeacutee drsquoun ensemble de fonctionspreacutedeacutefinies qui permettent de calculer toutes sortes drsquoeacutequations matheacutematiques Parmices fonctions se trouvent les fonctions trigonomeacutetriques (sinus cosinus tangente etc)logarithmiques drsquoarrondis de calcul de puissances ou de racines carreacutees

Ces fonctions sont regroupeacutees dans la bibliothegraveque de programmes Math Le nom dechaque fonction deacutebute toujours par le terme Math suivi drsquoun point puis du nom de lafonction Ce nom commence toujours par une minuscule Voici une liste partielle desfonctions qui composent la librairie Math

Fonctions trigonomeacutetriques

Opeacuteration matheacutematique Fonction Java

Calculer le cosinus drsquoun angle (radian) Mathcos()

Calculer le sinus drsquoun angle (radian) Mathsin()

Calculer la tangente drsquoun angle (radian) Mathtan()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

111

Fonctions logarithmiques

Calcul drsquoarrondis

Autres calculs matheacutematiques

Divers

Exemples drsquoutilisationCes fonctions srsquoutilisent en placcedilant dans le programme Java le nom drsquoappel de la fonctionVoici en exemple un programme qui utilise lrsquoensemble des fonctions deacutecrites ci-dessus

Exemple code source complet

public class FonctionMateacutematique public static void main(String [] argument) double reacutesulat a b Systemoutprint(Entrez une premiere valeur ) a = Lired() Systemoutprint(Entrez une seconde valeur ) b = Lired()

Opeacuteration matheacutematique Fonction Java

Calculer le logarithme drsquoune valeur Mathlog()

Calculer lrsquoexponentielle drsquoun nombre Mathexp()

Opeacuteration Fonction Java

Arrondir agrave lrsquoentier infeacuterieur Mathfloor()

Arrondir agrave lrsquoentier supeacuterieur Mathceil()

Opeacuteration matheacutematique Fonction Java

Calculer la racine carreacutee drsquoun nombre Mathsqrt()

ab (a puissance b) Mathpow()

|a| (valeur absolue de a) Mathabs()

Opeacuteration Fonction Java

Trouver la plus grande de deux valeurs Mathmax()

Trouver la plus petite de deux valeurs Mathmin()

Tirer un nombre au hasard entre 0 et 1 Mathrandom()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

112

reacutesultat = Mathcos(a) Systemoutprintln(Cos( + a + ) = + reacutesultat) reacutesultat = Mathsin(a) Systemoutprintln(Sin( + a + ) = + reacutesultat) reacutesultat = Mathtan(a) Systemoutprintln(Tan( + a + ) = + reacutesultat) reacutesultat = Mathlog(a) Systemoutprintln(Log( + a + ) = + reacutesultat) reacutesultat = Mathexp(a) Systemoutprintln(Exp( + a + ) = + reacutesultat) reacutesultat = Mathfloor(a) Systemoutprintln(Floor( + a + ) = + reacutesultat) reacutesultat = Mathceil(a) Systemoutprintln(Ceil( + a + ) = + reacutesultat) reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat) reacutesultat = Mathpow(ab) Systemoutprintln(Pow( + a + + b +) = + reacutesultat) reacutesultat = Mathabs(a) Systemoutprintln(Abs( + a + ) = + reacutesultat) reacutesultat = Mathmax(ab) Systemoutprintln(Max( + a + + b + ) = + reacutesultat) reacutesultat = Mathmin(ab) Systemoutprintln(Min( + a + + b + ) = + reacutesultat) reacutesultat = Mathrandom() Systemoutprintln(Random() = + reacutesultat)

Une fois les instructions de ce programme compileacutees lrsquointerpreacuteteur Java les exeacutecute uneagrave une Le reacutesultat est le suivant

Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Entrez une premiere valeur 0011Entrez une seconde valeur 22Cos(01) = 09950041652780257Sin(01) = 009983341664682815Tan(01) = 010033467208545055Log(01) = -23025850929940455Exp(01) = 11051709180756477Floor(01) = 00Ceil(01) = 10Sqrt(01) = 0316227766011683794Pow(01 20) = 001Abs(01) = 01Max(01 20) = 20Min(01 20)= 01Random() = 06993848420032578

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

113

Principes de fonctionnementLrsquoeacutetude de ce programme met en eacutevidence plusieurs aspects importants concernantlrsquoutilisation des fonctions et leur mode de fonctionnement

Le nom des fonctions

bull Le nom de chaque fonction est deacutefini par le langage Java Pour connaicirctre le nom desdiffeacuterentes fonctions proposeacutees par le Java il est neacutecessaire de consulter lrsquoaide enligne du compilateur ou le site Internet de Sun (voir le CD-Rom livreacute avec cetouvrage) ou encore des livres plus speacutecifiques sur le langage Java et les bases dedonneacutees ou les reacuteseaux

bull Remarquons que lrsquoexeacutecution drsquoune fonction passe par lrsquoeacutecriture dans une instructiondu nom de la fonction choisie suivi de paramegravetres eacuteventuels placeacutes entre parenthegraveses

Meacutemoriser le reacutesultat drsquoune fonction

bull Pour meacutemoriser le reacutesultat du calcul la fonction est placeacutee dans une instructiondrsquoaffectation La fonction situeacutee agrave droite du signe = est exeacutecuteacutee en premier Apregravesquoi la variable situeacutee agrave gauche du signe = reacutecupegravere la valeur calculeacutee lors de lrsquoexeacutecu-tion de la fonction

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo Rocircle et meacuteca-nisme de lrsquoaffectation raquo

bull Dans notre exemple toutes les fonctions de la bibliothegraveque Math fournissent enreacutesultat une valeur numeacuterique de type double En conseacutequence la variable reacutesultatqui reacutecupegravere le reacutesultat de chaque fonction est deacuteclareacutee de type double

Les paramegravetres drsquoune fonction

Les fonctions possegravedent zeacutero un voire deux paramegravetres Ainsi

bull La fonction Mathrandom() ne possegravede pas de paramegravetre Cette fonction donne enreacutesultat une valeur au hasard comprise entre 00 et 10 indeacutependamment de toutecondition Aucun paramegravetre nrsquoest donc neacutecessaire agrave sa bonne marche

Remarquons que mecircme si la fonction nrsquoa pas de paramegravetre il reste neacutecessaire deplacer des parenthegraveses ouvrante puis fermante derriegravere le nom drsquoappel de la fonctionSi aucune parenthegravese nrsquoest placeacutee le compilateur ne considegravere pas le termeMathrandom comme une fonction mais comme un nom de variable

Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante puisfermante

bull La fonction Mathsqrt()ne comporte qursquoun seul paramegravetre puisqursquoelle calcule laracine carreacutee drsquoun seul nombre agrave la fois Il est possible de placer entre parenthegraveses uneexpression matheacutematique plutocirct qursquoun paramegravetre Ainsi lrsquoexpression Mathsqrt(bb ndash 4ac) permet le calcul de la racine carreacutee du discriminant drsquoune eacutequation dusecond degreacute

Observons que le paramegravetre placeacute entre parenthegraveses dans la fonction Mathsqrt() estde type double De cette faccedilon il est possible de calculer la racine carreacutee de tout type

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

114

de valeur numeacuterique les types byte short int ou long se transformant sans difficulteacuteen type double

Pour plus drsquoinformations voir au chapitre 1 laquo Stocker une information raquo la section laquo La transfor-mation de types raquo

Il nrsquoest pas permis de placer en paramegravetre un caractegravere une suite de caractegraveres ou unbooleacuteen Par exemple le fait drsquoeacutecrire Mathsqrt(Quatre) entraicircne une erreur encours de compilation lrsquoordinateur ne sachant pas transformer le mot laquo Quatre raquo en lavaleur numeacuterique 4 (message drsquoerreur Incompatible type for method Canrsquotconvert javalangString to double)

Dans lrsquoappel de la fonction le type des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir une erreur de compilation

bull La fonction Mathpow(ab) possegravede deux paramegravetres pour calculer ab (a agrave la puissanceb) Ces paramegravetres sont seacutepareacutes par une virgule Si les valeurs a et b sont inverseacuteesdans lrsquoappel de la fonction (Mathpow(ba)) le calcul effectueacute a pour reacutesultat ba (b agravela puissance a)

Dans lrsquoappel de la fonction lrsquoordre des paramegravetres doit ecirctre respecteacute sous peinedrsquoobtenir un reacutesultat diffeacuterent de celui attendu

Les fonctions eacutetudieacutees dans cette section sont des fonctions preacutedeacutefinies par le langageJava Le programmeur les utilise en connaissant le reacutesultat qursquoil souhaite obtenir Lesprogrammes ainsi eacutecrits sont constitueacutes drsquoinstructions simples et drsquoappels agrave des fonc-tions connues du langage Java

Le langage Java offre aussi au programmeur la possibiliteacute drsquoeacutecrire ses propres fonctionsde faccedilon agrave obtenir diffeacuterents programmes adapteacutes au problegraveme qursquoil doit reacutesoudre Nouseacutetudions cette technique agrave la section qui suit

Construire ses propres fonctionsUne fonction deacuteveloppeacutee par un programmeur srsquoutilise de la mecircme faccedilon qursquoune fonc-tion preacutedeacutefinie Elle srsquoexeacutecute en placcedilant lrsquoinstruction drsquoappel agrave la fonction dans leprogramme Cette eacutetape est deacutecrite agrave la section laquo Appeler une fonction raquo

Pour que lrsquoordinateur puisse lire et exeacutecuter les instructions composant la fonction ilconvient de deacutefinir cette derniegravere crsquoest-agrave-dire drsquoeacutecrire une agrave une les instructions qui lacomposent Plusieurs eacutetapes sont neacutecessaires agrave cette deacutefinition Nous les eacutetudions agrave lasection laquo Deacutefinir une fonction raquo

Pour mieux cerner les difficulteacutes lieacutees agrave ces opeacuterations nous allons prendre comme exemplela creacuteation drsquoune fonction qui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Appeler une fonctionToute fonction possegravede un nom drsquoappel qui permet de lrsquoidentifier Ce nom est choisi defaccedilon agrave repreacutesenter et reacutesumer tout ce qui est reacutealiseacute par son intermeacutediaire Dans notreexemple nous devons calculer le peacuterimegravetre drsquoun cercle Nous appelons donc la fonctionqui reacutealise ce calcul crsquoest-agrave-dire peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

115

Drsquoune maniegravere geacuteneacuterale une fonction repreacutesente une action Crsquoest pourquoi le choixdrsquoun verbe comme nom de fonction permet de mieux symboliser les opeacuterations reacutealiseacuteesIci le terme peacuterimegravetre() nrsquoest pas un verbe mais il faut comprendre par peacuterimegravetre()lrsquoaction de calculer le peacuterimegravetre

Le nom de la fonction peacuterimegravetre() eacutetant deacutefini nous souhaitons calculer le peacuterimegravetredrsquoun cercle dont la valeur du rayon soit saisie au clavier Pour cela observons leprogramme qui calcule la racine carreacutee drsquoun nombre saisi au clavier

double reacutesulat aSystemoutprint(Entrez une valeur )a = Lired()reacutesultat = Mathsqrt(a) Systemoutprintln(Sqrt( + a + ) = + reacutesultat)

Lrsquoinstruction reacutesultat = Mathsqrt(a) calcule la racine carreacutee du nombre a dont lavaleur a eacuteteacute saisie au clavier agrave lrsquoinstruction preacuteceacutedente Elle place ensuite le reacutesultat dece calcul dans la variable reacutesultat

En modifiant le nom drsquoappel de la fonction Mathsqrt() par peacuterimegravetre() nous obte-nons un programme qui appelle la fonction peacuterimegravetre() et qui par conseacutequent calculele peacuterimegravetre drsquoun cercle dont la valeur du rayon a est saisie au clavier La valeur du peacuteri-megravetre est placeacutee dans la variable reacutesultat par lrsquointermeacutediaire du signe drsquoaffectation =

Pour notre exemple le programme drsquoappel agrave la fonction peacuterimegravetre() srsquoeacutecrit

public static void main(String [] parametre) Deacuteclaration des variables double reacutesultat int valeur Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat)

Le programme ainsi eacutecrit permet de calculer le peacuterimegravetre drsquoun cercle de rayon donneacute agravela seule condition de deacutefinir la fonction peacuterimegravetre()dans le programme En effet cettefonction nrsquoest pas preacutedeacutefinie dans le langage Java et il est neacutecessaire de deacutetailler lesinstructions qui la composent

Sans cette deacutefinition lrsquoordinateur nrsquoest pas agrave mecircme de deacuteterminer par lui-mecircme lesinstructions agrave exeacutecuter et le message drsquoerreur Method perimetre(int) not found inclass Cercle apparaicirct en cours de compilation

Deacutefinir une fonction La deacutefinition drsquoune fonction fournit agrave lrsquoordinateur les instructions agrave exeacutecuter lors delrsquoappel de la fonction Cette opeacuteration passe par les eacutetapes suivantes

bull deacuteterminer les instructions composant la fonction

bull associer le nom de la fonction aux instructions copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

116

bull eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction

bull preacuteciser le type de reacutesultat fourni par la fonction

De faccedilon agrave mieux comprendre le rocircle de chacune de ces eacutetapes deacutefinissons la fonctionqui calcule le peacuterimegravetre drsquoun cercle de rayon quelconque

Deacuteterminer les instructions composant la fonctionPour seacutelectionner les instructions utiles au calcul du peacuterimegravetre drsquoun cercle reprenons leprogramme Cercle

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la section laquo Un premier programme enJava raquo

public class Cercle public static void main(String [] argument) Deacuteclaration des variables double r p Afficher le message Valeur du rayon agrave lrsquoeacutecran Systemoutprint(Valeur du rayon ) Lire au clavier une valeur placer cette valeur dans la variable R r= Lired() Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr Afficher le reacutesultat Systemoutprint(Le cercle de rayon + R + a pour perimetre + P)

Nous avons observeacute lors de la mise en œuvre drsquoalgorithmes parameacutetreacutes que la marcheagrave suivre deacutecrivant lrsquoalgorithme devait ecirctre la plus geacuteneacuterale possible (voir la sectionlaquo Deacutefinir les paramegravetres raquo) Crsquoest pourquoi pour notre cas seules les instructions

Deacuteclaration des variables double r p Calculer la circonfeacuterence en utilisant la formule consacreacutee p = 2MathPIr

sont utiliseacutees dans la fonction de calcul du peacuterimegravetre drsquoun cercle Les instructions rela-tives agrave la demande de saisie drsquoune valeur au clavier ne sont pas agrave placer dans la fonctionPour vous en convaincre observez que lrsquoordinateur agrave lrsquoappel de la fonctionMathsqrt() ne demande pas de valeur agrave saisir Il ne fait que calculer la racine carreacuteedrsquoune valeur passeacutee en paramegravetre

Les instructions ainsi choisies sont placeacutees dans ce que lrsquoon appelle dans le jargon infor-matique le corps de la fonction et ce de la faccedilon suivante

Deacutefinition du corps de la fonction deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

117

Le corps de la fonction est deacutetermineacute par les accolades et Les instructions qui lecomposent sont ici des deacuteclarations de variables et des instructions drsquoaffectation Dansdrsquoautres cas peuvent aussi figurer des instructions de test de reacutepeacutetition etc

Associer le nom aux instructions

Une fois eacutecrit le corps de la fonction il est neacutecessaire de lrsquoassocier au nom drsquoappel de lafonction

Le nom drsquoune fonction est lieacute au bloc drsquoinstructions qui la compose gracircce agrave un en-tecirctede fonction Ce dernier a pour forme

public static type nomdelafonction (paramegravetres)

Lrsquoen-tecircte drsquoune fonction permet de preacuteciser

bull Le nom de la fonction (pour notre exemple le nomdelafonction est peacuterimegravetre)

bull Les paramegravetres eacuteventuels de la fonction

bull Le type de reacutesultat fourni par la fonction

Les mots-cleacutes public static sont agrave placer pour lrsquoinstant obligatoirement devant le typede reacutesultat de la fonction

Nous expliquons la preacutesence de ces termes agrave la section laquo Collectionner un nombre fixe drsquoobjets raquodu chapitre 9 laquo La ligne de commande raquo car ils sont lieacutes aux concepts de la programmation objet

Lrsquoen-tecircte drsquoune fonction se place comme son nom lrsquoindique au-dessus du corps de lafonction Pour notre exemple il se place de la faccedilon suivante

En-tecircte de la fonctionpublic static type peacuterimegravetre (paramegravetres) deacutebut de la fonction double p r p = 2 MathPI r fin de la fonction

De cette faccedilon le corps de la fonction est associeacute au nom peacuterimegravetre() Agrave lrsquoappel du nomde la fonction peacuterimegravetre() lrsquoordinateur exeacutecute les instructions placeacutees dans le corpsde la fonction

Eacutetablir les paramegravetres utiles

Comme nous venons de le voir le peacuterimegravetre du cercle est calculeacute agrave partir du rayon dontla valeur est saisie avant lrsquoappel de la fonction La valeur du rayon est placeacutee en para-megravetre de la fonction comme lors du calcul de la racine carreacutee drsquoun nombre

Le rayon du cercle est consideacutereacute comme le paramegravetre de la fonction peacuterimegravetre() etlrsquoen-tecircte de la fonction srsquoeacutecrit comme suit

public static type peacuterimegravetre (int r)

Comme la variable r est deacuteclareacutee agrave lrsquointeacuterieur des parenthegraveses de la fonction peacuteri-megravetre() elle est consideacutereacutee par le compilateur Java comme eacutetant le paramegravetre de lafonction peacuterimegravetre()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

118

Lrsquoinstruction de deacuteclaration situeacutee dans le corps de la fonction doit ecirctre ainsi modifieacutee

double p

La variable r est deacuteclareacutee dans lrsquoen-tecircte de la fonction et elle ne peut donc ecirctre deacuteclareacuteeune deuxiegraveme fois agrave lrsquointeacuterieur de la fonction sous peine de provoquer une erreur decompilation (message drsquoerreur variable rsquorrsquo is already defined in this method)

Le paramegravetre r est aussi appeleacute paramegravetre formel Il prend la forme (la valeur) de lavariable donneacutee au moment de lrsquoappel de la fonction Pour bien comprendre cela rappe-lons-nous de lrsquoalgorithme du cafeacute ou du theacute chaud dans lequel nous avons utiliseacute unevariable ingreacutedient prenant la forme de cafeacute ou de theacute suivant ce que lrsquoon souhaitaitobtenir Ici r prend la valeur de la variable valeur lors de lrsquoappel de la fonctionreacutesultat = peacuterimegravetre(valeur) depuis la fonction main()

Remarquons aussi que le paramegravetre valeur fourni lors de lrsquoappel de la fonction peacuteri-megravetre () est appeleacute paramegravetre reacuteel ou encore paramegravetre effectif Crsquoest la valeur de ceparamegravetre qui est transmise au paramegravetre formel lors de lrsquoappel de la fonction

Preacuteciser le type de reacutesultat fourni

Une fois le peacuterimegravetre calculeacute gracircce agrave lrsquoinstruction

p = 2 MathPI r

la valeur contenue dans la variable p doit ecirctre transmise et placeacutee dans la variablereacutesultat deacuteclareacutee dans le programme deacutecrit agrave la section laquo Appeler une fonction raquo de cechapitre Pour ce faire les deux opeacuterations suivantes sont agrave reacutealiser

bull Placer une instruction return suivie de la variable contenant le reacutesultat en fin de fonc-tion Pour notre cas

return p

Agrave la lecture de cette instruction le programme sort de la fonction peacuterimegravetre() ettransmet la valeur contenue dans la variable p au programme qui a appeleacute la fonctionpeacuterimegravetre()

bull Speacutecifier le type de la valeur retourneacutee dans lrsquoen-tecircte de la fonction Pour notreexemple la valeur retourneacutee est contenue dans la variable p de type double Crsquoestpourquoi lrsquoen-tecircte de la fonction srsquoeacutecrit

public static double peacuterimegravetre (int r)

De cette faccedilon le compilateur sait agrave la seule lecture de lrsquoen-tecircte que la fonctiontransmet un reacutesultat de type double

La fonction peacuterimegravetre() srsquoeacutecrit en reacutesumeacute de la faccedilon suivante

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

119

Dans notre exemple la fonction peacuterimegravetre() utilise un seul paramegravetre et retourne unreacutesultat numeacuterique Dans drsquoautres situations le nombre de paramegravetres peut varier et lesfonctions peuvent avoir soit aucun soit plusieurs paramegravetres De la mecircme faccedilon unefonction peut ne pas retourner de reacutesultat

Les fonctions au sein drsquoun programme JavaAvec les fonctions nous voyons apparaicirctre la notion de fonctions appeleacutees et deprogrammes appelant des fonctions

Dans notre exemple la fonction peacuterimegravetre() est appeleacutee par la fonction main() Cettederniegravere est consideacutereacutee par lrsquoordinateur comme eacutetant le programme principal (le termeanglais main se traduit par principal) En effet la fonction main() est la premiegravere fonc-tion exeacutecuteacutee par lrsquoordinateur au lancement drsquoun programme Java

Toute fonction peut appeler ou ecirctre appeleacutee par une autre fonction Ainsi rien nrsquointerditque la fonction peacuterimegravetre()soit appeleacutee par une autre fonction que la fonction main()

Seule la fonction main() ne peut pas ecirctre appeleacutee par une autre fonction du programmeEn effet la fonction main() nrsquoest exeacutecuteacutee qursquoune seule fois et uniquement par lrsquointer-preacuteteur Java lors du lancement du programme

Comment placer plusieurs fonctions dans un programmeLes fonctions sont des programmes distincts les uns des autres Elles sont en outre deacutefi-nies seacutepareacutement les unes des autres Pour exeacutecuter un programme constitueacute de plusieursfonctions il est neacutecessaire pour lrsquoinstant de les regrouper dans un mecircme fichier unemecircme classe

Voir au chapitre 7 laquo Les classes et les objets raquo la section laquo Compilation et exeacutecution drsquoune appli-cation multifichier raquo

Pour des raisons peacutedagogiques les fonctions main() et peacuterimegravetre() ont eacuteteacute preacutesenteacuteesseacutepareacutement En reacutealiteacute ces deux fonctions sont placeacutees agrave lrsquointeacuterieur de la mecircme classeCercle (deacutefinie notamment au chapitre introductif laquo Naissance drsquoun programme raquo)

Le programme prend la forme suivante

public class Cercle Le fichier srsquoappelle Cerclejavapublic static void main(String [] parametre) Deacuteclaration des variables int valeur double reacutesultat Systemoutprint(Valeur du rayon ) valeur = Lirei() reacutesultat = peacuterimegravetre (valeur) Systemoutprint(rayon = + valeur + perimetre = + reacutesultat) fin de main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

120

public static double peacuterimegravetre (int r) double p p = 2 MathPI r return p fin de peacuterimegravetre() fin de class Cercle

En examinant la structure geacuteneacuterale de ce programme nous remarquons qursquoil existe deuxblocs drsquoinstructions seacutepareacutes nommeacutes main() et peacuterimegravetre() Ces deux blocs sont placeacutesagrave lrsquointeacuterieur drsquoun bloc repreacutesentant la classe Cercle comme illustreacute agrave la Figure 5-1

Nous observons que la structure de la fonction peacuterimegravetre() est tregraves voisine de celle dela fonction main() Elle est constitueacutee drsquoun en-tecircte suivi drsquoun corps formeacute drsquoun blocdeacutefini par des accolades ouvrante et fermante

Notons pour finir que la fonction main() est ici placeacutee avant la fonction peacuterimegravetre()mais qursquoil est aussi permis de lrsquoeacutecrire apregraves Lrsquoordre drsquoapparition des fonctions dans uneclasse importe peu et est laisseacute au choix du programmeur

Les diffeacuterentes formes drsquoune fonctionNous lrsquoavons deacutejagrave observeacute (voir la section laquo Principes de fonctionnement raquo de cechapitre) les fonctions peuvent posseacuteder zeacutero un voire plusieurs paramegravetres de diffeacute-rents types De la mecircme faccedilon elles peuvent fournir ou non un reacutesultat Suivant les casleur deacutefinition varie leacutegegraverement

Fonction avec reacutesultat

Comme nous lrsquoavons observeacute lors de la deacutefinition de la fonction peacuterimegravetre() toutefonction fournissant un reacutesultat possegravede un return placeacute dans le corps de la fonction

Figure 5ndash1

Les fonctions main() et peacuterimegravetre() agrave lrsquointeacuterieur de la classe Cercle

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

121

De plus lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond au typedu reacutesultat retourneacute

Si une fonction retourne en reacutesultat une variable de type int son en-tecircte srsquoeacutecrit publicstatic int nomdelafonction()

Remarquons qursquoune fonction ne retourne qursquoune et une seule valeur Il nrsquoest donc paspossible drsquoeacutecrire lrsquoinstruction return sous la forme return ab pour retourner deuxvaleurs au programme appelant Dans un tel cas le compilateur deacutetecte une erreur dutype laquo rsquorsquo expected raquo

Lorsqursquoune fonction fournit plusieurs reacutesultats la transmission des valeurs ne peut sereacutealiser par lrsquointermeacutediaire de lrsquoinstruction return Il est neacutecessaire dans ce casdrsquoemployer des techniques plus avanceacutees (voir le chapitre 7 laquo Les classes et lesobjets raquo)

Fonction sans reacutesultat

Une fonction peut ne pas fournir de reacutesultat Tel est en geacuteneacuteral le cas des fonctions utili-seacutees pour lrsquoaffichage de messages Par exemple la fonction menu() suivante ne fournitpas de reacutesultat et ne fait qursquoexeacutecuter les opeacuterations selon la valeur du paramegravetre choix

public static void menu (int choix) switch (choix) case 1 Saisie drsquoune personne break case 2 Afficher une personne break fin de menu()

Lrsquoen-tecircte public static void menu (int choix) mentionne que la fonction menu()neretourne pas de reacutesultat gracircce au mot-cleacute void placeacute devant le nom de la fonction

Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void et lrsquoinstructionreturn ne figure pas dans le corps de la fonction

Fonction agrave plusieurs paramegravetres

Prenons pour exemple une fonction max() qui fournit en reacutesultat la plus grande des deuxvaleurs donneacutees en paramegravetres

public class Maximum Le fichier srsquoappelle Maximumjava public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

122

Systemoutprint(Entrer une valeur ) v2 = Lirei() sup = max (v1v2) Systemoutprint(Le max de + v1 + et de + v2 + est + sup) fin de main()

public static int max (int a int b) int m = a if (b gt m) m = b return m fin de max() fin de class Maximum

La fonction max()possegravede un en-tecircte

public static int max (int a int b)

qui mentionne deux paramegravetres a et b de type entier Nous observons que

bull Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes par unevirgule Lrsquoen-tecircte drsquoune fonction peut alors prendre la forme suivante

public static int quelconque (int a char c double t)

bull Devant chaque paramegravetre est placeacute son type mecircme si deux paramegravetres conseacutecutifs sontde type identique Ainsi eacutecrire lrsquoen-tecircte de la fonction max() de la faccedilon suivante

public static int max (int a b)

nrsquoest pas possible et provoque une erreur de compilation de type Identifierexpected

Fonction sans paramegravetre

Une fonction peut ne pas avoir de paramegravetre Son en-tecircte ne possegravede alors aucun para-megravetre entre parenthegraveses

Ainsi la fonction sortie() suivante permet de sortir proprement de nrsquoimporte quelprogramme

public static void sortie () Systemoutprint(Au revoir et a bientot) Fonction Java qui permet de sortir proprement drsquoun programme Systemexit(0)

ReacutesumeacuteUn algorithme parameacutetreacute est une marche agrave suivre qui fournit un reacutesultat pouvantdiffeacuterer suivant la valeur du ou des paramegravetres Dans le langage Java les algorithmesparameacutetreacutes srsquoappellent des fonctions ou encore des meacutethodes

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

123

Le langage Java propose un ensemble de fonctions preacutedeacutefinies fort utiles Parmi ces fonc-tions se trouvent les fonctions matheacutematiques telles que Mathsqrt() pour calculer laracine carreacutee du nombre placeacute entre parenthegraveses ou Mathlog() pour le logarithme

Lrsquoeacutetude des fonctions matheacutematiques montre que

bull Pour exeacutecuter une fonction il est neacutecessaire drsquoeacutecrire dans une instruction le nomde la fonction choisie suivi des paramegravetres eacuteventuels placeacutes entre parenthegraveses

bull Toute fonction possegravede dans son nom drsquoappel des parenthegraveses ouvrante etfermante

bull Le type et lrsquoordre des paramegravetres dans lrsquoappel de la fonction doivent ecirctrerespecteacutes sous peine drsquoobtenir une erreur de compilation ou drsquoexeacutecution

Le langage Java offre en outre au programmeur la possibiliteacute drsquoeacutecrire ses propresfonctions de faccedilon agrave obtenir des programmes bien adapteacutes au problegraveme qursquoil doitreacutesoudre La deacutefinition drsquoune fonction passe par plusieurs eacutetapes qui permettent de

bull Preacuteciser les instructions composant la fonction en les placcedilant dans le corps de lafonction Ce dernier est deacutetermineacute par des accolades

bull Associer le nom de la fonction aux instructions agrave lrsquoaide drsquoun en-tecircte qui preacutecise lenom de la fonction le type des paramegravetres (appeleacutes paramegravetres formels) et le typede reacutesultat retourneacute Cet en-tecircte se reacutedige sous la forme suivante

public static type nomdelafonction (paramegravetres)

bull Eacutetablir les paramegravetres utiles agrave lrsquoexeacutecution de la fonction en les deacuteclarant agrave lrsquointeacute-rieur des parenthegraveses placeacutees juste apregraves le nom de la fonction

ndash Lorsqursquoune fonction possegravede plusieurs paramegravetres ceux-ci sont seacutepareacutes parune virgule Devant chaque paramegravetre est placeacute son type mecircme si deux para-megravetres conseacutecutifs sont de type identique

ndash Lorsqursquoune fonction nrsquoa pas de paramegravetre son en-tecircte ne possegravede aucun para-megravetre entre parenthegraveses

bull Preacuteciser le type de reacutesultat fourni par la fonction dans lrsquoen-tecircte de la fonction etplacer lrsquoinstruction return degraves que le reacutesultat doit ecirctre transmis au programmeappelant la fonction

ndash Toute fonction fournissant un reacutesultat possegravede un return placeacute dans le corps dela fonction

ndash Lrsquoen-tecircte de la fonction possegravede obligatoirement un type qui correspond autype de reacutesultat retourneacute Remarquons qursquoune fonction ne retourne qursquoune etune seule valeur

ndash Si une fonction ne retourne pas de reacutesultat son en-tecircte est de type void etlrsquoinstruction return ne figure pas dans le corps de la fonction

Une fonction peut ecirctre appeleacutee (exeacutecuteacutee) depuis une autre fonction ou depuis la fonc-tion main() qui repreacutesente le programme principal Lrsquoappel drsquoune fonction est reacutealiseacuteen eacutecrivant une instruction composeacutee du nom de la fonction suivi entre parenthegravesesdrsquoune liste de paramegravetres

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

124

ExercicesApprendre agrave deacuteterminer les paramegravetres drsquoun algorithme

Pour eacutecrire lrsquoalgorithme permettant de reacutealiser une boisson plus ou moins sucreacuteeproceacutedez de la faccedilon suivante

a Eacutecrivez le bloc drsquoinstructions qui place un nombre deacutetermineacute de morceaux desucre dans une boisson chaude

b Deacuteterminez le paramegravetre qui permet de sucrer plus ou moins la boisson

c Donnez un nom agrave lrsquoalgorithme et preacutecisez le paramegravetre

d Eacutecrivez lrsquoalgorithme en utilisant le nom du paramegravetre

e Appelez lrsquoalgorithme parameacutetreacute par son nom en tenant compte du nombre demorceaux de sucre souhaiteacute

Comprendre lrsquoutilisation des fonctions Agrave la lecture du programme suivant

public class Fonction public static void main(String [] parametre) Deacuteclaration des variables int acompteur for (compteur = 0 compteur lt= 5 compteur++) a = calculer(compteur) Systemoutprint(a + a ) fin de main()

public static int calculer(int x) int y y = x x return y fin de fonc1() fin de class

a Deacutelimitez les trois blocs deacutefinissant la fonction main() la fonction calculer()et la classe Fonction

b Quel est le paramegravetre formel de la fonction calculer()

c Quelles sont les valeurs transmises au paramegravetre de la fonction calculer() lorsde son appel depuis la fonction main()

d Quels sont les reacutesultats produits par la fonction calculer()

e Quelles sont les valeurs transmises agrave la variable a

f Deacutecrivez lrsquoaffichage reacutealiseacute par la fonction main()

51

52

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

125

Soit la fonction

public static int f( int x) int resultat resultat = -x x + 3 x ndash 2 return resultat

a Eacutecrivez la fonction main() qui affiche le reacutesultat de la fonction f(x) pour x = 0

b Transformez la fonction main() de faccedilon agrave calculer et agrave afficher le reacutesultat de lafonction pour x entier variant entre -5 et 5 Utilisez pour cela dans la fonctionmain() une boucle for avec un indice variant entre -5 et 5

c Pour deacuteterminer le maximum de la fonction f(x) entre -5 et 5 calculez la valeurde f(x) pour chacune de ces valeurs et stockez le maximum dans une variable max

Deacutetecter des erreurs de compilation concernant les paramegravetres ou le reacutesultat drsquoune fonction

Deacuteterminez les erreurs de compilation des extraits de programmes suivants

a En utilisant la fonction max() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables double v1 v2 sup Systemoutprint(Entrer une valeur ) v1 = Lired() Systemoutprint(Entrer une valeur ) v2 = Lired() sup = max (v1v2) Systemoutprint(Le max de + v1 + et + v2 + est + sup) fin de main()

b

public static int max (int a int b) float m = a if (m gt b) m = b return m fin de max()

c En utilisant la fonction menu() deacutecrite au cours de ce chapitre

public static void main(String [] parametre) Deacuteclaration des variables int v1 v2 Systemoutprint(Entrer une valeur ) v1 = Lirei() v1 = menu (v2) fin de main()

53

54

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

126

d

public static void menu (int c) switch (c) return c

Eacutecrire une fonction simpleEacutecrivez la fonction pourcentage() qui permet de calculer les pourcentagesdrsquoutilisation de la Carte Bleue du cheacutequier et des virements automatiques sachantque la formule de calcul du pourcentage pour la Carte Bleue est comme nouslrsquoavons vu au chapitre 1 laquo Stocker une information raquo la suivante

Nombre de paiements par Carte Bleue Nombre total de paiements 100

Suivez les eacutetapes deacutecrites dans le preacutesent chapitre

a Deacuteterminez les instructions composant la fonction

b Associez le nom de la fonction aux instructions

c Pour deacuteterminer les paramegravetres de la fonction recherchez les valeurs pouvantmodifier le reacutesultat du calcul

Aide lrsquoen-tecircte drsquoune fonction ayant deux paramegravetres entiers srsquoeacutecrit public static type nomdelafonction( int a int b)

d Preacutecisez le type de reacutesultat fourni par la fonction

e Eacutecrivez la fonction main() qui fait appel agrave la fonction pourcentage() et quipermette drsquoobtenir une exeacutecution telle que

Nombre de paiement par Carte Bleue 5Nombre de cheques emis 10Nombre de virements automatiques 5Vous avez emis 20 ordres de debitdont 250 par Carte Bleue 500 par cheque 250 par virement

Le projet laquo Gestion drsquoun compte bancaire raquoLe programme eacutecrit au chapitre 4 laquo Faire des reacutepeacutetitions raquo est suffisamment structureacutepour y placer des fonctions En effet chaque option du projet est un programme agrave partentiegravere et peut donc ecirctre deacutecrite sous forme de fonction

Dans le cadre de ce chapitre nous allons construire trois fonctions relativement simplesqui vont nous permettre de comprendre le meacutecanisme de construction des fonctions

55

copy copyright Eacuteditions Eyrolles

De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctionsCHAPITRE 5

127

Deacutefinir une fonction Les fonctions sans paramegravetre avec reacutesultatLa fonction menuPrincipal()affiche le menu principal du programme et demande lasaisie de lrsquooption choisie Cette valeur doit ecirctre communiqueacutee agrave la fonction main() pourexeacutecuter la structure switch qui suit cette fonction

a Deacutecrivez lrsquoen-tecircte de la fonction menuPrincipal() en prenant soin de preacuteciser letype correspondant agrave la valeur retourneacutee

b Placez les instructions relatives agrave lrsquoaffichage du menu et agrave la saisie de lrsquooption dansle corps de la fonction

c Veacuterifiez que lrsquoopeacuterateur return soit appliqueacute agrave la variable contenant le choix delrsquooption

Les fonctions sans paramegravetre ni reacutesultatLa fonction sortir() affiche un message de politesse avant de sortir proprement duprogramme Elle ne fournit pas de reacutesultat et nrsquoa pas non plus besoin de paramegravetrepuisque aucune valeur speacutecifique nrsquoest neacutecessaire agrave son exeacutecution

a Deacutecrivez lrsquoen-tecircte de la fonction sortir()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

La fonction alAide() affiche agrave lrsquoeacutecran une explication sur ce que reacutealise chaque optionde lrsquoapplication

a Deacutecrivez lrsquoen-tecircte de la fonction alAide()

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Appeler une fonction Modifiez la fonction main() de votre programme de faccedilon agrave utiliser les trois fonctionsalAide() sortir() et menuPrincipal() deacutefinies aux eacutetapes preacuteceacutedentes

Lrsquoexeacutecution finale du programme doit ecirctre identique agrave celle du chapitre preacuteceacutedent Seulela structure interne du programme est modifieacutee ce dernier eacutetant composeacute de quatrelaquo blocs fonctions raquo

copy copyright Eacuteditions Eyrolles

6Fonctions notions avanceacutees

La creacuteation et lrsquoutilisation de fonctions deacutedieacutees agrave la reacutesolution drsquoun problegraveme donneacute sontnous lrsquoavons observeacute au chapitre preacuteceacutedent des opeacuterations fondamentales qui permet-tent le deacuteveloppement de logiciels dont le code source soit facilement reacuteutilisable

Ces fonctions transforment la structure geacuteneacuterale des programmes et apportent de ce faitde nouveaux concepts qursquoil est important de bien maicirctriser avant drsquoeacutetudier la program-mation objet

Nous commenccedilons par examiner (section laquo La structure drsquoun programme raquo) cesnouvelles notions telles que la visibiliteacute des variables les variables locales et les varia-bles de classe agrave partir drsquoexemples simples Pour chacune de ces notions nous observonsleur reacutepercussion sur le reacutesultat des diffeacuterents programmes donneacutes en exemple

Nous analysons ensuite (section laquo Les fonctions communiquent raquo) comment les fonc-tions eacutechangent des donneacutees par lrsquointermeacutediaire des paramegravetres et du retour de reacutesultatAgrave partir de cette analyse nous constatons que ces modes de communication ne permet-tent pas toujours drsquoobtenir lrsquoopeacuteration souhaiteacutee

La structure drsquoun programme Nous avons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Les fonctions au seindrsquoun programme Java raquo ) qursquoun programme eacutetait constitueacute drsquoune classe qui englobe unensemble de fonctions deacutefinissant chacune un bloc drsquoinstructions indeacutependant

En reacutealiteacute il existe trois principes fondamentaux qui reacutegissent la structure drsquounprogramme Java Ces principes sont deacutetailleacutes ci-dessous

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

130

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visibleen dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions de visibiliteacute des variables de variableslocales et de variables de classe Concregravetement ces trois notions sont attacheacutees au lieude deacuteclaration des variables comme lrsquoillustre la Figure 6-1

Pour mieux comprendre ces diffeacuterents concepts nous allons observer un programmecomposeacute de deux fonctions main() et modifier() et drsquoune variable nommeacutee valeurLa fonction modifier() a pour objectif de modifier le contenu de la variable valeurPour chaque exemple la variable valeur est deacuteclareacutee en un lieu diffeacuterent du programmeAgrave partir de ces variations le programme fournit un reacutesultat diffeacuterent que nous analysons

La visibiliteacute des variables

Apregraves eacutetude des trois proprieacuteteacutes eacutenonceacutees ci-dessus nous observons qursquoun programmeest constitueacute de deacuteclarations de variables et de fonctions Il existe de fait une notiondrsquoexteacuterieur et drsquointeacuterieur aux fonctions Les instructions eacuteleacutementaires de type affecta-tion test etc se situent toujours agrave lrsquointeacuterieur drsquoune fonction alors que la deacuteclaration devariables est une opeacuteration reacutealisable agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur drsquoune fonction

Figure 6ndash1

Les variables peuvent ecirctre deacuteclareacutees agrave lrsquointeacuterieur ou agrave lrsquoexteacuterieur des fonctions mais toujours dans une classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

131

De plus la troisiegraveme proprieacuteteacute eacutenumeacutereacutee ci-dessus exprime qursquoune fonction ne peut pasutiliser dans ses instructions une variable deacuteclareacutee dans une autre fonction Pour mieuxvisualiser cette proprieacuteteacute examinons le programme ci-dessous

Exemple code source complet

public class Visibilite public static void main(String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class Visibilite

Dans ce programme nous constatons que lrsquoinstruction valeur = 3 placeacutee dans lafonction modifier() cherche agrave modifier le contenu de la variable valeur deacuteclareacutee nonpas dans la fonction modifier() mais dans la fonction main()

Cette modification nrsquoest pas reacutealisable car la variable valeur nrsquoest deacutefinie qursquoagrave lrsquointeacute-rieur de la fonction main() Elle est donc invisible depuis la fonction modifier() Lesfonctions sont par deacutefinition des blocs distincts La fonction modifier()ne peut agir surla variable valeur qui nrsquoest visible qursquoagrave lrsquointeacuterieur de la fonction main()

Crsquoest pourquoi le fait drsquoeacutecrire lrsquoinstruction valeur = 3 dans la fonction modifier()provoque une erreur de compilation du type Line 12 Undefined variable valeur

Figure 6ndash2

Une variable deacuteclareacutee dans une fonction ne peut pas ecirctre utlisiseacutee par une autre fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

132

Variable locale agrave une fonctionLa deuxiegraveme proprieacuteteacute eacutenonceacutee preacuteceacutedemment eacutetablit qursquoune fonction est formeacuteedrsquoinstructions eacuteleacutementaires et notamment des instructions de deacuteclaration de variables

Par deacutefinition une variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est dite variable localeagrave la fonction Pour lrsquoexemple preacuteceacutedent la variable valeur est locale agrave la fonctionmain()

Les variables locales nrsquoexistent que pendant le temps de lrsquoexeacutecution de la fonction Ellesne sont pas modifiables depuis une autre fonction Nous lrsquoavons vu agrave la section preacuteceacute-dente le contenu de la variable valeur ne peut ecirctre modifieacute par une instruction situeacutee endehors de la fonction main()

Cependant le programmeur deacutebutant qui souhaite modifier agrave tout prix la variable valeurva chercher agrave corriger dans un premier temps lrsquoerreur de compilation eacutenonceacutee ci-dessusPour cela il deacuteclare une variable valeur agrave lrsquointeacuterieur de la fonction modifier() et uneautre agrave lrsquointeacuterieur de la fonction main() De cette faccedilon la variable valeur est deacutefiniedans chacune des fonctions et aucune erreur de compilation nrsquoest deacutetecteacutee Examinonsplus preacuteciseacutement ce que reacutealise un tel programme

Exemple code source complet

public class VariableLocale public static void main(String [] paramegravetre) deacuteclaration de variables locales int valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableLocale

Pour bien comprendre ce qursquoeffectue ce programme construisons le tableau drsquoeacutevolution(voir au chapitre 1 laquo Stocker une information raquo la section laquo Lrsquoinstruction drsquoaffectation raquo)de chaque variable deacuteclareacutee dans le programme Cerclejava

Puisque les fonctions main() et modifier() sont des blocs drsquoinstructions seacutepareacuteslrsquointerpreacuteteur Java creacutee un emplacement meacutemoire pour chaque deacuteclaration de la variablevaleur Il existe deux cases meacutemoire valeur distinctes portant le mecircme nom Elles sont

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

133

distinctes parce qursquoelles nrsquoappartiennent pas agrave la mecircme fonction Le tableau des varia-bles deacuteclareacutees pour chaque fonction est le suivant

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()Valeur = 3 dans modifier()Valeur = 2 apres modifier()

Agrave lrsquoexeacutecution du programme le premier appel agrave la fonction Systemoutprintln() affi-che le contenu de la variable valeur deacutefinie dans la fonction main() soit 2

Le programme reacutealise ensuite les actions suivantes

bull Appeler la fonction modifier() qui affiche le contenu de la variable valeur deacutefinie agravelrsquointeacuterieur de cette fonction soit 3

bull Sortir de la fonction modifier() et deacutetruire la variable valeur locale agrave cette fonction

bull Retourner agrave la fonction main() et afficher de nouveau le contenu de la variable valeurdeacutefinie dans la fonction main() soit 2

La variable valeur est deacuteclareacutee deux fois dans chacune des deux fonctions et nous cons-tatons que la fonction modifier() ne change pas le contenu de la variable valeurdeacuteclareacutee dans la fonction main() En reacutealiteacute mecircme si ces deux variables portent le mecircmenom elles sont totalement diffeacuterentes et leur valeur est stockeacutee dans deux casesmeacutemoire distinctes

En cherchant agrave reacutesoudre une erreur de compilation nous nrsquoavons pas eacutecrit la fonction quimodifie la valeur drsquoune variable deacutefinie en dehors drsquoelle-mecircme Cette modification est

Variable locale agrave main() valeur Variable locale agrave modifier() valeur

valeur = 2 2 valeur = 3 3

Figure 6ndash3

Toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est une variable locale propre agrave cette fonction

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

134

impossible dans la mesure ougrave la variable valeur nrsquoest connue que de la fonction etdrsquoaucune autre

Variable de classeEn examinant plus attentivement la premiegravere proprieacuteteacute deacutefinie au deacutebut de ce chapitre(voir section laquo La structure drsquoun programme raquo) nous remarquons que les classescontiennent eacutegalement des instructions de deacuteclaration en dehors de toute fonction Lesvariables ainsi deacuteclareacutees sont appeleacutee variables de classe Elles sont deacutefinies pourlrsquoensemble du programme et sont visibles depuis toutes les fonctions

La deacuteclaration des variables de classe se reacutealise comme deacutecrit ci-dessous

Exemple code source complet

public class VariableDeClasse deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () valeur = 3 Systemoutprintln(Valeur = + valeur + dans modifier() ) fin de modifier fin de class VariableDeClasse

Figure 6-4

Une variable deacuteclareacutee en dehors de toute fonction est appeleacutee variable de classe

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

135

Gracircce agrave lrsquoinstruction static int valeur la variable valeur est deacutefinie pour tout leprogramme VariableDeClasse Le mot-cleacute static est important car lorsque lrsquointerpreacute-teur Java le rencontre il creacuteeacute une case meacutemoire en un seul exemplaire accessible depuisnrsquoimporte quelle meacutethode (voir au chapitre 8 laquo Les principes du concept Objet raquo lasection laquo La communication objet raquo)

La repreacutesentation par blocs du programme (voir Figure 6-4) montre que la variablevaleur est visible tout au long du programme

Puisque la variable valeur est deacuteclareacutee agrave lrsquoexteacuterieur des fonctions main() et modifier()elle est deacutefinie comme eacutetant une variable de la classe VariableDeClasse La variablevaleur existe tout le temps de lrsquoexeacutecution du programme et les fonctions deacutefinies agravelrsquointeacuterieur de la classe peuvent lrsquoutiliser et modifier son contenu

Reacutesultat de lrsquoexeacutecution

Lrsquoexeacutecution du programme a pour reacutesultat

Valeur = 2 avant modifier()

Valeur = 3 dans modifier()

Valeur = 3 apres modifier()

La variable valeur eacutetant une variable de classe lrsquoordinateur ne creacutee qursquoun seul emplace-ment meacutemoire Le tableau drsquoeacutevolution de la variable est le suivant

Puisqursquoil nrsquoexiste qursquoune seule case meacutemoire nommeacutee valeur celle-ci est commune agravetoutes les fonctions du programme qui peuvent y deacuteposer une valeur Lorsque la fonc-tion modifier() place 3 dans la case meacutemoire valeur elle eacutecrase la valeur 2 que lafonction main() avait preacuteceacutedemment placeacutee

En utilisant le concept de variable de classe nous pouvons eacutecrire une fonction quimodifie le contenu drsquoune variable deacutefinie en dehors de la fonction

Quelques preacutecisions sur les variables de classe

Puisque les variables locales ne sont pas modifiables depuis drsquoautres fonctions et que agravelrsquoinverse les variables de classe sont vues depuis toutes les fonctions du programme leprogrammeur deacutebutant aura tendance pour se simplifier la vie agrave nrsquoutiliser que des varia-bles de classe

Or lrsquoutilisation abusive de ce type de variables comporte plusieurs inconveacutenients quenous deacutetaillons ci-dessous

Variable de classe valeur

valeur = 2 dans la fonction main() 2

valeur = 3 dans la fonction modifier() 3

valeur = 3 dans la fonction main() 3

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

136

Deacuteclarer plusieurs variables portant le mecircme nom

Lrsquoemploi systeacutematique des variables de classe peut ecirctre source drsquoerreurs surtoutlorsqursquoon prend lrsquohabitude de deacuteclarer des variables portant le mecircme nom Observons leprogramme suivant

public class MemeNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre valeur = 2 Systemoutprintln(Valeur = + valeur + avant modifier() ) modifier() Systemoutprintln(Valeur = + valeur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(valeur + dans modifier() avant la deacuteclaration) Deacuteclaration de variables locales int valeur valeur = 3 Systemoutprintln(valeur + dans modifier() apres la declaration) fin de modifier fin de class MemeNom

Dans ce programme la variable valeur est deacuteclareacutee deux fois une fois comme varia-ble de classe et une autre fois comme variable locale agrave la fonction modifier() Riennrsquointerdit de deacuteclarer plusieurs fois une variable portant le mecircme nom dans des blocsdrsquoinstructions diffeacuterents

Le fait de deacuteclarer deux fois la mecircme variable nrsquoest cependant pas sans conseacutequencesur le reacutesultat du programme

Dans la fonction modifier() les deux variables valeur coexistent et repreacutesententdeux cases meacutemoire distinctes Lorsque lrsquoinstruction valeur = 3 est exeacutecuteacuteelrsquointerpreacuteteur Java ne peut placer la valeur numeacuterique 3 dans les deux cases meacutemoireagrave la fois Il est obligeacute de choisir Dans un tel cas la regravegle veut que ce soit la variablelocale qui soit prise en compte et non la variable de classe

Le reacutesultat final du programme est le suivant

Valeur = 2 avant modifier()2 dans modifier() avant la declaration3 dans modifier() apregraves la dclarationValeur = 2 apregraves modifier()

La modification nrsquoest valable que localement Lorsque le programme retourne agrave la fonc-tion main() la variable locale nrsquoexiste plus Le programme affiche le contenu de lavariable de classe soit 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

137

Le veacuteritable nom drsquoune variable de classe

Une variable de classe se diffeacuterencie des variables locales par son nom Lorsqursquounevariable de classe est deacuteclareacutee lrsquoordinateur lui donne un nom qui lui permet de la distin-guer des autres variables

Ce nom est constitueacute du nom de la classe suivi drsquoun point puis du nom de la variabledeacuteclareacutee Pour lrsquoexemple suivant la variable de classe valeur srsquoappelle en fait Verita-bleNomvaleur Le programme peut srsquoeacutecrire de la faccedilon suivante

public class VeritableNom deacuteclaration de variables de classe static int valeur public static void main(String [] paramegravetre) VeritableNomvaleur = 2 Systemoutprintln(VeritableNomvaleur + avant modifier() ) modifier() Systemoutprintln(VeritableNomvaleur + apres modifier() ) fin de main()

public static void modifier () Systemoutprintln(Variable de classe + VeritableNomvaleur ) Deacuteclaration de variables locales int valeur = 3 Systemoutprintln(Variable locale + valeur ) VeritableNomvaleur = 3 Systemoutprintln(Variable de classe + VeritableNomvaleur ) fin de modifier fin de class VeritableNom

En eacutecrivant la variable de classe par son nom veacuteritable lrsquoambiguiumlteacute sur lrsquoemploi de lavariable de classe ou de la variable locale est leveacutee et lrsquoexeacutecution du programme a lereacutesultat suivant

2 avant modifier()Variable de classe 2Variable locale 3Variable de classe 33 apregraves modifier()

Pour eacuteviter toute meacuteprise il est recommandeacute drsquoutiliser les variables de classe avec parci-monie et chaque fois avec leur nom complet En pratique seules les variables qui preacutesen-tent un inteacuterecirct geacuteneacuteral pour le programme sont agrave deacuteclarer comme variables de classe

De lrsquoindeacutependance des fonctions

Comme nous lrsquoavons deacutejagrave observeacute (voir au chapitre preacuteceacutedent la section laquo Algorithmeparameacutetreacute raquo) une fonction est avant tout un sous-programme indeacutependant capabledrsquoecirctre exeacutecuteacute autant de fois que neacutecessaire et traitant des donneacutees diffeacuterentes

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

138

En construisant des fonctions qui utilisent des variables de classe nous creacuteons des fonc-tions qui ne sont plus des modules de programmes indeacutependants mais des extraits deprogrammes travaillant tous sur le mecircme jeu de variables

Cette deacutependance aux variables de classe nuit au programme car il est neacutecessaire pourreacuteutiliser de telles fonctions de modifier tous les noms des variables de classe de faccedilonagrave les rendre compatibles avec les nouveaux programmes

En cas de deacuteveloppement de logiciels importants comportant des centaines de milliersdrsquoinstructions la transformation et lrsquoameacutelioration des fonctionnaliteacutes du programme setrouvent fortement compromises Lrsquoensemble du code doit ecirctre examineacute preacuteciseacutement afinde deacuteterminer ougrave se trouve la variable de classe concerneacutee par la transformation envi-sageacutee

Dans ce cadre il convient de prendre les regravegles suivantes

bull Utiliser les variables de classe en nombre limiteacute le choix de ce type de variablesrsquoeffectuant en fonction de lrsquoimportance de la variable dans le programme Unevariable est consideacutereacutee comme une variable de classe lorsqursquoelle est commune agrave ungrand nombre de fonctions

bull Eacutecrire un programme de faccedilon modulaire chaque fonction travaillant de faccedilon indeacute-pendante agrave partir de valeurs transmises agrave lrsquoaide des techniques eacutetudieacutees agrave la sectionsuivante

Les fonctions communiquentLrsquoemploi systeacutematique des variables de classe peut ecirctre comme nous venons de le voirsource drsquoerreurs Pour limiter leur utilisation il existe des techniques simples qui fontque deux fonctions communiquent le contenu drsquoune case meacutemoire locale de lrsquoune desfonctions agrave une case meacutemoire locale de lrsquoautre

Ces techniques sont baseacutees sur le parameacutetrage des fonctions et sur le retour de reacutesultat

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Pour mieux cerner le fonctionnement de chacune de ces techniques nous allons leseacutetudier agrave lrsquoaide drsquoun programme composeacute de deux fonctions main() et tripler() etdrsquoune variable valeur locale agrave la fonction main() La fonction tripler() a pourobjectif de multiplier par trois le contenu de la variable valeur

Le passage de paramegravetres par valeurNotre contrainte est cette fois de nrsquoutiliser que des variables locales Nous supposonsdonc que la variable valeur soit locale agrave la fonction main() Pour multiplier par troiscette valeur la fonction tripler() doit connaicirctre effectivement le contenu de la variablevaleur

La fonction main() doit communiquer pour cela le contenu de la variable valeur agrave lafonction modifier() Cette communication est reacutealiseacutee en passant le contenu de lavariable au paramegravetre de la fonction tripler() Examinons le programme ci-dessous

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

139

Exemple code source complet

public class ParValeur public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static void tripler (int valeur) Systemoutprintln(Valeur = + valeur + dans tripler() ) valeur = 3 valeur Systemoutprintln(Valeur = + valeur + dans tripler() ) fin de tripler fin de class ParValeur

Dans ce programme deux variables valeurs sont deacuteclareacutees La premiegravere est locale agrave lafonction main() tandis que la seconde est locale agrave la fonction tripler() Cependantcomme la seconde est deacuteclareacutee dans lrsquoen-tecircte de la fonction elle est consideacutereacutee commevariable locale agrave la fonction et surtout comme paramegravetre formel de la fonctiontripler()

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Deacutefinir unefonction raquo

De cette faccedilon lorsque la fonction tripler() est appeleacutee depuis la fonction main()avec comme valeur de paramegravetre le contenu de valeur soit 2 la variable valeur localede tripler() prend la valeur 2 (voir Figure 6-5)

Figure 6-5

Gracircce au paramegravetre le contenu drsquoune variable locale agrave la fonction appelante main() est transmis agrave la fonction appeleacutee tripler()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

140

Ensuite la variable valeur locale agrave la fonction tripler() est multiplieacutee par trois gracircceagrave lrsquoinstruction valeur = 3 valeur La variable valeur vaut donc 6 dans la fonctiontripler() Lorsque le programme sort de la fonction tripler() et retourne agrave la fonctionmain() il deacutetruit la variable locale de la fonction tripler() et affiche le contenu de lavariable valeur locale agrave la fonction main() soit encore 2

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()Valeur = 2 dans tripler()Valeur = 6 dans tripler() Valeur = 2 apres tripler()

Gracircce au paramegravetre de la fonction tripler() le contenu de la variable valeur locale agravela fonction main() est transmis agrave la fonction tripler() Une fois la fonction exeacutecuteacuteenous constatons que la variable valeur de la fonction main() nrsquoest pas modifieacutee pourautant

En effet la valeur passeacutee en paramegravetre est copieacutee dans la case meacutemoire associeacutee au para-megravetre Mecircme si le paramegravetre porte le mecircme nom que la variable il srsquoagit de deux casesmeacutemoire distinctes La modification reste donc locale agrave la fonction

Lorsqursquoune fonction communique le contenu drsquoune variable agrave une autre fonction parlrsquointermeacutediaire drsquoun paramegravetre on dit que le paramegravetre est passeacute par valeur Ce typede transmission de donneacutees ne permet pas de modifier dans la fonction appelante lecontenu de la variable passeacutee en paramegravetre

Le reacutesultat drsquoune fonction Pour garder le reacutesultat de la modification du contenu drsquoune variable en sortie de fonctionune technique consiste agrave retourner la valeur calculeacutee par lrsquointermeacutediaire de lrsquoinstructionreturn

Examinons le programme ci-dessous qui utilise cette technique

Exemple code source complet

public class Resultat public static void main (String [] paramegravetre) Deacuteclaration des variables int valeur = 2 Systemoutprintln(Valeur = + valeur + avant tripler() ) valeur = tripler(valeur) Systemoutprintln(Valeur = + valeur + apres tripler() ) fin de main()

public static int tripler (int v) Systemoutprintln(v = + v + dans tripler() )

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

141

int reacutesultat = 3v Systemoutprintln(Resultat = + reacutesultat + dans tripler() ) return reacutesultat fin de tripler

fin de class Resultat

Ici le contenu de la variable valeur est passeacute au paramegravetre v de la fonction tripler()Puisque le paramegravetre formel (v) correspond agrave une case meacutemoire distincte de la variableeffectivement passeacutee (valeur) il est plus judicieux de le deacuteclarer sous un autre nomdrsquoappel que celui de la variable de faccedilon agrave ne pas les confondre En geacuteneacuteral et tant quecela reste possible nous avons pour convention de donner comme nom drsquoappel du para-megravetre formel la premiegravere lettre du paramegravetre reacuteel Pour notre exemple valeur est leparamegravetre reacuteel Le paramegravetre formel srsquoappelle donc v

Une fois le calcul reacutealiseacute agrave lrsquointeacuterieur de la fonction tripler() la valeur reacutesultanteplaceacutee dans la variable reacutesultat est transmise agrave la fonction main() qui a appeleacute la fonc-tion tripler() Cette transmission est reacutealiseacutee gracircce agrave lrsquoinstruction return reacutesultatLe contenu du reacutesultat est alors placeacute dans la variable valeur gracircce au signe drsquoaffectation= comme lrsquoillustre la Figure 6-6

Reacutesultat de lrsquoexeacutecution

Valeur = 2 avant tripler()v = 2 dans tripler() Resultat = 6 dans tripler()Valeur = 6 apregraves tripler()

Gracircce agrave la technique du retour de reacutesultat et du passage de paramegravetre par valeur les fonc-tions peuvent eacutechanger les contenus de variables Les variables locales sont donc exploi-

Figure 6-6

Gracircce au retour de reacutesultat le contenu drsquoune variable locale agrave la fonction appeleacutee tripler() est transmis agrave la fonction appelante main()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

142

tables aussi facilement que les variables de classe tout en eacutevitant les inconveacutenients lieacutesagrave ces derniegraveres

Lorsqursquoil y a plusieurs reacutesultats agrave retournerUne difficulteacute subsiste le retour de reacutesultat ne peut se reacutealiser que sur une seule valeurIl nrsquoest pas possible de retourner plusieurs valeurs agrave la fois Si lrsquoon souhaite eacutecrire lrsquoalgo-rithme qui eacutechange le contenu de deux variables (voir au chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) sous forme de fonc-tion nous nous trouvons confronteacute au problegraveme deacutecrit dans lrsquoexemple ci-dessous

Exemple code source complet

public class PlusieursResultats public static void main (String [] arg) int a b Systemoutprint(Entrer une valeur pour a ) a = Lirei() Systemoutprint(Entrer une valeur pour b ) b = Lirei() Systemoutprintln( a = +a+ b = +b) eacutechange (ab) Systemoutprintln(Apres echange) Systemoutprintln( a = +a+ b = +b) public static void eacutechange(int x int y) int tmp = x x = y y = tmp

La fonction eacutechange()reacutealise theacuteoriquement lrsquoeacutechange du contenu des deux variablespasseacutees en paramegravetres Si a prend la valeur 1 et que b vaille 2 apregraves exeacutecution de la fonc-tion eacutechange() a doit prendre la valeur de b soit 1 et b la valeur de a soit 2

Reacutesultat de lrsquoexeacutecution

Examinons le reacutesultat de lrsquoexeacutecution de ce programme en supposant que les caractegraveresgriseacutes soient les valeurs choisies par lrsquoutilisateur

Entrer une valeur pour a 11Entrer une valeur pour b 22a = 1 b = 2Apres echangea = 1 b = 2

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

143

Nous le constatons agrave lrsquoexeacutecution aucun eacutechange nrsquoa eacuteteacute reacutealiseacute Il nrsquoy a rien drsquoeacutetonnantagrave cela puisque le passage des paramegravetres est un passage par valeur et qursquoil ne modifiepas le contenu des paramegravetres reacuteels a et b passeacutes agrave la fonction eacutechange()

La solution qui consiste agrave retourner le reacutesultat est impossible En effet il serait neacutecessairede retourner les deux variables eacutechangeacutees et il nrsquoest pas possible drsquoeacutecrire return x y la syntaxe de cette instruction nrsquoeacutetant pas valide

Voir au chapitre 5 laquo De lrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo la section laquo Les diffeacuteren-tes formes drsquoune fonction raquo

Dans lrsquoeacutetat actuel de nos connaissances nous ne sommes pas agrave mecircme de reacutecupeacuterer diffeacute-rentes valeurs modifieacutees au sein drsquoune fonction En reacutealiteacute seul le concept drsquoobjet permetde reacutealiser un tel exploit Nous lrsquoeacutetudions au chapitre suivant

ReacutesumeacuteUn programme Java est structureacute selon les trois principes fondamentaux suivants

1 Un programme contient

bull une fonction principale appeleacutee fonction main()

bull un ensemble de fonctions deacutefinies par le programmeur

bull des instructions de deacuteclaration de variables

2 Les fonctions contiennent

bull des instructions de deacuteclaration de variables

bull des instructions eacuteleacutementaires (affectation test reacutepeacutetition etc)

bull des appels agrave des fonctions preacutedeacutefinies ou non

3 Chaque fonction est comparable agrave une boicircte noire dont le contenu nrsquoest pas visi-ble en dehors de la fonction

De ces trois proprieacuteteacutes deacutecoulent les notions suivantes

bull Visibiliteacute toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction nrsquoest visible quedans cette fonction et ne peut ecirctre utiliseacutee dans une autre fonction

bull Variable locale toute variable deacuteclareacutee agrave lrsquointeacuterieur drsquoune fonction est unevariable locale agrave cette fonction Ces variables nrsquoexistent que le temps de lrsquoexeacutecu-tion de la fonction et elles ne sont pas modifiables depuis une autre fonction

bull Variable de classe les variables deacuteclareacutees en dehors de toute fonction sont appe-leacutees des variables de classe Ces variables sont deacutefinies pour lrsquoensemble duprogramme et elles sont visibles et modifiables par toutes les fonctions de laclasse

Lorsqursquoune variable de classe et une variable locale portant le mecircme nom coexistentagrave lrsquointeacuterieur drsquoune fonction la regravegle veut que ce soit la variable locale qui soit priseen compte et non la variable de classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

144

ExercicesRepeacuterer les variables locales et les variables de classe

En observant le programme suivant

public class Calculette public static double reacutesultat

public static void main( String [] argument) int a b menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calculer() afficher() public static void calculer() char opeacuteration switch (opeacuteration) case rsquo+rsquo reacutesultat = a + b break case rsquo-rsquo reacutesultat = a ndash b break case rsquorsquo reacutesultat = a b

Les fonctions sont des blocs drsquoinstructions distinctes Pour communiquer le contenudrsquoune case meacutemoire (variable) locale de lrsquoune agrave une case meacutemoire locale de lrsquoautrefonction il est neacutecessaire drsquoutiliser les techniques suivantes

bull Les paramegravetres des fonctions lorsqursquoune fonction communique le contenudrsquoune variable agrave une autre fonction par lrsquointermeacutediaire drsquoun paramegravetre on dit quele paramegravetre est passeacute par valeur Ce type de transmission de donneacutees ne permetpas de modifier dans la fonction appelante le contenu de la variable passeacutee enparamegravetre

bull Le retour de reacutesultat pour garder en reacutesultat la modification du contenu drsquounevariable en sortie de fonction une technique consiste agrave retourner la valeurcalculeacutee par lrsquointermeacutediaire de lrsquoinstruction return

Ces deux modes de communication ne permettent pas de reacutecupeacuterer plusieursdonneacutees modifieacutees agrave lrsquointeacuterieur drsquoune fonction Seul le concept drsquoobjet eacutetudieacute auchapitre suivant permet de reacutealiser cette opeacuteration

61

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

145

break case rsquorsquo reacutesultat = a b break

public static void afficher() char opeacuteration Systemoutprint(a + +opeacuteration + + b + = + reacutesultat) public static void menu() char opeacuteration Systemoutprintln(Je sais compter entrez lrsquooperation choisie) Systemoutprintln( + pour additionner ) Systemoutprintln( - pour soustraire ) Systemoutprintln( pour pultiplier ) Systemoutprintln( pour diviser ) Systemoutprintln( (+ - ) ) opeacuteration = Lirec()

a Recherchez les diffeacuterentes fonctions deacutefinies dans la classe Calculette

b Dessinez le programme sous forme de scheacutema en repreacutesentant les fonctions agravelrsquoaide de blocs Placez les variables dans les blocs ougrave elles sont deacuteclareacutees

c Agrave lrsquoaide du scheacutema deacuteterminez les variables locales agrave chacune des fonctionsainsi que les variables de classe

d Apregraves exeacutecution de la fonction menu() et lecture des deux valeurs numeacuteriques a etb la fonction calculer() peut-elle reacutealiser lrsquoopeacuteration demandeacutee Pourquoi

e Mecircme question pour la fonction afficher()

Communiquer des valeurs agrave lrsquoappel drsquoune fonctionPour corriger le programme Calculette nous supposons que les variables reacutesul-tat et opeacuteration soient deacuteclareacutees en tant que variables de classe et non plus loca-lement aux fonctions afficher() et menu()

a Modifiez le scheacutema reacutealiseacute en 61b en tenant compte de ces nouvelles deacuteclara-tions

b Quelle technique doit-on utiliser pour que les fonctions calculer() et affi-cher() connaissent le contenu des variables a et b afin drsquoeffectuer ensuite lesinstructions qui les composent

c Eacutecrivez les fonctions en utilisant cette technique

62

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

146

Transmettre un reacutesultat agrave la fonction appelanteNous supposons que le programme Calculette ne contienne plus de variables declasse Les variables reacutesultat et opeacuteration sont maintenant deacuteclareacutees localementaux fonctions qui les utilisent

a Quelles sont les conseacutequences de cette nouvelle hypothegravese sur le reacutesultat duprogramme

b Comment la fonction calculer() peut-elle connaicirctre lrsquoopeacuterateur choisi parlrsquoutilisateur dans la fonction menu()

c Transformez la fonction menu() de sorte que lrsquoopeacuterateur soit transmis agrave la fonc-tion main()

d Modifiez la fonction calculer() de faccedilon agrave lui transmettre lrsquoopeacuterateur fournipar la fonction menu()

e Comment la fonction afficher() peut-elle connaicirctre le reacutesultat de la fonctioncalculer()

f Transformez la fonction calculer() de sorte que le reacutesultat soit transmis agrave lafonction main()

g Modifiez la fonction afficher() de faccedilon agrave lui transmettre le reacutesultat fourni parla fonction calculer()

Le projet laquo Gestion drsquoun compte bancaire raquoAu chapitre preacuteceacutedent nous avons construit trois fonctions alAide() sortir() etmenuPrincipal() qui ameacuteliorent la lisibiliteacute du programme Ces fonctions concernentsurtout lrsquoaffichage de messages de dialogue de lrsquoapplication vers lrsquoutilisateur (menuaide etc) Elles reacutealisent lrsquointerface entre lrsquoutilisateur et lrsquoapplication sans transformerles donneacutees propres agrave chaque compte bancaire

Pour reacutealiser les opeacuterations de creacuteation et drsquoaffichage drsquoun compte (options 1 et 2 dumenu) nous allons ici construire des fonctions qui modifient transforment les donneacuteesdrsquoun compte

Comprendre la visibiliteacute des variablesLa fonction afficherCpte() reacutealise lrsquooption 2 du menu principal de notre applicationCette fonction affiche lrsquoensemble des caracteacuteristiques drsquoun compte soit son numeacutero sontype son taux srsquoil srsquoagit drsquoun compte drsquoeacutepargne et sa valeur courante Nous supposonsque lrsquoensemble de ces valeurs aient eacuteteacute preacutealablement saisies en option 1

Les variables locales

Une premiegravere solution pourrait srsquoeacutecrire

public static void afficherCpte() long num char type

63

copy copyright Eacuteditions Eyrolles

Fonctions notions avanceacuteesCHAPITRE 6

147

double taux double val Systemoutprint(Le compte ndeg + num + est un compte ) if (type == rsquoCrsquo) Systemoutprintln( courant ) else if (type == rsquoJrsquo) Systemoutprintln( joint ) else if (type == rsquoErsquo) affiche son taux dans le cas drsquoun compte drsquoeacutepargne Systemoutprintln( epargne dont le taux est + taux) Systemoutprintln( Valeur initiale + val)

bull Quelles valeurs sont afficheacutees par cette fonction Pourquoi

Les variables de classe

Pour corriger la fonction preacuteceacutedente il est neacutecessaire que la fonction ait accegraves auxvaleurs stockeacutees lors de lrsquooption 1

Une premiegravere solution consiste agrave deacutefinir les variables agrave afficher comme variables de classe

a Transformez votre programme et deacuteclarez les variables num type taux et valcomme variables de classe

b Retirez les deacuteclarations des variables num type taux et val dans la fonction affi-cherCpte() de faccedilon agrave eacuteviter qursquoelles soient encore utiliseacutees par lrsquointerpreacuteteurcomme variables locales

c Exeacutecutez votre programme et veacuterifiez que la fonction affiche correctement les valeurs

Le passage de paramegravetres par valeur

Une seconde solution revient agrave deacuteclarer les variables num type taux et val en paramegrave-tres de la fonction drsquoaffichage de faccedilon agrave transmettre les valeurs saisies depuis la fonc-tion main() (option 1) agrave la fonction afficherCpte()

a Deacutecrivez lrsquoen-tecircte de la fonction afficherCpte() en prenant soin de deacuteclarer enparamegravetre une variable pour chaque caracteacuteristique du compte agrave transmettre agrave lafonction

b Deacuteterminez les instructions composant cette fonction et placez-les dans le corps dela fonction

Les limites du retour de reacutesultatLa fonction creacuteerCpte() rassemble les instructions de lrsquooption 1 soit lrsquoaffichage demessages et la saisie au clavier des valeurs caracteacuteristiques drsquoun compte

a Recherchez quel doit ecirctre le reacutesultat de la fonction agrave transmettre agrave la fonction main()

b Pour deacutecrire lrsquoen-tecircte de la fonction creacuteerCpte() est-il possible de deacuteterminer letype agrave placer dans lrsquoen-tecircte de la fonction Pourquoi

copy copyright Eacuteditions Eyrolles

7Les classeset les objets

Lrsquoeacutetude du chapitre 6 laquo Fonctions notions avanceacutees raquo montre que si une fonctionfournit plusieurs reacutesultats ceux-ci ne peuvent pas ecirctre transmis au programme appelantPour contourner cette difficulteacute il est neacutecessaire drsquoutiliser des objets au sens de laprogrammation objet

Pour faire comprendre les principes fondamentaux de la notion drsquoobjet nous eacutetudions(section laquo La classe String une approche vers la notion drsquoobjet raquo) comment deacutefinir etgeacuterer des objets de type String Ce type permet la repreacutesentation des mots en tant quesuites de caractegraveres Agrave partir de cette eacutetude nous analysons les instructions qui font appelaux objets String afin drsquoen comprendre les principes de notation et drsquoutilisation

Nous examinons ensuite (section laquo Construire et utiliser ses propres classes raquo) commentdeacutefinir de nouveaux types de donneacutees Pour cela nous deacuteterminons les caracteacuteristiquessyntaxiques drsquoune classe et observons comment manipuler des objets agrave lrsquointeacuterieur drsquouneapplication et comment utiliser les meacutethodes qui leurs sont associeacutees

La classe String une approche vers la notion drsquoobjetLa classe String est une classe preacutedeacutefinie du langage Java Elle permet de deacutefinir deslaquo variables raquo contenant des suites de caractegraveres autrement dit des mots ou dans lejargon informatique des chaicircnes de caractegraveres Nous eacutetudions comment deacutefinir ceslaquo variables raquo agrave la section ci-dessous

La classe String est un type de donneacutees composeacute drsquoun grand nombre drsquooutils oumeacutethodes qui facilitent lrsquoutilisation des chaicircnes de caractegraveres (voir la section laquo Les diffeacute-rentes meacutethodes de la classe String raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

150

Manipuler des mots en programmationLrsquoutilisation des chaicircnes de caractegraveres apporte beaucoup agrave la convivialiteacute desprogrammes informatiques Il serait impensable aujourdrsquohui de creacuteer un logiciel degestion du personnel sans pouvoir deacutefinir le nom et le preacutenom de chaque employeacute Dansle mecircme ordre drsquoideacutee que serait la recherche drsquoinformations sur Internet sans cesfameuses chaicircnes de caractegraveres

Gracircce aux chaicircnes de caractegraveres nous oublions le langage binaire et il devient aiseacute decommuniquer avec lrsquoordinateur dans notre propre langue Pourtant lrsquoutilisation de cesfameuses chaicircnes a longtemps eacuteteacute source de difficulteacutes

Les mots neacutecessitent un type de donneacutees particulier du fait qursquoun mot possegravede par natureun nombre quelconque de caractegraveres Agrave la diffeacuterence des formats int double ou char leschaicircnes de caractegraveres ne peuvent a priori ecirctre repreacutesenteacutees par un nombre fixe de casesmeacutemoire

Deacuteclaration drsquoune chaicircne de caractegraveres

Tout comme nous deacuteclarons des variables pour stocker des valeurs entiegraveres ou reacuteellesnous devons deacuteclarer une variable pour meacutemoriser la suite des caractegraveres drsquoun mot oudrsquoune phrase Le type de cette variable est le type String

Le type String nrsquoest pas un type simple puisqursquoil permet de regrouper sous un seul nomde variable plusieurs donneacutees crsquoest-agrave-dire lrsquoensemble des caractegraveres drsquoun mot

Pour eacuteviter les difficulteacutes lieacutees agrave la variation du nombre de caractegraveres dans un mot lelangage Java fixe la longueur du mot en fonction de sa deacuteclaration Cela fait le contenudu mot ne peut plus ecirctre modifieacute En deacuteclarant un objet de type String il est possible enmecircme temps de lrsquoinitialiser en lui affectant des caractegraveres placeacutes entre guillemets

La deacuteclaration suivante permet de creacuteer un objet appeleacute mot qui contient la chaicircne decaractegraveres exemple

String mot = exemple

Remarquons que la variable mot nrsquoest pas un ensemble de sept cases meacutemoire contenantles sept caractegraveres du mot exemple Lors de la deacuteclaration de la variable mot lrsquointerpreacute-teur Java creacutee une case qui contient lrsquoadresse de la case ougrave se trouve le premier caractegraveredu mot exemple (voir Figure 7-1)

Lorsque lrsquoordinateur souhaite afficher la variable mot il va rechercher lrsquoinformation sesituant agrave lrsquoadresse stockeacutee dans la case meacutemoire mot On dit alors que la variable motpointe sur la case qui contient la suite de caractegraveres

Figure 7ndash1

Seul un objet de type String contenant le mot exemple existe mot et second font tous deux reacutefeacuterence agrave cet objet unique

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

151

Les variables de type String ne contiennent pas directement lrsquoinformation qui les carac-teacuterise mais seulement lrsquoadresse ougrave trouver cette information Degraves lors ces variables nesrsquoappellent plus des variables mais des objets

Les objets au sens de la programmation objet ne sont pas des laquo variables raquo de typesimple (int long double char etc) Ils correspondent agrave un type qui permet deregrouper plusieurs donneacutees sous une mecircme adresse

Lorsqursquoun objet second est deacuteclareacute comme ci-dessous il contient la mecircme adresse (reacutefeacute-rence) que lrsquoobjet mot

String second = mot

Si le programme modifie le contenu de lrsquoobjet mot en lui affectant par exemple unenouvelle chaicircne lrsquointerpreacuteteur ne modifie pas la case pointeacutee par mot dans la mesure ougravepar deacutefinition le contenu drsquoun mot ne peut ecirctre modifieacute

mot = nouveau

Il creacutee en reacutealiteacute une nouvelle adresse et lui associe la nouvelle chaicircne de caractegraveresPour notre exemple lrsquoobjet mot est associeacute agrave la chaicircne de caractegraveres rsquonouveaursquo etsecond reste associeacute agrave rsquoexemplersquo

Les diffeacuterentes meacutethodes de la classe StringLrsquoutilisation des mots dans un programme est aujourdrsquohui incontournable Il ne srsquoagitcertes pas simplement drsquoafficher des mots mais de les traiter de la faccedilon la plus intelli-gente possible Ces traitements sont par exemple le tri alphabeacutetique ou encore larecherche de mots particuliers dans un texte

Pour reacutealiser ces opeacuterations la langage Java propose un ensemble de meacutethodes preacutedeacutefi-nies Les meacutethodes drsquoune classe sont comparables aux fonctions mais la terminologielaquo objet raquo les appelle meacutethodes

Ces meacutethodes offrent la possibiliteacute de traiter rapidement et simplement lrsquoinformationtextuelle Nous deacutecrivons ci-dessous regroupeacutees par thegraveme une grande partie desmeacutethodes deacutefinies dans la classe String Nous donnons en exemple pour chaque thegravemeun programme qui utilise ces meacutethodes

Figure 7ndash2

La modification de mot entraicircne la creacuteation drsquoune nouvelle chaicircne de caractegraveres et drsquoune nouvelle reacutefeacuterence automatiquement attribueacutees agrave mot Lrsquoobjet second conserve la preacuteceacutedente reacutefeacuterence

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

152

Recherche de mots et de caractegraveres

Exemple de recherche de mots et de caractegraveres

public class Rechercher public static void main(String [] argument) String phrase = Mieux vaut tard que jamais String soumo = int place Systemoutprintln(Vous avez dit + phrase) soumo = phrasesubstring(1115) Systemoutprintln(De 11 a 15 la sous chaine est + soumo) for ( int i = 0 i lt 5 i++) Systemoutprintln(en + i + il y a + phrasecharAt(i))

Systemoutprintln(Entrez un mot ) soumo = LireS()

if(phraseendsWith(soumo)) Systemoutprintln(La phrase se termine avec + soumo) else Systemoutprintln(La phrase ne finit pas avec + soumo)

place = phraseindexOf(soumo) if (place == -1) Systemoutprintln(Ce mot nrsquoexiste pas dans + phrase) else Systemoutprintln(soumo+ est a la position + place)

Opeacuteration Fonction Java

Recherche si le mot se termine par le ou les caractegraveres passeacutes en paramegravetres endsWith()

Recherche si le mot commence par le ou les caractegraveres passeacutes en paramegravetres startsWith()

Recherche le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Le premier carac-tegravere occupe la position 0 et le dernier la position length()-1 (voir ci-dessous la des-cription de length())

charAt()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir du deacutebut du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

indexOf()

Localise un caractegravere ou une sous-chaicircne dans un mot agrave partir de la fin du mot Ren-voie la valeur ndash1 si le caractegravere ou la chaicircne rechercheacute ne fait pas partie du mot

lastIndexOf()

Extrait une sous-chaicircne drsquoun mot substring()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

153

Reacutesultat de lrsquoexeacutecution

Exeacutecution 1

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot tardLa phrase ne finit pas avec ttaarrdd

tard est a la position 11

Phrase et soumo sont deux objets de type String initialiseacutes respectivement agrave Mieuxvaut tard que jamais et (mot ne comportant pas de caractegravere)

Lrsquoinstruction soumo = phrasesubstring(1115) recherche la sous-chaicircne situeacutee entreles caractegraveres 11 et 15 de lrsquoobjet phrase Cela fait elle place lrsquoensemble de ces caractegraveresdans lrsquoobjet soumo

Gracircce agrave lrsquoinstruction phrasecharAt(i) placeacutee dans lrsquoinstruction drsquoaffichageSystemoutprint le programme affiche les cinq premiers caractegraveres de lrsquoobjet phrasei variant de 0 agrave 4

Ensuite phraseendsWith(soumo) permet de savoir si lrsquoobjet phrase se termine avec lasuite de caractegraveres saisie au clavier et stockeacutee dans lrsquoobjet soumo Le reacutesultat de lameacutethode endsWith() est true si la chaicircne se termine par lrsquoargument et false dans le cascontraire Pour notre exemple soumo vaut tard et la meacutethode retourne false Leprogramme exeacutecute donc lrsquoinstruction placeacutee dans le bloc else associeacute au testif(phrase endsWith(soumo))

Pour finir lrsquoinstruction phraseindexOf(soumo) recherche si lrsquoobjet soumo est contenudans lrsquoobjet phrase Si tel est le cas elle retourne la position du premier caractegravere trouveacutesinon elle retourne ndash1 Ici tard est deacutetecteacute dans mieux vaut tard que jamais enposition 11

Exeacutecution 2

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot maisLa phrase se termine avec mmaaiiss

mais est a la position 22copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

154

Si lrsquoutilisateur saisit mais au lieu de tard le test if (phraseendsWith(soumo)) estvrai la meacutethode endsWith()retournant true Le programme exeacutecute donc lrsquoinstructionplaceacutee dans le bloc if

Exeacutecution 3

Vous avez dit Mieux vaut tard que jamaisDe 11 a 15 la sous chaine est tardEn 0 il y a MEn 1 il y a iEn 2 il y a eEn 3 il y a uEn 4 il y a xEntrez un mot OOKKLa phrase ne finit pas avec OKCe mot nrsquoexiste pas dans Mieux vaut tard que jamais

Si lrsquoutilisateur saisit OK au lieu de mais le test if (phraseendsWith(soumo)) estfaux et la meacutethode endsWith() retourne false Le programme exeacutecute lrsquoinstructionplaceacutee dans le bloc else De plus lrsquoinstruction phraseindexOf(soumo) retourne ndash1car OK nrsquoest pas deacutetecteacute dans mieux vaut tard que jamais Le programme exeacutecutealors le bloc else associeacute

Comparaison de mots

Exemple de comparaison de mots

public class Comparer public static void main(String [] argument) String prvb1 = Le mieux est lrsquoennemi du bien String prvb2 =Le Mieux Est lrsquoEnnemi du bien

Opeacuteration Fonction Java

Compare deux mots et retourne une valeur bull Nulle si les deux mots sont identiquesbull Positive si le premier mot est plus grand (placeacute apregraves) le deuxiegraveme mot (dans le dictionnaire)bull Neacutegative si le premier mot est plus petit (placeacute avant) le deuxiegraveme mot (dans le dictionnaire)

compareTo()

Compare la valeur de deux mots Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equals()

Compare la valeur de deux mots sans diffeacuterencier les majuscules des minus-cules Elle retourne true si les deux chaicircnes sont identiques et false dans le cas contraire

equalsIgnoreCase()

Deacutetermine si deux portions de chaicircnes sont identiques Dans lrsquoaffirmative elle renvoie true

regionMatches()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

155

Systemoutprintln(1 + prvb1) Systemoutprintln(2 + prvb2) Systemoutprintln(Comparons les 10 premiers caracteres )

Systemoutprint(En tenant compte des majuscules ) if (prvb1regionMatches(false 0 prvb2 0 10)) Systemoutprintln(Les 10 premiers cars sont identiques) else Systemoutprintln(Il y a des differences sur les 10 premiers cars) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1regionMatches(18 prvb2 18 6)) Systemoutprintln(Les cars de 18 a 24 sont identiques) else Systemoutprintln(Il y a des differences)

if (prvb1compareTo(prvb2) == 0) Systemoutprintln(Les deux chaines sont identiques) else if (prvb1compareTo(prvb2) lt 0) Systemoutprint(prvb1 + est avant + prvb2) else Systemoutprint(prvb1 + est apres + prvb2) Systemoutprintln(dans le dictionnaire) Systemoutprint(Sans tenir compte des majuscules ) if (prvb1equalsIgnoreCase(prvb2)) Systemoutprintln(Les deux chaines sont identiques) else Systemoutprintln(Les deux chaines sont differentes)

Reacutesultat de lrsquoexeacutecution

1 Le mieux est lrsquoennemi du bien 2 Le Mieux Est lrsquoEnnemi du bien Comparons les 10 premiers caracteres En tenant compte des majuscules Il y a des differences sur les 10 premierscarsSans tenir compte des majuscules Les cars de 18 a 24 sont identiquesLe mieux est lrsquoennemi du bien est apres Le Mieux Est lrsquoEnnemi du bien dansle dictionnaireSans tenir compte des majuscules Les deux chaines sont identiques

Les objets prvb1 et pvrb2 sont initialiseacutes respectivement agrave Le mieux est lrsquoennemi dubien et Le Mieux Est lrsquoEnnemi du bien

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

156

La meacutethode regionMatches() srsquoutilise soit avec quatre paramegravetres soit avec cinq para-megravetres Dans ce programme nous donnons en exemple les deux appels possibles

bull Le premier appel agrave la meacutethode utilise cinq paramegravetres (regionMatches(false 0prvb2 0 10)) Le premier paramegravetre est un booleacuteen qui srsquoil est eacutegal agrave falsepermet de reacutealiser la comparaison des deux mots en tenant compte de la preacutesence desmajuscules Pour notre cas la meacutethode deacutetermine si les deux portions de chaicircne prvb1et pvrb2 (correspondant au troisiegraveme paramegravetre de la meacutethode) sont identiques entenant compte des majuscules

Cette recherche est reacutealiseacutee agrave partir de la valeur speacutecifieacutee par le deuxiegraveme paramegravetre(soit 0 crsquoest-agrave-dire le premier caractegravere de prvb1) Le quatriegraveme paramegravetre repreacutesentela position du premier caractegravere agrave comparer dans lrsquoobjet prvb2 Le cinquiegraveme est lenombre de caractegraveres conseacutecutifs agrave comparer Pour notre exemple le programmerecherche srsquoil y a des similitudes entre prvb1 et prvb2 agrave partir du deacutebut des deuxmots et ce sur les dix caractegraveres suivants

bull Le deuxiegraveme appel agrave la meacutethode est composeacute de quatre paramegravetres (regionMat-ches(18 prvb2 18 6)) En fait ces quatre paramegravetres correspondent aux quatrederniers paramegravetres de lrsquoappel deacutecrit preacuteceacutedemment Le booleacuteen figurant dans lrsquoappelpreacuteceacutedant nrsquoexiste plus car par deacutefaut cette meacutethode travaille sans tenir compte desmajuscules Elle est donc eacutequivalente agrave lrsquoappel de la meacutethode suivante prvb1regionMatches(true 18 prvb2 18 6)

Ensuite lrsquoinstruction prvb1compareTo(prvb2) compare les objets prvb1 et prvb2 etdeacutetermine srsquoils sont identiques ou placeacutes avant ou apregraves dans lrsquoordre alphabeacutetique

Pour finir lrsquoinstruction prvb1equalsIgnoreCase(prvb2) veacuterifie si les deux objetsprvb1 et prvb2 sont identiques ou non sans tenir compte de la preacutesence des majuscules

Transformation de formats

Exemple de transformation de format

public class Transformer public static void main(String [] argument)

Opeacuteration Fonction Java

Transforme en minuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toLowerCase()

Transforme en majuscules la chaicircne sur laquelle la meacutethode est appliqueacutee toUpperCase()

La meacutethode place (concategravene) la chaicircne speacutecifieacutee en paramegravetre agrave la suite de la chaicircne sur laquelle la meacutethode est appliqueacutee

concat()

Remplace systeacutematiquement dans la chaicircne sur laquelle la meacutethode est appliqueacutee tous les caractegraveres donneacutes en premier argument par le caractegravere donneacute en deuxiegraveme argument

replace()

Calcule le nombre de caractegraveres de la chaicircne sur laquelle la meacutethode est appliqueacutee length()

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

157

String phrase = Qui dort String verbe = dine String p1 = p2 = p3 = p4 = int nbcar Systemoutprintln(1 + phrase) Systemoutprintln(2 + verbe) p1 = phrasetoUpperCase() Systemoutprintln(En majuscules + p1) p2 = phrasetoLowerCase() Systemoutprintln(En minuscules + p2) p3 = phraseconcat(verbe) nbcar = p3length() Systemoutprint(Apres concat() ) Systemoutprintln(p3 + possede + nbcar + caracteres) p4 = p3replace(rsquoirsquorsquoarsquo) Systemoutprintln(Apres replace() + p3 + devient + p4)

Reacutesultat de lrsquoexeacutecution

1 Qui dort2 dine En majuscules QUI DORT En minuscules qui dort Apres concat() Qui dort dine possede 13 caracteresApres replace() Qui dort dine devient Qua dort dane

Les objets phrase et verbe sont initialiseacutes respectivement agrave Qui dort et dineLrsquoinstruction p1 = phrasetoUpperCase() transforme en majuscules le contenu dephrase et place cette transformation dans lrsquoobjet p1

Lrsquoinstruction p2 = phrasetoLowerCase() place dans p2 le contenu de phrase trans-formeacute en minuscules Notons que pour chacune de ces instructions lrsquoobjet phrase nrsquoestjamais modifieacute

Lrsquoinstruction p3 = phraseconcat(verbe) place en bout de lrsquoobjet phrase le motcontenu dans verbe Cela fait le reacutesultat de cette opeacuteration est affecteacute agrave lrsquoobjet p3Lrsquoobjet phrase nrsquoest pas modifieacute

Ensuite lrsquoinstruction nbcar = p3length() calcule la longueur de lrsquoobjet p3 crsquoest-agrave-dire le nombre de caractegraveres constituant lrsquoobjet p3

Pour finir lrsquoinstruction p4 = p3replace(rsquoirsquo rsquoarsquo) remplace tous les caractegraveres rsquoirsquode p3 par des rsquoarsquo et place le reacutesultat de cette transformation dans lrsquoobjet p4 Lrsquoobjet p3nrsquoest pas modifieacute

Appliquer une meacutethode agrave un objet Lrsquoobservation des exemples preacuteceacutedents montre que lrsquoappel drsquoune meacutethode de la classeString ne srsquoeacutecrit pas comme une simple instruction drsquoappel agrave une meacutethode (fonction)telle que nous lrsquoavons eacutetudieacutee jusqursquoagrave preacutesent

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

158

Comparons lrsquoappel agrave une meacutethode de la classe Math agrave celui drsquoune meacutethode de la classeString

Par exemple pour calculer la valeur absolue drsquoune variable x les instructions sont lessuivantes

double x = 4 yy = Mathabs(x)

Pour transformer un mot en lettres majuscules les instructions sont

String mot = petit MOTMOT = mottoUpperCase()

Comme nous le constatons dans le premier cas la fonction Mathabs() srsquoapplique agrave lavariable x en passant la valeur de x en paramegravetre En effet les variables x et y ne sont pasdes objets au sens de la programmation objet Elles sont de type double et repreacutesententsimplement le nom drsquoune case meacutemoire dans laquelle lrsquoinformation est stockeacutee Aucunemeacutethode aucun traitement ne sont associeacutes agrave cette information

Dans la seconde eacutecriture la meacutethode toUpperCase() est appliqueacutee agrave lrsquoobjet mot parlrsquointermeacutediaire drsquoun point () placeacute entre le nom de lrsquoobjet et la meacutethode Les objets motet MOT ne peuvent ecirctre consideacutereacutes comme des variables Ils sont de type String Lrsquoinfor-mation repreacutesenteacutee par ce type nrsquoest pas simple Elle repreacutesente (voir Figure 7-3) leseacuteleacutements suivants

bull Drsquoune part une reacutefeacuterence (une adresse) vers un ensemble de caractegraveres stockeacutes dansplusieurs cases meacutemoire distinctes

bull Drsquoautre part un ensemble de meacutethodes propres qui lui sont applicables Ces meacutethodessont lrsquoeacutequivalent drsquoune boite agrave outils qui opegravere uniquement sur les objets de typeString

Quelle qursquoelle soit une classe correspond agrave un type qui speacutecifie une association dedonneacutees (informations ou valeurs de tout type) et de meacutethodes (outils drsquoaccegraves et de trans-formation des donneacutees) Ces meacutethodes deacutefinies agrave lrsquointeacuterieur drsquoune classe ne peuventsrsquoappliquer qursquoaux donneacutees de cette mecircme classe

Gracircce agrave cette association une classe permet la deacutefinition de nouveaux types de donneacuteesqui structurent lrsquoinformation agrave traiter (voir dans ce chapitre la section laquo Construire etutiliser ses propres classes raquo)

Figure 7ndash3

La classe String deacutefinit lrsquoassociation de donneacutees et de meacutethodes applicables agrave ces donneacutees

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

159

Principes de notation

Agrave cause de cette diffeacuterence fondamentale de repreacutesentation de lrsquoinformation lrsquoemploides meacutethodes agrave travers les objets utilise une syntaxe particuliegravere

Pour un objet de type String cette syntaxe est la suivante

Deacuteclaration et initialisationString objet = La meacutethode srsquoapplique agrave objetobjetnomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

Pour appliquer une meacutethode agrave un objet il suffit de placer derriegravere le nom de lrsquoobjet unpoint suivi du nom de la meacutethode et de ces paramegravetres Remarquons que par conven-tion

bull Tout nom de meacutethode commence par une minuscule

bull Si le nom de la meacutethode est composeacute de plusieurs mots ceux-ci voient leur premiercaractegravere passer en majuscule

bull Le nom drsquoune classe commence toujours par une majuscule

Gracircce agrave cette eacutecriture lrsquoobjet est associeacute agrave la meacutethode de faccedilon agrave pouvoir modifierlrsquoinformation (les donneacutees) contenue dans lrsquoobjet Cette technique permet de reacutecupeacutererles diffeacuterentes donneacutees modifieacutees localement par une meacutethode Elle est le principe debase du concept drsquoobjet deacutecrit et commenteacute au chapitre suivant

Construire et utiliser ses propres classes Lrsquoeacutetude de la classe String montre qursquoune classe correspond agrave un type de donneacutees Cetype est composeacute de donneacutees et de meacutethodes exploitant ces donneacutees La classe Stringest un type preacutedeacutefini du langage Java

Il existe drsquoautres types preacutedeacutefinis de classes dans le langage Java Ces classes sont desoutils preacutecieux et efficaces qui simplifient le deacuteveloppement des applications Diffeacute-rentes classes sont examineacutees dans la troisiegraveme partie de cet ouvrage

Lrsquointeacuterecirct des classes reacuteside aussi dans la possibiliteacute de deacutefinir des types structureacutespropres agrave un programme Gracircce agrave cette faculteacute le programme se deacuteveloppe de faccedilon plussucircre les objets qursquoil utilise eacutetant deacutefinis en fonction du problegraveme agrave reacutesoudre

Avant drsquoeacutetudier reacuteellement lrsquointeacuterecirct de la programmation objet et ses conseacutequences surles modes de programmation (voir le chapitre 8 laquo Les principes du concept drsquoobjet raquo)nous examinons dans les sections qui suivent comment creacuteer des types speacutecifiques etutiliser les objets associeacutes agrave ces nouveaux types

Deacutefinir une classe et un type

Deacutefinir une classe crsquoest construire un type structureacute de donneacutees Avant de comprendreles avantages drsquoune telle construction nous abordons ici la notion de type structureacute (etdonc de classe) drsquoun point de vue syntaxique

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

160

Pour deacutefinir un type il suffit drsquoeacutecrire une classe qui par deacutefinition est constitueacutee dedonneacutees et de meacutethodes (voir Figure 7-3) La construction drsquoune classe est reacutealiseacutee selonles deux principes suivants

1 Deacutefinition des donneacutees agrave lrsquoaide drsquoinstructions de deacuteclaration de variables etoudrsquoobjets Ces variables sont de type simple tel que nous lrsquoavons utiliseacute jusqursquoagravepreacutesent (int char etc) ou de type composeacute preacutedeacutefini ou non (String etc)

Ces donneacutees deacutecrivent les informations caracteacuteristiques de lrsquoobjet que lrsquoon souhaitedeacutefinir Elles sont aussi appeleacutees communeacutement champ attribut ou membre de laclasse

2 Construction des meacutethodes deacutefinies par le programmeur Ce sont les meacutethodesassocieacutees aux donneacutees Elles se construisent comme de simples fonctions compo-seacutees drsquoun en-tecircte et drsquoinstructions comme nous lrsquoavons vu aux chapitres preacuteceacutedents

Ces meacutethodes repreacutesentent tous les traitements et comportements de lrsquoobjet que lrsquooncherche agrave deacutecrire

En deacutefinissant de nouveaux types nous deacuteterminons les caracteacuteristiques propres auxobjets que lrsquoon souhaite programmer Un type drsquoobjet correspond agrave lrsquoensemble desdonneacutees traiteacutees par le programme regroupeacutees par thegraveme

Un objet peut ecirctre une personne si lrsquoapplication agrave deacutevelopper gegravere le personnel drsquounesocieacuteteacute ou un livre srsquoil srsquoagit drsquoune application destineacutee agrave la gestion drsquoune biblio-thegraveque Remarquons que lrsquoobjet personne peut aussi ecirctre utiliseacute dans le cadre drsquoun logi-ciel pour bibliothegraveque puisqursquoun lecteur empruntant un livre est aussi une personne

Construire un type Cercle

Examinons sur un exemple simple la deacutemarche de construction drsquoun type structureacuteObservons pour cela comment construire le type de donneacutees qui deacutecrive au mieux larepreacutesentation drsquoun cercle quelconque

Cette reacutealisation passe par deux eacutetapes laquo Rechercher les caracteacuteristiques propres agrave toutcercle raquo et laquo Deacutefinir le comportement de tout cercle raquo

Rechercher les caracteacuteristiques propres agrave tout cercle

Drsquoune maniegravere geacuteneacuterale tout cercle est deacutefini gracircce agrave son rayon Si lrsquoon souhaite afficherce cercle il est en outre neacutecessaire de connaicirctre sa position agrave lrsquoeacutecran Pour simplifiernous supposons que la position drsquoun cercle soit deacutetermineacutee gracircce aux coordonneacutees deson centre

Les caracteacuteristiques drsquoun cercle sont son rayon et sa position agrave lrsquoeacutecran crsquoest-agrave-dire lescoordonneacutees en x (abscisse) et en y (ordonneacutee) du centre du cercle Ces trois donneacuteessont repreacutesentables agrave lrsquoaide de valeurs numeacuteriques que nous choisissons pour simplifierde type int

Pour deacuteclarer les donneacutees drsquoun cercle nous eacutecrivons les deacuteclarations suivantes

public int x y position du centre du cerclepublic int r rayon

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

161

Deacutefinir le comportement de tout cercle

Drsquoun point de vue informatique plusieurs opeacuterations peuvent ecirctre appliqueacutees agrave uncercle Un cercle peut ecirctre deacuteplaceacute ou agrandi (voir les meacutethodes deacuteplacer() etagrandir() dans le code source ci-dessous) Ces opeacuterations modifient la valeur du rayonou des coordonneacutees du centre du cercle agrave lrsquoeacutecran

Crsquoest pourquoi il est neacutecessaire de deacutefinir une meacutethode qui affiche agrave lrsquoeacutecran les donneacutees(rayon position) drsquoun cercle avant ou apregraves transformation (voir la meacutethode affi-cher()dans le code source ci-dessous)

La meacutethode de calcul du peacuterimegravetre drsquoun cercle peut ecirctre utile (voir la meacutethode peacuteri-megravetre() dans le code source ci-dessous)

La classe descriptive du type Cercle

public class Cercle public int x y position du centre public int r rayon

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Cercle centre en + x + + y) Systemoutprintln( de rayon + r)

public double peacuterimegravetre() Calcul du peacuterimegravetre drsquoun cercle return 2MathPIr public void deacuteplacer(int nx int ny) Deacuteplace le centre du cercle en (nx ny) Ces coordonneacutees eacutetant x = nx passeacutees en paramegravetres de la fonction y = ny public void agrandir(int nr) Augmente la valeur courante du rayon avec la valeur passeacutee en paramegravetre r = r + nr Fin de la classe Cercle

La classe Cercle deacutecrite agrave lrsquointeacuterieur drsquoun fichier appeleacute Cerclejava deacutefinit un type dedonneacutees composeacute de trois attributs caracteacuteristiques des cercles agrave savoir la position ducentre en abscisse et ordonneacutee et le rayon ainsi que quatre comportements diffeacuterents Sadescription par bloc est repreacutesenteacutee agrave la Figure 7-4

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

162

Quelques observations

Suivant la description de la Figure 7-4 nous constatons que les donneacutees x y et r sontdeacuteclareacutees en dehors de toute fonction Par conseacutequent chaque meacutethode a accegraves agrave toutmoment aux valeurs qursquoelle contient soit pour les consulter soit pour les modifier

Les meacutethodes afficher() et peacuterimegravetre() ne font que consulter le contenu des donneacuteesx y et r pour les afficher ou les utiliser en vue drsquoobtenir un nouveau reacutesultat

Au contraire les meacutethodes deacuteplacer() et agrandir() modifient le contenu des donneacuteesx y et r Ces modifications reacutealiseacutees agrave lrsquointeacuterieur drsquoune meacutethode sont aussi visiblesdepuis les autres meacutethodes de la classe

Il existe donc deux types de meacutethodes les meacutethodes qui permettent drsquoacceacuteder auxdonneacutees de la classe et celles qui modifient ces donneacutees

Voir au chapitre 8 laquo Les principes du concept drsquoobjet raquo la section laquo Les meacutethodes drsquoaccegraves auxdonneacutees raquo

En comparant les programmes construits aux chapitres preacuteceacutedents agrave celui-ci nous cons-tatons les deux diffeacuterences fondamentales suivantes

bull Le mot-cleacute static a disparu de toutes les instructions de deacuteclaration Cette disparitionnrsquoest pas sans conseacutequence sur le deacuteroulement du programme Elle permet de creacuteernon plus de simples variables mais des objets (voir au chapitre 8 laquo Les principes duconcept drsquoobjet raquo la section laquo Les donneacutees static raquo)

bull Une classe deacutefinissant un type structureacute ne possegravede pas de fonction main() La deacutefini-tion drsquoune classe nrsquoest pas la mecircme chose que la reacutealisation drsquoune application Uneclasse est une entiteacute agrave part entiegravere qui deacutefinit globalement de quoi est constitueacute unobjet et preacutecise les opeacuterations qursquoil est possible de lui appliquer

Figure 7ndash4

Les donneacutees x y et r du type Cercle sont deacuteclareacutees en dehors de toute fonction Nrsquoimporte quelle modification de ces donneacutees est donc visible par lrsquoensemble des meacutethodes de la classe

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

163

Bien entendu une classe est deacutefinie pour ecirctre utiliseacutee dans un programme exeacutecutable(une application) qui contient une fonction main() Nous abordons plus en deacutetail cetteopeacuteration agrave la section suivante

Deacutefinir un objetApregraves avoir deacutefini un nouveau type structureacute lrsquoeacutetape suivante consiste agrave eacutecrire une applica-tion qui utilise effectivement un laquoobjetraquo de ce type Pour cela le programmeur doit deacuteclarerles objets utiles agrave lrsquoapplication et faire en sorte que lrsquoespace meacutemoire neacutecessaire soit reacuteserveacute

Deacuteclarer un objet

Cette opeacuteration simple srsquoeacutecrit comme une instruction de deacuteclaration avec cette diffeacute-rence que le type de la variable nrsquoest plus un type simple preacutedeacutefini mais un type structureacutetel que nous lrsquoavons construit preacuteceacutedemment Ainsi dans

Deacuteclaration drsquoun objet choseTypeDeLrsquoObjet chose

TypeDeLrsquoObjet correspond agrave une classe deacutefinie par le programmeur Pour notre exemplela deacuteclaration drsquoun cercle A est reacutealiseacutee par lrsquoinstruction

Cercle A

Cette deacuteclaration creacutee une case meacutemoire nommeacutee A destineacutee agrave contenir une reacutefeacuterencevers lrsquoadresse ougrave sont stockeacutees les informations concernant le cercle A Agrave ce stadeaucune adresse nrsquoest encore deacutetermineacutee

Reacuteserver lrsquoespace meacutemoire agrave lrsquoaide de lrsquoopeacuterateur new

Agrave cette eacutetape les informations caracteacuterisant lrsquoobjet A ne peuvent ecirctre stockeacutees carlrsquoespace meacutemoire servant agrave ce stockage nrsquoest pas encore reacuteserveacute Crsquoest lrsquoopeacuterateur newqui reacutealise cette reacuteservation

Lrsquoopeacuterateur new est un programme Java qui gegravere de lui-mecircme la reacuteservation de lrsquoespacemeacutemoire Lorsqursquoon applique cet opeacuterateur agrave un objet il deacutetermine combien drsquooctets luisont neacutecessaires pour stocker lrsquoinformation contenue dans la classe

Cet opeacuterateur srsquoapplique en eacutecrivant agrave la suite du terme new le nom du type de lrsquoobjetdeacuteclareacute suivi de deux parenthegraveses

Reacuteserver de lrsquoespace meacutemoire pour lrsquoobjet chosechose = new TypeDeLrsquoObjet()

Figure 7ndash5

La deacuteclaration drsquoun objet reacuteserve une case meacutemoire destineacutee agrave contenir lrsquoadresse meacutemoire ougrave seront stockeacutees les informations Lrsquoespace meacutemoire et lrsquoadresse ne sont pas encore reacuteserveacutes pour reacutealiser ce stockage

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

164

Pour notre exemple la reacuteservation de lrsquoespace meacutemoire pour deacutefinir le cercle A srsquoeacutecrit

A = new Cercle()

Remarquons qursquoil est possible de deacuteclarer et de reacuteserver de lrsquoespace meacutemoire en uneseule instruction

Cercle A = new Cercle()

En eacutecrivant une telle instruction nous observons que pour chaque objet deacuteclareacute lrsquoopeacutera-teur new reacuteserve suffisamment drsquoespace meacutemoire pour stocker les donneacutees de la classe etpour copier les meacutethodes associeacutees Il deacutetermine aussi lrsquoadresse ougrave sera stockeacutelrsquoensemble de ces informations (lrsquoespace meacutemoire pour lrsquoobjet A est illustreacute agrave laFigure 7-6)

Lors de cette reacuteservation lrsquointerpreacuteteur initialise les donneacutees de la classe agrave 0 pour lesentiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les char et agrave null pour les String Pour notreexemple A est un cercle de rayon nul centreacute en (0 0)

Lrsquoobjet ainsi deacutefini est un repreacutesentant particulier de la classe caracteacuteriseacute par lrsquoensemblede ses donneacutees Dans le jargon informatique on dit que lrsquoobjet A est une instance de laclasse Cercle Les donneacutees qui le caracteacuterisent agrave savoir x y et r sont appeleacutees desvariables drsquoinstance

Une instance est donc en meacutemoire un programme agrave part entiegravere composeacute de variableset de fonctions Sa structure est telle qursquoil ne peut srsquoexeacutecuter et se transformer (crsquoest-agrave-dire modifier ses propres donneacutees) qursquoagrave lrsquointeacuterieur de cet espace Crsquoest pourquoi il estconsideacutereacute comme une entiteacute indeacutependante ou laquo objet raquo

Manipuler un objet

Lrsquoobjet ainsi deacutefini est entiegraverement deacutetermineacute par ses donneacutees et ses meacutethodes Il est degraveslors possible de modifier les valeurs qui le caracteacuterisent et drsquoexploiter ses meacutethodes

Figure 7ndash6

Pour chaque objet creacuteeacute lrsquoopeacuterateur new reacuteserve un espace meacutemoire suffisamment grand pour y stocker les donneacutees et les meacutethodes descriptives de la classe Lrsquoadresse est alors deacutetermineacutee

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

165

Acceacuteder aux donneacutees de la classe

Pour acceacuteder agrave une donneacutee de la classe de faccedilon agrave la modifier il suffit drsquoeacutecrire

Acceacuteder agrave un membre de la classechosenomDeLaDonneacutee = valeur du bon type

en supposant que le champ nomDeLaDonneacutee soit deacutefini dans la classe correspondant autype de lrsquoobjet chose

Pour notre exemple la saisie au clavier des valeurs caracteacuterisant le cercle A srsquoeacutecrit de lafaccedilon suivante

Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon )Ar = Lirei()

Les cases meacutemoire repreacutesentant les variables drsquoinstance (x y et r) de lrsquoobjet A sont acces-sibles via lrsquoopeacuterateur point ()

Acceacuteder aux meacutethodes de la classe

Pour appliquer une meacutethode de la classe agrave un objet particulier la syntaxe utilise le mecircmeprincipe de notation

appliquer une meacutethode agrave lrsquoobjet chosechosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la meacutethode ait preacutealablement eacuteteacute deacutefinie pour le type de lrsquoobjet chosePour notre exemple lrsquoapplication de la meacutethode peacuterimegravetre() agrave lrsquoobjet A srsquoeacutecrit

double p = Apeacuterimegravetre()

Une application qui utilise des objets CercleLrsquoexemple suivant montre comment exploiter dans une application lrsquoensemble desdonneacutees et des meacutethodes deacutefinies dans la classe Cercle

Exemple code source complet

public class FaireDesCercles public static void main(String [] arg) Cercle A = new Cercle() Aaffiche() Systemoutprintln( Entrez la position en x ) Ax = Lirei() Systemoutprintln( Entrez la position en y ) Ay = Lirei() Systemoutprintln( Entrez le rayon ) Ar = Lirei()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

166

Aaffiche() double p = Apeacuterimegravetre() Systemoutprintln( Votre cercle a pour perimetre + p) Adeacuteplacer(5 10) Systemoutprintln( Apres deplacement ) Aaffiche() Aagrandir(10) Systemoutprintln( Apres agrandissement ) Aaffiche()

Compilation et exeacutecution drsquoune application multifichiers

Lrsquoapplication FaireDesCercles deacutecrite dans le fichier FaireDesCerclesjava utilise letype Cercle deacutefini dans le fichier Cerclejava Deux fichiers distincts sont donc neacuteces-saires agrave la deacutefinition drsquoun programme qui utilise des objets Cercle

Bien que cela puisse paraicirctre curieux pour un deacutebutant lrsquoapplication FaireDesCerclessrsquoexeacutecute correctement malgreacute cette seacuteparation des fichiers Examinons comment fonc-tionne lrsquoordinateur dans un tel cas

Nous lrsquoavons deacutejagrave observeacute (voir au chapitre introductif laquo Naissance drsquoun programme raquola section laquo Exeacutecuter un programme raquo) deux phases sont neacutecessaires pour exeacutecuter unprogramme Java la phase de compilation et la phase drsquointerpreacutetation Si lrsquoapplicationest conccedilue avec plusieurs fichiers ces deux phases sont aussi indispensables

Phase de compilation

Lors de la compilation drsquoun programme constitueacute de plusieurs fichiers la question sepose de savoir comment compiler lrsquoensemble de ces fichiers

Pour simplifier la tacircche de la personne qui deacuteveloppe des applications le compilateurJava est construit de faccedilon que seul le programme qui contient la fonction main() soit agravecompiler

Au cours de la compilation le compilateur constate de lui-mecircme au moment de la deacutecla-ration de lrsquoobjet que lrsquoapplication utilise des objets drsquoun type non preacutedeacutefini par lelangage Java

Agrave partir de ce constat il recherche dans le reacutepertoire ougrave se trouve lrsquoapplication qursquoilcompile le fichier dont le nom corresponde au nouveau type qursquoil vient de deacutetecter etdont lrsquoextension soit java Tout programme Java a pour nom le nom de la classe (du type)qursquoil deacutefinit

Pour notre exemple en compilant lrsquoapplication FaireDesCercles gracircce agrave la commande

javac FaireDesCerclesjava

le compilateur deacutetecte le type Cercle Il recherche alors le fichier Cerclejava dans lereacutepertoire ougrave se trouve lrsquoapplication

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

167

bull Si le compilateur trouve ce fichier il le compile aussi En fin de compilation deuxfichiers ont eacuteteacute traiteacutes FaireDesCerclesjava et Cerclejava Si le compilateur nedeacutetecte aucune erreur le reacutepertoire contient les fichiers correpondant au pseudo-codeet qui ont pour nom FaireDesCerclesclass et Cercleclass

bull Srsquoil ne trouve pas le fichier Cerclejava il provoque une erreur de compilation dutype Class Cercle not found

Pour corriger cette erreur il est possible de speacutecifier au compilateur ougrave il peut trouver lefichier rechercheacute en deacutefinissant une variable drsquoenvironnement classpath Cette variableindique au compilateur quels sont les reacutepertoires susceptibles de contenir desprogrammes Java Cette deacutefinition se reacutealise de faccedilon diffeacuterente suivant le systegravemeutiliseacute PC Macintosh ou station Unix (voir sur le CD-Rom la section laquo Construire sonenvironnement de travail raquo)

Phase drsquointerpreacutetation

Une fois le programme compileacute lrsquoexeacutecution du programme est reacutealiseacutee gracircce agrave lrsquointer-preacuteteur de la machine virtuelle Java (JVM) qui exeacutecute le pseudo-code associeacute auprogramme contenant la fonction main() Pour notre exemple la commande est

java FaireDesCercles

Lorsque lrsquointerpreacuteteur trouve en cours drsquoexeacutecution la deacuteclaration drsquoun objet de type nonpreacutedeacutefini il recherche par lrsquointermeacutediaire du chargeur de classe (un programme aussi appeleacuteclass loader deacutefini dans la JVM) le pseudo-code associeacute au type de lrsquoobjet et deacutefini dans unfichier dont lrsquoextension est class Pour notre exemple le chargeur de classe recherche lefichier Cercleclass Une fois trouveacute il charge le code en meacutemoire pour lrsquoexeacutecuter

Analyse des reacutesultats de lrsquoapplication

Au cours des sections preacuteceacutedentes nous avons observeacute que tout objet deacuteclareacute contenaitune adresse correspondant agrave lrsquoadresse ougrave sont stockeacutees les informations relatives agrave cetobjet Pour acceacuteder aux donneacutees et meacutethodes de chaque objet il suffit de passer parlrsquoopeacuterateur laquo raquo

Gracircce agrave cette nouvelle faccedilon de stocker lrsquoinformation les transformations drsquoun objet parlrsquointermeacutediaire drsquoune meacutethode de sa classe sont visibles pour tous les objets de la mecircmeclasse Autrement dit si une meacutethode fournit plusieurs reacutesultats ces modifications sontvisibles en dehors de la meacutethode et pour toute lrsquoapplication

Pour mieux comprendre cette technique examinons comment srsquoexeacutecute le programmeFaireDesCercles Les valeurs griseacutees correspondent aux valeurs saisies par lrsquoutilisateur

Entrez la position en x 1100Entrez la position en y 1100Entrez le rayon 55

Les valeurs saisies au clavier par lrsquoutilisateur sont directement stockeacutees en Ax Ay etAr gracircce aux instructions Ax = Lirei()

Cercle centre en 1010de rayon 5

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

168

La meacutethode afficher() est appliqueacutee agrave lrsquoobjet A (Aafficher()) Elle consulte etaffiche les donneacutees associeacutees agrave cet objet soit 10 pour x (en reacutealiteacute Ax) 10 pour y (enreacutealiteacute Ay) et 5 pour Az

Votre cercle a pour perimetre 3141592653589793

De la mecircme faccedilon la meacutethode peacuterimegravetre() est appliqueacutee agrave lrsquoobjet A (Apeacuterimegravetre())Lrsquoexpression 2MathPI r deacutefinie dans la meacutethode est donc calculeacutee pour r (Ar)valant 5

Apregraves deplacement Cercle centre en 5 2de rayon 5

Lrsquoinstruction Adeacuteplacer(5 2) passe les nouvelles coordonneacutees de la position du centredu cercle en paramegravetres Les donneacutees x et y de lrsquoobjet A sont modifieacutees en conseacutequence(voir Figure 7-7)

Apres agrandissement Cercle centre en 5 2de rayon 15

Lrsquoinstruction Aagrandir(10) passe en paramegravetre la valeur drsquoaccroissement du rayon ducercle La donneacutee r de lrsquoobjet A est augmenteacutee de cette valeur (voir Figure 7-7)

Agrave chaque appel de la meacutethode afficher() appliqueacutee agrave lrsquoobjet A les valeurs courantesdes donneacutees (x y et r) de lrsquoobjet A sont afficheacutees

Observons que lorsque lrsquoobjet A est deacuteplaceacute les deux coordonneacutees x et y de son centresont modifieacutees La meacutethode deacuteplacer() modifie le contenu des deux variablesdrsquoinstance x et y de lrsquoobjet A Cette transformation est visible en dehors de lrsquoobjet lui-mecircme puisque la meacutethode afficher() affiche agrave lrsquoeacutecran le reacutesultat de cette modification

Figure 7ndash7

Les meacutethodes appliqueacutees agrave un objet exploitent les donneacutees relatives agrave cet objet

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

169

ReacutesumeacuteLa classe String est une classe preacutedeacutefinie du langage Java qui deacutefinit deslaquo variables raquo contenant des suites de caractegraveres (des mots ou des chaicircnes de carac-tegraveres)

La classe String est un type de donneacutees composeacute de meacutethodes qui permettent larecherche de mots ou de caractegraveres dans un texte Les mots peuvent aussi ecirctrecompareacutes suivant lrsquoordre alphabeacutetique ou transformeacutes en drsquoautres formats

Lrsquoeacutetude des objets de type String montre qursquoune classe est une association de donneacutees(information ou valeur de tout type) et de meacutethodes (outils drsquoaccegraves et de transformationdes donneacutees) Deacutefinies dans une classe ces meacutethodes ne peuvent srsquoappliquer qursquoauxdonneacutees de cette mecircme classe

Le langage Java offre la possibiliteacute au programmeur de deacutevelopper ses propresclasses Construire une classe crsquoest deacutefinir un nouveau type Pour cela il est neacuteces-saire de proceacuteder de la faccedilon suivante

bull Deacuteterminer les caracteacuteristiques communes agrave ce que lrsquoon souhaite deacutecrire Ce sontles donneacutees les attributs les proprieacuteteacutes ou encore les membres de la classe

bull Deacutefinir toutes les opeacuterations et traitements reacutealisables sur ces eacuteleacutements Cesopeacuterations sont aussi appeleacutees meacutethodes ou encore comportements

Une classe deacutefinissant un type structureacute nrsquoest pas une application directement exeacutecu-table Elle ne contient pas de fonction main()

Les types structureacutes sont utiliseacutes dans les applications en deacuteclarant des laquo variables raquodont le type correspond au nom de la classe deacutefinie preacuteceacutedemment comme le montrelrsquoinstruction suivante

TypeDeLrsquoObjet chose = new TypeDeLrsquoObjet()

Lrsquoopeacuterateur new deacutetermine lrsquoadresse ougrave stocker les informations relatives agrave lavariable deacuteclareacutee Il reacuteserve lrsquoespace meacutemoire neacutecessaire pour stocker les donneacutees etles meacutethodes de la classe Les donneacutees sont initialiseacutees agrave 0 pour les entiers agrave 00pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pour tous les autres types struc-tureacutes

Agrave cette eacutetape la variable est appeleacutee un objet dans le jargon informatique Un objetest donc un eacuteleacutement particulier qui repreacutesente une classe deacutefinissant un type struc-tureacute On dit aussi que crsquoest une instance de la classe Les donneacutees (proprieacuteteacutes ou attri-buts) qui la deacutefinissent sont appeleacutees variables drsquoinstance

Lrsquoaccegraves aux variables drsquoinstance ainsi qursquoaux meacutethodes de la classe se fait parlrsquointermeacutediaire de lrsquoopeacuterateur point () comme le montre lrsquoexemple suivant

chosenomDeLaDonneacutee = valeur du bon type chosenomDeLaMeacutethode(liste des paramegravetres eacuteventuels)

en supposant que la donneacutee et la meacutethode aient eacuteteacute preacutealablement deacutefinies pour letype de lrsquoobjet chose

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

170

ExercicesUtiliser les objets de la classe String

Eacutecrivez un programme qui reacutealise les opeacuterations suivantes

a Demander la saisie drsquoune phrase

b Afficher la phrase en majuscules

c Compter le nombre de laquo a raquo dans la phrase puis srsquoil y en a transformer tous leslaquo a raquo en laquo raquo

d Tester si entre le cinquiegraveme caractegravere et le douziegraveme se trouve une seacutequence decaractegraveres preacutealablement saisie au clavier

Eacutecrivez un programme qui permet drsquoobtenir les actions suivantes

a Saisir des mots jusqursquoagrave ce que lrsquoutilisateur entre le mot laquo Fin raquo

b Afficher parmi les mot saisis le premier dans lrsquoordre alphabeacutetique

c Afficher parmi les mot saisis le dernier dans lrsquoordre alphabeacutetique

Le mot Fin ne doit pas ecirctre pris en compte dans la liste des mots saisis

Creacuteer une classe drsquoobjetsLrsquoobjectif est de deacutefinir une repreacutesentation drsquoun objet Personne

a Sachant qursquoune personne est deacutefinie agrave partir de son nom son preacutenom et son acircgedeacutefinissez les donneacutees de la classe Personne

b Eacutecrivez une application MesAmis qui utilise un objet Untel de type Personne etqui demande la saisie au clavier de ses nom preacutenom et acircge

Consulter les variables drsquoinstancePour deacutefinir les comportements drsquoun objet de type Personne

a Dans la classe Personne deacutecrivez la meacutethode preacutesentezVous() qui affiche lescaracteacuteristiques de la personne concerneacutee

b Modifiez lrsquoapplication de faccedilon agrave afficher les caracteacuteristiques de lrsquoobjet Untel

c Dans la classe Personne deacutecrivez la meacutethode quelEstVotreNom() qui permetde connaicirctre le nom de la personne concerneacutee

d Dans la classe Personne deacutecrivez la meacutethode quelEstVotreAge() qui permetde connaicirctre lrsquoacircge de la personne concerneacutee

e Modifiez lrsquoapplication de faccedilon agrave afficher le nom puis lrsquoacircge drsquoUntel

71

72

73

74

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

171

Analyser les reacutesultats drsquoune application objetPour bien comprendre ce que reacutealise lrsquoapplication FaireDesPoints observez lesdeux programmes suivants

public class Point Le fichier srsquoappelle Pointjava int x y public void creacuteer() Systemoutprint(Entrez lrsquoabscisse ) x = Lirei() Systemoutprint(Entrez lrsquoordonnee ) y = Lirei() public void afficher() Systemoutprintln(x + x + y + y) public void deacuteplacer( int nx int ny) x = nx y = ny fin de la class Point

public class FaireDesPoints Le fichier srsquoappelle FaireDesPointsjava public static void main( String [] arg) Point P = new Point() Pafficher() Pcreacuteer() P afficher() Pdeacuteplacer(10 12) Pafficher()

fin de la class FaireDesPoints

a Quel est le programme qui correspond agrave lrsquoapplication

b Quel est le programme deacutefinissant le type Point

c Recherchez les attributs de la classe Point et donnez leur nom

d Combien de meacutethodes sont-elles deacutefinies dans la classe Point Donnez leurnom

e Quels sont les objets utiliseacutes par lrsquoapplication FaireDesPoints Que valentleurs donneacutees x et y apregraves exeacutecution de lrsquoinstruction deacuteclaration

75

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

172

f Sur la repreacutesentation graphique ci-dessous placez pour lrsquoobjet P la valeur initialeainsi que le nom des meacutethodes

g Agrave lrsquoappel de la meacutethode creacuteer() comment les valeurs sont-elles affecteacutees auxattributs des objets concerneacutes Modifiez les cases concerneacutees sur la repreacutesenta-tion graphique

h Mecircme question pour la meacutethode deacuteplacer()

i Quel est le reacutesultat final de lrsquoapplication

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter les chaicircnes de caractegraveresLe type drsquoun compte et son numeacutero ne sont plus deacutefinis respectivement comme char etlong mais comme deux objets de type String Le type drsquoun compte peut donc prendremaintenant les thegravemes courant joint ou eacutepargne

a Saisissez le type du compte de faccedilon que lrsquoutilisateur entre au clavier C J ou E Leprogramme place dans la variable type les chaicircnes courant joint ou eacutepargne enfonction de la lettre saisie

b Saisissez le numeacutero de compte sous la forme drsquoune chaicircne de caractegraveres

c Transformez tous les tests faisant appel aux variables type et numeacutero de faccedilon agravetester non plus sur des caractegraveres mais sur des String

Deacutefinir le type CompteDans un fichier nommeacute Comptejava deacutefinissez la classe Compte en proceacutedant de lafaccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerCpte() en reprenant les instructions de lrsquooption 1 deacutecrites au chapitrepreacuteceacutedent Placez-les sous lrsquoen-tecircte de la fonction qui a pour forme public void

copy copyright Eacuteditions Eyrolles

Les classes et les objetsCHAPITRE 7

173

creacuteerCpte() La meacutethode ne possegravede ni paramegravetre ni type de retour car elle nefait que modifier les donneacutees caracteacuteristiques drsquoun compte deacuteclareacute en dehors de lameacutethode

ndash afficherCpte() en reprenant la fonction eacutecrite au chapitre preacuteceacutedent et en suppri-mant le mot-cleacute static Les variables num type taux et val ne sont agrave deacuteclarer ni agravelrsquointeacuterieur ni en paramegravetre de la meacutethode Elles sont deacutefinies comme donneacutees de laclasse compte en dehors de la meacutethode

Construire lrsquoapplication ProjetDans un fichier nommeacute Projetjava eacutecrivez lrsquoapplication contenant la fonction main()en proceacutedant de la faccedilon suivante

a Faites appel aux fonctions alAide() sortir() et menuPrincipal()

b Creacuteez un objet de type Compte gracircce agrave lrsquoinstruction de deacuteclaration Compte c = newCompte()

c Dans les options approprieacutees du menu appelez les meacutethodes de la classe Comptecomme ccreacuteerCpte() ou cafficherCpte()

d Agrave lrsquoexeacutecution du programme remarquez que la meacutethode afficherCpte() affiche lesdiffeacuterentes valeurs du compte modifieacutees par la meacutethode creacuteerCpte() Une meacutethodepar lrsquointermeacutediaire drsquoun objet peut par conseacutequent transmettre plusieurs reacutesultats

Deacutefinir le type LigneComptableDans un fichier nommeacute LigneComptablejava deacutefinissez la classe LigneComptable enproceacutedant de la faccedilon suivante

a Deacuteterminez les donneacutees qui deacutefinissent tout compte bancaire

Voir au chapitre introductif laquo Naissance drsquoun programme raquo la deacutefinition de lrsquooption 3 agrave la sectionlaquo Le projet ldquoGestion drsquoun compte bancairerdquo raquo

b Eacutecrivez les meacutethodes associeacutees par exemple

ndash creacuteerLigneComptable() qui demande la saisie au clavier des valeurs correspon-dant aux donneacutees de la classe LigneComptable

ndash afficherLigne() qui affiche les donneacutees caracteacuteristiques drsquoune ligne comptable

Modifier le type CompteDans le fichier Comptejava

a Deacutefinissez une nouvelle donneacutee (variable drsquoinstance) deacutecrivant une ligne comptableen eacutecrivant la deacuteclaration LigneComptable ligne au mecircme niveau que typenumeacutero etc

b Eacutecrivez la meacutethode creacuteerLigne() qui permet les actions suivantes

ndash creacuteer en meacutemoire lrsquoobjet ligne gracircce agrave lrsquoinstruction de deacuteclaration ligne = newLigneComptable()

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

174

ndash faire appel agrave la meacutethode creacuteerLigneComptable() par lrsquointermeacutediaire de lrsquoobjetligne de faccedilon agrave enregistrer les valeurs numeacuteriques associeacutees agrave la ligne creacuteeacutee

ndash modifier la valeur courante du compte agrave partir de la valeur (deacutebit ou creacutedit) saisiedans la meacutethode creacuteerLigneComptable()

c Modifiez la meacutethode afficherCpte() de faccedilon agrave afficher les informations stockeacuteesdans ligne en utilisant lrsquoinstruction ligneafficherLigne()

Modifier lrsquoapplication Projeta Dans le fichier nommeacute Projetjava modifiez lrsquooption 3 de lrsquoapplication de faccedilon

qursquoune ligne comptable soit creacuteeacutee pour le compte C deacutefini agrave lrsquooption 1

b Agrave lrsquoexeacutecution de lrsquoapplication que se passe-t-il si lrsquoutilisateur ayant creacuteeacute un compteaffiche ce dernier sans avoir jamais creacuteeacute de ligne comptable Pourquoi

c Comment faire pour remeacutedier agrave cette situation

copy copyright Eacuteditions Eyrolles

8Les principes

du concept drsquoobjet

Au cours du chapitre preacuteceacutedent nous avons examineacute comment mettre en place des objetsagrave lrsquointeacuterieur drsquoun programme Java Cette eacutetude a montreacute combien la structure geacuteneacuteraledes programmes se trouvait modifieacutee par lrsquoemploi des objetsEn reacutealiteacute les objets sont beaucoup plus qursquoune structure syntaxique Ils sont reacutegis pardes principes essentiels qui constituent les fondements de la programmation objet Dansce chapitre nous eacutetudions avec preacutecision lrsquoensemble de ces principes Nous deacuteterminons drsquoabord (section laquo La communication objet raquo) les caracteacuteristiquesdrsquoune donneacutee static et eacutevaluons leurs conseacutequences sur la construction des objets enmeacutemoire Nous analysons eacutegalement la technique du passage de paramegravetres par reacutefeacute-rence Nous observons qursquoil est possible avec la technologie objet qursquoune meacutethode trans-mette plusieurs reacutesultats agrave une autre meacutethodeNous expliquons ensuite (section laquo Les objets controcirclent leur fonctionnement raquo) leconcept drsquoencapsulation des donneacutees et nous examinons pourquoi et comment les objetsprotegravegent leurs donneacutees Enfin nous deacutefinissons (section laquo Lrsquoheacuteritage raquo) la notion drsquoheacuteritage entre classes Nousobservons combien cette notion est utile puisqursquoelle permet de reacuteutiliser des programmestout en apportant des variations dans le comportement des objets heacuteritants

La communication objetEn deacutefinissant un type ou une classe le deacuteveloppeur creacutee un modegravele qui deacutecrit les fonc-tionnaliteacutes des objets utiliseacutes par le programme Les objets sont creacuteeacutes en meacutemoire agrave partirde ce modegravele par copie des donneacutees et des meacutethodes Cette copie est reacutealiseacutee lors de la reacuteservation des emplacements meacutemoire gracircce agrave lrsquoopeacutera-teur new qui initialise les donneacutees de lrsquoobjet et fournit en retour lrsquoadresse ougrave se trouventles informations stockeacutees

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

176

La question est de comprendre pourquoi lrsquointerpreacuteteur reacutealise cette copie en meacutemoirealors que cela lui eacutetait impossible auparavant

Les donneacutees staticLa reacuteponse agrave cette interrogation se trouve dans lrsquoobservation des diffeacuterents programmesproposeacutes dans ce manuel (voir les chapitres 6 laquoFonctions notions avanceacuteesraquo et 7 laquoLesclasses et les objetsraquo) Comme nous lrsquoavons deacutejagrave constateacute (voir au chapitre preacuteceacutedent lasection laquoConstruire et utiliser ses propres classesraquo) le mot-cleacute static nrsquoest plus utiliseacutelors de la description drsquoun type alors qursquoil eacutetait preacutesent dans tous les programmes preacuteceacutedantce chapitre

Crsquoest donc la preacutesence ou lrsquoabsence de ce mot-cleacute qui fait que lrsquointerpreacuteteur construiseou non des objets en meacutemoire

Lorsque lrsquointerpreacuteteur rencontre le mot-cleacute static devant une variable ou une meacutethode ilreacuteserve un seul et unique emplacement meacutemoire pour y stoker la valeur ou le pseudo-codeassocieacutes Cet espace meacutemoire est communeacutement accessible pour tous les objets du mecircmetype

Lorsque le mot-cleacute static nrsquoapparaicirct pas lrsquointerpreacuteteur reacuteserve agrave chaque appel de lrsquoopeacutera-teur new un espace meacutemoire pour y charger les donneacutees et les pseudo-codes deacutecrits dans laclasse

Exemple compter des cercles

Pour bien comprendre la diffeacuterence entre une donneacutee static et une donneacutee non staticnous allons modifier la classe Cercle de faccedilon qursquoil soit possible de connaicirctre le nombredrsquoobjets Cercle creacuteeacutes en cours drsquoapplication

Pour ce faire lrsquoideacutee est drsquoeacutecrire une meacutethode creacuteer() qui permette drsquoune part de saisirdes valeurs x y et r pour chaque cercle agrave creacuteer et drsquoautre part drsquoincreacutementer un comp-teur de cercles

La variable repreacutesentant ce compteur doit ecirctre indeacutependante des objets creacuteeacutes de sorteque sa valeur ne soit pas ecirctre reacuteinitialiseacutee agrave zeacutero agrave chaque creacuteation drsquoobjet Cette variabledoit cependant ecirctre accessible pour chaque objet de faccedilon qursquoelle puisse srsquoincreacutementerde 1 agrave chaque appel de la meacutethode creacuteer()

Pour reacutealiser ces contraintes le compteur de cercles doit ecirctre une variable de classecrsquoest-agrave-dire une variable deacuteclareacutee avec le mot-cleacute static Examinons tout cela dans leprogramme suivant

public class Cercle public int x y r position du centre et rayon public static int nombre nombre de cercle

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Rayon )

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

177

r = Lirei()

nombre ++

et toutes les autres meacutethodes de la classe Cercle deacutefinies au

chapitre preacuteceacutedent

Fin de la classe Cercle

Les donneacutees deacutefinies dans la classe Cercle sont de deux sortes les variablesdrsquoinstance x y et r et la variable de classe nombre Seul le mot-cleacute static permet dediffeacuterencier leur cateacutegorie

Gracircce au mot-cleacute static la variable de classe nombre est un espace meacutemoire communaccessible pour tous les objets creacuteeacutes Pour faire appel agrave cette variable il suffit delrsquoappeler par son nom veacuteritable (voir au chapitre 6 laquo Fonctions notions avanceacutees raquo lasection laquo Variable de classe raquo) crsquoest-agrave-dire nombre si elle est utiliseacutee dans la classeCercle ou Cerclenombre si elle est utiliseacutee en dehors de cette classe

Exeacutecution de lrsquoapplication CompterDesCercles

Pour mieux saisir la diffeacuterence entre les variables drsquoinstance (non static) et les varia-bles de classe (static) observons comment fonctionne lrsquoapplication CompterDesCer-cles

public class CompterDesCercles public static void main(String [] arg)

Cercle A = new Cercle()

Acreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Cercle B = new Cercle()

Bcreacuteer() Systemoutprintln(Nombre de cercle + Cerclenombre)

Fin de la classe CompterDesCercles

Dans ce programme deux objets de type Cercle sont creacuteeacutes agrave partir du modegravele deacutefini parle type Cercle Chaque objet est un repreacutesentant particulier ou une instance de la classeCercle de position et de rayon speacutecifiques

Lorsque lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new les donneacutees x y et r sontinitialiseacutees agrave 0 au moment de la reacuteservation de lrsquoespace meacutemoire La variable de classenombre est elle aussi creacuteeacutee en meacutemoire et sa valeur est eacutegalement initialiseacutee agrave 0

Lors de lrsquoexeacutecution de lrsquoinstruction Acreacuteer() les valeurs des variables x y et r delrsquoinstance A sont saisies au clavier (x = Lirei() hellip) La variable de classe nombre estincreacutementeacutee de 1 (nombre++) Le nombre de cercles est alors de 1 (voir lrsquoobjet A deacutecrit agravela Figure 8-1)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

178

De la mecircme faccedilon lrsquoobjet B est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new Les donneacutees xy et r sont elles aussi initialiseacutees agrave 0

Pour la variable de classe nombre en revanche cette initialisation nrsquoest pas reacutealiseacutee Lapreacutesence du mot-cleacute static fait que la variable de classe nombre qui existe deacutejagrave enmeacutemoire ne peut ecirctre reacuteinitialiseacutee directement par lrsquointerpreacuteteur

Il y a donc non pas reacuteservation drsquoun nouvel emplacement meacutemoire mais preacuteservationdu mecircme emplacement meacutemoire avec conservation de la valeur calculeacutee agrave lrsquoeacutetape preacuteceacute-dente soit 1

Apregraves saisie des donneacutees x y et r de lrsquoinstance B lrsquoinstruction nombre++ fait passer lavaleur de Cerclenombre agrave 2 (voir lrsquoobjet B deacutecrit agrave la Figure 8-1)

Nrsquoexistant qursquoen un seul exemplaire la variable de classe nombre permet le comptage dunombre de cercles creacuteeacutes Lrsquoincreacutementation de cette valeur est reacutealiseacutee indeacutependammentde lrsquoobjet la variable eacutetant commune agrave tous les objets creacuteeacutes

Le passage de paramegravetres par reacutefeacuterenceLa communication des donneacutees entre les objets passe avant tout par lrsquointermeacutediaire desvariables drsquoinstance Nous lrsquoavons observeacute agrave la section preacuteceacutedente lorsqursquoune meacutethodeappliqueacutee agrave un objet modifie les valeurs de plusieurs donneacutees de cet objet cette modifi-cation est visible en dehors de la meacutethode et de lrsquoobjet lui-mecircme

Il existe cependant une autre technique qui permette la modification des donneacutees drsquounobjet le passage de paramegravetres par reacutefeacuterence

Ce proceacutedeacute est utiliseacute lorsqursquoon passe en paramegravetre drsquoune meacutethode non plus une simplevariable (de type int char ou double) mais un objet Dans cette situation lrsquoobjet eacutetantdeacutefini par son adresse (reacutefeacuterence) la valeur passeacutee en paramegravetre nrsquoest plus la valeurreacuteelle de la variable mais lrsquoadresse de lrsquoobjet

Gracircce agrave cela les modifications apporteacutees sur lrsquoobjet passeacute en paramegravetre et reacutealiseacutees agravelrsquointeacuterieur de la meacutethode sont visibles en dehors mecircme de la meacutethode

Figure 8-1

La variable de classe Cerclenombre est creacuteeacutee en meacutemoire avec lrsquoobjet A Gracircce au mot-cleacute static il y a non pas reacuteservation drsquoun nouvel espace meacutemoire (pour la variable nombre) lors de la creacuteation de lrsquoobjet B mais preacuteservation de lrsquoespace meacutemoire ainsi que de la valeur stockeacutee

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

179

Eacutechanger la position de deux cercles

Pour comprendre en pratique le meacutecanisme du passage de paramegravetres par reacutefeacuterencenous allons eacutecrire une application qui eacutechange la position des centres de deux cerclesdonneacutes

Pour cela nous utilisons le meacutecanisme drsquoeacutechange de valeurs (voir le chapitre 1laquo Stocker une information raquo) en lrsquoappliquant agrave la coordonneacutee x puis agrave la coordonneacutee ydes centres des deux cercles agrave eacutechanger

Examinons la meacutethode eacutechanger() dont le code ci-dessous srsquoinsegravere dans la classe Cercle

Voir au chapitre 7 laquoLes classes et les objets raquo la section laquoLa classe descriptive du type Cercleraquo

public void eacutechanger(Cercle autre) Eacutechange la position drsquoun int tmp cercle avec celle du cercle donneacute en paramegravetre tmp = x eacutechanger la position en x x = autrex autrex = tmp tmp = y eacutechanger la position en y y = autrey autrey = tmp

Pour eacutechanger les coordonneacutees des centres de deux cercles la meacutethode eacutechanger() doitavoir accegraves aux valeurs des coordonneacutees des deux centres des cercles concerneacutes

Si par exemple la meacutethode est appliqueacutee au cercle B (Beacutechanger()) ce sont les varia-bles drsquoinstance x et y de lrsquoobjet B qui sont modifieacutees par les coordonneacutees du centre ducercle A La meacutethode doit donc connaicirctre les coordonneacutees du cercle A Pour ce faire il estneacutecessaire de passer ces valeurs en paramegravetres de la fonction

La technique consiste agrave passer en paramegravetres non pas les valeurs x et y du cercle aveclequel lrsquoeacutechange est reacutealiseacute mais un objet de type Cercle Dans notre exemple ce para-megravetre srsquoappelle autre Crsquoest le paramegravetre formel de la meacutethode repreacutesentant nrsquoimportequel cercle et il peut donc repreacutesenter par exemple le cercle A

Le fait drsquoeacutechanger les coordonneacutees des centres de deux cercles revient agrave eacutechanger les coor-donneacutees du couple (x y) du cercle sur lequel on applique la meacutethode (Bx By) avec lescoordonneacutees (autrex autrey) du cercle passeacute en paramegravetre de la meacutethode (Ax Ay)

Examinons maintenant comment srsquoopegravere effectivement lrsquoeacutechange en exeacutecutant lrsquoappli-cation suivante

public class EchangerDesCercles public static void main(String [] arg) Cercle A = new Cercle() Acreacuteer() Systemoutprintln(Le cercle A ) Aafficher()

Cercle B = new Cercle() Bcreacuteer() Systemoutprintln(Le cercle B )

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

180

B afficher() Beacutechanger(A) Systemoutprintln(Apres echange ) Systemoutprintln(Le cercle A ) Aafficher() Systemoutprintln(Le cercle B ) Bafficher()

Exeacutecution de lrsquoapplication EchangerDesCercles

Nous supposons que lrsquoutilisateur ait saisi les valeurs suivantes pour le cercle A

Position en x 22Position en y 22Rayon 22Le cercle A Centre en 2 2Rayon 2

et pour le cercle B

Position en x 55Position en y 55Rayon 55Le cercle B Centre en 5 5Rayon 5

Lrsquoinstruction Beacutechanger(A) eacutechange les coordonneacutees (x y) de lrsquoobjet B avec celles delrsquoobjet A Crsquoest donc le pseudo-codede lrsquoobjet B qui est interpreacuteteacute comme illustreacute agrave laFigure 8-2

Figure 8-2

Lrsquoinstruction Beacutechanger(A) fait appel agrave la meacutethode eacutechanger() de lrsquoobjet B Les donneacutees x y et r utiliseacutees par cette meacutethode sont celles de lrsquoobjet B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

181

Examinons le tableau drsquoeacutevolution des variables deacuteclareacutees pour le pseudo-code de lrsquoobjet B

bull Agrave lrsquoentreacutee de la meacutethode la variable tmp est deacuteclareacutee sans ecirctre initialiseacutee

bull La meacutethode est appliqueacutee agrave lrsquoobjet B Les variables x et y de lrsquoinstance B ont pourvaleurs respectives 5 et 5

bull Lrsquoobjet autre est simplement deacuteclareacute en paramegravetre de la fonction eacutechanger(Cercleautre) Lrsquoopeacuterateur new nrsquoeacutetant pas appliqueacute agrave cet objet aucun espace meacutemoiresuppleacutementaire nrsquoest alloueacute

Comme autre repreacutesente un objet de type Cercle il ne peut contenir qursquoune adresseet non pas une simple valeur numeacuterique Cette adresse est celle du paramegravetre effec-tivement passeacute lors de lrsquoappel de la meacutethode

Pour notre exemple lrsquoobjet A est passeacute en paramegravetre de la meacutethode (Beacutechanger(A))La case meacutemoire de la variable autre prend donc pour valeur lrsquoadresse de lrsquoobjet A

bull La variable tmp prend ensuite la valeur de la coordonneacutee x de lrsquoobjet B soit 5

instruction tmp x y autre

valeurs initiales - 5 5 0x11022033

instruction tmp x autre autrex (Ax)

tmp = x 5 5 0x11022033 2

x = autrex 5 2 0x11022033 2

autrex = tmp 5 2 0x11022033 5

Figure 8-3

Lrsquoobjet autre est le paramegravetre formel de la meacutethode eacutechanger() En eacutecrivant Beacutechanger(A) lrsquoobjet autre stocke la reacutefeacuterence meacutemoriseacutee en A De cette faccedilon autrex repreacutesente eacutegalement Ax La variable x de lrsquoinstance B prend la valeur de Ax gracircce agrave lrsquoinstruction x = autrex

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

182

bull Lorsque lrsquoinstruction x = autrex est exeacutecuteacutee la coordonneacutee x de lrsquoobjet B prend lavaleur de la coordonneacutee x de lrsquoobjet autrex Puisque autre correspond agrave lrsquoadresse delrsquoobjet A le fait de consulter le contenu de autrex revient en reacutealiteacute agrave consulter lecontenu de Ax (voir Figure 8-3) La variable drsquoinstance Ax contenant la valeur 2x (Bx) prend la valeur 2

bull Pour finir lrsquoeacutechange sur les abscisses autrex prend la valeur stockeacutee dans tmpComme autre et A correspondent agrave la mecircme adresse modifier autrex crsquoest aussimodifier Ax (voir Figure 8-4) Une fois exeacutecuteacute autrex = tmp la variable x delrsquoinstance A vaut par conseacutequent 5

Lrsquoensemble de ces opeacuterations est ensuite reacutealiseacute sur la coordonneacutee y des cercles B et A viaautre

Lrsquoexeacutecution finale du programme a pour reacutesultat

Apres echange Le cercle A Centreacute en 5 5Rayon 2Le cercle B Centre en 2 2Rayon 5

instruction tmp y autre autrey (Ay)

tmp = y 5 5 0x11022033 2

y = autrey 5 2 0x11022033 2

autrey = tmp 5 2 0x11022033 5

Figure 8-4

autre et A deacutefinissent la mecircme reacutefeacuterence ou adresse Crsquoest pourquoi le fait de modifier autrex revient aussi agrave modifier Ax Ainsi lrsquoinstruction autrex = tmp fait que Ax prend la valeur stockeacutee dans tmp

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

183

Au final nous constatons agrave lrsquoobservation des tableaux drsquoeacutevolution des variables que lesdonneacutees x et y de B ont pris la valeur des donneacutees x et y de A soit 2 pour x et 2 pour yParallegravelement le cercle A a eacuteteacute transformeacute par lrsquointermeacutediaire de la reacutefeacuterence stockeacuteedans autre et a pris les coordonneacutees x et y du cercle B soit 5 pour x et 5 pour y

En reacutesumeacute gracircce agrave la technique du passage de paramegravetres par reacutefeacuterence tout objetpasseacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethode ses donneacutees transfor-meacutees par la meacutethode Cette transformation est alors visible pour tous les objets delrsquoapplication

Les objets controcirclent leur fonctionnementLrsquoun des objectifs de la programmation objet est de simuler agrave lrsquoaide drsquoun programmeinformatique la manipulation des objets reacuteels par lrsquoecirctre humain Les objets reacuteels formentun tout et leur manipulation neacutecessite la plupart du temps un outil ou une interface decommunication

Par exemple quand nous prenons un ascenseur nous appuyons sur le bouton drsquoappelpour ouvrir les portes ou pour nous rendre jusqursquoagrave lrsquoeacutetage deacutesireacute Lrsquointerface de commu-nication est ici le bouton drsquoappel Nul nrsquoaurait lrsquoideacutee de prendre la teacuteleacutecommande de sateacuteleacutevision pour appeler un ascenseur

De la mecircme faccedilon la preacuteparation drsquoune omelette neacutecessite de casser des œufs Pourbriser la coquille drsquoun œuf nous pouvons utiliser lrsquooutil couteau Un marteau pourraitecirctre eacutegalement utiliseacute mais son usage nrsquoest pas vraiment adapteacute agrave la situation

Comme nous le constatons agrave travers ces exemples les objets reacuteels sont manipuleacutes parlrsquointermeacutediaire drsquointerfaces approprieacutees Lrsquoutilisation drsquoun outil inadapteacute fait quelrsquoobjet ne reacutepond pas agrave nos attentes ou qursquoil se brise deacutefinitivement

Tout comme nous manipulons les objets reacuteels les applications informatiques manipulentdes objets virtuels deacutefinis par le programmeur Cette manipulation neacutecessite des outilsaussi bien adapteacutes que nos outils reacuteels Sans controcircle sur le bien-fondeacute drsquoune manipula-tion lrsquoapplication risque de fournir de mauvais reacutesultats ou pire de cesser brutalementson exeacutecution

La notion drsquoencapsulation

Pour reacutealiser lrsquoadeacutequation entre un outil et la manipulation drsquoun objet la programmationobjet utilise le concept drsquoencapsulation

Par ce terme il faut entendre que les donneacutees drsquoun objet sont proteacutegeacutees tout comme lemeacutedicament est proteacutegeacute par la fine pellicule de sa capsule Gracircce agrave cette protection il nepeut y avoir transformation involontaire des donneacutees de lrsquoobjet

Lrsquoencapsulation passe par le controcircle des donneacutees et des comportements de lrsquoobjet Cecontrocircle est eacutetabli agrave travers la protection des donneacutees (voir la section suivante) lrsquoaccegravescontrocircleacute aux donneacutees (voir la section laquo Les meacutethodes drsquoaccegraves aux donneacutees raquo) et la notionde constructeur de classe (voir la section laquo Les constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

184

La protection des donneacuteesLe langage Java fournit les niveaux de protection suivants pour les membres drsquoune classe(donneacutees et meacutethodes)

bull Protection public Les membres (donneacutees et meacutethodes) drsquoune classe deacuteclareacutes publicsont accessibles pour tous les objets de lrsquoapplication Les donneacutees peuvent ecirctre modi-fieacutees par une meacutethode de la classe drsquoune autre classe ou depuis la fonction main()

bull Protection private Les membres de la classe deacuteclareacutes private ne sont accessiblesque pour les meacutethodes de la mecircme classe Les donneacutees ne peuvent ecirctre initialiseacutees oumodifieacutees que par lrsquointermeacutediaire drsquoune meacutethode de la classe Les donneacutees oumeacutethodes ne peuvent ecirctre appeleacutees par la fonction main()

bull Protection protected Tout comme les membres priveacutes les membres deacuteclareacutesprotected ne sont accessibles que pour les meacutethodes de la mecircme classe Ils sont aussiaccessibles par les fonctions membres drsquoune sous-classe (voir la sectionlaquo Lrsquoheacuteritage raquo)

Par deacutefaut lorsque les donneacutees sont deacuteclareacutees sans type de protection leur protection estpublic Les donneacutees sont alors accessibles depuis toute lrsquoapplication

Proteacuteger les donneacutees drsquoun cercle

Pour proteacuteger les donneacutees de la classe Cercle il suffit de remplacer le mot-cleacute publicpreacuteceacutedant la deacuteclaration des variables drsquoinstance par le mot private Observons lanouvelle classe CerclePrive dont les donneacutees sont ainsi proteacutegeacutees

public class CerclePrive private int x y r position du centre et rayon

public void afficher() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void deacuteplacer(int nx int ny) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets Fin de la classe CerclePrive

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

185

Les donneacutees x y et r de la classe CerclePrive sont proteacutegeacutees gracircce au mot-cleacute privateEacutetudions les conseacutequences drsquoune telle protection sur la phase de compilation de lrsquoappli-cation FaireDesCerclesPrives

public class FaireDesCerclesPrives public static void main(String [] arg) CerclePrive A = new CerclePrive() Aafficher() Systemoutprintln( Entrez le rayon ) Ar = Lirei() Systemoutprintln( Le cercle est de rayon + Ar)

Compilation de lrsquoapplication FaireDesCerclesPrives

Les donneacutees x y et r de la classe CerclePrive sont deacuteclareacutees priveacutees Par deacutefinition cesdonneacutees ne sont donc pas accessibles en dehors de la classe ougrave elles sont deacutefinies

Or en eacutecrivant dans la fonction main() lrsquoinstruction Ar = Lirei() le programmeurdemande drsquoacceacuteder depuis la classe FaireDesCerclesPrives agrave la valeur de r de faccedilonagrave la modifier Cet accegraves est impossible car r est deacutefini en mode private dans la classeCerclePrive et non dans la classe FaireDesCerclesPrives

Crsquoest pourquoi le compilateur deacutetecte lrsquoerreur Variable x in class CerclePrive notaccessible from class FaireDesCerclesPrives

Les meacutethodes drsquoaccegraves aux donneacuteesLorsque les donneacutees sont totalement proteacutegeacutees crsquoest-agrave-dire deacuteclareacutees private agrave lrsquointeacute-rieur drsquoune classe elles ne sont plus accessibles depuis une autre classe ou depuis lafonction main() Pour connaicirctre ou modifier la valeur drsquoune donneacutee il est neacutecessaire decreacuteer agrave lrsquointeacuterieur de la classe des meacutethodes drsquoaccegraves agrave ces donneacutees

Figure 8-5

Lorsque les donneacutees drsquoun objet sont proteacutegeacutees lrsquoobjet possegravede ses propres meacutethodes qui permettent soit de consulter la valeur reacuteelle de ses donneacutees soit de modifier les donneacutees La validiteacute de ces modifications est controcircleacutee par les meacutethodes deacutefinies dans la classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

186

Les donneacutees priveacutees ne peuvent ecirctre consulteacutees ou modifieacutees que par des meacutethodes de laclasse ougrave elles sont deacuteclareacutees

De cette faccedilon gracircce agrave lrsquoaccegraves aux donneacutees par lrsquointermeacutediaire de meacutethodes approprieacuteeslrsquoobjet permet non seulement la consultation de la valeur de ses donneacutees mais aussilrsquoautorisation ou non suivant ses propres critegraveres de leur modification

Les meacutethodes drsquoune classe reacutealisent les modes drsquoaccegraves suivants

bull Accegraves en consultation La meacutethode fournit la valeur de la donneacutee mais ne peut lamodifier Ce type de meacutethode est aussi appeleacute accesseur en consultation

bull Accegraves en modification La meacutethode modifie la valeur de la donneacutee Cette modificationest reacutealiseacutee apregraves validation par la meacutethode On parle aussi drsquoaccesseur en modification

Controcircler les donneacutees drsquoun cercle

Dans lrsquoexemple suivant nous prenons pour hypothegravese que le rayon drsquoun cercle ne puissejamais ecirctre neacutegatif ni deacutepasser la taille de lrsquoeacutecran Ces conditions doivent ecirctre veacuterifieacuteespour toutes les meacutethodes qui peuvent modifier la valeur du rayon drsquoun cercle

Comme nous lrsquoavons deacutejagrave remarqueacute (voir au chapitre 7 laquo Les classes et les objets raquo lasection laquo Quelques observations raquo) les meacutethodes afficher() et peacuterimegravetre() ne fontque consulter le contenu des donneacutees x y et r

Les meacutethodes deacuteplacer() agrandir() et creacuteer() en revanche modifient le contenudes donneacutees x y et r La meacutethode deacuteplacer() nrsquoayant pas drsquoinfluence sur la donneacutee rseules les meacutethodes agrandir() et creacuteer() doivent controcircler la valeur du rayon de sorteque cette derniegravere ne puisse ecirctre neacutegative ou supeacuterieure agrave la taille de lrsquoeacutecran Examinonsla classe CercleControle suivante qui prend en compte ces nouvelles contraintes

public class CercleControle private int x y r position du centre et rayon public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt 600)

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Centre en + x + + y) Systemoutprintln( Rayon + r)

public void agrandir(int nr) if (r + nr lt 0) r = 0 else if ( r + nr gt 600) r = 600 else r = r + nr

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

187

Fin de la classe CercleControle

La meacutethode creacuteer() controcircle la valeur du rayon lors de sa saisie en demandant de saisirune valeur pour le rayon tant que la valeur saisie est neacutegative ou plus grande que 600(taille supposeacutee de lrsquoeacutecran) Degraves que la valeur saisie est comprise entre 0 et 600 la fonc-tion creacuteer() cesse son exeacutecution Agrave la sortie de cette fonction nous sommes certainsque le rayon est compris entre 0 et 600

De la mecircme faccedilon la meacutethode agrandir() autorise que la valeur du rayon soitaugmenteacutee de la valeur passeacutee en paramegravetre agrave condition que cette augmentation nedeacutepasse pas la taille de lrsquoeacutecran ou que la diminution nrsquoentraicircne pas un rayon neacutegatif si lavaleur passeacutee en paramegravetre est neacutegative Dans ces deux cas la valeur du rayon est forceacuteerespectivement agrave la taille de lrsquoeacutecran ou agrave 0

Exeacutecution de lrsquoapplication FaireDesCerclesControlesPour veacuterifier que tous les objets Cercle controcirclent bien la valeur de leur rayon exami-nons lrsquoexeacutecution de lrsquoapplication suivante

public class FaireDesCerclesControles public static void main(String [] arg) CercleControle A = new CercleControle() Acreacuteer() Aafficher() Systemoutprint(Entrer une valeur drsquoagrandissement ) int plus = Lirei() Aagrandir(plus) Systemoutprintln(Apres agrandissement ) Aafficher()

Lrsquoobjet A est creacuteeacute en meacutemoire gracircce agrave lrsquoopeacuterateur new La valeur du rayon est initialiseacutee agrave 0Agrave lrsquoappel de la meacutethode creacuteer() les variables drsquoinstance x et y sont saisies au claviercomme suit

Position en x 55Position en y 55

Ensuite si lrsquoutilisateur saisit pour le rayon une valeur neacutegative

Rayon --33

ou supeacuterieure agrave 600

Rayon 665544

le programme demande de nouveau de saisir une valeur pour le rayon Lrsquoapplicationcesse cette reacutepeacutetition lorsque lrsquoutilisateur entre une valeur comprise entre 0 et 600comme suit

Rayon 220000Centre 5 5 Rayon 200

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

188

Apregraves affichage des donneacutees du cercle A le programme demande

Entrer une valeur drsquoagrandissement 445500

La valeur du rayon vaut 200 + 450 soit 650 Ce nouveau rayon eacutetant supeacuterieur agrave 600 lavaleur du rayon est bloqueacutee par le programme agrave 600 Lrsquoaffichage des donneacutees fournit

Apres agrandissement Centre 5 5 Rayon 600

La notion de constante

Drsquoune maniegravere geacuteneacuterale en programmation objet les variables drsquoinstance ne sont quetregraves rarement deacuteclareacutees en public Pour des raisons de seacutecuriteacute tout objet se doit decontrocircler les transformations opeacutereacutees par lrsquoapplication sur lui-mecircme Crsquoest pourquoi lesdonneacutees drsquoune classe sont le plus souvent deacuteclareacutees en mode private

Il existe des donneacutees appeleacutees constantes qui parce qursquoelles sont importantes doiventecirctre visibles par toutes les meacutethodes de lrsquoapplication Ces donneacutees sont deacuteclareacutees enmode public Du fait de leur invariabiliteacute lrsquoapplication ne peut modifier leur contenu

Pour notre exemple la valeur 600 correspondant agrave la taille (largeur et hauteur) supposeacuteede lrsquoeacutecran peut ecirctre consideacutereacutee comme une donneacutee constante de lrsquoapplication

Il suffit de deacuteclarer les variables laquo constantes raquo agrave lrsquoaide du mot-cleacute final Ainsi la taillede lrsquoeacutecran peut ecirctre deacutefinie de la faccedilon suivante

public final int TailleEcran = 600

Notons que la taille de lrsquoeacutecran est une valeur indeacutependante de lrsquoobjet Cercle Quelle quesoit la forme agrave dessiner (carreacute cercle etc) la taille de lrsquoeacutecran est toujours la mecircme Crsquoestpourquoi il est logique de deacuteclarer la variable TailleEcran comme constante de classe agravelrsquoaide du mot-cleacute static

public final static int TailleEcran = 600

De cette faccedilon la variable TailleEcran est accessible en consultation depuis toutelrsquoapplication mais elle ne peut en aucun cas ecirctre modifieacutee eacutetant deacuteclareacutee final

Les meacutethodes creacuteer() et agrandir() srsquoeacutecrivent alors de la faccedilon suivante

public void creacuteer() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() do Systemoutprint( Rayon ) r = Lirei() while ( r lt 0 || r gt TailleEcran)

public void agrandir(int nr) if (r + nr lt 0) r = 0

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

189

else if ( r + nr gt TailleEcran) r = TailleEcran else r = r + nr

Des meacutethodes invisibles

Comme nous lrsquoavons observeacute preacuteceacutedemment les donneacutees drsquoune classe sont geacuteneacuterale-ment deacuteclareacutees en mode private Les meacutethodes quant agrave elles sont le plus souventdeacuteclareacutees public car ce sont elles qui permettent lrsquoaccegraves aux donneacutees proteacutegeacutees Danscertains cas particuliers il peut arriver que certaines meacutethodes soient deacutefinies en modeprivate Elles deviennent alors inaccessibles depuis les classes exteacuterieures

Ainsi le controcircle systeacutematique des donneacutees est toujours reacutealiseacute par lrsquoobjet lui-mecircme etnon par lrsquoapplication qui utilise les objets Par conseacutequent les meacutethodes qui ont pourcharge de reacutealiser cette veacuterification peuvent ecirctre deacutefinies comme meacutethodes internes agrave laclasse puisqursquoelles ne sont jamais appeleacutees par lrsquoapplication

Par exemple le controcircle de la validiteacute de la valeur du rayon nrsquoest pas reacutealiseacutee par lrsquoappli-cation FaireDesCercles mais correspond agrave une opeacuteration interne agrave la classe Cercle Cecontrocircle est reacutealiseacute diffeacuteremment suivant que le cercle est agrave creacuteer ou agrave agrandir (voir lesmeacutethodes creacuteer() et agrandir() ci-dessus)

bull Soit le rayon nrsquoest pas encore connu et la veacuterification srsquoeffectue degraves la saisie de lavaleur Crsquoest ce que reacutealise la meacutethode suivante

private int rayonVeacuterifieacute() int tmp do Systemoutprint( Rayon ) tmp = Lirei() while ( tmp lt 0 || tmp gt TailleEcran) return tmp

bull Soit le rayon est deacutejagrave connu auquel cas la veacuterification est reacutealiseacutee agrave partir de la valeurpasseacutee en paramegravetre de la meacutethode

private int rayonVeacuterifieacute (int tmp) if (tmp lt 0) return 0 else if ( tmp gt TailleEcran) return TailleEcran else return tmp

Les meacutethodes rayonVeacuterifieacute() sont appeleacutees meacutethodes drsquoimpleacutementation car ellessont deacuteclareacutees en mode priveacute Leur existence nrsquoest connue drsquoaucune autre classe Seulesles meacutethodes de la classe Cercle peuvent les exploiter et elles ne sont pas directementexeacutecutables par lrsquoapplication Elle sont cependant tregraves utiles agrave lrsquointeacuterieur de la classe ougraveelles sont deacutefinies (voir les sections laquo Les constructeurs raquo et laquo Lrsquoheacuteritage raquo)

Remarquons en outre que nous venons de deacutefinir deux meacutethodes portant le nom rayon-Veacuterifieacute() Le langage Java nrsquointerdit pas la deacutefinition de meacutethodes portant le mecircmenom Dans cette situation on dit que ces meacutethodes sont surchargeacutees (voir la sectionlaquo La surcharge de constructeurs raquo)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

190

Les constructeursGracircce aux diffeacuterents niveaux de protection et aux meacutethodes controcirclant lrsquoaccegraves auxdonneacutees il devient possible de construire des outils approprieacutes aux objets manipuleacutes

Cependant la protection des donneacutees drsquoune classe passe aussi par la notion de construc-teurs drsquoobjets En effet les constructeurs sont utiliseacutes pour initialiser correctement lesdonneacutees drsquoun objet au moment de la creacuteation de lrsquoobjet en meacutemoire

Le constructeur par deacutefaut

Le langage Java deacutefinit pour chaque classe construite par le programmeur un construc-teur par deacutefaut Celui-ci initialise lors de la creacuteation drsquoun objet toutes les donneacutees de cetobjet agrave 0 pour les entiers agrave 00 pour les reacuteels agrave rsquo0rsquo pour les caractegraveres et agrave null pourles String ou autres types structureacutes

Le constructeur par deacutefaut est appeleacute par lrsquoopeacuterateur new lors de la reacuteservation delrsquoespace meacutemoire Ainsi lorsque nous eacutecrivons

Cercle C = new Cercle()

nous utilisons le terme Cercle() qui repreacutesente en reacutealiteacute le constructeur par deacutefaut (ilne possegravede pas de paramegravetre) de la classe Cercle

Un constructeur est une meacutethode puisqursquoil y a des parenthegraveses () derriegravere son nomdrsquoappel qui porte le nom de la classe associeacutee au type de lrsquoobjet deacuteclareacute

Deacutefinir le constructeur drsquoune classe

Lrsquoutilisation du constructeur par deacutefaut permet drsquoinitialiser systeacutematiquement lesdonneacutees drsquoune classe Lrsquoinitialisation proposeacutee peut parfois ne pas ecirctre conforme auxvaleurs demandeacutees par le type

Dans ce cas le langage Java offre la possibiliteacute de deacutefinir un constructeur propre agrave laclasse de lrsquoobjet utiliseacute Cette deacutefinition est reacutealiseacutee en eacutecrivant une meacutethode portant lemecircme nom que sa classe Les instructions qui la composent permettent drsquoinitialiser lesdonneacutees de la classe conformeacutement aux valeurs demandeacutees par le type choisi

Par exemple le constructeur de la classe Cercle peut srsquoeacutecrire de la faccedilon suivante

public Cercle() Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() r = rayonVeacuterifieacute()

En observant la structure du constructeur Cercle() nous constatons qursquoun constructeurnrsquoest pas typeacute Aucun type de retour nrsquoest placeacute dans son en-tecircte Mais attention le faitdrsquoeacutecrire lrsquoen-tecircte public void Cercle() ou encore public int Cercle() a pour reacutesultatde creacuteer une simple meacutethode qui a pour nom Cercle() et qui nrsquoest pas celle appeleacutee parlrsquoopeacuterateur new Il ne srsquoagit donc pas drsquoun constructeur

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

191

Une fois correctement deacutefini le constructeur est appeleacute par lrsquoopeacuterateur new comme pourle constructeur par deacutefaut Lrsquoinstruction

Cercle A = new Cercle()

fait appel au constructeur deacutefini ci-dessus Le programme exeacutecuteacute demande degraves la creacutea-tion de lrsquoobjet A de saisir les donneacutees le concernant avec une veacuterification concernant lavaleur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute() De cette faccedilon lrsquoapplication estsucircre drsquoexploiter des objets dont la valeur est valide degraves leur initialisation

Remarquons que

bull Lorsqursquoun constructeur est deacutefini par le programmeur le constructeur proposeacute pardeacutefaut par le langage Java nrsquoexiste plus

bull La meacutethode creacuteer() et le constructeur ainsi deacutefinis ont un rocircle identique La meacutethodecreacuteer() devient par conseacutequent inutile

La surcharge de constructeurs

Le langage Java permet la deacutefinition de plusieurs constructeurs ou meacutethodes agrave lrsquointeacute-rieur drsquoune mecircme classe du fait que la construction des objets peut se reacutealiser de diffeacute-rentes faccedilons Lorsqursquoil existe plusieurs constructeurs on dit que le constructeur estsurchargeacute

Dans la classe Cercle il est possible de deacutefinir deux constructeurs suppleacutementaires

public Cercle(int centrex int centrey) x = centrex y = centreypublic Cercle(int centrex int centrey int rayon) this( centrex centrey) r = rayonVeacuterifieacute(rayon)

Pour deacuteterminer quel constructeur doit ecirctre utiliseacute lrsquointerpreacuteteur Java regarde lors deson appel la liste des paramegravetres deacutefinis dans chaque constructeur La construction destrois objets A B et C suivants fait appel aux trois constructeurs deacutefinis preacuteceacutedemment

Cercle A = new Cercle()Cercle B = new Cercle(10 10)Cercle c = new Cercle(10 10 30)

Lors de la deacuteclaration de lrsquoobjet A le constructeur appeleacute est celui qui ne possegravede pas deparamegravetre (le constructeur par deacutefaut deacutefini agrave la section laquo Deacutefinir le constructeur drsquouneclasse raquo) et les valeurs du centre et du rayon du cercle A sont celles saisies au clavier parlrsquoutilisateur

La creacuteation de lrsquoobjet B fait appel au constructeur qui possegravede deux paramegravetres de typeentier Les valeurs du centre et du rayon du cercle B sont donc celles passeacutees en para-megravetre du constructeur soit (10 10) pour (Bx By) Aucune valeur nrsquoeacutetant preacuteciseacutee pourle rayon Br est automatiquement initialiseacute agrave 0

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

192

Le mot-cleacute this

La creacuteation de lrsquoobjet C est reacutealiseacutee par le constructeur qui possegravede trois paramegravetresentiers Ces paramegravetres permettent lrsquoinitialisation de toutes les donneacutees deacutefinies dans laclasse Cercle

Remarquons que gracircce agrave lrsquoinstruction this(centrex centrey) le constructeur posseacute-dant deux paramegravetres est appeleacute agrave lrsquointeacuterieur du constructeur posseacutedant trois paramegravetres

Le mot-cleacute this() repreacutesente lrsquoappel au second constructeur de la mecircme classe posseacutedantdeux paramegravetres entiers puisque this() est appeleacute avec deux paramegravetres entiers Il permetlrsquoutilisation du constructeur preacuteceacutedent pour initialiser les coordonneacutees du centre avantdrsquoinitialiser correctement la valeur du rayon gracircce agrave la meacutethode rayonVeacuterifieacute(rayon) quiest elle-mecircme surchargeacutee Comme pour les constructeurs le compilateur choisit lameacutethode rayonVeacuterifieacute() deacutefinie avec un paramegravetre entier

Pour finir remarquons que le terme this() doit toujours ecirctre placeacute comme premiegravereinstruction du constructeur qui lrsquoutilise

LrsquoheacuteritageLrsquoheacuteritage est le dernier concept fondamental de la programmation objet eacutetudieacutee dans cechapitre Ce concept permet la reacuteutilisation des fonctionnaliteacutes drsquoune classe tout enapportant certaines variations speacutecifiques de lrsquoobjet heacuteritant

Avec lrsquoheacuteritage les meacutethodes deacutefinies pour un ensemble de donneacutees sont reacuteutilisablespour des variantes de cet ensemble Par exemple si nous supposons qursquoune classe Formedeacutefinisse un ensemble de comportements propres agrave toute forme geacuteomeacutetrique alors

bull Ces comportements peuvent ecirctre reacuteutiliseacutes par la classe Cercle qui est une formegeacuteomeacutetrique particuliegravere Cette reacuteutilisation est effectueacutee sans avoir agrave modifier lesinstructions de la classe Forme

bull Il est possible drsquoajouter drsquoautres comportements speacutecifiques des objets Cercle Cesnouveaux comportements sont valides uniquement pour la classe Cercle et non pourla classe Forme

La relation laquo est un raquo

En pratique pour deacuteterminer si une classe B heacuterite drsquoune classe A il suffit de savoir srsquoilexiste une relation laquo est un raquo entre B et A Si tel est le cas la syntaxe de deacuteclaration est lasuivante

class B extends A donneacutees et meacutethodes de la classe B

Dans ce cas on dit que

bull B est une sous-classe de A ou encore une classe deacuteriveacutee de A

bull A est une super-classe ou encore une classe de base copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

193

Un cercle laquo est une raquo forme geacuteomeacutetrique

En supposant que la classe Forme possegravede des caracteacuteristiques communes agrave chaque typede forme geacuteomeacutetrique (les coordonneacutees drsquoaffichage agrave lrsquoeacutecran la couleur etc) ainsi quedes comportements communs (afficher deacuteplacer etc) la classe Forme srsquoeacutecrit de la faccedilonsuivante

public class Forme protected int x y private couleur

public Forme() Le constructeur de la classe Forme Systemoutprint( Position en x ) x = Lirei() Systemoutprint( Position en y ) y = Lirei() Systemoutprint( Couleur de la forme ) couleur = Lirei()

public void afficher() Affichage des donneacutees de la classe Systemoutprintln( Position en + x + + y) Systemoutprintln( Couleur + couleur)

public void deacuteplacer(int nx int ny) Deacuteplace les coordonneacutees de la x = nx forme en (nx ny) passeacutees en y = ny paramegravetre de la fonction Fin de la classe Forme

Sachant qursquoun objet Cercle laquo est une raquo forme geacuteomeacutetrique particuliegravere la classe Cercleheacuterite de la classe Forme en eacutecrivant

public class Cercle extends Forme private int r rayon

public Cercle() Le constructeur de la classe Cercle Systemoutprint( Rayon ) r = rayonVeacuterifieacute()private int rayonVeacuterifieacute() Voir la section Des meacutethodes invisibles private int rayonVeacuterifieacute (int tmp) Voir la section Des meacutethodes invisibles

public void afficher() Affichage des donneacutees de la classe superafficher() Systemoutprintln( Rayon + r)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

194

public double peacuterimegravetre() voir la section La classe descriptive du type Cercle du chapitre Les classes et les objets public void agrandir(int nr) Augmente la valeur courante du r = rayonVeacuterifieacute(r + nr) rayon avec la valeur passeacutee en paramegravetre Fin de la classe Cercle

Un cercle est une forme geacuteomeacutetrique (Cercle extends Forme) qui possegravede un rayon(private int r) et des comportements propres aux cercles soit par exemple le calculdu peacuterimegravetre (peacuterimegravetre()) ou encore la modification de sa taille (agrandir()) Uncercle peut ecirctre deacuteplaceacute comme toute forme geacuteomeacutetrique Les meacutethodes de la classeForme restent donc opeacuterationnelles pour les objets Cercle

En examinant de plus pregraves les classes Cercle et Forme nous remarquons que

bull La notion de constructeur existe aussi pour les classes deacuteriveacutees (voir la section laquo Leconstructeur drsquoune classe heacuteriteacutee raquo)

bull Les donneacutees x y sont deacuteclareacutees protected (voir la section laquo La protection desdonneacutees heacuteriteacutees raquo)

bull La fonction afficher() existe sous deux formes diffeacuterentes dans la classe Forme et laclasse Cercle Il srsquoagit lagrave du concept de polymorphisme (voir la section laquo Lepolymorphisme raquo)

Le constructeur drsquoune classe heacuteriteacuteeLes classes deacuteriveacutees possegravedent leurs propres constructeurs qui sont appeleacutes par lrsquoopeacutera-teur new comme dans

Cercle A = new Cercle( )

Pour construire un objet deacuteriveacute il est indispensable de construire drsquoabord lrsquoobjet associeacuteagrave la classe megravere Pour construire un objet Cercle nous devons deacutefinir ses coordonneacuteeset sa couleur Le constructeur de la classe Cercle doit appeler le constructeur de la classeForme

Par deacutefaut srsquoil nrsquoy a pas drsquoappel explicite au constructeur de la classe supeacuterieure commecrsquoest le cas pour notre exemple le compilateur recherche de lui-mecircme le constructeurpar deacutefaut (sans paramegravetre) de la classe supeacuterieure En construisant lrsquoobjet A lrsquointerpreacute-teur exeacutecute aussi le constructeur par deacutefaut de la classe Forme Lrsquoensemble des donneacuteesdu cercle (x y couleur et r) est alors correctement initialiseacute par saisie des valeurs auclavier

Ce fonctionnement pose problegraveme lorsqursquoil nrsquoexiste pas de constructeur par deacutefautSupposons que nous remplacions le constructeur de la classe Forme par

public Forme(int nx int ny) Le nouveau constructeur de la x = nx classe Forme

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

195

y = ny couleur = 0

Dans cette situation lors de la construction de lrsquoobjet A le compilateur recherche leconstructeur par deacutefaut de la classe supeacuterieure soit Forme() sans paramegravetre Ne le trou-vant pas il annonce une erreur du type no constructor matching Forme() found inclass Forme

Le mot-cleacute super

Pour eacuteviter ce type drsquoerreur la solution consiste agrave appeler directement le constructeur dela classe megravere depuis le constructeur de la classe

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) Systemoutprint( Rayon ) r = rayonVeacuterifieacute()

De cette faccedilon comme le terme super() qui repreacutesente le constructeur de la classesupeacuterieure possegravedant deux entiers en paramegravetres lrsquointerpreacuteteur peut finalement cons-truire lrsquoobjet A (Cercle A = new Cercle(5 5)) par appel du constructeur de la classeForme agrave lrsquointeacuterieur du constructeur de la classe Cercle

Remarquons que le terme super est obligatoirement la premiegravere instruction du construc-teur de la classe deacuteriveacutee La liste des paramegravetres (deux int) permet de preacuteciser au compi-lateur quel est le constructeur utiliseacute en cas de surcharge de constructeurs

La protection des donneacutees heacuteriteacuteesEn heacuteritant de la classe A la classe B heacuterite des donneacutees et meacutethodes de la classe A Celane veut pas forceacutement dire que la classe B ait accegraves agrave toutes les donneacutees et meacutethodes dela classe A En effet heacuteritage nrsquoest pas synonyme drsquoaccessibiliteacute

Lorsqursquoune donneacutee de la classe supeacuterieure est deacuteclareacutee en mode private la classedeacuteriveacutee ne peut ni consulter ni modifier directement cette donneacutee heacuteriteacutee Lrsquoaccegraves ne peutse reacutealiser qursquoau travers des meacutethodes de la classe supeacuterieure

Pour notre exemple la donneacutee couleur eacutetant deacuteclareacutee private dans la classe Forme leconstructeur suivant geacutenegravere lrsquoerreur variable couleur in class Forme not acces-sible from class Cercle

public Cercle(int xx int yy) Le constructeur de la classe Cercle super(xx yy) couleur = 20 r = 10

Il est possible gracircce agrave la protection protected drsquoautoriser lrsquoaccegraves en consultation etmodification des donneacutees de la classe supeacuterieure Toutes les donneacutees de la classe A sontalors accessibles depuis la classe B mais pas depuis une autre classe

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

196

Dans notre exemple si la donneacutee couleur est deacuteclareacutee protected dans la classe Formealors le constructeur de la classe Cercle peut modifier sa valeur

Le polymorphismeLa notion de polymorphisme deacutecoule directement de lrsquoheacuteritage Par polymorphisme ilfaut comprendre qursquoune meacutethode peut se comporter diffeacuteremment suivant lrsquoobjet surlequel elle est appliqueacutee

Lorsqursquoune mecircme meacutethode est deacutefinie agrave la fois dans la classe megravere et dans la classe fillelrsquoexeacutecution de la forme (meacutethode) choisie est reacutealiseacutee en fonction de lrsquoobjet associeacute agravelrsquoappel et non plus suivant le nombre et le type des paramegravetres comme crsquoest le cas lorsde la surcharge de meacutethodes agrave lrsquointeacuterieur drsquoune mecircme classe

Pour notre exemple la meacutethode afficher() est deacutecrite dans la classe Forme et dans laclasse Cercle Cette double deacutefinition ne correspond pas agrave une veacuteritable surcharge defonctions Ici les deux meacutethodes afficher() sont deacutefinies sans aucun paramegravetre Lechoix de la meacutethode ne peut donc srsquoeffectuer sur la diffeacuterence des paramegravetres Il esteffectueacute par rapport agrave lrsquoobjet sur lequel la meacutethode est appliqueacutee Observons lrsquoexeacutecutiondu programme suivant

public class FormerDesCercles public static void main(String [] arg) Cercle A = new Cercle(5 5) Aafficher() Forme F = new Forme (10 10 3) Fafficher()

Lrsquoappel du constructeur de lrsquoobjet A nous demande de saisir la valeur du rayon

Rayon 7

La meacutethode afficher() est appliqueacutee agrave A Puisque A est de type Cercle lrsquoaffichagecorrespond agrave celui reacutealiseacute par la meacutethode deacutefinie dans la classe Cercle soit

Position en 5 5Couleur 20Rayon 7

La forme F est ensuite creacuteeacutee puis afficheacutee agrave lrsquoaide la meacutethode afficher() de la classeForme F eacutetant de type Forme

Position en 10 1Couleur 3

Remarquons que lorsqursquoune meacutethode heacuteriteacutee est deacutefinie une deuxiegraveme fois dans laclasse deacuteriveacutee lrsquoheacuteritage est supprimeacute Le fait drsquoeacutecrire Aafficher() ne permet plusdrsquoappeler directement la meacutethode afficher() de la classe Forme

Pour appeler la meacutethode deacutefinie dans la classe supeacuterieure la solution consiste agrave utiliserle terme super qui recherche la meacutethode agrave exeacutecuter en remontant dans la hieacuterarchie

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

197

Dans notre exemple superafficher() permet drsquoappeler la meacutethode afficher() de laclasse Forme

Gracircce agrave cette technique si la meacutethode drsquoaffichage pour une Forme est transformeacutee cettetransformation est automatiquement reacutepercuteacutee pour un Cercle

ReacutesumeacuteLorsque lrsquointerpreacuteteur Java rencontre le mot-cleacute static devant une variable (variablede classe) il reacuteserve un seul et unique emplacement meacutemoire pour cette variable Si cemot-cleacute est absent lrsquointerpreacuteteur peut construire en meacutemoire la variable deacuteclareacutee nonstatic (variable drsquoinstance) en plusieurs exemplaires Cette preacutesence ou cetteabsence du mot-cleacute static permet de diffeacuterencier les variables des objets

Les objets sont deacutefinis en meacutemoire par lrsquointermeacutediaire drsquoune adresse (reacutefeacuterence)Lorsqursquoun objet est passeacute en paramegravetre drsquoune fonction la valeur passeacutee au paramegravetreformel est lrsquoadresse de lrsquoobjet De cette faccedilon si la meacutethode transforme les donneacutees duparamegravetre formel elle modifie aussi les donneacutees de lrsquoobjet effectivement passeacute en para-megravetre Ainsi tout objet passeacute en paramegravetre drsquoune meacutethode voit en sortie de la meacutethodeses donneacutees transformeacutees par la meacutethode Ce mode de transmission des donneacutees estappeleacute passage de paramegravetres par reacutefeacuterence

Lrsquoobjectif principal de la programmation objet est drsquoeacutecrire des programmes quicontrocirclent par eux-mecircmes le bien-fondeacute des opeacuterations qui leur sont appliqueacutees Cecontrocircle est reacutealiseacute gracircce au principe drsquoencapsulation des donneacutees Par ce terme ilfaut comprendre que les donneacutees drsquoun objet sont proteacutegeacutees de la mecircme faccedilon qursquounmeacutedicament est proteacutegeacute par la fine capsule qui lrsquoentoure Lrsquoencapsulation passe parle controcircle des donneacutees et des comportements de lrsquoobjet agrave travers les niveaux deprotection lrsquoaccegraves controcircleacute aux donneacutees et la notion de constructeur de classe

Le langage Java propose trois niveaux de protection public private et protectedLorsqursquoune donneacutee est totalement proteacutegeacutee (private) elle ne peut ecirctre modifieacutee quepar les meacutethodes de la classe ougrave la donneacutee est deacutefinie

On distingue les meacutethodes qui consultent la valeur drsquoune donneacutee sans pouvoir lamodifier (accesseur en consultation) et celles qui modifient apregraves controcircle et vali-dation la valeur de la donneacutee (accesseur en modification)

Les constructeurs sont des meacutethodes particuliegraveres deacuteclareacutees uniquement public quiportent le mecircme nom que la classe ougrave ils sont deacutefinis Ils permettent le controcircle et lavalidation des donneacutees degraves leur initialisation

Par deacutefaut si aucun constructeur nrsquoest deacutefini dans une classe le langage Javapropose un constructeur par deacutefaut qui initialise toutes les donneacutees de la classe agrave 0ou agrave null si les donneacutees sont des objets Si un constructeur est deacutefini le construc-teur par deacutefaut nrsquoexiste plus

Lrsquoheacuteritage permet la reacuteutilisation des objets et de leur comportement tout en apportantde leacutegegraveres variations Il se traduit par le principe suivant on dit qursquoune classe B heacuteritedrsquoune classe A (B eacutetant une sous-classe de A) lorsqursquoil est possible de mettre la relationlaquo est un raquo entre B et A

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

198

Le projet laquo Gestion drsquoun compte bancaire raquoEncapsuler les donneacutees drsquoun compte bancaireLa protection priveacutee et lrsquoaccegraves aux donneacutees

a Deacuteclarez toutes les variables drsquoinstance des types Compte et LigneComptable enmode private Que se passe-t-il lors de la phase de compilation de lrsquoapplicationProjet

Pour remeacutedier agrave cette situation la solution est de construire des meacutethodes drsquoaccegraves auxdonneacutees de la classe Compte et LigneComptable Ces meacutethodes ont pour objectif defournir au programme appelant la valeur de la donneacutee rechercheacutee Par exemple lafonction quelTypeDeCompte() suivante fournit en retour le type du compte rechercheacute

public String quelTypeDeCompte() return typeCpte

b Eacutecrivez suivant le mecircme modegravele toutes les meacutethodes drsquoaccegraves aux donneacuteesval_courante taux numeacuteroCpte etc

c Modifiez lrsquoapplication Projet et la classe Compte de faccedilon agrave pouvoir acceacuteder auxdonneacutees numeacuteroCpte de la classe Compte et aux valeurs de la classe LigneComptable

Le controcircle des donneacutees

Lrsquoencapsulation des donneacutees permet le controcircle de la validiteacute des donneacutees saisies pour unobjet Un compte bancaire ne peut ecirctre que de trois types Epargne Courant ou JointIl est donc neacutecessaire au moment de la saisie du type du compte de controcircler lrsquoexacti-tude du type entreacute La meacutethode controcircleType() suivante reacutealise ce controcircle

private String controcircleType() char tmpc String tmpS = Courant do Systemoutprint(Type du compte [Types possibles C(ourant) ) Systemoutprint(J(oint) E(pargne)] ) tmpc = Lirec() while ( tmpc = rsquoCrsquo ampamp tmpc = rsquoJrsquo ampamp tmpc = rsquoErsquo) switch (tmpc) case rsquoCrsquo tmpS = Courant break

De cette faccedilon toutes les meacutethodes ainsi que les donneacutees deacuteclareacutees public ouprotected de la classe A sont applicables agrave la classe B La syntaxe de deacuteclaration drsquounesous-classe est la suivante

class B extends A donneacutees et meacutethodes de la classe B

copy copyright Eacuteditions Eyrolles

Les principes du concept drsquoobjetCHAPITRE 8

199

case rsquoJrsquo tmpS = Joint break case rsquoErsquo tmpS = Epargne break return tmpS

Agrave la sortie de la fonction nous sommes certains que le type retourneacute correspond auxtypes autoriseacutes par le cahier des charges

a Dans la classe Compte sachant que la valeur initiale ne peut ecirctre neacutegative agrave la creacutea-tion drsquoun compte eacutecrivez la meacutethode controcircleValinit()

b Dans la classe LigneComptable eacutecrivez les meacutethodes controcircleMotif() et controcirc-leMode() qui veacuterifient respectivement le motif (Salaire Loyer AlimentationDivers) et le mode (CB Virement Chegraveque) de paiement pour une ligne comptable

Pour controcircler la validiteacute de la date voir la section laquo Le projethellip raquo du chapitre 10 laquo Collectionner unnombre indeacutetermineacute drsquoobjets raquo

c Modifiez les meacutethodes creacuteerCpte() et creacuteerLigneComptable() de faccedilon que lesdonneacutees des classes Compte() et LigneComptable() soient valides

Les constructeurs de classe

Les constructeurs Compte() et LigneComptable() srsquoinspirent pour une grande part desmeacutethodes creacuteerCpte() et creacuteerLigneComptable()

a Remplacez directement creacuteerCpte() par Compte() Que se passe-t-il lors delrsquoexeacutecution du programme

b Deacuteplacez lrsquoappel au constructeur dans lrsquooption 1 de faccedilon agrave construire lrsquoobjet aumoment de sa creacuteation Que se passe-t-il en phase de compilation Pourquoi

c Utilisez la notion de surcharge de constructeur pour construire un objet C de deuxfaccedilons

bull Les valeurs initiales du compte sont passeacutees en paramegravetre

bull Les valeurs initiales sont saisies au clavier comme le fait la meacutethode creacuteerCpte()

d Agrave lrsquoaide de ces deux constructeurs modifiez lrsquoapplication Projet de faccedilon agrave pouvoirlrsquoexeacutecuter correctement

Comprendre lrsquoheacuteritageProtection des donneacutees heacuteriteacutees

Sachant qursquoun compte drsquoeacutepargne est un compte bancaire ayant un taux de reacutemuneacuteration

a Eacutecrivez la classe CpteEpargne en prenant soin de deacuteclarer la nouvelle donneacutee enmode private

b Modifiez le type Compte de faccedilon agrave supprimer tout ce qui fait appel au comptedrsquoeacutepargne (donneacutee et meacutethodes)

copy copyright Eacuteditions Eyrolles

Initiation agrave la programmation orienteacutee objetPARTIE 2

200

Un compte drsquoeacutepargne modifie la valeur courante par le calcul des inteacuterecircts en fonc-tion du taux drsquoeacutepargne Il ne peut ni modifier son numeacutero ni son type

c Quels modes de protection doit-on appliquer aux diffeacuterentes donneacutees heacuteriteacutees de laclasse Compte

Le controcircle des donneacutees drsquoun compte drsquoeacutepargneSachant que le taux drsquoun compte drsquoeacutepargne ne peut ecirctre neacutegatif eacutecrivez la meacutethodecontrocircleTaux()

Le constructeur drsquoune classe deacuteriveacuteeEn supposant que le constructeur de la classe CpteEpargne srsquoeacutecrive de la faccedilon suivante

public CpteEpargne() super(Epargne) taux = controcircleTaux()

a Recherchez agrave quel constructeur de la classe Compte fait appel CpteEpargne() Pour-quoi

b Modifiez ce constructeur de faccedilon que la donneacutee typeCpte prenne la valeur Epargne

Le polymorphisme De la meacutethode afficherCpte()

a Dans la classe CpteEpargne eacutecrivez la meacutethode afficherCpte() sachant qursquoaffi-cher les donneacutees drsquoun compte drsquoeacutepargne revient agrave afficher les donneacutees drsquoun comptesuivi du taux drsquoeacutepargne

De lrsquoobjet C deacuteclareacute de type Compte

b Dans lrsquoapplication Projet modifiez lrsquooption 1 de faccedilon agrave demander agrave lrsquoutilisateursrsquoil souhaite creacuteer un compte simple ou un compte drsquoeacutepargne Selon la reacuteponseconstruisez lrsquoobjet C en appelant le constructeur approprieacute

copy copyright Eacuteditions Eyrolles

PARTIE 3

Les outils et techniques orienteacutes objet

CHAPITRE 9

Collectionner un nombre fixe drsquoobjets 203

CHAPITRE 10

Collectionner un nombre indeacutetermineacute drsquoobjets 231

CHAPITRE 11

Dessiner des objets 259

copy copyright Eacuteditions Eyrolles

9Collectionner

un nombre fixe drsquoobjets

Comme nous lrsquoavons observeacute tout au long de cet ouvrage lrsquoatout principal de lrsquoordina-teur est sa capaciteacute agrave manipuler un grand nombre de donneacutees pour en extraire denouvelles informations Or les structures de stockage eacutetudieacutees jusqursquoici telles que varia-bles ou objets ne permettent pas drsquoappliquer de traitements systeacutematiques sur desensembles de valeurs

Crsquoest pourquoi nous eacutetudions dans ce chapitre une nouvelle structure de donneacutees lestableaux qui permettent le stockage drsquoun nombre fini de valeurs

Dans un premier temps nous eacutetudions laquo Les tableaux agrave une dimension raquo et observonscomment les deacuteclarer et les manipuler Pour mieux comprendre la manipulation de cesstructures nous analysons ensuite agrave la section laquo Quelques techniques utiles raquo diffeacute-rentes techniques de programmation appliqueacutees aux tableaux agrave une dimension telles quela recherche drsquoune valeur dans un tableau ou le tri drsquoun tableau

Pour finir nous examinons agrave la section laquo Les tableaux agrave deux dimensions raquo commentconstruire et manipuler des tableaux bidimensionnels agrave travers un exemple drsquoaffichagede formes geacuteomeacutetriques

Les tableaux agrave une dimensionLrsquoeacutetude du chapitre 1 laquo Stocker une information raquo montre que pour manipuler plusieursvaleurs agrave lrsquointeacuterieur drsquoun programme vous devez deacuteclarer autant de variables que devaleurs agrave traiter Ainsi pour stoker les huit notes drsquoun eacutelegraveve donneacute la technique consisteagrave deacuteclarer huit variables comme suit

double note1 note2 note3 note4 note5 note6 note7 note8 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

204

Le fait de deacuteclarer autant de variables qursquoil y a de valeurs preacutesente les inconveacutenientssuivants

bull Si le nombre de notes est modifieacute il est neacutecessaire de

ndash Deacuteclarer de nouvelles variables

ndash Placer ces variables dans le programme afin de les traiter en plus des autres notes

ndash Compiler agrave nouveau le programme pour que lrsquointerpreacuteteur puisse prendre encompte ces modifications

bull Il faut trouver un nom de variable pour chaque valeur traiteacutee Imaginez deacuteclarer1 000 variables portant un nom diffeacuterent

Ces inconveacutenients majeurs sont reacutesolus gracircce aux tableaux En effet les tableaux sontdes structures de donneacutees qui regroupent sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Les tableaux sont proposeacutes par tous les langages deprogrammation Ils sont construits par assemblage drsquoune suite finie de cases meacutemoirecomme illustreacute agrave la Figure 9-1

Chaque case repreacutesente lrsquoespace meacutemoire neacutecessaire au stockage drsquoune et une seulevaleur Remarquez que les cases sont reacuteserveacutees en meacutemoire de faccedilon contigueuml

Deacuteclarer un tableauComme toute variable utiliseacutee dans un programme un tableau doit ecirctre deacuteclareacute afin de

bull donner un nom agrave lrsquoensemble des valeurs agrave regrouper

bull deacutefinir la taille du tableau de faccedilon agrave preacuteciser le nombre de valeurs agrave regrouper

bull deacuteterminer le type de valeur agrave meacutemoriser

La syntaxe de deacuteclaration drsquoun tableau est la suivante

TypeDuTableau [] nomDuTableau nomDuTableau = new TypeDuTableau [tailleDuTableau]

En placcedilant dans la premiegravere instruction les crochets [] entre le type et le nom de la variablevous indiquez au compilateur que la variable nomDuTableau repreacutesente un tableau Agrave cetteeacutetape le compilateur reacuteserve un espace meacutemoire portant le nom du tableau Cet espacemeacutemoire est susceptible de contenir lrsquoadresse de la premiegravere case du tableau

Ensuite dans la seconde instruction lrsquoopeacuterateur new reacuteserve autant de cases meacutemoireconseacutecutives qursquoil est indiqueacute entre les [] situeacutes en fin drsquoinstruction soit tailleDuTableau

Figure 9-1

Lrsquoopeacuterateur new reacuteserve le nombre de cases meacutemoire demandeacute ([8]) et meacutemorise lrsquoadresse de la premiegravere case meacutemoire dans la variable notes gracircce au signe drsquoaffectation

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

205

Lrsquoopeacuterateur new deacutetermine enfin lrsquoadresse de la premiegravere case du tableau et la stockegracircce au signe drsquoaffectation dans la case nomDuTableau creacuteeacutee agrave lrsquoeacutetape preacuteceacutedente

Exemple Deacuteclarer un tableau de huit notes

double [] notes notes = new double[8]

Ces deux instructions reacutealisent la deacuteclaration drsquoun tableau ayant pour nom note Il estcomposeacute de 8 cases meacutemoire pouvant stocker des valeurs de type double (voir Figure 9-1)

Autres exemples de deacuteclaration

deacuteclarer un tableau de 5 entiersint [] valeur valeur = new int[5] deacuteclarer un tableau de 30 reacuteels de simple preacutecision float [] reel reel = new float[30] deacuteclarer un tableau de 80 caractegravereschar [] mot mot = new char[80]

Remarques

bull Le nombre de cases reacuteserveacutees correspond au nombre maximal de valeurs agrave traiterLorsque la taille du tableau est fixeacutee apregraves exeacutecution de lrsquoopeacuterateur new il nrsquoest pluspossible de la modifier en cours drsquoexeacutecution du programme

Cependant il est possible de ne pas fixer deacutefinitivement la taille du tableau avantcompilation en placcedilant une variable entre les [] au lieu drsquoune valeur numeacuterique Eneffet il suffit drsquoeacutecrire

double [] notesint nbNotes Systemoutprintln(Combien voulez-vous saisir de notes ) nbNotes = Lirei() notes = new double[nbNotes]

De cette faccedilon lrsquoutilisateur saisit le nombre de valeurs qursquoil souhaite traiter avant lareacuteservation effective des espaces meacutemoire par lrsquoopeacuterateur new Le programme peutdonc voir la taille du tableau varier drsquoune exeacutecution agrave lrsquoautre

bull Les tableaux sont des objets En effet les tableaux sont deacutefinis agrave lrsquoaide drsquoune adressedeacutetermineacutee par lrsquoopeacuterateur new Les tableaux sont donc des objets au mecircme titre queles String et autres objets deacutefinis aux chapitres preacuteceacutedents

Les objets sont caracteacuteriseacutes par leurs donneacutees et les meacutethodes qui leur sont applica-bles Une donneacutee caracteacuteristique des tableaux est leur taille crsquoest-agrave-dire le nombre decases Ainsi pour connaicirctre la taille drsquoun tableau il suffit de placer le terme lengthderriegravere le nom du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

206

Par exemple lrsquoinstruction suivante

Systemoutprint(Nombre de notes = + noteslength)

affiche agrave lrsquoeacutecran Nombre de notes = 8

bull Lrsquoinstruction de deacuteclaration

double [] notes = new double[8]

est eacutequivalente agrave la suite drsquoinstructions

double [] notes notes = new double[8]

Manipuler un tableauUn tableau est un ensemble de cases meacutemoire Chaque case constituant un eacuteleacutement dutableau est identique agrave une variable Il est possible de manipuler chaque case du tableaude faccedilon agrave

bull placer une valeur dans une case du tableau agrave lrsquoaide de lrsquoaffectation

bull utiliser un eacuteleacutement du tableau dans le calcul drsquoune expression matheacutematique

bull afficher un eacuteleacutement du tableau

Acceacuteder aux eacuteleacutements drsquoun tableau

Sachant que nomDuTableau[0] repreacutesente la premiegravere case du tableau lrsquoaccegraves agrave la niegravemecase srsquoeacutecrit nomDuTableau[n]

Par exemple lrsquoinstruction

note[0] = 10

meacutemorise la premiegravere note drsquoun eacutetudiant dans la premiegravere case du tableau (notes[0])De la mecircme faccedilon la deuxiegraveme note est stockeacutee gracircce agrave lrsquoaffectation

note[1] = 5

Et ainsi de suite jusqursquoagrave stoker la huitiegraveme et derniegravere note agrave lrsquoaide de lrsquoinstruction

note[7] = 9

Figure 9-2

Note est le nom du tableau et les notes 10 5 hellip 9 sont des valeurs placeacutees agrave lrsquoaide du signe drsquoaffectation dans les cases numeacuteroteacutees respectivement 0 1 hellip 7 (indices)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

207

Les valeurs placeacutees entre les crochets [] sont appeleacutees les indices du tableau Remar-quez que la premiegravere case du tableau est numeacuteroteacutee agrave partir de 0 et non de 1 (voirFigure 9-2) Lrsquoindice du tableau varie donc entre 0 et length-1 Les eacuteleacutements drsquountableau eacutetant ordonneacutes gracircce aux indices il est possible drsquoy acceacuteder agrave lrsquoaide de construc-tions iteacuteratives (boucle for) comme le montre lrsquoexemple suivant

Exemple Extrait drsquoun programme

Systemoutprint(Combien de notes voulez-vous saisir )int nombre = Lirei()notes = new double [nombre]for (int i = 0 i lt noteslength i++) Systemoutprint(Entrer la note ndeg + (i + 1)+ ) notes[i] = Lired()

Exemple Reacutesultat de lrsquoexeacutecution

Les caractegraveres griseacutes sont des valeurs choisies par lrsquoutilisateur

Combien de notes voulez-vous saisir 44Entrer la note ndeg 1 1144Entrer la note ndeg 2 1100Entrer la note ndeg 3 1122Entrer la note ndeg 4 88

Une fois le nombre de notes deacutetermineacute gracircce aux deux premiegraveres instructions leprogramme entre dans une boucle for La variable i correspond au compteur de boucleElle varie entre 0 et noteslength-1 (soit 3) puisque la condition de continuationpreacutecise que i doit ecirctre strictement infeacuterieure agrave noteslength (soit 4)

Agrave chaque tour de boucle la variable i prend la valeur de lrsquoindice du tableau (notes[i])Les valeurs saisies au clavier sont alors placeacutees une agrave une dans chaque case du tableau

Parce qursquoil nrsquoest pas courant de compter des valeurs agrave partir de 0 lrsquoaffichage demandantdrsquoentrer une note deacutebute agrave 1 et non agrave 0 gracircce agrave lrsquoexpression (i+1) placeacutee dans lameacutethode Systemoutprint() Il ne srsquoagit lagrave que drsquoun artifice de preacutesentation lapremiegravere note eacutetant stockeacutee en reacutealiteacute en note[0]

Remarquez que lrsquoutilisation de la donneacutee length permet drsquoeacuteviter tout problegraveme dedeacutepassement de taille En effet si un tableau est composeacute de quatre cases il nrsquoest paspossible de placer une valeur agrave lrsquoindice 4 ou 5 Le fait drsquoeacutecrire notes[4] geacutenegravere uneerreur drsquoexeacutecution du type javalangArrayIndexOutOfBoundsException qui montreque lrsquointerpreacuteteur Java a deacutetecteacute que lrsquoindice du tableau eacutetait en dehors des limites deacutefi-nies au moment de sa creacuteation

Initialiser un tableau

Lors de la deacuteclaration drsquoun tableau il est possible de lrsquoinitialiser directement de la faccedilonsuivante

double [] notes = 10 125 5 85 16 0 13 7 copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

208

Les cases meacutemoire sont reacuteserveacutees et initialiseacutees dans lrsquoordre agrave lrsquoaide des valeurs placeacuteesentre les et seacutepareacutees par des virgules De cette faccedilon le tableau notes contient lesvaleurs suivantes

notes[0] vaut 10 notes[4] vaut 16

notes[1] vaut 125 notes[5] vaut 0

notes[2] vaut 5 notes[6] vaut 13

notes[3] vaut 85 notes[7] vaut 7

Remarquez que la donneacutee noteslength prend automatiquement la valeur 8

Les tableaux et les opeacuterations arithmeacutetiques

La somme la soustraction la division ou la multiplication directes de deux tableaux sontdes opeacuterations impossibles En effet chaque opeacuteration doit ecirctre reacutealiseacutee eacuteleacutement pareacuteleacutement comme le montre le tableau suivant

Quelques techniques utilesLe stockage et lrsquoutilisation des donneacutees agrave travers la structure des tableaux offrent denombreux avantages Elles requiegraverent aussi certaines techniques de manipulation quisont deacuteveloppeacutees ci-apregraves

La ligne de commandeAu cours du chapitre laquo Naissance drsquoun programme raquo vous avez ducirc admettre un certainnombre de termes du langage Java et en particulier la syntaxe de lrsquoinstruction suivante

public static void main(String [] argument)

Cette instruction correspond agrave la deacutefinition de lrsquoen-tecircte de la fonction main() Vous ecirctesen mesure maintenant de deacutechiffrer chacun de ses termes pour en comprendre lrsquoutiliteacute

bull Le mot cleacute public preacutecise au compilateur que la fonction main() est accessible depuislrsquoexteacuterieur de la classe ougrave elle est deacutefinie En particulier lrsquointerpreacuteteur Java peut yacceacuteder pour lrsquoexeacutecuter

bull Le terme static explique que la fonction main() ne peut pas ecirctre copieacutee plusieurs foisen meacutemoire Elle ne peut pas ecirctre associeacutee agrave un objet ni ecirctre instancieacutee crsquoest-agrave-direqursquoil nrsquoest pas possible drsquoeacutecrire unObjetmain()

bull La fonction main() ne fournit pas de reacutesultat et crsquoest pourquoi elle est deacutefinie commevoid

Correcte Impossible

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]for (i = 0 i lt 10 i++)somme[i] = tab1[i] + tab2[i]

int [] tab1 = new int[10] int [] tab2 = new int[10]int [] somme = new int[10]

somme = tab1 + tab2

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

209

bull Pour finir elle possegravede entre () un paramegravetre deacutefini comme tableau de type StringCe paramegravetre est utiliseacute pour passer des donneacutees en ligne de commande lors dulancement de la commande drsquoexeacutecution du programme

Qursquoest-ce qursquoune ligne de commande

Une ligne de commande est eacutecrite au clavier sous la forme drsquoune instruction preacutecise Crsquoestun ordre transmis agrave lrsquoordinateur par lrsquoutilisateur Sous Unix les commandes sont tregraves utili-seacutees Elles le sont beaucoup moins sous Windows et sont inexistantes sous Mac OS Crsquoestpourquoi les utilisateurs de stations de travail Unix nrsquoont aucune difficulteacute agrave comprendrece qursquoest une commande ce qui nrsquoest pas le cas des utilisateurs de PC (sous Windows) oude Macintosh

Aujourdrsquohui gracircce aux eacutecrans graphiques lrsquoutilisateur communique facilement aveclrsquoordinateur Pour savoir ce que contient un dossier il lui suffit drsquoouvrir la fenecirctre asso-cieacutee agrave ce dossier Les ordres passeacutes agrave lrsquoordinateur sont essentiellement des ordres geacuteneacutereacutespar la souris au travers de fenecirctres graphiques

Les lignes de commande sont eacutequivalentes bien que moins conviviales agrave cette commu-nication graphique Elles permettent surtout drsquoobtenir des reacutesultats plus preacutecis Ainsi lescommandes

bull ls java dans une fenecirctre de commandes Unix

bull dir java dans une fenecirctre laquo commandes MSDOS raquo

ont pour reacutesultat drsquoafficher tous les noms de fichiers finissant par java contenus dans lereacutepertoire courant

Plus preacuteciseacutement remarquez qursquoune commande srsquoeacutecrit toujours de la faccedilon suivante

nomDeLaCommande paramegravetresEventuels

Le nom drsquoune commande correspond au nom du programme qui reacutealise lrsquoactionsouhaiteacutee Les paramegravetres sont utiliseacutes pour affiner son reacutesultat Dans notre exemplejava est un paramegravetre des commandes ls ou dir qui permet drsquoexpliquer agrave lrsquoordina-teur que vous souhaitez voir srsquoafficher uniquement les noms de fichiers finissant parjava

Passer des paramegravetres agrave un programme Java

De la mecircme faccedilon comme expliqueacute agrave la section laquo Exeacutecuter un programme raquo duchapitre introductif laquo Naissance drsquoun programme raquo lrsquoexeacutecution drsquoun programme Java endehors drsquoun environnement de travail passe aussi par une commande dont la syntaxe est

java nomdelrsquoapplication

Lrsquointerpreacuteteur Java autorise aussi la commande

java nomdelrsquoapplication p0 p1 p2hellip pN

Dans ce cas les valeurs p0 p1 p2 hellip pN toutes seacutepareacutees par des espaces sont consideacute-reacutees comme paramegravetres de la commande java nomdelrsquoapplication Ces derniers sonttransmis agrave la fonction main() par lrsquointermeacutediaire du tableau de String deacutefini en para-megravetre de la fonction

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

210

Si lrsquoen-tecircte est de la forme

public static void main(String [] argument)

le paramegravetre p0 est stockeacute en argument[0] p1 en argument[1] hellip et pN en argument[N]Les valeurs ainsi passeacutees sont meacutemoriseacutees sous forme de chaicircnes de caractegraveres

Exemple Une commande qui calcule

Pour mieux comprendre cette transmission de valeurs reprenons le corrigeacute de lrsquoexer-cice 3 du Chapitre 6 laquo Fonctions notions avanceacutees raquo qui simule une calculette Trans-formons ce programme de sorte qursquoil puisse effectuer lrsquoopeacuteration agrave partir de valeurspasseacutees en paramegravetres lors de la commande drsquoexeacutecution du programme Supposons quecette commande srsquoeacutecrive

java Calculette 1 + 2

Lrsquoordre des paramegravetres ainsi passeacutes est important En effet nous devons traiter les para-megravetres de la fonction main() de la faccedilon suivante

bull Les premier et troisiegraveme paramegravetres doivent ecirctre interpreacuteteacutes comme eacutetant les valeursnumeacuteriques de lrsquoopeacuteration agrave calculer

bull Le deuxiegraveme paramegravetre doit correspondre agrave lrsquoopeacuterateur

Sachant cela le programme srsquoeacutecrit de la faccedilon suivante

Exemple Le code source

public class Calculette public static void main(String [] argument) int a b char opeacuterateur double calcul if (argumentlength gt 0) a = IntegerparseInt(argument[0]) opeacuterateur = argument[1]charAt(0) b = IntegerparseInt(argument[2]) else opeacuterateur = menu() Systemoutprintln(Entrer la premiere valeur ) a = Lirei() Systemoutprintln(Entrer la seconde valeur ) b = Lirei() calcul = calculer(a b opeacuterateur ) afficher(a b opeacuterateur calcul) public static double calculer (int x int y char o) voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

public static void afficher(int x int y char o double r) copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

211

voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees public static char menu() voir corrigeacute de lrsquoexercice 3 du chapitre Fonctions notions avanceacutees

Pour traiter les paramegravetres passeacutes en ligne de commande il est neacutecessaire de deacutetecter sides paramegravetres ont eacuteteacute effectivement passeacutes Pour ce faire lrsquoideacutee est de regarder la tailledu tableau argument de la faccedilon suivante

bull Si celle-ci nrsquoest pas nulle (supeacuterieure strictement agrave 0) cela signifie que le tableaucontient des paramegravetres passeacutes en ligne de commande Dans ce cas nous traitonschacun des arguments de sorte que le calcul puisse ecirctre effectueacute

Les eacuteleacutements argument[0] et argument[2] contiennent par hypothegravese les deux valeursnumeacuteriques Or celles-ci sont stockeacutees sous forme de suites de caractegraveres le tableauargument eacutetant de type String Les valeurs doivent donc ecirctre laquo traduites raquo en formatnumeacuterique Comme nous souhaitons obtenir des valeurs entiegraveres la meacutethode proposeacuteepar le langage Java a pour nom IntegerparseInt() Ainsi les instructions

a = IntegerparseInt(argument[0])b = IntegerparseInt(argument[2])

permettent la traduction de la suite de caractegraveres contenue dans argument[0] et argu-ment[2] en valeurs numeacuteriques et de placer ces valeurs dans les variables a et b deacutecla-reacutees de type int Compte tenu des paramegravetres passeacutes en ligne de commande lesvariables a et b ont donc pour valeurs respectives 1 et 2

Le caractegravere correspondant agrave lrsquoopeacuterateur est stockeacute dans argument[1] Nous devonsle transformer en char puisqursquoun opeacuterateur est formeacute drsquoun seul caractegravere Cette trans-formation est reacutealiseacutee par une meacutethode de la classe String appeleacutee charAt() quiretourne le caractegravere placeacute agrave la position speacutecifieacutee en paramegravetre Ainsi lrsquoinstruction

opeacuterateur = argument[1]charAt(0)

place dans la variable opeacuterateur le premier caractegravere du mot stockeacute dans argument[1]soit pour notre exemple le caractegravere +

bull Si la taille du tableau argument est nulle cela signifie qursquoaucun paramegravetre nrsquoa eacuteteacutetransmis Le bloc else est exeacutecuteacute et les valeurs sont saisies au clavier comme celaeacutetait le cas en fin de correction de lrsquoexercice 3 du Chapitre 6

Pour finir lorsque les valeurs choisies sont placeacutees dans les variables a b et opeacuterateuragrave lrsquoaide des paramegravetres ou du clavier le calcul de lrsquoopeacuteration est reacutealiseacute et le reacutesultat estafficheacute Dans lrsquoexemple vous obtenez

java Calculette 1 + 21 + 2 = 3

Preacutecisons en outre que cette commande doit ecirctre obligatoirement lanceacutee dans le reacuteper-toire ougrave se trouve le fichier Calculetteclass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

212

Trier un ensemble de donneacutees Lrsquoatout principal de lrsquoordinateur est sa faculteacute agrave traiter un tregraves grand nombre de donneacuteesen des temps tregraves rapides Ces traitements sont par exemple la recherche drsquoeacuteleacutementsdans un ensemble en suivant des contraintes choisies par lrsquoutilisateur ou encore le tridrsquoeacuteleacutements en fonction drsquoun critegravere deacutetermineacute

Pour comprendre le fonctionnement interne de ces traitements nous eacutetudions ici lrsquoalgo-rithme du laquo tri par extraction simple raquo qui utilise les techniques de recherche drsquouneacuteleacutement dans un ensemble de donneacutees drsquoeacutechange de valeurs et de tri

Cahier des charges

Lrsquoobjectif du programme est de reacutealiser le classement par moyenne drsquoune classedrsquoeacutetudiants Pour cela nous devons tout drsquoabord deacutefinir ce qursquoest un eacutetudiant (voir lasection laquo La classe Etudiant raquo) pour deacutecrire ensuite une classe drsquoeacutetudiants (voir lasection laquo La classe Classe raquo) Cela fait il devient possible de trier une classe drsquoeacutetudiantsselon leur moyenne (voir la section laquo La meacutethode du tri par extraction simple raquo)

La classe Etudiant

Un eacutetudiant est deacutefini par son nom (String) son preacutenom (String) un ensemble de notes(un tableau de double) et une moyenne (double) Ces caracteacuteristiques constituentlrsquoensemble des donneacutees du type Etudiant

Les comportements drsquoun eacutetudiant permettent lrsquoinitialisation et lrsquoaffichage de ses caracteacute-ristiques ainsi que le calcul de sa moyenne

Par conseacutequent nous deacutecrivons comme suit la classe Etudiant

public class Etudiant Les donneacutees caracteacuteristiques private String nom preacutenom private double [] notes moyenne

Les comportements public Etudiant() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() Systemoutprint(Entrer le preacutenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Combien de notes pour lrsquoetudiant ) Systemoutprint(preacutenom + + nom + ) int nombre = Lirei() notes = new double [nombre] for (int i = 0 i lt noteslength i ++) Systemoutprint(Entrer la note ndeg + (i + 1) + ) notes[i] = Lired() moyenne = calculMoyenne() private double calculMoyenne() double somme = 00 for(int i = 0 i lt noteslength i++) somme = somme + notes[i]

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

213

return sommenoteslength public void afficheUnEtudiant() Systemoutprint(Les notes de + preacutenom + + nom + sont ) for (int i = 0 i lt noteslength i++) Systemoutprint(

+notes[i]) Systemoutprintln() Systemoutprintln(Sa moyenne vaut + moyenne) public double quelleMoyenne() return moyenne Fin de class Etudiant

La classe Etudiant deacutefinit les quatre meacutethodes suivantes

bull Etudiant() Crsquoest le constructeur de la classe qui permet drsquoinitialiser lrsquoensemble desdonneacutees de la classe Etudiant en demandant la saisie au clavier des nom et preacutenom delrsquoeacutetudiant ainsi que de lrsquoensemble de ses notes Le nombre de notes peut varier drsquouneacutetudiant agrave un autre puisque la valeur nombre est saisie en cours drsquoexeacutecution

bull calculMoyenne() Une fois les donneacutees saisies le programme calcule la moyenne agravelrsquointeacuterieur du constructeur gracircce agrave la meacutethode calculMoyenne() Cette meacutethode estdeacuteclareacutee en private car pour des raisons de seacutecuriteacute ce calcul ne peut ecirctre reacutealiseacuteqursquoagrave lrsquointeacuterieur de la classe Etudiant

bull afficheUnEtudiant() Affiche agrave lrsquoeacutecran les caracteacuteristiques drsquoun eacutetudiant

bull quelleMoyenne() La donneacutee moyenne eacutetant proteacutegeacutee (private) la meacutethode quelle-Moyenne() permet lrsquoaccegraves en consultation depuis lrsquoexteacuterieur de la classe de la valeurmeacutemoriseacutee

La classe Classe

Une classe drsquoeacutetudiants est deacutefinie par un ensemble drsquoeacutetudiants crsquoest-agrave-dire un tableaudrsquoobjets Etudiant

Les comportements drsquoune classe permettent lrsquoinitialisation lrsquoaffichage de ses donneacuteesainsi que le classement des eacutetudiants dans lrsquoordre croissant des moyennes

La classe Classe est deacutecrite comme suit

public class Classe private Etudiant [] liste public Classe() Systemoutprint(Nombre drsquoetudiants ) int nbetudiants = Lirei() liste = new Etudiant[nbetudiants] for(int i = 0 i lt listelength i++) liste[i] = new Etudiant() public void afficheLesEtudiants() for (int i = 0 i lt listelength i++) liste[i]afficheUnEtudiant() Fin de class Classe

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

214

La donneacutee liste de la classe est un tableau drsquoobjets de type Etudiant Il srsquoagit donc lagravedrsquoun tableau particulier puisque chaque case du tableau ne correspond pas agrave une valeurnumeacuterique simple mais agrave lrsquoensemble des donneacutees caracteacuteristiques drsquoun eacutetudiant

En reacutealiteacute chaque case du tableau liste contient lrsquoadresse drsquoun objet de type Etudiantcomme illustreacute agrave la Figure 9-3 Cette opeacuteration est effectueacutee par le constructeurClasse()

Ce dernier reacutealise la creacuteation du tableau en deux eacutetapes Ainsi lrsquoinstruction

liste = new Etudiant[nbetudiants]

creacutee une case meacutemoire liste qui contient lrsquoadresse de la premiegravere case meacutemoire dutableau Ce tableau est de type Etudiant Il est donc destineacute agrave stocker les adresses desobjets de type Etudiant

Ensuite la boucle

for(int i = 0 i lt listelength i++) liste[i] = new Etudiant()

reacutealise en faisant appel au constructeur de la classe Etudiant la creacuteation en meacutemoiredes objets de type Etudiant ainsi que la saisie des informations relatives agrave chaqueeacutetudiant

Pour finir chaque adresse produite par lrsquoopeacuterateur new dans la boucle for est placeacutee danschacune des cases meacutemoire du tableau liste (liste[i])

La meacutethode afficheLesEtudiants() permet lrsquoaffichage des informations relatives auxeacutetudiants en faisant appel agrave la meacutethode afficheUnEtudiant() qui affiche les caracteacuteris-tiques drsquoun eacutetudiant agrave la fois

Figure 9-3

Le tableau Liste est un tableau drsquoobjets Chaque case du tableau meacutemorise lrsquoadresse drsquoun objet Etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

215

La meacutethode du tri par extraction simple

Gracircce aux classes Etudiant et Classe nous sommes en mesure de creacuteer un ensembledrsquoeacutetudiants posseacutedant chacun un nombre de notes et une moyenne Notre objectif eacutetantdrsquoafficher un classement des eacutetudiants par ordre croissant des moyennes examinonscomment trier lrsquoensemble des moyennes drsquoune classe

Lrsquoalgorithme du tri par extraction simple se deacutecrit de la faccedilon suivante (voir Figure 9-4)

bull Parcourir lrsquoensemble des moyennes de la classe afin de trouver la plus petite

bull Une fois trouveacutee eacutechanger cette valeur avec celle placeacutee au tout deacutebut du tableau defaccedilon agrave ecirctre sucircr que la moyenne la plus faible se trouve en deacutebut du tableau

bull Recommencer ce mecircme traitement sur lrsquoensemble des moyennes moins la premiegraverepuisqursquoelle vient drsquoecirctre traiteacutee

Deux eacutetapes sont neacutecessaire pour traduire cet algorithme en langage Java Elles sontdeacutecrites ci-apregraves aux sections laquo Recherche du plus petit eacuteleacutement dans une liste raquo etlaquo Echange de la plus petite valeur avec un eacuteleacutement de la liste raquo

Recherche du plus petit eacuteleacutement dans une liste

Pour trouver la plus petite valeur drsquoun ensemble de valeurs il suffit de comparer chaquevaleur de la liste avec celle tout drsquoabord situeacutee en deacutebut de liste puis avec une plus petitesi elle existe dans la liste Crsquoest ce que reacutealise la boucle suivante

int indiceDuMin = 0 for(int j = 1 j lt listelength j++) if (liste[j]quelleMoyenne() lt liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j

Ainsi chaque valeur du tableau (j variant de 1 agrave listelength) est compareacutee avec lapremiegravere valeur du tableau (indiceDuMin valant 0 en deacutebut de boucle) Si la comparaisonmontre que la valeur placeacutee agrave lrsquoindice j est plus petite que celle placeacutee en indiceDuMinalors lrsquoindice de cette plus petite valeur est stockeacutee dans la variable indiceDuMin Le testsuivant compare la valeur suivante avec la plus petite valeur qui vient drsquoecirctre deacutetecteacutee

Figure 9-4

a Parcours du tableau entier afin de deacuteterminer la plus petite valeur puis eacutechange de cette derniegravere avec la valeur stockeacutee en premiegravere position dans le tableau b Mecircme traitement agrave partir de la deuxiegraveme case du tableau c Mecircme traitement agrave partir de la troisiegraveme case du tableau

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

216

Gracircce agrave cette boucle la recherche de la plus petite valeur est reacutealiseacutee sur lrsquointeacutegraliteacute dutableau Or dans lrsquoalgorithme du tri preacutesenteacute ci-dessus cette recherche doit ecirctre reacutealiseacuteedans un premier temps sur lrsquointeacutegraliteacute de la liste puis agrave partir du deuxiegraveme eacuteleacutementensuite agrave partir du troisiegraveme eacuteleacutement etc

Cette boucle de recherche doit ecirctre placeacutee agrave lrsquointeacuterieur drsquoune meacutethode de faccedilon agravepouvoir ecirctre exeacutecuteacutee plusieurs fois chacune des exeacutecutions variant en fonction drsquounparamegravetre qui preacutecise lrsquoindice ougrave deacutebute la recherche La meacutethode ouEstLePlusPetit()preacutesenteacutee ci-dessous et agrave inseacuterer dans la classe Classe reacutealise cette recherche

private int ouEstLePlusPetit(int debut) int indiceDuMin = debut j for(j = debut+1 j lt listelength j++) if (liste[j]quelleMoyenne() lt

liste[indiceDuMin]quelleMoyenne()) indiceDuMin = j return indiceDuMin

Lorsque le programme sort de la boucle for indiceDuMin repreacutesente lrsquoindice de la pluspetite moyenne dans le tableau liste Cette valeur est alors retourneacutee agrave la fonction appe-lante qui lrsquoutilise pour reacutealiser lrsquoeacutechange des valeurs

Notez que la meacutethode ouEstLePlusPetit() est deacuteclareacutee en mode private Cettemeacutethode nrsquoest pas un comportement caracteacuteristique drsquoune classe drsquoeacutetudiants mais untraitement interne destineacute agrave obtenir un classement de lrsquoensemble des eacutetudiants

Eacutechange de la plus petite valeur avec un eacuteleacutement de la liste

Connaissant lrsquoindice ougrave se trouve la plus petite moyenne nous devons eacutechanger cettevaleur avec celle correspondant au deacutebut de la recherche Ce traitement est reacutealiseacute surlrsquoensemble des eacutetudiants en faisant varier lrsquoindice du deacutebut de recherche de la premiegraverevaleur du tableau jusqursquoagrave la derniegravere La meacutethode classerParMoyenne() qui srsquoinsegraveredans la classe Classe reacutealise ces opeacuterations

public void classerParMoyenne() int indiceDuPlusPetit Etudiant tmp for(int i = 0 i lt listelength i ++) indiceDuPlusPetit = ouEstLePlusPetit(i) tmp = liste[i] liste[i] = liste[indiceDuPlusPetit] liste[indiceDuPlusPetit] = tmp

Gracircce agrave la boucle for le programme parcourt lrsquoensemble des eacutetudiants de la classeAinsi pour chaque eacutetudiant de la liste la boucle reacutealise

bull la recherche de la plus petite moyenne (ouEstLePlusPetit()) agrave partir de lrsquoindice icorrespondant agrave lrsquoindice de deacutebut de recherche

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

217

bull lrsquoeacutechange dans la liste des donneacutees concernant lrsquoeacutetudiant ayant la plus petite moyenne(indiceDuPlusPetit) avec les donneacutees de lrsquoeacutetudiant placeacute agrave lrsquoindice i (indice dudeacutebut de recherche)

Sans revenir sur le meacutecanisme drsquoeacutechange des donneacutees (voir au Chapitre 1 laquo Stocker uneinformation raquo la section laquo Eacutechanger les valeurs de deux variables raquo) observez quegracircce au regroupement des donneacutees sous forme drsquoobjets les opeacuterations reacutealisent nonseulement lrsquoeacutechange des moyennes des eacutetudiants mais aussi lrsquoensemble des donneacuteesdeacutecrivant chaque eacutetudiant crsquoest-agrave-dire ses nom preacutenoms et notes En effet ce sont ici lesadresses de chaque objet laquo Etudiant raquo qui sont eacutechangeacutees et non pas simplement lesmoyennes

Lrsquoapplication GestionClasse

Afin de veacuterifier le bon fonctionnement des classes Etudiant et Classe il est neacutecessairede construire une application qui utilise des instances de ces classes Examinez la classeGestionClasse composeacutee drsquoune fonction main() dans laquelle est deacuteclareacute un objet Cde type Classe

public class GestionClasse public static void main(String [] argument) Classe C = new Classe() Systemoutprintln(------------- Reacutecapitulatif -------------) CafficheLesEtudiants() CclasserParMoyenne() Systemoutprintln(------------- Classement ----------------) CafficheLesEtudiants() Fin de class GestionClasse

En appelant le constructeur Classe() le programme demande la saisie du nombredrsquoeacutetudiants Puis pour chaque eacutetudiant il fait appel au constructeur Etudiant() quidemande la saisie des nom preacutenom et notes de lrsquoeacutetudiant concerneacute

Agrave la sortie du constructeur Classe() le programme est en mesure drsquoafficher gracircce agravelrsquoinstruction CafficheLesEtudiants() toutes les informations relatives agrave chaqueeacutetudiant de la classe C

Ensuite les eacutetudiants sont classeacutes par ordre croissant de moyenne gracircce agrave lrsquoappel de lameacutethode classerParMoyenne() appliqueacutee agrave la classe C Lrsquoaffichage de la liste deseacutetudiants permet ensuite de veacuterifier que le tri a eacuteteacute correctement reacutealiseacute

Exeacutecution de lrsquoapplication reacutesultats

Nombre drsquoetudiants 44Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant CCeelliinneeCombien de notes pour lrsquoetudiant Celine B 22Entrer la note ndeg 1 1133Entrer la note ndeg 2 1155Entrer le nom de lrsquoetudiant FFEntrer le preacutenom de lrsquoetudiant NNiiccoollaass

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

218

Combien de notes pour lrsquoetudiant Nicolas F 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1188Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant EEllooddiieeCombien de notes pour lrsquoetudiant Elodie B 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 1166Entrer le nom de lrsquoetudiant BBEntrer le preacutenom de lrsquoetudiant AArrnnaauuddCombien de notes pour lrsquoetudiant Arnaud B 22Entrer la note ndeg 1 1100Entrer la note ndeg 2 1122------------------ Reacutecapitulatif ------------------Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Nicolas F sont 160 180Sa moyenne vaut 170Les notes de Elodie B sont 160 160Sa moyenne vaut 170Les notes de Arnaud B sont 100 120Sa moyenne vaut 110------------------ Classement ------------------ Les notes de Arnaud B sont 100 120Sa moyenne vaut 11Les notes de Celine B sont 130 150Sa moyenne vaut 140Les notes de Elodie B sont 160 160Sa moyenne vaut 160Les notes de Nicolas F sont 160 180Sa moyenne vaut 170

Les tableaux agrave deux dimensionsVous venez de voir les tableaux agrave une seule dimension repreacutesenteacutes comme une liste hori-zontale ou verticale drsquoeacuteleacutements de mecircme type Il est possible avec Java de travailleraussi avec des tableaux de deux trois voire n dimensions Pour simplifier nous allonseacutetudier les tableaux agrave deux dimensions

Par deacutefinition un tableau agrave deux dimensions srsquoorganise non plus sur une seule ligne maissur des lignes et des colonnes Le croisement drsquoune ligne et drsquoune colonne deacutetermine uneacuteleacutement donneacute du tableau

Deacuteclaration drsquoun tableau agrave deux dimensionsPour deacuteclarer un tableau agrave deux dimensions la syntaxe est la suivante

int [][] donneacutee = new int [3][5]

La syntaxe est pratiquement identique agrave la deacuteclaration drsquoun tableau agrave une dimension Laseule diffeacuterence consiste en lrsquoajout de [] suppleacutementaires pour signifier au compilateurque le tableau est composeacute de deux dimensions

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

219

Les valeurs numeacuteriques placeacutees entre [] derriegravere lrsquoopeacuterateur new indiquent respective-ment le nombre de lignes puis de colonnes

Lrsquoinstruction de deacuteclaration deacutecrite ci-dessus reacuteserve en meacutemoire un tableau nommeacutedonneacutee composeacute de 3 lignes et de 5 colonnes Chaque eacuteleacutement du tableau eacutetant un entierlrsquoopeacuterateur new reacuteserve 3 5 soit 15 cases meacutemoire de la taille drsquoun entier

Remarquez que le nombre de lignes drsquoun tableau est donneacute par lrsquoexpressiondonneacuteelength alors que le nombre de colonnes est deacutetermineacute par lrsquoexpressiondonneacutee[0]length En effet le nombre de colonnes drsquoun tableau correspond au nombredrsquoeacuteleacutements placeacutes sur une ligne (voir Figure 9-5)

Acceacuteder aux eacuteleacutements drsquoun tableauPour initialiser modifier ou consulter la valeur drsquoun eacuteleacutement drsquoun tableau il convientdrsquoutiliser deux indices un indice pour les lignes et un indice pour les colonnes Chaqueindice eacutetant controcircleacute par une boucle for la technique consiste agrave imbriquer deux bouclesde la faccedilon suivante

for (int i = 0 i lt donneacuteelength i++) for (int j = 0 j lt donneacutee[0]length j++) donneacutee[i][j]) = uneValeur

La boucle j est imbriqueacutee dans la boucle i Les variables i et j sont les compteurs deboucles qui controcirclent respectivement les lignes et colonnes du tableau donneacutee

Pour mieux comprendre les meacutecanismes de manipulation des tableaux et en particulierle deacuteroulement des valeurs des indices agrave lrsquointeacuterieur des boucles for examinonslrsquoexemple suivant

Exemple Dessiner un sapin

Les tableaux agrave deux dimensions sont tregraves souvent utiliseacutes pour stocker les images Eneffet une image afficheacutee agrave lrsquoeacutecran correspond en reacutealiteacute agrave une surface deacutecoupeacutee en lignes

Figure 9-5

Un tableau srsquoorganise sur des lignes et des colonnes numeacuteroteacutees agrave partir de [0][0]

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

220

et colonnes La donneacutee numeacuterique se situant agrave la croiseacutee de ces lignes et colonnes repreacute-sente un point de lrsquoimage et a pour valeur la couleur drsquoaffichage agrave lrsquoeacutecran

Cahier des charges

Lrsquoobjectif de cet exemple est de dessiner agrave lrsquoeacutecran un sapin de Noeumll deacutecoreacute commelrsquoillustre la figure suivante

Pour simplifier agrave lrsquoextrecircme la lisibiliteacute du programme nous nrsquoutilisons que de simplescaractegraveres alphanumeacuteriques pour afficher notre sapin Crsquoest pourquoi son affichage resteassez sommaire Pour voir de plus laquo jolis raquo sapins reportez-vous au Chapitre 11laquo Dessiner des objets raquo

Creacuteer et afficher un triangle composeacute de trois lignes

Fidegraveles au principe de deacutecomposition drsquoun problegraveme nous allons chercher dans unpremier temps agrave afficher la forme suivante

Lrsquoaffichage de cette forme correspond agrave un triangle Sa structure interne est deacutefinie enmeacutemoire agrave lrsquoaide drsquoun tableau agrave deux dimensions Il srsquoagit drsquoun tableau composeacute de3 lignes et de 5 colonnes comme lrsquoillustre le tableau suivant

001000111011111

Ce tableau est constitueacute de valeurs numeacuteriques placeacutees de telle faccedilon que le programmedessine un triangle en affichant un point lorsque la valeur du tableau vaut 1 et sinon uneespace

Pour reacutealiser astucieusement lrsquoinitialisation de ce tableau examinons lrsquoemplacement desvaleurs par rapport aux indices du tableau Sachant qursquoun tableau est toujours initialiseacute agrave0 lors de sa creacuteation en meacutemoire par lrsquoopeacuterateur new observez uniquement les indicescorrespondant aux valeurs eacutegales agrave 1

LigneColonne [0] [1] [2] [3] [4]

[0] 0 0 1 0 0

[1] 0 1 1 1 0

[2] 1 1 1 1 1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

221

Remarquez agrave la colonne [2] que toutes les valeurs sont initialiseacutees agrave 1 Cette colonnecorrespond en reacutealiteacute agrave la colonne du milieu du tableau En supposant que lrsquoensemble desvaleurs soit stockeacute dans un tableau nommeacutee sapin lrsquoindice de cette colonne est obtenugracircce agrave lrsquoinstruction

int [][] sapin = new int [3][5]

int milieu = sapin[0]length 2

Lrsquoexpression sapin[0]length correspondant au nombre de colonnes soit 5 la variablemilieu prend pour valeur 52 soit 2 en entier

Ensuite les valeurs situeacutees de part et drsquoautre de cette colonne sont elles aussi initialiseacuteesagrave 1 Pour la ligne numeacutero [1] seul un eacuteleacutement agrave droite et agrave gauche du milieu est initia-liseacute agrave 1 Pour la ligne numeacutero [2] deux eacuteleacutements agrave droite et agrave gauche valent 1

Il y a donc correacutelation entre le nombre de valeurs agrave initialiser et le numeacutero de la ligne surlaquelle lrsquoinitialisation est effectueacutee Crsquoest pourquoi le traitement se reacutealise de la faccedilonsuivante

for ( int i = 0 i lt sapinlength i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = 1

La variable i partant de 0 jusqursquoagrave sapinlength (soit 3) examine toutes les lignes dutableau Pour chaque ligne gracircce agrave la seconde boucle en j les valeurs du tableau sontinitialiseacutees agrave 1 de part et drsquoautre du milieu Pour mieux comprendre le deacuteroulement desopeacuterations examinez le tableau drsquoeacutevolution des variables

i j milieu tab[i][milieu+j]

0 0 2 tab[0][0 + 2] = 1

0 1 2 sortie de boucle

1 -1 2 tab[1][-1 + 2] = 1

1 0 2 tab[1][0 + 2] = 1

1 1 2 tab[1][1 + 2] = 1

1 2 2 sortie de boucle

2 -2 2 tab[2][-2 + 2] = 1

2 -1 2 tab[2][-1 + 2] = 1

2 0 2 tab[2][0 + 2] = 1

2 1 2 tab[2][1 + 2] = 1

2 2 2 tab[2][2 + 2] = 1

2 3 2 sortie de boucle

3 2 sortie de boucle

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

222

Une fois le tableau creacuteeacute et initialiseacute en meacutemoire lrsquoaffichage du dessin srsquoeffectue entestant la valeur de chaque point du tableau Si la valeur est nulle une espace est afficheacuteesinon un point est afficheacute Traduite en Java cette marche agrave suivre srsquoeacutecrit agrave lrsquoaide de deuxboucles imbriqueacutees comme suit

for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) if(sapin[i][j] == 0) Systemoutprint( ) else Systemoutprint() Systemoutprintln()

Lrsquoindice i repreacutesente les lignes tandis que j repreacutesente les colonnes Gracircce aux bouclesimbriqueacutees chaque intersection des lignes et colonnes est consulteacutee de faccedilon agrave afficherle caractegravere correspondant agrave la valeur stockeacutee Lorsque la boucle i est termineacutee celasignifie que tous les eacuteleacutements (colonnes) de la ligne i ont eacuteteacute afficheacutes et il est neacutecessairede passer agrave la ligne suivante de lrsquoeacutecran gracircce agrave lrsquoinstruction Systemoutprintln()

Creacuteer un triangle composeacute de n lignes

Nous avons creacuteeacute un triangle agrave 3 lignes composeacute de 5 colonnes Si nous souhaitons ajouterune nouvelle ligne nous devons obligatoirement ajouter deux colonnes suppleacutementairesLa relation entre le nombre de lignes et de colonnes srsquoexprime selon lrsquoeacutequation

Nombre de colonnes = 2 Nombre de lignes ndash 1

Pour un triangle posseacutedant 3 lignes vous obtenez 2 3 - 1 = 5 colonnes Pour untriangle composeacute de 4 lignes vous obtenez 2 4 - 1 = 7 colonnes Lrsquoeacutequation restevalide pour un triangle agrave une ligne puisque le nombre de colonnes vaut 2 1 - 1 = 1

Les instructions suivantes permettent de creacuteer un triangle dont le nombre de lignes estdeacutetermineacute par lrsquoutilisateur

public class Sapin public static void main(String [] arg) Systemoutprint(Nombre de ligne ) int nl = Lirei() if (nl lt= 0) Systemoutprintln(Le nombre de lignes doit ecirctre supeacuterieur a 0 ) Systemexit(0) int nc = 2nl-1 int [][] sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int i = 0 i lt nl i++) for ( int j = -i j lt= i j++) sapin[i][milieu+j] = +1

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

223

Fin de la fonction main() Fin de la classe Sapin

Placer des deacutecorations au hasard

Cela fait nous sommes en mesure drsquoafficher le sapin sans deacutecoration puisque pourchaque eacuteleacutement du tableau valant 1 un point est afficheacute Pour ajouter quelques deacutecora-tions lrsquoideacutee est de placer au hasard drsquoautres valeurs que 1 Ainsi lrsquoaffichage peut ecirctremoduleacute en fonction de la valeur rencontreacutee

Pour placer dans notre sapin de nouvelles valeurs au hasard comprises entre 1 et 6 parexemple il suffit de modifier lrsquoinitialisation du tableau de la faccedilon suivante

for ( int i = 0 i lt nl i++)

for ( int j = -i j lt= i j++) sapin[i][milieu + j] = (int ) (5 Mathrandom() + 1)

Lrsquoaffichage du sapin se deacuteroule ensuite comme suit

for (int i = 0 i lt sapinlength i++)

for (int j = 0 j lt sapin[0]length j++) switch (sapin[i][j]) case 0 Systemoutprint( ) break case 2 Systemoutprint() break default Systemoutprint() Systemoutprintln()

Suivant la valeur contenue en sapin[i][j] le programme affiche une espace un pointou un Remarquez que les valeurs 1 3 4 5 et 6 affichent toutes un point Seule la valeur2 permet lrsquoaffichage drsquoune guirlande Ce choix a pour effet drsquoafficher volontairementplus de points que de guirlandes de faccedilon agrave obtenir un sapin qui ne soit pas tropsurchargeacute

Attention aux boucles imbriqueacutees

Pour manipuler des tableaux agrave deux dimensions le programmeur utilise deux bouclesfor imbriqueacutees Dans ce cas une boucle for est placeacutee agrave lrsquointeacuterieur drsquoune premiegravereboucle for Ce type drsquoeacutecriture neacutecessite attention car certaines erreurs peuvent empecirc-cher le bon deacuteroulement du programme

Une erreur drsquoinattention commise en particulier agrave cause des faciliteacutes du copier-collerpeut aboutir agrave programmer deux boucles imbriqueacutees qui utilisent la mecircme variablecomme compteur de boucles

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

224

Ainsi en eacutecrivant

Le compteur de boucles i est deacuteclareacute agrave lrsquoexteacuterieur des boucles Les deux boucles utilisentla mecircme case meacutemoire pour stocker les variations de la valeur de i

En entrant dans la Boucle 1 i prend la valeur 1 de mecircme qursquoen entrant dans la Boucle 2Puis i est increacutementeacute de 1 agrave chaque tour de la Boucle 2 jusqursquoagrave ce que i deacutepasse la valeur4 La Boucle 2 est alors termineacutee i vaut par conseacutequent 5 On entre agrave nouveau dans laBoucle 1 i est increacutementeacute de 1 (i vaut 6) puis testeacute 6 eacutetant supeacuterieur agrave 3 la Boucle 1 esttermineacutee La Boucle 1 nrsquoest donc parcourue qursquoune seule fois au lieu de trois

Remarquez que

bull Si le compteur de boucles est deacuteclareacutee agrave lrsquointeacuterieur de la boucle comme suit

for(int i = 1 i lt= 3 i= i+1) Boucle 1 for( int i = 1 i lt= 4 i= i+1) Boucle 2

alors le compilateur deacutetecte une erreur du type Variable rsquoirsquo is already definedin this method En effet le fait de deacuteclarer un compteur de boucles portant le mecircmenom dans chaque boucle revient agrave deacuteclarer dans un mecircme bloc de programme deuxvariables portant le mecircme nom

bull Lrsquoeacutecriture de deux boucles non imbriqueacutees utilisant la mecircme variable comme comp-teur de boucles nrsquoest pas une erreur

for( int i = 1 i lt= 3 i= i+1) Premier for 4 toursfor( int i = 1 i lt= 6 i= i+1) Deuxiegraveme for 7 tours

Lrsquoemploi drsquoune mecircme variable de compteur pour deux boucles disjointes est correct Eneffet la variable i est deacuteclareacutee dans la boucle Elle nrsquoexiste en meacutemoire que le tempsdrsquoutilisation de la boucle Lorsque i est agrave nouveau deacuteclareacutee dans la deuxiegraveme boucle lavariable i preacuteceacutedente nrsquoexiste deacutejagrave plus Cette maniegravere de programmer est courante carelle facilite la lecture des boucles Tregraves souvent les compteurs de boucles ont pour nomi j ou k

Boucles imbriqueacutees (i est compteur de boucles) Variation de la variable i

int ifor(i = 1 i lt= 3 i= i+1) Boucle 1 for(i = 1 i lt= 4 i= i+1) Boucle 2

Boucle 1 i = 1 i lt= 3 Boucle 2 i = 1 i lt= 4 Boucle 2 i = 2 i lt= 4 Boucle 2 i = 3 i lt= 4 Boucle 2 i = 4 i lt= 4 Boucle 2 i = 5 i gt 4Boucle 1 i = 6 i gt 3

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

225

ReacutesumeacuteLes tableaux sont utiliseacutes pour regrouper sous un mecircme nom de variable un nombredonneacute de valeurs de mecircme type Un tableau est deacutefini par

bull un nom

bull un type

bull le nombre de dimensions

bull une taille pour chacune des dimensions

Deacuteclaration drsquoun tableau Comme toute variable un tableau doit ecirctre deacuteclareacute La syntaxe est la suivante

bull Pour un tableau agrave une dimension

float [] donnee = new float [5]

Cette instruction deacuteclare un tableau composeacute de nombres reacuteels de simple preacuteci-sion appeleacute donnee Lrsquoopeacuterateur new reacuteserve 5 cases meacutemoire de 4 octets chacune

bull Pour un tableau agrave deux dimensions

int [][] valeur = new int [3][2]

Cette instruction deacuteclare un tableau agrave deux dimensions composeacute de nombresentiers appeleacute valeur Lrsquoopeacuterateur new reacuteserve 3 2 = 6 cases meacutemoire de 4octets chacune

La taille drsquoun tableau est une valeur entiegravere deacutefinie soit agrave lrsquointeacuterieur du programmesoit saisie au clavier lors de lrsquoexeacutecution du programme Une fois la taille fixeacutee parlrsquoopeacuterateur new il nrsquoest plus possible de la modifier en cours drsquoexeacutecution

Un tableau nrsquoest pas neacutecessairement de type simple (int double etc) Il peut ecirctrede type structureacute (String ou type deacutefini par le programmeur etc) Dans ce cas letableau est un tableau drsquoobjets stockant dans chacune de ses cases lrsquoadresse drsquounobjet agrave meacutemoriser

Pour acceacuteder agrave une case (eacuteleacutement) du tableau il suffit de placer derriegravere le nom dutableau le numeacutero de la case (indice) entre [] Chaque indice est une expressionentiegravere La premiegravere valeur drsquoun tableau est stockeacutee agrave lrsquoindice 0 du tableau et non agravelrsquoindice 1

for (int i = 0 i lt donneelength i++) Systemoutprintln( + donnee[i])

Ainsi la boucle for ci-dessus permet drsquoacceacuteder agrave chaque eacuteleacutement du tableau Pourne pas deacutepasser la taille du tableau il est conseilleacute drsquoutiliser la donneacutee length quicorrespond agrave la longueur du tableau Le programme deacutepasse la taille du tableaulorsque la valeur de lrsquoindice est supeacuterieure agrave la taille deacuteclareacutee du tableau Lrsquointer-preacuteteur deacutetecte alors une erreur du type javalangArrayIndexOutOfBounds-Exception

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

226

Exercices Les tableaux agrave une dimension

Qursquoaffiche le programme suivant

int i int [] valeur = new int[6] valeur [0] = 1 for (i = 1 i lt valeurlength i++) valeur[i] = valeur[i-1]+2 for (i = 0 i lt valeurlength i++) Systemoutprint(valeur[+i+] = + valeur[i])

Eacutecrivez un programme qui

a Stocke dans un tableau des valeurs entiegraveres passeacutees en paramegravetres de la ligne decommande

b Calcule la somme de ces valeurs

c Calcule la moyenne de ces valeurs

d Recherche la plus grande valeur du tableau

e Deacutetermine la position de la plus grande valeur

f Affiche le nombre de valeurs supeacuterieures agrave la moyenne

Les tableaux drsquoobjetsEn reprenant la classe Cercle deacutefinie au Chapitre 8 laquo Les principes du conceptdrsquoobjet raquo eacutecrivez un programme qui

a Creacutee un tableau de type Cercle dont la taille soit choisie par lrsquoutilisateur Si lenombre de cercles creacuteeacutes est infeacuterieur agrave 4 le programme initialise par deacutefaut lataille du tableau agrave 4

b Initialise les donneacutees de chaque tableau agrave lrsquoaide du constructeur par deacutefaut de laclasse Cercle

c Deacuteplace le cercle ndeg 1 en 20 20

d Agrandit le cercle ndeg 2 de 50

e Eacutechange le cercle ndeg 0 avec le ndeg 3

f Permute les cercles de faccedilon que le cercle 0 soit stockeacute en 1 le cercle 1 en 2 hellipet le cercle 3 en 0

91

92

93

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

227

Les tableaux agrave deux dimensionsEacutecrivez un programme qui

a Agrave lrsquoaide de boucles imbriqueacutees initialise la matrice 7 7 aux valeurs suivantes

1 0 0 1 0 0 10 1 0 1 0 1 00 0 1 1 1 0 01 1 1 1 1 1 10 0 1 1 1 0 00 1 0 1 0 1 01 0 0 1 0 0 1

Les compteurs de boucles seront astucieusement choisis afin drsquoinitialiser automatiquementle tableau

b Affiche agrave lrsquoeacutecran le tableau en remplaccedilant les valeurs

0 par un espace ( )

1 par un asteacuterisque ()

Pour mieux comprendre le meacutecanisme des boucles imbriqueacutees forndashfor

Afin drsquoexeacutecuter le programme suivant

public class Exercice5 public static void main (String [] parametre) int ij N = 5 char C Systemoutprint(Entrer un caractegravere ) C = Lirec() for (i = 1 i lt N i++) for (j = 1 j lt N j++) if (i lt j) Systemoutprint(C) else Systemoutprint( )

a Examinez le code source repeacuterez les instructions concerneacutees par les deuxboucles reacutepeacutetitives et deacuteterminez les instructions de deacutebut et de fin de boucle

b Quelles sont les instructions qui permettent de modifier le reacutesultat du test desortie de boucle

c En supposant que lrsquoutilisateur entre la valeur laquo raquo exeacutecutez le programmesuivant agrave la main (pour vous aider construisez le tableau drsquoeacutevolution de chaquevariable deacuteclareacutee)

d Quel est le reacutesultat afficheacute agrave lrsquoeacutecran

94

95

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

228

En construisant le tableau drsquoeacutevolution de la variable i que constatez-vous lors delrsquoexeacutecution de ces boucles

for(i = 1 i lt= 5 i = i+1) for(i = 1 i lt= 2 i= i+1) Systemoutprint(i = +i)

Le projet laquo Gestion drsquoun compte bancaire raquoTraiter dix lignes comptablesLrsquoobjectif est de traiter non plus une seule ligne comptable mais dix lignes comptablesPour cela vous devez dans un premier temps modifier la deacuteclaration de la donneacuteeligne dans la classe Compte comme suit

private LigneComptable [] ligne

Comme le nombre de lignes comptables est fixeacute dans le cahier des charges il est possiblede deacutefinir une constante comme suit

public static final int NBLigne = 10

NBLigne repreacutesente le nombre maximal de lignes comptables agrave traiter Les lignes comp-tables eacutetant creacuteeacutees au fur et agrave mesure des opeacuterations reacutealiseacutees par lrsquoutilisateur il estneacutecessaire de deacutefinir une variable (nbLigneReacuteel) qui compte le nombre de lignes comp-tables effectivement creacuteeacutees en cours drsquoexeacutecution du programme

La gestion des lignes comptables entraicircne la modification des meacutethodes Compte()creacuteerLigne() et afficherCompte()

Transformer les constructeurs Compte()

Dans chaque constructeur

a Agrave lrsquoaide de lrsquoopeacuterateur new creacuteer en meacutemoire la donneacutee ligne sous forme drsquountableau de dix lignes comptables

b Initialiser la variable nbLigneReacuteel agrave ndash1 puisqursquoaucune ligne nrsquoa encore eacuteteacute saisie

Transformer la meacutethode creacuteerLigne()

Lorsque le nombre de lignes comptables traiteacute est supeacuterieur agrave 10 le programme doiteffacer la premiegravere ligne traiteacutee de faccedilon agrave deacutecaler les suivantes (la deuxiegraveme allant enpremiegravere position la troisiegraveme en deuxiegraveme position etc) afin de pouvoir stocker lanouvelle ligne en derniegravere position du tableau ligne

96

copy copyright Eacuteditions Eyrolles

Collectionner un nombre fixe dobjetsCHAPITRE 9

229

La meacutethode creacuteerLigne() reacutealise ce traitement de la faccedilon suivante

a Increacutemente nbLigneReacuteel de 1

b Si le nombre de lignes creacuteeacutees est infeacuterieur agrave NBLigne creacutee en meacutemoire une lignecomptable gracircce au constructeur de la classe LigneComptable et stocke en meacutemoireson adresse dans le tableau ligne

c Si le nombre de lignes est supeacuterieur agrave NBLigne deacutecale toutes les lignes vers le hautgracircce agrave la meacutethode deacutecalerLesLignes() deacutecrite ci-dessous et stocke la nouvelleligne comptable en derniegravere position (NBLigne ndash 1) du tableau ligne

private void deacutecalerLesLignes() for(int i = 1 i lt NBLigne i++) ligne[i-1] = ligne[i]

d Modifie la valeur courante du compte en fonction du creacutedit ou deacutebit reacutealiseacute par lanouvelle ligne comptable

Transformer la meacutethode afficherCompte()Modifier la meacutethode afficherCompte() de faccedilon agrave afficher lrsquoensemble des lignes saisiesen cours drsquoexeacutecution du programme

copy copyright Eacuteditions Eyrolles

10Collectionner un nombre

indeacutetermineacute drsquoobjets

Comme nous lrsquoavons vu au cours du chapitre preacuteceacutedent les tableaux permettent la mani-pulation rapide et efficace drsquoun ensemble de donneacutees Cependant leur principal inconveacute-nient est drsquoecirctre de taille fixe Ainsi lrsquoajout drsquoun eacuteleacutement dans un tableau demande unegestion rigoureuse des indices afin drsquoeacuteviter que ces derniers ne prennent une valeur supeacute-rieure agrave la taille du tableau

Pour pallier cette difficulteacute majeure pour un grand nombre de programmes le langageJava propose plusieurs outils de manipulation des donneacutees en meacutemoire vive au fur et agravemesure des besoins de lrsquoapplication Ces outils sont preacutesenteacutes et analyseacutes agrave la sectionlaquo La programmation dynamique raquo

En outre lorsqursquoun programme utilise des collections importantes de donneacutees il doit lesarchiver de faccedilon agrave ne pas les voir disparaicirctre apregraves lrsquoarrecirct de lrsquoapplication ou de lrsquoordi-nateur Le langage Java offre diffeacuterentes meacutethodes pour reacutealiser ce stockage de donneacuteesElles sont eacutetudieacutees agrave la section laquo Lrsquoarchivage de donneacutees raquo

La programmation dynamiqueAgrave la diffeacuterence de la programmation statique dans laquelle le nombre de donneacutees geacutereacutepar lrsquoapplication est fixeacute une fois pour toutes lors de lrsquoexeacutecution du programme laprogrammation dynamique offre lrsquoavantage de geacuterer un nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Cette technique se montre tregraves utile lorsque le nombre drsquoobjets agrave traiter nrsquoest pas connuni deacutefinissable avant lrsquoexeacutecution du programme Par exemple tous les logiciels degestion et crsquoest une grande part des programmes informatiques se doivent de geacuterer lesdonneacutees qursquoils traitent de faccedilon dynamique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

232

En effet sans programmation dynamique vous pourriez voir une bibliothegraveque refuser denouveaux lecteurs sous preacutetexte que le logiciel qursquoelle utilise ne serait pas en mesure detraiter plus de 50 000 inscriptions ou encore voir un logiciel de traitement de textesrsquointerrompre parce qursquoil lui serait impossible de geacuterer la saisie et lrsquoaffichage de plus10 000 caractegraveres

Pour eacuteviter de telles situations le langage Java propose diffeacuterents outils qui gegraverent dyna-miquement les donneacutees drsquoun programme En particulier il existe des objets de typeVector dont nous analysons les caracteacuteristiques agrave la section laquo Les vecteurs raquo Les objetsde type Hashtable eacutetudieacutes agrave la section laquo Les dictionnaires raquo offrent aussi lrsquoavantage degeacuterer les donneacutees de faccedilon dynamique tout en organisant lrsquoinformation de faccedilon agrave faci-liter son exploitation

Les vecteursLes vecteurs sont des objets de type Vector un type preacutedeacutefini du langage Java Lagestion des vecteurs est assez similaire agrave la gestion drsquoun tableau puisque le programmecreacutee une liste par ajout de donneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Lesdonneacutees sont enregistreacutees dans leur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteurpermet de retrouver lrsquoinformation

Manipulation drsquoun vecteur

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Ainsi deacuteclareacute liste est un objet de type Vector auquel on peut appliquer des meacutethodesde la classe Vector Ces meacutethodes deacutecrites au tableau ci-dessous permettent lrsquoajout lasuppression ou la modification drsquoune donneacutee dans le vecteur (liste par exemple)

Opeacuteration Fonction Java

Ajoute un eacuteleacutement objet en fin de liste add(objet)

Insegravere un eacuteleacutement objet dans la liste agrave lrsquoindice speacutecifieacute en paramegravetre add(indice objet)

Ajoute un eacuteleacutement objet en fin de liste et augmente sa taille de un addElement(objet)

Retourne lrsquoeacuteleacutement stockeacute agrave lrsquoindice speacutecifieacute en paramegravetre elementAt(indice)

Supprime tous les eacuteleacutements de la liste clear()

Retourne lrsquoindice dans la liste du premier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

indexOf(objet)

Retourne lrsquoindice dans la liste du dernier objet donneacute en paramegravetre ou ndash1 si objet nrsquoexiste pas dans la liste

lastIndexOf()

Supprime lrsquoobjet dont lrsquoindice est speacutecifieacute en paramegravetre remove(indice)

Supprime tous les eacuteleacutements compris entre les indices i (valeur comprise) et j (valeur non comprise)

removeRange(i j)

Remplace lrsquoeacuteleacutement situeacute en position i par lrsquoobjet speacutecifieacute en paramegravetre setElementAt(objet i)

Retourne le nombre drsquoeacuteleacutements placeacutes dans la liste size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

233

Exemple Creacuteer un nombre indeacutetermineacute drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation des vecteurs reprenons lrsquoexemple de la classedrsquoeacutetudiants (voir au chapitre preacuteceacutedent laquo Collectionner un nombre fixe drsquoobjets raquo lasection laquo Trier un ensemble de donneacutees raquo) de faccedilon que le programme traite non plus unnombre fixe drsquoeacutetudiants mais un nombre indeacutetermineacute

La classe Etudiant nrsquoest pas agrave modifier puisque lrsquoobjectif est de transformer unique-ment la gestion en meacutemoire des eacutetudiants La correction se porte donc sur la classeClasse ougrave la liste drsquoeacutetudiants doit ecirctre deacuteclareacutee de type Vector au lieu drsquoecirctre deacuteclareacuteesous forme de tableau Examinons la nouvelle classe Classe

import javautil public class Classe private Vector liste public Classe() liste = new Vector() public void ajouteUnEtudiant() listeaddElement(new Etudiant()) public void afficheLesEtudiants() int nbEtudiants = listesize() if (nbEtudiants gt 0) Etudiant tmp for (int i = 0 i lt nbEtudiants i ++) tmp = (Etudiant) listeelementAt(i) tmpafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste) Fin de Classe

Les outils comme Vector sont proposeacutes par le langage Java Ils sont deacutefinis agrave lrsquointeacuterieurde classes qui ne sont pas par deacutefaut directement accessibles par le compilateur Crsquoestpourquoi le programmeur doit preacuteciser au compilateur ougrave se situe la librairie du langageJava deacutefinissant lrsquooutil utiliseacute (package) Pour ce faire il doit placer une instructionimport en premiegravere ligne du fichier qui utilise lrsquooutil souhaiteacute

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placer lrsquoinstruc-tion importjavautil en tecircte du fichier En effet si cette instruction fait deacutefaut lecompilateur deacutetecte une erreur du type Class Vector not found

Cela fait la donneacutee liste deacuteclareacutee de type Vector doit ecirctre manipuleacutee en tant que telledans chaque meacutethode de la classe Les trois meacutethodes suivantes sont deacutefinies agravelrsquointeacuterieur de celle-ci

bull Le constructeur Classe() qui fait appel au constructeur de la classe Vector afin dedeacuteterminer lrsquoadresse du premier eacuteleacutement de la liste

bull La meacutethode ajouteUnEtudiant() qui place un eacuteleacutement dans la liste gracircce agrave lameacutethode addElement() Lrsquoeacuteleacutement ajouteacute agrave la liste est un objet de type Etudiant creacuteeacutepar lrsquointermeacutediaire du constructeur Etudiant() qui demande la saisie au clavier des

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

234

donneacutees caracteacuteristiques de lrsquoeacutetudiant agrave construire Cela fait la taille de la liste estautomatiquement augmenteacutee de 1 par lrsquointerpeacuterteur

Observez que lrsquoajout drsquoun eacuteleacutement dans un vecteur nrsquoest possible que si lrsquoeacuteleacutement estun objet Il nrsquoest en effet pas possible drsquoajouter une valeur de type simple telle queint float ou double Pour reacutealiser une telle opeacuteration il est neacutecessaire de transformerles types simples en leur homologue structureacute Par exemple le type simple int peutecirctre repreacutesenteacute par le type Integer deacutefinissant un objet contenant une valeur numeacute-rique entiegravere (pour plus de preacutecisions voir lrsquoexercice 1 en fin de chapitre)

bull La meacutethode afficheLesEtudiants() parcourt lrsquoensemble de la liste gracircce agrave lameacutethode elementAt() qui fournit en reacutesultat lrsquoeacuteleacutement stockeacute agrave la position speacutecifieacuteeen paramegravetre soit i Ce reacutesultat pour ecirctre consultable doit obligatoirement ecirctrelaquo casteacute raquo en Etudiant (voir au Chapitre 1 laquo Stocker une information raquo la section laquo Latransformation de types raquo) En effet un vecteur a la capaciteacute de meacutemoriser nrsquoimportequel type drsquoobjet preacutedeacutefini ou non Il est donc neacutecessaire drsquoindiquer au compilateur agravequel type correspond lrsquoobjet extrait

Lrsquoindice i variant de 0 jusqursquoagrave la taille effective (nbEtudiants) de la liste lrsquoensembledes eacutetudiants contenus dans la liste est afficheacute

Exemple Lrsquoapplication GestionClasse

Observons lrsquoapplication GestionClasse qui deacutefinit et utilise un objet Classe

public class GestionClasse public static void main(String [] argument) byte choix = 0 Classe C = new Classe() do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Affiche la classe) Systemoutprintln(3 Pour sortir) Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 CafficheLesEtudiants() break case 3 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 3)

Le nombre drsquoeacutetudiants agrave traiter nrsquoest pas deacutetermineacute agrave lrsquoavance Crsquoest pourquoi lrsquoapplica-tion GestionClasse reacutealise gracircce agrave la mise en place drsquoune boucle dohellipwhile la saisie desdonneacutees au fur et agrave mesure des besoins de lrsquoutilisateur Le programme laisse le choix agravelrsquoutilisateur de saisir de nouveaux eacutetudiants ou drsquoafficher ceux effectivement saisisLrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

235

1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Il nrsquoy a pas drsquoetudiant dans cette liste1 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant MMEntrer le prenom de lrsquoetudiant SSaannddrraaCombien de notes pour lrsquoetudiant Sandra M 22Entrer la note ndeg 1 1155Entrer la note ndeg 2 11331 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 11Entrer le nom de lrsquoetudiant PPhhiilliippppeeEntrer le prenom de lrsquoetudiant TTCombien de notes pour lrsquoetudiant Philippe T 2Entrer la note ndeg 1 1122Entrer la note ndeg 2 881 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 22Les notes de Sandra M sont 150 130Sa moyenne vaut 140Les notes de Philippe T sont 120 80Sa moyenne vaut 1001 Ajoute un etudiant2 Affiche la classe3 Pour sortirVotre choix 33

Lrsquoutilisation drsquoobjets du type Vector est souple et facilite amplement la vie du program-meur lorsque ce dernier souhaite eacutecrire une application qui gegravere des donneacutees de faccedilondynamique Les meacutethodes de la classe Vector permettent aussi la recherche ou lrsquoinser-tion de nouveaux eacuteleacutements gracircce en particulier agrave la meacutethode indexOf(objet) quiretrouve lrsquoindice de lrsquoobjet speacutecifieacute en paramegravetre dans la liste

Cependant lorsque la liste meacutemorise des objets complexes tels que les donneacutees caracteacute-ristiques drsquoun eacutetudiant la recherche drsquoun eacutetudiant particulier nrsquoest pas simple En effetil est neacutecessaire de fournir au programme toutes les donneacutees de lrsquoeacutetudiant (nom preacutenomnotes et moyenne) de faccedilon agrave ecirctre sucircr de le retrouver dans la liste La meacutethodeindexOf(objet) ne retrouve lrsquoobjet speacutecifieacute en paramegravetre qursquoagrave la seule condition qursquoilsoit totalement identique agrave celui stockeacute dans la liste

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

236

Les dictionnaires

Pour ameacuteliorer la recherche drsquoeacuteleacutements complexes dans une liste la technique consisteagrave organiser les donneacutees non plus par rapport agrave un indice mais par rapport agrave une cleacute expli-cite De cette faccedilon la recherche drsquoun objet dans la liste srsquoeffectue non plus surlrsquoensemble des donneacutees qui le composent mais sur une cleacute unique qui lui est associeacutee

Lrsquoorganisation de donneacutees par association drsquoune cleacute agrave un ensemble de donneacutees estappeleacutee un dictionnaire Dans un dictionnaire chaque deacutefinition est associeacutee au motqursquoelle deacutefinit et non pas agrave sa position (numeacuterique) dans le dictionnaire

Manipulation drsquoun dictionnaire

Le type Hashtable proposeacute par le langage Java permet de reacutealiser simplement lrsquoassocia-tion cleacute-eacuteleacutement Les meacutethodes associeacutees agrave ce type sont la creacuteation la suppression laconsultation ou la modification drsquoune association

Pour utiliser un dictionnaire il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Hashtable listeClasseacutee = new Hashtable ()

Ainsi deacuteclareacute listeClasseacutee est un objet de type Hashtable sur lequel on peut appli-quer des meacutethodes de la classe Hashtable Les meacutethodes les plus couramment utiliseacuteessont deacutecrites au tableau ci-apregraves

Exemple Creacuteer un dictionnaire drsquoeacutetudiants

Pour mieux comprendre lrsquoutilisation de tels objets modifions le programme de gestiondrsquoune classe drsquoeacutetudiants de faccedilon agrave organiser les donneacutees agrave partir drsquoune cleacute deacutefinie par leprogramme

Deacutefinir une cleacute drsquoassociation

En supposant qursquoun eacutetudiant soit totalement identifiable par son nom et son preacutenom lacleacute drsquoassociation des donneacutees est deacutefinie comme eacutetant une chaicircne de caractegraveres majus-cules dont le premier caractegravere coiumlncide avec le premier caractegravere du preacutenom delrsquoeacutetudiant et dont les caractegraveres suivants correspondent au nom de lrsquoeacutetudiant

De cette faccedilon chaque cleacute est deacutetermineacutee par programme indeacutependamment de lrsquoutilisa-teur en fonction des informations fournies par ce dernier

Opeacuteration Fonction Java

Place dans le dictionnaire lrsquoassociation cleacutendashobjet put(cleacute objet)

Retourne lrsquoobjet associeacute agrave la cleacute speacutecifieacutee en paramegravetre get(cleacute)

Supprime dans le dictionnaire lrsquoassociation cleacutendashobjet agrave partir de la cleacute speacutecifieacutee en paramegravetre

remove(cleacute)

Retourne le nombre drsquoassociations deacutefinies dans le dictionnaire size()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

237

La traduction de cet algorithme en langage Java est la suivante

private String creacuteerUneCleacute(Etudiant e) String tmp tmp = (equelPreacutenom())charAt(0) + equelNom() return tmptoUpperCase()

Agrave partir des donneacutees drsquoun eacutetudiant e passeacutees en paramegravetres la meacutethode creacuteerUneCleacute()retourne une chaicircne de caractegraveres majuscules (tmptoUpperCase()) composeacutee dupremier caractegravere du preacutenom de lrsquoeacutetudiant ((equelPreacutenom())charAt(0)) suivi de sonnom (equelNom()) Remarquez que les donneacutees nom et preacutenom de la classe Etudiantsont priveacutees et qursquoil est donc neacutecessaire drsquoutiliser les meacutethodes drsquoaccegraves en consultation(quelPreacutenom() et quelNom()) pour connaicirctre le contenu de ces donneacutees Ces meacutethodesagrave inseacuterer dans le fichier Etudiantjava sont deacutecrites comme suit

public String quelNom() return nompublic String quelPreacutenom() return preacutenom

La creacuteation drsquoune cleacute peut eacutegalement ecirctre reacutealiseacutee simplement agrave partir des nom et preacutenomde lrsquoeacutetudiant stockeacutes non pas dans un objet Etudiant mais dans deux String distinctsLa meacutethode creacuteerUneCleacute() est alors surchargeacutee de la faccedilon suivante

private String creacuteerUneCleacute(String p String n) String tmp tmp = pcharAt(0)+ n return tmptoUpperCase()

Les deux meacutethodes creacuteerUneCleacute() agrave inseacuterer dans la classe Classe sont deacuteclareacutees enmode private car elles constituent un traitement interne propre au mode de stockage delrsquoinformation Lrsquoapplication et lrsquoutilisateur nrsquoont nullement besoin drsquoen connaicirctre lrsquoexis-tence pour creacuteer la liste des eacutetudiants drsquoune classe

Creacuteation du dictionnaire

Pour creacuteer le dictionnaire drsquoune classe drsquoeacutetudiants nous devons tout drsquoabord deacutefinir unobjet de type Hashtable puis stocker dans cet objet les eacutetudiants en les associant agrave leurcleacute Ces deux opeacuterations sont reacutealiseacutees dans le programme suivant

import javautilpublic class Classe private Hashtable listeClasseacutee public Classe() listeClasseacutee = new Hashtable() public void ajouteUnEtudiant() Etudiant nouveau = new Etudiant() String cleacute = creacuteerUneCleacute(nouveau)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

238

if (listeClasseacuteeget(cleacute)== null) listeClasseacuteeput(cleacute nouveau) else Systemoutprintln(Cet etudiant a deja ete saisi )

Ce programme est constitueacute des deux meacutethodes suivantes

bull Le constructeur Classe() qui fait appel au constructeur de la classe Hashtable afinde deacuteterminer lrsquoadresse du premier eacuteleacutement de la listeClasseacutee

bull ajouteUnEtudiant() qui place un eacuteleacutement dans le dictionnaire gracircce agrave la meacutethodeput(cleacute nouveau) qui ajoute lrsquoassociation cleacute-nouveau dans le dictionnairelisteClasseacutee Lrsquoobjet nouveau est de type Etudiant Il est creacuteeacute par lrsquointermeacutediaire duconstructeur Etudiant() et cleacute est aussi un objet de type String calculeacute agrave partir de lameacutethode creacuteerUneCleacute()

Lrsquoajout successif de deux associations ayant la mecircme cleacute a pour reacutesultat de deacutetruire lapremiegravere association Crsquoest pourquoi il convient de tester avant de placer le nouveleacutetudiant dans le dictionnaire si ce dernier nrsquoest pas deacutejagrave deacutefini dans la listeClasseacuteeCrsquoest ce que reacutealise le test suivant

if (listeClasseacuteeget(cleacute) == null) listeClasseacuteeput(cleacute nouveau)

En effet en testant le reacutesultat de la meacutethode get(cleacute) le programme recherche dansle dictionnaire srsquoil existe un eacutetudiant associeacute agrave la cleacute calculeacutee correspondant agravelrsquoeacutetudiant que lrsquoon souhaite inseacuterer dans la liste (nouveau) Si cette associationnrsquoexiste pas lrsquoeacuteleacutement retourneacute par la meacutethode est null et lrsquointerpreacuteteur ajoute lanouvelle association cleacutendashnouveau dans le dictionnaire Dans le cas contraire leprogramme affiche un message preacutecisant que lrsquoeacutetudiant existe deacutejagrave

Rechercher et supprimer un eacuteleacutement du dictionnaire

Une fois le dictionnaire reacutealiseacute les opeacuterations permettant la recherche ou la suppressiondrsquoun eacutetudiant sont deacutecrites par les meacutethodes suivantes agrave inseacuterer dans le fichierClassejava

public void rechercheUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute = null) eClasseacuteafficheUnEtudiant() else Systemoutprintln(p + + n + est inconnu ) public void supprimeUnEtudiant(String p String n) String cleacute = creacuteerUneCleacute(p n) Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) if (eClasseacute= null) listeClasseacuteeremove(cleacute) Systemoutprintln(p + + n + a ete supprime ) else Systemoutprintln(p + + n + est inconnu )

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

239

Ces meacutethodes fonctionnent toutes deux sur le mecircme modegravele Les nom et preacutenom delrsquoeacutetudiant agrave traiter sont fournis en paramegravetres des meacutethodes afin de calculer la cleacute drsquoasso-ciation Ensuite lrsquoeacutetudiant est rechercheacute dans la liste agrave partir de cette cleacute (get(cleacute))

Srsquoil est trouveacute il est soit afficheacute (eClasseacuteafficheUnEtudiant() pour la meacutethoderechercheUnEtudiant()) soit supprimeacute (listeClasseacuteeremove(cleacute) pour la meacutethodesupprimeUnEtudiant())

Afficher un dictionnaire

Pour afficher tous les eacuteleacutements drsquoun dictionnaire nous devons le parcourir eacuteleacutement pareacuteleacutement Il existe diffeacuterentes techniques pour reacutealiser ce parcours Nous vous en propo-sons une qui utilise un outil du langage Java deacutefini par la classe Enumeration

Une eacutenumeacuteration est un outil du package javautil qui facilite le parcours de listes dedonneacutees quelles qursquoelles soient Ainsi pour se deacuteplacer dans une eacutenumeacuteration drsquoobjetsil suffit drsquoutiliser les meacutethodes hasMoreElements() et nextElement() La premiegraveremeacutethode deacutetermine srsquoil existe encore des eacuteleacutements dans lrsquoeacutenumeacuteration tandis que laseconde permet lrsquoaccegraves agrave lrsquoeacuteleacutement suivant dans lrsquoeacutenumeacuteration

La meacutethode afficheLesEtudiants() utilise cette technique pour reacutealiser la parcours dela listeClasseacutee

public void afficheLesEtudiants() if(listeClasseacuteesize() = 0) Enumeration enumEtudiant = listeClasseacuteekeys() while (enumEtudianthasMoreElements()) String cleacute = (String) enumEtudiantnextElement() Etudiant eClasseacute = (Etudiant) listeClasseacuteeget(cleacute) eClasseacuteafficheUnEtudiant() else Systemoutprintln(Il nrsquoy a pas drsquoetudiant dans cette liste)

Lrsquoeacutenumeacuteration est deacutefinie gracircce agrave la meacutethode keys() de la classe Hashtable qui renvoiesous forme drsquoeacutenumeacuteration la liste des cleacutes effectivement stockeacutees Le parcours de cetteeacutenumeacuteration est ensuite reacutealiseacute agrave lrsquoaide drsquoune boucle while testant srsquoil existe encore descleacutes dans la liste (enumEtudianthasMoreElements()) Si tel est le cas le programmepasse agrave lrsquoeacuteleacutement suivant dans la liste (enumEtudiantnextElement()) Il recherchealors lrsquoeacutetudiant associeacute agrave cette cleacute (listeClasseacuteeget(cleacute)) et lrsquoaffiche(eClasseacuteafficheUnEtudiant())

Exemple Lrsquoapplication GestionClasse

La gestion des eacutetudiants drsquoune classe est totalement acheveacutee en eacutecrivant lrsquoapplicationGestionClasse comme suit

public class GestionClasse public static void main (String [] argument) byte choix = 0 Classe C = new Classe()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

240

String preacutenom nom do Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) case 1 CajouteUnEtudiant() break case 2 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CsupprimeUnEtudiant(preacutenom nom) break case 3 CafficheLesEtudiants() break case 4 Systemoutprint(Entrer le prenom de lrsquoetudiant ) preacutenom = LireS() Systemoutprint(Entrer le nom de lrsquoetudiant ) nom = LireS() CrechercheUnEtudiant(preacutenom nom) break case 5 Systemexit(0) default Systemoutprintln(Cette option nrsquoexiste pas ) while ( choix = 5)

Chaque option du menu utilise une meacutethode de la classe Classe Ces options offrent lapossibiliteacute drsquoajouter de supprimer et de consulter tout ou partie du dictionnaire formeacuteau fur et agrave mesure des choix de lrsquoutilisateur Lrsquoexeacutecution de cette application peut avoirpar exemple pour reacutesultat agrave lrsquoeacutecran

1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant RREntrer le prenom de lrsquoetudiant SSyyllvvaaiinnCombien de notes pour lrsquoetudiant Sylvain R 2Entrer la note ndeg 1 1155Entrer la note ndeg 2 11441 Ajoute un etudiant2 Supprime un etudiant

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

241

3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 11Entrer le nom de lrsquoetudiant CCEntrer le prenom de lrsquoetudiant GGaaeelllleeCombien de notes pour lrsquoetudiant Gaelle C 22Entrer la note ndeg 1 1166Entrer la note ndeg 2 11221 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche CCEntrer le nom de lrsquoeacutetudiant recherche GGaaeelllleeC Gaelle est inconnu 1 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 44Entrer le prenom de lrsquoeacutetudiant recherche GGaaeelllleeEntrer le nom de lrsquoeacutetudiant recherche CC Les notes de Gaelle C sont 160 120Sa moyenne vaut 1401 Ajoute un etudiant2 Supprime un etudiant3 Affiche la classe4 Affiche un etudiant5 SortirVotre choix 55

Lors du premier choix 4 lrsquoutilisateur a inverseacute les nom et preacutenom de lrsquoeacutetudiante La cleacutequi en deacutecoule nrsquoexiste pas dans le dictionnaire Le programme ne peut donc pasretrouver les informations concernant cette eacutetudiante

Ainsi gracircce aux objets de type Hashtable il est possible drsquoorganiser sans beaucoupdrsquoefforts de programmation des donneacutees de faccedilon agrave pouvoir rechercher modifier ousupprimer un eacuteleacutement dans une liste

Pourtant lrsquoapplication GestionClasse possegravede encore un inconveacutenient majeur elleperd la meacutemoirehellip En effet agrave chaque exeacutecution les donneacutees doivent de nouveau ecirctresaisies au clavier Les donneacutees stockeacutees dans la meacutemoire vive de lrsquoordinateur se perdentagrave lrsquoarrecirct du programme Pour corriger ce deacutefaut le programme doit pouvoir enregistrerles informations traiteacutees dans un fichier sur le disque dur Cet enregistrement desdonneacutees est aussi appeleacute archivage de donneacutees

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

242

Lrsquoarchivage de donneacuteesLa notion drsquoarchivage de donneacutees est tregraves importante puisque gracircce agrave elle les informa-tions traiteacutees sont stockeacutees sous forme de fichiers sur le disque dur Les informationsainsi stockeacutees perdent leur volatiliteacute et peuvent ecirctre reacuteutiliseacutees apregraves un arrecirct momentaneacutedu programme ou de lrsquoordinateur Pour archiver des donneacutees le langage Java utilise leconcept de flux ou en anglais stream

La notion de fluxLorsque nous communiquons des informations agrave lrsquoordinateur nous effectuons uneopeacuteration drsquoentreacutee (voir le Chapitre 2 laquo Communiquer une information raquo) Cettecommunication utilise un flux entrant qui est en quelque sorte la concreacutetisation infor-matique du courant eacutelectrique passant du clavier agrave la meacutemoire vive de lrsquoordinateurSymeacutetriquement il existe un flux sortant permettant de faire passer une informationstockeacutee en meacutemoire vive agrave lrsquoeacutecran de lrsquoordinateur

Dans le jargon informatique on dit que les flux reliant la meacutemoire vive agrave lrsquoeacutecran ou auclavier utilisent des flux standards drsquoentreacutee-sortie De faccedilon similaire il existe drsquoautrestypes de flux qui relient la meacutemoire vive non plus agrave lrsquoeacutecran ou au clavier mais au disquedur de lrsquoordinateur Ce sont les flux de fichiers

Ces flux sont aussi caracteacuteriseacutes par leur direction entrante ou sortante Un flux de fichiersortant est un flux drsquoeacutecriture qui reacutealise la creacuteation et lrsquoenregistrement de donneacutees dansun fichier Symeacutetriquement un flux de fichier entrant est un flux de lecture qui permetlrsquoinitialisation des variables ou objets du programme en meacutemoire vive gracircce aux valeurspreacuteceacutedemment enregistreacutees sur le disque dur

Ces flux sont deacutefinis agrave travers des objets preacutedeacutefinis du langage Java (package javaio)Il en existe un tregraves grand nombre offrant tous des outils permettant le stockage et le trai-tement de donneacutees sous diverses formes

Notre objectif nrsquoest pas de les deacutecrire tous mecircme succinctement mais de preacutesenterconcregravetement deux techniques drsquoarchivage afin drsquoen comprendre les diffeacuterents meacuteca-nismes Crsquoest pourquoi notre eacutetude porte sur les fichiers stockant lrsquoinformation sous laforme de caractegraveres (voir ci-dessous la section laquo Les fichiers textes raquo) ainsi que sur lesfichiers stockant des objets (voir la section laquo Les fichiers drsquoobjets raquo)

Les fichiers textesPuisqursquoil existe deux faccedilons drsquoacceacuteder agrave un fichier (lecture ou eacutecriture) les outilsproposeacutes par le langage Java reproduisent ces deux modes drsquoaccegraves Pour manipuler desfichiers nous devons donc deacuteclarer deux objets diffeacuterents qui vont nous permettre de lireou drsquoeacutecrire dans un fichier

Ainsi la deacuteclaration

BufferedWriter fW

deacutefinit un objet fW de type BufferedWriter utiliseacute pour eacutecrire (Writer) crsquoest-agrave-direenregistrer des donneacutees dans un fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

243

Par contre la deacuteclaration

BufferedReader fR

deacutefinit un objet fR de type BufferedReader utiliseacute pour lire (Reader) les donneacutees conte-nues dans un fichier afin de les placer dans des variables (en meacutemoire vive) Ces objetset les meacutethodes associeacutees sont deacutefinis dans le package javaio Il convient donc deplacer lrsquoinstruction import javaio en en-tecircte des classes qui font appel agrave cesoutils

Exemple Une classe pour lire et eacutecrire du texte

Lrsquoobjectif de cet exemple est de creacuteer une classe Fichier composeacutee drsquooutils simplifiantla manipulation des fichiers en lecture et en eacutecriture Les donneacutees de cette classe deacutefinis-sent deux objets de type BufferedWriter et BufferedReader et drsquoune variable de typechar qui meacutemorise le mode de traitement utiliseacute (lecture ou eacutecriture)

import javaiopublic class Fichier private BufferedWriter fW private BufferedReader fR private char mode

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouverturedu flux puis traitement des donneacutees parcourant le flux et pour finir fermeture du fluxChacune de ces eacutetapes est deacutecrite au cours des sections suivantes

Ouverture du flux

Pour eacutecrire ou lire dans un fichier il neacutecessaire avant tout drsquoouvrir le flux en indiquantsi ce flux est entrant (lecture) ou sortant (eacutecriture) La meacutethode ouvrir() deacutecrite ci-dessous reacutealise cette opeacuteration Elle doit ecirctre inseacutereacutee dans la classe Fichier

public void ouvrir(String nomDuFichier String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fR = new BufferedReader(new FileReader(new File(nomDuFichier))) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les deux points importants suivants sont agrave observer dans lrsquoen-tecircte de la meacutethodeouvrir()

bull Le premier concerne le terme throws IOException dont la preacutesence est obligatoirepour toutes les meacutethodes qui manipulent des opeacuterations drsquoentreacutee-sortie Succincte-ment cette clause indique au compilateur que la meacutethode ainsi deacutefinie est susceptiblede traiter ou de propager une eacuteventuelle erreur du type IOException qui pourraitapparaicirctre en cours drsquoexeacutecution

Vour plus de preacutecisions voir la section laquo Geacuterer les exceptions raquo en fin de chapitre copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

244

bull Le second point important est relatif aux informations transmises agrave la meacutethodeouvrir() Le premier paramegravetre speacutecifie le nom du fichier auquel est associeacute le fluxtandis que le second indique le mode drsquoouverture du flux (entrant ou sortant) Ce para-megravetre peut prendre diffeacuterentes valeurs telles que Ecriture E Write ou encoreW pour le mode sortant et Lecture L Read ou encore R pour le modeentrant Ces mots peuvent ecirctre eacutecrits indiffeacuteremment en majuscules ou en minusculesEn effet la variable drsquoinstance mode est initialiseacutee agrave partir du premier caractegravere(charAt(0)) du paramegravetre s et est automatiquement transformeacutee en majuscules(stoUpperCase())

Cela fait le flux est ouvert en lecture ou en eacutecriture en fonction de la variable drsquoinstancemode Ainsi

bull Si mode vaut L ou R lrsquoouverture du fichier est reacutealiseacutee en lecture gracircce agrave lrsquoinstruction

fR = new BufferedReader(new FileReader(new File(nomDuFichier)))

Cette instruction relativement deacuteconcertante pour le programmeur deacutebutant reacutealiseplusieurs opeacuterations afin de deacuteterminer ougrave se situe le deacutebut du fichier speacutecifieacute en para-megravetre

La premiegravere opeacuteration new File(nomDuFichier) permet drsquoobtenir une repreacutesentationlogique du fichier (existe-t-il ou non sur le disque dur ) Ensuite lrsquoappel au construc-teur FileReader() permet lrsquoouverture du fichier en lecture caractegravere par caractegravere Ilfournit en retour lrsquoadresse du deacutebut du fichier

Cependant ce mode de lecture nrsquoautorise pas la lecture de plusieurs caractegraveres agrave lafois Crsquoest pourquoi il est neacutecessaire de faire appel agrave un troisiegraveme constructeur Buffe-redReader() qui permet la lecture du fichier ligne par ligne Lrsquoadresse du deacutebut dufichier est alors meacutemoriseacutee gracircce au signe drsquoaffectation dans lrsquoobjet fR

bull Si mode vaut E ou W lrsquoouverture du fichier est reacutealiseacutee en eacutecriture gracircce agrave lrsquoinstruction

fW = new BufferedWriter(new FileWriter(new File(nomDuFichier)))

Les opeacuterations reacutealiseacutees sont eacutequivalentes agrave celles deacutecrites ci-dessus en remplaccedilant lemode lecture par le mode eacutecriture Cependant

bull Si le fichier speacutecifieacute en paramegravetre nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alors lefichier est creacuteeacute et lrsquoadresse du deacutebut du fichier est stockeacutee dans lrsquoobjet fW

ndash Si le chemin drsquoaccegraves nrsquoest pas valide le fichier nrsquoest pas creacuteeacute et une erreur du typeFileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute Lrsquoadresse dudeacutebut du fichier est alors stockeacutee dans lrsquoobjet fW

Traitement du fichier

Une fois le fichier ouvert les traitements reacutealisables sur lui sont lrsquoeacutecriture et la lecture dedonneacutees dans le fichier

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

245

bull Lrsquoeacutecriture dans un fichier est reacutealiseacutee par la meacutethode suivante

public void ecrire(int tmp) throws IOException String chaine = chaine = chainevalueOf(tmp) if (chaine = null) fWwrite(chaine0chainelength()) fWnewLine()

La meacutethode ecrire() prend en paramegravetre la valeur agrave enregistrer dans le fichierComme il srsquoagit drsquoun entier et que le fichier est un fichier texte la valeur stockeacutee danstmp est convertie en String gracircce agrave lrsquoinstruction chaine = chainevalueOf(tmp)

Ensuite lrsquoeacutecriture de cette chaicircne dans le fichier est reacutealiseacutee par lrsquoinstructionfWwrite(chaine 0 chainelength()) La meacutethode write() envoie dans le fluxfW la chaicircne speacutecifieacutee en premier paramegravetre Les deuxiegraveme et troisiegraveme paramegravetrespreacutecisent respectivement agrave partir de quel caractegravere (0) commence lrsquoeacutecriture dans lefichier et combien de caractegraveres (chainelength) sont eacutecrits Pour notre exemplelrsquointeacutegraliteacute de la chaine est eacutecrite dans le fichier

Pour finir la meacutethode newLine()envoie dans le flux fW un caractegravere permettant depasser agrave la ligne suivante du fichier

bull La lecture dans un fichier est deacutecrite par la meacutethode

public String lire() throws IOException String chaine = fRreadLine() return chaine

Lrsquoopeacuteration de lecture est reacutealiseacutee par la meacutethode readLine() qui envoie tout drsquoabordla ligne lue sur le flux fR puis passe automatiquement agrave la ligne suivante dans le fichierLa chaicircne de caractegraveres chaine reacutecupegravere alors la suite des caractegraveres lus Pour finir lachaicircne est retourneacutee agrave la meacutethode appelante

Fermeture du flux

Une fois que tous les traitements ont eacuteteacute reacutealiseacutes le flux peut ecirctre naturellement fermeacutegracircce agrave la meacutethode

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWclose()

Suivant le mode drsquoouverture speacutecifieacute par la variable drsquoinstance mode (initialiseacutee lors delrsquoexeacutecution de la meacutethode ouvrir()) le flux fR ou fW est fermeacute gracircce agrave la meacutethodeclose()

Exemple Lrsquoapplication GestionFichier

Lrsquoapplication suivante utilise les meacutethodes deacutecrites ci-dessus pour creacuteer et manipuler unfichier dont le nom est saisi au clavier

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

246

public class GestionFichier public static void main (String [] arg) throws IOException Fichier f = new Fichier() Systemoutprint( Entrer le nom du fichier ) String nomFichier = LireS() fouvrir(nomFichier Ecriture) for (int i = 0 i lt 5 i++) fecrire(i) ffermer()

fouvrir(nomFichierLecture) String chaine = do chaine = flire() if (chaine = null) Systemoutprintln(chaine) while (chaine = null) ffermer()

Lrsquoinstruction fouvrir(nomFichier Ecriture) ouvre le fichier nomFichier en eacutecri-ture afin drsquoy eacutecrire une suite de valeurs entiegraveres (fecrire(i)) comprises entre 0 et 4 Lefichier est fermeacute (ffermer()) apregraves exeacutecution de la boucle for

Pour veacuterifier que les opeacuterations drsquoeacutecriture se sont bien deacuterouleacutees le fichier est ouvert enlecture (fouvrir(nomFichierLecture)) et gracircce agrave une boucle dohellipwhile chaqueligne du fichier est lue par flire() et meacutemoriseacutee dans une variable chaine afin drsquoecirctreafficheacutee La lecture de ce fichier prend fin lorsqursquoune chaicircne null est deacutetecteacutee (while(chaine = null)) Le fichier peut alors ecirctre fermeacute (ffermer())

Lrsquoexeacutecution de cette application a pour reacutesultat agrave lrsquoeacutecran

Entrer le nom du fichier VVaalleeuurrssttxxtt

01234

Le fichier Valeurstxt est creacuteeacute dans le mecircme reacutepertoire que celui ougrave se trouve lrsquoappli-cation GestionFichierclass Comme il srsquoagit drsquoun fichier texte il peut ecirctre ouvert parnrsquoimporte quel eacutediteur de texte (WordPad sous Windows vi sous Unix ou encore Teach-Text sous Mac OS) Crsquoest lagrave un des inteacuterecircts des fichiers textes

Remarquez cependant que les donneacutees manipuleacutees par un programme ne se reacutesumentgeacuteneacuteralement pas agrave de simples valeurs entiegraveres Le plus souvent une application travailleavec des objets complexes mecirclant plusieurs types de donneacutees Crsquoest pourquoi il est inteacute-ressant de pouvoir archiver non pas la suite des donneacutees relatives agrave un objet ligne parligne mais lrsquoobjet lui-mecircme en tant que tel Cette technique est examineacutee agrave la sectionsuivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

247

Les fichiers drsquoobjetsLe langage Java propose des outils permettant le stockage ainsi que la lecture drsquoobjetsdans un fichier Ces outils font appel agrave des meacutecanismes appeleacutes meacutecanismes de seacuterialisa-tion Ils utilisent des flux speacutecifiques deacutefinis par les classes ObjectOutputStream etObjectInputStream du package javaio

La seacuterialisation des objets

Un objet est seacuterialiseacute afin de pouvoir ecirctre transporteacute sur un flux de fichier entrant ousortant Gracircce agrave cette technique un objet peut ecirctre directement stockeacute dans un fichier(eacutecriture) ou reconstruit agrave lrsquoidentique en meacutemoire vive par lecture du fichier

Les meacutecanismes de seacuterialisation-deacuteseacuterialisation sont fournis par lrsquointermeacutediaire desclasses ObjectOutputStream et ObjectInputStream gracircce aux meacutethodes writeOb-ject() (seacuterialisation) et readObject() (deacuteseacuterialisation) Ces outils sont applicables agravetous les objets preacutedeacutefinis du langage Java tels que les String les vecteurs (Vector) ouencore les dictionnaires (Hashtable)

Lorsque vous souhaitez seacuterialiser un objet dont le type est deacutefini par le programmeur ilest neacutecessaire de rendre cet objet seacuterialisable Pour cela il suffit drsquoindiquer au compila-teur que la classe autorise la seacuterialisation en utilisant la syntaxe suivante

public class Exemple implements Serializable Donneacutees et meacutethodes

De cette faccedilon tous les objets deacuteclareacutes de type Exemple peuvent ecirctre lus ou eacutecrits dansdes fichiers drsquoobjets Remarquez que lrsquoobjectif de la seacuterialisation est de placer dans unflux toutes les informations relatives agrave un objet Par conseacutequent seules les variablesdrsquoinstance sont prises en compte lors drsquoune seacuterialisation alors que les variables declasses (deacutefinies en static) ne peuvent ecirctre seacuterialiseacutees En effet une variable de classeest commune agrave tous les objets de lrsquoapplication et non pas speacutecifique drsquoun seul objet

Exemple Archiver une classe drsquoeacutetudiants

Pour bien comprendre comment utiliser ces outils drsquoarchivage drsquoobjets modifionslrsquoapplication GestionClasse de sorte qursquoelle puisse lire et stocker automatiquementlrsquoensemble des donneacutees du dictionnaire listeClasseacutee dans un fichier portant le nom deClassedat

Nous devons tout drsquoabord rendre seacuterialisable les objets que nous souhaitons sauvegarderCrsquoest pourquoi il convient de modifier les en-tecirctes des classes Etudiant et Classe de lafaccedilon suivante

public class Etudiant implements Serializable voir la section Les dictionnairespublic class Classe implements Serializable voir la section Les dictionnaires

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

248

Agrave deacutefaut vous obtenez une erreur drsquoexeacutecution du type NotSerializableExceptionindiquant que lrsquoobjet de type Etudiant ou Classe ne peut ecirctre seacuterialiseacute

Ensuite les opeacuterations drsquoarchivage drsquoobjets utilisent les mecircmes concepts que ceuxdeacutecrits agrave la section preacuteceacutedente agrave savoir ouverture du fichier puis lecture ou eacutecriture desobjets et pour finir fermeture du fichier Crsquoest pourquoi nous allons modifier la classeFichier pour y manipuler non plus des fichiers textes mais des fichiers drsquoobjets

import javaiopublic class FichierEtudiant private ObjectOutputStream ofW private ObjectInputStream ofR private String nomDuFichier = Classedat private char mode

Les donneacutees de la classe FichierEtudiant sont deux objets repreacutesentant des flux drsquoeacutecri-ture (ofW) de lecture (ofR) drsquoobjets ainsi qursquoun caractegravere (mode) repreacutesentant le typedrsquoouverture du fichier et une chaicircne de caractegraveres (nomDuFichier) ougrave se trouve meacutemo-riseacute le nom de fichier de sauvegarde des donneacutees (Classedat)

Ouverture du flux (entrant ou sortant)

public void ouvrir(String s) throws IOException mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) ofR = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) ofW = new ObjectOutputStream(new FileOutputStream(nomDuFichier))

Lrsquoouverture du fichier Classedat en lecture est reacutealiseacutee gracircce aux constructeurs desclasses FileInputStream et ObjectInputStream alors que lrsquoouverture en eacutecriture esteffectueacutee par les constructeurs ObjectOutputStream() et FileOutputStream() Enreacutesultat les flux ofW et ofR contiennent les adresses de deacutebut de fichier

Traitement du fichier

Lrsquoobjectif est drsquoarchiver lrsquoensemble des donneacutees relatives agrave une classe drsquoeacutetudiants Lameacutethode ecrire() prend en paramegravetre un objet tmp de type Classe de sorte que lrsquoinfor-mation lui soit transmise depuis lrsquoapplication GestionClasse Lrsquoobjet transmis est alorsarchiveacute gracircce agrave la meacutethode writeObject(tmp)

public void ecrire(Classe tmp) throws IOException if (tmp = null) ofWwriteObject(tmp)

Inversement la meacutethode lire() lit lrsquoobjet stockeacute dans le fichier Classedat et letransmet en retour agrave lrsquoapplication GestionClasse sous forme drsquoobjet de type ClasseLrsquoen-tecircte de la meacutethode a pour type le type Classe Lrsquoobjet retourneacute est lu gracircce agrave lameacutethode readObject()

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

249

public Classe lire() throws IOException ClassNotFoundException Classe tmp = (Classe) ofRreadObject() return tmp

Observons que

bull La meacutethode lire() traite obligatoirement un nouveau type drsquoexception ClassNot-FoundException En effet la meacutethode readObject() transmet ce type drsquoexceptionlorsque le fichier lu ne contient pas drsquoobjet mais tout autre chose

Pour plus de preacutecisions sur la gestion des exceptions voir la section laquo Geacuterer les exceptions raquo en finde chapitre

bull La meacutethode readObject() lit sur le flux un objet quel que soit son type Il est doncneacutecessaire de speacutecifier par lrsquointermeacutediaire drsquoun laquo cast raquo le format de lrsquoobjet lu (voirau Chapitre 1 laquo Stocker une information raquo la section laquo La transformation de type raquo)Pour notre exemple lrsquoobjet lu est transmis agrave lrsquoobjet tmp par lrsquointermeacutediaire drsquoun cast(Classe) qui reacutealise la transformation de lrsquoobjet au bon format

Fermeture du flux

La fermeture drsquoun flux est reacutealiseacutee par la meacutethode close() de la mecircme faccedilon qursquoun fluxde fichier texte

public void fermer() throws IOException if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRoclose() else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWoclose()

Exemple Lrsquoapplication GestionClasse

Lrsquoapplication GestionClasse a pour contrainte de reacutealiser les actions suivantes

bull Une lecture automatique du fichier laquo classedat raquo degraves lrsquoouverture du programme afindrsquoinitialiser lrsquoobjet C (type Classe) agrave la liste drsquoeacutetudiants saisie lors drsquoune preacuteceacutedenteexeacutecution

bull Une sauvegarde automatique dans le fichier laquo classedat raquo lorsque lrsquoutilisateurchoisit de sortir du programme

Ces deux contraintes sont reacutealiseacutees par lrsquoapplication suivante

import javaiopublic class GestionClasse public static void main (String [] argument) throws IOException ClassNotFoundException byte choix = 0 Classe C = new Classe() FichierEtudiant F = new FichierEtudiant() Fouvrir(Lecture) C = Flire() Ffermer() String preacutenom nom do

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

250

Systemoutprintln(1 Ajoute un etudiant) Systemoutprintln(2 Supprime un etudiant) Systemoutprintln(3 Affiche la classe) Systemoutprintln(4 Affiche un etudiant) Systemoutprintln(5 Sortir) Systemoutprintln() Systemoutprint(Votre choix ) choix = Lireb() switch (choix) pour les options 1 2 3 4 voir Exemple Creacuteer un dictionnaire drsquoeacutetudiants case 1 Ajoute un etudiant case 2 Supprime un etudiant case 3 Affiche les etudiants case 4 Affiche un etudiant case 5 Systemoutprintln(Sauvegarde des donnees dans

Classedat) Fouvrir(Ecriture) Fecrire(C) Ffermer() Systemexit(0) break default Systemoutprintln(Cette option nrsquoexiste pas ) while (choix = 5) Fin de la classe GestionClasse

Lrsquoexeacutecution de cette application montre qursquoune difficulteacute subsiste En effet lors de latoute premiegravere exeacutecution du programme lrsquointerpreacuteteur affiche le message suivant

javaioFileNotFoundException Classedat (Le fichier speacutecifieacute est introuvable) at javaioFileInputStreamopen(Native Method) at javaioFileInputStreamltinitgt(FileInputStreamjava68) at FichierEtudiantouvrir(FichierEtudiantjava14) at GestionClassemain(Compiled Code)

Lrsquoerreur FileNotFoundException est transmise agrave la meacutethode main() via la meacutethodeFileInputStreamopen() gracircce agrave la clause throws IOException

En effet le fichier Classedat nrsquoexiste pas encore puisque crsquoest la premiegravere fois que leprogramme est exeacutecuteacute Lrsquooption 5 nrsquoa pu ecirctre exeacutecuteacutee et aucune sauvegarde nrsquoa donceacuteteacute reacutealiseacutee Tant que le programme ne peut ecirctre exeacutecuteacute dans son inteacutegraliteacute aucunfichier de sauvegarde ne peut ecirctre creacuteeacute

Pour contourner cet obstacle la solution consiste agrave empecirccher les erreurs de remonterdrsquoune meacutethode agrave lrsquoautre gracircce agrave la clause throws tout en geacuterant de faccedilon explicitechaque erreur qui pourrait survenir Cette solution est examineacutee agrave la section suivante

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

251

Geacuterer les exceptionsPlutocirct que de laisser lrsquoerreur se propager (avec la clause throws) le langage Java proposedes outils de capture des erreurs afin de les traiter directement agrave lrsquointeacuterieur des meacutethodessusceptibles de les deacutetecter Cette capture est reacutealiseacutee par lrsquointermeacutediaire des instructionstryhellipcatch

La meacutethode ouvrir()

Examinons le meacutecanisme de ces instructions sur la meacutethode ouvrir() proposeacutee agrave lasection preacuteceacutedente Comme observeacute preacuteceacutedemment cette meacutethode pose problegravemepuisqursquoelle propage lrsquoerreur FileNotFoundException lors de la toute premiegravere exeacutecutionde lrsquoapplication GestionClasse Pour eacuteviter cette propagation lrsquoideacutee est de placer lecouple drsquoinstructions tryhellipcatch de la faccedilon suivante

public boolean ouvrir(String s) try mode = (stoUpperCase())charAt(0) if (mode == rsquoRrsquo || mode == rsquoLrsquo) fRo = new ObjectInputStream(new FileInputStream(nomDuFichier)) else if (mode == rsquoWrsquo || mode == rsquoErsquo) fWo = new ObjectOutputStream(new FileOutputStream(nomDuFichier)) return true catch (IOException e) return false

La meacutethode srsquoexeacutecute alors de la faccedilon suivante comme expliqueacute ci-apregravesLes instructions qui composent le bloc try (en franccedilais essayer) sont exeacutecuteacutees

bull Si aucune erreur nrsquoest transmise par les diffeacuterents constructeurs qui reacutealisent lrsquoouver-ture du fichier le programme sort de la meacutethode ouvrir() en retournant un booleacuteende valeur eacutegale agrave true

bull Si une erreur est propageacutee par lrsquoun des constructeurs les instructions placeacutees dans lebloc catch (capture) sont exeacutecuteacutees agrave condition que lrsquoerreur deacutetecteacutee soit du mecircmetype que celui placeacute entre parenthegraveses derriegravere le terme catch Lrsquoerreur FileNotFoun-dException eacutetant du type IOException le programme sort de la meacutethode ouvrir()en retournant un booleacuteen de valeur eacutegale agrave false Aucun fichier nrsquoest donc ouvert

Puisque la meacutethode ouvrir() capture et traite elle-mecircme les erreurs eacuteventuelles la preacutesencede la clause throws devient inutile et elle nrsquoapparaicirct plus dans lrsquoen-tecircte de la meacutethode

Gracircce au traitement des erreurs en interne les instructions relatives agrave lrsquoouverture dufichier en lecture dans lrsquoapplication GestionClasse peuvent ecirctre modifieacutees de la faccedilonsuivante

FichierEtudiant F = new FichierEtudiant()if (Fouvrir(L)) C = Flire() Ffermer()

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

252

Le fichier est ouvert gracircce agrave lrsquoinstruction Fouvrir() Si le reacutesultat de la meacutethode vauttrue cela signifie que le fichier classedat existe et est ouvert Les instructions delecture du fichier situeacutees dans le bloc if peuvent ecirctre exeacutecuteacutees Agrave lrsquoinverse si le reacutesultatvaut false aucune instruction nrsquoest exeacutecuteacutee Le menu permettant la saisie de nouveauxeacutetudiants peut alors ecirctre afficheacute

La meacutethode lire()

La meacutethode lire() est susceptible de lever plusieurs types drsquoexception via la meacutethodereadObject() En effet cette derniegravere est susceptible de deacutetecter des erreurs du typeIOException ou ClassNotFoundException

La capture de ces exceptions est reacutealiseacutee en deacutefinissant autant de blocs catch qursquoil y adrsquoerreurs deacutetecteacutees La meacutethode lire() traite ces erreurs de la faccedilon suivante

public Classe lire() try Classe tmp = (Classe) fRoreadObject() return tmp catch (IOException e) Systemoutprintln(nomDuFichier + Erreur de lecture ) catch (ClassNotFoundException e) Systemoutprintln(nomDuFichier + nrsquoest pas du bon format ) return null

Il est ainsi possible de deacutefinir deux blocs catch successifs parameacutetreacutes en fonction destypes drsquoerreurs susceptibles drsquoecirctre deacutetecteacutes Le programme reacuteagit diffeacuteremment suivantlrsquoerreur captureacutee

ReacutesumeacuteLa programmation dynamique permet la gestion drsquoun nombre indeacutetermineacute drsquoobjetsen reacuteservant des espaces meacutemoire au fur et agrave mesure des besoins de lrsquoutilisateur

Pour ce faire le langage Java propose diffeacuterents outils tels que les objets de typeVector ou encore de type Hashtable

Les objets de type Vector autorisent la creacuteation drsquoune liste par ajout de donneacutees au furet agrave mesure des besoins de lrsquoutilisateur Les donneacutees sont en geacuteneacuteral enregistreacutees dansleur ordre drsquoarriveacutee Un indice geacutereacute par lrsquointerpreacuteteur permet de retrouver lrsquoinformation

Pour utiliser un vecteur il est neacutecessaire de le deacuteclarer de la faccedilon suivante

Vector liste = new Vector()

Pour ajouter un objet agrave la liste il suffit drsquoeacutecrire listeaddElement(objet) Il nrsquoestpas possible drsquoajouter une valeur autre qursquoun objet (telle que les variables de typeint par exemple)

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

253

Lorsque que lrsquoobjet est inseacutereacute dans la liste la taille de cette derniegravere est augmenteacuteede un La meacutethode size() calcule le nombre drsquoeacuteleacutements dans la liste et la meacutethodeelementAt(indice) permet de retrouver lrsquoobjet stockeacute agrave lrsquoindice speacutecifieacute en para-megravetre

La classe Vector eacutetant deacutefinie dans le package javautil il convient de placerlrsquoinstruction importjavautil en tecircte du fichier En effet si cette instructionfait deacutefaut le compilateur deacutetecte une erreur du type Class Vector not found

La recherche drsquoeacuteleacutements complexes dans une liste est plus rapide lorsque lesdonneacutees sont organiseacutees non plus par rapport agrave un indice mais par rapport agrave une cleacuteexplicite Les objets de type Hashtable proposent ce type drsquoorganisation desdonneacutees Pour cela il suffit de deacuteclarer une liste comme

Hashtable liste = new Hashtable ()

Les meacutethodes put(cleacute objet) et get(cleacute) permettent respectivement de placerdans la liste (dictionnaire) lrsquoassociation cleacutendashobjet et de retrouver lrsquoobjet associeacute agravela cleacute speacutecifieacutee en paramegravetre

Pour eacuteviter que les donneacutees stockeacutees en meacutemoire vive de lrsquoordinateur ne se perdentagrave lrsquoarrecirct de lrsquoapplication il est neacutecessaire de les archiver sous forme de fichiers sur ledisque dur Pour cela le langage Java utilise le concept de flux de fichier (en anglaisstream) qui est en quelque sorte la concreacutetisation informatique du courant eacutelec-trique passant de la meacutemoire vive au disque dur de lrsquoordinateur

Il existe diffeacuterents types de flux de fichiers

bull Drsquoune part les flux entrant pour lire les donneacutees sur le disque dur et les placer enmeacutemoire vive et les flux sortant qui eacutecrivent les donneacutees de la meacutemoire vive surle disque dur

bull Drsquoautre part les fichiers de type texte (BufferedWriter BufferedReader) qui nefont que manipuler des donneacutees de type String et les fichiers drsquoobjets (Objec-tOutputStream ObjectInputStream) qui manipulent tout type drsquoobjet

Drsquoune faccedilon geacuteneacuterale les traitements sur fichiers se deacuteroulent en trois temps ouver-ture du flux traitement des donneacutees parcourant le flux puis fermeture du fluxLorsqursquoun fichier est ouvert en eacutecriture

bull Si le fichier nrsquoexiste pas et

ndash Si le chemin drsquoaccegraves agrave ce fichier dans lrsquoarborescence du disque est valide alorsle fichier est creacuteeacute

ndash Si le chemin drsquoaccegraves nrsquoest pas valide alors le fichier nrsquoest pas creacuteeacute et uneerreur du type FileNotFoundException est deacutetecteacutee

bull Si le fichier existe il est ouvert et son contenu est totalement effaceacute

Lorsqursquoune erreur est deacutetecteacutee par les meacutethodes associeacutees au flux le coupledrsquoinstructions tryhellipcatch permet la capture de lrsquoexception afin de lui associer untraitement speacutecifique

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

254

ExercicesComprendre les vecteurs

Lrsquoobjectif est de stocker les notes drsquoun eacutetudiant sous la forme drsquoun vecteur

a Deacutefinissez un objet note de type Vector comme variable drsquoinstance de laclasse Etudiant

b Modifiez le constructeur de la classe Etudiant afin de saisir les notes et de lesplacer dans le vecteur

Prenez garde que seul un objet peut ecirctre stockeacute dans un vecteur Une note eacutetantde type double (type simple) ne peut pas ecirctre directement placeacutee dans levecteur Il est neacutecessaire de la transformer en objet de type Double Lrsquoappel auconstructeur de la classe Double permet cette transformation

Par exemple lrsquoinstruction new Double(Lired()) permet la transformationdirecte drsquoune valeur double saisie au clavier en un objet de type Double

c La meacutethode calculMoyenne() doit calculer la moyenne des notes agrave partir desnotes saisies dans le constructeur Le programme doit par conseacutequent parcourirlrsquoensemble du vecteur note afin drsquoen calculer la somme Puisque ces valeurssont stockeacutees sous la forme drsquoobjets Double il est neacutecessaire pour reacutealiser cecalcul de les transformer de nouveau en type simple double Pour cela ilconvient drsquoappliquer la meacutethode doubleValue() agrave lrsquoobjet de type Double

d Dans la meacutethode afficheUnEtudiant() modifiez lrsquoaffichage des notes enparcourant non plus le tableau mais le vecteur note

Comprendre les dictionnaires

Lrsquoobjectif est drsquoeacutecrire une meacutethode modifieUnEtudiant() qui modifie les notesdrsquoun eacutetudiant stockeacute dans un dictionnaire Cette meacutethode fonctionne dans lrsquoensem-ble comme la meacutethode ajouteUnEtudiant() (voir la section laquo Les dictionnaires raquode ce chapitre)

a Cependant la meacutethode doit connaicirctre les nom et preacutenom de lrsquoeacutetudiant agrave modifierCes donneacutees lui sont transmises par paramegravetre

b Ensuite connaissant les nom et preacutenom le programme calcule la cleacute et veacuterifie silrsquoeacutetudiant existe dans la liste

c Srsquoil existe la modification consiste agrave lui donner de nouvelles notes Pour celalrsquoideacutee est drsquoeacutecrire un deuxiegraveme constructeur Etudiant() dont les paramegravetressont les nom et preacutenom de lrsquoeacutetudiant Le corps du constructeur ne fait ensuite questocker dans les variables drsquoinstance approprieacutees les nom et preacutenom passeacutes enparamegravetres sans avoir agrave les ressaisir puis saisir les nouvelles notes et enfincalculer la moyenne

d Modifiez lrsquoapplication GestionClasse de faccedilon agrave inteacutegrer au menu cettenouvelle option

101

102

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

255

Geacuterer les erreursLrsquoobjectif est de capturer toutes les erreurs (IOException) possibles dans la classeFichierEtudiant deacutecrite au cours de ce chapitre

a Reprenez la classe FichierEtudiant et geacuterez la deacutetection des erreurs pour lesmeacutethode fermer() et ecrire() en deacutefinissant des blocs catch et try appro-prieacutes

b Lorsque toutes les meacutethodes de la classe FichierEtudiant gegraverent les excep-tions plus aucune clause throws ne doit apparaicirctre sur lrsquoen-tecircte des meacutethodes ycompris pour la meacutethode main() de lrsquoapplication GestionClasse Modifiezlrsquoapplication GestionClasse en tenant compte de cette remarque

Le projet laquo Gestion drsquoun compte bancaire raquoLes comptes sous forme de dictionnaireLa classe ListeCompte

En reprenant la classe Classe preacutesenteacutee au cours de ce chapitre eacutecrire la classeListeCompte dont la donneacutee est une liste de type Hashtable La classe ListeCompte estcomposeacutee des meacutethodes suivantes

a ListeCompte() qui fait appel au constructeur de la classe Hashtable

b ajouteUnCompte(String t) qui permet la creacuteation drsquoun compte courant joint oudrsquoeacutepargne Afin de faire appel au constructeur approprieacute (Compte() ou CpteEpar-gne()) faire passer en paramegravetre de la meacutethode ajouteUnCompte() une chaicircne decaractegraveres speacutecifiant le type du compte agrave creacuteer Par exemple lorsque le paramegravetre dela meacutethode vaut E un compte drsquoeacutepargne est creacuteeacute alors que srsquoil vaut A (commeAutre) un compte ordinaire est creacuteeacute

Lorsque le compte est creacuteeacute inseacuterez-le dans le dictionnaire en prenant comme cleacutedrsquoassociation son numeacutero de compte

c ajouteUneLigne() qui ajoute une ligne au compte dont le numeacutero est speacutecifieacute enparamegravetre de la meacutethode Pour cela faites appel agrave la meacutethode creacuteerLigne() de laclasse Compte

d Les meacutethodes rechercheUnCompte() supprimeUnCompte() et afficheLesComp-tes() sont agrave eacutecrire en srsquoinspirant des meacutethodes eacutequivalentes de la classe Classe

Lrsquoapplication Projet

Dans lrsquoapplication Projet deacuteclarer lrsquoobjet C comme eacutetant du type ListeCompte Puis

a Dans chaque option du menu faire appel aux meacutethodes de la classe ListeCompte

b Lors de lrsquoajout drsquoun compte ne pas omettre de speacutecifier en paramegravetre le type ducompte (A ou E)

c Ajouter lrsquooption de suppression drsquoun compte (option 5) et lrsquoaffichage de la liste detous les comptes (option 3) Modifier lrsquoaffichage du menu et le switch de faccedilon agravetenir compte de ces nouvelles options Remarquez qursquoil nrsquoest plus besoin de tester

103

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

256

lrsquoexistence du compte avant de lrsquoafficher ou de le supprimer puisque ce sont lesmeacutethodes de la classe ListeCompte qui srsquoen chargent directement

La sauvegarde des comptes bancaires

La classe FichierCompte

Pour sauvegarder les donneacutees saisies pour chaque compte reprendre la classe FichierE-tudiant deacutecrite dans ce chapitre

a Modifier le nom de la classe par FichierCompte et remplacer le nom du fichier desauvegarde par laquo Comptedat raquo

b Dans les meacutethodes lire() et ecrire() remplacer lrsquoobjet lu ou eacutecrit par un objet detype ListeCompte

c Ne pas oublier de rendre seacuterialisable lrsquoensemble des classes neacutecessaires agrave la cons-truction de la liste des comptes

Lrsquoapplication Projet

Modifier lrsquoapplication de faccedilon agrave

a lire le fichier laquo Comptedat raquo avant de proposer lrsquoajout la suppression ou lrsquoaffichagedes comptes

b reacutealiser une sauvegarde automatique agrave la sortie du programme (option 6)

La mise en place des dates dans les lignes comptables

Chaque ligne comptable est deacutefinie par un ensemble de donneacutees dont la date de reacutealisa-tion de lrsquoopeacuteration Pour lrsquoinstant cette date est saisie sous forme drsquoun String sansaucun controcircle sur le format reacuteellement saisi (jourmoisan) Lrsquoobjectif est drsquoeacutecrire unemeacutethode qui veacuterifie si les valeurs saisies correspondent au format demandeacute

Rechercher des meacutethodes dans les diffeacuterents packages

Pour effectuer ce controcircle le langage Java propose un certain nombre drsquooutils deacutefinisdans les packages du JDK En particulier il existe des outils qui transforment une chaicircnede caractegraveres en objet Date Cette transformation est reacutealiseacutee agrave partir drsquoun format deacutefinipar le programmeur

Pour trouver ces diffeacuterents outils les deux solutions suivantes sont possibles

a Soit rechercher dans lrsquoarborescence du JDK fourni avec le CD-Rom (jdk13docsapijava) tous les fichiers contenant le mot Date afin de deacuteterminer les diffeacuterentspackages concerneacutes par ce type drsquoinformation Puis pour tous les fichiers trouveacutesexaminer les diffeacuterentes meacutethodes proposeacutees de faccedilon agrave trouver celle susceptible dereacutepondre agrave votre attente

b Soit se connecter sur Internet par exemple agrave lrsquoadresse httpforum2javasuncomforum de faccedilon agrave y rechercher des exemples utilisant des objets de type Date

copy copyright Eacuteditions Eyrolles

Collectionner un nombre indeacutetermineacute dobjetsCHAPITRE 10

257

Eacutecrire la meacutethode controcircleDate()Lrsquoalgorithme permettant le controcircle du format de la date est le suivant

a Saisir une date comme une suite de caractegraveres (String)

b Traduire cette chaicircne en objet Date gracircce aux meacutethodes trouveacutees agrave lrsquoeacutetape preacuteceacute-dente

c Capturer les erreurs propageacutees par cette meacutethode afin drsquoincreacutementer un compteurdrsquoessai de saisie de la date

d Reacutepeacuteter ces deux derniers points tant que la date nrsquoest pas correctement traduite(lrsquoobjet date restant eacutegal agrave null) Au bout de trois essais la date est initialiseacutee agrave ladate courante du systegraveme de lrsquoordinateur

e En sortie de boucle la date correspond au format demandeacute Elle peut ecirctre traduite entype String pour ecirctre ensuite stockeacutee dans la donneacutee date de la classe LigneComp-table

copy copyright Eacuteditions Eyrolles

11Dessiner des objets

Le langage Java srsquoest surtout fait connaicirctre en proposant pour Internet des outils de deacuteve-loppement drsquoapplications graphiques multiplates-formes crsquoest-agrave-dire fonctionnant surdes ordinateurs de tout type Ces programmes sont exeacutecuteacutes agrave travers un navigateur Webde faccedilon transparente pour lrsquointernaute que lrsquoordinateur utiliseacute soit un Mac un PC ouune station Unix

Ces applications utilisent des composants graphiques deacutefinis dans la librairie graphiqueAWT (Abstract Windowing Toolkit) Dans ce chapitre nous eacutetudions drsquoabord agrave lasection laquo La librairie AWT raquo comment utiliser les outils de ce package Nous abordonsensuite agrave la section laquo Les eacuteveacutenements raquo la gestion des eacuteveacutenements en analysantcomment associer une action ou un comportement agrave un composant graphique Pourfinir nous construisons agrave la section laquo Les applets raquo une application directement exeacutecu-table par un navigateur Web

La librairie AWTLa librairie AWT est un package du JDK (Java Development Kit) qui propose unensemble drsquooutils de creacuteation drsquoapplications graphiques crsquoest-agrave-dire drsquoapplications dontle mode de communication avec lrsquoutilisateur srsquoeacutetablit agrave travers des eacuteleacutements graphiquestels que boutons menus fenecirctres etc

Notre objectif nrsquoest pas de deacutecrire lrsquointeacutegraliteacute de la librairie AWT mais de preacutesenter aulecteur un certain nombre drsquoexemples afin de lui donner une bonne vision de lrsquoutilisationde ces outils ainsi qursquoune certaine meacutethodologie Pour cela nous reprenons lrsquoexempledu sapin de Noeumll deacutecoreacute deacutecrit agrave la section laquo Les tableaux agrave deux dimensions raquo duchapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Cette fois le sapin nrsquoest plusafficheacute agrave lrsquoaide de simples caractegraveres mais avec des composants graphiques utilisant lesmeacutethodes preacutedeacutefinies de lalibrairie AWT

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

260

Les fenecirctresLrsquoaffichage drsquoun outil graphique quel qursquoil soit (bouton menu etc) est toujours reacutealiseacutedans une fenecirctre Toute application graphique srsquoexeacutecute agrave lrsquointeacuterieur drsquoune zone deacuteli-miteacutee appeleacutee fenecirctre principale dans laquelle sont placeacutes barres drsquooutils menus etzones de texte ou de dessin

Cette fenecirctre deacutelimite le cadre drsquoexeacutecution du programme et tout eacuteleacutement se situant endehors de la fenecirctre fait partie drsquoune autre application La fenecirctre possegravede un bord et unebarre de titre dans laquelle se situent des boutons de fermeture et de mise en icocircne oudrsquoagrandissement comme illustreacute agrave la Figure 11-1 Elle peut ecirctre deacuteplaceacutee ou agrandiesans que le programmeur ait agrave geacuterer lui-mecircme ces actions

En langage Java la fenecirctre principale est deacutefinie gracircce agrave la classe Frame Observez leprogramme suivant qui deacutecrit comment deacutefinir et afficher une Frame

Exemple Une fenecirctre

import javaawtclass Fenetre public final static int HT = 300 public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() FsetTitle(Une fenetre) met le titre FsetSize(HT LG) taille de la fenecirctre FsetBackground(Colorgray) Fshow() affiche la fenecirctre

Figure 11-1

La fenecirctre principale deacutelimite le lieu drsquoexeacutecution du programme Elle est constitueacutee drsquoune bordure et drsquoune barre de titre

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

261

Nous constatons tout drsquoabord que la toute premiegravere instruction drsquoun programme quiutilise des objets graphiques est obligatoirement une instruction drsquoimport du package dela librairie AWT (import javaawt ) En effet comme pour les vecteurs et lesdictionnaires les outils de la librairie graphique ne sont pas directement connus ducompilateur

Apregraves avoir deacutefini deux constantes HT et LG pour la hauteur et la largeur de la fenecirctre lafonction main() deacuteclare et construit un objet F de type Frame (Frame F = newFrame()) Comme toute classe la classe Frame propose un ensemble de meacutethodes quipermettent la transformation de ses caracteacuteristiques notamment les suivantes

bull setTitle() qui place la chaicircne de caractegraveres speacutecifieacutee en paramegravetre dans la barre detitre de la fenecirctre

bull setSize() qui deacutefinit la hauteur et la largeur de la fenecirctre

bull setBackground() qui donne une couleur de fond agrave la fenecirctre

Cela fait la fenecirctre est deacutefinie en meacutemoire mais nrsquoest pas encore afficheacutee agrave lrsquoeacutecran Pourreacutealiser cet affichage la meacutethode show() deacutefinie par la classe Frame est appliqueacutee agrave lrsquoobjet F

Pour connaicirctre en deacutetail lrsquoensemble des fonctionnaliteacutes de la classe Frame reportez-vousau fichier Cjdk13docsapijavaawtFramehtml apregraves installation du JDK et desa documentation

Exemple Reacutesultat de lrsquoexeacutecution

Lors de lrsquoexeacutecution de ce programme la fenecirctre ayant pour titre laquo Une fenetre raquo appa-raicirct agrave lrsquoeacutecran comme illustreacute agrave la Figure 11-1

Le dessinUne fois afficheacutee la fenecirctre nrsquoest pas encore directement fonctionnelle et il nrsquoest paspossible drsquoy afficher un dessin ou drsquoy eacutecrire un texte Il nrsquoest pas non plus possible defermer la fenecirctre en cliquant sur le bouton de fermeture situeacute dans la barre de titre

En effet lrsquoaffichage drsquoun dessin ne peut ecirctre reacutealiseacute que par lrsquointermeacutediaire drsquoun objet detype Canvas

En outre pour fermer la fenecirctre drsquoun simple clic sur le bouton approprieacute le programmedoit ecirctre capable drsquoentendre les clics de la souris Nous eacutetudions ce concept agrave la sectionlaquo Les eacuteveacutenements raquo en fin de chapitre

Exemple Dessiner un sapin de Noeumll

Lrsquoobjectif de cet exemple est de reacutealiser lrsquoaffichage drsquoun sapin deacutecoreacute en mode graphiqueFidegravele agrave la meacutethode de travail qui consiste agrave deacutecouper un problegraveme en plusieurs tacircchesindeacutependantes nous allons reacutealiser lrsquoaffichage du sapin de Noeumll eacutetape par eacutetape

Prenons pour hypothegravese qursquoun sapin est formeacute de triangles disposeacutes agrave lrsquoeacutecran de faccedilonque leur juxtaposition reacutealise une forme de sapin Nous placerons ensuite la deacutecorationdu sapin en modifiant la couleur de certains triangles

Nous devons concevoir dans un premier temps un programme qui dessine un simpletriangle de couleur verte

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

262

Dessiner un triangle

Pour cela nous deacutefinissons une classe Dessin qui heacuterite de la classe Canvas (classDessin extends Canvas) De cette faccedilon un objet de type Dessin correspond agrave unezone drsquoaffichage ougrave il est possible de dessiner des formes geacuteomeacutetriques (point droiterectangle etc) Examinons attentivement cette classe

import javaawtpublic class Dessin extends Canvas public Dessin() setBackground(Colorwhite) setForeground(Colorgreen) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) public void paint (Graphics g) new Triangle(g)

La classe Dessin est composeacutee des deux meacutethodes suivantes

bull Le constructeur Dessin() qui initialise une partie des caracteacuteristiques drsquoun objetCanvas agrave savoir

ndash La couleur de fond La meacutethode setBackground(Colorwhite) place la couleurblanche en fond de la zone de dessin (Canvas)

ndash La couleur drsquoavant-plan La meacutethode setForeground(Colorgreen) assigne lacouleur verte aux formes geacuteomeacutetriques dessineacutees dans la zone de dessin

ndash Le curseur La meacutethode setCursor(new Cursor(CursorCROSSHAIR_CURSOR))affiche un curseur en forme de croix lorsque le curseur de la souris se situe dans lazone de dessin

bull La meacutethode paint() qui est une meacutethode preacutedeacutefinie de la classe Canvas Cette meacutethodeest appeleacutee par lrsquointerpreacuteteur degraves qursquoil lui est neacutecessaire drsquoafficher un objet graphiqueElle est appeleacutee lors de lrsquoaffichage de la fenecirctre principale ou lorsque cette derniegravere reacuteap-paraicirct apregraves avoir eacuteteacute partiellement ou totalement cacheacutee par une autre fenecirctre

La meacutethode paint() utilise en paramegravetre un objet g de type Graphics de faccedilon agravedrsquoobtenir des informations sur le contexte graphique deacutefini par lrsquoapplication Le contextegraphique est lrsquoensemble des informations utiles agrave lrsquoaffichage drsquoun objet La couleur etla forme des caractegraveres (fonte) par exemple font partie du contexte graphique

Ainsi lorsque lrsquointerpreacuteteur affiche une fenecirctre il transmet agrave la meacutethode paint() parlrsquointermeacutediaire du paramegravetre g toutes les caracteacuteristiques de lrsquoaffichage En particulier il luitransmet sa couleur drsquoavant-plan initialiseacutee agrave colorgreen dans le constructeur Dessin()

Pour finir lrsquoexeacutecution de la meacutethode paint() reacutealise lrsquoaffichage du triangle gracircce agrave lrsquoappeldu constructeur de la classe Triangle (new Triangle(g)) dont voici la description

import javaawtpublic class Triangle private int centreX = FenetreLG2 private int centreY = FenetreHT2 private int [] xPoints = centreX centreX + 10 centreX - 10

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

263

private int [] yPoints = centreY - 10 centreY + 10 centreY + 10 int nPoints = 3 public Triangle(Graphics g) gfillPolygon(xPoints yPoints nPoints)

Les donneacutees de la classe Triangle correspondent agrave deux tableaux drsquoentiers deacutefinissantles sommets drsquoun triangle centreacute comme illustreacute agrave la Figure 11-2

Le sommet A est deacutefini par le couple de coordonneacutees (xPoints[0] yPoints[0]) lesommet B par (xPoints[1] yPoints[1]) et C par (xPoints[2] yPoints[2]) Lestableaux deacutefinissent ainsi les sommets drsquoun polygone (triangle) centreacute par rapport agrave lafenecirctre principale de lrsquoapplication Notez que les coordonneacutees des sommets sont deacutefiniespar rapport agrave lrsquoorigine de lrsquoobjet Canvas laquelle est situeacutee par deacutefaut dans le coin supeacute-rieur gauche de cet objet

Lrsquoaffichage du triangle est reacutealiseacute gracircce agrave la meacutethode fillPolygon(xPoints yPointsnPoints) qui remplit de couleur le polygone speacutecifieacute en paramegravetre La couleur deremplissage est deacutetermineacutee par lrsquointermeacutediaire de lrsquoobjet g sur lequel la meacutethode estappliqueacutee

Lrsquoapplication Fenetre

Sans modification de lrsquoapplication Fenetre telle que deacutefinie agrave la section preacuteceacutedente dece chapitre (voir laquo Les fenecirctres raquo) aucun triangle nrsquoapparaicirct En effet avant drsquoexeacutecuter leprogramme nous devons ajouter agrave la fenecirctre le composant Dessin de sorte que lrsquoappli-cation puisse associer lrsquoobjet de type Canvas agrave la Frame F

Figure 11-2

Le triangle est construit agrave partir des sommets A B et C dont les coordonneacutees sont calculeacutees par rapport agrave lrsquoorigine de la zone de dessin situeacutee en haut et agrave gauche

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

264

Pour cela il suffit drsquoajouter lrsquoinstruction Fadd(new dessin()) comme lrsquoillustre lrsquoextraitde programme suivant

class Fenetre hellip Frame F = new Frame() FsetTitle(Un triangle) hellip Fadd(new Dessin()) Fshow() affiche la fenecirctre

La meacutethode add() ajoute un composant graphique agrave la fenecirctre principale Ce composantest deacutefini par la classe Dessin Une fois F afficheacutee gracircce agrave la meacutethode show la meacutethodepaint() est exeacutecuteacutee automatiquement et le triangle srsquoaffiche

La construction du sapin

Sachant maintenant afficher un simple triangle nous pouvons construire le sapin par juxta-position drsquoun ensemble de triangles Pour reacutealiser le bon positionnement des trianglesutilisons la technique deacuteveloppeacutee agrave la section laquo Les tableaux agrave deux dimensions raquo duChapitre 9 laquo Collectionner un nombre fixe drsquoobjets raquo Analysons la classe Arbre quireprend ce proceacutedeacute

import javaawtclass Arbre private int [][] sapin private Color deacutecoration public Arbre(int nl Color c) int nc = 2nl-1 deacutecoration = c sapin = new int[nl][nc] int milieu = sapin[0]length2 for ( int j = 0 j lt nl j++) for ( int i = -j i lt= j i++) sapin[j][milieu+i] = (int ) (5Mathrandom()+1) public void dessine(Graphics g) Color Vert = Colorgreen for (int i = 0 i lt sapinlength i++) for (int j = 0 j lt sapin[0]length j++) switch(sapin[i][j]) case 1 new Triangle(i j g deacutecoration) break case 2 Vert = Vertbrighter() new Triangle(i j g Vert) break case 3 Vert = Vertdarker() new Triangle(i j g Vert) break

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

265

case 4 Vert = Vertbrighter() new Triangle(i j g Vert) break case 5 Vert = Vertdarker() new Triangle(i j g Vert) break case 6 Vert = Vertbrighter() new Triangle(i j g Vert) break

La classe Arbre est composeacutee de deux donneacutees le tableau drsquoentiers agrave deux dimensionssapin et la couleur deacutecoration Elle comporte en outre les deux meacutethodes suivantes

bull Le constructeur Arbre() qui initialise la couleur de la deacutecoration et le tableausapin qui utilise la mecircme technique que le sapin afficheacute en caractegraveres graphiques Lesparamegravetres du constructeur rendent possible la creacuteation de sapins de taille et decouleur diffeacuterentes

bull La meacutethode dessine() qui en parcourant le tableau sapin creacutee un triangle agrave lrsquoaide duconstructeur de la classe Triangle pour toute valeur sapin[i][j] diffeacuterente de 0Gracircce aux paramegravetres du nouveau constructeur Triangle() le triangle est afficheacute agravelrsquoeacutecran en fonction de sa position dans le tableau (indices i et j) et de la valeur dutableau (sapin[i][j]) Remarquez les meacutethodes darker() et brighter() quipermettent de foncer ou drsquoeacuteclaircir la couleur sur laquelle la meacutethode est appliqueacuteeGracircce agrave ces meacutethodes le sapin nrsquoapparaicirct pas drsquoun vert uniforme

Les paramegravetres du constructeur de la classe Triangle sont donc modifieacutes de faccedilon agrave neplus afficher un seul triangle vert au centre de la fenecirctre mais un triangle drsquoune couleuret drsquoune position donneacutees Pour reacutealiser cela le constructeur est deacutefini avec un ensemblede paramegravetres caracteacuterisant la position en x et y agrave lrsquoeacutecran ainsi que la couleur drsquoaffichagedu triangle Examinons cette modification dans la classe Triangle ci-dessous

import javaawtpublic class Triangle private int pX = FenetreLG2-50 private int pY = FenetreHT2-50 private int [] xPoints = 0 10 -10 private int [] yPoints = -10 10 10 private int nPoints = 3 public Triangle(int col int lig Graphics g Color c) for (int i = 0 i lt nPoints i++) xPoints[i] = xPoints[i]+(5lig) + pX yPoints[i] = yPoints[i]+(15col) + pY gsetColor(c) gfillPolygon(xPoints yPoints nPoints)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

266

Chaque triangle afficheacute ne se trouve plus au centre de la fenecirctre mais agrave une positionspeacutecifieacutee en paramegravetre Cette position est deacutetermineacutee par les eacuteleacutements suivants

bull un point de reacutefeacuterence (pX pY) deacutefini en fonction de la taille de la fenecirctre

bull la position (i j) du triangle dans le tableau sapin

Ces valeurs sont transmises au constructeur gracircce aux paramegravetres col et lig Ces valeurseacutetant connues les sommets du polygone sont calculeacutes de faccedilon agrave afficher ce dernier aubon endroit agrave lrsquoeacutecran Comme tous les triangles prennent un certain espace en hauteur eten largeur il est neacutecessaire drsquoappliquer un coefficient (5 et 10) aux indices lig et colpour que chaque triangle ne se superpose pas trop agrave ses voisins

Le dessin du sapin

Pour que le sapin construit en meacutemoire srsquoaffiche ce dernier doit ecirctre placeacute dans la fenecirctrede dessin Crsquoest ce que reacutealise la classe Dessin suivante

import javaawtpublic class Dessin extends Canvas private Color couleur = Colorgreen public final static Color couleurFond = Colorwhite private Arbre A public Dessin() setBackground(couleurFond) setForeground(couleur) setCursor(new Cursor(CursorCROSSHAIR_CURSOR)) A = new Arbre(8 Coloryellow) public void paint (Graphics g) Adessine(g)

Cette classe reprend en grande partie lrsquoarchitecture de la classe Dessin deacutecrite agrave lasection laquo Dessiner un triangle raquo au deacutebut de ce chapitre Pour remplacer le triangle parun sapin le constructeur Dessin() creacutee en meacutemoire un objet A de type Arbre Lameacutethode paint() appelle ensuite la meacutethode dessine() par lrsquointermeacutediaire de lrsquoobjet Apour lrsquoafficher agrave lrsquoeacutecran

Remarquez que lrsquoapplication Fenecirctre nrsquoest pas agrave modifier Lorsque lrsquoapplication estexeacutecuteacutee une fenecirctre srsquoaffiche avec son composant de type Dessin Ce dernier creacutee enmeacutemoire un objet A de type Arbre puis la meacutethode paint() est automatiquementappeleacutee par lrsquointerpreacuteteur Le sapin est alors afficheacute

Les eacuteleacutements de communication graphiqueOutre les composants drsquoaffichage tels que les Frame et les Canvas la librairie AWTpropose des outils de communication graphique comme les boutons et les menus

Ces outils offrent la possibiliteacute drsquoeacutecrire des applications munies drsquoune interfacegraphique reacuteellement interactive Lrsquoutilisateur manipule directement les objets proposeacutespar lrsquointerface et cette derniegravere reacuteagit en fonction des actions de lrsquoutilisateur Puisqursquoil

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

267

nrsquoest pas possible de savoir agrave lrsquoavance quel objet va ecirctre manipuleacute chaque composantdoit ecirctre programmeacute de faccedilon agrave reacuteagir directement aux manipulations de lrsquoutilisateurChaque manipulation est consideacutereacutee comme un eacuteveacutenement auquel est associeacute un traite-ment crsquoest-agrave-dire une action

Afin drsquoeacutetudier ces diffeacuterents concepts nous allons ameacuteliorer lrsquoapplication du sapin deNoeumll en y inseacuterant deux boutons un premier bouton pour afficher un sapin avec denouvelles deacutecorations et un second pour quitter lrsquoapplication

Les boutons

Les boutons sont les composants de communication les plus utiliseacutes pour creacuteer des inter-faces graphiques Gracircce agrave eux par un simple clic lrsquoutilisateur valide son souhait de voirreacutealiser le traitement proposeacute par le bouton

Les boutons sont deacutefinis dans la librairie AWT par la classe Button Pour afficher un boutonil suffit de lrsquoajouter agrave une fenecirctre comme nous lrsquoavons deacutejagrave fait pour dessiner un objetCanvas Examinons la classe Fenetre dans laquelle nous allons inseacuterer deux boutons

import javaawtclass Fenetre public final static int HT = 300public final static int LG = 300 public static void main(String [] arg) Frame F = new Frame() hellip Fadd(new Dessin()) Fadd(new Button(Nouveau)) Fadd(new Button(Quitter)) Fshow()

Dans cet exemple deux boutons portant les noms de laquo Quitter raquo et laquo Nouveau raquo sontajouteacutes agrave la fenecirctre F gracircce agrave la meacutethode add() Lorsque le programme est exeacutecuteacute lrsquoaffi-chage reacutesultant est celui illustreacute agrave la Figure 11-3

Figure 11-3

Les composants graphiques srsquoaffichent en se superposant les uns aux autres Crsquoest pourquoi le dernier bouton cache les autres composants

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

268

Chaque composant (Canvas et Button) est ajouteacute agrave la fenecirctre sans que soient speacutecifieacutes nisa position ni sa taille Dans cette situation lrsquointerpreacuteteur affiche les composants en lessuperposant dans leur ordre drsquoarriveacutee Le dernier bouton laquo Quitter raquo cache par conseacute-quent le composant Dessin ainsi que le bouton Nouveau

Les conteneurs

Pour corriger cette erreur il convient lorsque vous souhaitez afficher plusieurs composantsgraphiques de placer ces derniers agrave lrsquointeacuterieur drsquoun conteneur (en anglais container)

Un conteneur est une sorte de boicircte qui contient tous les eacuteleacutements de communicationutiliseacutes dans lrsquoapplication La plus part des boicirctes agrave outils proposeacutees dans les logicielsreacutecents sont des conteneurs Remarquez que seules les Frame ne peuvent ecirctre placeacuteesdans un conteneur

Un conteneur est deacutefini par la classe Panel du package javaawt Examinons commentlrsquoutiliser dans le programme suivant

import javaawtpublic class DesBoutons extends Panel public DesBoutons() initialisation setBackground(ColorlightGray) Les boutons Button bNouveau = new Button (Nouveau) thisadd(bNouveau) Button bQuitter = new Button (Quitter) thisadd(bQuitter)

La classe DesBoutons est deacutefinie comme classe heacuteritant de la classe Panel (DesBoutonsextends Panel) Elle est composeacutee drsquoun constructeur qui creacutee en meacutemoire deuxboutons bNouveau et bQuitter et les ajoute ensuite au conteneur gracircce agrave la meacutethodeadd() Par deacutefaut les boutons sont afficheacutes au centre du Panel par ordre drsquoarriveacutee

Remarquez lrsquoapplication du terme this aux meacutethodes add() Facultatif ce termeindique agrave lrsquointerpreacuteteur qursquoil doit ajouter ces objets (les boutons) agrave lrsquoobjet qursquoil est entrain de construire crsquoest-agrave-dire au Panel nommeacute DesBoutons Lrsquoexpression this repreacute-sente lrsquoobjet qui se construit en meacutemoire

Une fois deacutefini le conteneur doit ecirctre ajouteacute agrave la fenecirctre Pour eacuteviter toute superpositiondu conteneur agrave lrsquoobjet Canvas il est possible drsquoindiquer agrave lrsquointerpreacuteteur comment afficherles eacuteleacutements les uns par rapport aux autres Utilisons agrave cette fin les termes SouthNorth Center East et West en paramegravetre de la meacutethode add()

Le programme Fenetre ci-dessous utilise cette technique pour afficher correctement lesdeux boutons

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame()

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

269

Fadd(new Dessin() Center) Fadd(new DesBoutons() South) Fshow()

Gracircce aux paramegravetres Center et South les composants srsquoaffichent correctement lafenecirctre de dessin au-dessus de la boite agrave boutons comme illustreacute agrave la Figure 11-4

Notre application possegravede maintenant deux boutons Pourtant lorsque lrsquoutilisateurclique sur lrsquoun ou lrsquoautre de ces boutons rien ne se passe lrsquoaffichage de nouveauxsapins nrsquoest pas effectueacute et il nrsquoest pas non plus possible de quitter lrsquoapplication encliquant sur le bouton Quitter

Crsquoest qursquoil ne suffit pas drsquoafficher un bouton avec un texte correspondant agrave lrsquoaction souhaiteacuteepour voir cette action se reacutealiser La classe Button ne fait que deacutefinir les attributs graphiquesdes boutons Pour associer un bouton agrave une action il faut encore geacuterer les eacuteveacutenements

Les eacuteveacutenementsEn langage Java la gestion des eacuteveacutenements est reacutealiseacutee par lrsquointermeacutediaire drsquoobjetsspeacutecifiques appeleacutes eacutecouteurs (en anglais listener) De faccedilon simplifieacutee on peut direque lorsque lrsquoutilisateur clique sur un bouton ou sur une commande de menu le compo-sant concerneacute eacutemet un eacuteveacutenement agrave lrsquoattention de lrsquoeacutecouteur

Le traitement de cet eacuteveacutenement est reacutealiseacute par lrsquoeacutecouteur drsquoeacuteveacutenement (Eventlistener)et non pas par le composant lui-mecircme Le langage Java gegravere les eacuteveacutenements en suivantun modegravele dit laquo par deacuteleacutegation raquo (en anglais delegation model) le traitement de lrsquoeacuteveacutene-ment eacutetant deacuteleacutegueacute agrave un autre composant que celui qui lrsquoa perccedilu

Les types drsquoeacuteveacutenementsChaque composant graphique eacutemet un eacuteveacutenement propre agrave sa classe et il existe doncplusieurs types drsquoeacuteveacutenements On distingue les Eacuteveacutenements de bas niveau et les Eacuteveacutene-ments de haut niveau

Figure 11-4

Une fois la position des composants deacutefinie par rapport aux bords de la fenecirctre principale chaque composant srsquoaffiche correctement

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

270

Eacuteveacutenements de bas niveau

Les eacuteveacutenements de bas niveau sont les eacuteveacutenements creacuteeacutes agrave partir de la souris du clavierou drsquoune fenecirctre Le tableau suivant reacutesume les types drsquoeacuteveacutenements de bas niveau lesplus utiliseacutes

Pour geacuterer un eacuteveacutenement lieacute agrave la souris par exemple il convient de deacutefinir un eacutecouteurde type MouseListener et de deacutecrire le comportement de lrsquoapplication pour chaquemeacutethode associeacutee agrave cet eacutecouteur

Eacuteveacutenements de haut niveau

Les eacuteveacutenements de haut niveau sont lieacutes non plus aux comportements du composantgraphique mais agrave ses actions possibles Ainsi un clic de souris sur un bouton ne geacutenegravereplus un eacuteveacutenement speacutecifique du composant mais un comportement deacutefini par leprogrammeur

Eacutecouteur Comportement agrave programmer

MouseListener

Eacutecoute les eacuteveacutene-ments lieacutes agrave la souris

mousePressed(MouseEvent) Appeleacute lors drsquoune pression sur un bouton de la souris

mouseReleased(MouseEvent) Appeleacute lorsqursquoun bouton de la souris est relacirccheacute

mouseExited(MouseEvent) Appeleacute lorsque la souris sort de la fenecirctre

mouseEntered(MouseEvent) Appeleacute lorsque la souris entre dans la fenecirctre

mouseClicked(MouseEvent) Appeleacute lors drsquoun simple clic de souris

MouseMotionListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la souris lorsqursquoelle se deacuteplace

mouseDragged(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton enfonceacute

mouseMoved(MouseEvent) Appeleacute lorsque la souris est deacutepla-ceacutee bouton relacirccheacute

WindowListenerEacutecoute les eacuteveacutene-ments lieacutes agrave la fenecirctre

windowClosing(WindowEvent) Appeleacute lorsque la fenecirctre est en train de se fermer

windowClosed(WindowEvent) Appeleacute lorsque la fenecirctre est fermeacutee

windowOpened(WindowEvent) Appeleacute lors de lrsquoouverture de la fenecirc-tre

windowIconified(WindowEvent) Appeleacute lorsque la fenecirctre est mise sous forme drsquoicocircne

windowDeiconified(WindowEvent) Appeleacute lorsque lrsquoicocircne est agrandie agrave la taille de la fenecirctre

windowActived(WindowEvent) Appeleacute lorsque la fenecirctre est activeacutee et reccediloit les eacuteveacutenements du clavier

windowDeactived(WindowEvent) Appeleacute lorsque la fenecirctre est deacutesacti-veacutee et perd les eacuteveacutenements du clavier

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

271

Ainsi une action est associeacutee agrave un bouton en deacutefinissant un eacutecouteur drsquoaction qui parlrsquointermeacutediaire de la meacutethode actionPerformed reacutealise lrsquoaction souhaiteacutee

Exemple Associer un bouton agrave une actionLorsque lrsquoutilisateur clique sur les boutons Nouveau ou Quitter de lrsquoapplicationdeacuteveloppeacutee dans ce chapitre il souhaite voir se reacutealiser deux actions distinctes soitlrsquoaffichage drsquoun nouveau sapin soit la fermeture de la fenecirctre

Chaque clic de souris sur un bouton est associeacute agrave une action speacutecifique qui utilise uneacuteveacutenement de haut niveau Par conseacutequent chaque bouton doit ecirctre muni drsquoun eacutecouteurdrsquoaction Cela est reacutealiseacute dans la classe DesBoutons comme ci-dessous

import javaawtimport javaawteventpublic class DesBoutons extends Panel public DesBoutons(Dessin d) hellip Button bNouveau = new Button (Nouveau) Button bQuitter = new Button (Quitter) bNouveauaddActionListener(new GestionAction(1 d)) thisadd(bNouveau) bQuitteraddActionListener(new GestionAction(2 d)) thisadd(bQuitter)

Remarquez lrsquoinstruction drsquoimport (import javaawtevent) qui indique au compi-lateur le package ougrave sont deacutefinies les meacutethodes de gestion des eacuteveacutenements utiliseacutees dansla classe

La mise en place des eacutecouteurs drsquoactions est reacutealiseacutee gracircce agrave la meacutethode addAction-Listener()

Le constructeur GestionAction() placeacute en paramegravetre de la meacutethode addActionLis-tener() permet de preacuteciser quel comportement doit adopter lrsquoapplication en fonctiondu bouton qui eacutemet lrsquoeacuteveacutenement En effet les paramegravetres de ce constructeur transmettentagrave la fois une valeur entiegravere diffeacuterente (1 ou 2) suivant le bouton eacutemetteur (bNouveau oubQuitter) et lrsquoadresse de lrsquoobjet (d) sur lequel est dessineacute le sapin Examinons commentsont geacutereacutes ces paramegravetres dans la classe GestionAction

import javaawtimport javaawteventpublic class GestionAction implements ActionListener private int n private Dessin d

Eacutecouteur Comportement agrave programmer

ActionListenerEacutecoute les eacuteveacutenements drsquoaction

actionPerformed(ActionEvent) Appeleacute lorsqursquoune action est eacutemise

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

272

public GestionAction( int n Dessin d) thisn = n thisd = d public void actionPerformed(ActionEvent e) switch (n) case 1 dnouveau() break case 2 Systemexit(0) break

La classe GestionAction fait appel agrave plusieurs notions importantes deacuteveloppeacutees dansles sections qui suivent

Le terme implements

La classe GestionAction impleacutemente la classe ActionListener (GestionActionimplements ActionListener) elle nrsquoen heacuterite pas

En reacutealiteacute la classe ActionListener comme tous les autres listener nrsquoest pas veacuterita-blement une classe Il srsquoagit en fait drsquoune classe abstraite

Les meacutethodes deacutefinies par un listener ne peuvent pas ecirctre preacutedeacutefinies par le langageJava Une action crsquoest-agrave-dire un comportement associeacute agrave un bouton ne peut ecirctre deacutecriteque par le programmeur selon la faccedilon dont il conccediloit son application On dit alors quela classe ActionListener ainsi que tous les autres listener est une interface quideacutefinit simplement les diffeacuterents modes de comportement

Lorsqursquoune classe deacuterive drsquoune interface le terme implements doit ecirctre utiliseacute au lieu duterme extends

De plus lorsqursquoune classe impleacutemente une interface le compilateur Java exige dedeacutecrire lrsquointeacutegraliteacute des meacutethodes deacutefinies par lrsquointerface En effet dans le cas ougrave lrsquounedes meacutethodes nrsquoest pas deacutefinie le compilateur indique une erreur en preacutecisant le nom dela meacutethode manquante

Dans notre exemple lrsquointerface ActionListener ne deacutefinit qursquoune seule meacutethode(actionPerformed()) Nous nrsquoavons donc aucune difficulteacute agrave deacutecrire lrsquointeacutegraliteacute desmeacutethodes proposeacutees par cette interface

Le terme this

La classe GestionAction possegravede deux variables drsquoinstance n et d de faccedilon agrave meacutemoriserla valeur respective transmise par les boutons ainsi que lrsquoadresse de la zone graphiqueougrave le sapin est dessineacute Ces valeurs sont initialiseacutees par lrsquointermeacutediaire des paramegravetres duconstructeur GestionAction() qui sont eacutegalement nommeacutes n et d

Pour eacuteviter toute confusion entre les donneacutees de la classe et les paramegravetres du construc-teur il est neacutecessaire drsquoemployer le terme this Ce terme appliqueacute agrave n et d preacutecise aucompilateur qursquoil srsquoagit des variables de lrsquoinstance qui se construit Sans this lesmecircmes noms de variables correspondraient aux paramegravetres du constructeur

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

273

La meacutethode actionPerformed()

Une fois les donneacutees initialiseacutees la meacutethode actionPerformed() est automatiquementexeacutecuteacutee par lrsquointerpreacuteteur lorsqursquoune action est eacutemise par lrsquoun des boutons suite agrave unclic de lrsquoutilisateur Cette derniegravere reacutealise alors suivant la valeur transmise au construc-teur (1 ou 2) soit la sortie du programme soit lrsquoaffichage drsquoun nouveau sapin gracircce agrave lameacutethode nouveau() (agrave inseacuterer dans la classe Dessin) deacutecrite ci-dessous

public void nouveau() A = new Arbre(6 Colorred) repaint()

Agrave lrsquoexeacutecution de cette meacutethode lrsquoobjet A est recalculeacute agrave lrsquoaide du constructeur Arbre()Ensuite la meacutethode repaint() efface automatiquement la zone drsquoaffichage d sur laque-lle la meacutethode est appliqueacutee et appelle la meacutethode paint() deacutefinie dans la classe Dessin

La donneacutee Dessin d

Le bouton bNouveau a une incidence sur la zone de dessin puisqursquoun nouveau sapin doitecirctre afficheacute dans cette zone suite agrave un clic sur le bouton Cet effet est reacutealiseacute par le biaisde la meacutethode nouveau() appliqueacutee agrave lrsquoobjet d de type Dessin dans la meacutethodeactionPerformed() Lrsquoobjet d est deacuteclareacute comme variable drsquoinstance de la classeGestionAction Il contient lrsquoadresse de la zone drsquoaffichage creacuteeacutee dans lrsquoapplicationFenetre comme lrsquoillustre lrsquoextrait de programme suivant

public class Fenetre hellip public static void main(String [] arg) Frame F = new Frame() hellip Dessin page = new Dessin() Fadd(page Center) Fadd(new DesBoutons(page) South)

La construction de lrsquoobjet page a pour reacutesultat de stocker en meacutemoire lrsquoadresse ducomposant graphique de type Canvas Une fois cette adresse transmise au constructeurde la classe DesBoutons ce dernier peut transmettre agrave son tour lrsquoadresse de lrsquoobjet pageau constructeur de la classe GestionAction par lrsquointermeacutediaire du paramegravetre formel d detype Dessin Gracircce agrave la transmission de lrsquoadresse de la zone graphique en paramegravetre desconstructeurs les nouveaux sapins srsquoaffichent dans le composant graphique approprieacute

Exemple Fermer une fenecirctre Pour fermer une fenecirctre en cliquant directement sur lrsquoicocircne de fermeture de la fenecirctresitueacutee dans la barre de titre lrsquoeacuteveacutenement laquo clic sur le bouton de fermeture de la fenecirctre raquodoit ecirctre associeacute agrave lrsquoinstruction qui permet de stopper lrsquoexeacutecution du programmeComme le preacutecise le tableau de description des eacutecouteurs lrsquoeacuteveacutenement laquo clic sur lebouton de fermeture de la fenecirctre raquo est un eacuteveacutenement de bas niveau geacutereacute par lrsquoeacutecouteurWindowListener

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

274

En effet lorsque lrsquoutilisateur ferme la fenecirctre par lrsquointermeacutediaire de lrsquoicocircne approprieacutee cedernier eacutemet un eacuteveacutenement de fermeture de fenecirctre En recevant cet eacuteveacutenement lrsquoeacutecouteurdes eacuteveacutenements de fenecirctre (WindowListener) exeacutecute automatiquement la meacutethodewindowClosing()

Par conseacutequent le programme qui reacutealise la fermeture drsquoune fenecirctre doit effectuer lesdeux opeacuterations suivantes

bull placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre dans le composant graphique autoriseacute agraveecirctre fermeacute de la sorte

bull programmer la meacutethode windowClosing() en y inseacuterant lrsquoinstruction Systemexit(0)de faccedilon agrave sortir de lrsquoapplication

Placer un eacutecouteur drsquoeacuteveacutenement de fenecirctre

Le premier point est reacutealiseacute dans la classe Fenetre de la faccedilon suivante

import javaawtclass Fenetre public static void main(String [] arg) Frame F = new Frame() hellip FaddWindowListener(new GestionFenetre()) Fshow()

Une fois la meacutethode addWindowListener() appliqueacutee agrave la fenecirctre F cette derniegravere est agravemecircme drsquoeacutecouter les eacuteveacutenements eacutemis par ses propres composants

Programmer la meacutethode windowClosing()

Le second point est reacutesolu gracircce agrave lrsquoappel du constructeur GestionFenetre() en para-megravetre de la meacutethode addWindowListener() ce dernier deacutefinissant le comportementadopteacute en face de lrsquoeacuteveacutenement entendu Examinons plus attentivement la classeGestionFenetre

import javaawteventpublic class GestionFenetre extends WindowAdapter public void windowClosing(WindowEvent e) Systemexit(0)

Remarquez que la classe GestionFenetre heacuterite de la classe WindowAdapter au lieudrsquoimpleacutementer lrsquointerface WindowListener

Lrsquoeacutecouteur WindowListener possegravede sept comportements speacutecifiques (voir preacuteceacutedem-ment le tableau des eacuteveacutenements de bas niveau) Si nous impleacutementons directement cetteinterface comme nous lrsquoavons fait pour ActionListener nous sommes contraints par lecompilateur Java agrave deacutefinir lrsquoensemble des sept comportements

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

275

Or pour fermer la fenecirctre un seul comportement est agrave retenir celui deacutefini par lameacutethode windowClosing() En utilisant un laquo Adapter raquo plutocirct qursquoun laquo Listener raquo nousnrsquoavons plus lrsquoobligation de deacutefinir lrsquointeacutegraliteacute des sept comportements mais unique-ment la ou les meacutethodes de votre choix Pour notre exemple seule la meacutethode window-Closing() nous inteacuteresse Crsquoest pourquoi elle seule est deacutecrite dans la classe Gestion-Fenetre

Ainsi lorsque lrsquoutilisateur clique sur lrsquoicocircne de fermeture de la fenecirctre un eacuteveacutenement defermeture de fenecirctre est eacutemis Lrsquoeacuteveacutenement est capteacute et traiteacute par lrsquoeacutecouteur WindowLis-tener qui exeacutecute automatiquement la meacutethode windowClosing() Celle-ci terminelrsquoexeacutecution de lrsquoapplication gracircce agrave lrsquoinstruction Systemexit(0)

Quelques principes

Lrsquoanalyse des exemples preacuteceacutedents montre que la gestion drsquoun eacuteveacutenement quel qursquoil soitpasse par les trois eacutetapes suivantes

bull Deacuteterminer le composant qui eacutemet lrsquoeacuteveacutenement et lui associer un eacutecouteur Cette asso-ciation est reacutealiseacutee par une meacutethode ayant pour nom addxxxListener() ougrave xxx repreacute-sente le composant eacutemetteur (Window Mouse etc)

bull Creacuteer une classe gestionDelEvenement qui impleacutemente lrsquointerface xxxListener(implements) ou deacuterive de la classe xxxAdapter (extends) selon que vous souhaitieztraiter tout ou partie des meacutethodes proposeacutees par lrsquoeacutecouteur

bull Deacutevelopper les meacutethodes souhaiteacutees crsquoest-agrave-dire deacutecrire les instructions composantles meacutethodes deacutefinies par lrsquointerface utiliseacutee

Les appletsLes applications deacuteveloppeacutees dans cet ouvrage sont jusqursquoagrave preacutesent des programmesexeacutecuteacutes directement sur le systegraveme drsquoexploitation de la machine par lrsquointerpreacuteteur JavaCes applications sont appeleacutees applications autonomes

Le langage Java offre la possibiliteacute de creacuteer des applications exeacutecutables par lrsquointermeacute-diaire drsquoun navigateur Web tel que Netscape ou Internet Explorer

Ces applications appeleacutees des applets raccourci des termes application et Internetsont exeacutecutables sur le reacuteseau Internet Une applet ne peut srsquoexeacutecuter qursquoau travers drsquounnavigateur et nrsquoest donc pas une application autonome

Le support drsquoexeacutecution drsquoun navigateur Web est la page HTML (HyperText MarkupLanguage) Crsquoest pourquoi une applet doit ecirctre inseacutereacutee dans une page HTML pour ecirctre lueet exeacutecuteacutee

Une page HTML

Une page HTML est un fichier texte constitueacute de balises (mots cleacutes) indiquant au navi-gateur la faccedilon dont il doit afficher le contenu de la page (mise en page) Lrsquoexemple quisuit deacutecrit le plus petit fichier utilisable pour exeacutecuter une applet Java

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

276

Exemple Lrsquoapplet defaulthtm

ltHTMLgt ltHEADgt ltTITLEgtUn sapin de NoelltTITLEgt ltHEADgt ltBODYgt ltAPPLET CODE=Fenetre WIDTH=300 HEIGHT=300gt ltAPPLETgt ltBODYgtltHTMLgt

Une page HTML est donc un fichier deacutebutant toujours par la balise ltHTMLgt et se termi-nant par sa balise inverse ltHTMLgt Elle est constitueacutee des deux grands blocs suivants

bull Lrsquoen-tecircte composeacute des balises ltHEADgt et ltHEADgt Dans votre exemple lrsquoen-tecirctepermet drsquoaffecter un titre agrave la page entre les balises ltTITLEgt et ltTITLEgt

bull Le corps deacutefini par les balises ltBODYgt et ltBODYgt qui deacutecrit le contenu de la pageLrsquoinsertion drsquoune applet est toujours effectueacutee dans le corps de la page Il suffitdrsquoutiliser pour cela la balise ltAPLLETgt composeacutee des trois paramegravetres CODE WIDTH etHEIGHT qui indiquent au navigateur le nom du fichier de lrsquoapplet agrave exeacutecuter ainsi quesa largeur et sa hauteur

Le fichier eacutecrit est sauvegardeacute sous un nom ayant lrsquoextension htm Par deacutefaut tous lesnavigateurs lisent les pages HTML portant le nom defaulthtm Par conseacutequent sauve-gardons la page HTML deacutecrite ci-dessus dans un fichier portant ce nom

Construire une appletUne applet diffegravere drsquoune application autonome par plusieurs aspects

bull La fonction main() disparaicirct pour ecirctre remplaceacutee par la meacutethode init()

bull La classe ougrave se situe la meacutethode init() heacuterite de la classe Applet

bull Le support drsquoaffichage des composants graphiques nrsquoest plus une Frame Le naviga-teur se charge drsquoafficher tous les composants graphiques Il possegravede eacutegalement unebarre de titre des bords et des boutons Lrsquoutilisation drsquoune Frame devient donc inutile

bull Lrsquoinstruction setTitle(Un sapin de Noel) est eacutegalement inutile puisque le titre dela fenecirctre est maintenant geacutereacute par la page HTML Il srsquoaffiche dans la barre de titre dunavigateur

Exemple Un sapin de Noeumll en applet

Lrsquoapplet Fenetre srsquoeacutecrit maintenant de la faccedilon suivante

import javaawtimport javaappletpublic class Fenetre extends Applet public final static int HT = 300 public final static int LG = 300 public void init() Dessin D setSize(HT LG)

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

277

setBackground(ColordarkGray) setLayout(new BorderLayout()) add(D = new Dessin() Center) add(new DesBoutons(D) South)

Notez lrsquoinstruction drsquoimport (import javaapplet) qui indique au compilateur ougravese trouve le package deacutefinissant les applets

Lrsquoapplet est afficheacutee par le navigateur qui exeacutecute en premier lieu la meacutethode init()tout comme lrsquointerpreacuteteur Java exeacutecute la fonction main() dans le cas drsquoune applicationJava autonome

Les instructions de la fonction init()sont exeacutecuteacutees ligne agrave ligne et le reacutesultat est eacutequi-valent dans la forme agrave lrsquoapplication deacutecrite preacuteceacutedemment Remarquons cependant que

bull Les meacutethodes ne sont pas appliqueacutees agrave un objet F de type Frame mais agrave lrsquoobjet qui esten train de se construire crsquoest-agrave-dire agrave lrsquoapplet elle-mecircme

bull Un BorderLayout est ajouteacute par lrsquointermeacutediaire de la meacutethode setLayout() La miseen page (en anglais layout) correspond agrave une strateacutegie drsquoaffichage des composantsgraphiques Par exemple pour un Panel ou une Applet la strateacutegie par deacutefaut est leFlowLayout crsquoest-agrave-dire lrsquoaffichage centreacute des composants dans leur ordre drsquoarriveacutee

Pour une Frame la strateacutegie drsquoaffichage est le BorderLayout qui permet lrsquoaffichage desobjets par rapport aux bords de lrsquoobjet Ces bords sont nommeacutes East North West etSouth Lrsquoajout drsquoun composant dans un objet dont la strateacutegie drsquoaffichage est le Border-Layout est reacutealiseacute en indiquant en paramegravetre le bord dont il doit srsquoapprocher le plusCrsquoest ce que nous avons reacutealiseacute sans le savoir dans lrsquoapplication Fenetre de la sectionpreacuteceacutedente

Lrsquoapplet par deacutefaut ne travaille pas avec un BorderLayout mais avec un FlowLayoutSans modification du gestionnaire de mise en page (Layout Manager) lrsquoapplet affiche lescomposants dans leur ordre drsquoarriveacutee soit drsquoabord la fenecirctre de dessin puis la boicircte agraveboutons en superposition enfin le sapin disparaissant sous les boutons

Gracircce agrave la mise en place du BorderLayout (setLayout(new BorderLayout())) lrsquoaffi-chage est corrigeacute et tous les eacuteleacutements se trouvent agrave leur place comme illustreacute agrave laFigure 11-5

Lrsquoutilitaire AppletViewer

Lrsquoexeacutecution drsquoune applet srsquoeffectue en geacuteneacuteral en chargeant la page HTML correspon-dante dans un navigateur Lrsquoaffichage srsquoexeacutecute automatiquement

Une solution plus rapide consiste cependant agrave faire appel agrave lrsquoutilitaire AppletViewerlivreacute avec le JDK AppletViewer exeacutecute une applet sans lrsquoenvironnement du navigateurPour lrsquoutiliser il suffit drsquoeacutecrire une ligne de commande dans une fenecirctre de commandesMS-DOS (environnement Windows) ou dans une fenecirctre de script (environnementUnix)

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

278

Cette commande est la suivante

appletviewer defaulthtm

Lrsquoexeacutecution de cette commande a pour reacutesultat lrsquoaffichage de lrsquoapplet illustreacutee agrave laFigure 11-5

ReacutesumeacuteLrsquoessentiel des composants graphiques deacuteveloppeacutes par le langage Java est deacutefinidans la librairie AWT (Abstract Windowing Toolkit)

Le support principal drsquoaffichage drsquoune application graphique est la Frame Cettederniegravere est composeacutee des eacuteleacutements suivants

bull une barre de titre posseacutedant des boutons pour la fermeture lrsquoagrandissement et lamise en icocircne de la fenecirctre

bull des bords deacutelimitant la zone drsquoexeacutecution de lrsquoapplication

Pour dessiner ou afficher du texte dans une Frame il convient drsquoutiliser des objets detype Canvas ou TextArea Le contexte graphique deacutefinissant les attributs drsquoaffichagetels que la couleur le type de fonte etc est geacutereacute par la classe Graphics

Les interfaces graphiques sont construites agrave lrsquoaide des eacuteleacutements de communicationgraphique suivants

bull composants graphiques tels que boutons (Button) et menus

bull eacuteveacutenements associant par exemple un clic de souris sur un bouton agrave une action

On distingue les eacuteveacutenements de haut niveau (un clic est associeacute agrave une action) et leseacuteveacutenements de bas niveau (un clic sur un composant eacutemet un eacuteveacutenement propre agrave cecomposant)

Figure 11-5

Gracircce agrave lrsquoutilitaire AppletViewer il est possible drsquoafficher une applet en dehors de tout navigateur Web

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

279

ExercicesLrsquoobjectif de cet exercice est drsquoameacuteliorer le programme reacutealiseacute tout au long de cechapitre Lrsquointerface graphique agrave construire propose une case agrave cocher (en anglais checkbox) permettant de reacutepondre aux conditions suivantes

bull Si la case Taille fixe est cocheacutee les nouveaux sapins de taille constante sontdessineacutes avec une guirlande formeacutee de cercles de diffeacuterentes couleurs

bull Si la case nrsquoest pas cocheacutee les nouveaux sapins sont eacutegalement dessineacutes mais avecune taille variable

Pour construire cette application nous vous proposons de suivre les diffeacuterentes eacutetapesdeacutecrites ci-dessous

Comprendre les techniques drsquoaffichage graphiquePour afficher un sapin de taille diffeacuterente chaque fois que lrsquoutilisateur clique sur lebouton Nouveau

a Recherchez dans lrsquoensemble des classes de lrsquoapplication Fenetre la meacutethodeassocieacutee au clic sur le bouton Nouveau

b Modifiez cette meacutethode de faccedilon que lrsquoarbre se construise avec une taille aleacutea-toire variant entre 3 et 10 par exemple

Le langage Java propose en outre des composants graphiques speacutecifiques appeleacutesApplet (application sur Internet) deacutefinis dans le package javaapplet

Une applet nrsquoest pas exeacutecuteacutee par lrsquointerpreacuteteur Java mais par le navigateur agrave traversune page HTML (HyperText Markup Language) qui est un fichier texte constitueacute debalises (mots cleacutes) indiquant au navigateur comment il doit mettre en page les infor-mations contenues dans le fichier

Pour ecirctre exeacutecutable le programme deacutefinissant lrsquoapplet doit faire appel agrave la meacutethodeinit() en lieu et place de la fonction main()

Figure 11-6

Lrsquoapplication propose une case agrave cocher pour deacuteterminer si la taille des nouveaux sapins doit ecirctre fixe ou non

111

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

280

c Une fois ces modifications reacutealiseacutees compilez lrsquoapplication et veacuterifiez le bonfonctionnement du bouton Nouveau

Pour dessiner une guirlande de cercles de couleurs diffeacuterentes

a Avant drsquoafficher une guirlande modifiez les classes Triangle et Arbre de sorteque le sapin ne soit afficheacute qursquoagrave lrsquoaide de triangles verts Veacuterifiez lrsquoexeacutecution duprogramme

b Pour afficher une guirlande de couleur rouge creacuteez une classe Boule en vousinspirant de la classe Triangle

Notez que la meacutethode fillOval(x y l h) permet lrsquoaffichage de cerclesremplis Elle srsquoapplique agrave un objet Graphics comme la meacutethode fillPoly-gon() Les paramegravetres x et y repreacutesentent la position agrave lrsquoeacutecran du coin supeacuterieurgauche du rectangle englobant le cercle l et h repreacutesentant la largeur et lahauteur de ce mecircme rectangle

c Modifiez ensuite la meacutethode dessine() de la classe Arbre de faccedilon agrave construireet agrave afficher par-dessus le sapin des objets Boule lorsque le tableau sapin vaut 1

Compilez et exeacutecutez le programme afin de veacuterifier le bon affichage de la guir-lande

d Pour afficher une guirlande de couleurs diffeacuterentes deacutefinissez dans la classeBoule un tableau de plusieurs couleurs comme suit

Color [] couleur = Colorred Colorblue Coloryellow Colorcyan Colormagenta

Le choix de la couleur est ensuite effectueacute dans le constructeur de la classe Bouleen tirant au hasard une valeur comprise entre 0 et 5 Cette valeur est utiliseacuteecomme indice du tableau de couleurs pour initialiser la couleur drsquoaffichage(setColor()) agrave la couleur du tableau cor respondant agrave lrsquoindice tireacute au hasard

Apprendre agrave geacuterer les eacuteveacutenements

Placer une case agrave cocher dans la boicircte agrave boutons

a Sachant que la classe deacutecrivant les cases agrave cocher a pour nom Checkbox ajoutezun objet de ce type dans la boicircte agrave boutons de lrsquoapplication Fenecirctre Le texte(laquo Taille fixe raquo) suivant la case agrave cocher est placeacute en paramegravetre du construc-teur de la classe

b Lrsquoeacutecouteur drsquoeacuteveacutenement associeacute aux objets de type Checkbox srsquoappelantItemListener ajoutez cet eacutecouteur agrave la case agrave cocher

Associer lrsquoeacuteveacutenement agrave lrsquoaction Lorsque la case est cocheacutee les nouveaux sapinsafficheacutes par le bouton Nouveau sont de taille fixe Inversement lorsque la casenrsquoest pas cocheacutee les sapins sont de taille aleacuteatoire Lrsquoeacutetat de la case agrave cocher a doncune influence sur lrsquoaffichage du sapin geacutereacute par le bouton Nouveau Crsquoest pourquoiil est logique de geacuterer lrsquoeacutecouteur ItemListener dans la mecircme classe qursquoAction-Listener

112

113

114

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

281

a Sachant que lrsquointerface ItemListener ne deacutefinit qursquoun seul comportementitemStateChanged() modifiez lrsquoen-tecircte de la classe GestionAction de faccedilonqursquoelle impleacutemente les deux interfaces ActionListener et ItemListener enseacuteparant les deux termes par une virgule

b Analysez la meacutethode itemStateChanged() deacutecrite ci-dessous et deacuteterminezcomment deacuteclarer la variable OK pour qursquoelle puisse ecirctre eacutegalement visible delrsquoobjet bNouveau

public void itemStateChanged(ItemEvent e) if(egetStateChange() == ItemEventSELECTED) OK = false else OK = true

c Sachant que les sapins de taille aleacuteatoire sont afficheacutes par lrsquointermeacutediaire de lameacutethode nouveau() (classe Dessin) modifiez la meacutethode de faccedilon que la tailledu sapin soit fixe ou aleacuteatoire en fonction de la valeur de la variable OK

Le projet laquo Gestion drsquoun compte bancaire raquoLrsquoobjectif est de reacutealiser des statistiques sur les comptes bancaires enregistreacutes dans lesfichiers creacuteeacutes au chapitre preacuteceacutedent Le reacutesultat de ces statistiques est afficheacute dans unefenecirctre comme illustreacute agrave la Figure 11-7

Calcul de statistiquesLes classes ListeCompte et Compte

En reprenant la fonction pourcentage() reacutealiseacutee en exercice agrave la fin du Chapitre 5 laquo Delrsquoalgorithme parameacutetreacute agrave lrsquoeacutecriture de fonctions raquo et sachant que lrsquoobjectif est decalculer en pourcentage les deacutepenses reacutealiseacutees en fonction du motif de la deacutepense

a Deacuteterminer toutes les donneacutees deacutefinies dans les classes Compte et LigneComptableneacutecessaires aux calculs des statistiques drsquoun compte

Figure 11-7

Histogramme empileacute du compte ndeg 2552

copy copyright Eacuteditions Eyrolles

Les outils et techniques orienteacutes objetPARTIE 3

282

b Veacuterifier que ces donneacutees soient accessibles depuis lrsquoexteacuterieur de la classe Si tel nrsquoestpas le cas eacutecrire les meacutethodes drsquoaccegraves en consultation pour chacune drsquoentre elles

c Apregraves modifications compiler et exeacutecuter le programme de faccedilon agrave creacuteer un fichierde comptes (Comptedat)

La meacutethode statParMotif()

a En reprenant lrsquoalgorithme de calcul de statistiques proposeacute en exemple du Chapi-tre 1 laquo Stocker un information raquo eacutecrire la meacutethode statParMotif() qui calcule lepourcentage des deacutepenses en fonction du motif enregistreacute

b Sachant que cette meacutethode est deacutefinie agrave lrsquointeacuterieur drsquoune classe appeleacutee Stat deacuteter-miner les variables drsquoinstance de cette classe

c Avant de passer agrave lrsquoaffichage graphique eacutecrire une application qui

bull lise le fichier laquo Comptedat raquo creacuteeacute agrave lrsquoeacutetape preacuteceacutedente

bull utilise la meacutethode statParMotif() pour calculer et afficher agrave lrsquoeacutecran les statisti-ques drsquoun compte donneacute

d Veacuterifier la validiteacute des calculs reacutealiseacutes

Lrsquointerface graphiquePour calculer les statistiques drsquoun compte lrsquoutilisateur doit fournir le numeacutero du comptechoisi Apregraves lecture du fichier Comptedat et connaissant ce numeacutero lrsquoapplicationveacuterifie srsquoil existe en meacutemoire Si tel est le cas elle affiche dans une fenecirctre le reacutesultatsous forme drsquohistogrammes empileacutes Dans le cas contraire elle affiche un message indi-quant que ce compte nrsquoest pas connu et attend la saisie drsquoun nouveau numeacutero

Deux eacutetapes sont donc agrave reacutealiser la saisie drsquoun numeacutero de compte et lrsquoaffichage delrsquohistogramme

Lrsquoaffichage de lrsquohistogramme

Pour afficher lrsquohistogramme empileacute il est neacutecessaire de connaicirctre les pourcentages dedeacutepenses en fonction des motifs deacuteclareacutes Ces valeurs sont calculeacutees dans la classe Statconstruite preacuteceacutedemment

a En srsquoinspirant de la meacutethode dessine() preacutesenteacutee en exemple au cours de ce chapi-tre eacutecrire dans la classe Stat la meacutethode dessine() de faccedilon agrave afficher

bull un premier rectangle de hauteur 100 et de largeur 50 repreacutesentant lrsquouniteacute de creacutedit(100)

bull des rectangles de couleur et de hauteur diffeacuterentes suivant les pourcentages calcu-leacutes par la meacutethode statParMotif()

Noter que lrsquoaffichage drsquoun rectangle rempli srsquoeffectue par lrsquointermeacutediaire de lameacutethode fillRect(x y l h) ougrave x et y repreacutesentent la position agrave lrsquoeacutecran ducoin supeacuterieur gauche du rectangle et l et h sa largeur et sa hauteur Lrsquoaffichagedrsquoun texte est reacutealiseacute par la meacutethode drawString(texte x y) ougrave texte est unobjet de type String dans lequel sont placeacutes les caractegraveres agrave afficher x et y deacutefinis-sant la position de ce texte agrave lrsquoeacutecran

copy copyright Eacuteditions Eyrolles

Dessiner des objetsCHAPITRE 11

283

b Deacutefinir une fenecirctre composeacutee drsquoune zone de dessin et drsquoun bouton Quitter

c Lrsquoaffichage de lrsquohistogramme eacutetant reacutealiseacute dans la zone de dessin

bull Le constructeur de la fenecirctre doit prendre en paramegravetre un objet de type Stat defaccedilon agrave le transmettre au constructeur de la zone de dessin

bull La meacutethode paint() deacutefinie dans la classe repreacutesentant la zone de dessin fait appelagrave la meacutethode sdessine() ougrave s est un objet de type Stat initialiseacute dans le cons-tructeur de la zone de dessin

d Le bouton Quitter et lrsquoicocircne de fermeture situeacutee dans la barre de titre de la fenecirctreayant la mecircme fonctionnaliteacute (quitter lrsquoapplication et fermer la fenecirctre)

bull Creacuteer une classe GestionQuitter qui impleacutemente lrsquoeacutecouteur ActionListener etdeacuterive de la classe WindowAdapter

bull Deacutefinir les meacutethodes correspondant au comportement de fermeture drsquoapplication

La saisie drsquoun numeacutero de compteLa classe Saisie deacutecrite ci-dessous permet la saisie drsquoune chaicircne de caractegraveres parlrsquointermeacutediaire drsquoune fenecirctre de saisie

import javaawtimport javaawteventpublic class Saisie implements ActionListener TextField reacuteponse public Saisie () Frame F = new Frame (Saisie de valeurs) FsetSize(300 50) FsetBackground(Colorwhite) FsetLayout(new BorderLayout()) Fadd (new Label(Valeur ) West) reacuteponse = new TextField(10) Fadd(reacuteponse East) reacuteponseaddActionListener(this) Fshow() public void actionPerformed(ActionEvent evt) String numeacutero = reacuteponsegetText() Systemoutprintln(numeacutero)poundpoundpound accent poundpoundpound

Observer et analyser cette classe et transformer la meacutethode actionPerformed() defaccedilon agrave calculer puis agrave afficher lrsquohistogramme cumuleacute si le numeacutero de compte lu dans lafenecirctre de saisie correspond agrave un compte enregistreacute dans le fichier Comptedat

copy copyright Eacuteditions Eyrolles

Contenu et exploitationdu CD-Rom

Le CD-Rom fourni avec cet ouvrage est composeacute de

bull Deux fichiers au format PDF

ndash outilsPDF

ndash corrigesPDF

bull Quatre dossiers (reacutepertoires)

ndash Java2

ndash Winzip

ndash Acrobat

ndash Sources

bull Un fichier Lirejava

Le fichier outilsPDF

ATTENTION Ce fichier est agrave lire avant drsquoinstaller le JDK et de compiler votrepremier programme Java

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) deacutecrit

bull comment installer le JDK

bull comment construire son propre environnement de travail

Vous y trouverez eacutegalement des adresses Internet depuis lesquelles vous pourrez teacuteleacute-charger des environnements de deacuteveloppement pour MacOS Unix ou Windows

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageCONTENU ET EXPLOITATION DU CD

286

Le fichier corrigesPDF

Ce fichier au format PDF (agrave lire avec le logiciel Acrobat Reader) preacutesente pour chaquechapitre du livre

bull le reacutesumeacute

bull les exemples

bull le corrigeacute commenteacute et expliqueacute des exercices

bull le corrigeacute commenteacute et expliqueacute du projet

Le dossier Java2

Dans ce dossier sont placeacutes les programmes drsquoinstallation du JDK et sa documentationau format compresseacute

bull Pour installer le JDK lisez le fichier outilsPDF

bull Pour deacutecompresser la documentation utilisez lrsquoutilitaire Winzip

Le dossier Winzip

Dans ce dossier se trouve lrsquooutil drsquoinstallation de lrsquoapplication Winzip

bull Pour installer le logiciel et pour deacutecompresser la documentation Java lisez le fichieroutilsPDF

Le dossier Acrobat

Ce dossier contient lrsquooutil drsquoinstallation de lrsquoapplication Acrobat Reader Ce logicielvous permet de lire les fichiers au format PDF par exemple le fichier corrigesPDF quidonne les corrigeacutes des exercices et du projet

bull Pour installer cette application double-cliquez sur lrsquoicocircne drsquoinstallation situeacutee dans ledossier Acrobat et validez les requecirctes du programme drsquoinstallation

Le dossier Sources

Le dossier Source se compose de trois sous-reacutepertoires exemples exercices et projetCeux-ci contiennent respectivement douze sous-reacutepertoires un pour chacun des chapitres

introduction chapitre1 chapitre2 chapitre3 hellip chapitre11

Chacun de ces reacutepertoires contient les fichiers source des programmes correspondant

bull aux exemples Ainsi pour retrouver les programmes donneacutes en exemple au chapitre 1allez dans le reacutepertoire sourcesexempleschapitre1

bull aux exercices corrigeacutes Ainsi pour retrouver le programme de lrsquoexercice 2 du chapitre4 allez dans le reacutepertoire sourcesexerciceschapitre4

bull au projet Ainsi pour retrouver le corrigeacute du projet du chapitre 5 allez dans le reacuteper-toire sourcesprojetchapitre5

Le fichier Lirejava

Tregraves utiliseacute tout au long de lrsquoouvrage ce fichier est agrave copier sur votre disque dur Pourplus de preacutecision reportez-vous agrave la rubrique laquo Construire son propre environnement detravail raquo du fichier outilsPDF

copy copyright Eacuteditions Eyrolles

Index

A

Accegravesdonneacutees 165en consultation 186 213 237en modification 162 186meacutethode 165

Accesseur 186Accumulation 84 86 92 101Action 267Adresse 5 9 150 158 182Affectation 31 34 43Afficher 10Algorithme 1 4 20

parameacutetreacute 110 122Analyse descendante 2Applet 275

Layout 277AppletViewer 277Application 163

exemple 165 179 185 187multifichiers 166

Archivage 242Attribut 169

B

Binaire Voir Code Bloc 14

if-else 72 77instruction 63 81 109 129 132 144

boolean 27Bouton Voir Classe Buttonbreak 75 77

Voir switch byte 28 74 85 94

CCanvas exemple 262case Voir switch Case meacutemoire 5 9Cast 39 41 92 98 234 249

exemple 39catch 252

Voir Exception char 27 33 43class 17Classe 13

abstraite 272deacutefinir 159deacuteriveacutee 192super 192

Classe Appletexemple 276init() 277

Classe BufferedReader 243readLine() 245

Classe BufferedWriter 242close() 245newLine() 245write() 245

Classe Canvas 261exemple 266paint() 262setbackground() 262setCursor() 262setForeground() 262

Classe Checkbox 280Classe Color

brighter() 265darker() 265diffeacuterentes couleurs 280setColor() 265white 262

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

288

Classe DoubledoubleValue() 254

Classe Enumeration 239hasMoreElement 239nextElement 239

Classe Frame 261add() 264addWindowListener() 274setBackground() 261setSize() 261setTitle() 261show() 261

Classe Graphics 262drawString() 282fillOval() 280fillPolygon() 263fillrect() 282

Classe Hashtableget() 236 238keys() 239put() 236 238remove() 236 239size() 236

Classe IntegerparseInt() 94 95 211toString 98

Classe Lire 11 90b() s() i() l() 57f() d() S() c() 57

Classe Mathabs() 111ceil() 111cos() 110exemple 111exp() 111floor() 111log() 111max() 111min() 111PI 11pow() 58 111 114random() 103 111 113 223 264sin() 110sqrt() 58 78 111 113 115tan() 110

Classe ObjectInputStream 248close() 249readObject() 248

Classe ObjectOutputStream 248close() 249writeObject() 248

Classe Paneladd() 268addActionListener() 271exemple 268repaint() 273

Classe String 92 149charAt() 152 153 211 237compareTo() 154 156concat() 156 157endsWith() 152 153 154equals() 154equalsIgnoreCase() 154 156exemple 152 154 156indexOf() 152 153 154lastIndexOf() 152length() 156 157 245regionMatches() 154 156replace() 156startsWith() 152substring() 152 153toLowerCase() 156 157toUpperCase() 156 157 237valueOf() 245

Classe Systeminread() 54 90 92outprint() 10 49 50 56outprintln() 52 57 98err 50exit() 59 275

Classe TextField 283getText() 283

Classe Vectoradd() 232addElement() 232 233clear() 232elementAt() 232 234indexOf() 232 235lastIndexOf() 232remove() 232setElementAt() 232size() 232

Classe WindowAdapterwindowClosing() 274

Classpath 167Cleacute Voir Dictionnaire

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

289

Codebinaire 8 15pseudo 15 16 167 176 180source 14 102Unicode 53 97 98 99

Commandejava 16 17javac 16 17MS-DOS 17 209

Commentaires 12Compilateur 14 21Compilation multifichiers 166Comportement 161 169 183 212Comptage 84 101Concateacutenation 52 92Condition 66Constante 188Constructeur 214 217

exemple 190 191par deacutefaut 190 194surcharge 195

Conteneur Voir Classe Panel Controcircle des donneacutees

exemple 186

DDeacuteclaration

objet 163variables 9 10

default 75 77Voir switch

Dictionnaire 236Cleacute 236 241Exemple 239Exemple creacuteer un dictionnaire 237Exemple creacuteer une cleacute 237Exemple rechercher un eacuteleacutement 238Exemple supprimer un eacuteleacutement 238

dowhile 83 100 234choisir 99exemple 88syntaxe 83

Dos 17 50 53 99double 10 29 43 94 113

EEacutechanger 217

des objets 179des valeurs 34exemple 34

Encapsulation 183EntreacuteeSortie 7 49 56Erreur

Class not found 167 233else without if 70expected 121FileNotFoundException 244 250Identifier expected 122Incompatible type for = Explicit cast 39Incompatible type for method 114javalangArrayIndexOutOfBoundsException 207javalangNumberFormatException 94 95Methode not found in class 115no constructor matching 195NotSerializableException 248Undefined variable 131variable in class not accessible 195Variable is already defined 224variable is already defined in this method 118variable may not have been initialized 31Variable not accessible from class 185

Eacutetiquette 75 77 Voir switch Eacuteveacutenement 267

bas niveau 270haut niveau 270Voir Interface

EventListener 269Exception

ClassNotFoundException 249 252Exemple de capture 251IOException 243

Exempleaffectation 32calcul de statistiques 42cast 39Cercle controcircleacute 186Cercle et fonction 119Cercle objet 161 165Cercle proteacutegeacute 184Cercle simple 13Compter des cercles 176Compteur de monnaie 88Constructeur par deacutefaut 190Controcircle du rayon 189Deacuteclaration 31Deacuteclaration de tableaux 205Fonction

max() 121matheacutematique 111

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

290

Exemple (suite)Gestion dexception 251 252Heacuteritage 193La classe Arbre 264La classe Classe 213 233La classe DesBoutons 268 271La classe Dessin 262 266La classe Etudiant 212La classe Fenetre 260 267 276La classe GestionAction 271La classe GestionClasse 217 234 239 249La classe GestionFenetre 274La classe GestionFichier 245La classe String 152 154 156La classe Triangle 262 265Ligne de commande 210Lire au clavier 55Lire un entier 94Nombre de jours par mois 74Passage par valeur 139Quel code Unicode 98Reacutesultat dune fonction 140Trouver le plus grand nombre 69Un sapin en mode caractegravere 222Une page HTML 276Variable de classe 134Variable locale 132Visibiliteacute 131

extends 192 194 262 268exemple 193

FFenecirctre 260Fichier

dobjets 247exemple 245 249ouvrir 243texte 242

final 188float 29 94Flux 242

de fichier 242entrantsortant 242 243

Fonction 110appel 114corps 116deacutefinition 115en-tecircte 117

Fonction (suite)exemple 119 121 122main() 119nom 113 117paramegravetre 113 117 121 144reacutesultat 113 120 144sans paramegravetre 122sans reacutesultat 121type 118 123

Fonction main() 13 163en-tecircte 208

for 96 101 207choisir 100exemple 99imbrication 219 223syntaxe 96

Frame Exemple 260

HHashtable

Exemple 239syntaxe 236Voir Dictionnaire

Heacuteritage 192Hexadeacutecimale 29 98HTML 275

exemple 276

Ii-- 97i++ 97if-else 64 76

bloc 72choisir 76erreur 69exemple 69imbrication 70syntaxe 65

implements 272Serializable 247

import 261Increacutementation 34 86 96 101 176 178Indice Voir Tableau Initialisation 33 91Instance 164Instructions 5 6int 28 43 90

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

291

Interface 272ActionListener 271

actionPerformed() 271 272 273exemple 271

graphique 266ItemListener 280

itemStateChanged() 281MouseListener 270

mouseClicked() 270mouseEntered() 270mouseExited() 270mousePressed() 270mouseReleased() 270

MouseMotionListener 270mouseDragged() 270mouseMoved() 270

WindowListener 270 273exemple 274windowActived() 270windowClosed() 270windowClosing() 270 274windowDeactived() 270windowDeiconified() 270windowIconified() 270windowOpened() 270

Interpreacuteteur 15 21 167

Jjava 16 167

paramegravetre 209javac 166JDK 16 259JVM 15

LLayout

BorderLayout() 277FlowLayout() 277

length 221Voir Tableau

length() Voir Classe String Ligne de commande 209long 28 94

MMac OS 16 53 54 91 99 209

TeachText 246Meacutemoire centrale 5 21

Meacutethode 110 151dimpleacutementation 189invisible 189 213 216

exemple 189Lire 54

modulo 35

Nnew 163 194 204 214 219null 164 238 246

OObjet 164

deacutefinition 151Octet 27Opeacuterateur 43

ampamp || 67+ - 35logique 67 77prioriteacute 36relationnel 66 76

PPackage 233

javaapplet 277javaawt 261javaawtevent 271javaio 242javautil 233 239

Panelexemple 271Layout 277

Paramegravetre 108formel 118 139 141 179 273objet 181passage par reacutefeacuterence 178 183passage par valeur 138 140reacuteel 141effectif 118

PC 91polymorphisme 196Principe de fonctionnement

Applet 276dowhile 83fonction 113for 96Gestion dun eacuteveacutenement 275if-else 65if-else imbriqueacutes 70

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

292

Principe de fonctionnement (suite)ouvrir un fichier

en eacutecriture 244en lecture 244

page HTML 276switch 73tableau 205trycatch 251variable de classe 138while 90

Principe de notationobjet 159

Prioriteacute 44Programmation dynamique 231Proprieacuteteacute 169protected 195Protection des donneacutees

exemple 184private 184 189protected 184public 184

Pseudo-code Voir Code public 208

RReacutefeacuterence 151 158Relation est un 192 193Reacuteservation dun espace meacutemoire Voir new return 118 120 121 123 140 143

SSDK Voir JDKSeacuterialisation

Voir Fichier dobjets short 28 74static 135 162 176 208 247stream Voir Flux String 209Structure dun programme 13 129super 195 197 200Surcharge 191

de constructeur 195de meacutethodes 189 237

switch 72 74 77 87choisir 75exemple 74syntaxe 72

Syntaxe deacutefinition 8

TTableau 204

2 dimensions 218dobjets 214 225deacuteclaration 204 218 225exemple 207indice 207 219 221initialisation 207length 205 207 219taille 205 211

Tableau dobjetsexemple 213

Taille tableau 205this 192 268 272throws 250 251

Voir Exception Tri par extraction 215try Voir Exception Type 158

choisir 30conversion 38deacutefinition 26Integer 234objet 151 163simple 151structureacute 27 160 162

Type de donneacutees 7

UUnicode Voir Code Uniteacute centrale 5 21Unix 15 16 17 50 53 91 99 209 277

vi 246

VVariable

dinstance 164 177de classe 134 136 137 143 177deacuteclaration 30 32 130 203deacutefinition 25 43invisible 131locale 132 133 135 143static 135 176tableau deacutevolution 93 132 135 183 221veacuteritable nom 137

copy copyright Eacuteditions Eyrolles

Le livre de Java premier langageINDEX

293

Vecteur Exemple 233 234Vector

syntaxe 232Voir Vecteur

Visibiliteacute 143void 121 123 208

Wwhile 89 91 101

choisir 99exemple 94syntaxe 89

Windows 16 17 53 99 209 277WordPad 246

copy copyright Eacuteditions Eyrolles

  • LE LIVRE DE JAVA PREMIER LANGAGE
  • AVANT-PROPOS ORGANISATION DE LOUVRAGE
  • TABLE DES MATIERES
  • INTRODUCTION NAISSANCE DUN PROGRAMME
  • PARTIE 1 LES OUTILS ET TECHNIQUES DE BASE
  • CHAPITRE 1 STOCKER UNE INFORMATION
  • CHAPITRE 2 COMMUNIQUER UNE INFORMATION
  • CHAPITRE 3 FAIRE DES CHOIX
  • CHAPITRE 4 FAIRE DES REPETITIONS
  • PARTIE 2 INITIATION A LA PROGRAMMATION ORIENTEE OBJET
  • CHAPITRE 5 DE LALGORITHME PARAMETRE A LECRITURE DE FONCTIONS
  • CHAPITRE 6 FONCTIONS NOTIONS AVANCEES
  • CHAPITRE 7 LES CLASSES ET LES OBJETS
  • CHAPITRE 8 LES PRINCIPES DU CONCEPT DOBJET
  • PARTIE 3 LES OUTILS ET TECHNIQUES ORIENTES OBJET
  • CHAPITRE 9 COLLECTIONNER UN NOMBRE FIXE DOBJETS
  • CHAPITRE 10 COLLECTIONNER UN NOMBRE INDETERMINE DOBJETS
  • CHAPITRE 11 DESSINER DES OBJETS
  • CONTENU ET EXPLOITATION DU CD-ROM
  • INDEX
Page 4: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 5: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 6: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 7: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 8: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 9: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 10: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 11: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 12: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 13: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 14: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 15: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 16: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 17: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 18: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 19: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 20: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 21: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 22: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 23: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 24: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 25: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 26: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 27: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 28: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 29: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 30: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 31: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 32: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 33: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 34: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 35: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 36: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 37: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 38: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 39: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 40: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 41: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 42: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 43: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 44: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 45: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 46: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 47: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 48: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 49: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 50: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 51: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 52: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 53: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 54: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 55: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 56: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 57: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 58: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 59: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 60: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 61: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 62: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 63: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 64: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 65: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 66: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 67: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 68: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 69: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 70: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 71: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 72: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 73: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 74: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 75: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 76: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 77: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 78: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 79: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 80: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 81: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 82: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 83: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 84: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 85: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 86: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 87: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 88: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 89: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 90: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 91: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 92: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 93: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 94: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 95: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 96: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 97: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 98: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 99: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 100: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 101: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 102: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 103: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 104: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 105: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 106: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 107: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 108: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 109: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 110: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 111: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 112: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 113: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 114: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 115: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 116: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 117: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 118: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 119: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 120: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 121: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 122: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 123: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 124: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 125: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 126: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 127: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 128: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 129: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 130: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 131: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 132: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 133: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 134: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 135: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 136: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 137: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 138: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 139: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 140: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 141: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 142: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 143: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 144: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 145: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 146: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 147: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 148: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 149: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 150: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 151: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 152: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 153: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 154: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 155: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 156: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 157: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 158: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 159: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 160: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 161: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 162: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 163: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 164: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 165: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 166: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 167: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 168: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 169: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 170: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 171: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 172: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 173: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 174: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 175: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 176: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 177: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 178: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 179: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 180: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 181: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 182: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 183: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 184: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 185: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 186: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 187: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 188: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 189: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 190: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 191: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 192: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 193: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 194: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 195: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 196: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 197: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 198: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 199: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 200: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 201: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 202: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 203: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 204: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 205: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 206: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 207: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 208: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 209: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 210: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 211: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 212: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 213: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 214: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 215: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 216: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 217: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 218: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 219: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 220: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 221: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 222: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 223: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 224: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 225: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 226: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 227: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 228: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 229: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 230: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 231: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 232: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 233: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 234: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 235: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 236: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 237: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 238: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 239: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 240: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 241: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 242: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 243: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 244: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 245: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 246: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 247: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 248: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 249: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 250: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 251: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 252: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 253: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 254: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 255: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 256: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 257: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 258: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 259: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 260: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 261: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 262: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 263: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 264: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 265: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 266: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 267: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 268: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 269: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 270: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 271: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 272: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 273: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 274: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 275: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 276: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 277: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 278: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 279: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 280: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 281: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 282: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 283: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 284: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 285: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 286: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 287: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 288: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 289: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 290: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 291: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 292: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 293: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 294: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 295: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 296: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 297: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 298: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen
Page 299: archive.org...ÉDITIONS EYROLLES 61, Bld Saint-Germain 75240 Paris Cedex 05  Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressémen