作业:编写一个计算机,输入一个字符串的数学表达式(+-*/)可以计算其结果.
法一(老师的标准答案):
import re
def atom_cal(exp):#原子性计算
if '*' in exp:
a,b = exp.split('*')
return str(float(a)*float(b))#计算乘法
elif '/' in exp:
a,b = exp.split('/')#计算除法
return str(float(a)/float(b))
def format(exp):#标准化
exp=exp.replace('--','+')
exp=exp.replace('+-','-')
exp=exp.replace('-+','-')
exp=exp.replace('++','+')
return exp
def mul_div(exp):#乘除法的计算
while True:
ret = re.search('d+(.?d+)?[*/]-?d+(.?d+)?',exp)#查看式子是否有乘除法
if ret:
atom_exp = ret.group()
res = atom_cal(atom_exp)
exp = exp.replace(atom_exp,res)
else :
return exp
def sub_add(exp):
ret = re.findall('[+-]?d+(?:.d+)?', exp)#查看是否需要加减法
sum = 0
for i in ret:
sum += float(i)
return sum
def cal(exp):
while True:
# ret = re.search('d+(.?d+)?[*/]-?d+(.?d+)?',exp)
# if ret:
# atom_exp = ret.group()
# res = atom_cal(atom_exp)
# exp = exp.replace(atom_exp,res)
# else :
# break
exp = mul_div(exp)#先乘除
exp = format(exp)#标准化式子一下
res = sub_add(exp)#后加减
return res
# ret = re.findall('[+-]?d+(?:.d+)?',exp)
# sum = 0
# for i in ret:
# sum += float(i)
# return sum
print(cal('2-1*-22+3-4/-5'))#测试一下
def main(exp):#去除空格+主函数
while True:
exp = exp.replace(' ','')
ret = re.search('([^()]+)',exp)#也可以用findall一个个换
if ret:
inner_bracket = ret.group()
res = str(cal(inner_bracket))#只有在这里将float转成str才能最后返回的是float
exp.replace(exp,res)
exp = format(exp)
else:
break
return cal(exp)#返回的是float类型
print(main('2-1*-22+3-4/-5'))
法二(自己想的,递归版):
import re
def format(exp):#标准化
exp=exp.replace('--','+')
exp=exp.replace('+-','-')
exp=exp.replace('-+','-')
exp=exp.replace('++','+')
return exp
def bracket_func(formula):
ret = re.search('(([^()])+)',formula)
if ret:
ret = ret.group().replace('(', '').replace(')', '')#把传入式子的括号去除
bracket_ret = multiplication_and_division(ret)
formula = formula.replace('('+ret+')',bracket_ret)#去除主式子的括号
return bracket_func(formula)
else:
return multiplication_and_division(formula)
def multiplication_and_division(str1):
format(str1)
ret = re.search('(-?d+(.?d+)?[*/]-?d+(.?d+)?)',str1)
if ret:
str1 = str1.replace(ret.group(),str(eval(ret.group())),1)
return multiplication_and_division(str1)#递归函数
else:
return subtraction_and_addition(str1)#没有乘除号传入乘除函数
def subtraction_and_addition(str2):
ret1 = re.search('(d+(.?d+)?+-?d+(.?d+)?)|(d+(.?d+)?--?d+(.?d+)?)',str2)#加减法可以用[+-]来表示,当时没想到.
if ret1:
str2 = str2.replace(ret1.group(),str(eval(ret1.group())),1)
return subtraction_and_addition(str2)
else:
return str2
formula = input('请输入计算式:
')
print('%s的结果是:
'%formula+bracket_func(formula.replace(' ','')))