如何用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)
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]
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)
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))
程序运行结果:
六、单元测试:
单元通过的结果: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)
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)
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()
本文于|2018年11月09日|23点01分|修改。