如何用python编写可使用cmd控制台传入参数的简单四则算式计算器
分类:
IT文章
•
2022-05-16 10:04:11
一、项目码云地址是: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
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)