Exercices en Java (09-Caractères et chaines)

Sébastien ESTIENNE

Ce neuvième chapitre concerne les caractères et chaines.
Le premier exercice s'intéresse aux chaines immuables et le deuxième aux chaines modifiables. Le troisième exercice porte sur les caractères. Le quatrième exercice utilise la notion de jetons. Le cinquième exercice est un calcul d'occurrences. Le sixième exercice met en application le code morse. Et pour finir, le but du dernier exercice est de balayer un certain nombre d'expressions régulières typiques.

Les principales notions abordées sont les suivantes :

- Manipulation de chaines immuables ;

- Manipulation de chaines modifiables ;

- Manipulation de caractères ;

- Découper une chaine.

Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le langage 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 (09-Caractères et chaines)

- Auteur : Sébastien ESTIENNE

- Parution : 4 août 2007

- Mise à jour : 5 avril 2010

- 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. Chaines immuables

- I-1. Énoncé

- I-2. Aperçu

- I-3. Démonstration

- I-4. Solution

- II. Chaines modifiables

- II-1. Énoncé

- II-2. Aperçu

- II-3. Démonstration

- II-4. Solution

- III. Caractères

- III-1. Énoncé

- III-2. Aperçu

- III-3. Démonstration

- III-4. Solution

- IV. Jetons

- IV-1. Énoncé

- IV-2. Aperçu

- IV-3. Démonstration

- IV-4. Solution

- V. Calcul d'occurrences

- V-1. Énoncé

- V-2. Aperçu

- V-3. Démonstration

- V-4. Solution

- VI. Code Morse

- VI-1. Énoncé

- VI-2. Aperçu

- VI-3. Démonstration

- VI-4. Solution

- VII. Expressions régulières

- VII-1. Énoncé

- VII-2. Aperçu

- VII-3. Démonstration

- VII-4. Solution

- VIII. Remerciements

I - Chaines immuables

I-1 - Énoncé

Écrivez une classe avec deux chaines de caractères immuables (String) : « Le chat joue » et « avec une souris. ». Affichez ensuite les informations suivantes :

- la longueur de la première chaine ;

- le 5e caractère de la première chaine ;

- du deuxième au cinquième caractère de la deuxième chaine ;

- le résultat de la comparaison des deux chaines ;

- le résultat de la recherche de la chaine « sou » dans la deuxième chaine ;

- la concaténation des deux chaines.

Classes de l'API utilisées :

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

I-4 - Solution

ChainesImmuables.java

1. /*

2. * Fichier: ChainesImmuables.java

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

4. * Modifié: 12 février 2009.

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 chapitre9;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe sur les chaines immuables.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class ChainesImmuables 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 ChainesImmuables()

51. {

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

53. super("Chaines Immuables");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

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

59. // Texte de sortie.

60. StringBuilder sortie = new StringBuilder();

62. // Chaines de caractères immuables.

63. String s1 = "Le chat joue";

64. String s2 = " avec une souris.";

66. sortie.append("s1 : ").append(s1).append('\n');

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

69. sortie.append("Longueur de s1 : ").append(s1.length()).append('\n');

71. sortie.append("5e caractère de s1 : ").append(s1.charAt(4)).append('\n');

73. sortie.append("2e au 5e caractère de s2 : ").append(s2.substring(1, 5)).append('\n');

75. if(s1.compareTo(s2) == 0)

76. {

77. sortie.append("s1 et s2 sont identiques.\n");

78. }

79. else

80. {

81. sortie.append("s1 et s2 ne sont pas identiques.\n");

82. }

84. if(s2.contains("sou"))

85. {

86. sortie.append("'sou' trouvé dans s2.\n");

87. }

88. else

89. {

90. sortie.append("'sou' non trouvé dans s2.\n");

91. }

93. sortie.append("Concaténation de s2 à s1 : ").append(s1.concat(s2)).append('\n');

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

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

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

99. setSize(600, 200);

100. setLocation(100, 100);

101. setVisible(true);

102. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

103. }

106. /**

107. * <p>Débute l'exécution du programme.</p>

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

109. */

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

111. {

112. new ChainesImmuables();

113. }

114. }

II - Chaines modifiables

II-1 - Énoncé

Écrivez une classe avec une chaine de caractères modifiable (StringBuilder) « Le chat est là. ». Effectuez ensuite les opérations suivantes :

- affichez la chaine de caractères ;

