1、項目碼雲地址是:https://gitee.com/Steven_me/personal_project41656python
2、PSP預計表:git
3、簡單的程序流程圖: 算法
4、下面附上程序部分運行代碼樣式僅限參考(課題結束|關鍵函數|已經找回):編程
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.定義單元算法處理乘除法:ide
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]方法進行命令行傳參,計算器支持帶括號的混合運算,程序的實際運行結果:單元測試
5、開發小結學習
遇到的困難:
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))
程序運行結果:
6、單元測試:
單元經過的結果:python程序由於使用過正則運算簡化過,結果使用float進行轉換,能夠保留到小數點的後一位,能夠轉換符號,任意加減乘除均可以,下面是單元測試結果:
單元未經過的結果:由於最後輸出的是float值,因此當有string值,就會報錯。
7、最後的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分|修改。