Computing">
TP Java Poo
TP Java Poo
TP Java Poo
Fascicule TP
Programmation Orientée Objet
(Langage Java)
Aymen Ferjani
aymen.ferjani@issatm.ucar.tn
1 Notions de cours
1.1 Compilation et exécution d’un programme Java
Avant de commencer à écrire du code Java, il est préalable d’installer un JDK (Java Deve-
lopment Kit) afin de pouvoir compiler et exécuter notre code.
L’écriture d’un code source Java doit se faire dans un fichier ayant l’extension .java. La
compilation de ce dernier générera un autre fichier ayant l’extension .class et qui contient du
pseudo-code. C’est ce fichier qui est interprété et exécuté par la machine virtuelle Java (JVM).
La JVM est une partie intégrante du JDK.
La compilation et l’exécution d’un fichier Java peuvent se faire de deux manières différentes,
soit avec un IDE(Integrated Development Environment), ou bien avec une console.
— Un fichier source Java contient une ou plusieurs classes, mais une seule classe déclarée
publique. Le nom du fichier doit correspondre au nom de cette classe.
— Si le projet développé est composé d’un seul fichier, alors ce dernier doit forcément contenir
la méthode principale main.
— En programmation procédurale, les méthodes sont vues comme des fonctions.
— La méthode principale main doit toujours avoir la signature suivante :
Type Signification
char Caractère
boolean Booléen
Remarque
— Il existe aussi les types byte, short et long qui sont des types entiers.
— On trouve aussi le type float qui représente un réel.
— Pour les chaı̂nes de caractères, il est préférable d’utiliser la classe String (qui n’est pas un
type primitif).
2 Exercices pratiques
Pour chaque exercice, un nouveau projet sera créé.
Exercice 1
Créer la classe Hello ayant le code suivant, puis la tester :
Exercice 2
Créer la classe Ex2, puis :
1. Écrire la méthode public int addition(int x, int y, int z) qui retourne la somme de 3
entiers x, y et z.
2. Ajouter la méthode public int max(int x, int y, int z) qui retourne le maximum entre
3 entiers x, y et z.
3. Ajouter la méthode public boolean premier(int x) qui vérifie si x est un nombre
premier ou pas.
4. Tester ces 3 méthodes ainsi:
import java.util.Scanner;
public class Ex2 {
//Définitions des méthodes des questions 1,2 et 3
...
public static void main(String[] args) {
Scanner saisie = new Scanner(System.in);
int a, b, c;
System.out.print("Donner 3 entiers: ");
a = saisie.nextInt();
b = saisie.nextInt();
c = saisie.nextInt();
Ex2 obj = new Ex2(); //Création d'une instance de la classe Ex2
System.out.println(a + "+" + b + "+" + c + "=" + obj.addition(a, b, c));
System.out.println("Le maximum des 3 entiers est " + obj.max(a, b, c));
if(obj.premier(a)) {
System.out.println(a + " est un nombre premier");
}
else {
System.out.println(a + " n'est pas un nombre premier");
}
}
}
Exercice 3
Écrire un programme qui calcule et affiche la somme et le produit de 4 entiers passés en
arguments.
Pour chaque argument, utiliser la méthode prédéfinie Integer.parseInt(x) pour obtenir un
entier à partir de cet argument.
Exercice 4
Écrire un programme permettant de lire un entier positif introduit dans la ligne de commande
et de l’afficher sous forme binaire.
— Saisie de valeurs.
— Passage de valeurs en ligne de commandes (arguments).
— Utilisation des structures conditionnelles et itératives.
— Manipulation des tableau.
1 Notions de cours
1.1 Création et manipulation d’un tableau à taille fixe
La création d’un tableau à taille fixe est effectuée par l’instruction suivante :
Ici, ”type” désigne un type de base ou bien une classe. Voici un exemple :
1.2 Exemple
// Création et initialisation d'un tableau de 4 réels
double[] tab = {12.0, 2.6, 0.5, 100.11};
2 Exercices pratiques
Exercice 1
Écrire la classe Année avec une méthode qui permet de déterminer si une année est bissextile
ou non. Une année est bissextile si on a l’un des deux cas suivants:
— L’année est divisible par 4 et non divisible par 100.
— L’année est divisible par 400.
Exercice 2
Écrire la classe JourSemaine avec une méthode qui, à partir d’un entier représentant un
jour de la semaine (entre 1 et 7), affiche le nom correspondant de ce jour.
Exemples:
jour = 1 => Affichage : ”C’est lundi”
jour = 2 => Affichage : ”C’est mardi”
Exercice 3
Écrire un programme permettant de lire 2 arguments qui sont un entier positif (noté n) et
une chaı̂ne de caractères, puis affiche cette chaı̂ne n fois (sur des lignes différentes).
Par exemple, si l’utilisateur passe comme arguments ”5” et ”Bonjour”, on aura l’affichage sui-
vant:
Bonjour 1 fois
Bonjour 2 fois
Bonjour 3 fois
Bonjour 4 fois
Bonjour 5 fois
Exercice 4
Écrire la classe Parfait avec une méthode qui prend un entier positif, et indique si ce dernier
est un nombre parfait ou pas. Un nombre parfait est égal à la somme de ses diviseurs stricts
(sauf lui-même).
Exemples de nombres parfaits:
6=1+2+3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
Exercice 5
Écrire un programme qui calcule et affiche la somme des entiers passés en argument.
Exercice 6
Écrire la classe Pair ayant 2 méthodes. La première permet de remplir un tableau d’entiers.
La deuxième affiche les éléments pairs d’un tableau d’entiers.
import java.util.Scanner;
public class Pair {
public void remplirTab(int[] t)
{ /* remplir t avec des entiers saisis */ }
public void affichagePair(int[] t)
{ /* afficher les éléments pairs de t */ }
Exercice 7
Écrire la classe Tab ayant 3 méthodes. La première permet de créer un tableau d’entiers de
taille n (à saisir) et de le remplir. La deuxième affiche les éléments d’un tableau d’entiers. La
troisième retroune l’élément le plus grand d’un tableau d’entiers.
import java.util.Scanner;
public class Tab {
public static int[] créationTableau() {
/* 1.saisir la taille du tableau, création du tableau
2.remplir le tableau à partir d'entiers saisis
3.retourner ce tableau */ }
Exercice 8
Écrire un programme qui créé et remplit un tableau de réels à partir des arguments, puis
inverse ce tableau et affiche ces éléments.
Exercice 9
Écrire un programme qui saisit et remplit un tableau de chaı̂nes de caractères, puis saisit
une chaı̂ne et indique si cette chaı̂ne se trouve dans le tableau. Dans le cas où la chaı̂ne existe,
le programme devra aussi afficher sa position dans le tableau.
Note : Utiliser la méthode String.equals(chaı̂ne) pour comparer entre deux chaı̂nes.
Exemples:
Exercice 10
Écrire un programme qui permet de saisir et remplir les éléments d’un tableau
d’entiers, puis effectue le tri par sélection dans l’ordre croissant sur ce tableau, et enfin affiche
le tableau.
Principe :
Pour chaque élément tab[i], déterminer l’indice min du plus petit élément à droite de tab[i]
(plus petit que tab[i]), puis permuter tab[i] et tab[min]. Si on ne trouve pas un élément plus
petit que tab[i], alors aucune permutation n’est effectuée.
1 Exercices pratiques
Exercice 1
On souhaite modéliser un point dans un plan ayant un repère orthonormé.
1. Écrire la classe Point contenant les attributs nécessaires ainsi qu’un constructeur prenant
des paramètres.
2. Ajouter un autre constructeur sans paramètre qui initialise un point à la position (0,0).
3. Pour chaque attribut, ajouter une méthode accesseur (get) pour retourner la valeur de
l’attribut, et une méthode mutateur (set) pour modifier la valeur de l’attribut.
4. Ajouter la méthode public void modifierCoord(double x, double y) qui
permet de modifier les coordonnées d’un point.
5. Écrire la méthode public boolean memePosition(Point p) qui vérifie si un point a les
mêmes coordonnées que le point p.
6. Écrire la méthode public boolean estSymetrique(Point p) qui vérifie si un point est
symétrique au point p par rapport à l’origine du repère (0,0).
7. Ajouter la méthode public double distance(Point p) permettant de calculer et
retourner
p la distance entre un point et le point p selon la formule suivante:
(x − xp )2 + (y − yp )2
Utiliser les méthodes prédéfinies Math.pow(x, 2) pour calculer le carré d’un x et Math.sqrt(x)
pour la racine carrée d’un x.
8. Dans le même package, créer la classe TestPoint contenant la méthode main afin de
tester les méthodes de la classe Point:
public class TestPoint
{
public static void main(String[] args)
{
Point p1 = new Point(5,3);
Point p2 = new Point();
System.out.println("p1(" + p1.getX() + "," + p1.getY() + ")" );
System.out.println("p2(" + p2.getX() + "," + p2.getY() + ")" );
p2.modifierCoord(5, 10);
System.out.println("p2(" + p2.getX() + "," + p2.getY() + ")" );
if(!p1.memePosition(p2))
System.out.println("p1 et p2 n'ont pas la m^eme position");
Point p3 = new Point(-5, -3);
System.out.println("p3(" + p3.getX() + "," + p3.getY() + ")" );
if(p1.estSymetrique(p3))
System.out.println("p1 et p3 sont symètriques");
System.out.println("La distance entre p1 et p2 est " + p1.distance(p2));
}
}
Exercice 2
On souhaite modéliser une date caractérisée par un jour, un mois et une année.
1. Écrire la classe Date avec les attributs nécessaires ainsi qu’un constructeur qui
initialise une date.
2. Pour chaque attribut, ajouter une méthode accesseur (get) pour retourner la valeur de
l’attribut, et une méthode mutateur (set) pour modifier la valeur de l’attribut.
3. Redéfinir la méthode public String toString() qui retourne une date sous la forme:
”jour/mois/année”.
4. Ajouter la méthode private boolean annéeBissextile() qui vérifie si l’année d’une date
est bissextile ou pas. Une année est bissextile dans les cas suivants:
— Elle est divisible par 4 et non par 100.
— Elle est divisible par 400.
5. Ajouter la méthode private int nombreJoursDuMois() qui retourne le nombre de jours
du mois (exemple: mois = 1 ⇒ nombre de jours = 31). Utiliser la méthode précédente.
6. Écrire la méthode public boolean estValide() permettant de vérifier si une date est
correcte ou pas. Utiliser la méthode précédente.
7. Ajouter la méthode public boolean plusRécente(Date d) qui indique si une date est
plus récente que la date d.
8. Dans le même package, créer la classe TestDate contenant la méthode main afin de tester
les méthodes de la classe Date:
public class TestDate
{
public static void main(String[] args)
{
Date d1 = new Date(28, 2, 2018);
if(d1.estValide())
System.out.println(d1 + " est valide");
Date d2 = new Date(30, 2, 2017);
if(!d2.estValide())
System.out.println(d2 + " n'est pas valide");
Date d3 = new Date(17, 10, 2020);
if(d3.plusRécente(d1))
System.out.println(d3 + " est plus récente que " + d1);
}
}
Exercice 3
On souhaite modéliser une pile d’entiers stockée sous forme d’un tableau.
1. Définir la classe Pile ayant comme attributs un entier taille (la taille de la pile), un
autre entier nommé tailleMax (la taille maximale de la pile, une constante) et un tableau
d’entiers nommé p.
2. Ajouter un constructeur, prenant un paramètre entier noté n, qui initialise taille à zéro
et tailleMax à n, puis créé le tableau p avec la taille tailleMax.
3. Ajouter la méthode accesseur public int getTaille() permettant de retourner la taille de
la pile.
4. Écrire la méthode public boolean estVide() qui indique si la pile est vide ou pas.
5. Ajouter la méthode public boolean estPleine() qui indique si la pile est pleine ou pas.
6. Ajouter la méthode public void afficher() qui affiche les éléments de la pile.
7. Écrire la méthode public void empiler(int x) qui ajoute x à la fin de la pile et incrémente
taille de 1 si la pile n’est pas pleine. Afficher un message si la pile est déjà pleine.
8. Écrire la méthode public void dépiler() qui dépile le dernier élément (il suffit de
décrémenter la taille de 1) si la pile n’est pas vide. Afficher un message si la pile est déjà
vide.
9. Dans le même package, définir la classe TestPile avec la méthode main et tester les
méthodes de la classe Pile.
Exercice 4
On souhaite modéliser une liste chaı̂née composée par plusieurs nœuds où chaque nœud
contient un entier.
1. Écrire la classe Noeud ayant comme attributs un entier val et une référence sur le nœud
suivant nommée suivant (type Noeud).
2. Ajouter un constructeur à la classe Noeud, prenant un paramètre entier, qui initialise val
à la valeur du paramètre. La référence suivant pointera sur null.
3. Ajouter des méthodes accesseurs et mutateurs à la classe Noeud permettant de récupérer
et de modifier les attributs de cette classe.
4. Ajouter, dans le même package, la classe Liste avec comme attributs une référence sur la
tête de liste nommée tête (type Noeud) et un entier taille qui est la taille de cette liste.
5. Ajouter un constructeur à la classe Liste, sans paramètre, qui initialise la référence tête
à null et taille à zéro.
6. Ajouter des méthodes accesseurs et mutateur à la classe Liste permettant de récupérer la
tête et la taille et de modifier uniquement la tête.
7. Ajouter la méthode public boolean estVide() qui indique si la liste est vide ou pas.
8. Ajouter la méthode public void afficher() qui parcourt la liste et affiche les valeurs de
ses nœuds.
9. Ajouter la méthode public void ajouterEntier(int val) qui ajoute un nœud, ayant la
valeur entière val, à la fin de la liste et incrémente taille de 1.
10. Écrire la méthode public void supprimerEntier(int val) qui supprime le premier nœud
rencontré depuis la tête ayant la valeur val, et décrémente taille de 1 si ce nœud a été
trouvé.
11. Dans le même package, ajouter la classe TestListe contenant la méthode main avec le
code suivant:
Liste lst = new Liste();
lst.ajouterEntier(15);
lst.ajouterEntier(-9);
lst.ajouterEntier(5);
lst.ajouterEntier(-26);
lst.ajouterEntier(42);
lst.afficher();
System.out.println("Suppression de -26 puis 15:");
lst.supprimerEntier(-26);
lst.supprimerEntier(15);
lst.afficher();
System.out.println("Ajout de 103:");
lst.ajouterEntier(103);
lst.afficher();
System.out.println("La liste contient " + lst.getTaille() + " noeuds");
— Utilisation de l’héritage.
— Comprendre le polymorphisme.
— Comprendre l’utilité d’une classe abstraite.
— Création et utilisation d’un tableau dynamique.
1 Notions de cours
1.1 Création et manipulation d’un tableau dynamique
Pour créer un tableau redimensionnable, on peut utiliser la classe ArrayList:
// Importer la classe ArrayList au début du fichier
import java.util.ArrayList;
...
// Création d'un tableau dynamique de String
ArrayList<String> tab = new ArrayList<>();
Il faut tenir en compte que cette classe ne permet pas de créer des tableaux de types primitifs.
Pour remédier à ce manque, on peut utiliser les classes enveloppes.
Méthode Rôle
1.4 Exemple
// Importer la classe ArrayList au début du fichier, juste après le package
import java.util.ArrayList;
...
ArrayList<String> tab = new ArrayList<>();
tab.add("Bonjour");
tab.add("Salut");
tab.add(0, "Coucou"); // ajoute au début du tableau
tab.add("Au revoir");
tab.add("Merci");
2 Exercices pratiques
Exercice 1
Une entreprise souhaite gérer la liste de ses employés avec une application Java. Il y a
principalement deux types d’employés : les cadres et les ouvriers.
1. Sachant qu’un employé est décrit par son matricule, son nom, son âge et son salaire, définir
la classe Employé ayant un constructeur avec paramètres qui initialise tous ses attributs.
2. Ajouter un attribut entier statique nombre initialisé à 0 et qui sera incrémenté de 1
chaque fois qu’un employé est créé.
3. Ajouter les méthodes getAge, getSalaire et setSalaire, ainsi que la méthode statique
getNombre.
4. Redéfinir la méthode publique toString qui retourne les informations d’un employé selon
cette forme:
matricule nom, ^
age ans, salaire dt
//Exemple: E10268 Ahmed SASSI, 34 ans, 1200 dt
5. Définir, dans le même package, la classe Ouvrier sachant qu’un ouvrier a les mêmes
propriétés d’un employé. Ajouter un constructeur avec paramètres qui initialise les valeurs
des attributs.
6. Définir, dans le même package, la classe Cadre sachant qu’en plus des propriétés d’un
employé, chaque cadre a une fonction. Ajouter un constructeur avec paramètres qui
initialise les valeurs des attributs.
7. Redéfinir la méthode toString dans la classe Ouvrier en ajoutant le mot ”Ouvrier” à la
fin de la chaı̂ne retournée. Exemple:
E10270 Mounir DRIDI, 36 ans, 900 dt, Ouvrier
9. L’entreprise a décidé d’augmenter les salaires de ses employés selon cette formule :
— Pour les ouvriers, une augmentation de 100 dt.
— Pour les cadres :
— Une augmentation de 200 dt si l’âge est inférieur à 35 ans.
— Une augmentation de 300 dt si l’âge est compris entre 35 ans et 45 ans.
— Une augmentation de 400 dt pour les autres.
Déclarer la méthode abstraite publique augmenter dans la classe Employé. Ainsi, la
classe Employé deviendra abstraite, et la méthode augmenter devra être définie dans
les classes Ouvrier et Cadre.
10. Afin de tester ces classes et leurs méthodes, créer, dans le même package, la classe
TestEmployé ayant la méthode main avec le code suivant:
Employé[] liste = new Employé[5];
liste[0] = new Cadre("E10268", "Ahmed SASSI", 34, 1200, "Analyste");
liste[1] = new Cadre("E10269", "Ridha DRIDI", 46, 1350, "Comptable");
liste[2] = new Ouvrier("E10270", "Mounir DRIDI", 36, 900);
liste[3] = new Ouvrier("E10271", "Alia ARBI", 29, 850);
liste[4] = new Cadre("E10272", "Amal TOUATI", 38, 1850, "Directeur RH");
Exercice 2
On souhaite modéliser les concepts véhicule, voiture et avion.
1. Définir la classe Véhicule qui a pour attributs des informations valables pour tout type
de véhicule: son modèle, son année d’achat, son prix d’achat et son prix courant.
2. Ajouter un constructeur avec 3 paramètres (modèle, année d’achat et prix d’achat) qui
initialise tous ces attributs. Le prix courant sera fixé au prix d’achat.
3. Redéfinir la méthode toString qui retourne les informations d’un véhicule selon la forme
suivante:
modèle, annéeAchat, prixAchat dt, prixCourant dt
//Exemple: Peugeot 206, 2005, 16000 dt, 12000 dt
8. Redéfinir la méthode toString dans la classe Avion en ajoutant les informations propres
à l’avion à la fin de la chaı̂ne retournée. Exemple:
CESSNA CITATION II, 1982, 4000000.0 dt, 2200000.0 dt, 9 passagers, 15300 heures
11. Afin de tester ces classes et leurs méthodes, créer, dans le même package, la classe
TestVéhicule ayant la méthode main avec le code suivant:
ArrayList<Véhicule> tab = new ArrayList<>();
1 Exercice pratique
On veut implémenter le diagramme de classe suivant :
(pReele + pImaginaire*i)
exemple: (5.2 + 3.6*i)