• Lunes 29 de Abril de 2024, 03:44

Autor Tema:  Math Parser (parsear fórmula matemática) en C  (Leído 2180 veces)

capsula4

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Math Parser (parsear fórmula matemática) en C
« en: Miércoles 17 de Junio de 2009, 04:29 »
0
Hola!

Quisiera saber si conocen alguna función que dada una fórmula matemática ingresada por teclado, por ej: "sen(2*x)/log(tg(x))" y dado un valor de x retorne el valor de función.

Lo que yo busco es simplemente una función así:

double evaluar(char*,double)

He estado tratando de programar yo mi propia función pero lo cierto es que es un trabajo bastante arduo.

Por mi parte encontré muparser.sourceforge.net que al parecer es bastante buena, el tema es que está implementada en C++ y no entiendo mucho de C++, sino solamente de C.

Si alguien que entienda de C++ es capaz de decirme qué código poner en un archivo C para que funcione, se lo agradecería! Mi intención es hacer simplemente lo siguiente:

int main()
{
evaluar(string,2)
}

Para programar diferenciación numérica por método de diferencias hacia adelante para un trabajo final. En cuanto lo pueda hacer se los envio! Gracias!

 :beer:

fenoloco

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Math Parser (parsear fórmula matemática) en C
« Respuesta #1 en: Miércoles 17 de Junio de 2009, 05:27 »
0
Podrias utilizar expresiones regulares para generar una arbol de derivacion y ver como evaluar tu funcion .

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Math Parser (parsear fórmula matemática) en C
« Respuesta #2 en: Miércoles 17 de Junio de 2009, 16:36 »
0
Buenas:
 Yo he programado un sistema de scripts que interpreta estas formulas.
 Para ello se usa algo llamado Notación Polaca Inversa. http://en.wikipedia.org/wiki/Reverse_Polish_notation
 Primero interpretas la formula y la vas convirtiendo a esta notación polaca inversa.
Ex:
 Notacion noramal 1*2+(3*5)
 Notación polaca inversa  1 2 * 3 5 * +

Una vez la tienes en polaca inversa, la metes en un stack. Y vas desencolando. Cuando desencolas un operador, miras cuantos elementos usa ese operador (+ - * / usan 2 operadores, not, abs, sen, cos, tan, usan solo 1) y vas desencolando hasta x elementos y aplicando el operador entre ellos. Asi de facil. Ten cuidado con los parentesis, tienes que mover los operadores que afectan al parentesis hasta donde este el fin del bloque.

Suerte!