TD d'informatique No. 6 : arbres et expressions

Patrick Gros -- Patrick.Gros@irisa.fr
Didier Le Botlan -- didier.le_botlan@inria.fr

Lundi 18 décembre 1999

1   Utilisation des arbres pour représenter des expressions arithmétiques

On peut utiliser les arbres pour représenter les expressions arithmétiques. Pour représenter un nombre, on met ce nombre comme attribut d'une feuille. Pour représenter une opération unaire (par exemple sin ou cos), on crée un noeud qui a cet opérateur comme attribut et qui a un fils qui contient, sous forme d'arbre, l'expression qui est son argument. Pour représenter une expression avec un opérateur binaire comme a + b, on crée un noeud qui contient + et qui a deux fils qui contiennent respectivement a et b. Pour rendre les choses plus visuelles, la figure 1 montre l'arbre qui correspond à l'expression : 2 cos p + q/2 sin p - q/2


Figure 1: Un arbre.


Le but du TD est de construire de tels arbres pour les opérations suivantes : +, -, *, /, ^, sin et cos, avec les nombres réels. Pour entrer au clavier une expression, on peut penser à trois moyens.
Ordre infixe :
pour les opérations binaires, on entre un opérande, l'opérateur et le deuxième opérande. Cette façon de faire mène à des ambiguïtés qu'il faut lever par l'emploi de parenthèses, aussi n'utiliserons-nous pas ceci dans le présent TD. Par exemple, l'interprétation de 2 * 3 + 4 est ambigüe.
Ordre préfixe :
dans cet ordre, on entre d'abord l'opérateur, puis ses opérandes ensuite. Cet ordre n'est pas ambigu. Pour l'expression déjà donnée, cela donne : * 2 * cos / + p q 2 sin /- p q 2.
Ordre postfixe :
dans ce dernier cas, l'opérateur vient après ses opérandes. Par exemple : 2 p q + 2 / cos p q - 2 / sin * *

2   Travail demandé

Écrire 3 fonctions. Les deux premières peuvent être écrites dans l'ordre que vous voulez. N'écrivez la troisième qu'ensuite.

Principe pour les entrées /sorties.
Il est fourni quelques fonctions pour faciliter les entrées sur la page web. La fonction Lire_ligne sert à lire une ligne de texte. On l'utilise une fois pour chaque expression, en début du programme principal. On pourra, en s'inspirant de Lire_Premier_Mot, écrire une fonction Mot_Suivant qui sert à récupérer les mots qui forment la ligne qui a été lue par Lire_Ligne. Par exemple, si à l'appel de Lire_Ligne, l'utilisateur répond + 2 3, le premier appel à Mot_Suivant renvoie la chaîne "+", le deuxième appel la chaîne "2", et le troisième la chaîne "3".

2.1   Première fonction : lecture d'une expression préfixe

La première fonction suppose que la ligne lue par Lire_Ligne est une expression écrite en ordre préfixe. Cette fonction renvoie l'arbre correspondant à cette expression. (Indication : faire une fonction récursive.)

2.2   Deuxième fonction : calcul de l'expression représentée par un arbre

Cette deuxième fonction reçoit un arbre en argument, et renvoie le réel qui est le résultat de l'évaluation de l'expression représentée par l'arbre. (Indication : faire une fonction récursive.)

2.3   Troisième fonction : lecture d'une expression postfixe

La difficulté avec les expressions postfixes vient du fait que les opérateurs peuvent venir longtemps après leurs opérandes (par exemple, le premier 2 de l'expression est un opérande de la dernière multiplication. On crée donc une pile où l'on va stocker les opérandes en attente d'utilisation.

La fonction ne doit pas être récursive. Tant qu'il y a des mots, elle les lit. Pour chacun d'entre eux, elle crée le noeud correspondant, va chercher dans la pile les opérandes éventuels et empile le noeud construit.

À la fin, elle renvoie l'arbre se trouvant en sommet de pile.

3   Pour aller plus loin

On peut se servir des mêmes arbres pour stocker des expressions contenant des variables et pas seulement des nombres. Modifiez les programmes pour construire de tels arbres, et écrivez une fonction qui prend un tel arbre en argument et calcule sa dérivée par rapport à une variable donnée.

Bonne fin d'année et bonnes vacances !
This document was translated from LATEX by HEVEA.