欢迎来到ST小哥的博客

如何用python编写可使用cmd控制台传入参数的简单四则算式计算器

一、项目码云地址是:https://gitee.com/Steven_me/personal_project41656

 

二、PSP预计表:

 

 

三、简单的程序流程图: 

 

四、下面附上程序部分运行代码样式仅限参考(课题结束|关键函数|已经找回)

1.定义去除括号和返回运算值部分:

 

 1 def quchu(string):
 2   while 1:
 3     ret = re.search(r'\([^(]*?\)',string) 
 4     if ret:
 5       re_string = ret.group() 
 6       re_sj = suanfa(re_string.strip('()')) 
 7       string = string.replace(re_string,str(re_sj))
 8       continue
 9     break
10   re_sj = suanfa(string)
11   return float(re_sj)
View Code

 

 

2.定义主要算法部分,算法部分优先处理乘除法,如果条件不满足就算加减法(使用正则运算优化):

 1 def suanfa(re_string):
 2   while 1:
 3     ret = re.search(r'\d+\.*?\d*[*/]\-?\d+\.?\d*', re_string)
 4     if ret: 
 5       chengchu_string = ret.group() 
 6       res = chengchu(chengchu_string) 
 7       re_string = re_string.replace(chengchu_string, str(res)) 
 8       re_string =chulifuhao(re_string) 
 9       continue
10     break
11   num = re.findall(r'[+-]?\d+\.?\d*', re_string)
12   if len(num) > 1:
13     my_num = 0
14     for i in num:
15       my_num += float(i)
16     return my_num
17   else:
18     return num[0]
View Code

 

3.定义单元算法处理乘除法:

1 def chengchu(string):
2   if '*' in string:
3     x,y = string.split('*')
4     return float(x)*float(y) 
5   if '/' in string:
6     x, y = string.split('/')
7     return float(x)/float(y)  
View Code

 

4.定义最后的处理符号:

 

 

因为需要满足cmd传参,而命令行的第0未是为文件路径,所以算式在第1位,最后使用sys.argv[1]方法进行命令行传参,计算器支持带括号的混合运算,程序的实际运行结果:

 

 

五、开发小结

 

遇到的困难:

1.前期版本的算法部分代码未经过正则运算优化导致臃肿,缓慢,甚至出错,不得已重构。。。。

2.需求分析出错,本来以为不用eval()可以很快写出来,没想到真的是有点想的太简单了。。。

3.没有做出正确的代码功能,导致在写代码的时候实现了“负优化”。。。

4.python的eval()函数真的好用!

 

得到的收获:

1.学习到了正则运算的好处,掌握并运用。

2.python真的是一门比较好用的编程语言,虽然它现在对数组类型规范的很严格。

3.python的eval()函数真的不错!

 

附上传说中的用eval()函数写的代码(仅供参考):

1 import sys
2 re = sys.argv[1]
3 print (eval(re))
View Code

 程序运行结果:

 

六、单元测试:

 

单元通过的结果:python程序因为使用过正则运算简化过,结果使用float进行转换,可以保留到小数点的后一位,可以转换符号,任意加减乘除都可以,下面是单元测试结果:

 

 

单元未通过的结果:因为最后输出的是float值,所以当有string值,就会报错。

 

 

七、最后的PSP表:

 

 

附录 :

1.1 完整的计算器代码 python3.0+

 1 import sys,re
 2 def quchu(string):
 3   while 1:
 4     ret = re.search(r'\([^(]*?\)',string) 
 5     if ret:
 6       re_string = ret.group() 
 7       re_sj = suanfa(re_string.strip('()')) 
 8       string = string.replace(re_string,str(re_sj))
 9       continue
