User Tools

Site Tools


2015_2016:s2:td:td_domaine_partie_2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
2015_2016:s2:td:td_domaine_partie_2 [2016/02/20 08:27]
blay [Spécialisation et Enuméré (10 mn)]
2015_2016:s2:td:td_domaine_partie_2 [2016/02/20 14:31]
blay [Un robot facteur]
Line 1: Line 1:
 ====== Classes : modélisation et codage ====== ====== Classes : modélisation et codage ======
-<note warning>​en cours</​note>​ 
-Objectif : Faire un lien direct entre la modélisation des classes et les codes correspondants. 
  
-<​note>​Inspirés ​de http://​www.fresnel.fr/​perso/​derrode/​index.html</​note>​+**Objectifs :**  
 +     - Faire un lien direct entre la modélisation des classes et les codes correspondants. 
 +     - Savoir construire un petit modèle de classes et le mettre en oeuvre. 
 + 
 +<​note>​Ce TD est évalué sur toute sa durée et plus spécifiquement sur le dernier exercice.</​note>​ 
 + 
 + 
 +===== Classe : Code et modélisation ===== 
 +<note tip> 
 +Les notes de bas de page vous donnent des indications sur certaines actions. Il suffit de laisser la souris sur les renvois. 
 +</​note>​ 
 +<note tip> 
 +Les temps sont donnés à titre indicatif, ce TD doit aller assez vite, il est simple et vise seulement à bien poser le lien entre conception et développement. 
 +</​note>​ 
 + 
 +<​note>​Exercices inspirés ​de http://​www.fresnel.fr/​perso/​derrode/​index.html ​(le site a disparu... et je n'en trouve plus trace...)</​note>​
 <​html>​ <​html>​
 <​!-- ​ <​!-- ​
Line 15: Line 28:
 --!> --!>
 </​html>​ </​html>​
-===== Classe : Code et modélisation ===== 
-<note tip> 
-Les notes de bas de page vous donnent des indications sur certaines actions. Il suffit de laisser la souris sur les renvois. 
-</​note>​ 
-<note tip> 
-Les temps sont donnés à titre indicatif, ce TD doit aller assez vite, il est simple et vise seulement à bien poser le lien entre conception et développement. 
-</​note>​ 
 ==== Classe ''​TailleHaie''​ (10mn) ==== ==== Classe ''​TailleHaie''​ (10mn) ====
  
Line 138: Line 144:
  
   - Et si nous voulions représenter plusieurs sortes de Robot, que ferions-nous?​ Et si tout robot était un Outil Electrique ?    - Et si nous voulions représenter plusieurs sortes de Robot, que ferions-nous?​ Et si tout robot était un Outil Electrique ? 
-===== Devoir facultatif pendant les vacances ===== 
  
 +===== Allons plus loin =====
 +
 +<note warning>​Cet exercice doit être réalisé autant que possible, **seul**.
 +Vous devez réussir à présent à analyser puis coder un "​ptit"​ problème comme celui-ci. </​note>​
  
 A présent notre robot peut utiliser un véhicule. A présent notre robot peut utiliser un véhicule.
 +
 +==== Déplacement d'un véhicule ====
  
 Un ''​véhicule''​ a une ''​position''​ (X, Y en entier). Un ''​véhicule''​ a une ''​position''​ (X, Y en entier).
Line 151: Line 162:
 Une ''​fusee''​ est un véhicule qui se déplace d'un delta de 100 à chaque demande de déplacement. Une ''​fusee''​ est un véhicule qui se déplace d'un delta de 100 à chaque demande de déplacement.
  
 +<​code>​
 +===================TESTS Vehicules ===================
 +Chariot => Vehicule [position=[0,​0]]
 +Avance sur X, position attendue [10,0] : true
 +Avance sur Y, position attendue ​ [10,10]: true
 +Fusee => Vehicule [position=[0,​0]]
 +Avance sur position attendue [100,​0] ​ : true
 +Avance sur position attendue [100,​100] ​ : true
 +
 +</​code>​
 +
 +
 +==== Le robot conduit le véhicule ====
 On peut donner un véhicule au robot. Il l'​initialise quand il le reçoit. On peut donner un véhicule au robot. Il l'​initialise quand il le reçoit.
