← (précédent) B.3 Correction : Adresse e-mail valide
B.5 Correction : Tirage par ordre numérique
Accueil S O M M A I R E

B.4 Correction : Prose de M. Jourdain

Il y a toujours plus d'une façon de résoudre un problème. Les solutions proposées ici tiennent compte du caractère débutant des auditeurs. Donc, mes solutions seront toujours plus longues que celles d'un AS de la programmation.

NB : Créer une méthode c'est bien. Mais si elle est déjà prédéfinie par le langage, c'est nul.
Vous ne ferez jamais mieux que les créateurs de Java

Mini-projet 2 : Prose de Monsieur Jourdain

MAITRE DE PHILOSOPHIE :
On peut les mettre premièrement comme vous avez dit :
Belle Marquise, vos beaux yeux me font mourir d'amour.
Ou bien : D'amour mourir me font, belle Marquise, vos beaux yeux.
Ou bien : Vos yeux beaux d'amour me font, belle Marquise, mourir.
Ou bien : Mourir vos beaux yeux, belle Marquise, d'amour me font.
Ou bien : Me font vos yeux beaux mourir, belle Marquise, d'amour.

MONSIEUR JOURDAIN :
Mais de toutes ces façons-là, laquelle est la meilleure ?

MAITRE DE PHILOSOPHIE :
Celle que vous avez dite : Belle Marquise, vos beaux yeux me font mourir d'amour.

Certains d'entre vous se souviennent de ce passage du roman classique de molière : le bourgeois gentilhomme.

Le but de ce projet, vous l'avez probablement compris,


Ecrire un programme qui demande à l'utilisateur de saisir une phrase. Puis le programme affiche les mots de cette phrase dans un ordre pris au hasard.

Pistes : utilisez La méthode Math.random() et la méthode split() de la classe String
Correction mini-Projet 2 

1.     public class MiniProjet2
2.     {
3.          public static void main ()String [] args)
4.          {
5.               System.out.print("Saisissez votre phrase : ");
6.               String phrase = Lire.chaine(); phrase = phrase.trim();
7.               System.out.println();
8.
9.               // on crée un tableau dont chaque valeur est un mot de la phrase.
10.              String [] phrasard = phrase.split(" ");
11.              int t = phrasard.length;
12.               
13.             int [] tab = new int[t];
14.             do
15.             {
16.                  for(int i = 0; i < t; i++)
17.                  {
18.                       tab[i] = (int)(Math.random() * t);
19.                  }
20.             }
21.             while( !tabSansDoublons(tab) );
22.             
23.             for(int i = 0; i < t; i ++)
24.             {
25.                  System.out.print(phrasard[tab[i]] + " ");
26.             }
27.         }
28.          
29.         // méthode qui retourne le nombre d'éléments dans un tableau
30.         public static int nbreEltDansTablo(int elt, int [] tablo)
31.         {
32.               int a = 0;
33.               
34.               for(int i = 0; i < tablo.length; i++)
35.               {
36.                    if( tablo[i] == elt)
37.                    {
38.                         a++;
39.                    }
40.               }
41.               return a;
42.         }
43.         
44.         // méthode qui teste si un tableau a des doublons
45.         public static boolean tabSansDoublons(int [] tablo)
46.         {
47.              boolean verite = true;
48.              
49.              for(int i = 0; i < tablo.length; i++)
50.              {
51.                   if( nbreEltDansTablo(tablo[i], tablo) > 1 )
52.                   {
53.                        verite = false;
54.                        break;
55.                   }
56.              }
57.         }
58.    }
Commençons par expliquer la méthode split().
Elle requiert comme argument une epression régulière. Autrement dit, une chaine de caractères (ayant 1 ou plusieurs caractères) et qui se répète dans une autre chaine de caractères. Et la méthode est appliquée à un objet de type String. Puis la méthode retourne un tableau de String. Donc, un tableau de chaines de caractères. Plus concrètement, prenons un exemple.

String s = new String("I love you baby"); s.split(" ");. La chaine de caractères ne contenant l'espace " " se répète 3 fois ici. Donc, la méthode split() va donc casser la chaine s à tous les endroits où il y a espace. Résultat, nous aurons 4 morceaux qui sont "I", "love", "you" et "baby". C'est donc un tableau de chaines de caractères qui est retourné par la méthode split(). C'est pourquoi on peut mettre cette suite de chaines de caractères dans un tableau. Ce que j'ai fait en
ligne 10 : String [] phrasard = phrase.split(" ");
La chaine de caractères qui sera cassée étant la phrase que vous saisissez au clavier grâce à Lire.chaine() en ligne 6.

La suite des explications va être un peu moins évidente pour un débutant. Mais suivez attentivement car ce n'est pas si compliquée.

Si je demande l'affichage de chaque mot de cette phrase de façon classique, l'ordre des mots ne changera pas. A savoir :

for(int i = 0; i < phrasard.length; i++)
{
     System.out.print(phrasard[i] + " ");
}

