一、项目码云地址是: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分|修改。