Suport d'Exercices POO Java V2

41
Support d’exercices M.Youssfi 1/41 Support d’exercices POO Java : Objet Class Héritage Accessibilité Polymorphisme Exceptions Entrées Sorties Interfaces graphiques Par M.Youssfi

description

Suport d'Exercices POO Java V2 Suport d'Exercices POO Java V2 Suport d'Exercices POO Java V2 Suport d'Exercices POO Java V2 Suport d'Exercices POO Java V2swing exception serialisation

Transcript of Suport d'Exercices POO Java V2

Page 1: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

1/41

Support d’exercices

POO Java :

Objet

Class

Héritage

Accessibilité

Polymorphisme

Exceptions

Entrées Sorties

Interfaces graphiques

Par M.Youssfi

Page 2: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

2/41

Première Application :

public class PremierProgramme { public static void main(String[] args) { System. out.println("First Test"); } }

� Lancer un éditeur de texte ASCII et Ecrire le code source de ce programme.

� Enregistrer ce fichier dans un nouveau répertoire c :\exojava sous le nom PremierProgramme.java

� Compiler ce programme sur ligne de commande Dos : c:\exojava>javac PremierProgramme.java

� Corriger les Erreurs de compilation � Exécuter le programme sur ligne de commande

c:\exojava>java PremierProgramme

Page 3: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

3/41

