Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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