• Domingo 17 de Noviembre de 2024, 21:45

Autor Tema:  Evaluador De Expresiones  (Leído 8084 veces)

UserLx

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Evaluador De Expresiones
« en: Miércoles 28 de Diciembre de 2005, 15:37 »
0
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
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)
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

UserLx

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Evaluador De Expresiones
« Respuesta #1 en: Miércoles 4 de Enero de 2006, 03:51 »
0
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


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...

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Evaluador De Expresiones
« Respuesta #2 en: Miércoles 4 de Enero de 2006, 17:39 »
0
: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...

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Evaluador De Expresiones
« Respuesta #3 en: Viernes 6 de Enero de 2006, 04:33 »
0
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/

aunque esta en pascal se entiende todo

UserLx

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Evaluador De Expresiones
« Respuesta #4 en: Sábado 7 de Enero de 2006, 17:40 »
0
Gracias por responder... tomare en cuenta sus sugerencias y les comentare luego como me fué...

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Evaluador De Expresiones
« Respuesta #5 en: Lunes 9 de Enero de 2006, 01:10 »
0
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