<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
¡¡¡¡¡¡ Madre de Dios !!!!!!, ¡¡¡ QUE CHAMBOTA !!!,  estaba haciendo un programa que grafica funciones, imagina lo que va a ser meterle, seno coseno, tangente hiperbólica, potenciación y demas yerbas.  Queria saber si había un camino fácil, pero veo que no.   Bueno..., entre mas pronto comience, mas rápido terminare.<BR>
 <BR>
Gracias como siempre, por tu amabilidad.<BR>
 <BR>
Rodolfo<BR><BR>> Date: Tue, 15 Jul 2008 11:20:14 +0200<BR>> To: cconclase@listas.conclase.net<BR>> From: programante@gmail.com<BR>> Subject: Re: [C con Clase] interprete de expresiones matematicas<BR>> <BR>> rodolfo rosso paz escribió:<BR>> > Hola a todos nuevamente, de nuevo por aqui molestando:<BR>> > <BR>> > queria saber si hay una forma de evaluar una expresion matamatica <BR>> > contenida en una cadena y obtener el resultado :<BR>> > <BR>> > <BR>> > Ejemplo.<BR>> > <BR>> > int x = 3<BR>> > var = "x + 5"<BR>> > int resultado = evaluar(var)<BR>> > <BR>> > y que resultado contenga 8. me dicen que en java hay una funcion <BR>> > EVAL() y yo recuerdo que en clipper tambien habia lo que se le llamaba <BR>> > macros y solo era necesario colocar & delante de var, y con eso <BR>> > obtenia el resultado de la formula contenida en la cadena.<BR>> > <BR>> > ¿hay forma de hacerlo en c++?<BR>> > <BR>> > <BR>> > Gracias de antemano<BR>> > <BR>> > Rodolfo<BR>> <BR>> En C++ no hay una función eval(), como es el caso de javascript (en java <BR>> tampoco se puede), ya que C es un lenguaje compilado, tu programa tiene <BR>> instrucciones en código máquina, no el compilador, que es quien sabe <BR>> hacer la suma. Por lo tanto, para que eso te funcione tienes que crear a <BR>> mano la lógica de evaluar.<BR>> Si sabes que sólo va a haber sumas, te basta separar por el símbolo + y <BR>> sumar los símbolos. Tampoco es lo mismo si te vale ejecutar las <BR>> operaciones en orden que si te interesa que * y / tengan prioridad, que <BR>> haya paréntesis... En esos casos te convendría generar una pila y <BR>> recorrer en preorden las operaciones inorden que le pasas.<BR>> <BR>> <BR>> #include <stdio.h><BR>> <BR>> int x;<BR>> enum Operaciones { Suma='+', Resta='-' };<BR>> int HazOperacion(int Valor1, int Valor2, enum Operaciones Op) {<BR>> switch (Op) {<BR>> case Suma:<BR>> return Valor1 + Valor2;<BR>> case Resta:<BR>> return Valor1 - Valor2;<BR>> }<BR>> }<BR>> int Evaluar(const char* Cadena) {<BR>> enum Operaciones Operacion = Suma; //Qué operación estamos haciendo<BR>> int Resultado = 0; //El resultado parcial<BR>> int Valor = 0; //Operando<BR>> int i; //Para iterar por cadena<BR>> for (i=0; Cadena[i]; i++) {<BR>> switch (Cadena[i]) {<BR>> case ' ': break;<BR>> case '0'...'9':<BR>> Valor = Valor*10 + (Cadena[i] - '0');<BR>> break;<BR>> case 'x':<BR>> Valor = Valor*10 + x;<BR>> break;<BR>> case '+':<BR>> case '-':<BR>> Resultado = HazOperacion(Resultado, Valor, Operacion);<BR>> Valor = 0;<BR>> Operacion = Cadena[i];<BR>> break;<BR>> default:<BR>> fprintf(stderr, "Caracter desconocido %c\n", Cadena[i]);<BR>> }<BR>> }<BR>> return HazOperacion(Resultado, Valor, Operacion); //Si nos queda <BR>> pendiente alguna operación hacerla<BR>> }<BR>> <BR>> int main() {<BR>> const char* var = "x + 5";<BR>> x = 3;<BR>> <BR>> printf("%s = %d\n", var, Evaluar(var));<BR>> return 0;<BR>> }<BR>> <BR>> Este código suma y resta números, así como la variable x. Para la <BR>> mayoría de las operaciones normales, funciona, pero en otras puede no <BR>> dar lo esperado. Por ejempo tratará "2x + 5" como 28 en vez de 11. <BR>> También juago con el elemento nulo de la suma y la resta, por lo que <BR>> pasar a multiplicar se complica, pero es un buen código de partida para <BR>> estudiar la máquina de estados y cómo ir parseandolas operaciones.<BR>> <BR>> <BR>> <BR>> _______________________________________________<BR>> Lista de correo Cconclase Cconclase@listas.conclase.net<BR>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net<BR>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ<BR><BR><br /><hr />Discover the new Windows Vista <a href='http://search.msn.com/results.aspx?q=windows+vista&mkt=en-US&form=QBRE' target='_new'>Learn more!</a></body>
</html>