Devoir 3 - IFT1025, Hiver 2007 

Travail individuel 

 

Remise électronique : remise ift1025 devoir3 vos_fichiers 

Date limite de la remise : Mercredi 7 février avant midi (les remises en retard seront refusées) 

 

Cet exercice vise à pratiquer l’organisation et l’utilisation des interfaces en combinaison avec des classes. Vous explorez les utilisations possibles de ces deux notions, et obtenez une idée concrète sur les différences entre elles. 

 

Le problème 

Nous voulons d’abord établir une hiérarchie de classes pour des animaux. Cette hiérarchie est illustrée dans la figure suivante : 

De plus, il y a une autre hiérarchie pour les capacité des animaux comme suit, qui sont définir comme des interfaces : 

 

 

Voici des spécifications de chaque classe. 

1. Animal (classe abstraite) 

Possède un poids (float), et une méthode getPoids() qui retourne le poids. 

Tous les animaux savent se déplacer. 

2. Vertébré (classe abstraite) 

Rien d’additionnel 

3. Poisson (classe abstraite) 

Sait nager. 

4. Amphibien (classe abstraite) 

Sait nager; Sait courir. 

5. Mammifère (classe abstraite) 

Rien d’additionnel

6. Oiseau (classe abstraite)

Sait courir.

7. Truite

0.1£Poids£10(kg); 1£Vitesse à la nage£10 (km/h);

8. Carpe

0.1£Poids£25; 1£Vitesse à la nage£6;

9. Grenouille

0.1£Poids£1; 2£Vitesse sur sol£5; 1£Vitesse à la nage£5;

10. Chèvre

Sait courir; 1£Poids£100; 10£Vitesse au sol£50;

11. Chauve-souris

Sait courir; Sait voler; 0.1£Poids£0.5; 20£Vitesse au vol£60; 1£Vitesse au sol£2;

12. Baleine

Sait nager; 10£Poids max£50000; 20£Vitesse à la nage£40;

13. Mouette

Sait voler et nager, 0.1£Poids£1; 20£Vitesse au vol£70; 2£Vitesse au sol£8; 1£Vitesse à la nage£3;

14. Pingouin

Sait nager; 1£Poids£10; 1£Vitesse au sol£4; 2£Vitesse à la nage£10;

 

Pour les interfaces, chacune contient une méthode. Ces méthodes sont comme suit :

1. Déplacer

int getVitesseMax()

2. Nager

int getVitesseNager()

3. Courir

int getVitesseCourir ()

4. Voler

            int getVitesseVoler()

 

Utilisation des classes dans une classe Test

Votre programme s’appellera « Test.java ». Quand on lance ce programme, le programme doit exécuter successivement les tâches suivantes :

 

1. On demande à l’utilisateur un nombre, et le programme génère ce nombre d’animaux au hasard, correspondant aux sous-classes du plus bas niveau (Truite, Carpe, etc.). Ces animaux sont stocké dans un ArrayList : ArrayList<Animal> zoo.

Pour chaque instance, selon les caractéristiques de la classe, on génère aussi un poids (float) au hasard entre 0 et le poids max de l’espèce (classe), une ou des vitesse(s) de déplacement (entier) – une vitesse pour chaque moyen de déplacement possible.

 

2. Afficher les caractéristiques de chaque animal généré. Par exemple

Les animaux dans le zoo sont :

Carpe : 4.56 kg, nage à 3 km/h.

Baleine : 2756 kg, nage à 22 km/h.

Mouette : 0.34 kg, vole à 45 km/h, court à 4 km/h, nage à 2 km/h.

Grenouille : 0.5 kg ; court à 3 km/h, nage à 5 km/h.

 

Indice : Utiliser une référence Animal pour parcourir ArrayList d’animaux.

 

3. Compétition de poids

Parmi ces animaux, déterminer celui qui est le plus lourd (selon son poids, et non le poids max de la classe). Afficher un message pour indiquer le résultat. Par exemple :

L’animal le plus lourd est :

Baleine : 2756 kg, nage à 22 km/h

 

Indice : Utiliser une référence Animal pour parcourir ArrayList d’animaux, et getPoids pour connaître le poids de l’animal.

 

4. Compétition de vitesse toute catégories

Parmi tous les animaux, déterminer celui qui peut se déplacer le plus vite (quelque soit le moyen de déplacement – voler, courir ou nager) pour une distance de 10 km. Afficher un message pour indiquer le résultat. Par exemple :

La gagnant de course toutes categories est :

Mouette : 0.34 kg, vole à 45 km/h, court à 4 km/h, nage à 2 km/h.

Temps : 0.22 h.

 

Ici, 0.22h signifie 0.22*60 minutes (et non 22 minutes).

Indice : Utiliser une référence Deplacer pour parcourir les animaux. getVitesseMax() doit retourner la vitesse maximale de déplacement de l’animal, que ce soit à la course, au vol ou à la natation.

 

5. Compétition de natation

Parmi tous les animaux, déterminer ceux qui peuvent nager pour constituer une sous-compétition de natation de 10 km. Un autre ArrayList « ArrayList<Nager> natation » sera créé. Déterminer parmi ces animaux celui qui nage le plus vite. Afficher un message pour indiquer le résultat. Par exemple :

La gagnant de natation est :

Baleine : 2756 kg, nage à 22 km/h

Temps : 0.45 h.

 

Indice : Utiliser une référence Nager pour parcourir les animaux.

 

6. Compétition « bi-disciplinaire »

On fait une compétition de course de 10 km suivie d’une nation de 1 km. Inscrivez les animaux pouvant courir et nager dans cette compétition. Déterminer le gagnant et afficher un message indiquant l’animal gagnant et son temps de parcours.

La gagnant de la compétition bi-disciplinaire est :

Mouette : 0.34 kg, vole à 45 km/h, court à 4 km/h, nage à 2 km/h.

Temps : 3.00 h

 

Indice : Utiliser une référence Deplacer pour parcourir les animaux en compétition. Mais vous aurez besoin de faire « caster » la référence à Courir et Nager durant le traitement.

 

 

Évaluation

Cet exercice occupe 5% dans l’évaluation globale du cours. Les 5 points sont attribués de façon suivante :

-          Définition correcte des classes et des interfaces, structure du programme globale : 1 point

-          Génération des animaux selon le nombre que l’utilisateur entre et Afficher les animaux : 1 point

-          Compétition du poids : 1 point

-          Compétition de natation : 1 point

-          Compétition bi-disciplinaire: 1 point

 

Conseils

-         Pour une instance, on peut connaître sa classe avec la méthode getName(), qui retourne un String = nom de la classe. Cette méthode sera utile pour l’impression des messages.

-         Vous pouvez aussi utiliser instanceOf pour tester si une instance est d’un type de donnée. Le type peut être une classe ou une interface. Par exemple, on peut vérifier avec « ref1 instanceOf Voler » pour tester si l’instance de ref1 peut Voler (si sa classe implements Voler).

-         Vous n’êtes pas demandés à traiter les accents. Pour éviter des problèmes, vous pouvez utiliser Vertebre au lieu de Vertébré comme nom de classe.