programmer en java oc informatique 14 – 15salvadore/2m/oc_info/java.pdf · exercice1.3 r´ediger...

73
Programmer en Java OC Informatique 14 – 15 GYMNASE DE BURIER

Upload: hoanglien

Post on 12-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Programmer en Java

OC Informatique 14 – 15

GYMNASE DE BURIER

Table des matieres

1 Greenfoot 3

1.1 Concepts de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Gros chat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Le monde du crabe 8

3 De l’environnement integre a la ligne de commande 11

3.1 La structure de base d’un premier programme Java . . . . . . . . . . . . . . . . 11

3.2 La ligne de commande du Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.3 Compilation bidon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Structure d’un programme Java autonome 16

4.1 La methode main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4.2 Un tout petit premier programme . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.3 Un exemple un peu plus complexe . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4.4 Pour passer des parametres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5 Generalites sur Java 21

6 Quelques exercices d’entraınement 25

6.1 Faire calculer la machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6.2 Instructions repetitives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6.3 Donnees numeriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

6.4 Donnees alphanumeriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

6.5 Pour commencer avec les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . 28

7 La programmation objet en Java 29

7.1 Classes et Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

7.2 Une classe et ses methodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

7.3 La notion de constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

7.4 L’accessibilite aux attributs d’une classe . . . . . . . . . . . . . . . . . . . . . . 35

7.4.1 La notion d’accesseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

7.4.2 La notion de mutateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

7.4.3 Les attributs statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

1

7.5 L’heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

7.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

7.5.2 Un exemple complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

8 Exercices sur les objets en java 43

8.1 Figures geometriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

8.2 La citerne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

8.3 Thermometre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

8.4 Devinez un nombre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

8.5 Ville et Capitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

8.6 Jouer avec des des . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

8.7 Les Schtroumpfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

8.8 Le Village Schtroumpf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

8.9 Exercices sur les tableaux et les boucles . . . . . . . . . . . . . . . . . . . . . . . 53

8.10 Listes dynamiques en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

8.11 La classe Personne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

8.12 Exercices divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

8.13 Les piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

9 Le point de depart : JFrame 64

10 Deux niveaux d’interface 65

10.1 Composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

10.2 Contenants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

10.3 Description de la JFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

11 Les gestionnaires de mise en forme 67

12 Les evenements 69

v. 2.0 – Aout 2014

1 Greenfoot

1.1 Concepts de base

Exercice 1.1

On voit ci-dessous le menu contextuel associe a un wombat du scenario leaves-and-wombats.

a) Etablir une liste de toutes les methodes du Wombat.

b) Dans la liste de la question a), chercher toutes les methodes sans valeur de retour.

c) Dans la liste de la question a), chercher toutes les methodes qui renvoient une valeur. Donneregalement le type de la valeur de retour.

d) Decrire precisement chaque mot figurant dans l’en-tete de la methode setDirection.

e) Donner la liste de toutes les valeurs que peut renvoyer la methode canMove.

f) Donner quelques exemples de valeurs que peut renvoyer la methode getLeavesEaten.

g) Quelle est la methode de la classe Wombat qui demande un parametre ? Quel est le type de ceparametre ?

h) Que signifie le mot-clef void ?

Exercice 1.2

On donne le scenario cars, dans lequel on trouve la classe Car. Ouvrir ce scenario.

a) Est-ce qu’un objet de type Car existe a l’ouverture du scenario ?

b) Est-ce que la classe Car existe a l’ouverture du scenario ?

c) Combien d’objets de type Car peut-on creer dans ce scenario ?

d) Creer quelques voitures. Ces voitures sont-elles differentes ?

e) Cliquer le bouton Act. Comment interpreter le resultat qui s’affiche a la console ?

f) Remettre le scenario a zero en cliquant le bouton Reset. Creer une voiture dans la premierecolonne. A l’aide d’un appel a la bonne methode, faire se deplacer la voiture de deux casesvers la droite.

3

Exercice 1.3

Rediger l’en-tete d’une methode publique nommee send, disposant d’un parametre de type String,et qui ne renvoie pas de valeur.

Exercice 1.4

Rediger l’en-tete d’une methode publique nommee moyenne, disposant de deux parametres, tousdeux de type int, et qui renvoie une valeur int.

Exercice 1.5

Voici le diagramme de classe des acteurs du scenario leaves-and-wombats

On donne egalement les en-tetes des classes figurant dans ce diagramme a l’exception de la classeActor.

public class Wombat extends Actor

public class Leaf extends Actor

Dessiner le diagramme de classe des acteurs du scenario asteroids a partir des en-tetes de classesdonnes ci-dessous :

public class Explosion extends Actor

public class Mover extends Actor

public class Bullet extends Mover

public class Rocket extends Mover

public class Asteroid extends Mover

1.2 Gros chat

Exercice 1.6

Observez les en-tetes de methodes ci-dessous :

public void play()

public void addAmount(int amount)

public boolean hasWings()

public void compare(int x, int y, int z)

public boolean isGreater (int number)

4

Pour chaque en-tete, repondez aux questions suivantes :

a) Quel est le nom de la methode ?

b) La methode retourne-t-elle une valeur ?Si c’est le cas, quelle est le type de la valeur de retour ?

c) Combien de parametres a la methode ?

Exercice 1.7

Ecrivez l’en-tete d’une methode dont le nom est “go”. La methode n’a pas de parametre et neretourne aucune valeur.

Exercice 1.8

Ecrivez l’en-tete d’une methode dont le nom est process. La methode a un parametre de type intintitule “number” et elle retourne une valeur de type int.

Exercice 1.9

Sur papier, ecrivez un appel de methode pour la methode play de l’exercice 1. Donnez un autreappel de methode pour la methode addAmount de l’exercice 1.

5

Exercice 1.10

On donne ci-dessous les methodes de la classe Cat du scenario fatcat.

Ecrire la methode act de votre chat en respectant les deux points suivants simultanement :

a) si le chat s’ennuie, il danse et crie “Hooray” ;

b) s’il ne s’ennuie pas, il se deplace a gauche de cinq unites et, dans ce cas seulement, s’il estfatigue, il dort durant trois unites de temps.

Tous les exercices qui suivent sont destines a etre faits dans le scenario Greenfoot: fatcat.Ouvrez le scenario dans Greenfoot avant de poursuivre.

Pour telecharger ce nouveau scenario :

http://www.greenfoot.org/book/etudes/code/fatcat.zip

Exercice 1.11

Ouvrez le code la classe Cat dans l’editeur. Assurez-vous que l’editeur est en mode de documentation.De combien de methodes dispose la classe Cat ?

Exercice 1.12

Combien de methodes de la classe Cat retournent une valeur ?

Exercice 1.13

Combien de parametres contient la methode sleep ?

6

Exercice 1.14

Essayez d’appeler certaines methodes de votre chat de facon interactive, en utilisant le menu contex-tuel du chat. Les methodes interessantes proviennent toutes de Inherited from Cat.

Exercice 1.15

Est-ce que le chat s’ennuie ? Comment pouvez-vous faire pour qu’il ne s’ennuie pas ?

Exercice 1.16

Ouvrez l’editeur pour la classe MyCat. (C’est la que vous allez ecrire le code pour tous les exercicessuivants.)

Faites manger le chat quand il agit. (C’est a dire : Dans la methode act, ecrire un appel a la methodeeat.) Compiler. Testez en appuyant sur le bouton Act dans le panneau de controle de l’execution.

Exercice 1.17

Faites danser le chat. (Ne pas le faire de facon interactive - ecrivez du code dans la methode act

pour ce faire. Lorsque vous avez termine, cliquez sur le bouton Act dans le panneau de controle del’execution.)

Exercice 1.18

Faites dormir le chat.

Exercice 1.19

Faites executer a votre chat une sequence d’actions de votre choix, choisies parmi celles qui sontdisponibles.

Exercice 1.20

Changer la methode act de votre chat afin que, lorsque vous cliquez Act, si le chat est fatigue, ildort un peu. Si il n’est pas fatigue, il ne fait rien.

Exercice 1.21

Changer la methode act de votre chat pour qu’il danse s’il s’ennuie. (Mais seulement s’il s’ennuie.)

Exercice 1.22

Changer la methode act de votre chat pour qu’il mange s’il a faim.

Exercice 1.23

Modifier la methode act de votre chat de la facon suivante : Si le chat est fatigue, il dort un peu,et puis il crie hooray. S’il n’est pas fatigue, il crie seulement hooray. (Pour les essais, faire en sorteque le chat soit fatigue en appelant des methodes de maniere interactive. Comment pouvez-vousfaire pour que le chat soit fatigue ?)

Exercice 1.24

Modifier le code de la methode act de facon a obtenir le comportement suivant : Si votre chat estseul, faites-le dormir. S’il n’est pas seul, faites le crier : hooray.Testez en placant un deuxieme chat dans le monde avant de lancer Act.

7

2 Le monde du crabe

Exercice 2.1

Voici le code source de la classe CrabWorld du scenario little-crab-5

import greenfoot.*; // imports Actor, World, Greenfoot, GreenfootImage

import java.util.Random;

import java.awt.Color;

public class CrabWorld extends World

{

/**

* Create the crab world (the beach). Our world has a size

* of 560x560 cells, where every cell is just 1 pixel.

*/

public CrabWorld()

{

super(560, 560, 1);

populateWorld();

}

/**

* Create the objects for the start of the game.

*/

public void populateWorld()

{

addObject(new Crab(), 300, 300);

addObject(new Lobster(), 90, 70);

addObject(new Lobster(), 390, 200);

addObject(new Lobster(), 360, 500);

addObject(new Worm(), 20, 500);

addObject(new Worm(), 30, 200);

addObject(new Worm(), 60, 90);

addObject(new Worm(), 80, 310);

addObject(new Worm(), 150, 50);

addObject(new Worm(), 210, 410);

addObject(new Worm(), 220, 520);

addObject(new Worm(), 380, 330);

addObject(new Worm(), 410, 270);

addObject(new Worm(), 530, 30);

}

}

On constate que les objets sont places “a la main” les uns a la suite des autres. A l’aide de l’instructionwhile, modifier le code ci-dessus pour placer automatiquement un crabe, trois homards et dix versaleatoirement sur l’ecran a l’ouverture du scenario.

8

On utilisera la methode Greenfoot.getRandomNumber(int limit). Ecrire le code source de lanouvelle methode populateWorld.

Exercice 2.2

On a ajoute au scenario little-crab-5 une sous-classe FatWorm de la classe Worm.

On donne ci-dessous le code source de la methode lookForWorm de la classe Crab :

/**

* Check whether we have stumbled upon a worm.

* If we have, eat it. If not, do nothing. If we have

* eaten eight worms, we win.

*/

public void lookForWorm()

{

if ( canSee(Worm.class) )

{

eat(Worm.class);

Greenfoot.playSound(“slurp.wav”);wormsEaten = wormsEaten + 1;

if (wormsEaten == 8)

{

Greenfoot.playSound(“fanfare.wav”);Greenfoot.stop();

}

}

}

L’appel de methode canSee(Worm.class) retourne true si le crabe voit un objet de la classe Wormou de sa sous-classe FatWorm.

9

Modifier la methode lookForWorm de facon a ce que l’attribut wormsEaten soit augmente de 2lorsque le crabe mange un objet de la classe FatWorm, toutes choses restant egales par ailleurs.

Reecrire completement la methode lookForWorm ci-dessous, apres lui avoir fait les modificationsnecessaires. On veillera a changer le commentaire...

10

3 De l’environnement integre a la ligne de commande

Le fascicule “Introduction a la programmation orientee objet avec Greenfoot”, tire du livre “In-troduction to programming with Greenfoot” de Michael Kolling donne un cours d’introductiona la programmation dans le cadre d’un environnement de programmation integre. L’environ-nement integre Greenfoot fournit une fenetre graphique, un diagramme de classes, un tableaucommande du scenario (avec des boutons Run, Act, etc.) et un editeur de texte pour afficher etmodifier le code source d’une classe.

