Teaching - 2i013

Enseignants


2i013 - Groupe 5 : Course de voiture

TME 1


Exercice 1: Eclipse


Dans ce TME, nous decouvrons l'environnement de programmation Eclipse (cf. http://www.eclipse.org) et travaillons sur une hierarchie de classes simple.

Creation d'un projet Eclipse

Après avoir lancé l'environement Eclipse (commande eclipse & dans une console),

  • choisir une workplace: le répertoire où seront stockés les projets. Ce peut être la racine de votre répertoire (par défaut) ou un répertoire à l'intérieur de 2i013 (probablement plus pertinent)
  • fermer la fenêtre d'accueil
  • à l'aide du clic droit dans la fenêtre de gauche
    • créer un nouveau projet java 
    • créer des packages (répertoires où seront stockés les classes)
    • créer une classe de test
    • à l'aide du bouton "run" exécuter un premier programme de test

Détails:

Nommer ce projet 2i013-Nom1-Nom2 avec vos noms de binôme. Important : Prendre la précaution de séparer les sources des autres répertoires cf. dernière option du 2e écran de création de projet (cette option est cochée par défaut).

Dans «l'explorateur de paquetage», développer ce projet pour faire apparaître le répertoire src, a priori vide. En sélectionnant ce répertoire puis en sélectionnant l'option du menu contextuel (clic sur le bouton droit), créer deux packages: mains et geometrie.

NB:

  • les packages commencent toujours par une minuscule
  • les classes toujours par une majuscule
  • les méthodes toujours par une minuscule

Création d'une classe Test1 dans le package mains

A l'aide de la souris (clic droit sur le package + new Class + option main), créer une nouvelle classe et ajouter un main dans les options de création.

Tester une commande basique d'affichage System.out.println("Coucou"); et lancer l'exécution.

Création d'une classe Vecteur dans le package geometrie

Suivant la même procédure, créer la classe Vecteur dans la package geometrie.

Déclarer ensuite les attributs private double x,y (ou public final double x,y). Utiliser ensuite les fonction de génération automatique de code:

  • clic droit -> source -> Generate Constructor using fields
  • clic droit -> source -> Generate Getters and Setters
  • clic droit -> source -> Generate equals
  • clic droit -> source -> Generate toString

Ecrire ensuite les méthodes vues en cours (cf dernier slide).

Pour toutes les méthodes comme l'addition ou la soustraction, il est conseiller de développer 2 versions:

  • une méthode qui retourne un nouveau vecteur contenant le résultat de l'opération
  • une version qui modifie l'instance courante sans rien renvoyer

Renommage intelligent

Tester la fonction clic droit -> refactor -> rename sur un nom de variable pour en comprendre le fonctionnement.

Test et validation

De manière générale, nous chercherons à valider le code développé au fur et à mesure.

  • Créer une classe VecteurTest contenant un main à coté de la classe Vecteur
  • Tester les fonctions à l'aide d'exemples:
    • (1,2) + (1, 3) -> (2, 5)
    • rotation (1, 0) de PI/2 -> (0, 1)
    • rotation (1, 1) de PI/2 -> (-1, 1)
    • produit scalaire de 2 vecteurs perpendiculaires -> 0
    • produit scalaire de 2 vecteurs dans la même direction -> >0
    • produit scalaire de 2 vecteurs dans des directions opposées -> <0
    • ...

Exercice 2: Fichiers


Question préliminaire: énumération Terrain

Sur le modèle proposé dans le cours, écrire une énumération permettant de gérer les différents types de terrain auxquels nous seront confrontés.

Dans une classe de test, écrire un main permettant de tester la syntaxe pour manipuler les énumérations (conditions if, println sur les énumérations...).

Rappel du code du cours:

 public enum Terrain {
   Route, Herbe, Eau, Obstacle, BandeRouge, BandeBlanche,
     StartPoint, EndLine, Boue;

   public static char[] conversion =
            {'.', 'g', 'b', 'o', 'r', 'w', '*', '!', 'm'};

   public static Color[] convColor = {Color.gray, Color.green,
       Color.blue, Color.black, Color.red, Color.white,
       Color.cyan, Color.cyan, new Color(200, 150, 128)};
 }

