Exercices en Java (07-Programmation basée sur les objets)

Sébastien ESTIENNE

Ce septième chapitre concerne la programmation basée sur les objets.
Il comporte huit exercices. Le premier exercice illustre la notion de classe et se nomme « Livre ». Le deuxième exercice est une classe portant sur le « Temps ». Les troisième et quatrième exercices sont deux classes faisant appel à quelques notions simples d'arithmétique. Les cinquième et sixième exercices sont des classes portant sur de la géométrie : « Rectangle » et « Point ». Les deux derniers exercices font intervenir la notion d'énumération.

Les principales notions abordées sont les suivantes :

- La notion d'encapsulation ;

- Le masquage des données ;

- Abstraction de données et types de données abstraits ;

- Notion de classe ;

- Constructeur et surcharge de constructeurs ;

- Variables et méthodes d'une classe ;

- Variables et méthodes statiques ;

- Création, modification et suppression d'objets ;

- Accès aux variables d'instances et aux méthodes ;

- Accesseurs et mutateurs ;

- La référence this ;

- Les énumérations (Java 5.0).

Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le Java en rapport avec le chapitre. Pour cela, vous pouvez consulter les tutoriels java de developpez à l'adresse suivante : https://java.developpez.com/cours/

La documentation de l'API sur le site de Sun est aussi une mine d'or : http://java.sun.com/javase/6/docs/api/.

- Titre : Exercices en Java (07-Programmation basée sur les objets)

- Auteur : Sébastien ESTIENNE

- Parution : 24 juillet 2007

- Mise à jour : 28 octobre 2008

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2007 Sébastien ESTIENNE. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Livre

- I-1. Énoncé

- I-2. Aperçu

- I-3. Démonstration

- I-4. Solution

- II. Temps

- II-1. Énoncé

- II-2. Aperçu

- II-3. Démonstration

- II-4. Solution

- III. Complexe

- III-1. Énoncé

- III-2. Aperçu

- III-3. Démonstration

- III-4. Solution

- IV. Rationnel

- IV-1. Énoncé

- IV-2. Aperçu

- IV-3. Démonstration

- IV-4. Solution

- V. Rectangle

- V-1. Énoncé

- V-2. Aperçu

- V-3. Démonstration

- V-4. Solution

- VI. Point

- VI-1. Énoncé

- VI-2. Aperçu

- VI-3. Démonstration

- VI-4. Solution

- VII. Jeu de cartes

- VII-1. Énoncé

- VII-2. Aperçu

- VII-3. Démonstration

- VII-4. Solution

- VIII. Personne

- VIII-1. Énoncé

- VIII-2. Aperçu

- VIII-3. Démonstration

- VIII-4. Solution

- IX. Remerciements

I - Livre

I-1 - Énoncé

Écrivez une classe Livre avec les attributs suivants :

- titre : le titre du livre ;

- auteur : l'auteur du livre ;

- prix : le prix du livre ;

- annee : l'année du livre.

La classe Livre doit disposer des constructeurs suivants :

- Livre() ;

- Livre(titre) ;

- Livre(titre, auteur) ;

- Livre(titre, auteur, prix) ;

- Livre(titre, auteur, prix, annee) ;

- Livre(Livre).

La classe Livre doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Livre.
Écrivez aussi une classe TestLivre afin de tester la classe Livre.

Classes de l'API utilisées :

- java.text.DecimalFormat

- java.awt.BorderLayout

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

I-2 - Aperçu

Aperçu du résultat.

I-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

I-4 - Solution

livre/Livre.java

1. /*

2. * Fichier: Livre.java

3. * Crée le: 13 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.livre;

27. import java.text.DecimalFormat;

31. /**

32. * <p>Classe représentant un livre.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class Livre

36. {

37. /** Le titre du livre. */

38. private String titre;

40. /** L'auteur du livre. */

41. private String auteur;

43. /** Le prix du livre. */

44. private double prix;

46. /** L'année du livre. */

47. private int annee;

50. /**

51. * <p>Constructeur par défaut d'un livre.</p>

52. */

53. public Livre()

54. {

55. this("", "", 0.0, 0);

56. }

59. /**

60. * <p>Constructeur de livre avec un titre spécifié.</p>

61. * @param titre Le titre du livre.

62. */

63. public Livre(String titre)

64. {

65. this(titre, "", 0.0, 0);

66. }

69. /**

70. * <p>Constructeur de livre avec un titre et un auteur spécifiés.</p>

71. * @param titre Le titre du livre.

72. * @param auteur L'auteur du livre.

73. */

74. public Livre(String titre, String auteur)

75. {

76. this(titre, auteur, 0.0, 0);

77. }

80. /**

81. * <p>Constructeur de livre avec un titre, un auteur et un prix spécifiés.</p>

82. * @param titre Le titre du livre.

83. * @param auteur L'auteur du livre.

84. * @param prix Le prix du livre.

85. */

86. public Livre(String titre, String auteur, double prix)

87. {

88. this(titre, auteur, prix, 0);

89. }

92. /**

93. * <p>Constructeur de livre avec un titre, un auteur, un prix et une année spécifiés.</p>

94. * @param titre Le titre du livre.

95. * @param auteur L'auteur du livre.

96. * @param prix Le prix du livre.

97. * @param annee L'année du livre.

98. */

99. public Livre(String titre, String auteur, double prix, int annee)

100. {

101. setTitre(titre);

102. setAuteur(auteur);

103. setPrix(prix);

104. setAnnee(annee);

105. }

108. /**

109. * <p>Constructeur de livre à partir d'un livre existant.</p>

110. * @param livre Un livre.

111. */

112. public Livre(Livre livre)

113. {

114. this(livre.getTitre(), livre.getAuteur(), livre.getPrix(), livre.getAnnee());

115. }

118. /**

119. * <p>Retourne l'année du livre.</p>

120. * @return Renvoie l'année du livre.

121. */

122. public int getAnnee()

123. {

124. return this.annee;

125. }

128. /**

129. * <p>Modifie l'année du livre.</p>

130. * @param annee L'année du livre.

131. */

132. public void setAnnee(int annee)

133. {

134. if(annee < 0)

135. {

136. this.annee = 0;

137. }

138. else

139. {

140. this.annee = annee;

141. }

142. }

145. /**

146. * <p>Retourne l'auteur du livre.</p>

147. * @return Renvoie l'auteur du livre.

148. */

149. public String getAuteur()

150. {

151. return this.auteur;

152. }

155. /**

156. * <p>Modifie l'auteur du livre.</p>

157. * @param auteur L'auteur du livre.

158. */

159. public void setAuteur(String auteur)

160. {

161. this.auteur = auteur;

162. }

165. /**

166. * <p>Retourne le prix du livre.</p>

167. * @return Renvoie le prix du livre.

168. */

169. public double getPrix()

170. {

171. return this.prix;

172. }

175. /**

176. * <p>Modifie le prix du livre.</p>

177. * @param prix Le prix du livre.

178. */

179. public void setPrix(double prix)

180. {

181. if(prix < 0)

182. {

183. this.prix = 0.0;

184. }

185. else

186. {

187. this.prix = prix;

188. }

189. }

192. /**

193. * <p>Retourne le titre du livre.</p>

194. * @return Renvoie le titre du livre.

195. */

196. public String getTitre()

197. {

198. return this.titre;

199. }

202. /**

203. * <p>Modifie le titre du livre.</p>

204. * @param titre Le titre du livre.

205. */

206. public void setTitre(String titre)

207. {

208. this.titre = titre;

209. }

212. /**

213. * <p>Retourne une représentation du livre.</p>

214. * @return Renvoie une représentation du livre.

215. */

216. @Override

217. public String toString()

218. {

219. StringBuilder resultat = new StringBuilder();

220. DecimalFormat dFormat = new DecimalFormat("0.00");

222. resultat.append("Livre : { ");

223. resultat.append("titre : ").append(getTitre()).append("; ");

224. resultat.append("auteur : ").append(getAuteur()).append("; ");

225. resultat.append("prix : ").append(dFormat.format(getPrix())).append(" euros; ");

226. resultat.append("année : ").append(getAnnee());

227. resultat.append(" }");

229. return resultat.toString();

230. }

231. }

livre/TestLivre.java

