Aller au contenu

Corrections des travaux pratiques JAVA

TP1 : Gestion de contact : Héritage, classe abstraite, polymorphisme et TreeSet

Avec utilisation de Scanner et TreeSet

Créez une application de gestion de contacts en utilisant un TreeSet pour stocker les informations de vos contacts :

Utilisez l’héritage pour créer des classes :

Ces classe doivent hériter de la classe Contact.

Utilisez la console en affichant le menu ci-dessous et en créant les fonctionnalistés correspondantes :

======= M E N U ======
1. Ajouter un contact professionnel
2. Ajouter un contact personnel
3. Rechercher un contact par nom
4. Afficher tous les contacts
5. Quitter l'application

Choisissez une option : 

Classe abstraite Contact :

package fr.bouget.gestion.contact;

/**
 * Classe abstraite (non instanciable)
 * @author philBouget
 *
 */
public abstract class Contact {

	protected String prenom;
	protected String nom;
	protected String telephone;
	protected String email;

	public Contact(String prenom, String nom, String telephone, String email) {
		this.prenom = prenom;
		this.nom = nom;
		this.telephone = telephone;
		this.email = email;
	}

	public Contact() {
		this(null,null,null,null);
	}


	public String getPrenom() {
		return prenom;
	}

	public String getNom() {
		return nom;
	}

	public String getTelephone() {
		return telephone;
	}

	public String getEmail() {
		return email;
	}

	/*
	 * Méthode abstraite à définir dans les sous-classes
	 */
	public abstract String getType();

	@Override
	public String toString() {
		return "Contact : "+ prenom + " "+ nom + " " + telephone + " " + email
				+ " (type : " + getType() + ")";
	}
}

Classe Personnel :

package fr.bouget.gestion.contact;

public class Personnel extends Contact {

	public Personnel(String prenom, String nom, String telephone, String email)
	{
		super(prenom, nom, telephone, email);

	}

	public Personnel() {
		this(null, null, null, null);
	}

	@Override
	public String getType() {

		return "Personnel";
	}

}

Classe Professionnel :

package fr.bouget.gestion.contact;

public class Professionnel extends Contact{

	private String societe;

	public Professionnel() {
		this(null, null,null,null, null);

	}
	public Professionnel(String prenom, String nom, String telephone, String email, String societe) {
		super(prenom, nom, telephone, email);
		this.societe = societe;
	}

	public String getSociete() {
		return societe;
	}

	@Override
	public String getType() {
		return "Professionnel";
	}

	@Override
	public String toString() {
		return super.toString() + " " + societe+" (société).";
	}
}

Classe de Lancement pour effectuer les tests :

package fr.bouget.gestion;

import java.util.Scanner;
import java.util.TreeSet;

import fr.bouget.gestion.contact.Contact;
import fr.bouget.gestion.contact.Personnel;
import fr.bouget.gestion.contact.Professionnel;

/*
 * Dans ce TP on a pas encore gérer les exceptions liées au erreurs de saisie
 * On verra cela ultérieurement.
 * Vous pouvez aussi trouver des solutions pour simplifier la partie saisie qui est 
 * redondante dans les différentes méthodes.
 */
public class Lancement {

	/*
		  Collection de type Tree pour définir des tris alphabétiques ici
		  TreeSet est une implémentation de l'interface Set qui stocke des éléments de manière triée.
		  Il utilise un comparateur pour définir l'ordre de tri des éléments,ici alphabétique sur les noms.
		  J'utilise une fonction Lambda dont nous verrons la syntaxe ultérieurement.
		  La méthode compareTo() est une méthode de classe String qui compare 2 chaînes de caractères,
		  si vous lisez la documentation java, vous verrez qu'elle retourne :
		  	- un entier négatif
		  	- un zéro
		  	- un entier positif
		  	si la chaîne courante est "lexicographiquement" inférieure, égale ou supérieure à la chaîne passée en argument.
	 */
	static TreeSet<Contact> contacts = new TreeSet<>((c1, c2) -> c1.getNom().compareTo(c2.getNom()));
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// on met des contacts par défaut
		Professionnel joachim = new Professionnel("Joachim","Boubou","0752658452", "jojo@trompette.com", "Staps");
		Professionnel mathieu = new Professionnel("Mathieu","Lanlan","0689652314","math@trombone.com", "ens");
		Personnel agnes = new Personnel("philippe","Boubou","0752658454", "phil@numerosoft.fr");
		Personnel philippe = new Personnel("Agnès","Lanlan","0752651254", "agnes@numerosoft.fr");
		
