Sunteți pe pagina 1din 12

TP JAVA

Bruno Bouzy bouzy@math-info.univ-paris5.fr 18 octobre 2002

Ce document est un sujet de TP de Java qui peut tre associ ou bien un cours de Java ou cours de Gnie Logiciel. Il a t mis au point suite aux enseignements de Java et Gnie Logiciel donn en MIAIF2, MST2, IASV lUfr de Mathmatiques et Informatique de luniversit Paris 5 entre 1997 et aujourdhui. Dans le cadre dun module de Gnie Logiciel lobjectif vis est : lcriture dun programme simple pour un utilisateur, la programmation dun modle UML trs simple, la mise en uvre dassociations entre instances. et lobjectif vis nest pas : lutilisation doutils de gestion de base de donnes. Dans le cadre dun cours de Java, lobjectif vis est la matrise de concepts Java suivants : contenu dune classe, constructeur, rfrences, proprit de classe (mot-cl static) ou proprit dinstance, la classe String et la classe Vector, chargement et sauvegarde sur fichiers. et les points suivants ne sont pas abords : visibilit des proprits, encapsulation des donnes, gnralisation, hritage, redfinition, utilisation dun environnement de programmation Java. Prrequis : connaissance du C ou C++, de UML ventuellement, un compilateur Java, ici javac, un interprteur Java, ici java du JDK. Ce document contient : un bref modle UML du programme final Stade, un TP premiers pas , un TP crer dtruire des instances avec interaction utilisateur , un TP associer dissocier des instances avec interaction utilisateur , un TP charger sauver des instances sur fichier .

Bruno Bouzy

TP Java page 1

18/10/02

SPECIFICATION UML Introduction Ce document est le rsum des Spcifications des Besoins du Logiciel STADE. Rappels : les diagrammes globaux du logiciel STADE Diagramme de gnralisation : Object

Stade

Joueur

But

Ballon

(nb : ce diagramme est donn titre de compltude car la gnralisation, ici en rteau, est simplissime) Diagrammes de classes Stade

0..1 Ballon

* Joueur

2 But

Ballon 0..1 entre-sortie> 0..1 But

0..1

possession<

Joueur

marque< *

(nb : un joueur peut possder le ballon qui peut tre possd par plusieurs joueurs (une mle ?), un ballon peut tre dans un but qui contient ventuellement un ballon, un joueur peut marquer entre 0 et plusieurs buts, un but est marqu par un joueur exactement).

Bruno Bouzy

TP Java page 2

10/18/02

TP JAVA PREMIERS PAS Crer une mini-application avec une seule classe Le but de ce paragraphe est dtre capable dcrire un programme qui saisit des informations et les affiche. Crer un fichier stade.java et crire le contenu suivant dans le fichier stade.java :
class Stade { public static void main (String args[]) { System.out.println("Projet stade"); } }

Pour afficher des informations lcran, Java dispose de la mthode println() de la classe Out. Que voyez-vous lexcution ? Insrer le fichier Keyboard.java dans votre projet et rajouter Keyboard.pause() afin dviter la disparition de la fentre dexcution : public static void main (String args[]) { System.out.println("Projet stade"); Keyboard.pause(); } Que voyez-vous lexcution ? Saisir des informations sur lentre standard Pour saisir des informations au clavier, Java dispose de la classe In. Mais celle-ci est complique pour tre utilise telle quelle. Modifier la mthode main() comme suit :
class Stade { public static void main (String args[]) { System.out.println("Projet stade"); System.out.println("Taper une chaine de caracteres:"); String s = Keyboard.getString(); System.out.println("La chaine lue est:\n<"+s+">"); System.out.println("Taper un entier:"); int i = Keyboard.getInt(); System.out.println("Le double de lentier lu est:" + 2*i); Keyboard.pause(); } }

la mthode

Maintenant vous savez faire un programme qui lit une chane de caractres ou un entier sur lentre standard et qui affiche une chane de caractres sur la sortie standard. Crer une mini-application avec 2 classes Le but de ce paragraphe est dtre capable dcrire un programme qui comprend 2 classes : une classe utilisatrice, la classe Stade, et une classe utilise, la classe Joueur. La classe utilisatrice lit des informations sur les proprits dune instance crer ; elle