Nous supposons ici que l’environnement Greenfoot vous est familier et que vous avez comprisles bases de la programmation en Java qui sont exposees dans le fascicule “Introduction a laprogrammation orientee objet avec Greenfoot”. Nous allons maintenant nous interesser a unenvironnement beaucoup plus basique.

Il est tout a fait possible de compiler un programme Java avec des outils plus simples, enparticulier si l’on se contente d’une interface utilisateur tres limitee. Nous presentons ci-dessousce qu’il faut savoir au minimum pour pouvoir executer de petits programmes ecrits en Java surune machine recente.

En bref, il faut un editeur de texte (Smultron pour Mac, ou Notepad++ pour Windows, parexemple) et un compilateur. Tant sous Windows que sous OS X, un compilateur est d’accesfacile via une fenetre de terminal. Une fois ces deux outils reunis, on peut compiler et executerde petits programmes Java.

3.1 La structure de base d’un premier programme Java

Un programme Java comporte au moins un fichier qui doit contenir au minimum une classeJava. La fenetre ci-dessous, copie d’ecran d’une fenetre TextMate montre le programme necomportant que la classe Bidon, sans aucune instruction a l’interieur du bloc forme des accoladesqui suivent.

Notons le commentaire, ignore par le compilateur, mais essentiel pour le programmeur !

11

Nous pouvons compiler sans erreur un fichier de ce genre, pour peu qu’il ait ete enregistre sousle nom de Bidon.java. Le nom de la classe commence conventionnellement par une majuscule.Le nom du fichier doit etre identique au nom de la classe. Le code source correspondant est lesuivant :

/**

* Bidon.java - une classe vide dans un fichier texte.

* On ne peut pas faire plus simple!

*

* @version 1.0 10 juin 2010

* @author Thivent Besson

*/

public class Bidon

{

}

Supposons maintenant que, tout comme le suggere la copie d’ecran plus haut, le code sourceci-dessus a ete enregistre sur le disque dur de notre ordinateur. On pourra alors, a l’aide d’uncompilateur, creer un fichier Bidon.class, contenant du bytecode Java que la machine virtuelleJava peut executer. Pour cela, il faut acceder au compilateur. Le paragraphe suivant presenteune introduction minimale a la ligne de commande du Mac, qui expose comment compiler unfichier Java.

Exercice 3.1

Dans votre editeur de texte, saisir le code source de la classe Bidon.java. Sauvegarder ce fichier textedans un dossier exercice 1 1, qui devra etre place dans le repertoire contenant tous vos exercices.

3.2 La ligne de commande du Mac

Sous OS X, le compilateur est installe par defaut et on y accede au moyen de la ligne de

commande du terminal Unix. Il suffit, pour acceder au compilateur, d’ouvrir une fenetre terminala l’aide de l’application portant le meme nom. On obtient une fenetre qui ressemble a celle-ci :

La ligne de commande est un outil de gestion extremement puissant. Nous nous bornerons autiliser ici le compilateur Java. Pour pouvoir l’employer, il faut tout d’abord etre en mesured’acceder au fichier contenant le code source Java. Le fichier est enregistre dans un dossier quenous avons choisi : ici, le dossier Documents de notre session, qui contient lui-meme un dossier

12

exercicesJava ; dans ce dernier, nous trouvons un dossier exercice 1 1, dans lequel finalement setrouve notre fichier Bidon.java.

Il nous faut maintenant trouver le moyen d’acceder a ce fichier depuis la ligne de commande.

Il faut savoir ici que lors de l’ouverture d’une fenetre terminal, le repertoire courant peut etredonne par la commande pwd, autrement dit : present working directory ; les commandes de laligne de terminal seront tres souvent de tels sigles. Voyons l’effet de la commande pwd :

Le repertoire courant est thiventbesson, sous-repertoire de Users, qui est le dossier contenant lesfichiers personnels de la session courante.

Exercice 3.2

Ouvrir une fenetre de l’application Terminal sur votre session. Determiner le repertoire courant etl’ouvrir dans l’interface graphique du systeme d’exploitation de votre machine.

13

Pour obtenir la liste des fichiers contenus dans le repertoire courant, on utilise la commande lset on obtient :

On voit maintenant le dossier Documents dans la liste des sous-repertoires du repertoire courant.Il faut trouver moyen de changer de repertoire pour se trouver a l’interieur du dossier Documents.Pour ce faire, on utilisera la commande cd, change directory. La commande

cd Documents

aura l’effet suivant :

En utilisant a bon escient la commande cd encore deux fois, on peut se placer dans le dossier danslequel se trouve notre programme Bidon.java. Une verification au moyen de la commande ls

confirme que nous nous trouvons au bon endroit.

Exercice 3.3

Ouvrir une fenetre de l’application Terminal sur votre session. Faire en sorte que le repertoire courantsoit celui dans lequel se trouve votre fichier Bidon.java.

14

3.3 Compilation bidon

La compilation du fichier Bidon.java est maintenant un jeu d’enfant. Il suffit en effet d’ecrirela commande suivante :

javac Bidon.java

L’effet en est le suivant :

Apparemment, il ne s’est rien passe. La commande ls nous montre le contraire. En effet, lecompilateur a produit un fichier Bidon.class qui se trouve dans le repertoire courant.

Pour executer un fichier apres compilation, on utilise simplement la commande java suivi dunom du fichier sans l’extension .class. Essayons d’executer notre “programme” Bidon, aumoyen de la commande java Bidon.

Exercice 3.4

Compiler le fichier Bidon.java et tenter d’executer le fichier resultat Bidon.class avec la machinevirtuelle Java.

Nous aurions pu nous attendre a ce que l’execution se borne a ne rien faire. Mais nous obtenonsle message d’erreur suivant :

Exception in thread "main" java.lang.NoSuchMethodError: main

Il nous faut maintenant eliminer la cause de cette erreur. C’est le sujet du paragraphe suivant.

15

4 Structure d’un programme Java autonome

4.1 La methode main

Force nous est de constater que la compilation d’une classe vide ne provoque pas d’erreur,mais que la machine virtuelle chargee de l’execution ne trouve pas la methode main de notreprogramme. Tout programme java doit en effet comporter une methode main chargee du fild’execution principal. La syntaxe de cette methode est la suivante :

public static void main (String[] args)

{

// Code executable a cet endroit

}

Exercice 4.1

Editer le fichier Bidon.java et ajouter la methode main au bloc vide suivant la declaration de laclasse Bidon. Compiler ce nouveau fichier et verifier qu’il est execute sans erreur par la machinevirtuelle Java meme s’il ne se passe rien a l’execution.

En resume, un programme Java minimal est forme d’une classe contenant une methode main

comme ci-dessous.

/**

* Bidon.java - une classe contenant une methode main vide

* le plus simple que l’on puisse faire sans erreur a l’execution!

*

* @version 1.0 10 juin 2010

* @author Thivent Besson

*/

public class Bidon

{

public static void main (String[] args)

{

}

}

La methode main est une methode statique qui n’est liee a aucune instance particuliere de laclasse dans laquelle elle se trouve.

Le parametre String[] args de la methode main permet de recuperer des arguments transmisau programme au moment de son lancement.

Pour que le programme Bidon.java fasse vraiment quelque chose, nous allons mettre du codesource dans la methode main.

16

4.2 Un tout petit premier programme

On veut ecrire ici un programme qui affiche les nombres de 1 a 10, directement dans la fenetrede terminal.

Il suffit d’utiliser une boucle for et d’appeler la methode println() de l’objet System.out quiest ici la fenetre de terminal dans laquelle nous travaillons depuis le debut. Pour que la methodeprintln() affiche le nombre voulu, on lui passe en parametre le compteur i de la boucle for.

Exercice 4.2

Dans un dossier exercice 2 2, creer un fichier CompteJusquaDix.java dans lequel ecrire le pro-gramme decrit ci-dessus. Compiler et lancer le resultat dans une fenetre terminal.

On donne ci-dessous la solution de l’exercice 2.2 :

/**

* CompteJusquaDix.java - une classe pour afficher

* les dix premiers nombres entiers

*

* @version 1.0 10 juin 2010

* @author Thivent Besson

*/

public class CompteJusquaDix

{

public static void main (String[] args)

{

for (int i = 1; i <= 10; i += 1)

{

System.out.println(i)

}

}

}

Exercice 4.3

Ecrire un programme qui affiche les 20 premiers multiples de 7. Compiler et lancer le resultat dansune fenetre terminal.

17

4.3 Un exemple un peu plus complexe

On donne maintenant un exemple de code un peu plus elabore, utilisant des variables declareesdans la fonction main.

/**

* AfficheLogarithmes.java - une classe permettant d’afficher les

* logarithmes des puissances successives d’un nombre et de constater

* que ce sont des multiples du logarithme du nombre de depart.

*

* @version 1.0 10 juin 2010

* @author Thivent Besson

*/

public class AfficheLogarithmes

{

public static void main (String[] args)

{

int n;

double base;

double nombre;

double resultat;

n = 5;

base = 2.0;

nombre = 2.4;

System.out.println();

for (int i = 1; i <= n; i += 1)

{

resultat = Math.log(Math.pow(nombre, i))/Math.log(base);

System.out.println("Le log en base "

+ base + " de " + nombre

+ " eleve a la puissance " + i

+ " vaut " + resultat);

}

resultat = Math.log(nombre)/Math.log(base);

System.out.println();

System.out.println("Ce sont les multiples de " + resultat);

System.out.println();

}

}

Exercice 4.4

Expliquer ce que fait le code ci-dessus.

18

Exercice 4.5

En vous inspirant de l’exemple ci-dessus, par exemple, inventer un petit programme qui utilise desvariables declarees dans la fonction main. Tester le programme en question.

4.4 Pour passer des parametres

On aimerait bien, a ce stade, pouvoir passer en parametre des nombres ou des chaınes decaracteres a notre programme. Il suffit, pour ce faire, d’utiliser le tableau args defini dans l’entete de notre methode main. Comme indique dans la liste des parametres de cette methode,le tableau args est un tableau de chaınes de caractere. Aucun probleme donc pour passerdes chaınes de caracteres a notre programme. Mais nous aimerions recuperer des argumentsnumeriques. Pour ce faire, Java nous a prevu les methodes de classe Integer.parseInt() etDouble.parseDouble(). Voici notre programme modifie :

/**

* AfficheLogAvecParam.java - une classe permettant d’afficher les

* logarithmes des puissances successives d’un nombre et de constater

* que ce sont des multiples du logarithme du nombre de depart.

*

* On doit passer trois parametres a la methode main

* depuis la ligne de commande: le nombre d’etapes,

* la base du log et le nombre.

*

* @version 1.0 10 juin 2010

* @author Thivent Besson

*/

public class AfficheLogAvecParam

{

public static void main (String[] args)

{

int n;

double base;

double nombre;

double resultat;

n = Integer.parseInt(args[0]);

base = Double.parseDouble(args[1]);

nombre = Double.parseDouble(args[2]);

System.out.println();

System.out.println("Les logarithmes de " + args[3]);

System.out.println();

for (int i = 1; i <= n; i += 1)

{

19

resultat = Math.log(Math.pow(nombre, i))/Math.log(base);

System.out.println("Le log en base "

+ base + " de " + nombre

+ " eleve a la puissance " + i

+ " vaut " + resultat);

}

resultat = Math.log(nombre)/Math.log(base);

System.out.println();

System.out.println("Ce sont les multiples de " + resultat);

System.out.println();

}

}

Pour passer les parametres au programme on compile comme d’habitude et on appelle le pro-gramme depuis la ligne de commande avec l’instruction suivante :

