next up previous
Up: No Title Previous: Exercice 2 : un

Exercice 3 : Calcul d'une expression

On reprend le programme de calcul d'expressions arithmétiques préfixées du cours. Soient les programmes suivants :

Fichier : Essai2.java

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Essai2 extends java.applet.Applet {

   TextField ligne = new TextField ("Votre expression") ;
   String res = "Debut" ;

   ActionListener RC = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
      if (e.getSource() == ligne) agir(ligne.getText());
     }
   };
      
  
   public void init () {
     add (new Label ("    Une expression en notation prefixee S.V.P."));
     add (ligne) ;

     }

   void agir (String lu) {
     LectExpAr lec = new LectExpAr (lu) ;
     ExpAr ex = lec.lpf() ;
     res = ex.scp() + " = " + ex.eval() ;
     repaint();
     }

   public void paint (Graphics g) {
          g.drawString(res, 50, 100) ;
    }
}

Fichier : LectExpAr.java

public class LectExpAr {
   char [] buflu ; // la chaine qui sera lue (ya pas de streams en Java !=)
  int indlu ;  // index parcourant la chaine lue

  public LectExpAr (String lu) {buflu = lu.toCharArray() ; indlu = 0;}

  ExpAr lpf () { // le moteur r\'ecursif
      char carlu = buflu[indlu] ;
      indlu++ ;
      switch (carlu)
        {case '+' : return new Add(lpf(), lpf());
         case '*' : return new Mult (lpf(), lpf());
        /* sinon c'est une constante */
         default : return new Cte((int) carlu - (int) '0') ;
         }
       }
}


abstract class ExpAr { // classe abstraite racine de l'arbre d'heritage
    abstract int eval () ;
    abstract String scp () ;
}

class Cte extends ExpAr { // premiere sous-classe concrete
    int val ;
                  Cte (int v) {val = v ;}
    int eval () { return val ;}
    String scp () {return (new Integer(val)).toString() ;}
}

abstract class Bin extends ExpAr {
    ExpAr og, od ;
    abstract int oper (int g , int d) ;
    abstract String cop () ;

    int eval () {return oper (og.eval(), od.eval()) ;}
    String scp () {return ("("+ og.scp() + cop() + od.scp() +")") ; }
    void init (ExpAr g, ExpAr d) {og = g ;od =  d ;}
}

class Add extends Bin {
    Add (ExpAr g, ExpAr d) {init (g, d) ;}
    int oper (int g, int d) {return (g+d) ;}
    String cop () {return ("+") ;}
}

class Mult extends Bin {
    Mult (ExpAr g, ExpAr d) {init (g, d) ;}
    int oper (int g, int d) {return (g*d) ;}
    String cop () {return ("*") ;}
}

1.
Que s'affiche-t-il si on entre le texte *+34+56 dans le champ entrée?
2.
Ajouter les opérateurs de soustraction et de division. Quel est le résultat de /+34-33?
3.
Pour calculer les expressions dans un environnement (correspondant à un tableau à deux dimensions on définit une classe Env contenant un champs tableau d'ExpAr. Puis on modifie la classe abstraite EpxAr et les classes dérivées pour que la méthode eval prenne un argument de la classe Env.

4.
Ajouter une nouvelle classe pour les expressions arithmétiques correspondant à la valeur d'une cellule de l'environnement. On notera Cxy la case (x,y) de l'environnement avec x et y pouvant s'écrire avec un chiffre. Modifier aussi le lecteur par la même occasion.
5.
Que se passe-t-il s'il y a un cycle dans l'expression à calculer? Par exemple, la case C00 contient +3C11 et la case C11 l'expression *C005.
6.
Comment détecter un cycle dans le calcul d'une expression?
7.
Ecrire une sous-classe de l'environnement en ajoutant deux champs x et y pour les coordonnées de la cellule courante.
8.
Ecrire une nouvelle classe pour les expressions arithmétiques correspondant à la valeur d'une cellule repérée de manière relative dans l'environnement. On les notera R+x+y, R-x-y le signe étant obligatoire.
9.
Ecrire une grille de saisie comme un tableau de 10x10 TextField. Par défaut l'environnement ne contient que des constantes =0 (on peut ajouter une classe Undef (de valeur 0, ne s'affichant pas)). Quand on saisie une nouvelle valeur dans un des textField, on calcule la formule entrée, et on affiche le résultat. L'environnement contient la ExpAr.


next up previous
Up: No Title Previous: Exercice 2 : un
Emmanuel CHAILLOUX
12/7/1997