none
en # leer una formula xml RRS feed

  • Pregunta

  • esta es mi duda, lo que pasa es que quiero parametrisar las variables de una formula o de un calculo que hago c# para esto creo un xml donde pongo los atributos, ejemplo

    int lado1, lado2, respuesta;

    {

           respuesta = lado1 * lado2;

    }

    en el XML DICE

    <lado1 id = "1" medida = "20 </lado1>

    <lado2 id = "2" medida = 20 </lado2>

    entonces paso esos atributos al programa de c# y ya no necesito entrar a programar para cambiar los valores con el solo hecho de cambiar el xml cambio todos los valores, eso se que sis e puede, pero lo que quiero saber si se puede es guardar la funcion en xml

    ejemplo

    <formula id = "1" formulass = "respuesta = lado1 + ladoB"></formula>

    para asy pasar la formula y cambiar o que tiene que hacer el programa sin entrar a modificar lineas de cogigo es eso posible, si no lo es diganme alguna alternavia a esto

    lunes, 26 de septiembre de 2011 19:43

Respuestas

  • bien el tema del xml no habri problemas esto si puee hacerlo solo cuestion de crear el nodo formulay los atributos  id y formulas, eso se peude sin problemas

    la cuestion pasa por ejecutar la operacion de la formula

    o sea evaluar dinamicamente lado1 + ladoB

    quizas debasusar algun framework que permita esta evaluacion

    quizas algo como esto

    Math.NET Project

    Math.NET Numerics

    CodeProject: Parsing Mathematical Expressions with muParser

    .NET Math Expression Parser  


    CodeProject: Converting math equations to C#

    para evaluar el string en una formula

    igual habria que ver como esto seria usado para tomar propiedades o variables

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 19:53
  • Como alternativa, qué te parece esto:
     
    1.- defines en tu XML un esquema para almacenar fórmulas.
    2.- creas una fórmula para cada tipo de operación que quieras realizar. Piensa que las operaciones son binarias, por lo que necesitas crearte un árbol con las expresiones.
    3.- cada fórmula tendrá los parámetros a usar, los cuales pueden ser valores planos o fórmulas anidadas.
    4.- en tu programa vas leyendo el XML y creando el árbol de operaciones, sustituyendo valores planos y las fórmulas anidadas (es decir, vas “expandiendo” las operaciones).
     
    Por ejemplo, tu suma puede representarse así:
     
    <operaciones>
      <operacion tipo="suma">
        <operando>20</operando>
        <operando>22</operando>
      </operacion>
    </operaciones>
    

     
    Tienes una operación sencilla donde tus dos operandos son valores planos. Sabes que la operación tipo suma tiene dos, y sabes que tienes que aplicar la adición. Es fácil llegar al resultado: 42.
     
    Ahora, supongamos que queremos algo más complejo: (5 * 6) + 12. En este caso, Tienes una operación tipo suma, cuyo primer operando es una operación tipo producto, y el segundo operando es un valor plano. Tu XML:
     
    <operaciones>
      <operacion tipo="suma">
        <operando>
          <operacion tipo="producto">
            <operando>5</operando>
            <operando>6</operando>
          </operacion>
        </operando>
        <operando>12</operando>
    </operanciones>
    

     
    Y así sucesivamente, puedes crear fórmulas tan complicadas como quieras. Posteriormente, tu programa tiene que leer este XML y conforme lo va haciendo tiene que construir un árbol en torno a las operaciones. El XML anterior quedaría así:
     
    - suma
        - producto
            - 5
            - 6
        - 12
     
    Que por cierto, si tuvieras que implementar tu función desde una cadena de texto, como propones, tendrías que construir este árbol de todas formas, sólo que mediante un analizador sintáctico. Como te lo propongo, el XML ya tendría construido el árbol y te evitas usar dicho analizador.
     
    Una vez que tienes el árbol armado, lo recorres desde los nodos más bajos. Cada que te encuentras con un nodo compuesto (operación = suma, operación = producto, más todas las operaciones que necesites) lo expandes hasta que sólo tengas puros nodos con valores planos. Cuando llegas al nodo raíz y lo expandes, ése será tu resultado.
     
    No es fácil lo que quieres hacer, de hecho es un tema de lenguajes y compiladores. Pero creo que es un ejercicio interesante y pienso que el método del XML para describir fórmulas puede ahorrarte mucho trabajo.
     
    ¡Saludos!
     
     


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos

    lunes, 26 de septiembre de 2011 20:26
  • Bueno, más bien tienes que programar el que haga la suma. Es decir, cuando recorres el árbol y te topas con operación tipo suma, ya sabes que debes usar una suma. Es cuestión de ir poniendo un if para cada tipo de operación que definas (suma y producto en mi ejemplo, pero puedes extenderte hacia otras operaciones como el factorial -que sería una operación unitaria, con solo un operando-, etc. ).
     
    Por cierto, revisa este artículo sobre expresiones en C#. Puede ayudarte a crear el árbol.
     
    Un artículo sobre cómo evaluar expresiones genéricas.
     
    Por último, checa este código. Es un parser bastante completo, quizás puedas usarlo para no comenzar de cero.
     
    Saludos.


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos
    lunes, 26 de septiembre de 2011 20:47
  • pero sino entendi mal el problema no es definir

    <operaciones>
    <operacion tipo=”suma”>
    <operando>Propiedad1</operando>
    <operando>Propiedad2</operando>
    </operacion>
    </operaciones>
    o sea el tema es que no pones un valor, sino una propiedad que apunta a una instancia de un objeto donde se ejecuta la expression
    si fuera solo valores simples es facil, porque cualqueir evaluador matemetico lo resuelve, el tema es el dinamismo al indicar de dodne debe tomar los valores
    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 20:53
  • el problema es que yo no soy tan bueno como uds jejejejeje

    lo que se busca es esto, vamos a suponer que hay una formula definida en codigo c# que me da el resultado que quiero, pero al cabo de una semana por asy decirlo, me piden que de otro resultado, entonces yo no quiero entrar a visual estudio volver a escribir codigo cambiar la formula y todo eso, por eso yo quiero dejar la formula escrita en un xml, para poderla modificar sin entrar l visual studio o al c#, lo del arbol que me dijiste pues creo que si entendi debo crear un arbol que haga la que quiero y en el c# pues hacer muchos if

    if (nodoXML = suma) entonces sumar, asy todos los posibles combinaciones matematicas que hayga, pero pues me estoy documentando como hacerlo, pero me voy a tardar ya que nunca lo he hecho, si me pudieran poner un ejemplo no solo del xml que ya me pusiste sino como seria el codigo c# pues me ahorrarias como un dia de trabajo jejejejeje

    lunes, 26 de septiembre de 2011 21:25
  • Mira éste:
     
    e incluso te evitas los XMLs, ya que viene con su analizador sintáctico...
     
    ¡Saludos!


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos
    lunes, 26 de septiembre de 2011 21:30

