0809 Tpnote Correction

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 10

brochure_ESIAL_2007 13/10/05 18:21 Page 1

infor matiqueproductiquetélécommunications

École d’ingénieurs du
Concours TÉLÉCOM INT

l
ia
es TP Noté 2008-2009 - Durée : 2h
N
an
cy POO : Programmation Orientée Objet
P
UH Première année

Supports et notes de Cours/TD/TP autorisés.


École Supérieure d’Informatique
et Applications de Lorraine

N
www.esial.uhp-nancy.fr

Le but du TP est d’implémenter une mini-base de données d’un service de ressource humaine.

I O
Élements fournis. Vous trouverez dans le répertoire /home/depot/1A/POO/TP NOTE un ensemble de
classes de test. Recopiez ces classes dans votre répertoire de travail, à savoir le répertoire :
/home/depot/TP-NOTES/POO-<horaire>/<login>. L’accès à ce répertoire sera automatiquement interdit
à la fin de la séance.

C T
Tests et Compilation. Les classes de test fournies vous permetteront de tester les différentes classes que
vous implémenterez. Ces classes vous afficheront quels sont les tests qui ne s’exécutent pas correctement

E
et vous donneront à titre indicatif un score pouvant s’apparenter à votre note de TP. À la fin de la
séance de TP, il est impératif que toutes vos classes compilent ! Un manquement à cette

R
règle sera sévérement sanctionné.
Pour compiler votre programme et notamment les tests fournis vous devrez utiliser la version 1.6 de java. Si

R
vous n’avez jamais réalisé cette manipulation au cours des séances de travaux pratiques précédentes, vous
trouverez un script nommé env16.sh qu’il vous suffira d’exécuter (par la commande source ./env16.sh )
avant de lancer pour la première fois le compilateur javac.

C
I Question 1. L’interface people.Person. O ???

Implémentez une interface people.Person représentant le comportement général d’une personne :


– une méthode getName() sans paramètre et dont le type de retour est une chaı̂ne de caractères ;
– une méthode setAge() sans type de retour, prenant un paramètre de type int ;

N
– une méthode getAge() sans paramètre et dont le type de retour est une valeur de type int ;
– une méthode getUniqueId() dont le type de retour est une chaı̂ne de caractères.

I O Réponse
people.Person

T
1 package people;
2
3 public interface Person {
4

C
5 public String getName();
6
7 public void setAge(int age);

E
8
9 public int getAge();
10
11 public String getUniqueId();

R
12
13 }

O
I Question 2. La classe abstraite people.PersonImpl.
R Fin réponse

C
Écrivez une classe abstraite people.PersonImpl implémentant partiellement l’interface people.Person.
Cette classe doit :
– conserver l’âge et le nom de la personne ;
– définir les méthodes de l’interface people.Person.
– ne pas définir la méthode getUniqueId() qui sera abstraite (pour être définie dans les sous-classes
de cette classe) ;
– redéfinir la méthode toString(). Pour afficher les informations d’une personne de la manière sui-
vante : "[identifiantUnique] nomdelapersonne (age: 27)"
TP Noté 2008-2009 - Durée : 2h

– redéfinir la méthode equals(). Pour tester l’égalité ;


– fournir un constructeur prenant en paramètre le nom et l’âge de la personne ;
– fournir un constructeur de copie permettant de créer une copie de la personne passée en paramètre.

N
Réponse
people.PersonImpl
1 package people;