java AfficheLogAvecParam 5 2.0 3.5 "Thivent Besson"

Les parametres sont separes par un espace. Le premier parametre est un entier, les deux suivantssont des codes a virgules et le dernier est une chaıne de caractere. On peut voir l’effet de cettecommande dans une fenetre terminal :

Exercice 4.6

Modifier votre programme invente a l’exercice precedent de sorte a ce que l’appel de la ligne decommande puisse lui passer des valeurs en parametre. Compiler et faire executer le resultat par lamachine virtuelle java, en ligne de commande, bien entendu.

On peut remarquer que notre programme ne fait quasiment pas usage du fait que Java estun langage oriente objet. Nous nous sommes bornes a utiliser quelques methodes de classespredefinies dans Java, mais nous n’avons instancie aucun objet dont nous aurions cree la classenous-memes.

C’est normal, car l’un des buts de ce paragraphe du cours est de faire un peu de programmationprocedurale en Java, c’est a dire de la programmation qui n’utilise pas le concept d’objet et quiproduit des suites d’instructions devant etre traitees sequentiellement.

Nous esperons par ce biais vous permettre d’entraıner les instructions de base du langage Java.

20

5 Generalites sur Java

Exercice 5.1

Faire tourner un programme contenant l’instruction suivante :

System.out.println(i++);

Quel sera le nombre affiche a la console ?

Exercice 5.2

Comment peut-on connaıtre les parametres a fournir pour creer un nouvel objet ? En consultant ...

a) les constructeurs

b) les methodes

c) les packages

d) les librairies

Exercice 5.3

La methode dont la signature est donnee ci-dessous se trouve dans la classe Math, comment fairepour calculer le sinus de 1 radian ?

public static double sin (double angle);

a) Math m = new Math(); m.sin(1);

b) new Math().sin(1);

c) Math.sin(1);

d) Math.static.sin(1);

Exercice 5.4

Que va afficher cette instruction a la console ?

System.out.println (4 + 5 + " enfants");

a) 45 enfants

b) 9 enfants

c) 0

d) 0 enfants

Exercice 5.5

Que vaut c apres l’execution du code suivant :

int a = 41, b = 10, c;

c = a / b;

a) 4.1

b) 4

c) 0

d) 1

21

Exercice 5.6

Cette declaration private int age; est faite dans une classe Person.

Ou cette variable ne sera-t-elle pas visible ?

a) Dans les methodes de la classe Person

b) Dans le corps de la classe Person

c) Dans le code qui utilise un objet de la classe Person

d) Nulle part, elle sera visible partout

Exercice 5.7

Le code ci-dessous est-il correct ?

int [] tab; //tableau d’entiers

for(int i=0 ; i<10 ; i++)

{

tab[i]=0;

}

Exercice 5.8

Quelle instruction faut-il utiliser pour creer un nouveau tableau d’entiers de type int de 5 cases ?

a) Array t = new Array ("int", 5);

b) int t = new int[5];

c) int[] t = new int[5];

d) int[] t = new int[4];

e) Array t = new int[5];

Exercice 5.9

Que se produit-il si on compile et execute le programme suivant :

public class Test

{

public static void main(String []args)

{

int []t;

t = new int[4];

for(int i = 0; i<= 4; i++)

System.out.print(t[i]);

}

}

a) 00000

b) 01234

c) il ne se compile pas

d) une erreur d’execution se produit

22

Exercice 5.10

Que manque-t’il pour que cette declaration de methode compile ?

public somme (int a, int b)

{

return a + b;

}

a) Rien du tout, c’est correct

b) Il manque le type de retour

c) On ne peut pas renvoyer directement a+b, il faut creer une variable locale, y placer le resultatde a+b puis la renvoyer

d) Il manque le modificateur private

Exercice 5.11

Etant donne la definition suivante de la classe Test, quelles methodes donnees plus bas pourraientetre placees apres le commentaire ?

public class Test

{

public void maMethode(int i, String s){}

//ici

}

a) public void maMethode(String s, int i)

b) public int maMethode(int i, String s)

c) public void maMethode(int i, String texte)

d) public void maDeuxiemeMethode(int i, String s)

Exercice 5.12

Pour la classe Info definie ainsi :

public class Info

{

public Info()

{

System.out.println("Groupe");

}

public Info(int i)

{

this();

System.out.println(" OCI " + i);

}

}

Qu’affichera l’instruction suivante : Info x = new Info(2); ?

23

a) erreur de compilation

b) erreur d’execution

c) Groupe OCI 2

d) OCI 2

Exercice 5.13

Soit la classe C definie ainsi :

public class C

{

public static int i;

public int j;

public C()

{

i++;

j=i;

}

}

Qu’affichera le code suivant :

C x = new C();

C y = new C();

C z = x;

System.out.println(z.i + " et " + z.j);

a) 2 et 2

b) 1 et 1

c) 2 et 1

d) 1 et 3

Exercice 5.14

Observer les classes suivantes :

public class Person

{

public void talk()

{

System.out.print("I am a Person ");

}

}

public class Student extends Person

{

public void talk()

{

24

System.out.print("I am a Student ");

}

}

Quel sera le resultat du morceau de code qui suit :

public class Test

{

public static void main(String[] args)

{

Person p = new Student();

p.talk();

}

}

a) I am a Person

b) I am a Student

c) I am a Person I am a Student

d) I am a Student I am a Person

6 Quelques exercices d’entraınement

Ces exercices sont tires du livre “Apprendre a programmer avec Python 3” de Gerard Swinnen.

Pour vous aider a faire ces exercices, il vous faudra peut-etre une reference resumant les elementsdu langage Java vus jusqu’ici. Le site openclassrooms offre des explications de bonne qualiteet la page Bien commencer en Java du tutoriel de programmation en java vous sera sans douteutile. L’URL du site est :

http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-java

6.1 Faire calculer la machine

Exercice 6.1

Ecrire un programme qui calcule le volume d’un parallelepipede rectangle dont sont fournis au departla largeur, la hauteur et la profondeur.

Exercice 6.2

Ecrire un programme qui convertit un nombre entier de secondes fourni au depart en un nombred’annees, de mois, de jours, de minutes et de secondes (utiliser l’operateur modulo : %).

6.2 Instructions repetitives

Exercice 6.3

Ecrire un programme qui affiche en colonne les 20 premiers termes de la table de multiplication

25

par 13, en signalant au passage a l’aide d’un decalage vers la droite ceux qui sont egalement desmultiples de 3.

Exercice 6.4

Ecrire un programme qui affiche en colonne les n premiers termes de la table de multiplication par k,en signalant au passage a l’aide d’un decalage vers la droite ceux qui sont egalement des multiplesde m. Les nombres n, m et k sont des entiers.

Exercice 6.5

Ecrire un programme qui calcule les 50 premiers termes de la table de multiplication par 17, maisn’affiche que ceux qui sont des multiples de 7.

Exercice 6.6

Ecrire un programme qui calcule les n premiers termes de la table de multiplication par k, maisn’affiche que ceux qui sont des multiples de m.

Exercice 6.7

Ecrire un programme qui affiche un nombre donne de lignes avec sur chaque ligne un nombre d’etoilecorrespondant au numero de la ligne.

6.3 Donnees numeriques

Exercice 6.8

Ecrire un programme qui convertit en radians un angle fourni au depart en degres, minutes etsecondes.

Exercice 6.9

Ecrire un programme qui convertit en degres, minutes et secondes un angle fourni au depart enradians.

Exercice 6.10

Ecrire un programme qui convertit en degres Celsius une temperature exprimee au depart en degresFarenheit, ou l’inverse. La formule de conversion s’ecrit :

TF = TC ·

9

5+ 32

Exercice 6.11

Ecrire un programme qui calcule les interets accumules chaque annee pendant 20 ans, par capitali-sation d’une somme de 100 francs placee en banque au taux fixe de 2.25%.

Exercice 6.12

Une legende de l’Inde ancienne raconte que le jeu d’echecs a ete invente par un vieux sage, queson roi voulut remercier en lui affirmant qu’il lui accorderait n’importe quel cadeau en recompense.Le vieux sage demanda qu’on lui fournisse simplement un peu de riz pour ses vieux jours, et plusprecisement un nombre de grains de riz suffisant pour que l’on puisse en deposer un seul sur la

26

premiere case du jeu qu’il venait d’inventer, deux sur la suivante, quatre sur la troisieme, et ainsi desuite jusqu’a la 64eme case.

Ecrire un programme Java qui affiche le nombre de grains a deposer sur chacune des 64 cases dujeu. Calculer ce nombre de deux manieres :

a) sous la forme d’un nombre entier de grains ;

b) en exprimant le nombre de grains en notation scientifique.

6.4 Donnees alphanumeriques

Exercice 6.13

Ecrire un programme qui determine si une chaıne de caracteres contient ou non le caractere “e”.

Exercice 6.14

Ecrire un programme qui compte de nombre d’occurrences du caractere “e” dans une chaıne decaracteres.

Exercice 6.15

Ecrire un programme qui recopie une chaıne dans une nouvelle variable, en inserant des asterisquesentre les caracteres.

Ainsi, par exemple, “gaston” devra devenir “g*a*s*t*o*n”.

Exercice 6.16

Ecrire un programme qui recopie une chaıne dans une nouvelle variable, en l’inversant.

Ainsi, par exemple, “zorglub” devra devenir “bulgroz”.

Exercice 6.17

En partant de l’exercice precedent, ecrire un programme qui determine si une chaıne de caracteresdonnee est un palindrome, c’est a dire une chaıne qui peut se lire indifferemment dans les deux sens,comme par exemple “radar” ou “sugus”.

Exercice 6.18

Ecrire un programme nomme MultiConcat qui prend comme parametres une chaıne de caractereset un entier.

Ce programme retourne la chaıne de caracteres passee en parametre concatenee avec elle-meme n

fois, ou n est l’entier passe en parametre.

Par exemple, si la chaıne de caracteres est hi et l’entier n = 4, le programme retourne hihihihi.

Ce programme retourne la chaıne originale si l’entier passe en parametre est strictement plus petitque deux.

27

6.5 Pour commencer avec les tableaux

Exercice 6.19

Ecrire un programme qui affiche sur une ligne tous les elements d’un tableau.

Par exemple , le tableau declare comme suit :

String[] tableauDesJours = {"Lundi", "Mardi", "Mercredi", "Jeudi",

"Vendredi", "Samedi", "Dimanche"}

devrait apparaıtre sous la forme ci-dessous.

Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche

Exercice 6.20

Ecrire un programme qui recherche le plus grand element present dans un tableau de nombres donne.Par exemple, si on l’appliquait au tableau declare comme suit :

int[] tableauNombres = {32, 5, 12, 8, 3, 75, 2, 15}

cela nous donnerait

Le plus grand element de la liste a la valeur 75.

Exercice 6.21

Ecrire un programme qui analyse un par un tous les elements d’un tableau de nombres pour genererdeux nouveaux tableaux. L’un contiendra les nombres pairs de la liste initiale, et l’autre les nombresimpairs.

Exercice 6.22

Ecrire un programme qui analyse un par un tous les elements d’un tableau de mots pour genererdeux nouveaux tableaux. L’un contiendra les mots comptant moins de six caracteres, l’autre les motscomptant six caracteres ou davantage.

28

7 La programmation objet en Java

Les concepteurs de langages cherchent les moyens de faciliter la creation et la maintenance ducode. Une methode souvent retenue consiste a structurer le langage au moyen de procedures quisont des blocs de code effectuant une action bien precise sur des donnees du programme. Il estpossible de regrouper ces procedures en bibliotheques utilisables par d’autres programmeurs.

Cette facon de faire est efficace mais presente l’inconvenient de separer le code et les donneeset d’etre sensible aux effets de bord. L’idee de base des langages objets, comme Java, est deregrouper donnees et code en une meme entite l’objet. Cette reunion donnees-code se nommeencapsulation.

