Vous êtes sur la page 1sur 8

Licence 3 – MIDO – 2020–2021 Programmation Java

Examen UE Java-Objet

• Date de l’examen : 06/01/2021 de 8h30 à 10h30


• Durée de l’examen : 2h
• Documents et calculatrice non autorisés.
• Pour tous les exercices, on supposera que tous les import et package sont gérés (vous n’avez donc pas à les
mentionner).
• Le barème est donné à titre indicatif et pourra être modifié.

Exercice 1 : Questions de cours. (8 points)

1. Si vous voulez utiliser certaines classes de Java dans votre code, vous devez utiliser le mot clé import.
Par exemple, si vous voulez utiliser la classe Random, vous devez écrire import java.util.Random;.
Est-il possible de se passer de cette ligne ? Si oui, comment ?

Il faut utiliser le nom qualifié. Par exemple java.util.Random r = new java.util.Random();.

2. Voici un code qui affiche une liste d’entiers :

1 public void printList(List<Integer> list){


2 for(int i = 0; i < list.size(); i++){
3 System.out.println(list.get(i));
4 }
5 }

Quelle est la complexité de cette méthode si list est un ArrayList ? un LinkedList ? Pouvez-vous
proposer une meilleure réécriture de cette méthode ?

Si list est un ArrayList, la complexité est en O(n). Si list est un LinkedList, la complexité
est en O(n2 ). On peut proposer la réécriture suivante :

1 public void printList(List<Integer> list){


2 Iterator<Integer> it = list.iterator();
3 while(it.hasNext()){
4 int i = it.next();
5 System.out.println(i);
6 }
7 }

3. On dispose d’une classe Personne qui a trois attributs int abs, int ord et boolean contamine.
Cette classe dispose d’une méthode d’instance qui étant donné un Personne autre, et un seuil
double theta, passe l’attribut contamine de autre à true si ce dernier est à une distance inférieure
à theta :

1 public void contamine(Personne autre, double theta){


2 if(this.distance(autre) < theta){
3 autre.contamine = true;
4 }
5 }

Fournir une documentation Javadoc de cette méthode.


Licence 3 – MIDO – 2020–2021 Programmation Java

1 /**Etant donné une instance de Personnage autre, et un seuil theta,


2 cette méthode contamine autre si ce dernier est à une distance inférieur
3 à theta de l'instance courante.
4 * @param autre, une autre instance de Personnage.
5 * @param theta, le seuil de distance de contamination.
6 */
7 public void contamine(Personne autre, double theta){
8 if(this.distance(autre) < theta){
9 autre.contamine = true;
10 }
11 }

4. Citer trois annotations utilisées dans les tests JUnit.

@Test, @ParameterizedTest, @BeforeEach, @AfterEach, @ValueSource, @CsvSource, ...

5. Ce code compile-t-il ? Si la réponse est non, expliquer les erreurs. Si la réponse est oui, qu’affiche-
t-il ?

1 public class Livre{


2 private String titre;
3 private int nbEmprunt;
4 private static int nbEmpruntTotal;
5 private boolean disponible = true;
6

7 public Livre(String s){


8 this.titre = s;
9 }
10

11 public emprunt(){
12 disponible = false;
13 }
14

15 public static void main(String[] args){


16 Livre a = new Livre();
17 Livre b = Livre("Tintin et le vaccin interdit");
18

19 a.emprunt();
20 Livre.nbEmprunt++;
21 Livre.nbEmpruntTotal++;
22

23 b.emprunt();
24 Livre.nbEmprunt++;
25 Livre.nbEmpruntTotal++;
26

27 System.out.println(a.nbEmpruntTotal);
28 }
29 }
Licence 3 – MIDO – 2020–2021 Programmation Java

1 public class Livre{


2 ...
3

4 public emprunt(){ //manque le type de retour


5 disponible = false;
6 }
7

8 public static void main(String[] args){


9 Livre a = new Livre(); // Le constructeur par défaut n'est pas généré..
10 Livre b = Livre("Tintin et le vaccin interdit"); //Il manque le new
11

12 a.emprunt();
13 Livre.nbEmprunt++; //nbEmprunt n'est pas une variable static
14 Livre.nbEmpruntTotal++;
15

16 b.emprunt();
17 Livre.nbEmprunt++; //nbEmprunt n'est pas une variable static
18 Livre.nbEmpruntTotal++;
19

20 System.out.println(a.nbEmpruntTotal);
21 }
22 }

6. Ce code compile-t-il ? Si la réponse est non, expliquer les erreurs. Si la réponse est oui, qu’affiche-
t-il ?

1 public class Livre{


2 protected String titre;
3 protected int dateParution;
4

5 public Livre(String s){


6 this.titre = s;
7 }
8

9 public void affiche(){


10 System.out.println("Je suis un livre de " + dateParution
11 + " ! Mon titre est " + this.titre + ".");
12 }
13 }

