Exemplo n.º 1
0
        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