Vous êtes sur la page 1sur 14

ENSA-Fès – GTR2 Langage Java

TD 1 : Les classes

Exercice 1:

Ecrire une classe Personne permettant de décrire complètement une personne,


sachant que l'on souhaite avoir autant d'informations que dans la phrase suivante :

"M. Holly Pierre est né en 1965, il est célibataire."

Exercice 2:

Ajouter un constructeur à la classe Personne.

Exercice 3:

Ajouter, à la classe Personne, une méthode de nom retourneInfos. Cette méthode


doit retourner une chaîne de caractères similaire à la phrase donnée dans l’énoncé
de l'exercice 1.

Exercice 4:

Ecrire un programme qui déclare 3 variables de type Personne, crée 3 instances de


personne pour les affecter dans les variables et affiche les informations les
concernant.

Exercice 5:

Ajouter une méthode age qui renvoie l’âge de l'individu en fonction d'une année
donnée en paramètre.

Exercice 6:

Ajouter à la classe Personne un attribut conjoint et examiner les conséquences que


cela peut avoir sur l'ensemble du code.

Attention: la polygamie et la polyandrie sont interdites :-(

Exercice 7:

Ajouter une méthode marier(Personne p) qui permet de marier une personne à une
autre. Modifier la méthode retourneInfos de façon que le nom (traditionnel de la
femme devienne):

Pour simplifier : quand une femme se marie son nom devient : "[nom de l'époux]
née [nom de jeune fille]", par exemple : si Mlle Durant se marie avec M. Dupond,
son nom deviendra Mme "Dupond née Durant"

2016/2017 Page 1 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

Attention: cet exercice ne prétend pas représenter l'état actuel de la loi qui stipule
que le nom d'une femme ne change pas, mais qu'elle peut, si elle le désire,
substituer le nom de son marie au sien, ou accoler les deux noms. Mais cela ne fait
pas partie de l'exercice.

Exercice 8:

Ecrire une classe Etudiant qui hérite de Personne. Dans cette classe on ajoutera
les informations suivantes: numéro d'étudiant, année de première entrée à
l'université. Modifier la méthode retoureInfos pour prendre en compte ces
nouvelles informations lors de l'affichage.

2016/2017 Page 2 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD2 : Généalogie
On reprend l'exercice précédent sur les personnes.

Exercice 1 :

On veut maintenant être en mesure de déterminer si un individu est l'ancêtre d'une


personne donnée. Pour cela on ajoute un attribut Pere et Mere à chaque personne.

Ecrire le code du constructeur permettant de créer un objet de type personne en lui


passant son père et sa mère lors de l'initialisation (ou null si l'on ne connait pas le
parent).

Supposons que l'on veuille entrer l'ensemble de personnes suivant :

Mr Dupond Jean , de père INCONNU et de mère INCONNU


Mlle Durant Emilie, épouse de Dupond Jean, de père INCONNU et de mère
INCONNU
Mr Dupond Eric , de père Dupond Jean et de mère Durant Emilie
Mlle Holly Jeanne, épouse de Dupont Eric, de père INCONNU et de mère
INCONNU
Mlle France Sylvie, de père INCONNU et de mère INCONNU
Mr Dupond Yannick, de père Dupond Eric et de mère Holly Jeanne
Mlle France Brigitte, de père INCONNU et de mère France Sylvie
Mr Dupond Henri, de père Dupond Yannick et de mère France Brigitte

Donnez l'initialisation de ces instances.

Exercice 2 :

Ecrire le code de la méthode boolean estAncetre(Personne p) qui retourne vrai si


la personne courante est ancêtre de la personne p.

Remarque: p peut provenir de la branche paternelle ou de la branche maternelle à


chaque génération.

Exercice 3 :

On désire afficher l'arbre généalogique d'une personne. Par exemple celui de Mr


Dupond Henri.

Donnez le code de la méthode void afficherArbreGene() de la


classe Personne qui affiche l'arbre généalogique d'une personne.

Exercice 4 :

2016/2017 Page 3 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