Bruno Bouzy

TP Java page 3

10/18/02

cre linstance avec ses proprits ; elle imprime linstance sur la sortie standard. On suppose que la classe Joueur est dfinie comme suit :
Joueur int age String nom Joueur(String n, int a) String lireNom() int lireAge() imprimer()

Joueur(String n, int a) est un constructeur avec 2 arguments, le premier pour valoriser lattribut nom et le second pour valoriser lattribut age.

est une mthode de classe qui demande a lutilisateur de taper un nom de joueur au clavier et qui retourne cette chane. Cest une mthode quasi-identique a Keyboard.getString() ; ne pas confondre avec la mthode dinstance daccs lattribut nom quand celui-ci est priv. Tout au long de ces TPs, nous nutiliserons pas de mthode daccs aux attributs ; tous les attributs et toutes les mthodes sont publiques.
String lireNom() int lireAge() est une mthode de classe qui demande a lutilisateur de taper un ge de joueur au clavier et qui retourne cette chane. Cest une mthode quasi-identique Keyboard.getInt() ; ne pas confondre avec la mthode dinstance daccs lattribut age quand celui-ci est priv. imprimer()

est une mthode dinstance qui affiche les attributs du joueur lcran.

Crer un fichier Joueur.java qui correspond la spcification UML ci-dessus. Afin de tester la classe Joueur, modifier le programme principal comme suit :
public static void main (String args[]) { System.out.println("Projet stade"); String s = Joueur.lireNom(); int a = Joueur.lireAge(); System.out.println("s = <" + s + ">"); System.out.println("a = <" + a + ">"); Joueur j = new Joueur(s, a); System.out.println("Joueur j cree."); j.imprimer(); Keyboard.pause(); }

Remarquer que le programme demande dabord le nom et lage du joueur lutilisateur, puis connaissant les valeurs du nom et de lge, il cre une instance en appelant le constructeur de la classe Joueur avec ces valeurs. Remarquer que lors de lappel de lireNom et lireAge, aucune instance de joueur nexiste. Elles sont des mthodes de classe et pas des mthodes dinstance. Maintenant vous savez faire un programme qui lit des proprits dune instance dune classe, qui cre linstance et qui laffiche.

Bruno Bouzy

TP Java page 4

10/18/02

TP

JAVA : CREER DETRUIRE UTILISATEUR

INSTANCE

AVEC

INTERACTION

Introduction Ce TP reprend la suite du TP dans lequel le programme principal permettait de crer un joueur en demandant lutilisateur de taper le nom et lge du joueur au clavier. Ici, nous remplaons un joueur par des ballons. Nous allons crer une classe Ballon avec laquelle lutilisateur pourra non seulement crer des ballons identifis par une String, mais aussi les afficher et les dtruire. Il va donc tre ncessaire davoir un menu demandant laction a effectuer (crer, dtruire ou afficher) et un conteneur contenant les instances cres par lutilisateur.
static).

