Вы находитесь на странице: 1из 119

Corrigs

Introduction
Naissance d'un programme
Exercice I-1: Apprendre dcomposer une tche en sous-tches distinctes
Corrig
a. Objets ncessaires : 1 t abl eau, 1 cl ou, 2 poi nt es, 1 f i cel l e, 1 mar t eau, 1
cr ayon, 1 mt r e.
b. Liste des oprations :
Mesur er l e mur en haut eur , l e mur en l ar geur , l e t abl eau en haut eur ;
Cal cul er l e cent r e du mur , l e t i er s de l a haut eur du t abl eau ;
Tr acer une mar que au cent r e du mur , sur l e cadr e ( f ace ar r i r e) du t abl eau ;
Pr endr e l e mar t eau, l e t abl eau, l e mt r e, l e cr ayon, l a f i cel l e, l e cl ou, l a poi nt e ;
Poser l e mar t eau, l e t abl eau, l e mt r e, l e cr ayon ;
Enf oncer l a poi nt e, l e cl ou ;
Accr ocher l a f i cel l e l a poi nt e, l a f i cel l e au cl ou ;
Aj ust er l e t abl eau ;
c. Liste ordonne des oprations :
Pr endr e l e mt r e
Mesur er l e mur en haut eur ;
Mesur er l e mur en l ar geur ;
Poser l e mt r e ;
Cal cul er l e cent r e du mur ;
Pr ende l e cr ayon ;
Tr acer une mar que au cent r e du mur ;
Poser l e cr ayon ;
Pr endr e l e mar t eau ;
Pr endr e l e cl ou ;
Enf oncer l e cl ou dans l e mur ;
Poser l e mar t eau ;
Pr endr e l e mt r e
Mesur er l e t abl eau en haut eur ;
Poser l e mt r e
Cal cul er l e t i er s de l a haut eur du t abl eau ;
Pr ende l e cr ayon ;
Tr acer une mar que sur l e bor d gauche du cadr e ( f ace ar r i r e) au t i er s de l a haut eur ;
2
___________________
Exercice I-2 : Observer et comprendre la structure dun programme J ava

Tr acer une mar que sur l e bor d dr oi t du cadr e ( f ace ar r i r e) au t i er s de l a haut eur ;
Poser l e cr ayon ;
Pr endr e l e mar t eau ;
Pr endr e une poi nt e ;
Enf oncer une poi nt e sur l a mar que de dr oi t e ;
Pr endr e une poi nt e ;
Enf oncer une poi nt e sur l a mar que de gauche ;
Poser l e mar t eau ;
Accr ocher l a f i cel l e l a poi nt e de dr oi t e ;
Accr ocher l a f i cel l e l a poi nt e de gauche ;
Accr ocher l a f i cel l e au cl ou ;
Aj ust er l e t abl eau ;
Exercice I-2 : Observer et comprendre la structure dun programme Java
Corrig
publ i c cl ass Pr emi er {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
doubl e a;
Syst em. out . pr i nt ( " Ent r er une val eur : " ) ;
a = Li r e. d( ) ;
Syst em. out . pr i nt ( " Vous avez ent r e : " + a) ;
}
}
a. Reprez les instructions dfinissant la fonction mai n( ) : voir trac orange sur le programme ci-
dessus.
Celles dlimitant la classe Pr emi er : voir trac vert sur le programme ci-dessus.
b. Recherchez les instructions daffichage : voir trac jaune sur le programme ci-dessus.
c. Linstruction doubl e a; a pour rle de rserver une case mmoire afin d'y stocker une valeur
relle de double prcision. Cette case pour nom d'appel a.
d. Excution du programme :
Le message Ent r er une val eur s'affiche l'cran ;
L'utilisateur tape 10 au clavier et, puis sur la touche Ent r e ;
Le message Vous avez ent r e : 10 s'affiche l'cran
Exercice I-3 : Observer et comprendre la structure dun programme Java
Corrig
publ i c cl ass Car r e { / / Donner un nom l a cl asse
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
// Dclaration des variables reprsantant le primtre et le cot
doubl e pr i mt r e, ct ;
// Afficher le message "Valeur du cote : " l'cran
Syst em. out . pr i nt ( " Val eur du cot e : " ) ;
// Lire au clavier une valeur
// placer cette valeur dans la variable correspondante
3
___________________________________________
Exercice I-4 : crire un premier programme J ava

ct = Li r e. d( ) ;
// Calculer le primtre du carr
pr i mt r e = ct * ct ;
// Afficher le rsultat
Syst em. out . pr i nt ( " Per i met r e : " + pr i mt r e) ;
}
}
Exercice I-4 : Ecrire un premier programme Java
Corrig
a. Nombre de variables dclarer : 3, une pour la surface, une pour la largeur, une pour la longueur.
b. Nombre de valeurs saisir au clavier : 2, la largeur et la longueur.
publ i c cl ass Rect angl e { // Nom la classe
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
// Dclaration des variables
doubl e sur f ace, l ar geur , l ongueur ;
// Afficher un message l'cran
Syst em. out . pr i nt ( " Val eur de l a l ongueur : " ) ;
// Lire au clavier une valeur
l ongueur = Li r e. d( ) ;
// Afficher un message l'cran
Syst em. out . pr i nt ( " Val eur de l a l ar geur : " ) ;
// Lire au clavier une valeur
l ar geur = Li r e. d( ) ;
// Calculer le surface du rectangle
sur f ace = l ar geur * l ongueur ;
// Afficher le rsultat
Syst em. out . pr i nt ( " Sur f ace: " + sur f ace) ;
}
}
Partie 1 : Outils et techniques de base
Chapitre 1 : Stocker une information
Exercice 1-1 : Reprer les instructions de dclaration, observer la syntaxe dune instruction
Corrig
a. Dclaration de trois entiers nomms i , j , val eur ;
b. Opration non valide, pas d'oprateur gauche de l'affectation ;
c. Instruction d'affectation, pas de dclaration
d. Dclaration non valide, une variable ne peut s'appeler char
e. Opration non valide, ce n'est pas une instruction ;
4
__________________________________
Exercice 1-2 : Comprendre le mcanisme de laffectation

f. Dclaration d'un entier nomm X ;
g. Dclaration d'un rel simple prcision, nomm A ;
h. Affectation, pas une dclaration ;
i. Affectation non valide, un f l oat ne peut tre affect un entier ;
j. Affectation, pas une dclaration ;
Exercice 1-2 : Comprendre le mcanisme de laffectation
Corrig
a.
Instructions A B C
f l oat A = 3. 5f ; 3. 5f - -
f l oat B = 1. 5f ; 3. 5f 1. 5f -
f l oat C ; 3. 5f 1. 5f -
C = A + B ; 3. 5f 1. 5f 5. 0f
B = A + C ; 3. 5f 8. 5f 5. 0f
A = B ; 8. 5f 8. 5f 5. 0f

b.
Instructions A B C D
doubl e A = 0. 1 ; 0. 1 - - -
doubl e B = 1. 1 ; 0. 1 1. 1 - -
doubl e 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
Exercice 1-3 : Comprendre le mcanisme de laffectation
Corrig
a.
Instructions a b
i nt a = 5, b ; 5 -
b = a + 4 ; 5 9
a = a + 1 6 9
b = a 4 ; 6 2

b.
Instructions val eur
i nt val eur = 2 ; 2
val eur = val eur + 1 ; 3
val eur = val eur * 2 6
val eur = val eur %5; 1

c.
Instructions x y z
5
___________________________
Exercice 1-4 : Comprendre le mcanisme dchange de valeurs

i nt x = 2, y = 10, z ; 2 10 -
z = x + y ; 2 10 12
x = 5 ; 5 10 12
z = z x ; 5 10 7
Exercice 1-4 : Comprendre le mcanisme dchange de valeurs
Corrig
1. 2.
a b a b
i nt a = 5 5 - i nt a = 5 5 -
i nt b = 7 5 7 i nt b = 7 5 7
a = b 7 7 b = a 5 5
b = a 7 7 a = b 5 5
Exercice 1-5 : Comprendre le mcanisme dchange de valeurs
Corrig
Les instructions a = b ; b = a ; ne permettent pas l'change de valeurs puisque la valeur contenue
dans la variable a est perdue ds la premire instruction (voir exercice 1-4, ci-dessus).
Les instructions t = a ; a = b ; b = t ; permettent l'change des valeurs entre a et b, puisque
la valeur de a est mmorise dans la variable t , avant d'tre efface par le contenu de b.
Les instructions t = a ; b = a ; t = b ; ne permettent pas l'change des valeurs car, la
premire instruction mmorise le contenu de la variable a, alors la seconde instruction efface le contenu
de b.
Exercice 1-6 : Comprendre le mcanisme dchange de valeurs
Corrig
t mp = c ; c = b ; b = a ; a = t mp;
Exercice 1-7 : Comprendre le mcanisme dchange de valeurs
Corrig
Instruction a b
i ni t i al i sat i on 2 5
a = a + b ; 7 5
b = a b ; 7 2
a = a b ; 5 2
Partant de a = 2 et b = 5, nous obtenons a = 5 et b = 2. Ainsi, grce ce calcul, les valeurs de a
et b sont changes sans utiliser de variable intermdiaire.
Exercice 1-8 : Calculer des expressions mixtes
Corrig
a. i = 16 i est un entier, le rsultat de la division est donc un entier ;
b. j = 4 4 est le reste de la division entire de 100 par 6 ;
c. i = 5 5 est le reste de la division entire de 5 par 8 ;
d. ( 3 * 5 2 * 4) / ( 2 * 2. 0 3. 0) ( 15 8) / ( 4. 0 3. 0)
( 7) / ( 1. 0) 7. 0
6
______________________________________________
Exercice 1-9 : Calculer des expressions mixtes

e. 2 * ( ( 5 / 5) + ( 4 * ( 4 3) ) %( 5 + 4 2) 2 * 5 %7
10 %7 3
f. ( 5 3 * 4) / ( 2. 0 +2 * 3. 0) / ( 5 4) ( 5 12) / ( 2. 0 + 6. 0) / 1
- 7 / 8. 0 - 0. 875
Exercice 1-9 : Calculer des expressions mixtes
Corrig
a.
x + n % p 2. 0f + 10 %7 2. 0f + 3 5. 0f
x + n / p 2. 0f + 10 / 7 2. 0f + 1 3. 0f
(x + n) / p ( 2. 0f + 10) / 7 12. 0f / 7 1. 7142857f
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
Exercice 1-10 : Comprendre le mcanisme du cast
Corrig
i 1 = val eur / chi f f r e 7 / 2 3
i 2 = chi f f r e / val eur 2 / 7 0
f 1 = ( f l oat ) ( val eur / chi f f r e) ( f l oat ) ( 7 / 2) ( f l oat ) 3 3. Of
f 2 = ( f l oat ) ( val eur / chi f f r e) + 0. 5f 3. 0f + 0. 5f 3. 5f
i 1 = ( i nt ) f 1 ( i nt ) 3. 0f 3
i 2 = ( i nt ) f 2 ( i nt ) 3. 5f 3
f 1 = ( f l oat ) val eur / ( f l oat ) chi f f r e 7. 0f / 2. 0f 3. 5f
f 2 = ( f l oat ) val eur / ( f l oat ) chi f f r e + 0. 5f 3. 5f + 0. 5f 4. 0f
i 1 = ( i nt ) f 1 ( i nt ) 3. 5f 3
i 2 = ( i nt ) f 2 ( i nt ) 4. 0f 4
7
________________________________________
Exercice 2- 1 : Comprendre les oprations de sortie

Chapitre 2 : Communiquer une information
Exercice 2- 1 : Comprendre les oprations de sortie
Corrig
Vous avez ent r e : 223
Pour un mont ant de 335. 5 l e t ot al vaut : 223135
Apr es r educt i on de 20. 5 %, vous gagnez : 68. 8 Eur os
La var i abl e R = R et T = T
Exercice 2-2 : Comprendre les oprations de sortie
Corrig
Syst em. out . pr i nt l n( " x = " + x + " et y = " + y) ;
Syst em. out . pr i nt l n( " Raci ne car r ee de " + x + " = " + Mat h. sqr t ( x) ) ;
Syst em. out . pr i nt ( x + " a l a pui ssance " + y + " = " + Mat h. pow( x, y) ) ;
Exercice 2-3 : Comprendre les oprations d'entre
Corrig
Dans le premier cas, lorsque l'utilisateur fournit au clavier 2, puis 3, puis 4, le programme affiche :
X = 7 Y = 3
Dans le second cas, lorsque l'utilisateur fournit au clavier 2, le programme affiche :
X = 2 Y = 0
Exercice 2-4 : Observer et comprendre la structure d'un programme Java
Corrig
publ i c cl ass Eur o {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
doubl e F, E = 0. 0 ;
doubl e T = 6. 55957 ;
Syst em. out . pr i nt ( " Nombr e de Fr ancs : " ) ;
F = Li r e. d( ) ;
E = F / T ;
Syst em. out . pr i nt l n( " Conver si on F/ E : " + T) ;
Syst em. out . pr i nt l n( " Nombr e d' Eur o : " + E) ;
}
}
Chapitre 3 : Faire des choix
Exercice 3-1 : Comprendre les niveaux dimbrication
Corrig
Si la valeur saisie au clavier est 4, le rsultat affich l'cran est :
Ent r er un chi f f r e : 4
Pour 4 l e r esul t at est 2
8
_______________________________________
Exercice 3-2 : Construire une arborescence de choix

Explication : x a pour valeur 4. Le contenu de la variable x est donc suprieur ou gal 0. Le
programme excute donc l'instruction r = Mat h. sqr t ( 4)
Si la valeur saisie au clavier est -9, le rsultat affich l'cran est :
Ent r er un chi f f r e : - 9
Pour 9 l e r esul t at est 3
Explication : x a pour valeur 9. Le contenu de la variable x est donc strictement infrieur 0. Le
programme excute le bloc el se, c'est dire l'instruction r = Mat h. sqr t ( - ( - 9) )
Exercice 3-2 : Construire une arborescence de choix
Corrig
publ i c cl ass Maxi mum {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
i nt pr emi r e, deuxi me, l aPl usGr ande ;
Syst em. out . pr i nt ( " Ent r er une val eur : " ) ;
pr emi r e = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Ent r er une deuxi eme val eur : " ) ;
deuxi me = Li r e. i ( ) ;
i f ( pr emi r e > deuxi me)
{
Syst em. out . pr i nt l n( deuxi me + " " + pr emi r e) ;
l aPl usGr ande = pr emi r e ;
Syst em. out . pr i nt l n( " La pl us gr ande val eur est : " + l aPl usGr ande) ;
}
el se
{
i f ( pr emi r e < deuxi me) {
Syst em. out . pr i nt l n( pr emi r e + " " + deuxi me) ;
l aPl usGr ande = deuxi me ;
Syst em. out . pr i nt l n( " La pl us gr ande val eur est : " + l aPl usGr ande) ;
}
el se Syst em. out . pr i nt l n( " Les deux val eur s sai si es sont i dent i ques" ) ;
}
} / / Fi n du mai n ( )
} / / Fi n de l a Cl ass Maxi mum
9
_______________________________________
Exercice 3-3 : Construire une arborescence de choix

Exercice 3-3 : Construire une arborescence de choix
Corrig

Les deux accolades fermantes situes aprs l'i nst r uct i on B font que le bloc el se i nst r uct i on C
est rattach au premier i f ( condi t i on1) .
Exercice 3-4 : Construire une arborescence de choix
Corrig
a. Arbre des choix :

b. Les variables dclarer sont :
doubl e a, b, c, x, x1, x2 ;
c. Les instructions i f - el se s'crivent de la faon suivante :
i f ( a == 0)
{
i f ( b == 0)
{
i f ( c == 0)
{
// bloc d'instructions I
}
el se
{
// bloc d'instructions II
10
______________________________________
Exercice 3-4 : Construire une arborescence de choix

}
}
el se
{
// bloc d'instructions III
}
}
el se
{
i f ( b*b 4*a*c < 0)
{
// bloc d'instructions IV
}
el se
{
// bloc d'instructions V
}
}
d. Dans chaque bloc i f ou el se, les instructions de calcul et d'affichage appropries sont les
suivantes :
Le bloc d'instructions I :
Syst em. out . pr i nt l n( " t out r eel est sol ut i on" ) ;
Le bloc d'instructions I I :
Syst em. out . pr i nt l n( " i l n' y a pas de sol ut i on" ) ;
Le bloc d'instructions I I I :
x = - c/ b ;
Syst em. out . pr i nt l n( " l a sol ut i on est " + x) ;
Le bloc d'instructions I V :
Syst em. out . pr i nt l n( " i l n' y a pas de sol ut i on dans l es r eel s" ) ;
Le bloc d'instructions V : Attention de bien placer les parenthses pour obtenir un rsultat
cohrent.
x1 = ( - b + Mat h. sqr t ( b*b 4*a*c) ) / ( 2*a) ;
x2 = ( - b - Mat h. sqr t ( b*b 4*a*c) ) / ( 2*a) ;
Syst em. out . pr i nt l n( " i l y deux sol ut i ons egal es a " + x1 + " et " + x2) ;
e. En insrant l'ensemble des instructions dans la classe SecondDegr e et l'intrieur d'une fonction
mai n( ) , le programme complet s'crit de la faon suivante :
public class SecondDegre {
public static void main (String [] arg) {
doubl e a, b, c, del t a ;
doubl e x, x1, x2 ;
System.out.print("Entrer une valeur pour a : ") ;
11
___________________________
Exercice 3-5 : Manipuler les choix multiples, grer les caractres

a = Lire.d() ;
System.out.print("Entrer une valeur pour b : ") ;
b = Lire.d() ;
System.out.print("Entrer une valeur pour c : ") ;
c = Lire.d() ;
i f ( a == 0) {
i f ( b == 0) {
i f ( c == 0) {
Syst em. out . pr i nt l n( " t out r eel est sol ut i on" ) ;
}
el se {
Syst em. out . pr i nt l n( " i l n' y a pas de sol ut i on" ) ;
}
}
el se {
x = - c / b ;
Syst em. out . pr i nt l n( " l a sol ut i on est " + x) ;
}
}
el se {
delta = b*b - 4*a*c ;
i f ( delta < 0) {
Syst em. out . pr i nt l n( " i l n' y a pas de sol ut i on dans l es r eel s" ) ;
}
el se {
x1 = ( - b + Mat h. sqr t ( delta) ) / ( 2*a) ;
x2 = ( - b - Mat h. sqr t ( delta) ) / ( 2*a) ;
Syst em. out . pr i nt l n( " i l y deux sol ut i ons egal es a " + x1 + " et " + x2) ;
}
}
}
}
Remarquez les instructions de saisie des trois coefficients a, b, c ncessaires la bonne marche du
programme ainsi que l'utilisation d'une variable intermdiaire del t a utilise pour viter la rptition du
mme calcul b*b 4*a*c.
Exercice 3-5 : Manipuler les choix multiples, grer les caractres
Corrig
a. Le code source complet :
publ i c cl ass Cal cul et t e {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
i nt a, b;
char opr at eur ;
12
___________________________
Exercice 3-5 : Manipuler les choix multiples, grer les caractres

doubl e cal cul = 0;
Syst em. out . pr i nt ( " Ent r er l a pr emi er e val eur : " ) ;
a = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Ent r er l a seconde val eur : " ) ;
b = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Type de l ' oper at i on : ( +, - , *, / ) : " ) ;
opr at eur = Li r e. c( ) ;
swi t ch ( opr at eur ) {
case ' +' : cal cul = a + b;
br eak;
case ' - ' : cal cul = a - b;
br eak;
case ' / ' : cal cul = a / b;
br eak;
case ' *' : cal cul = a * b ;
br eak;
}
Syst em. out . pr i nt ( " Cet t e oper at i on a pour r esul t at : " ) ;
Syst em. out . pr i nt l n( a + " " + opr at eur + " " + b + " = " + cal cul ) ;
}
}
b. Excution du programme avec le jeu de valeurs 2, 0 et /
Ent r er l a pr emi r e val eur : 2
Ent r er l a seconde val eur : 0
Type de l ' opr at i on : ( +, - , *, / ) : /
java.lang.ArithmeticException: / by zero
at Calculette.main(Calculette.java:22)
L'interprteur dtecte une exception de type arithmtique. Il s'agit de la division par zro.
c. L'erreur provient de la division. Il suffit de vrifier que la valeur de b soit non nulle pour l'tiquette
' / ' de la structure swi t ch. Examinons la correction :
publ i c cl ass Cal cul et t e {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
i nt a, b;
char opr at eur ;
doubl e cal cul = 0;
boolean OK = true;
Syst em. out . pr i nt ( " Ent r er l a pr emi er e val eur : " ) ;
a = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Ent r er l a seconde val eur : " ) ;
b = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Type de l ' oper at i on : ( +, - , *, / ) : " ) ;
13
___________________________________________
Exercice 4-1 : Comprendre la boucle dowhile

opr at eur = Li r e. c( ) ;
swi t ch ( opr at eur ) {
case ' +' : cal cul = a + b;
br eak;
case ' - ' : cal cul = a - b;
br eak;
case '/' : if ( b != 0) calcul = a / b;
else OK = false;
break;
case ' *' : cal cul = a * b ;
br eak;
default : OK = false ;
}
if (OK) {
Syst em. out . pr i nt ( " Cet t e oper at i on a pour r esul t at : " ) ;
Syst em. out . pr i nt l n( a + " " +opr at eur + " " + b + " = " + cal cul ) ;
}
else System.out.println("Operation non conforme !");
}
}
A l'tiquette ' / ' , le programme vrifie si le contenu de la variable b est non nul. Si tel est le cas, il
excute normalement l'instruction ralisant la division. Sinon, si le contenu de la variable b est nul,
la division n'est pas effectue mais la valeur f al se est affecte la variable OK de type boolen
(initialise par dfaut t r ue lors de la dclaration de la variable).
De cette faon, pour afficher le rsultat du calcul, le programme vrifie la valeur de la variable OK.
Si elle vaut t r ue, cela signifie que l'opration a t effectue sans rencontrer de difficult
particulire sinon, cela veut dire qu'aucune opration n'a pu tre ralise. Le programme signale
alors par un message que l'opration est non conforme
Remarquez que la valeur f al se est aussi affecte la variable OK pour l'tiquette def aul t .
Ainsi, si l'utilisateur entre un autre caractre que +, - , / ou *, le programme n'excute aucun calcul
et signale par un message que l'opration 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 excutes.
Le terme drapeau fait allusion au systme de fonctionnement des botes aux lettres amricaines
munies dun drapeau rouge. Lorsque le facteur dpose du courrier, le drapeau est relev. Le facteur
abaisse le drapeau pour indiquer la prsence de courrier. Lorsque le destinataire prend son courrier,
il relve le drapeau, indiquant que la bote est dsormais vide. Ainsi, la position (tat) du drapeau
indique la prsence (drapeau abaiss) ou non (drapeau lev) de courrier, dans la bote aux lettres.
Chapitre 4 : Faire des rptitions
Exercice 4-1 : Comprendre la boucle dowhile
Corrig
publ i c cl ass Exer ci ce1 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
14
___________________________________________
Exercice 4-1 : Comprendre la boucle dowhile

i nt a, b, r ;
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
a = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
b = Li r e. i ( ) ;
do {
r = a%b;
a = b;
b = r ;
} whi l e ( r ! = 0 ) ;
Syst em. out . pr i nt l n( " Le r esul t at est " + a) ;
}
}
a. Reprez les instructions concernes par la boucle : voir trac orange sur le programme ci-dessus.
Dterminez les instructions de dbut et fin de boucle.: voir trac vert sur le programme ci-dessus.
b. Recherchez l'instruction permettant de modifier le rsultat du test de sortie de boucle : voir trac
jaune sur le programme ci-dessus.
c.
c.
Instructions a b r
i ni t i al i sat i on 30 42 -
do { On entre dans la boucle
r = a %b ; 30 42 30
a = b ; 42 42 30
b = r ; 42 30 30
whi l e ( r ! = 0) r est diffrent de 0, on retourne do
r = a %b ; 42 30 12
a = b ; 30 30 12
b = r ; 30 12 12
whi l e ( r ! = 0) r est diffrent de 0, on retourne do
r = a %b ; 30 12 6
a = b ; 12 12 6
b = r ; 12 6 6
whi l e ( r ! = 0) ; r est diffrent de 0, on retourne do
r = a %b ; 12 6 0
a = b ; 6 6 0
b = r ; 6 0 0
whi l e ( r ! = 0) ; r est gal 0, on sort de la boucle
Le programme affiche : l e r esul t at est 6.
d.
d.
Instructions a b r
i ni t i al i sat i on 35 6 -
do { On entre dans la boucle
r = a %b ; 35 6 5
a = b ; 6 6 5
15
____________________________________________
Exercice 4-2 Comprendre la boucle dowhile

d.
b = r ; 6 5 5
whi l e ( r ! = 0) r est diffrent de 0, on retourne do
R = a %b ; 6 5 1
A = b ; 5 5 1
B = r ; 5 1 1
Whi l e ( r ! = 0) r est diffrent de 0, on retourne do
R = a %b ; 5 1 0
A = b ; 1 1 0
B = r ; 1 0 0
Whi l e ( r ! = 0) ; r est gal 0, on sort de la boucle
Le programme affiche : l e r esul t at est 1.
e. Pour comprendre ce que ralise ce programme, examinons les rsultats des deux excutions
prcdentes. Pour les valeurs 30 et 42, le rsultat vaut 6. Pour les valeurs 35 et 6, le rsultat vaut 1.
Remarquons que 30 et 42 sont divisibles par 6, alors que 35 et 6 n'ont aucun diviseur commun mis
part 1. Nous pouvons donc dire que le rsultat trouv est le plus grand diviseur commun aux deux
valeurs saisies, autrement dit le PGCD.
Exercice 4-2 Comprendre la boucle dowhile
Corrig
publ i c cl ass Exer ci ce2 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
i nt val eur ;
do {
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
val eur = Li r e. i ( ) ;
} whi l e ( val eur < 0 | | val eur > 100) ;
Syst em. out . pr i nt l n( " Vous avez sai si : " + val eur ) ;
}
}
Le programme entre dans la boucle do whi l e sans test pralable. Il demande la saisie dune entire
au clavier. Lorsque la saisie a t effectue, 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 dbut de la boucle et
demande nouveau la saisie dune 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.
Exercice 4-3 : Apprendre compter, accumuler et rechercher une valeur
Corrig
a. Faire
Lire une valeur entire
Mmoriser la plus grande valeur
Mmoriser la plus petite valeur
Calculer la somme des valeurs saisies
Compter le nombre de valeurs saisies
16

Exercice 4-4 : Comprendre la boucle while, traduire une marche suivre en programme J ava

Tant que la valeur saisie est diffrente de 0
Afficher la plus grande et la plus petite valeur
Calculer et afficher la moyenne des valeurs
b. Le code source complet :
publ i c cl ass Exer ci ce3 {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
i nt val eur , l aPl usGr ande, l aPl usPet i t e, l aSomme = 0, l eNombr e = 0 ;
doubl e l aMoyenne;
Syst em. out . pr i nt ( " Ent r er une val eur : " ) ;
val eur = Li r e. i ( ) ;
l aPl usGr ande = val eur ;
l aPl usPet i t e = val eur ;
do {
i f ( l aPl usGr ande < val eur ) l aPl usGr ande = val eur ;
i f ( l aPl usPet i t e > val eur ) l aPl usPet i t e = val eur ;
l aSomme = l aSomme + val eur ;
l eNombr e = l eNombr e + 1 ;
Syst em. out . pr i nt ( " Ent r er une val eur ( 0 pour sor t i r ) : " ) ;
val eur = Li r e. i ( ) ;
} whi l e ( val eur ! = 0) ;
Syst em. out . pr i nt l n( " La pl us gr ande val eur est : " + l aPl usGr ande) ;
Syst em. out . pr i nt l n( " La pl us pet i t e val eur est : " + l aPl usPet i t e) ;
l aMoyenne = ( f l oat ) l aSomme / l eNombr e ;
Syst em. out . pr i nt l n( " La moyenne de ces val eur s : " + l aMoyenne) ;
} / / Fi n du mai n ( )
} / / Fi n de l a Cl ass Maxi mum
Observez qu'une premire valeur est saisie en dehors de la boucle, afin d'initialiser les deux variables
l aPl usPet i t e et l aPl usGr ande. Ainsi, en initialisant par exemple ces valeurs - 1, le programme
peut donner un mauvais rsultat. Imaginez par exemple que vous n'entriez que des valeurs positives. Le
programme affichera en rsultat comme plus petite valeur - 1, alors que cette dernire ne fait pas partie
des valeurs saisies par l'utilisateur. Grce l'initialisation des variables la premire valeur saisie, nous
sommes surs d'obtenir un rsultat cohrent.
Pour finir, remarquez le cast (f l oat ) devant le calcul de la moyenne. En effet, les deux variables
l aSomme et l eNombr e sont de type entier. Sans ce cast, la division fournit un rsultat entier.
Exercice 4-4 : Comprendre la boucle while, traduire une marche suivre en programme Java
Corrig
Traduction de la marche suivre en J ava
a. Tirer au hasard un nombre entre 0 et 10.
i = ( i nt ) ( 10*Mat h. r andom( ) ) ;
b. Lire un nombre.
nombr eLu = Li r e. i ( ) ;
c. Tant que le nombre lu est diffrent du nombre tir au hasard :
17

