用户提交方程的数学运算

时间:2018-05-16 12:46:13

标签: python

我正在编写一个程序来从用户那里得到一个等式,例如2 * 56,程序会给出答案。这是有效的,但是对于超过2个函数,我的代码会中断

equation = input('Enter an equation: ')

def addition():
    splited = equation.split('+')
    results = [float(i) for i in splited]
    results = results[0] + results[1]
    print(results)

def subtraction():
    splited= equation.split('-')
    results = [float(i) for i in splited]
    results = results[0] - results[1]
    print(results)

def multiply():
    splited= equation.split('*')
    results = [float(i) for i in splited]
    results = results[0] * results[1]
    print(results)

def divide():
    splited= equation.split('/')
    results = [float(i) for i in splited]
    results = results[0] / results[1]
    print(results)

if ('+') in equation:
    addition()
elif ('-') in equation:
    subtraction()
elif ('*') in equation:
    multiply()
elif ('/') in equation:
    divide()
else:
    print('Error! Please only input + , - , * , /')

此代码很容易适用于只包含一个操作的方程式,但如果用户输入2 + 2 - 9 * 6怎么能修改此代码以适应每种情况

2 个答案:

答案 0 :(得分:1)

我不确定这是不是你想要的,但是一个非常简单的方法就是:

equation = input('Enter an equation: ')
print(eval(equation))

答案 1 :(得分:1)

在你的程序中,表达式只包含一个运算符和2个操作数,当有更多运算符时,结果= result[0] + result[1]将计算为results[0] = 2results[1] = 2 - 9 * 6。因此,您遇到了这样的错误。

以下程序从右到左进行评估。递归迭代表达式的每个操作数或运算符。在进入解决方案之前了解re.split并捕获组。

import re

def evaluate(expression, index, size, result):
    if index == 0:
        operand = float(expression[0])
        return evaluate(expression, index + 1, size, operand)
    elif index < size:
        op = expression[index]
        if op in ['+', '-', '/', '*']:
            if op == '+':
                return result + evaluate(expression, index +1, size, 0.0)
            if op == '-':
                return result - evaluate(expression, index +1, size, 0.0)
            if op == '/':
                return result / evaluate(expression, index +1, size, 0.0)
            if op == '*':
                return result * evaluate(expression, index +1, size, 0.0)
        else:
            return evaluate(expression, index +1, size, float(op))
    else:
        return result

expression = re.split('([+-/*])', '2+34-48/8')
size = len(expression)
print evaluate(expression, 0, size, 0.0)