Teaching - 2i002 - (TME: sujets)


2i002 : Introduction à la programmation Objet

Exercice 1 : Tracteur (composition d'objets et copie d'objets)

On suppose qu'un tracteur est composé de 4 roues et d'une cabine.

Question 1 :

Écrire une classe Roue ayant un attribut privé de type int définissant son diamètre. Ecrire deux constructeurs, l'un avec un paramètre, et l'autre sans paramètre qui appellera le premier pour mettre le diamètre à 60 cm (petite roue). Ecrire aussi la méthode toString() .

Question 2 :

Créez une classe TestTracteur dans laquelle vous testerez la classe Roue dans une méthode main où vous créerez 2 grandes roues de 120 cm et 2 petites roues. Compiler et exécuter.

Question 3 :

Écrire une classe Cabine qui a un volume (en m3) et une couleur de type String . Ecrivez un constructeur avec paramètres et la méthode toString() qui rend une chaîne de caractères donnant le volume et la couleur. Ajouter le modifieur setCouleur(String couleur) .

Question 4 :

Ajouter dans la méthode main la création d'une cabine bleue.

Question 5 :

Ecrivez la classe Tracteur où celui-ci est constitué d'une cabine et de quatre roues, avec un constructeur avec 5 paramètres, d'une méthode toString() , d'une méthode peindre(String couleur) qui change la couleur de la cabine du tracteur.

Question 6 :

Créez un tracteur t1 dans la méthode main . Il sera formé des 4 roues créées et de la cabine bleue créée précédemment. Affichez-ce tracteur.

// Creation des roues et de la cabine
Tracteur t1 = new Tracteur(cab,r1,r2,r3,r4);

Question 7 :

Ajoutez les instructions ci-dessous puis modifiez la couleur de la cabine du tracteur t2 (essayer aussi en modifiant t3).

Tracteur t2 = t1;
Tracteur t3 = new Tracteur(cab,r1,r2,r3,r4);
// modification de la couleur de t2
// et/ou modification de la couleur de t3

Quelle est la couleur de la cabine de t1 ? Expliquez pourquoi la couleur a changée. Que faut-il faire pour que t1 et t2 soient deux objets distincts qui ne contiennent pas les mêmes objets ? Expliquez, puis faites-le.

Exercice 2 : Machine à schtroumpfer (copie d'un objet composite)

On veut construire une machine à schtroumpfer les alipois. Une telle machine a une couleur et est composée d'une partie avant et d'une partie arrière. La partie avant est composée de deux pièces de type A et d'une pièce de type B. La partie arrière est composée d'une pièce de type A et d'une pièce de type C. Une pièce A a un numéro de série et est formée d'une matière (type String ). Une pièce B a un numéro de série et a une longueur (type double ). Une pièce C a un numéro de série et est de luxe ou ordinaire (booléen). Voici les classes PieceA , PieceB , et PieceC telles qu'elles sont fournies :

// classe PIECE A
public class PieceA {  
        private int noSerie;  
        private String matiere;  

        public PieceA(int n) { noSerie=n; matiere="bois"; }    
        public PieceA(int n,String m) { noSerie=n; matiere=m; }    

        public String toString() {      
                return "pieceA no "+ noSerie+ " en "+ matiere+"\n";
        }
}
// classe PIECE B
public class PieceB {  
        private int noSerie;  
        private double longueur;  

        public PieceB(int n) { noSerie=n; }  
        public PieceB(int n,double l) { noSerie=n; longueur=l; }    

        public void setLongueur(double l) { longueur=l; }    

        public String toString() {      
                return "pieceB no "+ noSerie+ " de longueur "+ longueur +"\n";  
        }
}
// classe PIECE C
public class PieceC {  
        private int noSerie;  
        private boolean luxe;  

        public PieceC(int n) { noSerie=n; }    
        public PieceC(int n,boolean b) { noSerie=n; luxe=b; }    

        public void setLuxe(boolean b) { luxe=b; }  

        public String toString() {      
                String s="pieceC no "+ noSerie;      
                if (luxe) s +=" de luxe \n";      
                else s +=" ordinaire\n";      
                return s;  
        }
}

Question 1 :

Écrire les classes Avant , Arriere et Machine (constructeurs, toString...)

Question 2 :

Écrire une méthode main qui crée une machine m1 . Il faudra évidemment créer auparavant toutes les pièces, et l'avant et l'arrière dont elle est formée. L'afficher à l'écran.

Question 3 :

Dans cette méthode main déclarer une machine m2 qui sera la copie de m1 , par l'instruction m2=m1; Modifier ensuite la couleur de m2 et la longueur de la pièce B de son avant. Afficher m1 et m2 . Que s'affiche-til ? Expliquez le problème et ce qui s'est passé.

Question 4 :

Pour éviter le problème précédent, on va créer dans chaque classe un constructeur de copie. Un tel constructeur prend en argument un objet de la classe et crée un clone de cet objet (qui est donc dupliqué entièrement). Ecrire des constructeurs de copie pour chaque classe. NB: il existe une alternative au constructeur par copie qui est couramment utilisée en JAVA, le clonage. Proposer une méthode clone sans argument qui retourne une nouvelle instance de l'objet courant.

Question 5 :

Créer maintenant une copie m3 de la machine m2 avec son constructeur de copie, puis modifier à nouveau la couleur et la longueur de la pièce B de l'avant. Affichez m2 et m3 . Que s'affiche-t-il maintenant? Expliquez.

Exercice 3 : Course avec équipe (composition d'objets)

On propose ici d'étendre l'exercice vu en séance 2 intitulé "La course de relais 4 fois 100m" pour y ajouter le concept d'équipe de coureur.

Question 1 :

Ecrire une classe Equipe (composée de quatre coureurs) qui comprend :

  • ville de type String qui est le nom de la ville de l'équipe.
  • les 4 coureurs de type Coureur .

Y ajouter les méthodes suivantes :

  • un constructeur Equipe(String v) qui crée une équipe pour la ville v de quatre coureurs.
  • la méthode public String toString() qui retourne une chaîne de caractères décrivant l'équipe avec ses coureurs. On appellera pour ce faire la méthode toString() de la classe Coureur sur les objets Coureur de cette équipe.

Question 2 :

Tester ces méthodes en créant dans le main une équipe et en l'affichant.

Question 3 :

Ecrire une méthode double tempsFinal() qui rend le temps mis par cette équipe pour courir le 400m.

Question 4 :

Ecrire une méthode Equipe rencontrer (Equipe e) qui retourne l'équipe gagnante (c'est-à-dire la référence de l'équipe gagnante) dans la compétition opposant cette équipe (receveuse du message) à l'équipe passée en paramètre. L'équipe gagnante est celle qui a mis le moins de temps à courir les 400m. Si les temps sont égaux, la méthode retourne null.

Question 5 :

Créer dans la méthode main deux équipes e1 et e2 , les faire courir et afficher les temps mis par chaque équipe ainsi que le résultat de la compétition.