Exercice 4-5 : Comprendre la boucle while, traduire une marche suivre en programme J ava

whi l e ( nombr eLu ! = i )
8 Lire un nombre
nombr eLu = Li r e. i ( ) ;
8 Compter le nombre de boucle.
nbBoucl e = nbBoucl e + 1 (ou encore nbBoucl e++)
d. Afficher un message de russite ainsi que le nombre de boucles.
Syst em. out . pr i nt ( " Br avo ! " ) ;
Syst em. out . pr i nt l n( " vous avez r eussi en " + nbBoucl e + " f oi s" ) ;
Exercice 4-5 : Comprendre la boucle while, traduire une marche suivre en programme Java
Corrig
Le code source complet :
publ i c cl ass Devi net t e {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
int i, nombreLu = -1, nbBoucle = 0;
i = ( i nt ) ( 10*Mat h. r andom( ) ) ;
Syst em. out . pr i nt ( " Ceci est un j eu, j ' ai t i r e un nombr e au " ) ;
Syst em. out . pr i nt l n( " hasar d ent r e 0 et 10, devi nez l equel ? " ) ;
whi l e ( nombr eLu ! = i ) {
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
nombr eLu = Li r e. i ( ) ;
nbBoucl e = nbBoucl e + 1;
}
Syst em. out . pr i nt ( " Br avo ! " ) ;
Syst em. out . pr i nt l n( " vous avez r eussi en " + nbBoucl e + " f oi s" ) ;
} / / Fi n du mai n ( )
} / / Fi n de l a Cl ass Devi net t e
Remarquez l'initialisation de la variable nombr eLu 1. En effet, pour tre sr d'entrer dans la boucle
whi l e, la variable nombr eLu doit contenir une valeur diffrente de i . Or celle-ci par dfinition, 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 amliorations :
publ i c cl ass J eu {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
i nt i , nombr eLu = - 1, nbBoucl e = 0;
// a. Les valeurs tires au hasard soit comprises entre 0 et 50.
i = ( i nt ) ( 50*Mat h. r andom( ) ) ;
Syst em. out . pr i nt ( " Ceci est un j eu, j ' ai t i r e un nombr e au " ) ;
Syst em. out . pr i nt l n( " hasar d ent r e 0 et 50, devi nez l equel ? " ) ;
whi l e ( nombr eLu! = i ) {
18
__________________________________________________
Exercice 4-7 : Comprendre la boucle for

Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
nombr eLu = Li r e. i ( ) ;
nbBoucl e++;
// b. Un message d'erreur doit afficher si la rponse est mauvaise.
i f ( nombr eLu ! = i ) Syst em. out . pr i nt l n( " Mauvai se r eponse" ) ;
// c. Indique si la valeur saisie est plus grande
// ou plus petite que la valeur tire au hasard.
i f ( nombr eLu < i ) Syst em. out . pr i nt l n( " Tr op pet i t ! " ) ;
i f ( nombr eLu > i ) Syst em. out . pr i nt l n( " Tr op gr and ! " ) ;
}
Syst em. out . pr i nt ( " Br avo ! " ) ;
Syst em. out . pr i nt l n( " vous avez r eussi en " + nbBoucl e + " f oi s" ) ;
} / / Fi n du mai n ( )
} / / Fi n de l a Cl ass J eu
d. titre de rflexion : comment faut-il sy prendre pour trouver la valeur en donnant le moins de
rponses possibles ?
Les valeurs tires au hasard sont comprises entre 0 et 50. le programme indique si la valeur lue au
clavier est plus grande ou plus petite que celle tire au hasard. La meilleure mthode pour trouver le
plus rapidement la rponse est de choisir toujours une valeur de milieu, par rapport un ensemble
de valeurs (essai par dichotomie).
Exemple : nous supposons que l'ordinateur a choisi 8
Notre ensemble de valeurs est initialement [ 0, 50] , choisissons une valeur moyenne dans cet
intervalle, soit 25. L'ordinateur rpond : t r op gr and ! ( nbBoucl e = 1)
Si 25 est une valeur trop grande, notre ensemble de valeurs se restreint [ 0, 25[ , choisissons une
valeur moyenne dans cet intervalle, soit 12. L'ordinateur rpond : t r op gr and !
( nbBoucl e = 2)
Si 12 est une valeur trop grande, notre ensemble de valeurs se restreint [ 0, 12[ , choisissons une
valeur moyenne dans cet intervalle, soit 6. L'ordinateur rpond : t r op pet i t !
( nbBoucl e = 3)
Si 6 est une valeur trop petite, notre ensemble de valeurs se restreint ] 6, 12[ , choisissons une
valeur moyenne dans cet intervalle, soit 9. L'ordinateur rpond : t r op gr and !
( nbBoucl e = 4)
Si 9 est une valeur trop grande, notre ensemble de valeurs se restreint ] 6, 9[ , choisissons une
valeur moyenne dans cet intervalle, soit 8. L'ordinateur rpond : Br avo ! vous avez
r eussi en 5 f oi s. ( nbBoucl e = 5)
Exercice 4-7 : Comprendre la boucle for
Corrig :
publ i c cl ass Exer ci ce7 {
publ i c st at i c voi d mai n ( St r i ng [ ] par amt r e) {
l ong i , b = 1;
i nt a;
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
a = Li r e. i ( ) ;
f or ( i = 2; i <= a; i ++)
19
__________________________________________________
Exercice 4-8 : Comprendre la boucle for

b = b * i ;
Syst em. out . pr i nt l n( " La r esul t at vaut " + b) ;
}
}
Corrig
a. Reprez les instructions concernes par la boucle : voir trac orange sur le programme ci-dessus.
Dterminez les instructions de dbut et fin de boucle : voir trac vert sur le programme ci-dessus.
b. La variable i est initialise 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 rsultat du test de sortie de boucle : voir trac
jaune sur le programme ci-dessus.
d.
d.
Instructions i b a
I ni t i al i sat i on - 1 6
f or ( ) { 2 On entre dans la boucle car, i <= a
b = b * i ; 2 2 6
f or ( ) { 3 On reste dans la boucle car, i <= a
b = b * i ; 3 6 6
f or ( ) { 4 On reste dans la boucle car, i <= a
b = b * i ; 4 24 6
f or ( ) { 5 On reste dans la boucle car, i <= a
b = b * i ; 5 120 6
f or ( ) { 6 On reste dans la boucle car, i <= a
b = b * i ; 6 720 6
f or ( ) { 7 On sort de la boucle car, i > a
e. Ce programme calcul la factorielle d'un nombre soit, n! = 1 * 2 * 3 * * n.
Exercice 4-8 : Comprendre la boucle for
Corrig
publ i c cl ass Exer ci ce9 {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
char c;
f or ( c = ' a' ; c <= ' z' ; c++) Syst em. out . pr i nt ( c + " " ) ;
Syst em. out . pr i nt l n( ) ;
f or ( c = ' z' ; c >= ' a' ; c- - ) Syst em. out . pr i nt ( c + " " ) ;
Syst em. out . pr i nt l n( ) ;
}
}
Les caractres correspondent en ralit des valeurs numriques (Unicode). Il est donc possible de les
utiliser comme variable de contrle d'une boucle f or .
20
____________________
Exercice 5-1 : Apprendre dterminer les paramtres d'un algorithme

Partie 2 : Initiation la programmation objet
Chapitre 5 : De l'algorithme paramtr l'criture de fonctions
Exercice 5-1 : Apprendre dterminer les paramtres d'un algorithme
Corrig
a. Afficher "Combien de sucre ?" et, saisir le nombre souhait de morceaux de sucre au clavier, mettre
la valeur dans nombr eSucr e.
b. Tant que le nombre de morceaux de sucre mis dans la boisson chaude ne correspond pas
nombr eSucr e, ajouter un sucre.
c. Le paramtre qui permet de sucrer plus ou moins la boisson, est la variable correspondant au nombre
maximum de sucres mettre dans la boisson. Soit, nombr eSucr e.
d. L'algorithme a pour nom sucr er , son paramtre a pour nom : nombre. L'entte de l'algorithme
s'crit : sucr er ( nombre)
L'algorithme s'crit : Tant que le nombre de sucres mis dans la boisson chaude ne correspond pas
nombre, ajouter un sucre. Le nom du paramtre a remplac la variable nombr eSucr e.
e. Pour appeler l'algorithme afin qu'il sucre avec le bon nombre de morceaux de sucre :
sucr er ( nombreSucre) . Ainsi, l'algorithme est excut en remplaant nombre par
nombreSucre.
Exercice 5-2 :Comprendre l'utilisation des fonctions
Corrig
publ i c cl ass Fonct i on {
publ i c st at i c voi d mai n( St r i ng [ ] par amet r e) {
// Dclaration des variables
i nt a, compt eur ;
f or ( compt eur = 0; compt eur <= 5; compt eur ++) {
a = cal cul er ( compt eur ) ;
Syst em. out . pr i nt ( a + " a " ) ;
}
} / / f i n de mai n( )
publ i c st at i c i nt cal cul er ( i nt x) {
i nt y;
y = x * x;
r et ur n y ;
} / / f i n de f onc1( )
} / / f i n de cl ass
a. Le bloc dfinissant la fonction mai n( ) : voir trac orange sur le programme ci-dessus.
Le bloc dfinissant la fonction cal cul er ( ) voir trac vert sur le programme ci-dessus.
Le bloc dfinissant la classe Fonct i on, voir trac jaune sur le programme ci-dessus.
b. x est le paramtre formel de la fonction cal cul er ( )
c. Les valeurs transmises au paramtre x de la fonction cal cul er ( ) , lors de son appel depuis la
fonction mai n( ) sont celles places dans la variable compt eur soit 0, 1, 2, 3, 4 et 5.
21
_______________________________________
Exercice 5-3 :Comprendre l'utilisation des fonctions

d. Le produit de x par x, soit 0, 1, 4, 9, 16 et 25.
e. Les valeurs transmises la variable a sont les rsultats de la fonction cal cul er ( ) .
f. 0 a 1 a 4 a 9 a 16 a 25 a
Exercice 5-3 :Comprendre l'utilisation des fonctions
Corrig
a. Ecrire la fonction mai n( ) qui affiche le rsultat de la fonction f ( 0) .
publ i c st at i c voi d mai n( St r i ng [ ] par amet r e) {
i nt R ;
R = f ( 0) ;
Syst em. out . pr i nt ( R) ;
}
b. Calculer f ( x) pour x variant entre 5 et 5
publ i c st at i c voi d mai n( St r i ng [ ] par amet r e) {
i nt R, max = f ( 0) ;
f or ( i nt x = - 5; x <= 5; x++) {
R = f ( x) ;
Syst em. out . pr i nt ( R) ;
}
}
c. Dterminer le maximum de la fonction f ( x) entre - 5 et 5,
publ i c st at i c voi d mai n( St r i ng [ ] par amet r e) {
i nt R, max = f ( 0) ;
f or ( i nt x = - 5; x <= 5; x++) {
R = f ( x) ;
i f ( R > max) max = R ;
}
Syst em. out . pr i nt ( " Le max est : " + max) ;
}
Exercice 5-4 : Dtecter des erreurs de compilation concernant les paramtres ou le rsultat d'une fonction
a.
publ i c st at i c voi d menu ( i nt c) {
swi t ch ( c) {. . .
}
r et ur n c;
}
Corrig
a. La fonction max( ) est dfinie dans ce chapitre, avec deux paramtres entiers alors qu'ici les deux
paramtres utiliss sont de type doubl e.
22
__________________________________________________
Exercice 5-5 : Ecrire une fonction simple

b. L'entte de la fonction prcise que le rsultat retourn par la fonction max( ) est de type i nt alors
que, la variable meffectivement retourne par l'instruction r et ur n est dclare de type f l oat .
c. La fonction menu( ) dcrite au cours de ce chapitre, est de type voi d. L'instruction v1 =
menu( v2) n'est pas valide, cause de la prsence de l'affectation v1 = .
d. L'entte de la fonction menu( ) prcise qu'elle est de type voi d. Le corps de la fonction ne peut
donc pas possder d'instruction r et ur n.
Exercice 5-5 : Ecrire une fonction simple
Corrig
a. Les instructions composant la fonctions sont :
doubl e pr ct ;
pr ct = ( doubl e) nb / t * 100;
b. En supposant que le nom de la fonction soit pour cent age( ) , l'entte de la fonction s'crit :
publ i c st at i c pourcentage( ) {
doubl e pr ct = ( doubl e) nb / t * 100;
}
c. Les deux valeurs pouvant modifier le rsultat sont t et nb. Les paramtres de la fonction s'crivent :
publ i c st at i c pourcentage( i nt t, i nt nb)
d. Le rsultat tant stock dans la variable pr ct , de type doubl e, la mthode est doit tre de type
doubl e. L'entte de la fonction s'crit donc :
publ i c st at i c double pourcentage( i nt t , i nt nb)
La fonction pour cent age( ) s'crit :
publ i c st at i c doubl e pourcentage( i nt t , i nt nb) {
doubl e pr ct = ( doubl e) nb / t * 100;
return prct ;
}
e. Ecrire la fonction mai n( ) qui fait appel la fonction pour cent age( )
publ i c cl ass Exer ci ce5 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar g) {
i nt nbCB, nbCheque, nbVi r ement , nbDebi t ;
doubl e r sul t at ;
Syst em. out . pr i nt ( " Nombr e d' achat Car t es Bl eues : " ) ;
nbCB = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Nombr e de cheques emi s : " ) ;
nbCheque = Li r e. i ( ) ;
Syst em. out . pr i nt ( " Nombr e de vi r ement s aut omat i ques : " ) ;
nbVi r ement = Li r e. i ( ) ;
nbDebi t = nbCB + nbCheque + nbVi r ement ;
Syst em. out . pr i nt l n( " Vous avez emi s " + nbDebi t + " debi t s " ) ;
rsultat = pourcentage(nbDebit, nbCB) ;
Syst em. out . pr i nt l n( " dont " + r sul t at + " %par Car t e bl eue " ) ;
rsultat = pourcentage(nbDebit, nbCheque) ;
23
__________________________________________________
Exercice 5-6 : Ecrire une fonction simple

Syst em. out . pr i nt l n( " " + r sul t at + " %par Cheques " ) ;
rsultat = pourcentage(nbDebit, nbVirement) ;
Syst em. out . pr i nt l n( " " + r sul t at + " %par Vi r ement aut omat i que " ) ;
}
publ i c st at i c doubl e pour cent age( i nt t , i nt nb) {
doubl e pr ct = ( doubl e) nb / t * 100;
r et ur n pr ct ;
}
}
Exercice 5-6 : Ecrire une fonction simple
Corrig
publ i c cl ass Exer ci ce6 {
// 5.6.a La fonction verifier() retourne un entier
publ i c st at i c i nt ver i f i er ( ) {
i nt r esul t at ;
do {
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
r esul t at = Li r e. i ( ) ;
} whi l e ( r esul t at < 0 | | r esul t at > 100) ;
// Lorsque la valeur saisie est > 0 ou < 100
// sortir de la fonction en retournant la valeur saisie
r et ur n r esul t at ;
}
// 5.6.d La fonction verifierAvecBornes() retourne un entier
// Elle possde deux paramtres de type entier qui correspondent
// aux bornes de saisie de la valeur.
publ i c st at i c i nt ver i f i er AvecBor nes( i nt a, i nt b) {
i nt r esul t at ;
do {
Syst em. out . pr i nt ( " Ent r er un ent i er : " ) ;
r esul t at = Li r e. i ( ) ;
} whi l e ( r esul t at < a | | r esul t at > b) ;
// Lorsque la valeur saisie est > a ou < b
// sortir de la fonction en retournant la valeur saisie
r et ur n r esul t at ;
}
/ / La f onct i on mai n( )
publ i c st at i c voi d mai n( St r i ng [ ] par amet r e) {
i nt val eur ;
val eur = ver i f i er ( ) ;
Syst em. out . pr i nt l n( " val eur : " + val eur ) ;
// 5.6.d Appel de fonction verifierAvecBornes()
24
__________________________
Exercice 6-1 : Reprer les variables locales et variables de classe

// La valeur saisir doit tre comprise entre 10 et 20
val eur = ver i f i er AvecBor nes( 10, 20) ;
Syst em. out . pr i nt l n( " val eur : " + val eur ) ;
}

}
b. Que ralise lapplication si lutilisateur saisi les valeurs - 10, 123 et 22 ?
Si lutilisateur saisit - 10, le programme retourne en dbut de boucle et ne peut sortir de la fonction. De
mme pour 123. Lorsquil saisit 22, le programme sort de la boucle et retourne la valeur la fonction
appelante, c'est--dire la fonction mai n( ) qui affiche son tour la valeur saisie.
c. Pour que la valeur saisie soit comprise non plus entre 0 et 100 mais entre deux valeurs a et b
choisies par lutilisateur, il suffit de remplacer lintrieur de la fonction vr i f i er ( ) les valeurs
numriques 0 et 100 par des variables. Ces variables sont alors dfinies comme paramtres de la
fonction. De cette faon, le choix des bornes seffectue au moment de lappel de la fonction.
d. Voir la zone dans le code source ci-avant.
Chapitre 6 : Fonctions, notions avances
Exercice 6-1 : Reprer les variables locales et variables de classe
Corrig :
publ i c cl ass Cal cul et t e {
publ i c st at i c doubl e r sul t at ;
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
i nt a, b;
menu( ) ;
Syst em. out . pr i nt l n( " Ent r er l a pr emi er e val eur " ) ;
a = Li r e. i ( ) ;
Syst em. out . pr i nt l n( " Ent r er l a seconde val eur " ) ;
b = Li r e. i ( ) ;
cal cul er ( ) ;
af f i cher ( ) ;
}

publ i c st at i c voi d cal cul er ( ) {
char opr at i on ;
swi t ch ( opr at i on) {
case ' +' : r sul t at = a + b ;
br eak ;
case ' - ' : r sul t at = a - b ;
br eak ;
case ' / ' : r sul t at = a / b ;
br eak ;
case ' *' : r sul t at = a * b ;
25
__________________________
Exercice 6-1 : Reprer les variables locales et variables de classe

br eak ;
}
}

publ i c st at i c voi d af f i cher ( ) {
char opr at i on ;
Syst em. out . pr i nt ( a + " " +opr at i on + " " + b + " = " + r sul t at ) ;
}

publ i c st at i c voi d menu( ) {
char opr at i on ;
Syst em. out . pr i nt l n( " J e sai s compt er , ent r ez l ' oper at i on choi si e" ) ;
Syst em. out . pr i nt l n( " + pour addi t i onner " ) ;
Syst em. out . pr i nt l n( " - pour soust r ai r e " ) ;
Syst em. out . pr i nt l n( " * pour pul t i pl i er " ) ;
Syst em. out . pr i nt l n( " / pour di vi ser " ) ;
Syst em. out . pr i nt l n( " ( +, - , *, / ) ? : " ) ;
opr at i on = Li r e. c( ) ;
}
}
a. Les fonctions de la classe Cal cul et t e sont au nombre de qauatre et ont pour nom : mai n( ) ,
af f i cher ( ) , cal cul er ( ) et menu( ) (voir trac orange sur le programme ci-dessus).
b. Lorsque les variables a, b et opr at i on sont dclares l'intrieur des fonctions, elles ne sont pas
visibles en dehors de la fonction o elles sont dclares, comme le montre le schma suivant :
26
__________________________
Exercice 6-2 : Communiquer des valeurs l'appel d'une fonction

c. Les variables locales la fonction mai n( ) sont : a et b (voir trac vert sur le programme ci-
dessus).
Les variables locales la fonction af f i cher ( ) sont : opr at i on (voir trac vert sur le
programme ci-dessus).
Les variables locales la fonction cal cul er ( ) sont : opr at i on (voir trac vert sur le
programme ci-dessus).
Les variables locales la fonction menu( ) sont : opr at i on (voir trac vert sur le programme
ci-dessus).
d. La fonction cal cul er ( ) ne peut raliser l'opration demande puisque la variable opr at i on
est dclare dans la fonction menu( ) . Le caractre correspondant l'opration est stock dans la
case mmoire opr at i on localement la fonction menu( ) . Dans la case mmoire opr at i on
de la fonction cal cul er ( ) , il n'y a par consquent, aucun caractre. En effet, ce n'est pas parce
que deux variables portent le mme nom qu'elles reprsentent la mme case mmoire.
e. De la mme faon, la fonction af f i cher ( ) ne peut raliser l'opration demande puisque a et b
sont des variables dclares localement la fonction mai n( ) .
En ralit, ce programme ne peut tre excut puisque la phase de compilation dtecte les erreurs
suivantes :
Cal cul et t e. j ava: 16: Var i abl e opr at i on may not have been i ni t i al i zed.
Cal cul et t e. j ava: 17: Undef i ned var i abl e: a
Cal cul et t e. j ava: 17: Undef i ned var i abl e: b
Cal cul et t e. j ava: 19: Undef i ned var i abl e: a
Cal cul et t e. j ava: 19: Undef i ned var i abl e: b
Cal cul et t e. j ava: 21: Undef i ned var i abl e: a
Cal cul et t e. j ava: 21: Undef i ned var i abl e: b
Cal cul et t e. j ava: 23: Undef i ned var i abl e: a
Cal cul et t e. j ava: 23: Undef i ned var i abl e: b
Cal cul et t e. j ava: 30: Undef i ned var i abl e: a
Cal cul et t e. j ava: 30: Var i abl e opr at i on may not have been i ni t i al i zed.
Cal cul et t e. j ava: 30: Undef i ned var i abl e: b
Exercice 6-2 : Communiquer des valeurs l'appel d'une fonction
Corrig :
27
__________________________
Exercice 6-2 : Communiquer des valeurs l'appel d'une fonction

a. Lorsque les variables r sul t at et opr at i on sont dclares comme variable de classe, elles
sont visibles et accessibles depuis toutes les fonctions de la classe Cal cul et t e, comme le montre
le schma suivant :
b. Pour que les fonctions cal cul er ( ) et af f i cher ( ) connaissent le contenu des variables a et b,
il suffit de passer les valeurs contenues dans ces variables en paramtre des fonctions.
c. Les fonctions s'crivent :
publ i c st at i c voi d cal cul er ( i nt x, i nt y) {
swi t ch ( opr at i on) {
case ' +' : r sul t at = x + y;
br eak;
case ' - ' : r sul t at = x - y;
br eak;
case ' / ' : r sul t at = x / y;
br eak;
case ' *' : r sul t at = x * y ;
br eak;
}
}

publ i c st at i c voi d af f i cher ( i nt x, i nt y) {
Syst em. out . pr i nt l n( x + " " +opr at i on+ " " + y + " = " + r sul t at ) ;
}
Pour viter toute confusion, les paramtres formels (x et y) des fonctions ne portent pas les mmes noms
que les paramtres rels (a et b). Les instructions composant les fonctions ont donc t modifies de
faon ne plus utiliser les variables a et b mais, x et y.
28
______________________________
Exercice 6-3 : Transmettre un rsultat la fonction appelante

Exercice 6-3 : Transmettre un rsultat la fonction appelante
Corrig :
a. Les variables r sul t at et opr at i on tant dclares localement aux fonctions, il ne peut y
avoir transmission des valeurs (voir correction Exercice 6-1.d) entre les fonctions.
b. La fonction menu( ) doit transmettre l'oprateur choisi par l'utilisateur la fonction mai n( ) en
utilisant l'instruction r et ur n. Puis l'oprateur est transmis la fonction cal cul er ( ) , l'aide d'un
paramtre.
c. et d. voir trac orange sur le programme ci-dessous.
e. La fonction cal cul er ( ) doit transmettre le rsultat de l'opration la fonction mai n( ) en
utilisant l'instruction r et ur n. Puis le rsultat est transmis la fonction af f i cher ( ) , l'aide d'un
paramtre.
f. et g. voir trac vert sur le programme ci-dessous.
publ i c cl ass Exer ci ce3 {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
i nt a, b;
char opr at eur ;
doubl e cal cul ;
opr at eur = menu( ) ;
Syst em. out . pr i nt l n( " Ent r er l a pr emi er e val eur " ) ;
a = Li r e. i ( ) ;
Syst em. out . pr i nt l n( " Ent r er l a seconde val eur " ) ;
b = Li r e. i ( ) ;
cal cul = cal cul er ( a, b, opr at eur ) ;
af f i cher ( a, b, opr at eur , cal cul ) ;
}

publ i c st at i c doubl e cal cul er ( i nt x, i nt y, char o) {
doubl e r sul t at =0;
swi t ch ( o) {
case ' +' : r sul t at = x + y;
br eak;
case ' - ' : r sul t at = x - y;
br eak;
case ' / ' : r sul t at = x / y;
br eak;
case ' *' : r sul t at = x * y ;
br eak;
}
r et ur n r sul t at ;
}

publ i c st at i c voi d af f i cher ( i nt x, i nt y, char o, doubl e r ) {
29
__________________________________________
Exercice 7-1 : Utiliser les objets de la classe String

Syst em. out . pr i nt l n( x + " " +o+ " " + y + " = " + r ) ;
}

publ i c st at i c char menu( ) {
char opr at i on ;
Syst em. out . pr i nt l n( " J e sai s compt er , ent r er en pr emi er l ' oper at i on choi si e " ) ;
Syst em. out . pr i nt l n( " + pour addi t i onner " ) ;
Syst em. out . pr i nt l n( " - pour soust r ai r e " ) ;
Syst em. out . pr i nt l n( " * pour pul t i pl i er " ) ;
Syst em. out . pr i nt l n( " / pour di vi ser " ) ;
Syst em. out . pr i nt l n( " ( +, - , *, / ) ? : " ) ;
opr at i on = Li r e. c( ) ;
r et ur n opr at i on ;
}
}
Chapitre 7 : Les classes et les objets
Exercice 7-1 : Utiliser les objets de la classe String
Corrig :
publ i c cl ass Exer ci ce1 {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
St r i ng s1 = " " , s2 = " " , s3 = " " , s4 = " " ;
i nt nbA = 0;
// a. demande la saisie d'une phrase
Syst em. out . pr i nt ( " Ent r ez une phr ase : " ) ;
s1 = Li r e. S( ) ;
// b. affiche la phrase en majuscule
s2 = s1. t oUpper Case( ) ;
// c. compte le nombre de 'a'
f or ( i nt i = 0; i < s2. l engt h( ) ; i ++)
i f ( s2. char At ( i ) == ' A' ) nbA++;
Syst em. out . pr i nt l n( " Vous avez ent r e : " + s1) ;
Syst em. out . pr i nt l n( " Soi t en maj uscul e : " + s2) ;
Syst em. out . pr i nt l n( " Ce mot cont i ent : " + nbA + " A " ) ;
// c. transforme tous les 'a' par des '*'
s3 = s2. r epl ace( ' A' , ' *' ) ;
Syst em. out . pr i nt l n( " I l s' ecr i t donc : " + s3) ;
Syst em. out . pr i nt ( " Ent r ez un second mot : " ) ;
s4 = Li r e. S( ) ;
// d. teste si s4 se trouve entre les 5
ime
et 12
ime
caractres de s1
i f ( s1. r egi onMat ches( 5, s4, 0, 7) )
Syst em. out . pr i nt l n( " La sous chai ne " + s4 + " est bi en pl acee " ) ;
30
__________________________________________
Exercice 7-2 : Utiliser les objets de la classe String

}
}
Exercice 7-2 : Utiliser les objets de la classe String
Corrig :
Le programme reprend la marche suivre de l'exercice 2 du chapitre 4, qui recherche la plus grande et la
plus petite valeur d'une liste de nombres saisis au clavier, la saisie s'arrtant lorsque l'utilisateur entre la
valeur 0. Pour cet exercice, la dmarche est identique. Seules, les techniques de comparaison diffrent
puisque les variables utilises ne sont plus numriques mais, alphabtiques.
publ i c cl ass Exer ci ce2 {
publ i c st at i c voi d mai n( St r i ng [ ] ar gument ) {
St r i ng s1 = " " , sPl usGr and = " " , sPl usPet i t = " " ;
Syst em. out . pr i nt ( " Ent r ez un mot : " ) ;
s1 = Li r e. S( ) ;
sPl usGr and = s1 ;
sPl usPet i t = s1 ;
do {
i f ( s1. compar eTo( sPl usGr and) < 0) sPl usGr and = s1 ;
i f ( s1. compar eTo( sPl usPet i t ) > 0) sPl usPet i t = s1 ;
Syst em. out . pr i nt ( " Ent r er une mot ( FI N pour sor t i r ) : " ) ;
s1 = Li r e. S( ) ;
} whi l e ( ! s1. equal sI gnor eCase( " FI N" ) ) ;
Syst em. out . pr i nt l n( " Le pl us gr and mot : " + sPl usGr and) ;
Syst em. out . pr i nt l n( " Le pl us pet i t mot : " + sPl usPet i t ) ;
}
}
Remarquez le ' ! ' devant l'expression s1. equal sI gnor eCase( " FI N" ) . Le ' ! ' est utilis pour
nier une expression situe juste aprs. Littralement, l'expression se traduit par tant que s1 n'est pas
gal " FI N" sans tenir compte des majuscules .
Exercice 7-3 et 7.4: Crer une classe dobjets et consulter les variables dinstance
Corrig :
La classe Li vr e :
publ i c cl ass Li vr e {
// 7.3.a Dfinition des proprits
publ i c St r i ng t i t r e;
publ i c St r i ng cat egor i e ;
publ i c St r i ng i sbn ;
publ i c St r i ng nomAut eur ;
publ i c St r i ng pr enomAut eur ;
publ i c St r i ng code ;

// 7.4.a Dfinition des comportements : La mthode afficherUnLivre()
publ i c voi d af f i cher UnLi vr e( ) {
31
__________
Exercice 7-3 et 7.4: Crer une classe dobjets et consulter les variables dinstance

Syst em. out . pr i nt l n( " Ti t r e : " + t i t r e) ;
Syst em. out . pr i nt l n( " Aut eur : " + nomAut eur + " " + pr enomAut eur ) ;
Syst em. out . pr i nt l n( " Cat egor i e : " + cat egor i e) ;
Syst em. out . pr i nt l n( " I SBN : " + i sbn) ;
}
// 7.4.c Dfinition des comportements : La mthode calculerLeCode()
publ i c St r i ng cal cul er LeCode ( ) {
St r i ng debut Nom;
St r i ng debut Pr enom;
St r i ng debut Cat egor i e;
i nt l ongueur I sbn;
St r i ng f i nI sbn;
// 7.4.c Rcuprer les deux premires lettres du nom
debut Nom=nomAut eur . subst r i ng( 0, 2) ;
// 7.4.c Rcuprer les deux premires lettres du prnom
debut Pr enom=pr enomAut eur . subst r i ng( 0, 2) ;
// 7.4.c Rcuprer les deux premires lettres de la catgorie
debut Cat egor i e=cat egor i e. subst r i ng( 0, 2) ;
// 7.4.c Calculer la longueur du mot ISBN
l ongueur I sbn=i sbn. l engt h( ) ;
// 7.4.c Rcuprer les deux dernires lettres du numro ISBN
f i nI sbn=i sbn. subst r i ng( ( l ongueur I sbn- 2) , l ongueur I sbn) ;
// 7.4.c Retourner la suite des caractres extraits ci-avant
r et ur n debut Nom+debut Pr enom+debut Cat egor i e+f i nI sbn;
}
}
La classe Bi bl i ot heque :
publ i c cl ass Bi bl i ot heque {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
// 7.3.b Dfinition de lobjet livrePoche
Li vr e l i vr ePoche = new Li vr e( ) ;
// 7.3.b Saisie du titre, pour lobjet livrePoche
Syst em. out . pr i nt ( " Ent r ez l e t i t r e : " ) ;
l i vr ePoche. t i t r e= Li r e. S( ) ;
// 7.3.b Saisie de la catgorie pour lobjet livrePoche
Syst em. out . pr i nt ( " Ent r ez l a cat egor i e : " ) ;
l i vr ePoche. cat egor i e = Li r e. S( ) ;
// 7.3.b Saisie du nom de lauteur pour lobjet livrePoche
Syst em. out . pr i nt ( " Ent r ez l e nomde l ' aut eur : " ) ;
l i vr ePoche. nomAut eur = Li r e. S( ) ;
// 7.3.b Saisie du prnom de lauteur pour lobjet livrePoche
Syst em. out . pr i nt ( " Ent r ez l e pr enomde l ' aut eur : " ) ;
32
_______________________________
Exercice 7-5 : Analyser les rsultats d'une application "objet"

l i vr ePoche. pr enomAut eur = Li r e. S( ) ;
// 7.3.b Saisie du numro ISBN pour lobjet livrePoche
Syst em. out . pr i nt ( " Ent r ez l e numer o I SBN : " ) ;
l i vr ePoche. i sbn= Li r e. S( ) ;
// 7.4.b Affichage des caractritiques de lobjet livrePoche
l i vr ePoche. af f i cher UnLi vr e( ) ;
// 7.4.d Affichage du code de lobjet livrePoche
Syst em. out . pr i nt l n( " code du l i vr e : " + l i vr ePoche. cal cul er LeCode( ) ) ;
}
}
Exercice 7-5 : Analyser les rsultats d'une application "objet"
Corrig
a. Le programme correspondant l'application est celui qui contient la fonction mai n( ) . Dans cet
exercice, le programme s'appelle Fai r eDesTr i angl es.
b. Le type Tr i angl e est dfini par la classe Tr i angl e, dcrite dans le fichier Tr i angl e. j ava.
c. Les attributs de la classe Tr i angl e sont les coordonnes dfinissant les trois sommets dun
triangle. Ils ont pour nom respectivement xA, yA, xB, yB, xC et yC dclars comme variables
d'instance de type i nt .
d. Trois mthodes sont dfinies dans la classe Tr i angl e. Elles ont pour nom : cr er ( ) ,
af f i cher ( ) et dpl acer ( ) .
e. L'application utilise un objet portant le nom P. Les donnes x et y de l'objet P valent toutes les deux
0, juste aprs l'instruction de dclaration de l'objet P.
f. L'objet T est reprsent de la faon suivante :

g. La mthode cr er ( ) est appele par l'intermdiaire de l'objet T. Ce sont donc les donnes xA, yA,
xB, yB, xC et yC de l'objet T qui mmorisent les valeurs saisies au clavier.
33
_______________________________
Exercice 7-5 : Analyser les rsultats d'une application "objet"


h. De la mme faon, la mthode dpl acer ( ) est appele par l'intermdiaire de l'objet T. Ce sont
donc les donnes xA, yA, xB, yB, xC et yC de l'objet T qui prennent les valeurs transmises en
paramtre de la mthode.

i. Le rsultat final est le suivant :
Poi nt A : 0 0
Poi nt B : 0 0
Poi nt C : 0 0
Poi nt A :
Ent r ez l ' absci sse : 10
Ent r ez l ' or donne : 10
Poi nt B :
Ent r ez l ' absci sse : 20
Ent r ez l ' or donne : 40
Poi nt C :
Ent r ez l ' absci sse : 40
Ent r ez l ' or donne : 10
Poi nt A : 10 10
Poi nt B : 20 40
Poi nt C : 40 10
Poi nt A : 110 10
Poi nt B : 120 40
Poi nt C : 140 10
34
__________
Exercice 7-6 et 7.7 : La classe Rectangle et lapplication FaireDesRectangles.java

Exercice 7-6 et 7.7 : La classe Rectangle et lapplication FaireDesRectangles.java
Corrig
La classe Rect angl e :
publ i c cl ass Rect angl e {
// 7.6.a Dfinition des proprits dun rectangle
publ i c i nt x, y, coul eur , haut eur , l ar geur ;

// 7.6.b Dfinition de la mthode crer()
publ i c voi d cr er ( ) {
Syst em. out . pr i nt l n( " Posi t i on en X " ) ;
// 7.7.b Chaque proprit du rectangle est vrifie
x = ver i f i er ( 0, 800) ;
Syst em. out . pr i nt l n( " Posi t i on en Y " ) ;
y = ver i f i er ( 0, 600) ;
Syst em. out . pr i nt l n( " Coul eur " ) ;
coul eur = ver i f i er ( 0, 10) ;
Syst em. out . pr i nt l n( " Haut eur " ) ;
haut eur = ver i f i er ( 0, 600) ;
Syst em. out . pr i nt l n( " Lar geur " ) ;
l ar geur = ver i f i er ( 0, 800) ;
}

// 7.7.a Dfinition de la mthode crer()
publ i c i nt ver i f i er ( i nt a, i nt b) {
i nt r esul t at ;
do {
Syst em. out . pr i nt ( " Ent r ez une val eur : " ) ;
r esul t at = Li r e. i ( ) ;
} whi l e ( r esul t at < a | | r esul t at > b) ;
r et ur n r esul t at ;
}
// 7.6.b Dfinition de la mthode afficher()
publ i c voi d af f i cher ( ) {
Syst em. out . pr i nt l n( " Posi t i on en X : " + x) ;
Syst em. out . pr i nt l n( " Posi t i on en Y : " + y) ;
Syst em. out . pr i nt l n( " Coul eur : " + coul eur ) ;
Syst em. out . pr i nt l n( " Haut eur : " + haut eur ) ;
Syst em. out . pr i nt l n( " Lar geur : " + l ar geur ) ;
}
// 7.6.b Dfinition de la mthode dplacer()
publ i c voi d depl acer ( i nt nx, i nt ny) {
x += nx;
35
____________________________________________
Exercice 8-1 8.5 : La protection des donnes

y += ny;
}
} / / Fi n de l a cl asse Rect angl e
La classe Fai r eDesRect angl es :
publ i c cl ass Fai r eDesRect angl es {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Rect angl e R = new Rect angl e( ) ;
R. af f i cher ( ) ;
// 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
// valeurs demandes, il nest pas possible de crer un tel rectangle
R. cr er ( ) ;
R. af f i cher ( ) ;
// 7.6.c Le rectangle se dplace de 200 sur laxe des y
R. depl acer ( 0, 200) ;
R. af f i cher ( ) ;
}
}
Chapitre 8 : Les principes du concept objet
Exercice 8-1 8.5 : La protection des donnes
Corrig:
La classe Li vr e :
publ i c cl ass Li vr e {
//8.1.a Les proprits sont dfinies en mode priv
pr i vat e St r i ng t i t r e;
pr i vat e St r i ng cat egor i e ;
pr i vat e St r i ng i sbn ;
pr i vat e St r i ng nomAut eur ;
pr i vat e St r i ng pr enomAut eur ;
pr i vat e St r i ng code ;
// 8.2.a Dfinition des mthodes daccs en criture
// Le Titre
publ i c voi d set Ti t r e ( St r i ng val eur ) {
t i t r e = val eur ;
}
// 8.2.a La catgorie
publ i c voi d set Cat egor i e ( St r i ng val eur ) {
cat egor i e = val eur ;
}
// 8.2.a Le numro ISBN
publ i c voi d set I sbn ( St r i ng val eur ) {
36
____________________________________________
Exercice 8-1 8.5 : La protection des donnes

i sbn =val eur ;
}
// 8.2.a Le nom de l'auteur
publ i c voi d set NomAut eur ( St r i ng val eur ) {
nomAut eur =val eur ;
}
// 8.2.a Le prnom de l'auteur
publ i c voi d set Pr enomAut eur ( St r i ng val eur ) {
pr enomAut eur =val eur ;
}

// 8.3.a Dfinition des mthodes daccs en lecture
// Le titre
publ i c St r i ng get Ti t r e ( ) {
r et ur n t i t r e;
}
// 8.3.a La catgorie
publ i c St r i ng get Cat egor i e ( ) {
r et ur n cat egor i e;
}
// 8.3.a Le numro ISBN
publ i c St r i ng get I sbn ( ) {
r et ur n i sbn;
}
// 8.3.a Le nom de l'auteur
publ i c St r i ng get NomAut eur ( ) {
r et ur n nomAut eur ;
}
// 8.3.a Le prnom de l'auteur
publ i c St r i ng get Pr enomAut eur ( ) {
r et ur n pr enomAut eur ;
}
// 8.3.a Le code d'enregistrement
publ i c St r i ng get Code( ) {
code= set Code ( ) ;
r et ur n code;
}
publ i c voi d af f i cher UnLi vr e( ) {
Syst em. out . pr i nt l n( " Ti t r e : " + t i t r e) ;
Syst em. out . pr i nt l n( " Aut eur : " + nomAut eur + " " + pr enomAut eur ) ;
Syst em. out . pr i nt l n( " Cat egor i e : " + cat egor i e) ;
Syst em. out . pr i nt l n( " I SBN : " + i sbn) ;
37
____________________________________________
Exercice 8-1 8.5 : La protection des donnes

// 8.4 Appel de la mthode invisible
Syst em. out . pr i nt l n( " Code : " + get Code( ) ) ;
}
// 8.4 La mthode calculerLeCode() est renomme getCode()
// Elle est dfinie en mode prive pour ne pas etre accessible
// depuis lextrieur. Cest une mthode invisible (mtier).
pr i vat e St r i ng set Code ( ) {
St r i ng debut Nom;
St r i ng debut Pr enom;
St r i ng debut Cat egor i e;
i nt l ongueur I sbn;
St r i ng f i nI sbn;
debut Nom=nomAut eur . subst r i ng( 0, 2) ;
debut Pr enom=pr enomAut eur . subst r i ng( 0, 2) ;
debut Cat egor i e=cat egor i e. subst r i ng( 0, 2) ;
l ongueur I sbn=i sbn. l engt h( ) ;
f i nI sbn=i sbn. subst r i ng( ( l ongueur I sbn- 2) , l ongueur I sbn) ;
r et ur n debut Nom+debut Pr enom+debut Cat egor i e+f i nI sbn;
}
// 8.5.a Dfinition du constructeur par dfaut
publ i c Li vr e( ) {
Syst em. out . pr i nt ( " Ent r ez l e t i t r e : " ) ;
set Ti t r e( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l a cat egor i e : " ) ;
set Cat egor i e( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l e nomde l ' aut eur : " ) ;
set NomAut eur ( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l e pr enomde l ' aut eur : " ) ;
set Pr enomAut eur ( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l e numer o I SBN : " ) ;
set I sbn( Li r e. S( ) ) ;
}
// 8.5.c Surcharge du constructeur
publ i c Li vr e( St r i ng t , St r i ng c, St r i ng na, St r i ng pa, St r i ng i ) {
set Ti t r e( t ) ;
set Cat egor i e( c) ;
set NomAut eur ( na) ;
set Pr enomAut eur ( pa) ;
set I sbn( i ) ;
}
}
La classe Bi bl i ot heque :
38
____________________________________________
Exercice 8-1 8.5 : La protection des donnes

publ i c cl ass Bi bl i ot heque {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
// 8.5.b Appel du constructeur par dfaut
Li vr e l i vr ePoche = new Li vr e( ) ;
// 8.5.b Les instructions de saisie des proprits sont supprimer
// partir de l'exercice 8.5
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
Syst em. out . pr i nt ( " Ent r ez l e t i t r e : " ) ;
l i vr ePoche. set Ti t r e( Li r e. S( ) ) ;
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
Syst em. out . pr i nt ( " Ent r ez l a cat egor i e : " ) ;
l i vr ePoche. set Cat egor i e( Li r e. S( ) ) ;
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
Syst em. out . pr i nt ( " Ent r ez l e nomde l ' aut eur : " ) ;
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
l i vr ePoche. set NomAut eur ( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l e pr enomde l ' aut eur : " ) ;
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
l i vr ePoche. set Pr enomAut eur ( Li r e. S( ) ) ;
Syst em. out . pr i nt ( " Ent r ez l e numer o I SBN : " ) ;
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
l i vr ePoche. set I sbn( Li r e. S( ) ) ;
// 8.3.b Affiche une proprit d'un livre
Syst em. out . pr i nt ( " Code du l i vr e " + l i vr ePoche. get Ti t r e( ) + " : " ) ;
Syst em. out . pr i nt l n( l i vr ePoche. get Code( ) ) ;
// Affiche toutes les proprits
l i vr ePoche. af f i cher UnLi vr e( ) ;
// 8.5.d Appel du constructeur paramtr
Li vr e unPol ar = new Li vr e( " Le myst r e de l a chambr e j aune" , " Ler oux" , " Gast on" ,
" Pol i ci er " , " 2253005495" ) ;
unPol ar . af f i cher UnLi vr e( ) ;
}
}
8.1 Les proprits t i t r e, cat egor i e, i sbn, nomAut eur , pr enomAut eur et code sont
dclares en mode priv. Elles ne sont plus accessibles depuis la fonction mai n( ) , cette dernire tant
dfinie lextrieur de la classe Li vr e. Le compilateur dtecte les erreurs :
Var i abl e t i t r e i n cl ass Li vr e not accessi bl e f r om cl ass
Bi bl i ot heque.
Var i abl e cat egor i e i n cl ass Li vr e not accessi bl e f r om cl ass
Bi bl i ot heque.
Var i abl e i sbn i n cl ass Li vr e not accessi bl e f r omcl ass Bi bl i ot heque.
39
____________________________________________________________
Exercice 8-6 8.9 : LHritage

Var i abl e nomAut eur i n cl ass Li vr e not accessi bl e f r om cl ass
Bi bl i ot heque.
Var i abl e pr enomAut eur i n cl ass Li vr e not accessi bl e f r om cl ass
Bi bl i ot heque.
Var i abl e code i n cl ass Li vr e not accessi bl e f r omcl ass Bi bl i ot heque.
8.2 Voir les commentaires du code source des classes Li vr e et Bi bl i ot heque ci-avant.
8.2.d Le calcul du code est ralis automatiquement par la mthode cal cul er LeCode( ) . Pour
tre sr que le code soit toujours valide, il ne peut tre ni saisi, ni modifi par lutilisateur. La mthode
cal cul er LeCode( ) ne doit pas tre excutable par une autre classe que la classe Li vr e.
8.3 Voir les commentaires du code source des classes Li vr e et Bi bl i ot heque ci-avant.
8.4 Voir les commentaires du code source des classes Li vr e et Bi bl i ot heque ci-avant.
8.5 Voir les commentaires du code source des classes Li vr e et Bi bl i ot heque ci-avant.
8.5.b Le constructeur par dfaut Li vr e( ) demande la saisie des donnes associes lobjet
l i vr ePoche. Les instructions qui suivent demandent nouveau la saisie de ces valeurs. Ces
instructions sont redondantes. Elles sont devenues inutiles depuis la mise en place du constructeur. Il
convient donc de les supprimer.
Exercice 8-6 8.9 : LHritage
Corrig:
La classe For me (exercice 8-6) :
publ i c cl ass For me {
// a. Dfinition des proprits en mode protected
pr ot ect ed i nt x, y, coul eur ;
// b. Dfinition des constantes
publ i c f i nal st at i c i nt l ar geur Ecr an = 800 ;
publ i c f i nal st at i c i nt haut eur Ecr an = 600 ;
publ i c f i nal st at i c i nt coul eur Max = 10 ;
// c. Dfinition de la mthode mtier verifier()
// La mthode doit tre accessible par les classes filles
// Elle est dclare en mode protected
pr ot ect ed i nt ver i f i er ( St r i ng s, i nt a, i nt b) {
i nt r esul t at ;
do {
Syst em. out . pr i nt ( s+" : " ) ;
r esul t at = Li r e. i ( )
} whi l e ( r esul t at < a | | r esul t at > b) ;
r et ur n r esul t at ;
}
// c. surcharge de la mthode mtier verifier()
pr ot ect ed i nt ver i f i er ( i nt t mp, i nt a, i nt b) {
i f ( t mp < a) r et ur n a;
el se i f ( t mp > b) r et ur n b ;
40
____________________________________________________________
Exercice 8-6 8.9 : LHritage

el se r et ur n t mp;
}
// d. Dfinition du constructeur par dfaut
publ i c For me( ) {
x = ver i f i er ( " en X" , 0, l ar geur Ecr an) ;
y = ver i f i er ( " en Y" , 0, haut eur Ecr an) ;
coul eur = ver i f i er ( " coul eur " , 0, coul eur Max) ; ;
}
// d. Surcharge du constructeur
publ i c For me( i nt nx, i nt ny, i nt nc) {
x = ver i f i er ( nx, 0, l ar geur Ecr an) ;
y = ver i f i er ( ny, 0, haut eur Ecr an) ;
coul eur = ver i f i er ( nc, 0, coul eur Max) ;
}
// e. Dfinition de la mthode deplacer()
publ i c voi d depl acer ( i nt nx, i nt ny) {
x = ver i f i er ( x+nx, 0, l ar geur Ecr an) ;
y = ver i f i er ( y+ny, 0, haut eur Ecr an) ;
}
// f. Dfinition de la mthode colorier()
publ i c voi d col or i er ( i nt nc) {
coul eur = ver i f i er ( nc, 0, coul eur Max) ;
}
// g. Dfinition de la mthode afficher()
publ i c voi d af f i cher ( ) {
Syst em. out . pr i nt l n( " Coul eur : " + coul eur ) ;
Syst em. out . pr i nt l n( " Posi t i on en " + x + " , " + y) ;
}
} / / Fi n de l a cl asse For me
La classe Rect angl e (exercice 8-7) :
// a. La classe Rectangle hrite de la classe Forme
publ i c cl ass Rect angl e ext ends For me {
// b. Dfinition des proprits spcifiques un rectangle
pr i vat e i nt l ar geur , haut eur ;
// c. Dfinition du constructeur par dfaut
publ i c Rect angl e( ) {
l ar geur = ver i f i er ( " Lar geur " , 0, l ar geur Ecr an) ;
haut eur = ver i f i er ( " Haut eur " , 0, haut eur Ecr an) ;
}
// c. Surcharge du constructeur
publ i c Rect angl e( i nt nx, i nt ny, i nt nl , i nt nh, i nt nc) {
super ( nx, ny, nc) ;
41
____________________________________________________________
Exercice 8-6 8.9 : LHritage

l ar geur = ver i f i er ( nl , 0, l ar geur Ecr an) ;
haut eur = ver i f i er ( nh, 0, haut eur Ecr an) ;
}
// d. Dfinition de la mthode afficher()
publ i c voi d af f i cher ( ) {
super . af f i cher ( ) ;
Syst em. out . pr i nt l n( " Lar geur du r ect angl e : " + l ar geur ) ;
Syst em. out . pr i nt l n( " Haut eur du r ect angl e : " + haut eur ) ;
}
} / / Fi n de l a cl asse Rect angl e
La classe Tr i angl e (exercice 8-8) :
// a. La classe Triangle hrite de la classe Forme
publ i c cl ass Tr i angl e ext ends For me {
// b. Dfinition des proprits spcifiques un triangle
pr i vat e i nt xB, yB, xC, yC;
// c. Dfinition du constructeur par dfaut
publ i c Tr i angl e( ) {
xB = ver i f i er ( " second sommet en X : " , 0, l ar geur Ecr an) ;
yB = ver i f i er ( " second sommet en Y : " , 0, haut eur Ecr an) ;
xC = ver i f i er ( " t r oi si eme sommet en X : " , 0, l ar geur Ecr an) ;
yC = ver i f i er ( " t r oi si eme sommet en Y : " , 0, haut eur Ecr an) ;
}
// c. Surcharge du constructeur
publ i c Tr i angl e( i nt nxa, i nt nya, i nt nxb, i nt nyb, i nt nxc, i nt nyc, i nt nc ) {
super ( nxa, nya, nc) ;
xB = ver i f i er ( nxb, 0, l ar geur Ecr an) ;
yB = ver i f i er ( nyb, 0, haut eur Ecr an) ;
xC = ver i f i er ( nxc, 0, l ar geur Ecr an) ;
yC = ver i f i er ( nyc, 0, haut eur Ecr an) ;
}
// d. Dfinition de la mthode afficher()
publ i c voi d af f i cher ( ) {
super . af f i cher ( ) ;
Syst em. out . pr i nt l n( " Posi t i on en " + xB + " , " + yB) ;
Syst em. out . pr i nt l n( " Posi t i on en " + xC + " , " + yC) ;
}
// 8.e. Dfinition de la mthode deplacer()
publ i c voi d depl acer ( i nt nx, i nt ny) {
super . depl acer ( nx, ny) ;
xB = ver i f i er ( xB+nx, 0, l ar geur Ecr an) ;
yB = ver i f i er ( yB+ny, 0, haut eur Ecr an) ;
xC = ver i f i er ( xC+nx, 0, l ar geur Ecr an) ;
42
______________________________________________
Exercice 9-1 : Les tableaux une dimension

yC = ver i f i er ( yC+ny, 0, haut eur Ecr an) ;
}
} / / Fi n de l a cl asse Tr i angl e
Lapplication Fai r eDesFor mesGeomet r i ques (exercice 8-9) :
publ i c cl ass Fai r eDesFor mesGeomet r i ques {
// a. Crer un cercle, un rectangle et un triangle
publ i c st at i c voi d mai n( St r i ng [ ] ar gs) {
// b. La vrification des valeurs est ralise par chaque constructeur
Cer cl e C = new Cer cl e( 105, 105, 20, 10) ;
// c. affiche un cercle
C. af f i cher ( ) ;
C. depl acer ( 100, 100) ;
C. af f i cher ( ) ;
Rect angl e R = new Rect angl e( 100, 100, 50, 20, 5) ;
// c. affiche un rectangle
R. af f i cher ( ) ;
R. depl acer ( 200, 200) ;
R. af f i cher ( ) ;
Tr i angl e T = new Tr i angl e ( 200, 200, 100, 300, 300, 300, 2) ;
// c. affiche un triangle
T. af f i cher ( ) ;
// d. et e. le dplacememnt du triangle consiste dplacer tous les sommets du
// triangle et pas seulement le point de rfrence (voir mthode deplacer()
// de la classe Triangle ci-avant)
T. depl acer ( 300, 300) ;
T. af f i cher ( ) ;
}
}
Partie 3 : Les outils et techniques orients objet
Chapitre 9 : Collectionner un nombre fixe d'objets
Exercice 9-1 : Les tableaux une dimension
Corrig:
I valeur[i] valeur.length Affichage
0 1 6
1 1+2 6 i < val eur . l engt h
2 3+2 6 i < val eur . l engt h
3 5+2 6 i < val eur . l engt h
4 7+2 6 i < val eur . l engt h
5 9+2 6 i < val eur . l engt h
6 - 6 i = val eur . l engt h sortie de boucle
43
______________________________________________
Exercice 9-2 : Les tableaux une dimension

I valeur[i] valeur.length Affichage
0 1 6 i < 6 affiche val eur [ 0] = 1
1 3 6 i < 6 affiche val eur [ 1] = 3
2 5 6 i < 6 affiche val eur [ 2] = 5
3 7 6 i < 6 affiche val eur [ 3] = 7
4 9 6 i < 6 affiche val eur [ 4] = 9
5 11 6 i < 6 affiche val eur [ 5] = 11
6 - 6 i =6 sortie de boucle
A l'cran le rsultat s'affiche de la faon suivante :
pour la premire boucle : pour la seconde boucle :
val eur [ 0] = 1
val eur [ 1] = 3
val eur [ 2] = 5
val eur [ 3] = 7
val eur [ 4] = 9
val eur [ 5] = 11
val eur = 1
val eur = 3
val eur = 5
val eur = 7
val eur = 9
val eur = 11
La diffrence entre le premier et le second affichage se situe dans laffichage du compteur de boucle.
Dans la seconde boucle, il nest pas possible dafficher lindice du tableau, puisque le compteur de boucle
est pris en charge par Java. Sil on souhaite afficher lindice du tableau, il convient de placer soit mme
un compteur de boucle lintrieur de la boucle, comme suit :
i nt i = 0 ;
f or ( i nt v : val eur ) {
Syst em. out . pr i nt l n( " val eur [ " + i +" ] = " + v) ;
i ++ ;
}
Exercice 9-2 : Les tableaux une dimension
Corrig :
publ i c cl ass Exer ci ce2 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
i nt l aPl usGr ande, l aPl usPet i t e, l aSomme = 0, i Max = 0, nbMoy = 0 ;
doubl e l aMoyenne;
i f ( ar gument . l engt h > 0) {
i nt [ ] val eur = new i nt [ ar gument . l engt h] ;
f or ( i nt i = 0; i < ar gument . l engt h; i ++)
// a. stocke dans un tableau, des valeurs entires passes
// en paramtre de la ligne de commande ;
val eur [ i ] = I nt eger . par seI nt ( ar gument [ i ] ) ;
l aPl usGr ande = val eur [ 0] ;
f or ( i nt i = 0; i < val eur . l engt h; i ++) {
i f ( l aPl usGr ande < val eur [ i ] ) {
// d. recherche la plus grande des valeurs
l aPl usGr ande = val eur [ i ] ;
// e. dtermine la position de la plus grande des valeurs
i Max = i ;
44
_______________________________________________________
Exercice 9-3 : Les tableaux d'objets

}
// b. calcule la somme de ces valeurs
l aSomme = l aSomme + val eur [ i ] ;
}
// c. calcule la moyenne de ces valeurs
l aMoyenne = ( f l oat ) l aSomme / val eur . l engt h ;
f or ( i nt i = 0; i < val eur . l engt h; i ++)
// f. calcule le nombre de valeurs suprieure la moyenne
i f ( val eur [ i ] >= l aMoyenne) nbMoy++;
Syst em. out . pr i nt l n( " La pl us gr ande val eur est : " + l aPl usGr ande) ;
Syst em. out . pr i nt l n( " A l ' i ndi ce : " + i Max + " du t abl eau " ) ;
Syst em. out . pr i nt l n( " La moyenne de ces val eur s : " + l aMoyenne) ;
Syst em. out . pr i nt l n( " Nombr e de val eur s > a l a moyenne : " + nbMoy) ;
}
el se Syst em. out . pr i nt l n( " Commande : j ava Exer ci ce2 l i st eDesVal eur sEnt i er es " ) ;
} / / Fi n du mai n ( )
}
Exercice 9-3 : Les tableaux d'objets
Corrig :
publ i c cl ass Tr i angl e ext ends For me {
publ i c f i nal st at i c i nt Tai l l eEcr an = 600 ;
// 9.3.a Dfinition des sommets du triangle sous forme de tableaux
pr i vat e i nt [ ] xPoi nt s = new i nt [ 3] ;
pr i vat e i nt [ ] yPoi nt s = new i nt [ 3] ;
// 9.3.b Dfinition des constructeurs
publ i c Tr i angl e( i nt nxa, i nt nya, i nt nxb, i nt nyb, i nt nxc, i nt nyc, i nt nc) {
// Le premier sommet correspond au point de rfrence de la forme
// il est trait par le constructeur de la classe Forme
super ( nxa, nya, nc) ;
// Le premier lment du tableau correspond au point de rfrence de la
// Forme, il prend les valeurs des proprits de la classe Forme. Elles ont
// t vrifie par le constructeur super(...)
xPoi nt s[ 0] = x;
yPoi nt s[ 0] = y;
xPoi nt s[ 1] = ver i f i er ( nxb, 0, l ar geur Ecr an) ;
yPoi nt s[ 1] = ver i f i er ( nyb, 0, haut eur Ecr an) ;
xPoi nt s[ 2] = ver i f i er ( nxc, 0, l ar geur Ecr an) ;
yPoi nt s[ 2] = ver i f i er ( nyc, 0, haut eur Ecr an) ;
}
// 9.3.b Dfinition des constructeurs
publ i c Tr i angl e( ) {
// Le premier lment du tableau correspond au point de rfrence de la
45
_______________________________________________________
Exercice 9-4 : Les tableaux d'objets

// Forme, il prend les valeurs saisies par le constructeur de la classe Forme
xPoi nt s[ 0] = x;
xPoi nt s[ 0] = y;
f or ( i nt i =1; i < xPoi nt s. l engt h; i ++) {
xPoi nt s[ i ] = ver i f i er ( " [ " +i +" ] en X" , 0, l ar geur Ecr an) ;
yPoi nt s[ i ] = ver i f i er ( " [ " +i +" ] en Y" , 0, haut eur Ecr an) ;
}
}
// 9.3.c Les sommets saffichent laide dune boucle for
publ i c voi d af f i cher ( ) {
// 9.3.c Le premier sommet est affich par la mthode afficher()
// de la classe Forme
super . af f i cher ( ) ;
// 9.3.c Les sommets suivants sont affichs partir de lindice 1
f or ( i nt i =1; i < 3; i ++) {
Syst em. out . pr i nt l n( " Posi t i on en " + xPoi nt s[ i ] + " , " + yPoi nt s[ i ] ) ;
}
}
// 9.3.c Les sommets se dplacent laide dune boucle for
publ i c voi d depl acer ( i nt nx, i nt ny) {
// 9.3.c Le premier sommet est dplac par la mthode deplacer()
// de la classe Forme
super . depl acer ( nx, ny) ;
xPoi nt s[ 0] = x;
yPoi nt s[ 0] = y;
// 9.3.c Les sommets suivants sont dplacs partir de lindice 1
f or ( i nt i =1; i < xPoi nt s. l engt h; i ++) {
xPoi nt s[ i ] = ver i f i er ( xPoi nt s[ i ] +nx, 0, l ar geur Ecr an) ;
yPoi nt s[ i ] = ver i f i er ( yPoi nt s[ i ] +ny, 0, haut eur Ecr an) ;
}
}
}
Exercice 9-4 : Les tableaux d'objets
Corrig :
publ i c cl ass Fai r eDesCer cl es {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
Syst em. out . pr i nt ( " Combi en de Cer cl es : " ) ;
i nt nbCer cl e = Li r e. i ( ) ;
i f ( nbCer cl e < 3) nbCer cl e = 4;
// a. Crer un tableau de type Cercle, dont la taille est choisie
// par l'utilisateur.
Cer cl e [ ] C = new Cer cl e [ nbCer cl e] ;
46
____________________________________________
Exercice 9-5 : Les tableaux deux dimensions

f or ( i nt i = 0; i < C. l engt h; i ++)
// b. Initialisation par le constructeur par dfaut
C[ i ] = new Cer cl e( ) ;
Syst em. out . pr i nt l n( " - - - - - - - - - - Recapi t ul at i f - - - - - - - - - - - " ) ;
f or ( i nt i = 0; i < C. l engt h; i ++) C[ i ] . af f i cher ( ) ;
// c. Dplacement du cercle 1 en 20, 20
Syst em. out . pr i nt l n( " - - - - - Cer cl e 1 : Depl acement en 20, 20 - - - - - " ) ;
C[ 1] . dpl acer ( 20, 20) ;
C[ 1] . af f i cher ( ) ;
// d. Agrandissement du cercle 1 de 50
Syst em. out . pr i nt l n( " - - - - - Cer cl e 2 : Agr andi ssement de 50 - - - - " ) ;
C[ 2] . agr andi r ( 50) ;
C[ 2] . af f i cher ( ) ;
// e. Echange du cercle 0 avec le cercle 3
Syst em. out . pr i nt l n( " - - - - Echange du Cer cl e 0 avec l e cer cl e 3 - - - - " ) ;
C[ 0] . changer Avec( C[ 3] ) ;
C[ 0] . af f i cher ( ) ;
C[ 3] . af f i cher ( ) ;
// f. Permute les cercles, le cercle 0 va en 1, le cercle 1 en 2 etc.
Syst em. out . pr i nt l n( " - - - - - - - - - - Per mut at i ons - - - - - - - - - - - " ) ;
f or ( i nt i = 0; i < C. l engt h; i ++)
C[ i ] . changer Avec( C[ 0] ) ;
f or ( i nt i = 0; i < C. l engt h; i ++)
C[ i ] . af f i cher ( ) ;
}
}
Exercice 9-5 : Les tableaux deux dimensions
Corrig :
publ i c cl ass Exer ci ce5 {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
i nt [ ] [ ] Et oi l e = new i nt [ 7] [ 7] ;
// a. Initialisation du tableau
f or ( i nt i = 0; i < Et oi l e. l engt h; i ++) {
f or ( i nt j = 0; j < Et oi l e[ 0] . l engt h; j ++) {
// a. Initialise la premire diagonale
Et oi l e[ i ] [ i ] = 1;
// a. Initialise la troisime ligne
Et oi l e[ 3] [ i ] = 1;
// a. Initialise la troisime colonne
Et oi l e[ i ] [ 3] = 1;
// a. Initialise la deuxime diagonale
Et oi l e[ i ] [ 6- i ] = 1;
47
_____
Exercice 9-6 : Pour mieux comprendre le mcanisme des boucles imbriques (for for)

}
}
// b. Affichage du tableau
f or ( i nt i = 0; i < Et oi l e. l engt h; i ++) {
f or ( i nt j = 0; j < Et oi l e[ 0] . l engt h; j ++) {
i f ( Et oi l e[ i ] [ j ] == 0) Syst em. out . pr i nt ( " " ) ;
el se Syst em. out . pr i nt ( " *" ) ;
}
Syst em. out . pr i nt l n( ) ;
}
} / / Fi n de l a f onct i on mai n( )
} / / Fi n de l a cl asse Exer ci ce4
Exercice 9-6 : Pour mieux comprendre le mcanisme des boucles imbriques (for for)
Corrig :
publ i c cl ass Exer ci ce6 {
publ i c st at i c voi d mai n ( St r i ng [ ] par amet r e) {
i nt i , j , N = 5;
char C;
Syst em. out . pr i nt ( " Ent r er un car act er e : " ) ;
C = Li r e. c( ) ;
f or ( i = 1; i < N; i ++) {
f or ( j = 1; j < N; j ++) {
i f ( i < j ) Syst em. out . pr i nt ( C) ;
el se Syst em. out . pr i nt ( " " ) ;
}
}
}
}
a. Reprer les instructions concernes par les deux boucles rptitives : voir trac orange sur le
programme ci-dessus.
b. Dterminer les instructions de dbut et fin de boucle : voir trac vert sur le programme ci-dessus.
Recherchez les instructions qui permettent de modifier le rsultat 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 mcanisme des boucles imbriques (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
d. Ce programme a pour rsultat :
Ent r er un car act r e : !
! ! ! ! ! !
Exercice 9-7 : Pour mieux comprendre le mcanisme des boucles imbriques (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 !
Chapitre 10 : Collectionner un nombre indtermin d'objets
Exercice 10-1 : Comprendre les listes
Corrig :
i mpor t j ava. ut i l . *;
import java.lang.Number.*;
publ i c cl ass Et udi ant {
pr i vat e St r i ng nom, pr nom;
// a. Dfiniton dune liste de notes ne pouvant contenir que des Double
private ArrayList<Double> notes;
pr i vat e doubl e moyenne;
publ i c Et udi ant ( ) {
Syst em. out . pr i nt ( " Ent r er l e nomde l ' et udi ant : " ) ;
nom= Li r e. S( ) ;
49
______________________
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte

Syst em. out . pr i nt ( " Ent r er l e pr enomde l ' et udi ant : " ) ;
pr nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Combi en de not es pour l ' et udi ant " ) ;
Syst em. out . pr i nt ( pr nom+ " " + nom+ " : " ) ;
i nt nombr e = Li r e. i ( ) ;
notes = new ArrayList()<Double>;
f or ( i nt i = 0; i < nombr e; i ++) {
Syst em. out . pr i nt ( " Ent r er l a not e n " + ( i +1) + " : " ) ;
// b. Mise en place des notes dans la liste
// Les notes saisies sont pralablement transformes en objet Double
not es. add( new Double(Lire.d())) ;
}
moyenne = cal cul Moyenne( ) ;
}
// c. Calcul de la moyenne dune note, notez la nouvelle syntaxe de la boucle for
pr i vat e doubl e cal cul Moyenne( ) {
doubl e somme = 0. 0;
i nt nbnot es = not es.size();
f or ( Doubl e val eur : not es) {
somme = somme + val eur ;
}
r et ur n somme/ nbnot es;
}
publ i c doubl e quel l eMoyenne( ) {
r et ur n moyenne;
}
publ i c voi d af f i cheUnEt udi ant ( ) {
// d. Modification de l'affichage des notes
Syst em. out . pr i nt ( " Les not es de " +pr nom+" " +nom+ " sont : " ) ;
i nt nbnot es = not es.size();
f or ( Doubl e val eur : not es)
Syst em. out . pr i nt ( " " + val eur ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt l n( " Sa moyenne vaut " + moyenne) ;
}
}
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte
Corrig
La classe Fai r eDesLi st esDeFor mes
i mpor t j ava. ut i l . *;
i mpor t j ava. i o. I OExcept i on;
50
______________________
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte

publ i c cl ass Li st eDeFor mes {
// 10.2.a Dfinition de la proprit listeFormes (liste de <Forme>)
pr i vat e Ar r ayLi st <For me> l i st eFor mes;
// 10.2.b Dfinition du constructeur de la liste
publ i c Li st eDeFor mes( ) {
l i st eFor mes = new Ar r ayLi st <For me>( ) ;
}
// 10.2.c La mthode ajoute une forme la liste
publ i c voi d aj out er UneFor me( char t ype) {
// 10.2.c Si le paramtre vaut 'C', la forme ajoute la liste est un cercle
i f ( t ype == ' C' ) {
l i st eFor mes. add( new Cer cl e( ) ) ;
}
// 10.2.c Si le paramtre vaut 'T', la forme ajoute la liste est un triangle
el se i f ( t ype == ' T' ) {
l i st eFor mes. add( new Tr i angl e( ) ) ;
}
// 10.2.c Dans tous les autres cas, la forme ajoute la liste est un rectangle
el se {
l i st eFor mes. add( new Rect angl e( ) ) ;
}
}
// 10.2.d Affiche la liste des formes, tmp sait sil est un cercle, un triangle ou
un rectangle, il appelle la mthode afficher() correspondant son type
publ i c voi d af f i cher LesFor mes( ) {
i nt nbFor mes = l i st eFor mes. si ze( ) ;
i f ( nbFor mes > 0) {
f or ( For me t mp : l i st eFor mes) t mp. af f i cher ( ) ;
}
el se {
Syst em. out . pr i nt ( " I l n' y a pas de f or me dans cet t e l i st e " ) ;
}
}
// 10.5.b Parcourt la liste et crit dans un fichier, une ligne par forme
// en utilisant la chane construite par la mthode getInfos()
publ i c voi d enr egi st r er LesFor mes( Fi chi er f ) t hr ows I OExcept i on {
i nt nbFor mes = l i st eFor mes. si ze( ) ;
i f ( nbFor mes > 0) {
St r i ng chai ne = " " ;
f or ( For me t mp : l i st eFor mes) {
t mp. af f i cher ( ) ;
chai ne = t mp. get I nf os( ) ;
51
______________________
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte

i f ( chai ne ! = nul l ) f . ecr i r e( chai ne) ;
}
}
}
// 10.5.e Lit le fichier ligne par ligne et lenregistre dans la liste
publ i c voi d l i r eLesFor mes( Fi chi er f ) t hr ows I OExcept i on {
St r i ng chai ne;
St r i ng [ ] mot = {" " , " " , " " , " " , " " , " " , " " , " " };
char t t ;
i nt cc, xx0, yy0, xx1, yy1, xx2, yy2, l l , hh, r r ;
do {
// 10.5.e Lit le fichier ligne par ligne et rcupre la ligne lue sous la forme
dun tableau. Examiner la mthode lire() de la classe Fichier.
mot = f . l i r e( ) ;
i f ( mot ! = nul l ) {
t t = mot [ 0] . char At ( 0) ;
// 10.5.de Si le premier lment du tableau rcupr est un 'C'
i f ( t t == ' C' ) {
// 10.5.d Transformer les autres lments du tableau en entier
cc = I nt eger . par seI nt ( mot [ 1] ) ;
xx0 = I nt eger . par seI nt ( mot [ 2] ) ;
yy0 = I nt eger . par seI nt ( mot [ 3] ) ;
r r = I nt eger . par seI nt ( mot [ 4] ) ;
// 10.5.e Ajouter la liste un cercle en appelant le constructeur avec
// comme paramtre, les valeurs lues dans le fichier
l i st eFor mes. add( new Cer cl e( xx0, yy0, r r , cc) ) ;
}
// 10.5.d Si le premier lment du tableau rcupr est un 'T'
el se i f ( t t == ' T' ) {
// 10.5.d Transformer les autres lments du tableau en entier
cc = I nt eger . par seI nt ( mot [ 1] ) ;
xx0 = I nt eger . par seI nt ( mot [ 2] ) ;
yy0 = I nt eger . par seI nt ( mot [ 3] ) ;
xx1 = I nt eger . par seI nt ( mot [ 4] ) ;
yy1 = I nt eger . par seI nt ( mot [ 5] ) ;
xx2 = I nt eger . par seI nt ( mot [ 6] ) ;
yy2 = I nt eger . par seI nt ( mot [ 7] ) ;
// 10.5.d Ajouter la liste un triangle en appelant le constructeur avec
// comme paramtre, les valeurs lues dans le fichier
l i st eFor mes. add( new Tr i angl e( xx0, yy0, xx1, yy1, xx2, yy2, cc) ) ;
}
// 10.5.e Si le premier lment du tableau rcupr est un 'R'
52
______________________
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte

el se i f ( t t == ' R' ) {
// 10.5.e Transformer les autres lments du tableau en entier
cc = I nt eger . par seI nt ( mot [ 1] ) ;
xx0 = I nt eger . par seI nt ( mot [ 2] ) ;
yy0 = I nt eger . par seI nt ( mot [ 3] ) ;
l l = I nt eger . par seI nt ( mot [ 4] ) ;
hh = I nt eger . par seI nt ( mot [ 5] ) ;
// 10.5.e Ajouter la liste un rectangle en appelant le constructeur
// comme paramtre, les valeurs lues dans le fichier
l i st eFor mes. add( new Rect angl e( xx0, yy0, l l , hh, cc) ) ;
}
}
} whi l e ( mot ! = nul l ) ;
}
}
La classe Fai r eDesLi st esDeFor mes
publ i c cl ass Fai r eDesLi st esDeFor mes {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) t hr ows I OExcept i on{
Li st eDeFor mes LdF = new Li st eDeFor mes( ) ;
Fi chi er f = new Fi chi er ( ) ;
// 10.5.f Ouvrir le fichier en lecture
i f ( f . ouvr i r ( " For mes. t xt " , " Lect ur e" ) ) {
// 10.5.f Si le fichier existe, lire les lignes et stocker les formes dans
// la liste LdF
LdF. l i r eLesFor mes( f ) ;
f . f er mer ( ) ;
}
byt e choi x = 0;
do{
Syst em. out . pr i nt l n( " 1. Aj out er un cer cl e" ) ;
Syst em. out . pr i nt l n( " 2. Aj out er un t r i angl e" ) ;
Syst em. out . pr i nt l n( " 3. Aj out er un r ect angl e" ) ;
Syst em. out . pr i nt l n( " 4. Af f i cher l a l i st e" ) ;
Syst em. out . pr i nt l n( " 5. Pour sor t i r " ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
swi t ch( choi x) {
// 10.2.e Pour ajouter un cercle
case 1 : LdF. aj out er UneFor me( ' C' ) ;
br eak;
// 10.2.e Pour ajouter un triangle
case 2 : LdF. aj out er UneFor me( ' T' ) ;
53
______________________
Exercice 10-2 et 10-5 : Comprendre les listes et crer des fichiers texte

br eak;
// 10.2.e Pour ajouter un rectangle
case 3 : LdF. aj out er UneFor me( ' R' ) ;
br eak;
// 10.2.e Afficher la liste des formes
case 4 : LdF. af f i cher LesFor mes( ) ;
br eak;
case 5 :
// 10.5.c Enregistre la liste des formes dans un fichier
f . ouvr i r ( " For mes. t xt " , " Ecr i t ur e" ) ;
LdF. enr egi st r er LesFor mes( f ) ;
f . f er mer ( ) ;
Syst em. exi t ( 0) ;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas" ) ;
}
}whi l e ( choi x ! = 5) ;
}
}
10.5.a : La mthode get I nf os( )
Dans la classe For me
publ i c St r i ng get I nf os( ) {
r et ur n coul eur +" ; " +x+" ; " +y;
}
La valeur retourne par la mthode get I nf os( ) de la classe For me, doit tre insre dans la chane
construite par les classes fille, comme suit :
Dans la classe Cer cl e
publ i c St r i ng get I nf os( ) {
St r i ng t mp = super . get I nf os( ) ;
r et ur n " C; " +t mp+" ; " +r ayon+" ; " ;
}
Dans la classe Tr i angl e
publ i c St r i ng get I nf os( ) {
St r i ng t mp = super . get I nf os( ) ;
r et ur n " T; " +t mp+" ; " +xPoi nt s[ 1] +" ; " +yPoi nt s[ 1] +" ; " +xPoi nt s[ 2] +" ; " +yPoi nt s[ 2] ;
}
Dans la classe Rect angl e
publ i c St r i ng get I nf os( ) {
St r i ng t mp = super . get I nf os( ) ;
r et ur n " R; " +t mp+" ; " +l ar geur +" ; " +haut eur ;
}
10.5.d : La mthode l i r e( ) de la classe f i chi er :
54
______________________________________________
Exercice 10-3 : Comprendre les dictionnaires

// 10.5.d Lit et dcompose une ligne du fichier
publ i c St r i ng [ ] l i r e( ) t hr ows I OExcept i on {
St r i ng l i gne;
// 10.5.d Lit une ligne du fichier
l i gne = f R. r eadLi ne( ) ;
i f ( l i gne ! = nul l ) {
// 10.5.d Le sparateur de mot est le ";"
St r i ngTokeni zer st = new St r i ngTokeni zer ( l i gne, " ; " ) ;
i nt i =0;
// 10.5.d Crer un tableau dont la longueur correspond au nombre de champs
// spar par des ";"
St r i ng mot [ ] = new St r i ng[ st . count Tokens( ) ] ;
// 10.5.d Tant quil y a des champs spars par des ";"
whi l e ( st . hasMor eTokens( ) ) {
// 10.5.d enregistrer le champs courant dans le tableau lindice courant
mot [ i ] = st . next Token( ) ;
i ++;
}
// 10.5.d Retourner le tableau compos de la liste des champs
r et ur n mot ;
}
el se r et ur n nul l ;
}
Exercice 10-3 : Comprendre les dictionnaires
Corrig
Cette mthode est insrer dans la classe Cl asse
// a. Dfinition des paramtres de la mthode
publ i c voi d modi f i eUnEt udi ant ( St r i ng p, St r i ng n) {
// b. Calcul de la cl
St r i ng cl = cr er UneCl ( p, n) ;
// b. Vrification de l'existence ou non de l'tudiant
i f ( l i st eCl asse. get ( cl ) ! = nul l ) {
// c. S'il existe, l'tudiant est modifi grce au constructeur
Et udi ant eModi f i = new Et udi ant ( p, n) ;
l i st eCl asse. put ( cl , eModi f i ) ;
}
el se Syst em. out . pr i nt l n( p + " " + n + " est i nconnu ! " ) ;
}
c. Dans la classe Et udi ant le constructeur est surcharg de la faon suivante :
publ i c Et udi ant ( String p, String n) {
nom = n;
55
_____________________________________________
Exercice 10-3 : Comprendre les dictionnaires

prnom = p;
Syst em. out . pr i nt ( " Combi en de not es pour l ' et udi ant " ) ;
Syst em. out . pr i nt ( pr nom+ " " + nom+ " : " ) ;
i nt nombr e = Li r e. i ( ) ;
not es = new doubl e [ nombr e] ;
f or ( i nt i = 0; i < not es. l engt h; i ++) {
Syst em. out . pr i nt ( " Ent r er l a not e n " + ( i +1) + " : " ) ;
not es[ i ] = Li r e. d( ) ;
}
moyenne = cal cul Moyenne( ) ;
}
d. La nouvelle classe Gest i onCl asse
publ i c cl ass Gest i onCl asse {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
Cl asse C = new Cl asse( ) ;
St r i ng pr nom, nom;
do {
Syst em. out . pr i nt l n( " 1. Aj out e un et udi ant " ) ;
Syst em. out . pr i nt l n( " 2. Suppr i me un et udi ant " ) ;
Syst em. out . pr i nt l n( " 3. Af f i che l a cl asse" ) ;
Syst em. out . pr i nt l n( " 4. Af f i che un et udi ant " ) ;
// d. Indique le choix dune la nouvelle option
System.out.println("5. Modifie un etudiant");
Syst em. out . pr i nt l n( " 6. Sor t i r " ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
swi t ch ( choi x) {
case 1 : C. aj out eUnEt udi ant ( ) ;
br eak;
case 2 :
Syst em. out . pr i nt ( " Ent r er l e pr enomde l ' et udi ant a suppr i mer : " ) ;
pr nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l e nomde l ' et udi ant a suppr i mer : " ) ;
nom= Li r e. S( ) ;
C. suppr i meUnEt udi ant ( pr nom, nom) ;
br eak;
case 3 : C. af f i cheLesEt udi ant s( ) ;
br eak;
case 4 :
Syst em. out . pr i nt ( " Ent r er l e pr enomde l ' et udi ant r echer che : " ) ;
56
___________________________________________________
Exercice 10-4 et 10-6 : Grer les erreurs

pr nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l e nomde l ' et udi ant r echer che : " ) ;
nom= Li r e. S( ) ;
C. r echer cheUnEt udi ant ( pr nom, nom) ;
br eak;
case 5 :
// d. Ajout de la nouvelle option
System.out.print("Entrer le prenom de l'etudiant a modifier : ");
prnom = Lire.S();
System.out.print("Entrer le nom de l'etudiant a modifier : ");
nom = Lire.S();
C.modifieUnEtudiant(prnom, nom);
br eak;
case 6 : Syst em. exi t ( 0) ;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choix != 6) ;
}
}
Exercice 10-4 et 10-6 : Grer les erreurs
Corrig :
La classe Li st eDeLi vr es
i mpor t j ava. ut i l . *;
i mpor t j ava. i o. *;
publ i c cl ass Li st eDeLi vr es i mpl ement s Ser i al i zabl e {
// 10.4.a Dfinition de la proprit liste (liste de <Livre> avec une cl <String>)
pr i vat e HashMap<St r i ng, Li vr e> l i st e;
// 10.4.b Dfinition du constructeur de la liste
publ i c Li st eDeLi vr es( ) {
l i st e = new HashMap<St r i ng, Li vr e> ( ) ;
}
// 10.4.c Ajouter un livre la liste
publ i c voi d aj out er UnLi vr e( ) {
// 10.4.c Cration dun livre
Li vr e nouveau = new Li vr e( ) ;
// 10.4.c Calcule le code du livre
St r i ng cl = nouveau. get Code( ) ;
// 10.4.c Si le code nexiste pas dans la liste, ajoute le livre
i f ( l i st e. get ( cl ) == nul l ) l i st e. put ( cl , nouveau) ;
// 10.4.c Sinon affiche un message derreur
el se Syst em. out . pr i nt l n( " Ce l i vr e a dej a et e sai si ! " ) ;
57
___________________________________________________
Exercice 10-4 et 10-6 : Grer les erreurs

}
// 10.4.d Recherche un livre, connaissant le nom et le prnom de lauteur,
// sa catgorie et son numro isbn
publ i c voi d r echer cher UnLi vr e( St r i ng na, St r i ng pa, St r i ng c, St r i ng i ) {
// 10.4.d Cre un livre temporaire, le titre tant vide
Li vr e t mp = new Li vr e( nul l , c, na, pa, i ) ;
// 10.4.d Calcule le code du livre
St r i ng cl = t mp. get Code( ) ;
Syst em. out . pr i nt l n( " - - - > " + cl ) ;
// 10.4.d Rcupre le livre, connaissant la cl
t mp = ( Li vr e) l i st e. get ( cl ) ;
// 10.4.d Affiche le livre, sil existe
i f ( t mp ! = nul l ) t mp. af f i cher UnLi vr e( ) ;
// 10.4.d Sinon afficher un message derreur
el se Syst em. out . pr i nt l n( pa + " " + na + " est i nconnu ! " ) ;
}
// 10.4.f Supprime un livre, connaissant le nom et le prnom de lauteur,
// sa catgorie et son numro isbn
publ i c voi d suppr i mer UnLi vr e( St r i ng na, St r i ng pa, St r i ng c, St r i ng i ) {
// 10.4.f Cre un livre temporaire, le titre tant vide
Li vr e t mp = new Li vr e( nul l , c, na, pa, i ) ;
// 10.4.f Calcule le code du livre
St r i ng cl = t mp. get Code( ) ;
// 10.4.f Rcupre le livre, connaissant la cl
t mp = ( Li vr e) l i st e. get ( cl ) ;
i f ( t mp ! = nul l ) {
// 10.4.f Supprime le livre, sil existe
l i st e. r emove( cl ) ;
Syst em. out . pr i nt l n( pa + " " + na + " a et e suppr i me " ) ;
}
// 10.4.f Sinon affiche un message derreur
el se Syst em. out . pr i nt l n( pa + " " + na + " est i nconnu ! " ) ;
}
// 10.4.f Affiche la liste des livres par lintermdiaire dune collection de <Livre>
publ i c voi d af f i cher LesLi vr es( ) {
i f ( l i st e. si ze( ) ! = 0) {
Col l ect i on<Li vr e> c = l i st e. val ues( ) ;
f or ( Li vr e t mp : c) t mp. af f i cher UnLi vr e( ) ;
}
el se Syst em. out . pr i nt l n( " I l n' y a pas de l i vr e dans cet t e l i st e" ) ;
}
}
58
___________________________________________________
Exercice 10-4 et 10-6 : Grer les erreurs

La classe Bi bl i ot hque
publ i c cl ass Bi bl i ot heque {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
byt e choi x = 0 ;
Li st eDeLi vr es LdL = new Li st eDeLi vr es( ) ;
Fi chi er DeLi vr es F = new Fi chi er DeLi vr es( ) ;
// 10.6.c. Ouvrir le fichier en lecture
i f ( F. ouvr i r ( " L" ) ) {
// 10.6.c Si le fichier existe, lire les lignes et stocker les formes dans
// la liste LdF
LdL = F. l i r e( ) ;
F. f er mer ( ) ;
}
St r i ng pr nom, nom, cat egor i e, i sbn;
do {
Syst em. out . pr i nt l n( " 1. Aj out er un l i vr e" ) ;
Syst em. out . pr i nt l n( " 2. Suppr i mer un l i vr e" ) ;
Syst em. out . pr i nt l n( " 3. Af f i cher l a l i st e des l i vr es" ) ;
Syst em. out . pr i nt l n( " 4. Af f i cher un l i vr e" ) ;
Syst em. out . pr i nt l n( " 5. Sor t i r " ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
swi t ch ( choi x) {
case 1 : LdL. aj out er UnLi vr e( ) ;
br eak;
case 2 :
// 10.4.g Pour supprimer un livre
Syst em. out . pr i nt ( " Ent r er l e pr enomde l ' aut eur du l i vr e a suppr i mer : " ) ;
pr nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l e nomde l ' aut eur du l i vr e a suppr i mer : " ) ;
nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l a cat egor i e du l i vr e a suppr i mer : " ) ;
cat egor i e = Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l es deux der ni er s chi f f r es du code I SBN : " ) ;
i sbn = Li r e. S( ) ;
LdL. suppr i mer UnLi vr e( nom, pr nom, cat egor i e, i sbn) ;
br eak;
// 10.4.g Pour afficher la liste des livres
case 3 : LdL. af f i cher LesLi vr es( ) ;
br eak;
case 4 :
59
___________________________________________________
Exercice 10-4 et 10-6 : Grer les erreurs

// 10.4.g Pour rechercher et afficher un seul livre
Syst em. out . pr i nt ( " Ent r er l e pr enomde l ' aut eur du l i vr e r echer ch : " ) ;
pr nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l e nomde l ' aut eur du l i vr e r echer ch : " ) ;
nom= Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l a cat egor i e du l i vr e r echer ch : " ) ;
cat egor i e = Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l es deux der ni er s chi f f r es du code I SBN : " ) ;
i sbn = Li r e. S( ) ;
LdL. r echer cher UnLi vr e( nom, pr nom, cat egor i e, i sbn) ;
br eak;
case 5 :
// 10.6.d Pour enregistrer les donnes dans un fichier dobjets
Syst em. out . pr i nt l n( " Sauvegar de des donnes dans Bi bl i ot heque. dat " ) ;
F. ouvr i r ( " Ecr i t ur e" ) ;
F. ecr i r e( LdL) ;
F. f er mer ( ) ;
Syst em. exi t ( 0) ;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 5) ;
}
}
Les mthode l i r e( ) et ecr i r e( ) de la classe Fi chi er DeLi vr es
// 10.6.a Pour extraire du fichier Bibliotheque.dat des donnes de type ListeDeLivres
publ i c Li st eDeLi vr es l i r e( ) {
t r y {
Li st eDeLi vr es t mp = ( Li st eDeLi vr es) f Ro. r eadObj ect ( ) ;
r et ur n t mp;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur de l ect ur e " ) ;
}
cat ch ( Cl assNot FoundExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" n' est pas du bon f or mat " ) ;
}
r et ur n nul l ;
}
// 10.6.a Pour enregistrer des donnes de type ListeDeLivres
publ i c voi d ecr i r e( Li st eDeLi vr es t mp) {
t r y {
i f ( t mp ! = nul l ) f Wo. wr i t eObj ect ( t mp) ;
60
___________________________________________________________
Exercice 10-7: Grer les erreurs

}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur en cour s d' cr i t ur e " +e) ;
}
}
Exercice 10-7: Grer les erreurs
Corrig :
a. Les blocs cat ch et t r y s'crivent de la faon suivante :
publ i c voi d f er mer ( ) {
t r y {
i f ( mode == ' R' | | mode == ' L' ) f Ro. cl ose( ) ;
el se i f ( mode == ' W' | | mode == ' E' ) f Wo. cl ose( ) ;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur a l a f er met ur e " ) ;
}
}
publ i c voi d ecr i r e( Cl asse t mp) {
t r y {
i f ( t mp ! = nul l ) f Wo. wr i t eObj ect ( t mp) ;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur en cour s d' ecr i t ur e " ) ;
}
}
b. L'entte de la fonction mai n( ) dfinie dans la classe Gest i onCl asse s'crit nouveau comme
suit :
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument )
Chapitre 11 : Dessiner des objets
Exercice 11-1 : Comprendre les techniques d'affichage graphique
Corrig :
a. Il s'agit de la classe Dessi n, qui affiche de nouveaux sapins chaque clic sur le bouton nouveau.
b. La nouvelle classe Dessi n
i mpor t j ava. awt . *;
publ i c cl ass Dessi n ext ends Canvas {
pr i vat e Col or coul eur = Col or . gr een;
publ i c f i nal st at i c Col or coul eur Fond = Col or . whi t e;
pr i vat e Ar br e A;
publ i c Dessi n( ) {
set Backgr ound( coul eur Fond) ;
61
________________________
Exercice 11-2 : Comprendre les techniques d'affichage graphique

set For egr ound( coul eur ) ;
set Cur sor ( new Cur sor ( Cur sor . CROSSHAI R_CURSOR) ) ;
A = new Ar br e( 8) ;
}
publ i c voi d pai nt ( Gr aphi cs g) {
A. dessi ne( g) ;
}
publ i c voi d nouveau ( ) {
A = new Arbre((int ) (10*Math.random()+3));
r epai nt ( ) ;
}
}
Exercice 11-2 : Comprendre les techniques d'affichage graphique
Corrig :
a. et c. Afficher un sapin sans aucune dcoration :
i mpor t j ava. awt . *;
cl ass Ar br e {
i nt [ ] [ ] sapi n ;
publ i c Ar br e( i nt nl ) {
i nt nc = 2*nl - 1;
sapi n = new i nt [ nl ] [ nc] ;
i nt mi l i eu = sapi n[ 0] . l engt h/ 2;
f or ( i nt j = 0 ; j < nl ; j ++) {
f or ( i nt i = - j ; i <= j ; i ++) {
sapi n[ j ] [ mi l i eu+i ] = ( i nt ) ( 5*Mat h. r andom( ) +1) ;
}
}
}
publ i c voi d dessi ne( Gr aphi cs g) {
Col or Ver t = Col or . gr een;
f or ( i nt i = 0; i < sapi n. l engt h; i ++) {
f or ( i nt j = 0; j < sapi n[ 0] . l engt h; j ++) {
swi t ch( sapi n[ i ] [ j ] ) {
// a. Affiche un sapin sans dcoration
case 1 : Vert = Color.green;
new Triangle(i, j, g, Vert);
br eak;
case 2 : Ver t = Ver t . br i ght er ( ) ;
new Tr i angl e( i , j , g, Ver t ) ;
br eak;
case 3 : Ver t = Ver t . dar ker ( ) ;
62
_____________
Exercice 11-3 : Apprendre grer les vnements (placer une case cocher)

new Tr i angl e( i , j , g, Ver t ) ;
br eak;
case 4 : Ver t = Ver t . br i ght er ( ) ;
new Tr i angl e( i , j , g, Ver t ) ;
br eak;
case 5 : Ver t = Ver t . dar ker ( ) ;
new Tr i angl e( i , j , g, Ver t ) ;
br eak;
case 6 : Ver t = Ver t . br i ght er ( ) ;
new Tr i angl e( i , j , g, Ver t ) ;
br eak;
}
}
}
// c. Affiche la nouvelle dcoration
for (int i = 0; i < sapin.length; i++)
for (int j = 0; j < sapin[0].length; j++) {
if (sapin[i][j] == 1) new Boule(i, j, g);
}
}
}
b. et d. La classe Boul e
i mpor t j ava. awt . *;
publ i c cl ass Boul e {
pr i vat e i nt cent r eX = Fenet r e. LG/ 2- 50;
pr i vat e i nt cent r eY = Fenet r e. HT/ 2- 50;
private Color [] couleur = {Color.red, Color.blue, Color.yellow,
Color.cyan, Color.magenta};
publ i c Boul e( i nt col , i nt l i g, Gr aphi cs g) {
// d. Choisi une couleur au hasard dans le tableau couleur[]
g.setColor(couleur[(int) (5*Math.random())]);
// b. Affiche un cercle rempli
g.fillOval(5 * lig + centreX, 15 * col - 3 + centreY , 10, 10);
}
}
Exercice 11-3 : Apprendre grer les vnements (placer une case cocher)
Corrig :
i mpor t j ava. awt . *;
i mpor t j ava. awt . event . *;
publ i c cl ass DesBout ons ext ends Panel {
publ i c DesBout ons( Dessi n d) {
63
_______
Exercice 11-4 : Apprendre grer les vnements (Associer lvnement laction)

set Backgr ound( Col or . l i ght Gr ay) ;
// a. Dfinit une case cocher
Checkbox CaseCoche = new Checkbox("Taille Fixe");
// b. Ajoute l'couteur d'vnement
CaseCoche.addItemListener(new GestionAction(0, d));
// a. Ajoute la case cocher au Panel
this.add(CaseCoche);
But t on bPei ndr e = new But t on ( " Nouveau" ) ;
bPei ndr e. addAct i onLi st ener ( new Gest i onAct i on( 1, d) ) ;
t hi s. add( bPei ndr e) ;
But t on bQui t t er = new But t on ( " Qui t t er " ) ;
bQui t t er . addAct i onLi st ener ( new Gest i onAct i on( 2, d) ) ;
t hi s. add( bQui t t er ) ;
}
}
Exercice 11-4 : Apprendre grer les vnements (Associer lvnement laction)
Corrig :
i mpor t j ava. awt . *;
i mpor t j ava. awt . event . *;
// a. La classe GestionAction implemente les 2 interfaces
publ i c cl ass Gest i onAct i on i mpl ement s ActionListener, ItemListener {
pr i vat e i nt n;
pr i vat e Dessi n d;
// b. Pour tre visible du bouton bNouveau, tout en tant modifi par la case
// cocher CaseCoche, la variable OK doit tre commune aux deux objets.
// Elle doit donc tre dclare en static.
private static boolean OK = true;
publ i c Gest i onAct i on( i nt n, Dessi n d) {
t hi s. n = n;
t hi s. d = d;
}
publ i c voi d act i onPer f or med( Act i onEvent e) {
swi t ch ( n) {
case 2 : Syst em. exi t ( 0) ;
br eak;
// c. La valeur de OK est transmise a l'objet d de type Dessin
// voir la classe Dessin ci-dessous
case 1 : d. nouveau( OK) ;
br eak;
}
}
publ i c voi d i t emSt at eChanged( I t emEvent e) {
64
________________________________________
Exercice 11-5 : Apprendre grer les vnements

i f ( e. get St at eChange( ) == I t emEvent . SELECTED) OK = f al se;
el se OK = t r ue;
}
}
c. La classe Dessi n prend en compte la valeur du boolen OK :
i mpor t j ava. awt . *;
publ i c cl ass Dessi n ext ends Canvas {
pr i vat e Col or coul eur = Col or . gr een;
publ i c f i nal st at i c Col or coul eur Fond = Col or . whi t e;
pr i vat e Ar br e A;
publ i c Dessi n( ) {
set Backgr ound( coul eur Fond) ;
set For egr ound( coul eur ) ;
set Cur sor ( new Cur sor ( Cur sor . CROSSHAI R_CURSOR) ) ;
A = new Ar br e( 8) ;
}
publ i c voi d pai nt ( Gr aphi cs g) {
A. dessi ne( g) ;
}
public void nouveau (boolean OK) {
if (OK) A = new Arbre((int ) (10*Math.random()+3));
else A = new Arbre(8);
r epai nt ( ) ;
}
}
Exercice 11-5 : Apprendre grer les vnements
Corrig :
11-5-a :
Les classes modifier sont les classes Dessi ner DesFor mes, DesBout ons, Dessi nFor mes,
Gest i onAct i on.
La classe Dessi ner DesFor mes est lapplication qui lance la fentre daffichage o sont
dessines les formes gomtriques. Lapplication lit les coordonnes des formes partir du fichier
For mes. t xt .
Dans la classe DesBout ons sont dfinis les deux boutons A gauche / scene et A gauche /
formes .
Dans la classe Dessi nFor mes sont dfinies les mthodes daffichage des formes, les diffrents
modes de dplacement des formes.
Lassociation entre le clic sur le bouton et laction raliser est dcrite dans la classe
Gest i onAct i on.


65
________________________________________
Exercice 11-5 : Apprendre grer les vnements

11-5-b :
La mthode dessi ner LesFor mes( ) cre une fentre Swing dans laquelle sont placs deux
composants. Un composant contenant les formes gomtriques (f . get Cont ent Pane( new
Dessi nFor mes( ) , " Cent er " ) plac au centre de la fentre et un composant contenant les
boutons (f . get Cont ent Pane( new DesBout on( ) , " Sout h" ), plac dans le bas de la fentre.
Lappel au constructeur new DesBout on( ) lintrieur de la mthode get Cont ent Pane( )
permet de crer les deux boutons.
11-5-c :
Lassociation entre laction et le clic sur lun des deux boutons est ralise grce la mise en place des
couteurs dvnements (appel la mthode addAct i onLi st ener ( ) ). Les paramtres du
constructeur Gest i onAct i on( ) sont diffrents pour chaque couteur afin de diffrencier les
comportement des boutons.
11-5-d :
Dans la classe DesBout ons, lcouteur du bouton aGaucheScene est associ avec laction de
paramtre 1 (new Gest i onAct i on( 1, df , j ) ) alors que lcouteur du bouton aGaucheFor me
est associ avec laction de paramtre 2 (new Gest i onAct i on( 2, df , j ) ). Dans la classe
Gest i onAct i on, la mthode act i onPer f or med( ) doit reprendre ces deux valeurs pour dplacer
les objets :
soit sur le bord de la scne,
soit aligner les formes sur celle se situant le plus gauche.
La mthode scrit :
publ i c voi d act i onPer f or med( Act i onEvent e) {
swi t ch ( n) {
case 1 : d. depl acer GaucheScene( ) ;
br eak;
case 2 : d. depl acer GaucheFor mes( ) ;
br eak;
}
}
O n est une variable de classe rcupre grce au constructeur de la classe.
11-5-e : Dans la classe Dessi nFor mes
La mthode dpl acer ( ) dcrite ci-aprs dplace tous les objets sur le point (en x) plac en paramtre.
Pour dplacer les objets sur le bord gauche de la scne, il suffit dappeler la mthode avec 0 pour
paramtre. Dplacer un cercle ou un triangle revient dplacer le point de rfrence de lobjet dfini dans
la classe For me. Pour dplacer un triangle, il nen est pas de mme. Il se peut que le point de rfrence
ne soit pas celui qui se trouve le plus gauche.
11-5-f :
Pour trouver le sommet le plus gauche, il convient dappeler la mthode t r ouver LeXMi n( ) dfinie
dans la classe Tr i angl e. Comme cette mthode nest dfinie que dans la classe Tr i angl e et pas dans
la classe Cer cl e ni dans la classe Rect angl e, nous sommes obligs dutiliser le mcanisme du cast.
publ i c voi d depl acer ( i nt Xr ef ) {
i nt nbFor mes = l i st eFor mes. si ze( ) ;
i f ( nbFor mes > 0) {
f or ( For me t mp : l i st eFor mes)
i f ( t mp i nst anceof Tr i angl e) {
// Pour tre sr de travailler sur un objet de type Triangle
66
________________________________________
Exercice 11-5 : Apprendre grer les vnements

t mp = ( Tr i angl e) t mp;
i nt decal ageEnX = t mp. t r ouver LeXMi n( ) ;
t mp. depl acer ( Xr ef - decal ageEnX, 0) ;
}
el se t mp. depl acer ( Xr ef - t mp. x, 0) ;
}
}
publ i c voi d depl acer GaucheScene( ) {
depl acer ( 0) ;
r epai nt ( ) ;
}
Dans la classe Tr i angl e
publ i c i nt t r ouver LeXMi n( ) {
i nt mi n = super . t r ouver LeXMi n( ) ;
f or ( i nt i =1; i < xPoi nt s. l engt h; i ++) {
i f ( xPoi nt s[ i ] < mi n) mi n = xPoi nt s[ i ] ;
}
r et ur n mi n;
}
Dans la classe For me
publ i c i nt t r ouver LeXMi n( ) {
r et ur n 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 coordonne en x. La mthode t r ouver LeXMi n( ) , place dans la
classe Dessi nFor mes, parcourt lensemble des formes et recherche la plus petite valeur en x. Un
traitement spcifique est ralis pour le triangle afin de trouver le sommet le plus gauche.
publ i c i nt t r ouver LeXMi n( ) {
i nt nbFor mes = l i st eFor mes. si ze( ) ;
i nt mi n = For me. l ar geur Ecr an ;
i f ( nbFor mes > 0) {
f or ( For me t mp : l i st eFor mes) {
i f ( t mp. x < mi n) mi n = t mp. x;
i f ( t mp i nst anceof Tr i angl e) {
t mp = ( Tr i angl e) t mp;
i nt mi nT = t mp. t r ouver LeXMi n( ) ;
i f ( mi nT < mi n) mi n = mi nT;
}
}
}
r et ur n mi n;
67
_____________________________________________
Exercice 12-1 :Ecrire le traducteur ct client

}
Les formes sont ensuites dplaces en appelant la mthode depl acer ( ) de la classe Dessi nFor mes
avec pour paramtre la valeur correspondant la plus petite valeur trouve.
publ i c voi d depl acer GaucheFor mes( ) {
i nt Xmi n = t r ouver LeXMi n( ) ;
depl acer ( Xmi n) ;
r epai nt ( ) ;
}
Chapitre 12 : J ava et Internet
Exercice 12-1 :Ecrire le traducteur ct client
Corrig :
publ i c cl ass Tr aduct i on {
publ i c st at i c voi d mai n( St r i ng [ ] ar g) {
St r i ng phr ase = " " ;
Syst em. out . pr i nt ( " Ent r ez une phr ase : " ) ;
phr ase = Li r e. S( ) ;
// La mthode replace() permet de remplacer un caractre par un autre
phr ase = phr ase. r epl ace( ' a' , ' *' ) ;
phr ase = phr ase. r epl ace( ' o' , ' ! ' ) ;
phr ase = phr ase. r epl ace( ' e' , ' %' ) ;
Syst em. out . pr i nt l n( " Reponse : " + phr ase) ;
}
} / / Fi n de Tr aduct i on
Exercice 12-2 :Ecrire le traducteur sous la forme d'une servlet (mthode GET)
Corrig :
i mpor t j ava. i o. *;
i mpor t j avax. ser vl et . *;
i mpor t j avax. ser vl et . ht t p. *;
publ i c cl ass Tr adui r e extends HttpServlet {
// Traiter la requte avec doGet()
publ i c voi d doGet( Ht t pSer vl et Request r eq, Ht t pSer vl et Response r ep)
t hr ows I OExcept i on, Ser vl et Except i on {
// initialisation du type de la rponse
rep.setContentType("text/html");
// Ouverture du flux de la rponse HTTP
Pr i nt Wr i t er pw = rep.getWriter();
// Envoyer le code HTML sur le flux HTTP
pw.println( " <ht ml >" ) ;
pw. pr i nt l n( " <head>" ) ;
pw. pr i nt l n( " <t i t l e> Une ser vl et pour t r adui r e </ t i t l e>" ) ;
68
______________
Exercice 12-3 :Ecrire le traducteur sous la forme d'une servlet (mthode POST)

pw. pr i nt l n( " </ head>" ) ;
pw. pr i nt l n( " <body bgcol or =' whi t e' >" ) ;
// vrifier si une phrase est transmise avec la requte
if (req.getParameter("phrase") == null) {
pw. pr i nt ( " <f ont si ze=+1> " ) ;
pw. pr i nt l n( " J e n' ai pas de phr ase t r adui r e! </ f ont >" ) ;
}
else {
// traiter la phrase fournie en paramtre
St r i ng phr ase = req.getParameter("phrase");
phr ase = phr ase. r epl ace( ' a' , ' *' ) ;
phr ase = phr ase. r epl ace( ' o' , ' ! ' ) ;
phr ase = phr ase. r epl ace( ' e' , ' %' ) ;
pw. pr i nt l n( " J ' ai compr i s : " + phr ase) ;
}
pw. pr i nt l n( " </ body>" ) ;
pw. pr i nt l n( " </ ht ml >" ) ;
}
}
Exercice 12-3 :Ecrire le traducteur sous la forme d'une servlet (mthode POST)
Corrig :
i mpor t j ava. i o. *;
i mpor t j avax. ser vl et . *;
i mpor t j avax. ser vl et . ht t p. *;
publ i c cl ass Tr adui r e ext ends Ht t pSer vl et {
// traiter la requte avec doPost()
publ i c voi d doPost( Ht t pSer vl et Request r eq, Ht t pSer vl et Response r ep)
t hr ows I OExcept i on, Ser vl et Except i on {
// initialisation du type de la rponse
rep.setContentType("text/html");
// ouverture du flux de la rponse HTTP
PrintWriter pw = rep.getWriter();
// envoyer le code HTML sur le flux HTTP
pw.println( " <ht ml >" ) ;
pw. pr i nt l n( " <head>" ) ;
pw. pr i nt l n( " <t i t l e> Une ser vl et pour t r adui r e </ t i t l e>" ) ;
pw. pr i nt l n( " </ head>" ) ;
pw. pr i nt l n( " <body bgcol or =' whi t e' >" ) ;
// vrifier si une phrase est transmise avec la requte
i f ( r eq. get Par amet er ( " phr ase" ) == nul l ) {
pw. pr i nt ( " <f ont si ze=+1> " ) ;
pw. pr i nt l n( " J e n' ai pas de phr ase t r adui r e! </ f ont >" ) ;
69
__________________________________
Exercice 12-4 :Ecrire le traducteur sous la forme d'un J SP

}
el se {
// traiter la phrase fournie en paramtre
St r i ng phr ase = r eq. get Par amet er ( " phr ase" ) ;
phr ase = phr ase. r epl ace( ' a' , ' *' ) ;
phr ase = phr ase. r epl ace( ' o' , ' ! ' ) ;
phr ase = phr ase. r epl ace( ' e' , ' %' ) ;
pw. pr i nt l n( " J ' ai compr i s : " + phr ase) ;
}
pw. pr i nt l n( " </ body>" ) ;
pw. pr i nt l n( " </ ht ml >" ) ;
}
}
Exercice 12-4 :Ecrire le traducteur sous la forme d'un JSP
Corrig :
<ht ml >
<head>
<t i t l e>Un J SP pour t r adui r e une phr ase </ t i t l e>
</ head>
<body>
<%-- debut de scriptlet --%>
<%
<%-- rechercher le paramtre "phrase" transmis avec la requte --%>
St r i ng p = r equest . get Par amet er ( " phr ase" ) ;
i f ( p ! = nul l ) {
<%-- si p ne vaut pas null, un paramtre est transmis, le traiter--%>
p = p. r epl ace( ' a' , ' *' ) ;
p = p. r epl ace( ' o' , ' ! ' ) ;
p = p. r epl ace( ' e' , ' %' ) ;
%>
<%-- fin du if, affichage l'aide de balises HTML--%>
<%-- affichage du contenu de p--%>
<P> J ' ai compr i s : <%=p%> </ P>
<%-- dbut du else--%>
<%
<%-- si il n'y a pas de paramtre transmis, p vaut null--%>
} el se {
%>
<%-- affichage l'aide de balises HTML--%>
<P> Er r eur : Vous avez oubl i l a phr ase t r adui r e <BR>
Exempl e : ht t p: / / l ocal host : 8080/ j sp/ Tr adui r e. j sp?phr ase=" pet i t a pet i t l ' oi seau "
</ P>
70
__________________________________________________
Exercice 12-5 :Ecrire le javaBean Phrase

<%-- fin du else, fin de la scriptlet--%>
<%
}
%>
</ body>
</ ht ml >
Exercice 12-5 :Ecrire le javaBean Phrase
Corrig :
// Un Java bean doit tre srialisable pour tre envoy sur un flux
import java.io.Serializable;
publ i c cl ass Phr ase implements java.io.Serializable {
// Dfinition de la proprit de JavaBean
pr i vat e St r i ng phr ase ;
// Dfinition de la mthode d'accs la proprit, en modification
// Cette mthode remplace les caractres de la proprit de l'objet
publ i c voi d set Phr ase( St r i ng p) {
phr ase = p;
phr ase = phr ase. r epl ace( ' a' , ' *' ) ;
phr ase = phr ase. r epl ace( ' o' , ' ! ' ) ;
phr ase = phr ase. r epl ace( ' e' , ' %' ) ;
}
// Dfinition de la mthode d'accs la proprit, en consultation
publ i c St r i ng get Phr ase( ) {
r et ur n phr ase;
}
} / / Fi n de Phr ase

Exercice 12-6 :Ecrire le JSP qui appelle le JavaBean Phrase
Corrig :
<ht ml >
<head>
<t i t l e>Un J ava Bean pour t r adui r e une phr ase</ t i t l e>
</ head>
<body>
<%-- Utiliser Phrase.class, comme JavaBean avec comme nom d'objet "P"--%>
<j sp: useBean i d=" P" cl ass=" Phr ase" / >
<%-- placer dans la proprit "phrase" de l'objet "P", --%>
<%-- la valeur du paramtre transmis avec la requte--%>
<j sp: set Pr oper t y name=" P" pr oper t y=" phr ase" par am=" par am" / >
<%-- rcuprer la valeur de la proprit de l'objet "P"--%>
<BR>J ' ai compr i s : <j sp: get Pr oper t y name=" P" pr oper t y=" phr ase" / >
71
__________________________________________________
Exercice 12-7 : Une bibliothque en J SP

</ body>
</ ht ml >
Exercice 12-7 : Une bibliothque en JSP
Corrig :
12-7-a :
La classe Li vr e est un composant J avaBean car il est constitu de proprits dfinies en mode priv et
de mthode dacces en criture (set xxx( ) ) et en lecture (get xxx( ) ) o xxx correspond au nom de la
proprit dont la premire lettre est une majuscule. La classe Li vr e contient galement une mthode
mtier (invisible) permetteant le calcul du code dun livre (set Code( ) ).
12-7-b :
Le fichier Li vr e. j sp dcrit le formulaire de saisie des informations ncessaires pour enregistrer un
livre. Lorsque lutilisateur valide le formulaire, les informations saisies sont transmises au script
val i deLi vr e. j sp, sous la forme de paramtres prcds dun point dinterrogation en fin de lURL.
12-7-c :
< !-- Dfinition de lobjet livre partir du composant librairieDeBean.Livre -- >
<j sp: useBean i d=" l i vr e" cl ass=" l i br ai r i eDeBean. Li vr e" / >

<!-- Initialise la proprit titre avec la valeur passe en paramtre -->
<j sp: set Pr oper t y name=" l i vr e" pr oper t y=" t i t r e" / >
<!-- Initialise la proprit categorie avec la valeur passe en paramtre -->
<j sp: set Pr oper t y name=" l i vr e" pr oper t y=" cat egor i e" / >
<!-- Initialise la proprit isbn avec la valeur passe en paramtre -->
<j sp: set Pr oper t y name=" l i vr e" pr oper t y=" i sbn" par am=" numer o" / >
<!-- Initialise la proprit nomAuteur avec la valeur passe en paramtre -->
<j sp: set Pr oper t y name=" l i vr e" pr oper t y=" nomAut eur " par am=" nom" / >
<!-- Initialise la proprit prenomAuteur avec la valeur passe en paramtre -->
<j sp: set Pr oper t y name=" l i vr e" pr oper t y=" pr enomAut eur " par am=" pr enom" / >
<ht ml >
<body>
<h1><f ont f ace=ar i al >Val i dat i on d' un l i vr e</ h1>
<hr >
<h3><f ont f ace=ar i al >Le l i vr e. . . </ h3>
<t abl e>
<t r >
<t d><f ont f ace=ar i al si ze=2>Ti t r e : </ t d>
<t d><f ont f ace=ar i al si ze=2 col or =gr een>
<!-- Rcupre la valeur stocke dans la proprit titre et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" t i t r e" / >
</ t d>
</ t r >
<t r >
<t d><f ont f ace=ar i al si ze=2>Cat gor i e : </ t d>
72
___________________________________________________
Exercice 12-7 : Une bibliothque en J SP

<t d><f ont f ace=ar i al si ze=2 col or =gr een>
<!--Rcupre la valeur stocke dans la proprit categorie et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" cat egor i e" / >
</ t d>
</ t r >
<t r >
<t d><f ont f ace=ar i al si ze=2>Le numer o I SBN : </ t d>
<t d><f ont f ace=ar i al si ze=2 col or =gr een>
<!--Rcupre la valeur stocke dans la proprit isbn et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" i sbn" / >
</ t d>
</ t r >
<t r >
<t d><f ont f ace=ar i al si ze=2 col or =r ed>Le code d' enr egi st r ement : </ t d>
<t d><f ont f ace=ar i al si ze=2 col or =r ed>
<!--Rcupre la valeur stocke dans la proprit code et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" code" / >
</ t d>
</ t r >
</ t abl e>
<h3><f ont f ace=ar i al >L' aut eur . . . </ h3>
<t abl e>
<t r >
<t d><f ont f ace=ar i al si ze=2>Nom: </ t d>
<t d><f ont f ace=ar i al si ze=2 col or =gr een>
<!--Rcupre la valeur stocke dans la proprit nomAuteur et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" nomAut eur " / >
</ t d>
</ t r >
<t r >
<t d><f ont f ace=ar i al si ze=2>Pr nom: </ t d>
<t d><f ont f ace=ar i al si ze=2 col or =gr een>
<!--Rcupre la valeur stocke dans la proprit prenomAuteur et laffiche -->
<j sp: get Pr oper t y name=" l i vr e" pr oper t y=" pr enomAut eur " / >
</ t d>
</ t r >
</ t abl e>
</ body>
</ ht ml >
73
______________________________________
Dterminer les variables ncessaires au programme

Le projet : Gestion d'un compte bancaire
Chapitre 1 : Stocker une information
Dterminer les variables ncessaires au programme
Corrig
Compte tenu des informations fournies en nonc, les variables utilises pour le projet peuvent tre
dclares de la faon suivante :
publ i c cl ass Pr oj et Ch1 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x;
char t ypeCpt e =' \ 0' ;
doubl e val _cour ant e = 0. 0, t aux = 0. 0;
l ong numr oCpt e = 0, numr oLu = 0 ;
}
}
Chapitre 2 : Communiquer une information
Afficher le menu principal ainsi que ses options
Corrig
Les instructions d'affichage et de saisie des donnes s'crivent :
publ i c cl ass Pr oj et Ch2 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x;
char t ypeCpt e =' \ 0' ;
doubl e val _cour ant e = 0. 0, t aux = 0. 0;
l ong numr oCpt e = 0, numr oLu = 0 ;
// Afficher le menu principal
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
//Option 1 : Crer un compte
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t ypeCpt e = Li r e. c( ) ;
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numr oCpt e = Li r e. l ( ) ;
74
______________________________________________
Accder un menu suivant loption choisie

Syst em. out . pr i nt ( " Pr emi er e val eur cr edi t ee : " ) ;
val _cour ant e = Li r e. d( ) ;
// Si compte pargne
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
// Option 2 : Afficher un compte
// Demande l'utilisateur de saisir le numro du compte afficher
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. l ( ) ;
// Si le numro du compte existe,
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e + " est un compt e " ) ;
// affiche son taux dans le cas d'un compte pargne.
Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + t aux) ;
Syst em. out . pr i nt l n( " Pr emi er e val eur cr edi t ee : " + val _cour ant e) ;
// Sinon, il affiche un message indiquant que le numro du compte n'est pas valide.
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
//Option 3 : le programme affiche "option non programme"
Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
//Option 4, le programme termine son excution
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
// System.exit(0) ;
// Option 5
// le programme affiche une ligne d'explication pour chaque option du menu
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ; }
}
Chapitre 3 : Faire des choix
Accder un menu suivant loption choisie
Corrig
a. Sachant que les options du menu ont toute une probabilit voisine d'tre choisies, la structure de test
la plus approprie est le swi t ch.
b. Le programme s'crit comme suit :
publ i c cl ass Pr oj et Ch3 {
75
______________________________________________
Accder un menu suivant loption choisie

publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x;
char t ypeCpt e =' \ 0' ;
doubl e val _cour ant e = 0. 0, t aux = 0. 0;
l ong numr oCpt e = 0, numr oLu = 0 ;
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
// Suivant loption choisie
switch (choix) {
// Si loption vaut 1
case 1 :
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t ypeCpt e = Li r e. c( ) ;
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numr oCpt e = Li r e. l ( ) ;
Syst em. out . pr i nt ( " Pr emi er e val eur cr edi t ee : " ) ;
val _cour ant e = Li r e. d( ) ;
// c. Si le type est un compte epargne, le programme demande automatiquement le taux
i f ( t ypeCpt e == ' E' ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
break;
// Si loption vaut 2
case 2 :
// demande l'utilisateur de saisir le numro du compte afficher
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. l ( ) ;
// vrifie que le numro du compte existe,
i f ( numr oLu == numr oCpt e) {
//d. Si oui, affiche le numro du compte, le type, la valeur initiale
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e + " est un compt e " ) ;
i f ( t ypeCpt e == ' C' ) Syst em. out . pr i nt l n( " cour ant " ) ;
el se i f ( t ypeCpt e == ' J ' ) Syst em. out . pr i nt l n( " j oi nt " ) ;
el se i f ( t ypeCpt e == ' E' ) {
76
________________________________________________________________
Rendre le menu interactif

// c. affiche son taux dans le cas d'un compte pargne.
Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + t aux) ;
}
Syst em. out . pr i nt l n( " Pr emi er e val eur cr edi t ee : " + val _cour ant e) ;
}
el se {
//d. Sinon, affiche un message indiquant que le numro du compte est non valide.
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
}
break;
// Si loption vaut 3
case 3 :
Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
break;
// Si loption vaut 4
case 4 :
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
break;
// Si loption vaut 5
case 5 :
// le programme affiche une ligne d'explication pour chaque option.
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ;
}
}
}
Chapitre 4 : Faire des rptitions
Rendre le menu interactif
Corrig
a. Tant que l'utilisateur ne choisit pas l'option Sor t i r , rpter l'affichage du menu et la structure
swi t ch.
77
________________________________________________________________
Rendre le menu interactif