Todas las respuestas

  • bien el tema del xml no habri problemas esto si puee hacerlo solo cuestion de crear el nodo formulay los atributos  id y formulas, eso se peude sin problemas

    la cuestion pasa por ejecutar la operacion de la formula

    o sea evaluar dinamicamente lado1 + ladoB

    quizas debasusar algun framework que permita esta evaluacion

    quizas algo como esto

    Math.NET Project

    Math.NET Numerics

    CodeProject: Parsing Mathematical Expressions with muParser

    .NET Math Expression Parser  


    CodeProject: Converting math equations to C#

    para evaluar el string en una formula

    igual habria que ver como esto seria usado para tomar propiedades o variables

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 19:53
  • exactamente lo explicaste mejor que yo jejejeje hay que convertir ese string en una formula pra que el c# la entienda pues empesare a leer sobre esas bibliotecas que me pusiste, entonces creo que me dijiste que si es posible
    lunes, 26 de septiembre de 2011 20:03
  • entonces creo que me dijiste que si es posible

    lo del xml te lo confirmo si se puede, solo es cuestiond e armar la estructura y listo

     

    lo del las formulas hay un gris que depende de como la libreria que parsea la formula evalue variable y propiedades

    quizas debas agregar algo de codigo para pasar parametros a las formulas antes de ser evaluadas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 20:15
  • Como alternativa, qué te parece esto:
     
    1.- defines en tu XML un esquema para almacenar fórmulas.
    2.- creas una fórmula para cada tipo de operación que quieras realizar. Piensa que las operaciones son binarias, por lo que necesitas crearte un árbol con las expresiones.
    3.- cada fórmula tendrá los parámetros a usar, los cuales pueden ser valores planos o fórmulas anidadas.
    4.- en tu programa vas leyendo el XML y creando el árbol de operaciones, sustituyendo valores planos y las fórmulas anidadas (es decir, vas “expandiendo” las operaciones).
     
    Por ejemplo, tu suma puede representarse así:
     
    <operaciones>
      <operacion tipo="suma">
        <operando>20</operando>
        <operando>22</operando>
      </operacion>
    </operaciones>
    

     
    Tienes una operación sencilla donde tus dos operandos son valores planos. Sabes que la operación tipo suma tiene dos, y sabes que tienes que aplicar la adición. Es fácil llegar al resultado: 42.
     
    Ahora, supongamos que queremos algo más complejo: (5 * 6) + 12. En este caso, Tienes una operación tipo suma, cuyo primer operando es una operación tipo producto, y el segundo operando es un valor plano. Tu XML:
     
    <operaciones>
      <operacion tipo="suma">
        <operando>
          <operacion tipo="producto">
            <operando>5</operando>
            <operando>6</operando>
          </operacion>
        </operando>
        <operando>12</operando>
    </operanciones>
    

     
    Y así sucesivamente, puedes crear fórmulas tan complicadas como quieras. Posteriormente, tu programa tiene que leer este XML y conforme lo va haciendo tiene que construir un árbol en torno a las operaciones. El XML anterior quedaría así:
     
    - suma
        - producto
            - 5
            - 6
        - 12
     
    Que por cierto, si tuvieras que implementar tu función desde una cadena de texto, como propones, tendrías que construir este árbol de todas formas, sólo que mediante un analizador sintáctico. Como te lo propongo, el XML ya tendría construido el árbol y te evitas usar dicho analizador.
     
    Una vez que tienes el árbol armado, lo recorres desde los nodos más bajos. Cada que te encuentras con un nodo compuesto (operación = suma, operación = producto, más todas las operaciones que necesites) lo expandes hasta que sólo tengas puros nodos con valores planos. Cuando llegas al nodo raíz y lo expandes, ése será tu resultado.
     
    No es fácil lo que quieres hacer, de hecho es un tema de lenguajes y compiladores. Pero creo que es un ejercicio interesante y pienso que el método del XML para describir fórmulas puede ahorrarte mucho trabajo.
     
    ¡Saludos!
     
     


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos

    lunes, 26 de septiembre de 2011 20:26
  • me agragda mucho lo que me dices de contruir el arbol, pero me quedo una duda de lo que me propones por ejemplo el primer ejemplo que tu me pusiste

    <operaciones>
    <operacion tipo=”suma”>
    <operando>20</operando>
    <operando>22</operando>
    </operacion>
    </operaciones>
    hay estoy describiendo una suma, con dos operandos, se dan los valores de los dos operando, y se espera un resulado, pero como saco el resultado, osea el xml hace la suma??? o en vace del string suma ya sabra el c# que debe sumar, es que si entendi como se describen todas las operaciones, en el xml, pero quien las hace y que tengo que hacer para que se hagan, si pudieras poner un ejemplo sencillo, una suma solamente gracias
    lunes, 26 de septiembre de 2011 20:39
  • Bueno, más bien tienes que programar el que haga la suma. Es decir, cuando recorres el árbol y te topas con operación tipo suma, ya sabes que debes usar una suma. Es cuestión de ir poniendo un if para cada tipo de operación que definas (suma y producto en mi ejemplo, pero puedes extenderte hacia otras operaciones como el factorial -que sería una operación unitaria, con solo un operando-, etc. ).
     
    Por cierto, revisa este artículo sobre expresiones en C#. Puede ayudarte a crear el árbol.
     
    Un artículo sobre cómo evaluar expresiones genéricas.
     
    Por último, checa este código. Es un parser bastante completo, quizás puedas usarlo para no comenzar de cero.
     
    Saludos.


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos
    lunes, 26 de septiembre de 2011 20:47
  • pero sino entendi mal el problema no es definir

    <operaciones>
    <operacion tipo=”suma”>
    <operando>Propiedad1</operando>
    <operando>Propiedad2</operando>
    </operacion>
    </operaciones>
    o sea el tema es que no pones un valor, sino una propiedad que apunta a una instancia de un objeto donde se ejecuta la expression
    si fuera solo valores simples es facil, porque cualqueir evaluador matemetico lo resuelve, el tema es el dinamismo al indicar de dodne debe tomar los valores
    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 20:53
  • Hola,
     
    El tema importante, creo yo, sigue siendo construir el árbol de expresiones.
    Es decir, 1) crear un analizador sintáctico para construir dicho árbol y 2)
    recorrer el árbol expandiendo los valores. En su ejemplo el OP escribe:
     
    <lado1 id = "1" medida = "20" ></lado1>
    <lado2 id = "2" medida = "20"></lado2>
    

     
    y después:
     
    <formula id = "1" formulass = "respuesta = lado1 + ladoB"></formula>
    
     
    No habla de propiedades (al menos no en el sentido de propiedades de
    objetos). Habla de valores y fórmulas declaradas previamente en el XML (al menos eso entiendo yo de su texto; sería bueno que nos lo aclarase... :-). En
    cuyo caso, el OP puede crearse un idioma para referenciar fórmulas previas,
    siguiendo la estructura propuesta.
     
    <operaciones>
    <operacion id="99901" tipo=”suma”>
    <operando>12</operando>
    <operando>20</operando>
    </operacion>
    <operacion tipo="producto">
    <operando ref="99901" />
    <operando>5</operando>
    </operaciones>
    

     
    Cuando recorra el árbol basta remplazar las referencias encontradas por el
    valor expandido correspondiente. Pero el enfoque sigue siendo el mismo, creo
    yo: crear un árbol de expresiones y analizarlo.
     
    Ahora, sobre si se implementa a mano o utiliza alguna biblioteca existente,
    le tocará decidir al OP. De hecho le pasé algunos enlaces adicionales que
    pueden servirle, no tiene caso que reinvente la rueda (más que como
    ejercicio). Pero mi punto es que en mi opinión, el OP debe cambiar un
    poquitín el enfoque sobre cómo estructurar el XML. Mis dos centavos, al
    menos...
     
    ¡Saludos!
     
     


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos

    lunes, 26 de septiembre de 2011 21:11
  • el problema es que yo no soy tan bueno como uds jejejejeje

    lo que se busca es esto, vamos a suponer que hay una formula definida en codigo c# que me da el resultado que quiero, pero al cabo de una semana por asy decirlo, me piden que de otro resultado, entonces yo no quiero entrar a visual estudio volver a escribir codigo cambiar la formula y todo eso, por eso yo quiero dejar la formula escrita en un xml, para poderla modificar sin entrar l visual studio o al c#, lo del arbol que me dijiste pues creo que si entendi debo crear un arbol que haga la que quiero y en el c# pues hacer muchos if

    if (nodoXML = suma) entonces sumar, asy todos los posibles combinaciones matematicas que hayga, pero pues me estoy documentando como hacerlo, pero me voy a tardar ya que nunca lo he hecho, si me pudieran poner un ejemplo no solo del xml que ya me pusiste sino como seria el codigo c# pues me ahorrarias como un dia de trabajo jejejejeje

    lunes, 26 de septiembre de 2011 21:25
  • Mira éste:
     
    e incluso te evitas los XMLs, ya que viene con su analizador sintáctico...
     
    ¡Saludos!


    Fernando A. Gómez F.
    fermasmas.wordpress.com
    Galería de ejemplos
    lunes, 26 de septiembre de 2011 21:30
  • ese programa es muy bueno me servira de mucho para lo que yo quiero hacer, aunque no hace exactamente lo que yo quiero, por que yo sigo ocupando dos parametros que se me pasan por medio de un metodo es que mira deja lo pongo todo
       public int ObtenerDiasEmpleados(int Años, int Meses)
            {
                int años = Años;
                int meses = Meses;
                int diasDerecho = 10;
                int periodosVacacionales = 0;
                int diasGanados = 0;
                bool caducidad = true;
                int x;
                int y;
    
                if (caducidad == true)
                {
                    periodosVacacionales = ((x = (años * 2)) + (y = (meses / 6)));
                    if (periodosVacacionales > 2)
                    {
                        diasGanados = 20;
                    }
                    else
                    {
                        diasGanados = periodosVacacionales * diasDerecho; ;
                    }
                }
                else
                {
                    periodosVacacionales = ((x = (años * 2)) + (y = (meses / 6)));
                    diasGanados = periodosVacacionales * diasDerecho;
                }
    
                return diasGanados;
            }
    .
    


    como ve me pide meses y años como parametros, yo lo que queria era una pasar los parametros fijos a un xml como diasDerecho que es igual 10 pues que ese numero se pueda cambiar desde el xml, y asy las variables poderlas cambiar, y despues leerlas para iniciarlizarlas al, si ven la formula por ej periodosVacacionale = periodosVacacionales = ((x = (años * 2)) + (y = (meses / 6)));

    yo lo que quiero es poder cambiar la formula desde el xml pero dejar los nombres años y meses, como parametros y los otros valores que puedan ser configurados del un xml no se si me di a entender, pero yo me sigo documento

    lunes, 26 de septiembre de 2011 22:48