- affichez la longueur de la chaine ;

- affichez la capacité de la chaine ;

- modifiez la longueur de la chaine à 14 ;

- affichez la chaine de caractères ;

- affichez le 4e caractère de la chaine ;

- modifiez le premier caractère de la chaine en « l » ;

- affichez la chaine de caractères ;

- affichez la partie de chaine du 4e au 7e caractère ;

- affichez la chaine à l'envers ;

- insérez le texte « Quand » au tout début de la chaine ;

- affichez la chaine de caractères ;

- supprimez la partie « est » de la chaine de caractères ;

- affichez la chaine de caractères ;

- insérez entre les deux espaces, la chaine « n'est pas » ;

- affichez la chaine de caractères ;

- ajoutez à la fin de la chaine « , les souris dansent. » ;

- affichez la chaine de caractères.

Classes de l'API utilisées :

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

II-4 - Solution

ChainesModifiables.java

1. /*

2. * Fichier: ChainesModifiables.java

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

4. * Modifié: 12 février 2009.

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 chapitre9;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe sur les chaines modifiables.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class ChainesModifiables 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 ChainesModifiables()

51. {

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

53. super("Chaines Modifiables");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

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

59. // Texte de sortie.

60. StringBuilder sortie = new StringBuilder();

62. // Chaine de caractères modifiable.

63. StringBuilder s = new StringBuilder("Le chat est là.");

65. sortie.append(s).append('\n');

67. sortie.append("Longueur : " + s.length()).append('\n');

69. sortie.append("Capacité : " + s.capacity()).append('\n');

71. s.setLength(14);

72. sortie.append(s).append('\n');

74. sortie.append("4e caractère : " + s.charAt(3)).append('\n');

76. s.setCharAt(0, 'l');

77. sortie.append(s).append('\n');

79. sortie.append("4e au 7e caractère : " + s.substring(3, 7)).append('\n');

81. sortie.append(s.reverse()).append('\n');

82. s.reverse();

84. s.insert(0, "Quand ");

85. sortie.append(s).append('\n');

87. s.delete(14, 17);

88. sortie.append(s).append('\n');

90. s.insert(14, "n'est pas");

91. sortie.append(s).append('\n');

93. s.append(", les souris dansent.");

94. sortie.append(s).append('\n');

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

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

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

100. setSize(600, 200);

101. setLocation(100, 100);

102. setVisible(true);

103. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

104. }

107. /**

108. * <p>Débute l'exécution du programme.</p>

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

110. */

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

112. {

113. new ChainesModifiables();

114. }

115. }

III - Caractères

III-1 - Énoncé

Écrivez une classe avec une variable caractère valant 'A'. Effectuez ensuite les opérations suivantes :

- afficher le caractère ;

- indiquer si le caractère est un chiffre ;

- indiquer si le caractère est une lettre ;

- vérifier si le caractère est un chiffre ou une lettre ;

- vérifier si le caractère est en minuscule ;

- indiquer si le caractère est en majuscule ;

- mettre le caractère en majuscule et l'afficher ;

- mettre le caractère en minuscule et l'afficher ;

- afficher le code ASCII du caractère.

Classes de l'API utilisées :

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

III-4 - Solution

Caracteres.java

