Nos gustaría tener fórmulas definidas por el usuario en nuestro programa C++. p. El valor v = x + (y - (z - 2))/2. Más adelante en el programa, el usuario definiría x, y y z -> el programa debería devolver el resultado del cálculo.
Algunas veces, la fórmula puede cambiarse, por lo que la próxima vez el programa debería analizar la fórmula y agregar los nuevos valores.
¿Alguna idea/sugerencia de cómo hacer algo como esto?
Hasta ahora llegué a la solución de escribir un analizador para calcular estas fórmulas, ¿alguna idea al respecto?cálculo de fórmulas definidas por el usuario (con C++)
Respuesta
Si se usará con frecuencia y se extenderá en el futuro, casi recomiendo agregar python o LUA a su código. LUA es un lenguaje de scripting muy ligero que puede conectar y proporcionar nuevas funciones, operadores, etc. Si desea hacer cosas más robustas y complicadas, use Python en su lugar.
El uso de Spirit (por ejemplo) para analizar (y las "acciones semánticas" que proporciona para construir un árbol de expresiones que luego puede manipular, por ejemplo, evaluar) parece una solución bastante simple. Puede encontrar una gramática para las expresiones aritméticas there, por ejemplo, si es necesario ... (es bastante sencillo crear la suya propia).
Nota: Spirit es muy fácil de aprender, y bastante adecuado para esas tareas.
lo general hay dos maneras de hacerlo, con tres posibles implementaciones:
- como que ha tocado en sí mismo, una biblioteca que evalúe fórmulas
- compilación de la fórmula en código
La segunda opción aquí se hace generalmente compilando algo que se puede cargar como un tipo de complemento, o se puede compilar en un programa separado que luego se invoca y produce la salida necesaria.
Para C++ Supongo que una biblioteca para evaluación probablemente existiría en alguna parte, así que ahí es donde comenzaría.
Si desea escribir su propia, la búsqueda de "autómatas formales" y/o "finito máquina de gramática estado"
En general lo que va a hacer es analizar la cadena, empujando a los personajes en una pila a medida que avanza . A continuación, comience a mostrar los caracteres y realice tareas según lo que se haya reventado. Es más fácil codificar si fuerza las ecuaciones a la notación de pulido inverso.
Puede representar su fórmula como un árbol de operaciones y subexpresiones. Es posible que desee definir tipos o constantes para Tipos de operación y Variables.
A continuación, puede fácilmente bastante escribir un método que recursivamente a través del árbol, la aplicación de las operaciones correspondientes a los valores que se pasa en.
Para hacer la vida más fácil, creo que conseguir este tipo de entrada se realiza mejor a través una GUI donde los usuarios están restringidos en lo que pueden escribir.
Si planea hacerlo desde la línea de comando (esa es la impresión que obtengo de su publicación), entonces probablemente deba definir un conjunto estricto de entradas permitidas (por ejemplo, solo variables de una sola letra, sin espacio en blanco, y solo ciertos símbolos matemáticos:() + - */etc.).
A continuación, tendrá que:
Leer en la matriz de caracteres de entrada
analizarlo con el fin de crear una lista de variables y acciones
Llevar a cabo estas acciones - en BOMDAS fin
La construcción de su propio analizador para este debería ser una operación recta de avance:
) convertir la ecuación de infija a la notación de sufijo (una asignación típica CompSci) (que haría uso de una pila) ) esperar a llegar los valores que desee ) pop la pila de artículos infijos, dejando caer el valor de la variable en donde sea necesario ) Mostrar resultados
Con ANTLR puede crear un analizador/compilador que va a interpretar la entrada del usuario, a continuación, ejecutar los cálculos usando el patrón del visitante. A good example is here, pero está en C#. Debería poder adaptarlo rápidamente a sus necesidades y seguir usando C++ como su plataforma de desarrollo.
- 1. Fórmulas en funciones definidas por el usuario en R
- 2. Conversiones definidas por el usuario en C++
- 3. Depuración PostgreSQL Funciones definidas por el usuario
- 4. Cómo escribir excepciones definidas por el usuario en C#?
- 5. Subconsulta de MySQL con variables definidas por el usuario
- 6. Estructuras definidas por el usuario con una función MATLAB mex
- 7. Creando conversiones definidas por el usuario
- 8. Funciones definidas por el usuario de SQLITE en Lisp
- 9. Crear/Usar funciones definidas por el usuario en System.Data.SQLite?
- 10. Lista de funciones globales definidas por el usuario en JavaScript?
- 11. Analizar y ejecutar fórmulas con C#
- 12. Error al manejar funciones definidas por el usuario
- 13. dónde poner las clases definidas por el usuario en Rails
- 14. ¿Cómo sobrecargar las funciones definidas por el usuario en Matlab?
- 15. Clasificación mediante comparador- Orden descendente (clases definidas por el usuario)
- 16. Funciones agregadas definidas por el usuario en Oracle PIVOT cláusula
- 17. Las funciones agregadas más útiles definidas por el usuario
- 18. Funciones en línea definidas por el usuario OpenCL
- 19. Cómo conectar las funciones de bash definidas por el usuario con la tubería
- 20. Cálculo del tiempo por el código C++
- 21. Funciones agregadas definidas por el usuario con columnas de entrada múltiples en PostgreSQL
- 22. perl6: ¿necesito el @ -sigil para las variables definidas por el usuario?
- 23. Pregunta simple sobre el uso de funciones externas() y definidas por el usuario?
- 24. llamar a funciones definidas por el usuario con la opción Crear Tabla
- 25. ¿Cómo obligo a Mathematica a incluir funciones definidas por el usuario en Simplify y FullSimplify?
- 26. ¿Cómo agrego fórmulas a la hoja de cálculo de Google con Google Apps Script?
- 27. Fórmulas de posicionamiento en látex
- 28. ¿Por qué? "Declarar siempre excepciones definidas por el usuario como definitivas"
- 29. ¿Cómo usar las funciones SQL definidas por el usuario en .NET?
- 30. ¿A qué se parecen las clases de valores definidas por el usuario de Java?