O
2
public abstract class PersonImpl implements Person {

I
3
4
5 protected String name;
6

T
7 protected int age;
8
9 public PersonImpl(String name, int age) {
10 this.name = name;

C
11 this.age = age;
12 }
13

E
14 public PersonImpl(PersonImpl other) {
15 this.name = other.name;
16 this.age = other.age;
17 }

R
18
19 public String getName() {
20 return this.name;
21 }

R
22
23 public void setAge(int age) {
24 this.age = age;
}

O
25
26
27 public int getAge() {
28 return this.age;

C
29 }
30
31 public abstract String getUniqueId();
32
33 @Override
34 public String toString() {
35 return "[" + this.getUniqueId() + "] " + this.name + " (age: " + this.age + ")";
36 }
37
38 @Override
39 public int hashCode() {
40 final int prime = 31;
41 int result = 1;
42 result = prime * result + age;
43 result = prime * result + ((name == null) ? 0 : name.hashCode());
44 return result;
45 }
46

N
47 @Override
48 public boolean equals(Object obj) {
49 if (this == obj)
50 return true;

O
51 if (obj == null)
52 return false;

I
53 if (getClass() != obj.getClass())
54 return false;
55 PersonImpl other = (PersonImpl) obj;

T
56 if (age != other.age)
57 return false;
58 if (name == null) {
59 if (other.name != null)

C
60 return false;
61 } else if (!name.equals(other.name))
62 return false;

E
63 return true;
64 }
65
66 }

R R Fin réponse

O
X Validation 1. Testez votre implémentation.
Compilez et exécutez la classe de test founie nommé people.TestPerson. Si nécessaire, corriger les

C
différentes erreurs dans votre code.

I Question 3. L’interface people.Employee.


Implémentez une interface people.Employee héritant de l’interface people.Person qui modélise de
manière générale un employé :
– une méthode getUniqueId() sans paramètre dont le type de retour est une chaı̂ne de caractères ;
– une méthode getSalary() sans paramètre et dont le type de retour est une valeur de type double ;

2
TP Noté 2008-2009 - Durée : 2h

– une méthode setSalary() sans type de retour, prenant en paramètre un salaire de type double.
Réponse

1
2
3
package people;
public interface Employee extends Person {

ON
people.Employee

I
4
5 public String getUniqueId();
6
public void setSalary(double salary);

T
7
8
9 public double getSalary();
10

C
11 }

R
I Question 4. La classe people.EmployeeImpl. E
Fin réponse

R
Écrivez une classe people.EmployeeImpl héritant de la classe people.PersonImpl et implémentant
l’interface people.Employee. Cette classe doit :

O
– conserver le salaire de l’employé ;
– conserver le NUMEN (NUMéro Education Nationale) de l’employé qui est chaı̂ne de caractères qui

C
sert à identifier de manière unique un employé ;
– définir la méthode abstraite de la classe people.PersonImpl ;
– définir les méthodes de l’interface people.Employee ;
– redéfinir la méthode toString(). Pour afficher les informations d’un employé de la manière sui-
vante : "[NUMEN] nomdelapersonne (age: 27) salary: 1900 euros"
– redéfinir la méthode equals(). Pour tester l’égalité ;
– fournir un constructeur prenant en paramètre le NUMEN, le nom, l’âge de l’employé et son salaire ;
– fournir un constructeur de copie permettant de créer une copie de l’employé donné en paramètre.
Réponse
people.EmployeeImpl
1 package people;

N
2
3 public class EmployeeImpl extends PersonImpl implements Employee {
4
5 private String numen;

O
6
7 private double salary;

I
8
9 public EmployeeImpl(String numen, String name, int age, double salary) {
10 super(name, age);

T
11 this.numen = numen;
12 this.salary = salary;
13 }
14

C
15 public EmployeeImpl(EmployeeImpl other) {
16 super(other);
17 this.numen = other.numen;

E
18 this.salary = other.salary;
19 }
20
21 @Override

R
22 public String getUniqueId() {
23 return this.numen;
24 }
25

R
26 public void setSalary(double salary) {
27 this.salary = salary;
28 }

O
29
30 public double getSalary() {
31 return this.salary;
32 }

C
33
34 @Override
35 public String toString() {
36 return super.toString() + " salary: " + this.salary + " euros";
37 }
38
39 @Override
40 public int hashCode() {
41 final int prime = 31;
42 int result = super.hashCode();
43 result = prime * result + ((numen == null) ? 0 : numen.hashCode());
44 long temp;
45 temp = Double.doubleToLongBits(salary);
46 result = prime * result + (int) (temp ^ (temp >>> 32));
47 return result;

3
TP Noté 2008-2009 - Durée : 2h

48 }
49
50 @Override

N
51 public boolean equals(Object obj) {
52 if (this == obj)
53 return true;
54 if (!super.equals(obj))

O
55 return false;
56 if (getClass() != obj.getClass())

I
57 return false;
58 EmployeeImpl other = (EmployeeImpl) obj;
59 if (numen == null) {

T
60 if (other.numen != null)
61 return false;
62 } else if (!numen.equals(other.numen))
63 return false;

C
64 if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))
65 return false;
66 return true;

