计算器开发需求
- 实现加减乘除及拓号优先级解析
- 用户输入 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
时间: 2024-10-27 09:59:12