INF120 - TP Séance 5

Durée : 2h00




Objectifs




Au menu

  1. Consignes
  2. Paramètres d'un programme Java
  3. Chargement et affichage d'un fichier texte
  4. Remplacement des caractères spéciaux d'un texte
  5. Extraction des mots d'un texte




A. Consignes (5 min) 0%

Lisez attentivement cet énoncé de TP/TD en suivant les instructions. En cas d'interrogation, faites appel à moi, que ce soit pour en savoir plus sur un des points abordés pendant le TP, ou pour savoir comment effectuer une des tâches demandées (numérotées pour pouvoir y faire référence simplement).

Surtout ne restez pas bloqué(e) sur une des questions. Entre parenthèses, à côté des titres de sous-sections, est indiqué le temps que vous avez dû passer à effectuer les étapes précédentes.

Au cours de ce TP, nous allons traiter des fichiers textes stockés sur le disque dur, dont l'adresse est fournie en paramètre du programme.

Votre objectif minimal doit être d'arriver jusqu'à la fin de la section D.




B. Paramètres d'un programme Java (20 min) 4%

Lors de l'appel d'un programme en Java, par la commande java nom_du_programme, il est possible de faire suivre le nom du programme par des paramètres séparés par des espaces. Par exemple, si on veut indiquer deux paramètres param1 et param2 pour le programme TP5, on exécutera dans le terminal la commande suivante :
java TP5 param1 param2

Ces paramètres sont alors stockés dans un tableau de chaînes de caractères, appelé arg, qui est donné comme paramètre d'entrée de la fonction main. Ceci explique que la déclaration de la fonction main d'un programme Java est toujours de la forme public static void main(String[] arg) dans les exemples que nous avons vus jusqu'à présent.

Nous allons tout d'abord voir comment compter et récupérer ces paramètres.

