- IN220, TP n°2 -

 

 

  > Gérer des caractères

En Java, une variable de type char permet de décrire un caractère d'une langue quelconque ou un symbole (ponctuation, symbole monétaire, ...). Chaque caractère est représenté par un nombre, et il est possible de réaliser des opérations sur les caractères. Par exemple, 'a' plus trois donne le caractère 'd', 'B' plus un donne le caractère 'C', et '3' (pas l'entier trois, mais le caractère qui représente le chiffre trois) plus cinq donne '8'.

Pour afficher la valeur numérique correspondant à un caractère (et ainsi voir comment le caractère est codé dans Java), on convertit le caractère en int.

1) Dans votre fonction main, déclarez une variable de type char, initialisez la à '3' (le caractère trois), et affichez la à l'écran (le caractère trois doit s'afficher). Affichez la valeur numérique associée à ce caractère en le convertissant, lors de l'affichage, en int (placez le mot clef int entre parenthèses devant votre variable lors de son affichage à l'écran). En regardant cette page, que constatez-vous ?

2) Dans la même fonction, créez un second caractère initialisé à '5' (le caractère cinq), et affichez le à l'écran. Affichez aussi sa valeur numérique.

3) Dans la même fonction, déclarez un troisième caractère, égal à la somme des deux précédents. Affichez le caractère ainsi que sa valeur numérique. Qu'en concluez-vous ?

4) Trouvez une formule permettant d'afficher, pour tout caractère représentant une lettre minuscule, sa position dans l'alphabet.

5) Voici un morceau de code à recopier dans votre main :

 
char[] alphabet = new char[26];
int i;

for (i=0; i<26; i=i+1)
{
     ...
}
Complétez ce code de façon à remplir tout le tableau alphabet avec les lettres de l'alphabet dans l'ordre. Affichez votre tableau à l'écran afin de vérifier le résultat. Essayez aussi avec les lettres de l'alphabet dans l'ordre inverse, et les lettres de l'alphabet en majuscule.


 

  > Lire des caractères dans un fichier, codage de Cesar

Tout d'abord, lisez et complétez le tutoriel proposé sur la seconde page du projet (et téléchargez les fichiers requis, comme Fichier.java).

1) Que constatez-vous lorsque vous ouvrez le fichier entree.txt (clic droit, puis enregistrer-sous) et le recopiez, tel quel, dans un autre fichier de sortie ?

2) En utilisant la fonction est_une_lettre, réalisez un programme qui ne recopie en sortie que les lettres du fichier précédent (aucun espace, aucune ponctuation, ...).

3) Vous devez maintenant écrire une fonction permettant de chiffrer les lettres d'un texte selon le code de Cesar, qui consiste à choisir un entier i et décaler toutes les lettres du message de i places. Par exemple, si i vaut 5, alors a devient f, b devient g, ... Attention, votre décalage doit "boucler" dans l'alphabet, c'est à dire que z deviendra e. Si dans votre fichier de sortie, vous avez des symboles étranges qui sont apparus, alors c'est raté...

Voici comment procéder pour faire le décalage. Les caractères de type "lettre" lus dans le fichier ont une valeur compris entre 97 et 122. Vous devez, pour réaliser le bouclage, retirer 97 à la valeur du caractère, puis ajouter le décalage et faire un modulo 26 (le nombre de lettres de l'alphabet - l'opération modulo s'écrit %). Enfin, vous devrez revenir à une lettre comprise entre 97 et 122 en rajoutant 97 à votre valeur. Par exemple, si je souhaite appliquer un décalage de 5 et que ma lettre est x, voici ce qui se passera :

char caractere = 'x';  //le caractere vaut en réalité 120

caractere = caractere - 'a';  //'a' vaut 97, donc caractere vaut maintenant 23

caractere = caractere + 5;  //on applique le decalage de 5, caractere vaut maintenant 28

caractere = caractere % 26; //on fait modulo 26 pour revenir à une valeur entre 0 et 25 ; ici, on obtient 2

caractere = caractere + 'a';  //on rajoute 'a' pour récupérer une valeur entre 97 et 122 (une lettre en java) ; ici, caractere vaudra 99,
                              //ce qui correspond bien à la lettre c (le décalage a bien fonctionné)