User Tools

Site Tools


2018_2019:s2:td:td_final

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
2018_2019:s2:td:td_final [2019/02/16 21:15]
blay [Pour vous aider]
2018_2019:s2:td:td_final [2019/04/12 16:13] (current)
blay [Rendu pour ce devoir]
Line 1: Line 1:
 ====== De la modélisation au code : FINALE ====== ====== De la modélisation au code : FINALE ======
  
-FIXME+<​panel ​ title="​Attention pour la semaine prochaine!">​ 
 +{{:​2018_2019:​s2:​td:​exams2-mars2018.pdf| Examen 2018}}
  
-Dans ce TD nous avons pour objectif de partir de la modélisation et d'​arriver au codage en 4h ! +{{:​2018_2019:​s2:​td:​exams2-avril2017.pdf|Examen 2017}} 
- +</​panel>​
-comprendre la relation entre la modélisation et le code, et ceci en utilisant tous les éléments de modélisation.+
  
 +<box round rgb(255,​204,​153) rgb(255,​255,​204) 97%|Dans ce TD :  >
 +nous avons pour objectif de partir de la modélisation et d'​arriver au codage en 4h !
 +</​box>​
 /* /*
 ===== Reverse : La classe ''​Point''​ (10 mn) ===== ===== Reverse : La classe ''​Point''​ (10 mn) =====
Line 17: Line 20:
  
 */ */
-===== Chemin et Parcours ​(30mn) =====+===== La classe "​Journey" ​(30mn) =====
  