Pour cela, commencez par B1créer un dossier dédié à ce TP5 (de la même manière qu'aux TP précédents), puis B2enregistrez-y ce fichier TP5.java, ainsi que TP5Apollinaire.txt et TP5Hugo.txt.

Maintenant, B3ajoutez dans le main une instruction qui permet d'afficher le nombre de paramètres. Testez-la en compilant TP5.java, puis en exécutant TP5 avec un, deux, ou aucun paramètre.

Paramètres d'un programme Java
En utilisant un test avant l'affichage dans le main, B4faites afficher un message du type "x parametre en entree du programme.", où x correspond au nombre de paramètres en entrée du programme, et le mot "parametre" est bien accordé, c'est-à-dire qu'il est au pluriel si x est strictement supérieur à 1. Vous devez donc obtenir un résultat similaire à celui de la copie d'écran ci-contre.

B5Faites ensuite un parcours du tableau arg pour afficher tous les paramètres en entrée du programme, précédés de Parametre x :, où x est le numéro du paramètre (le premier paramètre a pour numéro 0). Vous devez obtenir un résultat similaire à celui de la copie d'écran ci-contre.




C. Chargement et affichage d'un fichier texte (30 min) 20%

Une fonction permettant de récupérer le contenu d'un fichier texte du disque dur a déjà été programmée dans le fichier TP5.java. Elle s'appelle ouvreFichier et fonctionne de la façon suivante :
Affichage du contenu d'un fichier texte

C1Ajoutez dans la fonction main le code permettant de stocker, dans un tableau de chaînes de caractères appelé texte, les lignes d'un fichier texte dont l'adresse est donnée comme premier paramètre du programme Java, puis d'afficher ces lignes.
Indication à surligner si vous bloquez : dans la fonction main, récupérez dans une variable adresse le premier paramètre en entrée du programme Java, puis appelez la fonction ouvreFichier sur cette variable adresse, et stockez le résultat renvoyé par cette fonction dans un tableau de chaînes de caractères appelé texte. Puis parcourez ce tableau texte pour afficher le contenu de chacune de ses cases, l'une après l'autre.

C2Avant l'affichage de chaque ligne, affichez le numéro de ligne

A cause des numéros 1, 2, 3, etc., qui sont plus courts que 10, 11, 12, etc., qui sont eux-mêmes plus courts que 101, 102, 103, etc., certaines lignes sont un peu décalées. C3Utilisez un test pour ajouter suffisamment de zéros avant le numéro de ligne, pour que chaque numéro de ligne ait exactement trois chiffres (il y aura donc le même alignement pour toutes les lignes de 1 à 999). Vous devez obtenir un résultat similaire à celui de la copie d'écran ci-contre.


D. Remplacement des caractères spéciaux d'un texte (40 min) 45%

Les lettres accentuées s'affichent mal dans le terminal. On va donc écrire une fonction remplaceCaracteres qui prend en entrée une chaîne de caractères, et renvoie cette chaîne où les lettres "é", "è" et "ê" ont été remplacées par "e", la lettre "à" a été remplacée par "a", etc.

Remarque sur la fonction Caractere : Vous pouvez aller voir le code de la fonction Caractere, dans le fichier TP5.java, pour découvrir comment on peut traiter les chaînes de caractères en Java. L'instruction return chaineCar.substring(i-1,i); est utilisée, ce qui signifie que la fonction renvoie la sous-chaîne de la chaîne de caractères chaineCar fournie en entrée, allant du caractère numéroté i-1 au caractère numéroté i. Remarquez que les caractères d'une chaîne de caractères en Java sont numérotés à partir de zéro (ce qui explique le "i-1"). Remarquez aussi que contrairement à l'habitude où les paramètres d'une fonction sont tous mis entre parenthèses lors de l'appel de la fonction, ici, le paramètre chaineCar est mis avant le nom de la fonction, séparé d'un point. Ceci vient du fait que Java est un langage objet (ce que vous verrez en détails au module INF250) et s'interprète de la manière suivante : on peut appliquer toute une liste d'actions sur l'objet chaineCar qui est une chaîne de caractères, notamment : récupérer ce qui se trouve entre deux positions de la chaîne de caractères avec substring.
D1Écrivez cette fonction remplaceCaracteres, puis utilisez-la pour afficher une version du poème sans caractères spéciaux. Pour cela, vous pouvez (devez ?) utiliser la fonction Caractere qui prend en entrée une chaîne de caractères chaineCar et un entier i, et renvoie le i-ième caractère ; ainsi que la fonction ChainesEgales qui prend en entrée deux chaînes de caractères, et renvoie true si elles sont égales, false sinon.
Indication à surligner si vous bloquez : Vous allez recréer une nouvelle chaîne de caractères à partir de la chaîne chaineCar, en partant d'une nouvelle chaîne vide : pour chaque caractère de chaineCar, soit vous l'ajoutez à la nouvelle chaîne, s'il n'a pas d'accent ; soit vous ajoutez sa version sans accent à la nouvelle chaîne, s'il a un accent.

Le problème de la fonction remplaceCaracteres précédente est qu'elle nécessite de définir les lettres à remplacer à l'intérieur du code de la fonction. Ainsi, si vous voulez choisir d'autres caractères à remplacer (par exemple pour la gestion des caractères spéciaux espagnols ou allemands), il faudra modifier cette fonction. Une solution préférable est de fournir en entrée de la fonction un tableau caracteres de chaînes de caractères, dont chaque case contient un caractère spécial à remplacer (par exemple le tableau {"é","è","ê","à","ù"}), ainsi qu'un deuxième tableau remplacants qui contient dans chaque case le caractère à utiliser pour le remplacement (par exemple le tableau {"e","e","e","a","u"}). Un avantage du langage Java est que, pour cela, vous pouvez garder le même nom de fonction, remplaceCaracteres, car les entrées sont différentes de l'autre fonction remplaceCaracteres définie plus haut. D2Écrivez cette nouvelle fonction remplaceCaracteres. Vous pouvez bien sûr commencer par un copier-coller de la précédente fonction remplaceCaracteres.

D3Créez deux tableaux de chaînes de caractères caracteres et remplacants dans la fonction main, et utilisez-les dans l'appel de la fonction remplaceCaracteres.

Remarque : pour créer un tableau tab déjà déclaré, en utilisant l'"écriture compressée", il ne suffit pas d'écrire, par exemple, tab = {"*","*","*"}, mais il faut repréciser le type du tableau, avec une instruction du type tab = new String[]{"*","*","*"}.

D4Remplacez toutes les cases du tableau remplacants par la chaîne de caractères "*" pour voir si cela remplace effectivement toutes les lettres accentuées par des étoiles.

D5Appelez, depuis la fonction main, la fonction RemplaceCaracteres avec deux tableaux en entrée, pour remplacer tous les signes de ponctuation par des espaces.




E. Extraction des mots d'un texte (25 min) 79%

Cette partie du TP sera poursuivie au prochain TP...

E1Écrivez une fonction dansTableau qui prend en entrée une chaîne de caractères mot et un tableau de chaînes de caractères dico et renvoie true si mot apparaît dans une case de dico, et false sinon.

E2Écrivez une fonction ajouteFinTableau qui prend en entrée une chaîne de caractères mot et un tableau de chaînes de caractères dico, et renvoie le tableau dico à la fin duquel le mot mot a été ajouté. Attention, comme il est impossible de changer la taille d'un tableau, il va falloir recopier le tableau dico dans un tableau plus grand d'une case, et ajouter mot dans la dernière case de ce nouveau tableau.

E3Écrivez une fonction insereDansTableau, qui utilise les deux fonctions précédentes, et prend en entrée une chaîne de caractères mot et un tableau de chaînes de caractères dico, et renvoie le tableau dico dans lequel le mot mot a été ajouté s'il n'y était pas déjà.

E4Écrivez une fonction creeDico, qui prend en entrée deux tableaux de chaînes de caractères, un nommé texte, qui correspond à un texte (une ligne du texte par case du tableau), et l'autre nommé dico qui correspond à une liste de mots, et ajoute dans dico tous les mots de texte (sauf s'ils sont déjà dans dico).

E5Utilisez la fonction creeDico depuis la fonction main, pour afficher la liste des mots du texte fourni en paramètre du programme Java. E6Essayez-la sur les deux textes TP5Hugo.txt et TP5Apollinaire.txt, et sur un autre texte de votre choix.