b. La boucle dowhi l e, est la structure la plus approprie puisqu'elle permet d'entrer et d'excuter au
moins une fois la boucle avant la saisie du choix de l'utilisateur. La boucle s'crit :
do {
/ / pr ogr amme
choi x = Li r e. b( ) ;
whi l e ( choi x ! = 4) ;
La valeur 4 tant celle associe l'option Sor t i r .
c. La traduction en J ava, de cette marche suivre s'crit :
publ i c cl ass Pr oj et Ch4 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x;
char t ypeCpt e =' \ 0' ;
doubl e val _cour ant e = 0. 0, t aux = 0. 0;
l ong numr oCpt e = 0, numr oLu = 0 ;
do {
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
choi x = Li r e. b( ) ;
swi t ch ( choi x) {
case 1 :
// Tant que le caractre saisi n'est pas C, E ou J, le programme demande
// nouveau la saisie. Le type ainsi saisi correspond aux types proposs.
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t ypeCpt e = Li r e. c( ) ;
} while ( typeCpte != 'C' && typeCpte != 'J' && typeCpte != 'E');
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numr oCpt e = Li r e. l ( ) ;
Syst em. out . pr i nt ( " Pr emi er e val eur cr edi t ee : " ) ;
val _cour ant e = Li r e. d( ) ;
i f ( t ypeCpt e == ' E' ) {
Syst em. out . pr i nt l n( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
br eak;
case 2 :
78
________________________________________________________________
Rendre le menu interactif

Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. l ( ) ;
i f ( numr oLu == numr oCpt e) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e + " est un compt e " ) ;
i f ( t ypeCpt e == ' C' ) Syst em. out . pr i nt l n( " cour ant " ) ;
el se i f ( t ypeCpt e == ' J ' ) Syst em. out . pr i nt l n( " j oi nt " ) ;
el se i f ( t ypeCpt e == ' E' )
Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + t aux) ;
Syst em. out . pr i nt l n( " Val eur i ni t i al e : " + val _cour ant e) ;
}
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
case 3 :
Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
br eak;
case 4 :
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
br eak;
case 5 :
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ;
br eak;
def aul t :
Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} while (choix != 4);
}
}
79
__________________________
Dfinir une fonction (Les fonctions sans paramtre avec rsultat)