Opérateur sur les terrains

Dans une classe TerrainTools, vous développerez les méthodes suivantes:

  • public static Terrain terrainFromChar(char c) throws TerrainException

Conversion char -> Terrain (pour la lecture de fichier)

  • public static char charFromTerrain(Terrain c)

Conversion Terrain -> char (usage plus aléatoire)

  • public static Color terrainToRGB(Terrain c)

Conversion Terrain -> Color (pour la création d'image)

  • public static boolean isRunnable(Terrain t)
    NB: on peut rouler sur le goudron, la boue, les lignes de couleur, les lignes d'arrivées, le point de départ.

Lecture d'un fichier trk

Télécharger les fichiers de travail:

LI260_track_2012.zip Nous travaillerons sur le premier fichier 1_safe.trk.

Visualisation et structure

Ouvrir ces fichiers dans un éditeur de texte afin de bien voir sur quel type de données vous allez travailler.

Structure:

  • ligne 1 et 2: nombre de colonnes et de ligne de la matrice terrain
  • ligne 3 à fin: n_col lettres, correspondant à chaque case de terrain. Le code est le suivant:
    • 'g' : herbe
    • 'b' : eau
    • '.' : gaudron
    • 'w/r' : bande de goudron rouge et blanche
    • '*' : point de départ
    • '!' : ligne d'arrivée.

Vous devez ensuite être clair sur la stratégie de lecture à adopter:

  1. lecture des deux premières lignes et conversion en int
  2. instantiation de la matrice de type Terrain[][]
  3. boucle sur les lignes
    1. lecture d'une ligne (readLine)
    2. boucle sur les caractères de la String (=sur les colonnes)
      1. remplissage de la matrice

Implémentation

Ecrire un programme lisant les données du fichier et les stockant dans une matrice de Terrain. Procéder à quelques tests pour vérifier que votre implémentation répond bien à la question.
NB: il n'est pas nécessaire de développer des classes propres pour cet exercice, la structuration du projet est l'objet du cours numéro 2.

NB2: pour les énumérations et les différents cas de figure, il est conseillé d'utiliser la syntaxe switch (c'est souvent plus clair). Attention tout de même à bien comprendre le switch et à ne pas oublier les break si besoin.

Rappel de code de cours:

 InputStream file = new FileInputStream(filename);

 try {
   // ouverture
   InputStreamReader fr = new InputStreamReader(file);
   // fonction supplémentaire
   BufferedReader in = new BufferedReader(fr);

   String buf = in.readLine();

   in.close(); // penser à la fermeture

   return ...;
 // dans l'idéal, on sépare la gestion des exceptions
 } catch (Exception e) {
   e.printStackTrace();
   System.err.println("Invalid Format : " + file
            + "... Loading aborted");
   return null;
 }

Rendre la classe Vecteur Serializable (exercice optionnel, à faire à la fin)

Afin de vérifier le fonctionnement de la sauvegarde automatique d'objet:

  • Ajouter implements Serializable dans la classe Vecteur
  • Ajouter un UID en cliquant sur la suggestion eclipse
  • Créer un programme de test pour vérifier le fonctionnement de la sauvegarde/chargement d'objet.

Exercice 3: Construction d'une image


Mini tutoriel sur les images en java

A l'aide des fonctions vues en cours, construire une image du terrain et la sauvegarder dans un fichier.

NB développer la méthode public static BufferedImage imageFromCircuit(Terrain[][] track) dans la classe TerrainTools

Vérifier visuellement que votre système fonctionne.

Il est possible d'afficher assez simplement l'image depuis le programme:

  • Construire et sauver l'image dans le programme
  • Utiliser Runtime.exec pour afficher l'image à l'aide d'un programme externe.