2. Objets. 2.1. Les articles du supermarché



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

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Chapitre 10. Les interfaces Comparable et Comparator 1

TP, première séquence d exercices.

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

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

Utilisation d objets : String et ArrayList

TP1 : Initiation à Java et Eclipse

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

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

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

Cours 1: Java et les objets

Programmation par les Objets en Java

Programmer en JAVA. par Tama

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

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

TD/TP PAC - Programmation n 3

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

Gestion distribuée (par sockets) de banque en Java

Programmation en Java IUT GEII (MC-II1) 1

TD/TP PAC - Programmation n 3

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

Corrigés des premiers exercices sur les classes

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

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Corrigé des exercices sur les références

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

Solutions du chapitre 4

Une introduction à Java

as Architecture des Systèmes d Information

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

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

Java Licence Professionnelle CISII,

Cours d initiation à la programmation en C++ Johann Cuenin

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Programme Compte bancaire (code)

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

2. Comprendre les définitions de classes

Programmation avec des objets : Cours 7. Menu du jour

Package Java.util Classe générique

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Langage Java. Classe de première SI

Projet de programmation (IK3) : TP n 1 Correction

Les chaînes de caractères

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Exercices sur les interfaces

I. Introduction aux fonctions : les fonctions standards

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Création d objet imbriqué sous PowerShell.

Auto-évaluation Programmation en Java

Chapitre VI- La validation de la composition.

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)

Les structures. Chapitre 3

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Programmation Par Objets

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmation Objet I

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

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

Environnements de développement (intégrés)

alg - Classes, instances, objets [oo] Exercices résolus

IRL : Simulation distribuée pour les systèmes embarqués

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

C++ - Classes, instances, objets [oo] Exercices résolus

INF 321 : mémento de la syntaxe de Java

Maple: premiers calculs et premières applications

PROGRAMMATION PAR OBJETS

TP 1. Prise en main du langage Python

Un ordonnanceur stupide

Synchro et Threads Java TM

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

Généralités sur le Langage Java et éléments syntaxiques.

Serveur d'archivage 2007 Installation et utilisation de la BD exist

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

TP : Gestion d une image au format PGM

Présentation du langage et premières fonctions

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

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Représentation des Nombres

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

TP1 : Initiation à Java et Eclipse

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

UE Programmation Impérative Licence 2ème Année

Java Licence professionnelle CISII,

DM 1 : Montre Autoquartz ETA

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Logiciel de Base. I. Représentation des nombres

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

V- Manipulations de nombres en binaire

RMI le langage Java XII-1 JMF

Applet pour visualiser les variables «automate» notifiées

Application web de gestion de comptes en banques

Apprendre Java en 154 minutes

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Transcription:

Master 2 BBSG POO, langage Java Laurent Tichit 2. Objets 1. Les articles du supermarché 2. Dates 3. Flacons et bouteilles... 4. Points du plan 5. Objets membres d autres objets 6. Fractions 2.1. Les articles du supermarché A. Écrivez une classe Article pour représenter les articles vendus dans un supermarché. Chacun comporte quatre variables d instance private long reference un numéro qui caractérise l article de manière unique private String intitule la description de l article sous forme de texte private float prixht le prix unitaire hors taxes de l article private int quantiteenstock le nombre d unités de l article disponibles et dispose d un certain nombre de méthodes public Article(long reference, String intitule, float prixht, int quantiteenstock) constructeur «immédiat» qui donne une valeur à chacune des variables d instance, public long getreference(), public String getintitule(), public int getquantiteenstock() les «accesseurs» permettant d obtenir la valeur de chaque variable d instance public void approvisionner(int nombreunites) méthode pour augmenter la quantité disponible de l article public boolean vendre(int nombreunites) cette méthode enregistre la vente d un certain nombre d unités de l article, dont il faut donc diminuer en conséquence la quantité disponible en stock. Si nombreunites est supérieur à la quantité disponible alors le stock n est pas modifié et la méthode renvoie false ; autrement elle renvoie true. public float prixht() cette méthode calcule et renvoie le prix HT de l article public float prixttc() cette méthode calcule et renvoie le prix TTC de l article public String tostring() chaîne de caractères exprimant la référence, l intitulé et le prix de l article. public boolean equals(article unarticle) a.equals(b) est true si et seulement si a et b représentent le même article (c est-à-dire s ils ont la même référence). B. Pour tester cette classe écrivez une méthode main qui crée un tableau comportant trois articles (au moins) et qui essaie toutes ces méthodes. N.B. Attention, la méthode equals «officielle» n a pas exactement l en-tête que nous avons utilisé ici (on verra cela plus loin).