1. /*

2. * Fichier: TestLivre.java

3. * Crée le: 13 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.livre;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe permettant de tester la classe Livre.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class TestLivre extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public TestLivre()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Livre");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

58. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

60. // Texte de sortie.

61. StringBuilder sortie = new StringBuilder();

63. // Livre 1.

64. Livre livre1 = new Livre();

65. livre1.setTitre("Au coeur de Java 2 - Notions fondamentales");

66. livre1.setAuteur("Cay S. Horstmann");

67. livre1.setPrix(40.0);

68. livre1.setAnnee(2005);

69. sortie.append(livre1).append('\n');

71. // Livre 2.

72. Livre livre2 = new Livre(livre1);

73. livre2.setTitre("Au coeur de Java 2 - Fonctions avancées");

74. livre2.setPrix(45.0);

75. sortie.append(livre2).append('\n');

77. // Livre 3.

78. Livre livre3 = new Livre("Pratique de .NET et C#2", "Patrick SMACCHIA", 50.0);

79. livre3.setAnnee(2005);

80. sortie.append(livre3).append('\n');

82. // Met à jour la zone de sortie.

83. zoneSortie.setText(sortie.toString());

85. // Modifie les propriétés de la fenêtre.

86. setSize(600, 200);

87. setLocation(100, 100);

88. setVisible(true);

89. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

90. }

93. /**

94. * <p>Débute l'exécution du test.</p>

95. * @param args Les paramètres de la ligne de commande.

96. */

97. public static void main(String[] args)

98. {

99. new TestLivre();

100. }

101. }

II - Temps

II-1 - Énoncé

Écrivez une classe Temps avec les attributs suivants :

- heures : De 0 à 23 ;

- minutes : De 0 à 59 ;

- secondes : De 0 à 59.

La classe Temps doit disposer des constructeurs suivants :

- Temps() ;

- Temps(heures) ;

- Temps(heures, minutes) ;

- Temps(heures, minutes, secondes) ;

- Temps(Temps).

La classe Temps doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs.

Elle doit aussi contenir les méthodes :

- ajouterHeures(heures) : ajoute « heures » au temps courant ;

- ajouterMinutes(minutes) : ajoute « minutes » au temps courant ;

- ajouterSecondes(secondes) : ajoute « secondes » au temps courant ;

- toString() : donne une représentation de la classe Temps.

Écrivez aussi une classe TestTemps afin de tester la classe Temps.

Classes de l'API utilisées :

- java.text.DecimalFormat

- java.awt.BorderLayout

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

II-2 - Aperçu

Aperçu du résultat.

II-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

II-4 - Solution

temps/Temps.java

1. /*

2. * Fichier: Temps.java

3. * Crée le: 15 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.temps;

27. import java.text.DecimalFormat;

31. /**

32. * <p>Classe représentant un temps.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class Temps

36. {

37. /** Le nombre d'heures. */

38. private int heures;

40. /** Le nombre de minutes. */

41. private int minutes;

43. /** Le nombre de secondes. */

44. private int secondes;

47. /**

48. * <p>Constructeur par défaut d'un temps.</p>

49. */

50. public Temps()

51. {

52. this(0, 0, 0);

53. }

56. /**

57. * <p>Constructeur de temps avec le nombre d'heures spécifiés.</p>

58. * @param heures Le nombre d'heures.

59. */

60. public Temps(int heures)

61. {

62. this(heures, 0, 0);

63. }

66. /**

67. * <p>Constructeur de temps avec le nombre d'heures et de minutes spécifiés.</p>

68. * @param heures Le nombre d'heures.

69. * @param minutes Le nombre de minutes.

70. */

71. public Temps(int heures, int minutes)

72. {

73. this(heures, minutes, 0);

74. }

77. /**

78. * <p>Constructeur de temps avec le nombre d'heures, de minutes et de secondes spécifiés.</p>

79. * @param heures Le nombre d'heures.

80. * @param minutes Le nombre de minutes.

81. * @param secondes Le nombre de secondes.

82. */

83. public Temps(int heures, int minutes, int secondes)

84. {

85. setHeures(heures);

86. setMinutes(minutes);

87. setSecondes(secondes);

88. }

91. /**

92. * <p>Constructeur de temps à partir d'un temps existant.</p>

93. * @param temps Un temps.

94. */

95. public Temps(Temps temps)

96. {

97. this(temps.getHeures(), temps.getMinutes(), temps.getSecondes());

98. }

101. /**

102. * <p>Retourne le nombre d'heures.</p>

103. * @return Renvoie le nombre d'heures.

104. */

105. public int getHeures()

106. {

107. return this.heures;

108. }

111. /**

112. * <p>Modifie le nombre d'heures.</p>

113. * @param heures Le nombre d'heures.

114. */

115. public void setHeures(int heures)

116. {

117. if(heures < 0 || heures > 23)

118. {

119. this.heures = 0;

120. }

121. else

122. {

123. this.heures = heures;

124. }

125. }

128. /**

129. * <p>Retourne le nombre de minutes.</p>

130. * @return Renvoie le nombre de minutes.

131. */

132. public int getMinutes()

133. {

134. return this.minutes;

135. }

138. /**

139. * <p>Modifie le nombre de minutes.</p>

140. * @param minutes Le nombre de minutes.

141. */

142. public void setMinutes(int minutes)

143. {

144. if(minutes < 0 || minutes >= 60)

145. {

146. this.minutes = 0;

147. }

148. else

149. {

150. this.minutes = minutes;

151. }

152. }

155. /**

156. * <p>Retourne le nombre de secondes.</p>

157. * @return Renvoie le nombre de secondes.

158. */

159. public int getSecondes()

160. {

161. return this.secondes;

162. }

165. /**

166. * <p>Modifie le nombre de secondes.</p>

167. * @param secondes Le nombre de secondes.

168. */

169. public void setSecondes(int secondes)

170. {

171. if(secondes < 0 || secondes >= 60)

172. {

173. this.secondes = 0;

174. }

175. else

176. {

177. this.secondes = secondes;

178. }

179. }

182. /**

183. * <p>Ajoute au temps courant un nombre d'heures.</p>

184. * @param h Le nombre d'heures.

185. */

186. public void ajouterHeures(int h)

187. {

188. setHeures((this.heures + h) % 24);

189. }

192. /**

193. * <p>Ajoute au temps courant un nombre de minutes.</p>

194. * @param m Le nombre de minutes.

195. */

196. public void ajouterMinutes(int m)

197. {

198. ajouterHeures((this.minutes + m) / 60);

199. setMinutes((this.minutes + m) % 60);

200. }

203. /**

204. * <p>Ajoute au temps courant un nombre de secondes.</p>

205. * @param s Le nombre de secondes.

206. */

207. public void ajouterSecondes(int s)

208. {

209. ajouterMinutes((this.secondes + s) / 60);

210. setSecondes((this.secondes + s) % 60);

211. }

214. /**

215. * <p>Retourne une représentation du temps.</p>

216. * @return Renvoie une représentation du temps.

217. */

218. @Override

219. public String toString()

220. {

221. StringBuilder resultat = new StringBuilder();

222. DecimalFormat dFormat = new DecimalFormat("00");

224. resultat.append(dFormat.format(getHeures())).append("h ");

225. resultat.append(dFormat.format(getMinutes())).append("min ");

226. resultat.append(dFormat.format(getSecondes())).append("sec");

228. return resultat.toString();

229. }

230. }

temps/TestTemps.java

1. /*

2. * Fichier: TestTemps.java

3. * Crée le: 15 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.temps;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe permettant de tester la classe Temps.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class TestTemps extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public TestTemps()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Temps");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

58. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

60. // Texte de sortie.

61. StringBuilder sortie = new StringBuilder();

63. // Temps 1.

64. Temps temps1 = new Temps();

65. temps1.setHeures(9);

66. temps1.setMinutes(28);

67. temps1.setSecondes(41);

68. sortie.append("Temps 1 : ").append(temps1).append('\n');

70. // Temps 2.

71. Temps temps2 = new Temps(temps1);

72. temps2.setMinutes(36);

73. sortie.append("Temps 2 : ").append(temps2).append('\n');

75. // Temps 3.

76. Temps temps3 = new Temps(16, 35);

77. temps3.setSecondes(7);

78. sortie.append("Temps 3 : ").append(temps3).append('\n');

80. // Ajout d'heures.

81. temps3.ajouterHeures(12);

82. sortie.append("Temps 3 + 12h : ").append(temps3).append('\n');

84. // Ajout de minutes.

85. temps3.ajouterMinutes(47);

86. sortie.append("Temps 3 + 47min : ").append(temps3).append('\n');

88. // Ajout de secondes.

89. temps3.ajouterSecondes(3055);

90. sortie.append("Temps 3 + 3055sec : ").append(temps3).append('\n');

92. // Met à jour la zone de sortie.

93. zoneSortie.setText(sortie.toString());

95. // Modifie les propriétés de la fenêtre.

96. setSize(600, 200);

97. setLocation(100, 100);

98. setVisible(true);

99. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

100. }

103. /**

104. * <p>Débute l'exécution du test.</p>

105. * @param args Les paramètres de la ligne de commande.

106. */