Si phrasard est I love you baby, il sera affiché I love you baby. Alors comment faire pour que l'ordre change ?
C'est là qu'intervient la méthode Math.random().
Supposons que le tableau de type String contiennent 5 éléments. Ces derniers sont situés respectivement en positions : 0, 1, 2, 3 et 4. Il s'agit alors pour moi (pas forcément pour tous les programmeurs) de créer un tableau contenant ces indices (tableau de type int). Mais ces indices seront dans un ordre aléatoire (au hasard). Ainsi, lorsque j'utiliserai la boucle for pour afficher tous les éléments du tableau phrasrd, je ne choisirais pas la façon classique qui consiste à parcourir ce tableau grâce à l'indice i qui s'incrémente automatiquement. Mais plutôt à aller chercher l'indice dans ce tableau de type int. Puisque les valeurs de ce tableau de type int sont en fait les indices des éléments de phrasard, mais en ordre aléatoire, les mots affichés de la phrase s'afficheront dans un ordre quelconque. Je ne sais pas si mon explication vous semble accessible. Sinon, relisez un certain nombre de fois.
Dans tous les cas, passons au concret.

Jusqu'à la ligne 10, rien de compliqué. Un tableau de type String est créé. Puis on y affecte les mots de la variable phrase. Ce tableau, comme tout tableau possède un nombre d'éléments que j'appelle t en ligne 11.
en ligne 13, je crée un tablea de nombres entiers dont les valeurs seront les indices (les positions) des éléments du tableau phrasard. Alors, forcément, le tableau de type int (tab) a la même taille que le tableau phrasard. D'où la taille t = phrasrad.lentgh.
De la ligne 16 à la ligne 19, j'affecte à tous les éléments de tab, une variable de type int comprise entre 0 et t (t exclu). Ce qui correspond bien aux indices des éléments du tableau phrasard.
Mais il y a un petit problème. Ou plutôt, il pourrait y avoir un problème. Il est possible qu'en affectant à chaque élément de tab (tab[i]) une valeur numérique au hasard, il y ait des doublons. Ce qui veut dire que 2 éléments de tab peuvent avoir la même valeur. Et ça, ce n'est pas bon. Nous voulons afficher les mots d'une phrase au hasard. Mais nous ne voulons pas que un même mot apparaisse plus d'une fois.
Alors, il faut s'assurer qu'il n'y aura pas de doublons dans tab. C'est pourquoi je fus obligé de créer une méthode qui teste la présende de doublons dans un tableau. Et c'est la méthode qui se trouve entre les lignes 45 et 57 : public static boolean tabSansDoublons(int [] tablo)
Cette méthode est de type booléenne. Elle requiert un seul argument : le tableau dont on teste l'absence de doublons. Puis la méthode retourne true s'il y a effectivement absence de doublons et false dans le cas contraire.
La boucle for (L 16 à L 19 ) qui permet de créer un tableau de valeurs entières aléatoires, est mise dans une autre boucle (do...while). Pourquoi ?
Pour s'assurer que notre tableau de type int n'aura pas de doublons. C'est pourquoi (L 21), on a :
while( !tabSansDoublons(tab) );.
Ce qui veut dire tant que tab aura des doublons.

Revenons à la méthode tabSansDoublons().
J'ai dû créer une méthode public static int nbreEltDansTablo(int elt, int [] tablo) en ligne 30. afin que les choses, pour un débutant soient moins compliquées. Cette méthode retourne le nombre de fois où l'on trouve un élément dans un tableau. Cette méthode là est facile à comprendre. Cette méthode a été créée pour être utilisée dans tabSansDoublons() parce qu'un doublon est illustré justement par le nombre de fois où l'on trouve chaque élément dans un tableau.
J'utilise cette méthode en ligne 51. Et cette ligne veut dire que si le nombre de fois où l'on trouve un élément d'un tableau dans ce tableau est supérieur à 1, alors, la variable booléenne est false. Puis on sort de la boucle avec break. Parce qu'il suffit qu'on trouve un élément 2 fois dans un tableau, on est déjà en prséence d'un doublon. Pas la peine de continuer.

Après la ligne 21, notre tableau d'indices sans doublons est créé. Puis dans la boucle for ligne 23, on affiche les valeurs des éléments du tableau phrasard. Mais ici, on utilise pas li i qui varie de zéro à t (taille du tableau). Mais plutôt les valeurs du tableau tab (tab[i]). Et nous savons que ces valeurs sont issues du hasard grâce à Math.random().

La connaissance, c'est bien. La partager, c'est mieux
Conseiller ce site à un(e) ami(e):

Son e-mail est :       
Une suggestion à faire pour ce site ? ... Contact : webmaster@debutantprog.com
← (précédent) B.3 Correction : Adresse e-mail valide
B.5 Correction : Tirage par ordre numérique
Accueil S O M M A I R E

B.4 Correction : Prose de M. Jourdain