:: Enseignements :: Licence :: L3 :: 2016-2017 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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.
-
Qu'est-ce que le principe d'encapsulation ?
Pourquoi est-ce intéressant ?
-
Qu'est-ce que le sous-typage ?
Pourquoi est-ce intéressant ?
-
Qu'est-ce que le polymorphisme ?
Pourquoi est-ce intéressant ?
-
Dans quel cas doit on utiliser try/catch plutôt que throws ?
-
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
}
}
-
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.
-
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).
-
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.
-
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.
-
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.
-
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.
-
Indiquer le code de la classe Node ainsi que son
constructeur.
-
Écrire une méthode d'affichage récursive permettant d'afficher
l'ensemble des éléments séparés par des virgules.
-
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 !
-
É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.
-
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.
© Université de Marne-la-Vallée