1. /*

2. * Fichier: Caracteres.java

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

4. * Modifié: 12 février 2009.

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 chapitre9;

27. import java.awt.BorderLayout;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Classe sur les caractères.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class Caracteres 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 Caracteres()

51. {

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

53. super("Caractère");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

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

59. // Texte de sortie.

60. StringBuilder sortie = new StringBuilder();

62. // Le caractère.

63. char c = 'A';

64. sortie.append("Caractère : ").append(c).append('\n');

66. // Est un chiffre ?

67. if(Character.isDigit(c))

68. {

69. sortie.append(c).append(" est un chiffre.\n");

70. }

71. else

72. {

73. sortie.append(c).append(" n'est pas un chiffre.\n");

74. }

76. // Est une lettre ?

77. if(Character.isLetter(c))

78. {

79. sortie.append(c).append(" est une lettre.\n");

80. }

81. else

82. {

83. sortie.append(c).append(" n'est pas une lettre.\n");

84. }

86. // Est une lettre ou un chiffre ?

87. if(Character.isLetterOrDigit(c))

88. {

89. sortie.append(c).append(" est une lettre ou un chiffre.\n");

90. }

91. else

92. {

93. sortie.append(c).append(" n'est ni une lettre, ni un chiffre.\n");

94. }

96. // Est en minuscule ?

97. if(Character.isLowerCase(c))

98. {

99. sortie.append(c).append(" est une lettre minuscule.\n");

100. }

101. else

102. {

103. sortie.append(c).append(" n'est pas une lettre minuscule.\n");

104. }

106. // Est en majuscule ?

107. if(Character.isUpperCase(c))

108. {

109. sortie.append(c).append(" est une lettre majuscule.\n");

110. }

111. else

112. {

113. sortie.append(c).append(" n'est pas une lettre majuscule.\n");

114. }

116. // En minuscule.

117. sortie.append("Minuscule : ").append(Character.toLowerCase(c)).append('\n');

119. // En majuscule.

120. sortie.append("Majuscule : ").append(Character.toUpperCase(c)).append('\n');

122. // Code ASCII.

123. sortie.append("Valeur : " + new Character(c).hashCode()).append('\n');

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

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

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

129. setSize(600, 200);

130. setLocation(100, 100);

131. setVisible(true);

132. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

133. }

136. /**

137. * <p>Débute l'exécution du programme.</p>

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

139. */

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

141. {

142. new Caracteres();

143. }

144. }

IV - Jetons

IV-1 - Énoncé

Écrivez une classe afin de tester la classe StringTokenizer permettant de découper une chaine de caractères en jetons. La classe doit afficher le nombre d'éléments et la liste des jetons.
Utilisez les chaines de caractères suivantes :

- « La première chaine à découper en jetons. » ;

- « La|seconde|chaine|à|découper|en|jetons. ».

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.util.StringTokenizer

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

IV-4 - Solution

Jetons.java

1. /*

2. * Fichier: Jetons.java

3. * Crée le: 1 février 2007.

4. * Modifié: 12 février 2009.

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 chapitre9;

27. import java.awt.BorderLayout;

28. import java.util.StringTokenizer;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe permettant de tester le découpage de chaines en jetons.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class Jetons extends JFrame

41. {

42. /**

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

44. */

45. private static final long serialVersionUID = 1L;

47. /**

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

49. */

50. public Jetons()

51. {

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

53. super("Jetons");

55. // Ajoute les composants au conteneur.

56. JTextArea zoneSortie = new JTextArea();

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

59. // Texte de sortie.

60. StringBuilder sortie = new StringBuilder();

62. // Chaines à découper.

63. String chaine1 = "La première chaine à découper en jetons.";

64. String chaine2 = "La|seconde|chaine|à|découper|en|jetons.";

66. // Jetons.

67. StringTokenizer jetons1 = new StringTokenizer(chaine1);

68. StringTokenizer jetons2 = new StringTokenizer(chaine2, "|");

70. // Chaine 1.

71. sortie.append(chaine1).append('\n');

72. sortie.append("Nombre de jetons : ").append(jetons1.countTokens()).append('\n');

73. while(jetons1.hasMoreTokens())

74. {

75. sortie.append(jetons1.nextToken()).append('\n');

76. }

77. sortie.append('\n');

79. // Chaine 2.

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

81. sortie.append("Nombre de jetons : ").append(jetons2.countTokens()).append('\n');

82. while(jetons2.hasMoreTokens())

83. {

84. sortie.append(jetons2.nextToken()).append('\n');

85. }

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

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

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

91. setSize(600, 200);

92. setLocation(100, 100);

93. setVisible(true);

94. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

95. }

98. /**

99. * <p>Débute l'exécution du programme.</p>

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

101. */

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

103. {

104. new Jetons();

105. }

106. }

V - Calcul d'occurrences

V-1 - Énoncé

Écrivez une classe permettant de calculer le nombre d'occurrences de chaque lettre de l'alphabet d'un texte. Utilisez un tableau pour enregistrer le nombre d'occurrences de chaque lettre.

Classes de l'API utilisées :

- java.awt.BorderLayout

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

V-4 - Solution

Occurrences.java

1. /*

2. * Fichier: Occurrences.java

3. * Crée le: 1 février 2007.

4. * Modifié: 27 janvier 2010.

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 chapitre9;

25. import java.awt.BorderLayout;

27. import javax.swing.JFrame;

28. import javax.swing.JScrollPane;

29. import javax.swing.JTextArea;

33. /**

34. * <p>Classe permettant de compter le nombre d'occurrences dans une phrase.</p>

35. * @author Sébastien ESTIENNE.

36. */

