Introducción:
Esta librería (elGuille.EvaluarExpresiones.dll) sirve para evaluar una
expresión aritmética y
devolver el valor como una cadena.
Ahora mismo está en fase de desarrollo y por eso no te muestro el código,
solo está el ensamblado
compilado.
El publicarlo es para pedirte que compruebes si los cálculos los hace bien.
Por favor, lee esto que hay más abajo y a ver si me puedes ayudar a mejorar
el código para que
funcione correctamente.
Nota del 13/Oct:
Me gustaría que también comprobaras la clase EvaluarFunciones, que es
como la otra, pero que
permite usar funciones predefinidas. En la aplicación de Windows tienes una
opción en el menú para
mostrar las funciones soportadas (cosa que siempre puedes mostrar por medio del
método compartido
FuncionesSoportadas).
Como es de suponer, en la aplicación de Windows.Forms se usa el método
Evaluar de la clase
EvaluarFunciones, sin embargo en las dos aplicaciones de consola he dejado
la llamada al método
Evaluar de la clase EvaluarExpresiones, así que si quieres
comprobar expresiones que
tengan funciones, debes cambiar el nombre de la clase en la que se define el
método a usar.
Gracias.
Abajo tienes el ZIP con tres proyectos y la DLL compilada:
Un proyecto del tipo aplicación de Windows que sirve para evaluar las
expresiones que indiques y
para que te resulte fácil poder guardar las expresiones que no produzcan el
resultado esperado.
En ese caso, podrás guardar la expresión que has comprobado, junto con el
resultado correcto, con
idea de que me puedas mandar el fichero con todas esas expresiones que has
encontrado que no
producen el resultado esperado, y así poder yo evaluar si se puede arreglar el
código de la DLL.
Dos proyectos de tipo Consola, uno para Visual Basic 2005 y el otro para
Visual C# 2005.
Estos proyectos (utiliza el del lenguaje con el que te encuentres más cómodo) se
usarán para evaluar
manualmente las expresiones.
Te explico la idea:
- El proyecto de tipo consola lo abres con Visual Studio 2005 (o con la
versión Express del
lenguaje elegido).
- Escribes la expresión a evaluar de forma que:
- En el método comprobar (que es el que se llama
desde Main)
- Asignes a la variable texto la expresión a evaluar
(debe estar entre
comillas dobles)
- Asignes a la variable dRes la expresión a evaluar
(no uses las comillas
dobles)
- Haces una llamada al método calcula (que está
definido en el módulo o
la clase del proyecto de consola), pasándolo como argumentos las dos
variables anteriores.
- Pulsas F5 para ejecutar la aplicación
- Eso hará que se muestre el valor calculado por el compilador y el
calculado por la clase.
- Si el valor no coincide mostrará <-- junto a la primera
cantidad (que es la
calculada por el compilador)
- Debes tener en cuenta que algunos cálculos puede mostrar esa marca,
pero puede que la
diferencia esté en el redondeo, en ese caso, se puede considerar que son
iguales
- Por ejemplo, si usas esta expresión:
- 2.5*2+3*12.22
- Te mostrará el signo ese, pero los valores son iguales.
- En otros casos, a lo mejor te muestra dos valores al estilo de esto:
- 28988,6771330191
- 28988.67713301905
- En estos casos, se pueden considerar que son iguales, ya que la
diferencia es la
precisión de los decimales.
- En ese caso, lo puedes usar para guardarlo en el fichero que cree la
aplicación de Windows,
la cual la puedes ejecutar directamente (sin abrirla en el IDE, con idea de
que te resulte más
fácil pasar de una aplicación a otra, ya que si también está en el IDE solo
puedes ejecutar o la
de Windows o la de Consola).
- Cuando tengas alguna expresión que esté mal, (pero no por que falle en
la precisión de unos
pocos decimales), me la mandas (al correo que te indico más abajo) usando el
fichero que genera
la aplicación de Windows, ya que en ese fichero está la expresión a evaluar
y el resultado que a
ti te ha dado.
- Por favor, si lo vas a mandar, hazlo con el fichero ese, es que así
me organizo mejor y
no tengo que ir copiando del mensaje de correo y tener que evaluarlo
todo... gracias.
- También te pediría que me mandaras cada expresión errónea que vayas
encontrando, con
idea de que así mejore cuanto antes la clase.
Si tienes que mandarme el fichero con las expresiones erróneas, me escribes
a:
mensaje EN mundoprogramacion.com con el asunto:
Ayudando con EvaluarExpresiones.
Ya sabes que debes cambiar EN por el signo de la arroba @.
Un favor sobre el correo:
Por favor, no uses esa cuenta para otra cosa que no sea para esto que pido, si
no, pues me sentará
mal que te quieras aprovechar, si quieres mandarme un mensaje con cualquier otra
cosa, por favor usa
el link que está en la página principal.
Gracias.
Si haces un montón de pruebas y todas te funcionan, por favor, mándame
también el fichero que se
genera (puedes guardar tanto el de los fallos como los que vas comprobando) y si
están mezcladas las
correctas y las incorrectas, no te preocupes... no pasa nada, pero así sabré que
funciona todo bien.
Nota:
Si vas a usar otro nombre para guardar el contenido del ListView, procura dejar
el mismo nombre
mostrado, pero añadiéndole unos números al final, ya que ese nombre se comprueba
para cuando se
quiere añadir con arrastrar y soltar (ver siguiente nota).
Nota:
En la aplicación de Windows, puedes arrastrar y soltar cualquiera de los dos
ficheros que se guardan
con las expresiones y los resultados, (tanto los correctos como los erróneos),
al soltarlo en el
formulario, se añadirán a lo que ya haya en la lista, de forma que puedas tener
tanto las erróneas
como las correctas, (para el caso que hagas pruebas entre varias sesiones de la
aplicación y quieras
tener todos los resultados juntos).
Si recibo algunas pruebas antes del día 15, publicaré el código de la DLL, si
no recibo nada es
que no hay interés, por tanto... pues ¿qué más da?
Nota del 15/Oct/07:
He publicado el código fuente de la librería... ¿dónde? tendrás que descubrirlo
y solo lo harás si
te gusta programar o te gusta programar por programar... ¿dónde
estará?
Pista: NO está dentro de este sitio ni en el sitio de downloads... La pista está
en el párrafo
anterior.
Espero que sí me mandéis algo...
Gracias por adelantado.
Nos vemos.
Guillermo
Revisión 1.0.0.1 06/Oct/07:
Creo que ya evalúa bien los números negativos.
Gracias a Joaquín Delgado por mandarme las expresiones que fallaban.
Revisión 1.0.0.2 08/Oct/07:
Nuevas pruebas comprobadas que han aportado Pedro Aguirre y Joaquín Delgado.
Por ahora todas las pruebas funcionan...
He incluido en los proyectos de consola varias expresiones que me dan resultados
diferentes con
pequeñas diferencias en algunas de las cifras decimales.
Revisión 1.0.0.5~6 09/Oct/07:
Ya está todo solucionado y funcionando.
El "salto" en el número de revisión es porque también evalúa funciones
predefinidas (en realidad en
otra clase).
Aquí te dejo la DLL con esta clase y la de evaluar con funciones.
Revisión 1.0.0.39 13/Oct/07:
Creo que ya está todo operativo y funcionando bien.
Esta versión evalúa correctamente las expresiones simples y las que incluyen
algunas de las
funciones predefinidas (usando la clase EvaluarFunciones), aunque en los
argumentos de las funciones
es posible que no se evalúe bien algunas expresiones, por ejemplo si llevan
paréntesis o tienen
números negativos.
Revisión 1.0.0.42 17/Oct/07:
Nuevas funciones, dos de ellas gracias a Joaquín Delgado.
Si quieres ver esas novedades, tendrás que hacerlo solo si te gusta programar
por programar.
Aquí tienes un ejemplo de cómo usar el método comprobar (con
Visual Basic):
Sub comprobar()
texto = "10+25*2.5 + 3*12 * (5+17)"
dRes = 10 + 25 * 2.5 + 3 * 12 * (5 + 17)
calcula(texto, dRes)
texto = "(10+25)*2.5 + 3*12 * (5+17)"
dRes = (10 + 25) * 2.5 + 3 * 12 * (5 + 17)
calcula(texto, dRes)
texto = "(10+ 25) * (2.5 + 3) * 12 * (5+17)"
dRes = (10 + 25) * (2.5 + 3) * 12 * (5 + 17)
calcula(texto, dRes)
texto = "(10+ 25) * (2.5 + 3) * (12 * 5) + 17"
dRes = (10 + 25) * (2.5 + 3) * (12 * 5) + 17
calcula(texto, dRes)
End Sub