如何用python編寫可以使用cmd控制檯傳入參數的簡單四則算式計算器

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)
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.定義單元算法處理乘除法: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)  
View Code

 

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))
View Code

 程序運行結果:

 

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)
須要帶入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分|修改。 

相關文章
相關標籤/搜索