Il s'agit dans cette question
de représenter graphiquement une expression. La
difficulté réside dans le placement des noeuds ; ils seront placés sur
un maillage rectangulaire.
On écrira une méthode : drawExpr
qui renvoie un entier et
qui prend en argument une expression e
et deux entiers xMin
et yMin
.
La racine de
e
sera placée à l'ordonnée yMin
et le noeud le plus
à gauche aura pour abcisse xMin
. Au retour, le point courant
de MacLib
sera l'emplacement de la racine et la valeur retournée
sera l'abcisse du noeud le plus à droite.
L'initialisation du graphisme se fait en appelant la méthode
static void initGraphique() { MacLib.initQuickDraw(); Rect r = new Rect(50, 50, 50 + 300, 50 +300); MacLib.setDrawingRect(r); MacLib.showDrawing(); }
Pour dessiner un noeud « variable », on fera :
MacLib.moveTo(xMin, yMin+H_TEXT); // on descend un peu, prendre H_TEXT = 12 MacLib.drawChar(c); // le nom de la variable MacLib.moveTo(xMin, yMin); // on replace le point courant
Pour dessiner un noeud « entier », on fera de même avec
MacLib.drawString("" + valeur);
Pour dessiner un noeud « opération » :
(xMin, yMin+DELTA_Y)
,
DELTA_X
, on sait à
quelle abcisse xRac
placer la racine,
MacLib.lineTo(xRac, yMin);
et on
écrit le code de l'opérateur,
(xRac+DELTA_X, yMin+DELTA_Y)
,
On prendra par exemple DELTA_X = DELTA_Y = 10
et on obtient ainsi :
Cela peut être amélioré, notamment en adaptant le
placement de l'opérateur selon que c'est un sous-arbre gauche ou
droit, ce qui peut régler le problème visible pour
3 - 2
.
simplify
qui prend une expression et
retourne une expression équivalente ayant moins de noeuds.
On devra au moins remplacer les expressions constantes par leurs valeurs et
traiter les cas particuliers du 0
et du 1
.