tout le monde
je dois faire un programme en java pour l´école mais je suis complétement largué... quelqu´un sait m´aider?
1 Introduction
Dans n’importe quel ´editeur de texte, vous pouvez regarder un document en texte organis´e en lignes.
Par exemple :
Ce texte contient plusieurs lignes
chaque ligne est de taille diff´erente
Parfois ce n’est pas beau `a voir.
Certain ´editeurs de texte offrent la possibilit´e de normaliser le document. Cela consiste `a rendre les
lignes d’un paragraphe de mˆeme taille. Le texte de l’exemple normalis´e deviendrait
Ce texte contient plusieurs lignes
chaque ligne est de taille diff´erente
Parfois ce n’est pas beau à voir.
Le but de l’exercice est de construire une m´ethode Java qui normalise une seule ligne de texte. Cette
m´ethode re¸coit un tableau de caract`eres qui contient le texte `a normaliser et un nombre N qui
repr´esente le nombre de caract`eres que la ligne normalis´ee doit avoir. La m´ethode renvoie un tableau
de caract`eres de taille N qui contient le texte normalis´e.
Par exemple pour la ligne suivante (les espaces sont remplac´es par des traits d’union pour clart´e):
papa-a-vu-lulu
Si l’on veut normaliser cette ligne avec une taille de 21 caract`eres, on obtiendra la ligne:
papa----a---vu---lulu
Remarquez que l’on commence `a ins´erer les espaces suppl´ementaires ´eventuels par la gauche !
Il est ´egalement possible de d´efinir comment couper un mot si celui-ci est trop long, on appele cela
une c´esure. L’exemple suivant vous montre les mots lignes et taille qui ont ´et´e coup´es.
Ce texte contient plusieurs li-
gnes chaque ligne est de tai-
lle diff´erente Parfois ce n’est
pas beau `a voir.
2 Les questions
Votre programme re¸coit en param`etre une chaˆıne de caract`eres repr´esentant un paragraphe (c’est-
`a-dire ne contenant aucun retour `a la ligne) et ´egalement un entier positif qui repr´esente la largeur
disponible pour formater le paragraphe.
Le programme dispose ´egalement d’un tableau qui contient une information tr`es utile qui d´efinit
comment couper un mot (c´esure) si celui-ci est trop long pour entrer sur la ligne courante. Vous avez
`a votre disposition une classe Hyphenation que vous
pouvez utiliser pour connaˆıtre les positions o`u vous pouvez couper un mot.
1 public static void main ( String [] args )
2 {
3 Hyphenation table = new tp3. Hyphenation ();
45
// Il faut d’abord ajouter des mots `a cette table :
6 String s = " regarder ";
7 int [] t = {2, 5};
8 table . addWord (s, t);
9 // On ajoute le mot regarder avec sa d´ecoupe ´etant re -gar - der
10
11
12 String word = " impl´ementation ";
13 int [] t2 = {2, 5, 8, 10};
14 // On ajoute le mot impl´ementation avec sa d´ecoupe ´etant im -pl´e -men -ta -
tion
15
16
17 // On peut ´egalement r´ecup´erer la d´ecoupe d’un mot
18 String w = " impl´ementation ";
19 int [] pos = table . getHyphenPositions (w);
20 // pos contient {2, 5, 8, 10} , c’est -`a- dire que impl´ementation
21 // se d´ecompose comme im -pl´e -men -ta - tion
22
23
24 // La table ne contient ´evidemment que les mots que vous avez auparavant
25 // charg´e . Voici comment il faut faire pour v´erifier si un mot existe
26 // dans la table de c´esure
27 String m = " test ";
28 int [] p = table . getHyphenPositions (m);
29 if (p != null )
30 {
31 // Le mot est dans la table , p contient sa d´ecoupe
32 }
33 else
34 {
35 // Le mot n’est pas dans la table , on ne sait pas comment le couper
36 }
37 }
On vous donne la classe Line dans ce mˆeme package qui propose des m´ethodes permettant de manipuler
des tableaux de caract`eres et la classe Display dans ce mˆeme package qui propose des m´ethodes
permettant d’afficher diff´erentes choses.
1 /**--------------------------- Classe Line ---------------------------
2 * Nettoyer une chaine de caract`eres
3 * @pre a != null
4 * @post La valeur renvoy´ee contient la chaine de caract`eres correspondant
5 * `a a o`u tout caract`ere blanc est remplac´e par une espace
6 */
7 public static String clean ( final String a);
8 /**
9 * Convertir une chaine de caract`eres en tableau de caract`eres
10 * @pre a != null
11 * @post Le caract`ere `a l’indexe i du tableau renvoy´e correspond au
12 * (i +1) `eme de la chaine de caract`ere a `a partir de la gauche .
13 * La taille du tableau est identique au nombre de
14 * caract`eres contenus dans a
15 * EXEMPLE :
16 * String s = " Hello World !" ;
17 * char [] c = tp3. Line . toCharArray (s);
18 * System . out. println (c. length ); // Affiche 20 (la longueur de s)
19 * System . out. println (c [4]) ; // Affiche o (le 4e caract`ere de s)
20 */
21 public static char [] toCharArray ( final String a);
22
23
24 /**--------------------------- Classe Display ---------------------------
25 * Afficher un tableau de caract`eres `a la console
26 * @pre t != null
27 * @post La chaine de carat`eres repr´esent´ee par le tableau t suivi d’un
28 * retour `a la ligne est affich´ee `a la console
29 */
30 public static void print ( final char [] t);
31 /**
32 * Afficher un tableau de caract`eres `a deux dimensions `a la console
33 * @pre t != null
34 * @post Le texte repr´esent´e par le tableau t est affich´e `a la console
35 * chaque ´el´ement du tableau repr´esentant une ligne de texte est
36 * affich´e suivi d’un retour `a la ligne `a la console
37 */
38 public static void print ( final char [][] t);
39 /**
40 * Afficher un tableau d’entiers
41 * @pre t != null
42 * @post Les ´el´ements du tableau t sont affich´es `a la console
43 * s´epar´es par des virgules . Un retour `a la ligne est ajout´e
44 */
45 public static void print ( final int [] t);
46 /**
47 * Affiche la table de c´esure
48 * @pre t != null
49 * @post La table de c´esure est affich´ee `a la console
50 * Chaque mot de la table est affich´e avec sa d´ecoupe
51 */
52 public static void print ( final Hyphenation t);
2.1 Le probl`eme
Concr`etement, on vous demande d’´ecrire une m´ethode qui prend en param`etre un tableau de caract`
eres, une longueur et une table pour la c´esure et qui va formater le texte comme montr´e en
introduction.
public char[][] format (char[] text, int width, Hyphenation table);
Votre m´ethode doit renvoyer un tableau de caract`eres `a deux dimensions. Chaque entr´ee du tableau
repr´esente une ligne du texte format´e sous la forme d’un tableau de caract`eres. Le tableau text
que vous recevez en param`etre repr´esente un paragraphe, n’oubliez pas de le nettoyer et faites bien
attention au fait que les mots ne sont pas forc´ement s´epar´es par une seule espace.
Commencez par bien comprendre le probl`eme qui vous est demand´e, r´efl´echissez `a l’algorithme que
vous allez utiliser pour le r´esoudre et ´ecrivez un pseudo-code. N’oubliez pas non plus de :
1. D´ecomposer le probl`eme en sous-probl`emes.
2. Donner la sp´ecification pr´ecise, compl`ete, non-ambig¨ue, . . . de chaque sous-probl`eme.
3. Pour chaque sous-probl`eme r´esolu avec une boucle, donner l’invariant.
Ces ´el´ements seront bien entendu pris en compte pour l’´evaluation de votre travail. Attention, ce
travail sera r´eutilis´e pour les prochains TPs de SINF1161, pensez donc `a bien commenter votre code.
Note importante
Les chaˆınes de caract`eres sont repr´esent´ees par la classe String. Cette classe regorge de nombreuses
m´ethodes qui permettent de manipuler les chaˆınes de caract`eres et vous les trouverez toutes sur le site
de sun qui donne la documentation de l’API Java2.
Pour la r´esolution de ce probl`eme, il est strictement interdit d’utiliser les
m´ethodes de la classe String, on vous demande de travailler sur un tableau de caract`eres. Toute
utilisation des m´ethodes de la classe String sera lourdement sanctionn´ee.
2.2 Bonus (2 points)
Si l’on regarde la derier exemple donn´e en introduction, on peut ˆetre d´egout´e par la derni`ere ligne qui
n’est pas esth´etiquement agr´eable pour nos yeux :
Ce texte contient plusieurs lignes
chaque ligne est de taille
diff´erente Parfois ce n’est
pas beau `a voir.
On aurait sans doute pr´ef´er´e quelque chose comme
Ce texte contient plusieurs lignes
chaque ligne est de taille
diff´erente Parfois ce n’est
pas beau `a voir.
On peut compter qu’il y a 17 espaces apr`es le point de la derni`ere ligne. Pour ce bonus, on vous
demande de g´erer le cas o`u il y a tellement d’espaces apr`es la fin du paragraphe que la derni`ere ligne
ne doit pas ˆetre format´ee pour que le texte reste esth´etique.
On vous fournit un param`etre suppl´ementaire qui est un pourcentage de la largeur disponible. Si le
nombre d’espace `a la fin du paragraphe est plus grand ou ´egal `a ce pourcentage, alors il ne faut pas
formater la derni`ere ligne. Pour l’exemple, on aurait par exemple 50%, ce qui correspondrait `a 50%
de 33 = 16 espaces.
public char[][] format (char[] text, int width, int percent, Hyphenation table);
D´ecrivez l’algorithme que vous allez utiliser, sp´ecifiez-le et impl´ementez-le dans votre programme Java.
voila, si il y en a qui ont le courage...