• Jueves 28 de Marzo de 2024, 20:59

Autor Tema:  programa de calculadora  (Leído 4355 veces)

limonpmc

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
programa de calculadora
« en: Jueves 11 de Junio de 2009, 22:38 »
0
ojala me pueda ayudar a realizar este programa

Realizar un programa utilizando listas, pilas o colas, que permita:

Ingresar una expresión aritmética en forma lineal. Por ejemplo: (5+24)

Reconocer errores en el ingreso. Por ejemplo la falta de un paréntesis (5+24

Permita calcular el resultado de la operación. Por ejemplo: (3*2) resultado: 6

Restricciones:
Solo podrá utilizarse 2 tipos de paréntesis, ( ), [].

Podrá tener solo una anidación de paréntesis. [( )].

La expresión se debe ingresar en forma lineal.
Se ingresarán números solo menores a 10.


por favor

akabane89

  • Nuevo Miembro
  • *
  • Mensajes: 5
  • Nacionalidad: pe
    • Ver Perfil
Re: programa de calculadora
« Respuesta #1 en: Sábado 20 de Junio de 2009, 17:41 »
0
has el algoritmo (una funcion) que verifique que tu cadena de caracteres el cual es la expresion matematica a resolver, esté bien formulada.
lo que te dije es,  si tienes  (A+B)-C esta bien. hay coherencia. pero si tienes
(A-B(-C) esto no tiene coherencia por que se habre un parentesis pero no se cierra.
Tiene que trabajar con parentesis, corchetes, y hasta llaves. Pero lo usual solo son parentesis.
Luego, has un algoritmo, que dada tu cadena coherente. extraiga la subcadena que se encuentra en uno de los parentesis mas internos para poder efectuarlo.
El algoritmo que hagas para ver la coherencia es una pila, donde vas ingresando los elementos parentesis y corchetes que encuentres, y al final, si en la pila no queda ninguno, entonces la cadena es coherente,
Si tienes(5+(3-1)*5 + [2-(2/8) ] )
Bien entonces mientras vas encontrando esos signos los guardas en la pila, y cuando encuentres o ubiques que el opuesto del ultimo ingresado está una casilla anterior, entonces estos se eliminan.
PILA: (     // primera pasada
PILA: ((     // 2 pasada
PILA: (()     // 3 pasada, aqui los ultimos son opuestos y se cierra, en este caso se eliminan, quedandote en tu pila solo el (
PILA: ([      //4 pasada
PILA: ([(     // 5 PASADA
PILA: ([()    // 6 pasada, se eliminan los ultimos
PILA:([]
PILA: ()
PILA: ...     // al final no queda ninguno, esto significa que tu cadena es coherente.
 has la simulación para una cadena no coherente, y veras que el resultado no es vacío, siempre te quedará almenos un elemento dentro de la PILA.

Ahora explico el algoritmo para resolver la cadena coherente. por ejemplo, si tienes
D - ((A+B)/C)    el algoritmo debe guardar en otra cadena de caracteres
la subcadena  A+B. Esto para aplicarle a esta subcadena un algoritmo que transforme los numeros escritos en caracter a enteros y operarlos, obtener un numero entero o real, y convertirlo en un caracter.
Osea basicamente lo que digo es que vamos a usar 2 algoritmos, uno para extraer subcadenas, y otro para resolver esas subcadenas. el caso simulado sería asi.
Ingresas 5+(7*2-(1+2))  el algoritmo de subcadenas ubica el mas interno, entonces tu recorres esta cadena, hasta toparte con una abertura de parentesis que es el que está en este caso antes del 7, pero luego te encuentras con otro parentesis, entonces olvidamos el anterior '(' y ahora pasamos al que esta antes del 1, y encontramos su cerradura ')'. Tenemos que guardar los indices de inicio y fin de parentesis, por que esa subcadena va a desaparecer y ser reemplazado por un numero. ya que la subcadena 1+2 va a ser tratada en otro algoritmo que será solucion de subcadena.
esta funcion va a detectar los operadores de forma prioritaria, osea que como aqui no hay parentesis, solo tenemos + - * /
Si se encuentra una multiplicacion o una division, se cogerán los numeros que tienen al lado ( que son caracteres que se pasarán a enteros o reales) y se operaran, y luego ese resultado entero o real se convierte en caracter.
en este caso como tenemos soolo el signo +. entonces se sabe que se va a sumar los numeros que lo rodean.
se convierten estos caracteres a numeros y se suman
el resultado es 3, ahora este 3 esta en entero, lo pasamos a caracter para guardarlo en la cadena.
hasta aqui has resuelto la subcadena 1+2
pero ahora como te resulta la cadena original? como te dije que guardases los indices entonces ahora vas a hacer una copia, o una modificacion mejor dicho, de este arreglo.
Se tenia 5+(7*2-(1+2)), se guardaron los indices 8 y 12 ( el conteo de indices lo inicio en 1 como algoritmo, no como c++) entonces has una copia de la subcadena del indice 12 para adelante, sin tomar el 12. osea guardas ) que es el ultimo parentesis.
y ahora a partir del indice 8 vas a poner los caracteres que te resultaron, es decir 3.
Ahora te queda hasta el momento asi  5+(7*2-31+2))  y tienes una copia  )
como se empezó el reemplazo del resultado desde el indice 8, 3 chanca el valor del caracter '(', por eso queda como un 31, pero no es 31, es 3 y un 1 a su lado.
ahora en tu recorrido que estas haciendo, como ya pusiste los caracteres de tu resultado. ahora tienes que poner la copia que hiciste, es decir ')'
te queda  5+(7*2-3)+2)), y ahora los valores a partir de donde ya terminaste de copiar para adelante los conviertes o bien en espacios vacíos o en null. eso depende de como funciona tu programa, yo recomiendo null.
entonces tu cadena queda 5+(7*2-3) ahora tienes que aplicar el mismo algoritmo
ubicas la subcadena  en este caso 7*2-3
ahora aplicas el algoritmo, y como encuentras una multiplicacion entonces la ejecutas
al rededor del por esta 7 y 2, los transformas, multiplicas, y tu resultado son 2 caracteres en este caso 14, y esta cadenita tienes que reemplazarla en tu cadena que estas resolviendo.
te queda 14-3 ( ten en cuenta que aqui en el reemplazo de la cadena he hecho el mismo paso que el anterior, ver de donde empieza el reemplazo, donde termino, y chanco los valores que no fueron afectados en la operacion, es decir para este caso los caracteres - y 3. limpiando todo te queda 14-3)
ahora a esta cadena le vuelves a aplicar el algoritmo de operacion. y te queda 11
reemplazas en la cadena anterior y te queda 5 + 11 ( imagina que el numero te quedara negativo, que harías? aqui harías una excepcion por que escribirías 5+-11, y puedes hacer una subfuncion que si encuentra dos signos seguidos como en ese caso, los multiplique, en ese caso se interpreta como una resta) ahora te quedó 5+11
como ya no encuentras parentesis, solo le aplicas el algorítmo de operacion, y listo, obtienes 16.

eso es todo amigo, si necesitas ayuda aun, solo avisa ;)

Xinefpro

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: programa de calculadora
« Respuesta #2 en: Miércoles 7 de Abril de 2010, 20:58 »
0
Como bien dijo Akabane89 para ver la paridad de signos de asociacion tienes que usar una pila, y para lo de la evaluacion de las expresiones aritmeticas te recomiendo buscar en google
o wikipedia "Notacion postfija", que es lo que se usa para evaluar expresiones aritmeticas en las calculadoras. Suerte .