python开发计算器

1 业务需求

1.1 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致。

2 业务逻辑

2.1 首先获取用户输入,处理非法字符,处理空格

2.2 匹配括号,找到括号内部计算公式

2.3 先计算乘除,再计算加减

2.4 最后返回结果与eval()相互比较

3 代码实现

  1 import re
  2 
  3 
  4 def calculator(formula_1):
  5     '''
  6     此函数为主函数
  7     :param formula: 传入的是不规则公式字符串
  8     :return:
  9     '''
 10     print(formula_1)
 11     expression = ''
 12     for s in formula_1:  # 去除空格
 13         if s == ' ':
 14             continue
 15         expression = expression + s
 16     while True:  # 寻找括号
 17         is_match = re.search('\([^()]+\)', expression)
 18         if is_match:
 19             match_result = is_match.group()
 20             content = match_result[1:-1]
 21             result = judge(formula_2=content)  # 调用函数
 22             expression = expression.replace(match_result,result[0])
 23         else:  # b如果匹配为空,即没有括号
 24             result = judge(formula_2=expression)
 25             return result[0]
 26 
 27 
 28 def judge(formula_2):
 29     '''
 30     此函数是先调用乘除
 31     :param formula_2: 取出括号的字符串类型
 32     :return: 返回计算乘除后的字符串
 33     '''
 34     num_list = re.split('[*/+-]', formula_2)
 35     operator_list = re.findall('[*/+-]', formula_2)
 36     for k, i in enumerate(num_list):
 37         if len(i) == 0:
 38             num_list[k+1] = operator_list[k] + num_list[k+1]  #
 39             del num_list[k]
 40             del operator_list[k]
 41     result = mul_div(formula_3=num_list, yunsuanfu=operator_list)
 42     return result
 43 
 44 
 45 def mul_div(formula_3, yunsuanfu):
 46     '''
 47     此函数计算乘除
 48     :param formula_3: 数字列表
 49     :param yunsuanfu: 符号列表
 50     :return: 计算结果
 51     '''
 52     flag = True
 53     while flag:
 54         for num, mark in enumerate(yunsuanfu):
 55             if mark == "*" or mark == '/':
 56                 if mark == "*":
 57                     b = float(formula_3[num]) * float(formula_3[num+1])
 58                     formula_3[num] = str(b)
 59                     del formula_3[num+1]
 60                     del yunsuanfu[num]
 61                     break
 62                 else:
 63                     b = float(formula_3[num])/float(formula_3[num+1])
 64                     formula_3[num] = str(b)
 65                     del formula_3[num+1]
 66                     del yunsuanfu[num]
 67                     break
 68         else:
 69             flag = False
 70             if len(yunsuanfu) == 0:
 71                 return formula_3
 72             else:
 73                 result = add_sub(formula_4=formula_3, yunsuanfu_2=yunsuanfu)
 74                 return result
 75 
 76 
 77 def add_sub(formula_4, yunsuanfu_2):
 78     '''
 79     此函数计算加减
 80     :param formula_4: 数字列表
 81     :param yunsuanfu_2: 符号列表
 82     :return: 计算结果
 83     '''
 84     flag = True
 85     while flag:
 86         for num, mark in enumerate(yunsuanfu_2):
 87             if mark == '+' or mark == '-':
 88                 if mark == '+':
 89                     b = float(formula_4[num]) + float(formula_4[num+1])
 90                     formula_4[num] = str(b)
 91                     del formula_4[num+1]
 92                     del yunsuanfu_2[num]
 93                     break
 94                 else:
 95                     b = float(formula_4[num]) - float(formula_4[num + 1])
 96                     formula_4[num] = str(b)
 97                     del formula_4[num + 1]
 98                     del yunsuanfu_2[num]
 99                     break
100         else:  # 使用break不执行此表达式
101             flag = False
102             return formula_4
103 
104 string = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) "
105 result = calculator(string)
106 print(result)
107 print('-----------------')
108 print(eval(string))
View Code

4 思路来源

http://www.cnblogs.com/WuYongQi/p/5520592.html

posted on 2018-04-11 15:36  Artisan正传  阅读(278)  评论(0编辑  收藏  举报