作业:计算器开发
- 实现加减乘除及拓号优先级解析
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10* 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
import re def deal_minus_issue(calc_list): new_calc_list = [] print("before_calc_list",calc_list) for index,item in enumerate(calc_list): print(item) if item.strip().endswith("*") or item.strip().endswith("/"): new_calc_list.append("%s-%s"%(calc_list[index],calc_list[index+1])) elif "*" in item or "/" in item: new_calc_list.append(item) print("new calc_list",new_calc_list) return new_calc_list def plus_subtraction(formula): print("\033[31;1m运算2\033[0m",formula) formula=re.sub('--','+',formula) formula=re.sub('-\+','-',formula) formula=formula.split("+-") print("\033[31;1m运算22\033[0m",formula) for item in formula: # print(item) sub_plus_list = re.split('[+-]',item) print(sub_plus_list) sub_plus_operator_list=re.findall('[+-]',item) print(sub_plus_list,sub_plus_operator_list,"---------------------------------------------------------") for index,i in enumerate(sub_plus_list): # print(index) if i == '': print(index) print(sub_plus_list[index],'++++++++++++++') sub_plus_list[index] = str(0.0) print(sub_plus_list,sub_plus_operator_list,'+++++-----------') sub_res = None for index,i in enumerate(sub_plus_list): if sub_res: if sub_plus_operator_list[index-1] == "+": sub_res += float(i) else: sub_res -= float(i) elif index >0: if sub_plus_operator_list[index-1] == "+": sub_res += float(i) else: sub_res -= float(i) else: sub_res = float(i) print('++++++++++++++++++++++++++++++++++++sub_res+++++++++++++++',sub_res) print("\033[31;1m[%s]=\033[0m"%item,str(sub_res)) return str(sub_res) def multiply_dividend(formula): print("\033[31;1m运算1\033[0m",formula) formula=formula.replace(' ','') formula=re.sub('--','+',formula) print("\033[31;1m运算11\033[0m",formula) mm =re.match('^-',formula) if mm: calc_list = re.split("[+-]",formula) calc_list[0]='-' else: calc_list = re.split("[+-]",formula) print(calc_list) print(calc_list,"运算112") calc_list = deal_minus_issue(calc_list) print("final_calc_list",calc_list) for item in calc_list: sub_calc_list=re.split('[/*]',item) sub_operator_list=re.findall('[/*]',item) print(sub_calc_list,sub_operator_list) sub_res = None for index,i in enumerate(sub_calc_list): if sub_res:#这不是第一次循环 if sub_operator_list[index-1] == "*": sub_res *= float(i) else: sub_res /= float(i) else: sub_res = float(i) print("\033[31;1m[%s]=\033[0m"%item,str(sub_res)) formula=formula.replace(item,str(sub_res)) print("\033[32;1m结果1\033[0m",formula) formula=re.sub('\+-','-',formula) print(formula,'结果111') mm =re.match('^-[0-9.]{1,}$',formula) mn = re.search('[\+-]',formula) if mm: return formula else: return plus_subtraction(formula) #去掉括号 def calc(formula): parenthese_flag=True while parenthese_flag: m = re.search('\([^()]+\)',formula) if m: print(m.group()) sub_formula = m.group().strip("()") sub_res = multiply_dividend(sub_formula) # print(sub_res) m1 = m.group() # print(m1) formula=formula.replace(m1,str(sub_res)) print(formula) calc(formula) break else: parenthese_flag=False sub_formula=re.sub(' ','',formula) sub_res = multiply_dividend(sub_formula) print(sub_res) if __name__ == '__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) )" # formula = "1 - 2 * ( (60-30 +(9-2*5/-3 + 7 /3*99/4*2998 +10 * 568/14 )*(-40/5) ) - (-4*3)/ (16-3*2) )" res = calc(formula) 2776672.6952380957