256 lines
9.2 KiB
HTML
256 lines
9.2 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>exosJavaClasse 2</title>
|
||
|
</head>
|
||
|
<body>
|
||
|
<span style="font-family: Arial;">
|
||
|
<h1>Exercices
|
||
|
java
|
||
|
: Classes et
|
||
|
héritage</h1>
|
||
|
<span style="font-family: Arial;"><br>
|
||
|
<h2>4. Une
|
||
|
étagère à confiture</h2>
|
||
|
<span style="font-family: Arial;">
|
||
|
<ul>
|
||
|
<p><strong>4.1.</strong>
|
||
|
Reprendre l'exercice "Confitures" et créer une classe <code>Etagere</code>
|
||
|
représentant une étagère pouvant
|
||
|
contenir plusieurs pots de confitures
|
||
|
avec les méthodes suivantes : </p>
|
||
|
<ul>
|
||
|
<li><code>int
|
||
|
getNbMaxConfitures()</code> et <code>int
|
||
|
getNbConfitures()</code>
|
||
|
: les accesseurs qui renvoient respectivement le nombre maximal de pots
|
||
|
de confiture, et le nombre de pots qu'elle contient effectivement;</li>
|
||
|
<li><code>void
|
||
|
ajouter( Confiture )</code> : qui
|
||
|
ajoute un pot de confiture sur l'étagère;</li>
|
||
|
<li><code>Confiture
|
||
|
getConfiture( int )</code> : qui
|
||
|
permet de récupérer le ième pot de
|
||
|
confiture de l'étagère (la position du premier
|
||
|
pot est 1);</li>
|
||
|
<li><code>int
|
||
|
chercherConfiture( String, int )</code>
|
||
|
: qui permet de
|
||
|
chercher la position du premier pot de confiture de
|
||
|
l'étagère repéré
|
||
|
par son parfum et son année (renvoie 0 s'il n'y a pas de
|
||
|
confiture de
|
||
|
cette sorte);</li>
|
||
|
<li><code>Confiture
|
||
|
enleverConfiture( int )</code> et <code>Confiture
|
||
|
enleverConfiture( String, int )</code>
|
||
|
: pour la suppression d'un pot de confiture de
|
||
|
l'étagère, soit par sa
|
||
|
position, soit par son parfum et année; il faut alors
|
||
|
"tasser" les
|
||
|
confitures vers le début de l'étagère;
|
||
|
les deux méthodes renvoient le
|
||
|
pot de confiture que l'on a supprimé (<code>null</code>
|
||
|
si aucun).</li>
|
||
|
<li><code>toString()</code>
|
||
|
: qui permet d'afficher le contenu d'une étagère.
|
||
|
Le constructeur prendra
|
||
|
en
|
||
|
paramètre le nombre maximal de
|
||
|
pots que peut
|
||
|
contenir l'étagère. L'implémentation
|
||
|
de l'étagère pourra se faire par un tableau ou un
|
||
|
Vector,
|
||
|
mais cela ne doit pas être visible de
|
||
|
l'extérieur.</li>
|
||
|
</ul>
|
||
|
</ul>
|
||
|
</span>
|
||
|
<div style="margin-left: 40px;"><span style="font-family: Arial;"><strong>4.2.</strong>
|
||
|
Créer un main
|
||
|
qui permette de tester toutes ces méthodes ; tester avec 2
|
||
|
étagères
|
||
|
<h2>5.Une
|
||
|
étagère générique...</h2>
|
||
|
<span style="font-family: Arial;">
|
||
|
<p>Le but est de
|
||
|
créer
|
||
|
une nouvelle classe plus générique afin de
|
||
|
pouvoir ranger sur notre étagère autre chose que
|
||
|
des confitures.
|
||
|
Pour cela, nous allons créer une hiérarchie de
|
||
|
classes représentant tous les types de conserves que l'on
|
||
|
souhaite stocker.</p>
|
||
|
<ul>
|
||
|
<p><strong>5.1.</strong>
|
||
|
Créer une classe abstraite <code>Conserve</code>
|
||
|
représentant tous les types de conserves.</p>
|
||
|
<p>Une conserve
|
||
|
contiendra
|
||
|
toujours :</p>
|
||
|
<ul>
|
||
|
<li>un identifiant<br>
|
||
|
</li>
|
||
|
<li>le nom du cuisinier</li>
|
||
|
<li>la date (ou
|
||
|
l'année de création et de stockage)</li>
|
||
|
<li>une méthode
|
||
|
abstraite d'ajout sur une étagère <code>abstract
|
||
|
public void ajouter(Etagere e);</code></li>
|
||
|
<li>et toutes les
|
||
|
méthodes d'accès et de modifications
|
||
|
nécessaires...</li>
|
||
|
</ul>
|
||
|
<p>La méthode <code>ajouter
|
||
|
</code>sera
|
||
|
spécifique
|
||
|
à chaque type
|
||
|
de conserve, car certaines prendront plus de place que d'autres !</p>
|
||
|
<p><strong>5.2.</strong>
|
||
|
Modifier maintenant la classe <code>Confiture</code>
|
||
|
afin qu'elle hérite de la classe <code>Conserve</code>.</p>
|
||
|
<p><strong>5.3.</strong>
|
||
|
Créer une nouvelle classe <code>Moutarde</code>
|
||
|
spécialisant aussi la classe <code>Conserve</code>.</p>
|
||
|
<p> Cette classe
|
||
|
contiendra en
|
||
|
plus
|
||
|
des informations de la classe <code>Conserve</code>
|
||
|
un entier type qui décrira le type de moutarde dont
|
||
|
il s'agit. Cet attribut prendra une valeur parmi les constantes :</p>
|
||
|
<ul>
|
||
|
<li><code>ANCIENNE
|
||
|
= 0</code> : pour de la moutarde
|
||
|
à l'ancienne;</li>
|
||
|
<li><code>CONDIMENT
|
||
|
= 1</code> : pour de la moutarde
|
||
|
condiment;</li>
|
||
|
<li><code>FORTE
|
||
|
= 2</code> : pour de la moutarde
|
||
|
forte.</li>
|
||
|
</ul>
|
||
|
<p> Ces constantes seront
|
||
|
stockées comme attributs statiques de la classe <code>Moutarde</code>.</p>
|
||
|
<p> Pour la
|
||
|
méthode <code>void
|
||
|
ajouter(Etagere e)</code>
|
||
|
demandée par la superclasse <code>Conserve</code>,
|
||
|
il faudra prendre en compte
|
||
|
la spécificité des pots de moutarde à
|
||
|
l'ancienne. Ceux-ci étant en
|
||
|
terre cuite, ils sont très volumineux et
|
||
|
nécessitent
|
||
|
deux emplacements
|
||
|
sur l'étagère. Pour les deux autres types de
|
||
|
moutarde, ils s'ajoutent à
|
||
|
l'étagère de manière normale.</p>
|
||
|
<p> <strong>5.4.</strong>
|
||
|
Tester ces classes avec un programme ajoutant plusieurs types de
|
||
|
conserves sur une étagère.</p>
|
||
|
<p> <strong>5.5.</strong>
|
||
|
Pour finir, on peut généraliser nos
|
||
|
étagères afin qu'elles stockent toutes sortes
|
||
|
d'objets et pas uniquement des conserves. Pour cela, définir
|
||
|
une interface <code>Stockable</code>
|
||
|
décrivant le comportement
|
||
|
d'un objet que l'on souhaite stocker sur notre
|
||
|
étagère.</p>
|
||
|
<p> Cette interface
|
||
|
comportera
|
||
|
uniquement une méthode <code>void
|
||
|
ajouter(Etagere e);</code></p>
|
||
|
<p> Modifier toutes les
|
||
|
classes
|
||
|
précédentes afin qu'elles implémentent
|
||
|
cette interface. Modifier aussi
|
||
|
la classe <code>Etagere</code>
|
||
|
qui maintenant gère un tableau de <code>Stockable</code>.<br>
|
||
|
</p>
|
||
|
</ul>
|
||
|
</span>
|
||
|
<h2> 6. Trois petits
|
||
|
points...</h2>
|
||
|
<p> <strong>6.1</strong>
|
||
|
Créer une classe <code>Point</code>
|
||
|
permettant de manipuler des points du plan. On la munira :</p>
|
||
|
<ul>
|
||
|
<li>de deux attributs
|
||
|
privés <code>x</code>
|
||
|
et <code>y</code>
|
||
|
réels correspondant à l'abscisse et à
|
||
|
l'ordonnée de ce point;</li>
|
||
|
<li>d'un constructeur sans
|
||
|
argument, qui crée le point de
|
||
|
coordonnées (0,0);</li>
|
||
|
<li>d'un constructeur recevant
|
||
|
deux arguments réels, qui sont
|
||
|
respectivement l'abscisse et l'ordonnée du point;</li>
|
||
|
<li>de deux accesseurs <code>public
|
||
|
double getX()</code> et <code>public
|
||
|
double getY()</code> pour l'abscisse
|
||
|
et l'ordonnée; on ne
|
||
|
fournira pas de modificateurs;</li>
|
||
|
<li>d'une méthode <code>public
|
||
|
void translation ( double vx,
|
||
|
double vy )</code> permettant de
|
||
|
translater un point, ainsi que d'une
|
||
|
méthode <code>public
|
||
|
Point imageParTranslation( double vx,
|
||
|
double vy )</code> permettant de
|
||
|
construire l'image d'un point par une
|
||
|
translation de vecteur <code>(vx,vy)</code>;</li>
|
||
|
<li>de la méthode <code>public
|
||
|
String toString()</code>
|
||
|
affichant les coordonnées du point sous la forme (x,y).</li>
|
||
|
</ul>
|
||
|
<p> <strong>6.2</strong>
|
||
|
Tester cette classe avec le code suivant :</p>
|
||
|
<blockquote>
|
||
|
<pre> public class Geometrie {<br> public static void main() {<br> Point p1, p2, p3;<br> p1 = new Point();<br> System.out.println( "Création du point p1 : " + p1 );<br> p2 = new Point( 1, 2 );<br> System.out.println( "Création du point p2 : " + p2 );<br><br> System.out.println( "\nTranslation de vecteur (3,4) ..." );<br><br> p1.translation( 3, 4 );<br> System.out.println( "Le point p1 après translation : " + p1 );<br><br> p3 = p2.imageParTranslation( 3, 4 );<br> System.out.println( "L'image du point p2 après translation : " + p3 );<br> System.out.println( "Mais p2 n'a pas changé, p2 : " + p2 );<br> }<br>}<br></pre>
|
||
|
</blockquote>
|
||
|
<p> Il faut obtenir le
|
||
|
résultat suivant :</p>
|
||
|
<blockquote>
|
||
|
<pre> Création du point p1 : (0, 0)<br>Création du point p2 : (1, 2)<br><br>Translation de vecteur (3,4) ...<br>Le point p1 après translation : (3, 4)<br>L'image du point p2 après translation : (4, 6)<br>Mais p2 n'a pas changé, p2 : (1, 2)<br></pre>
|
||
|
</blockquote>
|
||
|
<p> <strong>6.3</strong>
|
||
|
Ajouter à la classe
|
||
|
précédente :
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li>les
|
||
|
méthodes <code>public
|
||
|
static double calculRayon(
|
||
|
double x, double y )</code> et <code>public
|
||
|
static double calculAngle(
|
||
|
double x, double y )</code>,
|
||
|
permettant d'obtenir, à partir des
|
||
|
coordonnées cartésiennes (x, y) d'un point, ses
|
||
|
coordonnées polaires. <br>
|
||
|
<i>Rappel</i>
|
||
|
: les fonctions mathématiques usuelles sont
|
||
|
définies dans la classe <code>Math</code>
|
||
|
de <code>java.lang</code>.</li>
|
||
|
<li>les méthodes de
|
||
|
classe permettant d'effectuer la
|
||
|
conversion inverse : <code>public
|
||
|
static double calculAbscisse( double
|
||
|
r, double t )</code> et <code>public
|
||
|
static double calculOrdonnee(
|
||
|
double r, double t )</code>;</li>
|
||
|
<li>les méthodes <code>public
|
||
|
double getRayon()</code> et <code>public
|
||
|
double getAngle()</code> qui
|
||
|
fournissent
|
||
|
les coordonnées polaires d'un point.</li>
|
||
|
</ul>
|
||
|
<span style="font-family: Arial;">
|
||
|
<ul>
|
||
|
</ul>
|
||
|
</span>
|
||
|
</span></div>
|
||
|
</span>
|
||
|
</span>
|
||
|
</body>
|
||
|
</html>
|