E
67 }
68
69 }

R R Fin réponse

O
X Validation 2. Testez votre implémentation.
Compilez et exécutez la classe de test fournie nommée people.TestEmployee. Si nécessaire, corriger les

C
différentes erreurs dans votre code.

I Question 5. L’interface people.Student.


Implémentez une interface people.Student héritant de l’inteface people.Person qui représente le com-
portement général d’un étudiant :
– une méthode getUniqueId() sans paramètre dont le type de retour est une chaı̂ne de caractères ;
– une méthode getGrade() sans paramètre et dont le type de retour est une valeur de type int ;
– une méthode setGrade() sans type de retour, prenant un paramètre un grade de type int ;
– trois constantes entières de type int : YEAR 1ST , YEAR 2ND et YEAR 3RD représentant les trois

N
années de l’école.
Réponse

O
people.Student
1 package people;

I
2
3 public interface Student extends Person {
4

T
5 public static final int YEAR_1ST = 1;
6 public static final int YEAR_2ND = 2;
7 public static final int YEAR_3RD = 3;
8

C
9 public abstract String getUniqueId();
10
11 public abstract void setGrade(int grade);

E
12
13 public abstract int getGrade();
14
15 }

R R Fin réponse

O
I Question 6. La classe people.StudentImpl.
Écrivez une classe people.StudentImpl héritant de la classe people.PersonImpl et implémentant l’in-

C
terface people.Student. Cette classe doit :
– conserver le grade (en quelle année il est inscrit : 1, 2 ou 3) ;
– conserver le numéro d’étudiant, chaı̂ne de caractères qui sert à identifier de manière unique un
étudiant ;
– définir la méthode abstraite de la classe people.PersonImpl ;
– définir les méthodes de l’interface people.Student ;
– redéfinir la méthode toString(). Pour afficher les informations d’un étudiant de la manière sui-
vante : "[NUMEN] nomdelapersonne (age: 27) grade: 1A" si l’étudiant et de grade 1,
"[NUMEN] nomdelapersonne (age: 27) grade: 2A" si l’étudiant et de grade 2, . . .

4
TP Noté 2008-2009 - Durée : 2h

– redéfinir la méthode equals(). Pour tester l’égalité ;


– fournir un constructeur prenant en paramètre le numéro d’étudiant, le nom, l’âge et le grade de

N
l’étudiant ;
– fournir un constructeur de copie permettant de créer une copie de l’étudiant donné en paramètre.

O
Réponse

I
people.StudentImpl
1 package people;
2
public class StudentImpl extends PersonImpl implements Student {

T
3
4
5 private String studentId;
6

C
7 private int grade;
8
9 public StudentImpl(String studentId, String name, int age, int grade) {
10 super(name, age);

E
11 this.studentId = studentId;
12 this.grade = grade;
13 }

R
14
15 public StudentImpl(StudentImpl other) {
16 super(other);
17 this.studentId = other.studentId;

R
18 this.grade = other.grade;
19 }
20
21 @Override

O
22 public String getUniqueId() {
23 return this.studentId;
24 }

C
25
26 public void setGrade(int grade) {
27 this.grade = grade;
28 }
29
30 public int getGrade() {
31 return this.grade;
32 }
33
34 @Override
35 public String toString() {
36 StringBuffer buf = new StringBuffer();
37 buf.append(super.toString());
38 buf.append(" grade: ");
39 switch (this.grade) {
40 case Student.YEAR_1ST:
41 buf.append("1A");
42 break;

N
43 case Student.YEAR_2ND:
44 buf.append("2A");
45 break;
46 case Student.YEAR_3RD:

O
47 buf.append("3A");
48 break;

I
49 }
50 return buf.toString();
51 }

T
52
53 @Override
54 public int hashCode() {
55 final int prime = 31;

C
56 int result = super.hashCode();
57 result = prime * result + grade;
58 result = prime * result + ((studentId == null) ? 0 : studentId.hashCode());

E
59 return result;
60 }
61
62 @Override

R
63 public boolean equals(Object obj) {
64 if (this == obj)
65 return true;
if (!super.equals(obj))

R
66
67 return false;
68 if (getClass() != obj.getClass())
69 return false;

O
70 StudentImpl other = (StudentImpl) obj;
71 if (grade != other.grade)
72 return false;
73 if (studentId == null) {

C
74 if (other.studentId != null)
75 return false;
76 } else if (!studentId.equals(other.studentId))
77 return false;
78 return true;
79 }
80
81 }

