[Python-es] Ayuda con sintaxis de Calculadora en Python usando WXPython

manuel manuelcortez00 en gmail.com
Jue Ene 24 16:32:39 CET 2013


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 <manuelcortez00 en 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
>
>
>
>





Más información sobre la lista de distribución Python-es