37. public class Occurrences extends JFrame

38. {

39. /**

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

41. */

42. private static final long serialVersionUID = 1L;

44. /**

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

46. */

47. public Occurrences()

48. {

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

50. super("Occurrences");

52. // Ajoute les composants au conteneur.

53. JTextArea zoneSortie = new JTextArea();

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

56. // Texte de sortie.

57. StringBuilder sortie = new StringBuilder();

59. // La Chaine.

60. String chaine = "Compte le nombre d'occurrences de chaque lettre.";

62. // Le tableau des occurrences.

63. int[] occurrences = new int[26];

65. int ajuste = 'a';

66. char c;

67. int num;

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

69. {

70. c = chaine.charAt(i);

71. num = Character.toLowerCase(c) - ajuste;

72. if(num > 0 && num < 26)

73. {

74. ++occurrences[num];

75. }

76. }

78. // Affichage du résultat.

79. sortie.append(chaine).append('\n');

80. for(int i = 0; i < occurrences.length; i++)

81. {

82. sortie.append(((char) (i + ajuste))).append(" : ").append(occurrences[i]).append('\n');

83. }

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

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

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

89. setSize(600, 200);

90. setLocation(100, 100);

91. setVisible(true);

92. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

93. }

96. /**

97. * <p>Débute l'exécution du programme.</p>

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

99. */

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

101. {

102. new Occurrences();

103. }

104. }

VI - Code Morse

VI-1 - Énoncé

Le code Morse est le plus connu de tous les codages. Il est constitué d'une suite de points (.) et de tirets (-). La séparation de mots est assurée par un blanc : un espace.
Écrivez une classe permettant de convertir une phrase en code Morse et vis versa. Utilisez un blanc entre chaque lettre et trois blancs entre chaque mot.

Code morse :

A   .-             M   --              Y   -.--
B   -...           N   -.              Z   --..
C   -.-.           O   ---
D   -..            P   .--.
E   .              Q   --.-
F   ..-.           R   .-.
G   --.            S   ...
H   ....           T   -
I   ..             U   ..-
J   .---           V   ...-
K   -.-            W   .--
L   .-..           X   -..-

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.util.StringTokenizer

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VI-4 - Solution

CodeMorse.java

1. /*

2. * Fichier: CodeMorse.java

3. * Crée le: 1 février 2007.

4. * Modifié: 27 janvier 2010.

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 chapitre9;

27. import java.awt.BorderLayout;

28. import java.util.StringTokenizer;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe utilisant le code Morse.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class CodeMorse extends JFrame

41. {

42. /**

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

44. */

45. private static final long serialVersionUID = 1L;

47. /** Code morse pour les lettres. */

48. private String[] morseLetters = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",

49. ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",

50. ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",

51. ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",

52. ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",

53. ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",

54. "...-", ".--", "-..-", "-.--", "--.."};

56. /**

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

58. */

59. public CodeMorse()

60. {

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

62. super("Code Morse");

64. // Ajoute les composants au conteneur.

65. JTextArea zoneSortie = new JTextArea();

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

68. // Texte de sortie.

69. StringBuilder sortie = new StringBuilder();

71. // Chaine à coder.

72. String chaine1 = "la chaine a coder";

74. // Chaine à décoder.

75. String chaine2 = ".-.. .-   -.-. .... .- .. -. .   .-   -.. . -.-. --- -.. . .-.";

77. // Codage.

78. sortie.append("Codage :\n");

79. sortie.append(chaine1).append('\n');

80. sortie.append(coder(chaine1)).append('\n');

81. sortie.append('\n');

83. // Décodage.

84. sortie.append("Décodage :\n");

85. sortie.append(chaine2).append('\n');

86. sortie.append(decoder(chaine2)).append('\n');

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

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

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

92. setSize(600, 200);

93. setLocation(100, 100);

94. setVisible(true);

95. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

96. }

98. /**

99. * <p>Débute l'exécution du programme.</p>

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

101. */

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

103. {

104. new CodeMorse();

105. }

108. /**

109. * <p>Code un texte en Morse.</p>

110. * @param chaine Le texte à coder.

111. * @return Le texte codé.

112. */

113. public String coder(String chaine)

114. {

115. // Chaine codée.

116. StringBuilder resultat = new StringBuilder();

118. // Variable d'ajustement.

119. int ajuste = 'a';

121. // Parcours la chaine.

122. char c;

123. int num;

124. for(int i = 0; i < chaine.length(); i++)

125. {

126. // Le caractère courant.

127. c = chaine.charAt(i);

129. // Cas d'un espace.

130. if(c == ' ')

131. {

132. resultat.append("   ");

133. }

134. else

135. {

136. // Numéro du caractère dans le tableau morse.

137. num = Character.toLowerCase(c) - ajuste;

139. // Cas d'une lettre.

140. if(num >= 0 && num < 26)

141. {

142. resultat.append(this.morseLetters[num]);

143. resultat.append(' ');

144. }

145. // Cas d'un caractère inconnu.

146. else

147. {

148. // Ignore le caractère inconnu.

149. }

150. }

151. }

153. // Retourne la chaine codée.

154. return resultat.toString();

155. }

158. /**

159. * <p>Décode un texte en Morse.</p>

160. * @param chaine Le texte à décoder.

161. * @return Le texte décodé.

162. */

163. public String decoder(String chaine)

164. {

165. // Chaine décodée.

166. StringBuilder resultat = new StringBuilder();

168. // Variable d'ajustement.

169. int ajuste = 'a';

171. // Découpage de la chaine en mots.

172. chaine = chaine.replaceAll("   ", "___");

173. StringTokenizer mots = new StringTokenizer(chaine, "___");

175. // Parcours des mots.

176. StringTokenizer lettres;

177. String lettre;

178. int num;

179. while(mots.hasMoreTokens())

180. {

181. // Découpage de la chaine en lettres.

182. lettres = new StringTokenizer(mots.nextToken(), " ");

184. // Parcours des lettres.

185. while(lettres.hasMoreTokens())

186. {

187. // Recherche de la lettre correspondant au code.

188. lettre = lettres.nextToken();

189. num = chercherCode(lettre);

190. if(num == -1)

191. {

192. resultat.append("?");

193. }

194. else if(num != -1)

195. {

196. resultat.append(((char) (num + ajuste)));

197. }

198. }

200. // Espace entre les mots.

201. resultat.append(" ");

202. }

204. // Retourne la chaine décodée.

205. return resultat.toString();

206. }

209. /**

210. * <p>Cherche la correspondance d'un code dans la liste des codes.</p>

211. * @param cle Le code à rechercher.

212. * @return L'indice du code dans la liste des codes ou -1 si le code n'a pas été trouvé.

213. */

214. public int chercherCode(String cle)

215. {

216. for(int i = 0; i < this.morseLetters.length; i++)

217. {

218. if(cle.compareTo(this.morseLetters[i]) == 0)

219. {

220. return i;

221. }

222. }

224. return -1;

225. }

226. }

VII - Expressions régulières

VII-1 - Énoncé

Écrivez une classe permettant d'effectuer ce qui est demandé ci-dessous par l'intermédiaire d'expressions régulières :

- vérifier qu'une chaine est alphanumérique ;

- vérifier qu'une phrase commence par le mot « Le » ;

- vérifier qu'une phrase finit par un « . » ;

- vérifier le format d'une date (jj/mm/aaaa) ;

- vérifier la validité d'une adresse email ;

- vérifier qu'une chaine ne contient pas de caractère blanc ;

- compter le nombre de mots dans une phrase ;

- extraire les mots commençant par un « c » ;

- découper une chaine de caractères représentant la navigation d'une page ;

- remplacer une date par son format ;

- récupérer le texte placé entre des balises.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.util.ArrayList

- java.util.List

- java.util.regex.Matcher

- java.util.regex.Pattern

- 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 également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VII-4 - Solution

ExpressionsRegulieres.java

1. /*

2. * Fichier: ExpressionsRegulieres.java

3. * Crée le: 1 février 2010.

4. * Modifié: 12 février 2010.

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 chapitre9;

25. import java.awt.BorderLayout;

26. import java.util.ArrayList;

27. import java.util.List;

28. import java.util.regex.Matcher;

29. import java.util.regex.Pattern;

31. import javax.swing.JFrame;

32. import javax.swing.JScrollPane;

33. import javax.swing.JTextArea;

35. /**

36. * <p>Classe illustrant le fonctionnement des expressions rationnelles ou régulières.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class ExpressionsRegulieres extends JFrame

40. {

41. /** Zone de texte pour les résultats. */

