el Guille, la Web del Visual Basic, C#, .NET y más...
Ir a la sección de Visual Studio 2005 Utilidades .NET 2.0

Evaluar expresiones aritméticas

EvaluarExpresiones: Librería (DLL) con funciones para evaluar expresiones aritméticas, también incluye EvaluarFunciones, para evaluar expresiones que incluyen funciones predefinidas

 
Publicado el 04/Oct/2007
Actualizado el 17/Oct/2007
Autor: Guillermo 'guille' Som
26/Ago/2020: Ver la última actualización: Cálculos aritméticos en tu código con EvaluarExpresiones

Evaluar expresiones aritméticas. Librería (DLL) escrita en Visual Basic 2005 con funciones para evaluar expresiones aritméticas que pueden contener algunas de las funciones predefiidas.



 

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.

 

Si me quieres ayudar a mejorar la DLL lee esto

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:

  1. El proyecto de tipo consola lo abres con Visual Studio 2005 (o con la versión Express del lenguaje elegido).
  2. 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
  3. Eso hará que se muestre el valor calculado por el compilador y el calculado por la clase.
  4. 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.
  5. 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).
  6. 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...  guiño

 

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

 

 


Código de ejemplo (comprimido):

Fichero con el código de ejemplo: test_EvaluarExpresiones_01.zip - 95.9 KB

Incluye la DLL compilada (v1.0.0.39 del 13/Oct/2007) y tres proyectos para probar la librería.

(MD5 checksum: 62A8A6EFB8B8C81D4BCC73F82BFB4D55)

 

En realidad, si te bajas la DLL y la copias en el directorio del ejecutable, es suficiente.
Por eso es posible que la versión de la DLL de arriba sea más antigua que la de abajo que es la que actualizo.

 

Solo la DLL elGuille.EvaluarExpresiones.dll: EvaluarExpresiones_dll.zip - 26.50 KB - v1.0.0.42 del 17/Oct/07

Este fichero contiene solo la DLL que puedes copiar en el directorio del ejecutable que la utilice.

También incluye el fichero de la documentación XML y un "parseador" para que se muestre de forma legible esa documentación (o casi), que puedes usar en tus propios ficheros de documentación XML: documentacionXML.xls.

(MD5 checksum: 755A06E2234397A3D1F381AE0210220F)

Nota:
Si quieres el código fuente de la DLL me lo pides por correo... a la misma cuenta que indiqué más arriba, pero con el asunto: Quiero el código de elGuille.EvaluarExpresiones.dll

(Si me la pides después del 1 de Noviembre de 2007, por favor acuérdate de poner un link a esta página.)

Y si en realidad te interesa, pues... me dices porqué no has participado en las pruebas que he pedido mientras la estaba desarrollando... por curiosidad más que nada...

(Pedro Aguirre y Joaquín Delgado no tienen que justificarse, aunque ellos ya lo tendrán, je, je)


Nota del 17/Oct/07:
Si eres de los que han colaborado con al menos 5 Euros usando PayPal, podrás bajar el código fuente de la DLL usando este link:
Código fuente de EvaluarExpresiones para los que han colaborado con PayPal.


 


La fecha/hora en el servidor es: 22/11/2024 23:15:05

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024