-On peut demander au robot de se déplacer selon un schéma donné : "​XYXX"​. Le robot déplacera alors le véhicule de X puis de Y puis de X puis de X.+On peut demander au robot de se déplacer selon un schéma donné : "​XYXX"​((la méthode toCharArray() appliquée sur une String renvoie un tableau de "​Char"​)) 
 +Le robot déplacera alors le véhicule de X puis de Y puis de X puis de X.
  
 Quand le robot arrête de travailler il ramène le véhicule en position initiale. Quand le robot arrête de travailler il ramène le véhicule en position initiale.
Line 159: Line 184:
  
 <​code>​ <​code>​
-=========================TESTS Jardinier & Vehicule =================== +
-===================TESTS Vehicules =================== +
-Chariot => Vehicule [position=[0,​0]] +
-Avance sur X : Chariot => Vehicule [position=[10,​0]] +
-Avance sur Y : Chariot => Vehicule [position=[10,​10]] +
-Fusee => Vehicule [position=[0,​0]] +
-Avance sur X : Fusee => Vehicule [position=[1000,​0]] +
-Avance sur Y : Fusee => Vehicule [position=[1000,​1000]]+
 ===================TESTS jardinier & Vehicules =================== ===================TESTS jardinier & Vehicules ===================
 Pas de vehicule : Je suis R2-D2 : je n'ai pas d'​outil ​ je n'ai pas de vehicule ​ Pas de vehicule : Je suis R2-D2 : je n'ai pas d'​outil ​ je n'ai pas de vehicule ​
 Avec un charriot : Je suis R2-D2 : je n'ai pas d'​outil , j'ai ce vehicule Chariot => Vehicule [position=[0,​0]] Avec un charriot : Je suis R2-D2 : je n'ai pas d'​outil , j'ai ce vehicule Chariot => Vehicule [position=[0,​0]]
 Deplacement du jardinier en XYX, on attend (0,​0),​(10,​0) (10,10) (20,​10) ​ Deplacement du jardinier en XYX, on attend (0,​0),​(10,​0) (10,10) (20,​10) ​
-  [0,0] +Nouvelle position attendue ​[20,10]  : true 
- [10,0] + 
-  [10,10] + 
- [20,10] +Avec une fusee : Je suis R2-D2 : je n'ai pas d'​outil , j'ai ce vehicule ​Fusee => Vehicule [position=[0,​0]] 
-Debut du travail pour le jardinier ​Je démarre : Tondeuse [vitesse=moyen,​ cadence=1000] +Deplacement du jardinier en XYX, on attend (0,​0),​(100,​0) (100,100) (200,100)  
-Position du charriot attendue en (0,0): [0,0] +Nouvelle position attendue [200,​100] ​ : true 
-Deplacement du jardinier en YYX on l'​attend en (10,20) avec la tondeuse +
- Je suis R2-D2, je tiens Tondeuse [vitesse=moyen,​ cadence=1000],​ j'ai ce vehicule Chariot => Vehicule [position=[10,​20]] +
-Arret du travail pour le jardinier : Merci, la journée a été dure! +
- Je suis R2-D2 : je n'ai pas d'​outil , j'ai ce vehicule ​Chariot ​=> Vehicule [position=[0,​0]]+
 </​code>​ </​code>​
  
 +==== Un robot facteur ====
  
-<box round rgb(185,​211,​238) rgb(198,​226,​255) 95%|TD Noté facultatif: remis à votre encadreur par mail ayant pour sujet((Sans cet intitulé les rendus ne seront pas évalués!!)) "[S2] modeles : //Groupe// : //Membres du binôme//"​ avec en attachement ​un document contenant vos diagrammes et votre codeLe fichier des diagrammes sera nommé TP_N_NumeroduTP_NomEtudiant1_NomEtudiant2 sans compression : 8 mai 2015 23h59> ​+Nous sommes très content de notre robot jardinier. 
 +Nous décidons de construire ​un robot facteur.
  