		contacts.add(joachim);
		contacts.add(mathieu);
		contacts.add(agnes);
		contacts.add(philippe);
		
		
		boolean continuer = true;
		while (continuer)
		{
			// affichage du menu dans la console
			System.out.println("======= M E N U ======\n");
			System.out.println("1. Ajouter un contact professionnel");
			System.out.println("2. Ajouter un contact personnel");
			System.out.println("3. Rechercher un contact par nom");
			System.out.println("4. Afficher tous les contacts");
			System.out.println("5. Quitter l'application\n\n");
            System.out.println("Choisissez une option : \n");
			int choix = sc.nextInt();
			sc.nextLine();

			switch (choix)
			{
			case 1:
				ajouterContactPro();
				break;
			case 2:
				ajouterContactPerso();
				break;
			case 3:
				rechercherContact();
				break;
			case 4:
				afficherContacts();
				break;
			case 5:
				System.out.println("Salut ! A bientôt... ;(");
				continuer = false;
				break;
			default:
				System.out.println("Choix invalide.");
				break;
			}
		}
	}


	// méthode pour ajouter un contact professionnel ou personnel
	public static void ajouterContactPro() {

		// ici on pourrait simplifer en factorisant ce code
		// redondant dans d'autres méthodes
		System.out.println("Nom : ");
		String nom = sc.nextLine();
		System.out.println("Prénom : ");
		String prenom = sc.nextLine();
		System.out.println("Téléphone : ");
		String telephone = sc.nextLine();
		System.out.println("Adresse mail : ");
		String mail = sc.nextLine();
		
		System.out.println("Société : ");
		String societe = sc.nextLine();

		Professionnel contact = new Professionnel(nom, prenom, telephone, mail, societe);
		// on l'ajoute à notre liste
		contacts.add(contact);

		System.out.println("Contact Professionnel ajouté !");
	}

    // méthode pour ajouter un contact perso
	public static void ajouterContactPerso() {

		System.out.println("Nom : ");
		String nom = sc.nextLine();
		System.out.println("Prénom : ");
		String prenom = sc.nextLine();
		System.out.println("Téléphone : ");
		String telephone = sc.nextLine();
		System.out.println("Adresse mail : ");
		String mail = sc.nextLine();

		Personnel contact = new Personnel(nom, prenom, telephone, mail);
		contacts.add(contact);
		System.out.println("Contact Personnel ajouté !");

	}
	// Afficher tous les contacts
	public static void afficherContacts() {
		for (Contact contact : contacts) {
			System.out.println(contact);
		}
	}

    // méthode pour rechercher un contact 
	public static void rechercherContact() {
		System.out.print("Entrez le nom ou le prénom du contact à rechercher : ");
		String motCle = sc.nextLine();
		boolean contactTrouve = false; // par défaut
		// on parcours notre TreeSet
		for (Contact contact : contacts) {
			if (contact.getNom().toUpperCase().contains(motCle.toUpperCase()) || contact.getPrenom().toUpperCase().contains(motCle.toUpperCase())) {
				System.out.println(contact);
				contactTrouve = true;
			}
		}
		if (!contactTrouve)
		{
			System.out.println("Désolé, aucun contact trouvé pour "+motCle+ " !");
		}
	}
}

TP2 : Avec les animaux, aborder les notions d’héritage, de classes abstraites et de polymorphisme

Résumé du projet à développer

Vous ajouterez des méthodes abstraites pour obtenir le petitNom, le poids, la nourriturePreferee et le son émit par l’animal.

Ajoutez des méthodes pour initialiser le petitNom, le poids et le son que peut émettre chaque animal, par exemple, vous pouvez écrire une méthode miauler() pour les chats, aboyer() pour les chiens et chanter() pour les oiseaux,…. Ces méthodes peuvent éventuellement êtres privées et appelées par une méthode commune communiquer()

