Hola Chema, muchas gracias por tu respuesta.

Al respecto de la ONCE, conozco bien lo que desarrollan, y lo que funciona bien, es muy caro y al menos no llega a México si no es por una de sus filiales, que encima aumentan más lo que cuesta. Tienen un editor matemático, llamado Lambda, si no me equivoco, que te corre por 30 días y todo; es 100% cerrado, y lo peor de todo es que al igual que pasa con muchos lectores de pantalla, magnificadores, síntesis de voz, reconocimiento de habla, etc, es que como son sectores de mercado muy específico, la demanda es menor y el precio más alto. Claro, no hay nada en contra de esto, pero no puedes modificar nada de lo que ellos te den, y si por x o y razón vemos algo que no se contempla, para lo cual se usan estas TI, tendré menos posibilidades de ponerme a la par rápidamente.

Pero es muy cierto que no tengo mucha idea de lo que mencionas para hacer la calculadora con cambios de estado, con lo que creo que continuaré pasando código por eval en forma de cadena, y restringiendo a este para que ejecute la menor cantidad de código no matemático posible.

Lo que hago ahora es algo sencillo, pero no sé si esté del todo bien. El programa toma una cadena, por ejemplo "R25" que es la representación de la raíz de 25 (tuve problemas con el símbolo de raíz, creo que era debido a la codificación); luego, en una clase se define un diccionario que tiene como clave cada uno de los signos que llaman a una función que se pueden ver en la calculadora, en este caso la "R", y como valor la función Python a la que pertenecen, en este ejemplo, como cuando ejecuto eval() ya tengo importado todo math, sería "sqrt".

Ahora bien, solo es cuestión de reemplazar y eso lo hace una función, que busca en una cadena si existe la clave del diccionario, y si existe, lo reemplaza con su valor, y le suma un paréntesis izquierdo, de este modo, la parte de "R25" quedaría como "sqrt(25". Siempre se le suma un paréntesis derecho a la cadena en la última función que se ejecuta antes que se mande a eval, ya que si se deja así no funcionará. Ahora, al terminar esta expresión, Python recibe "sqrt(25)", y puede reconocerlo.

Un problema que se me planteó después, es ¿qué sucedería si alguien hace algo como "R25+R9"? El código que recibiría Python sería algo como "sqrt(25+sqrt(9)"; por lo que además de lo anterior, hice un procedimiento para que viera si hay signos, y si los hay, colocara un paréntesis izquierdo y un derecho antes y después del signo, para que la suma anterior se pudiera ver como "sqrt(25)+(sqrt(9))".

Aún tengo mis dudas de que esto sea algo útil, ya que los paréntesis aunque dan el resultado esperado, creo que no es la mejor idea, pero más o menos esto es lo que actualmente se hace, y mi razón de escribir a la lista. Si esto está bien, solo falta usar scipy para darme funciones de cálculo estadístico, pero lo más seguro es que haya formas más inteligentes de hacer esto.

Justamente para esto preguntaba acerca de la sintaxis, porque supongo que una vez terminado, sería más sencillo hacer que el parser se adapte a la entrada de texto, que intentar moldear la cadena para que Python la reconozca, pero no tengo mucha luz al respecto. Gracias, y saludos.
El 24/01/13 17:16, Chema Cortes escribió:
El día 23 de enero de 2013 18:34, manuel <manuelcorte...@gmail.com> escribió:

Otra de las cosas que quisiera preguntar, es si se podría conseguir un
resultado de un porcentaje, pero escrito de la siguiente forma: 25+50%.

En GCalctool, esto se hace, pero no sé leer el código; no entiendo de muy
buena forma cómo lo hacen; se asume que el 50% debe ser del número 25, pero
cuando haces 25% se obtiene un 0.25, donde se asume no sé qué, se multiplica
25*1/100, y se obtiene el resultado.
Hay un modo sencillo de hacer la calculadora que es dar los resultados
parciales a medida que se van aplicando los operadores. Por ejemplo,
cuando sumas números, cada vez que se pulsa la tecla + se obtiene cada
resultado parcial de la suma.

Tal como lo planteas, tu idea es algo más complicada. Lo simple sería
escribir la operación como si fuera una expresión python y dejar que
la evalúe el intérprete. Si lo quieres hacer de otro modo, tendrás que
empezar por distinguir qué operadores son totalizadores (cálculos
parciales y totales) y en qué posición actúan (prefix/infix/sufix).
Tal como creo que intuyes, no es nada fácil y necesitarás conocer algo
de "teoría de máquinas de estados finitos" para entenderlo, algo que
se sale bastante de un proyecto de final de curso.

No tengo una recomendación clara que te pueda ayudar. Si sientes
curiosidad, tal vez podría buscarte algo de código para hacer una
calculadora.


Sobre lo que preguntas del tanto por ciento, se suelen representan los
números reales del 0 al 1 como factores multiplicativos, para lo que
se muestran multiplicados por 100 o por 1000, añadiendo el sufijo % ó
‰ (unicode U+2030) respectivamente. Así, por ejemplo, el 50%
representa al factor 0.5, más conocido por 1/2

En el caso de 25+50% se trataría de una operación de
descuentos/incrementos, donde a 25 le sumas un 50% (de 25). El porqué
el operador % funciona ahora así en lugar de limitarse a convertir 50%
en 0.5 se debe a que la calculadora ha cambiado de estado al iniciarse
la suma. En una suma, el 50% se toma como operación de incremento en
lugar de factor multiplicativo. Es un ejemplo de funcionamiento de
máquina de estados finitos.


Por otra parte, no sé si conoces la Fundación ONCE española. Se dedica
a adaptar dispositivos y aplicaciones a usuarios con deficiencia
visual o motora (tiflotecnología) a través de su centro CIDAT
(http://cidat.once.es). Mira en su FTP.

Así mismo, existe una calculadora llamada ATCalc que se adapta a tus
necesidades. Es programable (en pascal), lo que te puede dar ideas
para tu calculadora:

http://atcalc.sourceforge.net/indexESP.htm







_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a