42. private JTextArea zoneSortie;

44. /**

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

46. */

47. private static final long serialVersionUID = 1L;

49. /**

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

51. */

52. public ExpressionsRegulieres()

53. {

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

55. super("Expressions régulières");

57. // Ajoute les composants au conteneur.

58. this.zoneSortie = new JTextArea();

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

61. // Vérifie qu'une chaine est alphanumérique.

62. verifierAlphaNum("Exemple1");

63. verifierAlphaNum("Premier_Exemple");

64. this.zoneSortie.append("\n");

66. // Vérifie le format d'une date (jj/mm/aaaa).

67. verifierDate("03/01/10");

68. verifierDate("32/01/2010");

69. verifierDate("08/01/2010");

70. this.zoneSortie.append("\n");

72. // Vérifie la validité d'une adresse email.

73. verifierEmail("sebastien");

74. verifierEmail("sebastien@domaine");

75. verifierEmail("sebastien@domaine.com");

76. this.zoneSortie.append("\n");

78. // Vérifie qu'une phrase commence par le mot "Le".

79. verifierDebut("Un texte.", "Le");

80. verifierDebut("Le texte.", "Le");

81. this.zoneSortie.append("\n");

83. // Vérifie qu'une phrase finit par un ".".

84. verifierFin("Vive les expressions régulières!", ".");

85. verifierFin("Les expressions régulières c'est puissant.", ".");

86. this.zoneSortie.append("\n");

88. // Vérifie qu'une chaine ne contient pas de caractère blanc.

89. verifierSansEspace("Cette phrase est facile à lire.");

90. verifierSansEspace("Cettephraseestdifficileàlire.");

91. this.zoneSortie.append("\n");

93. // Compte le nombre de mots.

94. compterMots("Un carré est un rectangle.");

95. this.zoneSortie.append("\n");

97. // Extrait les mots commençant par un "a".

98. extraireMots("Ils s'aiment comme chien et chat", "c");

99. this.zoneSortie.append("\n");

101. // Découpe une chaine de caractères en mots.

102. //decouperChaine("");this.zoneSortie.append("\n"); split

104. // Remplace un mot par un autre dans une phrase.

105. //remplacerMot("");this.zoneSortie.append("\n"); replace

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

108. setSize(600, 200);

109. setLocation(100, 100);

110. setVisible(true);

111. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

112. }

114. /**

115. * <p>Vérifie que la chaine de caractères passée est alphanumérique.</p>

116. * @param chaine La chaine de caractères à évaluer.

117. */

118. public void verifierAlphaNum(String chaine)

119. {

120. Pattern alphaNum = Pattern.compile("^[A-Za-z0-9]+$"); // ou "^\\w+$"

121. Matcher resultat = alphaNum.matcher(chaine);

122. if(resultat.find())

123. {

124. this.zoneSortie.append("'" + chaine + "' est une chaine alphanumérique.\n");

125. }

126. else

127. {

128. this.zoneSortie.append("'" + chaine + "' n'est pas une chaine alphanumérique.\n");

129. }

130. }

132. /**

133. * <p>Vérifie que la chaine de caractères passée est au format de date jj/mm/aaaa.</p>

134. * @param chaine La chaine de caractères à évaluer.

135. */

136. public void verifierDate(String chaine)

137. {

138. // Cette expression vérifie seulement que le jour est entre 1 et 31, le mois entre 1 et 12

139. // et que l'année est sur 4 chiffres. Elle ne prend pas en compte le nombre de jours qui

140. // diffère d'un mois à un autre ni les années bissextiles.

141. Pattern date = Pattern.compile("^(0[1-9]|[1-2][0-9]|3[0-1])/(0[1-9]|1[0-2])/[0-9]{4}$");

142. Matcher resultat = date.matcher(chaine);

143. if(resultat.find())

144. {

145. this.zoneSortie.append("'" + chaine + "' est une date au format (jj/mm/aaaa).\n");

146. }

147. else

148. {

149. this.zoneSortie.append("'" + chaine + "' n'est pas une date au format (jj/mm/aaaa).\n");

150. }

151. }

153. /**

154. * <p>Vérifie que la chaine de caractères passée est une adresse email vallide.</p>

155. * @param chaine La chaine de caractères à évaluer.

156. */

157. public void verifierEmail(String chaine)

