S2T
- TDs première période
- TDs deuxième période :
Corrections
Corrections
This is an old revision of the document!
Voici un diagramme UML en conception.
Des codes vous sont donnés pour vous aider à comprendre et à ne pas perdre de temps. L'objectif n'est pas de vous apprendre à écrire des boucles ou des algorithmes, mais davantage de bien architecturer vos applications.
public class Professeur { private String nom; private String titre; public Professeur(String nom, String titre) { this.nom = nom; this.titre = titre; } //Pour que l'affichage d'un Professeur soit lisible. Cette méthode est appelée par défaut. public String toString() { return "Professeur [nom=" + nom + ", titre=" + titre + "]"; } }
public class Cours { private String intitule; private Professeur responsable; public Professeur getResponsable() { return responsable; } public void setResponsable(Professeur responsable) { this.responsable = responsable; } //Constructeur public Cours(String intitule, Professeur responsable) { this.intitule = intitule; this.responsable = responsable; } //Pour que l'affichage d'un cours soit "lisible" public String toString() { return "Cours [intitule=" + intitule + ", responsable=" + responsable +"]"; }
public class TestCours { public static void main(String[] args) { System.out.println("===================== Etape 1 ================================="); Professeur prof = new Professeur("Tournesol", "academicien"); System.out.println("Professeur [nom=Tournesol, titre=academicien] = \n" + prof); Cours cBD = new Cours("BD", prof); System.out.println("Cours [intitule=BD, responsable=Professeur [nom=Tournesol, titre=academicien]] = \n" + cBD); System.out.println("=> Un même prof sur deux cours"); Cours cAero = new Cours("aero", prof); System.out.println("Cours [intitule=aero, responsable=Professeur [nom=Tournesol, titre=academicien]] = \n" + cAero); }
public class Cours { private String intitule; private Professeur responsable; public Professeur getResponsable() { return responsable; } public void setResponsable(Professeur p) { this.responsable = p; } public boolean aUnResponsable(){ return (responsable != null); } //Constructeur public Cours(String intitule, Professeur responsable) { //this.intitule = intitule; this(intitule); // Les codes précédents restent corrects mais on préfère ici une cascade. Uniquement pour les étudiants plus avancés. this.responsable = responsable; } /*Constructeur sans le professeur responsable * puisque à présent il est possible de créer un cours sans responsable. */ public Cours(String intitule) { this.intitule = intitule; } //Pour que l'affichage d'un Cours soit lisible. Cette méthode est appelée par défaut. public String toString() { return "Cours [intitule=" + intitule + ", responsable=" + responsable +"]"; }
A Placer dans le main. Vous pouvez commenter l'étape précédente.
/* Etape 2 */ Professeur amina = new Professeur("AMINA", "missBahut"); Cours cProfs = new Cours("Francais"); System.out.println("Cours [intitule=Francais, responsable=null] = " + cProfs); System.out.println("A un responsable (false) : " + cProfs.aUnResponsable()); cProfs.setResponsable(amina); System.out.println("A un responsable (true) : " + cProfs.aUnResponsable()); System.out.println("Cours [intitule=Francais, responsable=Professeur [nom=AMINA, titre=missBahut]] =\n" + cProfs);
Dans la classe Cours
Collection<Vacataire> vacataires = new ArrayList<Vacataire>(); public void addVacataire(Vacataire v) { vacataires.add(v); } /** * @param v : Vacataire à retirer de la liste * @return boolean * Retire le vacataire v de la liste (exactement le même objet) si la collection contient cet élément. * Renvoie vrai si la collection contient l'element et La liste des vacataires est modifiée * sinon elle renvoie faux. */ public boolean removeVacataire(Vacataire v) { return (vacataires.remove(v)); } private String vacatairesToString() { String vacatairesString = " "; Iterator<Vacataire> it = vacataires.iterator(); while (it.hasNext()) { vacatairesString += it.next().toString() + ";"; } return "{ " + vacatairesString.substring(0, vacatairesString.length()-1)+ "}"; } public String toString() { return "Cours [intitule=" + intitule + ", responsable=" + responsable + ", vacataires=" + vacatairesToString() + "]"; }
public class Vacataire { private String nom; public Vacataire(String nom) { this.nom = nom; } @Override public String toString() { return "Vacataire [nom=" + nom + "]"; } }
/* Etape 3 */ Cours cBD = new Cours("BD"); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ } = \n" + cBD); Vacataire dolores = new Vacataire("Dolorès"); Vacataire eric = new Vacataire("eric"); System.out.println("=> Pas de retrait possible (false) = " + cBD.removeVacataire(dolores)); System.out.println("Et le cours n'est pas modifié = \n" + cBD); cBD.addVacataire(dolores); System.out.println("=> Ajout pris en compte "); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}]\n" + cBD); System.out.println("=> Pas de retrait possible de eric(false) = " + cBD.removeVacataire(eric)); System.out.println("=> Retrait pris en compte (true) = "+ cBD.removeVacataire(dolores)); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ }]\n" + cBD); System.out.println("=> Ajouts pris en compte = "); cBD.addVacataire(dolores); cBD.addVacataire(eric); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès];Vacataire [nom=eric]}] \n" + cBD); System.out.println("=> Retrait eric pris en compte (true)= "+ cBD.removeVacataire(eric)); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}]\n" + cBD); cBD.addVacataire(eric); System.out.println("=> Retrait dolores pris en compte = "+ cBD.removeVacataire(dolores)); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=eric]}]= \n" + cBD);
Cours [intitule=BD, responsable=null, vacataires={ } = Cours [intitule=BD, responsable=null, vacataires={ }] => Pas de retrait possible (false) = false Et le cours n'est pas modifié = Cours [intitule=BD, responsable=null, vacataires={ }] => Ajout pris en compte Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}] Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}] => Pas de retrait possible de eric(false) = false => Retrait pris en compte (true) = true Cours [intitule=BD, responsable=null, vacataires={ }] Cours [intitule=BD, responsable=null, vacataires={ }] => Ajouts pris en compte = Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès];Vacataire [nom=eric]}] Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès];Vacataire [nom=eric]}] => Retrait eric pris en compte (true)= true Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}] Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=Dolorès]}] => Retrait dolores pris en compte = true Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=eric]}]= Cours [intitule=BD, responsable=null, vacataires={ Vacataire [nom=eric]}]
import java.util.*; public class Etudiant { private String nom; private int niveau; Collection<Cours> cours = new ArrayList<Cours>(); public Etudiant(String nom, int niveau) { this.nom = nom; this.niveau = niveau; } //Le choix de protected permet d'interdire l'utilisation de cette opération en dehors du package. // Et donc de "potentiellement" éviter une incohérence. // En phase de tests, il serait plus sage de vérifier que le cours a bien connaissance de l'étudiant. protected void addCours(Cours unCours) { cours.add(unCours); } protected void removeCours(Cours unCours) { cours.remove(unCours); } private String coursToString() { String coursString = " "; Iterator<Cours> it = cours.iterator(); while (it.hasNext()) { coursString += it.next().getIntitule() + ";"; } return "{ " + coursString.substring(0, coursString.length()-1)+ "}"; } public String toString() { return "Etudiant [nom=" + nom + ", niveau=" + niveau + ", cours=" + coursToString() + "]"; } }
Dans la classe Cours
Collection<Etudiant> etudiants = new ArrayList<Etudiant>(); // Attention on ne vérifie pas que l'étudiant n'est pas déjà référencé public void addEtudiant(Etudiant e){ etudiants.add(e); e.addCours(this); } public boolean removeEtudiant(Etudiant e) { boolean retrait = etudiants.remove(e); if (retrait) e.removeCours(this); return retrait; } private String etudiantsToString() { String etudiantsString = " "; Iterator<Etudiant> it = etudiants.iterator(); while (it.hasNext()) { etudiantsString += it.next().toString() + ";"; } return "{ " + etudiantsString.substring(0, etudiantsString.length()-1)+ "}"; } public String toString() { return "Cours [intitule=" + intitule + ", responsable=" + responsable + ", vacataires=" + vacatairesToString() + ", etudiants=" + etudiantsToString() + "]"; }
System.out.println("===================== Etape 4 : Cours-Etudiant ================================="); Etudiant boulard = new Etudiant("Boulard", 0); Etudiant nitchinsky = new Etudiant("Nitchinsky", 0); cBD = new Cours("BD"); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ }, etudiants={ }] \n ==" + cBD); System.out.println("=> Pas de retrait possible (false) = " + cBD.removeEtudiant(boulard)); System.out.println("=> Pas de retrait possible du cours dans etudiant mais pas d erreur " ); System.out.println("Et le cours n'est pas modifié = \n ==" + cBD); cBD.addEtudiant(boulard); System.out.println("=> Ajout pris en compte "); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ }, etudiants={ Etudiant [nom=Boulard, niveau=0, cours={ BD}]}] \n ==" + cBD); System.out.println("=> Pas de retrait possible de nitchinsky(false) = " + cBD.removeEtudiant(nitchinsky)); System.out.println("=> Retrait pris en compte (true) = "+ cBD.removeEtudiant(boulard)); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ }, etudiants={ }]\n ==" + cBD); System.out.println("etudiant ne reference plus le cours :" + boulard); System.out.println("=> Ajouts pris en compte = "); cBD.addEtudiant(boulard); cBD.addEtudiant(nitchinsky); System.out.println("Cours [intitule=BD, responsable=null, vacataires={ }, etudiants={ Etudiant [nom=Boulard, niveau=0, cours={ BD}];Etudiant [nom=Nitchinsky, niveau=0, cours={ BD}]}] \n ==" + cBD); System.out.println("===> un même etudiant dans plusieurs cours "); cProfs = new Cours("Francais"); cProfs.addEtudiant(boulard); System.out.println("Boulars et nitchinsky \n ==" + cBD); System.out.println("Que Boulard \n ==" + cProfs); System.out.println("=> Retrait Boulard pris en compte (true)= "+ cBD.removeEtudiant(boulard)); System.out.println("Que nitchinsky \n ==" + cBD);