开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,
必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,
结果必须与真实的计算器所得出的结果一致
import re
def func(a):
while True:
if '*' in a:
c = a.split('*')
if '/' in c[0]:
a = div(a)
else:
a = mul(a)
elif '/' in a:
a = div(a)
else:
a = add(a)
return a
def mul(a):
b = re.search(r'd+.?d**-?d+.?d*', a)
if b:
b = b.group()
l=b.split("*")
c=float(l[0])*float(l[1])
res = re.sub(r'd+.?d**-?d+.?d*', str(c), a,1)
return res
def div(a):
b = re.search(r'd+.?d*/-?d+.?d*', a)
if b:
b = b.group()
l=b.split("/")
c=float(l[0])/float(l[1])
res = re.sub(r'd+.?d*/-?d+.?d*', str(c), a,1)
return res
def add(a):
if '--' in a:
a = a.replace('--', '+')
b = re.findall(r'-?d+.?d*', a) #把负数两个字符看成一个整体
c=0
for i in b:
c+=float(i)
return c
def caculate():
a = ''.join(input('请输入计算公式如1-2*(60-30+(-40/5))等此类:').split())#把输入字符串以空格切片然后在拼接
while True:
if '(' in a:
b = re.search(r'(([^()]+))', a)
if b:
c = b.group()
d = func(c)
a = re.sub(r'(([^()]+))', str(d), a, 1)
else:
print(func(a))
break
caculate()