Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Milagrosh25 en 16 Septiembre 2017, 20:00 pm



Título: Transformar una entrada de palabras en entrada matematica
Publicado por: Milagrosh25 en 16 Septiembre 2017, 20:00 pm
Buenas Tardes Chicos (as)

Necesito crear un programa que sea capaz de realizar una operación matemática con cualquier función que se le ingrese por teclado.
La verdad mi profesor dice que es posible transformar de texto a una función trigonométrica pero no encuentro la forma.

La otra opción que me han dado es, declarar una variable de tipo char y que esa almacene la función y a si poderla usar, siempre y cuando se ingrese la función de forma que el lenguaje lo interprete. Ejemplo, seno(x) --> sin(x)
El problema es que necesito evaluar es función y no se de que forma puede hacerse.

Cualquier consejo que puedan darme seria de mucha ayuda


Título: Re: Transformar una entrada de palabras en entrada matematica
Publicado por: engel lex en 16 Septiembre 2017, 20:14 pm
directamente no puedes evaluar la entrada, lo normal en este caso es hacer un "analizador lexico" lees el input en busca de los operandos y vas almacenandolos para operar con ellos... recomiendo buscar ejemplos, hay muchos ejemplos de calculadoras así


Título: Re: Transformar una entrada de palabras en entrada matematica
Publicado por: Milagrosh25 en 16 Septiembre 2017, 23:35 pm
Muchas gracias por tu opinión, buscare esos ejemplos!


Título: Re: Transformar una entrada de palabras en entrada matematica
Publicado por: Serapis en 16 Septiembre 2017, 23:41 pm
Hay algunos lenguajes que sí permiten hacer esa evaluación, por ejemplo VBScript, tienen un método Eval(string), que puede (intentar) procesar un texto entrado por el usuario... Esto es posible, porque va interpretando, no requiere compilación...

Como casi ningún lenguaje posee esa funcionalidad, en efecto tienes que hacer como te dice Engel, sin necesidad de ir tan lejos, te basta 'crear tu pequeño lenguaje', es suficiente con dos expresiones ( te recomiendo ojear la "notación BNF", te dará las ideas necesarias para poder encajarlo todo de una forma sencilla y asimilable):
------> variable Operador variable
----------------> Operador variable

Te defino todas las producciones mínimas que podría requerir 'tu lenguaje':
-------------------------------------------------------------------------------
1 expresion = numero + spc + operador1 + spc + numero | operador2 + spc + numero
2 numero = 0-9 + [numero]
3 spc = espacio + [spc] |tabulador + [spc]
4 operador1 = " + "|" - "|" * "|" / "|" ^ "|" sqr "|" or "|" and "|" xor "|" mod "
5 operador2 = " not "|" sin "|" cos "|" round "|" int "
======================================

- El simbolo "+" indica que concatenación de producciones (de partes, que tras una parte va obligadamente (salvo que sea opcional) otra parte).
- Los símbolos opcionales, tenemos 3:
------->  "x|y|z" indican que se elige uno solo entre los posibles elementos delimitados por los separadores.
------->  "-" es un separador de un rango, por ejemplo A-E, equivale a: A,B,C,D,E,F
-------> "," es un separador de lista, por ejemplo: "Set", "Get", "Do"
- Los símbolos "[x,y,z] indican que el contenido interior entre corchetes es opcional.
- Los literales (que en la expresión deben escribirse tal cual), en la descripción van encerrados entre comillas (para distinguirlos de otra producción).
     Ojo los símbolos "" + "", "" - "", (en operador1) son literales.


Llevándolo un poco más lejos puede hacerse algo más complejo, aparte de añadir más operadores (que es trivial), puedes añadir la admisión de números no solo en la base decimal y enteros, tambien  binario, hexadecimal, octal, etc... ...y/o decimales (coma flotante)
Admitiendo más posibilidades con los números
----------------------------------------------------------------------
2 numero = numeroDec | numeroBin | numeroHex | numeroOct  // sobrescribimos lo que es un número.
6 digitoBin = 0|1
7 digitoOct = digitoBin | [2-7]
8 digitoDec = digitoOct | [8-9]
9 digitoHex = digitoDec | [A-F]

10 digitosBin = digitoBin + [digitosBin]
11 digitosOct = digitoOct + [digitosOct]
12 digitosDec = digitoDec + [digitosDec]
13 digitosHex = digitoHex + [digitosHex]

16 numeroBin = "Bx" + digitosBin
17 numeroOct = "Ox" + digitosOct
18 numeroDec = digitosDec
19 numeroHex = "Hx" + digitosHex
Los números con decimales, lo dejo a tu esfuerzo...

Y por supuesto admitir variables, además de números...
-------------------------------------------------------------------------
0 valor = variable | numero
1 expresion = valor + spc + operador1 + spc + valor | operador2 + spc + valor // esta producción se modifica
14 variable = identificador + " = " + expresion
15 identificador = A-Z + [identificador] | A-Z + [0-9] + [identificador]