Fin réponse

5
TP Noté 2008-2009 - Durée : 2h

X Validation 3. Testez votre implémentation.


Compilez et exécutez la classe de test fournie nommée people.TestStudent. Si nécessaire, corriger les

N
différentes erreurs dans votre code.

I Question 7. L’interface people.PeopleDatabase.

I O
Implémentez une interface people.PeopleDatabase représentant le comportement général d’une base de
données de personnes :

T
– une méthode add() sans type de retour qui prend un paramètre de type Person ;
– une méthode get() prenant une chaı̂ne de caractères (un identifiant) en paramètre et retournant

E C
l’objet de type people.Person correspondant à cet identifiant. Si un tel objet n’est pas trouvé, la
méthode retournera une référence null ;
– une méthode getPersonCount() sans paramètre dont la valeur de retour est de type int corres-
pondant au nombre de personnes enregistrées dans la base ;

R R
– une méthode getEmployeeCount() sans paramètre dont la valeur de retour est de type int cor-
respondant au nombre d’employés enregistrés dans la base ;
– une méthode getStudentCount() sans paramètre dont la valeur de retour est de type int cor-
respondant au nombre d’étudiants enregistrés dans la base ;

C O
– une méthode getStudentAverageAge() sans paramètre dont la valeur de retour est de type
double égale à l’âge moyen des étudiants de la base ;
– une méthode getAverageSalary() sans paramètre dont la valeur de retour est de type double
égale au salaire moyen des employés ;
– une méthode getOldestPerson() sans paramètre dont la valeur de retour est de type people.Person
correspondant à la personne la plus âgée de la base. Si plusieurs personnes ont le même âge, alors
la première personne trouvée avec cet âge doit être retournée ;
– une méthode getRichestEmployee() sans paramètre dont la valeur de retour est de type people.Employee
correspondant à l’employé ayant le salaire le plus élevé. Si plusieurs personnes ont le même salaire
(celui le plus élevé), alors le dernier employé trouvé ayant le salaire le plus élevé doit être retourné.
Réponse

N
people.PeopleDatabase
1 package people;
2

O
3 public interface PeopleDatabase {
4

I
5 public void add(Person p);
6
7 public Person get(String id);

T
8
9 public int getPersonCount();
10
11 public int getEmployeeCount();

C
12
13 public int getStudentCount();
14
public double getStudentAverageAge();

E
15
16
17 public double getAverageSalary();
18

R
19 public Person getOldestPerson();
20
21 public Employee getRichestEmployee();
22

R
23 }

C O
I Question 8. La classe people.PeopleDatabaseFixedImpl.
Fin réponse

Écrivez une classe people.PeopleDatabaseFixedImpl implémentant l’interface people.PeopleDatabase.


Cette classe doit :
– conserver les personnes enregistrées dans la base sous la forme d’un tableau à taille fixe de références
de type people.Person ;
– définir les méthodes de l’interface people.PeopleDatabase ;
– fournir un constructeur prenant en paramètre le nombre maximal de personnes que l’on peut enre-
gistrer dans la base.

