Python开发之【简单计算器】

开发一个简单的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、+、-、*、/不能重复

    二、考虑优先级,先算()内部,再算*/,最后算+-

 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)
代码

 

转载于:https://www.cnblogs.com/heilongorz/p/6186634.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值