diferentes requisitos: sern permitidas slo expresiones numricas, sin variables, se aceptarn las operaciones matemticas de suma (+), multiplicacin (*), resta (-), y divisin (/) y se debe tener en cuenta los signos de agrupamiento parntesis ( ) y corchetes [ ] en ese orden de prioridad. Se deber comprobar que la expresin est bien escrita, es decir, que no hayan expresiones que no sean las que se pueden resolver. Se dar como resultado la resolucin de esta frmula y tendr que existir un buen nivel de interactividad con el usuario
En esta prctica procederemos a evaluar expresiones escritas en forma infija (el operador est situado entre los operandos) con parntesis y con operandos que sern variables (cada vez que deseemos evaluar la expresin pediremos al usuario que nos d los valores concretos de las variables para esa evaluacin). Las operaciones vlidas que evaluaremos sern las operaciones binarias +, -, *, /. Expresiones vlidas a evaluar sern, por ejemplo: a + (b - c) / d, (a+b) / (c-d) * e,... 0. Objetivos a. Utilizacin del tipo abstracto de datos Arbol binario. b. Reutilizacin de cdigo (reutilizacin de la clase Pila). c. Utilizacin de cdigo no desarrollado por el usuario (funcin infija_a_posfija y clase TablaSimbolos). d. Trabajo con funciones recursivas. 1. I NTRODUCCI N Una manera adecuada de representar expresiones aritmticas es a travs de los rboles binarios de expresiones. Esta representacin retiene de manera natural la precedencia y la asociatividad de los operadores aritmticos. En un rbol binario de expresiones cada nodo contiene la informacin de un elemento de la expresin (un operando o un operador) y la propia estructura del rbol viene determinada por la forma de la expresin aritmtica. Un ejemplo de esto lo tenemos en los siguientes rboles de expresiones:
Se puede ver que dependiendo de la colocacin de los parntesis se fuerza el cambio de precedencia de los operadores y las expresiones generan rboles distintos. Tambin es importante resaltar que en el rbol claramente no son necesarios los parntesis, ya que la precedencia en las operaciones viene dada por la estructura del rbol. La evaluacin de las expresiones, es decir, la obtencin de su resultado, se consigue recorriendo el rbol de expresiones en forma postfija y realizando para cada nodo que contiene un operador dicha operacin sobre sus hijos. De hecho, si examinamos el rbol en recorrido post-orden imprimiendo en pantalla el contenido de cada nodo, obtendremos lo que se denomina la expresin postfija de la expresin. Las expresiones postfijas de los rboles del ejemplo son las siguientes: Para la expresin infija (2+5)*3+1, la expresin postfija es 2 5 + 3 * 1 + Para la expresin infija 2+5*3+1, la expresin postfija es 2 5 3 * + 1 + Ntese que la expresin postfija, al igual que ocurra en el rbol, no necesita utilizar parntesis. De la misma forma que podemos obtener la expresin postfija a partir del rbol de expresiones, tambin podemos hacer lo contrario, es decir, obtener el rbol de expresiones a partir de una expresin postfija. Este hecho va a ser utilizado en la presente prctica. 2. Realizacin de la prctica a.- Obtencin de la expresin postfija y la tabla de variables. El programa deber empezar pidiendo la expresin aritmtica en forma infija que deseamos evaluar. Una vez guardada la expresin en una variable de tipo string pasaremos la expresin a su forma postfija y extraeremos de la expresin una tabla con las variables utilizadas en la expresin Utilizaremos para ello una funcin proporcionada por el profesor de prcticas infijo_a_posfijo. El prototipo de esta funcin es: bool infijo_a_posfijo (string , string &, TablaSimbolos &); Esta funcin tiene una entrada que es la cadena de la expresin infija. Como salidas de la funcin tenemos tres valores (dos devueltos por referencia y uno como resultado de la funcin): La primera salida (segundo parmetro de la funcin) es la cadena con la expresin postfija. La segunda salida (tercer parmetro de la funcin) es un objeto de tipo TablaSimbolos que es la tabla donde se almacenan los identificadores correspondientes a los nombres de cada variable. La tercera salida (valor devuelto por la funcin) es un valor booleano. La funcin devuelve true si la expresin esta sintcticamente bien formada o false si haba algn error sintctico en ella de estos dos tipos: Nos hemos dejado algn parntesis sin cerrar El nmero de operadores o de operandos no es el correcto La funcin no detecta errores como que el orden entre operandos y operadores sea incorrecto. b. Paso de la expresin postfija a su representacin mediante un rbol de expresin. El rbol que vamos a utilizar para guardar la expresin tendr como informacin en cada uno de sus nodos un carcter, tal y como hemos visto en la introduccin. Para realizar el paso de la expresin postfija a su representacin en el rbol vamos a necesitar una pila (de rboles binarios) para construir el rbol binario que guardar la expresin. Para conseguirlo realizaremos el siguiente proceso: Para cada uno de los elementos de la expresin postfija tenemos que hacer lo siguiente: Si el elemento analizado es un operando (variable), construimos un rbol binario de un nico nodo que contiene como informacin el carcter que representa la variable y como hijos dos subrboles vacos. Este rbol lo apilamos en la pila. Si el elemento analizado es un operador, construiremos un nuevo rbol de la siguiente manera: Extraemos dos elementos de la pila (cada elemento puede ser un rbol complejo si este procedimiento se ha hecho ya anteriormente). El primer elemento extrado de la pila ser el hijo derecho del nuevo rbol. El segundo elemento extrado ser el hijo izquierdo del nuevo rbol La informacin del nodo raz del nuevo rbol es el carcter que represente la operacin. Una vez construido el rbol lo apilamos en la pila. En el dibujo se detalla el proceso seguido para la obtencin del rbol de expresin para la expresin algebraica postfija a b + c * d +
Una vez analizados todos los elementos de la expresin en la pila se encontrar un nico rbol que es el correspondiente rbol de expresin.