1 public class BD extends Livre{


2

3 public BD(String s){


4 super(s);
5 }
6

7 public void affiche(){


8 System.out.println("Je suis une BD de " + dateParution
9 + " ! Mon titre est " + this.titre + ".");
10 }
11 }

1 public class Main{


2 public static void main(String[] args){
3 Livre a = new Livre("Alice au pays du Covid");
4 BD b = new BD("Tintin et le vaccin interdit");
Licence 3 – MIDO – 2020–2021 Programmation Java

6 List<Livre> liste = new LinkedList<Livre>();


7 liste.add(a);
8 liste.add(b);
9

10 for(Livre l: liste){
11 l.affiche();
12 }
13 }
14 }

Ce code compile. Il affiche :


"Je suis un livre de 0 ! Mon titre est Alice au pays du Covid.
Je suis une BD de 0 ! Mon titre est Tintin et le vaccin interdit."

Exercice 2 : Pandémie (12 points)


Dans l’exercice, on vous demande d’implémenter des classes. Lisez d’abord l’ensemble du sujet, cela
vous aidera peut-être à faire des choix pertinents pour l’implémentation et à ajouter certaines méthodes
nécessaires. On supposera que les import sont gérés. L’annexe contient des informations sur les méthodes
des classes et interfaces Object, Map et Entry.

Une équipe de chercheur souhaite développer un logiciel pour modéliser comment un virus se propage
dans une population. Une personne possède un nom (de type String) et un identifiant unique (de type
int). On lui attribue également une variable contamine de type boolean qui indique si cette personne est
contaminée, et une variable seuil de type int. Enfin, une personne possède des amis. Cela sera représenté
à l’aide d’un HashMap où les clefs sont des Personne et les valeurs sont des int (cette valeur indique ce
que l’on nommera le poids de l’amitié). Plus le poids de l’amitié entre deux personnes est élevé et plus ils
passent de temps ensemble (ainsi on estime qu’il y a plus de chances de contamination).

Question 1 : Ecrivez une classe Personne qui représentera une personne avec un constructeur par défaut
et un constructeur qui prend en paramètre un String nom et un int seuil. Les questions 2, 3 et 4 vous
demanderont d’ajouter des méthodes, vous pouvez donc laisser de l’espace pour compléter cette classe plus
tard.

1 public class Personne {


2 private final int ID = nbPersonne++;
3 private static int nbPersonne;
4 private String nom;
5 private boolean contamine = false;
6 private HashMap<Personne, Integer> amis = new HashMap<>();
7 private int seuil;
8

9 public Personne(){}
10

11 public Personne(String nom, int seuil){


12 this.nom = nom;
13 this.seuil = seuil;
14 }
15 }
Licence 3 – MIDO – 2020–2021 Programmation Java

Question 2 : Ecrivez dans la classe Personne une méthode de classe


ajoutAmitie(Personne p1, Personne p2 , int weight) qui ajoute p2 comme ami de p1 avec un poids
weight et réciproquement p1 comme ami de p2 avec un poids weight.

1 public static void ajoutAmitie(Personne p1, Personne p2 , int weight) {


2 p1.amis.put(p2, weight);
3 p2.amis.put(p1, weight);
4 }

Question 3 : Comme vous devez utiliser la classe HashMap, quelles sont les deux méthodes de la classe
Object qu’il est préférable de redéfinir ? Quels liens existent entre ces deux méthodes ? Codez ces méthodes
en utilisant uniquement les attributs correspondant au nom et à l’identifiant de la personne (on suppose que
seuls ces attributs comptent pour ces deux méthodes).

Il faut redéfinir hashCode() et equals(). Deux objets égaux selon equals doivent avoir la même
valeur de hachage.

1 @Override
2 public int hashCode() {
3 return ID + ((name == null) ? 0 : name.hashCode());
4 }
5

6 @Override
7 public boolean equals(Object obj) {
8 if (this == obj)
9 return true;
10 if (obj == null)
11 return false;
12 if (getClass() != obj.getClass())
13 return false;
14 Personne other = (Personne) obj;
15 if (ID != other.ID)
16 return false;
17 if (name == null) {
18 if (other.name != null)
19 return false;
20 } else if (!name.equals(other.name))
21 return false;
22 return true;
23 }

Pour simuler la diffusion d’un virus, on utilisera la règle de propagation suivante : une Personne p de-
vient contaminée quand la somme des “poids de l’amitié” des amis contaminés devient supérieure ou égale
au seuil de p. Par exemple, si un individu p1 de seuil 3 est ami avec p2 et p3 avec des poids respectifs 1 et
2, alors il deviendra contaminé dès lors que ses deux amis le sont (un seul ne suffit pas).