10     break
11   re_sj = suanfa(string)
12   return float(re_sj)
13 def suanfa(re_string):
14   while 1:
15     ret = re.search(r'\d+\.*?\d*[*/]\-?\d+\.?\d*', re_string)
16     if ret: 
17       chengchu_string = ret.group() 
18       res = chengchu(chengchu_string) 
19       re_string = re_string.replace(chengchu_string, str(res)) 
20       re_string =chulifuhao(re_string) 
21       continue
22     break
23   num = re.findall(r'[+-]?\d+\.?\d*', re_string)
24   if len(num) > 1:
25     my_num = 0
26     for i in num:
27       my_num += float(i)
28     return my_num
29   else:
30     return num[0]
31 def chengchu(string):
32   if '*' in string:
33     x,y = string.split('*')
34     return float(x)*float(y) 
35   if '/' in string:
36     x, y = string.split('/')
37     return float(x)/float(y)  
38 def chulifuhao(string):
39   if '--' in string:
40     string = string.replace('--','+')
41   if '++' in string:
42     string = string.replace('++','+')
43   if '+-' in string:
44     string = string.replace('+-','-')
45   if '-+' in string:
46     string = string.replace('-+','-')
47   return string
48     
49 if __name__ == "__main__":
50   kscmd = sys.argv[1]
51   star_n = kscmd.replace(' ', '')
52   rets = quchu(star_n) 
53   print("运算的最后结果为%s"%rets)
需要带入cmd中打开

 

 1 import sys,re
 2 def quchu(string):
 3   while 1:
 4     ret = re.search(r'\([^(]*?\)',string) 
 5     if ret:
 6       re_string = ret.group() 
 7       re_sj = suanfa(re_string.strip('()')) 
 8       string = string.replace(re_string,str(re_sj))
 9       continue
10     break
11   re_sj = suanfa(string)
12   return float(re_sj)
13 def suanfa(re_string):
14   while 1:
15     ret = re.search(r'\d+\.*?\d*[*/]\-?\d+\.?\d*', re_string)
16     if ret: 
17       chengchu_string = ret.group() 
18       res = chengchu(chengchu_string) 
19       re_string = re_string.replace(chengchu_string, str(res)) 
20       re_string =chulifuhao(re_string) 
21       continue
22     break
23   num = re.findall(r'[+-]?\d+\.?\d*', re_string)
24   if len(num) > 1:
25     my_num = 0
26     for i in num:
27       my_num += float(i)
28     return my_num
29   else:
30     return num[0]
31 def chengchu(string):
32   if '*' in string:
33     x,y = string.split('*')
34     return float(x)*float(y) 
35   if '/' in string:
36     x, y = string.split('/')
37     return float(x)/float(y)  
38 def chulifuhao(string):
39   if '--' in string:
40     string = string.replace('--','+')
41   if '++' in string:
42     string = string.replace('++','+')
43   if '+-' in string:
44     string = string.replace('+-','-')
45   if '-+' in string:
46     string = string.replace('-+','-')
47   return string
48     
49 if __name__ == "__main__":
50   print ("=================欢迎使用计算器,计算器初始化中。。。===================")
51   kscmd = input('请输入算式值!\n 输入:')
52   star_n = kscmd.replace(' ', '')
53   rets = quchu(star_n) 
54   print("运算的最后结果为: %s"%rets)
无需cmd打开版本

1.2测试代码

 1 from calculate import *
 2 import unittest
 3 class Test_jsq(unittest.TestCase):
 4     def test_jiajian(self):
 5         jj=quchu("95+5")
 6         self.assertEqual(jj,100.0)
 7     def test_jianfa(self):
 8         jj=quchu("88-5")
 9         self.assertEqual(jj,83)
10     def test_chengfa(self):
11         jj=quchu("3*5")
12         self.assertEqual(jj,15.0)
13     def test_chufa(self):
14         jj=quchu("3/2")
15         self.assertEqual(jj,'1.5')
16 if __name__ == "__main__":
17     unittest.main()
unittest 测试代码

本文于|2018年11月09日|23点01分|修改。 

 

posted @ 2018-11-08 20:30  Steven_Tim  阅读(2587)  评论(0编辑  收藏  举报