158. {

159. Pattern email = Pattern.compile("^[A-Za-z0-9\\._-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,4}$");

160. Matcher resultat = email.matcher(chaine);

161. if(resultat.find())

162. {

163. this.zoneSortie.append("'" + chaine + "' est une adresse email valide.\n");

164. }

165. else

166. {

167. this.zoneSortie.append("'" + chaine + "' n'est pas une adresse email valide.\n");

168. }

169. }

171. /**

172. * <p>Vérifie que la chaine de caractères passée commence par la chaine recherchée.</p>

173. * @param chaine La chaine de caractères à évaluer.

174. * @param recherche La chaine de caractères à chercher en début.

175. */

176. public void verifierDebut(String chaine, String recherche)

177. {

178. Pattern debut = Pattern.compile("^\\Q" + recherche + "\\E.*$");

179. Matcher resultat = debut.matcher(chaine);

180. if(resultat.find())

181. {

182. this.zoneSortie.append("'" + chaine + "' commence par '" + recherche + "'.\n");

183. }

184. else

185. {

186. this.zoneSortie.append("'" + chaine + "' ne commence pas par '" + recherche + "'.\n");

187. }

188. }

190. /**

191. * <p>Vérifie que la chaine de caractères passée fini par la chaine recherchée.</p>

192. * @param chaine La chaine de caractères à évaluer.

193. * @param recherche La chaine de caractères à chercher en fin.

194. */

195. public void verifierFin(String chaine, String recherche)

196. {

197. Pattern fin = Pattern.compile("^.*\\Q" + recherche + "\\E$");

198. Matcher resultat = fin.matcher(chaine);

199. if(resultat.find())

200. {

201. this.zoneSortie.append("'" + chaine + "' fini par '" + recherche + "'.\n");

202. }

203. else

204. {

205. this.zoneSortie.append("'" + chaine + "' ne fini pas par '" + recherche + "'.\n");

206. }

207. }

209. /**

210. * <p>Vérifie que la chaine de caractères ne contient pas d'espace.</p>

211. * @param chaine La chaine de caractères à évaluer.

212. */

213. public void verifierSansEspace(String chaine)

214. {

215. Pattern fin = Pattern.compile("^[^\\ ]*$");

216. Matcher resultat = fin.matcher(chaine);

217. if(resultat.find())

218. {

219. this.zoneSortie.append("'" + chaine + "' ne contient pas d'espace.\n");

220. }

221. else

222. {

223. this.zoneSortie.append("'" + chaine + "' contient des espaces.\n");

224. }

225. }

227. /**

228. * <p>Compte le nombre de mots dans la chaine de caractères passée.</p>

229. * @param chaine La chaine de caractères à évaluer.

230. */

231. public void compterMots(String chaine)

232. {

233. Pattern fin = Pattern.compile("([^\\s\\.!:/;?,]+)");

234. Matcher resultat = fin.matcher(chaine);

235. int cpt = 0;

236. while(resultat.find()) {

237. cpt++;

238. }

239. this.zoneSortie.append("'" + chaine + "' contient " + cpt + " mot(s).\n");

240. }

242. /**

243. * <p>Extrait les mots commençant par la chaine passée en paramètre.</p>

244. * @param chaine La chaine de caractères à évaluer.

245. * @param begin L'expression recherchée en début de mot.

246. */

247. public void extraireMots(String chaine, String begin)

248. {

249. Pattern fin = Pattern.compile("(\\Q" + begin + "\\E[^\\s]*)");

250. Matcher resultat = fin.matcher(chaine);

251. int cpt = 0;

252. List<String> mots = new ArrayList<String>();

253. while(resultat.find()) {

254. cpt++;

255. mots.add(resultat.group());

256. }

257. this.zoneSortie.append("'" + chaine + "' contient " + cpt + " mot(s) commençant par '" + begin + "' : ");

258. int i = 0;

259. for(String mot : mots)

260. {

261. this.zoneSortie.append(mot);

262. if(i != mots.size() - 1)

263. {

264. this.zoneSortie.append(", ");

265. }

266. else

267. {

268. this.zoneSortie.append(".\n");

269. }

270. i++;

271. }

272. }

274. /**

275. * <p>Débute l'exécution du programme.</p>

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

277. */

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

279. {

280. new ExpressionsRegulieres();

281. }

282. }

VIII - Remerciements

Je tiens à remercier Baptiste Wicht, gifffftane, blade159 et jacques_jean pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.