首页 > 代码库 > 模拟计算器
模拟计算器
需求 a.实现加减乘除及拓号优先级解析 b.用户输入 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 mul_div(m_d): # 计算乘除公式 for index, member in enumerate(m_d): if "*" in member or "/" in member: oper = re.findall("[*/]", member) calculation = re.split("[*/]", member) num = None for i, e in enumerate(calculation): if num: if oper[i - 1] == "*": num *= float(e) elif oper[i - 1] == "/": num /= float(e) else: num = float(e) m_d[index] = num return m_d def add_sub(oper, num_list): #计算加减公式 num = None for i, n in enumerate(num_list): if num: if oper[i - 1] == "+": num += float(n) elif oper[i - 1] == "-": num -= float(n) else: num = float(n) return num def brackets(formula): #格式化计算公式 formula = re.sub("[()]", "", formula) # 去除两边的() formula = formula.replace(" ", "") # 去除空字符 formula = formula.replace("+-", "-") # 定义计算规则,正负得负 formula = formula.replace("--", "+") # 定义计算规则,负负得正 sign = re.findall("[+-]", formula) # 取出公式内加减运算符 m_d = re.split("[+-]", formula) # 以加减运算符切割计算公式,取出带有‘*‘ ‘/‘ if m_d[0] == "": # 如果列表第一个字符为空,表示一个数字为负号 m_d[1] = "-" + m_d[1] # 重新定义带有*/的公式,加上负号 del sign[0] del m_d[0] for index, member in enumerate(m_d): #枚举列表 if member.endswith("*") or member.endswith("/"): m_d[index] = member + sign[index] + m_d[index + 1] del m_d[index + 1] del sign[index] res=sign, m_d sign = res[0] m_d = res[1] after_m_d = mul_div(m_d) res = add_sub(sign, after_m_d) return res def main(formula): # 主逻辑,循环取出括号内计算公式并进行公式拼接 while True: formula_cut = re.search("\([^()]+\)", formula) if formula_cut: formula_cut = formula_cut.group() res = brackets(formula_cut) # 格式化计算公式 formula = formula.replace(formula_cut, str(res)) # 把括号计算后的内容拼接到计算公式 else: res = brackets(formula) print("\33[31;1m结果:%s\33[0m" % (res)) exit() formula=input(‘‘‘ 请输入运算公式: 格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 【Q】 退出 ‘‘‘) if formula.lower() == ‘q‘: print(‘计算器已退出‘) exit() 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) ) 【Q】 退出 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 结果:2776672.6952380957
本文出自 “lyndon” 博客,请务必保留此出处http://lyndon.blog.51cto.com/11474010/1955313
模拟计算器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。