-   * On définit un Chemin ​comme ayant un point de départ, un point d'​arrivée et un intitulé. +   * On définit un ''​Trajet/​Journey'' ​comme une suite ordonnée ​de points. 
-   * Un point peut appartenir à plusieurs ​chemins+   * Un point un intitulé ​(par exemple, "IUT, Fabron"​)
-   * 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 point peut appartenir à plusieurs ​Trajets. 
-   * Un Parcours 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. +   * Un point ne sait pas à quel(s) trajet(s) il est associé
-   * On veut connaitre la distance que représente un Parcours (c'est la somme des distances des chemins qui le composent).+   * On veut connaitre la distance que représente un Trajet, c'est la somme des distances entre les points ​(cf. si besoin [[http://​fr.wikipedia.org/​wiki/​Distance_entre_deux_points_sur_le_plan_cart%C3%A9sien|Calcul de distance]])
  
-   - Modéliser les concepts ​de Chemin et de Parcours.  +   - Modéliser ​le concept de Trajet, y compris ​les autres ​concepts ​dont vous pouvez avoir besoin
-          * Un chemin ne sait pas de quel(s) Parcours il fait éventuellement parti +
    - Codez-les.    - Codez-les.
- 
-<note warning>​Dans le modèle de la classe CHEMIN, IL N'Y A PAS D'​ATTRIBUTS ''​DEPART''​ et ''​ARRIVEE''​ mais des associations !</​note>​ 
-<note important>​Dans cet exercice, faîtes particulièrement attention aux rôles et à la navigation dans les associations. 
-</​note>​ 
  
 <note tip>Je sais représenter des associations entre classes et je comprends leur correspondance en java. </​note>​ <note tip>Je sais représenter des associations entre classes et je comprends leur correspondance en java. </​note>​
Line 63: Line 61:
        * Un membre peut enregistrer son parcours :         * Un membre peut enregistrer son parcours : 
                 - il déclare sur son téléphone qu'il commence à enregistrer un parcours;                 - il déclare sur son téléphone qu'il commence à enregistrer un parcours;
-                - toutes les 10 secondes, un nouveau point est automatiquement ​créé ​en demandant au GPS du téléphone sa position et l'​heure actuelle; le point est ajouté au parcours en cours; Les coordonnées GPS sont des coordonnées sur une sphère et pas des coordonnées cartésiennes,​ cependant dans le cadre de ce TD, travaillez "​simplement"​ avec des coordonnées cartésiennes;​+                - toutes les 10 secondes, ​le système crée un nouveau point automatiquement en demandant au GPS du téléphone sa position et l'​heure actuelle; le point est ajouté au parcours en cours; Les coordonnées GPS sont des coordonnées sur une sphère et pas des coordonnées cartésiennes,​ cependant dans le cadre de ce TD, travaillez "​simplement"​ avec des coordonnées cartésiennes;​
                 - le membre signale la fin du parcours qui est automatiquement enregistré dans sa base de parcours.                 - le membre signale la fin du parcours qui est automatiquement enregistré dans sa base de parcours.
        * Un membre peut visualiser les parcours passés : par la distance parcourue, la durée, la vitesse moyenne, la date (jour et heure), le type d'​entrainement,​ ...         * Un membre peut visualiser les parcours passés : par la distance parcourue, la durée, la vitesse moyenne, la date (jour et heure), le type d'​entrainement,​ ... 
-       ​* ​En sélectionnant un parcours, un membre peut visualiser un parcours en utilisant googleMAP.+       ​* ​Un membre peut demander à visualiser un parcours en utilisant googleMAP
 +       * Un membre peut savoir quand il était le plus proche d'un point donné lors d'un parcours. 
 +       * Un membre peut savoir où il était à une date particulière : le système renvoie la position enregistrée à la date la plus proche.
        * Un membre peut préciser qu'il veut enregistrer un parcours d'​entrainement;​ dans ce cas, avant le départ, il précise le mode d'​entrainement. Pour chaque mode, un temps de relevé des points différent est prévu : marche rapide (2mn), course à pied (10s), vélos (5s), foot (10s), ...        * Un membre peut préciser qu'il veut enregistrer un parcours d'​entrainement;​ dans ce cas, avant le départ, il précise le mode d'​entrainement. Pour chaque mode, un temps de relevé des points différent est prévu : marche rapide (2mn), course à pied (10s), vélos (5s), foot (10s), ...
        * Un membre peut créer son propre mode d'​entrainement en précisant les temps de consultation etc.        * Un membre peut créer son propre mode d'​entrainement en précisant les temps de consultation etc.
Line 77: Line 77:
 Evidemment vous commencez par identifier les cas d'​utilisation de haut niveau. Mais ensuite vous pouvez travailler comme bon vous semble. Evidemment vous commencez par identifier les cas d'​utilisation de haut niveau. Mais ensuite vous pouvez travailler comme bon vous semble.
   * Définir le diagramme de cas d'​utilisation   * Définir le diagramme de cas d'​utilisation
-  * "​Prévoyez"​ les tests correspondant aux scénarii suivants ​(soit dans l'​outil,​ soit sur papier) ​+  * **Partie 1** : "​Prévoyez"​ les tests correspondant aux scénarii suivants : 
       -  "​Bipbip"​ s'​inscrit en utilisant son compte "​Facebook";​       -  "​Bipbip"​ s'​inscrit en utilisant son compte "​Facebook";​
       -  "​Xavier-Bertrand"​ s'​inscrit en saisissant son nom  et déclare son compte twitter;       -  "​Xavier-Bertrand"​ s'​inscrit en saisissant son nom  et déclare son compte twitter;
-      -  "​Bipbip"​ demande l'​enregistrement de son parcours lundi.  +      -  "​Bipbip"​ demande l'​enregistrement de son parcours ​"lundi": par exemple :  Journey [points=[ [date=Thu Feb 28 21:39:15 CET 2019, Point [x=5, y=5, label=domicile]], ​ [date=Thu Feb 28 21:39:16 CET 2019, Point [x=7, y=7, label=p1]], ​ [date=Thu Feb 28 21:39:17 CET 2019, Point [x=10, y=10, label=p2]],..</​code>​ 
-      -  "​Bipbip"​ demande également l'​enregistrement de son parcours et précise qu'il s'agit d'un entrainement à la course.+      -   "​Bipbip"​ demande quand il était près d'un point d'un parcours donné : (1) point enregistré pendant le parcours e.g. ( (7,7) -> ''​date=Thu Feb 28 21:39:16 CET 2019''​) ​ ; (2)  point le plus proche quand il était le plus proche d'un point donné lors d'un parcours (e.g. (12,12) -> ''​date=Thu Feb 28 21:39:17 CET 2019''​) 
 +      -"​Bipbip" ​ demande où il était à  ''​Thu Feb 28 21:39:17 CET 2019''​ : le système renvoie (12,12) etc. 
 +   * **Partie 2** : "​Prévoyez"​ les tests correspondant aux scénarii suivants, mais, à moins d'​être très avancés n'​allez pas au code. 
 +      - "​Bipbip"​ demande également l'​enregistrement de son parcours et précise qu'il s'agit d'un entrainement à la course.
       - "​Bipbip"​ demande à voir ses parcours triés par la durée : il a couru lundi pendant 20mn et mercredi 30mn.        - "​Bipbip"​ demande à voir ses parcours triés par la durée : il a couru lundi pendant 20mn et mercredi 30mn. 
-      - "​Bipbip"​ demande à voir ses parcours triés par la vitesse moyenne: il a courru ​lundi à 11km/h et mercredi 10km/​h. ​+      - "​Bipbip"​ demande à voir ses parcours triés par la vitesse moyenne: il a couru lundi à 11km/h et mercredi 10km/​h. ​
       -  "​Xavier-Bertrand"​ déclare un nouveau mode d'​entrainement :  le Marathon, les relevés ne se font que toutes les minutes.       -  "​Xavier-Bertrand"​ déclare un nouveau mode d'​entrainement :  le Marathon, les relevés ne se font que toutes les minutes.
   * Définir le diagramme de classes   * Définir le diagramme de classes
   * Définir le diagramme de séquence correspondant à l'​enregistrement d'un parcours par un membre, vous pouvez vous aider du diagramme ci-après. ​       ​   * Définir le diagramme de séquence correspondant à l'​enregistrement d'un parcours par un membre, vous pouvez vous aider du diagramme ci-après. ​       ​
-  * Implémenter ​ce scénario en vous aidant des codes ci-après. En particulier,​ comme nous ne disposons pas du GPS dans l'​exemple donné ci-après c'est l'​utilisateur qui saisit sa position. De même comme vous ne connaissez pas encore la parallèlisation des tâches on demande à chaque relevé de position, s'il faut ou non continuer à enregistrer le parcours.+  * Implémenter ​les  ​scénario ​de la partie 1 en vous aidant des codes ci-après. En particulier,​ comme nous ne disposons pas du GPS dans l'​exemple donné ci-après c'est l'​utilisateur qui saisit sa position. De même comme vous ne connaissez pas encore la parallèlisation des tâches on demande à chaque relevé de position, s'il faut ou non continuer à enregistrer le parcours.
   * Pouvez-vous étendre votre application pour donner la vitesse moyenne entre deux points donnés d'un parcours? ​   * Pouvez-vous étendre votre application pour donner la vitesse moyenne entre deux points donnés d'un parcours? ​
  
Line 99: Line 102:
     * Avez-vous besoin d'​information supplémentaires sur la notion de Point? Comment faire? ​     * Avez-vous besoin d'​information supplémentaires sur la notion de Point? Comment faire? ​
     * De quelles informations avez-vous besoin pour construire un Parcours?     * De quelles informations avez-vous besoin pour construire un Parcours?
-    *  
  
 == Obtenir le moment présent == == Obtenir le moment présent ==
Line 131: Line 133:
 </​code>​ </​code>​
  
 +<​accordion ​ collapsed="​true">​
 +<panel title="​Vision Globale : si vous avez besoin d'​aides">​
 === Vision Globale ​ === === Vision Globale ​ ===
  
Line 136: Line 140:
  
 <code java> <code java>
-public ​Parcours creerParcours(Membre ​m) throws InterruptedException{  + Scanner sc = new Scanner(System.in);​ 
- System.out.println("​Creation de parcours ​"); +        int interval = 1000; 
- ... + 
- .... + public ​Journey createJourney(Member ​m) throws InterruptedException{  
-                PointDate pCourant ​saisirPointDate(); ; + System.out.println("​Creating a journey ​"); 
- Parcours parcours ​= new Parcours(pCourant); +        ​DatedPoint currentPoint ​enterDatedPoint(); ; 
- boolean ​encore ​= true; + Journey path = new Journey(currentPoint); 
- while (encore){ + boolean ​again = true; 
- pCourant ​saisirPointDate();  + while (again){ 
- parcours.addPoint(pCourant); + currentPoint ​enterDatedPoint();  
- System.out.println("​Distance ​parcourue ​: " + parcours.distance());​ + path.addPoint(currentPoint); 
- System.out.println("​Durée depuis le départ ​: " + parcours.duree() + " soit :" + parcours.duree()/1000 + " secondes"​ ); + System.out.println("​Distance ​ : " + path.distance());​ 
- .... + System.out.println("​Duration since departure ​: " + path.duration() + " soit :" + path.duration()/1000 + " secondes"​ ); 
- System.out.println("​On continue ? (true or false)"​);​ + System.out.println("​We continue ? (true or false)"​);​ 
- encore ​= sc.nextBoolean();​ + again = sc.nextBoolean();​ 
- Thread.sleep(intervalle);  //1000 milliseconds is one second.+ Thread.sleep(interval);  //1000 milliseconds is one second.
  }  }
- return ​parcours; + return ​path;
  }  }
-  +  
- private ​PointDate saisirPointDate() { + private ​DatedPoint enterDatedPoint() { 
- PointDate pCourant;+ DatedPoint currentPoint;
  int x;  int x;
  int y;  int y;
Line 166: Line 170:
  //obtenir la date courante  //obtenir la date courante
  Date date = new Date();  Date date = new Date();
- pCourant ​= new PointDate(x,​y,​date);​ + currentPoint ​= new DatedPoint(x,​y,​date);​ 
- return ​pCourant;+ return ​currentPoint;​ 
 +
 +  
 +</​code>​ 
 + 
 + 
 +Autres exemples 
 + 
 +<code java> 
 +//To improve taking into account the displacement 
 + public Date whenWasYouHere(Point point) { 
 + DatedPoint closestPoint = points[0];​ 
 + double distanceMin = point.distance(closestPoint);​ 
 + for (int i =1; i<​nextPlace;​i++) { 
 + double distance = point.distance(points[i]);​ 
 + if (distance < distanceMin) { 
 + distanceMin = distance; 
 + closestPoint = points[i];​ 
 +
 +
 + return closestPoint.getDate();​ 
 +
 +  
 +  
 + //To improve taking into account the displacement 
 + public DatedPoint whereWereYou(Date date) { 
 + long time = date.getTime();​ 
 + DatedPoint closestPoint = points[0];​ 
 + long durationMin = Math.abs(closestPoint.getDate().getTime()-time);​ 
 + for (int i =1; i<​nextPlace;​i++) { 
 + long duration = Math.abs(points[i].getDate().getTime()-time);​ 
 + if (duration < durationMin) { 
 + durationMin = duration; 
 + closestPoint = points[i];​ 
 +
 +
 + return closestPoint;
  }  }
  
 </​code>​ </​code>​
 +
 +Et des exemples de tests ...
 +
 +<code java>
 +@Test
 + void testClosestPoint() throws InterruptedException {
 + Date currentDate1 = new Date();
 + DatedPoint currentPoint1 = new DatedPoint(5,​5,​currentDate1) ;​
 + Thread.sleep(1000); ​
 + Date currentDate2 = new Date();
 + DatedPoint currentPoint2 = new DatedPoint(7,​7,​currentDate2) ;​
 + Thread.sleep(1000); ​
 + DatedPoint currentPoint3 = new DatedPoint(10,​10,​new Date()) ;
 + Thread.sleep(1000); ​
 + Date currentDate3 = new Date();
 + Journey path = new Journey(currentPoint1);​
 + path.addPoint(currentPoint2);​
 + path.addPoint(currentPoint3);​
 + assertEquals(currentPoint1.getDate(),​ path.whenWasYouHere(currentPoint1));​
 + assertEquals(currentPoint2.getDate(),​ path.whenWasYouHere(currentPoint2));​
 + assertEquals(currentPoint3.getDate(),​ path.whenWasYouHere(currentPoint3));​
 + assertEquals(currentPoint3.getDate(),​ path.whenWasYouHere(new DatedPoint(12,​12,​new Date())));
 + assertEquals(currentPoint1.getDate(),​ path.whenWasYouHere(new DatedPoint(4,​4,​new Date())));
 + assertEquals(currentPoint2.getDate(),​ path.whenWasYouHere(new DatedPoint(8,​8,​new Date())));
 +
 + }
 +
 +
 + @Test
 + void testWhereWereYou() throws InterruptedException {
 + Date currentDate1 = new Date();
 + DatedPoint currentPoint1 = new DatedPoint(5,​5,​currentDate1) ;​
 + Thread.sleep(1000); ​
 + Date currentDate2 = new Date();
 + DatedPoint currentPoint2 = new DatedPoint(7,​7,​currentDate2) ;​
 + Thread.sleep(1000); ​
 + DatedPoint currentPoint3 = new DatedPoint(10,​10,​new Date()) ;
 + Thread.sleep(1000); ​
 + Date currentDate3 = new Date();
 + Journey path = new Journey(currentPoint1);​
 + path.addPoint(currentPoint2);​
 + path.addPoint(currentPoint3);​
 + assertEquals(currentPoint1,​ path.whereWereYou(currentDate1));​
 + assertEquals(currentPoint2,​ path.whereWereYou(currentDate2));​
 + assertEquals(currentPoint3,​ path.whereWereYou(currentDate3));​
 + assertEquals(currentPoint3,​ path.whereWereYou(new Date()));
 + assertEquals(currentPoint1,​ path.whereWereYou(new Date(currentDate1.getTime()-1000)) );
 + }
 +</​code>​
 +
 +
 +</​panel> ​
 +</​accordion>​
 +
 +
 +==== Rendu pour ce devoir ====
 +
 +    - Les rendus se font sous [[http://​jalon.unice.fr/​cours/​blay/​Cours-blay-20160226085155/​BoiteDepot-blay-20190217142915655329?​mode_etudiant=true&​tab=deposit|jalon]] avant <color red>11 mars 9h/​color>​
 +    - Le rendu respecte ce qui suit : 
 +          - il se fait à 2 maximum
 +          - le titre est composé de  FIN<​NumeroDuGroupe>​_NomEtudiant__NomEtudiant //(e.g. DS1_Doe_Smith ou UC2_Harry)//​
 +          - Un document qui comprend : 
 +                 - votre diagramme de cas d'​utilisation ​
 +                 - votre diagramme de séquence
 +                 - votre diagramme de classes cohérent relativement à l'​ensemble de l'​étude de cas et donc complété relativement au diagramme de séquence
 +                 - les codes sources (là où vous en êtes)
 +                 - les tests si vous en avez, sinon le main de test
 +
 +**Erreurs**
 +  * Livrer les binaires
 +  * ne pas livrer un document mais des images
 +  * Livrer les codes dans un .txt !
  
  
2018_2019/s2/td/td_final.1550348130.txt.gz · Last modified: 2019/02/16 21:15 by blay