7.1 Classes et Objets

Une classe est une collection

— d’attributs (ou champs) contenant des valeurs ;

— de constructeurs servant a creer les objets ;

— de methodes definissant des actions.

On peut considerer une classe comme le moule qui permet de fabriquer les objets.

Un objet est une realisation concrete et utilisable de la classe : on dit que c’est une instance dela classe.

Classe Instancesnew

objet 1

objet 2

objet 3

Voyons comment declarer une classe en nous inspirant de Greenfoot et du scenario little-crab.Les attributs et les methodes sont adaptees pour rendre l’exemple plus parlant.

public class Animal

{

}

Pour declarer les variables constituant les attributs de la classe, nous devons choisir leur type.Prenons par exemple le type int pour l’age, float pour la taille et String pour la couleur.

29

public class Animal

{

public int age;

public float taille;

public String couleur;

}

L’etape suivante consiste a ajouter des methodes a notre classe. Avant de declarer une methode,il faut decider si elle prend des arguments et si elle retourne une valeur :

— Le constructeur Animal() qui est une methode, sans valeur de retour, portant le memenom que la classe. Cette methode est invoquee lors de la creation de l’objet de la classeAnimal (operateur new).

— La methode move() permet a l’animal de se deplacer. Elle n’a pas besoin d’argument etne retourne aucune valeur.

— La methode turn(int angle) permet a l’animal de tourner d’un angle en degre dans lesens des aiguilles d’une montre. Elle a besoin d’un argument et ne retourne aucune valeur.

— La methode atWorldEdge() teste si l’animal est au bord du monde. Elle n’a pas besoind’argument et retourne true si c’est le cas ou false sinon.

La nouvelle version de la classe Animal ressemble a ceci :

public class Animal

{

public int age;

public float taille;

public String couleur;

public Animal()

{

...

}

public void move()

{

...

}

public void turn(int angle)

{

...

}

public boolean atWorldEdge()

{

...

}

}

30

7.2 Une classe et ses methodes

Nous desirons gerer des comptes bancaires. Pour cela, nous implementons une classe Compte

avec deux attributs :

— le numero du compte

— le solde du compte

et quatre methodes :

— deposer

— retirer

— avoirSolde

— avoirNumero

Nous resumons cette classe sous la forme d’un schema :

Compte

int numero

double solde

void deposer(double montant)

void retirer(double montant)

int avoirNumero()

double avoirSolde()

L’implemetation est relativement simple, en quelques mots :

— la methode deposer effectue la somme du solde courant et d’un montant :solde = solde + montant

— la methode retirer effectue la difference entre solde courant et d’un montant :solde = solde - montant

— la methode avoirNumero retourne le numero du compte

— la methode avoirSolde retourne le solde du compte

Voici l’implementation de la classe Compte.

public class Compte

{

public int numero;

public double solde;

/**

* Deposer un montant sur le compte

*/

public void deposer(double montant)

{

31

solde = solde + montant;

}

/**

* Retirer un montant du compte

*/

public void retirer(double montant)

{

solde = solde - montant;

}

/**

* Retourne le numero du compte

*/

public int avoirNumero()

{

return numero;

}

/**

* Retourne le solde du compte

*/

public double avoirSolde()

{

return solde;

}

}

Creons un compte bancaire Compte monCompte. Creons une classe Banque pour tester le toutdans la methode main :

class Banque

{

public static void main (String arg[])

{

Compte monCompte;

monCompte = new Compte();

System.out.println("****************");

System.out.println("Creation d’un nouveau compte");

System.out.println(monCompte.numero);

System.out.println(monCompte.solde);

}

}

32

Remarque

La declaration Compte monCompte ne reserve pas d’emplacement pour un objet de type Compte,mais seulement un emplacement pour une reference a un objet de type Compte. L’emplacementpour l’objet proprement dit sera alloue sur une demande explicite du programme, en faisantappel a l’operateur new.

Ainsi l’expression :

new Compte() // attention a la presence des parentheses

cree un emplacement pour un objet de type Compte et fournit sa reference en resultat.

Voici l’execution du programme Banque :

La classe Compte ne contient pas de constructeur. La definition de cette methode n’est pasobligatoire dans la mesure ou un constructeur par defaut (appele parfois constructeur sansargument) est defini par le compilateur Java si la classe n’en possede pas.

La creation de l’objet (instance) attribue une valeur par defaut a chaque variable d’instance,qu’elle soit d’un type primitif (dans notre cas : 0 pour la variable numero et 0.0 pour la variablesolde) ou de reference (sa valeur est alors null).

Modifions la classe Banque.

class Banque

{

public static void main (String arg[])

{

Compte monCompte;

monCompte = new Compte();

System.out.println("****************");

System.out.println("Creation d’un nouveau compte");

monCompte.numero=200; // Affectation d’un numero de compte

monCompte.solde=1535.75; // Affectation d’un solde au compte

System.out.println(monCompte.numero);

System.out.println(monCompte.solde);

monCompte.deposer(300.0);

33

System.out.println("Le numero de monCompte est : "+monCompte.avoirNumero());

System.out.println("Le solde de monCompte est : "+monCompte.avoirSolde());

}

}

L’instruction monCompte.numero=200 attribue un numero de compte, tandis que l’instructionmonCompte.deposer(300.0) ajoute le nombre a virgule 300.0 au solde du compte (appel demethode).

Voici l’execution du nouveau programme Banque :

Utilisation des objets

Acces aux donnees

La reference a une donnee definie dans une classe d’objet a pour syntaxe :

nomObjet . nomAttribut

Le point marque la separation entre le nom de l’objet et le nom de la methode de cet objet.

Acces aux methodes

Quand on applique les methodes aux objets, on dit qu’on envoie des messages aux objets.

Cela s’ecrit ainsi :

nomObjet . nomMethode()

7.3 La notion de constructeur

Dans l’exemple Compte, le compilateur utilise un constructeur par defaut.

Nous souhaitons definir immediatement le numero et le solde du compte des sa creation. Pourcela nous avons besoins d’un constructeur.

Voici un exemple de constructeur :

public Compte(int a, double b)

{

numero=a;

solde=b;

}

34

Des lors les instructions

Compte monCompte;

monCompte = new monCompte(300 , 235.75);

initialise le compte monCompte avec le numero 300 et un solde egal a 235.75.

Voici quelques regles a suivre concernant les constructeurs :

— un constructeur doit toujours etre une methode publique

— vous devez imperativement donner le meme nom que votre classe au constructeur

— un constructeur ne retourne rien, c’est a dire que vous n’ajouterez pas de return danscette methode

— vous ne devez pas mettre de void, meme si le constructeur ne retourne rien

7.4 L’accessibilite aux attributs d’une classe

Dans l’introduction de ce chapitre, nous avons parle d’encapsulation. L’encapsulation estun mecanisme consistant a rassembler les donnees (les arguments) et les methodes au seind’une structure en cachant l’implementation de l’objet, c’est-a-dire en empechant l’acces auxdonnees par un autre moyen que les services proposes. L’encapsulation permet donc de garantirl’integrite des donnees contenues dans l’objet.

L’encapsulation permet de definir des niveaux de visibilite des elements de la classe. Ces niveauxde visibilite definissent les droits d’acces aux donnees selon que l’on y accede par une methodede la classe elle-meme, d’une classe heritiere, ou bien d’une classe quelconque. Il existe troisniveaux de visibilite :

— publique : les fonctions de toutes les classes peuvent acceder aux donnees ou auxmethodes d’une classe definie avec le niveau de visibilite public. Il s’agit du plus basniveau de protection des donnees

— protegee : l’acces aux donnees est reserve aux fonctions des classes heritieres, c’est-a-direpar les fonctions membres de la classe ainsi que des classes derivees

— privee : l’acces aux donnees est limite aux methodes de la classe elle-meme. Il s’agit duniveau de protection des donnees le plus eleve

Dans la classe Compte definies au point 4.2, les attributs sont publiques. En les declarant prives,l’acces a ces attributs avec une expression monCompte.numero=200 n’est plus possible.

Voyons cela avec un exemple plus simple.

public class Test

{

private int x;

}

Creons une instance de Test et essayons d’acceder a l’attribut x. Voici une classe TestX quimontre le resultat :

35

class TestX

{

public static void main (String arg[])

{

Test test;

test = new Test();

System.out.println("****************");

System.out.println(test.x);

}

}

Nous obtenons une erreur de compilation, comme le montre la fenetre ci-dessous :

Pour acceder ou modifier des attributs declares prives, on cree des methodes nommees accesseursou mutateurs.

7.4.1 La notion d’accesseur

Un accesseur est une methode permettant de recuperer le contenu d’une donnee membreprotegee. Un accesseur, pour accomplir sa fonction :

— doit avoir comme type de retour le type de la variable a renvoyer

— ne doit pas necessairement posseder d’arguments

Une convention de nommage veut que l’on fasse commencer de facon preferentielle le nom del’accesseur par le prefixe get, afin de faire ressortir sa fonction premiere.

La syntaxe d’un accesseur reduit a sa plus simple expression ressemble donc a ceci :

public class Test

{

private int x;

public int getX()

{

return x;

}

}

36

7.4.2 La notion de mutateur

Un mutateur est une methode permettant de modifier le contenu d’une donnee membreprotegee. Un mutateur, pour accomplir sa fonction :

— doit avoir comme parametre la valeur a assigner a la donnee membre. Le parametre doitdonc etre du type de la donnee membre

— ne doit pas necessairement renvoyer de valeur (il possede dans sa plus simple expressionle type void)

Une convention de nommage veut que l’on fasse commencer de facon preferentielle le nom dumutateur par le prefixe set.

La syntaxe d’un mutateur reduit a sa plus simple expression ressemble donc a ceci :

public class Test

{

private int x;

public void setX (int a)

{

x = a;

}

}

7.4.3 Les attributs statiques

Un attribut statique est un attribut qui est commun a tous les objets que vous pourrez creer. Onpeut par exemple citer un compteur du nombres d’instances de classe que vous aurez lancees. Sivous souhaitez compter le nombre de fois ou vous avez instancie la classe ”Test” vous pourrezecrire ceci :

public class Test2

{

public static int nombre=0;

public Test2() // Constructeur

{

nombre=nombre+1;

System.out.println("Nombre d’instances creees : " + nombre);

}

}

En testant cette classe :

class TestX2

37

{

public static void main (String arg[])

{

System.out.println("****************");

Test2 test1 = new Test2();

Test2 test2 = new Test2();

Test2 test3 = new Test2();

}

}

Nous obtenons :

7.5 L’heritage

7.5.1 Introduction

L’avantage essentiel d’un langage oriente-objet est que le code est reutilisable. Grace a l’heritage,on peut faire deriver une nouvelle classe d’une classe existante et ainsi en recuperer les attributset methodes, sans avoir a la reecrire completement.

Nous avons rencontre la notion d’heritage dans Greenfoot.

Diagramme de classes dans Greenfoot

Dans ce scenario :

— la classe Animal est une sous-classe de la classe Actor

— la classe Actor est une super-classe de la classe Animal

38

— les classes Crab, Worm et Lobster sont des sous-classes de la classe Animal

Si Enfant est une sous-classe de Parent, on dit que la classe Enfant herite de la classeParent, qu’elle etend cette ancienne classe.

Enfant est alors une sous-classe de Parent.

Parent est une super-classe de Enfant.

Toujours dans Greenfoot, nous avons la classe Animal :

public class Animal

{

private int age;

private float taille;

private String couleur;

public Animal() { ... }

public void move() { ... }

public void act() { ... }

public void turn(int angle) { ... }

public boolean atWorldEdge() { ... }

}

et la classe Crab qui est une sous-classe de la classe Animal :

public class Crab extends Animal