Chapitre 5 : De l'algorithme paramtr l'criture de fonctions
Dfinir une fonction(Les fonctions sans paramtre avec rsultat)
Corrig :
a. L'entte de la fonction menuPr i nci pal ( ) s'crit :
publ i c st at i c byte menuPr i nci pal ( )
En effet, aucun paramtre n'est ncessaire la bonne marche de la fonction. Les deux parenthses, sans
aucune variable l'intrieur, suffisent. Par contre la fonction communique le choix de l'utilisateur la
fonction mai n( ) . Cette valeur tant de type byt e, la fonction est dfinie galement de type byt e.
b. Le corps de la fonction reprend les instructions d'affichage utilises dans le programme dvelopp
au cours des chapitres prcdents.
byt e t mp;
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt l n( " Vot r e choi x : " ) ;
t mp = Li r e. b( ) ;
La variable choi x est remplace volontairement par la variable t mp, pour bien les diffrencier. Une
variable choi x dclare la fois dans la fonction mai n( ) et dans la fonction menuPr i nci pal ( )
utilisent deux cases mmoires distinctes ! Elles ne reprsentent pas la mme variable.
c. Pour communiquer la valeur correspondant au choix de l'utilisateur, la variable t mp est place dans
une instruction r et ur n, comme suit :
return tmp;
Dfinir une fonction(Les fonctions sans paramtre ni rsultat)
Corrig
a. La fonction sor t i r ( ) ne fournit pas de rsultat, elle est donc dclare de type voi d. L'entte
s'crit :
publ i c st at i c void sor t i r ( )
b. Le corps de la fonction sor t i r ( ) reprend les instructions de sortie de programme utilises dans le
programme dvelopp au cours des chapitres prcdents.
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
c. Tout comme la fonction sor t i r ( ) , la fonction al Ai de( ) ne fournit pas de rsultat, l'entte
s'crit :
publ i c st at i c void al Ai de( )
d. Le corps de la fonction al Ai de( ) reprend les instructions d'affichage utilises dans le programme
dvelopp au cours des chapitres prcdents.
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
80
____________________________________________________________________
Appeler une fonction

Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ;
Appeler une fonction
Corrig
La fonction mai n( ) fait appel aux fonctions al Ai de( ) , sor t i r ( ) et menuPr i nci pal ( ) , de la
faon suivante :
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x;
char t ypeCpt e =' \ 0' ;
doubl e val _cour ant e = 0. 0, t aux = 0. 0;
l ong numr oCpt e = 0, numr oLu = 0 ;
do {
choix = menuPrincipal();
swi t ch ( choi x) {
case 1 :
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t ypeCpt e = Li r e. c( ) ;
} whi l e ( t ypeCpt e ! = ' C' && t ypeCpt e ! = ' J ' && t ypeCpt e ! = ' E' ) ;
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numr oCpt e = Li r e. l ( ) ;
Syst em. out . pr i nt ( " Pr emi er e val eur cr edi t ee : " ) ;
val _cour ant e = Li r e. d( ) ;
i f ( t ypeCpt e == ' E' ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
br eak;
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. l ( ) ;
i f ( numr oLu == numr oCpt e) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e + " est un compt e " ) ;
i f ( t ypeCpt e == ' C' ) Syst em. out . pr i nt l n( " cour ant " ) ;
el se i f ( t ypeCpt e == ' J ' ) Syst em. out . pr i nt l n( " j oi nt " ) ;
el se i f ( t ypeCpt e == ' E' )
81
_______________________________
Comprendre la visibilit des variables (Les variables locales)

Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + t aux) ;
Syst em. out . pr i nt l n( " Val eur i ni t i al e : " + val _cour ant e) ;
}
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
case 3 : Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
br eak;
case 4 : sortir();
br eak;
case 5 : alAide();
br eak;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 4) ;
}
Chapitre 6 : Fonctions, notions avances
Comprendre la visibilit des variables (Les variables locales)
Corrig
Aucune valeur n'est affiche par ce programme, le compilateur dtectant des erreurs du type :
Pr oj et Ch6. j ava: 86: Var i abl e numr oCpt e may not have been i ni t i al i zed.
Pr oj et Ch6. j ava: 87: Var i abl e t ypeCpt e may not have been i ni t i al i zed.
Pr oj et Ch6. j ava: 92: Var i abl e t aux may not have been i ni t i al i zed.
Pr oj et Ch6. j ava: 94: Var i abl e val _cour ant e may not have been
i ni t i al i zed.
En effet, les variables numr oCpt e, t ypeCpt e, t aux et val _cour ant e sont dclares l'intrieur
de la fonction af f i cher Cpt e( ) . Ce sont donc des variables locales. Les valeurs tant saisies dans la
fonction cr er Cpt e( ) , aucune valeur n'est place dans les cases mmoire respectives de la fonction
af f i cher Cpt e( ) . L'interprteur ne peut pas raliser d'affichage.
Comprendre la visibilit des variables (Les variables de classe)
Corrig
publ i c cl ass Pr oj et Ch6 { // Variables de classe
// a. Les variables caractrisant un compte sont dclares comme variables de classe
static byte choix;
static char typeCpte ='\0';
static double val_courante = 0.0, taux = 0.0;
static long numroCpte = 0, numroLu = 0 ;
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
// b. Aucune variable n'est dclare localement cette fonction
do {
82
_____________________________
Comprendre la visibilit des variables (Les variables de classe)

choi x = menuPr i nci pal ( ) ;
swi t ch ( choi x) {
case 1 :
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
typeCpte = Li r e. c( ) ;
} whi l e ( typeCpte ! = ' C' && typeCpte ! = ' J ' && typeCpte ! = ' E' ) ;
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numroCpte = Li r e. l ( ) ;
Syst em. out . pr i nt ( " Pr emi er e val eur cr edi t ee : " ) ;
val_courante = Li r e. d( ) ;
i f ( typeCpte == ' E' ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
taux = Li r e. d( ) ;
}
br eak;
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. l ( ) ;
i f ( numr oLu == numr oCpt e) af f i cher Cpt e( ) ;
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
case 3 : Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
br eak;
case 4 : sor t i r ( ) ;
br eak;
case 5 : al Ai de( ) ;
br eak;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 4) ;
}

