计算器开发需求
- 实现加减乘除及拓号优先级解析
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
#coding=utf-8
import re
def sub_calc(formula):
""" 计算一个加减乘除表达式的值"""
flag = True
while flag:
m = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',formula) #先匹配乘除 举例: 5.12 * -123.12 , - 5.12 / -123.12
if m:
sub_mul_div = m.group()
res = calc_multi_divd(sub_mul_div)
formula = formula.replace(sub_mul_div,res) # 将乘除表达式的结果替换,循环判断是否还有乘除表达式
print "*" * 10,"乘除表达式:",formula
else:
print "*" * 10 ,"乘除计算完毕"
flag = False
print "*" * 10,"子括号里面计算乘除后的表达式 ",formula
result = calc_add_stract(formula) #计算加减法
return result
def calc_multi_divd(formula):
"""计算单个的乘除法表达式"""
print "*" * 20,"单个的乘除法表达式",formula
f_list = re.split('[*/]',formula)
print "*" * 20 ,"单个的乘除表达式列表",f_list
if '*' in formula:
res = float(f_list[0]) * float(f_list[1])
elif '/' in formula:
res = float(f_list[0]) / float(f_list[1])
return str(res)
def calc_add_stract(formula):
"""计算加减法,通过reduce 两两计算"""
print "*" * 20,"没有处理正负号的加减表达式: ",formula
#对符号进行处理
formula = formula.replace('--','+')
formula = formula.replace('++','+')
formula = formula.replace('-+','-')
formula = formula.replace('+-','-')
print "*" * 20 ,"处理完正负号的加减表达式:",formula
#对一个加减表达式,-变成+-,为了进行split成列表用于reduce计算
formula = formula.replace('-','+-')
formula_list = formula.split('+')
print "*" * 20,"按加号分割的列表:",formula_list #第一个数为负数,则列表第一个字段为空
if formula_list[0] == '':
formula_list = formula_list[1:]
"""
result = 0
for i in formula_list:
if '-' in i:
stract_list = i.split('-')
result = float(stract_list[0]) - float(stract_list[1]) + result
else:
result += float(i)
"""
result = reduce(lambda x,y: float(x) + float(y),formula_list)
print "*" * 20 ,"加减表达式的结果:" ,result
return str(result)
def calc(formula):
flag = True
while flag:
m = re.search('\([^()]*\)',formula)
if m:
print "*" * 5, "计算匹配到的括号表达式:",m.group()
sub_formula = m.group().strip('()')
res = sub_calc(sub_formula) #先计算括号内的表达式
formula = formula.replace(m.group(),res) #将表达式计算出来的结果替换原括号,再一次循环判断是否还有括号
else:
flag = False
print "*" * 5,"最终的去括号后的表达式:", formula
result = sub_calc(formula)
return result
if __name__ == '__main__':
formula = "1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
print "要计算的表达式:", formula
#去掉所有的空格
formula = re.sub('\s','',formula)
print "去掉空格后的表达式",formula
res = calc(formula)
print "最终的结果:",res