Corrige Java
Corrige Java
Corrige Java
Introduction
Naissance d'un programme
Exercice I-1: Apprendre dcomposer une tche en sous-tches distinctes
Corrig
a. Objets ncessaires : 1 tableau, 1 clou, 2 pointes, 1 ficelle, 1 marteau, 1
crayon, 1 mtre.
b.
c.
Prendre le mtre
Mesurer le mur en hauteur ;
Mesurer le mur en largeur ;
Poser le mtre ;
Calculer le centre du mur ;
Prende le crayon ;
Tracer une marque au centre du mur ;
Poser le crayon ;
Prendre le marteau ;
Prendre le clou ;
Enfoncer le clou dans le mur ;
Poser le marteau ;
Prendre le mtre
Mesurer le tableau en hauteur ;
Poser le mtre
Calculer le tiers de la hauteur du tableau ;
Prende le crayon ;
Tracer une marque sur le bord gauche du cadre (face arrire) au tiers de la hauteur ;
Tracer une marque sur le bord droit du cadre (face arrire) au tiers de la hauteur ;
Poser le crayon ;
a.
Reprez les instructions dfinissant la fonction main() : voir trac orange sur le programme cidessus.
Celles dlimitant la classe Premier : voir trac vert sur le programme ci-dessus.
b. Recherchez les instructions daffichage : voir trac jaune sur le programme ci-dessus.
c. Linstruction double 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 Entrer une valeur s'affiche l'cran ;
L'utilisateur tape 10 au clavier et, puis sur la touche Entre ;
Le message Vous avez entre : 10 s'affiche l'cran
Exercice I-3 : Observer et comprendre la structure dun programme Java
Corrig
import java.util.*;
public class Carre{ // Donner un nom la classe
public static void main(String [] argument) {
// Dclaration des variables reprsantant le primtre et le cot
double primtre, ct ;
Scanner lectureClavier = new Scanner(System.in);
// Afficher le message "Valeur du cote : " l'cran
System.out.print("Valeur du cote : ");
c.
f.
j.
float A = 3.5f ;
3.5f
float B = 1.5f ;
3.5f
1.5f
float 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
double A = 0.1 ;
0.1
double B = 1.1 ;
0.1
1.1
double C, D ;
0.1
1.1
B = A ;
0.1
0.1
C = B ;
0.1
0.1
0.1
D = C ;
0.1
0.1
0.1
0.1
A = D
0.1
0.1
0.1
0.1
int a = 5, b ;
b = a + 4 ;
a = a + 1
b = a 4 ;
b.
Instructions
valeur
int valeur = 2 ;
valeur = valeur + 1 ;
valeur = valeur * 2
valeur = valeur % 5;
c.
Instructions
int x = 2, y = 10, z ;
10
z = x + y ;
10
12
x = 5;
10
12
z = z x ;
10
2.
a
int a = 5
int a = 5
int b = 7
int b = 7
a = b
b = a
b = a
a = b
initialisation
a = a + b ;
b = a b;
a = a b ;
i = 16
b. j = 4
c.
i = 5
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)
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
5. * n
5. * 10
50.0f
(n + 1) / n
(10 + 1) / 10
11 / 10
1.7142857f
(n + 1.0) / n
(10 + 1.0) / 10
11.0 / 10
1.1
r + s / t
8 + 7 / 21
8 + 0
b.
r + t / s
8 + 21 / 7
8 + 3
11
(r + t) / s
(8 + 21) / 7
29 / 7
r + t % s
8 + 21 % 7
8 + 0
(r + t) % s
(8 + 21) % 7
29 % 7
r + s / r + s
8 + 7 / 8 + 7
8 + 0 + 7 15
(r + s) / (r + s)
(8 + 7) / ( 8 + 7)
15 / 15
r + s % t
8 + 7 % 2
8 + 7
15
7 / 2
i2 = chiffre / valeur
2 / 7
(int) 3.0f
i2 = (int) f2
(int) 3.5f
(int) 3.5f
i2 = (int) f2
(int) 4.0f
Les deux accolades fermantes situes aprs l'instruction B font que le bloc else instruction C
est rattach au premier if (condition1).
Exercice 3-4 : Construire une arborescence de choix
Corrig
a.
c.
d. Dans chaque bloc if ou else, les instructions de calcul et d'affichage appropries sont les suivantes
:
Le bloc d'instructions I :
System.out.println("tout reel est solution") ;
Le bloc d'instructions II :
System.out.println("il n'y a pas de solution") ;
Le bloc d'instructions IV :
System.out.println("il n'y a pas de solution dans les reels") ;
Le bloc d'instructions V : Attention de bien placer les parenthses pour obtenir un rsultat
cohrent.
x1 = (-b + Math.sqrt(b*b 4*a*c)) / (2*a) ;
x2 = (-b - Math.sqrt(b*b 4*a*c)) / (2*a) ;
System.out.println("il y deux solutions egales a " + x1 + " et " + x2) ;
e.
En insrant l'ensemble des instructions dans la classe SecondDegre et l'intrieur d'une fonction
main(), le programme complet s'crit de la faon suivante :
import java.util.*;
public class SecondDegre {
public static void main (String [] arg)
double a, b, c, delta ;
double x, x1, x2 ;
11 ___________________________ Exercice 3-5 : Manipuler les choix multiples, grer les caractres
Scanner lectureClavier = new Scanner(System.in);
System.out.print("Entrer une valeur pour a : ") ;
a =lectureClavier.nextDouble() ;
System.out.print("Entrer une valeur pour b : ") ;
b =lectureClavier.nextDouble() ;
System.out.print("Entrer une valeur pour c : ") ;
c =lectureClavier.nextDouble() ;
if (a == 0)
if (b == 0)
if (c == 0)
x = -c / b ;
System.out.println("la solution est " + x) ;
}
}
else
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 delta 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.
12 ___________________________ Exercice 3-5 : Manipuler les choix multiples, grer les caractres
public static void main( String [] argument) {
int a, b;
char oprateur;
double calcul = 0;
Scanner lectureClavier = new Scanner(System.in);
// Lire et stocker la premire valeur dans a
System.out.print("Entrer la premiere valeur : ");
a = lectureClavier.nextInt();
// Lire et stocker la premire valeur dans b
System.out.print("Entrer la seconde valeur : ");
b = lectureClavier.nextInt();
// Lire et stocker le signe de lopration dans oprateur
System.out.print("Type de l'operation : (+, -, *, /) : ");
oprateur = lectureClavier.next().charAt(0);
// suivant le signe de lopration
switch (oprateur ) {
// Si cest un +, faire une addition
case '+' : calcul = a + b;
break;
// Si cest un -, faire une soustraction
case '-' : calcul = a - b;
break;
// Si cest un /, faire une division
case '/' : calcul = a / b;
break;
// Si cest une *, faire une multiplication
case '*' : calcul = a * b ;
break;
}
// Afficher le rsultat
System.out.print("Cette operation a pour resultat : ");
System.out.println(a + " " + oprateur + " "+ b + " =" + calcul);
}
}
13 ___________________________ Exercice 3-5 : Manipuler les choix multiples, grer les caractres
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 switch. Examinons la correction :
import java.util.*;
public class Calculette
int a, b;
char oprateur;
double calcul = 0;
// Dfinir et initialiser un boolen true
boolean OK = true;
Scanner lectureClavier = new Scanner(System.in);
System.out.print("Entrer la premiere valeur : ");
a = lectureClavier.nextInt();
System.out.print("Entrer la seconde valeur : ");
b = lectureClavier.nextInt();
System.out.print("Type de l'operation : (+, -, *, /) : ");
oprateur = lectureClavier.next().charAt(0);
switch (oprateur ){
case '+' : calcul = a + b;
break;
case '-' : calcul = a - b;
break;
// Si cest un /, tester la valeur de b
case '/' :
if ( b != 0) calcul = a / b;
// Si b vaut 0, mettre le boolen OK false
else OK = false;
break;
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 false est affecte la variable OK de type boolen
(initialise par dfaut true 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 true, 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 false est aussi affecte la variable OK pour l'tiquette default.
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.
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
initialisation
30
42
c.
do {
r = a % b ;
30
42
30
a = b ;
42
42
30
b = r ;
42
30
30
while (r != 0)
r = a % b ;
42
30
12
a = b ;
30
30
12
b = r ;
30
12
12
while (r != 0)
r = a % b ;
30
12
a = b ;
12
12
b = r ;
12
while (r != 0) ;
r = a % b ;
12
a = b ;
b = r ;
while (r != 0) ;
initialisation
35
do {
r = a % b ;
35
a = b ;
b = r ;
while (r != 0)
R = a % b ;
A = b ;
B = r ;
While (r != 0)
R = a % b ;
A = b ;
B = r ;
While (r != 0) ;
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.
Le programme entre dans la boucle do while 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
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
17 Exercice 4-4 : Comprendre la boucle while, traduire une marche suivre en programme Java
leNombre = leNombre + 1 ;
System.out.print("Entrer une valeur (0 pour sortir) :") ;
valeur =lectureClavier.nextInt() ;
} while (valeur != 0);
System.out.println("La plus grande valeur est : " + laPlusGrande) ;
System.out.println("La plus petite valeur est : " + laPlusPetite) ;
laMoyenne = (float) laSomme / leNombre ;
System.out.println("La moyenne de ces valeurs : " + laMoyenne) ;
} // Fin du main ()
} // Fin de la Class Maximum
Observez qu'une premire valeur est saisie en dehors de la boucle, afin d'initialiser les deux variables
laPlusPetite et laPlusGrande. Ainsi, en initialisant par exemple ces valeurs -1, le programme
peut donner un mauvais 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 (float) devant le calcul de la moyenne. En effet, les deux variables
laSomme et leNombre sont de type entier. Sans ce cast, la division fournit un rsultat entier.
Exercice 4-4 : Comprendre la boucle while, traduire une marche suivre en programme Java
Corrig
Traduction de la marche suivre en Java
a.
b.
Lire un nombre.
nombreLu = lectureClavier.nextInt();
c.
d.
Exercice 4-5 : Comprendre la boucle while, traduire une marche suivre en programme Java
Corrig
Le code source complet :
import java.util.*;
public class Devinette {
public static void main (String [] parametre) {
int i, nombreLu = -1, nbBoucle = 0;
i = (int) (10*Math.random());
Scanner lectureClavier = new Scanner(System.in);
18 Exercice4-6 : Comprendre la boucle while, traduire une marche suivre en programme Java
System.out.print("Ceci est un jeu, j'ai tire un nombre au ");
System.out.println("hasard entre 0 et 10, devinez lequel ? ");
while (nombreLu != i){
System.out.print("Votre choix : ");
nombreLu =lectureClavier.nextInt();
nbBoucle = nbBoucle + 1;
}
System.out.print("Bravo ! ");
System.out.println("vous avez reussi en " + nbBoucle + " fois");
} // Fin du main ()
} // Fin de la Class Devinette
Remarquez l'initialisation de la variable nombreLu 1. En effet, pour tre sr d'entrer dans la boucle
while, la variable nombreLu 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.
Exercice4-6 : Comprendre la boucle while, traduire une marche suivre en programme Java
Corrig
Quelques amliorations :
import java.util.*;
public class Jeu{
public static void main (String [] parametre)
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 : trop grand !
(nbBoucle = 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 : trop grand !
(nbBoucle = 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 : trop petit !
(nbBoucle = 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 : trop grand !
(nbBoucle = 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 : Bravo ! vous avez
reussi en 5 fois.
(nbBoucle = 5)
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.
e.
Instructions
Initialisation
for() {
b = b * i ;
for() {
b = b * i ;
for() {
b = b * i ;
24
for() {
b = b * i ;
120
for() {
b = b * i ;
720
for() {
6
6
6
6
6
Les caractres correspondent en ralit des valeurs numriques (Unicode). Il est donc possible de les
utiliser comme variable de contrle d'une boucle for.
Afficher "Combien de sucre ?" et, saisir le nombre souhait de morceaux de sucre au clavier, mettre
la valeur dans nombreSucre.
b. Tant que le nombre de morceaux de sucre mis dans la boisson chaude ne correspond pas
nombreSucre, 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, nombreSucre.
d. L'algorithme a pour nom sucrer, son paramtre a pour nom : nombre. L'entte de l'algorithme
s'crit : sucrer(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 nombreSucre.
e.
Pour appeler l'algorithme afin qu'il sucre avec le bon nombre de morceaux de sucre :
sucrer(nombreSucre). Ainsi, l'algorithme est excut en remplaant nombre par
nombreSucre.
a.
Le bloc dfinissant la fonction main(): voir trac orange sur le programme ci-dessus.
Le bloc dfinissant la fonction calculer()voir trac vert sur le programme ci-dessus.
Le bloc dfinissant la classe Fonction, voir trac jaune sur le programme ci-dessus.
Les valeurs transmises au paramtre x de la fonction calculer(), lors de son appel depuis la
fonction main() sont celles places dans la variable compteur soit 0, 1, 2, 3, 4 et 5.
f.
0 a 1 a 4 a 9 a 16 a 25 a
22 Exercice 5-4 : Dtecter des erreurs de compilation concernant les paramtres ou le rsultat
d'une fonction
int R, max = f(0);
for (int x = -5; x <= 5; x++) {
R = f(x) ;
System.out.print(R) ;
}
}
c.
Exercice 5-4 : Dtecter des erreurs de compilation concernant les paramtres ou le rsultat d'une fonction
a.
public static void menu (int c) {
switch (c) {...
}
return 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 double.
b. L'entte de la fonction prcise que le rsultat retourn par la fonction max() est de type int alors
que, la variable m effectivement retourne par l'instruction return est dclare de type float.
c.
d. L'entte de la fonction menu() prcise qu'elle est de type void. Le corps de la fonction ne peut
donc pas possder d'instruction return.
Exercice 5-5 : Ecrire une fonction simple
Corrig
a.
c.
Les deux valeurs pouvant modifier le rsultat sont t et nb. Les paramtres de la fonction s'crivent :
d. Le rsultat tant stock dans la variable prct, de type double, la mthode est doit tre de type
double. L'entte de la fonction s'crit donc :
public static double pourcentage(int t, int nb)
e.
b.
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 main() 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 vrifier() 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
a.
Les fonctions de la classe Calculette sont au nombre de quatre et ont pour nom : main(),
afficher(), calculer() et menu()(voir trac orange sur le programme ci-dessus).
b. Lorsque les variables a, b et opration 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 :
c.
Les variables locales la fonction main() sont : a et b (voir trac vert sur le programme cidessus).
Les variables locales la fonction afficher() sont : opration (voir trac vert sur le
programme ci-dessus).
Les variables locales la fonction calculer() sont : opration (voir trac vert sur le
programme ci-dessus).
Les variables locales la fonction menu() sont : opration (voir trac vert sur le programme
ci-dessus).
de la fonction calculer(), 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.
En ralit, ce programme ne peut tre excut puisque la phase de compilation dtecte les erreurs
suivantes :
Calculette.java:16: Variable opration may not have been initialized.
Calculette.java:17: Undefined variable: a
Calculette.java:17: Undefined variable: b
Calculette.java:19: Undefined variable: a
Calculette.java:19: Undefined variable: b
Calculette.java:21: Undefined variable: a
Calculette.java:21: Undefined variable: b
Calculette.java:23: Undefined variable: a
Calculette.java:23: Undefined variable: b
Calculette.java:30: Undefined variable: a
Calculette.java:30: Variable opration may not have been initialized.
Calculette.java:30: Undefined variable: b
Exercice 6-2 : Communiquer des valeurs l'appel d'une fonction
Corrig :
a.
Lorsque les variables rsultat et opration sont dclares comme variable de classe, elles
sont visibles et accessibles depuis toutes les fonctions de la classe Calculette, comme le montre
le schma suivant :
b. Pour que les fonctions calculer() et afficher() connaissent le contenu des variables a et b,
il suffit de passer les valeurs contenues dans ces variables en paramtre des fonctions.
c.
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.
Exercice 6-3 : Transmettre un rsultat la fonction appelante
Corrig :
a.
Les variables rsultat et opration tant dclares localement aux fonctions, il ne peut y
avoir transmission des valeurs (voir correction Exercice 6-1.d) entre les fonctions.
f. et g.
import java.util.*;
public class Exercice3 {
public static void main( String [] argument){
int a, b;
char oprateur;
double calcul;
Scanner lectureClavier = new Scanner(System.in);
oprateur = menu();
System.out.println("Entrer la premiere valeur ");
a = lectureClavier.nextInt();
System.out.println("Entrer la seconde valeur ");
b = lectureClavier.nextInt();
calcul = calculer(a, b, oprateur );
afficher(a, b, oprateur, calcul);
31 __________ Exercice 7-3 et 7.4: Crer une classe dobjets et consulter les variables dinstance
} while ( ! s1.equalsIgnoreCase("FIN") );
System.out.println("Le plus grand mot : " + sPlusGrand) ;
System.out.println("Le plus petit mot : " + sPlusPetit) ;
}
}
byte nbjours = 0 ;
String mois="";
short annee ;
Scanner lectureClavier = new Scanner(System.in);
System.out.println("De quel mois s'agit-il ? :") ;
mois =
lectureClavier.nextLine();
= mois.replace("", "u");
= mois.replace("", "e");
lectureClavier.nextShort();
switch(mois)
: case "octobre" :
case "decembre"
nbjours = 31 ;
break ;
case "avril" : case "juin" :
= 30 ;
break ;
case "fevrier" :
// Pour le cas particulier du mois de fevrier
if (annee % 4 == 0 && annee % 100 != 0 || annee % 400 == 0)
nbjours
else
nbjours
= 29 ;
= 28 ;
32 __________ Exercice 7-4 et 7.5: Crer une classe dobjets et consulter les variables dinstance
break ;
default :
}
System.out.print(" En " + annee + ", le mois de " + mois) ;
System.out.println(" a " + nbjours + " jours ") ;
}
}
Exercice 7-4 et 7.5: Crer une classe dobjets et consulter les variables dinstance
Corrig :
La classe Livre :
import java.util.*;
public class Livre {
// 7.3.a Dfinition des proprits
public String titre;
public String categorie ;
public String isbn ;
public String nomAuteur ;
public String prenomAuteur ;
public String code ;
La classe Bibliotheque :
import java.util.*;
public class Bibliotheque {
public static void main(String [] arg){
Scanner lectureClavier = new Scanner(System.in);
// 7.3.b Dfinition de lobjet livrePoche
Livre livrePoche = new Livre();
// 7.3.b Saisie du titre, pour lobjet livrePoche
System.out.print("Entrez le titre : ");
livrePoche.titre= lectureClavier.next();
// 7.3.b Saisie de la catgorie pour lobjet livrePoche
System.out.print("Entrez la categorie : ");
livrePoche.categorie = lectureClavier.next();
// 7.3.b Saisie du nom de lauteur pour lobjet livrePoche
System.out.print("Entrez le nom de l'auteur : ");
livrePoche.nomAuteur= lectureClavier.next();
// 7.3.b Saisie du prnom de lauteur pour lobjet livrePoche
System.out.print("Entrez le prenom de l'auteur : ");
livrePoche.prenomAuteur= lectureClavier.next();
// 7.3.b Saisie du numro ISBN pour lobjet livrePoche
System.out.print("Entrez le numero ISBN : ");
livrePoche.isbn= lectureClavier.next();
// 7.4.b Affichage des caractritiques de lobjet livrePoche
livrePoche.afficherUnLivre();
// 7.4.d Affichage du code de lobjet livrePoche
System.out.println("code du livre : " + livrePoche.calculerLeCode());
}
}
Le programme correspondant l'application est celui qui contient la fonction main(). Dans cet
exercice, le programme s'appelle FaireDesTriangles.
b. Le type Triangle est dfini par la classe Triangle, dcrite dans le fichier Triangle.java.
c.
Les attributs de la classe Triangle 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 int.
d. Trois mthodes sont dfinies dans la classe Triangle. Elles ont pour nom : crer(),
afficher() et dplacer().
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.
g. La mthode crer() 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.
h. De la mme faon, la mthode dplacer() 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.
Point C : 0 0
Point A :
Entrez l'abscisse : 10
Entrez l'ordonne : 10
Point B :
Entrez l'abscisse : 20
Entrez l'ordonne : 40
Point C :
Entrez l'abscisse : 40
Entrez l'ordonne : 10
Point A : 10 10
Point B : 20 40
Point C : 40 10
Point A : 110 10
Point B : 120 40
Point C : 140 10
Exercice 7-7 et 7.8 : La classe Rectangle et lapplication FaireDesRectangles.java
Corrig
La classe Rectangle :
import java.util.*;
public class Rectangle{
// 7.6.a Dfinition des proprits dun rectangle
public int x, y, couleur, hauteur, largeur ;
// 7.6.b Dfinition de la mthode crer()
public void crer() {
System.out.println("Position en X ");
// 7.7.b Chaque proprit du rectangle est vrifie
x = verifier(0, 800);
System.out.println("Position en Y ");
y = verifier(0, 600);
System.out.println("Couleur ");
couleur = verifier(0, 10);
System.out.println("Hauteur ");
hauteur = verifier(0, 600);
System.out.println("Largeur ");
largeur = verifier(0, 800);
}
// 7.7.a Dfinition de la mthode crer()
publicint verifier(int a, int b) {
int resultat;
La classe FaireDesRectangles :
public class FaireDesRectangles {
public static void main(String[] args) {
Rectangle R= new Rectangle();
R.afficher();
// 7.6.c Les valeurs 200, 200, 150 et 100 sont saisies au clavier
// 7.7.c Les valeurs -10, -5, 20 et 900 ne correspondent pas aux intervalles de
// valeurs demandes, il nest pas possible de crer un tel rectangle
R.crer();
R.afficher();
// 7.6.c Le rectangle se dplace de 200 sur laxe des y
R.deplacer(0, 200);
R.afficher();
}
}
La classe Bibliotheque :
import java.util.*;
public class Bibliotheque {
public static void main(String [] arg){
Scanner lectureClavier = new Scanner(System.in);
// 8.5.b Appel du constructeur par dfaut
Livre livrePoche = new Livre();
// 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
System.out.print("Entrez le titre : ");
livrePoche.setTitre(lectureClavier.next());
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
System.out.print("Entrez la categorie : ");
livrePoche.setCategorie(lectureClavier.next());
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
System.out.print("Entrez le nom de l'auteur : ");
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
livrePoche.setNomAuteur(lectureClavier.next());
System.out.print("Entrez le prenom de l'auteur : ");
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
livrePoche.setPrenomAuteur(lectureClavier.next());
System.out.print("Entrez le numero ISBN : ");
// 8.2.c Modifie la proprit d'un livre par une mthode daccs en criture
8.1 Les proprits titre, categorie, isbn, nomAuteur, prenomAuteur et code sont
dclares en mode priv. Elles ne sont plus accessibles depuis la fonction main(), cette dernire tant
dfinie lextrieur de la classe Livre. Le compilateur dtecte les erreurs :
Variable
titre
Bibliotheque.
in
class
Variable categorie
Bibliotheque.
Variable nomAuteur
Bibliotheque.
Variable prenomAuteur
Bibliotheque.
in
in
Livre
class
class
in
class
not
Livre
Livre
Livre
accessible
not
not
not
accessible
accessible
accessible
from
from
class
class
from
class
from
class
8.2 Voir les commentaires du code source des classes Livre et Bibliotheque ci-avant.
8.2.d
Le calcul du code est ralis automatiquement par la mthode calculerLeCode(). Pour
tre sr que le code soit toujours valide, il ne peut tre ni saisi, ni modifi par lutilisateur. La mthode
calculerLeCode() ne doit pas tre excutable par une autre classe que la classe Livre.
8.3 Voir les commentaires du code source des classes Livre et Bibliotheque ci-avant.
8.4 Voir les commentaires du code source des classes Livre et Bibliotheque ci-avant.
8.5 Voir les commentaires du code source des classes Livre et Bibliotheque ci-avant.
8.5.b
Le constructeur par dfaut Livre() demande la saisie des donnes associes lobjet
livrePoche. 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 Forme (exercice 8-6) :
import java.util.*;
public class Forme implements CalculGeometrique {
// a. Dfinition des proprits en mode protected
C.surface() >=0
) {
R.surface() >=0
) {
redfinies ces dernires sont dfinies en mthode par dfaut dans l'interface
//
Deplacement
super(xx, yy);
// a. Verifier que la vitesse de la voiture ne dpasse pas 100
vitesse = limitation(10, 100);
System.out.println("Je suis une voiture ! ");
System.out.println("Vitesse : " + vitesse);
}
// a. Une voiture se dplace sur l'axe des X
//
x+=vitesse;
System.out.println("x : " + x);
}
// a. Une voiture ne se dplace pas sur l'axe des Y
//
y+=vitesse;
System.out.println("y : " + y);
}
// b. Un ascenceur ne se dplace pas sur l'axe des X
//
x+=vitesse;
System.out.println("x : " + x);
}
// c. Une fuse se dplace sur l'axe des Y
public void deplacementEnY()
y+=vitesse;
System.out.println("y : " + y);
}
} // Fin de la classe Fusee
valeur[i]
valeur.length
Affichage
1+2
i < valeur.length
3+2
i < valeur.length
5+2
i < valeur.length
7+2
i < valeur.length
9+2
i < valeur.length
i = valeur.length
i < 6
affiche valeur[0] = 1
i < 6
affiche valeur[1] = 3
i < 6
affiche valeur[2] = 5
i < 6
affiche valeur[3] = 7
i < 6
affiche valeur[4] = 9
11
i < 6
affiche valeur[5] = 11
i =6
sortie de boucle
sortie de boucle
valeur[0] = 1
valeur = 1
valeur[1] = 3
valeur = 3
valeur[2] = 5
valeur = 5
valeur[3] = 7
valeur = 7
valeur[4] = 9
valeur = 9
valeur[5] = 11
valeur = 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 :
int i = 0 ;
for (int v : valeur) {
System.out.println("valeur [" + i +" ] = " + v);
i++ ;
}
System.out.print(" ");
System.out.print("*");
}
System.out.println();
}
} // Fin de la fonction main()
} // Fin de la classe Exercice4
52 _____ Exercice 9-6 : Pour mieux comprendre le mcanisme des boucles imbriques (for for)
Exercice 9-6 : Pour mieux comprendre le mcanisme des boucles imbriques (for for)
Corrig :
import java.util.*;
public class Exercice6 {
public static void main (String [] parametre) {
int i,j, N = 5;
char C;
Scanner lectureClavier = new Scanner(System.in);
System.out.print("Entrer uncaractere : ");
C = lectureClavier.next().charAt(0);
for (i = 1; i < N; i++){
for (j = 1; j < N; j++){
if (i < j) System.out.print(C);
else System.out.print(" ");
}
}
}
}
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.
i = j
Affichage
affiche un espace
i < j
affiche un !
i < j
affiche un !
i < j
j > N
i > j
affiche un espace
i = j
affiche un espace
i < j
affiche un !
i < j
j > N
i > j
affiche un espace
i > j
affiche un espace
i = j
affiche un espace
i < j
affiche un !
j > N
i > j
affiche un espace
i > j
affiche un espace
i > j
affiche un espace
i = j
affiche un espace
j > N
affiche un !
sortie de boucle
affiche un !
sortie de boucle
sortie de boucle
sortie de boucle
53 _____ Exercice 9-7 : Pour mieux comprendre le mcanisme des boucles imbriques (for for)
Affichage
i > N
sortie de boucle
Affichage
affiche un i = 1
affiche un i = 2
sortie de la boucle interne
3
4
affiche un i = 4
affiche un i = 1
affiche un i = 2
sortie de la boucle interne
3
4
affiche un i = 4
affiche un i = 1
affiche un i = 2
La classe Etudiant
");
");
");
notes[i] = lectureClavier.nextDouble();
}
moyenne = calculMoyenne();
}
public void afficheUnEtudiant()
System.out.print("Les notes
{
de " + prenom + " " + nom + " sont : ");
System.out.println();
System.out.println("Sa moyenne vaut " + moyenne);
}
10.3.b et 10.4.b
La classe Cursus
private ArrayList<Etudiant>
public Cursus()
liste;
max =liste.stream()
10.3.c et 10.4.c
La classe GestionCursus
byte choix = 0 ;
Cursus C = new Cursus();
Scanner lectureClavier = new Scanner(System.in);
do
{
System.out.println("1. Ajoute un etudiant");
System.out.println("2. Affiche la liste des etudiants");
System.out.println("3. Recherche le major de la promotion");
System.out.println("4. Pour sortir");
System.out.print("Votre choix : ");
choix
= lectureClavier.nextByte();
switch (choix) {
case 1 :
C.ajouteUnEtudiant();
break;
case 2 :
C.afficheLesEtudiants();
57 ________________ Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
break;
case 3 :
= lectureClavier.next();
C.memePrenom(nom);
case 4 :
break;
case 5 :
System.exit(0);
default :
System.out.println("Cette option n'existe pas ");
}
} while (choix != 5);
}
}
Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
Corrig
La classe FaireDesListesDeFormes
import java.util.*;
import java.io.IOException;
public class ListeDeFormes{
// 10.5.a Dfinition de la proprit listeFormes (liste de <Forme>)
private ArrayList<Forme> listeFormes;
// 10.5.b Dfinition du constructeur de la liste
public ListeDeFormes() {
listeFormes = new ArrayList<Forme>();
}
// 10.5.c La mthode ajoute une forme la liste
public void ajouterUneForme(char type){
// 10.5.c Si le paramtre vaut 'C', la forme ajoute la liste est un cercle
if (type == 'C') {
listeFormes.add(new Cercle());
}
// 10.5.c Si le paramtre vaut 'T', la forme ajoute la liste est un triangle
else if(type == 'T'){
listeFormes.add(new Triangle());
}
// 10.5.c Dans tous les autres cas, la forme ajoute la liste est un
rectangle
else {
listeFormes.add(new Rectangle());
}
58 ________________ Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
}
// 10.5.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
public void afficherLesFormes() {
int nbFormes = listeFormes.size();
if (nbFormes > 0) {
for (Forme tmp : listeFormes) tmp.afficher();
}
else {
System.out.print("Il n'y a pas de forme dans cette liste ");
}
}
// 10.9.b Parcourt la liste et crit dans un fichier, une ligne par forme
//en utilisant la chane construite par la mthode getInfos()
public void enregistrerLesFormes(Fichier f) throws IOException {
int nbFormes = listeFormes.size();
if (nbFormes > 0) {
String chaine = "";
for (Forme tmp : listeFormes){
tmp.afficher();
chaine = tmp.getInfos();
if (chaine != null)f.ecrire(chaine);
}
}
}
// 10.9.e Lit le fichier ligne par ligne et lenregistre dans la liste
public void lireLesFormes(Fichier f) throws IOException {
String chaine;
String [] mot = {"", "","", "", "","","",""};
char tt;
int cc, xx0, yy0, xx1, yy1, xx2, yy2, ll, hh, rr;
do {
// 10.9.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.lire();
if (mot != null) {
tt = mot[0].charAt(0);
// 10.9.de Si le premier lment du tableau rcupr est un 'C'
if ( tt == 'C') {
// 10.9.d Transformer les autres lments du tableau en entier
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
59 ________________ Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
yy0 = Integer.parseInt(mot[3]);
rr = Integer.parseInt(mot[4]);
// 10.9.e Ajouter la liste un cercle en appelant le constructeur avec
//comme paramtre, les valeurs lues dans le fichier
listeFormes.add(new Cercle( xx0, yy0, rr, cc));
}
// 10.9.d Si le premier lment du tableau rcupr est un 'T'
else if (tt == 'T'){
// 10.9.d Transformer les autres lments du tableau en entier
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
yy0 = Integer.parseInt(mot[3]);
xx1 = Integer.parseInt(mot[4]);
yy1 = Integer.parseInt(mot[5]);
xx2 = Integer.parseInt(mot[6]);
yy2 = Integer.parseInt(mot[7]);
// 10.9.d Ajouter la liste un triangle en appelant le constructeur avec
//comme paramtre, les valeurs lues dans le fichier
listeFormes.add(new Triangle( xx0, yy0, xx1, yy1, xx2, yy2, cc));
}
// 10.9.e Si le premier lment du tableau rcupr est un 'R'
else if( tt == 'R') {
// 10.9.e Transformer les autres lments du tableau en entier
cc = Integer.parseInt(mot[1]);
xx0 = Integer.parseInt(mot[2]);
yy0 = Integer.parseInt(mot[3]);
ll = Integer.parseInt(mot[4]);
hh = Integer.parseInt(mot[5]);
// 10.9.e Ajouter la liste un rectangle en appelant le constructeur
//comme paramtre, les valeurs lues dans le fichier
listeFormes.add(new Rectangle( xx0, yy0, ll, hh, cc));
}
}
} while (mot != null);
}
}
La classe FaireDesListesDeFormes
import java.util.*;
public class FaireDesListesDeFormes {
public static void main(String[] args) throws IOException{
Scanner lectureClavier = new Scanner(System.in);
ListeDeFormes LdF= new ListeDeFormes();
60 ________________ Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
Fichier f = new Fichier();
// 10.9.f Ouvrir le fichier en lecture
if(f.ouvrir("Formes.txt", "Lecture")){
// 10.9.f Si le fichier existe, lire les lignes et stocker les formes dans
//la liste LdF
LdF.lireLesFormes(f);
f.fermer();
}
byte choix = 0;
do{
System.out.println("1. Ajouter un cercle");
System.out.println("2. Ajouter un triangle");
System.out.println("3. Ajouter un rectangle");
System.out.println("4. Afficher la liste");
System.out.println("5. Pour sortir");
System.out.print("Votre choix : ");
choix = lectureClavier.nextByte();
switch(choix) {
// 10.2.e Pour ajouter un cercle
case 1 : LdF.ajouterUneForme('C');
break;
// 10.2.e Pour ajouter un triangle
case 2 : LdF.ajouterUneForme('T');
break;
// 10.2.e Pour ajouter un rectangle
case 3 : LdF.ajouterUneForme('R');
break;
// 10.2.e Afficher la liste des formes
case 4 : LdF.afficherLesFormes();
break;
case 5 :
// 10.9.c Enregistre la liste des formes dans un fichier
f.ouvrir("Formes.txt", "Ecriture");
dF.enregistrerLesFormes(f);
f.fermer();
System.exit(0);
default : System.out.println("Cette option n'existe pas");
}
}while (choix != 5);
}
}
61 ________________ Exercice 10.2, 10-5 et 10-9 : Comprendre les listes et crer des fichiers texte
La valeur retourne par la mthode getInfos()de la classe Forme, doit tre insre dans la chane
construite par les classes fille, comme suit :
d.
La classe Bibliothque
import java.util.*;
public class Bibliotheque {
public static void main(String [] arg){
Scanner lectureClavier = new Scanner(System.in);
byte choix = 0 ;
ListeDeLivres LdL = new ListeDeLivres();
FichierDeLivres F = new FichierDeLivres();
// 10.8.c. Ouvrir le fichier en lecture
if (F.ouvrir("L")) {
// 10.8.c Si le fichier existe, lire les lignes et stocker les formes dans
//la liste LdF
LdL = F.lire();
F.fermer();
}
catch (IOException e){
System.out.println(nomDuFichier+" : Erreur a la fermeture ");
}
}
public void ecrire(Classe tmp) {
try {
if (tmp != null)fWo.writeObject(tmp);
}
catch (IOException e) {
System.out.println(nomDuFichier+" : Erreur en cours d'ecriture ");
}
}
b. L'entte de la fonction main() dfinie dans la classe GestionClasse s'crit nouveau comme
suit :
public static void main (String [] argument)
Il s'agit de la classe Dessin, qui affiche de nouveaux sapins chaque clic sur le bouton nouveau.
b.
setBackground(couleurFond);
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
A = new Arbre(8);
}
public void paint (Graphics g){
A.dessine(g);
}
public void nouveau (){
A = new Arbre((int ) (10*Math.random()+3));
repaint();
}
}
import java.awt.*;
class Arbre {
int [][] sapin ;
public Arbre(int nl) {
int nc = 2*nl-1;
sapin = new int[nl][nc];
int milieu = sapin[0].length/2;
for ( int j = 0 ; j < nl ; j++) {
for ( int i = -j; i <= j; i++) {
sapin[j][milieu+i] = (int ) (5*Math.random()+1);
}
}
}
b. et d.
La classe Boule
import java.awt.*;
public class Boule {
private
71 ____________ Exercice 11-3 : Apprendre grer les vnements (placer une case cocher)
// 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 :
import java.awt.*;
import java.awt.event.*;
public class DesBoutons extends Panel {
public DesBoutons(Dessin d){
setBackground(Color.lightGray);
// 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);
Button bPeindre = new Button ("Nouveau");
bPeindre.addActionListener(new GestionAction(1, d));
this.add(bPeindre);
Button bQuitter = new Button ("Quitter");
bQuitter.addActionListener(new GestionAction(2, d));
this.add(bQuitter);
}
}
d.nouveau(OK);
break;
}
}
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)OK = false;
else OK = true;
}
}
c.
setBackground(couleurFond);
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
A = new Arbre(8);
}
public void paint (Graphics g){
A.dessine(g);
}
public void nouveau (boolean OK){
if (OK) A = new Arbre((int ) (10*Math.random()+3));
else A = new Arbre(8);
repaint();
}
}
Dans la classe DesBoutons sont dfinis les deux boutons A gauche / scene et A gauche /
formes .
Dans la classe DessinFormes 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
GestionAction.
11-5-b :
La mthode dessinerLesFormes() cre une fentre Swing dans laquelle sont placs deux
composants. Un composant contenant les formes gomtriques (f.getContentPane(new
DessinFormes(), "Center") plac au centre de la fentre et un composant contenant les
boutons (f.getContentPane(new DesBouton(), "South"), plac dans le bas de la fentre.
Lappel au constructeur new DesBouton() lintrieur de la mthode getContentPane()
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 addActionListener()). Les paramtres du
constructeur GestionAction() sont diffrents pour chaque couteur afin de diffrencier les
comportement des boutons.
11-5-d :
Dans la classe DesBoutons, lcouteur du bouton aGaucheScene est associ avec laction de
paramtre 1 (new GestionAction(1, df, j)) alors que lcouteur du bouton aGaucheForme
est associ avec laction de paramtre 2 (new GestionAction(2, df, j)). Dans la classe
GestionAction, la mthode actionPerformed() doit reprendre ces deux valeurs pour dplacer
les objets :
La mthode scrit :
public void actionPerformed(ActionEvent e) {
switch (n){
case 1 : d.deplacerGaucheScene();
break;
case 2 : d.deplacerGaucheFormes();
break;
}
}
Pour trouver le sommet le plus gauche, il convient dappeler la mthode trouverLeXMin() dfinie
dans la classe Triangle. Comme cette mthode nest dfinie que dans la classe Triangle et pas dans
la classe Cercle ni dans la classe Rectangle, nous sommes obligs dutiliser le mcanisme du cast.
public void deplacer(int Xref){
int nbFormes = listeFormes.size();
if (nbFormes > 0) {
for (Forme tmp : listeFormes)
if ( tmp instanceof Triangle) {
// Pour tre sr de travailler sur un objet de type Triangle
tmp = (Triangle) tmp;
int decalageEnX = tmp.trouverLeXMin();
tmp.deplacer(Xref - decalageEnX, 0);
}
else tmp.deplacer(Xref-tmp.x,0);
}
}
public void deplacerGaucheScene(){
deplacer(0);
repaint();
}
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 trouverLeXMin(), place dans la
classe DessinFormes, 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.
public int trouverLeXMin(){
int nbFormes = listeFormes.size();
int min = Forme.largeurEcran ;
if (nbFormes > 0) {
for (Forme tmp : listeFormes) {
if (tmp.x < min) min = tmp.x;
Les formes sont ensuites dplaces en appelant la mthode deplacer() de la classe DessinFormes
avec pour paramtre la valeur correspondant la plus petite valeur trouve.
public void deplacerGaucheFormes(){
int Xmin = trouverLeXMin();
deplacer(Xmin);
repaint();
}
decalageX = 0;
84 __________ Exercice 12.9 : Lditeur graphique version 2 - Effacer la dernire forme dessine
Dans la classe Main, crez le gestionnaire dvnements associ au bouton undo, comme suit :
private void undoActionPerformed(java.awt.event.ActionEvent evt) {
// 12.9.b Supprimer la dernire forme stocke dans la liste
// Voir classe ListeDeFormes
liste.supprimerLaDerniereForme();
// Afficher la nouvelle liste
page.dessinerLesFormes(liste);
}
liste.enregistrerLesFormes(f);
f.fermer();
}
le
gestionnaire
dvnements
import java.util.*;
public class ProjetCh4 {
public static void main (String [] argument)
byte choix;
char typeCpte ='\0';
double val_courante = 0.0, taux = 0.0;
long numroCpte = 0, numroLu = 0 ;
Scanner lectureClavier = new Scanner(System.in);
do{
System.out.println("1. Creation d'un compte");
System.out.println("2. Affichage d'un compte");
System.out.println("3. Ecrire une ligne comptable");
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
92 __________________________ Dfinir une fonction (Les fonctions sans paramtre avec rsultat)
case 5 :
System.out.println("Option 1. Pour creer un compte Courant entrer C ");
System.out.println("Pour creer un compte Joint entrer J ");
System.out.println("Pour creer un compte Epargne entrer E");
System.out.print("Puis, entrer le numero du compte, et");
System.out.println(" sa premiere valeur creditee ");
System.out.println(" Dans le cas d'un compte epargne, entrer le taux ");
System.out.println("Option 2. Le systeme affiche les donnees du compte
choisi ");
System.out.println("Option 3. Ecrire une ligne comptable");
System.out.println("Option 4. Pour quitter le programme");
System.out.println("Option 5. Pour afficher de l'aide");
break;
default :
System.out.println("Cette option n'existe pas ");
}
} while (choix != 4);
}
}
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 main(). Cette valeur tant de type byte, la fonction est dfinie galement de type byte.
b.
Le corps de la fonction reprend les instructions d'affichage utilises dans le programme dvelopp
au cours des chapitres prcdents.
byte tmp;
Scanner lectureClavier = new Scanner(System.in);
System.out.println("1. Creation d'un compte");
System.out.println("2. Affichage d'un compte");
System.out.println("3. Ecrire une ligne comptable");
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
System.out.println("Votre choix : ");
tmp= lectureClavier.nextByte();
La variable choix est remplace volontairement par la variable tmp, pour bien les diffrencier. Une
variable choix dclare la fois dans la fonction main() et dans la fonction menuPrincipal()
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 tmp est place dans
une instruction return, comme suit :
return tmp;
b.
Le corps de la fonction sortir() reprend les instructions de sortie de programme utilises dans le
programme dvelopp au cours des chapitres prcdents.
System.out.println("Au revoir et a bientot");
System.exit(0) ;
c.
Tout comme la fonction sortir(), la fonction alAide() ne fournit pas de rsultat, l'entte
s'crit :
public static void alAide( )
d.
Le corps de la fonction alAide() reprend les instructions d'affichage utilises dans le programme
dvelopp au cours des chapitres prcdents.
System.out.println("Option 1. Pour creer un compte Courant entrer C ");
System.out.println("Pour creer un compte Joint entrer J ");
System.out.println("Pour creer un compte Epargne entrer E");
System.out.print("Puis, entrer le numero du compte, et");
System.out.println(" sa premiere valeur creditee ");
System.out.println(" Dans le cas d'un compte epargne, entrer le taux ");
System.out.println("Option 2. Le systeme affiche les donnees du compte choisi ");
System.out.println("Option 3. Ecrire une ligne comptable");
System.out.println("Option 4. Pour quitter le programme");
System.out.println("Option 5. Pour afficher de l'aide");
sortir();
break;
case 5 :
alAide();
break;
default :System.out.println("Cette option n'existe pas ");
}
} while (choix != 4);
}
Variable
val_courante
may
not
have
been
En effet, les variables numroCpte, typeCpte, taux et val_courante sont dclares l'intrieur
de la fonction afficherCpte(). Ce sont donc des variables locales. Les valeurs tant saisies dans la
fonction crerCpte(), aucune valeur n'est place dans les cases mmoire respectives de la fonction
afficherCpte(). L'interprteur ne peut pas raliser d'affichage.
Comprendre la visibilit des variables (Les variables de classe)
Corrig
import java.util.*;
public class ProjetCh6 { // 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 ;
public static void main (String [] argument) {
// b. Aucune variable n'est dclare localement cette fonction
Scanner lectureClavier = new Scanner(System.in);
do {
choix = menuPrincipal();
switch (choix){
case 1 :
do {
System.out.print("Type du compte [Types possibles :" );
System.out.print("C(ourant), J(oint), E(pargne)] :");
typeCpte = lectureClavier.next().charAt(0);
} while ( typeCpte != 'C' && typeCpte != 'J' && typeCpte != 'E');
System.out.print("Numero du compte :");
numroCpte = lectureClavier.nextLong();
System.out.print("Premiere valeur creditee :");
val_courante= lectureClavier.nextDouble();
if (typeCpte == 'E') {
System.out.print("Taux de placement :");
taux = lectureClavier.nextDouble();
}
break;
case 2 :
System.out.print ( " Quel compte souhaitez vous afficher ? : ");
numroLu = lectureClavier.nextLong();
// Affiche le compte
public static void afficherCpte( ){
// b. Aucune variable n'est dclare localement cette fonction
System.out.print("Le compte n : " + numroCpte + " est un compte ");
if (typeCpte == 'C') System.out.println(" courant");
else if (typeCpte == 'J') System.out.println(" joint");
else if (typeCpte == 'E')
System.out.println(" epargnedont le taux est" + taux);
System.out.println("Premiere valeur creditee: " + val_courante);
}
// Affiche le menu principal, retourne la valeur de l'option choisie
public static byte menuPrincipal() {
byte tmp;
Scanner lectureClavier = new Scanner(System.in);
System.out.println("1. Creation d'un compte");
System.out.println("2. Affichage d'un compte");
System.out.println("3. Ecrire une ligne comptable");
System.out.println("4. Sortir");
System.out.println("5. De l'aide");
System.out.println();
System.out.println("Votre choix : ");
tmp= lectureClavier.nextByte();
return tmp;
}
public static void sortir( ) {
System.out.println("Au revoir et a bientot");
System.exit(0) ;
97 ______________ Comprendre la visibilit des variables (Le passage de paramtres par valeur)
}
public static void alAide( ) {
System.out.println("Option 1. Pour creer un compte Courant entrer C ");
System.out.println("Pour creer un compte Joint entrer J ");
System.out.println("Pour creer un compte Epargne entrer E");
System.out.print("Puis, entrer le numero du compte, et");
System.out.println(" sa premiere valeur creditee ");
System.out.println("Dans le cas d'un compte epargne, entrer le taux ");
System.out.println("Option 2. Le systeme affiche les donnees du compte choisi ");
System.out.println("Option 3. Ecrire une ligne comptable");
System.out.println("Option 4. Pour quitter le programme");
System.out.println("Option 5. Pour afficher de l'aide");
}
}
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 crerCpte() doit donc retourner ces quatre
valeurs la fonction main().
b.
Les quatre valeurs sont chacune de type diffrent (long, double ou char). Il n'est donc pas
possible de dterminer le type de la fonction crerCpte(). De plus, l'instruction return ne
peut retourner qu'une seule et unique variable. Il n'est donc pas possible de transmettre le contenu
des quatre variables la fonction main().
c.
b. La mthode crerCpte() est dclare non static, 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 :
public void crerCpte()
char tmp;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Type du compte [Types possibles :" );
System.out.print("C(ourant), J(oint), E(pargne)] :");
tmp = lectureClavier.next().charAt(0);
} while ( tmp != 'C' && tmp!= 'J' && tmp != 'E');
switch (tmp)
byte choix = 0 ;
String numroLu = "";
Scanner lectureClavier = new Scanner(System.in);
// b. Cration d'un objet C de type Compte
Compte
C = new Compte();
do {
choix = menuPrincipal();
switch (choix){
// c. Appeler la mthode crerCpte() par l'intermdiaire de l'objet C
case 1 :
C.crerCpte() ;
break;
case 2 :
System.out.print ( "Quel compte souhaitez vous afficher ? : ");
C.afficherCpte();
else
System.out.println("Le systeme ne connait pas le compte " + numroLu);
break;
case 3 :
sortir();
break;
case 5 :
alAide();
break;
default : System.out.println("Cette option n'existe pas ");
}
} while (choix != 4);
}
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 LigneComptable.
public double valeur;
public String date;
public String motif;
public String mode;
b. La mthode crerLigneComptable():
public void crerLigneComptable() {
Scanner lectureClavier = new Scanner(System.in);
System.out.print("Entrer la valeur crditer (+) ou dbiter (-) : ");
valeur = lectureClavier.nextDouble();
System.out.print("Date de l'opration [jj/mm/an] ");
date = lectureClavier.next();
System.out.print("Motif de l'operation [S(alaire),");
System.out.print(" L(oyer), A(limentation), D(ivers)] : ");
motif =lectureClavier.next();
System.out.print("Mode [C(B), N( Cheque), V(irement ) ]: ");
mode = lectureClavier.next();
}
La mthode afficherLigne() :
public void afficherLigne()
if (valeur < 0)
System.out.print("Dbiter : " + valeur);
else
System.out.print("Crditer : " + valeur);
System.out.println(" le : "+ date +" motif : " + motif + " mode : " + mode);
}
char tmp;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Type du compte [Types possibles :" );
System.out.print("C(ourant), J(oint), E(pargne)] :");
tmp = lectureClavier.next().charAt(0);
} while ( tmp != 'C' && tmp!= 'J' && tmp != 'E');
switch (tmp)
byte choix = 0 ;
String numroLu = "";
Scanner lectureClavier = new Scanner(System.in);
Compte
C = new Compte();
do {
choix = menuPrincipal();
switch (choix){
case 1 :
C.crerCpte() ;
break;
case 2 :
System.out.print ( "Quel compte souhaitez vous afficher ? : ");
numroLu = lectureClavier.next();
if ( numroLu.equalsIgnoreCase(C.numroCpte))
C.afficherCpte();
else
System.out.println("Le systeme ne connait pas le compte " + numroLu);
break;
case 3 :
System.out.print ( "Pour quel compte souhaitez vous crer une ligne ? : ");
numroLu = lectureClavier.next();
if ( numroLu.equalsIgnoreCase(C.numroCpte))
C.crerLigne();
else
System.out.println("Le systeme ne connait pas le compte " + numroLu);
break;
case 4 :
sortir();
break;
case 5 :
alAide();
break;
default : System.out.println("Cette option n'existe pas ");
a.
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 : java.lang.NullPointerException. En effet, la
mthode afficheCpte() fait appel la mthode afficherLigne() par l'intermdiaire d'un
objet ligne qui n'a pas t cr en mmoire. L'objet ligne 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.
import java.util.*;
public class Compte {
public String typeCpte ;
public double val_courante, taux ;
public String numroCpte ;
public LigneComptable ligne;
// Dclaration du drapeau nbLigneRel
public int nbLigneRel ;
public void crerCpte()
char tmp;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Type du compte [Types possibles :" );
System.out.print("C(ourant), J(oint), E(pargne)] : ");
tmp = lectureClavier.next().charAt(0);
} while ( tmp != 'C' && tmp!= 'J' && tmp != 'E');
switch (tmp)
105 ______ Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)
System.out.print("Taux de placement : ");
taux = lectureClavier.nextDouble();
}
System.out.print("Valeur initiale du compte : ");
val_courante = lectureClavier.nextDouble();
// A la cration du compte, aucune ligne comptable n'a t saisie
// donc nbLignRel vaut 0
nbLigneRel = 0;
}
public void crerLigne()
b.
106 ______ Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)
// 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;
}
public void crerCpte()
107 ______ Encapsuler les donnes dun compte bancaire (La protection private et laccs aux
donnes)
nbLigneRel = 1;
val_courante = val_courante + ligne.valeur;
}
publicvoid afficherCpte() {
System.out.print("Le compte n : " + numroCpte );
System.out.println(" est un compte " + typeCpte);
if ( typeCpte.equalsIgnoreCase("Epargne"))
System.out.println(" dont le taux est" + taux);
if (
108 ________________ Encapsuler les donnes dun compte bancaire (Le contrle des donnes)
return date ;
}
public void afficherLigne()
if (valeur < 0)
System.out.print("Dbiter : " + valeur);
else
System.out.print("Crditer : " + valeur);
System.out.println(" le : " + date + " motif: " + motif + " mode : " + mode);
}
}
c.
Dans la classe Projet, seules les instructions faisant appel directement aux donnes de la classe
Compte sont modifier. C'est dire pour les options 2 et 3 :
case 2 :
System.out.print ( "Quel compte souhaitez vous afficher ? : ");
numroLu = lectureClavier.next();
// if ( numroLu.equalsIgnoreCase(C.numroCpte))
// -> numroCpte inaccessible car private dans Compte
if ( numroLu.equalsIgnoreCase(C.quelNumroDeCompte()))
C.afficherCpte();
case 3 :
System.out.print ( "Pour quel compte souhaitez vous crer une ligne ? : ");
numroLu = lectureClavier.next();
if ( numroLu.equalsIgnoreCase(C.quelNumroDeCompte()))
C.crerLigne();
else
System.out.println("Le systeme ne connait pas le compte " + numroLu);
break;
d.
Dans la classe Compte, seules les instructions faisant appel directement aux donnes de la classe
LigneComptable sont modifier. C'est dire pour la mthode crerLigne().
public void crerLigne()
Encapsuler les donnes dun compte bancaire (Le contrle des donnes)
Corrig
a.
La mthode contrleValinit() :
private double contrleValinit() {
double tmp, tmpval;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Valeur initiale du compte : ");
109 ________________ Encapsuler les donnes dun compte bancaire (Le contrle des donnes)
tmpval= lectureClavier.nextDouble();
} while ( tmpval <= 0);
return tmpval;
}
b. La mthode contrleMode() :
private String contrleMode() {
String tmpS = "";
char tmpc ;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Mode [C(B), N( Cheque), V(irement ) ]: ");
tmpc = lectureClavier.next().charAt(0);
} while ( tmpc != 'C' && tmpc != 'N' && tmpc != 'V');
switch (tmpc) {
case 'C' : tmpS = "CB";
break;
case 'N' : tmpS = "Cheque";
break;
case 'V' : tmpS = "Virement";
break;
}
return tmpS;
}
La mthode contrleMotif() :
private String contrleMotif() {
String tmpS = "";
char tmpc ;
Scanner lectureClavier = new Scanner(System.in);
do {
System.out.print("Motif de l'operation [S(alaire),");
System.out.print(" L(oyer), A(limentation), D(ivers)] : ");
tmpc = lectureClavier.next().charAt(0);
} while ( tmpc != 'S' && tmpc != 'L' && tmpc != 'A' && tmpc != 'D');
switch (tmpc) {
case 'S' : tmpS = "Salaire";
break;
case 'L' : tmpS = "Loyer";
break;
case 'A' : tmpS = "Alimentation";
break;
case 'D' : tmpS = "Divers";
break;
110 _____________ Encapsuler les donnes dun compte bancaire (Les constructeurs de classe)
}
return tmpS;
}
c.
La mthode crerCpte() :
public void crerCpte()
La mthode crerLigneComptable() :
public void crerLigneComptable()
111 _____________ Encapsuler les donnes dun compte bancaire (Les constructeurs de classe)
mode = contrleMode();
}
Cette dernire transformation fait que l'interpteur n'excute plus le constructeur par dfaut qui
initialisait automatiquement toutes les donnes du compte 0 ou null 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.
public static void main (String [] argument) {
byte choix = 0 ;
String numroLu = "", vide ="";
Scanner lectureClavier = new Scanner(System.in);
Compte
C ;
do {
choix = menuPrincipal();
switch (choix){
case 1 :
C = new Compte();
break;
// etc..
Malheureusement, ce dplacement est mal peru par le compilateur, ce dernier dtectant une erreur
du type Variable C may not have been initialized. En effet, l'objet C n'est
construit qu'en option 1. Si l'utilisateur choisit l'option 2 avant de crer le compte, l'interprteur sera
dans l'impossibilit de l'afficher, puisqu'il n'existera pas en mmoire.
c.
d. Nous pouvons construire un premier objet C, qui fait appel au constructeur avec paramtre, comme
suit :
public static void main (String [] argument) {
Scanner lectureClavier = new Scanner(System.in);
byte choix = 0 ;
String numroLu = "", vide ="";
Compte
C = new Compte(vide);
do {
choix = menuPrincipal();
switch (choix){
case 1 : C = new Compte();
break;
// etc..
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 null. 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 Compte();
Dans la classe Compte, l'appel au constructeur LigneComptable() est ralis dans la mthode
crerLigne(), comme suit :
public void crerLigne()
return taux;
}
}
return typeCpte;
}
public String quelNumroDeCompte() {
return numroCpte;
}
// b. Suppression de la mthode d'accs en lecture quelTaux()
public double quelleValeurCourante()
return val_courante;
}
public LigneComptable quelleLigneCompable(){
return ligne;
}
private String contrleType()
114 ______________ Comprendre lhritage (Le contrle des donnes dun compte dpargne)
// b. Suppression du case 'E'
}
return tmpS;
}
private double contrleValinit() {
Scanner lectureClavier = new Scanner(System.in);
double tmp, tmpval;
do {
System.out.print("Valeur initiale du compte : ");
tmpval= lectureClavier.nextDouble();
} while ( tmpval <= 0);
return tmpval;
}
public void crerLigne()
C = new CpteEpargne();
C = new Compte();
break;
c.afficherCpte();
byte choix = 0 ;
C.ajouteUnCompte("E") ;
C.ajouteUnCompte("A");
break;
case 2 :
System.out.print ( "Quel compte souhaitez vous afficher ? : ");
numroLu = lectureClavier.next();
// a. rechercher et afficher un compte
C.rechercheUnCompte(numroLu);
break;
case 3 :
// a. afficher tous les comptes
C.afficheLesComptes();
break;
case 4 :
System.out.print("Pour quel compte souhaitez vous crer une ligne ? : ");
numroLu = lectureClavier.next();
// a. ajouter une ligne un compte
C.ajouteUneLigne(numroLu);
break;
case 5 :
System.out.print ( "Quel compte souhaitez vous supprimer ? : ");
numroLu = lectureClavier.next();
// a. supprimer un compte
C.supprimeUnCompte(numroLu);
break;
case 6 :
sortir();
break;
case 7 :
alAide();
break;
default :
}
} while (choix != 6);
return false;
}
}
public void fermer() {
try {
if (mode == 'R' || mode == 'L') fRo.close();
else
}
catch (IOException e){
System.out.println(nomDuFichier+" : Erreur la fermeture ");
}
}
// b. La mthode lire retourne un objet de type ListeCompte
public ListeCompte lire() {
try {
ListeCompte tmp = (ListeCompte) fRo.readObject();
return tmp;
}
catch (IOException e) {
System.out.println(nomDuFichier+" : Erreurde lecture ");
}
catch (ClassNotFoundException e) {
System.out.println(nomDuFichier+" n'est pas du bon format ");
}
return null;
}
// b. La mthode ecrire sauvegarde un objet de type ListeCompte
public void ecrire(ListeCompte tmp) {
try {
if (tmp != null)fWo.writeObject(tmp);
}
catch (IOException e) {
System.out.println(nomDuFichier+" : Erreur en cours d'criture ");
}
}
}
c.
122 La mise en place des dates dans les lignes comptables (Rechercher des mthodes dans les
diffrents packages)
FichierCompte F = new FichierCompte();
if (F.ouvrir("L")) {
C = F.lire();
F.fermer();
}
Ces instructions sont insrer dans le fichier Projet.java, juste avant l'entre dans la boucle
dowhile();
b. La sauvegarde automatique s'effectue l'option 6, comme suit :
case 6 :
System.out.println("Sauvegarde des donnes dans Compte.dat");
F.ouvrir("E");
F.ecrire(C);
F.fermer();
sortir();
break;
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
SimpleDateFormat qui permet la vrification de la validit d'une date. La date est traduite en
objet Date 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 contrleDate())
Corrig
Le contrle de la validit d'une date est ralis de la faon suivante :
private String contrleDate() {
Scanner lectureClavier = new Scanner(System.in);
int nb = 0;
Date d = null;
// Choix du format de la date, le sparateur est le caractre '/'
SimpleDateFormat formatIn=new SimpleDateFormat("dd/MM/yyyy");
String sdate;
// d. Tant que d n'est pas correctement initialise
while (d == null){
try {
System.out.print("Entrer une date (jj/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 = formatIn.parse(lectureClavier.next());
}
c.
new Compte("");
b. La fentre principale :
import java.awt.*;
class Fenetre extends Frame {
public
public
c.
La classe Dessin :
import java.awt.*;
public class Dessin extends Canvas {
private Color couleur = Color.green;
public final static Color couleurFond = Color.white;
public Stat s;
public Dessin(Stat s)
setBackground(couleurFond);
setForeground(couleur);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.s = s;
}
// L'affichage de l'histogramme
public void paint (Graphics g){
s.dessine(g);
}
d. La classe GetsionQuitter :
import java.awt.event.*;
// Gre les couteurs d'vnements de fentres et d'actions
public class GestionQuitter extends WindowAdapter implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
Une fois le numro valid, l'application doit afficher l'histogramme dans une nouvelle fentre. Par
consquent, la classe Saisie s'crit comme suit :
import java.awt.*;
import java.awt.event.*;
public class Saisie implements ActionListener {
ListeCompte lc;
TextField rponse;
public Saisie (ListeCompte tmp_lc) {
// La liste des comptes est pass en paramtre du constructeur
lc = tmp_lc;
// Titre de la fentre de saisie
Frame f = new Frame ("Saisie du n de Compte");
f.setSize(300, 50);
f.setBackground(Color.white);
f.setLayout(new BorderLayout());
// Affichage du texte dans la fentre
f.add (new Label("Numero du compte :"), "West");
rponse = new TextField(10);
f.add(rponse, "East");
rponse.addActionListener(this);
new Compte("");
new Saisie(liste);
}
}
Main
CompteDialogue
LigneDialogue
CompteEdit
LigneEdit
Les
fichiers
associes
se
trouvent
dans
le
rpertoire
Sources/Projet/Chapitre12/NetBeansProjects/EditeurExercice/src/Projet
du CD-Rom livr avec louvrage.
Dfinition des comportements
Corrig :
Dans la classe Main :
// Dfinition des proprits choixAction et numeroCompte
String choixAction = "Creer";
String numeroCompte = " " ;
if(choixAction.equals("Modifier")){
if(choixAction.equals("Editer")){
");
- Double.parseDouble(valeurAsaisir.getText());
");
Double.parseDouble(valeurAsaisir.getText());
");