SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: UserLx en Miércoles 28 de Diciembre de 2005, 15:37

Título: Evaluador De Expresiones
Publicado por: UserLx en Miércoles 28 de Diciembre de 2005, 15:37
Hol@s a todos...

Les cuento que debo de desarrollar un Evaluador de Expresiones en Lenguage C (no C++) que me asignaron para una evaluacion en la universidad...
un programa que pueda interpretar algo como por ejemplo esto:

vble=2+14*sqrt(16)+(7-14/2)  
y que imprima el valor de "vble" por pantalla...

pero no sé por donde comenzar... he leido algunas paginas como
http://jungla.dit.upm.es/~gabriel/tprg/cur...xpresiones.html (http://jungla.dit.upm.es/~gabriel/tprg/curso0405/practicas/practica1/EvaluadorExpresiones.html)
pero la verdad no consigo implementarlo en C...

Alguien me puede dar una mano con esto??? alguno que me sirva de ejemplo o alguna direccion donde consiga mas información del tema... conseguí un libro donde implementan un evaluador descendente recursivo en C, esta muy bueno aunque tiene algunas limitaciones.. según he leido que se puede implementar con pilas...

Bueno, espero sus sugerencias y recomendaciones

PD: Me tome la tarea de transcribir el código del evaluador descendente recursivo y lo adjunto aqui por si alguien quiere revisarlo (realmente no lo he compilado)
Título: Re: Evaluador De Expresiones
Publicado por: UserLx en Miércoles 4 de Enero de 2006, 03:51
Por favor ayuda!!!

Estuve revisando unos link y encontre uno que me ha dejado el panorama mas claro (sección 7.1.1 en el link del pdf)

http://www.canalada.org/apuntes/7%20Uso%20...20de%20TADs.pdf (http://www.canalada.org/apuntes/7%20Uso%20y%20dise%F1o%20de%20TADs.pdf)


Almenos ya sé como se hace, el problema es que no tengo suficiente experiencia programando en C y aunque sé que es lo que quiero hacer me cuesta decirle "que hacer" al ordenador...

Como puedo implementar la funcion que me convierta una expresion algebraica en notacion polaca?? y como puedo crear un arbol binario a partir de esta notacion polaca para recorrerlo en pre-orden posteriormente??

Agradezco cualquier tipo de ayuda...
Título: Re: Evaluador De Expresiones
Publicado por: patitofeo en Miércoles 4 de Enero de 2006, 17:39
:hola:

recorre el array con la expresion total y vete comparando cada caracter con los distintos operadores.

Estos son: '(', ')', '+'. '-', '^', '*', '=' y '/'
no se si se me queda alguno.

estos son los simbolos que separan los números

guarda en arreglos diferentes cada operacion que componga la expresion final y crea una estructura de capas.

ejemplo: (2+3)*(5-1)=

             arreglo1={3, +, 2}
             arreglo2={5, -, 1}
             arreglo3={soluciona(arreglo1), *, soluciona(arreglo2)}

consejo: en vez de arreglos puedes utilizar estructuras que facilitara el trabajo

tendras que tener cuidado con el orden (esto es lo mas dificil)

consejo: crea una gerarquia de prioridad en las operaciones (determina cuales se ejecutaran antes y cuales despues si no existen parentesis) piensa que si * es prioritario sobre +:
           2+3*2+1=9
           (2+3)*(2+1)=15
tambien puedes determinar una prioridad de izq a der. o viceversa pero yo te recomiendo una gerarquia como hacen por ejemplo los compiladores.

consejo: no almacenes los parentesis, solo utilizalos para ordenar las operaciones.

Como ves, el operador de alguna de las estructuras será un numero que resultara de resolver otra operacion. Este numero deberas asignarle luego. Como se ve arriba yo crearia una funcion que recoja como parametro una estructura de las que has creado ( que podria ser:
                                     struct operacion{
                                                              double operando1;
                                                              unsigned char operando;
                                                              double operando2;
                                                              }
           ).

Por supuesto esto solo es un idea. Hay miles de formas de hacerlo. Tu puedes basarte en esta o en otras para implementar tu programa.

Por supuesto nadie te va a hacer el codigo. Asique si de aqui en adelante te queda alguna duda, haz preguntas concretas diciendo como has ido trabajando y donde te has quedado atascado.

Suerte y espero que te sirva de ayuda.

Para cualquier duda, ya sabes...
Título: Re: Evaluador De Expresiones
Publicado por: bob esponja en Viernes 6 de Enero de 2006, 04:33
te aconsejo la que establescas la precedencia con llamadas a metodos y los parentesis los resuelvas con recursividad.

expresion := <expresion1> [<addOp> <expresion1>]*

expresion1 := <item> [ <mulOp> <item> ]*

item := <numero> | <variable> | <metodo> | <contante> | ( expresion ) <--- aca esta la recursividad

addOp := + | -

mulOp := * | /

te aconsejo que leas esto

http://compilers.iecc.com/crenshaw/ (http://compilers.iecc.com/crenshaw/)

aunque esta en pascal se entiende todo
Título: Re: Evaluador De Expresiones
Publicado por: UserLx en Sábado 7 de Enero de 2006, 17:40
Gracias por responder... tomare en cuenta sus sugerencias y les comentare luego como me fué...
Título: Re: Evaluador De Expresiones
Publicado por: Solman en Lunes 9 de Enero de 2006, 01:10
Claro la idea para poder evaluar expreesiones matematicas es que tienes que idfentificar los separadores matematicos osea hacer una funcion que recorra toda la expresion completa y vaya identificando los separadores y a la vez los vaya evaluando con condiciones segun jerarquia de separadores incluyendo operadores matematicos y listo