Le conteneur dinstances va tre de type Vector, et va tre un attribut de classe (mot-cl Cette classe est dfinie dans le package java.util.

Afficher un menu, saisir le choix de lutilisateur Ecrire un programme qui affiche le menu ci-dessous, prend la commande de lutilisateur au clavier, affiche un message choix n (n=1,2,3,0) et recommence tant que lutilisateur ne veut pas quitter le programme. 1. 2. 3. 0. crer un ballon dtruire un ballon afficher la liste des ballons quitter

Crer une instance par lintermdiaire du clavier et de lcran Enrichir le programme du TP prcdent en remplaant laffichage choix 1 par lappel la mthode creer_une_instance() de la classe Ballon. Pour cela, on pourra avoir une interface de la classe Ballon du type suivant :
class Ballon public public public public public public public } { String identificateur; // identifier un ballon int taille; // taille du ballon Ballon(String s, int t) {} // constructeur static String lireIdentificateur() {} // dialogue static int lireTaille() {} // dialogue String toString() {} // linstance en string static Ballon creer_instance() {} // dialogue puis new

String identificateur est un attribut permettant didentifier de manire unique une instance de la classe Ballon.

Bruno Bouzy

TP Java page 5

10/18/02

taille

est un attribut descriptif dune instance de la classe Ballon.

lireIdentificateur() est une mthode qui demande lutilisateur de rentrer un identificateur au clavier, qui le rcupre et qui la retourne. lireTaille()

est une fonction qui demande lutilisateur de rentrer une taille au clavier, qui le rcupre et qui le retourne.

Lobjectif de ces deux dernires mthodes est trs simple : retourner une valeur tape au clavier. Pour cette raison, on peut choisir de ne pas les mettre sous forme de mthodes explicites. Elles doivent tre excutes avant dappeler le constructeur. Ne pas confondre ces deux mthodes avec les mthodes daccs, classiques en POO, getIdentificateur() et getTaille() daccs aux attributs identificateur et nom lorsque ceux-ci sont privs.
Ballon(String s, int t) est le constructeur dune instance de la classe Ballon. On suppose que lon connat lidentificateur et la taille du ballon avant de lappeler. On passe en paramtres lidentificateur et la taille du ballon crer.

toString()

est la mthode de transformation dune instance en string. Par exemple, pour une instance dont lidentificateur vaut bienGonfl et dont la taille vaut 4, toString() peut donner par exemple : identificateur = bienGonfl taille = 4
Ballon creer_une_instance() est la fonction qui lireIdentificateur(), lireTaille(), Ballon(String,

contient les appels int) et toString(). Elle est appele lorsque lutilisateur tape 1 dans le menu Ballon. Elle fait exactement ce que faisait le programme principal du TP prcdent.

Afficher les instances lcran Enrichir le programme prcdent en remplaant laffichage choix 3 par laffichage du vecteur des instances de la classe Ballon. Pour cela, on ajoutera un attribut de classe mesInstances la classe Ballon. On pourra utiliser les classes prdfinies dans le paquetage java.util disponible en Java:
class Ballon { public static Vector mesInstances = new Vector() ; ... }

Bruno Bouzy

TP Java page 6

10/18/02

Dans ce cas se reporter la description de ces classes dans la documentation en ligne de Java. Pour utiliser correctement mesInstances, on fera alors par exemple : ajouter une instance dans mesInstances dans le constructeur :
mesInstances.addElement(this);

enlever une instance de mesInstances dans le destructeur :


mesInstances.removeElement(this);

Dtruire une instance par lintermdiaire du clavier et de lcran Enrichir le programme prcdent en remplaant laffichage choix 2 par lappel la fonction membre detruire_une_instance() de la classe Ballon. Pour cela, on pourra ajouter les membres suivants la classe Ballon :
class Ballon { public void detruire() {} // destructeur public static Ballon getInstance(String s) {}//retourne le ballon public static boolean detruire_instance() {} // dialog + detruire }

detruire() est le destructeur dune instance de la classe Ballon. NB : les destructeurs ne sont pas ncessaires en Java. Cependant, pour plus de clart, detruire() qui enlve la rfrence linstance correspond un destructeur.

fonction qui retourne linstance de la classe la String passe en paramtre. Elle est appele chaque fois que lon cherche une instance connaissant son identificateur. Elle retourne null si aucune instance ne correspond la String passe en paramtre.
boolean detruire_une_instance() est la fonction qui contient les appels lireIdentificateur(), getInstance(), detruire() et retourne true si destruction est faite et false sinon. Elle est appele lorsque lutilisateur tape 2 dans

Ballon getInstance(String s) est la Ballon possdant un identificateur gal

la le

menu Ballon .

Bruno Bouzy

TP Java page 7

10/18/02

TP JAVA ASSOCIER DISSOCIER AVEC INTERACTION UTILISATEUR Introduction Ce TP reprend la suite du TP dans lequel lutilisateur pouvait crer, dtruire, afficher les instances dune classe (la classe Ballon). Ici, nous allons permettre en plus lutilisateur dassocier et dissocier des instances appartenant des classes diffrentes. Pour cela, il nous faut plusieurs classes et un menu gnral permettant de diriger lutilisateur vers la classe de son choix. Ce TP suppose quune classe But et que la classe Joueur ont t construites sur le principe de la classe Ballon. Pour commencer, il y a donc une partie importante ddition et de couper-coller faire dans ce TP. Ce TP suppose aussi que la classe Vector est connue (cf TP prcdent). Ensuite seulement, la partie intressante du TP (associer, dissocier des instances) pourra tre aborde. Plusieurs classes... Ecrire un programme qui gre plusieurs classes. Par exemple les classes Joueur, Ballon et But. On pourra identifier un but par la minute a la quelle il a t marqu et on pourra dcrire un but avec la distance laquelle il a t marqu.
public int minute; public int distance;

Le programme affichera le menu ci-dessous : 1. 2. 3. 0. Joueur Ballon But Quitter

Puis, par exemple, si lutilisateur a tap 2, il affichera le menu : 1. 2. 3. 0. crer un ballon dtruire un ballon afficher tous les ballons prcdent

Associer deux instances une une Enrichir le programme prcdent en rajoutant la ligne suivante dans les menus Ballon et : 4. associer un ballon un but.

But

Bruno Bouzy

TP Java page 8

10/18/02

En particulier, on ajoutera un attribut et deux mthodes la classe Ballon :


public But monBut; public static void associer_but_instance() {} // dialog + associer public void associer_but(But b) {} // assoc ballon but

Analogue pour la classe But :


public Ballon monBallon; public static void associer_ballon_instance() {} //dial + assoc public void associer_ballon(Ballon b) {} // assoc but ballon

Associer une instance avec plusieurs instances Enrichir le programme prcdent en rajoutant la ligne suivante dans le menu Ballon : 5. associer un ballon des joueurs. Et la ligne suivante dans le menu Joueur: 5 associer un joueur un ballon.

En particulier, on ajoutera un attribut a la classe Ballon :


public Vector mesJoueurs = new Vector();

Et un attribut la classe Joueur :


public Ballon monBallon ;

Remarquer quil est ncessaire dutiliser un attribut de type Vector dans la classe Ballon pour associer des joueurs et un ballon car la spcification du projet STADE indique que lordre de multiplicit de lassociation est 0 ou plusieurs . Par contre, cela nest pas ncessaire dans lautre sens. Dissocier des instances Enrichir le programme prcdent en rajoutant la ligne suivante dans le menu Ballon : 6. dissocier un ballon dun joueur. Et la ligne suivante dans le menu Joueur: 6 dissocier un joueur dun ballon.

Complter votre programme pour que tout lien puisse tre dissoci.

Bruno Bouzy

TP Java page 9

10/18/02

Imprimer des instances avec leurs liens Pour visualiser les instances du programme, il est ncessaire davoir 2 mthodes qui transforment une instance en String. Une premire mthode qui transforme une instance en une chane de caractres identifiant linstance (nous lappellerons toIdent()) et une seconde mthode qui transforme linstance en une chane de caractres qui contient les noms des attributs de linstance avec leur valeur, toString(). Ecrire la mthode toString() et la mthode toIdent() pour toutes les classes de votre application. Par exemple, pour la classe Ballon, le corps de ces mthodes est :
public String toString() { if (monBut!=null) return "Identificateur " + identificateur + "\n" + "taille " + taille + "\n" + "But " + monBut.identificateur + "\n" + "Joueurs:\n" + mesJoueurs.toIdent(); else return "Identificateur " + identificateur + "\n" + "taille " + taille + "\n" + "But " + "null" + "\n" + "Joueurs:\n" + mesJoueurs.toIdent(); } public String toIdent() { return identificateur; }

Rendre le programme correct, robuste et plus facile utiliser A ce niveau du TP, vous avez une premire version du programme qui permet de crer, dtruire, associer, dissocier et afficher les instances, sans plus. Vous pouvez rendre robuste votre programme en vrifiant les tests suivants : crer et associer des instances, dtruire lune delle. afficher les instances non dtruites. Que se passe-t-il ? Corriger le programme. associer une instance avec une instance dj associe : le programme doit refuser lassociation si elle est un--un. lutilisateur veut dtruire, associer ou dissocier une instance, le programme propose-t-il une liste des instances possibles ? Si la rponse est ngative, amliorer le programme pour quil propose des listes dinstances lutilisateur lorsque cela est ncessaire.

Bruno Bouzy

TP Java page 10

10/18/02

TP JAVA CHARGER SAUVER SUR FICHIER Introduction Ce TP reprend la suite du TP dans lequel lutilisateur pouvait crer, dtruire, associer, dissocier des instances de diffrentes classes. A chaque session, lutilisateur devait repartir de zro. Sil avait cr des instances la session prcdente, il ne les retrouvait pas la session suivante. Le but de ce TP est donc de sauver et charger sur fichier les informations contenues dans une classe. Ainsi, au dbut du nouvelle session, lutilisateur pourra repartir des donnes de la fin de la session prcdente. Ici, on suppose que la classe Joueur contient des joueurs. La classe contient une liste des joueurs de type Vector.
public class Joueur{ public static Vector mesInstances = new Vector() ; public String nom; public int age; }

Ouvrir et crire dans un fichier les instances dune classe Pour ouvrir un fichier (et pouvoir y crire des informations de manire souple ensuite), on appelle successivement des constructeurs des classe File, FileOutStream et DataOutputStream.
try{ File fjoueurs = new File("Joueur.txt"); FileOutputStream fosJoueurs=new FileOutputStream(fjoueurs); DataOutputStream dosJoueurs=new DataOutputStream(fosJoueurs); Joueur.sauverInstances(dosJoueurs); } catch(IOException e) { System.out.println("Problemes de Fichiers!"); }

Pour crire effectivement dans le fichier, on utilise les mthodes writeInt(), writeUTF() de la classe DataOutputStream.
public static void sauverInstances(DataOutputStream dos) IOException{ dos.writeInt(mesInstances.size()); for(int i=0;i<mesInstances.size();i++){ Joueur j =(Joueur)mesInstances.elementAt(i); dos.writeUTF(j.nom); dos.writeInt(j.age); } } throws

Lire un fichier contenant les instances dune classe Pour ouvrir un fichier (et pouvoir y lire des informations de manire souple ensuite), on appelle successivement des constructeurs des classe File, FileInputStream et DataInputStream.
File sauvegardeJoueurs = new File("Joueur.txt"); FileInputStream fisJou = new FileInputStream(sauvegardeJoueurs); DataInputStream disJou = new DataInputStream(fisJou); Joueur.chargerInstances(disJou);

Bruno Bouzy

TP Java page 11

10/18/02

Pour lire des informations sauvegardes de la manire dcrite ci-dessus dans un fichier, on utilise les mthodes readInt(), readUTF() de la classe DataInputStream.
public static void chargerInstances(DataInputStream IOException{ int tailleFichier = dis.readInt(); for(int i=0;i<tailleFichier;i++){ String n = dis.readUTF(); int a = dis.readInt(); Joueur j = new Joueur(n, a); } } dis) throws

Intgrer les chargement et sauvegarde dobjets sur fichiers avec les TP prcdents Le but de ce paragraphe est de mettre au point un programme qui : 1) lit des informations dans un fichier propos dune classe et cre les instances de cette classe en mmoire. 2) lit des informations tapes au clavier par lutilisateur et cre dautres instances de la classe en mmoire (cf. TP prcdents). 3) crit la liste des instances de la classe dans le fichier. 2 et 3 ont dj t faits dans les TP prcdents, il suffit donc de faire 1 et 3. Rajouter la sauvegarde du fichier la fin du programme (3). Mettre au point ce programme. Rajouter le chargement du fichier au dbut du programme (1). Mettre au point ce programme en enrichissant le fichier chaque excution avec de nouvelles donnes. Attention ! lorsque vous mettez au point ce programme, une fausse manipulation peut vous craser le fichier Joueur.txt, donc sauvez Joueur.txt avant chaque nouvelle excution Voil, vous savez dsormais utiliser des fonctions qui permette de sauver des instances dans un fichier et de les charger depuis un fichier.

Ecrire/Lire des fichiers contenant des instances associes de classes diffrentes Lorsque les instances sont associes dautres le mcanisme prcdent doit tre amlior avec deux passes. En effet lors de la lecture du fichier des instances, les instances associes une instance ne sont pas ncessairement dj construites. Il faut donc une premire passe de lecture des fichiers en construisant les instances sans les associations, puis une deuxime passe sans la construction mais avec les associations.

Bruno Bouzy

TP Java page 12

10/18/02