Portail informatique Année 2018 – 2019

CSC 3101 – Algorithmique et langage de programmation

Durée: 2h, tout document papier autorisé
Lorsque vous écrivez du code, essayez d'avoir un indentation à peu près correcte (une indentation trop incorrecte vous ferait perdre des points). Sauf si explicitement demandé, il n'est pas nécessaire :
  • de gérer les cas d'erreurs,
  • d'expliciter la visibilité des champs, méthodes et constructeurs,
  • d'expliciter les packages et les imports,
  • d'indiquer quelles exceptions peuvent être levées par une méthode dans sa signature (c'est-à-dire sa déclaration).
Le but de cet exercice est de concevoir une librairie pour faire des calculs géométriques simples. Dans un premier temps, on écrit une classe pour stocker des coordonnées.

Pour écrire notre librairie, nous nous appuyons sur le package java.lang.Math. En particulier, les méthodes statiques suivantes seront utiles :
  • double Math.pow(double a,double b) renvoie a à la puissance b
  • double Math.sqrt(double a) renvoie la racine carrée de a
  • double Math.cos(double a) et double Math.sin(double a) donnent respectivement le sinus et le cosinus de l'angle a donné en radian.
Mise en route (∼5mn – 1 point – facile) On souhaite nommer notre librairie geometrie. Quelle est la directive de package Java que doit contenir le début de chaque classe de la librairie ? Par la suite, on considère que cette directive est toujours incluse. Tout objet de notre librairie est manipulable en tant qu'élément de l'espace euclidien. Écrivez un interface Element qui déclare une méthode tourner prenant un argument un double et ne renvoyant pas de valeur.
Les points (∼20mn – 4,5 points – facile)

On souhaite maintenant écrire une classe Point qui met en œuvre l'interface Element. Cette classe contient deux champs x et y de type double donnant les coordonnées cartésiennes du point. Écrivez la déclaration de la classe Point. Cette classe possède un constructeur prenant en argument les coordonnées du point et permettant de les initialiser. Écrivez une méthode String toString() qui renvoie une chaîne de caractères contenant les coordonnées du point sous la forme "(x, y)". Écrivez la méthode permettant de faire tourner un point. On vous rappelle que la rotation d'angle d'un point (x,y) ayant pour centre (0,0) est donnée par les formules suivantes:
  • x' = x . cos(a) - y . sin(a)
  • y' = x . sin(a) + y . cos(a)
Est-ce que le code suivant est correct et pour quelle raison ? Si ce code est correct, qu'affiche-t-il ? Element e = new Point(1d,0d); e.tourner(Math.PI); System.out.println(e); Ajoutez une méthode double distance(Point p) à la classe Point renvoyant la distance entre le point this et le point p.

On vous rappelle que dans le plan cartésien, la distance entre (x1, y1) et (x2, y2) est donnée par √((x2-x1)2+(y2-y1)2).
Les figures (∼40mn – 6 points – moyen)

On souhaite désormais ajouter à notre librairie la notion de figure. Pour ce faire, on définit une classe Figure mettant en œuvre Element. Une instance de Figure contient un seule champ nommé points. Ce champ est une collection de points, chaque point indiquant les coordonnées de l'un des sommets. Écrivez une mise en œuvre de la classe Figure. Comme une Figure est un Element, votre code devra mettre en œuvre :
  • la méthode tourner(double angle) permettant de tourner les sommets de la figure,
  • un constructeur prenant en paramètre un tableau de points et initialisant la collection de sommets.

On vous rappelle que :
  • la classe java.util.ArrayList<E> met en œuvre l'interface Collection<E>,
  • la méthode add(E e) de l'interface Collection<E> permet d'ajouter un élément à une collection.
Donnez le code d'une méthode permettant de savoir si une figure est un triangle équilatéral.

La méthode int size() retourne le nombre d'éléments d'une collection.
Les transformations (∼35mn – 5,5 points – moyen)

Nous souhaitons maintenant effectuer d'autres transformations sur nos figures. Pour cela, nous employons une approche dite "visiteur-visité" : le visiteur prend en entrée un point et applique une transformation. Le visiteur est représenté par une interface nommée Transformeur. Cette interface comprend une unique méthode nommée appliquer prenant en argument un point et effectuant une transformation sur le point. La méthode appliquer ne renvoie pas de valeur. Donnez le code de l'interface Transformeur. Donnez le code d'une classe TranslateurPoint permettant de translater un point. Cette classe :
  • met en œuvre Transformeur,
  • possède deux champs de type double dx et dy,
  • possède une mise en œuvre de la méthode appliquer qui déplace un Point de dx et dy. Vous pouvez considérer que les champs x et y de la classe Point sont publics, et que vous pouvez donc les modifier à partir de la classe TranslateurPoint.
Ajoutez maintenant une méthode transforme à la classe Figure. Cette méthode prenant en argument un Transformer tr et s'occupe de transformer la figure en utilisant tr. Pour finir, donnez le code permettant de :
  • créer un polygone ayant pour sommets les points de coordonnées (0, 1), (1, 1), (1, 0) et (0, 1),
  • translater le polygone de 2 suivant l'axe des x et de 3 suivant l'axe des y.
On suppose qu'on dispose du code suivant permettant de manipuler une liste chaînée. Donnez le code de la méthode printAll de la classe ListeChainee permettant d'afficher chacun des éléments contenu dans la liste dans le terminal. On suppose que vous disposez d'une méthode de classe static int compare(Object e1, Object e2) permettant de comparer deux objets quelconques : cette méthode renvoie -1 si e1 < e2, 1 si e1 > e2 et 0 sinon. Donnez le code de la méthode insert(E element) de la classe ListeChainee permettant d'ajouter un élément à la liste en s'assurant que la liste soit toujours triée dans l'ordre croissant.