Vous êtes sur la page 1sur 13

Institut Supérieur des Science Appliquées Année universitaire : 2019-2020

Et de Technologie de Sousse

Matière : Programmation Orientée Objet 2 (Java) Enseignant : Dr. Majd BELLAAJ

Filière : Deuxième Année Cycle Préparatoire

TD 9 : Exercices de révision

Exercice 1

Implémentez en Java un algorithme vous permettant de permuter les valeurs de deux variables
Exemple d'exécution :

Entrez x: 1
Entrez y: 2
Avant permutation :
x:1
y:2
Après permutation :
x:2
y:1

Exercice 2
Le programme Portee.java ci-dessous sert à illustrer un point important qui concerne la
portée des variables dans un programme. Sans exécuter le programme, indiquez tout ce que le
programme affichera à l'écran lors de l'exécution.
class Portee {

public static void main(String[] args) {


int x = 11, y = 22;
System.out.println("1. x = " + x);
System.out.println("2. y = " + y);
System.out.println();

calculer1(x, y);
System.out.println("5. x = " + x);
System.out.println("6. y = " + y);

1
System.out.println();
calculer2(x, y);
System.out.println("11. x = " + x);
System.out.println("12. y = " + y);

System.out.println();
int [] object = {5};
System.out.println("13. object [0] = " + object [0]);
calculer3(object);
System.out.println("15. object [0] = " + object [0]);
}

static void calculer1(int x, int y) {


x = 878;
y++;
System.out.println("3. x = " + x);
System.out.println("4. y = " + y);
}

static void calculer2(int a, int b) {


int x = 33;
int y = 44;
a = 2 * x;
b = 2 * y;
System.out.println("7. x = " + x);
System.out.println("8. y = " + y);
System.out.println("9. a = " + a);
System.out.println("10. b = " + b);
}

static void calculer3(int [] object) {


object [0] = 37;
System.out.println("14. object [0] = " + object [0]);
}
}

Exercice 3

1. Le programme Operation.java suivant sert à illustrer un point important qui concerne


le passage de paramètres. Sans exécuter le programme, indiquez tout ce que le
programme affichera à l'écran lors de l'exécution.
2. Corriger le codage du programme Operation.java de sorte à ce que l'exécution du
programme affiche :
before change 50
after change 150

2
class Operation{
int data=50;

void change(int data){


data=data+100;
}

public static void main(String args[]){


Operation op=new Operation();
System.out.println("before change "+op.data);
op.change(500);
System.out.println("after change "+op.data);

}
}

Exercice 4

Compilez et exécutez les deux programmes Moyenne1.java et Moyenne2.java.


Expliquez pourquoi la valeur retournée est différente d'un programme à l'autre.

Moyenne1.java

class Moyenne1{
public static void main(String[] args) {
double noteProgrammation = 6.0;
double noteAlgebre = 5.0;
System.out.println("Ma moyenne est " + (noteProgrammation++ + noteAlgebre) / 2.0 );
System.out.println(noteProgrammation);
}
}
Moyenne2.java
class Moyenne2{
public static void main(String[] args) {
double noteProgrammation = 6.0;
double noteAlgebre = 5.0;
System.out.println("Ma moyenne est " + (++noteProgrammation + noteAlgebre) / 2.0 );
System.out.println(noteProgrammation);
}
}

3
Exercice 5
Indiquez l'affichage du programme AfficherCouleur ci-dessous.
AfficherCouleur.java
class AfficherCouleur {
public static void main(String[] args) {
FigureGeometrique f1, f2, f3, f4;
f1 = new FigureGeometrique("Rouge", "Noir");
f2 = new FigureGeometrique("Bleu", "Blanc");
f3 = new FigureGeometrique();
f4 = new FigureGeometrique("Violet", "Orange");
f2.changerCouleurContour("Noir");
System.out.println(f3.couleurSurface);
System.out.println(f3.couleurContour);
System.out.println(f2.couleurContour);
System.out.println(FigureGeometrique.nbFigures);
System.out.println(f2.nbFigures);
System.out.println(f1.nbFigContNoir);
System.out.println(f4.nbFigSurfBlanc);
}
}

