作业:编写一个计算机,输入一个字符串的数学表达式(+-*/)可以计算其结果.
法一(老师的标准答案):
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('请输入计算式:\n') print('%s的结果是:\n'%formula+bracket_func(formula.replace(' ','')))