#!/usr/bin/env python # -*- coding: utf -*- OPERACIONES = ['+', '-', '*', '/', '**', '//'] LETRAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'w', 'x', 'y', 'z'] class Calculadora(): """ Pasos a seguir al resolver ecuaciones: 1) Reducir los polinomios en los dos miembros 2) Dejar la x en un miembro y sola 3) Expresar el conjunto solución, S = {SOLUCIONES} 3x + 3 - 2 = 13 3x + 1 = 13 <--- 1 3x - 1 + 1 = 13 - 1 <--- 2 3x / 3 = 12 / 3 <--- 2 x = 4 <--- 2 S = {4} <--- 3 Pasos a seguir al reducir pilinomios: 1) Buscar los monomios con el mismo grado, dependiendo del exponente, en caso de no tener exponene depende de si el monomio tiene o no una x, en caso de no tener, el grado es 0, de lo contrario es 1, y si tiene exponente, el exponente es el grado. 2) Realizar las operaciones entre los monomios semejanes de la siguiente manera: Multiplicación/División: Se multiplican o dividen los coeficientes y partes literales por separado: Resolver 3x * 5x: 3 * 5 = 15 x * x = xe2 Entonces 3x * 5x = 15xe2 Suma/Resta: Se suman o restan los coeficientes(sabiendo que si la x está sola, cuenta como coeficiente 1): 3x + 2x = 5x x + 5x = 6x 7x - 4x = 3x """ def __init__(self, operacion): if operacion: if not 'x' in operacion.lower(): print self.operar(operacion) else: if '=' in operacion: print self.resolver_ecuacion(operacion) else: print self.reducir_polinomios(operacion) def operar(self, operacion): resultado = 0 try: resultado = eval(operacion) except NameError: raise NameError('Un término introducido no es un número.') return resultado def resolver_ecuacion(self, ecuacion): miembros = ecuacion.split('=') miembro1 = self.reducir_polinomios(miembros[0]) miembro2 = self.reducir_polinomios(miembros[1]) miembro1_str = '' miembro2_str = '' for x in miembro1: for x2 in miembro1[x]: miembro1_str += x2 for x in miembro2: for x2 in miembro2[x]: miembro2_str += x2 ecuacion = miembro1_str + '=' + miembro2_str return ecuacion def limpiar_valor(self, valor): if type(valor) == str: if ' ' in valor: valor = valor.replace(' ', '') if valor[0] == '/' or valor[0] == '*': valor = valor[1:] if '0x' in valor and valor != '0x': valor = (valor[valor.find('0x'):] + valor[:valor.find('0x')])[2:] elif valor == '0x': valor = '0' elif type(valor) == list and len(valor) >= 1: while valor[0] in OPERACIONES: valor.remove(valor[0]) while valor[-1] in OPERACIONES: valor.remove(valor[-1]) for x in valor: if not x: valor.remove(x) elif type(valor) == dict: for x in valor: valor[x] = self.limpiar_valor(valor[x]) return valor def reducir_polinomios(self, operacion, diccionario=None): """ Realizando la reducción de polinomios. """ if not diccionario: if operacion[0] != '+' and operacion[0] != '-': signo = '+' else: signo = '-' operacion = self.limpiar_valor(operacion) operacion = signo + operacion diccionario = {} if '+' in operacion: operacion = operacion.replace('+', ' +') if '-' in operacion: operacion = operacion.replace('-', ' -') if '*' in operacion: operacion = operacion.replace('*', ' *') if '/' in operacion: operacion = operacion.replace('/', ' /') lista = operacion.split(' ') lista = self.limpiar_valor(lista) for x in lista: if x[0] != '-' and x[0] != '+' and x[0] != '*' and x[0] != '/': _numero = lista.index(x) lista.remove(x) lista.insert(_numero, '+' + x) if 'x' in x and not 'e' in x: if not diccionario.get(1): diccionario[1] = [] diccionario[1].append(x) elif 'x' in x and 'e' in x: numero = str(int(x.split('e')[1])) if not diccionario.get(numero): diccionario[numero] = [] diccionario[numero].append(x) elif not 'x' in x and 'e' in x: x = str(int(x.split('e')[0]) ** int(x.split('e')[1])) if not diccionario.get(0): diccionario[0] = [] diccionario[0].append(x) else: # not 'x' in x and not 'e' in x: if not diccionario.get(0): diccionario[0] = [] diccionario[0].append(str(x)) if x == '-x' or x == '+x': numero = lista.index(x) lista.remove(x) lista.insert(numero, x[0] + '1x') diccionario = self.limpiar_valor(diccionario) for x in diccionario: resultado = '' lista = diccionario[x] #print lista, diccionario for valor in lista: if 'x' in valor and not 'e' in valor: numero = valor.split('x')[0] if valor == 'x': numero = lista.index(valor) lista.remove(valor) lista.insert(numero, '+x') if valor == '-x' or valor == '+x': numero = valor[0] + '1' _numero = lista.index(valor) lista.remove(valor) lista.insert(_numero, numero + 'x') if (valor[0] == '*' or valor[0] == '/') and 'x' in valor and 'x' in lista[lista.index(valor) - 1]: resultado = '' valor1 = valor valor2 = lista[lista.index(valor) - 1] lista.remove(valor) lista.remove(valor2) _numero1 = valor1.split('x')[0] _numero2 = valor2.split('x')[0] if 'e' in valor1: numero1 = valor1.split('e')[1] else: numero1 = '1' if 'e' in valor2: numero2 = valor2.split('e')[1] else: numero2 = '1' if valor[0] == '*': operacion = '+' elif operacion == '/': operacion = '-' cuenta = self.limpiar_valor(numero1 + operacion + numero2) exponente = str(eval(cuenta)) print exponente if exponente == '1': final = 'x' elif int(exponente) > 1 or int(exponente) < 1: final = 'xe' + exponente resultado = self.limpiar_valor(_numero1 + valor[0] + _numero2 + final) #print resultado #resultado = str(eval(resultado)) if not diccionario.get(int(exponente)): diccionario[int(exponente)] = [] diccionario[int(exponente)].append(resultado) if valor <= x: print diccionario self.reducir_polinomios(diccionario=diccionario) elif not 'x' in valor and 'e' in valor: numero = str(int(valor.split('e')[0] ** valor.split('e')[1])) elif 'x' in valor and 'e' in valor: numero = valor.split('xe')[0] elif not 'x' in valor and not 'e' in valor: numero = valor resultado += str(numero) resultado = self.limpiar_valor(resultado) if x == 0: if resultado != '-': res = str(eval(resultado)) else: res = '0' elif x == 1: res = str(eval(resultado)) + 'x' elif x > 1 or x < 0: res = str(eval(resultado)) + 'xe' + str(x) diccionario[x] = [res] _lista = [] _resultado_final = '' for x in diccionario: _lista.append(x) _lista.sort() _lista.reverse() for x in _lista: lista = diccionario[x] for valor in lista: if valor[0] != '+' and valor[0] != '-': valor = '+' + valor _resultado_final += valor if _resultado_final[0] == '+': _resultado_final = _resultado_final[1:] resultado_final = self.limpiar_valor(_resultado_final) return resultado_final if __name__ == '__main__': cerrar = False while not cerrar: cuenta = raw_input('Operacion: ') if cuenta.lower() in ['cerrar', 'salir']: cerrar = True else: Calculadora(cuenta)