:: Enseignements :: Licence :: L3 :: 2016-2017 :: Programmation Objet avec Java ::
[LOGO]

Revision - Examen de POO d'il y a deux ans


Exercice 1 - Questions de cours (6)

Répondez aux questions suivantes en deux ou trois phrases, pas plus.

  1. Qu'est-ce que le principe d'encapsulation ?
    Pourquoi est-ce intéressant ?
  2. Qu'est-ce que le sous-typage ?
    Pourquoi est-ce intéressant ?
  3. Qu'est-ce que le polymorphisme ?
    Pourquoi est-ce intéressant ?
  4. Dans quel cas doit on utiliser try/catch plutôt que throws ?
  5. Indiquer le code de l'expression XXX sachant que l'on veut utiliser une "method reference" sur la méthode filter.
            class Foo {
              private static boolean filter(String s) {
                return s.equals("foo");
              }
              public static void main(String[] args) {
                ArrayList<String> list = new ArrayList<>(Arrays.asList("foo", "bar", "foo", "baz"));
                list.removeIf(XXX));
                System.out.println(list);  // bar baz
              }
            }
          
  6. Pourquoi le code ci-dessous ne marche pas ?
    Que se passe-t-il si on l'exécute ?
            public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<String>();
              list.add("foo");
              list.add("bar");
              for(String s: list) {
                list.add(s);
              }
            }
          

Exercice 2 - Petit Soldat (7)

On cherche à implanter une classe Soldier qui représente un soldat et qui peut taper sur les autres soldats.
Vous devez faire très attention aux modificateurs que vous allez déclarer devant les classes, les champs et les méthodes. De plus, il vous sera retiré 1 point par morceau de code non nécessaire.

  1. Déclarer une classe Soldier avec un constructeur permettant d'indiquer un nom (une chaîne de caractère), une force (un entier) et une vie (un entier).
  2. Ré-écrire le code du constructeur sachant que l'on veut interdire qu'un soldat puisse avoir un nom null, une force ou une vie négative ou nulle.
  3. Indiquer le code de la méthode hit qui permet à un soldat de porter un coup à un autre soldat.
    Lorsqu'un soldat porte un coup à un autre soldat, le soldat qui reçoit le coup a son niveau de vie décrémenté de la valeur de la force du soldat qui a porté le coup. Par exemple, avec 'jane' et 'bob' deux soldats définis comme ceci
               Soldier jane = new Soldier("jane", 7, 20);
               Soldier bob = new Soldier("bob", 10, 15);
              
    si jane 'hit' bob, alors le niveau de vie de bob descend à 8.
    De plus, si après que le coup ait été porté, le soldat frappé meurt, la méthode devra afficher le message 'soldier [nom du soldat] died'. Enfin, un soldat mort ne doit pas pouvoir frapper un autre soldat par contre il est possible de frapper un soldat déjà mort.
  4. On souhaite maintenant avoir deux types de soldat, les soldats normaux (Soldier) et les soldats avec armure (ArmoredSoldier).
    Écrire la classe ArmoredSoldier et son constructeur sachant qu'en plus d'un nom, d'une force et d'un vie, un soldat en armure possède une valeur d'armure qui sera passée en dernier paramètre du constructeur.
  5. Indiquer le code qu'il faut modifier pour que, lorsqu'un soldat frappe un soldat avec une armure, dans ce cas, le calcul de la valeur de vie soit fait en soustrayant de la force de l'attaquant, l'armure du soldat attaqué.
    Note: veillez à ce que l'armure ne puisse pas faire gagner de vie !
    Pour l'implantation, vous devez utiliser le polymorphisme pour séparer le comportement d'un soldat et d'un soldat en armure et en aucun cas votre code ne doit avoir des tests sur le type de soldat (instanceof, getClass, un booléen, sont à proscrire).

Exercice 3 - Liste chaînée (7)

On cherche a écrire une liste chaînée générique pouvant stocker des éléments de même type. On représentera la liste chainée par une seule classe qui correspond à un maillon de la liste chainée. Chaque maillon aura deux champs, un champ element qui stockera l’élément d'un maillon et un champ next qui stockera le maillon suivant ou null s'il s'agit du dernier maillon.
Si vous n'arrivez pas à déclarer et utiliser les types paramétrés, vous pouvez écrire le code en considérant que la liste ne stocke que des entiers. Bien sûr, vous ne pourrez prétendre qu'à 4 points sur les 7 de l'exercice.
Vous devez faire très attention aux modificateurs que vous allez déclarer devant les classes, les champs et les méthodes. De plus, il vous sera retiré 1 point par morceau de code non nécessaire.

  1. Indiquer le code de la classe Node ainsi que son constructeur.
  2. Écrire une méthode d'affichage récursive permettant d'afficher l'ensemble des éléments séparés par des virgules.
  3. Indiquer une seconde version de la méthode d'affichage faisant un parcours itératif de la liste chainée.
    Faîtes en sorte que cela soit efficace !
  4. Écrire une méthode statique of qui permet de créer des maillons de cette façon
            Node<Integer> node = Node.of(3, Node.of(4, Node.of(5, null)));
          
    Le code de la méthode délèguera au constructeur le soin de créer les maillons en utilisant la syntaxe diamant.
  5. On souhaite écrire une méthode filter que l'on appelle sur la liste, qui prend en paramètre une fonction et qui renvoie une nouvelle liste. Par exemple, la méthode filter appliquée à la liste 3, 4, 5 avec un filtre ne sélectionnant que les nombres impairs devra renvoyer une liste 3, 5. Un filtre est une fonction qui pour chaque élément de la liste renvoie un booléen, si celui-ci est vrai, élément devra être dans la liste renvoyée par la méthode filter, si l'élément est faux, l'élément ne devra pas se retrouver dans la liste renvoyée par la méthode filter.
    Écrire un code permettant de filtrer la liste stockée dans la variable node définie ci-dessus, pour obtenir une liste contenant les entiers pairs (divisible par 2, c-a-d dont le reste par la division par 2 est 0) en utilisant une lambda.
    Puis écrire le code de la méthode filter, en récursif ou en itératif, à votre convenance.