- 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).

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) 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

Téléchargez les fichiers FichierLecture.java, FichierEcriture.java et entree.txt (clic-droit, puis enregistrer-sous). Dans la suite, nous allons lire des fichiers caractère par caractère, et écrire dans un fichier de sortie.

1) Le code suivant permet d'ouvrir le fichier entree.txt, le lire caractère par caractère, et écrire chacun des caractères dans un fichier sortie.txt.

 
char c;
FichierLecture f = new FichierLecture("entree.txt");
FichierEcriture g = new FichierEcriture("sortie.txt");

while(f.il_reste_des_caracteres_a_lire())
{
     c=f.lire_caractere();

     //C'est entre ces deux lignes que vous pouvez insérer du code pour modifier le caractere écrit dans le fichier de sortie

     g.ecrire_caractere(c);
}

Testez cette fonction, que constatez-vous ?

2) La fonction ci-après permet de tester si un caractère est une lettre. Utilisez la dans le code précédent afin de n'écrire, en sortie, que des lettres (pas de ponctuation).

 
public static boolean est_une_lettre(char c)
{
    return Character.isLetter(c);
}

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é)