Dans cette série, vous apprendrez à améliorer la lisibilité de vos programmes en modularisant les traitements grĂ¢ce à des méthodes auxiliaires de main. Cette série est très longue, le but étant de vous fournir beaucoup de matériel d'entraînement (progresser en programmation ne se faisant que par beaucoup de pratique !). Les exercices 11 à 12 sont du matériel supplémentaire que vous pouvez laisser de côté dans un premier temps et y revenir plus tard dans le semestre en guise de révision.
Le but ici est de résoudre un petit exercice illustrant l'utilisation des méthodes auxiliaires.
Commencez comme d'habitude par ouvrir un nouveau fichier, par exemple ici Moyenne.java dans votre éditeur favori (par exemple XEmacs), puis préparez la "coquille vide" de base de votre programme :
class Moyenne { public static void main(String[] args) { } } |
Écrivez maintenant dans la méthode main, les instructions nécessaires pour demander deux notes à l'utilisateur et afficher leur moyenne.
Essayez de le faire par vous même sans regarder la solution ci-dessous
Solution :
La façon que nous avions jusqu'ici de réaliser un tel programme ressemble à peu près à ceci :
private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { double note1, note2; System.out.println("Entrez vos deux notes :"); note1 = scanner.nextDouble(); note2 = scanner.nextDouble(); double moyenne = note1 + note2; moyenne /= 2; System.out.println("Votre moyenne est : " + moyenne); } |
Vous avez peut-être utilisé des int au lieu des double ici.
C'est très bien : cela va aussi.
Cela signifie juste que pour vous une note est un nombre entier, alors que pour moi elle peut être fractionnaire
Continuons l'exercice pour maintenant introduire des méthodes auxiliaires.
Imaginons que ce programme rudimentaire soit amené à grandir et que le calcul de la moyenne soit nécessaire à plusieurs endroits différents du programme.
Il peut alors être judicieux de sortir le calcul de la moyenne du corps de la méthode main, de manière à ce qu'il puisse être réutilisé par d'autres parties du programme.
Nous voulons donc définir une méthode auxiliaire qui prenne deux
doubles comme paramètres, et retourne le résultat sous
forme de double.
Quel est alors l'entête de cette méthode ?
(sans regarder ;-))
L'entête de cette méthode est le suivant :
static double moyenne(double nombre1, double nombre2) { } |
Le corps de la fonction calcule la moyenne des paramètres, et retourne le résultat du calcul. Bien que les deux solutions ci-dessous soit équivalentes, nous préférerons la deuxième qui est plus courte et élégante :
// solution 1 static double moyenne(double nombre1, double nombre2) { // declaration et initialisation d'une variable double moyenne = nombre1 + nombre2; moyenne /=2; // la méthode renvoie la valeur de la variable moyenne return moyenne; } |
// solution 2 static double moyenne(double nombre1, double nombre2) { // la fonction renvoie directement la valeur // il n'est pas nécessaire d'utiliser une variable intermédiaire return (nombre1 + nombre2) / 2; } |
Il nous reste plus maintenant qu'à assembler les morceaux, c'est-à-dire faire appel à la fonction dans la méthode principale main.
Cela se fait simplement en mettant le nom de la fonction à appeler avec les paramètres voulus à l'endroit où l'on veut utiliser la valeur qu'elle retourne. Par exemple ici :
System.out.println("Votre moyenne est : " + moyenne(note1, note2)); |
Notez que la définition de notre méthode auxilaire
peut se trouver n'importe où (avant ou après la méthode ou les méthodes l'utilisant).
On arrive donc au résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Scanner; class Moyenne { private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { double note1, note2; System.out.println("Entrez vos deux notes :"); note1 = scanner.nextDouble(); note2 = scanner.nextDouble(); // appel System.out.println("Votre moyenne est : " + moyenne(note1, note2)); } // définition static double moyenne(double nombre1, double nombre2) { return (nombre1 + nombre2) / 2; } } |
Pour préparer le cours du mercredi 9.10.2024, vous pouvez, après avoir visionné les vidéos en lignes de la semaine 6 du MOOC, répondre au quiz de la même semaine : quiz de la semaine 6.
Entrez la largeur: ... Entrez la hauteur: ... Surface ('s/S') ou perimètre ('p/P')?: ... La surface est ...ou encore:
Entrez la largeur: ... Entrez la hauteur: ... Erreur: vous avez introduit une largeur ou une hauteur négative!Le programme devra être bien modularisé de sorte à ce que la méthode main se présente comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { double largeur = lireDonnee("largeur"); double hauteur = lireDonnee("hauteur"); boolean donneesOk = testerDonnees(largeur, hauteur); if (donneesOk) { calculer(largeur, hauteur); } else { afficherErreur(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
class Portee { public static void main(String[] args) { int x = 11; int y = 22; System.out.println("1. x = " + x); System.out.println("2. y = " + y); System.out.println(); calculer1(x, y); System.out.println("5. x = " + x); System.out.println("6. y = " + y); System.out.println(); calculer2(x, y); System.out.println("11. x = " + x); System.out.println("12. y = " + y); System.out.println(); int[] object = {5}; System.out.println("13. object [0] = " + object[0]); calculer3(object); System.out.println("15. object [0] = " + object[0]); } static void calculer1(int x, int y) { x = 878; y++; System.out.println("3. x = " + x); System.out.println("4. y = " + y); } static void calculer2(int a, int b) { int x = 33; int y = 44; a = 2 * x; b = 2 * y; System.out.println("7. x = " + x); System.out.println("8. y = " + y); System.out.println("9. a = " + a); System.out.println("10. b = " + b); } static void calculer3(int[] object) { object[0] = 37; System.out.println("14. object[0] = " + object[0]); } } |
Chacune des méthodes methode1 à methode8 dans le programme ErreursMethodes.java ci-dessous contient une seule erreur syntaxique. Il s'agit d'erreurs liées à l'utilisation des paramètres, des variables ou de la valeur retournée par la méthode. Il n'y pas d'erreurs dans la méthode main, ni dans la méthode methodeSansErreur. Trouvez et corrigez les erreurs !
Si vous sollicitez l'aide du compilateur pour trouver les erreurs, sachez qu'il aura de la peine avec ce type de programme où il y a beaucoup d'erreurs de structure. Il peut vous montrer la ligne approximative où se trouve une erreur, mais la solution proposée n'est pas toujours correcte, la liste des erreurs n'est pas toujours complète et les erreurs ne sont pas présentées dans le bon ordre. Dans ce genre de situation, utilisez surtout votre bon sens et vos propres connaissances de la syntaxe de Java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
class ErreursMethodes { public static void main(String[] args) { int i1 = methode1(); int i2 = methode2(); int i3 = methode3(); int i4 = methode4(); methode5(); methode6(); methode7(); methode8(); } static int methode1 { int a = 0; System.out.println("Méthode 1"); return a; } static int methode2() { int a = 0; i1 = 10; System.out.println("Méthode 2"); return a; } static int methode3() { int a = 0; System.out.println("Méthode 3"); } static int methode4() { String a = "0"; System.out.println("Méthode 4"); return a; } static void methode5() { double a = 0; System.out.println("Méthode 5"); return a; } static methode6() { double a = 0; System.out.println("Méthode 6"); return a; } static void methode7() { int a = 0; double b = 5.5; methodeSansErreur(a); System.out.println("Méthode 7"); } static void methode8() { int a = 0; String b = "5.5"; methodeSansErreur(a, b); System.out.println("Méthode 8"); } static void methodeSansErreur(int a, double b) { // Cette méthode ne fait rien du tout } } |
class ConcatIncorrecte { public static void main(String[] args) { String s = "China Blue"; System.out.println(s); concatener(s, " Express"); System.out.println(s); } public static void concatener(String s, String s2) { s +=s2; } } |
China Blue China Blue Expressau lieu de :
China Blue China Blue
Le programme Operations.java vous permettra d'exercer vos connaissances des tableaux de type int[] et des méthodes auxiliaires. Etudiez le fonctionnement du programme et complétez-le comme demandé ci-après.
3 7 1 9 2 8 9 1 2 5 Il y a 2 éléments de valeur 9 dans le tableau Il y a 7 éléments plus grand que 4 ou plus petit que 2 La somme des éléments est 47 La moyenne arithmétique des éléments est 4.7 Le plus grand élément vaut: 9 0 1 2 3 4 Il y a 0 éléments de valeur 9 dans le tableau Il y a 2 éléments plus grand que 4 ou plus petit que 2 La somme des éléments est 10 La moyenne arithmétique des éléments est 2.0 Le plus grand élément vaut: 4 5 6 7 8 9 10 11 12 13 14 Il y a 1 éléments de valeur 9 dans le tableau Il y a 10 éléments plus grand que 4 ou plus petit que 2 La somme des éléments est 95 La moyenne arithmétique des éléments est 9.5 Le plus grand élément vaut: 14 5 4 3 2 1 Il y a 0 éléments de valeur 9 dans le tableau Il y a 2 éléments plus grand que 4 ou plus petit que 2 La somme des éléments est 15 La moyenne arithmétique des éléments est 3.0 Le plus grand élément vaut: 5Code donné:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
class Operations { public static void main(String args[]) { // Construction d'un tableau: int[] tableau = {3, 7, 1, 9, 2, 8, 9, 1, 2, 5}; // Operations sur le tableau: operations(tableau); // La meme chose pour d'autres tableaux: int[] tableau1 = remplir1(5); operations(tableau1); int[] tableau2 = remplir2(10); operations(tableau2); int[] tableau3 = remplir3(5); operations(tableau3); } /** * Cette méthode retourne un tableau int[] de nb éléments * initialisés en ordre croissant de 0 à nb-1. * @param nb La taille du tableau (nombre d'élements). * @return tableau Le tableau correctement rempli. */ static int[] remplir1(int nb) { int[] tableau = new int[nb]; for (int i = 0; i < nb; i++) { tableau[i] = i; } return tableau; } /** * Cette méthode retourne un tableau int[] de nb éléments * initialisés en ordre croissant à partir de 5. * @param nb La taille du tableau (nombre d'élements). * @return tableau Le tableau correctement rempli. */ static int[] remplir2(int nb) { int[] tableau = new int[nb]; // A compléter return tableau; } /** * Cette méthode retourne un tableau int[] de nb éléments * initialisés en ordre décroissant de nb à 1. * @param nb La taille du tableau (nombre d'élements). * @return tableau Le tableau correctement rempli. */ static int[] remplir3(int nb) { int[] tableau = new int[nb]; // A compléter return tableau; } /** * Affiche le tableau puis effectue les opérations 1 à 5 sur le tableau. * @param tableau Le tableau à traiter. */ static void operations(int[] tableau) { afficher(tableau); operation1(tableau); operation2(tableau); operation3(tableau); operation4(tableau); operation5(tableau); } /** * Cette méthode affiche tous les éléments du tableau reçu en * paramètre sur une meme ligne. Les éléments sont séparés par * deux espaces. * @param tableau Le tableau à afficher. */ static void afficher(int[] tableau) { for (int i = 0; i < tableau.length; i++) { System.out.print(tableau[i]); System.out.print(" "); } // Saut de ligne à la fin de l'affichage System.out.println(); } /** * Cette méthode calcule et affiche le nombre d'éléments de valeur * 9 dans le tableau. La variable nb sert à compter les éléments * trouvés. Elle est initialisée à 0 et incrémentée dans la boucle * qui parcourt le tableau chaque fois que l'on trouve un 9. * @param tableau Le tableau à traiter. */ static void operation1(int[] tableau) { int nb = 0; for (int i = 0; i < tableau.length; i++) { if (tableau[i] == 9) nb++; } System.out.println("Il y a " + nb + " elements de valeur 9 dans le tableau"); } /** * Cette méthode calcule et affiche le nombre d'éléments qui sont * plus grand que 4 OU plus petit que 2. * @param tableau Le tableau à traiter. */ static void operation2(int[] tableau) { // A compléter } /** * Cette méthode calcule et affiche le somme de tous les éléments du tableau. * @param tableau Le tableau à traiter. */ static void operation3(int[] tableau) { // A compléter } /** * Cette méthode calcule et affiche la moyenne arithmétique de * tous les éléments du tableau. * @param tableau Le tableau à traiter. */ static void operation4(int[] tableau) { // A compléter } /** * Cette méthode calcule et affiche le plus grand élément du tableau. * @param tableau Le tableau à traiter. */ static void operation5(int[] tableau) { // A compléter } } |
La loi de Benford stipule que dans la vie de tous les jours, le chiffre 1 est plus fréquent que le 2, lui-même plus fréquent que le 3, etc ...
De façon générale, la loi dit que la fréquence d'apparition, f, de la première décimale (chiffre le plus à gauche), d, dans une suite de nombres exprimés en base 10 est donnée par :
f = log10(1 + 1/d)Ce qui aboutit au tableau de résultats suivants (fréquences relatives d'apparition de la 1ère décimale, exprimées en pourcentages) :
d | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
f | 30.1 | 17.6 | 12.5 | 9.7 | 7.9 | 6.7 | 5.8 | 5.1 | 4.6 |
qui s'interprète comme : dans une suite de nombres, par exemple les recettes mensuelles d'un restaurant, il y a environ 30.1% de nombres ayant 1 comme 1ère décimale, 17.6% de nombres ayant 2 comme première décimale etc..)
Le but de cet exercice est de tester la loi de Benford sur une suite de nombres générés automatiquement.
Le fichier fourni Benford.java contient déjà un programme principal qui vous servira à tester votre code.
Programmez dans ce fichier une méthode auxiliaire :
fillWithSquare(double[] numbers) |
Le tableau numbers stocke en fait la suite de nombres sur laquelle nous allons tester la loi de Benford.
Exemple de tableau construit :
{0.01, 0.04, 0.09, 0.16, 0.25, ...}
Libre à vous de modifier par la suite l'algorithme générant les données de ce tableau.
Programmez maintenant la méthode auxiliaire :
int extractMaxDigit(double number) |
Par exemple extractMaxDigit(-635.87) doit retourner 6.
Vous ne convertirez pas le nombre en String mais utiliserez les opérateurs arithmétiques (comme / , * ou \%).
Vous traiterez aussi le cas des nombres négatifs
Programmez une méthode analyze, construisant le tableau occurences à partir de la suite de nombres numbers.
Voici l'entête de la méthode :
void analyze(double[] numbers, int[] occurences) |
Chaque entrée occurences[i] stocke le nombre de fois où i+1 est le chiffre le plus à gauche dans la suite numbers.
Par exemple si numbers contient les nombres {0.01, 0.04, 0.09, 0.16, 0.25, 0.36, 0.49, 0.64} le tableau occurences sera
{2, 1, 1, 2, 0, 1, 0, 0, 1}
Vous utiliserez la méthode extractMaxDigit.
Programmez enfin une méthode testBenford affichant, au moyen du tableau occurences, une comparaison entre les prévisions de la loi de Benford et les fréquences effectives d'apparition des différentes décimales dans la suite numbers.
L'affichage se fera selon le modèle suivant :
Pourcentage effectif / Predictions de la loi de Benford : 1 : 28.000000000000004%, Benford : 30.10299956639812% 2 : 16.0%, Benford : 17.609125905568124% 3 : 12.0%, Benford : 12.493873660829994% 4 : 20.0%, Benford : 9.691001300805642% 5 : 8.0%, Benford : 7.918124604762482% 6 : 8.0%, Benford : 6.694678963061322% 7 : 0.0%, Benford : 5.799194697768673% 8 : 4.0%, Benford : 5.115252244738129% 9 : 4.0%, Benford : 4.575749056067514%Indications : la méthode double Math.log10(double x) retourne le logarithme en base 10 d'un nombre donné.
Testez votre programme au moyen du programme principal fourni.
Il devrait produire un affichage tel que :
Test 1.1 : 0.01 0.04 0.09 0.16 0.25 0.36 0.49 0.64 0.81 1.0 1.21 1.44 1.69 1.96 2.25 2.56 2.89 3.24 3.61 4.0 4.41 4.84 5.29 5.76 6.25 Test 1.2 : 0 6 2 5 4 Test 1.3 : 7 4 3 5 2 2 0 1 1 Test 1.4 : Comparaison des frequences avec les predictions de la loi de Benford : 1 : 28.000000000000004%, Benford : 30.10299956639812% 2 : 16.0%, Benford : 17.609125905568124% 3 : 12.0%, Benford : 12.493873660829994% 4 : 20.0%, Benford : 9.691001300805642% 5 : 8.0%, Benford : 7.918124604762482% 6 : 8.0%, Benford : 6.694678963061322% 7 : 0.0%, Benford : 5.799194697768673% 8 : 4.0%, Benford : 5.115252244738129% 9 : 4.0%, Benford : 4.575749056067514%
En mathématiques, deux nombres entiers sont dits amicaux si :
Par exemple 220 et 284 sont amicaux car :
somme des diviseurs de 220 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 + 220 = 504
somme des diviseurs de 284 = 1 + 2 + 4 + 71 + 142 + 284 = 504
220 + 284 = 504.
Le but de cet exercice est d’écrire une méthode afficherAmicaux qui prend en entrée un tableau d’entiers et retourne toutes les paires de nombres amicaux qu’il contient.
Chaque paire ne sera affichée qu’une fois.
Proposez une implémentation possible (en Java) pour la méthode afficherAmicaux.
Vous pouvez utiliser l'exemple auivant en guise de programme principal :
public static void main(String[] args) { int[] nombres = {1210, 45, 27, 220, 54, 284, 9890, 120, 1184}; System.out.println("Les paires de nombres amicaux sont : "); afficherAmicaux(nombres); } |
L'affichage qui en résulte devrait ressembler à ceci :
Les paires de nombres amicaux sont : 1210 1184 220 284
Modularisez votre code au moyen de méthodes auxiliaires.
Les devoirs du MOOC, même s'il ne sont pas notés pour vous, sont un bon moyen de vous entraîner aussi. Vous pouvez les soumettre à un correcteur automatique (autant de fois que vous le souhaitez) et recevoir un feedback. Cette semaine il est conseillé de programmer le devoir de la semaines 6.
La césure est la façon de couper les mots afin de pouvoir les imprimer sur deux ou plusieurs lignes. Un tiret à la fin de la ligne indique si le mot continue sur la ligne suivante. Exemple:
Aussitôt que le message lui parve- nait, le roi des rois sortait.Dans cet exercice, il est question de compléter un petit programme de césure appellé Cesure.java. Il y a 4 méthodes auxiliaires à compléter en utilisant notamment des méthodes prédéfinies de la classe String. Le programme à compléter ci-dessous devra lire une phrase sous la forme d'un tableau de chaines de caractères et indiquer les endroits où le(s) mot(s) peu(ven)t être coupé(s).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class Cesure { public static void main(String[] args) { String[] phrase = lirePhrase(); for (int i = 0; i < phrase.length; i++) { cesure(phrase[i]); } } static String[] lirePhrase() { // A compléter: // retourne un tableau de chaines de caractères // introduits par l'utilisateur } static boolean voyelle(char c) { // A compléter: // teste si un caractère est une voyelle } static boolean queVoyelles(String s) { // A compléter: // teste si une chaîne ne contient que des voyelles // utilise la méthode voyelle } static void cesure(String mot) { // A compléter: // détermine la césure d'un mot donné et effectue les affichages // correspondants (voir exemple de déroulement) } } |
Voici les trois règles de césure que vous devrez appliquer. Celles-ci ne correspondent évidemment pas aux véritables règles utilisées en français car le programme deviendrait trop compliqué pour le but de cet exercice.
>java Cesure Donnez le nombre de mots dans votre phrase: 1 Donnez le mot 1 : java Le résultat est : ja- va >java Cesure Donnez le nombre de mots dans votre phrase: 1 Donnez le mot 1 : calculer Le résultat est : ca- lcu- ler >java Cesure Donnez le nombre de mots dans votre phrase: 2 Donnez le mot 1 : tapis Donnez le mot 2 : rouge Le résultat est : ta- pis rou- ge >java Cesure Donnez le nombre de mots dans votre phrase: 3 Donnez le mot 1 : oeil Donnez le mot 2 : de Donnez le mot 3 : boeuf Le résultat est : oeil de boeuf >java Cesure Donnez le nombre de mots dans votre phrase: 0 entrez une valeur plus grande que 0Les méthodes suivantes de la classe String peuvent vous être utile (vous n'aurez pas forcément besoin de toutes ces méthodes):
Le but ici est de réaliser un Master-Mind(tm) élémentaire.
Le programme tirera une combinaison, demandera à l'utilisateur
de la retrouver sur la base de ses réponses successives.
Une combinaison sera représentée par une séquence de n
chiffres tirés parmi m (typiquement n=4 et
m=6).
Par exemple, une combinaison pourrait être
3251.
Dans un fichier MasterMind.java, deux entiers n et m valent respectivement 4 et 6. Déclarez deux tableaux de n entiers appelés laCombinaison, destiné à stocker la combinaison à deviner, et combinaison, destiné à stocker la combinaison proposée par l'utilisateur.
On veut écrire la méthode tirerCombinaison
qui tire une combinaison de n chiffres.
Pour cela, utilisez la méthode
static int hasard(int max) { return (1 + (int)(Math.random() * max)); }qui tire un nombre au hasard entre 1 et max (qui par défaut vaut m).
En utilisant cette méthode hasard, écrivez la méthode tirerCombinaison décrite ci-dessus, ayant comme entête quelque chose comme :
static void tirerCombinaison(int[] uneCombinaison ..);et qui affecte une combinaison au hasard à la variable uneCombinaison.
Note/Rappel : on utilise ici le fait qu'un tableau de taille fixe est toujours passé par référence et peut donc être directement modifié dans le corps de la méthode.
Remarque : Pour tester votre programme, il sera
peut être utile de modifier la méthode tirerCombinaison de sorte à ce qu'elle retourne une
combinaison connue choisie par vous pour vos tests.
Faites le simplement en écrivant "en dur" la combinaison que vous
voulez utiliser pour vos tests.
On s'intéresse maintenant à pouvoir entrer une réponse du joueur.
Définissez la méthode demanderCoup, analogue à tirerCombinaison, et qui remplit combinaison, par des valeurs demandées à l'utilisateur.
Voici un exemple d'interaction (voir aussi l'exemple complet à la fin de l'énoncé) :
Entrez les 4 chiffres de votre proposition: 1 2 3 4
On ne vous demande pas de sophistiquer les saisies au clavier : on suppose ici que l'utilisateur est coopératif et répond correctement (il donne bien 4 entiers).
Pour ceux qui ne connaissent pas le Master-Mind(tm), une réponse est constituée d'indicateurs (au plus n) de 2 types :
Par exemple, si la séquence à deviner est 1213 et que l'on a proposé 4516, la réponse sera "1 correct", ce qui correspond au deuxième 1.
Ce type de réponse sera noté par un '#'.
Par exemple, si la séquence à deviner est 1213 et que l'on a proposé 4562, la réponse sera "1 mal placé", ce qui correspond au 2.
Ce type de réponse sera noté par un 'O'.
Ces indicateurs sont cumulés pour tous les chiffres de la réponse.
Par exemple, si la séquence à deviner est 1213 et que l'on a proposé 4512, la réponse sera "#O", ce qui correspond respectivement au 1 et au 2.
Attention ! Un principe de base dans la génération des réponse est qu'un chiffre ne peut servir qu'une seule fois dans la réponse.
Par exemple, si la séquence à deviner est 1213 et que l'on a proposé 4156, la réponse est "O"
(c'est-à-dire un bon
chiffre mais mal placé : le 1) et non pas "OO" (pour le 1 deux fois mal
placé) car il n'y a qu'un seul 1 dans la
séquence proposée.
Par contre, si la solution proposée est 4151, la réponse sera bien "OO".
Un deuxième principe est que l'on n'indique pas quels chiffres sont bons ou bien placés. On indique uniquement leur nombre.
Ainsi si la séquence à deviner est 4213 et que l'on a proposé 5243, la réponse sera ##O et non pas .#O#.
Il s'agit maintenant de générer le code qui est capable de donner
la réponse correspondant à une proposition de l'utilisateur.
On va pour cela écrire une méthode compare.
La méthode compare va naturellement prendre deux arguments : les deux combinaisons à comparer qui, dans l'appel, correspondront à la référence à trouver et à la solution proposée par le joueur.
Que doit retourner la méthode compare ?
Non seulement si oui ou non (booléen) la solution proposée est la
bonne, mais aussi la réponse à donner, c'est-à-dire le nombre de
chiffres
corrects bien placés et le nombre de chiffres corrects mal placés. Ces
deux derniers chiffres seront stockés dans un tableau à deux éléments
appellé reponse:
le premier élément de reponse compte le nombre de chiffres corrects et bien placés, le second compte le nombre de bons chiffres mais mal placés (c'est-à-dire le nombre de chiffres de la proposition compris dans la solution mais à une autre place).
Ceci étant fait, l'entête de la méthode compare comportera au moins les paramètres suivants :
static boolean compare(int[]combinaison1, int[]combinaison2, int[] reponse);qui modifie directement le tableau reponse en mémoire.
Pour construire la réponse de compare :
Il ne reste plus qu'à assembler le tout !
Pour faciliter encore un peu plus l'écriture du code, écrivez deux méthodes d'affichage:
static void afficheCombinaison(int[] combinaison ..); static void afficheReponse(int[] reponse..);
La première méthode affichera une combinaison
en mettant un espace entre chaque chiffre. Il vous est possible d'ajouter tous les paramètres vous semblant nécessaires.
Par exemple :
1 2 3 4
Elle servira à afficher la solution si l'utilisateur ne trouve pas.
La seconde méthode permet d'afficher la réponse à un
coup.
Par exemple :
#ou
OOOou
##OOetc...
Pour finaliser le programme, écrivez, dans la méthode main le code suivant :
Un exemple d'exécution est donné plus bas.
Exemple positif :
Pourrez vous trouver ma combinaison de 4 chiffres [compris entre 1 et 6 avec répétitions possibles] en moins de 10 coups ? Entrez les 4 chiffres de votre proposition: 1 2 3 4 # Entrez les 4 chiffres de votre proposition: 5 6 1 2 OO Entrez les 4 chiffres de votre proposition: 1 5 1 5 #O Entrez les 4 chiffres de votre proposition: 1 1 6 6 ### Entrez les 4 chiffres de votre proposition: 1 1 6 1 #### Bravo ! Vous avez trouvé en 5 coups
Exemple négatif (raccourci) :
Pourrez vous trouver ma combinaison de 4 chiffres [compris entre 1 et 6 avec répétitions possibles] en moins de 10 coups ? Entrez les 4 chiffres de votre proposition: 1 1 1 1 ## Entrez les 4 chiffres de votre proposition: 1 1 2 2 OO ... Entrez les 4 chiffres de votre proposition: 4 6 1 1 ##OO Désolé vous n'avez pas trouvé... La bonne réponse était 6 4 1 1.
Dernière mise à jour: 11/10/2024 (Revision: 1.2)