// Affiche le compte
publ i c st at i c voi d af f i cher Cpt e( ) {
// b. Aucune variable n'est dclare localement cette fonction
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e + " est un compt e " ) ;
i f ( t ypeCpt e == ' C' ) Syst em. out . pr i nt l n( " cour ant " ) ;
el se i f ( t ypeCpt e == ' J ' ) Syst em. out . pr i nt l n( " j oi nt " ) ;
el se i f ( t ypeCpt e == ' E' )
83
______________
Comprendre la visibilit des variables (Le passage de paramtres par valeur)

Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + t aux) ;
Syst em. out . pr i nt l n( " Pr emi er e val eur cr edi t ee : " + val _cour ant e) ;
}
// Affiche le menu principal, retourne la valeur de l'option choisie
publ i c st at i c byt e menuPr i nci pal ( ) {
byt e t mp;
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt l n( " Vot r e choi x : " ) ;
t mp = Li r e. b( ) ;
r et ur n t mp;
}
publ i c st at i c voi d sor t i r ( ) {
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
}
publ i c st at i c voi d al Ai de( ) {
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ;
}
}
Comprendre la visibilit des variables (Le passage de paramtres par valeur)
Corrig
a. L'entte de la fonction utilise quatre paramtres correspondant aux caractristiques du compte
transmettre la fonction. Elle s'crit :
publ i c st at i c voi d af f i cher Cpt e( l ong num, char type, doubl e taux, doubl e val) {
b. Le corps de la fonction af f i cher Cpt e( ) reprend les instructions utilises dans le programme
dvelopp au cours des chapitre prcdents, en prenant soin de remplacer les noms de variables par ceux
dfinis en paramtre, dans l'entte de la fonction.
Syst em. out . pr i nt ( " Le compt e n : " + num + " est un compt e " ) ;
84
___________________________________________________________
Les limites du retour de rsultat

i f ( type == ' C' ) Syst em. out . pr i nt l n( " cour ant " ) ;
el se i f ( type == ' J ' ) Syst em. out . pr i nt l n( " j oi nt " ) ;
el se i f ( type == ' E' )
Syst em. out . pr i nt l n( " epar gne dont l e t aux est " + taux) ;
Syst em. out . pr i nt l n( " Pr emi er e val eur cr edi t ee : " + val) ;
}
Les limites du retour de rsultat
Corrig
a. Pour crer un compte, les valeurs saisies par l'utilisateur sont au nombre de quatre (le type, le
numro, le taux et la valeur courante). La fonction cr er Cpt e( ) doit donc retourner ces quatre
valeurs la fonction mai n( ) .
b. Les quatre valeurs sont chacune de type diffrent (l ong, doubl e ou char ). Il n'est donc pas
possible de dterminer le type de la fonction cr er Cpt e( ) . De plus, l'instruction r et ur n ne
peut retourner qu'une seule et unique variable. Il n'est donc pas possible de transmettre le contenu
des quatre variables la fonction mai n( ) .
Chapitre 7 : Les classes et les objets
Traiter les chanes de caractres
Corrig
a. et b. Compte tenu des changements de type des variables t ypeCpt e et numr oCpt e, la saisie des
valeurs s'crit de la faon suivante :
public String typeCpte ;
publ i c doubl e t aux ;
publ i c St r i ng numr oCpt e ;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t mp = Li r e. c( ) ;
} whi l e ( t mp ! = ' C' && t mp! = ' J ' && t mp ! = ' E' ) ;
swi t ch ( t mp) {
case 'C' : typeCpte = "Courant";
br eak;
case 'J' : typeCpte = "Joint";
br eak;
case 'E' : typeCpte = "Epargne";
br eak;
}
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numroCpte = Lire.S();
i f ( typeCpte.equalsIgnoreCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
85
__________________________________________________________________
Dfinir le type Compte

}
c. Voir corrig de "Construire l'application Pr oj et " ci-aprs.
Dfinir le type Compte
Corrig
a. Les donnes dfinissant tout compte bancaire sont les suivantes :
public String typeCpte ;
public double val_courante, taux ;
public String numroCpte ;
b. La mthode cr er Cpt e( ) est dclare non st at i c, puisqu'elle dcrit le comportement de tout
compte bancaire. Elle permet l'initialisation par saisie au clavier, des donnes caractristiques d'un
compte (variables d'instance). Elle s'crit de la faon suivante :
publ i c voi d cr er Cpt e( ) {
char t mp;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t mp = Li r e. c( ) ;
} whi l e ( t mp ! = ' C' && t mp! = ' J ' && t mp ! = ' E' ) ;
swi t ch ( t mp) {
case ' C' : typeCpte = " Cour ant " ;
br eak;
case ' J ' : typeCpte = " J oi nt " ;
br eak;
case ' E' : typeCpte = " Epar gne" ;
br eak;
}
Syst em. out . pr i nt ( " Numer o du compt e : " ) ;
numroCpte = Li r e. S( ) ;
i f ( typeCpte. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
taux = Li r e. d( ) ;
}
Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
val_courante = Li r e. d( ) ;
}
La mthode af f i cher Cpt e( ) utilise la mme technique, en affichant les donnes caractristiques de
tout compte bancaire.
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt l n( " Le compt e n : " + numroCpte + " est un compt e " +typeCpte) ;
i f ( typeCpte. equal sI gnor eCase( " Epar gne" ) )
Syst em. out . pr i nt l n( " dont l e t aux est " + taux) ;
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val_courante) ;
86
____________________________________________________________
Construire lapplication Projet

}
Construire lapplication Projet
Corrig
publ i c cl ass Pr oj et Ch7 {
// La fonction principale
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " ;
// b. Cration d'un objet C de type Compte
Compte C = new Compte();
do {
choi x = menuPr i nci pal ( ) ;
swi t ch ( choi x) {
// c. Appeler la mthode crerCpte() par l'intermdiaire de l'objet C
case 1 : C.crerCpte() ;
br eak;
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. S( ) ;
// c. Appeler la mthode afficherCpte() par l'intermdiaire de l'objet C
// La vrification du numro utilise une mthode de la classe String
if ( numroLu.equalsIgnoreCase(C.numroCpte)) C.afficherCpte();
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
case 3 : //option 3, crer une ligne comptable
Syst em. out . pr i nt l n( " Opt i on non pr ogr ammee" ) ;
br eak;
case 4 : sor t i r ( ) ;
br eak;
case 5 : al Ai de( ) ;
br eak;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 4) ;
}

// a. Les fonctions du menu dveloppes au cours des chapitres prcdents
publ i c st at i c byt e menuPr i nci pal ( ) {
byt e t mp;
Syst em. out . pr i nt l n( " 1. Cr eat i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
87
__________________________________________________________
Dfinir le type LigneComptable

Syst em. out . pr i nt l n( " 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 4. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 5. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt l n( " Vot r e choi x : " ) ;
t mp = Li r e. b( ) ;
r et ur n t mp;
}
publ i c st at i c voi d sor t i r ( ) {
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
}
publ i c st at i c voi d al Ai de( ) {
Syst em. out . pr i nt l n( " Opt i on 1. Pour cr eer un compt e Cour ant ent r er C " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e J oi nt ent r er J " ) ;
Syst em. out . pr i nt l n( " Pour cr eer un compt e Epar gne ent r er E" ) ;
Syst em. out . pr i nt ( " Pui s, ent r er l e numer o du compt e, et " ) ;
Syst em. out . pr i nt l n( " sa pr emi er e val eur cr edi t ee " ) ;
Syst em. out . pr i nt l n( " Dans l e cas d' un compt e epar gne, ent r er l e t aux " ) ;
Syst em. out . pr i nt l n( " Opt i on 2. Le syst eme af f i che l es donnees du compt e choi si " ) ;
Syst em. out . pr i nt l n( " Opt i on 3. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " Opt i on 4. Pour qui t t er l e pr ogr amme" ) ;
Syst em. out . pr i nt l n( " Opt i on 5. Pour af f i cher de l ' ai de" ) ;
}
}
Dfinir le type LigneComptable
Corrig
a. Les donnes d'une ligne comptable sont : la valeur crditer ou dbiter, la date de l'opration, le
mode de paiement ainsi que le motif. En consquence, la dclaration des variables d'instance ci-aprs
permet de dfinir les donnes du type Li gneCompt abl e.
publ i c doubl e val eur ;
publ i c St r i ng dat e;
publ i c St r i ng mot i f ;
publ i c St r i ng mode;
b. La mthode cr er Li gneCompt abl e( ) :
public void crerLigneComptable() {
Syst em. out . pr i nt ( " Ent r er l a val eur cr di t er ( +) ou dbi t er ( - ) : " ) ;
val eur = Li r e. d( ) ;
Syst em. out . pr i nt ( " Dat e de l ' opr at i on [ j j / mm/ an] " ) ;
dat e = Li r e. S( ) ;
Syst em. out . pr i nt ( " Mot i f de l ' oper at i on [ S( al ai r e) , " ) ;
Syst em. out . pr i nt ( " L( oyer ) , A( l i ment at i on) , D( i ver s) ] : " ) ;
88
_________________________________________________________________
Modifier le type Compte

mot i f = Li r e. S( ) ;
Syst em. out . pr i nt ( " Mode [ C( B) , N( Cheque) , V( i r ement ) ] : " ) ;
mode = Li r e. S( ) ;
}
La mthode af f i cher Li gne( ) :
public void afficherLigne() {
i f ( val eur < 0)
Syst em. out . pr i nt ( " Dbi t er : " + val eur ) ;
el se
Syst em. out . pr i nt ( " Cr di t er : " + val eur ) ;
Syst em. out . pr i nt l n( " l e : " + dat e +" mot i f : " + mot i f + " mode : " + mode) ;
}
Modifier le type Compte
Corrig
publ i c cl ass Compt e {
publ i c St r i ng t ypeCpt e ;
publ i c doubl e val _cour ant e, t aux ;
publ i c St r i ng numr oCpt e ;
// a. Dclaration d'un objet ligne de type LigneComptable
public LigneComptable ligne;
publ i c voi d cr er Cpt e( ) {
char t mp;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t mp = Li r e. c( ) ;
} whi l e ( t mp ! = ' C' && t mp! = ' J ' && t mp ! = ' E' ) ;
swi t ch ( t mp) {
case ' C' : t ypeCpt e = " Cour ant " ;
br eak;
case ' J ' : t ypeCpt e = " J oi nt " ;
br eak;
case ' E' : t ypeCpt e = " Epar gne" ;
br eak;
}
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
89
______________________________________________________________
Modifier lapplication Projet

Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
val _cour ant e = Li r e. d( ) ;
}
// b. Dfinition de la mthode crerLigne()
public void crerLigne() {
// b. Cration en mmoire de l'objet ligne
ligne = new LigneComptable();
// b. Appel de la mthode crerLigneComptable() travers l'objet ligne
ligne.crerLigneComptable();
// b. La valeur courante du compte est modifie
val_courante = val_courante + ligne.valeur;
}
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e ) ;
Syst em. out . pr i nt l n( " est un compt e " + t ypeCpt e) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) )
Syst em. out . pr i nt l n( " dont l e t aux est " + t aux) ;
// c. Affichage des informations relatives l'objet ligne
ligne.afficherLigne();
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val _cour ant e) ;
}
}
Modifier lapplication Projet
Corrig
publ i c cl ass Pr oj et Ch7 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " ;
Compt e C = new Compt e( ) ;
do {
choi x = menuPr i nci pal ( ) ;
swi t ch ( choi x) {
case 1 : C. cr er Cpt e( ) ;
br eak;
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. S( ) ;
i f ( numr oLu. equal sI gnor eCase( C. numr oCpt e) ) C. af f i cher Cpt e( ) ;
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
case 3 : //a. option 3, crer une ligne comptable
90
______________________________________________________________
Modifier lapplication Projet

System.out.print ( "Pour quel compte souhaitez vous crer une ligne ? : ");
numroLu = Lire.S();
if ( numroLu.equalsIgnoreCase(C.numroCpte)) C.crerLigne();
else
System.out.println("Le systeme ne connait pas le compte " + numroLu);
break;
case 4 :
sor t i r ( ) ;
br eak;
case 5 : al Ai de( ) ;
br eak;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 4) ;
}
// La fonction menuPrincipal()
// La fonction sortir( ) {
// La fonction alAide( ) {
}
a. Voir commentaires dans le code source ci-dessus.
b. Si l'utilisateur affiche les donnes d'un compte sans avoir cr de lignes comptables, le programme
stoppe son excution en affichant l'erreur : j ava. l ang. Nul l Poi nt er Except i on. En effet, la
mthode af f i cheCpt e( ) fait appel la mthode af f i cher Li gne( ) par l'intermdiaire d'un
objet l i gne qui n'a pas t cr en mmoire. L'objet l i gne n'est cr que si l'utilisateur passe par
l'option 3.
c. Pour remdier cette situation, l'ide est de dclarer une nouvelle variable entire (un drapeau, voir
corrig de l'exercice 3-5) qui suivant sa valeur, va indiquer l'interprteur si une ligne a t cre ou
non.
publ i c cl ass Compt e {
publ i c St r i ng t ypeCpt e ;
publ i c doubl e val _cour ant e, t aux ;
publ i c St r i ng numr oCpt e ;
publ i c Li gneCompt abl e l i gne;
// Dclaration du drapeau nbLigneRel
public int nbLigneRel ;
publ i c voi d cr er Cpt e( ) {
char t mp;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t mp = Li r e. c( ) ;
} whi l e ( t mp ! = ' C' && t mp! = ' J ' && t mp ! = ' E' ) ;
swi t ch ( t mp) {
91
______________________________________________________________
Modifier lapplication Projet

case ' C' : t ypeCpt e = " Cour ant " ;
br eak;
case ' J ' : t ypeCpt e = " J oi nt " ;
br eak;
case ' E' : t ypeCpt e = " Epar gne" ;
br eak;
}
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
val _cour ant e = Li r e. d( ) ;
// A la cration du compte, aucune ligne comptable n'a t saisie
// donc nbLignRel vaut 0
nbLigneRel = 0;
}
publ i c voi d cr er Li gne( ) {
l i gne = new Li gneCompt abl e( ) ;
l i gne. cr er Li gneCompt abl e( ) ;
// A la cration d'une ligne, nbLignRel vaut 1
nbLigneRel = 1;
val _cour ant e = val _cour ant e + l i gne. val eur ;
}
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e ) ;
Syst em. out . pr i nt l n( " est un compt e " + t ypeCpt e) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) )
Syst em. out . pr i nt l n( " dont l e t aux est " + t aux) ;
// Si nbLignRel est gal 1 ( > 0), on peut afficher les donnes
// d'une ligne comptable
if ( nbLigneRel > 0) ligne.afficherLigne();
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val _cour ant e) ;
}
}
92
_______
Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)

