模拟计算器
需求 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如需转载请自行联系原作者
迟到的栋子