if args_length == 0: print("Please enter your funtion arguments") continue print("Answer: " + str(user_equation.solveEquation(args))) args = [] elif user_input == 'r': print() print("Arguments Reset") args = [] elif user_input == 'd': print() user_equation.args = ['1', '0', '+', '5' ,'*', '2', '/', '5', '-', '1', '1'] user_equation.setup() print("Answer :" + str(user_equation.solve())) elif user_input == 'e': print() num_of_operators = randint(1,4) for i in range(num_of_operators): digits = randint(1,3) for j in range(digits): args.append(str(randint(0,9))) symbol_index = randint(10,13) args.append(symbol_inputs[symbol_index]) digits = randint(1,3) for j in range(digits): args.append(str(randint(0,9))) print("Answer: " + str(user_equation.solveEquation(args))) args = []
def evaluate_infix(expression): """ The highest level function for evaluation of expressions :param expression: string representing an infix expression :return: err_start, err_end, message, interpreted expression in case of any error, None, None, solution, interpreted_expression otherwise """ pat_unallowed = re.compile(r'([^A-Za-z0-9+\-*/=.,\s()])') if len(pat_unallowed.findall(expression)) > 0: pos = next(pat_unallowed.finditer(expression)).start() return pos, pos, "Unallowed symbol detected: %s" % expression[ pos], expression if "=" in expression: # Solve an equation if expression.count("=") > 1: pos = expression.index("=") + expression[expression.index("=") + 1:].index("=") + 1 return pos, pos, "More than one '=' symbols in expression can't be interpreted", expression result = Equations.solve(*expression.split("=")) if len(result) == 4: return result else: try: varname = result[0] polynomial = result[1] interpreted_expression = result[2] except (TypeError, IndexError): return -1, -1, "Something has gone terribly wrong", expression else: postfix_expression = PostfixExpression(expression) interpreted_expression = postfix_expression.interpreted_expression if postfix_expression.error_msg is not None: pos = postfix_expression.error_place return pos[0], pos[ 1], postfix_expression.error_msg, interpreted_expression else: varname = "" polynomial = postfix_expression.result.polynomial solver = PolynomialSolver() try: # Take the first (and the only) solution result = solver.solve(polynomial)[0] except NotImplementedError as e: return -1, -1, e.args[0], expression if result[1] == 0: if '=' in expression: return -1, -1, "The expression doesn't have a variable " + \ "(or the coefficient before it is 0), but " + \ "has a '=' sign. It cannot be interpreted.", expression # Formatting the result num_result = result[0] if math.floor( result[0]) != result[0] else math.floor(result[0]) return None, None, str(num_result), interpreted_expression else: if '=' not in expression: return -1, -1, "The expression has variables but doesn't have '=' sign." + \ "Should it be treated as equation?", expression # Formatting the result num_result = result[0] if math.floor( result[0]) != result[0] else math.floor(result[0]) return None, None, varname + ' = ' + str( num_result), interpreted_expression