用Python编写一个一元多次表达式的输入与计算程序

一、应用Python自带的eval()函数编程

while True:
    formula = input('请输入公式,公式的变量可以是x或者X:')
    formula = formula.lower()
    value = input('你输入的数值是:')
    value = float(value)
    x = value
    print('结果为:', eval(formula))
    cmd = input("继续吗?是\\否 ")
    cmd = cmd.lower()
    if '否' == cmd:
        break

二、用逆波兰表达式对输入的字符串进行解析

1、先完成用户输入界面

formula = input('请输入公式:')# 输入的表达式不带空格
value = input('你输入的数值是:')
ready = formula.replace('x', value)

将formula中的x用value里的值进行替换,将含未知数的表达式字符串转换成不含未知数的表达式字符串

2、将字符串中的表达式里的操作数与操作符之间用分隔符隔开

ready1 = []
def operator_separate_operand(ready):
    for item in ready:
        if item in ['+', '-', '*', '/', '^']:
            ready1.append(' ')
            ready1.append(item)
            ready1.append(' ')
        else:
            ready1.append(item)
operator_separate_operand(ready)
ready2 =  "".join(ready1)

3、将字符串中的表达式以逆波兰表达式的形式存储

ready3 = ready2.split(' ')
expression = []
ops = []
ops_rule = {'+': 1,'-': 1,'*': 2,'/': 2, '^': 3}
def middle_to_after(ready3):
    for item in ready3:
        if item in ['+', '-', '*', '/', '^']:
            while len(ops) >= 0:
                if len(ops) == 0:
                    ops.append(item)
                    break
                op = ops.pop()
                if op == '(' or ops_rule[item] > ops_rule[op]:
                    ops.append(op)
                    ops.append(item)
                    break
                else:
                    expression.append(op)
        elif item == '(':
            ops.append(item)
        elif item == ")":
            while len(ops) > 0:
                op = ops.pop()
                if op == '(':
                    break
                else:
                    expression.append(op)
        else:
            expression.append(item)
    while len(ops) > 0:
        expression.append(ops.pop())
    return expression

4、计算逆波兰表达式

stack_value = []
stopMark = False
def abc(expression):
    global stopMark
    for item in expression:
        if item in ['+', '-', '*', '/', '^']:
            n2 = stack_value.pop()
            n1 = stack_value.pop()
            result = cal(n1, n2, item)
            if stopMark:
                stack_value.clear()
                break
            else:
                stack_value.append(result)
        else:
            stack_value.append(int(item))
    if stopMark:
        return None
    else:
        return stack_value[0]
def cal(n1, n2, op):
    if op == '+':
        return n1 + n2
    if op == '-':
        return n1 - n2
    if op == '*':
        return n1 * n2
    if op == '/':
        if n2 == 0:
            global stopMark
            stopMark = True
            print('error: 除数不可为0')
            return 0
        else:
            return n1/n2
    if op == '^':
        return n1 ** n2

5、结果的计算与输出

middle_to_after(ready3)
abc(expression)
print('计算的结果为:{0}'.format(stack_value[0]))

你可能感兴趣的:(用Python编写一个一元多次表达式的输入与计算程序)