107. public static void main(String[] args)

108. {

109. new TestTemps();

110. }

111. }

III - Complexe

III-1 - Énoncé

Écrivez une classe Complexe représentant des nombres complexes. Un nombre complexe comporte une partie réelle et une partie imaginaire (partieReelle + partieImaginaire * i avec i = racine(-1)).

La classe a les attributs suivants :

- partieReelle : La partie réelle du nombre ;

- partieImaginaire : La partie imaginaire du nombre.

La classe Complexe doit disposer des constructeurs suivants :

- Complexe() ;

- Complexe(partieReelle, partieImaginaire) ;

- Complexe(Complexe).

La classe Temps doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs.

Elle doit aussi contenir les méthodes :

- ajouter(Complexe) : addition de deux nombres complexes ;

- soustraire(Complexe) : soustraction de deux nombres complexes ;

- toString() : donne une représentation d'un nombre complexe (a+b*i).

Écrivez aussi une classe TestComplexe afin de tester la classe Complexe.

Classes de l'API utilisées :

- java.text.DecimalFormat

- java.awt.BorderLayout

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

III-2 - Aperçu

Aperçu du résultat.

III-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

III-4 - Solution

complexe/Complexe.java

1. /*

2. * Fichier: Complexe.java

3. * Crée le: 15 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.complexe;

27. import java.text.DecimalFormat;

31. /**

32. * <p>Classe représentant un nombre complexe.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class Complexe

36. {

37. /** Partie réelle du nombre complexe. */

38. private double partieReelle;

40. /** Partie imaginaire du nombre complexe. */

41. private double partieImaginaire;

44. /**

45. * <p>Constructeur par défaut d'un nombre complexe.</p>

46. */

47. public Complexe()

48. {

49. this(0.0, 0.0);

50. }

53. /**

54. * <p>Constructeur de nombres complexes avec la partie réelle et la partie imaginaire

55. * spécifiés.</p>

56. * @param partieReelle La partie réelle du nombre complexe.

57. * @param partieImaginaire La partie imaginaire du nombre complexe.

58. */

59. public Complexe(double partieReelle, double partieImaginaire)

60. {

61. setPartieReelle(partieReelle);

62. setPartieImaginaire(partieImaginaire);

63. }

66. /**

67. * <p>Constructeur de nombre complexe à partir d'un nombre complexe existant.</p>

68. * @param complexe Un nombre complexe.

69. */

70. public Complexe(Complexe complexe)

71. {

72. this(complexe.getPartieReelle(), complexe.getPartieImaginaire());

73. }

76. /**

77. * <p>Retourne la partie imaginaire du nombre complexe.</p>

78. * @return Renvoie la partie imaginaire du nombre complexe.

79. */

80. public double getPartieImaginaire()

81. {

82. return this.partieImaginaire;

83. }

86. /**

87. * <p>Modifie la partie imaginaire du nombre complexe.</p>

88. * @param partieImaginaire La partie imaginaire du nombre complexe.

89. */

90. public void setPartieImaginaire(double partieImaginaire)

91. {

92. this.partieImaginaire = partieImaginaire;

93. }

96. /**

97. * <p>Retourne la partie réelle du nombre complexe.</p>

98. * @return Renvoie la partie réelle du nombre complexe.

99. */

100. public double getPartieReelle()

101. {

102. return this.partieReelle;

103. }

106. /**

107. * <p>Modifie la partie réelle du nombre complexe.</p>

108. * @param partieReelle La partie réelle du nombre complexe.

109. */

110. public void setPartieReelle(double partieReelle)

111. {

112. this.partieReelle = partieReelle;

113. }

116. /**

117. * <p>Ajoute au nombre complexe courant, le nombre complexe passé en paramètre.</p>

118. * @param complexe Le nombre complexe à ajouter.

119. */

120. public void ajouter(Complexe complexe)

121. {

122. setPartieReelle(getPartieReelle() + complexe.getPartieReelle());

123. setPartieImaginaire(getPartieImaginaire() + complexe.getPartieImaginaire());

124. }

127. /**

128. * <p>Soustrait au nombre complexe courant, le nombre complexe passé en paramètre.</p>

129. * @param complexe Le nombre complexe à soustraire.

130. */

131. public void soustraire(Complexe complexe)

132. {

133. setPartieReelle(getPartieReelle() - complexe.getPartieReelle());

134. setPartieImaginaire(getPartieImaginaire() - complexe.getPartieImaginaire());

135. }

138. /**

139. * <p>Multiplie le nombre complexe courant par le nombre complexe passé en paramètre.</p>

140. * @param complexe Le nombre complexe à multiplier.

141. */

142. public void multiplier(Complexe complexe)

143. {

144. setPartieReelle(getPartieReelle() * complexe.getPartieReelle()

145. - getPartieImaginaire() * complexe.getPartieImaginaire());

146. setPartieImaginaire(getPartieReelle() * complexe.getPartieImaginaire()

147. + getPartieImaginaire() * complexe.getPartieReelle());

148. }

151. /**

152. * <p>Retourne une représentation du nombre complexe.</p>

153. * @return Renvoie une représentation du nombre complexe.

154. */

155. @Override

156. public String toString()

157. {

158. // Formatteur de nombres.

159. DecimalFormat dFormat = new DecimalFormat();

160. dFormat.setMinimumIntegerDigits(1);

161. dFormat.setMaximumFractionDigits(2);

163. // Construction de la représentation.

164. StringBuilder resultat = new StringBuilder();

166. resultat.append(dFormat.format(getPartieReelle()));

167. if(getPartieImaginaire() >= 0)

168. {

169. resultat.append(" +");

170. }

171. resultat.append(" ");

172. resultat.append(dFormat.format(getPartieImaginaire())).append(" i");

174. return resultat.toString();

175. }

176. }

complexe/TestComplexe.java

1. /*

2. * Fichier: TestComplexe.java

3. * Crée le: 15 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.complexe;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe permettant de tester la classe Complexe.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class TestComplexe extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public TestComplexe()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Complexe");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

58. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

60. // Texte de sortie.

61. StringBuilder sortie = new StringBuilder();

63. // Complexe 1.

64. Complexe complexe1 = new Complexe();

65. complexe1.setPartieReelle(2.4);

66. complexe1.setPartieImaginaire(5.7);

67. sortie.append("Complexe1 : ").append(complexe1).append('\n');

69. // Complexe 2.

70. Complexe complexe2 = new Complexe(3.1, 6.4);

71. sortie.append("Complexe2 : ").append(complexe2).append('\n');

73. // Complexe 3.

74. Complexe complexe3 = new Complexe(complexe2);

75. complexe3.setPartieImaginaire(4.8);

76. sortie.append("Complexe3 : ").append(complexe3).append('\n');

78. // Ajout.

79. complexe3.ajouter(complexe2);

80. sortie.append("Complexe3 + Complexe2 : ").append(complexe3).append('\n');

82. // Soustraction.

83. complexe3.soustraire(complexe1);

84. sortie.append("Complexe3 - Complexe1 : ").append(complexe3).append('\n');

86. // Multiplication.

87. complexe3.multiplier(complexe2);

88. sortie.append("Complexe3 * Complexe2 : ").append(complexe3).append('\n');

90. // Met à jour la zone de sortie.

91. zoneSortie.setText(sortie.toString());

93. // Modifie les propriétés de la fenêtre.

94. setSize(600, 200);

95. setLocation(100, 100);

96. setVisible(true);

97. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

98. }

101. /**

102. * <p>Débute l'exécution du test.</p>

103. * @param args Les paramètres de la ligne de commande.

104. */

105. public static void main(String[] args)

106. {

107. new TestComplexe();

108. }

109. }

IV - Rationnel

IV-1 - Énoncé

Écrivez une classe Rationnel qui définit les nombres rationnels. Les fractions doivent être stockées de manière irréductible.

La classe a les attributs suivants :

- numerateur : Le numérateur ;

- denominateur : Le dénominateur.

La classe Rationnel doit disposer des constructeurs suivants :

- Rationnel() ;

- Rationnel(numerateur, denominateur) ;

- Rationnel(Rationnel).

La classe Rationnel doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs.

Elle doit aussi contenir les méthodes :

- ajouter(Rationnel) : addition de deux nombres rationnels ;

- soustraire(Rationnel) : soustraction de deux nombres rationnels ;

- multiplier(Rationnel) : multiplication de deux nombres rationnels ;

- diviser(Rationnel) : division de deux nombres rationnels ;

- evaluer() : renvoie le résultat sous la forme d'un nombre réel ;

- toString() : donne une représentation du rationnel (a/b).

Écrivez aussi une classe TestRationnel afin de tester la classe Rationnel.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.text.DecimalFormat

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

IV-2 - Aperçu

Aperçu du résultat.

IV-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

IV-4 - Solution

rationnel/Rationnel.java

1. /*

2. * Fichier: Rationnel.java

3. * Crée le: 17 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.rationnel;

27. /**

28. * <p>Classe représentant un rationnel.</p>

29. * @author Sébastien ESTIENNE.

30. */

31. public class Rationnel

32. {

33. /** Le numérateur du nombre rationnel. */

34. private int numerateur;

36. /** Le dénominateur du nombre rationnel. */

37. private int denominateur;

40. /**

41. * <p>Constructeur par défaut d'un nombre rationnel.</p>

42. */

43. public Rationnel()

44. {

45. this(0, 1);

46. }

49. /**

50. * <p>Constructeur de nombres rationnels à partir d'un numérateur et d'un dénominateur

51. * spécifiés.</p>

52. * @param numerateur Le numérateur du nombre rationnel.

53. * @param denominateur Le dénominateur du nombre rationnel.

54. */

55. public Rationnel(int numerateur, int denominateur)

56. {

57. // étant donné que la méthode reduire() est appelée dans le mutateur du numérateur et du

58. // dénominateur, ils ne seront pas utilisés dans le constructeur afin d'éviter de faire

59. // l'appel à cette méthode deux fois.

60. this.numerateur = numerateur;

61. this.denominateur = denominateur;

62. reduire();

63. }

66. /**

67. * <p>Constructeur de nombres rationnels à partir d'un nombre rationnel existant.</p>

68. * @param rationnel Un nombre rationnel.

69. */

70. public Rationnel(Rationnel rationnel)

71. {

72. this(rationnel.getNumerateur(), rationnel.getDenominateur());

73. }

76. /**

77. * <p>Retourne le dénominateur du nombre rationnel.</p>

78. * @return Renvoie le dénominateur du nombre rationnel.

79. */

80. public int getDenominateur()

81. {

82. return this.denominateur;

83. }

86. /**

87. * <p>Modifie le dénominateur du nombre rationnel.</p>

88. * @param denominateur Le dénominateur.

89. */

90. public void setDenominateur(int denominateur)

91. {

92. if(denominateur == 0)

93. {

94. this.denominateur = 1;

95. }

96. else

97. {

98. this.denominateur = denominateur;

99. reduire();

100. }

101. }

104. /**

105. * <p>Retourne le numérateur du nombre rationnel.</p>

106. * @return Renvoie le numérateur du nombre rationnel.

107. */

108. public int getNumerateur()

109. {

110. return this.numerateur;

111. }

114. /**

115. * <p>Modifie le numérateur du nombre rationnel.</p>

116. * @param numerateur Le numérateur.

117. */

118. public void setNumerateur(int numerateur)

119. {

120. this.numerateur = numerateur;

121. reduire();

122. }

125. /**

126. * <p>Déterminer le pgcd (plus grand commun diviseur) de deux nombres.</p>

127. * @param x Le premier nombre.

128. * @param y Le second nombre.

129. * @return Le pgcd de des deux nombres.

130. */

131. private int pgcd(int x, int y)

132. {

133. if(x < 0)

134. {

135. x = -x;

136. }

137. if(y < 0)

138. {

139. y = -y;

140. }

142. while(x != 0 && y != 0)

143. {

144. if(x > y)

145. {

146. x -= y;

147. }

148. else

149. {

150. y -= x;

151. }

152. }

154. if(x != 0)

155. {

156. return x;

157. }

159. return y;

160. }

163. /**

164. * <p>Rend la fraction du nombre irréductible.</p>

165. */

166. private void reduire()

167. {

168. int pgcd = pgcd(getNumerateur(), getDenominateur());

169. this.numerateur = getNumerateur() / pgcd;

170. this.denominateur = getDenominateur() / pgcd;

171. }

174. /**

175. * <p>Ajoute un nombre rationnel au nombre rationnel courant.</p>

176. * @param rationnel Le nombre rationnel à ajouter.

177. */

178. public void ajouter(Rationnel rationnel)

179. {

180. setNumerateur(getNumerateur() * rationnel.getDenominateur() + rationnel.getNumerateur()

181. * getDenominateur());

182. setDenominateur(getDenominateur() * rationnel.getDenominateur());

183. reduire();

184. }

187. /**

188. * <p>Soustrait un nombre rationnel au nombre rationnel courant.</p>

189. * @param rationnel Le nombre rationnel à soustraire.

190. */

191. public void soustraire(Rationnel rationnel)

192. {

193. setNumerateur(getNumerateur() * rationnel.getDenominateur() - rationnel.getNumerateur()

194. * getDenominateur());

195. setDenominateur(getDenominateur() * rationnel.getDenominateur());

196. reduire();

197. }

200. /**

201. * <p>Multiplie un nombre rationnel au nombre rationnel courant.</p>

202. * @param rationnel Le nombre rationnel à multiplier.

203. */

204. public void multiplier(Rationnel rationnel)

205. {

206. setNumerateur(getNumerateur() * rationnel.getNumerateur());

207. setDenominateur(getDenominateur() * rationnel.getDenominateur());

208. reduire();

209. }

212. /**

213. * <p>Divise un nombre rationnel au nombre rationnel courant.</p>

214. * @param rationnel Le nombre rationnel à diviser.

215. */

216. public void diviser(Rationnel rationnel)

217. {

218. setNumerateur(getNumerateur() * rationnel.getDenominateur());

219. setDenominateur(getDenominateur() * rationnel.getNumerateur());

220. reduire();

221. }

224. /**

225. * <p>Evalue la valeur (nombre réel) du nombre rationnel.</p>

226. * @return Retourne une évaluation du nombre rationnel.

227. */

228. public double evaluer()

229. {

230. return getNumerateur() / (double) getDenominateur();

231. }

234. /**

235. * <p>Retourne une représentation du nombre rationnel.</p>

236. * @return Renvoie une représentation du nombre rationnel.

237. */

238. @Override

239. public String toString()

240. {

241. StringBuilder resultat = new StringBuilder();

243. if(getNumerateur() > 0 && getDenominateur() < 0 || getNumerateur() < 0

244. && getDenominateur() > 0)

245. {

246. resultat.append("-");

247. }

248. resultat.append(Math.abs(getNumerateur())).append(" / ").append(Math.abs(getDenominateur()));

250. return resultat.toString();

251. }

252. }

rationnel/TestRationnel.java

1. /*

2. * Fichier: TestRationnel.java

3. * Crée le: 17 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.rationnel;

27. import java.awt.BorderLayout;

28. import java.text.DecimalFormat;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe permettant de tester la classe Rationnel.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class TestRationnel extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

48. /**

49. * <p>Construction de l'application.</p>

50. */

51. public TestRationnel()

52. {

53. // Appel du constructeur de la classe JFrame.

54. super("Rationnel");

56. // Ajoute les composants au conteneur.

57. JTextArea zoneSortie = new JTextArea();

58. zoneSortie.setEditable(false);

59. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

61. // Texte de sortie.

62. StringBuilder sortie = new StringBuilder();

64. // Formateur de nombres.

65. DecimalFormat dFormat = new DecimalFormat();

66. dFormat.setMinimumIntegerDigits(1);

67. dFormat.setMaximumFractionDigits(3);

69. // Rationnel 1.

70. Rationnel rationnel1 = new Rationnel();

71. rationnel1.setNumerateur(5);

72. rationnel1.setDenominateur(12);

73. sortie.append("R1 : ").append(rationnel1).append('\n');

75. // Rationnel 2.

76. Rationnel rationnel2 = new Rationnel(-7, -15);

77. sortie.append("R2 : ").append(rationnel2).append('\n');

79. // Rationnel 3.

80. Rationnel rationnel3 = new Rationnel(rationnel2);

81. rationnel3.setNumerateur(9);

82. sortie.append("R3 : ").append(rationnel3).append('\n');

84. // Ajout.

85. rationnel3.ajouter(rationnel1);

86. sortie.append("R3 + R1 : ").append(rationnel3).append('\n');

88. // Soustraction.

89. rationnel3.soustraire(rationnel2);

90. sortie.append("R3 - R2 : ").append(rationnel3).append('\n');

92. // Multiplication.

93. rationnel3.multiplier(rationnel1);

94. sortie.append("R3 * R1: ").append(rationnel3).append('\n');

96. // Division.

97. rationnel3.diviser(rationnel2);

98. sortie.append("R3 / R2: ").append(rationnel3).append('\n');

100. // Evaluation.

101. sortie.append("eval(R3) : ").append(dFormat.format(rationnel3.evaluer())).append('\n');

103. // Met à jour la zone de sortie.

104. zoneSortie.setText(sortie.toString());

106. // Modifie les propriétés de la fenêtre.

107. setSize(600, 200);

108. setLocation(100, 100);

109. setVisible(true);

110. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

111. }