2.2. Dates Pour cet exercice faites semblant de ne pas savoir qu il existe dans la bibliothèque Java des classes java.util.date et java.util.calendar qui offrent probablement les services demandés ici. Écrivez une classe Date dont chaque instance représente une date précise. Mettez-y quatre variables d instance privées : annee (un entier non négatif), mois (un entier compris entre 1 et 12), jour (un entier compris entre 1 et une borne supérieure qui dépend du mois) et joursemaine (un entier indiquant le jour de la semaine : 0 pour lundi, 1 pour mardi, etc. Écrivez les méthodes public Date(int jour, int mois, int annee) initialisation d une date, à partir des trois nombres donnés. La validité des ces nombres doit être vérifiée (voyez ci-dessous comment) et, en cas de date incohérente, un message doit être affiché et le programme abandonné. C est ici que le jour de la semaine doit être déterminé (voyez ci-dessous une manière simple de le faire). int getjour(), int getmois(), int getannee(), int getjoursemaine() des «accesseurs» pour obtenir les valeurs correspondantes public String tostring() renvoie l expression d une date sous forme de texte, comme "vendredi 8 décembre 2006" public boolean infeg(date d) comparaison : a.infeg(b) renvoie true si la date a est antérieure ou égale à la date b, sinon cela renvoie false. Pour simplifier, supposez qu une année est bissextile si et seulement si son millésime est divisible par quatre (en réalité c est un peu plus compliqué). Indications, 1 Pour abandonner le programme vous pouvez appeler la méthode System.exit(int code). Un tel traitement des erreurs est naïf, nous verrons plus loin (à l occasion des exceptions) une meilleure manière de faire cela. Indications, 2 Pour vous éviter de perdre votre temps sur des choses qui ne sont pas l objet de cet exercice, voici une expression évaluant la validité d une date (avec la simplication sur les années bissextiles mentionnée). Vous pouvez vous contenter de la copier-coller dans votre programme, puis de tester la valeur de dateinvalide : boolean dateinvalide = mois < 1 mois > 12 jour < 0 jour > 31 jour == 31 && (mois == 4 mois == 6 mois == 9 mois == 11) jour >= 30 && mois == 2 jour == 29 && mois == 2 && annee % 4!= 0; Indications, 3 Pour vous éviter de perdre votre temps sur des choses qui ne sont pas l objet de cet exercice, voici une manière simple de calculer le jour de la semaine correspondant à une date donnée (en trichant un peu par rapport à notre engagement de ne pas utiliser les outils de la bibliothèque Java) : private int joursemaine(int jour, int mois, int annee) { Calendar c = Calendar.getInstance(); c.set(annee, mois - 1, jour); return c.get(calendar.day_of_week); } Écrit comme cela, vous obtenez 1 : dimanche, 2 : lundi,... 7 : samedi. Pour avoir 0 : lundi, 1 : mardi,... 6 : dimanche, remplacez la dernière ligne ci-dessus, par : return (c.get(java.util.calendar.day_of_week) + 5) % 7;

Attention à vos éventuels import : un malencontreux import java.util.*; va créer un conflit muet entre java.util.date et votre propre Date. En règle générale, évitez asolument les import du style import monpackage.*; 2.3. Flacons et bouteilles... Vous travaillez chez Bobard & Co., producteur exclusif du sirop Mirifik, un élixir extraordinaire issu de la recherche spatiale qui rend jeune, beau et intelligent et qui empêche la chute des cheveux et les tâches de transpiration. Dilué à différentes concentrations, le sirop Mirifik est commercialisé dans diverses sortes de flacons. On vous demande d écrire une classe Flacon dont les instances représentent les flacons de sirop Mirifik en stock. Cette classe comportera : des variables d instance : private final float capacite la capacité du flacon (en ml), private float volume le volume de liquide (en ml) que le flacon contient à un instant donné, private float concentration la concentration de ce liquide, c.-à-d. le rapport (volume sirop) / (volume sirop+eau), String etiquette un texte libre «affiché» sur le flacon des méthodes : public Flacon(String etiquette, float capacite) Construction d un flacon ayant la capacité donnée et portant l étiquette indiquée. Initialement, le volume est mis à zéro. public void verser(float volumesirop, float volumeeau) Ajout à un flacon des volumes de sirop et d eau indiqués. La possibilité d une telle opération doit être vérifiée et, en cas d impossibilité, on doit produire l affichage d un message et l abandon du programme. public void transvaser(flacon autreflacon, float volume) Ajout à un flacon du volume indiqué du liquide extrait de l autreflacon indiqué. La possibilité d une telle opération doit être vérifiée et, en cas d impossibilité, on doit produire l affichage d un message et l abandon du programme. public String tostring() Affichage de l étiquette, du volume et de la concentration du contenu du flacon en question. Écrire une méthode main pour tester toutes ces opérations. Que pensez-vous des qualifieurs que nous avons appliqué aux variables d instance? Pourquoi capacite a été qualifiée final? Est-il intéressant de qualifier private le volume et la concentration? N.B. Comme à l exercice précédent, pour abandonner le programme vous pouvez appeler la méthode System.exit(int code). 2.4. Points du plan A. Définissez une classe Point pour représenter les points du plan rapporté à une origine fixée. Les coordonnées d un point sont ici deux nombres flottants x, y, mémorisés dans deux variables d instance privées (par exemple de type double). La classe Point comportera au moins les méthodes d instance suivantes, toutes publiques :

Point(double x, double y), constructeur d un point à partir de ses coordonnées cartésiennes, double x(), double y() qui renvoient les coordonnées cartésiennes du point, double r(), double t(), qui renvoient les coordonnées polaires du point (voir ci-dessous), String tostring(), qui renvoie une expression textuelle du point, comme "(2.0,3.0)", boolean equals(object o), comparaison : a.equals(b) répond à la question «a et b représentent-ils deux points égaux?», void homothetie(double k), qui applique au point une homothétie de centre (0, 0) et de rapport k ; pour cela, il suffit de remplacer (x, y) par (k x, k y), void translation(double dx, double dy), qui applique au point une translation de vecteur (dx, dy) ; cela consiste à remplacer (x, y) par (x + dx, y + dy). void rotation(double a), qui applique au point une rotation de centre (0, 0) et d angle a. Une manière qui n est pas la plus efficace de faire cela consiste à calculer les coordonnées polaires (r, t) correspondant à (x, y) puis les coordonnées cartésiennes (x, y ) correspondant à (r, t + a) Rappel de formules: x = r cos(t), y = r sin(t), r = sqrt(x 2 + y 2 ), t = atan(y / x) [ou, mieux, t = atan2(y, x) ] B. Application de la classe Point. Une ligne polygonale est définie par un certain nombre de points, ses sommets. Définissez une classe LignePol pour représenter de tels objets. Les sommets y seront mémorisés sous forme de tableau de points. Il en découle que le nombre de sommets d une ligne polygonale ne pourra pas augmenter au cours de la vie de celle-ci, mais cela ne sera pas un problème dans le cadre de cet exercice. Cette classe comportera au moins deux variables d instance privées : Point[] sommets le tableau des points qui sont les sommets de la ligne polygonale, int nbsommets le nombre de sommets (ici, cette information est redondante, puisque nbsommets = sommets.length) et les méthodes publiques : LignePol(int n), constructeur d une ligne polygonale à n sommets (initialement indéterminés), LignePol(Point[] sommets), constructeur d une ligne polygonale ayant les sommets indiqués, Point getsommet(int i), renvoie le i ème sommet, void setsommet(int i, Point p), donne p pour valeur du i ème sommet, String tostring(), renvoie une expression de la ligne polygonale sous forme de texte, void homothetie(double k), qui applique à chaque sommet de la ligne polygonale une homothétie de centre (0, 0) et de rapport k, void translation(double dx, double dy), qui applique à chaque sommet de la ligne polygonale une translation de vecteur (dx, dy)

void rotation(double a), qui applique à chaque sommet de la ligne polygonale une rotation de centre (0, 0) et d angle a En supposant (c est tout à fait fictif) que vous disposiez d un environnement graphique dans lequel on obtient le tracé du d extrémités (x 0,y 0 ) et (x 1,y 1 ) par l expression tracerligne(int x0, int y0, int x1, int y1) ajoutez à la classe LignePol une méthode tracer qui produit le tracé de la ligne polygonale. Ensuite, écrivez une méthode main qui construit et «trace» la cocotte ci-dessus. N.B. Pour faire tourner la simulation vous pouvez définir : void tracerligne(int x0, int y0, int x1, int y1) { System.out.println("tracer de (" + x0 + "," + y0 + ") à (" + x1 + "," + y1 + ")"); } C. Imaginons (c est de la fiction) qu une enquête effectuée auprès des utilisateurs de votre classe Point a montré que cette classe est correcte et pratique mais que, du point de vue des performances, il aurait mieux valu prendre pour représentation interne des points leur coordonnées polaires (r, t) au lieu des coordonnées cartésiennes (x, y). Réécrivez donc la classe Point de manière que les variables d instance soient les coordonnées polaires du point, et non plus ses coordonnées cartésiennes, en respectant la contrainte suivante : Vous devez faire en sorte que la vue publique de la classe soit inchangée, afin que les applications de la classe Point (par exemple, la classe LignePol) restent valides sans nécessiter la moindre modification. Une confirmation qu on a respecté cette contrainte sera que le programme de la question précédente fonctionne sans qu il y ait besoin de modifier quoi que ce soit. 2.5 Objets membres d autres objets Cet exercice est surtout une petite réflexion sur la notion de duplication ou clonage d objets, surtout quand il s agit d objets qui ont pour membres d autres objets (ce qui est le cas de la majorité des objets). Vous devez disposer d une classe Point, même très simple (par exemple, celle du début de l exercice précédent). Assurez-vous que cette classe n a pas de constructeur sans arguments. A. Un rectangle est déterminé par la donnée de deux points, respectivement son angle supérieur gauche et son angle inférieur droit. Définissez une classe Rectangle ayant deux variables d instance privées coinno (pour «coin Nord-Ouest») et coinse (pour «coin Sud-Est») et, au moins, les méthodes suivantes : Rectangle(double x0, double y0, double x1, double y1), constructeur d un rectangle ayant (x 0,y 0 ) et (x 1,y 1 ) pour coins, String tostring(), qui renvoie une expression du rectangle sous forme de texte, comme "[(1.0,2.0);(3.0,4.0)]", B. Faites le test suivant : public static void main(string[] args) { Rectangle r1, r2; r1 = new Rectangle(1, 2, 3, 4);

} r2 = r1; System.out.println("r1: " + r1 + ", r2: " + r2); r1.coinno = new Point(0, 0); System.out.println("r1: " + r1 + ", r2: " + r2); r1.coinse.homothetie(2); System.out.println("r1: " + r1 + ", r2: " + r2); On aurait pu penser que l expression «r2 = r1;» affectait à r2 une duplication de r1. Qu est-ce que l exécution du code précédent montre? C. Écrivez la première ligne de la classe Rectangle comme ceci public class Rectangle implements Cloneable { et l en-tête de la fonction main comme ceci public static void main(string[] args) throws CloneNotSupportedException { Maintenant remplacez la ligne «r2 = r1;» par r2 = (Rectangle) r1.clone(); Votre classe utilise donc maintenant la version prédéfinie de la méthode clone. Reexécutez le test : qu est-ce que vous constatez? D. Ajoutez à votre classe la méthode suivante (vous pouvez effacer ou non les déclarations «implements» : public Rectangle clone() { return new Rectangle(coinNO.x(), coinno.y(), coinse.x(), coinse.y()); } et refaites le test. Que constatez-vous à présent? 2.6 Fractions La bibliothèque Java ne comporte pas de classe pour représenter les fractions (comme celles de l école primaire, avec un numérateur et un dénominateur). On se propose ici de pallier ce manque, en définissant une classe Fraction munie des méthodes suivantes : public Fraction(BigInteger num, BigInteger den) constructeur basique public Fraction(int n, int d) construction d une fraction à partir de deux entiers (qu il faudra convertir en BigInteger) public Fraction(int n) construction d une fraction à partir d un entier (pour transformer un entier en fraction on met 1 comme dénominateur) public Fraction add(fraction f) addition de deux fractions public Fraction sub(fraction f) soustraction de fractions public Fraction mult(fraction f) multiplication de fractions public Fraction divi(fraction f) division de fractions public String tostring() conversion d une fraction en chaîne de caractères public double doublevalue() obtention d une valeur décimale qui est une approximation de la fraction C'est pour éviter les problèmes de débordement qu'il est conseillé de représenter le numérateur et le dénominateur d une fraction par des objets BigInteger.