class FigureGeometrique {
String couleurContour = "Jaune";
String couleurSurface = "Blanc";
static int nbFigures = 0;
static int nbFigContNoir = 0;
static int nbFigSurfBlanc = 0;

FigureGeometrique() {
}

FigureGeometrique(String coulSurf, String coulCont) {


couleurSurface = coulSurf;
couleurContour = coulCont;
if (couleurContour.equals("Noir")) {
nbFigContNoir++;
}
if (couleurSurface.equals("Blanc")) {
nbFigSurfBlanc++;
}
nbFigures++;
}

void changerCouleurContour(String couleur) {


couleurContour = couleur;
}
void changerCouleurSurface(String couleur) {
couleurSurface = couleur;
}
}
4
Exercice 6
Selon la norme Unicode, les lettres majuscules A..Z ont les codes 65 à 90 et les lettres
minuscules a..z ont les codes 97 à 122:

LA NORME UNICODE
------------------------------------------------------------------
65 = A 79 = O 97 = a 111 = o
66 = B 80 = P 98 = b 112 = p
67 = C 81 = Q 99 = c 113 = q
68 = D 82 = R 100 = d 114 = r
69 = E 83 = S 101 = e 115 = s
70 = F 84 = T 102 = f 116 = t
71 = G 85 = U 103 = g 117 = u
72 = H 86 = V 104 = h 118 = v
73 = I 87 = W 105 = i 119 = w
74 = J 88 = X 106 = j 120 = x
75 = K 89 = Y 107 = k 121 = y
76 = L 90 = Z 108 = l 122 = z
77 = M 109 = m
78 = N 110 = n
-------------------------------------------------------------------
Ecrivez un programme Conversion.java qui demande à l'utilisateur d'entrer une seule
lettre A..Z ou a..z au clavier (utilisez par exemple l'instruction scanner.next().charAt(0)).
Le programme affiche un message d'erreur si le caractère entré ne fait pas partie des lettres
demandées. Sinon, s'il s'agit d'une lettre minuscule, la version majuscule de la lettre est
affichée. Si au contraire il s'agit d'une lettre majuscule, la version minuscule de la lettre est
affichée.
Exemples d'exécution:
Entrez une seule lettre A..Z ou a..z : A
Version minuscule : a

Entrez une seule lettre A..Z ou a..z : b


Version majuscule : B

Entrez une seule lettre A..Z ou a..z : *


Caractère non valable

5
Exercice 7
Vérifiez que vous savez convertir entre les codes et les caractères de la norme Unicode en
écrivant un petit programme, par exemple intitulé Codes.java, avec le fonctionnement suivant:

 Afficher l'Unicode correspondant aux caractères suivants: * 9 W

 Afficher le caractère correspondant aux Unicodes suivants: 34 65 123


Exemple d'exécution (sans les réponses):
Unicode de * :
Unicode de 9 :
Unicode de W :
Caractère correspondant à l'Unicode 34 :
Caractère correspondant à l'Unicode 65 :
Caractère correspondant à l'Unicode 123 :
Exercice 8
Indiquez, pour chaque affectation dans le programme Transtypage ci-dessous, si l'affectation
est possible et, le cas échéant, la valeur exacte qui sera affectée à la variable.

class Transtypage {
public static void main(String[] args) {
int n1 = 2;
double r1 = 2.7;
int n2 = 2.7;
double r2 = 5;

int n3 = (int) 5.6;


double r3 = 5.6;

int n4 = 9;
double r4 = (double) n4;
double r5 = (int) r4;

int n5 = 19 / 4;
double r6 = 5.0;
int n6 = n5 / r5;
int n7 = (int) (n5 / r5);
double r7 = 19.0 / r6;
double r8 = 15.0 / n3;

double r9 = 19 / 4;
double r10 = (double) (19 / 4);
double r11 = (double) 19 / (double) 4;
}
}

6
Exercice 9
Écrivez un petit programme Java, Degre3.java, vous permettant d'évaluer un polynôme du
3ème degré de la forme:

((a+b)/2)x3 + (a+b)2x2 + a + b + c

Exemple d'exécution:
Entrez a (int) : 1
Entrez b (int) : 2
Entrez c (int) : 3
Entrez x (double) : 3.5
La valeur du polynôme est : 180.5625

Exercice 10
Chacune des méthodes methode1 à methode8 dans le programme ErreursMethodes.java ci-
dessous contient une seule erreur syntaxique. Il s'agit d'erreurs liées à l'utilisation des
paramètres, des variables ou de la valeur retournée par la méthode. Il n'y pas d'erreurs dans la
méthode main, ni dans la méthode methodeSansErreurs. Trouvez et corrigez les erreurs !

class ErreursMethodes {

public static void main (String[] args) {


int i1 = methode1();
int i2 = methode2();
int i3 = methode3();
int i4 = methode4();
methode5();
methode6();
methode7();
methode8();
}

static int methode1 {


int a = 0;
System.out.println("Méthode 1");
return a;
}

static int methode2 () {


int a = 0;
i1 = 10;
System.out.println("Méthode 2");

7
return a;
}

static int methode3 () {


int a = 0;
System.out.println("Méthode 3");
}

static int methode4 () {


String a = "0";
System.out.println("Méthode 4");
return a;
}

static void methode5 () {


double a = 0;
System.out.println("Méthode 5");
return a;
}

static methode6 () {
double a = 0;
System.out.println("Méthode 6");
return a;
}

static void methode7 () {


int a = 0;
double b = 5.5;
methodeSansErreur(a);
System.out.println("Méthode 7");
}

static void methode8 () {


int a = 0;
String b = "5.5";
methodeSansErreur(a, b);
System.out.println("Méthode 8");
}

static void methodeSansErreur (int a, double b) {


// Cette méthode ne fait rien du tout
}
}

8
Exercice 11
On cherche ici à écrire un programme MulMat.java qui calcule la multiplication de deux
matrices.

Vous utiliserez pour représenter la matrice un tableau de tableaux de double.

Déclarations :

 Dans la méthode main, déclarez deux matrices mat1 et mat2.

Traitements :

 Lire depuis le clavier les éléments de chacune des deux matrices (après avoir demandé leurs
dimensions).

 Multiplier les deux matrices et stocker le résultat dans une nouvelle matrice prod.

 Afficher le contenu de cette nouvelle matrice ligne par ligne.

Méthodes :

 Lire depuis le clavier les dimensions lignes (nombre de lignes) et colonnes (nombre de
colonnes) de la première matrice mat1
 Lire le contenu de mat1.
 De même, lire les dimensions puis le contenu de la seconde matrice mat2.
 Vérifier que le nombre de lignes de mat2 est identique au nombre de colonnes de mat1.
Dans le cas contraire, afficher un message d'erreur "Multiplication de matrices impossible
!".
 afficher le résultat ligne par ligne.

Exemple d'utilisation :

Saisie de la 1ère matrice :


Nombre de lignes : 2
Nombre de colonnes : 3
M[1,1]=1.0
M[1,2]=2.0
M[1,3]=3.0
M[2,1]=4.0

9
M[2,2]=5.0
M[2,3]=6.0
Saisie de la 2ème matrice :
Nombre de lignes : 3
Nombre de colonnes : 4
M[1,1]=1.0
M[1,2]=2.0
M[1,3]=3.0
M[1,4]=4.0
M[2,1]=5.0
M[2,2]=6.0
M[2,3]=7.0
M[2,4]=8.0
M[3,1]=9.0
M[3,2]=0.0
M[3,3]=1.0
M[3,4]=2.0
Résultat :
38.0 14.0 20.0 26.0
83.0 38.0 53.0 68.0

Exercice 12
Ecrivez un programme Rectangle.java, permettant de lire la largeur et la hauteur d'un
rectangle. Ce programme devra afficher, à la demande, le périmètre ou la surface du
rectangle.

Exemples d'exécutions :

Entrez la largeur: ...


Entrez la hauteur: ...
Surface ('s/S') ou perimètre ('p/P')?: ...
La surface est ...
ou encore:

Entrez la largeur: ...


Entrez la hauteur: ...
Erreur: vous avez introduit une largeur ou une hauteur négative!

10
Le programme devra être bien modularisé de sorte à ce que la méthode main se présente
comme suit :

public static void main(String args[]) {


double largeur = lireDonnee("largeur");
double hauteur = lireDonnee("hauteur");

boolean donneesOk = testerDonnees(largeur, hauteur);

if (donneesOk) {
calculer(largeur, hauteur);
} else {
afficherErreur();
}
}

Le test sur le type de calcul se fera au moyen d'un switch.

Exercice 13
Le directeur d'une entreprise de produits chimiques souhaite gérer les salaires et primes de
ses employés au moyen d'un programme Java.

Un employé est caractérisé par son nom, son prénom, son âge et sa date d'entrée en service
dans l'entreprise.

Dans un fichier Salaires.java, codez une classe abstraite Employe dotée des attributs
nécessaires, d'une méthode abstraite calculerSalaire (ce calcul dépendra en effet du type de
l'employé) et d'une méthode getNom retournant une chaine de caractère obtenue en
concaténant la chaine de caractères "L'employé " avec le prénom et le nom.

Dotez également votre classe d'un constructeur prenant en paramètre l'ensemble des
attributs nécessaires.

Calcul du salaire

Le calcul du salaire mensuel dépend du type de l'employé. On distingue les types


d'employés suivants :

 Ceux affectés à la Vente. Leur salaire mensuel est le 20 % du chiffre d'affaire qu'ils
réalisent mensuellement, plus 400 Euros.

11
 Ceux affectés à la Représentation. Leur salaire mensuel est également le 20 % du chiffre
d'affaire qu'ils réalisent mensuellement, plus 800 Euros.
 Ceux affectés à la Production. Leur salaire vaut le nombre d'unités produites
mensuellement multipliées par 5.
 Ceux affectés à la Manutention. Leur salaire vaut leur nombre d'heures de travail mensuel
multipliées par 65 euros.
Codez dans votre fichier Salaires.java une hiérarchie de classes pour les employés en
respectant les conditions suivantes :

 La super-classe de la hiérarchie doit être la classe Employe.


 Les nouvelles classes doivent contenir les attributs qui leur sont spécifiques ainsi que le
codage approprié des méthodes calculerSalaire et getNom, en changeant le mot "employé"
par la catégorie correspondante.
 Chaque sous classe est dotée de constructeur prenant en argument l'ensemble des attributs
nécessaires.
 N'hésitez pas à introduire des classes intermédiaires pour éviter au maximum les
redondances d'attributs et de méthodes dans les sous-classes

Employés à risques

Certains employés des secteurs production et manutention sont appelés à fabriquer et


manipuler des produits dangereux.
Après plusieurs négociations syndicales, ces derniers parviennent à obtenir une prime de
risque mensuelle.

Complétez votre programme Salaires.java en introduisant deux nouvelles sous-classes


d'employés. Ces sous-classes désigneront les employés des secteurs production et
manutention travaillant avec des produits dangereux.
Ajouter également à votre programme une interface pour les employés à risque permettant de
leur associer une prime mensuelle fixe de 200.

Collection d'employés

Satisfait de la hiérarchie proposée, notre directeur souhaite maintenant l'exploiter pour


afficher le salaire de tous ses employés ainsi que le salaire moyen.

12
Ajoutez une classe Personnel contenant une "collection" d'employés. Il s'agira d'une
collection polymorphique d'Employe.

Définissez ensuite les méthodes suivantes à la classe Personnel :

 void ajouterEmploye(Employe)
qui ajoute un employé à la collection.

 void calculerSalaires()

qui affiche le salaire de chacun des employés de la collection.

 double salaireMoyen()

qui affiche le salaire moyen des employés de la collection.

Testez votre programme avec le main suivant :

class Salaires {

public static void main(String[] args) {


Personnel p = new Personnel();
p.ajouterEmploye(new Vendeur("Pierre", "Business", 45, "1995", 30000));
p.ajouterEmploye(new Representant("Léon", "Vendtout", 25, "2001", 20000));
p.ajouterEmploye(new Technicien("Yves", "Bosseur", 28, "1998", 1000));
p.ajouterEmploye(new Manutentionnaire("Jeanne", "Stocketout", 32, "1998", 45));
p.ajouterEmploye(new TechnARisque("Jean", "Flippe", 28, "2000", 1000));
p.ajouterEmploye(new ManutARisque("Al", "Abordage", 30, "2001", 45));

p.afficherSalaires();
System.out.println("Le salaire moyen dans l'entreprise est de " + p.salaireMoyen() + "
euros.");
}
}

Vous devriez obtenir quelque chose comme :

Le vendeur Pierre Business gagne 6400.0 euros.


Le représentant Léon Vendtout gagne 4800.0 euros.
Le technicien Yves Bosseur gagne 5000.0 euros.
Le manut. Jeanne Stocketout gagne 2925.0 euros.
Le technicien Jean Flippe gagne 5200.0 euros.
Le manut. Al Abordage gagne 3125.0 euros.
Le salaire moyen dans l'entreprise est de 4575.0 euros.

13