Module Complément Java Juin 2007 Licence Informatique 3éme année



Documents pareils
Package Java.util Classe générique

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation par composants (1/3) Programmation par composants (2/3)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Projet de programmation (IK3) : TP n 1 Correction

Corrigé des exercices sur les références

Threads. Threads. USTL routier 1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Synchro et Threads Java TM

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation Par Objets

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Programmer en JAVA. par Tama

Un ordonnanceur stupide

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Auto-évaluation Programmation en Java

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Remote Method Invocation Les classes implémentant Serializable

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Développement Logiciel

Applet pour visualiser les variables «automate» notifiées

TD2 Programmation concurrentielle

Corrigés des premiers exercices sur les classes

Java Licence Professionnelle CISII,

Premiers Pas en Programmation Objet : les Classes et les Objets

Introduction au langage Java

Programme Compte bancaire (code)

Objets et Programmation. origine des langages orientés-objet

as Architecture des Systèmes d Information

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

PROGRAMMATION PAR OBJETS

Calcul Parallèle. Cours 5 - JAVA RMI

TD/TP PAC - Programmation n 3

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

TP1 : Initiation à Java et Eclipse

TD3: tableaux avancées, première classe et chaînes

ACTIVITÉ DE PROGRAMMATION

Programmation avec des objets : Cours 7. Menu du jour

Tp 1 correction. Structures de données (IF2)

Notion de thread (1/2)

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TD/TP PAC - Programmation n 3

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Flux de données Lecture/Ecriture Fichiers

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Design patterns. Design patterns - définition. Design patterns - avantages

Programmation Orientée Objet

Introduction : les processus. Introduction : les threads. Plan

Utilisation d objets : String et ArrayList

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Une introduction à Java

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation par les Objets en Java

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Dis papa, c est quoi un bus logiciel réparti?

Desktop Intégration. Rémi Forax

Langage Java. Classe de première SI

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Interfaces graphiques avec l API Swing

Exercices sur les interfaces

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Programmation Objet I

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Problèmes liés à la concurrence

Chapitre V. Les classes : Object, Vector, etc.

INF 321 : mémento de la syntaxe de Java

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Introduction aux composants logiciels : JavaBeans Master des Technologies de l'internet

RMI le langage Java XII-1 JMF

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Programmation en Java IUT GEII (MC-II1) 1

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

F. Barthélemy. 17 mai 2005

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Java Licence Professionnelle CISII,

Bases Java - Eclipse / Netbeans

Apprendre Java en 154 minutes

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Héritage presque multiple en Java (1/2)

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Java - la plateforme

INITIATION AU LANGAGE JAVA

Introduction à la programmation concurrente

OpenPaaS Le réseau social d'entreprise

Introduction. Les méthodes. Les méthodes. Identité et égalité. Identité et égalité. La copie d'objets. Identité et égalité.

Création d une application JEE

Classe Interne, Anonyme & Enumération

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Transcription:

Module Complément Java Juin 2007 Licence Informatique 3éme année Examen 2ème session Durée : 2 heures Documents autorisés : les polycopiés du cours Probléme A Ci-dessous une classe représentant une liste de mots : 01 public class ModeleListeMots{ 02 private Vector vect; 03 public ModeleListeMots() { 04 vect = new Vector(); 05 06 public ModeleListeMots(String[]mots) { 07 Arrays.sort(mots); 08 int max = mots.length; 09 vect = new Vector(max); 10 for (int i=0; i<max; i++) 11 vect.add(mots[i]); 12 13 public void add(string mot) { 14 if (!vect.contains(mot)) { 15 int max = vect.size();int i=0; 16 while ((i<max) && (mot.compareto((string) vect.get(i)) > 0)) i++; 17 vect.add(i, mot); 18 19 20 public String[] toarray() { 21 int max = vect.size(); String[]result = new String[max]; 22 for (int i=0; i<max; i++) result[i]=(string)vect.get(i); 23 return result; 24 25 public void remove(string mot) {vect.remove(mot); 26 Ci-dessous une classe VueConsole qui représente une vue sur un objet ModeleListeMots. Cette vue affiche en ligne de commande la liste des mots. import java.util.*; public class VueConsole implements Observer { public void update(observable source, Object donnees) { if ((source instanceof ModeleListeMots) && (donnees!= null) && (donnees instanceof String[])) System.out.println("----------"); int max = ((String[])donnees).length; for (int i=0; i<max; i++) System.out.println(((String[])donnees)[i]); System.out.println("----------");

Ci-dessous une classe ControleurConsole qui permet d ajouter ou d enlever des mots dans une liste via la ligne de commande. public class ControleurConsole { private ModeleListeMots modele; public ControleurConsole(ModeleListeMots modele) { this.modele = modele; public void run() { String rep; boolean encore; do { rep = Clavier.lireLigne().trim(); encore = this.operer(rep); while (encore); private boolean operer(string control) { boolean continuer = true; if (control == null) return continuer; else if (control.indexof("del ") == 0) { String mot = control.substring(4,control.length()).trim(); if (mot!= null) this.modele.remove(mot); else if (control.indexof("add ") == 0) { String mot = control.substring(4,control.length()).trim(); if (mot!= null) this.modele.add(mot); else if (control.equals("q")) continuer = false; return continuer; Questions du problème A : 1- Modifier la classe ModeleListeMots pour qu elle puisse fonctionner avec la VueConsole. Ecrire un programme principal qui crée une instance de ModeleListeMots, y ajoute des mots et en enlève de sorte que l affichage soit géré par une instance de VueConsole. 2- Modifier le programme principal de la question 1 pour prendre en compte le controleur console : ce programme principal doit créer des instances de ModeleListeMots, VueConsole et ControleurConsole et faire en sorte qu on puisse ajouter des mots ou en enlever en ligne de commande. Problème B : 6 philosophes se réunissent pour un banquet philosophique, autour d une table ronde. Ils ont chacun une assiette mais le philosophe invitant n a que 3 fourchettes, il pose donc les fourchettes de manière à ce que chaque philosophe ait accès à une fourchette. Chaque philosophe doit donc attendre que la fourchette qu il peut atteindre soit disponible pour manger. La classe Fourchette suivante modélise les fourchettes, qui peuvent être prises ou libérées par les philosophes.

public class Fourchette{ private boolean utilisee=false; public void prend(){ this.utilisee = true; public void libere(){ this.utilisee = false; La classe suivante modélise les philosophes et contient un programme principal. public class Philosophe extends Thread { private int id; private Fourchette f; public Philosophe(int id,fourchette f){ this.f=f;this.id=id; public void pense(){ System.out.println("Le philosophe " + id + " pense"); try{this.sleep(1000); catch(interruptedexception e){ public void afaim(){ System.out.println("Le philosophe " + id + " a faim"); f.prend(); public void mange(){ System.out.println("Le philosophe " + id + " mange"); try{this.sleep(1000); catch(interruptedexception e){ f.libere(); public void run(){ while(true){pense(); afaim(); mange(); public static void main( String [] argv ){ Fourchette[] ftab = new Fourchette[3]; for(int i = 0;i<3;i++) ftab[i] = new Fourchette(); for(int i = 0;i<6;i++){ Philosophe p = new Philosophe(i,fTab[(i+1)%3]); p.start(); Question du problème B : Tel quel, ce programme marche mal, les philosophes utilisent en même temps les mêmes fourchettes et le banquet risque de tourner au pugilat. Proposer des modifications pour que le banquet se déroule correctement. Problème C : Voici ci-dessous le code d un composant graphique qui affiche un nuancier et permet de sélectionner une couleur.

01 /** Cette classe implémente un nuancier permettant, par un clic 02 de souris, de sélectionner une couleur. */ 03 public class ComposantNuancier extends Canvas{ 04 private int dim; 05 private Color currentcolor; 06 private Rectangle[] carreaux; 07 private Color[] couleurcarreaux; 08 private LinkedList ob; 09 /** Constructeur. dim est la résolution du nuancier. */ 10 public ComposantNuancier(int dim){ 11 this.dim = dim; 12 this.ob = new LinkedList(); 13 this.currentcolor = Color.BLACK; 14 this.carreaux = new Rectangle[dim * dim]; 15 this.couleurcarreaux = new Color[dim * dim]; 16 for(int i = 0; i < dim; i++){ 17 int j; 18 for(j = 0; j < dim / 2; j++) 19 couleurcarreaux[i * dim + j] = Color.getHSBColor((float)i / dim,1,(float)j / dim * 2); 20 for( ; j < dim; j++) 21 couleurcarreaux[i * dim + j] = Color.getHSBColor((float)i / dim,(float)(dim - 1 - j) / dim * 2,1); 22 23 this.enableevents(awtevent.mouse_event_mask); 24 25 /** Méthode appelée quand le composant change de dimension */ 26 public void setbounds(int x, int y, int width, int height){ 27 super.setbounds(x, y, width, height); 28 int largeur = this.getsize().width / dim; 29 int hauteur = this.getsize().height / dim; 30 for(int i = 0; i < dim; i++) 31 for(int j = 0; j < dim; j++) 32 carreaux[i * dim + j] = new Rectangle(largeur * i, hauteur * j, largeur, hauteur); 33 34 35 public void paint(graphics gc){ 36 for(int i = 0; i < carreaux.length; i++){ 37 gc.setcolor(couleurcarreaux[i]); 38 gc.fillrect(carreaux[i].x,carreaux[i].y,carreaux[i].width, carreaux[i].height); 39 40 41 42 public void processmouseevent(mouseevent e){ 43 if(e.getid() == MouseEvent.MOUSE_CLICKED){ 44 for (int i = 0; i < carreaux.length; i++){ 45 if (carreaux[i].contains(e.getx(),e.gety())){ 46 this.currentcolor = couleurcarreaux[i]; 47 48 49 50 51 52

Voici maintenant le code d un modèle de couleur. 01 public class MyColorModel extends Observable implements Observer { 02 03 private int red; 04 private int green; 05 private int blue; 06 07 public MyColorModel(){ 08 this.red = 100; 09 this.green = 100; 10 this.blue = 100; 11 12 13 public Color getcolor(){return new Color(this.red,this.green,this.blue); 14 15 public void setcolor(color c){ 16 this.red = c.getred(); 17 18 this.green = c.getgreen(); this.blue = c.getblue(); 19 this.setchanged(); 20 this.notifyobservers(this.getcolor()); 21 22 23 public void update(observable o,object ob){ 24 if(ob instanceof Color){ 25 this.setcolor((color) ob); 26 27 28 Questions du problème C : 1- Faites du ComposantNuancier un Java Bean dont la propriété currentcolor sera en lecture seulement (read only) et liée (bound). 2- Proposez des modifications de la classe MyColorModel pour que la modification de la couleur dans le ComposantNuancier puisse être répercutée dans le modèle. Pour ces deux questions, indiquez quelles lignes sont modifiées ou ajoutées dans le code fourni.

Correction problème A : Question 1 : Ajouter en ligne 1 : extends Observable Ajouter entre les lignes 17/18 et à la ligne 25 dans le corps de la méthode remove this.setchanged(); this.notifyobservers(this.toarray()); Question 2 : public class MVC1 { public static void main(string[] args) { ModeleListeMots modele = new ModeleListeMots(args); VueConsole vue = new VueConsole(); modele.addobserver(vue); modele.add("toto"); modele.add("titi"); modele.remove("toto"); modele.remove("truc"); Question 3 : public class MVC1 { public static void main(string[] args) { ModeleListeMots modele = new ModeleListeMots(args); ControleurConsole controleur = new ControleurConsole(modele); VueConsole vue = new VueConsole(); modele.addobserver(vue); controleur.run(); Correction problème B : public class Fourchette{ private boolean utilisee=false; public void prend(){ synchronized(this){ if(utilisee){ try{ this.wait();catch(interruptedexception e){ this.utilisee = true; public void libere(){ synchronized(this){ this.utilisee = false; this.notify();

Correction problème C : Question 1 : Ajouter ligne 03 : implements Serializable Ajouter ligne 10 : private PropertyChangeSupport pcs; Ajouter ligne 25 : pcs = new PropertyChangeSupport(this); Ajouter ligne 48 : pcs.firepropertychange("currentcolor",this.currentcolor,couleurcar reaux[i]); Ajouter ligne 53 : public void addpropertychangelistener(propertychangelistener ecouteur) { pcs.addpropertychangelistener(ecouteur); public void removepropertychangelistener(propertychangelistener ecouteur) { pcs.removepropertychangelistener(ecouteur); Ajouter ligne 51 : public Color getcurrentcolor(){return this.currentcolor; Question 2 : Ajouter ligne 01 :,PropertyChangeListener Ajouter ligne 27 : public void propertychange(propertychangeevent e) { this.setcolor((color) e.getnewvalue());