{

private GreenfootImage image1;

private GreenfootImage image2;

private int wormsEaten;

public Crab() { ... }

public void act() { ... }

public void switchImage() { ... }

public void checkKeypress() { ... }

public boolean lookForWorm() { ... }

}

La classe Crab peut acceder a toutes les methodes publiques de la classe Animal. Dans la classeCrab, la methode act() est redefinie. Cela permet de redefinir une methode de la super-classe

39

Animal, en proposant une nouvelle definition. Il faut respecter la signature de la methode (typedes arguments), ainsi que le type de valeurs de retour. C’est alors cette nouvelle methode quisera appelee sur tout objet de la sous-classe, masquant en quelque sorte la methode de la classede base.

Une sous-classe reprend toutes les proprietes et methodes de la super-classe, tout en pouvantintegrer de champs nouveaux (attributs et methodes). Ceux-ci caracteriseront et distingue-ront les objets de la classe heritee des objets de la classe parent. Autrement dit, cela signifiequ’une instance de la classe Enfant aura la possibilite d’utiliser, outre des attributs et methodessupplementaires, toutes les ressources definies dans Parent, si des modificateurs ne l’empechepas. Une methode d’une classe Enfant n’a pas acces aux membres prives de sa classe Parent.Si c’etait le cas, il suffirait de creer une classe Enfant pour violer le principe d’encapsulation.

En Java, toutes les classes sont derivees de la classe speciale Object. C’est la racine de lahierarchie des classes (cela entraine que toute classe Java possede deja a sa naissance un certainnombre de variables et de methodes).

Dans la declaration d’une classe si la clause extends n’est pas presente, la surclasse est doncObject directement.

7.5.2 Un exemple complet

Considerons un exemple complet d’une classe Parent Ville et d’une classe Enfant Capitale.

VilleString nom

int nbHab

Ville(String leNom)

Ville (String leNom, int leNbHab)

String getNom()

int getNbHab()

void setNbHab(int nvNbHab)

String presenteToi()

Capitale

String pays

Capitale(String leNom, String lePays)

Capitale(String leNom, String lePays, int leNbHab)

String getPays

void setPays(String nomPays)

String presenteToi()

Voici l’implementation de la classe Ville :

class Ville

40

{

//le nom ne sera accessible que par la classe Ville, et pas par la classe Capitale

private String nom;

//le nombre d’habitant sera accessible par la classe Capitale

protected int nbHab;

public Ville(String leNom)

{

nom = leNom.toUpperCase( );//ainsi tous le noms de ville seront en majuscule

nbHab = -1; //-1 signifie que le nombre d’habitant est inconnu

}

public Ville (String leNom, int leNbHab)

{

nom = leNom.toUpperCase( );

if (leNbHab< 0)

{

System.out.println("Un nombre d’habitant doit etre positif.");

nbHab = -1;

}

else

{

nbHab = leNbHab;

}

}

public String getNom( )

{

return nom;

}

//pas d’accesseur en ecriture pour le nom

//donc il est impossible de changer le nom d’une ville

public int getNbHab( )

{

return nbHab;

}

public void setNbHab(int nvNbHab)

{

if (nvNbHab < 0)

{

System.out.println("Un nombre d’habitant doit etre positif.");

System.out.println("La modification n’a pas ete prise en compte);

}

else

{

nbHab = nvNbHab;

}

41

}

public String presenteToi()

{

String presente = "Ville "+ nom +" nombre d’habitants ";

if (nbHab == -1)

{

presente = presente + "inconnu";

}

else

{

presente = presente + " = " + nbHab;

}

return presente;

}

}

Et voici l’implementation de la classe Capitale :

public class Capitale extends Ville

{

private String pays; //constructeurs public

Capitale(String leNom, String lePays)

{

super(leNom); //appel du constructeur de Ville

//nbHab est initialise a {1 par ce constructeur

pays = lePays;

}

public Capitale(String leNom, String lePays, int leNbHab)

{

super(leNom, leNbHab);

pays = lePays;

}

//accesseurs supplementaires

public String getPays( )

{

return pays;

}

public void setPays(String nomPays)

{

pays = nomPays;

}

//methode presenteToi( ) redefinie

42

public String presenteToi( )

{

String presente = super.presenteToi( );

presente = presente + " Capitale de "+ pays;

return presente;

}

}

Pour tester ces deux classes, creons une classe TestVille :

public class TestVille

{

public static void main(String args[])

{

Ville v1 = new Ville("Lausanne", 1500000);

Ville v2 = new Ville("Vevey");

Capitale c1 = new Capitale("Paris", "France", 10000000);

Capitale c2 = new Capitale("Berne", "Suisse");

System.out.println("******************************");

System.out.println(v1.presenteToi( ));

System.out.println(v2.presenteToi( ));

System.out.println(c1.presenteToi( ));

System.out.println(c2.presenteToi( ));

System.out.println("******************************");

}

}

Finalement, l’execution de ce dernier programme donne :

8 Exercices sur les objets en java

8.1 Figures geometriques

Exercice 8.1

Ecrire une classe Rectangle avec deux champs longueur et largeur, avec un constructeur et

43

avec les methodes aire, perimetre et description (qui donne les caracteristiques du rectangle :longueur, largeur, aire et perimetre).

Rectangle

int longueur

int largeur

Rectangle(int x,int y)

int aire()

int perimetre()

String description()

Exercice 8.2

Ecrire une sous-classe Carre de la classe Rectangle.

–Carre

Carre(int c)–

Exercice 8.3

Creer une methode dessineRectangle de la classe Rectangle qui dessine sommairement le rec-tangle a l’aide d’etoiles.

Creer ensuite une methode main de la classe Rectangle telle que suite au lancement du programme,on obtient la description et le dessin d’un carre si un seul argument (cote) est donne et d’un rectanglesi deux arguments (longueur, largeur) sont fournis.

Exercice 8.4

Ecrire une classe representant des cercles. Cette classe contient deux constructeurs :

a) Cercle() sans argument qui cree un cercle dont le rayon est egal a 1

44

b) Cercle(double r) avec un argument qui cree un cercle de rayon r

Ecrire les methodes suivantes de la classe Cercle.

a) pour calculer l’aire

b) pour calculer le perimetre

c) pour obtenir le rayon

d) pour modifier le rayon d’un cercle deja cree

e) pour donner les caracteristiques (rayon et aire) du cercle

Exercice 8.5

On peut considerer qu’un cylindre est un cercle dont la hauteur est donnee. Construire une classeCylindre qui derive de la classe Cercle.

Creer un constructeur Cylindre() sans argument qui cree un cylindre dont le rayon du cercle debase est egal a 1 et dont la hauteur est egale a 5 et un constructeur Cylindre(double r, double

h) qui cree un cylindre dont le rayon du cercle de base est r et dont la hauteur est h.

Ecrire les methodes qui calculent le volume et l’aire totale d’un cylindre, ainsi que la methode quidonne les caracteristiques (rayon, aire totale et volume) du cylindre

Formules : volume = π · r2 · h et aire totale = 2 π r · (r + h)

Exercice 8.6

Creer une methode main de la classe Cercle telle que suite au lancement du programme, on obtientla description d’un cercle si un seul argument (rayon) est donne et d’un cylindre si deux arguments(rayon, hauteur) sont fournis.

8.2 La citerne

Exercice 8.7

Il s’agit de developper une classe simulant une citerne d’eau potable. Developpez la classe Citernequi possede les proprietes et fonctionnalites suivantes :

a) une citerne possede un volume maximal de 1000 litres,

b) une citerne a un volume d’eau actuel,

c) on peut ajouter de l’eau a la citerne (attention au volume maximal)

d) on peut retirer de l’eau de la citerne (attention au retrait maximal possible)

e) la citerne renseigne a l’aide d’un indicateur sur son volume actuel,

f) la citerne possede aussi un indicateur affichant le taux de remplissage en pourcents.

Ajouter un constructeur Citerne() sans argument qui permet de creer une citerne de 1000 litresvide et une methode main qui simule quelques remplissages et retraits aleatoires successifs.

Exercice 8.8

Modifiez votre classe Citerne en CiterneBis. Cette nouvelle version ne possede plus un volumemaximal fixe de 1000 litres.

Transformer le constructeur Citerne en un constructeur CiterneBis(double rayon, double

hauteur) qui permet de creer des citernes a volume variable selon leurs dimensions exterieures.

45

N’oubliez pas que le volume maximal ne peut plus etre modifie apres que la citerne est construite !

8.3 Thermometre

Exercice 8.9

Ecrire deux constructeurs de la classe Thermometre qui travaille soit avec des degres Celsius, soitavec des degres Fahrenheit. Le premier constructeur initialise une temperature de 0 degre (◦C ou◦F). Le deuxieme constructeur initialise une temperature donnee en degre (◦C ou ◦F) .

Thermometre

double temperature

double Thermometre()

double Thermometre(double t)

Exercice 8.10

Completer la classe avec les methodes suivantes :

— getTemperature() pour acceder au champ prive temperature,

— setTemperature(double t) pour modifier la valeur du champ prive temperature,

— changeTemperature() qui additionne un degre (◦C ou ◦F) a la valeur courante du champtemperature,

— changeTemperature(double t) qui additionne la valeur t a la valeur courante du champtemperature,

— celsiusToFahrenheit() qui convertit en degres Fahrenheit une temperature donnee endegres Celsius ,

— fahrenheitToCelsius() qui convertit en degres Celsius une temperature donnee en degresFahrenheit,

— printTemp() qui affiche la temperature (en ◦C ou en ◦F)

Indication : La formule de conversion de degres Celsius en degres Fahrenheit s’ecrit :

TF = TC ·

9

5+ 32

Exercice 8.11

Modifier la classe precedente Thermometre afin que la temperature soit donnee des le depart endegres Celsius ou Fahrenheit.

Par exemple, on transformera les deux constructeurs en Thermometre(char u) et en

Thermometre(double t, char u).

8.4 Devinez un nombre

Exercice 8.12

Ecrire un programme Devinette.java qui fait deviner un nombre secret compris entre 0 et 100 aquelqu’un. Ce programme commencera par initialiser une variable secret par l’instruction

46

int secret = (int)(Math.random() * 100);

ce qui donne une valeur differente a secret a chaque execution du programme. Puis le programmedoit faire deviner cette valeur a l’utilisateur en lui demandant d’entrer un nombre et en lui indiquantsi celui-ci est superieur ou inferieur a la valeur secrete jusqu’a ce qu’il trouve le bon nombre.

Par exemple :

Devinez le nombre :

42

Trop grand !

Devinez le nombre :

21

Trop bas !

Devinez le nombre :

23

Trop bas !

Devinez le nombre !

25

Bravo, vous avez gagne !

8.5 Ville et Capitale

Exercice 8.13

Ecrire les classes Ville et Capitale selon le diagramme de classe ci-dessous.

VilleString nom

int nbHab

Ville(String leNom)

Ville (String leNom, int leNbHab)

String getNom()

int getNbHab()

void setNbHab(int nvNbHab)

String presenteToi()

Capitale

String pays

Capitale(String leNom, String lePays)

Capitale(String leNom, String lePays, int leNbHab)

String getPays

void setPays(String nomPays)

String presenteToi()

47

Exercice 8.14

Pour tester ces deux classes, creez une classe TestVille :

public class TestVille

{

public static void main(String args[])

{

Ville v1 = new Ville("Lausanne", 1500000);

Ville v2 = new Ville("Vevey");

Capitale c1 = new Capitale("Paris", "France", 10000000);

Capitale c2 = new Capitale("Berne", "Suisse");

System.out.println("******************************");

System.out.println(v1.presenteToi( ));

System.out.println(v2.presenteToi( ));

System.out.println(c1.presenteToi( ));

System.out.println(c2.presenteToi( ));

System.out.println("******************************");

}

}

8.6 Jouer avec des des

Exercice 8.15

Voici le diagramme de la classe Dice.

Dice

private int face

private String name

private static int nombreDeDe

private static final int NombreDeFaces

Dice()

int getFace()

void roll()

String description()

int somme(Dice de)

static int countDice()

48

Le champ nombreDeDe est un champ de classe, il donne le nombre de des instancies.

Le champ NombreDeFaces est constant et represente ici le nombre de faces d’un de (6 pour cetexercice).

La methode getFace permet de recuperer la face du de (accesseur).

La methode roll permet de lancer un de et ainsi de modifier sa face.

La methode description retourne les informations d’un de, par exemple : le de dice1 a la

face 3.

La methode somme permet d’additionner les faces de deux des.

La methode de classe countDice permet d’afficher le nombre de des.

A partir de ces informations, creer la classe Dice.

Exercice 8.16

Deux joueurs lancent deux des a six faces. Celui qui obtient le maximum en additionnant les deuxfaces a gagne.

Creer une nouvelle classe Personne qui permet a deux joueurs de lancers des des et de comparerleur resultat. Utiliser la classe Dice pour simuler le lancer des des.

Commencer par ecrire le le diagramme de la classe Personne.

Exercice 8.17

Modifier la classe precedente : un des deux joueurs gagne lorsqu’il obtient un total fixe au depart.

8.7 Les Schtroumpfs

Les Schtroumpfs sont des petits etres bleus vivant dans la foret.

On considere une modelisation simple d’un Schtroumpf : chaque Schtroumpf

— a un nom,

— a un age,

— est content, ou pas.

Exercice 8.18

Ecrire la classe Schtroumpf (dans un fichier Schtroumpf.java) avec ses champs et son construc-teur.

Exercice 8.19

Un Schtroumpf se presente en donnant un message, par exemple : ≪Bonjour, on m’appelle Schtroumpfa lunettes et j’ai 99 ans.≫

Exercice 8.20

Si un Schtroumpf est content, il chante ≪la, la, la, la Schtroumpf la la la≫. S’il n’est pas content,il ne chante pas.

Ecrire la methode chante qui ecrit a l’ecran la chanson que l’on peut entendre en s’approchantd’un Schtroumpf.

49

Exercice 8.21

Declarer un champ statique salsepareille de type entier de la classe Schtroumpf. Initialiser cechamp a 100 feuilles.

Ecrire des methodes pour les evenements suivantes de la vie d’un Schtroumpf :

— manger de la salsepareille en puisant trois feuilles dans la reserve (ce qui le rend heureux) ;

— aller travailler au pont de la riviere Schtroumpf (ce qui le rend triste) ;

— recolter de la salsepareille (ce qui le rend triste aussi). Il en ramene alors cinq feuilles.

Exercice 8.22

Creer un deuxieme constructeur de la classe Schtroumpf qui nomme les Schtroumpfs Schtroumpf 1,Schtroumpf 2, etc (meme si ca manque de poesie) et qui lui attribue un age au hasard (en utilisantla methode java.lang.Math.random de Java).

Exercice 8.23

Le Grand Schtroumpf d’un village est le plus vieux des Schtroumpfs de ce village. Comment lereperer ?

Exercice 8.24

Creer une methode statique qui affiche le nombre de Schtroumpfs.

Exercice 8.25

Pour que tout le monde ne soit pas content, creer une boucle dans la methode main qui va envoyerun Schtroumpf sur deux au travail.

Exercice 8.26

Creer la methode qui affiche tous les Schtroumpfs heureux.

Exercice 8.27

Creer une methode qui envoie tous les Schtroumpfs heureux cueillir de la salsepareille.

Exercice 8.28

Creer une methode statique AnneeQuiPasse qui increments de un l’age de tous les Schtroumpfs.

Exercice 8.29

Le mechant Gargamel essaye d’influer sur les Schtroumpfs : par une magie connue de lui seul, ilpeut changer leur humeur a distance grace a la methode suivante (de la classe Gargamel) :

public static void maudireSchtroumpf (Schtroumpf S)

{

S.content = false;

}

Comment dejouer la tentative de Gargamel ?

50

8.8 Le Village Schtroumpf

Un village Schtroumpf possede :

— un nom ;

— une structure qui contient 100 Schtroumpfs ;

— un stock de salsepareille (on compte le nombre de feuilles en reserve).

Attention : il faut modifier la classe Schtroumpf.

Exercice 8.30

Ecrire la classe Village.

Le constructeur de la classe Village doit appeler le constructeur de Schtroumpf pour chaqueSchtroumpf (cf Ex 5.1).

Exercice 8.31

Ecrire la methode qui affiche tous les Schtroumpfs heureux d’un village.

Exercice 8.32

Un Schtroumpf ne peut habiter qu’un village. Il existe cependant des Schtroumpfs ermites quin’habitent aucun village.

Ajouter dans la classe Schtroumpf l’information du village auquel appartient un Schtroumpf, et lesaccesseurs pour manipuler cette information.

Attention, les bebes Schtroumpfs ont (en general) un village de naissance !

Modifier la classe Schtroumpf pour qu’un Schtroumpf se presente en donnant le nom de son village.

Exercice 8.33

On veut maintenant savoir combien de Schtroumpfs il y a au monde. Comment faire ?

Pour verifier votre programme, faites un main qui construit deux villages et un Schtroumpf ermitepuis affiche le nombre de Schtroumpfs (qui devrait donc etre 201).

51

8.9 Exercices sur les tableaux et les boucles

Exercice 8.34

Voici la classe Tableau.

Tableau

int[] tableau

Tableau()

int[] getTableau

int element(int i)

int somme()

double moyenne()

int max()

int min()

double moyenneOlympique()

String description()

Le champ tableau est prive.

tableau contient 10 nombres entiers positifs choisis au hasard entre 0 compris et 100 non compris.La methode Math.random permet de generer des nombres aleatoires.

La methode element(int i) renvoie le ieme element de tableau.

La methode moyenneOlympique est la moyenne des elements de tableau obtenue en lui retirantson plus grand et et son plus petit element.

Les autres methodes sont explicites.

a) Creer la classe Tableau, puis la tester dans une classe TestTableau.

b) Ajouter a la classe Tableau une methode statique echange(int[] tab, int i, int j)

qui permute dans le tableau donne en parametre les deux coefficients d’indice i et j. Sasignature est public static void echange(int[] tab, int i, int j)

c) Ajouter a la classe Tableau une methode int[] elementPair() qui renvoie un tableaucompose des elements pairs de tableau.

d) Ajouter a la classe Tableau une methode int[] tri() qui renvoie le tableau forme deselements de tableau tries par ordre croissant.

Exercice 8.35

Nous allons completer la classe MotDeQuatreLettres (voir le fichier MotDeQuatreLettres.java).

MotDeQuatreLettresString mot

MotDeQuatreLettres()

MotDeQuatreLettres(int indice)

String getMot()

static String motDuDico(int i)

String insereCaractere(char c)

boolean estUnPalindrome()

String inverse()

52

Le champ mot est prive.

Le constructeur sans argument choisit un mot au hasard dans le dico ; le constructeur avec unargument choisi dans le dico le mot place a l’indice indique.

La methode statique motDuDico(int i) retourne le mot place dans le dico a l’indice donne enparametre.

La methode insereCaractere(char c) insere entre les lettres du mot le caractere passe en pa-rametre. Par exemple si mot contient taxi, en inserant le caractere *, la methode retourne t*a*x*i.

La methode estUnPalindrome() verifie si le mot est un palindrome.

La methode inverse() retourne le mot. Par exemple si mot contient taxi la methode retourneixat.

a) Completer la classe MotDeQuatreLettres, puis la tester dans une classe TestMot.

b) Ajouter a la classe MotDeQuatreLettres une methode doublon qui dit si mot apparaıt aumoins deux fois dans le dico. Sa signature est boolean doublon().

Par exemple si l’attribut mot de l’objet instancie est elle, la methode renvoie true.

c) Ajouter a la classe MotDeQuatreLettres une methode statique qui place tous les mots quicommencent par le caractere c dans un nouveau tableau.

Sa signature est static String[] commenceParListe(char c).

d) Ajouter a la classe MotDeQuatreLettres une methode statique commencePar(char c) quiaffiche dans la fenetre du terminal tous les mots de dico commencant par la lettre passee enparametre.

e) Ajouter a la classe MotDeQuatreLettres une methode aUneAnagramme() qui renvoie truesi mot a une anagramme dans dico.

f) Ajouter a la classe MotDeQuatreLettres une methode anagramme() qui renvoie (quandc’est possible) un mot de dico qui est l’anagramme de mot.

Exercice 8.36

Ecrire une classe Tableau qui :

— initialise un tableau de 10 nombres entiers inferieurs a 100 (classe Random),

— calcul la somme des elements du tableau,

— calcule la moyenne des elements du tableau,

— determine le minimum et le maximum des elements du tableau.

Exercice 8.37

Ecrire une classe Parity. Les objets sont des tableaux de nombres entiers aleatoires, la longueur dutableau est fixee au moment de sa creation : Parity tableau = new Parity(8); par exemple.

Cette classe contient au moins les trois methodes :

— print qui affiche les elements d’un tableau,

— splitPair et splitImpair qui construisent deux nouveaux tableaux : l’un contiendra lesnombres pairs du tableau initial, et l’autre les nombres impairs.

53

Exercice 8.38

Nous allons completer la classe Pascal

Pascal

int[][] tableau

Pascal(int n)

int[][] getTableau()

int[] getLigne(int n)

static int[][] creePascal(int n)

String affiche()

String afficheSomme()

Le champ tableau est prive. C’est un tableau de tableaux ; les elements sont les lignes successivesdu tableau de Pascal sous forme de tableaux.

Le constructeur Pascal(int n) construit un tableau de Pascal de niveau n. Par exemple le tableaude Pascal de niveau 3 est le suivant :

1

1-1

1-2-1

1-3-3-1.

La methode statique creePascal(int n) permet d’initialiser le champ tableau.

La methode getLigne(int n) retourne la n-ieme ligne du tableau de Pascal (1 est la ligne 0, 1-1est la ligne 1, 1-2-1 est la ligne 2 et ainsi de suite).

La methode affiche() retourne une chaıne de caracteres permettant d’afficher le tableau de Pas-cal dans la fenetre du terminal. La methode afficheSomme() retourne une chaıne de caracterespermettant d’afficher la suite des sommes des lignes du tableau de Pascal.

Exercice 8.39

Ecrire une classe Pythagore qui trouve et qui affiche tous les triangles rectangles dont les cotessont tous inferieurs a 500.

Ce programme affiche egalement le nombre de triangles rectangles.

Exercice 8.40

Ecrire un programme qui recherche et affiche les facteurs premiers d’un nombre entier lu au clavier(il n’est pas necessaire que le programme soit efficace).

Par exemple pour 120, on affichera : ”120 = 2 x 2 x 2 x 3 x 5”

Indication : excepte 2, inutile de rechercher d’autres diviseurs pairs.

54

8.10 Listes dynamiques en Java

Exercice 8.41

Dans un projet moyennes, cree dans NetBeans, creer une classe correspondant au diagramme ci-dessous :

Note

double valeur

int coefficient

double getValeur()

int getCoefficient()

double notePonderee()

Cette classe dispose d’un champ prive de type double qui permet de stocker la note et d’unchamp prive de type int pour tenir compte du coefficient de la note. On peut consulter la note etson coefficient, mais pas les modifier apres construction. On peut egalement faire calculer la noteponderee (produit de la valeur par le coefficient).

Creer ensuite une deuxieme classe donnee par le second diagramme :

Branche

String denomination

ArrayList<Note> listeNotes

String getDenomination()

ArrayList<Note> getListeNotes()

void ajouterNote (int index, Note note)

void remplacerNote(int index, Note note)

