:: Enseignements :: Licence :: L3 :: 2014-2015 :: Programmation Objet avec Java ::
[LOGO]

TP noté - Licence 3


Rappel: vous devez utiliser eclipse, et configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM que vous avez dans le home de votre session de TP noté.
Attention, ce TP est corrigé pour partie de façon automatique! Il est donc très important que le nom des classes et le nom des méthodes que l'on vous demande soit respectés.

Exercice 1 - C'est noël, non c'est bob

On cherche à modéliser des colis pouvant contenir des cadeaux de noël comme des briques LEGO ou des robots araignées. Puis dans un second temps, les colis pourront eux-mêmes contenir d'autres colis.
Le but principal est de pouvoir calculer le prix d'un colis en fonction des cadeaux qu'il contient et des réductions possibles.
Toutes les classes à écrire devront être déclarées dans le package fr.umlv.tpnote et le code des différents tests pour chaque question devra être regroupé (à la suite les uns des autres) dans une classe Main déclarée dans le package fr.umlv.tpnote.main.

  1. On souhaite écrire une classe LegoBricks qui modélise un ensemble de briques LEGO. Il existe deux versions de ces briques, la version classique et la version "special edition" qui possède des briques en or (au moins de couleur jaune).
    Le prix d'un ensemble de briques LEGO est calculé en multipliant par 10 le nombre de briques puis en ajoutant 10 si les briques sont une édition spéciale.
    Écrire la classe LegoBricks, son constructeur qui prend en paramètre un booléen indiquant si les briques sont une édition spéciale et le nombre de briques ainsi qu'une méthode price qui renvoie le prix sous forme d'un entier de telle sorte que le code suivant fonctionne
         LegoBricks bricks = new LegoBricks(true, 30);
         System.out.println(bricks.price());   // 310
        
  2. Modifier le code de la classe LegoBricks de sorte que l'on puisse afficher les briques LEGO avec le code suivant
         System.out.println(bricks);  // LEGO 30 bricks (special edition)
        
    L'affichage doit indiquer le nombre de briques ainsi que la mention "special edition" si les briques sont une édition spéciale, en respectant le format de l'exemple ci-dessus.
  3. Écrire la classe Packet qui modélise un colis contenant des briques LEGO. La classe doit posséder une méthode add qui permet d'ajouter des ensembles de briques LEGO au colis, une méthode numberOfItems qui renvoie le nombre d'ensembles de briques LEGO dans le colis et une méthode totalPrice qui calcule le prix total d'un colis sachant que le prix total est calculé en faisant la somme des prix de chaque ensemble de briques LEGO.
    Le code suivant devra donc fonctionner:
         LegoBricks bricks2 = new LegoBricks(false, 50);
         Packet packet = new Packet();
         packet.add(bricks);
         packet.add(bricks2);
         System.out.println(packet.numberOfItems() + " items");     // 2 items
         System.out.println("total price " + packet.totalPrice());  // total price 810
        
  4. Modifier la classe Packet de sorte que le code suivant affiche tous les ensembles de briques LEGO
         System.out.println(packet);
           // LEGO 30 bricks (special edition)
           // LEGO 50 bricks
        

    Attention à ce que votre code n'alloue pas trop d'objets !
  5. On souhaite pouvoir ajouter à un colis des robots araignées (SpiderRobot) ayant eux aussi une édition spéciale (l'araignée est alors dorée) ainsi qu'un poids en kilogrammes.
    Le prix d'une araignée est calculé en multipliant son poids par 5. Le fait qu'une araignée soit une édition spéciale ne change pas son prix.
    On veut donc que le code suivant fonctionne:
         SpiderRobot spiderRobot = new SpiderRobot(false, 20);
         Packet packet2 = new Packet();
         packet2.add(bricks);
         packet2.add(spiderRobot);
         System.out.println(packet2.numberOfItems() + " items");  // 2 items
         System.out.println(packet2); 
           // LEGO 30 bricks (special edition)
           // spider robot 20 kg 
         System.out.println("total price " + packet2.totalPrice());  // total price 410
        

    Note: il n'y a qu'une seule méthode add dans la classe Packet !
  6. Si vous ne l'avez pas déjà fait, faites en sorte que le code affichant si un ensemble de briques LEGO ou une araignée robot est une édition spéciale soit partagé (qu'il n'y ait qu'une seule occurrence de ce code).
    Le code suivant devra donc afficher
         Packet packet3 = new Packet();
         SpiderRobot spiderRobot2 = new SpiderRobot(true, 20);
         packet3.add(bricks);
         packet3.add(spiderRobot2);
         System.out.println(packet3);
           //LEGO 30 bricks (special edition)
           //spider robot 20 kg (special edition)
        
  7. On souhaite qu'il y ait une réduction (de 20) si tous les cadeaux d'un colis sont des éditions spéciales.
    Le code suivant affichera donc
         System.out.println("total price " + packet3.totalPrice());
           // total price 390
        
  8. Enfin on souhaite pouvoir mettre des colis dans les colis. Dans ce cas, le prix total d'un colis est calculé en fonction des tous les cadeaux, même ceux qui sont stockés eux-mêmes dans un colis. La réduction de prix ne s'applique que si tous les cadeaux, ceux stockés dans un colis compris, sont des éditions spéciales, par contre la méthode numberOfItems() elle ne renverra que les cadeaux dans le colis sans compter les cadeaux dans d'éventuels sous-colis.
    Le code suivant devra donc fonctionner:
         Packet packet4 = new Packet();
         packet4.add(bricks2);
         Packet packet5 = new Packet();
         LegoBricks bricks3 = new LegoBricks(true, 20);
         packet5.add(bricks3);
         packet5.add(packet4);
         packet5.add(spiderRobot2);
         System.out.println(packet4.numberOfItems() + " items");
           // 1 items
         System.out.println("total price " + packet4.totalPrice());
           // total price 500
         System.out.println(packet5.numberOfItems() + " items");
           // 3 items
         System.out.println(packet5);
           // LEGO 20 bricks (special edition)
           // LEGO 50 bricks 
           // spider robot 20 kg (special edition)
         System.out.println("total price " + packet5.totalPrice());
           // total price 810