Chapitre 8 : Les principes du concept objet
Encapsuler les donnes dun compte bancaire(La protection pr i vat e et laccs aux donnes)
Corrig
a. En dclarant les donnes des types Compt e et Li gneCompt abl e en mode pr i vat e, le
compilateur dtecte des erreurs telles que Var i abl e numr oCpt e i n cl ass Compt e not
accessible f r omcl ass Pr oj et .
b. Accder en lecture aux donnes de la classe Compt e
publ i c cl ass Compt e {
pr i vat e St r i ng t ypeCpt e ;
pr i vat e doubl e val _cour ant e, t aux ;
pr i vat e St r i ng numr oCpt e ;
pr i vat e Li gneCompt abl e l i gne;
pr i vat e i nt nbLi gneRel ;
// Accder en lecture aux donnes de la classe
public String quelTypeDeCompte() {
return typeCpte;
}
public String quelNumroDeCompte() {
return numroCpte;
}
public double quelleValeurCourante() {
return val_courante;
}
public double quelTaux() {
return taux;
}
publ i c voi d cr er Cpt e( ) {
char t mp;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) , E( par gne) ] : " ) ;
t mp = Li r e. c( ) ;
} whi l e ( t mp ! = ' C' && t mp! = ' J ' && t mp ! = ' E' ) ;
swi t ch ( t mp) {
case ' C' : t ypeCpt e = " Cour ant " ;
br eak;
case ' J ' : t ypeCpt e = " J oi nt " ;
br eak;
case ' E' : t ypeCpt e = " Epar gne" ;
br eak;
}
93
_______
Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)

Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
val _cour ant e = Li r e. d( ) ;
nbLi gneRel = 0;
}
publ i c voi d cr er Li gne( ) {
l i gne = new Li gneCompt abl e( ) ;
l i gne. cr er Li gneCompt abl e( ) ;
nbLi gneRel = 1;
val _cour ant e = val _cour ant e + l i gne. val eur ;
}
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e ) ;
Syst em. out . pr i nt l n( " est un compt e " + t ypeCpt e) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) )
Syst em. out . pr i nt l n( " dont l e t aux est " + t aux) ;
i f ( nbLi gneRel > 0) l i gne. af f i cher Li gne( ) ;
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val _cour ant e) ;
}
}
Accder en lecture aux donnes de la classe Li gneCompt abl e
publ i c cl ass Li gneCompt abl e {
pr i vat e doubl e val eur ;
pr i vat e St r i ng dat e;
pr i vat e St r i ng mot i f ;
pr i vat e St r i ng mode;
publ i c voi d cr er Li gneCompt abl e( ) {
Syst em. out . pr i nt ( " Ent r er l a val eur cr di t er ( +) ou dbi t er ( - ) : " ) ;
val eur = Li r e. d( ) ;
Syst em. out . pr i nt ( " Dat e de l ' opr at i on [ j j / mm/ an] " ) ;
dat e = Li r e. S( ) ;
Syst em. out . pr i nt ( " Mot i f de l ' oper at i on [ S( al ai r e) , " ) ;
Syst em. out . pr i nt ( " L( oyer ) , A( l i ment at i on) , D( i ver s) ] : " ) ;
mot i f = Li r e. S( ) ;
Syst em. out . pr i nt ( " Ent r er l e mode [ C( B) , N( Cheque) , V( i r ement ) ] : " ) ;
mode = Li r e. S( ) ;
}
94
_______
Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)