J’ai ajouté 2 exception personnalisation pour afficher un message si l’animal est déjà dans la Ferme et on tente de l’ajouter et aussi si on essaye de supprimer un animal qui n’est pas de la Ferme, à vous de trouver d’autres idées. ça permet d’illustrer l’utilisation des Exceptions.

Les classes

Classe Animal :

package fr.numerosoft.animaux;

public abstract class Animal {

	protected String petitNom;
	protected double poids;
	protected String nourriturePreferee;
	
	public Animal(String petitNom, double poids, String nourriturePreferee) {
		super();
		this.petitNom = petitNom;
		this.poids = poids;
		this.nourriturePreferee = nourriturePreferee;
	}
	
	public abstract String getPetitNom();
	
	public abstract double getPoids();
	
	public abstract String getNourriturePreferee();
	
	public abstract void communiquer();

	@Override
	public String toString() {
		return petitNom + " qui pèse " + poids + "kg et mange " + nourriturePreferee;
	}

classe Chat :

package fr.numerosoft.animaux;

public class Chat extends Animal {

	public Chat(String petitNom, double poids, String nourriturePreferee) {
		super(petitNom, poids, nourriturePreferee);

	}

	@Override
	public String getPetitNom() {

		return null;
	}

	@Override
	public double getPoids() {

		return 0;
	}

	@Override
	public String getNourriturePreferee() {

		return null;
	}

	@Override
	public void communiquer() {

		System.out.println(miauler());
	}
	private String miauler()
	{
		return "Miaou miaou";
	}

	@Override
	public String toString() {
		return super.toString()+" et fait "+this.miauler();
	}
}

Classe Chien :

package fr.numerosoft.animaux;

public class Chien extends Animal {

	public Chien(String petitNom, double poids, String nourriturePreferee) {
		super(petitNom, poids, nourriturePreferee);

	}

	@Override
	public String getPetitNom() {

		return null;
	}

	@Override
	public double getPoids() {

		return 0;
	}

	@Override
	public String getNourriturePreferee() {

		return null;
	}

	@Override
	public void communiquer() {

		System.out.println(aboyer());
	}
	private String aboyer()
	{
		return "Waouf waouf";
	}
	@Override
	public String toString() {
		return super.toString()+" et fait "+this.aboyer();
	}

}

Classe Oiseau :

package fr.numerosoft.animaux;

public class Oiseau extends Animal {

	public Oiseau(String petitNom, double poids, String nourriturePreferee) {
		super(petitNom, poids, nourriturePreferee);

	}

	@Override
	public String getPetitNom() {

		return null;
	}

	@Override
	public double getPoids() {

		return 0;
	}

	@Override
	public String getNourriturePreferee() {

		return null;
	}

	@Override
	public void communiquer() {

		System.out.println(chanter());
	}
	private String chanter()
	{
		return "titititlalalala";
	}
	@Override
	public String toString() {
		return super.toString()+" et fait "+this.chanter();
	}
}

Classe Canard :

package fr.numerosoft.animaux;

public class Canard extends Animal {

	public Canard(String petitNom, double poids, String nourriturePreferee) {
		super(petitNom, poids, nourriturePreferee);

	}

	@Override
	public String getPetitNom() {

		return null;
	}

	@Override
	public double getPoids() {

		return 0;
	}

	@Override
	public String getNourriturePreferee() {

		return null;
	}

	@Override
	public void communiquer() {

		System.out.println(cancaner());
	}
	private String cancaner()
	{
		return "Coin coin";
	}

	@Override
	public String toString() {
		return super.toString()+" et fait "+this.cancaner();
	}


}

Classe LaFerme :

package fr.numerosoft.animaux;

import java.util.HashSet;
import java.util.Set;

import javax.swing.JOptionPane;

import fr.numerosoft.animaux.exceptions.AnimalDejaChezNousException;
import fr.numerosoft.animaux.exceptions.AnimalPasChezNousException;

public class LaFerme {

	private String nomDeLaFerme;
	private Set<Animal> animaux;

	public LaFerme(String nomDeLaFerme) {

		this.nomDeLaFerme= nomDeLaFerme;
		this.animaux = new HashSet<>();

	}