Modifiez cette méthode (éventuellement en en créant d'autres) pour que l'arbre soit
bien indenté, c'est-à-dire que l'affichage donne ceci:
Mr Dupond Henri,
de père Dupond Yannick
de père Dupond Eric époux de Holly Jeanne
de père Dupond Jean époux de Durant Emilie
de mère Durant Emilie épouse de Dupond Jean
de mère Holly Jeanne épouse de Dupont Eric
de mère France Brigitte
de mère France Sylvie

2016/2017 Page 4 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD 3: Tableau et Surcharge
1 Tableau d'objets et surcharge

Exos 2: Définir une classe Point qui modélise un point dans un espace à 2
dimensions (on supposera que les coordonnées sont représentées sous forme
d'entiers). En plus des accesseurs cette classe doit fournir une
méthode distance telle que, si p et q sont des instances de Point :

p.distance(q) -> retourne la distance qui sépare les points p et q.


p.distance() -> retourne la distance de p par rapport à l'origine.

NB: Math.sqrt(double d) retourne la valeur de la racine carrée de d.

Exos 3: Définir une classe Polygone qui modélise un polygone dans un espace à 2
dimensions. Le nombre de cotés du polygone est donné en paramètre de
construction et ne pourra pas être changé par la suite, par contre les points
définissant les extrémités du polygone pourront être manipulés. Pour cela la classe
doit fournir les méthodes:

- int nbrCotes() , retourne le nombre de cotés du polygone.

- Point getPoint(int n) , retourne le point numéro n (si le polygone contient N


points on numérote les points de 0 a (N-1)).

- void changePoint(int n, Point p) et void changePoint(int n, int x, int


y) pour changer la valeur d'un point.

Remarque: on fera attention de NE PAS définir un attribut nbrCotes dans la


classe Polygone!

Exos 4: Ajouter à la classe Polygone la méthode perimetre qui calcule et retourne


la valeur du périmètre du polygone.

Exos 5: Ecrire un programme qui instancie un polygone à 6 cotés. Puis qui modifie
les coordonnées d'un des points extrémités choisi au hasard. Les nouvelles
coordonnées de ce point doivent chacune être tirées aléatoirement dans l'intervalle
[0;300]. L'opération est répétée avec un autre point jusqu'à ce que le périmètre du
polygone atteigne (ou dépasse) la valeur 600.
NB: La fonction Math.random() retourne une valeur décimale aléatoire comprise
dans l'intervalle [0;1[ .

2016/2017 Page 5 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

2 Tableau de type primitif

Exos 1: On veut coder le jeu du Morpion. Pour cela, écrivez le code de la classe
Morpion. Celle-ci doit posséder les méthodes suivantes :

- void nouvellePartie() : vide la grille du jeu.

- char joueurCourant() : retourne le symbole du joueur courant ('X' ou 'O').

- boolean jouer(int l,int c) : le joueur courant joue à la position (l,c), la


méthode retourne false si le coup n'est pas valide.

- boolean gagner() : retourne true ssi le dernier joueur a gagné.

- void affiche() : affiche la grille à l'écran en mode console, pour cela utiliser
les caractères: | - X et O.
Par exemple:

l\c 1 2 3
1 X| |
------
2 X|O|
------
3 O| |X

(NB: ce programme sera complété en TP).

2016/2017 Page 6 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD 4: Héritage
1 Héritage

Exercice 1: Ecrire une classe Triangle telle qu'il soit possible de créer un triangle
à partir de 3 Point (classe vue au TD4), et que l'on puisse à tout moment changer la
position d'un des sommets du triangle. On créera un constructeur Triangle(Point
p0, Point p1, Point p2).

Exercice 2: Ecrire la classe Quadrilatère de la même manière.

Exercice 3: Ecrire ensuite la classe Rectangle qui hérite de Quadrilatère. On


supposera que les rectangles issus de cette classe sont horizontaux. Définir une
méthode construire() dans Rectangle qui prend les points 0 et 2 (supposés être les
points opposés, haut gauche et bas droite) et qui en déduit les deux autres points
(dans l'ordre, haut droite et bas gauche).

Définir un constructeur de Rectangle(Point a, Point b) qui construit un Rectangle


à partir des deux points opposés a se trouve en haut à gauche, et en bas à droite.

Définir les méthodes hauteur(), largeur() et surface() dans Rectangle qui


retournent respectivement la hauteur, la largeur et la surface d'un rectangle.

Exercice 4: On voudrait calculer la surface des polygones, mais on ne sait le faire


que pour les Rectangles :-). On supposera que si l'on ne sait pas calculer la surface
d'un polygone cela donne -1. Donnez les méthodes surface() dans Polygone et
dans ses sous-classes dont on sait calculer la surface.

Exercice 5: Définir une classe EnsemblePolygone qui comprend un tableau de


polygones dont la taille maximale est définie lors de la création de cet ensemble.
Définir une méthode ajouterPolygone(Polygone pol) qui ajoute un polygone à cet
ensemble (à condition que la capacité de cet ensemble ne soit pas dépassé).

Définir une méthode sommePerimetres() qui retourne la somme de tous les


périmètres de chaque polygone du tableau.

Exercice 6: Redéfinir la méthode toString() des polygones de manière à ce que


chaque polygone affiche l'information suivante <classe de polygone>: <p0>, ...,
<pn>, où chaque point s'écrit (<x>,<y>) (on redéfinira ainsi la
méthode toString() de Point.

Exercice 7: Définir dans EnsemblePolygone, une méthode qui affiche tous les
polygones qu'il contient.

2016/2017 Page 7 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD 5: Static / Vector
Exercice 1: On veut modéliser un compte en banque, les informations
primordiales sont : le solde , le titulaire et le numéro de compte. Ecrire pour cela la
classe Compte correspondante (on reprendra les définitions données en cours). Le
constructeur doit prendre 2 paramètres : le solde initial et le propriétaire du compte
(une Personne, reprendre la classe Personne des TD précédent). Le numéro de
compte est affecté automatiquement et vous devez garantir que 2 comptes
différents auront toujours des numéros de compte distincts.

Créer une classe CompteCredit, sous classe de Compte qui permet de calculer les
intérêts à partir d'un taux d'intérêt qui par défaut est de 5% (il y a deux
constructeurs pour cette classe).

Créer une classe ComptePlacement sous classe de CompteCredit telle qu'on ne


puisse plus ajouter d'argent après sa création, le montant étant donné à la création.

Exercice 2: Créer une classe Banque qui permet de manipuler une liste de Compte
de tout type. Cette classe doit fournir les méthodes :

• boolean creerCompte(int type, int solde, Personne personne) où type est un


nombre qui représente un type de compte à créer: 0=Compte,
1=CompteCredit, 2=ComptePlacement.
• boolean supprimerCompte(int num)
• Compte getCompte(int num)
• Vector rechercheCompte(String nom) //retourne la liste de compte des
personnes de nom nom
• afficherSolde(String nom) // affiche tous les comptes (numéro et solde) des
personnes de nom nom.

NB:

La classe Vector : quelques éléments de cette classe.

Constructeur:
public Vector()

Méthodes:
public void add(Object o) -> ajoute o dans la liste
public boolean contains(Object o) -> true ssi o appartient à la liste
public Object get(int i) -> retourne l'élément à la position i
public int indexOf(Object o) -> retourne la position de o
public void insertElementAt(Object o, int i) -> insère o à la position i
public boolean isEmpty() -> true ssi la liste est vide
public void removeAll() -> vide la liste

2016/2017 Page 8 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

public boolean remove(Object o) -> supprime o


public boolean remove(int i) -> supprime l'élément a la position i
public int size() ->retourne la taille de la liste

Exercice 3: Mettre sous forme de diagramme UML l'ensemble des classes de ce


TD

2016/2017 Page 9 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD6 : Héritage et Interface

1 Héritage

Exercice 1: Ecrire une classe Triangle telle qu'il soit possible de créer un triangle
à partir de 3 Point (classe vue au TD4), et que l'on puisse à tout moment changer la
position d'un des sommets du triangle.

2 Interface

Exercice 2: Ecrire une interface Ordonnable qui possède la méthode:

public int getNum()

Exercice 3: Ecrire une classe ListeTrie qui modélise une liste d'objets
Ordonnables. La liste est triée par valeur croissante de getNum(). Cette classe doit
fournir les méthodes :

indexOf(int v) : retourne la position de l'élément de numéro v.


indexFor(int v) : retourne la position d'insertion de l'élément de
numéro v.
add(Ordonnable o) : pour ajouter un élément à la liste.
get(int v) : qui retourne l'élément de la liste qui a pour numéro
v.
remove(int v) et remove(Ordonnable o) : supprime un élément dans la liste.
size() : retourne la taille de la liste
elementAt(int p) : retourne l'élément situé à la positon p.

Exercice 4: Modifier la classe Compte du TD5 pour que celle-ci implémente


l'interface Ordonnable (getNum() renvoie le numéro du compte). Modifier la classe
Banque de sorte que la liste des comptes soit une ListeTrie.

2016/2017 Page 10 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD 8 : Les Exceptions

Exercice 1: Ecrire la méthode int moyenne(String[] lst) dans la


classe Traitement qui prend en argument un tableau de chaînes de caractères
contenant normalement des nombres entiers. On veut que toutes les chaînes qui ne
comprennent pas des nombres entiers soient éliminées du calcul et ne soit pas
prises en compte pour calculer la moyenne (on ne divise donc pas par lst.length,
mais par le nombre de nombres entiers contenus dans ce tableau).

Exercice 2: On veut maintenant que la méthode moyenne vue à l'exercice précédent


lève une exception de type TableauIncorrect si le tableau lst passé en argument de
la méthode comprend des valeurs 'null'.

Ecrire la classe d'exception TableauIncorrect et modifier la méthode moyenne pour


qu'elle lève cette exception si nécessaire.

Exercice 3: On veut maintenant pouvoir utiliser la méthode moyenne dans un


programme principal. Le tableau de chaînes de caractères correspond au tableau
passé en argument dans la méthode principale'main'. On veut que si une exception
est levée, on affiche un message à l'utilisateur lui indiquant que les arguments
étaient incorrects. Ecrire le programme principal correspondant.

2016/2017 Page 11 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

TD 9 - Gestion de comptes en banque

On désire créer un système de gestion de comptes en banque. Pour cela on suppose


que l'on a analysé le système et que le système se compose:

• D'une banque qui comprend un ensemble de clients.


• De personnes. Chaque personne est un client de la banque et connait ses
propres comptes.
• De comptes de diverses natures. On suppose qu'il existe des comptes
courants (standards, cf. cours) et des comptes livret qui offrent des intérêts
mais empêchent plus d'un retrait par mois.
• De guichets, ou bornes interactives, liés à une banque. Ces guichets sont des
points d'entrée pour un utilisateur. Un guichet est une classe qui sert
essentiellement à gérer l'interface entre l'utilisateur et la banque.

A partir d'un guichet, l'utilisateur entre son nom et son mot de passe. L'interface du
guichet lui retourne la liste de ses comptes, comme le montre la figure 1.

En cliquant sur l'un de ces comptes, on ouvre une fenêtre comprenant l'ensemble
des opérations que l'on peut faire sur un compte (déposer et retirer de l'argent). Il
suffit de mettre un montant dans le champ prévu à cet effet et de cliquer sur
l'opération correspondante. Le solde se met automatiquement à jour (cf. figure 2):

