模拟计算器

需求
    a.实现加减乘除及拓号优先级解析
    b.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ),计算结果


模拟计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import re
 
def mul_div(m_d):      # 计算乘除公式
    for index, member in enumerate(m_d):
        if "*" in member or "/" in member:
            oper = re.findall("[*/]", member)
            calculation = re.split("[*/]", member)
            num = None
            for i, e in enumerate(calculation):
                if num:
                    if oper[i - 1== "*":
                        num *= float(e)
                    elif oper[i - 1== "/":
                        num /= float(e)
                else:
                    num = float(e)
            m_d[index] = num
    return m_d
 
def add_sub(oper, num_list):   #计算加减公式
    num = None
    for i, n in enumerate(num_list):
        if num:
            if oper[i - 1== "+":
                num += float(n)
            elif oper[i - 1== "-":
                num -= float(n)
        else:
            num = float(n)
    return num
 
def brackets(formula):      #格式化计算公式
    formula = re.sub("[()]", "", formula)               # 去除两边的()
    formula = formula.replace(" ", "")                  # 去除空字符
    formula = formula.replace("+-""-")                # 定义计算规则,正负得负
    formula = formula.replace("--""+")                # 定义计算规则,负负得正
    sign = re.findall("[+-]", formula)   # 取出公式内加减运算符
    m_d = re.split("[+-]", formula)    # 以加减运算符切割计算公式,取出带有'*' '/'
    if m_d[0== "":                   # 如果列表第一个字符为空,表示一个数字为负号
        m_d[1= "-" + m_d[1]     # 重新定义带有*/的公式,加上负号
        del sign[0]
        del m_d[0]
    for index, member in enumerate(m_d):      #枚举列表
        if member.endswith("*"or member.endswith("/"):
            m_d[index] = member + sign[index] + m_d[index + 1]
            del m_d[index + 1]
            del sign[index]
    res=sign, m_d
    sign = res[0]
    m_d = res[1]
    after_m_d = mul_div(m_d)
    res = add_sub(sign, after_m_d)
    return res
 
def main(formula):     # 主逻辑,循环取出括号内计算公式并进行公式拼接
    while True:
        formula_cut = re.search("\([^()]+\)", formula)
        if formula_cut:
            formula_cut = formula_cut.group()
            res = brackets(formula_cut)   # 格式化计算公式
            formula = formula.replace(formula_cut, str(res))  # 把括号计算后的内容拼接到计算公式
        else:
            res = brackets(formula)
            print("\33[31;1m结果:%s\33[0m" % (res))
            exit()
 
formula=input('''
请输入运算公式:
格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
【Q】 退出
''')
if formula.lower() == 'q':
    print('计算器已退出')
    exit()
main(formula)



1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2

) )

结果:2776672.6952380957

本文转自lyndon博客51CTO博客,原文链接http://blog.51cto.com/lyndon/1955313如需转载请自行联系原作者


迟到的栋子