:: Enseignements :: Licence :: L3 :: 2012-2013 :: Programmation Objet avec Java ::
[LOGO]

Interface, classe abstraite, classe générique


Exercice 1 - Arbre d'expressions

Le but de cet exercice est de construire un parseur d'expressions arithmétiques simples. Ces expressions sont représentées sous forme d'arbres.
L'ensemble des classes devront être définies dans le paquetage fr.umlv.calc si aucun paquetage n'est indiqué.

La classe OpOrValue définie des objets qui peuvent être soit des valeurs soit des opérations (avec un membre gauche et un membre droit).

  1. Pourquoi le constructeur qui prend 4 arguments est déclaré private ?
  2. Le constructeur qui crée une opération ne vérifie pas que l'opération est une opération valide. Changer le constructeur pour qu'il vérifie cela.
  3. Ecrire une méthode parse qui prend un scanner en entrée et crée l'arbre d'expression correspondant sachant que l'arbre sera donnée au scanner en utilisant la notation polonaise inverse. Par exemple, au lieu de 2 + 3 - 4, la notation polonaise inverse est - + 2 3 4.
    Ecrire, de plus, un main de test dans une classe Main.
    Rappel, scanner.next() renvoie le prochain mot, Integer.parseInt() permet de savoir si c'est un entier et il est possible de faire un switch sur des Strings en Java.
  4. Ecrire la méthode d'affichage de l'arbre d'expression pour que l'affichage se fasse dans l'ordre de lecture habituel.
  5. Noter que prendre un Scanner en paramètre ne permet pas de ré-utiliser la méthode parse si par exemple l'expression à parser est stockée dans une List de String.
    Quelle doit être l'interface que l'on doit utiliser à la place de Scanner pour que l'on puisse appeler la méthode parse avec une List ou un Scanner.

Exercice 2 - Arbre d'héritage

La classe OpOrValue est en fait mal codé car pas codé en objet. En effet, chaque objet stocke trop d'information et la disctinction entre le type valeur et le type opération se fait par un champs et non pas par la classe elle-même.
  1. Ecrire les classes Expr, Value, Add et Sub ayant les mêmes fonctionnalités que la classe OpOrValue mais codé de façon Object.
    De plus, modifier la classe Main de test.
  2. Dans quelle classe doit-on mettre la méthode parse ? Modifier celle-ci pour qu'elle marche avec les nouvelles classes.
  3. Ecrire une méthode eval calculant le résulat de l'expression.
  4. Discuter sur le fait de transformer la classe Expr en classe abstraite ou en interface. Faire les changements qui s'imposent.
  5. Ajouter les classes Mult et Divide permettant d'effectuer respectivement la multiplication et la division.
  6. Refactoriser le code pour mettre à un seul endroit le code commun.
    Attention à bien mettre les bons modificateurs de visibilité. Les champs doivent être privés !
  7. Faire en sorte que si l'on affiche un Expr, cela affiche l'arbre dans l'ordre habituel d'affichage.