114. /**

115. * <p>Débute l'exécution du test.</p>

116. * @param args Les paramètres de la ligne de commande.

117. */

118. public static void main(String[] args)

119. {

120. new TestRationnel();

121. }

122. }

V - Rectangle

V-1 - Énoncé

Écrivez une classe Rectangle qui définit un rectangle.

La classe a les attributs suivants :

- longueur : la longueur du rectangle ;

- largeur : la largeur du rectangle.

La classe Rectangle doit disposer des constructeurs suivants :

- Rectangle() ;

- Rectangle(longueur, largeur) ;

- Rectangle(Rectangle).

La classe Rectangle doit contenir des accesseurs (get) et mutateurs (set) qui vérifient que les valeurs sont positives pour les différents attributs.

Elle doit aussi contenir les méthodes :

- perimetre() : calcule le périmètre du rectangle qui est égal à 2 * (longueur + largeur) ;

- aire() : calcule l'aire du rectangle qui est égal à longueur * largeur ;

- isCarre() : vérifie si le rectangle est un carré ;

- toString() : donne une représentation du rectangle.

Écrivez aussi une classe TestRectangle afin de tester la classe Rectangle.

Classes de l'API utilisées :

- java.text.DecimalFormat

- java.awt.BorderLayout

- java.text.DecimalFormat

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

V-2 - Aperçu

Aperçu du résultat.

V-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

V-4 - Solution

rectangle/Rectangle.java

1. /*

2. * Fichier: Rectangle.java

3. * Crée le: 19 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.rectangle;

27. import java.text.DecimalFormat;

31. /**

32. * <p>Classe représentant un rectangle.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class Rectangle

36. {

37. /** Longueur du rectangle. */

38. private double longueur;

40. /** Largeur du rectangle. */

41. private double largeur;

44. /**

45. * <p>Constructeur par défaut d'un rectangle.</p>

46. */

47. public Rectangle()

48. {

49. this(0, 0);

50. }

53. /**

54. * <p>Constructeur de rectangles avec la longueur et la largeur spécifiés.</p>

55. * @param longueur La longueur du rectangle.

56. * @param largeur La largeur du rectangle.

57. */

58. public Rectangle(double longueur, double largeur)

59. {

60. setLongueur(longueur);

61. setLargeur(largeur);

62. }

65. /**

66. * <p>Constructeur de rectangles à partir d'un rectangle existant.</p>

67. * @param rectangle Un rectangle.

68. */

69. public Rectangle(Rectangle rectangle)

70. {

71. this(rectangle.getLongueur(), rectangle.getLargeur());

72. }

75. /**

76. * <p>Calcule le périmètre du rectangle : 2 * (longueur + largeur).</p>

77. * @return Renvoie le périmètre du rectangle.

78. */

79. public double getPerimetre()

80. {

81. return 2 * (getLongueur() + getLargeur());

82. }

85. /**

86. * <p>Calcule l'aire du rectangle : longueur * largeur.</p>

87. * @return Renvoie l'aire du rectangle.

88. */

89. public double getAire()

90. {

91. return getLongueur() * getLargeur();

92. }

95. /**

96. * <p>Vérifie si le rectangle est un carré : longueur = largeur.</p>

97. * @return true si rectangle est un carré, sinon false.

98. */

99. public boolean isCarre()

100. {

101. return getLongueur() == getLargeur();

102. }

105. /**

106. * <p>Retourne la largeur du rectangle.</p>

107. * @return Renvoie la largeur du rectangle.

108. */

109. public double getLargeur()

110. {

111. return this.largeur;

112. }

115. /**

116. * <p>Modifie la largeur du rectangle.</p>

117. * @param largeur La largeur du rectangle.

118. */

119. public void setLargeur(double largeur)

120. {

121. this.largeur = largeur;

122. }

125. /**

126. * <p>Retourne la longueur du rectangle.</p>

127. * @return Renvoie la longueur du rectangle.

128. */

129. public double getLongueur()

130. {

131. return this.longueur;

132. }

135. /**

136. * <p>Modifie la longueur du rectangle.</p>

137. * @param longueur La longueur du rectangle.

138. */

139. public void setLongueur(double longueur)

140. {

141. this.longueur = longueur;

142. }

145. /**

146. * <p>Retourne une représentation du rectangle.</p>

147. * @return Renvoie une représentation du rectangle.

148. */

149. @Override

150. public String toString()

151. {

152. // Formateur de nombres.

153. DecimalFormat dFormat = new DecimalFormat();

154. dFormat.setMinimumIntegerDigits(1);

155. dFormat.setMaximumFractionDigits(2);

157. // Construction de la représentation.

158. StringBuilder resultat = new StringBuilder();

159. resultat.append("Rectangle(").append(dFormat.format(getLongueur())).append(" x ").append(

160. dFormat.format(getLargeur())).append(")");

162. return resultat.toString();

163. }

164. }

rectangle/TestRectangle.java

1. /*

2. * Fichier: TestRectangle.java

3. * Crée le: 19 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.rectangle;

27. import java.awt.BorderLayout;

28. import java.text.DecimalFormat;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe permettant de tester la classe Rectangle.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class TestRectangle extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

48. /**

49. * <p>Construction de l'application.</p>

50. */

51. public TestRectangle()

52. {

53. // Appel du constructeur de la classe JFrame.

54. super("Rectangle");

56. // Ajoute les composants au conteneur.

57. JTextArea zoneSortie = new JTextArea();

58. zoneSortie.setEditable(false);

59. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

61. // Texte de sortie.

62. StringBuilder sortie = new StringBuilder();

64. // Formateur de nombres.

65. DecimalFormat dFormat = new DecimalFormat();

66. dFormat.setMinimumIntegerDigits(1);

67. dFormat.setMaximumFractionDigits(2);

69. // Rectangle 1.

70. Rectangle rectangle1 = new Rectangle();

71. rectangle1.setLongueur(8);

72. rectangle1.setLargeur(5);

73. sortie.append("R1 : ").append(rectangle1).append('\n');

75. // Rectangle 2.

76. Rectangle rectangle2 = new Rectangle(11, 7);

77. sortie.append("R2 : ").append(rectangle2).append('\n');

79. // Rectangle 3.

80. Rectangle rectangle3 = new Rectangle(rectangle2);

81. rectangle3.setLongueur(7);

82. sortie.append("R3 : ").append(rectangle3).append('\n');

84. // Périmètre.

85. double perimetre = rectangle1.getPerimetre();

86. sortie.append("Périmètre de R1 : ").append(dFormat.format(perimetre)).append('\n');

88. // Aire.

89. double aire = rectangle2.getAire();

90. sortie.append("Aire de R2 : ").append(dFormat.format(aire)).append('\n');

92. // Carré.

93. if(rectangle3.isCarre())

94. {

95. sortie.append("Le rectangle 3 est un carré.\n");

96. }

97. else

98. {

99. sortie.append("Le rectangle 3 n'est pas un carré.\n");

100. }

102. // Met à jour la zone de sortie.

103. zoneSortie.setText(sortie.toString());

105. // Modifie les propriétés de la fenêtre.

106. setSize(600, 200);

107. setLocation(100, 100);

108. setVisible(true);

109. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

110. }

113. /**

114. * <p>Débute l'exécution du test.</p>

115. * @param args Les paramètres de la ligne de commande.

116. */

117. public static void main(String[] args)

118. {

119. new TestRectangle();

120. }

121. }

VI - Point

VI-1 - Énoncé