void supprimerNoteNumero(int index)

double totalPondere()

double moyenne()

String affiche()

Cette classe dispose d’un champ prive de type String pour nommer la branche et d’un champ privede type ArrayList<Note> qui permet de stocker les notes au fur et a mesure.

a) Dans la methode main de la classe Moyennes, creer un objet de type Branche qui s’appellefrancais, par exemple. A l’aide d’une boucle, remplir ensuite cet objet avec une quinzaine denotes calculees aleatoirement. Les dix premieres notes comptent simple et les cinq dernierescomptent double.

b) Dans la javadoc, passer en revue les methodes predefinies de la classe ArrayList.

c) Faire afficher toutes les notes de francais.

d) Remplacer la premiere note de francais insuffisante par un 4 (attention a conserver la ponderation).

e) Ajouter un 6 de coefficient 1 au debut de la liste des notes de francais.

f) Faire afficher le total pondere des notes de francais et la moyenne de cette branche a laconsole.

55

g) Creer une classe EnsembleDesNotes qui contient toutes les notes d’un eleve dans les branchessuivantes : francais, maths, allemand, histoire, geographie, physique, chimie et biologie. lesnoms des branches sont stockes dans un tableau statique et le constructeur de cette classeest charge de creer un objet de type Branche pour chacun de ces noms. On veut pouvoirconsulter les differentes moyennes et gerer les notes de chaque branche.

8.11 La classe Personne

Exercice 8.42

Creer une classe Personne.

Voici les fonctionnalites de Personne :

— les variables d’instances sont privees : inaccessibles d’une autre classe

— les variables variables d’instance : String nom, prenom, adresse, sexe ; int age

— trois constructeurs :

public Personne (String lenom){..}

public Personne (String leprenom, String lesexe, int lage){..}

public Personne (String lenom, String leprenom, String lesexe, int lage){..}

— des methodes d’instances publiques pour acceder aux variables privees getNom(), setNom(),..., anniversaire() incremente l’age, presenteToi() pour afficher un texte comme :

Je m’appelle ... .....

Je suis un [homme | femme]

J’ai .... ans

Personne

String nom

String prenom

String adresse

String sexe

int age

public Personne

...

String getNom()

void setNom()

void anniversaire()

String presenteToi()

Exercice 8.43

Modifier la classe Personne pour qu’elle permette de decrire completement une personne, sachantque l’on souhaite avoir autant d’informations que dans la phrase suivante :

"M. Holly Pierre est ne en 1965, il est marie."

56

Exercice 8.44

Ecrire dans une classe TestPersonne un programme qui declare 3 variables de type Personne, cree3 instances de personne pour les affecter dans les variables et affiche les informations les concernant.

Exercice 8.45

Ajouter une methode donneAge(int annee) qui fixe l’age de l’individu en fonction d’une anneedonnee en parametre.

Exercice 8.46

Ajouter a la classe Personne un attribut conjoint et examiner les consequences que cela peut avoirsur l’ensemble du code.

Exercice 8.47

Ajouter une methode marier(Personne p) qui permet de marier une personne a une autre. Mo-difier la methode presenteToi() de facon que le nom des epoux soient modifies comme suit :

Pour simplifier : quand une femme se marie son nom devient : ”[nom de l’epoux] nee [nom de jeunefille]”, par exemple : si Mlle Jeanne Durant se marie avec M. Jean Dupond, sa presentation deviendra”Mme Dupond Jeanne nee Durant en 1971, est mariee avec Dupond Jean”.

Pour un homme marie, on ajoutera le nom de l’epouse, par exemple : si M. Jean Dupond se marieavec Mlle Jeanne Durant, sa presentation deviendra ”M. Dupond Jean ne en 1971 est mariee avecDurant Jeanne”.

Si le conjoint n’est pas connu, on conservera la presentation precedente.

Attention : cet exercice ne pretend pas representer l’etat actuel de la loi !

Exercice 8.48

Creer une classe GroupePersonnes qui contient un groupe de Personnes. Le groupe possede unnom et un champ prive de type ArrayList<Personne> qui permet de stocker au fur et a mesureles membres qui rejoignent le groupe. Un methode presenteGroupe() retourne une chaıne decaracteres qui donne le nom du groupe et la description de ses membres. Creer un groupe dans laclasse TestPersonne et le faire se presenter.

8.12 Exercices divers

Exercice 8.49

Creer une classe Livret capable de creer une table de multiplication. Par exemple :

1 x 4 = 4

2 x 4 = 8

3 x 4 = 12

4 x 4 = 16

5 x 4 = 20

6 x 4 = 24

7 x 4 = 28

8 x 4 = 32

9 x 4 = 36

57

10 x 4 = 40

11 x 4 = 44

12 x 4 = 48

Exercice 8.50

On considere la classe suivante :

public class Bidule

{

private int val;

public Bidule(int val)

{

this.val = val;

}

public int getVal()

{

return val;

}

}

Les instructions ci-dessous, supposees etre dans une autre classe, ne sont pas correctes. Pourquoi ?

Corriger dans la mesure du possible.

Bidule b = new Bidule();

b.val = 3;

System.out.println(b.val);

Exercice 8.51

Ecrire une classe Etoile qui utilise une methode affiche() permettant de visualiser un triangleisocele forme d’etoiles.

*

***

*****

La hauteur du triangle sera fournie en argument.

Exercice 8.52

Concevoir une classe permettant la gestion d’une caisse enregistreuse :

— montant de la caisse

— details de la caisse (somme en especes, somme en CB)

— encaisser un montant avec un CB

— encaisser un montant exact

58

— encaisser un montant avec rendu de monnaie (indiquer la somme a rendre en retour)

— reinitialiser le contenu de la caisse

Voici la modelisation de la caisse :

Caisse

float sommeEspeces

float sommeCB

Caisse()

Caisse(float sE, float sCB)

void setSommeEspeces(float se)

void setSommeCB(float sCB)

float getSommeEspeces()

float getSommeCB()

float montant()

void details()

void encaisserEspeces(float e)

void encaisserCB(float c)

float encaisserEspeceRendu(float montantDu, float montantRendu)

void initialiserCaisse()

Ecrire la classe Caisse et la tester.

Exercice 8.53

Developpez la classe Compte qui possede les proprietes et fonctionnalites suivantes :

a) le compte a un solde(nombre reel)

b) au debut le compte est vide (le solde est zero)

c) on peut ajouter un certain montant a uncompte

d) on peut retirer un certain montant d’un compte

e) on peut demander le solde actuel

Exercice 8.54 (Mini-Projet)

La banque BurierBank a code ses numeros de compte de facon a ce qu’il soit possible de controler siun numero de compte a ete entre correctement. Pour ce faire, les deux derniers chiffres du numerocorrespondent a la somme des chiffres precedents. Les numeros de compte (chiffres de controleinclus) sont toujours des nombres a 9 chiffres.

Exemples

123450015 est donne correctement, car 1+2+3+4+5 = 15

110021106 est donne correctement, car 1+1+2+1+1 = 06

643553947 n’est pas donne correctement, car 6+4+3+5+5+3+9 = 35 au lieu de 47

Reprenez votre exercice Compte et sauvez-le sous Compte2. Modifiez la classe Compte ainsi :

59

a) Chaque compte possede un numero de compte numero, qui peut etre consulte avec getNu-mero().

b) La methode isValide(long n) controle si un numero de compte donne comme parametreest valide (selon la description ci-dessus).

c) La methode genererNumCompte() sert a generer un numero de compte valide de faconaleatoire. (On neglige ici le fait qu’en realite il est impossible d’employer une telle methodeparce qu’elle risque de produire deux fois le meme numero de compte.)

d) Lors de la creation d’un compte, il faut verifier que le numero de compte donne commeparametre est valide, sinon un numero de compte valide doit etre cree de facon aleatoire.

e) La methode transfert(...) permet de transferer une somme d’argent du compte actuelvers un autre compte. Pour effectuer le transfert, il faut indiquer comme parametre le compte(objet) destinataire, le numero de compte destinataire (comme controle) et le montant atransferer. Avant d’effectuer le transfert, il faut verifier,

— si le numero de compte destinataire est valide

— si le nom du compte destinataire correspond au numero de compte donne

— s’il reste assez d’argent pour effectuer le transfert

Comme resultat, la methode transfert(...) retourne un texte indiquant le succes del’operation ou une description de l’erreur commise, par exemple :

”ERREUR : Le numero de compte destinataire n’est pas valide !”

”SUCCES : Le transfert a ete effectue avec succes !”

...

f) La methode toString() retourne un texte decrivant le numero de compte et le solde actuel.

Exercice 8.55 (Heritage)

Partie 1 – La classe Vehicule

Definir une classe Vehicule qui a pour attributs des informations valables pour tout type devehicule :

a) sa marque

b) sa date d’achat

c) son prix d’achat

d) son prix courant

Definir un constructeur prenant en parametre les trois attributs correspondant a la marque, la dated’achat et le prix d’achat. Le prix courant sera calcule plus tard.

Definir une methode publique void affiche() qui affiche l’etat de l’instance, c’est-a-dire la valeurde ses attributs.

Partie 2 – La classe Voiture et la classe Avion Definissez deux classes Voiture et Avion,heritant de la classe Vehicule et ayant les attributs supplementaires suivants :

a) pour la classe Voiture :

* sa cylindree

60

* son nombre de portes

* sa puissance

* son kilometrage

b) pour la classe Avion :

* son type (helices ou reaction)

* son nombre d’heures de vol

Definir, pour chacune de ces classes, un constructeur permettant l’initialisation explicite de l’en-semble des attributs, ainsi qu’une methode affichant la valeur des attributs. Constructeurs etmethodes d’affichage devront utiliser les methodes appropriees de la classe parente !

8.13 Les piles

Exercice 8.56 (Pile LIFO)

Une pile FILO ou LIFO est de type ”Premier rentre, Dernier sorti” ou ”Dernier rentre, Premier sorti”(en anglais First In, Last Out ou Last In, First Out), et peut aussi etre appelee ”un tas”.Le principe est que les donnees sont inserees et lues par le meme ”cote”.

Il s’agit de definir une classe Pile modelisant une pile de trois entiers naturels. (La classe Pile

utilisera un tableau d’entiers.). Necessairement, tous les attributs de cette classe auront le modifi-cateur private, ce qui signifie qu’on ne peut pas les utiliser directement de l’exterieur de la classe(on dit encore qu’ils ne sont visibles que de leur propre classe).

Cette classe possedera au moins les quatre methodes suivantes (il faudra reprendre exactement lesen-tetes indiquees) :

a) void empiler(int n)

Cette methode empile la valeur n recue en parametre.

Si la pile est pleine, cette methode lance un message d’erreur.

b) int depiler() throws ExceptionPileVide

Si la pile est vide, cette methode lance une exception, ce que vous ferez par l’instruction :

throw new ExceptionPileVide();

sinon, elle depile un entier dont elle retourne la valeur.

c) void afficher()

Cette methode affiche les elements de la pile.

d) boolean estVide()

Cette methode retourne true si la pile est vide et false dans le cas contraire.

Au depart, ce tableau aura une certaine longueur, petite (par exemple 3).

Exemple

61

initialisation de la pile p 0 0 0

p.empiler(2) 2 0 0

p.empiler(3) 3 2 0

p.depiler() retourne l’entier 3

la pile p 2 0 0

p.empiler(5) 5 2 0

p.empiler(9) 9 5 2

p.empiler(1) affiche la pile est pleine

Il faut creer la classe suivante pour gerer l’exception :

class ExceptionPileVide extends Exception

{

public String toString()

{

return "la pile est vide";

}

}

et l’utiliser par exemple ainsi :

public class TestPile

{

public static void main(String[] args)

{

Pile p2 = new Pile();

try

{

System.out.println(p2.depiler());

}

catch(ExceptionPileVide e)

{

System.out.println(e);

}

}

}