6
TP Noté 2008-2009 - Durée : 2h

Réponse
people.PeopleDatabaseFixedImpl

N
1 package people;
2
3 public class PeopleDatabaseFixedImpl implements PeopleDatabase {
4

O
5 private Person[] persons;
private int personsCount;

I
6
7
8 public PeopleDatabaseFixedImpl(int initialSize) {
9 this.persons = new Person[initialSize];

T
10 this.personsCount = 0;
11 }
12
13 public void add(Person p) {

C
14 if (this.personsCount < this.persons.length) {
15 this.persons[personsCount++] = p;
16 }

E
17 }
18
19 public Person get(String id) {
for (int i = 0; i < this.personsCount; i++) {

R
20
21 if (this.persons[i].getUniqueId().equals(id)) {
22 return this.persons[i];
23 }

R
24 }
25 return null;
26 }
27

O
28 public int getPersonCount() {
29 return this.personsCount;
30 }

C
31
32 public int getEmployeeCount() {
33 int count = 0;
34
35 for (int i = 0; i < this.personsCount; i++) {
36 if (this.persons[i] instanceof Employee) {
37 count++;
38 }
39 }
40 return count;
41 }
42
43 public int getStudentCount() {
44 int count = 0;
45
46 for (int i = 0; i < this.personsCount; i++) {
47 if (this.persons[i] instanceof Student) {
48 count++;

N
49 }
50 }
51 return count;
52 }

O
53
54 public double getAverageSalary() {

I
55 int count = 0;
56 int sum = 0;
57
for (int i = 0; i < this.personsCount; i++) {

T
58
59 if (this.persons[i] instanceof Employee) {
60 sum += ((Employee) this.persons[i]).getSalary();
61 count++;

C
62 }
63 }
64

E
65 if (count == 0)
66 return 0.;
67 else
68 return ((double) sum) / count;

R
69 }
70
71 public double getStudentAverageAge() {
72 int count = 0;

R
73 int sum = 0;
74
75 for (int i = 0; i < this.personsCount; i++) {
if (this.persons[i] instanceof Student) {

O
76
77 sum += this.persons[i].getAge();
78 count++;
79 }

C
80 }
81 if (count == 0)
82 return 0.;
83 else
84 return ((double) sum) / count;
85 }
86
87 @Override
88 public Person getOldestPerson() {
89 Person oldestPerson = null;
90
91 if (this.personsCount > 0) {
92 oldestPerson = this.persons[0];
93
94 for (int i = 1; i < this.personsCount; i++) {

7
TP Noté 2008-2009 - Durée : 2h

95 if (this.persons[i].getAge() > oldestPerson.getAge()) {


96 oldestPerson = this.persons[i];
97 }

N
98 }
99 }
100
101 return oldestPerson;

O
102 }

I
103
104 @Override
105 public Employee getRichestEmployee() {
106 Employee richestEmployee = null;

T
107 int index = 0;
108
109 while (richestEmployee == null && index < this.personsCount) {
110 if (this.persons[index] instanceof Employee) {

C
111 richestEmployee = (Employee) this.persons[index];
112 }
113 index++;

E
114 }
115
116 for (int i = index; i < this.personsCount; i++) {
117 if (this.persons[i] instanceof Employee

R
118 && ((Employee) this.persons[i]).getSalary() >= richestEmployee.getSalary()) {
119 richestEmployee = (Employee) this.persons[i];
120 }

R
121 }
122
123 return richestEmployee;
124 }

O
125
126 }

C
X Validation 4. Testez votre implémentation.
Fin réponse

Compilez et exécutez la classe de test fournie nommée people.TestPeopleDatabaseFixed. Si nécessaire,


corriger les différentes erreurs dans votre code.

I Question 9. La classe people.PeopleDatabaseDynamicImpl.


Écrivez une classe people.PeopleDatabaseDynamicImpl implémentant l’interface people.PeopleDatabase.
Cette classe doit :