Écrivez une classe Point qui définit un point.

La classe a les attributs suivants :

- x : l'abscisse du point ;

- x : l'ordonnée du point.

La classe Point doit disposer des constructeurs suivants :

- Point() ;

- Point(x, y) ;

- Point(Point).

La classe Point doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs.

Elle doit aussi contenir les méthodes :

- distance(x, y) : calcule la distance entre deux points ;

- distance(Point) : calcule la distance entre deux points ;

- distance(x1, y1, x2, y2) : calcule la distance entre deux points ;

- deplacer(x, y) : déplace le point ;

- translater(dx, dy) : translate le point ;

- toString() : donne une représentation du point.

Écrivez aussi une classe TestPoint afin de tester la classe Point.

Classes de l'API utilisées :

- java.text.DecimalFormat

- java.awt.BorderLayout

- java.text.DecimalFormat

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

VI-2 - Aperçu

Aperçu du résultat.

VI-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VI-4 - Solution

point/Point.java

1. /*

2. * Fichier: Point.java

3. * Crée le: 19 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.point;

27. import java.text.DecimalFormat;

31. /**

32. * <p>Classe représentant un point.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class Point

36. {

37. /** Abscisse du point. */

38. private double x;

40. /** Ordonnée du point. */

41. private double y;

44. /**

45. * <p>Constructeur par défaut d'un point.</p>

46. */

47. public Point()

48. {

49. this(0, 0);

50. }

53. /**

54. * <p>Constructeur de points avec l'abscisse et l'ordonnée spécifiées.</p>

55. * @param x L'abscisse du point.

56. * @param y L'ordonnée du point.

57. */

58. public Point(double x, double y)

59. {

60. setX(x);

61. setY(y);

62. }

65. /**

66. * <p>Constructeur de points à partir d'un point existant.</p>

67. * @param point Un point.

68. */

69. public Point(Point point)

70. {

71. this(point.x, point.y);

72. }

75. /**

76. * <p>Calcule la distance par rapport à un autre point.</p>

77. * @param pX L'abscisse du point.

78. * @param pY L'ordonnée du point.

79. * @return Renvoie la distance par rapport à un autre point.

80. */

81. public double getDistance(double pX, double pY)

82. {

83. return Point.getDistance(getX(), getY(), pX, pY);

84. }

87. /**

88. * <p>Calcule la distance par rapport à un autre point.</p>

89. * @param point Le point.

90. * @return Renvoie la distance par rapport à un autre point.

91. */

92. public double getDistance(Point point)

93. {

94. return Point.getDistance(getX(), getY(), point.getX(), point.getY());

95. }

98. /**

99. * <p>Calcule la distance entre deux points.</p>

100. * @param x1 L'abscisse du premier point.

101. * @param y1 L'ordonnée du premier point.

102. * @param x2 L'abscisse du second point.

103. * @param y2 L'ordonnée du second point.

104. * @return Renvoie la distance par rapport à un autre point.

105. */

106. public static double getDistance(double x1, double y1, double x2, double y2)

107. {

108. return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));

109. }

112. /**

113. * <p>Déplace le point.</p>

114. * @param pX La nouvelle abscisse du point.

115. * @param pY La nouvelle ordonnée du point.

116. */

117. public void deplacer(double pX, double pY)

118. {

119. setX(pX);

120. setY(pY);

121. }

124. /**

125. * <p>Translate le point.</p>

126. * @param dx La translation suivant l'axe x.

127. * @param dy La translation suivant l'axe y.

128. */

129. public void translater(double dx, double dy)

130. {

131. setX(getX() + dx);

132. setY(getY() + dy);

133. }

136. /**

137. * <p>Retourne l'abscisse du point.</p>

138. * @return Renvoie l'abscisse du point.

139. */

140. public double getX()

141. {

142. return this.x;

143. }

146. /**

147. * <p>Modifie l'abscisse du point.</p>

148. * @param x L'abscisse du point.

149. */

150. public void setX(double x)

151. {

152. this.x = x;

153. }

156. /**

157. * <p>Retourne l'ordonnée du point.</p>

158. * @return Renvoie l'ordonnée du point.

159. */

160. public double getY()

161. {

162. return this.y;

163. }

166. /**

167. * <p>Modifie l'ordonnée du point.</p>

168. * @param y L'ordonnée du point.

169. */

170. public void setY(double y)

171. {

172. this.y = y;

173. }

176. /**

177. * <p>Retourne une représentation du point.</p>

178. * @return Renvoie une représentation du point.

179. */

180. @Override

181. public String toString()

182. {

183. // Formateur de nombres.

184. DecimalFormat dFormat = new DecimalFormat();

185. dFormat.setMinimumIntegerDigits(1);

186. dFormat.setMaximumFractionDigits(2);

188. // Construction de la représentation.

189. StringBuilder resultat = new StringBuilder();

190. resultat.append("Point(").append(dFormat.format(getX())).append("; ").append(

191. dFormat.format(getY())).append(")");

193. return resultat.toString();

194. }

195. }

point/TestPoint.java

1. /*

2. * Fichier: TestPoint.java

3. * Crée le: 19 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.point;

27. import java.awt.BorderLayout;

28. import java.text.DecimalFormat;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe permettant de tester la classe Point.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class TestPoint extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

48. /**

49. * <p>Construction de l'application.</p>

50. */

51. public TestPoint()

52. {

53. // Appel du constructeur de la classe JFrame.

54. super("Point");

56. // Ajoute les composants au conteneur.

57. JTextArea zoneSortie = new JTextArea();

58. zoneSortie.setEditable(false);

59. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

61. // Texte de sortie.

62. StringBuilder sortie = new StringBuilder();

64. // Formateur de nombres.

65. DecimalFormat dFormat = new DecimalFormat();

66. dFormat.setMinimumIntegerDigits(1);

67. dFormat.setMaximumFractionDigits(2);

69. // Point 1.

70. Point point1 = new Point();

71. point1.setX(2.7);

72. point1.setY(5.8);

73. sortie.append("P1 : ").append(point1).append('\n');

75. // Point 2.

76. Point point2 = new Point(1.6, 6.3);

77. sortie.append("P2 : ").append(point2).append('\n');

79. // Point 3.

80. Point point3 = new Point(point2);

81. point3.setX(4.1);

82. sortie.append("P3 : ").append(point3).append('\n');

84. // Distance x3.

85. double d1 = point3.getDistance(point1);

86. sortie.append("Dist(P1-P3) : ").append(dFormat.format(d1)).append('\n');

88. double d2 = point3.getDistance(point2.getX(), point2.getY());

89. sortie.append("Dist(P2-P3) : ").append(dFormat.format(d2)).append('\n');

91. double d3 = Point.getDistance(2.3, 4.2, -6.9, 3.7);

92. sortie.append("Dist : ").append(dFormat.format(d3)).append('\n');

94. // Déplacer.

95. point3.deplacer(-5.1, 4.7);

96. sortie.append("Depl(P3) : ").append(point3).append('\n');

98. // Translater.

99. point3.translater(1.2, -0.7);

100. sortie.append("Transl(P3) : ").append(point3).append('\n');

102. // Met à jour la zone de sortie.

103. zoneSortie.setText(sortie.toString());

105. // Modifie les propriétés de la fenêtre.

106. setSize(600, 200);

107. setLocation(100, 100);

108. setVisible(true);

109. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

110. }

113. /**

114. * <p>Débute l'exécution du test.</p>

115. * @param args Les paramètres de la ligne de commande.

116. */

117. public static void main(String[] args)

118. {

119. new TestPoint();

120. }

121. }

VII - Jeu de cartes

VII-1 - Énoncé

Écrivez une classe Carte avec les éléments suivants :

- Enumération Rang : AS, ROI…, 3, 2 ;

- Enumération Couleur : Pique, Cœur, Carreau, Trèfle ;

- rang : le rang de la carte ;

- couleur : la couleur de la carte.

La classe Carte doit disposer du constructeur suivant :

- Carte(Rang, Couleur).

La classe Carte doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Carte.

Écrivez une deuxième classe Paquet avec les attributs suivants :

- cartes : tableau de cartes.

La classe Paquet doit disposer d'un constructeur par défaut initialisant le paquet de cartes et le mélangeant. Cette classe doit aussi disposer des méthodes suivantes :

- melanger() : mélange le paquet de cartes ;

- getNombreDeCartes() : retourne le nombre de cartes du paquet ;

- piocher(n) : renvoie les n premières cartes du paquet.