Question 4 : Ecrire une méthode d’instance public boolean majContamine() qui indique si une personne
passe de non contaminée à contaminée et qui met à jour la variable contamine correspondante.
Licence 3 – MIDO – 2020–2021 Programmation Java

1 public boolean majContamine() {


2 if(this.contamine)
3 return false;
4 int sumActiveWeights = 0;
5 for(Entry<Personne, Integer> e : amis.entrySet()) {
6 if(e.getKey().contamine)
7 sumActiveWeights+=e.getValue();
8 }
9 if(sumActiveWeights >= this.seuil) {
10 this.contamine = true;
11 }
12 return this.contamine;
13 }

Question 5 : Ecrire une classe Communaute qui possède un LinkedList de Personne nommé membres.
Ecrire également un constructeur (si besoin) et une méthode public void ajoutMembre(Personne p) qui
ajoute un membre à la communauté.

1 public class Communaute {


2 private LinkedList<Personne> membres = new LinkedList<>();
3

4 public void ajoutMembre(Personne p) {


5 membres.add(p);
6 }
7 }

Question 6 : Ecrire dans la classe Communaute une méthode public void propage(Set<Personne> s)
qui étant donné un ensemble de personnes, les déclare contaminés et propage le virus selon la règle de
propagation énoncée juste avant la question 4. Le processus de contamination s’arrête quand plus aucune
nouvelle personne ne devient contaminée.

1 public void propage(Set<Personne> s) {


2 for(Personne p: s)
3 Personne.contamine(p);
4

5 boolean nouveauContamine;
6 do {
7 nouveauContamine = false;
8 for(Personne p:membres) {
9 nouveauContamine |= p.majContamine();
10 }
11 }while(nouveauContamine);
12 }

Question 7 : Ecrire une classe Main qui teste votre programme sur une communauté de 4 personnes de
votre choix. Pour utiliser la méthode de la question précédente, vous pouvez utiliser la classe HashSet<T>
qui implémente l’interface Set<T> et la méthode d’instance boolean add(T t) pour rajouter un élément à
une collection.
Licence 3 – MIDO – 2020–2021 Programmation Java

1 public class Main {


2

3 public static void main(String[] args) {


4 Personne p1 = new Personne("Charles", 3);
5 Personne p2 = new Personne("Hossein", 1);
6 Personne p3 = new Personne("Hugo", 4);
7 Personne p4 = new Personne("Nicolas", 2);
8

9 Personne.ajoutAmitie(p1, p3, 2);


10 Personne.ajoutAmitie(p3, p4, 2);
11 Personne.ajoutAmitie(p1, p4, 2);
12 Personne.ajoutAmitie(p2, p4, 4);
13

14 Communaute c = new Communaute();


15 c.ajoutMembre(p1);
16 c.ajoutMembre(p2);
17 c.ajoutMembre(p3);
18 c.ajoutMembre(p4);
19

20 c.affiche();
21 Set<Personne> s = new HashSet<Personne>();
22 s.add(p1);
23 s.add(p3);
24 c.propage(s);
25 c.affiche();
26 }
27 }
Licence 3 – MIDO – 2020–2021 Programmation Java

Annexes
Méthodes de la classe Object :
Modifier and Type Method Description
protected Object clone()
Creates and returns a copy of this object.
boolean equals(Object obj)
Indicates whether some other object is "equal
to" this one.
protected void finalize()
Called by the garbage collector on an object
when garbage collection determines that there
are no more references to the object.
Class<?> getClass()
Returns the runtime class of this Object.
int hashCode()
Returns a hash code value for the object.
String toString()
Returns a string representation of the object.

Certaines méthodes de l’interface Map<K,V> :


Modifier and Type Method Description
V get(Object key)
Returns the value to which the specified key is mapped, or
null if this map contains no mapping for the key.
V put(K key, V value)
Associates the specified value with the specified key in this
map. If the map previously contained a mapping for the key,
the old value is replaced by the specified value. Returns the
previous value associated with key, or null if there was no
mapping for key.
V remove(Object key)
Removes the mapping for a given key if it is present. Returns
the value to which this map previously associated the key, or
null if the map contained no mapping for the key.
default V replace(K key, V value)
Replaces the entry for the specified key only if it is currently
mapped to some value. Returns the value to which this map
previously associated the key, or null if the map contained
no mapping for the key.
Set<K> keySet() returns the set of keys ;
Collection<V> values() returns a collection with the different values ;
Set<Map.Entry<K,V» entrySet() returns a set of the key-value pairs contained
in the Map.
Certaines méthodes de l’interface Map.Entry<K,V> :
Modifier and Type Method Description
K getKey()
Returns the key corresponding to this entry.
V getValue()
Returns the value corresponding to this entry.
V setValue(V value)
Replaces the value corresponding to this entry with the specified
value (optional operation).

Vous aimerez peut-être aussi