Première Application graphique import javax.swing.*; import java.awt.FlowLayout; public class FirstGraphicApp { public static void main(String[] args) { // Créer une nouvelle fenêtre JFrame jf= new JFrame( "Titre" ); //Créer les composants graphiques JLabel l= new JLabel( "Nom:" ); JTextField t= new JTextField(12); JButton b= new JButton( "OK" ); //Définir une technique de mise en page jf.setLayout( new FlowLayout()); //Ajouter les composants à la fenêtre jf.add(l);jf.add(t);jf.add(b); //Définir les dimensions de la fenêtre jf.setBounds(10, 10, 400, 400); //Afficher la fenêtre jf.setVisible( true ); } }

Page 4: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

4/41

Première Applet java import java.applet.Applet; import java.awt.*; public class FirstApplet extends Applet{ public void init(){ add( new Label( "Nom:" )); add( new TextField(12)); add( new List()); add( new Button( "OK" )); } public void paint(Graphics g) { g.drawRect(2, 2, 400, 300); } }

� Rédiger le programme source. � Enregistrer le fichier sous le nom FirstApplet.java � Compiler le programme source et corriger les erreur s. � Créer un page HTML qui affiche l ’applet sur un nav igateur web:

<html> <body> <applet code="FirstApplet.class" width="500" height ="500"></applet> </body> </html>

� Vous pouvez également AppletViewer.exe pour tester l ’applet : C:\exojava>appletviewer page.htm

Page 5: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

5/41

Applet Java avec gestion des événements

import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class DeuxiemeApplet extends Applet implements ActionListener { // Déclarer etcréer les composants graphiques Label lNom=new Label( "Nom:" ); TextField tNom=new TextField(12); List listNoms =new List(); Button b=new Button( "OK" ); // Initialisation de l'applet public void init() { // Ajouter les composants à l'applet add( lNom);add( tNom);add( listNoms );add( b); // En cliquant sur le bouton b le gestionnaire // des événnements actionPerformed s'exécute b.addActionListener( this ); } //Méthode qui permet de gérer les événements public void actionPerformed(ActionEvent e) { if (e.getSource()== b){ // Lire le contenu de la zone de texte String nom= tNom.getText(); // Ajouter ce contenu dans la liste listNoms .add(nom); } } }

Page 6: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

6/41

Série N°1 : Exercices Objet Classe

Exercice 1 : Modélisation d’un segment à une dimension

Un segment est défini par la valeur de ses deux extrémités extr1 et extr2. Pour créer un segment, il faut préciser les valeurs de extr1 et extr2. Les opérations que l’on souhaite exécuter sur le segment sont :

• ordonne() : méthode qui permet d’ordonner extr1 et extr2 si extr1 est supérieur à extr2 • getLongueur() : méthode qui retourne la longueur du segment. • appartient(int x) : retourne si x appartient au segment ou non. • toString() : retourne une chaîne de caractères de type SEGMENT[extr1,extr2]

1- Faire une représentation UML de la classe Segment. 2- Implémenter en java la classe Segment 3- Créer une application TestSegment qui permet de :

a. Créer objet de la classe Segment avec les valeurs extr1=24 et extr2=12. b. Afficher l’état de cet objet en utilisant la méthode toString(). c. Afficher la longueur de ce segment. d. Afficher si le point x=15, appartient à ce segment. e. Changer les valeurs des deux extrémités de ce segment. f. Afficher à nouveau la longueur du segment.

Exercice 2 : Segment à deux dimensions.

Un segment est défini par deux points p1 et p2. Chaque point est défini par son abscisse x et

son ordonnée y. Dans ce problème, nous allons commencer tout d’abord par définir la classe Point définie par :

• Les attributs : x et y de type int • Un constructeur qui permet de définir les valeurs de x et de y. • Une méthode toString() qui retourne une chaîne de caractères de type POINT(x,y).

Ensuite on définit la classe Segment2D par : • Les attributs p1 et p2 qui représentent les deux points des deux extrémités du segment. • Pour créer un Segment2D, il faut préciser les deux points p1 et p2. • Les opérations que l’on souhaite exécuter sur un Segment2D sont :

o getLongueur() : retourne la longueur du segment. o toString() : retourne une chaîne de caractères de type SEGMENT[P1(x,y)|P2(x,y)] o appartient(Point p) : retourne si le point p appartient au segment ou non.

1- Faire une représentation du diagramme de classes. 2- Implémenter la classe Point.java 3- Implémenter la classe Segment2D.java 4- Créer une application TestSegment2D qui permet de :

a. Créer deux points. p1(10,20) et p2(50,60) b. Créer un objet de la classe Segment2D en utilisant les deux points créés.

P1(x, y)

P2(x, y)

extr1 extr2

Page 7: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

7/41

c. Afficher l’état de ce segment en utilisant la méthode toString() d. Afficher la longueur de ce segment. e. Afficher si le point p(22,33) appartient à ce segment.

Exercice 3 : Modélisation objet d’un nombre complexe. Un nombre complexe est défini par sa partie réelle « re » et sa partie imaginaire « im ». Pour créer un nombre complexe, il faut préciser les valeurs initiales de re et im. Les opérations que l’on souhaite exécuter sur le nombre complexe sont :

• getModule() : retourne le module du nombre complexe • getArgument() : retourne l’argument du nombre complexe. • somme(Complexe c) : retourne un nombre complexe qui représente la somme du nombre

complexe courant et le nombre complexe c. • toString() : retourne une chaîne de caractères de type re+im i

1- Faire une représentation UML de la classe Complexe 2- Implémenter la classe Complexe.java 3- Créer une application qui permet de tester la classe complexe :

a. Créer un nombre complexe c1=5+6 i b. Afficher l’argument et le module de ce nombre complexe. c. Créer un nombre complexe c2=3-2 i d. Afficher la somme du nombre complexe c1 et c2.

Exercice 4 :

Une cercle est défini par :

� Un point qui représente son centre : centre(x,y) � Son rayon r

On peut créer un cercle de deux manières :

� Soit en précisant son centre et son rayon � Soit en précisant son centre et un point du cercle.

Les opérations que l’on souhaite exécuter sur un cercle sont :

� getPerimetre() : retourne le périmètre du cercle � getSurface() : retourne la surface du cercle. � appartient(Point p) : retourne si le point p appartient ou non au cercle. � toString() : retourne une chaîne de caractères de type CERCLE(x,y,R)

1- Etablir le diagramme de classes 2- Créer la classe Cercle en exploitant les classes Point et Segment2D de l’exerci 3- Créer une application qui permet de :

a. Créer un cercle défini par le centre c(100,100) et de rayon r=50 b. Créer un cercle défini par le centre c(130,100) et de rayon r=40 c. Afficher le périmètre et le rayon des deux cercles. d. Afficher si le point p(120,100) appartient à l’intersection des deux cercles ou non.

C(x,y)

P2(x,y) R

Page 8: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

8/41

Correction de la série N°1 : Exercice 1 :

1- Diagramme de classes :

2- Structure du projet :

Page 9: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

9/41

3- Implémentation java de la classe Segment :

package fig; public class Segment { public int extr1 ; public int extr2 ; // Constructeur public Segment( int a, int b){ extr1 =a; extr2 =b;ordonne(); } public void ordonne(){ if ( extr1 >extr2 ){ int z= extr1 ; extr1 =extr2 ; extr2 =z; } } public int getLongueur(){ return ( extr2 - extr1 ); } public boolean appartient( int x){ if ((x> extr1 )&&(x< extr2 )) return true ; else return false ; } public String toString(){ return ( "segment[" +extr1 +"," +extr2 +"]" ); } }

Page 10: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

10/41

4- Application :

package test; import java.util.Scanner; import fig.Segment; public class Application { public static void main(String[] args) { Scanner clavier= new Scanner(System. in); System. out.print( "Donner Extr1:" ); int e1=clavier.nextInt(); System. out.print( "Donner Extr2:" ); int e2=clavier.nextInt(); Segment s= new Segment(e1, e2); System. out.println( "Longueur du" +s.toString()+ " est :" + s.getLongueur()); System. out.print( "Donner X:" ); int x=clavier.nextInt(); if (s.appartient(x)== true ) System. out.println(x+ " Appartient au " +s); else System. out.println(x+ " N'appartient pas au " +s); } } Exécution :

Donner Extr1:67 Donner Extr2:13 Longueur dusegment[13,67] est :54 Donner X:7 7 N'appartient pas au segment[13,67]

Page 11: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

11/41

Corrigé des autres exercices :

Page 12: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

12/41

Page 13: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

13/41

Object, Classe, Héritage, Accessibilité et Polymorphisme

A- Questions de concepts

1. Par quoi est caractérisé un objet. 2. Quelle est la particularité des membres statiques d’une classe. 3. Quelle est la différence entre une classe abstraite et une interface. 4. Pour quelles raisons, on déclare une variable ou une méthode de type final. 5. Quelle est la différence entre les autorisations private, protected et package. 6. Donner une définition des concepts suivants :

a. Classe abstraite b.Interface c.Classe final d.Méthode abstraite. e. Variable transient.

B- Exercice

On souhaite créer une application java qui permet de calculer de coûts de transport de marchandises. Les marchandises transportées sont des instances de la classe Marchandise définie par :

• Les attributs numéro, poids et volume • Un constructeur avec paramètre et un autre sans paramètre • Une méthode toString • Les getters et setters

Une cargaison peut transporter plusieurs marchandises. Il existe deux types de cargaisons : Routière et Aérienne. La classe abstraite Cargaison est définie par la distance sur laquelle elle est transportée (distance du parcours) qui est connue au moment de se création et un vecteur de marchandises. Les opérations de cette classe sont :

• Une méthode qui permet d’ajouter une marchandise au vecteur des marchandises. • Une méthode qui permet d’afficher toutes les marchandises. • Une méthode abstraite cout () qui permet de retourner le coût de la cargaison. • Une méthode qui permet de retourner une marchandise sachant son numéro.

Une cargaison aérienne est une cargaison dont le cout est calculé selon la formule suivante :

• cout=10 x distance x poids total des marchandises si le volume total est inférieur à 80000 • cout=12 x distance x poids total des marchandises si le volume total est supérieur ou égal à

80000 Une cargaison routière est une cargaison dont le cout est calculé selon la formule suivante :

• cout=4 x distance x poids total si le volume total est inférieur à 380000 • cout=6 x distance x poids total si le volume total est supérieur ou égale à 380000

Questions : 1- Créer un diagramme de classe simplifié (Mentionner uniquement les attributs ) 2- Ecrire le code java de la classe Marchandise 3- Ecrire le code java de la classe Cargaison 4- Ecrire le code java de la classe CargaisonRoutière 5- Ecrire le code java de la classe CargaisonAérienne 6- Ecrire le code java d’une application qui permet de :

a. Créer une cargaison routière b. Ajouter la cette cargaison 3 marchandises c. Afficher toutes les marchandises de cette cargaison d. Afficher le cout de cette cargaison e. Créer une cargaison aérienne f. Afficher le cout de cette cargaison

Page 14: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

14/41

TD de synthèse COO et POO java Nous souhaitons concevoir et implémenter une application orientée objet qui permet de gérer un cinéma. Le cinéma contient un ensemble de salles. Chaque salle est définir par un numéro, un nom et le nombre de places qu’elle offre. Il existe deux types de salles les salles normales et les salles VIP. Le prix d’une place est défini en fonction du type de salle. Nous supposons que le prix d’une place dans salle normale est fixé à 30 DH alors que le prix d’une place dans une salle VIP est fixé à 60 DH. Le cinéma mémorise également un ensemble de films. Chaque film est défini par son titre et son réalisateur. Le cinéma mémorise également les séances des projections. Chaque séance de projection concerne un film et se déroule dans une salle. Pour chaque séance de projection, on doit mémoriser la date de projection ainsi que le nombre de places vendues. Nous prévoyons également de définir dans la classe Séance une méthode qui permet de ventre un certain nombre de places. Cette application peut être exploitée par un utilisateur, un vendeur et l’administrateur. Un utilisateur peut effectuer les opérations suivantes :

– Consulter un film sachant son titre. – Consulter les films dans le titre contient un mot clé. – Consulter une salle sachant son numéro – Consulter les films des séances programmées. – Acheter une place, si elle est disponible, pour un film donné.

Un vendeur peut effectuer toutes les opérations qu’un utilisateur peut effectuer. En plus, il peut effectuer l’opération suivante :

– Vendre un certain nombre de places pour un film donné. Un administrateur doit pouvoir effectuer les opérations suivantes :

– Ajouter un nouveau film – Ajouter une novelle salle – Ajouter une nouvelle séance. – Consulter le chiffre d’affaire (Total des prix des places vendues de toutes les séances) – Consulter le taux de remplissage pour un film donné – Charger les films à partir d’un fichier texte. – Sérialiser les données du cinéma.

Le vendeur et l’administrateur doivent s’authentifier avant toute opération. Travail à faire :

1- Etablir un diagramme Use Case pour ce problème 2- Etablir un diagramme de classes qui montre les structures de données manipulées par le

système ainsi que les méthodes à implémenter. Les méthodes d’accès aux attributs (Getters et Setters) ne seront pas représentées. La classe Cinema devrait implémenter les trois interfaces IUserCinema, IVendeurCinema et IAdminCinema

3- Implémenter, en java, les classes Salle, SalleNormale,SalleVIP, Film et Seance 4- Ecrire le code java des trois interfaces IUserCinema, IVendeurCinema et IAdminCinema. 5- Ecrire le code java de la classe Cinema. Nous supposons que les films sont stockés dans un

fichier nommé « cinema.txt ». chaque ligne de ce fichier contient le titre du filme et le réalisateurs séparés par un point virgule « titre;réalisaeur »

6- Créer un diagramme de séquence qui permet de traduire , dans une application, les opérations suivantes :

a. Créer un nouvel objet Cinema. b. Charger les films à partir d’un fichier texte. c. Ajouter un nouveau film. d. Ajouter une nouvelle salle. e. Ajouter une nouvelle séance concernant le film « X3D » dans la salle 4. f. Consulter le chiffre d’affaire g. Consulter le taux de remplissage pour le film « X3D » h. Sérialiser les données du cinéma.

7- Ecrire le code java d’une application qui implémente le diagramme de séquence précédent

Page 15: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

15/41

8- Créer une application graphique SWING qui permet de saisir un mot clé et qui affiche les films dont le titre contient ce mot clé. On suppose que les films sont stockés dans une base de données

Page 16: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

16/41

TD de Synthèse POO JAVA Objet, Classe, Héritage, Encapsulation, Polymorphisme

Collection, Exceptions, Entrées Sorties, Interface graphiques

Problème : On souhaite créer une application java qui permet gérer une société de transport de cargaisons transportant des marchandises. La société gère un ensemble de cargaisons. Chaque cargaison contient plusieurs marchandises. Chaque marchandise est définie par son numéro, son poids et son volume. Il existe deux types de cargaisons : Routière et Aérienne. Chaque cargaison est définie par sa référence et sa distance de parcours. Le cout de transport d’une cargaison est calculé en fonction du type de la cargaison. Pour une cargaison aérienne est une cargaison dont le cout est calculé selon la formule suivante :

� cout=10 x distance x poids total des marchandises si le volume total est inférieur à 80000

� cout=12 x distance x poids total des marchandises si le volume total est supérieur ou égal à 80000

Une cargaison routière est une cargaison dont le cout est calculé selon la formule suivante : � cout=4 x distance x poids total si le volume total est inférieur à 380000 � cout=6 x distance x poids total si le volume total est supérieur ou égale à 380000

Pour chaque cargaison, on souhaite ajouter une marchandise, supprimer une marchandise, consulter une marchandise sachant son numéro, consulter toutes les marchandises de la cargaison, consulter le poids total de la cargaison, consulter le volume total de la cargaison et consulter le cout de la cargaison. Cette application peut être utilisée par les clients et les administrateurs. Le client peut effectuer les opérations suivantes :

� Consulter une cargaison sachant sa référence. � Consulter une marchandise sachant son numéro. � Lire le fichier Cargaisons. � Consulter toutes les cargaisons.

L’administrateur peut effectuer toutes les opérations effectuées par le client. En plus, il peut : � Ajouter une nouvelle cargaison. � Ajouter une marchandise à une cargaison. � Supprimer une cargaison � Enregistrer les cargaisons dans un fichier.

Toutes les opérations nécessitent une authentification Questions :

1- Etablir un diagramme Use case UML. 2- Etablir le diagramme de classes en prenant en considération les critères suivants.

� La classe SocieteTransport devrait implémenter les deux interfaces IClientTransport et IAdminTranport déclarant, respectivement les opérations relatives aux rôles Client et Admin.

� Dans une première implémentation de SocieteTransport, on suppose que les cargaisons sont stockées dans une liste de type HashMap de la classe SocieteTransport.

� Dans une deuxième implémentation, nous supposerons que les cargaisons et les marchandises sont stockées dans une base de données relationnelle.

Page 17: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

17/41

� L’association entre cargaison et Marchandise est bidirectionnelle. 3- Ecrire le code java des classes entités Marchandise, Cargaison, CargaisonRoutière et

CargaisonAérienne 4- Ecrire le code java des deux interfaces IClientTransport et IAdminTransport 5- Créer une première implémentation java de ces deux interfaces 6- Etablir un diagramme de séquence puis créer une application java de type console qui

permet de réaliser les opérations suivantes : � Créer une instance de SocieteTransport pour un administrateur. � Ajouter trois cargaisons routières et une cargaison aérienne à société de transport : � « CR1 », « CA1 » et « CR2 » � Ajouter 3 marchandises à la cargaison dont la référence est CR1 (Numéros 1, 2, 3) � Ajouter 2 marchandises à la cargaison dont la référence est CA1 (Numéros 4,5) � Afficher toutes les informations concernant la cargaison CR1 � Afficher toutes les informations concernant la marchandise 3. � Sérialiser les données dans le fichier « transport1.data»

7- Etablir un diagramme de séquence puis créer une deuxième application java de type console qui permet de réaliser les opérations suivantes : � Créer une instance de la classe SocieteTransport pour un client. � Charger les données à partir du fichier « transport1.data » � Afficher toutes les informations concernant la cargaison CA1

8- Créer une application SWING qui permet la saisie, l’ajout, la suppression, la consultation des données de l’application.

9- Etablir un modèle logique de données relationnel relatif au diagramme de classe. 10- Créer la base de données MYSQL. 11- Créer une nouvelle implémentation des deux interfaces pour une gestion de données

stockées dans la base de données en faisant le mapping objet relationnel. Trouver une solution qui permet à l’application de changer l’implémentation de

SocieteTransport, sans modifier le code source de l’application. Autrement dit, l’application doit être fermée à la m

Page 18: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

18/41

ANNEXES Dans cette annexe, nous vous donnons quelques exemples de code java des problèmes traités en TD et TP. Ce code n’a aucune relation avec le problème traité. Toute fois, il pourra vous servir pour des consultations syntaxiques.

1- Exemple de classe Abstraite qui contient des méthodes : Figure.java package graphisme;import java.awt.*; public abstract class Figure { protected Point[] points; protected boolean se lected; protected Color couleurContour=Color. blue; protected Color couleurRemplissage=Color. YELLOW; public abstract void dessiner(Graphics g); public abstract double getSurface(); public abstract double getPerimetre(); public abstract double distanceAuCentre(Point p) ; public void selectionner(){selected=true;} public void deSelectionner(){selected=false; } // Getters et Setters } 2- Exemple de classe Cercle qui hérite de la classe Figure package graphisme; import java.awt.Graphics; public class Cercle extends Figure { private double rayon; public Cercle(Point c,double r){ points=new Point[1];points[0]=c;rayon=r; } public Cercle(Point c,Point p2){ points=new Point[1];points[0]=c;rayon=c.distance( p2); } public void dessiner(Graphics g) { g.setColor(couleurContour); int x1=(int)(points[0].x-rayon); int y1=(int)(points[0].y-rayon); g.drawOval(x1, y1, (int)(2*rayon),(int)(2*rayon)) ; if(selected==true) g.drawOval(x1-2, y1-2, (int)(2*rayon)+4,(int)(2*r ayon)+4); g.setColor(couleurRemplissage); g.fillOval(x1, y1, (int)(2*rayon),(int)(2*rayon)) ; } public double getSurface() { return Math. PI*rayon*rayon; } public double getPerimetre() { return 2*Math. PI*rayon; } public double distanceAuCentre(Point p) { double distance=points[0].distance(p); return distance; } public String toString() { return "Cercle("+points[0].x+","+points[0].y+","+ rayon+")"; } }

Page 19: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

19/41

3- Exemple d’interface java :

package graphisme; import java.awt.Graphics; public interface IDessin { public void addFigure(Figure f); public Figure getFigurePlusProche(Point p); public void dessiner(Graphics g); public void afficher(); public void supprimer(Figure f); } 4- Exemple de classe implémentant cette interface : package graphisme; import java.awt.*;import java.util.ArrayList; import java.util.List; public class Dessin implements IDessin{ private List<Figure> figures=new ArrayList<Figure> (); public void addFigure(Figure f) { figures.add(f); } public Figure getFigurePlusProche(Point p) { double dMin=figures.get(0).distanceAuCentre(p); int index=0; for(int i=1;i<figures.size();i++) if(figures.get(i).distanceAuCentre(p)<dMin){ dMin=figures.get(i).distanceAuCentre(p); index=i; } return figures.get(index); } public void dessiner(Graphics g) { for(Figure f:figures) f.dessiner(g); } public void afficher() { for(Figure f:figures) System. out.println(f.toString()); } public void supprimer(Figure f) { figures.remove(f); } } 5- Exemple d’application java : package graphisme; public class Application { public static void main(String[] args) { Dessin d=new Dessin(); d.addFigure(new Cercle(new Point(50,70),60)); d.addFigure(new Rectangle(new Point(100,100), new Point(200,200))); d.addFigure(new Cercle(new Point(90,90),

Page 20: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

20/41

new Point(150,150))); d.afficher(); Figure f=d.getFigurePlusProche(new Point(150,200) ); System. out.println("Figures plus poche:"); System. out.println(f.toString()); System. out.println("Surface de "+f+"="+f.getSurface()); System. out.println("Surface de "+f+"="+f.getPerimetre()); f.selectionner(); } } 6- Exemple de méthodes qui manipulent les fichiers :

• Une méthode qui permet de charger une liste «lesChaines» d’objets de type Chaine dont les données sont lues à partir d’u fichier texte

public void chargerChaines(){ File f=new File("chaines.txt"); if(f.exists()){ try { FileReader fr=new FileReader(f); BufferedReader br=new BufferedReader(fr); String s; while((s=br.readLine())!=null){ Chaine ch=new Chaine(); String[] tab=s.split(";"); ch.setNumero(Integer. parseInt(tab[0])); ch.setNomChaine(tab[1]); ch.setFrequence(Float. parseFloat(tab[2])); ch.setPolarite(tab[3].charAt(0)); lesChaines.add(ch); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ System. out.println("Fichier introuvable"); } }

• Méthode pour sérialiser la liste des chaines dans un fichier public void serialiser(){ File f=new File(nom+".dat"); try { FileOutputStream fos=new FileOutputStream(f); ObjectOutputStream oos=new ObjectOutputStream(fo s); oos.writeObject(lesChaines); oos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }

Page 21: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

21/41

7- Exemple d’interface graphique SWING

Page 22: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

22/41

Corrigé :

Page 23: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

23/41

Page 24: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

24/41

Exercice d’application sur les exceptions Créer une application java qui permet de :

- Saisir au clavier un nombre entier positif qui représente le temps en secondes du parcours d’un kilomètre

- Afficher la vitesse en km/h : vitesse=3600/temps On tachera de définir les méthodes suivantes :

- int saisir() : qui permet de retourner un entier positif saisi au clavier - int calcul(int t) : retourne la vitesse.

Solution :

1- Créer une exception NegException :

public class NegException extends Exception { public NegException(String s){ super (s); } }

2- Application : import java.io.*; public class Vitesse { public static void main(String[] args) { try { int temps= saisir(); int v= calcul(temps); System. out.println( "Vitesse=" +v+"Km/h" ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NegException e) { // TODO Auto-generated catch block System. out.println(e.getMessage()); } catch (ArithmeticException e){ System. out.println( "Le temps ne peut pas être nul" ); } catch (NumberFormatException e){ System. out.println( "Il faut saisir un nombre" );

JVM

main()

Saisir() calcul()

ArithmeticException

IOException NegException NumberFormatException

Page 25: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

25/41

} } public static int saisir() throws IOException,NegException { BufferedReader br= new BufferedReader( new InputStreamReader(System. in)); System. out.print( "Temps:" ); String s=br.readLine(); int t=Integer. parseInt(s); if (t<0) throw new NegException( "valeur négative" ); return t; } public static int calcul( int t){ return (3600/t); } }

Exécussion 1 : Temps:100 Vitesse=36 Km/h

Exécussion 2 : Temps:0 Le temps ne peut pas être nul

Exécussion 3 : Temps:-10 valeur négative

Exécussion 4 : Temps: azaze Il faut saisir un nombre

Page 26: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

26/41

TP Entrées sorties

ENTRÉES-SORTIES et Interfaces graphiques Exercice 1 On considère un fichier texte qui contient la liste des chaînes TV d’un récepteur numérique. Chaque ligne de ce fichier représente une chaîne. Chaque chaîne est définie par un numéro, un nom et une fréquence et sa polarité qui peut être soit horizontale «H», soit verticale «V». Les différentes valeurs sont séparées par des points virgules. La forme de ce fichier nommé « chaines.txt » est la suivante : 1;TF1;10911;V 2;2M;12476;H 3;HISTOIRE;10911;V 4;FRANCE5;10873;V 5;TPS FOOT;10796;V 6;INFOSPORT;10796;V 7;M6;10911;V 8;ESCALES;11881;H Travail à faire:

1- Créer le fichier chaines.txt 2- Créer la classe Chaine.java 3- Créer la classe Recepteur.java définie par un attribut nom et un vecteur de chaines.

Les méthodes à définir pour cette classe sont : a. Une méthode qui permet d’ajouter une chaîne au vecteur lesChaines. b. Une méthode qui permet de supprimer une chaîne. c. Une méthode qui permet de charger toutes les chaînes à partir du fichier créé. d. Une méthode qui permet d’afficher toutes les chaînes chargées. e. Une méthode qui permet de sérialiser toutes les chaînes dans un autre fichier

qui porte le nom du récepteur. f. Une méthode qui permet de déssérialiser les chaînes à partir d’un fichier

4- Créer une application sur console qui permet de permet de : a. Créer un récepteur b. Charger les chaînes à partir du fichier « chaines.txt » c. Ajouter une autre nouvelle chaîne au récepteur d. Afficher les chaînes du récepteur e. Sérialiser le récepteur dans f. Créer un nouveau récepteur g. Charger les chaînes du fichier « Recepteur1.txt » en déssérialisant h. Afficher les chaînes du nouveau récepteur

5- Créer une application graphique SWING qui permet de : a. Saisir le nom du récepteur dans un champ de texte JTextField b. En cliquant sur un bouton, créer un récepteur en l’ajoutant à un JList c. En cliquant sur un bouton charger toutes les chaînes du fichier « chaines.txt »

dans le récepteur sélectionné. d. En cliquant sur un autre bouton sérialiser les chaînes du récepteur sélectionné

Page 27: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

27/41

e. En cliquant sur une autre bouton déssérialiser les chaînes vers le récepteur sélectionné.

f. En sélectionnant chaque récepteur, afficher toutes ses chaînes dans une autre liste.

g. En cliquant sur un autre bouton, supprimer la chaîne sélectionnée du récepteur sélectionné.

Exercice 2 Créer une application java qui permet de :

� Saisir le nom d’un dossier � Afficher le contenu de ce dossier ainsi que celui de toute son arborescence

Exercice 3 Créer une application java qui permet de :

� Saisir le nom d’un dossier � Compresser le contenu de ce dossier dans un fichier.zip

Créer une autre application qui permet de décompresser cette archive Rédiger un rapport pour ce TP

Page 28: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

28/41

Corrigé :

Page 29: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

29/41

Page 30: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

30/41

TP POO Java

Modélisation objet d’un routeur

Problème Nous souhaitons développer une application orienté objet java qui permet la simulation d’un

réseau local. Dans cette partie, nous allons nous intéresser à la modélisation d’un routeur et ses composants. Un routeur est caractérisé par son nom. Le routeur se compose également d’un ensemble de Ports « RouterPort » qui sont de deux types : SerialPort et EthernetPort. Chaque port est défini par un nom, une adresse IP exemple "192.168.1.1" et un masque ; exemple "255.255.255.0". La particularité des ports de type Ethernet c’est qu’ils sont caractérisées par une adresse mac qui est de type entier alors que la particularité des SerialPort c’est qu’elles sont caractérisées par un serialId qui est de type String.

La classe RouterPort est abstraite et définie par ses attributs :

� portName : représente le nom du port avec une valeur initiale «Eth» � ipAdress : représente l’adresse IP du port � mask : représente le masque avec une valeur par défaut de 255.255.0.1. � nbPorts : un attribut statique qui représente le nombre de ports

Cette classe possède un constructeur sans argument qui permet d’incrémenter le nombre de ports et d’initialiser le mask à la chaine "255.255.255.0" et l’adresse IP à "192.168.1.x" avec x représente le nombre de ports. La méthode toString() de cette classe retourne une chaîne de caractères qui contient le nom du port, l’adresse IP et le masque. Le reste des méthodes étant les getters et setters.

- La classe EthernetPort est définie par : � une variable d’instance macAdress � une variable statique nbEthernets qui représente le nombre de EthernetPort créées. � Pour créer un objet de cette classe, il faut préciser la valeur de macAdress. Le constructeur de

cette classe doit également initialiser le nom de ce port par une chaîne "Ethernet" suivie par la valeur de nbEthernets .

� Cette classe possède également un constructeur sans argument qui permet d’initialiser la valeur de macAdress par une valeur aléatoire comprise entre 1 et 50000 et initialiser le nom de ce port par une chaîne "Ethernet" suivie par la valeur de nbEthernets.

� La méthode toString() de cette classe retourne une chaîne de caractères de type "portName/ipAdress/mask/macAdress". Le reste des méthodes étant des getters et des setters.

- La classe SerialPort possède la même structure que la classe EthernetPort sauf qu’il faut remplacer macAdress par serialId et la variable statique nbEthernets par nbSerials. - La classe Routeur est définie par :

� routerName qui représente le nom du routeur.

Routeur RouterPort

EthernetPort SerialPort

Page 31: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

31/41

� un vecteur d’objets de type RouterPort qui permet de stocker les ports séries et Ethernet de ce routeur.

� Pour créer un routeur, il faut connaître le nombre de ports Ethernet « nbEth » et le nombre de port série « nbSer » de ce routeur. A sa création un routeur possède nbSer ports séries et nbEth ports Ethernet.

� Cette classe possède également un constructeur sans argument qui permet de créer un routeur possédant un port série et un port ethernet.

� Les opérations que l’on souhaite définir pour cette classe sont : • addRouterPort(RouterPort rp) : Une méthode qui permet d’ajouter un port rp au

routeur • viewConfiguration() : Une méthode qui permet d’afficher les caractéristiques de tous

les ports de ce routeur. • getRouterPort(String portName) : Méthode qui permet de retourner un objet

RouterPort sachant le nom du port. Si ce port est introuvable, générer une exception qui porte le message « Port non valide ».

• ipConfig(String portName, String ipAdresse, String mask) : Une méthode qui permet de chercher le port dont le nom est portName et de modifier l’adresse IP et le masque de ce port.

• loadConfig(String fileName) : Une méthode qui permet de modifier la configuration du routeur par des données récupérées à partir d’un fichier texte dont le nom est fileName Ce fichier contient un ensemble de lignes dont chacune contient le nom de du port, l’adresse IP et le masque de ce port. Ces trois valeurs sont séparées par un point virgule. Exemple d’une ligne :

ethernet1 ; 192.168.1.1 ; 255.255.255.0 • serialiser(String fileName) : Une méthode qui permet de sérialiser le routeur dans le

fichier fileName • deserialiser(String fileName) : Une méthode qui permet de désérialiser le routeur à

partir du fichier filename.

Travail demandé :

1- Compléter le diagramme de classes en inscrivant sur chaque classe ses attributs, ses constructeurs et ses méthodes.

2- Ecrire le code java de la classe RouterPort 3- Ecrire le code java de la classe EthernetPort 4- Ecrire le code java de la classe SerialPort 5- Ecrire le code java de la classe Routeur 6- Ecrire le code java d’une application qui permet de :

a. Créer un routeur possédant un port série et un port ethernet. b. Définir le nom de ce routeur à « CISCO SB 107 » c. Ajouter deux ports Ethernet et un port série à ce routeur. d. Définir l’adresse IP à « 192.168..11 » et le masque à « 255.255.0.1 » du port

« Ethernet1 » e. Afficher la configuration de ce routeur f. Charger la configuration à partir du fichier « cisco11.ini » dans ce routeur g. Afficher à nouveau la configuration de ce routeur h. Sérialiser le routeur

7- Créer une application graphique AWT qui permet de : • Saisir le nom du routeur dans une zone de texte • En cliquant sur un bouton « créer »,

• Créer un routeur dont le nom est celui qui a été saisi. • Charger la configuration de ce routeur à partir du fichier « config12.ini » • Afficher la configuration de ce routeur dans une zone de liste.

Page 32: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

32/41

ANNEXE Dans cette annexe, vous trouverez le corrigé du Tp entrée-sorties Ce problème traite le cas d’un récepteur qui contient plusieurs chaînes qui sont chargées à partir d’un fichier texte. Le problème traité dans cette annexe n’a aucun lien avec le problème de l’examen, toutefois, elle peut vous servir pour faire des consultation syntaxiques.

1- Classe Chaine.java package rec; import java.io.Serializable; public class Chaine implements Serializable { private int numero ; private String nomChaine ; private float frequence ; private char polarite ; public Chaine() { super (); }

public Chaine( int numero, String nomChaine, float frequence, char polarite) {

super (); this . numero = numero; this . nomChaine = nomChaine; this . frequence = frequence; this . polarite = polarite; } // Getters et Setters }

2- Classe Recepteur.java

package rec; import java.io.*; import java.util.Vector; public class Recepteur { private String nom; public Vector<Chaine> lesChaines =new Vector<Chaine>(); public Recepteur(String nom) { this . nom = nom; } public void addChaine(Chaine ch){ lesChaines .add(ch); } public void suppChaine(Chaine ch){ lesChaines .remove(ch); } public void chargerChaines(){ File f= new File( "chaines.txt" ); if (f.exists()){ try { FileReader fr= new FileReader(f); BufferedReader br= new BufferedReader(fr);

Page 33: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

33/41

String s; while ((s=br.readLine())!= null ){ Chaine ch= new Chaine(); String[] tab=s.split( ";" ); ch.setNumero(Integer. parseInt(tab[0])); ch.setNomChaine(tab[1]); ch.setFrequence(Float. parseFloat(tab[2])); ch.setPolarite(tab[3].charAt(0)); addChaine(ch); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System. out.println( "Fichier introuvable" ); } } public void afficher(){ for ( int i=0;i< lesChaines .size();i++){ Chaine ch= lesChaines .elementAt(i); System. out.println(ch.getNumero()+ "\t" + ch.getNomChaine()+ "\t\t" + ch.getFrequence()+ "\t" + ch.getPolarite()); } } public void serialiser(){ File f= new File( nom+".dat" ); try { FileOutputStream fos= new FileOutputStream(f); ObjectOutputStream oos= new ObjectOutputStream(fos); oos.writeObject( lesChaines ); oos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void desserialiser(String nomFic){ File f= new File(nomFic); try { FileInputStream fis= new FileInputStream(f); ObjectInputStream ois= new ObjectInputStream(fis); lesChaines =(Vector<Chaine>) ois.readObject(); ois.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

Page 34: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

34/41

3- Application TestRecepteur.java

import rec.Chaine; import rec.Recepteur; public class TestRecapteur { public static void main(String[] args) { System. out.println( "Récepteur r1" ); Recepteur r1= new Recepteur( "SONY"); r1.chargerChaines(); r1.afficher(); r1.addChaine( new Chaine(9, "RTM" ,11097, 'V' )); r1.serialiser(); System. out.println( "Récepteur r2" ); Recepteur r2= new Recepteur( "Ech Star" ); r2.desserialiser( "SONY.dat" ); r2.afficher(); } }

4- Interface graphique

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import rec.Chaine; import rec.Recepteur; public class FenetreRecepteur extends Frame{ Label l1 =new Label( "Nom Rec:" ); TextField tNom=new TextField( "Rec SONY" ); List listRec =new List(); List listChaines =new List(); Button bAjout =new Button( "Ajouter" ); Button bCharger =new Button( "Charger" ); Vector<Recepteur> lesRecepteurs =new Vector<Recepteur>(); class Handller implements ActionListener{ public void actionPerformed(ActionEvent e) { if (e.getSource()== bAjout ){ String nom= tNom.getText(); Recepteur r= new Recepteur(nom); lesRecepteurs .add(r); listRec .add(nom); } else if (e.getSource()== bCharger ){ listChaines .removeAll(); int index= listRec .getSelectedIndex(); Recepteur r= lesRecepteurs .elementAt(index); r.chargerChaines(); Vector<Chaine> lesChaines=r. lesChaines ; for ( int i=0;i<lesChaines.size();i++){ listChaines .add(lesChaines.elementAt(i).getNomChaine()); }

Page 35: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

35/41

} } } public FenetreRecepteur(){ this .setLayout( new FlowLayout()); this .add( l1 );add( tNom);add( bAjout ); add( listRec );add( listChaines ); add( bCharger ); Handller h= new Handller(); bAjout .addActionListener(h); bCharger .addActionListener(h); this .setBounds(10,10,500,500); this .setVisible( true ); } }

5- Application de l’interface graphique public class TestInterface { public static void main(String[] args) { FenetreRecepteur fr= new FenetreRecepteur(); } }

Page 36: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

36/41

TP Java : Interfaces graphiques

1- Application AWT :

AppInterface.java import java.awt.*; import java.awt.event.*; public class AppInterface { Label labelNom =new Label( "Nom:" ); TextField textNom =new TextField( "" ); Button bAjout =new Button( "Ajouter" ); List listNom =new List(); MenuBar menu1=new MenuBar(); Menu fic =new Menu( "Fichier" ); MenuItem enregistrer =new MenuItem( "Enregistrer" ); MenuItem quitter =new MenuItem( "Quitter" ); class Handler implements ActionListener{ public void actionPerformed(ActionEvent e){ if (e.getSource()== bAjout ){

Page 37: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

37/41

String nom= textNom .getText(); listNom .add(nom); } else if (e.getSource()== quitter ){ System. exit(0); } } } class Handler2 extends WindowAdapter{ public void windowClosing(WindowEvent e){ System. exit(0); } } public AppInterface(){ Frame f= new Frame( "Application graphique" ); f.setLayout( new FlowLayout()); textNom .setText( "Saisir un nom ici" ); f.add( labelNom ); f.add( textNom ); f.add( bAjout ); f.add( listNom ); Handler h= new Handler(); Handler2 h2= new Handler2(); f.addWindowListener(h2); bAjout .addActionListener(h); f.setBounds(10,10,500,500); fic .add( enregistrer ); fic .add( quitter ); menu1.add( fic ); f.setMenuBar( menu1); quitter .addActionListener(h); f.setVisible( true ); } public static void main(String[] s){ new AppInterface(); } }

Travail à faire :

1. Implémenter cette application et essayez de comprendre les concepts 2. Ajouter un bouton qui permet de supprimer un élément de la liste 3. Ajouter un bouton qui permet de déplacer un élément d’une liste vers une autre liste 4. Créer la même application en utilisant Visual Editor de Eclipse.

Page 38: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

38/41

2- Exemple d’applet AWT

- AppletTest.java import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class AppletTest extends Applet implements ActionListener { TextField textEchelle =new TextField( "100" ); Button bTracer =new Button( "Tracer" ); private int echelle =100; public void actionPerformed(ActionEvent e){ echelle =Integer. parseInt( textEchelle .getText()); repaint(); } double f( double x){ return 200+(Math. cos(x/7)+Math. sin(x/3))* echelle ; }

Page 39: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

39/41

public void init(){ this .setLayout( new FlowLayout()); this .add( textEchelle ); this .add( bTracer ); bTracer .addActionListener( this ); } public void paint(Graphics g){ for ( int x=0;x<400;x++) g.drawLine(x,( int )f(x),x+1,( int )f(x+1)); } }

- Page.htm <html> <head> <title> </title> </head> <body> <applet code="AppletTest.class" width="500" height="500"></applet> </body> </html>

Application : Ajouter à l’applet la possibilité de choisir la couleur du tracé.

Page 40: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

40/41

Exemple d’interface graphique SWING

Code : import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class RecepteurSWING extends JFrame implements ActionListener { private JLabel jl =new JLabel( "Récepteur" ); private JTextField jtf1 =new JTextField(12); private JButton jb1 =new JButton( "Add" ); private JButton jb2 =new JButton( "Charcger" ); private JButton jb3 =new JButton( "Sérialiser" ); private List liste1 =new List(); private List liste2 =new List(); private JLabel jlErr =new JLabel( "OK" ); public RecepteurSWING(){ this .setDefaultCloseOperation( EXIT_ON_CLOSE); this .setLayout( new BorderLayout()); JPanel jp1= new JPanel(); jp1.setLayout( new FlowLayout()); jp1.add( jl );jp1.add( jtf1 );jp1.add( jb1 );jp1.add( jb2 ); jp1.add( jb3 ); JPanel jp2= new JPanel(); jp2.setLayout( new GridLayout());

Page 41: Suport d'Exercices POO Java V2

Support d’exercices M.Youssfi

41/41

jp2.add( liste1 ); jp2.add( liste2 ); this .add(jp1,BorderLayout. NORTH); this .add(jp2,BorderLayout. CENTER); this .add( jlErr ,BorderLayout. SOUTH); jb1 .addActionListener( this ); jb2 .addActionListener( this ); jb3 .addActionListener( this ); this .setBounds(10, 10, 500, 400); this .setVisible( true ); } public void actionPerformed(ActionEvent e) { if (e.getSource()== jb1 ){ String n= jtf1 .getText(); liste1 .add(n); jlErr .setText( "Création d'un récepteur" ); /* * A compléter */ } else if (e.getSource()== jb2 ){ jlErr .setText( "Chargement des chaines" ); /* * A compléter */ } else if (e.getSource()== jb3 ){ /* * A compléter */ jlErr .setText( "Sérialisation" ); } } public static void main(String[] args) { new RecepteurSWING(); } }