Écrivez aussi une classe TestJeuDeCartes afin de tester les classes Carte et Paquet.

Classes de l'API utilisées :

- java.util.Arrays

- java.util.Random

- java.awt.BorderLayout

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

VII-2 - Aperçu

Aperçu du résultat.

VII-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VII-4 - Solution

jeudecartes/Carte.java

1. /*

2. * Fichier: Carte.java

3. * Crée le: 21 septembre 2008.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.jeudecartes;

27. /**

28. * <p>Classe représentant une carte de jeu.</p>

29. * @author Sébastien ESTIENNE.

30. */

31. public class Carte

32. {

33. /** Rang de la carte. */

34. @SuppressWarnings("all")

35. public enum Rang

36. {

37. DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF, DIX, VALET, DAME, ROI, AS

38. }

40. /** Couleur de la carte. */

41. @SuppressWarnings("all")

42. public enum Couleur

43. {

44. PIQUE, COEUR, CARREAU, TREFLE

45. }

47. /** Le rang de la carte. */

48. private Rang rang;

50. /** La couleur de la carte. */

51. private Couleur couleur;

54. /**

55. * <p>Constructeur de carte.</p>

56. * @param rang Le rang de la carte.

57. * @param couleur La couleur de la carte.

58. */

59. public Carte(Rang rang, Couleur couleur)

60. {

61. this.rang = rang;

62. this.couleur = couleur;

63. }

66. /**

67. * <p>Retourne le rang de la carte.</p>

68. * @return Renvoie le rang de la carte.

69. */

70. public Rang getRang()

71. {

72. return this.rang;

73. }

76. /**

77. * <p>Retourne la couleur de la carte.</p>

78. * @return Renvoie la couleur de la carte.

79. */

80. public Couleur getCouleur()

81. {

82. return this.couleur;

83. }

86. /**

87. * <p>Retourne une représentation de la carte.</p>

88. * @return Renvoie une représentation de la carte.

89. */

90. @Override

91. public String toString()

92. {

93. return this.rang + " de " + this.couleur;

94. }

95. }

jeudecartes/Paquet.java

1. /*

2. * Fichier: Paquet.java

3. * Crée le: 11 octobre 2008.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

22. package chapitre7.jeudecartes;

26. import java.util.Arrays;

27. import java.util.Random;

29. import chapitre7.jeudecartes.Carte.Couleur;

30. import chapitre7.jeudecartes.Carte.Rang;

34. /**

35. * <p>Classe représentant un jeu de cartes.</p>

36. * @author Sébastien ESTIENNE.

37. */

38. public class Paquet

39. {

40. /** Paquet de cartes. */

41. private Carte[] cartes;

43. /** Nombre d'itérations pour mélanger les cartes. */

44. private static final int NB_ITERATIONS = 3;

47. /**

48. * Constructeur.

49. */

50. public Paquet()

51. {

52. // Initialisation des cartes du paquet.

53. this.cartes = new Carte[Rang.values().length * Couleur.values().length];

54. for(int i = 0; i < Couleur.values().length; i++)

55. {

56. for(int j = 0; j < Rang.values().length; j++)

57. {

58. this.cartes[i * Rang.values().length + j] = new Carte(Rang.values()[j], Couleur

59. .values()[i]);

60. }

61. }

63. // Mélange le jeu de cartes.

64. melanger();

65. }

68. /**

69. * <p>Mélange les cartes du paquet.</p>

70. */

71. private void melanger()

72. {

73. Random r = new Random();

74. for(int i = 0; i < NB_ITERATIONS; i++)

75. {

76. for(int j = 0; j < this.cartes.length; j++)

77. {

78. echanger(r.nextInt(this.cartes.length), r.nextInt(this.cartes.length));

79. }

80. }

81. }

84. /**

85. * <p>Echange deux cartes d'un paquet.</p>

86. * @param i L'indice de la première carte à échanger.

87. * @param j L'indice de la seconde carte à échanger.

88. */

89. private void echanger(int i, int j)

90. {

91. Carte temp;

92. temp = this.cartes[i];

93. this.cartes[i] = this.cartes[j];

94. this.cartes[j] = temp;

95. }

98. /**

99. * <p>Renvoie le nombre de cartes disponibles.</p>

100. * @return Retourne le nombre de cartes disponibles.

101. */

102. public int getNombreDeCartes()

103. {

104. return this.cartes.length;

105. }

108. /**

109. * <p>Renvoie un tableau des cartes piochées.</p>

110. * @param n Le nombre de cartes piochées.

111. * @return Retourne un tableau des cartes piochées ou null s'il n'y a plus assez de cartes dans

112. *         le paquet.

113. */

114. public Carte[] piocher(int n)

115. {

116. if(n <= this.cartes.length)

117. {

118. Carte[] main = Arrays.copyOfRange(this.cartes, 0, n - 1);

119. this.cartes = Arrays.copyOfRange(this.cartes, n, this.cartes.length - 1);

121. return main;

122. }

124. return null;

125. }

126. }

jeudecartes/TestJeuDeCartes.java

1. /*

2. * Fichier: TestJeuDeCartes.java

3. * Crée le: 21 septembre 2008.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

22. package chapitre7.jeudecartes;

24. import java.awt.BorderLayout;

26. import javax.swing.JFrame;

27. import javax.swing.JScrollPane;

28. import javax.swing.JTextArea;

32. /**

33. * <p>Classe permettant de tester les classes Carte et PAquet.</p>

34. * @author Sébastien ESTIENNE.

35. */

36. public class TestJeuDeCartes extends JFrame

37. {

38. /**

39. * <p>Serial version UID.</p>

40. */

41. private static final long serialVersionUID = 1L;

44. /**

45. * <p>Construction de l'application.</p>

46. */

47. public TestJeuDeCartes()

48. {

49. // Appel du constructeur de la classe JFrame.

50. super("JeuDeCartes");

52. // Ajoute les composants au conteneur.

53. JTextArea zoneSortie = new JTextArea();

54. zoneSortie.setEditable(false);

55. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

57. // Texte de sortie.

58. StringBuilder sortie = new StringBuilder();

60. // Construction du paquet de cartes.

61. Paquet paquet = new Paquet();

63. // Pioche 5 cartes.

64. sortie.append("Pioche 5 cartes : \n");

65. Carte[] main = paquet.piocher(5);

66. if(main != null)

67. {

68. for(int i = 0; i < main.length; i++)

69. {

70. sortie.append("- ").append(main[i]).append("\n");

71. }

72. }

73. else

74. {

75. sortie.append("Le nombre de cartes dans le paquet est insuffisant!\n");

76. }

78. // Essaie de piocher 50 cartes.

79. sortie.append("Pioche 50 cartes : \n");

80. main = paquet.piocher(50);

81. if(main != null)

82. {

83. for(int i = 0; i < main.length; i++)

84. {

85. sortie.append("- ").append(main[i]).append("\n");

86. }

87. }

88. else

89. {

90. sortie.append("Le nombre de cartes dans le paquet est insuffisant!\n");

91. }

93. // Nombre de cartes.

94. int nbCartes = paquet.getNombreDeCartes();

95. sortie.append("Nombre de cartes restantes dans le paquet : ");

96. sortie.append(nbCartes);

98. // Met à jour la zone de sortie.

99. zoneSortie.setText(sortie.toString());

101. // Modifie les propriétés de la fenêtre.

102. setSize(600, 200);

103. setLocation(100, 100);

104. setVisible(true);

105. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

106. }

108. /**

109. * <p>Débute l'exécution du test.</p>

110. * @param args Les paramètres de la ligne de commande.

111. */

112. public static void main(String[] args)

113. {

114. new TestJeuDeCartes();

115. }

116. }

VIII - Personne

VIII-1 - Énoncé

Écrivez une classe Personne avec les attributs suivants :

- nom : le nom de famille de la personne ;

- prenom : le prénom de la personne ;

- age : l'âge de la personne compris entre 0 et 130 ans ;

- sexe : Masculin ou Féminin.

La classe Personne doit disposer des constructeurs suivants :

- Personne() ;

- Personne(nom, prenom) ;

- Personne(nom, prenom, age) ;

- Personne(nom, prenom, age, sexe) ;

- Personne(Personne).

La classe Personne doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Personne.
Écrivez aussi une classe TestPersonne afin de tester la classe Personne.

Classes de l'API utilisées :

- java.awt.BorderLayout

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

VIII-2 - Aperçu

Aperçu du résultat.

VIII-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VIII-4 - Solution

personne/TSexe.java