N
– conserver les personnes enregistrées dans la base sous la forme d’un tableau à taille variable (utilisez

O
la classe java.util.ArrayList) de type people.Person ;

I
– définir les méthodes de l’interface people.PeopleDatabase ;
– fournir un constructeur sans paramètre.

T
Réponse
people.PeopleDatabaseDynamicImpl

C
1 package people;
2
3 import java.util.ArrayList;

E
4
5 public class PeopleDatabaseDynamicImpl implements PeopleDatabase {
6
7 private ArrayList<Person> persons;

R
8
9 public PeopleDatabaseDynamicImpl() {
10 this.persons = new ArrayList<Person>();
11 }

R
12
13 public void add(Person p) {
14 this.persons.add(p);
15 }

O
16
17 public Person get(String id) {
18 for (Person p : this.persons) {

C
19 if (p.getUniqueId().equals(id))
20 return p;
21 }
22 return null;
23 }
24
25 public int getPersonCount() {
26 return this.persons.size();
27 }
28
29 public int getEmployeeCount() {
30 int count = 0;
31
32 for (Person p : this.persons) {
33 if (p instanceof Employee) {

8
TP Noté 2008-2009 - Durée : 2h

34 count++;
35 }
36 }

N
37
38 return count;
39 }
40

O
41 public int getStudentCount() {
42 int count = 0;

I
43
44 for (Person p : this.persons) {
45 if (p instanceof Student) {

T
46 count++;
47 }
48 }
49

C
50 return count;
51 }
52

E
53 public double getAverageSalary() {
54 int count = 0;
55 int sum = 0;
56

R
57 for (Person p : this.persons) {
58 if (p instanceof Employee) {
59 sum += ((Employee) p).getSalary();
60 count++;

R
61 }
62 }
63
if (count == 0)

O
64
65 return 0.;
66 else
67 return ((double) sum) / count;

C
68 }
69
70 public double getStudentAverageAge() {
71 int count = 0;
72 int sum = 0;
73
74 for (Person p : this.persons) {
75 if (p instanceof Student) {
76 sum += p.getAge();
77 count++;
78 }
79 }
80
81 if (count == 0)
82 return 0.;
83 else
84 return ((double) sum) / count;
85 }

N
86
87 @Override
88 public Person getOldestPerson() {
89 Person oldestPerson = null;

O
90
if (this.persons.size() > 0) {

I
91
92 oldestPerson = this.persons.get(0);
93
94 Person currentPerson;

T
95 for (int i = 1; i < this.persons.size(); i++) {
96 currentPerson = this.persons.get(i);
97 if (currentPerson.getAge() > oldestPerson.getAge()) {
oldestPerson = currentPerson;

C
98
99 }
100 }
101 }

E
102
103 return oldestPerson;
104 }

R
105
106 @Override
107 public Employee getRichestEmployee() {
108 Employee richestEmployee = null;

R
109 int index = 0;
110
111 while (richestEmployee == null && index < this.persons.size()) {
112 if (this.persons.get(index) instanceof Employee) {

O
113 richestEmployee = (Employee) this.persons.get(index);
114 }
115 index++;
}

C
116
117
118 for (int i = index; i < this.persons.size(); i++) {
119 if (this.persons.get(i) instanceof Employee
120 && ((Employee) this.persons.get(i)).getSalary() >= richestEmployee.getSalary()) {
121 richestEmployee = (Employee) this.persons.get(i);
122 }
123 }
124
125 return richestEmployee;
126 }
127
128 }

9
TP Noté 2008-2009 - Durée : 2h

Fin réponse

X Validation 5. Testez votre implémentation.

ON
Compilez et exécutez la classe de test fournie nommée people.TestPeopleDatabaseDynamic. Si nécessaire,

I
corriger les différentes erreurs dans votre code.

T
X Validation 6. Testez votre implémentation complète.
Afin de relancer l’ensemble des tests fournis, vous pouvez compiler et exécuter la classe de test nommée

C
people.TestAll.

R E Bonne chance ;-)

OR
C

ON
TI
E C
R R
C O
10

Vous aimerez peut-être aussi