开发一个简单的python计算器
1.实现加减乘除及括号优先级解析
2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能实现), 运算后得出结果,结果必须与真实的计算器所得出的结果一致
分析:
一、判断用户输入的公式是否正确(下面只做了4条,其它暂无添加)
1、先去除空格
2、不能出现字母
3、"("与")"必须配对
4、+、-、*、/不能重复
二、考虑优先级,先算()内部,再算*/,最后算+-
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import re 4 from functools import reduce 5 6 7 # 检查表达式合法性 8 def check_formula(formula): 9 tag = True 10 if re.findall("[a-zA-Z]", formula): # 包含字母 11 tag = False 12 if not len(re.findall("\(", formula)) == len(re.findall("\)", formula)): # (与)不匹配 13 tag = False 14 if re.findall("\(\)", formula): # 只出现() 15 tag = False 16 return tag 17 18 19 # 去掉重复的运算符 20 def repeat_operator(formula): 21 formula = formula.replace("++", "+") 22 formula = formula.replace("-+", "-") 23 formula = formula.replace("+-", "-") 24 formula = formula.replace("--", "+") 25 return formula 26 27 28 # 计算乘除运算 29 def count_mul_div(formula): 30 is_have_muldiv = re.search("\d+\.?\d*[*/]\-?\d+\.?\d*", formula) # 匹配含有*/运算的表达式 31 if is_have_muldiv: 32 bracketin_formula = is_have_muldiv.group() 33 x, y = re.split("[*/]", bracketin_formula) # 以*或/分割得到两个数据 34 mul_or_div = re.search("[*/]", bracketin_formula).group() # 获取运算符 35 if mul_or_div == "*": 36 operation_result = float(x) * float(y) 37 else: 38 operation_result = float(x) / float(y) 39 operation_result = str(operation_result) 40 formula = formula.replace(bracketin_formula, operation_result) # 将乘除结果替换上面找到的乘除运算 41 return count_mul_div(formula) # 有*/,继续调用自己做乘除 42 else: 43 return count_add_sub(formula) # 没有*/,调用加减计算 44 45 46 # 计算加减运算 47 def count_add_sub(formula): 48 formula = repeat_operator(formula) 49 is_have_muldiv = re.search("\-?\d+\.?\d*[+\-]\d+\.?\d*", formula) # 匹配含有+-运算的表达式 50 if is_have_muldiv: 51 bracketin_formula = is_have_muldiv.group() 52 nums_list = re.findall("\-?\d+\.?\d*", bracketin_formula) # 匹配除+号外的数字 53 operation_result = reduce(lambda x, y: float(x) + float(y), nums_list) # reduce求和 54 operation_result = str(operation_result) 55 formula = formula.replace(bracketin_formula, operation_result) # 将加减结果替换上面找到的加减运算 56 return count_add_sub(formula) # 继续调用自己做加减运算 57 else: 58 formula = formula.strip("()") # 将运算结果外面()去掉 59 return formula # 没有+-,运算完成,返回运算结果 60 61 62 # 主逻辑 63 while True: 64 formula = re.sub(" +", "", input("请输入数学表达式或按q退出:")) # 输入表达式,去除空格 65 result = None 66 if formula.lower() == "q": 67 break 68 else: 69 if check_formula(formula): # 判断表达式合法性 70 is_bracket_flag = True 71 while is_bracket_flag: 72 formula = repeat_operator(formula) # 去除重复运算符 73 bracket_bestin = re.search("\([^()]*\)", formula) # 找最内层括号 74 if bracket_bestin: 75 bracket_bestin = bracket_bestin.group() 76 result = count_mul_div(bracket_bestin) # 调用乘除计算 77 formula = formula.replace(bracket_bestin, result) # 替换原表达式的内层括号 78 else: 79 is_bracket_flag = False # 找不到括号 80 result = count_mul_div(formula) # 调用乘除计算 81 else: 82 print("输入表达式有误!") 83 if result: 84 print(result)