1. /*

2. * Fichier: TSexe.java

3. * Crée le: 26 décembre 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.personne;

25. /**

26. * <p>Le type Sexe.</p>

27. */

28. public enum TSexe

29. {

30. /**

31. * <p>Sexe: Masculin.</p>

32. */

33. Masculin("Masculin"),

35. /**

36. * <p>Sexe: Féminin.</p>

37. */

38. Feminin("Féminin");

40. /** Nom du type. */

41. private String etiquette;

44. /**

45. * <p>Constructeur.</p>

46. * @param etiquette Le nom du type.

47. */

48. TSexe(String etiquette)

49. {

50. this.etiquette = etiquette;

51. }

54. /**

55. * <p>Retourne l'étiquette du type.</p>

56. * @return Renvoie l'étiquette du type.

57. */

58. public String getEtiquette()

59. {

60. return this.etiquette;

61. }

62. }

personne/Personne.java

1. /*

2. * Fichier: Personne.java

3. * Crée le: 14 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.personne;

27. /**

28. * <p>Classe représentant une personne.</p>

29. * @author Sébastien ESTIENNE.

30. */

31. public class Personne

32. {

33. /** Nom de la personne. */

34. private String nom;

36. /** Prénom de la personne. */

37. private String prenom;

39. /** Age de la personne. */

40. private Integer age;

42. /** Sexe de la personne. */

43. private TSexe sexe;

45. /** Age minimum. */

46. private static final int AGE_MIN = 0;

48. /** Age maximum. */

49. private static final int AGE_MAX = 130;

52. /**

53. * <p>Constructeur par défaut d'une personne.</p>

54. */

55. public Personne()

56. {

57. this(null, null, null, TSexe.Masculin);

58. }

61. /**

62. * <p>Constructeur de personne avec un nom et un prénom spécifiés.</p>

63. * @param nom Le nom de la personne.

64. * @param prenom Le prénom de la personne.

65. */

66. public Personne(String nom, String prenom)

67. {

68. this(nom, prenom, 0, TSexe.Masculin);

69. }

72. /**

73. * <p>Constructeur de personne avec un nom, un prénom et un âge spécifiés.</p>

74. * @param nom Le nom de la personne.

75. * @param prenom Le prénom de la personne.

76. * @param age L'âge de la personne.

77. */

78. public Personne(String nom, String prenom, Integer age)

79. {

80. this(nom, prenom, age, TSexe.Masculin);

81. }

84. /**

85. * <p>Constructeur de personne avec un nom, un prénom, un âge et un sexe spécifiés.</p>

86. * @param nom Le nom de la personne.

87. * @param prenom Le prénom de la personne.

88. * @param age L'âge de la personne.

89. * @param sexe Le sexe de la personne.

90. * @throws IllegalArgumentException Si l'âge de la personne est incorrect.

91. */

92. public Personne(String nom, String prenom, Integer age, TSexe sexe) throws IllegalArgumentException

93. {

94. setNom(nom);

95. setPrenom(prenom);

96. setAge(age);

97. setSexe(sexe);

98. }

101. /**

102. * <p>Constructeur de personne à partir d'une personne existante.</p>

103. * @param personne Une personne.

104. */

105. public Personne(Personne personne)

106. {

107. this(personne.getNom(), personne.getPrenom(), personne.getAge(), personne.getSexe());

108. }

111. /**

112. * <p>Retourne l'âge de la personne.</p>

113. * @return Renvoie l'âge de la personne.

114. */

115. public Integer getAge()

116. {

117. return this.age;

118. }

121. /**

122. * <p>Modifie l'âge de la personne.</p>

123. * @param age L'âge de la personne.

124. * @throws IllegalArgumentException Si l'âge de la personne est incorrect.

125. */

126. public void setAge(Integer age) throws IllegalArgumentException

127. {

128. if(age != null && (age < AGE_MIN || age > AGE_MAX))

129. {

130. StringBuilder message = new StringBuilder();

131. message.append(age);

132. message.append(" est un âge incorrect. Il doit être compris entre ");

133. message.append(AGE_MIN);

134. message.append(" et ");

135. message.append(AGE_MAX);

136. message.append(".");

138. throw new IllegalArgumentException(message.toString());

139. }

141. this.age = age;

142. }

145. /**

146. * <p>Retourne le nom de la personne.</p>

147. * @return Renvoie le nom de la personne.

148. */

149. public String getNom()

150. {

151. return this.nom;

152. }

155. /**

156. * <p>Modifie le nom de la personne.</p>

157. * @param nom Le nom de la personne.

158. */

159. public void setNom(String nom)

160. {

161. this.nom = nom;

162. }

165. /**

166. * <p>Retourne le prénom de la personne.</p>

167. * @return Renvoie le prénom de la personne.

168. */

169. public String getPrenom()

170. {

171. return this.prenom;

172. }

175. /**

176. * <p>Modifie le prénom de la personne.</p>

177. * @param prenom Le prénom de la personne.

178. */

179. public void setPrenom(String prenom)

180. {

181. this.prenom = prenom;

182. }

185. /**

186. * <p>Retourne le sexe de la personne.</p>

187. * @return Renvoie le sexe de la personne.

188. */

189. public TSexe getSexe()

190. {

191. return this.sexe;

192. }

195. /**

196. * <p>Modifie le sexe de la personne.</p>

197. * @param sexe Le sexe de la personne.

198. */

199. public void setSexe(TSexe sexe)

200. {

201. this.sexe = sexe;

202. }

205. /**

206. * <p>Retourne une représentation d'une personne.</p>

207. * @return Renvoie une représentation d'une personne.

208. */

209. @Override

210. public String toString()

211. {

212. StringBuilder resultat = new StringBuilder();

214. resultat.append("Personne : { ");

215. resultat.append("nom : ").append(getNom()).append("; ");

216. resultat.append("prénom : ").append(getPrenom()).append("; ");

217. resultat.append("âge : ").append(getAge()).append(" an(s); ");

218. resultat.append("sexe : ").append(getSexe());

219. resultat.append(" }");

221. return resultat.toString();

222. }

223. }

personne/TestPersonne.java

1. /*

2. * Fichier: TestPersonne.java

3. * Crée le: 13 janvier 2007.

4. * Modifié: 12 octobre 2008.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre7.personne;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe permettant de tester la classe Personne.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class TestPersonne extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public TestPersonne()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Personne");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

58. getContentPane().add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

60. // Texte de sortie.

61. StringBuilder sortie = new StringBuilder();

63. // Personne 1.

64. Personne personne1 = new Personne();

65. personne1.setNom("SANCHEZ");

66. personne1.setPrenom("Emilie");

67. try

68. {

69. personne1.setAge(31);

70. }

71. catch(IllegalArgumentException e)

72. {

73. sortie.append(e.getMessage()).append('\n');

74. }

75. personne1.setSexe(TSexe.Feminin);

76. sortie.append(personne1).append('\n');

78. // Personne 2.

79. Personne personne2 = new Personne(personne1);

80. personne2.setNom("FABRE");

81. try

82. {

83. personne2.setAge(26);

84. }

85. catch(IllegalArgumentException e)

86. {

87. sortie.append(e.getMessage()).append('\n');

88. }

89. sortie.append(personne2).append('\n');

91. // Personne 3.

92. Personne personne3 = null;

93. try

94. {

95. personne3 = new Personne("MARTIN", "Julien", 24);

96. personne3.setSexe(TSexe.Masculin);

97. sortie.append(personne3).append('\n');

98. }

99. catch(IllegalArgumentException e)

100. {

101. sortie.append(e.getMessage()).append('\n');

102. }

104. // Personne 4.

105. Personne personne4 = null;

106. try

107. {

108. personne4 = new Personne("DUBOIS", "Bernard", 136);

109. sortie.append(personne4).append('\n');

110. }

111. catch(IllegalArgumentException e)

112. {

113. sortie.append(e.getMessage()).append('\n');

114. }

116. // Met à jour la zone de sortie.

117. zoneSortie.setText(sortie.toString());

119. // Modifie les propriétés de la fenêtre.

120. setSize(600, 200);

121. setLocation(100, 100);

122. setVisible(true);

123. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

124. }

127. /**

128. * <p>Débute l'exécution du test.</p>

129. * @param args Les paramètres de la ligne de commande.

130. */

131. public static void main(String[] args)

132. {

133. new TestPersonne();

134. }

135. }

IX - Remerciements

Je tiens à remercier Ricky81, Hikage, djo.mos pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.