CorrigesJava1erLangage ATEdt3 PDF
CorrigesJava1erLangage ATEdt3 PDF
CorrigesJava1erLangage ATEdt3 PDF
Introduction
Naissance d'un programme
Exercice I-1: Apprendre à décomposer une tâche en sous-tâches distinctes
Corrigé
a. Objets nécessaires : 1 tableau, 1 clou, 2 pointes, 1 ficelle, 1 marteau, 1
crayon, 1 mètre.
b. Liste des opérations :
Mesurer le mur en hauteur, le mur en largeur, le tableau en hauteur ;
Tracer une marque au centre du mur, sur le cadre (face arrière) du tableau ;
Ajuster le tableau ;
c. Liste ordonnée des opérations :
Prendre le mètre
Poser le mètre ;
Prende le crayon ;
Poser le crayon ;
Prendre le marteau ;
Prendre le clou ;
Poser le marteau ;
Prendre le mètre
Poser le mètre
Prende le crayon ;
Tracer une marque sur le bord gauche du cadre (face arrière) au tiers de la hauteur ;
2 ___________________ Exercice I-2 : Observer et comprendre la structure d’un programme Java
Tracer une marque sur le bord droit du cadre (face arrière) au tiers de la hauteur ;
Poser le crayon ;
Prendre le marteau ;
Poser le marteau ;
Ajuster le tableau ;
côté = Lire.d();
// Afficher le résultat
longueur = Lire.d();
largeur = Lire.d();
// Afficher le résultat
b.
Instructions A B C D
double A = 0.1 ; 0.1 - - -
double B = 1.1 ; 0.1 1.1 - -
double C, D ; 0.1 1.1 - -
B = A ; 0.1 0.1 - -
C = B ; 0.1 0.1 0.1 -
D = C ; 0.1 0.1 0.1 0.1
A = D 0.1 0.1 0.1 0.1
b.
Instructions valeur
int valeur = 2 ; 2
valeur = valeur + 1 ; 3
valeur = valeur * 2 6
valeur = valeur % 5; 1
c.
Instructions x y z
5 ___________________________ Exercice 1-4 : Comprendre le mécanisme d’échange de valeurs
int x = 2, y = 10, z ; 2 10 -
z = x + y ; 2 10 12
x = 5 ; 5 10 12
z = z – x ; 5 10 7
e. 2 * ((5 / 5) + (4 * (4 – 3)) % (5 + 4 – 2) ⇒ 2 * 5 % 7
⇒ 10 % 7 ⇒ 3
5. * n ⇒ 5. * 10 ⇒ 50.0f
(n + 1) / n ⇒ (10 + 1) / 10 ⇒ 11 / 10 ⇒ 1
(n + 1.0) / n ⇒ (10 + 1.0) / 10 ⇒ 11.0 / 10 ⇒ 1.1
r + s / t ⇒ 8 + 7 / 21 ⇒ 8 + 0 ⇒ 8
b.
r + t / s ⇒ 8 + 21 / 7 ⇒ 8 + 3 ⇒ 11
(r + t) / s ⇒ (8 + 21) / 7 ⇒ 29 / 7 ⇒ 4
r + t % s ⇒ 8 + 21 % 7 ⇒ 8 + 0 ⇒ 8
(r + t) % s ⇒ (8 + 21) % 7 ⇒ 29 % 7 ⇒ 1
r + s / r + s ⇒ 8 + 7 / 8 + 7 ⇒ 8 + 0 + 7 ⇒ 15
(r + s) / (r + s) ⇒ (8 + 7) / ( 8 + 7) ⇒ 15 / 15 ⇒ 1
r + s % t ⇒ 8 + 7 % 2 ⇒ 8 + 7 ⇒ 15
i2 = chiffre / valeur ⇒ 2 / 7 ⇒ 0
f1 = (float) (valeur / chiffre) ⇒ (float) (7 / 2) ⇒ (float) 3 ⇒ 3.Of
double F, E = 0.0 ;
double T = 6.55957 ;
F = Lire.d( ) ;
E = F / T ;
première = Lire.i() ;
deuxième = Lire.i() ;
laPlusGrande = première ;
System.out.println("La plus grande valeur est : " + laPlusGrande) ;
else
{
laPlusGrande = deuxième ;
}
else System.out.println("Les deux valeurs saisies sont identiques") ;
} // Fin du main ()
Les deux accolades fermantes situées après l'instruction B font que le bloc else instruction C
est rattaché au premier if (condition1).
if (b == 0)
if (c == 0)
{
// bloc d'instructions I
else
{
// bloc d'instructions II
10 ______________________________________ Exercice 3-4 : Construire une arborescence de choix
else
else
// bloc d'instructions IV
else
// bloc d'instructions V
d. Dans chaque bloc if ou else, les instructions de calcul et d'affichage appropriées sont les
suivantes :
• Le bloc d'instructions I :
System.out.println("tout reel est solution") ;
• Le bloc d'instructions II :
System.out.println("il n'y a pas de solution") ;
• Le bloc d'instructions IV :
System.out.println("il n'y a pas de solution dans les reels") ;
• Le bloc d'instructions V : Attention de bien placer les parenthèses pour obtenir un résultat
cohérent.
x1 = (-b + Math.sqrt(b*b – 4*a*c)) / (2*a) ;
e. En insérant l'ensemble des instructions dans la classe SecondDegre et à l'intérieur d'une fonction
main(), le programme complet s'écrit de la façon suivante :
public class SecondDegre {
double a, b, c, delta ;
double x, x1, x2 ;
a = Lire.d() ;
b = Lire.d() ;
c = Lire.d() ;
if (a == 0) {
if (b == 0) {
if (c == 0) {
else {
else {
x = -c / b ;
}
}
else {
}
else {
Remarquez les instructions de saisie des trois coefficients a, b, c nécessaires à la bonne marche du
programme ainsi que l'utilisation d'une variable intermédiaire delta utilisée pour éviter la répétition du
même calcul b*b – 4*a*c.
int a, b;
char opérateur;
12 ___________________________ Exercice 3-5 : Manipuler les choix multiples, gérer les caractères
double calcul = 0;
a = Lire.i();
b = Lire.i();
opérateur = Lire.c();
switch (opérateur ) {
break;
break;
break;
break;
int a, b;
char opérateur;
double calcul = 0;
boolean OK = true;
a = Lire.i();
b = Lire.i();
opérateur = Lire.c();
switch (opérateur ) {
break;
break;
else OK = false;
break;
break;
default : OK = false ;
if (OK) {
A l'étiquette '/', le programme vérifie si le contenu de la variable b est non nul. Si tel est le cas, il
exécute normalement l'instruction réalisant la division. Sinon, si le contenu de la variable b est nul,
la division n'est pas effectuée mais la valeur false est affectée à la variable OK de type booléen
(initialisée par défaut à true lors de la déclaration de la variable).
De cette façon, pour afficher le résultat du calcul, le programme vérifie la valeur de la variable OK.
Si elle vaut true, cela signifie que l'opération a été effectuée sans rencontrer de difficulté
particulière sinon, cela veut dire qu'aucune opération n'a pu être réalisée. Le programme signale
alors par un message que l'opération est non conforme
Remarquez que la valeur false est aussi affectée à la variable OK pour l'étiquette default.
Ainsi, si l'utilisateur entre un autre caractère que +, -, / ou *, le programme n'exécute aucun calcul
et signale par un message que l'opération est non conforme.
Dans le jargon informatique, on dit que la variable OK est un drapeau (en anglais flag). En effet, il
change d'état (de valeur) en fonction des instructions exécutées.
Le terme « drapeau » fait allusion au système de fonctionnement des boîtes aux lettres américaines
munies d’un drapeau rouge. Lorsque le facteur dépose du courrier, le drapeau est relevé. Le facteur
abaisse le drapeau pour indiquer la présence de courrier. Lorsque le destinataire prend son courrier,
il relève le drapeau, indiquant que la boîte est désormais vide. Ainsi, la position (état) du drapeau
indique la présence (drapeau abaissé) ou non (drapeau levé) de courrier, dans la boîte aux lettres.
Corrigé
public class Exercice1 {
int a,b,r;
a = Lire.i();
b = Lire.i();
do {
r = a%b;
a = b;
b = r;
} while (r != 0 );
}
a. Repérez les instructions concernées par la boucle : voir tracé orange sur le programme ci-dessus.
Déterminez les instructions de début et fin de boucle.: voir tracé vert sur le programme ci-dessus.
b. Recherchez l'instruction permettant de modifier le résultat du test de sortie de boucle : voir tracé
jaune sur le programme ci-dessus.
c.
c.
Instructions a b r
initialisation 30 42 -
do { On entre dans la boucle
r = a % b ; 30 42 30
a = b ; 42 42 30
b = r ; 42 30 30
while (r != 0) r est différent de 0, on retourne à do
r = a % b ; 42 30 12
a = b ; 30 30 12
b = r ; 30 12 12
while (r != 0) r est différent de 0, on retourne à do
r = a % b ; 30 12 6
a = b ; 12 12 6
b = r ; 12 6 6
while (r != 0) ; r est différent de 0, on retourne à do
r = a % b ; 12 6 0
a = b ; 6 6 0
b = r ; 6 0 0
while (r != 0) ; r est égal à 0, on sort de la boucle
d.
b = r ; 6 5 5
while (r != 0) r est différent de 0, on retourne à do
R = a % b ; 6 5 1
A = b ; 5 5 1
B = r ; 5 1 1
While (r != 0) r est différent de 0, on retourne à do
R = a % b ; 5 1 0
A = b ; 1 1 0
B = r ; 1 0 0
While (r != 0) ; r est égal à 0, on sort de la boucle
Corrigé
public class Exercice2 {
int valeur;
do {
valeur = Lire.i();
} while ( valeur < 0 || valeur > 100) ;
}
}
Le programme entre dans la boucle do … while sans test préalable. Il demande la saisie d’une entière
au clavier. Lorsque la saisie a été effectuée, le programme teste si la valeur saisie est plus petite que 0 ou
plus grande que 100. Si tel est le cas - le test est vrai, le programme retourne en début de la boucle et
demande à nouveau la saisie d’une valeur. Si la valeur saisie est plus grande que 0 et plus petite que 100
- le test est faux, le programme sort de la boucle et affiche la valeur saisie.
double laMoyenne;
valeur = Lire.i() ;
laPlusGrande = valeur ;
laPlusPetite = valeur ;
do {
leNombre = leNombre + 1 ;
System.out.print("Entrer une valeur (0 pour sortir) :") ;
valeur = Lire.i() ;
} // Fin du main ()
Observez qu'une première valeur est saisie en dehors de la boucle, afin d'initialiser les deux variables
laPlusPetite et laPlusGrande. Ainsi, en initialisant par exemple ces valeurs à -1, le programme
peut donner un mauvais résultat. Imaginez par exemple que vous n'entriez que des valeurs positives. Le
programme affichera en résultat comme plus petite valeur -1, alors que cette dernière ne fait pas partie
des valeurs saisies par l'utilisateur. Grâce à l'initialisation des variables à la première valeur saisie, nous
sommes surs d'obtenir un résultat cohérent.
Pour finir, remarquez le cast (float) devant le calcul de la moyenne. En effet, les deux variables
laSomme et leNombre sont de type entier. Sans ce cast, la division fournit un résultat entier.
Exercice 4-4 : Comprendre la boucle while, traduire une marche à suivre en programme Java
Corrigé
Traduction de la marche à suivre en Java
a. Tirer au hasard un nombre entre 0 et 10.
i = (int) (10*Math.random()) ;
b. Lire un nombre.
nombreLu = Lire.i();
c. Tant que le nombre lu est différent du nombre tiré au hasard :
17 Exercice 4-5 : Comprendre la boucle while, traduire une marche à suivre en programme Java
while ( nombreLu != i)
8 Lire un nombre
nombreLu = Lire.i();
8 Compter le nombre de boucle.
nbBoucle = nbBoucle + 1 (ou encore nbBoucle++)
d. Afficher un message de réussite ainsi que le nombre de boucles.
System.out.print("Bravo ! ");
System.out.println("vous avez reussi en " + nbBoucle + " fois");
Exercice 4-5 : Comprendre la boucle while, traduire une marche à suivre en programme Java
Corrigé
Le code source complet :
public class Devinette {
i = (int) (10*Math.random());
while (nombreLu != i) {
nbBoucle = nbBoucle + 1;
}
System.out.print("Bravo ! ");
} // Fin du main ()
} // Fin de la Class Devinette
Remarquez l'initialisation de la variable nombreLu à –1. En effet, pour être sûr d'entrer dans la boucle
while, la variable nombreLu doit contenir une valeur différente de i. Or celle-ci par définition, varie
entre 0 et 10. L'initialisation à –1 permet donc de certifier que le programme entrera au moins une fois
dans la boucle.
Exercice 4-6 : Comprendre la boucle while, traduire une marche à suivre en programme Java
Corrigé
Quelques améliorations :
public class Jeu {
i = (int) (50*Math.random());
while (nombreLu!= i) {
18 __________________________________________________ Exercice 4-7 : Comprendre la boucle for
nombreLu = Lire.i();
nbBoucle++;
System.out.print("Bravo ! ");
} // Fin du main ()
Corrigé :
public class Exercice7 {
int a;
b = b * i;
Corrigé
a. Repérez les instructions concernées par la boucle : voir tracé orange sur le programme ci-dessus.
Déterminez les instructions de début et fin de boucle : voir tracé vert sur le programme ci-dessus.
b. La variable i est initialisée à 2. Elle vaut a + 1 en sortant de la boucle. Le nombre de boucles est
calculé par la formule : (valeur en sortie de boucle – valeur initiale) soit, a + 1 – 2 = a – 1
tours de boucle.
c. Recherchez l'instruction permettant de modifier le résultat du test de sortie de boucle : voir tracé
jaune sur le programme ci-dessus.
d.
d.
Instructions i b a
Initialisation - 1 6
for(…) { 2 On entre dans la boucle car, i <= a
b = b * i ; 2 2 6
for(…) { 3 On reste dans la boucle car, i <= a
b = b * i ; 3 6 6
for(…) { 4 On reste dans la boucle car, i <= a
b = b * i ; 4 24 6
for(…) { 5 On reste dans la boucle car, i <= a
b = b * i ; 5 120 6
for(…) { 6 On reste dans la boucle car, i <= a
b = b * i ; 6 720 6
for(…) { 7 On sort de la boucle car, i > a
Corrigé
public class Exercice9 {
char c;
System.out.println();
System.out.println();
Les caractères correspondent en réalité à des valeurs numériques (Unicode). Il est donc possible de les
utiliser comme variable de contrôle d'une boucle for.
20 ____________________ Exercice 5-1 : Apprendre à déterminer les paramètres d'un algorithme
int a,compteur;
}
} // fin de main()
int y;
y = x * x;
return y ;
} // fin de fonc1()
} //fin de class
a. Le bloc définissant la fonction main(): voir tracé orange sur le programme ci-dessus.
Le bloc définissant la fonction calculer()voir tracé vert sur le programme ci-dessus.
Le bloc définissant la classe Fonction, voir tracé jaune sur le programme ci-dessus.
b. x est le paramètre formel de la fonction calculer()
c. Les valeurs transmises au paramètre x de la fonction calculer(), lors de son appel depuis la
fonction main() sont celles placées dans la variable compteur soit 0, 1, 2, 3, 4 et 5.
21 _______________________________________ Exercice 5-3 :Comprendre l'utilisation des fonctions
f. 0 a 1 a 4 a 9 a 16 a 25 a
int R ;
R = f(0) ;
System.out.print(R);
R = f(x) ;
System.out.print(R) ;
R = f(x) ;
Exercice 5-4 : Détecter des erreurs de compilation concernant les paramètres ou le résultat d'une fonction
a.
public static void menu (int c) {
return c;
Corrigé
a. La fonction max() est définie dans ce chapitre, avec deux paramètres entiers alors qu'ici les deux
paramètres utilisés sont de type double.
22 __________________________________________________ Exercice 5-5 : Ecrire une fonction simple
b. L'entête de la fonction précise que le résultat retourné par la fonction max() est de type int alors
que, la variable m effectivement retournée par l'instruction return est déclarée de type float.
c. La fonction menu() décrite au cours de ce chapitre, est de type void. L'instruction v1 =
menu(v2) n'est pas valide, à cause de la présence de l'affectation v1 = ….
d. L'entête de la fonction menu() précise qu'elle est de type void. Le corps de la fonction ne peut
donc pas posséder d'instruction return.
c. Les deux valeurs pouvant modifier le résultat sont t et nb. Les paramètres de la fonction s'écrivent :
public static … pourcentage(int t, int nb)
d. Le résultat étant stocké dans la variable prct, de type double, la méthode est doit être de type
double. L'entête de la fonction s'écrit donc :
public static double pourcentage(int t, int nb)
return prct ;
double résultat;
System.out.print(" Nombre d'achat Cartes Bleues : ");
nbCB = Lire.i();
nbVirement = Lire.i();
nbDebit = nbCB + nbCheque + nbVirement;
return prct ;
int resultat;
do {
resultat= Lire.i();
return resultat ;
int resultat;
do {
resultat= Lire.i();
return resultat ;
// La fonction main()
int valeur;
valeur = verifier();
int a, b;
menu();
a = Lire.i();
System.out.println("Entrer la seconde valeur ");
b = Lire.i();
calculer();
afficher();
char opération ;
switch (opération) {
case '+' : résultat = a + b ;
break ;
break ;
case '*' : résultat = a * b ;
25 __________________________ Exercice 6-1 : Repérer les variables locales et variables de classe
break ;
char opération ;
char opération ;
opération = Lire.c() ;
}
a. Les fonctions de la classe Calculette sont au nombre de qauatre et ont pour nom : main(),
afficher(), calculer() et menu()(voir tracé orange sur le programme ci-dessus).
b. Lorsque les variables a, b et opération sont déclarées à l'intérieur des fonctions, elles ne sont pas
visibles en dehors de la fonction où elles sont déclarées, comme le montre le schéma suivant :
26 __________________________ Exercice 6-2 : Communiquer des valeurs à l'appel d'une fonction
c. Les variables locales à la fonction main() sont : a et b (voir tracé vert sur le programme ci-
dessus).
Les variables locales à la fonction afficher() sont : opération (voir tracé vert sur le
programme ci-dessus).
Les variables locales à la fonction calculer() sont : opération (voir tracé vert sur le
programme ci-dessus).
Les variables locales à la fonction menu() sont : opération (voir tracé vert sur le programme
ci-dessus).
En réalité, ce programme ne peut être exécuté puisque la phase de compilation détecte les erreurs
suivantes :
Calculette.java:16: Variable opération may not have been initialized.
Calculette.java:17: Undefined variable: a
Calculette.java:17: Undefined variable: b
Calculette.java:19: Undefined variable: a
Calculette.java:19: Undefined variable: b
Calculette.java:21: Undefined variable: a
Calculette.java:21: Undefined variable: b
Calculette.java:23: Undefined variable: a
Calculette.java:23: Undefined variable: b
Calculette.java:30: Undefined variable: a
Calculette.java:30: Variable opération may not have been initialized.
Calculette.java:30: Undefined variable: b
a. Lorsque les variables résultat et opération sont déclarées comme variable de classe, elles
sont visibles et accessibles depuis toutes les fonctions de la classe Calculette, comme le montre
le schéma suivant :
b. Pour que les fonctions calculer() et afficher() connaissent le contenu des variables a et b,
il suffit de passer les valeurs contenues dans ces variables en paramètre des fonctions.
c. Les fonctions s'écrivent :
public static void calculer(int x, int y) {
switch (opération) {
case '+' : résultat = x + y;
break;
break;
break;
Pour éviter toute confusion, les paramètres formels (x et y) des fonctions ne portent pas les mêmes noms
que les paramètres réels (a et b). Les instructions composant les fonctions ont donc été modifiées de
façon à ne plus utiliser les variables a et b mais, x et y.
28 ______________________________ Exercice 6-3 : Transmettre un résultat à la fonction appelante
char opérateur;
double calcul;
opérateur = menu();
a = Lire.i();
b = Lire.i();
switch (o) {
break;
break;
break;
break;
return résultat;
char opération ;
opération = Lire.c();
return opération ;
s2 = s1.toUpperCase();
s3 = s2.replace('A','*');
s4 = Lire.S();
if (s1.regionMatches(5,s4,0,7))
s1 = Lire.S();
sPlusGrand = s1 ;
sPlusPetit = s1 ;
do {
s1 = Lire.S();
} while ( ! s1.equalsIgnoreCase("FIN") );
Exercice 7-3 et 7.4: Créer une classe d’objets et consulter les variables d’instance
Corrigé :
La classe Livre :
public class Livre {
String debutNom;
String debutPrenom;
String debutCategorie;
int longueurIsbn;
String finIsbn;
debutNom=nomAuteur.substring(0,2);
debutPrenom=prenomAuteur.substring(0,2);
debutCategorie=categorie.substring(0,2);
// 7.4.c Calculer la longueur du mot ISBN
longueurIsbn=isbn.length();
return debutNom+debutPrenom+debutCategorie+finIsbn;
}
La classe Bibliotheque :
public class Bibliotheque {
livrePoche.titre= Lire.S();
livrePoche.categorie = Lire.S();
livrePoche.nomAuteur= Lire.S();
livrePoche.prenomAuteur= Lire.S();
livrePoche.isbn= Lire.S();
livrePoche.afficherUnLivre();
g. La méthode créer() est appelée par l'intermédiaire de l'objet T. Ce sont donc les données xA, yA,
xB, yB, xC et yC de l'objet T qui mémorisent les valeurs saisies au clavier.
33 _______________________________ Exercice 7-5 : Analyser les résultats d'une application "objet"
h. De la même façon, la méthode déplacer() est appelée par l'intermédiaire de l'objet T. Ce sont
donc les données xA, yA, xB, yB, xC et yC de l'objet T qui prennent les valeurs transmises en
paramètre de la méthode.
System.out.println("Position en X ");
x = verifier(0, 800);
System.out.println("Position en Y ");
y = verifier(0, 600);
System.out.println("Couleur ");
System.out.println("Hauteur ");
do {
return resultat ;
}
x += nx;
35 ____________________________________________ Exercice 8-1 à 8.5 : La protection des données
y += ny;
La classe FaireDesRectangles :
public class FaireDesRectangles {
public static void main(String[] args) {
R.afficher();
// 7.6.c Les valeurs 200, 200, 150 et 100 sont saisies au clavier
// 7.7.c Les valeurs -10, -5, 20 et 900 ne correspondent pas aux intervalles de
R.afficher();
R.afficher();
}
}
// Le Titre
titre = valeur ;
// 8.2.a La catégorie
categorie = valeur;
isbn =valeur;
nomAuteur =valeur;
prenomAuteur =valeur;
// Le titre
return titre;
// 8.3.a La catégorie
return isbn;
}
// 8.3.a Le nom de l'auteur
return nomAuteur;
return prenomAuteur;
return code;
}
String debutNom;
String debutPrenom;
String debutCategorie;
int longueurIsbn;
String finIsbn;
debutNom=nomAuteur.substring(0,2);
debutPrenom=prenomAuteur.substring(0,2);
debutCategorie=categorie.substring(0,2);
longueurIsbn=isbn.length();
finIsbn=isbn.substring((longueurIsbn-2),longueurIsbn);
return debutNom+debutPrenom+debutCategorie+finIsbn;
}
public Livre() {
System.out.print("Entrez le titre : ");
setTitre(Lire.S());
setNomAuteur(Lire.S());
setPrenomAuteur(Lire.S());
setIsbn(Lire.S());
setTitre(t);
setCategorie(c);
setNomAuteur(na);
setPrenomAuteur(pa);
setIsbn(i);
La classe Bibliotheque :
38 ____________________________________________ Exercice 8-1 à 8.5 : La protection des données
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
livrePoche.setTitre(Lire.S());
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
livrePoche.setCategorie(Lire.S());
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
livrePoche.setNomAuteur(Lire.S());
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
livrePoche.setPrenomAuteur(Lire.S());
// 8.2.c Modifie la propriété d'un livre par une méthode d’accès en écriture
livrePoche.setIsbn(Lire.S());
livrePoche.afficherUnLivre();
"Policier", "2253005495");
unPolar.afficherUnLivre();
8.1 Les propriétés titre, categorie, isbn, nomAuteur, prenomAuteur et code sont
déclarées en mode privé. Elles ne sont plus accessibles depuis la fonction main(), cette dernière étant
définie à l’extérieur de la classe Livre. Le compilateur détecte les erreurs :
• Variable titre in class Livre not accessible from class
Bibliotheque.
• Variable categorie in class Livre not accessible from class
Bibliotheque.
int resultat;
do {
System.out.print(s+" : ");
resultat= Lire.i()
} while ( resultat < a || resultat > b) ;
return resultat ;
}
// c. surcharge de la méthode métier verifier()
public Forme() {
// d. Surcharge du constructeur
x = verifier(nx, 0, largeurEcran) ;
y = verifier(ny, 0, hauteurEcran) ;
x = verifier(x+nx, 0, largeurEcran) ;
y = verifier(y+ny, 0, hauteurEcran) ;
}
// c. Surcharge du constructeur
public Rectangle(int nx, int ny, int nl, int nh, int nc) {
super(nx, ny, nc);
41 ____________________________________________________________ Exercice 8-6 à 8.9 : L’Héritage
super.afficher();
public Triangle() {
xB = verifier("second sommet en X : ", 0, largeurEcran);
// c. Surcharge du constructeur
public Triangle(int nxa, int nya, int nxb, int nyb, int nxc, int nyc, int nc ) {
xB = verifier(nxb, 0, largeurEcran);
yB = verifier(nyb, 0, hauteurEcran);
xC = verifier(nxc, 0, largeurEcran);
yC = verifier(nyc, 0, hauteurEcran);
}
xB = verifier(xB+nx, 0, largeurEcran);
yB = verifier(yB+ny, 0, hauteurEcran);
xC = verifier(xC+nx, 0, largeurEcran);
42 ______________________________________________ Exercice 9-1 : Les tableaux à une dimension
yC = verifier(yC+ny, 0, hauteurEcran);
// c. affiche un cercle
C.afficher();
C.deplacer(100, 100);
C.afficher();
R.afficher();
R.deplacer(200, 200);
R.afficher();
Triangle T = new Triangle (200, 200, 100, 300, 300, 300, 2);
// c. affiche un triangle
T.afficher();
T.deplacer(300, 300);
T.afficher();
}
double laMoyenne;
if (argument.length > 0) {
valeur[i] = Integer.parseInt(argument[i]);
laPlusGrande = valeur[0] ;
laPlusGrande = valeur[i] ;
} // Fin du main ()
public Triangle(int nxa, int nya, int nxb, int nyb, int nxc, int nyc, int nc) {
// Forme, il prend les valeurs des propriétés de la classe Forme. Elles ont
xPoints[0] = x;
yPoints[0] = y;
public Triangle() {
xPoints[0] = x;
xPoints[0] = y;
// de la classe Forme
super.afficher();
}
// 9.3.c Les sommets se déplacent à l’aide d’une boucle for
super.deplacer(nx, ny);
xPoints[0] = x;
yPoints[0] = y;
// par l'utilisateur….
C[1].déplacer(20, 20);
C[1].afficher();
// d. Agrandissement du cercle 1 de 50
C[2].agrandir(50);
C[2].afficher();
C[0].échangerAvec(C[3]);
C[0].afficher();
C[3].afficher();
// f. Permute les cercles, le cercle 0 va en 1, le cercle 1 en 2 etc.
C[i].afficher();
}
// a. Initialisation du tableau
Etoile[i][i] = 1;
Etoile[3][i] = 1;
Etoile[i][3] = 1;
Etoile[i][6-i] = 1;
47 _____ Exercice 9-6 : Pour mieux comprendre le mécanisme des boucles imbriquées (for – for)
// b. Affichage du tableau
else System.out.print("*");
System.out.println();
Exercice 9-6 : Pour mieux comprendre le mécanisme des boucles imbriquées (for – for)
Corrigé :
public class Exercice6 {
int i,j, N = 5;
char C;
C = Lire.c();
if (i < j) System.out.print(C);
}
a. Repérer les instructions concernées par les deux boucles répétitives : voir tracé orange sur le
programme ci-dessus.
b. Déterminer les instructions de début et fin de boucle : voir tracé vert sur le programme ci-dessus.
Recherchez les instructions qui permettent de modifier le résultat du test de sortie de boucle : voir
tracé jaune sur le programme ci-dessus.
c. Tableau d'évolution des variables :
i j N C Affichage
1 1 2 ! i = j affiche un espace
1 2 2 ! i < j affiche un !
1 3 2 ! i < j affiche un !
1 4 2 ! i < j affiche un !
1 5 2 ! j > N sortie de boucle
2 1 2 ! i > j affiche un espace
2 2 2 ! i = j affiche un espace
2 3 2 ! i < j affiche un !
2 4 2 ! i < j affiche un !
48 _____ Exercice 9-7 : Pour mieux comprendre le mécanisme des boucles imbriquées (for – for)
i j N C Affichage
2 5 2 ! j > N sortie de boucle
3 1 2 ! i > j affiche un espace
3 2 2 ! i > j affiche un espace
3 3 2 ! i = j affiche un espace
3 4 2 ! i < j affiche un !
3 5 2 ! j > N sortie de boucle
4 1 2 ! i > j affiche un espace
4 2 2 ! i > j affiche un espace
4 3 2 ! i > j affiche un espace
4 4 2 ! i = j affiche un espace
4 5 2 ! j > N sortie de boucle
5 5 2 ! i > N sortie de boucle
Exercice 9-7 : Pour mieux comprendre le mécanisme des boucles imbriquées (for – for)
Corrigé :
i Affichage
1 affiche un i = 1
2 affiche un i = 2
3 sortie de la boucle interne
4 affiche un i = 4
1 affiche un i = 1
2 affiche un i = 2
3 sortie de la boucle interne
4 affiche un i = 4
1 affiche un i = 1
2 affiche un i = 2
3 etc. Le programme boucle !
import java.lang.Number.*;
public Etudiant() {
nom = Lire.S();
49 ______________________ Exercice 10-2 et 10-5 : Comprendre les listes et créer des fichiers texte
prénom = Lire.S();
notes.add(new Double(Lire.d()));
moyenne = calculMoyenne();
}
return somme/nbnotes;
System.out.println();
System.out.println("Sa moyenne vaut "+ moyenne);
Exercice 10-2 et 10-5 : Comprendre les listes et créer des fichiers texte
Corrigé
La classe FaireDesListesDeFormes
import java.util.*;
import java.io.IOException;
50 ______________________ Exercice 10-2 et 10-5 : Comprendre les listes et créer des fichiers texte
public ListeDeFormes() {
if (type == 'C') {
listeFormes.add(new Cercle());
listeFormes.add(new Triangle());
// 10.2.c Dans tous les autres cas, la forme ajoutée à la liste est un rectangle
else {
listeFormes.add(new Rectangle());
}
}
// 10.2.d Affiche la liste des formes, tmp sait s’il est un cercle, un triangle ou
if (nbFormes > 0) {
else {
}
// 10.5.b Parcourt la liste et écrit dans un fichier, une ligne par forme
if (nbFormes > 0) {
tmp.afficher();
chaine = tmp.getInfos();
51 ______________________ Exercice 10-2 et 10-5 : Comprendre les listes et créer des fichiers texte
String chaine;
char tt;
int cc, xx0, yy0, xx1, yy1, xx2, yy2, ll, hh, rr;
do {
// 10.5.e Lit le fichier ligne par ligne et récupère la ligne lue sous la forme
mot = f.lire();
if (mot != null) {
tt = mot[0].charAt(0);
if ( tt == 'C') {
// 10.5.d Transformer les autres éléments du tableau en entier
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
yy0 = Integer.parseInt(mot[3]);
rr = Integer.parseInt(mot[4]);
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
yy0 = Integer.parseInt(mot[3]);
xx1 = Integer.parseInt(mot[4]);
yy1 = Integer.parseInt(mot[5]);
xx2 = Integer.parseInt(mot[6]);
yy2 = Integer.parseInt(mot[7]);
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
yy0 = Integer.parseInt(mot[3]);
ll = Integer.parseInt(mot[4]);
hh = Integer.parseInt(mot[5]);
La classe FaireDesListesDeFormes
public class FaireDesListesDeFormes {
public static void main(String[] args) throws IOException{
if(f.ouvrir("Formes.txt", "Lecture")){
// 10.5.f Si le fichier existe, lire les lignes et stocker les formes dans
// la liste LdF
LdF.lireLesFormes(f);
f.fermer();
}
byte choix = 0;
do{
System.out.println("1. Ajouter un cercle");
switch(choix) {
break;
break;
case 3 : LdF.ajouterUneForme('R');
break;
case 4 : LdF.afficherLesFormes();
break;
case 5 :
f.ouvrir("Formes.txt", "Ecriture");
LdF.enregistrerLesFormes(f);
f.fermer();
System.exit(0);
return couleur+";"+x+";"+y;
}
La valeur retournée par la méthode getInfos()de la classe Forme, doit être insérée dans la chaîne
construite par les classes fille, comme suit :
• Dans la classe Cercle
public String getInfos() {
return "R;"+tmp+";"+largeur+";"+hauteur;
String ligne;
ligne = fR.readLine();
if (ligne != null) {
int i=0;
while (st.hasMoreTokens()) {
mot[i] = st.nextToken();
i++;
}
// 10.5.d Retourner le tableau composé de la liste des champs
return mot;
}
else return null;
// b. Calcul de la clé
String clé = créerUneClé(p, n);
if (listeClassée.get(clé) != null) {
listeClassée.put(clé, eModifié);
nom = n;
55 _____________________________________________ Exercice 10-3 : Comprendre les dictionnaires
prénom = p;
notes[i] = Lire.d();
moyenne = calculMoyenne();
System.out.println("6. Sortir");
System.out.println();
System.out.print("Votre choix : ");
choix = Lire.b();
switch (choix) {
case 1 : C.ajouteUnEtudiant();
break;
case 2 :
System.out.print("Entrer le prenom de l'etudiant a supprimer : ");
prénom = Lire.S();
C.supprimeUnEtudiant(prénom, nom);
break;
case 3 : C.afficheLesEtudiants();
break;
case 4 :
System.out.print("Entrer le prenom de l'etudiant recherche : ");
56 ___________________________________________________ Exercice 10-4 et 10-6 : Gérer les erreurs
prénom = Lire.S();
nom = Lire.S();
C.rechercheUnEtudiant(prénom, nom);
break;
case 5 :
prénom = Lire.S();
nom = Lire.S();
C.modifieUnEtudiant(prénom, nom);
break;
case 6 : System.exit(0) ;
}
}
// 10.4.a Définition de la propriété liste (liste de <Livre> avec une clé <String>)
private HashMap<String, Livre> liste;
public ListeDeLivres() {
liste = new HashMap<String, Livre> ();
if (tmp != null) {
liste.remove(clé);
}
// 10.4.f Affiche la liste des livres par l’intermédiaire d’une collection de <Livre>
if(liste.size() != 0) {
Collection<Livre> c = liste.values();
}
58 ___________________________________________________ Exercice 10-4 et 10-6 : Gérer les erreurs
La classe Bibliothèque
public class Bibliotheque {
public static void main(String [] arg){
byte choix = 0 ;
if (F.ouvrir("L")) {
// 10.6.c Si le fichier existe, lire les lignes et stocker les formes dans
// la liste LdF
LdL = F.lire();
F.fermer();
System.out.println("5. Sortir");
System.out.println();
choix = Lire.b();
switch (choix) {
case 1 : LdL.ajouterUnLivre();
break;
case 2 :
nom = Lire.S();
System.out.print("Entrer la categorie du livre a supprimer : ");
categorie = Lire.S();
break;
// 10.4.g Pour afficher la liste des livres
case 3 : LdL.afficherLesLivres();
break;
case 4 :
59 ___________________________________________________ Exercice 10-4 et 10-6 : Gérer les erreurs
prénom = Lire.S();
nom = Lire.S();
categorie = Lire.S();
isbn = Lire.S();
break;
case 5 :
F.ouvrir("Ecriture");
F.ecrire(LdL);
F.fermer();
System.exit(0) ;
default : System.out.println("Cette option n'existe pas ");
return tmp;
}
catch (IOException e) {
catch (ClassNotFoundException e) {
return null;
}
// 10.6.a Pour enregistrer des données de type ListeDeLivres
try {
if (tmp != null) fWo.writeObject(tmp);
60 ___________________________________________________________ Exercice 10-7: Gérer les erreurs
catch (IOException e) {
try {
catch (IOException e) {
}
public void ecrire(Classe tmp) {
try {
catch (IOException e) {
b. L'entête de la fonction main() définie dans la classe GestionClasse s'écrit à nouveau comme
suit :
public static void main (String [] argument)
private Arbre A;
public Dessin() {
setBackground(couleurFond);
61 ________________________ Exercice 11-2 : Comprendre les techniques d'affichage graphique
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
A = new Arbre(8);
A.dessine(g);
repaint();
class Arbre {
int nc = 2*nl-1;
switch(sapin[i][j]) {
break;
break;
break;
break;
break;
break;
b. et d. La classe Boule
import java.awt.*;
public class Boule {
Color.cyan, Color.magenta};
g.setColor(couleur[(int) (5*Math.random())]);
Exercice 11-3 : Apprendre à gérer les événements (placer une case à cocher)
Corrigé :
import java.awt.*;
import java.awt.event.*;
public DesBoutons(Dessin d) {
63 _______ Exercice 11-4 : Apprendre à gérer les événements (Associer l’événement à l’action)
setBackground(Color.lightGray);
this.add(CaseCoche);
this.add(bPeindre);
this.add(bQuitter);
import java.awt.event.*;
private int n;
private Dessin d;
// b. Pour être visible du bouton bNouveau, tout en étant modifié par la case à
this.n = n;
this.d = d;
switch (n) {
case 2 : System.exit(0);
break;
case 1 : d.nouveau(OK);
break;
else OK = true;
private Arbre A;
public Dessin() {
setBackground(couleurFond);
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
A = new Arbre(8);
repaint();
}
• Dans la classe DesBoutons sont définis les deux boutons « A gauche / scene » et « A gauche /
formes ».
• Dans la classe DessinFormes sont définies les méthodes d’affichage des formes, les différents
modes de déplacement des formes.
• L’association entre le clic sur le bouton et l’action à réaliser est décrite dans la classe
GestionAction.
65 ________________________________________ Exercice 11-5 : Apprendre à gérer les événements
11-5-b :
La méthode dessinerLesFormes() crée une fenêtre Swing dans laquelle sont placés deux
composants. Un composant contenant les formes géométriques (f.getContentPane(new
DessinFormes(…), "Center") placé au centre de la fenêtre et un composant contenant les
boutons (f.getContentPane(new DesBouton(…), "South"), placé dans le bas de la fenêtre.
L’appel au constructeur new DesBouton(…) à l’intérieur de la méthode getContentPane()
permet de créer les deux boutons.
11-5-c :
L’association entre l’action et le clic sur l’un des deux boutons est réalisée grâce à la mise en place des
écouteurs d’événements (appel à la méthode addActionListener()). Les paramètres du
constructeur GestionAction() sont différents pour chaque écouteur afin de différencier les
comportement des boutons.
11-5-d :
Dans la classe DesBoutons, l’écouteur du bouton aGaucheScene est associé avec l’action de
paramètre 1 (new GestionAction(1, df, j)) alors que l’écouteur du bouton aGaucheForme
est associé avec l’action de paramètre 2 (new GestionAction(2, df, j)). Dans la classe
GestionAction, la méthode actionPerformed() doit reprendre ces deux valeurs pour déplacer
les objets :
• soit sur le bord de la scène,
• soit aligner les formes sur celle se situant le plus à gauche.
La méthode s’écrit :
public void actionPerformed(ActionEvent e) {
switch (n) {
case 1 : d.deplacerGaucheScene();
break;
case 2 : d.deplacerGaucheFormes();
break;
}
}
if (nbFormes > 0) {
for (Forme tmp : listeFormes)
else tmp.deplacer(Xref-tmp.x,0);
deplacer(0);
repaint();
}
return min;
return x;
}
11-5-g :
Pour aligner les formes sur celle la plus à gauche, vous devez rechercher le point se trouvant le plus à
gauche – c'est-à-dire la plus petite coordonnée en x. La méthode trouverLeXMin(), placée dans la
classe DessinFormes, parcourt l’ensemble des formes et recherche la plus petite valeur en x. Un
traitement spécifique est réalisé pour le triangle afin de trouver le sommet le plus à gauche.
public int trouverLeXMin(){
if (nbFormes > 0) {
for (Forme tmp : listeFormes) {
return min;
67 _____________________________________________ Exercice 12-1 :Ecrire le traducteur côté client
Les formes sont ensuites déplacées en appelant la méthode deplacer() de la classe DessinFormes
avec pour paramètre la valeur correspondant à la plus petite valeur trouvée.
public void deplacerGaucheFormes(){
repaint();
phrase = Lire.S();
} // Fin de Traduction
Exercice 12-2 :Ecrire le traducteur sous la forme d'une servlet (méthode GET)
Corrigé :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
rep.setContentType("text/html");
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body bgcolor='white'>");
if (req.getParameter("phrase") == null) {
else {
pw.println("</body>");
pw.println("</html>");
}
}
Exercice 12-3 :Ecrire le traducteur sous la forme d'une servlet (méthode POST)
Corrigé :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
rep.setContentType("text/html");
PrintWriter pw = rep.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body bgcolor='white'>");
if (req.getParameter("phrase") == null) {
else {
pw.println("</body>");
pw.println("</html>");
<head>
</head>
<body>
<%
String p = request.getParameter("phrase");
if ( p != null ) {
p = p.replace('a', '*');
p = p.replace('o', '!');
p = p.replace('e', '%');
%>
<%
} else {
%>
<%
%>
</body>
</html>
import java.io.Serializable;
phrase = p;
return phrase;
} // Fin de Phrase
<head>
</head>
<body>
<%-- Utiliser Phrase.class, comme JavaBean avec comme nom d'objet "P"--%>
</body>
</html>
<html>
<body>
<hr>
<h3><font face=arial>Le livre...</h3>
<table>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
</table>
<h3><font face=arial>L'auteur...</h3>
<table>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
</table>
</body>
</html>
73 ______________________________________ Déterminer les variables nécessaires au programme
byte choix;
byte choix;
System.out.println("5. De l'aide");
System.out.println();
System.out.print("Votre choix : ");
choix = Lire.b();
typeCpte = Lire.c();
System.out.print("Numero du compte :");
numéroCpte = Lire.l();
74 ______________________________________________ Accéder à un menu suivant l’option choisie
val_courante = Lire.d();
// Si compte épargne
taux = Lire.d();
numéroLu = Lire.l();
// Sinon, il affiche un message indiquant que le numéro du compte n'est pas valide.
// System.exit(0) ;
// Option 5
byte choix;
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
choix = Lire.b();
switch (choix) {
// Si l’option vaut 1
case 1 :
typeCpte = Lire.c();
val_courante = Lire.d();
// c. Si le type est un compte epargne, le programme demande automatiquement le taux
if ( typeCpte == 'E') {
taux = Lire.d();
break;
// Si l’option vaut 2
case 2 :
numéroLu = Lire.l();
else {
//d. Sinon, affiche un message indiquant que le numéro du compte est non valide.
break;
// Si l’option vaut 3
case 3 :
break;
// Si l’option vaut 4
case 4 :
System.exit(0) ;
break;
// Si l’option vaut 5
case 5 :
// le programme affiche une ligne d'explication pour chaque option.
}
}
b. La boucle do…while, est la structure la plus appropriée puisqu'elle permet d'entrer et d'exécuter au
moins une fois la boucle avant la saisie du choix de l'utilisateur. La boucle s'écrit :
do {
// programme
choix = Lire.b();
while (choix != 4);
byte choix;
do {
System.out.println("5. De l'aide");
System.out.println();
System.out.print("Votre choix : ");
choix = Lire.b();
switch (choix) {
case 1 :
do {
typeCpte = Lire.c();
numéroCpte = Lire.l();
val_courante = Lire.d();
if ( typeCpte == 'E') {
taux = Lire.d();
break;
case 2 :
78 ________________________________________________________________ Rendre le menu interactif
numéroLu = Lire.l();
if ( numéroLu == numéroCpte) {
else
break;
case 3 :
break;
case 4 :
break;
case 5 :
System.out.println("Option 1. Pour creer un compte Courant entrer C ");
break;
default :
System.out.println("Cette option n'existe pas ");
}
79 __________________________ Définir une fonction (Les fonctions sans paramètre avec résultat)
En effet, aucun paramètre n'est nécessaire à la bonne marche de la fonction. Les deux parenthèses, sans
aucune variable à l'intérieur, suffisent. Par contre la fonction communique le choix de l'utilisateur à la
fonction main(). Cette valeur étant de type byte, la fonction est définie également de type byte.
b. Le corps de la fonction reprend les instructions d'affichage utilisées dans le programme développé
au cours des chapitres précédents.
byte tmp;
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
La variable choix est remplacée volontairement par la variable tmp, pour bien les différencier. Une
variable choix déclarée à la fois dans la fonction main() et dans la fonction menuPrincipal()
utilisent deux cases mémoires distinctes ! Elles ne représentent pas la même variable.
c. Pour communiquer la valeur correspondant au choix de l'utilisateur, la variable tmp est placée dans
une instruction return, comme suit :
return tmp;
b. Le corps de la fonction sortir() reprend les instructions de sortie de programme utilisées dans le
programme développé au cours des chapitres précédents.
System.out.println("Au revoir et a bientot");
System.exit(0) ;
c. Tout comme la fonction sortir(), la fonction alAide() ne fournit pas de résultat, l'entête
s'écrit :
public static void alAide( )
d. Le corps de la fonction alAide() reprend les instructions d'affichage utilisées dans le programme
développé au cours des chapitres précédents.
System.out.println("Option 1. Pour creer un compte Courant entrer C ");
byte choix;
do {
choix = menuPrincipal();
switch (choix) {
case 1 :
do {
val_courante = Lire.d();
if ( typeCpte == 'E') {
taux = Lire.d();
}
break;
case 2 :
numéroLu = Lire.l();
if ( numéroLu == numéroCpte) {
else
break;
break;
case 4 : sortir();
break;
case 5 : alAide();
break;
do {
82 _____________________________ Comprendre la visibilité des variables (Les variables de classe)
choix = menuPrincipal();
switch (choix){
case 1 :
do {
typeCpte = Lire.c();
numéroCpte = Lire.l();
val_courante = Lire.d();
if (typeCpte == 'E') {
taux = Lire.d();
break;
case 2 :
System.out.print ( " Quel compte souhaitez vous afficher ? : ");
numéroLu = Lire.l();
break;
case 3 : System.out.println("Option non programmee");
break;
case 4 : sortir();
break;
case 5 : alAide();
break;
// Affiche le compte
public static void afficherCpte( ){
byte tmp;
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
tmp = Lire.b();
return tmp;
do {
System.out.print("Type du compte [Types possibles :" );
tmp = Lire.c();
} while ( tmp != 'C' && tmp!= 'J' && tmp != 'E');
switch (tmp) {
break;
case 'E' : typeCpte = "Epargne";
break;
numéroCpte = Lire.S();
if (typeCpte.equalsIgnoreCase("Epargne")) {
System.out.print("Taux de placement : ");
taux = Lire.d();
85 __________________________________________________________________ Définir le type Compte
Corrigé
a. Les données définissant tout compte bancaire sont les suivantes :
public String typeCpte ;
b. La méthode créerCpte() est déclarée non static, puisqu'elle décrit le comportement de tout
compte bancaire. Elle permet l'initialisation par saisie au clavier, des données caractéristiques d'un
compte (variables d'instance). Elle s'écrit de la façon suivante :
public void créerCpte() {
char tmp;
do {
tmp = Lire.c();
break;
case 'J' : typeCpte = "Joint";
break;
if ( typeCpte.equalsIgnoreCase("Epargne")) {
if ( typeCpte.equalsIgnoreCase("Epargne"))
Corrigé
public class ProjetCh7 {
// La fonction principale
do {
choix = menuPrincipal();
switch (choix) {
case 1 : C.créerCpte() ;
break;
case 2 :
else
case 4 : sortir();
break;
case 5 : alAide();
break;
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
tmp = Lire.b();
return tmp;
System.exit(0) ;
}
}
Corrigé
a. Les données d'une ligne comptable sont : la valeur à créditer ou débiter, la date de l'opération, le
mode de paiement ainsi que le motif. En conséquence, la déclaration des variables d'instance ci-après
permet de définir les données du type LigneComptable.
public double valeur;
b. La méthode créerLigneComptable():
public void créerLigneComptable() {
date = Lire.S();
motif = Lire.S();
mode = Lire.S();
La méthode afficherLigne() :
public void afficherLigne() {
if (valeur < 0)
System.out.println(" le : "+ date +" motif : " + motif + " mode : " + mode);
}
Corrigé
public class Compte {
char tmp;
do {
System.out.print("Type du compte [Types possibles :" );
tmp = Lire.c();
switch (tmp) {
break;
break;
break;
numéroCpte = Lire.S();
if ( typeCpte.equalsIgnoreCase("Epargne")) {
taux = Lire.d();
}
89 ______________________________________________________________ Modifier l’application Projet
val_courante = Lire.d();
ligne.créerLigneComptable();
if ( typeCpte.equalsIgnoreCase("Epargne"))
}
}
Corrigé
public class ProjetCh7 {
byte choix = 0 ;
String numéroLu = "";
do {
choix = menuPrincipal();
switch (choix) {
case 1 : C.créerCpte() ;
break;
case 2 :
if ( numéroLu.equalsIgnoreCase(C.numéroCpte)) C.afficherCpte();
else
System.out.println("Le systeme ne connait pas le compte " + numéroLu);
break;
System.out.print ( "Pour quel compte souhaitez vous créer une ligne ? : ");
numéroLu = Lire.S();
if ( numéroLu.equalsIgnoreCase(C.numéroCpte)) C.créerLigne();
else
break;
case 4 :
sortir();
break;
case 5 : alAide();
break;
// La fonction menuPrincipal()
// La fonction sortir( ) {
// La fonction alAide( ) {
}
do {
tmp = Lire.c();
switch (tmp) {
91 ______________________________________________________________ Modifier l’application Projet
break;
break;
break;
numéroCpte = Lire.S();
if ( typeCpte.equalsIgnoreCase("Epargne")) {
taux = Lire.d();
val_courante = Lire.d();
nbLigneRéel = 0;
}
nbLigneRéel = 1;
val_courante = val_courante + ligne.valeur;
if ( typeCpte.equalsIgnoreCase("Epargne"))
}
}
92 _______ Encapsuler les données d’un compte bancaire (La protection private et l’accès aux
données)
Corrigé
a. En déclarant les données des types Compte et LigneComptable en mode private, le
compilateur détecte des erreurs telles que Variable numéroCpte in class Compte not
accessible from class Projet.
b. Accéder en lecture aux données de la classe Compte
public class Compte {
return typeCpte;
return numéroCpte;
return val_courante;
return taux;
char tmp;
do {
tmp = Lire.c();
switch (tmp) {
break;
break;
break;
}
93 _______ Encapsuler les données d’un compte bancaire (La protection private et l’accès aux
données)
numéroCpte = Lire.S();
if ( typeCpte.equalsIgnoreCase("Epargne")) {
System.out.print("Taux de placement : ");
taux = Lire.d();
}
System.out.print("Valeur initiale du compte : ");
val_courante = Lire.d();
nbLigneRéel = 0;
}
nbLigneRéel = 1;
if ( typeCpte.equalsIgnoreCase("Epargne"))
valeur = Lire.d();
date = Lire.S();
motif = Lire.S();
mode = Lire.S();
}
94 _______ Encapsuler les données d’un compte bancaire (La protection private et l’accès aux
données)
return valeur ;
}
return motif ;
}
return mode ;
}
return date ;
}
if (valeur < 0)
System.out.print("Débiter : " + valeur);
else
System.out.println(" le : " + date + " motif : " + motif + " mode : " + mode);
c. Dans la classe Projet, seules les instructions faisant appel directement aux données de la classe
Compte sont à modifier. C'est à dire pour les options 2 et 3 :
case 2 :
numéroLu = Lire.S();
// if ( numéroLu.equalsIgnoreCase(C.numéroCpte))
if ( numéroLu.equalsIgnoreCase(C.quelNuméroDeCompte()))
C.afficherCpte();
case 3 :
System.out.print ( "Pour quel compte souhaitez vous créer une ligne ? : ");
numéroLu = Lire.S();
if ( numéroLu.equalsIgnoreCase(C.quelNuméroDeCompte()))
C.créerLigne();
else
break;
d. Dans la classe Compte, seules les instructions faisant appel directement aux données de la classe
LigneComptable sont à modifier. C'est à dire pour la méthode créerLigne().
public void créerLigne() {
nbLigneRéel = 1 ;
Encapsuler les données d’un compte bancaire (Le contrôle des données)
Corrigé
a. La méthode contrôleValinit() :
private double contrôleValinit() {
do {
tmpval= Lire.d();
return tmpval;
b. La méthode contrôleMode() :
private String contrôleMode() {
char tmpc ;
do {
tmpc = Lire.c();
switch (tmpc) {
break;
break;
break;
return tmpS;
}
La méthode contrôleMotif() :
private String contrôleMotif() {
char tmpc ;
do {
tmpc = Lire.c();
} while ( tmpc != 'S' && tmpc != 'L' && tmpc != 'A' && tmpc != 'D');
96 _______________ Encapsuler les données d’un compte bancaire (Les constructeurs de classe)
switch (tmpc) {
break;
break;
break;
break;
return tmpS;
c. La méthode créerCpte() :
public void créerCpte() {
// Le type du compte est contrôlé
typeCpte = contrôleType();
if ( typeCpte.equalsIgnoreCase("Epargne")) {
La méthode créerLigneComptable() :
public void créerLigneComptable() {
valeur = Lire.d();
date = Lire.S();
motif = contrôleMotif();
mode = contrôleMode();
public LigneComptable() {
valeur = Lire.d();
date = Lire.S();
motif = contrôleMotif();
mode = contrôleMode();
numéroCpte = Lire.S();
if ( typeCpte.equalsIgnoreCase("Epargne")) {
taux = Lire.d();
}
val_courante = contrôleValinit();
nbLigneRéel = 0 ;
}
Cette dernière transformation fait que l'interpéteur n'exécute plus le constructeur par défaut qui
initialisait automatiquement toutes les données du compte à 0 ou à null mais, le nouveau
constructeur. Ainsi, à l'exécution du programme, la demande de saisie d'un numéro de compte est
affichée au lieu du menu. En effet, l'appel du constructeur est réalisé avant l'affichage du menu.
b. Pour corriger ce défaut, la première idée est de déplacer l'appel du constructeur dans l'option1 du
programme. Ainsi, l'affichage du menu sera réalisé avant la demande de saisie d'un numéro de
compte.
public static void main (String [] argument) {
byte choix = 0 ;
Compte C ;
do {
choix = menuPrincipal();
switch (choix) {
break;
// etc..
Malheureusement, ce déplacement est mal perçu par le compilateur, ce dernier détectant une erreur
du type Variable C may not have been initialized. En effet, l'objet C n'est
construit qu'en option 1. Si l'utilisateur choisit l'option 2 avant de créer le compte, l'interpréteur sera
dans l'impossibilité de l'afficher, puisqu'il n'existera pas en mémoire.
c. En surchargeant le constructeur Compte() de la façon suivante :
public Compte(String num) {
98 _________________________________ Comprendre l’héritage (Protection des données héritées)
numéroCpte = num;
nbLigneRéel = 0;
d. Nous pouvons construire un premier objet C, qui fait appel au constructeur avec paramètre, comme
suit :
public static void main (String [] argument) {
byte choix = 0 ;
do {
choix = menuPrincipal();
switch (choix) {
break;
// etc..
De cette façon, l'objet C est construit en mémoire dès le début de l'exécution du programme. Les
données de l'objet C sont initialisées à 0 ou null. L'utilisateur peut donc théoriquement afficher le
compte avant de le créer. Ensuite, les véritables valeurs du compte sont saisies en option 1 du
programme, en faisant appel au constructeur par défaut. Remarquez qu'il ne s'agit pas d'une nouvelle
déclaration mais, bien d'une initialisation. Dans le cas d'une déclaration en option 1, nous aurions
eu :
case 1 : Compte C = new Compte();
Dans la classe Compte, l'appel au constructeur LigneComptable() est réalisé dans la méthode
créerLigne(), comme suit :
public void créerLigne() {
nbLigneRéel = 1 ;
return taux;
public Compte () {
typeCpte = contrôleType();
numéroCpte = Lire.S();
val_courante = contrôleValinit();
nbLigneRéel = 0; ;
return typeCpte;
}
return numéroCpte;
}
return ligne;
char tmpc;
do {
System.out.print("Type du compte [Types possibles :" );
tmpc = Lire.c();
} while ( tmpc != 'C' && tmpc != 'J' );
switch (tmpc) {
break;
break;
100 _______________ Comprendre l’héritage (Le contrôle des données d’un compte d’épargne)
return tmpS;
do {
tmpval= Lire.d();
return tmpval;
nbLigneRéel = 1 ;
if (val_courante < 0)
System.out.println("Attention compte débiteur ... !!!");
double tmp;
do {
tmp = Lire.d();
return tmp;
}
101 ___________________________ Comprendre l’héritage (Le constructeur d’une classe dérivée)
if (type.equalsIgnoreCase("Epargne")) {
typeCpte = type;
numéroCpte = Lire.S();
val_courante = contrôleValinit();
nbLigneRéel = 0 ;
}
}
super.afficherCpte();
break;
typeCpte = contrôleType();
numéroCpte = Lire.S();
val_courante = contrôleValinit();
// b. Initialisation
102 _______________________ Traiter dix lignes comptables (Transformer la méthode créerLigne())
nbLigneRéel = -1;
if (type.equalsIgnoreCase("Epargne")) {
typeCpte = type;
numéroCpte = Lire.S();
val_courante = contrôleValinit();
// b. Initialisation
nbLigneRéel = -1;
Corrigé
// La méthode créerLigne()
nbLigneRéel++;
// c. Si le nombre de lignes est > 10, décaler toutes les lignes vers le haut
else {
nbLigneRéel--;
décalerLesLignes();
ligne [nbLigneRéel] = new LigneComptable();
ligne[i-1] = ligne[i];
Corrigé
public void afficherCpte() {
if (nbLigneRéel >=0) {
Corrigé
import java.util.*;
import java.io.*;
// de la classe HashMap
public ListeCompte() {
// b. La méthode ajouteUnCompte()
String clé = n;
if (c != null) c.créerLigne();
String clé = n;
if (c == null)
return(c);
String clé = n;
if (c != null) c.afficherCpte();
String clé = n;
if (c != null) {
liste.remove(clé);
}
else System.out.println(n + " est inconnu ! ");
if(liste.size() != 0) {
Corrigé
public class ProjetCh10 {
do {
choix = menuPrincipal();
105 ____________________________ Les comptes sous forme de dictionnaire (L'application Projet)
switch (choix) {
case 1 :
else C.ajouteUnCompte("A");
break;
case 2 :
numéroLu = Lire.S();
C.rechercheUnCompte(numéroLu);
break;
case 3 :
C.afficheLesComptes();
break;
case 4 :
System.out.print("Pour quel compte souhaitez vous créer une ligne ? : ");
numéroLu = Lire.S();
break;
case 5 :
System.out.print ( "Quel compte souhaitez vous supprimer ? : ");
numéroLu = Lire.S();
// a. supprimer un compte
C.supprimeUnCompte(numéroLu);
break;
case 6 : sortir();
break;
case 7 : alAide();
break;
default : System.out.println("Cette option n'existe pas ");
byte tmp;
System.out.println("6. Sortir");
System.out.println("7. De l'aide");
System.out.println();
tmp = Lire.b();
return tmp;
System.exit(0) ;
Corrigé
import java.io.*;
mode = (s.toUpperCase()).charAt(0);
catch (IOException e) {
return false;
}
public void fermer() {
try {
catch (IOException e) {
try {
return tmp;
catch (IOException e) {
catch (ClassNotFoundException e) {
}
return null;
try {
catch (IOException e) {
Corrigé
a. La lecture du fichier « Compte.dat » est réalisée de la façon suivante :
FichierCompte F = new FichierCompte();
if (F.ouvrir("L")) {
C = F.lire();
F.fermer();
Ces instructions sont à insérer dans le fichier Projet.java, juste avant l'entrée dans la boucle
do…while();
108 La mise en place des dates dans les lignes comptables (Rechercher des méthodes dans les
différents packages)
F.ouvrir("E");
F.ecrire(C);
F.fermer();
sortir();
break;
La mise en place des dates dans les lignes comptables (Rechercher des méthodes dans les différents
packages)
Corrigé
a. et b. Les différentes recherches proposées nous montrent qu'il existe une classe nommée
SimpleDateFormat qui permet la vérification de la validité d'une date. La date est traduite en
objet Date à partir d'une chaîne de caractères comprenant le jour, le mois et l'année. Pour séparer
chacune de ces valeurs, il est nécessaire de définir un caractère appelé séparateur de champs.
La mise en place des dates dans les lignes comptables (Ecrire la méthode contrôleDate())
Corrigé
Le contrôle de la validité d'une date est réalisé de la façon suivante :
private String contrôleDate() {
int nb = 0;
Date d = null;
while (d == null){
try {
catch(ParseException p) {
// c. Si la traduction ne peut se réaliser, une exception est détectée
// d. On incrémente un compteur
nb++;
// d. Si le compteur >= 3, la date est initialisée à la date placée en
// mémoire de l'ordinateur
sdate = formatIn.format(d);
return sdate;
Corrigé
a. Pour réaliser les statistiques, nous avons besoin de connaître pour chaque ligne comptable saisie, la
valeur et le motif de l'opération.
b. La valeur et le motif sont accesibles de la la classe Compte grâce aux méthodes
quelleValeur() et quelMotif(). Par contre, le tableau des lignes comptables n'est pas
accessible puisqu'il est déclaré en private. Il est donc nécessaire de créer des méthodes d'accès en
consultation au tableau ligne, ainsi qu'au nombre de lignes effectivement créées. Ces méthodes
sont définies comme suit :
public LigneComptable quelleLigne(int n) {
return ligne[n];
return nbLigneRéel;
Corrigé
public class Stat {
public Stat(Compte c) {
cpte = c;
double prct = 0;
return prct;
double totCredit=0;
110 ________________________________________ Calcul de statistiques (La méthode statParMotif())
if (cpte.quelleLigne(i).quelleValeur() > 0)
if (cpte.quelleLigne(i).quelMotif().equalsIgnoreCase("Divers"))
if (cpte.quelleLigne(i).quelMotif().equalsIgnoreCase("Loyer"))
if (cpte.quelleLigne(i).quelMotif().equalsIgnoreCase("Alimentation"))
// d. Afficher le résultat
System.out.print("A : " + prctAli + "L : " + prctLoy + "D : "+prctDiv);
}
c. Pour afficher simplement le résultat du calcul réalisé par la méthode statParMotif() :
public class Projet {
if (F.ouvrir("L")) {
liste = F.lire();
F.fermer();
}
System.out.println("Affichage des statistiques");
numéroLu = Lire.S();
Compte cpte = new Compte("");
cpte = liste.quelCompte(numéroLu);
// si Oui
111 ____________________________________ L'interface graphique (L'affichage de l'histogramme)
if (cpte != null) {
s.statParMotif();
statParMotif();
g.setColor(Color.darkGray);
g.setColor(Color.blue);
g.fillRect(100,100,50,100);
g.setColor(Color.magenta);
g.setColor(Color.red);
b. La fenêtre principale :
import java.awt.*;
112 ____________________________________ L'interface graphique (L'affichage de l'histogramme)
public Fenetre(Stat s) {
setSize(HT, LG);
setBackground(Color.darkGray);
addWindowListener(new GestionQuitter());
// La zone de dessin
add(page , "Center");
// Le bouton quitter
bQuitter.addActionListener(new GestionQuitter());
add(bQuitter, "South");
setVisible(true);
c. La classe Dessin :
import java.awt.*;
public class Dessin extends Canvas {
public Dessin(Stat s) {
setBackground(couleurFond);
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.s = s;
}
// L'affichage de l'histogramme
d. La classe GetsionQuitter :
import java.awt.event.*;
System.exit(0);
}
113 ________________________________ L'interface graphique (La saisie d'un numéro de compte)
System.exit(0);
Une fois le numéro validé, l'application doit afficher l'histogramme dans une nouvelle fenêtre. Par
conséquent, la classe Saisie s'écrit comme suit :
import java.awt.*;
import java.awt.event.*;
public class Saisie implements ActionListener {
ListeCompte lc;
TextField réponse;
public Saisie (ListeCompte tmp_lc) {
lc = tmp_lc;
// Titre de la fenêtre de saisie
f.setSize(300, 50);
f.setBackground(Color.white);
f.setLayout(new BorderLayout());
f.add(réponse, "East");
réponse.addActionListener(this);
f.setVisible(true);
}
public void actionPerformed(ActionEvent evt) {
cpte = lc.quelCompte(numéro);
if (cpte != null) {
114 _______________________ Le formulaire de saisie, gestion des paramètres envoyés à la servlet
liste = F.lire();
F.fermer();
}
</tr>
<tr align="left">
<%-- la valeur initiale du compte est enregistrée sous le paramètre "initiale" --%>
115 _______________________ Le formulaire de saisie, gestion des paramètres envoyés à la servlet
</tr>
</table>
<tr align="left">
<%-- Si ce bouton est sélectionné, la valeur type="C" est transmise avec la requête -
-%>
<%-- Si ce bouton est sélectionné, la valeur type="J" est transmise avec la requête -
-%>
<%-- Envoie de la requête avec le bouton B1=Creer, méthode GET par défaut --%>
</tr>
</table>
</FORM>
<tr align="left">
<%-- Envoie de la requête avec le bouton B2=Afficher, méthode GET par défaut --%>
</tr>
</table>
</FORM>
</body>
</html>
http://localhost:8080/jsp/servlet/ProjetP3Ch12?numero=1111&B2=Affic
her
Corrigé
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
double valinit;
char type;
// si l'internaute saisi 1111 comme numéro de compte courant avec 100.0 euros
if (données != null) {
int i=0;
nbmot=st.countTokens();
while (st.hasMoreTokens()) {
mot[i] = st.nextToken();
if (mot[i].equalsIgnoreCase("creer")) choix=1;
i++;
rep.setContentType("text/html");
PrintWriter pw = rep.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body bgcolor='white'>");
switch (choix) {
case 1 :
if(nbmot > 3) {
valinit=Double.parseDouble(mot[0]);
numcpte=mot[1];
type = mot[3].charAt(0);
pw.println(C.afficherCpte());
break;
case 2 :
numcpte=mot[0];
if(numcpte.compareTo(C.getNuméroCpte()) == 0)
// affichage d'un compte, voir méthode afficherCpte() de la classe Compte
pw.println(C.afficherCpte());
break;
pw.println("</body>");
pw.println("</html>");
Corrigé
Le constructeur de la classe Compte construit l'objet à partir des paramètres transmis par la servlet (voir
la zone dans la servlet ProjetP3Ch12)
public class Compte {
switch (t) {
break;
break;
numéroCpte = numero;
val_courante = valeur;
Afficher un compte
Corrigé
1. La servlet doit tout d’abord tester si le numéro de compte existe. Pour cela, il est nécessaire d’ajouter
une méthode getNuméroCpte(), afin de récupérer, depuis la servlet, le numéro du compte de
l’objet créé.
// La méthode retourne à la servlet le numéro du compte
}
119 ___________________________________________________________________ La gestion des erreurs
}
Voir également la zone dans la servlet ProjetP3Ch12).