TD5 2324

Vous devez être capable de répondre à toutes les questions qui sont posées ci-dessous, et de justifier votre réponse. Si ce n'est pas le cas, appelez l'intervenant.

I.  Écrire une classe Forme (qui représentera une forme géométrique simple) :

     Vous pouvez imaginer qu'il y aura des sous-classes telles que Cercle, Rectangle, Hexagone, ...

 

I.1  Deux attributs : les coordonnées entières sur l'écran d'un point de référence aX et aY.

I.2  Le constructeur naturel .

I.3  Une fonction perimetre qui doit calculer et retourner le périmètre de la forme courante. Un problème pour l'écrire ? Donc ?

I.4  Une fonction surface qui doit calculer et retourner la surface de la forme courante. Un problème pour l'écrire ? Donc ?

     Quel type devront retourner ces 2 fonctions ? Et quelle est la conséquence de leur présence pour la déclaration de la classe ?

I.5  Une fonction calcRatio qui doit calculer et retourner le facteur de forme (c'est-à-dire le ratio périmètre divisé par surface) de la forme courante. On supposera que la surface n'est jamais nulle ; peut-on écrire le code de cette fonction ?

 

II.  Écrire la classe Cercle :

 

II.1  C'est évidemment une sorte de Forme.

II.2  Un attribut supplémentaire : le rayon. (en nombre de pixels)

II.3  Le constructeur naturel (à combien de paramètres ?)

II.4  Les 2 fonctions nécessaires pour que la classe soit instanciable.

Vous allez avoir besoin de la constante π : cette constante (vous savez donc écrire son nom) de classe est définie dans la classe Math. Par contre, les opérateurs puissance ^ ou ** n'existent pas (faites au plus simple !).

 

III.  Écrire une classe Utilisation :

 

III.1   Cette classe ne sert qu'à contenir une procédure essai pour mettre en oeuvre les 2 classes précédentes.

Donc pas d'attribut, donc pas de constructeur, donc on ne l'instanciera pas. Donc, comment en interdire l'instanciation ?
Du coup, comment permettre l'appel de la procédure
essai ?      Cette procédure devra :

III.2   Déclarer/créer un objet Cercle.

III.3   Afficher son périmètre, sa surface, et son facteur de forme.

 

IV. Rendre les Formes Comparables :

 

IV.1  Pour cela, la classe Forme devra respecter l'interface Comparable du JDK. Complétez la signature de la classe pour respecter cette intention.

Nouveauté par rapport au TP ! On peut spécifier le type des objets à comparer en écrivant Comparable<MonType>. Cette interface est importée par défaut, comme les classes System et Math.

IV.2  L'interface Comparable du JDK ne contient qu'une seule méthode dont voici la signature :

int compareTo( final MonType pObj ) (Quel est le type des objets que l'on veut comparer ici ?)

Pour information, cette fonction doit retourner un entier négatif, nul, ou positif (généralement -1, 0, ou 1) selon que l'objet courant est inférieur, égal, ou supérieur à l'objet passé en paramètre, mais pour cette première version, on se contentera de retourner systématiquement le nombre 99 (sauf si le paramètre est l'objet courant : dans ce cas, retourner 0) en attendant de pouvoir l'écrire correctement, car il y a besoin des d'explications du point V ci-dessous pour cela.

 

V. Écrire vraiment le code de la fonction compareTo dans la classe Forme :

V.1  Deuxième version : Au lieu de retourner 99, il faut maintenant comparer la surface() de l'objet courant avec celle du paramètre

(on aurait pu choisir un autre critère de comparaison).

On pourrait faire des tests (if else), mais puisque l'on a 2 nombres réels à comparer, le JDK nous fournit une méthode compareTo jà écrite dans la classe Double (cette classe ne possède qu'un attribut de type double mais possède un constructeur naturel et plusieurs méthodes bien utiles).

Il suffit donc de créer un objet de type Double (à l'aide de son constructeur naturel) et d'appeler dessus sa méthode compareTo pour que le bon résultat soit calculé (il n'y a plus qu'à le retourner !).

V.2  Troisième version : Supposons que la méthode equals de la classe Forme ait été écrite par ailleurs et qu'elle compare aussi les surfaces ; peut-être les compare-t-elle avec une précision de 10-9 ou 10-12, par exemple ?

Il pourrait donc y avoir un problème si f1.compareTo(f2)==0 n'était pas toujours cohérent avec f1.equals(f2)==true.

Quelle petite chose faut-il modifier dans compareTo pour forcer son résultat à être cohérent avec celui d' equals ?

 

VI.  Compléter la classe Utilisation :

VI.1  Compléter la procédure essai pour qu'elle crée des objets différents afin de pouvoir tester toutes les combinaisons avec compareTo.

VI.2  Ajouter des appels à  compareTo  et des affichages  pour montrer  que la comparaison fonctionne  dans tous les cas  (même objet,
pas même Forme, forme inférieure, égale, et supérieure).

VI.3  Si vous avez terminé ou lorsque vous passerez ce TP sur machine, créez une classe Carre et une classe TriRec (triangle rectangle à 2 attributs longueur et hauteur), et modifiez la classe Utilisation en conséquence pour tester un maximum de possibilités.

La fonction Math.hypot(x,y) (voir sa javadoc) vous facilitera les choses ...

VI.4  Expliquer les différents appels de méthodes qui se succèdent quand on écrit unCercle.compareTo(unCarré).
Et
unCarré.compareTo(unCercle) ? Et unCercle.compareTo(uneString) ? Et uneString.compareTo(unCercle) ?