Exercices en Java (07-Programmation basée sur les objets)
Ce septième chapitre concerne la programmation basée sur les objets.
Il comporte huit exercices. Le premier exercice illustre la notion de classe et se nomme « Livre ». Le deuxième exercice est une classe portant sur le « Temps ». Les troisième et quatrième exercices sont deux classes faisant appel à quelques notions simples d'arithmétique. Les cinquième et sixième exercices sont des classes portant sur de la géométrie : « Rectangle » et « Point ». Les deux derniers exercices font intervenir la notion d'énumération.
Les principales notions abordées sont les suivantes :
La notion d'encapsulation ;
Le masquage des données ;
Abstraction de données et types de données abstraits ;
Notion de classe ;
Constructeur et surcharge de constructeurs ;
Variables et méthodes d'une classe ;
Variables et méthodes statiques ;
Création, modification et suppression d'objets ;
Accès aux variables d'instances et aux méthodes ;
Accesseurs et mutateurs ;
La référence this ;
Les énumérations (Java 5.0).
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
Écrivez une classe Livre avec les attributs suivants :
titre : le titre du livre ;
auteur : l'auteur du livre ;
prix : le prix du livre ;
annee : l'année du livre.
La classe Livre doit disposer des constructeurs suivants :
Livre() ;
Livre(titre) ;
Livre(titre, auteur) ;
Livre(titre, auteur, prix) ;
Livre(titre, auteur, prix, annee) ;
Livre(Livre).
La classe Livre doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Livre.
Écrivez aussi une classe TestLivre afin de tester la classe Livre.
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: Livre.java * Crée le: 13 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.livre;
import java.text.DecimalFormat;
/** * <p>Classe représentant un livre.</p> * @author Sébastien ESTIENNE. */publicclass Livre
{/** Le titre du livre. */private String titre;
/** L'auteur du livre. */private String auteur;
/** Le prix du livre. */privatedouble prix;
/** L'année du livre. */privateint annee;
/** * <p>Constructeur par défaut d'un livre.</p> */publicLivre()
{this("", "", 0.0, 0);
}/** * <p>Constructeur de livre avec un titre spécifié.</p> * @param titreLe titre du livre. */publicLivre(String titre)
{this(titre, "", 0.0, 0);
}/** * <p>Constructeur de livre avec un titre et un auteur spécifiés.</p> * @param titreLe titre du livre. * @param auteurL'auteur du livre. */publicLivre(String titre, String auteur)
{this(titre, auteur, 0.0, 0);
}/** * <p>Constructeur de livre avec un titre, un auteur et un prix spécifiés.</p> * @param titreLe titre du livre. * @param auteurL'auteur du livre. * @param prixLe prix du livre. */publicLivre(String titre, String auteur, double prix)
{this(titre, auteur, prix, 0);
}/** * <p>Constructeur de livre avec un titre, un auteur, un prix et une année spécifiés.</p> * @param titreLe titre du livre. * @param auteurL'auteur du livre. * @param prixLe prix du livre. * @param anneeL'année du livre. */publicLivre(String titre, String auteur, double prix, int annee)
{setTitre(titre);
setAuteur(auteur);
setPrix(prix);
setAnnee(annee);
}/** * <p>Constructeur de livre à partir d'un livre existant.</p> * @param livreUn livre. */publicLivre(Livre livre)
{this(livre.getTitre(), livre.getAuteur(), livre.getPrix(), livre.getAnnee());
}/** * <p>Retourne l'année du livre.</p> * @return Renvoie l'année du livre. */publicintgetAnnee()
{returnthis.annee;
}/** * <p>Modifie l'année du livre.</p> * @param anneeL'année du livre. */publicvoidsetAnnee(int annee)
{if(annee <0)
{this.annee =0;
}else{this.annee = annee;
}}/** * <p>Retourne l'auteur du livre.</p> * @return Renvoie l'auteur du livre. */public String getAuteur()
{returnthis.auteur;
}/** * <p>Modifie l'auteur du livre.</p> * @param auteurL'auteur du livre. */publicvoidsetAuteur(String auteur)
{this.auteur = auteur;
}/** * <p>Retourne le prix du livre.</p> * @return Renvoie le prix du livre. */publicdoublegetPrix()
{returnthis.prix;
}/** * <p>Modifie le prix du livre.</p> * @param prixLe prix du livre. */publicvoidsetPrix(double prix)
{if(prix <0)
{this.prix =0.0;
}else{this.prix = prix;
}}/** * <p>Retourne le titre du livre.</p> * @return Renvoie le titre du livre. */public String getTitre()
{returnthis.titre;
}/** * <p>Modifie le titre du livre.</p> * @param titreLe titre du livre. */publicvoidsetTitre(String titre)
{this.titre = titre;
}/** * <p>Retourne une représentation du livre.</p> * @return Renvoie une représentation du livre. */@Overridepublic String toString()
{
StringBuilder resultat =newStringBuilder();
DecimalFormat dFormat =newDecimalFormat("0.00");
resultat.append("Livre : { ");
resultat.append("titre : ").append(getTitre()).append("; ");
resultat.append("auteur : ").append(getAuteur()).append("; ");
resultat.append("prix : ").append(dFormat.format(getPrix())).append(" euros; ");
resultat.append("année : ").append(getAnnee());
resultat.append(" }");
return resultat.toString();
}}
/* * Fichier: TestLivre.java * Crée le: 13 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.livre;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Livre.</p> * @author Sébastien ESTIENNE. */publicclass TestLivre extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestLivre()
{// Appel du constructeur de la classe JFrame.super("Livre");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Livre 1.
Livre livre1 =newLivre();
livre1.setTitre("Au coeur de Java 2 - Notions fondamentales");
livre1.setAuteur("Cay S. Horstmann");
livre1.setPrix(40.0);
livre1.setAnnee(2005);
sortie.append(livre1).append('\n');
// Livre 2.
Livre livre2 =newLivre(livre1);
livre2.setTitre("Au coeur de Java 2 - Fonctions avancées");
livre2.setPrix(45.0);
sortie.append(livre2).append('\n');
// Livre 3.
Livre livre3 =newLivre("Pratique de .NET et C#2", "Patrick SMACCHIA", 50.0);
livre3.setAnnee(2005);
sortie.append(livre3).append('\n');
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestLivre();
}}
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: Temps.java * Crée le: 15 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.temps;
import java.text.DecimalFormat;
/** * <p>Classe représentant un temps.</p> * @author Sébastien ESTIENNE. */publicclass Temps
{/** Le nombre d'heures. */privateint heures;
/** Le nombre de minutes. */privateint minutes;
/** Le nombre de secondes. */privateint secondes;
/** * <p>Constructeur par défaut d'un temps.</p> */publicTemps()
{this(0, 0, 0);
}/** * <p>Constructeur de temps avec le nombre d'heures spécifiés.</p> * @param heuresLe nombre d'heures. */publicTemps(int heures)
{this(heures, 0, 0);
}/** * <p>Constructeur de temps avec le nombre d'heures et de minutes spécifiés.</p> * @param heuresLe nombre d'heures. * @param minutesLe nombre de minutes. */publicTemps(int heures, int minutes)
{this(heures, minutes, 0);
}/** * <p>Constructeur de temps avec le nombre d'heures, de minutes et de secondes spécifiés.</p> * @param heuresLe nombre d'heures. * @param minutesLe nombre de minutes. * @param secondesLe nombre de secondes. */publicTemps(int heures, int minutes, int secondes)
{setHeures(heures);
setMinutes(minutes);
setSecondes(secondes);
}/** * <p>Constructeur de temps à partir d'un temps existant.</p> * @param tempsUn temps. */publicTemps(Temps temps)
{this(temps.getHeures(), temps.getMinutes(), temps.getSecondes());
}/** * <p>Retourne le nombre d'heures.</p> * @return Renvoie le nombre d'heures. */publicintgetHeures()
{returnthis.heures;
}/** * <p>Modifie le nombre d'heures.</p> * @param heuresLe nombre d'heures. */publicvoidsetHeures(int heures)
{if(heures <0|| heures >23)
{this.heures =0;
}else{this.heures = heures;
}}/** * <p>Retourne le nombre de minutes.</p> * @return Renvoie le nombre de minutes. */publicintgetMinutes()
{returnthis.minutes;
}/** * <p>Modifie le nombre de minutes.</p> * @param minutesLe nombre de minutes. */publicvoidsetMinutes(int minutes)
{if(minutes <0|| minutes >=60)
{this.minutes =0;
}else{this.minutes = minutes;
}}/** * <p>Retourne le nombre de secondes.</p> * @return Renvoie le nombre de secondes. */publicintgetSecondes()
{returnthis.secondes;
}/** * <p>Modifie le nombre de secondes.</p> * @param secondesLe nombre de secondes. */publicvoidsetSecondes(int secondes)
{if(secondes <0|| secondes >=60)
{this.secondes =0;
}else{this.secondes = secondes;
}}/** * <p>Ajoute au temps courant un nombre d'heures.</p> * @param hLe nombre d'heures. */publicvoidajouterHeures(int h)
{setHeures((this.heures + h) %24);
}/** * <p>Ajoute au temps courant un nombre de minutes.</p> * @param mLe nombre de minutes. */publicvoidajouterMinutes(int m)
{ajouterHeures((this.minutes + m) /60);
setMinutes((this.minutes + m) %60);
}/** * <p>Ajoute au temps courant un nombre de secondes.</p> * @param sLe nombre de secondes. */publicvoidajouterSecondes(int s)
{ajouterMinutes((this.secondes + s) /60);
setSecondes((this.secondes + s) %60);
}/** * <p>Retourne une représentation du temps.</p> * @return Renvoie une représentation du temps. */@Overridepublic String toString()
{
StringBuilder resultat =newStringBuilder();
DecimalFormat dFormat =newDecimalFormat("00");
resultat.append(dFormat.format(getHeures())).append("h ");
resultat.append(dFormat.format(getMinutes())).append("min ");
resultat.append(dFormat.format(getSecondes())).append("sec");
return resultat.toString();
}}
/* * Fichier: TestTemps.java * Crée le: 15 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.temps;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Temps.</p> * @author Sébastien ESTIENNE. */publicclass TestTemps extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestTemps()
{// Appel du constructeur de la classe JFrame.super("Temps");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Temps 1.
Temps temps1 =newTemps();
temps1.setHeures(9);
temps1.setMinutes(28);
temps1.setSecondes(41);
sortie.append("Temps 1 : ").append(temps1).append('\n');
// Temps 2.
Temps temps2 =newTemps(temps1);
temps2.setMinutes(36);
sortie.append("Temps 2 : ").append(temps2).append('\n');
// Temps 3.
Temps temps3 =newTemps(16, 35);
temps3.setSecondes(7);
sortie.append("Temps 3 : ").append(temps3).append('\n');
// Ajout d'heures.
temps3.ajouterHeures(12);
sortie.append("Temps 3 + 12h : ").append(temps3).append('\n');
// Ajout de minutes.
temps3.ajouterMinutes(47);
sortie.append("Temps 3 + 47min : ").append(temps3).append('\n');
// Ajout de secondes.
temps3.ajouterSecondes(3055);
sortie.append("Temps 3 + 3055sec : ").append(temps3).append('\n');
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestTemps();
}}
Écrivez une classe Complexe représentant des nombres complexes. Un nombre complexe comporte une partie réelle et une partie imaginaire (partieReelle + partieImaginaire * i avec i = racine(-1)).
La classe a les attributs suivants :
partieReelle : La partie réelle du nombre ;
partieImaginaire : La partie imaginaire du nombre.
La classe Complexe doit disposer des constructeurs suivants :
Complexe() ;
Complexe(partieReelle, partieImaginaire) ;
Complexe(Complexe).
La classe Temps doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs.
Elle doit aussi contenir les méthodes :
ajouter(Complexe) : addition de deux nombres complexes ;
soustraire(Complexe) : soustraction de deux nombres complexes ;
toString() : donne une représentation d'un nombre complexe (a+b*i).
Écrivez aussi une classe TestComplexe afin de tester la classe Complexe.
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: Complexe.java * Crée le: 15 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.complexe;
import java.text.DecimalFormat;
/** * <p>Classe représentant un nombre complexe.</p> * @author Sébastien ESTIENNE. */publicclass Complexe
{/** Partie réelle du nombre complexe. */privatedouble partieReelle;
/** Partie imaginaire du nombre complexe. */privatedouble partieImaginaire;
/** * <p>Constructeur par défaut d'un nombre complexe.</p> */publicComplexe()
{this(0.0, 0.0);
}/** * <p>Constructeur de nombres complexes avec la partie réelle et la partie imaginaire * spécifiés.</p> * @param partieReelleLa partie réelle du nombre complexe. * @param partieImaginaireLa partie imaginaire du nombre complexe. */publicComplexe(double partieReelle, double partieImaginaire)
{setPartieReelle(partieReelle);
setPartieImaginaire(partieImaginaire);
}/** * <p>Constructeur de nombre complexe à partir d'un nombre complexe existant.</p> * @param complexeUn nombre complexe. */publicComplexe(Complexe complexe)
{this(complexe.getPartieReelle(), complexe.getPartieImaginaire());
}/** * <p>Retourne la partie imaginaire du nombre complexe.</p> * @return Renvoie la partie imaginaire du nombre complexe. */publicdoublegetPartieImaginaire()
{returnthis.partieImaginaire;
}/** * <p>Modifie la partie imaginaire du nombre complexe.</p> * @param partieImaginaireLa partie imaginaire du nombre complexe. */publicvoidsetPartieImaginaire(double partieImaginaire)
{this.partieImaginaire = partieImaginaire;
}/** * <p>Retourne la partie réelle du nombre complexe.</p> * @return Renvoie la partie réelle du nombre complexe. */publicdoublegetPartieReelle()
{returnthis.partieReelle;
}/** * <p>Modifie la partie réelle du nombre complexe.</p> * @param partieReelleLa partie réelle du nombre complexe. */publicvoidsetPartieReelle(double partieReelle)
{this.partieReelle = partieReelle;
}/** * <p>Ajoute au nombre complexe courant, le nombre complexe passé en paramètre.</p> * @param complexeLe nombre complexe à ajouter. */publicvoidajouter(Complexe complexe)
{setPartieReelle(getPartieReelle() + complexe.getPartieReelle());
setPartieImaginaire(getPartieImaginaire() + complexe.getPartieImaginaire());
}/** * <p>Soustrait au nombre complexe courant, le nombre complexe passé en paramètre.</p> * @param complexeLe nombre complexe à soustraire. */publicvoidsoustraire(Complexe complexe)
{setPartieReelle(getPartieReelle() - complexe.getPartieReelle());
setPartieImaginaire(getPartieImaginaire() - complexe.getPartieImaginaire());
}/** * <p>Multiplie le nombre complexe courant par le nombre complexe passé en paramètre.</p> * @param complexeLe nombre complexe à multiplier. */publicvoidmultiplier(Complexe complexe)
{setPartieReelle(getPartieReelle() * complexe.getPartieReelle()
-getPartieImaginaire() * complexe.getPartieImaginaire());
setPartieImaginaire(getPartieReelle() * complexe.getPartieImaginaire()
+getPartieImaginaire() * complexe.getPartieReelle());
}/** * <p>Retourne une représentation du nombre complexe.</p> * @return Renvoie une représentation du nombre complexe. */@Overridepublic String toString()
{// Formatteur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(2);
// Construction de la représentation.
StringBuilder resultat =newStringBuilder();
resultat.append(dFormat.format(getPartieReelle()));
if(getPartieImaginaire() >=0)
{
resultat.append(" +");
}
resultat.append(" ");
resultat.append(dFormat.format(getPartieImaginaire())).append(" i");
return resultat.toString();
}}
/* * Fichier: TestComplexe.java * Crée le: 15 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.complexe;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Complexe.</p> * @author Sébastien ESTIENNE. */publicclass TestComplexe extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestComplexe()
{// Appel du constructeur de la classe JFrame.super("Complexe");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Complexe 1.
Complexe complexe1 =newComplexe();
complexe1.setPartieReelle(2.4);
complexe1.setPartieImaginaire(5.7);
sortie.append("Complexe1 : ").append(complexe1).append('\n');
// Complexe 2.
Complexe complexe2 =newComplexe(3.1, 6.4);
sortie.append("Complexe2 : ").append(complexe2).append('\n');
// Complexe 3.
Complexe complexe3 =newComplexe(complexe2);
complexe3.setPartieImaginaire(4.8);
sortie.append("Complexe3 : ").append(complexe3).append('\n');
// Ajout.
complexe3.ajouter(complexe2);
sortie.append("Complexe3 + Complexe2 : ").append(complexe3).append('\n');
// Soustraction.
complexe3.soustraire(complexe1);
sortie.append("Complexe3 - Complexe1 : ").append(complexe3).append('\n');
// Multiplication.
complexe3.multiplier(complexe2);
sortie.append("Complexe3 * Complexe2 : ").append(complexe3).append('\n');
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestComplexe();
}}
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: Rationnel.java * Crée le: 17 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.rationnel;
/** * <p>Classe représentant un rationnel.</p> * @author Sébastien ESTIENNE. */publicclass Rationnel
{/** Le numérateur du nombre rationnel. */privateint numerateur;
/** Le dénominateur du nombre rationnel. */privateint denominateur;
/** * <p>Constructeur par défaut d'un nombre rationnel.</p> */publicRationnel()
{this(0, 1);
}/** * <p>Constructeur de nombres rationnels à partir d'un numérateur et d'un dénominateur * spécifiés.</p> * @param numerateurLe numérateur du nombre rationnel. * @param denominateurLe dénominateur du nombre rationnel. */publicRationnel(int numerateur, int denominateur)
{// étant donné que la méthode reduire() est appelée dans le mutateur du numérateur et du // dénominateur, ils ne seront pas utilisés dans le constructeur afin d'éviter de faire // l'appel à cette méthode deux fois. this.numerateur = numerateur;
this.denominateur = denominateur;
reduire();
}/** * <p>Constructeur de nombres rationnels à partir d'un nombre rationnel existant.</p> * @param rationnelUn nombre rationnel. */publicRationnel(Rationnel rationnel)
{this(rationnel.getNumerateur(), rationnel.getDenominateur());
}/** * <p>Retourne le dénominateur du nombre rationnel.</p> * @return Renvoie le dénominateur du nombre rationnel. */publicintgetDenominateur()
{returnthis.denominateur;
}/** * <p>Modifie le dénominateur du nombre rationnel.</p> * @param denominateurLe dénominateur. */publicvoidsetDenominateur(int denominateur)
{if(denominateur ==0)
{this.denominateur =1;
}else{this.denominateur = denominateur;
reduire();
}}/** * <p>Retourne le numérateur du nombre rationnel.</p> * @return Renvoie le numérateur du nombre rationnel. */publicintgetNumerateur()
{returnthis.numerateur;
}/** * <p>Modifie le numérateur du nombre rationnel.</p> * @param numerateurLe numérateur. */publicvoidsetNumerateur(int numerateur)
{this.numerateur = numerateur;
reduire();
}/** * <p>Déterminer le pgcd (plus grand commun diviseur) de deux nombres.</p> * @param xLe premier nombre. * @param yLe second nombre. * @return Le pgcd de des deux nombres. */privateintpgcd(int x, int y)
{if(x <0)
{
x =-x;
}if(y <0)
{
y =-y;
}while(x !=0&& y !=0)
{if(x > y)
{
x -= y;
}else{
y -= x;
}}if(x !=0)
{return x;
}return y;
}/** * <p>Rend la fraction du nombre irréductible.</p> */privatevoidreduire()
{int pgcd =pgcd(getNumerateur(), getDenominateur());
this.numerateur =getNumerateur() / pgcd;
this.denominateur =getDenominateur() / pgcd;
}/** * <p>Ajoute un nombre rationnel au nombre rationnel courant.</p> * @param rationnelLe nombre rationnel à ajouter. */publicvoidajouter(Rationnel rationnel)
{setNumerateur(getNumerateur() * rationnel.getDenominateur() + rationnel.getNumerateur()
*getDenominateur());
setDenominateur(getDenominateur() * rationnel.getDenominateur());
reduire();
}/** * <p>Soustrait un nombre rationnel au nombre rationnel courant.</p> * @param rationnelLe nombre rationnel à soustraire. */publicvoidsoustraire(Rationnel rationnel)
{setNumerateur(getNumerateur() * rationnel.getDenominateur() - rationnel.getNumerateur()
*getDenominateur());
setDenominateur(getDenominateur() * rationnel.getDenominateur());
reduire();
}/** * <p>Multiplie un nombre rationnel au nombre rationnel courant.</p> * @param rationnelLe nombre rationnel à multiplier. */publicvoidmultiplier(Rationnel rationnel)
{setNumerateur(getNumerateur() * rationnel.getNumerateur());
setDenominateur(getDenominateur() * rationnel.getDenominateur());
reduire();
}/** * <p>Divise un nombre rationnel au nombre rationnel courant.</p> * @param rationnelLe nombre rationnel à diviser. */publicvoiddiviser(Rationnel rationnel)
{setNumerateur(getNumerateur() * rationnel.getDenominateur());
setDenominateur(getDenominateur() * rationnel.getNumerateur());
reduire();
}/** * <p>Evalue la valeur (nombre réel) du nombre rationnel.</p> * @return Retourne une évaluation du nombre rationnel. */publicdoubleevaluer()
{returngetNumerateur() /(double) getDenominateur();
}/** * <p>Retourne une représentation du nombre rationnel.</p> * @return Renvoie une représentation du nombre rationnel. */@Overridepublic String toString()
{
StringBuilder resultat =newStringBuilder();
if(getNumerateur() >0&&getDenominateur() <0||getNumerateur() <0&&getDenominateur() >0)
{
resultat.append("-");
}
resultat.append(Math.abs(getNumerateur())).append(" / ").append(Math.abs(getDenominateur()));
return resultat.toString();
}}
/* * Fichier: TestRationnel.java * Crée le: 17 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.rationnel;
import java.awt.BorderLayout;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Rationnel.</p> * @author Sébastien ESTIENNE. */publicclass TestRationnel extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestRationnel()
{// Appel du constructeur de la classe JFrame.super("Rationnel");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Formateur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(3);
// Rationnel 1.
Rationnel rationnel1 =newRationnel();
rationnel1.setNumerateur(5);
rationnel1.setDenominateur(12);
sortie.append("R1 : ").append(rationnel1).append('\n');
// Rationnel 2.
Rationnel rationnel2 =newRationnel(-7, -15);
sortie.append("R2 : ").append(rationnel2).append('\n');
// Rationnel 3.
Rationnel rationnel3 =newRationnel(rationnel2);
rationnel3.setNumerateur(9);
sortie.append("R3 : ").append(rationnel3).append('\n');
// Ajout.
rationnel3.ajouter(rationnel1);
sortie.append("R3 + R1 : ").append(rationnel3).append('\n');
// Soustraction.
rationnel3.soustraire(rationnel2);
sortie.append("R3 - R2 : ").append(rationnel3).append('\n');
// Multiplication.
rationnel3.multiplier(rationnel1);
sortie.append("R3 * R1: ").append(rationnel3).append('\n');
// Division.
rationnel3.diviser(rationnel2);
sortie.append("R3 / R2: ").append(rationnel3).append('\n');
// Evaluation.
sortie.append("eval(R3) : ").append(dFormat.format(rationnel3.evaluer())).append('\n');
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestRationnel();
}}
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: Rectangle.java * Crée le: 19 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.rectangle;
import java.text.DecimalFormat;
/** * <p>Classe représentant un rectangle.</p> * @author Sébastien ESTIENNE. */publicclass Rectangle
{/** Longueur du rectangle. */privatedouble longueur;
/** Largeur du rectangle. */privatedouble largeur;
/** * <p>Constructeur par défaut d'un rectangle.</p> */publicRectangle()
{this(0, 0);
}/** * <p>Constructeur de rectangles avec la longueur et la largeur spécifiés.</p> * @param longueurLa longueur du rectangle. * @param largeurLa largeur du rectangle. */publicRectangle(double longueur, double largeur)
{setLongueur(longueur);
setLargeur(largeur);
}/** * <p>Constructeur de rectangles à partir d'un rectangle existant.</p> * @param rectangleUn rectangle. */publicRectangle(Rectangle rectangle)
{this(rectangle.getLongueur(), rectangle.getLargeur());
}/** * <p>Calcule le périmètre du rectangle : 2 * (longueur + largeur).</p> * @return Renvoie le périmètre du rectangle. */publicdoublegetPerimetre()
{return2*(getLongueur() +getLargeur());
}/** * <p>Calcule l'aire du rectangle : longueur * largeur.</p> * @return Renvoie l'aire du rectangle. */publicdoublegetAire()
{returngetLongueur() *getLargeur();
}/** * <p>Vérifie si le rectangle est un carré : longueur = largeur.</p> * @return true si rectangle est un carré, sinon false. */publicbooleanisCarre()
{returngetLongueur() ==getLargeur();
}/** * <p>Retourne la largeur du rectangle.</p> * @return Renvoie la largeur du rectangle. */publicdoublegetLargeur()
{returnthis.largeur;
}/** * <p>Modifie la largeur du rectangle.</p> * @param largeurLa largeur du rectangle. */publicvoidsetLargeur(double largeur)
{this.largeur = largeur;
}/** * <p>Retourne la longueur du rectangle.</p> * @return Renvoie la longueur du rectangle. */publicdoublegetLongueur()
{returnthis.longueur;
}/** * <p>Modifie la longueur du rectangle.</p> * @param longueurLa longueur du rectangle. */publicvoidsetLongueur(double longueur)
{this.longueur = longueur;
}/** * <p>Retourne une représentation du rectangle.</p> * @return Renvoie une représentation du rectangle. */@Overridepublic String toString()
{// Formateur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(2);
// Construction de la représentation.
StringBuilder resultat =newStringBuilder();
resultat.append("Rectangle(").append(dFormat.format(getLongueur())).append(" x ").append(
dFormat.format(getLargeur())).append(")");
return resultat.toString();
}}
/* * Fichier: TestRectangle.java * Crée le: 19 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.rectangle;
import java.awt.BorderLayout;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Rectangle.</p> * @author Sébastien ESTIENNE. */publicclass TestRectangle extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestRectangle()
{// Appel du constructeur de la classe JFrame.super("Rectangle");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Formateur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(2);
// Rectangle 1.
Rectangle rectangle1 =newRectangle();
rectangle1.setLongueur(8);
rectangle1.setLargeur(5);
sortie.append("R1 : ").append(rectangle1).append('\n');
// Rectangle 2.
Rectangle rectangle2 =newRectangle(11, 7);
sortie.append("R2 : ").append(rectangle2).append('\n');
// Rectangle 3.
Rectangle rectangle3 =newRectangle(rectangle2);
rectangle3.setLongueur(7);
sortie.append("R3 : ").append(rectangle3).append('\n');
// Périmètre.double perimetre = rectangle1.getPerimetre();
sortie.append("Périmètre de R1 : ").append(dFormat.format(perimetre)).append('\n');
// Aire.double aire = rectangle2.getAire();
sortie.append("Aire de R2 : ").append(dFormat.format(aire)).append('\n');
// Carré.if(rectangle3.isCarre())
{
sortie.append("Le rectangle 3 est un carré.\n");
}else{
sortie.append("Le rectangle 3 n'est pas un carré.\n");
}// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestRectangle();
}}
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: Point.java * Crée le: 19 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.point;
import java.text.DecimalFormat;
/** * <p>Classe représentant un point.</p> * @author Sébastien ESTIENNE. */publicclass Point
{/** Abscisse du point. */privatedouble x;
/** Ordonnée du point. */privatedouble y;
/** * <p>Constructeur par défaut d'un point.</p> */publicPoint()
{this(0, 0);
}/** * <p>Constructeur de points avec l'abscisse et l'ordonnée spécifiées.</p> * @param xL'abscisse du point. * @param yL'ordonnée du point. */publicPoint(double x, double y)
{setX(x);
setY(y);
}/** * <p>Constructeur de points à partir d'un point existant.</p> * @param pointUn point. */publicPoint(Point point)
{this(point.x, point.y);
}/** * <p>Calcule la distance par rapport à un autre point.</p> * @param pXL'abscisse du point. * @param pYL'ordonnée du point. * @return Renvoie la distance par rapport à un autre point. */publicdoublegetDistance(double pX, double pY)
{return Point.getDistance(getX(), getY(), pX, pY);
}/** * <p>Calcule la distance par rapport à un autre point.</p> * @param pointLe point. * @return Renvoie la distance par rapport à un autre point. */publicdoublegetDistance(Point point)
{return Point.getDistance(getX(), getY(), point.getX(), point.getY());
}/** * <p>Calcule la distance entre deux points.</p> * @param x1L'abscisse du premier point. * @param y1L'ordonnée du premier point. * @param x2L'abscisse du second point. * @param y2L'ordonnée du second point. * @return Renvoie la distance par rapport à un autre point. */publicstaticdoublegetDistance(double x1, double y1, double x2, double y2)
{return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}/** * <p>Déplace le point.</p> * @param pXLa nouvelle abscisse du point. * @param pYLa nouvelle ordonnée du point. */publicvoiddeplacer(double pX, double pY)
{setX(pX);
setY(pY);
}/** * <p>Translate le point.</p> * @param dxLa translation suivant l'axe x. * @param dyLa translation suivant l'axe y. */publicvoidtranslater(double dx, double dy)
{setX(getX() + dx);
setY(getY() + dy);
}/** * <p>Retourne l'abscisse du point.</p> * @return Renvoie l'abscisse du point. */publicdoublegetX()
{returnthis.x;
}/** * <p>Modifie l'abscisse du point.</p> * @param xL'abscisse du point. */publicvoidsetX(double x)
{this.x = x;
}/** * <p>Retourne l'ordonnée du point.</p> * @return Renvoie l'ordonnée du point. */publicdoublegetY()
{returnthis.y;
}/** * <p>Modifie l'ordonnée du point.</p> * @param yL'ordonnée du point. */publicvoidsetY(double y)
{this.y = y;
}/** * <p>Retourne une représentation du point.</p> * @return Renvoie une représentation du point. */@Overridepublic String toString()
{// Formateur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(2);
// Construction de la représentation.
StringBuilder resultat =newStringBuilder();
resultat.append("Point(").append(dFormat.format(getX())).append("; ").append(
dFormat.format(getY())).append(")");
return resultat.toString();
}}
/* * Fichier: TestPoint.java * Crée le: 19 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.point;
import java.awt.BorderLayout;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Point.</p> * @author Sébastien ESTIENNE. */publicclass TestPoint extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestPoint()
{// Appel du constructeur de la classe JFrame.super("Point");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Formateur de nombres.
DecimalFormat dFormat =newDecimalFormat();
dFormat.setMinimumIntegerDigits(1);
dFormat.setMaximumFractionDigits(2);
// Point 1.
Point point1 =newPoint();
point1.setX(2.7);
point1.setY(5.8);
sortie.append("P1 : ").append(point1).append('\n');
// Point 2.
Point point2 =newPoint(1.6, 6.3);
sortie.append("P2 : ").append(point2).append('\n');
// Point 3.
Point point3 =newPoint(point2);
point3.setX(4.1);
sortie.append("P3 : ").append(point3).append('\n');
// Distance x3.double d1 = point3.getDistance(point1);
sortie.append("Dist(P1-P3) : ").append(dFormat.format(d1)).append('\n');
double d2 = point3.getDistance(point2.getX(), point2.getY());
sortie.append("Dist(P2-P3) : ").append(dFormat.format(d2)).append('\n');
double d3 = Point.getDistance(2.3, 4.2, -6.9, 3.7);
sortie.append("Dist : ").append(dFormat.format(d3)).append('\n');
// Déplacer.
point3.deplacer(-5.1, 4.7);
sortie.append("Depl(P3) : ").append(point3).append('\n');
// Translater.
point3.translater(1.2, -0.7);
sortie.append("Transl(P3) : ").append(point3).append('\n');
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestPoint();
}}
La classe Carte doit disposer du constructeur suivant :
Carte(Rang, Couleur).
La classe Carte doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Carte.
Écrivez une deuxième classe Paquet avec les attributs suivants :
cartes : tableau de cartes.
La classe Paquet doit disposer d'un constructeur par défaut initialisant le paquet de cartes et le mélangeant. Cette classe doit aussi disposer des méthodes suivantes :
melanger() : mélange le paquet de cartes ;
getNombreDeCartes() : retourne le nombre de cartes du paquet ;
piocher(n) : renvoie les n premières cartes du paquet.
Écrivez aussi une classe TestJeuDeCartes afin de tester les classes Carte et Paquet.
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: Carte.java * Crée le: 21 septembre 2008. * Modifié: 12 octobre 2008. * 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 chapitre7.jeudecartes;
/** * <p>Classe représentant une carte de jeu.</p> * @author Sébastien ESTIENNE. */publicclass Carte
{/** Rang de la carte. */@SuppressWarnings("all")
publicenum Rang
{
DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF, DIX, VALET, DAME, ROI, AS
}/** Couleur de la carte. */@SuppressWarnings("all")
publicenum Couleur
{
PIQUE, COEUR, CARREAU, TREFLE
}/** Le rang de la carte. */private Rang rang;
/** La couleur de la carte. */private Couleur couleur;
/** * <p>Constructeur de carte.</p> * @param rangLe rang de la carte. * @param couleurLa couleur de la carte. */publicCarte(Rang rang, Couleur couleur)
{this.rang = rang;
this.couleur = couleur;
}/** * <p>Retourne le rang de la carte.</p> * @return Renvoie le rang de la carte. */public Rang getRang()
{returnthis.rang;
}/** * <p>Retourne la couleur de la carte.</p> * @return Renvoie la couleur de la carte. */public Couleur getCouleur()
{returnthis.couleur;
}/** * <p>Retourne une représentation de la carte.</p> * @return Renvoie une représentation de la carte. */@Overridepublic String toString()
{returnthis.rang +" de "+this.couleur;
}}
/* * Fichier: Paquet.java * Crée le: 11 octobre 2008. * Modifié: 12 octobre 2008. * 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 chapitre7.jeudecartes;
import java.util.Arrays;
import java.util.Random;
import chapitre7.jeudecartes.Carte.Couleur;
import chapitre7.jeudecartes.Carte.Rang;
/** * <p>Classe représentant un jeu de cartes.</p> * @author Sébastien ESTIENNE. */publicclass Paquet
{/** Paquet de cartes. */private Carte[] cartes;
/** Nombre d'itérations pour mélanger les cartes. */privatestaticfinalint NB_ITERATIONS =3;
/** * Constructeur. */publicPaquet()
{// Initialisation des cartes du paquet.this.cartes =new Carte[Rang.values().length * Couleur.values().length];
for(int i =0; i < Couleur.values().length; i++)
{for(int j =0; j < Rang.values().length; j++)
{this.cartes[i * Rang.values().length + j] =newCarte(Rang.values()[j], Couleur
.values()[i]);
}}// Mélange le jeu de cartes.melanger();
}/** * <p>Mélange les cartes du paquet.</p> */privatevoidmelanger()
{
Random r =newRandom();
for(int i =0; i < NB_ITERATIONS; i++)
{for(int j =0; j <this.cartes.length; j++)
{echanger(r.nextInt(this.cartes.length), r.nextInt(this.cartes.length));
}}}/** * <p>Echange deux cartes d'un paquet.</p> * @param iL'indice de la première carte à échanger. * @param jL'indice de la seconde carte à échanger. */privatevoidechanger(int i, int j)
{
Carte temp;
temp =this.cartes[i];
this.cartes[i] =this.cartes[j];
this.cartes[j] = temp;
}/** * <p>Renvoie le nombre de cartes disponibles.</p> * @return Retourne le nombre de cartes disponibles. */publicintgetNombreDeCartes()
{returnthis.cartes.length;
}/** * <p>Renvoie un tableau des cartes piochées.</p> * @param nLe nombre de cartes piochées. * @return Retourne un tableau des cartes piochées ou null s'il n'y a plus assez de cartes dans * le paquet. */public Carte[] piocher(int n)
{if(n <=this.cartes.length)
{
Carte[] main = Arrays.copyOfRange(this.cartes, 0, n -1);
this.cartes = Arrays.copyOfRange(this.cartes, n, this.cartes.length -1);
return main;
}returnnull;
}}
/* * Fichier: TestJeuDeCartes.java * Crée le: 21 septembre 2008. * Modifié: 12 octobre 2008. * 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 chapitre7.jeudecartes;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester les classes Carte et PAquet.</p> * @author Sébastien ESTIENNE. */publicclass TestJeuDeCartes extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestJeuDeCartes()
{// Appel du constructeur de la classe JFrame.super("JeuDeCartes");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Construction du paquet de cartes.
Paquet paquet =newPaquet();
// Pioche 5 cartes.
sortie.append("Pioche 5 cartes : \n");
Carte[] main = paquet.piocher(5);
if(main !=null)
{for(int i =0; i < main.length; i++)
{
sortie.append("- ").append(main[i]).append("\n");
}}else{
sortie.append("Le nombre de cartes dans le paquet est insuffisant!\n");
}// Essaie de piocher 50 cartes.
sortie.append("Pioche 50 cartes : \n");
main = paquet.piocher(50);
if(main !=null)
{for(int i =0; i < main.length; i++)
{
sortie.append("- ").append(main[i]).append("\n");
}}else{
sortie.append("Le nombre de cartes dans le paquet est insuffisant!\n");
}// Nombre de cartes.int nbCartes = paquet.getNombreDeCartes();
sortie.append("Nombre de cartes restantes dans le paquet : ");
sortie.append(nbCartes);
// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestJeuDeCartes();
}}
Écrivez une classe Personne avec les attributs suivants :
nom : le nom de famille de la personne ;
prenom : le prénom de la personne ;
age : l'âge de la personne compris entre 0 et 130 ans ;
sexe : Masculin ou Féminin.
La classe Personne doit disposer des constructeurs suivants :
Personne() ;
Personne(nom, prenom) ;
Personne(nom, prenom, age) ;
Personne(nom, prenom, age, sexe) ;
Personne(Personne).
La classe Personne doit contenir des accesseurs (get) et mutateurs (set) pour les différents attributs. Elle doit aussi contenir une méthode toString() donnant une représentation de la classe Personne.
Écrivez aussi une classe TestPersonne afin de tester la classe Personne.
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: TSexe.java * Crée le: 26 décembre 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.personne;
/** * <p>Le type Sexe.</p> */publicenum TSexe
{/** * <p>Sexe: Masculin.</p> */Masculin("Masculin"),
/** * <p>Sexe: Féminin.</p> */Feminin("Féminin");
/** Nom du type. */private String etiquette;
/** * <p>Constructeur.</p> * @param etiquetteLe nom du type. */TSexe(String etiquette)
{this.etiquette = etiquette;
}/** * <p>Retourne l'étiquette du type.</p> * @return Renvoie l'étiquette du type. */public String getEtiquette()
{returnthis.etiquette;
}}
/* * Fichier: Personne.java * Crée le: 14 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.personne;
/** * <p>Classe représentant une personne.</p> * @author Sébastien ESTIENNE. */publicclass Personne
{/** Nom de la personne. */private String nom;
/** Prénom de la personne. */private String prenom;
/** Age de la personne. */private Integer age;
/** Sexe de la personne. */private TSexe sexe;
/** Age minimum. */privatestaticfinalint AGE_MIN =0;
/** Age maximum. */privatestaticfinalint AGE_MAX =130;
/** * <p>Constructeur par défaut d'une personne.</p> */publicPersonne()
{this(null, null, null, TSexe.Masculin);
}/** * <p>Constructeur de personne avec un nom et un prénom spécifiés.</p> * @param nomLe nom de la personne. * @param prenomLe prénom de la personne. */publicPersonne(String nom, String prenom)
{this(nom, prenom, 0, TSexe.Masculin);
}/** * <p>Constructeur de personne avec un nom, un prénom et un âge spécifiés.</p> * @param nomLe nom de la personne. * @param prenomLe prénom de la personne. * @param ageL'âge de la personne. */publicPersonne(String nom, String prenom, Integer age)
{this(nom, prenom, age, TSexe.Masculin);
}/** * <p>Constructeur de personne avec un nom, un prénom, un âge et un sexe spécifiés.</p> * @param nomLe nom de la personne. * @param prenomLe prénom de la personne. * @param ageL'âge de la personne. * @param sexeLe sexe de la personne. * @throws IllegalArgumentExceptionSi l'âge de la personne est incorrect. */publicPersonne(String nom, String prenom, Integer age, TSexe sexe) throws IllegalArgumentException
{setNom(nom);
setPrenom(prenom);
setAge(age);
setSexe(sexe);
}/** * <p>Constructeur de personne à partir d'une personne existante.</p> * @param personneUne personne. */publicPersonne(Personne personne)
{this(personne.getNom(), personne.getPrenom(), personne.getAge(), personne.getSexe());
}/** * <p>Retourne l'âge de la personne.</p> * @return Renvoie l'âge de la personne. */public Integer getAge()
{returnthis.age;
}/** * <p>Modifie l'âge de la personne.</p> * @param ageL'âge de la personne. * @throws IllegalArgumentExceptionSi l'âge de la personne est incorrect. */publicvoidsetAge(Integer age) throws IllegalArgumentException
{if(age !=null&&(age < AGE_MIN || age > AGE_MAX))
{
StringBuilder message =newStringBuilder();
message.append(age);
message.append(" est un âge incorrect. Il doit être compris entre ");
message.append(AGE_MIN);
message.append(" et ");
message.append(AGE_MAX);
message.append(".");
thrownewIllegalArgumentException(message.toString());
}this.age = age;
}/** * <p>Retourne le nom de la personne.</p> * @return Renvoie le nom de la personne. */public String getNom()
{returnthis.nom;
}/** * <p>Modifie le nom de la personne.</p> * @param nomLe nom de la personne. */publicvoidsetNom(String nom)
{this.nom = nom;
}/** * <p>Retourne le prénom de la personne.</p> * @return Renvoie le prénom de la personne. */public String getPrenom()
{returnthis.prenom;
}/** * <p>Modifie le prénom de la personne.</p> * @param prenomLe prénom de la personne. */publicvoidsetPrenom(String prenom)
{this.prenom = prenom;
}/** * <p>Retourne le sexe de la personne.</p> * @return Renvoie le sexe de la personne. */public TSexe getSexe()
{returnthis.sexe;
}/** * <p>Modifie le sexe de la personne.</p> * @param sexeLe sexe de la personne. */publicvoidsetSexe(TSexe sexe)
{this.sexe = sexe;
}/** * <p>Retourne une représentation d'une personne.</p> * @return Renvoie une représentation d'une personne. */@Overridepublic String toString()
{
StringBuilder resultat =newStringBuilder();
resultat.append("Personne : { ");
resultat.append("nom : ").append(getNom()).append("; ");
resultat.append("prénom : ").append(getPrenom()).append("; ");
resultat.append("âge : ").append(getAge()).append(" an(s); ");
resultat.append("sexe : ").append(getSexe());
resultat.append(" }");
return resultat.toString();
}}
/* * Fichier: TestPersonne.java * Crée le: 13 janvier 2007. * Modifié: 12 octobre 2008. * 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 chapitre7.personne;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/** * <p>Classe permettant de tester la classe Personne.</p> * @author Sébastien ESTIENNE. */publicclass TestPersonne extends JFrame
{/** * <p>Serial version UID.</p> */privatestaticfinallong serialVersionUID =1L;
/** * <p>Construction de l'application.</p> */publicTestPersonne()
{// Appel du constructeur de la classe JFrame.super("Personne");
// Ajoute les composants au conteneur.
JTextArea zoneSortie =newJTextArea();
zoneSortie.setEditable(false);
getContentPane().add(newJScrollPane(zoneSortie), BorderLayout.CENTER);
// Texte de sortie.
StringBuilder sortie =newStringBuilder();
// Personne 1.
Personne personne1 =newPersonne();
personne1.setNom("SANCHEZ");
personne1.setPrenom("Emilie");
try{
personne1.setAge(31);
}catch(IllegalArgumentException e)
{
sortie.append(e.getMessage()).append('\n');
}
personne1.setSexe(TSexe.Feminin);
sortie.append(personne1).append('\n');
// Personne 2.
Personne personne2 =newPersonne(personne1);
personne2.setNom("FABRE");
try{
personne2.setAge(26);
}catch(IllegalArgumentException e)
{
sortie.append(e.getMessage()).append('\n');
}
sortie.append(personne2).append('\n');
// Personne 3.
Personne personne3 =null;
try{
personne3 =newPersonne("MARTIN", "Julien", 24);
personne3.setSexe(TSexe.Masculin);
sortie.append(personne3).append('\n');
}catch(IllegalArgumentException e)
{
sortie.append(e.getMessage()).append('\n');
}// Personne 4.
Personne personne4 =null;
try{
personne4 =newPersonne("DUBOIS", "Bernard", 136);
sortie.append(personne4).append('\n');
}catch(IllegalArgumentException e)
{
sortie.append(e.getMessage()).append('\n');
}// Met à jour la zone de sortie.
zoneSortie.setText(sortie.toString());
// Modifie les propriétés de la fenêtre.setSize(600, 200);
setLocation(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}/** * <p>Débute l'exécution du test.</p> * @param argsLes paramètres de la ligne de commande. */publicstaticvoidmain(String[] args)
{newTestPersonne();
}}
Je tiens à remercier Ricky81, Hikage, djo.mos 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 :