// Accder en lecture aux donnes de la classe
public double quelleValeur() {
return valeur ;
}
public String quelMotif(){
return motif ;
}
public String quelMode(){
return mode ;
}
public String quelleDate(){
return date ;
}
publ i c voi d af f i cher Li gne( ) {
i f ( val eur < 0)
Syst em. out . pr i nt ( " Dbi t er : " + val eur ) ;
el se
Syst em. out . pr i nt ( " Cr di t er : " + val eur ) ;
Syst em. out . pr i nt l n( " l e : " + dat e + " mot i f : " + mot i f + " mode : " + mode) ;
}
}
c. Dans la classe Pr oj et , seules les instructions faisant appel directement aux donnes de la classe
Compt e sont modifier. C'est dire pour les options 2 et 3 :
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. S( ) ;
// if ( numroLu.equalsIgnoreCase(C.numroCpte))
// -> numroCpte inaccessible car private dans Compte
i f ( numr oLu. equal sI gnor eCase( C.quelNumroDeCompte()) )
C. af f i cher Cpt e( ) ;
case 3 :
Syst em. out . pr i nt ( " Pour quel compt e souhai t ez vous cr er une l i gne ? : " ) ;
numr oLu = Li r e. S( ) ;
i f ( numr oLu. equal sI gnor eCase( C.quelNumroDeCompte()) )
C. cr er Li gne( ) ;
el se
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " + numr oLu) ;
br eak;
d. Dans la classe Compt e, seules les instructions faisant appel directement aux donnes de la classe
Li gneCompt abl e sont modifier. C'est dire pour la mthode cr er Li gne( ) .
publ i c voi d cr er Li gne( ) {
l i gne = new Li gneCompt abl e( ) ;
95
_________________
Encapsuler les donnes dun compte bancaire (Le contrle des donnes)

nbLi gneRel = 1 ;
val _cour ant e = val _cour ant e + ligne.quelleValeur();
}
Encapsuler les donnes dun compte bancaire (Le contrle des donnes)
Corrig
a. La mthode cont r l eVal i ni t ( ) :
pr i vat e doubl e cont r l eVal i ni t ( ) {
doubl e t mp, t mpval ;
do {
Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
t mpval = Li r e. d( ) ;
} whi l e ( t mpval <= 0) ;
r et ur n t mpval ;
}
b. La mthode cont r l eMode( ) :
pr i vat e St r i ng cont r l eMode( ) {
St r i ng t mpS = " " ;
char t mpc ;
do {
Syst em. out . pr i nt ( " Mode [ C( B) , N( Cheque) , V( i r ement ) ] : " ) ;
t mpc = Li r e. c( ) ;
} whi l e ( t mpc ! = ' C' && t mpc ! = ' N' && t mpc ! = ' V' ) ;
swi t ch ( t mpc) {
case ' C' : t mpS = " CB" ;
br eak;
case ' N' : t mpS = " Cheque" ;
br eak;
case ' V' : t mpS = " Vi r ement " ;
br eak;
}
r et ur n t mpS;
}
La mthode cont r l eMot i f ( ) :
pr i vat e St r i ng cont r l eMot i f ( ) {
St r i ng t mpS = " " ;
char t mpc ;
do {
Syst em. out . pr i nt ( " Mot i f de l ' oper at i on [ S( al ai r e) , " ) ;
Syst em. out . pr i nt ( " L( oyer ) , A( l i ment at i on) , D( i ver s) ] : " ) ;
t mpc = Li r e. c( ) ;
} whi l e ( t mpc ! = ' S' && t mpc ! = ' L' && t mpc ! = ' A' && t mpc ! = ' D' ) ;
96
_______________
Encapsuler les donnes dun compte bancaire (Les constructeurs de classe)

swi t ch ( t mpc) {
case ' S' : t mpS = " Sal ai r e" ;
br eak;
case ' L' : t mpS = " Loyer " ;
br eak;
case ' A' : t mpS = " Al i ment at i on" ;
br eak;
case ' D' : t mpS = " Di ver s" ;
br eak;
}
r et ur n t mpS;
}
c. La mthode cr er Cpt e( ) :
publ i c voi d cr er Cpt e( ) {
// Le type du compte est contrl
typeCpte = contrleType();
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
// La valeur courante du compte est contrle
val_courante = contrleValinit();
}
La mthode cr er Li gneCompt abl e( ) :
publ i c voi d cr er Li gneCompt abl e( ) {
Syst em. out . pr i nt ( " Ent r er l a val eur cr di t er ( +) ou dbi t er ( - ) : " ) ;
val eur = Li r e. d( ) ;
Syst em. out . pr i nt ( " Dat e de l ' opr at i on [ j j / mm/ an] " ) ;
dat e = Li r e. S( ) ;
// Le motif de l'opration est contrl
motif = contrleMotif();
// Le mode de l'opration est contrl
mode = contrleMode();
}

Encapsuler les donnes dun compte bancaire(Les constructeurs de classe)
Corrig
a. Le constructeur de la classe Li gneCompt abl e s'crit en modifiant l'entte de la mthode
cr er Li gneCompt abl e( ) , comme suit :
97
_______________
Encapsuler les donnes dun compte bancaire (Les constructeurs de classe)

publ i c Li gneCompt abl e( ) {
Syst em. out . pr i nt ( " Ent r er l a val eur cr di t er ( +) ou dbi t er ( - ) : " ) ;
val eur = Li r e. d( ) ;
Syst em. out . pr i nt ( " Dat e de l ' opr at i on [ j j / mm/ an] " ) ;
dat e = Li r e. S( ) ;
mot i f = cont r l eMot i f ( ) ;
mode = cont r l eMode( ) ;
}
Le constructeur de la classe Compt e s'crit en modifiant l'entte de la mthode cr er Compt e( ) ,
comme suit :
public Compte () {
t ypeCpt e = cont r l eType( ) ;
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
i f ( t ypeCpt e. equal sI gnor eCase( " Epar gne" ) ) {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t aux = Li r e. d( ) ;
}
val _cour ant e = cont r l eVal i ni t ( ) ;
nbLi gneRel = 0 ;
}
Cette dernire transformation fait que l'interpteur n'excute plus le constructeur par dfaut qui
initialisait automatiquement toutes les donnes du compte 0 ou nul l mais, le nouveau
constructeur. Ainsi, l'excution du programme, la demande de saisie d'un numro de compte est
affiche au lieu du menu. En effet, l'appel du constructeur est ralis avant l'affichage du menu.
b. Pour corriger ce dfaut, la premire ide est de dplacer l'appel du constructeur dans l'option1 du
programme. Ainsi, l'affichage du menu sera ralis avant la demande de saisie d'un numro de
compte.
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " , vi de =" " ;
Compte C ;
do {
choi x = menuPr i nci pal ( ) ;
swi t ch ( choi x) {
case 1 : C = new Compte();
br eak;
/ / et c. .
Malheureusement, ce dplacement est mal peru par le compilateur, ce dernier dtectant une erreur
du type Var i abl e C may not have been i ni t i al i zed. En effet, l'objet C n'est
construit qu'en option 1. Si l'utilisateur choisit l'option 2 avant de crer le compte, l'interprteur sera
dans l'impossibilit de l'afficher, puisqu'il n'existera pas en mmoire.
c. En surchargeant le constructeur Compt e( ) de la faon suivante :
public Compte(String num) {
98
_________________________________
Comprendre lhritage (Protection des donnes hrites)

numr oCpt e = num;
nbLi gneRel = 0;
}
d. Nous pouvons construire un premier objet C, qui fait appel au constructeur avec paramtre, comme
suit :
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " , vide ="";
Compte C = new Compte(vide);
do {
choi x = menuPr i nci pal ( ) ;
swi t ch ( choi x) {
case 1 : C = new Compte();
br eak;
/ / et c. .
De cette faon, l'objet C est construit en mmoire ds le dbut de l'excution du programme. Les
donnes de l'objet C sont initialises 0 ou nul l . L'utilisateur peut donc thoriquement afficher le
compte avant de le crer. Ensuite, les vritables valeurs du compte sont saisies en option 1 du
programme, en faisant appel au constructeur par dfaut. Remarquez qu'il ne s'agit pas d'une nouvelle
dclaration mais, bien d'une initialisation. Dans le cas d'une dclaration en option 1, nous aurions
eu :
case 1 : Compte C = new Compt e( ) ;
Dans la classe Compt e, l'appel au constructeur Li gneCompt abl e( ) est ralis dans la mthode
cr er Li gne( ) , comme suit :
publ i c voi d cr er Li gne( ) {
ligne = new LigneComptable();
nbLi gneRel = 1 ;
val _cour ant e = val _cour ant e + l i gne. quel l eVal eur ( ) ;
}
Comprendre lhritage (Protection des donnes hrites)
Corrig
a. La classe Cpt eEpar gne s'crit comme suit :
publ i c cl ass Cpt eEpar gne extends Compte {
private double taux ;
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt l n( " Taux d' epar gne du compt e : " + t aux) ;
}
publ i c doubl e quel Taux( ) {
r et ur n t aux;
}
}
b. et c. La classe Compt e est modifie de la faon suivante :
99
_________________________________
Comprendre lhritage (Protection des donnes hrites)

publ i c cl ass Compt e {
pr i vat e St r i ng t ypeCpt e ;
// c. Seule la donne val_courante doit tre accessible par la classe CpteEpargne
pr ot ect ed doubl e val _cour ant e;
pr i vat e St r i ng numr oCpt e ;
pr i vat e Li gneCompt abl e l i gne;
pr i vat e i nt nbLi gneRel ;
// b. Suppression de la dclaration private double taux ;
publ i c Compt e ( ) {
t ypeCpt e = cont r l eType( ) ;
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
val _cour ant e = cont r l eVal i ni t ( ) ;
nbLi gneRel = 0; ;
// b. Suppression de la saisie du taux ;
}
publ i c St r i ng quel TypeDeCompt e( ) {
r et ur n t ypeCpt e;
}
publ i c St r i ng quel Numr oDeCompt e( ) {
r et ur n numr oCpt e;
}
// b. Suppression de la mthode d'accs en lecture quelTaux()
publ i c doubl e quel l eVal eur Cour ant e( ) {
r et ur n val _cour ant e;
}
publ i c Li gneCompt abl e quel l eLi gneCompabl e( ) {
r et ur n l i gne;
}
pr i vat e St r i ng cont r l eType( ) {
char t mpc;
St r i ng t mpS = " " ;
do {
Syst em. out . pr i nt ( " Type du compt e [ Types possi bl es : " ) ;
Syst em. out . pr i nt ( " C( our ant ) , J ( oi nt ) ] : " ) ;
t mpc = Li r e. c( ) ;
} whi l e ( t mpc ! = ' C' && t mpc ! = ' J ' ) ;
swi t ch ( t mpc) {
case ' C' : t mpS = " Cour ant " ;
br eak;
case ' J ' : t mpS = " J oi nt " ;
br eak;
100
_______________
Comprendre lhritage (Le contrle des donnes dun compte dpargne)

// b. Suppression du case 'E'
}
r et ur n t mpS;
}
pr i vat e doubl e cont r l eVal i ni t ( ) {
doubl e t mp, t mpval ;
do {
Syst em. out . pr i nt ( " Val eur i ni t i al e du compt e : " ) ;
t mpval = Li r e. d( ) ;
} whi l e ( t mpval <= 0) ;
r et ur n t mpval ;
}
publ i c voi d cr er Li gne( ) {
l i gne = new Li gneCompt abl e( ) ;
nbLi gneRel = 1 ;
val _cour ant e = val _cour ant e + l i gne. quel l eVal eur ( ) ;
}
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e ) ;
Syst em. out . pr i nt l n( " est un compt e " + t ypeCpt e) ;
// b. Suppression de l'affichage du taux ;
i f ( nbLi gneRel > 0) l i gne. af f i cher Li gne( ) ;
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val _cour ant e) ;
i f ( val _cour ant e < 0)
Syst em. out . pr i nt l n( " At t ent i on compt e dbi t eur . . . ! ! ! " ) ;
}
}
Comprendre lhritage (Le contrle des donnes dun compte dpargne)
Corrig
Pour contrler la validit du taux, insrer la mthode cont r l eTaux( ) dans la classe
Cpt eEpar gne.
pr i vat e doubl e cont r l eTaux( ) {
doubl e t mp;
do {
Syst em. out . pr i nt ( " Taux de pl acement : " ) ;
t mp = Li r e. d( ) ;
} whi l e ( t mp < 0) ;
r et ur n t mp;
}
101
___________________________
Comprendre lhritage (Le constructeur dune classe drive)

Comprendre lhritage (Le constructeur dune classe drive)
Corrig
a. L'instruction super ( " Epar gne" ) ; fait appel au constructeur de la classe Compt e possdant en
paramtre un St r i ng, le paramtre de super ( ) tant un St r i ng.
b. Le constructeur de la classe Compt e possdant en paramtre un St r i ng doit tre modifi de sorte
qu'il gre la cration d'un compte pargne. Cette gestion est ralise comme suit :
publ i c Compt e( String type) {
if (type.equalsIgnoreCase("Epargne")) {
typeCpte = type;
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
val _cour ant e = cont r l eVal i ni t ( ) ;
nbLi gneRel = 0 ;
}
}
Comprendre lhritage (Le polymorphisme)
Corrig
a. Pour afficher la totalit des informations relatives un compte pargne, la mthode
af f i cher Cpt e( ) de la classe Cpt eEpar gne, doit faire appel la mthode af f i cher Cpt e( )
de la classe Compt e, comme suit :
publ i c voi d af f i cher Cpt e( ) {
super . af f i cher Cpt e( ) ;
Syst em. out . pr i nt l n( " Taux d' epar gne du compt e : " + t aux) ;
}
b. L'option 1 de l'application Pr oj et s'crit comme suit :
case 1 :
Syst em. out . pr i nt ( " Compt e Epar gne ( o/ n) : " ) ;
i f ( Li r e. c( ) == ' o' ) C = new Cpt eEpar gne( ) ;
el se C = new Compt e( ) ;
br eak;
Chapitre 9 : Collectionner un nombre fixe d'objets
Traiter dix lignes comptables (Transformer les constructeurs)
Corrig
publ i c Compt e ( ) {
t ypeCpt e = cont r l eType( ) ;
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
val _cour ant e = cont r l eVal i ni t ( ) ;
// a. Cration en mmoire de la donne ligne sous la forme d'un tableau
ligne = new LigneComptable[NBLigne];
// b. Initialisation
102
_______________________
Traiter dix lignes comptables (Transformer la mthode crerLigne())

nbLigneRel = -1;
}
publ i c Compt e( St r i ng t ype) {
i f ( t ype. equal sI gnor eCase( " Epar gne" ) ) {
t ypeCpt e = t ype;
Syst em. out . pr i nt ( " Numr o du compt e : " ) ;
numr oCpt e = Li r e. S( ) ;
val _cour ant e = cont r l eVal i ni t ( ) ;
// a. Cration en mmoire de la donne ligne sous la forme d'un tableau
ligne = new LigneComptable[NBLigne];
// b. Initialisation
nbLigneRel = -1;
}
}
Traiter dix lignes comptables (Transformer la mthode cr er Li gne( ) )
Corrig
// La mthode crerLigne()
publ i c voi d cr er Li gne( ) {
// a. incrmente le nombre de lignes chaque ligne cre
nbLi gneRel ++;
// b. Si le nombre de lignes est < 10, cration d'une nouvelle ligne
i f ( nbLi gneRel < NBLi gne)
l i gne [ nbLi gneRel ] = new Li gneCompt abl e( ) ;
// c. Si le nombre de lignes est > 10, dcaler toutes les lignes vers le haut
el se {
nbLi gneRel - - ;
dcal er LesLi gnes( ) ;
l i gne [ nbLi gneRel ] = new Li gneCompt abl e( ) ;
}
// d. Modifier la valeur courante du compte
val _cour ant e = val _cour ant e + l i gne[ nbLi gneRel ] . quel l eVal eur ( ) ;
}
pr i vat e voi d dcal er LesLi gnes( ) {
f or ( i nt i = 1; i < NBLi gne ; i ++)
l i gne[ i - 1] = l i gne[ i ] ;
}
Traiter dix lignes comptables (Transformer la mthode af f i cher Compt e( ) )
Corrig
publ i c voi d af f i cher Cpt e( ) {
Syst em. out . pr i nt ( " Le compt e n : " + numr oCpt e ) ;
Syst em. out . pr i nt l n( " est un compt e " +t ypeCpt e) ;
103
_________________________
Les comptes sous forme de dictionnaire (La classe ListeCompte)

// Si une ligne comptable a t cre, l'afficher
i f ( nbLi gneRel >=0) {
f or ( i nt i = 0; i <= nbLi gneRel ; i ++) l i gne[ i ] . af f i cher Li gne( ) ;
}
Syst em. out . pr i nt l n( " Val eur cour ant e : " + val _cour ant e) ;
i f ( val _cour ant e < 0) Syst em. out . pr i nt l n( " At t ent i on compt e dbi t eur . . . ! ! ! " ) ;
}
Chapitre 10 : Collectionner un nombre indtermin d'objets
Les comptes sous forme de dictionnaire (La classe Li st eCompt e)
Corrig
i mpor t j ava. ut i l . *;
i mpor t j ava. i o. *;
publ i c cl ass Li st eCompt e {
pr i vat e HashMap<St r i ng, Compt e> l i st e;
// a. Le constructeur de la classe ListeCompte fait appel au constructeur
// de la classe HashMap
publ i c Li st eCompt e( ) {
liste = new HashMap<String, Compte>();
}
// b. La mthode ajouteUnCompte()
publ i c voi d aj out eUnCompt e( St r i ng t ) {
Compt e nouveau = new Compt e( " " ) ;
// b. Si le paramtre vaut "A" un compte est cr
i f ( t . equal sI gnor eCase( " A" ) ) nouveau = new Compte();
// b. Sinon un compte pargne est cr
el se i f ( t . equal sI gnor eCase( " E" ) ) nouveau = new CpteEpargne();
St r i ng cl = nouveau. quel Numr oDeCompt e( ) ;
// b. Une fois cr, le compte est insr dans le dictionnaire
i f ( l i st e. get ( cl ) == nul l ) l i st e. put ( cl , nouveau) ;
el se Syst em. out . pr i nt l n( " Ce compt e exi st e dej a ! " ) ;
}
// c. Crer une ligne pour un compte donn
publ i c voi d aj out eUneLi gne( St r i ng n) {
St r i ng cl = n;
Compt e c = ( Compt e) l i st e. get ( cl ) ;
// c. Si le compte existe, une ligne est cre
i f ( c ! = nul l ) c. cr er Li gne( ) ;
el se Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " +n) ;
}
// d. retoune un objet Compte
publ i c Compt e quel Compt e( St r i ng n) {
104
_____________________________
Les comptes sous forme de dictionnaire (L'application Projet)

St r i ng cl = n;
Compt e c = ( Compt e) l i st e. get ( cl ) ;
i f ( c == nul l )
Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " +n) ;
r et ur n( c) ;
}
// d. recherche un compte partir du numro pass en paramtre
publ i c voi d r echer cheUnCompt e ( St r i ng n) {
St r i ng cl = n;
Compt e c = ( Compt e) l i st e. get ( cl ) ;
i f ( c ! = nul l ) c. af f i cher Cpt e( ) ;
el se Syst em. out . pr i nt l n( " Le syst eme ne connai t pas l e compt e " +n) ;
}
// d. supprime un compte partir du numro pass en paramtre
publ i c voi d suppr i meUnCompt e( St r i ng n) {
St r i ng cl = n;
Compt e c = ( Compt e) l i st e. get ( cl ) ;
i f ( c ! = nul l ) {
l i st e. r emove( cl ) ;
Syst em. out . pr i nt l n( n + " a t suppr i m " ) ;
}
el se Syst em. out . pr i nt l n( n + " est i nconnu ! " ) ;
}
// d. affiche tous les comptes stocks dans le dictionnaire
publ i c voi d af f i cheLesCompt es( ) {
i f ( l i st e. si ze( ) ! = 0) {
Col l ect i on<Compt e> col Compt e = l i st e. val ues( ) ;
f or ( Compt e c: col Compt e ) c. af f i cher Cpt e( ) ;
}
el se Syst em. out . pr i nt l n( " Aucun compt e n' a et e cr ee, dans cet t e l i st e" ) ;
}
}
Les comptes sous forme de dictionnaire (L'application Pr oj et )
Corrig
publ i c cl ass Pr oj et Ch10 {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " ;
// Crer une liste de Compte
Li st eCompt e C = new Li st eCompt e( ) ;
do {
choi x = menuPr i nci pal ( ) ;
105
____________________________
Les comptes sous forme de dictionnaire (L'application Projet)

swi t ch ( choi x) {
case 1 :
Syst em. out . pr i nt ( " Compt e Epar gne ( o/ n) : " ) ;
// b. Crer un compte pargne ou un autre type de compte
i f ( Li r e. c( ) == ' o' ) C. aj out eUnCompt e( " E" ) ;
el se C. aj out eUnCompt e( " A" ) ;
br eak;
case 2 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. S( ) ;
// a. rechercher et afficher un compte
C. r echer cheUnCompt e( numr oLu) ;
br eak;
case 3 :
// a. afficher tous les comptes
C. af f i cheLesCompt es( ) ;
br eak;
case 4 :
Syst em. out . pr i nt ( " Pour quel compt e souhai t ez vous cr er une l i gne ? : " ) ;
numr oLu = Li r e. S( ) ;
// a. ajouter une ligne un compte
C. aj out eUneLi gne( numr oLu) ;
br eak;
case 5 :
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous suppr i mer ? : " ) ;
numr oLu = Li r e. S( ) ;
// a. supprimer un compte
C. suppr i meUnCompt e( numr oLu) ;
br eak;
case 6 : sor t i r ( ) ;
br eak;
case 7 : al Ai de( ) ;
br eak;
def aul t : Syst em. out . pr i nt l n( " Cet t e opt i on n' exi st e pas " ) ;
}
} whi l e ( choi x ! = 6) ;
}
// c. modifier l'affichage du menu principal
publ i c st at i c byt e menuPr i nci pal ( ) {
byt e t mp;
Syst em. out . pr i nt l n( " 1. Cr at i on d' un compt e" ) ;
Syst em. out . pr i nt l n( " 2. Af f i chage d' un compt e" ) ;
106
________________________
La sauvegarde des comptes bancaires (La classe FichierCompte)

Syst em. out . pr i nt l n( " 3. Af f i chage de t ous l es compt es" ) ;
Syst em. out . pr i nt l n( " 4. Ecr i r e une l i gne compt abl e" ) ;
Syst em. out . pr i nt l n( " 5. Suppr i mer un compt e " ) ;
Syst em. out . pr i nt l n( " 6. Sor t i r " ) ;
Syst em. out . pr i nt l n( " 7. De l ' ai de" ) ;
Syst em. out . pr i nt l n( ) ;
Syst em. out . pr i nt ( " Vot r e choi x : " ) ;
t mp = Li r e. b( ) ;
r et ur n t mp;
}
publ i c st at i c voi d sor t i r ( ) {
Syst em. out . pr i nt l n( " Au r evoi r et a bi ent ot " ) ;
Syst em. exi t ( 0) ;
}
publ i c st at i c voi d al Ai de( ) {
}

La sauvegarde des comptes bancaires (La classe Fi chi er Compt e)
Corrig
i mpor t j ava. i o. *;
publ i c cl ass Fi chi er Compt e {
// a. Le fichier de sauvegarde s'appelle Compte.dat
pr i vat e St r i ng nomDuFi chi er = " Compt e. dat " ;
pr i vat e Obj ect Out put St r eamf Wo;
pr i vat e Obj ect I nput St r eamf Ro;
pr i vat e char mode;
publ i c bool ean ouvr i r ( St r i ng s) {
t r y {
mode = ( s. t oUpper Case( ) ) . char At ( 0) ;
i f ( mode == ' R' | | mode == ' L' )
f Ro = new Obj ect I nput St r eam( new Fi l eI nput St r eam( nomDuFi chi er ) ) ;
el se i f ( mode == ' W' | | mode == ' E' )
f Wo = new Obj ect Out put St r eam( new Fi l eOut put St r eam( nomDuFi chi er ) ) ;
r et ur n t r ue;
}
cat ch ( I OExcept i on e) {
r et ur n f al se;
}
}
publ i c voi d f er mer ( ) {
t r y {
i f ( mode == ' R' | | mode == ' L' ) f Ro. cl ose( ) ;
107
_____________________________
La sauvegarde des comptes bancaires (L'application Projet)

el se i f ( mode == ' W' | | mode == ' E' ) f Wo. cl ose( ) ;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur l a f er met ur e " ) ;
}
}
// b. La mthode lire retourne un objet de type ListeCompte
publ i c Li st eCompt e l i r e( ) {
t r y {
Li st eCompt e t mp = ( Li st eCompt e) f Ro. r eadObj ect ( ) ;
r et ur n t mp;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur de l ect ur e " ) ;
}
cat ch ( Cl assNot FoundExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" n' est pas du bon f or mat " ) ;
}
r et ur n nul l ;
}
// b. La mthode ecrire sauvegarde un objet de type ListeCompte
publ i c voi d ecr i r e( Li st eCompt e t mp) {
t r y {
i f ( t mp ! = nul l ) f Wo. wr i t eObj ect ( t mp) ;
}
cat ch ( I OExcept i on e) {
Syst em. out . pr i nt l n( nomDuFi chi er +" : Er r eur en cour s d' cr i t ur e " ) ;
}
}
}
c. Les en-ttes des classes Compt e, Cpt eEpar gne, Li st eCompt e et Li gneCompt abl e
doivent utiliser le terme i mpl ement s Ser i al i zabl e
La sauvegarde des comptes bancaires (L'application Pr oj et )
Corrig
a. La lecture du fichier Compt e. dat est ralise de la faon suivante :
Fi chi er Compt e F = new Fi chi er Compt e( ) ;
i f ( F. ouvr i r ( " L" ) ) {
C = F. l i r e( ) ;
F. f er mer ( ) ;
}
Ces instructions sont insrer dans le fichier Pr oj et . j ava, juste avant l'entre dans la boucle
dowhi l e( ) ;
108

La mise en place des dates dans les lignes comptables (Rechercher des mthodes dans les
diffrents packages)

b. La sauvegarde automatique s'effectue l'option 6, comme suit :
case 6 :
Syst em. out . pr i nt l n( " Sauvegar de des donnes dans Compt e. dat " ) ;
F. ouvr i r ( " E" ) ;
F. ecr i r e( C) ;
F. f er mer ( ) ;
sor t i r ( ) ;
br eak;
La mise en place des dates dans les lignes comptables (Rechercher des mthodes dans les diffrents
packages)
Corrig
a. et b. Les diffrentes recherches proposes nous montrent qu'il existe une classe nomme
Si mpl eDat eFor mat qui permet la vrification de la validit d'une date. La date est traduite en
objet Dat e partir d'une chane de caractres comprenant le jour, le mois et l'anne. Pour sparer
chacune de ces valeurs, il est ncessaire de dfinir un caractre appel sparateur de champs.
La mise en place des dates dans les lignes comptables (Ecrire la mthode cont r l eDat e( ) )
Corrig
Le contrle de la validit d'une date est ralis de la faon suivante :
pr i vat e St r i ng cont r l eDat e( ) {
i nt nb = 0;
Dat e d = nul l ;
// Choix du format de la date, le sparateur est le caractre '/'
Si mpl eDat eFor mat f or mat I n=new Si mpl eDat eFor mat ( " dd/ MM/ yyyy" ) ;
St r i ng sdat e;
// d. Tant que d n'est pas correctement initialise
whi l e ( d == nul l ) {
t r y {
Syst em. out . pr i nt ( " Ent r er une dat e ( j j / mm/ aaaa) : " ) ;
// a. Saisie de la chaine correspondant la date
// b. Et traduction en objet de type Date
// Si la traduction ne peut se raliser
// La chane n'est pas au bon format, d vaut null
d = f or mat I n. par se( Li r e. S( ) ) ;
}
cat ch( Par seExcept i on p) {
// c. Si la traduction ne peut se raliser, une exception est dtecte
// d. On incrmente un compteur
nb++;
// d. Si le compteur >= 3, la date est initialise la date place en
// mmoire de l'ordinateur
i f ( nb >= 3) d = new Dat e( ) ;
109
_______________________________
Calcul de statistiques (Les classes ListeCompte et Compte)

}
}
// e. Lorsque la date est au bon format, on la transforme en String
sdat e = f or mat I n. f or mat ( d) ;
r et ur n sdat e;
}
Chapitre 11 : Dessiner des objets
Calcul de statistiques (Les classes Li st eCompt e et Compt e)
Corrig
a. Pour raliser les statistiques, nous avons besoin de connatre pour chaque ligne comptable saisie, la
valeur et le motif de l'opration.
b. La valeur et le motif sont accesibles de la la classe Compt e grce aux mthodes
quel l eVal eur ( ) et quel Mot i f ( ) . Par contre, le tableau des lignes comptables n'est pas
accessible puisqu'il est dclar en pr i vat e. Il est donc ncessaire de crer des mthodes d'accs en
consultation au tableau l i gne, ainsi qu'au nombre de lignes effectivement cres. Ces mthodes
sont dfinies comme suit :
publ i c Li gneCompt abl e quelleLigne( i nt n) {
r et ur n l i gne[ n] ;
}
publ i c i nt combienLignes( ) {
r et ur n nbLi gneRel ;
}
Ces deux mthodes sont insrer dans la classe Compt e.
Calcul de statistiques (La mthode st at Par Mot i f ( ) )
Corrig
publ i c cl ass St at {
// b. Le calcul des statistiques est ralis partir d'un objet Compte
publ i c Compt e cpt e;
// b. Les resultats sont stocks dans des variables de double prcision
pr i vat e doubl e pr ct Di v, pr ct Loy, pr ct Al i ;
publ i c St at ( Compt e c) {
cpt e = c;
}
pr i vat e doubl e pour cent age( doubl e nb, doubl e t ) {
doubl e pr ct = 0;
i f ( t > 0) pr ct = ( doubl e) nb / t * 100;
r et ur n pr ct ;
}
// a. La mthode calcule les statistiques en fonction du motif de l'opration
publ i c voi d st at Par Mot i f ( ) {
doubl e t ot Cr edi t =0;
110
________________________________________
Calcul de statistiques (La mthode statParMotif())

doubl e t ot Di v=0, t ot Loy=0, t ot Al i =0;
// a. Pour chaque ligne comptable enregistre
f or ( i nt i = 0; i <= cpt e. combi enLi gnes( ) ; i ++) {
// a. S'il s'agit d'un crdit, en faire la somme
i f ( cpt e. quel l eLi gne( i ) . quel l eVal eur ( ) > 0)
t ot Cr edi t = t ot Cr edi t + cpt e. quel l eLi gne( i ) . quel l eVal eur ( ) ;
// a. Si le motif est "Divers" en faire la somme
i f ( cpt e. quel l eLi gne( i ) . quel Mot i f ( ) . equal sI gnor eCase( " Di ver s" ) )
t ot Di v = t ot Di v + Mat h. abs( cpt e. quel l eLi gne( i ) . quel l eVal eur ( ) ) ;
// a. Si le motif est "Loyer" en faire la somme
i f ( cpt e. quel l eLi gne( i ) . quel Mot i f ( ) . equal sI gnor eCase( " Loyer " ) )
t ot Loy = t ot Loy + Mat h. abs( cpt e. quel l eLi gne( i ) . quel l eVal eur ( ) ) ;
// a. Si le motif est "Alimentation" en faire la somme
i f ( cpt e. quel l eLi gne( i ) . quel Mot i f ( ) . equal sI gnor eCase( " Al i ment at i on" ) )
t ot Al i = t ot Al i + Mat h. abs( cpt e. quel l eLi gne( i ) . quel l eVal eur ( ) ) ;
}
// a. Calculer le pourcentage pour chacun des motifs
pr ct Al i = pour cent age( t ot Al i , t ot Cr edi t ) ;
pr ct Loy = pour cent age( t ot Loy, t ot Cr edi t ) ;
pr ct Di v = pour cent age( t ot Di v, t ot Cr edi t ) ;
// d. Afficher le rsultat
Syst em. out . pr i nt ( " A : " + pr ct Al i + " L : " + pr ct Loy + " D : " +pr ct Di v) ;
}
c. Pour afficher simplement le rsultat du calcul ralis par la mthode st at Par Mot i f ( ) :
publ i c cl ass Pr oj et {
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
byt e choi x = 0 ;
St r i ng numr oLu = " " ;
Li st eCompt e l i st e = new Li st eCompt e( ) ;
Fi chi er Compt e F = new Fi chi er Compt e( ) ;
// Lecture du fichier Compte.dat
i f ( F. ouvr i r ( " L" ) ) {
l i st e = F. l i r e( ) ;
F. f er mer ( ) ;
}
Syst em. out . pr i nt l n( " Af f i chage des st at i st i ques" ) ;
Syst em. out . pr i nt ( " Quel compt e souhai t ez vous af f i cher ? : " ) ;
numr oLu = Li r e. S( ) ;
Compt e cpt e = new Compt e( " " ) ;
// Le compte existe-t-il dans la liste ?
cpt e = l i st e. quel Compt e( numr oLu) ;
// si Oui
111
____________________________________
L'interface graphique (L'affichage de l'histogramme)

i f ( cpt e ! = nul l ) {
St at s = new St at ( cpt e) ;
// Afficher les statistiques
s. st at Par Mot i f ( ) ;
}
}
}
L'interface graphique(L'affichage de l'histogramme)
Corrig
a. La mthode dessi ne( ) insrer dans la classe St at
publ i c voi d dessi ne( Gr aphi cs g) {
st at Par Mot i f ( ) ;
// Affichage en gris du n du compte ainsi que du texte Crdit et Dbit au
// dessus de chaque colonne de l'histogramme
g. set Col or ( Col or . dar kGr ay) ;
g. dr awSt r i ng( " Compt e n : " + cpt e. quel Numr oDeCompt e( ) , 100, 50) ;
g. dr awSt r i ng( " Cr di t " , 105, 220) ;
g. dr awSt r i ng( " Dbi t " , 160, 220) ;
// Affichage en bleu du premier rectangle correspondant la colonne Crdit
g. set Col or ( Col or . bl ue) ;
g. f i l l Rect ( 100, 100, 50, 100) ;
// L'affichage est ralis par rapport au coin suprieur gauche de la fentre
// La variable reste permet de dcaler les rectangles de la colonne Dbit
// vers le bas, de sorte que les deux colonnes soient ajustes horizontalement
i nt r est e = ( i nt ) ( 100 - pr ct Loy - pr ct Di v - pr ct Al i ) ;
// Affichage en vert du rectangle correspondant au motif Loyer
g. set Col or ( Col or . gr een. dar ker ( ) . dar ker ( ) ) ;
g. f i l l Rect ( 150, 100 + r est e, 50, ( i nt ) pr ct Loy) ;
g. dr awSt r i ng( " Loyer " , 210, 95 + ( i nt ) pr ct Loy+r est e) ;
// Affichage en magenta du rectangle correspondant au motif Alimentation
g. set Col or ( Col or . magent a) ;
g. f i l l Rect ( 150, 100 + ( i nt ) pr ct Loy+r est e, 50, ( i nt ) pr ct Al i ) ;
g. dr awSt r i ng( " Al i ment at i on" , 210, 95 + ( i nt ) ( pr ct Loy+pr ct Al i ) +r est e) ;
// Affichage en rouge du rectangle correspondant au motif Divers
g. set Col or ( Col or . r ed) ;
g. f i l l Rect ( 150, 100 + ( i nt ) ( pr ct Loy + pr ct Al i ) + r est e, 50, ( i nt ) pr ct Di v) ;
g. dr awSt r i ng( " Di ver s" , 210, 95 + ( i nt ) ( pr ct Loy + pr ct Al i + pr ct Di v) + r est e) ;
}
}
b. La fentre principale :
i mpor t j ava. awt . *;
112
____________________________________
L'interface graphique (L'affichage de l'histogramme)

cl ass Fenet r e ext ends Fr ame {
publ i c f i nal st at i c i nt HT = 300;
publ i c f i nal st at i c i nt LG = 300;
publ i c Fenet r e( St at s) {
set Ti t l e( " Les st at i st i ques du compt e " ) ;
set Si ze( HT, LG) ;
set Backgr ound( Col or . dar kGr ay) ;
addWi ndowLi st ener ( new Gest i onQui t t er ( ) ) ;
// La zone de dessin
Dessin page = new Dessin(s);
add(page , "Center");
// Le bouton quitter
Button bQuitter = new Button ("Quitter");
bQuitter.addActionListener(new GestionQuitter());
add(bQuitter, "South");
set Vi si bl e( t r ue) ;
}
}
c. La classe Dessi n :
i mpor t j ava. awt . *;
publ i c cl ass Dessi n ext ends Canvas {
pr i vat e Col or coul eur = Col or . gr een;
publ i c f i nal st at i c Col or coul eur Fond = Col or . whi t e;
public Stat s;
publ i c Dessi n( Stat s) {
set Backgr ound( coul eur Fond) ;
set For egr ound( coul eur ) ;
set Cur sor ( new Cur sor ( Cur sor . CROSSHAI R_CURSOR) ) ;
this.s = s;
}
// L'affichage de l'histogramme
publ i c voi d pai nt ( Gr aphi cs g) {
s.dessine(g);
}
}
d. La classe Get si onQui t t er :
i mpor t j ava. awt . event . *;
// Gre les couteurs d'vnements de fentres et d'actions
publ i c cl ass Gest i onQui t t er extends WindowAdapter implements ActionListener {
public void actionPerformed(ActionEvent e) {
Syst em. exi t ( 0) ;
}
113
________________________________
L'interface graphique (La saisie d'un numro de compte)

public void windowClosing(WindowEvent e) {
Syst em. exi t ( 0) ;
}
}
L'interface graphique (La saisie d'un numro de compte)
Corrig
La classe Sai si e dfinit un type d'objet qui permet la saisie d'une valeur par l'intermdiaire d'une
fentre graphique. La valeur est crite dans un objet appel Text Fi el d et est rcupre grce la
mthode get Text ( ) lorsqu'une action est ralise dans cet objet (par exemple lorsque l'utilisateur
valide la saisie de la valeur en tapant sur la touche "Ent r e".
Pour notre projet la fentre de saisie doit s'afficher de la faon suivante :
Une fois le numro valid, l'application doit afficher l'histogramme dans une nouvelle fentre. Par
consquent, la classe Sai si e s'crit comme suit :
i mpor t j ava. awt . *;
i mpor t j ava. awt . event . *;
publ i c cl ass Sai si e i mpl ement s Act i onLi st ener {
Li st eCompt e l c;
Text Fi el d r ponse;
publ i c Sai si e ( Li st eCompt e t mp_l c) {
// La liste des comptes est pass en paramtre du constructeur
l c = t mp_l c;
// Titre de la fentre de saisie
Fr ame f = new Fr ame ( " Sai si e du n de Compt e" ) ;
f . set Si ze( 300, 50) ;
f . set Backgr ound( Col or . whi t e) ;
f . set Layout ( new Bor der Layout ( ) ) ;
// Affichage du texte dans la fentre
f . add ( new Label ( " Numer o du compt e : " ) , " West " ) ;
r ponse = new Text Fi el d( 10) ;
f . add( r ponse, " East " ) ;
r ponse. addAct i onLi st ener ( t hi s) ;
f . set Vi si bl e( t r ue) ;
}
publ i c voi d act i onPer f or med( Act i onEvent evt ) {
St r i ng numr o = r ponse. get Text ( ) ;
Compt e cpt e = new Compt e( " " ) ;
// Si le numro saisi existe dans la liste des comptes
cpt e = l c. quel Compt e( numr o) ;
i f ( cpt e ! = nul l ) {
114
_______________________
Le formulaire de saisie, gestion des paramtres envoys la servlet

// Si le numro saisi existe dans la liste des comptes
// Calcul des statitstiques
St at s = new St at ( cpt e) ;
// Et affichage dans la nouvelle fentre
new Fenet r e ( s) ;
}
}
}
L'application Pr oj et fait appel la classe Sai si e de la faon suivante :
publ i c cl ass Pr oj et I G{
publ i c st at i c voi d mai n ( St r i ng [ ] ar gument ) {
Li st eCompt e l i st e = new Li st eCompt e( ) ;
Fi chi er Compt e F = new Fi chi er Compt e( ) ;
// Lecture du fichier Compte.dat
i f ( F. ouvr i r ( " L" ) ) {
l i st e = F. l i r e( ) ;
F. f er mer ( ) ;
}
// Si la liste n'est pas vide, affichage de la fentre de saisie
i f ( l i st e ! = nul l ) new Sai si e( l i st e) ;
}
}
Chapitre 12 : J ava et Internet
Le formulaire de saisie, gestion des paramtres envoys la servlet
Corrig
<ht ml >
<head> <t i t l e>Gest i on de Compt es bancai r es </ t i t l e> </ head>
<body backgr ound=" f ond. gi f " l ef t mar gi n=" 120" mar gi nwi dt h=" 120" >
<For mACTI ON=" ht t p: / / l ocal host : 8080/ j sp/ ser vl et / Pr oj et P3Ch12" Met hod=" GET" >
<hr wi dt h=" 450" al i gn=" l ef t " >
<f ont f ace=" Ar i al , Hel vet i ca, sans- ser i f " si ze=" +1" >Cr at i on d' un Compt e</ f ont > <br >
<t abl e wi dt h=" 350" bor der =" 0" hei ght =" 40" >
<t r >
<t d al i gn=" l ef t " val i gn=" mi ddl e" > <f ont f ace=" Geor gi a, Ti mes New Roman, Ti mes,
ser i f " >Numer o </ f ont ></ t d>
<t d col span=2> <f ont f ace=" Geor gi a, Ti mes New Roman, Ti mes, ser i f " >Val eur
i ni t i al e</ f ont ></ t d>
</ t r >
<t r al i gn=" l ef t " >
<%-- le numro du compte est enregistr sous le paramtre "numro" --%>
<t d wi dt h=175 val i gn=" t op" ><i nput t ype=" t ext " si ze=7 name="numero"></ t d>
<%-- la valeur initiale du compte est enregistre sous le paramtre "initiale" --%>
115
_______________________
Le formulaire de saisie, gestion des paramtres envoys la servlet

<t d wi dt h=175 val i gn=" t op" ><i nput t ype=" t ext " si ze=12 name="initiale"
val ue=" 100. 0" > &eur o; </ t d>
</ t r >
</ t abl e>
<t abl e wi dt h=" 325" bor der =" 0" hei ght =" 40" >
<t r al i gn=" l ef t " >
<%-- Si ce bouton est slectionn, la valeur type="C" est transmise avec la requte -
-%>
<t d wi dt h=" 80" val i gn=" t op" ><i nput t ype=" Radi o" name=" t ype" value="C"> Cour ant
</ t d>
<%-- Si ce bouton est slectionn, la valeur type="J" est transmise avec la requte -
-%>
<t d wi dt h=" 120" val i gn=" t op" ><i nput t ype=" Radi o" name=" t ype" value="J">
J oi nt </ t d>
<%-- Envoie de la requte avec le bouton B1=Creer, mthode GET par dfaut --%>
<t d wi dt h=" 125" al i gn=" r i ght " val i gn=" t op" > <i nput type="submit" name=" B1"
val ue=" Cr eer " ></ t d>
</ t r >
</ t abl e>
</ FORM>
<hr wi dt h=" 450" al i gn=" l ef t " >
<For mACTI ON=" ht t p: / / l ocal host : 8080/ j sp/ ser vl et / Pr oj et P3Ch12" Met hod=" GET" >
<f ont f ace=" Ar i al , Hel vet i ca, sans- ser i f " si ze=" +1" >Af f i cher un Compt e</ f ont > <br >
<t abl e wi dt h=" 325" bor der =" 0" hei ght =" 40" >
<t r >
<t d al i gn=" l ef t " val i gn=" mi ddl e" col span=" 2" > <f ont f ace=" Geor gi a, Ti mes New
Roman, Ti mes, ser i f " >Numr o </ f ont ></ t d>
</ t r >
<t r al i gn=" l ef t " >
<%-- Le numro du compte est enregistr sous le paramtre "numro" --%>
<t d wi dt h=200 val i gn=" t op" ><i nput t ype=" t ext " si ze=15 name="numero"></ t d>
<%-- Envoie de la requte avec le bouton B2=Afficher, mthode GET par dfaut --%>
<t d wi dt h=" 125" al i gn=" r i ght " val i gn=" t op" > <input type="submit" name=" B2"
val ue=" Af f i cher " ></ t d>
</ t r >
</ t abl e>
</ FORM>
</ body>
</ ht ml >
Dterminez les diffrents paramtres envoys lors de lenvoi du formulaire.
Si l'internaute soumet les valeurs 1111 comme numro de compte, 100. 0 comme valeur initiale et
le bouton cour ant , avec le bouton Cr er , la requte aura pour forme :
ht t p: / / l ocal host : 8080/ j sp/ ser vl et / Pr oj et P3Ch12?numero=1111&initiale
=100. 0&type=c&B1=Cr eer
Si l'internaute soumet la valeur 1111 avec le bouton Af f i cher , la requte aura pour forme :
116
_____________________________________
La servlet ProjetP3Ch12 : Traitement des paramtres

ht t p: / / l ocal host : 8080/ j sp/ ser vl et / Pr oj et P3Ch12?numero=1111&B2=Af f i c
her
La servlet ProjetP3Ch12 : Traitement des paramtres
En parcourant la liste des paramtres reus par la servlet, il convient de :
1. dtecter les termes crer ou afficher , mis par les boutons denvoi de la requte, afin de
dterminer quelle opration raliser par la suite ;
Voir la zone dans la servlet Pr oj et P3Ch12
2. stocker les valeurs telles que le numro de compte, le type et la valeur initiale dans des variables
temporaires.
Voir la zone dans la servlet Pr oj et P3Ch12
Corrig
i mpor t j ava. i o. *;
i mpor t j ava. ut i l . *;
i mpor t j avax. ser vl et . *;
i mpor t j avax. ser vl et . ht t p. *;

publ i c cl ass Pr oj et P3Ch12 ext ends Ht t pSer vl et {
// Cration et initialisation d'un compte C par dfaut
Compt e C = new Compt e( 0, " 0" , ' c' ) ;
// les requtes sont soumises par dfaut avec le mthode GET
publ i c voi d doGet ( Ht t pSer vl et Request r eq, Ht t pSer vl et Response r ep) t hr ows
I OExcept i on, Ser vl et Except i on {
St r i ng donnes = " " ;
Fi l eWr i t er f i chi er ;
St r i ng mot [ ] = new St r i ng[ 5] , numcpt e;
doubl e val i ni t ;
char t ype;
i nt nbmot =0, choi x = 0;
// Chaque lmment de la requte est plac dans une numration avec
// comme sparateur le ";"
// si l'internaute saisi 1111 comme numro de compte courant avec 100.0 euros
// et soumet sa requte avec le bouton Creer alors
// donnes a pour forme 100.0;1111;Creer;c;
f or ( Enumer at i on e = r eq. get Par amet er Names( ) ; e. hasMor eEl ement s( ) ; )
donnes = donnes + r eq. get Par amet er ( ( St r i ng) e. next El ement ( ) ) +' ; ' ;
i f ( donnes ! = nul l ) {
// la classe StringTokenizer dfinit des outils de recherche de mots dans une
// liste constitue de caractres et de sparateurs (ici le ";")
St r i ngTokeni zer st = new St r i ngTokeni zer ( donnes, " ; " ) ;
i nt i =0;
nbmot =st . count Tokens( ) ;
mot = new St r i ng[ nbmot ] ;
// Tant qu'il reste des lments dans la liste
117
_____________________________________
La servlet ProjetP3Ch12 : Traitement des paramtres

whi l e ( st . hasMor eTokens( ) ) {
// stocker cet lment dans le tableau mot[i]
mot [ i ] = st . next Token( ) ;
// si mot[i] est gal "crer", choix vaut 1
i f ( mot [ i ] . equal sI gnor eCase( " cr eer " ) ) choi x=1;
// si mot[i] est gal "afficher", choix vaut 2
el se i f ( mot [ i ] . equal sI gnor eCase( " af f i cher " ) ) choi x=2;
i ++;
}
}
r ep. set Cont ent Type( " t ext / ht ml " ) ;
Pr i nt Wr i t er pw = r ep. get Wr i t er ( ) ;
pw. pr i nt l n( " <ht ml >" ) ;
pw. pr i nt l n( " <head>" ) ;
pw. pr i nt l n( " <t i t l e> Gest i on de Compt es </ t i t l e>" ) ;
pw. pr i nt l n( " </ head>" ) ;
pw. pr i nt l n( " <body bgcol or =' whi t e' >" ) ;
pw. pr i nt l n( " <f ont f ace=' Ar i al , Hel vet i ca, sans- ser i f ' si ze=' +1' >" ) ;
pw. pr i nt l n( " Cr at i on de compt e </ f ont ><br ><br >" ) ;
// Suivant la valeur de choix crer ou afficher un compte
swi t ch ( choi x) {
case 1 :
i f ( nbmot > 3) {
val i ni t =Doubl e. par seDoubl e( mot [ 0] ) ;
numcpt e=mot [ 1] ;
t ype = mot [ 3] . char At ( 0) ;
// cration d'un compte, voir constructeur de la classe Compte ci dessous
C = new Compt e( val i ni t , numcpt e, t ype) ;
// affichage d'un compte, voir mthode afficherCpte() de la classe Compte
pw. pr i nt l n( C. af f i cher Cpt e( ) ) ;
}
el se pw. pr i nt l n( " <P> Vous avez oubl i de sai si r l e t ype du compt e ! <BR>" ) ;
br eak;
case 2 :
numcpt e=mot [ 0] ;
i f ( numcpt e. compar eTo( C. get Numr oCpt e( ) ) == 0)
// affichage d'un compte, voir mthode afficherCpte() de la classe Compte
pw. pr i nt l n( C. af f i cher Cpt e( ) ) ;
el se pw. pr i nt l n( " Ce numr o n' exi st e pas" ) ;
br eak;
}
pw. pr i nt l n( " <P><A HREF=' ht t p: / / l ocal host : 8080/ j sp/ CB. ht ml ' > Cr er un aut r e compt e
</ A>" ) ;
118
__________________________________________________________________
Cration dun compte

pw. pr i nt l n( " </ body>" ) ;
pw. pr i nt l n( " </ ht ml >" ) ;
}
publ i c voi d doPost ( Ht t pSer vl et Request r eq, Ht t pSer vl et Response r ep) t hr ows
I OExcept i on, Ser vl et Except i on {
}
}
Cration dun compte
Ecrire le constructeur de la classe Compt e dont les proprits sont dclares comme suit :
pr i vat e St r i ng t ypeCpt e ;
pr i vat e doubl e val _cour ant e;
pr i vat e St r i ng numr oCpt e ;
qui prend en paramtre les donnes transmis lors de la requte.
Corrig
Le constructeur de la classe Compt e construit l'objet partir des paramtres transmis par la servlet (voir
la zone dans la servlet Pr oj et P3Ch12)
publ i c cl ass Compt e {
pr i vat e St r i ng t ypeCpt e ;
pr i vat e doubl e val _cour ant e;
pr i vat e St r i ng numr oCpt e ;
publ i c Compt e ( doubl e val eur , St r i ng numer o, char t ) {
swi t ch ( t ) {
case ' C' : case ' c' : t ypeCpt e = " Cour ant " ;
br eak;
case ' J ' : case ' j ' : t ypeCpt e = " J oi nt " ;
br eak;
case ' E' : case ' e' : t ypeCpt e = " Epar gne" ;
br eak;
}
numr oCpt e = numer o;
val _cour ant e = val eur ;
}
}
Afficher un compte
Corrig
1. La servlet doit tout dabord tester si le numro de compte existe. Pour cela, il est ncessaire dajouter
une mthode get Numr oCpt e( ) , afin de rcuprer, depuis la servlet, le numro du compte de
lobjet cr.
// La mthode retourne la servlet le numro du compte
publ i c St r i ng get Numr oCpt e( ) {
r et ur n numr oCpt e;
}
119
___________________________________________________________________
La gestion des erreurs

Voir la zone dans la servlet Pr oj et P3Ch12.
2. Tester le numro de compte entr en paramtre avec celui provenant de la mthode
get Numr oCpt e( ) . Si le test est faux, afficher un message derreur; sinon passer au point 3.
Voir la zone dans la servlet Pr oj et P3Ch12.
3. Modifier la mthode af f i cher Cpt e( ) de faon ce quelle retourne sous la forme dune chane de
caractres, lensemble des informations propres un objet donn. Cette chane est constitue du
numro du compte, de la valeur courante, du type et de diffrentes balises HTML qui permet une mise
en page agrable.
publ i c St r i ng af f i cher Cpt e( ) {
// Les donnes afficher sont stockes dans une chaine de caractres
St r i ng message = " <BR> Compt e n : " + numr oCpt e + " <br >" ;
message = message + " Type du compt e : " +t ypeCpt e +" <br >" ;
message = message +" Val eur cour ant e : " + val _cour ant e + " &eur o; " ;
// La chaine est transmise la servlet l'aide du return
r et ur n message;
}
Voir galement la zone dans la servlet Pr oj et P3Ch12).
La gestion des erreurs
Corrig
1. Lutilisateur na pas rempli correctement le formulaire HTML. Dans la servlet, vrifier le bon nombre
de paramtres, avant de crer un compte.
Voir la zone dans la servlet Pr oj et P3Ch12.
2. Lutilisateur demande dafficher un compte, alors quil n'en a pas cr. Veillez initialiser un compte
avec des valeurs fictives. De cette faon, lors de laffichage du compte, le test sur lexistence du
compte sera faux. La servlet envoie un message derreur (voir 2 de la section prcdente "afficher un
compte").
Voir la zone dans la servlet Pr oj et P3Ch12.
3. La servlet doit placer en fin page, un lien de retour sur le formulaire CB. ht ml .
Voir la zone dans la servlet Pr oj et P3Ch12.

Вам также может понравиться