Exercice 8.57 (Pile FIFO)

Une pile FIFO (qu’on peut aussi appeler une file) repond au protocole du ”Premier rentre, PremierSorti” ou en anglais ”First In, First Out” (d’ou FIFO). Le principe est simple : les donnees sontajoutees d’un ”cote” et lues de l’autre... Un bon schema valant mieux qu’un long discours :

Entree 99K 4 3 2 1 0 Sortie 99K

Pour expliciter le schema on peut dire que : la prochaine de donnee lue sera celle qui a pour index0 et la prochaine donnee inseree dans le pile recevra l’index 5. En clair, dans une pile FIFO, lesdonnees sont lues dans l’ordre de leur insertion.

Creer une classe Pile en java gerant une pile FIFO.

62

9 Le point de depart : JFrame

Une premiere fenetre.

import java.awt.Color;

import javax.swing.*;

public class Bonjour

{

public static void main(String[] args)

{

JFrame cadre = new JFrame("Ma premiere fenetre");

JLabel etiquette = new JLabel("Bonjour a tous!", JLabel.CENTER);

cadre.getContentPane().add(etiquette);

cadre.getContentPane().setBackground(Color.WHITE);

cadre.setSize(250, 100);

cadre.setVisible(true);

cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

a) appel de new JFrame(...) pour creer l’objet JFrame.

Si on etait, comme c’est souvent le cas, en train de definir une sous-classe de JFrame,l’appel du constructeur de JFrame serait cache dans une instruction super(...) ;

b) appel de setSize(...) pour donner une taille au cadre, sinon il sera reduit a quelquespixels.

A la place de setSize(...) on peut appeler la methode pack(), qui donne au cadre unetaille juste suffisante pour contenir les composantes qui lui sont ajoutes, mais il faut alorsque ces composants aient une taille minimum significative ; de plus, il faut appeler packapres avoir ajoute ces composants ;

c) appel de setVisible() pour faire apparaıtre le cadre parmi les autres eleements gra-phiques visibles a l’ecran et pour initier le thread (fil d’execution) charge de detecter ettraiter les actions de l’utilisateur sur le cadre.

d) L’instruction cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); permet determiner l’application lorsque l’utilisateur clique sur la case de fermeture de la fenetre.

Exercice 9.1

Ecrire une nouvelle version du programme precedent en definissant une sous-classe plutot qu’uneinstance de JFrame.

63

import java.awt.Color;

import javax.swing.*;

public class Bonjour2 extends JFrame

{

//Constructeur de la fenetre

public Bonjour2()

{

// A completer

}

public static void main(String[] args)

{

JFrame cadre = new Bonjour2();

}

}

10 Deux niveaux d’interface

10.1 Composants

Ceux sont les briques elementaires d’une interface, c’est principalement avec eux que l’utilisateur“dialogue”.

Exemples de composants :

— Bouton (JButton)

— Etiquette (JLabel)

— Champs de saisie (JTextField)

— Liste (JList)

La disposition des composants est geree par des LayoutManager

10.2 Contenants

Ils servent a organiser les composants. Un composant ne peut etre utilise que dans un contenant.

Exemples de contenants (containers) :

— contenants de haut-niveau

— JWindow (fenetre sans titre ni encadrement)

— JFrame (fenetre classique)

— JDialog (boite de dialogue)

— contenants intermediaires

— JPanel (simple panneau)

— JScrollPane (panneau avec barres de defilement)

— ...

64

10.3 Description de la JFrame

Les composants ne s’ajoutent a la Frame mais au Content Pane.

Voici deux fenetres.

import java.awt.*;

import javax.swing.*;

public class ExempleContentPane

{

public static void main(String args[])

{

// 1er cas, on utilise le ContentPane

JFrame frame1 = new JFrame("Ceci est une fenetre");

Container contentpane1 = frame1.getContentPane();

contentpane1.add(new JButton("Ceci est un bouton dans cette fenetre"),

BorderLayout.CENTER);

frame1.pack();

frame1.setVisible(true);

// 2eme cas, on cree un autre ContentPane

JFrame frame2 = new JFrame("Ceci est toujours une fenetre");

JPanel contentpane2 = new JPanel();

contentpane2.setBorder(BorderFactory.createTitledBorder("Ceci est un bord"));

contentpane2.add(new JButton("Ceci est un bouton dans cette fenetre"));

65

frame2.setContentPane(contentpane2);

frame2.pack();

frame2.setVisible(true);

}

}

11 Les gestionnaires de mise en forme

Un gestionnaire de mise en forme permet de placer des composants graphiques d’une certainefacon dans une fenetre.

Il existe 6 gestionnaires de mise en forme :

a) Le gestionnaire BorderLayout.

Il place les objets contre les bords ou au centre. C’est l’afficheur par defaut du panneaude contenu des JFrame, JDialog et JApplet.

b) Le gestionnaire FlowLayout.

Il place les objets sur des lignes successives comme le ferait un traitement de texte. Souventutilise pour des boutons. C’est l’afficheur par defaut associe aux JPanel.

c) Le gestionnaire CardLayout.

Il place les objets les uns sur les autres. Seul le sommet de pile est visible a un momentdonne.

d) Le gestionnaire GridLayout.

Il place les objets sur une grille dont on peut specifier le nombre de lignes et de colonnes.

e) Le gestionnaire BoxLayout.

Il place les composants sur une meme ligne ou une meme colonne.

Utiliser des Box nous permet d’avoir plusieurs BoxLayout dans un meme conteneur (dansle JFrame par exemple).

Les composants sont inseres :

— de gauche a droite pour le BoxLayout horizontal

— de haut en bas pour le BoxLayout vertical

Par defaut, les composants sont colles les uns aux autres. Pour les espacer, il faut insererdes reserves entre les composants. Il en existe 3 types :

— le Strut, qui ajoute un espace mesure en nombre de pixels. Le Strut est unidimen-sionnel : il existe un Strut horizontal et un Strut vertical

— le RigidArea, qui est equivalent a un couple de Strut horizontal/vertical

— le Glue, qui repousse les 2 composants voisins aussi loin que possible l’un de l’autre.

Par exemple :

JLabel nomLabel = new JLabel("Nom : ");

JTextField nomText = new JTextField(10);

66

Box hBox = Box.createHorizontalBox();

hBox.add(nomLabel);

hBox.add(Box.createHorizontalStrut(5));

hBox.add(nomText);

f) Le gestionnaire GridBagLayout.

Comme le GridLayout, ce gestionnaire permet de placer les composants sur une grille,mais avec plus de flexibilite.

Le GridBagLayout fonctionne comme un tableau dont les cellules peuvent etre fusionnees.

Le gestionnaire BorderLayout est utilise par defaut en dehors de toute precision.

Exercice 11.1

Reproduire les applications decrites par ces fenetres.

67

Exercice 11.2

Reproduire l’application decrite par cette fenetre.

12 Les evenements

Puisqu’un composant est visible sur un ecran, il est naturellement predestine a devenir la cibled’actions faites par l’utilisateur a l’aide de la souris, du clavier ou de tout autre organe de saisiedisponible.

Au moment ou elle est detectee par l’ordinateur, une action de l’utilisateur provoque la creationpar la machine Java d’un evenement, un objet qu’on peut imaginer comme un ≪ rapport≫ decrivant la nature et les circonstances de cette action ; on dit que le composant qui en a etela cible est la source de l’evenement en question.

Lorsqu’un evenement est creee, le composant qui en est la source a la charge de notifier cefait a tous les objets qui ont ete enregistre aupres de lui comme etant ≪ concernes ≫ par cetype d’evenements et souhaitant donc etre prevenus lorsqu’ils se produiraient. Bien entendu,≪ notifier un evenement ≫ c’est appeler une certaine methode, specifique de l’evenement.

Les objets qui demandent a recevoir les notifications des evenements d’un certain type doiventdonc posseder les methodes correspondantes ; on garantit cela en imposant que ces objets soientdes implementations d’interfaces ad hoc, nommeees XxxListener, ou‘ Xxx caracterise le typed’evenement considere : MouseListener, WindowListener, ActionListener, par exemple.

En resume : pour qu’un objet puisse recevoir les notifications d’une categorie Xxx d’evenementsil faut que sa classe implemente l’interface XxxListener ; cet objet peut alors etre enregistreaupres d’une source d’evenements Xxx en tant qu’auditeur (listener) des evenements Xxx.

Par consequent, si un objet est source d’evenements Xxx alors il doit posseder la methodeaddXxxListener grace a laquelle d’autres objets lui sont enregistres en qualite d’auditeurs deces evenements.

L’interface MouseListener

L’interface MouseListener permet a une classe de repondre aux evenements souris de base.Elle est definie dans le package java.awt.event qu’il faut donc importer. Elle contient lesmethodes suivantes :

public void mouseClicked(MouseEvent e) {}

//Invoked when the mouse has been clicked on a component.

68

public void mousePressed(MouseEvent e) {}

//Invoked when a mouse button has been pressed on a component.

public void mouseReleased(MouseEvent e) {}

//Invoked when a mouse button has been released on a component.

public void mouseEntered(MouseEvent e) {}

//Invoked when the mouse enters a component.

public void mouseExited(MouseEvent e) {}

//Invoked when the mouse exits a component.

Ces methodes ont comme parametre un objet de type MouseEvent ; celui-ci possede deuxmethodes getX() et getY() qui renvoient les coordonnees du point ou se trouve la souris.

L’interface ActionListener

Cette interface concerne des actions (avec la souris ou le clavier) sur un composant qui lestraduit en une commande de plus haut niveau, comme un choix dans une liste ou un menu,une pression sur un bouton, etc.

L’interface se compose d’une seule methode :

void actionPerformed(ActionEvent e)

appelee lorsqu’une action a ete faite (ce que ≪ action ≫ veut dire depend du composant : presserun bouton, cocher ou decocher une case a cocher, faire un choix dans un menu, etc.).

La classe ActionEvent contient la methode String getActionCommand(). Voici un exempled’utilisation :

JButton bouton = new JButton("Oui");

bouton.addActionListener(this);

add(bouton);

public void actionPerformed(ActionEvent e)

{

if (e.getActionCommand().equals("Oui"))

{

System.out.println("Il a dit oui");

}

}

Voici une autre maniere d’ecrire une classe fonctionnellement identique a la precedente, enutilisant les references des boutons plutot que leurs chaınes action command :

JButton bouton = new JButton("Oui");

bouton.addActionListener(this);

add(bouton);

69

public void actionPerformed(ActionEvent e)

{

if (e.getSource() == bouton)

{

System.out.println("Il a dit oui");

}

}

Exercice 12.1

Creer une application simple qui implemente l’interface MouseListener.

Exercice 12.2

Creer une application simple qui implemente l’interface ActionListener. Par exemple

le bouton +1 incremente le label central de 1 et le bouton -1 le decremente de 1.

Exercice 12.3

Creer l’application presentee ici.

Les boutons permettent de changer la couleur du fond.

Exercice 12.4

Creer l’application presentee ici.

Le bouton permet de calculer la moyenne des cases.

70

Exercice 12.5

Creer l’application presentee ici.

Exercice 12.6

Creer une application qui convertit des degres Celsius en degres Fahrenheit (et inversement).

Formules :

[◦C] =5 · ([◦F ]− 32)

9et [◦F ] = [◦C] ·

9

5+ 32

Exercice 12.7

Creer une application qui calcule la note d’un travail en fonction du nombre total de points N etdu nombre de points obtenus n.

Formule :

note =5 · n

N+ 1

Afficher, si possible, la note au centieme et au demi-point.

Exercice 12.8

Creer l’application presentee ici.

Exercice 12.9

Creer une calculatrice sommaire, cette application peut se presenter par exemple ainsi :

71

72