计算器程序

2019-02-27 11:54:46来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

计算类似这样的表达式
1 - 2 *((6 0 - 3 0 +(-40/5)*(9-2*5/3 + 7/3*99/4*2998 +10 *568/14)) - (-4*3)/(16-3*2))

提示:
1.去空格
2.用正则匹配最简式子
3.计算结果去替换原式
4.while 循环
 1 import re
 2 
 3 #处理表达式 将+-替换成- --替换成+
 4 def dealwith(express):
 5     express = express.replace('+-','-')
 6     express = express.replace('--','+')
 7     return express
 8 #计算
 9 def cal_exp_son(exp_son):
10     #用来计算原子型表达式  两个数之间的乘除法
11     if '/' in exp_son:
12         a,b = exp_son.split('/')
13         return str(float(a)/float(b))
14     elif '*' in exp_son:
15         a,b = exp_son.split('*')
16         return str(float(a)*float(b))
17 
18 def cal_express_no_bracket(exp):
19     # 计算没有括号的表达式
20     # exp是没有经过处理的最内层带括号的表达式
21     while True:
22         exp = exp.strip('()')
23         #先乘除后加减
24         ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp)
25         if ret:
26             exp_son = ret.group()
27             ret = cal_exp_son(exp_son)
28             exp= exp.replace(exp_son,ret)
29             exp =dealwith(exp)
30         else:
31             ret =re.findall('-?\d+\.?\d*',exp)
32             sum=0
33             for i in ret:
34                 sum +=float(i)
35             return str(sum)
36 
37 def remove_bracket(new_express):
38 #提取括号里没有其他括号的表达式
39     while True:
40         ret = re.search('\([^()]+\)',new_express)
41         if ret:
42             express_no_bracket = ret.group()
43             print('匹配到内部不在有括号的值:',express_no_bracket)
44             ret = cal_express_no_bracket(express_no_bracket)
45             new_express = new_express.replace(express_no_bracket,ret)
46             new_express = dealwith(new_express)
47             print(new_express)
48         else:
49             print('表达式中已经没有括号了:',new_express)
50             ret = cal_express_no_bracket(new_express)
51             return ret
52 
53 express = '1 - 2 *((6 0 - 3 0  +(-40/5)*(9-2*5/3  + 7/3*99/4*2998 +10 *568/14)) - (-4*3)/(16-3*2))'
54 # 去空格
55 new_express = express.replace(' ','')
56 print(new_express)
57 ret = remove_bracket(new_express)
58 print(ret)
View Code

 


原文链接:https://www.cnblogs.com/Jeery/p/10444859.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:time模块

下一篇:Django的模板系统