	/**
	 * Cette méthode traite une Exception spécifique
	 * Un message sera affiché si l'animal est déjà dans la Ferme !
	 * @param animal
	 * @return
	 * @throws AnimalDejaChezNousException
	 */
	public String ajouterAnimal(Animal animal) throws AnimalDejaChezNousException
	{
		try {
			// si l'animal n'est pas chez nous on l'ajoute
			if (!this.animaux.contains(animal))
			{
				animaux.add(animal);
				// et on l'annonce !
				return animal + " est arrivé à la Ferme !";
			}
			else
			{
				// sinon on prévient que l'animal est déjà chez nous !
				// on lance nous-même une exception qui sera attrapée dans le catch
				throw new AnimalDejaChezNousException(animal + " est déjà chez nous !");
			}
		}
		catch(AnimalDejaChezNousException e)
		{
			// ici on affiche l'exception que nous avons lancé plus haut
			JOptionPane.showMessageDialog(null, e.getMessage());
			return "";
		}

	}

	public String supprimerAnimal(Animal animal) throws AnimalPasChezNousException
	{
		try {

			if (this.animaux.contains(animal))
			{
				this.animaux.remove(animal);
				return animal + " nous a quitté :( ";
			}
			else
			{
				throw new AnimalPasChezNousException(animal + " pas de chez nous !");
			}
		}
		catch(AnimalPasChezNousException e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage());
			return "";
		}

	}

	public void afficherAnimaux()
	{
		for (Animal animal : animaux) {
			System.out.println(animal);
		}
	}

	public Set<Animal> getAnimaux() {
		return animaux;
	}

	public String getNomDeLaFerme() {
		return nomDeLaFerme;
	}

	public void setNomDeLaFerme(String nomDeLaFerme) {
		this.nomDeLaFerme = nomDeLaFerme;
	}

}

Classes AnimalDejaChezNousException et AnimalPasChezNousException :

package fr.numerosoft.animaux.exceptions;

public class AnimalDejaChezNousException extends Exception {

	public AnimalDejaChezNousException(String message) {
		super(message);
	}
	
	public AnimalDejaChezNousException() {
		
		this("Cet animal est déjà chez nous !");
	}
}
package fr.numerosoft.animaux.exceptions;

public class AnimalPasChezNousException extends Exception {

	public AnimalPasChezNousException() {
		
		this("Cet animal n'est pas de chez nous !");
	}
	public AnimalPasChezNousException(String message) {
		super(message);
	}
}

Classe Lancement :

package fr.numerosoft.animaux;

import fr.numerosoft.animaux.exceptions.AnimalDejaChezNousException;
import fr.numerosoft.animaux.exceptions.AnimalPasChezNousException;

public class Lancement {

	public static void main(String[] args) throws AnimalDejaChezNousException, AnimalPasChezNousException {

		LaFerme duduche = new LaFerme("Chez Duduche");

		// les animaux
		Chat youki = new Chat("Youki",3.2, "les croquettes qui puent");
		Chat monsieurPropre = new Chat("MonsieurPropre",2.5, "le lait de brebis");
		Chien diane = new Chien("Diane",5.2, "le gruyère");
		Canard donald = new Canard("Donald", 4, "le pain tout mou");
		Oiseau merlin = new Oiseau("Merlin",0.5, "les graines du hamster");

		// on créer Pilou pour tester le fait d'enlever un animal qui n'est pas dans la ferme
		// pour constater l'affichage d'un animal qui n'existe pas dans la ferme.
		Chien pilou = new Chien("Pilou", 15, "les canards, les poules, les chats");

		// il en manque beaucoup... je vous laisse créer les classes

		// on ajoute nos animaux
		System.out.println(duduche.ajouterAnimal(youki));
		System.out.println(duduche.ajouterAnimal(monsieurPropre));
		System.out.println(duduche.ajouterAnimal(diane));
		System.out.println(duduche.ajouterAnimal(donald));
		System.out.println(duduche.ajouterAnimal(merlin));
		System.out.println(duduche.ajouterAnimal(merlin));  // il ne sera pas ajouté !

		System.out.println(duduche.supprimerAnimal(pilou));

		duduche.afficherAnimaux();

		// la communication chez les animaux
		for (Animal animal : duduche.getAnimaux()) {

			animal.communiquer();
		}
		// trouver le moyen d'utiliser instanceof sur un des animaux en 
		// lui ajoutant une méthode spécifique que les autres non pas...
	}
}