-{{:​omgl:​acsi:​cours7.gif|}} ​ Rendre le diagramme de classe et le code correspondant à l'​exercice,​ y compris les tests. +Il transporte des courriers
-</​box>​+
  
-===== Reverse et agrégation =====+Suivez l'​énoncé pas à pas. Il est écrit ainsi pour vous aider. 
 +Des exemples de tests sont donnés pour vous aider, en particulier à définir les méthodes associées à vos classes.
  
-==== Reverse : La classe ''​Point''​ ==== 
  
-  - Etant données les [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​awt/​Point.html|spécifications suivantes]] en omettant tous les accesseurs dessiner la classe ''​Point''​ correspondante. Vous pouvez aussi procéder par reverse engineering {{:​2013_2014:​s2:​td:​point.java.zip|(classe Point)}} 
  
-<​note>​Et si nous voulions à présent travaillez avec des points en coordonnées polaires, que ferions-nous?​ </​note>​ 
-==== Utilisation d'une classe : Chemin et Trajet ==== 
  
-   * On définit un chemin comme ayant un point de départ, un point d'​arrivée et un intitulé. 
-   * Un point peut appartenir à plusieurs chemins. 
-   * On veut connaitre la distance que représente un chemin (cf. si besoin [[http://​fr.wikipedia.org/​wiki/​Distance_entre_deux_points_sur_le_plan_cart%C3%A9sien|Calcul de distance]]) 
-   * Un trajet est une suite ordonnée de chemins tels que le point de départ d'un chemin est le point d'​arrivée du chemin suivant. 
  
-   - Modéliser les concepts de Chemin et de Trajet  +=== Courrier ===
-   - Codez-les.+
  
-==== La classe ​''​Polygone''​ ====+Un courrier est défini par une adresse et un contenu. 
 +Pour des raisons de confidentialité,​ une fois créé, si on demande l'adresse ou le contenu du courrier, on obtient un texte illisible : il est crypté en utilisant un encrypteur donné plus bas et une clef donnée à la construction du courrier.
  
-Un polygone est composé d'un ensemble de points. +Voici le modèle correspondant à la classe ​"​Encryptor"​
-  - Modéliser la classe ''​Polygone''​ en UML.  +
-  - Il est possible de créer un polygone comme un ensemble vide de Points ou en passant un tableau de Points +
-  - Générer ​le code. Quelle structure de données utilisez vous? Regarder le code généré ... Evidemment il n'est pas possible de modifier la classe Point fournie par java. Vous ne devez donc pas la générer. +
-  - Tester votre classe, par exemple en ajoutant une méthode ''​ToString''​+
  
-==== La classe ''​Polygone''​ V2 ==== +{{ :2015_2016:​s2:​td:​capture_d_e_cran_2016-02-20_a_14.22.00.png?direct&​200 |}}
-  * Pour   ​remplir ​ le   ​tableau ​ de  points, ​ on  a besoin d'​une ​ première ​ méthode ​ ''​addPoint'' ​ qui  ajoutera ​ un  point  à  ceux  déjà ​ présents. ​  +
-  ​Etendez votre modélisation de la classe ''​Polygone''​ en UML.  +
-  ​Générer le code +
-  - Tester votre classe. +
-  - Que retenez-vous de cet exercice? Quand se fait le choix de la structure?+
  
 +**Le courrier ne contient pas le texte initial, ni la clef de cryptage. Elles sont seulement connues à la création du courrier.** On ne peut pas modifier l'​adresse ou le contenu d'un courrier.
  
-<html+Exemple de tests et de trace :  
-<!-- +<code> 
-==== Faîtes tout seul! ==== +Courrier c = new Courrier("​Avenue Fabron, Nice","​Bravo ", 3); 
-  +System.out.println("​Courrier adresse illisible " + c.getAdresse());​ 
-* Vous commencerez par modéliser puis vous vous intéresserez aux codes : +System.out.println("​Courrier contenu illisible " + c.getContenu());​  
-      * Nous avons besoin de manipuler des triangles. Un triangle c'est un polygone, évidemment.  +</code> 
-      * On veut pouvoir créer un triangle en donnant ses trois sommets : new Triangle (p1, p2, p3) +<​code>​ 
-      * On veut pouvoir savoir si un triangle est équilatérale.  +  ===================TESTS Courrier =================== 
-      * Pour cela vous aurez besoin de calculer la distance d'un point relativement à un autre. + Courrier adresse illisible rEV]FVuRQA\]}ZPV 
-      * On ne peut pas ajouter un point à un triangle.+ Courrier contenu illisible qARE\ 
 +</​code>​
  
---!> + 
-</html>+**QUESTIONS** 
 +  ​Commencer par créer la classe ''​Encriptor''​ en recopiant "​simplement"​ le code donné plus bas. 
 +  ​Dans l'​ordre que vous voulez, répondez à ces deux questions, et tester votre code. 
 +      - Quel est le modèle de la classe Courrier?  
 +      - Quel est son code ? 
 + 
 + 
 +=== Decrypteur === 
 +Pour lire le courrier il faut utiliser un décrypteur,​ c'est un outil électrique. 
 +Quand il est allumé, si on lui présente un courrier, et on lui donne la clef, il nous donne l'​adresse en claire, sinon il renvoie l'​adresse telle que. 
 +Donc à chaque lecture, un ''​encryptor''​ est créé avec la clef en paramètre. 
 + 
 +Exemple de tests et de trace :  
 +<​code>​ 
 +Decrypteur decrypteur = new Decrypteur();​ 
 +System.out.println("​pas de lecture si non demarre " + decrypteur.read(c,​3));​ 
 +decrypteur.switchOn();​ 
 +System.out.println("​lecture efficiente : " +  decrypteur.read(c,​3) + " : " +decrypteur.read(c,​3).equals(origine) );  
 +</​code>​ 
 + 
 +<​code>​ 
 +===================TESTS Decrypteur =================== 
 +pas de lecture si non demarre rEV]FVuRQA\]}ZPV 
 +lecture efficiente : Avenue Fabron, Nice : true 
 +</​code>​ 
 + 
 +**QUESTIONS** 
 +  - Quelles sont les méthodes de la classe "​Decrypteur"​ ? 
 +  - Implémenter la classe "​Decrypteur"​. 
 + 
 +=== Facteur === 
 +Notre robot facteur peut  avoir un véhicule pour se déplacer et un décrypteur pour lire le courrier. Quand on lui remet un courrier, on lui donne la clef pour lire le courrier. 
 + 
 + 
 +Exemple de tests et de trace :  
 +<​code>​ 
 +System.out.println("​===================TESTS Facteur ==================="​);​ 
 +Courrier c2 = new Courrier("​Petit Prince Planete","​Je veux etre ton ami ",​2);​ 
 +Courrier c3 = new Courrier("​Pere Noel","​Je voudrais un robot voyageur ",​5);​ 
 + 
 +Facteur facteur = new Facteur("​Hermes"​);​ 
 +facteur.distribue(c,​3);​ 
 +facteur.distribue(c2,​2);​ 
 +facteur.distribue(c3,​2);​ 
 +  
 +String adresse = facteur.lire();​ 
 +System.out.println("​Je dois aller à " + adresse); 
 +facteur.setVehicule(charriot);​ 
 +facteur.deplacer("​XXYYY"​);​ 
 +Courrier courrier = facteur.depose();​ 
 +System.out.println("​Courrier deposé à l'​adresse : " + adresse ); 
 +System.out.println("​Je suis en  [20,30]: " + charriot.getPosition());​ 
 +  
 +adresse = facteur.lire();​ 
 +System.out.println("​Je dois aller à :" + adresse); 
 +System.out.println("​Je prends ma fusee"​);​ 
 +facteur.setVehicule(fusee);​ 
 +facteur.deplacer("​XYXYXYXYXYXYXY"​);​ 
 +courrier = facteur.depose();​ 
 +System.out.println("​Courrier depose à l'​adresse " + adresse); 
 +System.out.println("​Je suis en [700,700] : " + fusee.getPosition());​ 
 +  
 +adresse = facteur.lire();​ 
 +System.out.println("​Je dois aller à : " + adresse); 
 +System.out.println("​Je ne comprends pas, même pas capable de me donner la bonne clef!"); 
 +facteur.depose();​ 
 +System.out.println("​Courrier perdu "); 
 +System.out.println("​Je suis toujours en [700,700] : " + fusee.getPosition());​ 
 +  
 +adresse = facteur.lire();​ 
 +System.out.println("​J'​ai fini :  " + adresse); 
 +</code> 
 +<​code>​ 
 +===================TESTS Facteur =================== 
 +Je dois aller à Avenue Fabron, Nice 
 +Courrier deposé à l'​adresse : Avenue Fabron, Nice 
 +Je suis en  [20,30]: [20,30] 
 +Je dois aller à : Petit Prince Planete 
 +Je prends ma fusee 
 +Courrier depose à l'​adresse Petit Prince Planete 
 +Je suis en [700,700] : [700,700] 
 +Je dois aller à :​Wbub'​Ihbk 
 +Je ne comprends pas, même pas capable de me donner la bonne clef! 
 +Courrier perdu  
 +Je suis toujours en [700,700] : [700,700] 
 +J'ai fini :  Rentre chez toi 
 +</code> 
 + 
 +**QUESTIONS** 
 +  - Quel est le modèle de la classe Facteur? Qu'ont en commun un Facteur et un Jardinier?​ 
 +  - Quelles sont les méthodes que doit avoir un Facteur? 
 +  - Implémenter la classe ''​Facteur''​ 
 + 
 +=== Encrypteur === 
 + 
 +Voici le code pour crypter il est basé sur : [[http://​blog.idleman.fr/​snippet-14-java-crypter-et-decrypter-une-chaine-de-caractere/​|un code]] qui ne prend pas de clef, ici à la construction de l'"​Encrypteur"​ on lui passe une clef qui est évidemment secrète. 
 + 
 + 
 + 
 +<code java> 
 +public class Encryptor { 
 +  
 +   private final int key; 
 +    
 +   public Encryptor(int key) { 
 + super();​ 
 + this.key = key; 
 +
 + 
 + 
 + public String encrypt(String password){ 
 +         String crypte="";​ 
 +         for (int i=0; i<​password.length();​i++) ​ { 
 +             int c=password.charAt(i)^(48 + key);   
 +             crypte=crypte+(char)c;​  
 +         } 
 +         return crypte; 
 +     } 
 + 
 +  
 +      public String decrypt(String password){ 
 +         String aCrypter="";​ 
 +         for (int i=0; i<​password.length();​i++) ​ { 
 +             int c=password.charAt(i)^(48 + key);   
 +             aCrypter=aCrypter+(char)c;​  
 +         } 
 +         return aCrypter; 
 +     } 
 + 
 + 
 +
 +</​code>​ 
 + 
 +Exemple de tests de l'​encryptor :  
 + 
 +                Encryptor d = new Encryptor(2);​ 
 + String origine = "​Avenue Fabron, Nice";​ 
 + String sCryptee = d.encrypt(origine);​ 
 + System.out.println("​Pas lisible " + sCryptee);​ 
 + String r = d.decrypt(sCryptee);​ 
 + System.out.println(r ​ + " : " + r.equals(origine));​
2015_2016/s2/td/td_domaine_partie_2.txt · Last modified: 2016/02/20 14:33 by blay