Ce cinquième chapitre concerne la notion de méthodes.
Le premier exercice concerne les nombres parfaits et le deuxième exercice les nombres premiers. Le troisième et le quatrième exercice portent sur le PGCD (Plus Grand Commun Diviseur). Le cinquième exercice est un programme d'éducation. Le sixième exercice fait deviner un nombre à l'utilisateur. Le septième exercice concerne la Puissance. Le huitième exercice concerne les Tours de Hanoi.
Les principales notions abordées sont les suivantes :
Notion de méthode ;
Composants graphiques simples ;
Méthodes mathématiques ;
Méthodes récursives ;
Nombres aléatoires ;
Visibilité des variables.
Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le Java en rapport avec le chapitre. Pour cela, vous pouvez consulter les tutoriels java de developpez à l'adresse suivante : https://java.developpez.com/cours/Cours en Java
Un nombre entier est parfait si ses facteurs y compris 1 mais hormis lui-même s'additionnent pour former le nombre.
Exemple: 6 est un nombre parfait (1 + 2 + 3).
Écrivez une méthode qui détermine si son paramètre nombre est parfait. Utilisez cette méthode dans une application graphique qui affiche tous les nombres parfaits entre 1 et 1000. Affichez aussi les facteurs de chacun de ces nombres pour vérifier.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Parfait.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import javax.swing.JFrame;
import javax.swing.JTextArea;
/** * <p>Détermine tous les nombres parfaits entre 1 et 1000. Un nombre entier est parfait si ses * facteurs y compris 1 mais hormis lui-même s'additionnent pour former le nombre.</p> * @author Sébastien ESTIENNE. */publicclass Parfait extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construit l'application.</p> */publicParfait()
{// Appel du constructeur de la classe JFrame.super("Parfait");
// Créer un JTextArea pour afficher les résultats.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
// Ajoute la zone de texte à la fenêtre.getContentPane().add(zoneSortie);
// Le contenu de la zone de texte.
StringBuilder sortie =newStringBuilder();
// Cherche les nombres parfaits.
sortie.append("Nombre\tFacteurs\n");
for(int i =1; i <1000; i++)
{if(estParfait(i))
{// Le nombre.
sortie.append(i).append("\t");
// Ses facteurs.for(int j =1; j <= i /2; j++)
{if(i % j ==0)
{
sortie.append(j).append(" ");
}}
sortie.append("\n");
}}// Met à jour la zone de texte.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(250, 130);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Déterminer si un nombre est parfait.</p> * @param nombreLe nombre à vérifier. * @return true si le nombre est parfait, false sinon. */publicbooleanestParfait(int nombre)
{// Somme des facteurs du nombre.int somme =0;
// Déterminer les facteurs du nombre.for(int i =1; i <= nombre /2; i++)
{if(nombre % i ==0)
{
somme += i;
}}return(nombre == somme);
}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newParfait();
}}
Un nombre entier est premier s'il n'est divisible que par 1 et lui-même.
Exemple : 2, 7, 13 sont des nombres premiers alors que 4, 9, 12 n'en sont pas.
Écrivez une méthode qui détermine si un nombre est premier. Insérez cette méthode dans une application graphique pour trouver tous les nombres premiers entre 1 et 1000.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Premier.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Détermine tous les nombres premiers entre 1 et 1000. Un nombre entier est premier s'il n'est * divisible que par 1 et lui-même.</p> * @author Sébastien ESTIENNE. */publicclass Premier extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construit l'application.</p> */publicPremier()
{// Appel du constructeur de la classe JFrame.super("Premier");
// Créer un JTextArea pour afficher les résultats.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
// Relier JTextArea à un JScrollPane pour pouvoir faire défiler les étapes.
JScrollPane defilant =newJScrollPane(zoneSortie);
// Ajoute la zone de texte à la fenêtre.getContentPane().add(defilant);
// Pour compter les nombres premiers.int cpt =0;
// Le contenu de la zone de texte.
StringBuilder sortie =newStringBuilder();
// Cherche les nombres premiers.
sortie.append("Nombres\n");
for(int i =1; i <1000; i++)
{if(estPremier(i))
{
cpt++;
sortie.append(i).append(" ");
if(cpt %10==0)
{
sortie.append("\n");
}}}// Met à jour la zone de texte.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(300, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Détermine si un nombre est premier.</p> * @param nombreLe nombre à vérifier. * @return true si le nombre est premier, sinon false. */publicbooleanestPremier(int nombre)
{// Limite des facteurs.int limite =(int) Math.sqrt(nombre);
// Vérifier s'il possède des facteurs.for(int i =2; i <= limite; i++)
{if(nombre % i ==0)
{returnfalse;
}}returntrue;
}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newPremier();
}}
Le plus grand diviseur commun (PGCD) de deux nombres entiers est le plus grand entier qui puisse diviser les deux nombres.
Écrivez une méthode non récursive qui renvoie le PGCD de deux nombres passés en paramètres. Utilisez cette méthode dans une application graphique qui demande les deux valeurs à l'utilisateur et affiche le résultat dans une barre d'état.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Pgcd.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
/** * <p>Méthode non récursive qui renvoie le PGCD de deux nombres. Le plus grand diviseur commun * (PGCD) de deux nombres entiers est le plus grand entier qui puisse diviser les deux nombres.</p> * @author Sébastien ESTIENNE. */publicclass Pgcd extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construit l'application.</p> */publicPgcd()
{// Appel du constructeur de la classe JFrame.super("Pgcd");
// Créer un JTextArea pour afficher les résultats.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
// Ajoute la zone de texte à la fenêtre.getContentPane().add(zoneSortie);
// Premier nombre entré par l'utilisateur.
String sNombre1 ="";
// Second nombre entré par l'utilisateur.
String sNombre2 ="";
// Premier nombre converti.int nombre1 =0;
// Second nombre converti.int nombre2 =0;
// Calcul du pgcd.int resultat =0;
// Demander à l'utilisateur un premier nombre et le convertir.
sNombre1 = JOptionPane.showInputDialog("Entrez un premier nombre :\n\n");
try{
nombre1 = Integer.parseInt(sNombre1);
}catch(NumberFormatException e)
{
nombre1 =0;
}// Demander à l'utilisateur un deuxième nombre et le convertir.
sNombre2 = JOptionPane.showInputDialog("Entrez un second nombre :\n\n");
try{
nombre2 = Integer.parseInt(sNombre2);
}catch(NumberFormatException e)
{
nombre2 =0;
}// Calculer le pgcd de ces deux nombres
resultat =pgcd(nombre1, nombre2);
// Met à jour la zone de texte.
zoneSortie.setText("pgcd( "+ Integer.toString(nombre1) +", "+ Integer.toString(nombre2)
+" ) = "+ Integer.toString(resultat));
// Modifie les propriétés de la fenêtre.setSize(200, 100);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Déterminer le pgcd de deux nombres.</p> * @param xLe premier nombre. * @param yLe second nombre. * @return Le pgcd de des deux nombres. */publicintpgcd(int x, int y)
{while(x !=0&& y !=0)
{if(x > y)
{
x -= y;
}else{
y -= x;
}}if(x !=0)
{return x;
}return y;
}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newPgcd();
}}
Le plus grand diviseur commun (PGCD) de deux nombres entiers est le plus grand entier qui puisse diviser les deux nombres.
Écrivez une méthode récursive qui renvoie le PGCD de deux nombres passés en paramètres. Utilisez cette méthode dans une application graphique qui demande les deux valeurs à l'utilisateur et affiche le résultat dans une barre d'état.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Pgcd2.java * Crée le: 03 décembre 2006. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
/** * <p>Méthode récursive qui renvoie le PGCD de deux nombres. Le plus grand diviseur commun (PGCD) * de deux nombres entiers est le plus grand entier qui puisse diviser les deux nombres.</p> * @author Sébastien ESTIENNE. */publicclass Pgcd2 extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construit l'application.</p> */publicPgcd2()
{// Appel du constructeur de la classe JFrame.super("Pgcd2");
// Créer un JTextArea pour afficher les résultats.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
// Ajoute la zone de texte à la fenêtre.getContentPane().add(zoneSortie);
// Premier nombre entré par l'utilisateur.
String sNombre1 ="";
// Second nombre entré par l'utilisateur.
String sNombre2 ="";
// Premier nombre converti.int nombre1 =0;
// Second nombre converti.int nombre2 =0;
// Calcul du pgcd.int resultat =0;
// Demander à l'utilisateur un premier nombre et le convertir.
sNombre1 = JOptionPane.showInputDialog("Entrez un premier nombre :\n\n");
try{
nombre1 = Integer.parseInt(sNombre1);
}catch(NumberFormatException e)
{
nombre1 =0;
}// Demander à l'utilisateur un deuxième nombre et le convertir.
sNombre2 = JOptionPane.showInputDialog("Entrez un second nombre :\n\n");
try{
nombre2 = Integer.parseInt(sNombre2);
}catch(NumberFormatException e)
{
nombre2 =0;
}// Calculer le pgcd de ces deux nombres
resultat =pgcd(nombre1, nombre2);
// Met à jour la zone de texte.
zoneSortie.setText("pgcd( "+ Integer.toString(nombre1) +", "+ Integer.toString(nombre2)
+" ) = "+ Integer.toString(resultat));
// Modifie les propriétés de la fenêtre.setSize(200, 100);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Déterminer le pgcd de deux nombres.</p> * @param xLe premier nombre. * @param yLe second nombre. * @return Le pgcd de des deux nombres. */publicintpgcd(int x, int y)
{if(y ==0)
{return x;
}returnpgcd(y, x % y);
}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newPgcd2();
}}
Construisez un programme qui aide les étudiants de niveau élémentaire à apprendre l'addition, la soustraction, la multiplication et la division.
L'étudiant doit pouvoir choisir au lancement du programme entre cinq types de problèmes arithmétiques via une boîte de dialogue :
1 : addition ;
2 : soustraction ;
3 : multiplication ;
4 : division ;
5 : tous types.
L'étudiant doit ensuite pouvoir sélectionner le niveau de difficulté toujours via une boîte de dialogue :
1 : nombres à un seul chiffre ;
2 : nombres à deux chiffres ;
3 : nombres à 3 chiffres.
Utilisez « Math.random » pour générer aléatoirement des nombres.
Le programme affiche ensuite la question dans en haut de la fenêtre. Exemple : Combien fait 27 + 35? L'étudiant entre sa réponse au moyen d'un JTextField.
Si la réponse est correcte, un des messages suivants est affiché dans l'application :
C'est très bien !
Excellent !
Tu fais du beau travail !
Bonne réponse, continue.
Et une nouvelle question est posée.
Si la réponse est incorrecte, un des messages suivants est affiché dans l'application :
Désolé, essaie encore. ;
Mauvaise réponse. Essaie une autre fois ;
Non, essaie à nouveau.
Et la même question est reposée.
Pour déterminer la phrase qui sera affichée, utilisez un nombre aléatoire entre 1 et 4. Utilisez ensuite une structure switch pour afficher les messages.
Le programme doit compter le nombre de réponses correctes et incorrectes entrées par l'étudiant. Au bout de 10 réponses, calculez le taux de réponses correctes. Si celui-ci est inférieur à 75 %, affichez le message « SVP, Demande à ton professeur de t'aider ».
Une nouvelle session doit ensuite démarrer.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Education.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
/** * <p>Programme qui aide les étudiants de niveau élémentaire à apprendre l'addition, la * soustraction, la multiplication et la division.</p> * @author Sébastien ESTIENNE. */publicclass Education extends JFrame implements ActionListener
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** Solution de l'opération. */privateint solution =0;
/** Nombre de réponses correctes. */privateint nbRepCorrectes =0;
/** Nombre de réponses fausses. */privateint nbRepFausses =0;
/** Niveau de difficulté. */privateint niveau =0;
/** Type d'exercice (+, -, *, /, tous). */privateint typeExo =0;
/** L'opération entre les deux nombres. */privatechar cOperateur ='+';
/** Etiquette pour la question. */private JLabel etiquetteQuestion;
/** Etiquette pour la réponse. */private JLabel etiquetteReponse;
/** Champ texte pour la réponse. */private JTextField champReponse;
/** Etiquette pour un commentaire. */private JLabel etiquetteCommentaire;
/** * <p>Construit l'application.</p> */publicEducation()
{// Appel du constructeur de la classe JFrame.super("Education");
// Obtenir le panneau de contenu et changer son layout en un FlowLayout.
Container conteneur =getContentPane();
conteneur.setLayout(newFlowLayout());
// Créer l'étiquette et le champ texte du nombre à deviner.this.etiquetteQuestion =newJLabel("");
conteneur.add(this.etiquetteQuestion);
this.etiquetteReponse =newJLabel("Votre réponse : ");
conteneur.add(this.etiquetteReponse);
this.champReponse =newJTextField(5);
this.champReponse.setEditable(true);
conteneur.add(this.champReponse);
this.champReponse.addActionListener(this);
this.etiquetteCommentaire =newJLabel("");
conteneur.add(this.etiquetteCommentaire);
// Initialiser le niveau de difficulté.iniNiveau();
// Initialiser le type d'exercice.iniExercice();
// Initialiser la question.nouvelleQuestion();
// Modifie les propriétés de la fenêtre.setSize(210, 110);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Traiter une réponse.</p> * @param actionEventUn événement sémantique qui indique qu'une action s'est produite dans le * composant concerné. */publicvoidactionPerformed(ActionEvent actionEvent)
{// Reponse de l'utilisateur.int reponse =0;
// Indique si la réponse est valide ou non.boolean valide =true;
// Convertir le nombre entré par l'utilisateur.try{
reponse = Integer.parseInt(this.champReponse.getText());
}// Traite le cas lorsque la valeur rentrée par l'utilisateur n'est pas un nombre entier.catch(NumberFormatException e)
{
valide =false;
}// Vider les champs.this.champReponse.setText("");
this.etiquetteCommentaire.setText("");
// Vérifier la validité de la réponse.
String commentaire ="";
if(valide && reponse ==this.solution)
{
commentaire =reponseCorrecte();
this.nbRepCorrectes++;
nouvelleQuestion();
}else{
commentaire =reponseFausse();
this.nbRepFausses++;
}// Modifie les commentaires suite à la réponse de l'utilisateur.this.etiquetteCommentaire.setText(commentaire);
// Cas de fin de l'exercice.if(this.nbRepCorrectes +this.nbRepFausses ==10)
{// Message de taux de réussite.
String message;
// Taux de réussite.int taux;
taux =this.nbRepCorrectes *100/(this.nbRepCorrectes +this.nbRepFausses);
message ="Taux de réussite : "+ taux +"%.";
if(taux <75)
{
message +="\n\nDemande à ton professeur de t'aider.";
}// Affiche le résultat.
JOptionPane.showMessageDialog(null, message, "Taux de réussite",
JOptionPane.INFORMATION_MESSAGE);
// Initialisation pour l'exercice suivant.iniNiveau();
iniExercice();
nouvelleQuestion();
this.nbRepCorrectes =0;
this.nbRepFausses =0;
}}/** * <p>Génère un nombre aléatoire.</p> * @return Le nombre généré aléatoirement. */publicintgenereNombre()
{return(1+(int) (Math.random() * Math.pow(10.0, this.niveau)));
}/** * <p>Afficher une nouvelle question dans la barre d'état.</p> */publicvoidnouvelleQuestion()
{// Initialiser les nombres.int nombre1 =genereNombre();
int nombre2 =genereNombre();
// Génère un opérateur.if(this.typeExo ==5)
{// Nombre aléatoire entre 0 et 3.int i =(int) (Math.random() *4);
// Sélectionne un type d'opération au hasard.switch(i)
{case1:
this.cOperateur ='+';
break;
case2:
this.cOperateur ='-';
break;
case3:
this.cOperateur ='*';
break;
default:this.cOperateur ='/';
break;
}}// Calculer la solution.switch(this.typeExo)
{case1:
this.solution = nombre1 + nombre2;
break;
case2:
this.solution = nombre1 - nombre2;
break;
case3:
this.solution = nombre1 * nombre2;
break;
case4:
this.solution = nombre1 / nombre2;
break;
default:break;
}// Met à jour la question.this.etiquetteQuestion.setText("Combien font "+ nombre1 +" "+this.cOperateur +" "+ nombre2 +".");
}/** * <p>Sélectionne au hasard une phrase de réponse correcte.</p> * @return La réponse correcte au hasard. */public String reponseCorrecte()
{// Nombre aléatoire entre 0 et 3.int i =(int) (Math.random() *4);
// Initialisation de la phrase en fonction du nombre aléatoire.switch(i)
{case0:
return"C'est très bien!";
case1:
return"Excellent!";
case2:
return"Tu fais du beau travail!";
default:return"Bonne réponse, continue!";
}}/** * <p>Sélectionne au hasard une phrase de réponse fausse.</p> * @return La réponse fausse au hasard. */public String reponseFausse()
{// Nombre aléatoire entre 0 et 3.int i =(int) (Math.random() *4);
// Initialisation de la phrase en fonction du nombre aléatoire.switch(i)
{case0:
return"Désolé, essai encore.";
case1:
return"Mauvaise réponse. Essaie encore.";
case2:
return"Ne lâche pas, tu y es presque!";
default:return"Non, essaie à nouveau.";
}}/** * <p>Initialisation du niveau de difficulté.</p> */publicvoidiniNiveau()
{
String sNiveau ="";
this.niveau =0;
// Demander à l'utilisateur le niveau de difficulté tant que le niveau saisi est incorrect.while(this.niveau <1||this.niveau >3)
{
sNiveau = JOptionPane.showInputDialog("Entrez le niveau de difficulté : \n"+" 1 - Facile\n"+" 2 - Moyen\n"+" 3 - Difficile\n\n");
try{this.niveau = Integer.parseInt(sNiveau);
}catch(NumberFormatException e)
{this.niveau =-1;
}}}/** * <p>Initialisation du type d'exercice.</p> */publicvoidiniExercice()
{
String sTypeExo;
this.typeExo =0;
// Demander à l'utilisateur le type d'exercice tant que le niveau saisi est incorrect.while(this.typeExo <1||this.typeExo >5)
{
sTypeExo = JOptionPane.showInputDialog("Entrez le niveau de difficulté : \n"+" 1 - Addition\n"+" 2 - Soustraction\n"+" 3 - Multiplication\n"+" 4 - Division\n"+" 5 - Tous types\n\n");
try{this.typeExo = Integer.parseInt(sTypeExo);
}catch(NumberFormatException e)
{this.typeExo =-1;
}}// Sélectionne un type d'opération.switch(this.typeExo)
{case1:
this.cOperateur ='+';
break;
case2:
this.cOperateur ='-';
break;
case3:
this.cOperateur ='*';
break;
case4:
this.cOperateur ='/';
break;
default:break;
}}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newEducation();
}}
Écrivez une application graphique qui demande à l'utilisateur de deviner un nombre entier (choisi aléatoirement) entre 1 et 1000. L'application affiche « Devinez le nombre que j'ai choisi entre 1 et 1000 : ».
Un JTextField en dessous permet à l'utilisateur de rentrer un nombre et de valider avec la touche entrée. Si la réponse est incorrecte le programme affiche « Trop grand, essayez encore! » ou « Trop petit, essayez encore » dans une barre d'état et vide le JTextField. Lorsque la réponse est correcte, affichez « Félicitation, vous avez deviné le nombre! ».
Comptez le nombre d'essais du joueur. Quand le joueur a trouvé le nombre, si le nombre de tentatives est inférieur à 10 affichez « Soit vous connaissez le secret, soit vous êtes chanceux! ». Si le nombre de tentatives est égal à 10 affichez « D'accord, vous connaissez le secret! ». Sinon, affichez « Vous pouvez certainement faire mieux! ».
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Deviner.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
/** * <p>Fait deviner un nombre entier choisi aléatoirement à l'utilisateur entre 1 et 1000.</p> * @author Sébastien ESTIENNE. */publicclass Deviner extends JFrame implements ActionListener
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** Le nombre de l'utilisateur converti en entier. */privateint nombre =0;
/** Le nombre à deviner. */privateint hasard =0;
/** Le nombre d'essais de l'utilisateur. */privateint nbEssais =0;
/** Indique si la saisie de l'utilisateur est valide. */privateboolean saisieValide =false;
/** Etiquette du nombre à deviner. */private JLabel etiquetteDevine;
/** Champ texte du nombre à deviner. */private JTextField champDevine;
/** Etiquette indiquant l'état du jeu. */private JLabel etiquetteEtat;
/** * <p>Construction de l'application.</p> */publicDeviner()
{// Appel du constructeur de la classe JFrame.super("Deviner");
// Obtenir le panneau de contenu et changer son layout en un FlowLayout.
Container conteneur =getContentPane();
conteneur.setLayout(newFlowLayout());
// Créer l'étiquette et le champ texte du nombre à deviner.this.etiquetteDevine =newJLabel("Devinez le nombre que j'ai choisi entre "+"1 et 1000 :");
conteneur.add(this.etiquetteDevine);
this.champDevine =newJTextField(5);
this.champDevine.setEditable(true);
conteneur.add(this.champDevine);
this.champDevine.addActionListener(this);
this.etiquetteEtat =newJLabel("");
conteneur.add(this.etiquetteEtat);
// Initialiser le nombre à deviner.this.hasard =initialiserNombre();
// Initialiser le nombre d'essais.this.nbEssais =0;
// Modifie les propriétés de la fenêtre.setSize(340, 110);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Traite une proposition de l'utilisateur.</p> * @param actionEventUn événement sémantique qui indique qu'une action s'est produite dans le * composant concerné. */publicvoidactionPerformed(ActionEvent actionEvent)
{// Convertir le nombre entré par l'utilisateur.try{this.nombre = Integer.parseInt(this.champDevine.getText());
this.saisieValide =true;
}// Effectue un traitement particulier lorsque la valeur saisie n'est pas un entier.catch(NumberFormatException e)
{this.saisieValide =false;
}// Vider le champ de la proposition de l'utilisateur.this.champDevine.setText("");
// Afficher un message d'état du jeu.afficherMessage();
}/** * <p>Initialiser le nombre à deviner.</p> * @return Le nombre à deviner. */publicintinitialiserNombre()
{return(1+(int) (Math.random() *1000));
}/** * <p>Détermine si l'utilisateur a trouvé le nombre et affiche le message adéquat dans la barre * d'état.</p> */publicvoidafficherMessage()
{if(!this.saisieValide)
{this.etiquetteEtat.setText("La valeur saisie n'est pas un nombre.");
}elseif(this.nombre ==this.hasard)
{// Le commentaire.
String commentaire;
// Afficher un message de félicitation dans la barre d'état.this.etiquetteEtat.setText("Félicitation vous avez trouvé. Vous pouvez recommencer.");
// Déterminer le commentaire à afficher.if(this.nbEssais ==10)
{
commentaire ="D'accord, vous connaissez le secret!";
}elseif(this.nbEssais <10)
{
commentaire ="Soit vous connaissez le secret, soit vous êtes chanceux!";
}else{
commentaire ="Vous pouvez certainement faire mieux!";
}// Afficher la phrase aléatoire.
JOptionPane.showMessageDialog(null, commentaire, "Commmentaire",
JOptionPane.INFORMATION_MESSAGE);
// Réinitialiser le nombre à deviner et le nombre d'essais.this.hasard =initialiserNombre();
this.nbEssais =0;
}// Afficher une aide pour trouver le nombre et incrémenter le nombre d'essais.else{if(this.nombre <this.hasard)
{this.etiquetteEtat.setText("Trop petit, essayez encore.");
this.nbEssais++;
}else{this.etiquetteEtat.setText("Trop grand, essayez encore.");
this.nbEssais++;
}}}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newDeviner();
}}
Écrivez une méthode récursive puissance(bas, exposant) qui renvoie base à la puissance exposant.
Exemple : puissance(5, 3) = 5 * 5 * 5.
Intégrez cette méthode à une application graphique qui permette à l'utilisateur d'entrer la base et l'exposant.
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Puissance.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
/** * <p>Classe illustrant la méthode récursive puissance.</p> * @author Sébastien ESTIENNE. */publicclass Puissance extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicPuissance()
{// Appel du constructeur de la classe JFrame.super("Puissance");
// Créer un JTextArea pour afficher les résultats.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
// Obtenir le panneau de contenu.
Container conteneur =getContentPane();
// Lier aireSortie au conteneur.
conteneur.add(zoneSortie);
// Demande à l'utilisateur un premier nombre et le converti.int base =0;
boolean saisieValide =false;
while(!saisieValide)
{// Demander à l'utilisateur la base.
String sBase = JOptionPane.showInputDialog("Entrez la base :\n\n");
try{// Essaie de convertir la valeur saisie.
base = Integer.parseInt(sBase);
saisieValide =true;
}// Effectue un traitement particulier lorsque la valeur saisie n'est pas un entier.catch(NumberFormatException e)
{
saisieValide =false;
}}// Demander à l'utilisateur un deuxième nombre et le convertir.int exposant =0;
saisieValide =false;
while(!saisieValide)
{// Demander à l'utilisateur l'exposant.
String sExposant = JOptionPane.showInputDialog("Entrez l'exposant :\n\n");
try{// Essaie de convertir la valeur saisie.
exposant = Integer.parseInt(sExposant);
saisieValide =true;
}// Effectue un traitement particulier lorsque la valeur saisie n'est pas un entier.catch(NumberFormatException e)
{
saisieValide =false;
}}// Calculer base à la puissance exposant.int resultat =puissance(base, exposant);
// Met à jour la zone de sortie.
zoneSortie.setText(base +" puissance "+ exposant +" est égal à "+ Integer.toString(resultat));
// Modifie les propriétés de la fenêtre.setSize(300, 150);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Calculer une 'base' à la puissance 'exposant'.</p> * @param bLe nombre à élever (la base). * @param eL'exposant du nombre. * @return Le résultat du nombre élevé à la puissance. */publicintpuissance(int b, int e)
{// b : base & e : exposantif(e ==1)
{return b;
}return b *puissance(b, e -1);
}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newPuissance();
}}
Les tours de Hanoi sont composées de trois piquets. Au départ, la pile contient un certain nombre de disques sur le premier piquet empilés du plus grand au plus petit, de bas en haut. Le but est de déplacer tous les disques du premier piquet au troisième piquet sans que jamais un disque plus grand ne se retrouve au-dessus d'un disque plus petit. Le deuxième piquet permet d'empiler temporairement des disques.
L'algorithme récursif permettant de résoudre ce problème est le suivant :
Déplacer n-1 disques du premier piquet au deuxième piquet en utilisant le troisième piquet comme piquet d'empilement temporaire ;
Déplacer le dernier disque du premier piquet au troisième piquet. (le plus grand) ;
Déplacer n-1 disques du deuxième piquet au troisième piquet en utilisant le premier piquet comme piquet d'empilement temporaire.
Créez une application graphique résolvant ce problème. Le nombre de disques étant saisi par l'intermédiaire d'un JTextField. La méthode tour à écrire prend 4 paramètres : le nombre de disques, le piquet où sont placés les disques au départ, le piquet servant d'empilement temporaire et le piquet sur lequel doivent être les disques à la fin.
Ainsi le programme doit afficher les étapes de déplacement des disques d'un piquet à un autre dans un JTextArea avec défilement.
Exemple avec un nombre de disques égal à 3 :
1 -> 3
1 -> 2
3 -> 2
1 -> 3
2 -> 1
2 -> 3
1 -> 3
Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.
/* * Fichier: Hanoi.java * Crée le: 03 décembre 2006. * Modifié: 7 juillet 2007. * Auteurs: Sébastien ESTIENNE. * SiteWeb: http://www.prog-info.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */package chapitre5;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Résout le problème des tours de Hanoi.</p> * @author Sébastien ESTIENNE. */publicclass Hanoi extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** Les différentes étapes. */private StringBuilder sortie;
/** * <p>Construction de l'application.</p> */publicHanoi()
{// Appel du constructeur de la classe JFrame.super("Hanoi");
// Créer un JTextArea pour afficher les résultats.
JTextArea aireSortie =newJTextArea();
aireSortie.setEditable(false);
// Obtenir le panneau de contenu.
Container conteneur =getContentPane();
// Relier JTextArea à un JScrollPane pour pouvoir faire défiler les étapes.
JScrollPane defilant =newJScrollPane(aireSortie);
// Lier JScrollPane au conteneur.
conteneur.add(defilant);
// Demander à l'utilisateur le nombre de disques.int nbDisques =0;
while(nbDisques <=1|| nbDisques >12)
{
String sNbDisques = JOptionPane
.showInputDialog("Entrez le nombre de disques (2-12) :\n\n");
try{
nbDisques = Integer.parseInt(sNbDisques);
}catch(NumberFormatException e)
{// Affiche un message d'erreur.
JOptionPane.showMessageDialog(null,
"Le nombre de disques doit être compris entre 2 et 12.", "Erreur",
JOptionPane.INFORMATION_MESSAGE);
}}// Initialiser la chaine de sortie.this.sortie =newStringBuilder();
// Calculer les étapes.tour(nbDisques, 1, 2, 3);
// Afficher le résultat. (les étapes)
aireSortie.setText("Nombre de disques : "+ nbDisques +"\n\n"+this.sortie);
// Modifie les propriétés de la fenêtre.setSize(350, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Enregistre les différentes étapes.<p> * @param nbLe nombre de disques. * @param iniLe piquet de départ. * @param tmpLe piquet intermédiaire. * @param finLe piquet de fin. */publicvoidtour(int nb, int ini, int tmp, int fin)
{// Cas de base.if(nb ==1)
{this.sortie.append(ini).append(" -> ").append(fin).append("\n");
}// Récursivitéelse{// Déplacer n-1 disques du piquet ini au piquet tmp à l'aide du piquet fin.tour(nb -1, ini, fin, tmp);
// Déplacer le dernier disque du piquet ini au piquet fin.this.sortie.append(ini).append(" -> ").append(fin).append("\n");
// Déplacer n-1 disques du piquet tmp au piquet fin à l'aide du piquet ini.tour(nb -1, tmp, ini, fin);
}}/** * <p>Lance l'application.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newHanoi();
}}
Je tiens à remercier wichtounet pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.
Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants :