作业计算器开发
作业:计算器开发
- 实现加减乘除及拓号优先级解析
- 用户输入 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

浙公网安备 33010602011771号