Figure 1 Figure 2

Exercice 1

2016/2017 Page 12 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

Le premier problème qui se pose lors de la réalisation d'une application un tant soit
peu plus importante que celles qui ont été abordées jusqu'à maintenant dans les TD
et TP, c'est la compréhension générale de l'architecture de l'application.

Le premier exercice consiste donc à déterminer l'architecture d'ensemble de


l'application en déterminant les classes, éventuellement les sous-classes, et
l'ensemble des relations qui existent entre ces classes. En UML ces relations
s'expriment sous la forme d'associations et d'agrégations. En termes
d'implémentation en Java, ces liens sont implémentés sous la forme d'attributs.

Dans ce premier exercice, on ne cherche pas à décrire les méthodes ni l'ensemble


des attributs de chaque classe, uniquement les classes, les relations d'héritage et les
relations entre classes.

Cette phase est très importante, car les exercices suivants en dépendent.

Exercice 2

Ecrire les classes Personne, Compte, CompteCourant, CompteLivret et Banque


avec leurs méthodes et leurs attributs sans tenir compte de la classe Guichet.

A la fin de cet exercice on doit disposer d'une application qui fonctionne sans
interface.

Exercice 3

Ecrire la classe Guichet en définissant les interfaces nécessaires à sa réalisation.


Pour implémenter la liste des comptes d'un utilisateur on utilisera la
classejava.awt.List.

Voici quelques notions pour utiliser une telle liste de sélection. Une liste est
simplement un composant graphique. Il suffit de lui ajouter les chaînes de
caractères correspondantes.
List lst = new List(4); // 4 rangées sont visibles.
lst.add("Mercury");
lst.add("Venus");
lst.add("Earth");
lst.add("Mars");
lst.add("Jupiter");
lst.add("Saturn");
lst.add("Uranus");
lst.add("Neptune");
lst.add("Pluto");
monPanel.add(lst);

Quand on double clique sur un des éléments de cette liste ou bien quand on appuie
sur return après avoir sélectionné un élément, la liste envoie un
messageactionPerformed(ActionEvent e), comme un bouton. Les méthodes int

2016/2017 Page 13 sur 14 M.BERRADA


ENSA-Fès – GTR2 Langage Java

getSelectedIndex() et String getSelectedItem() retournent respectivement


l'indice de l'item sélectionné et la chaîne de caractère sélectionnée.

2016/2017 Page 14 sur 14 M.BERRADA