1. 程式人生 > >如何用python編寫可使用cmd控制檯傳入引數的簡單四則算式計算器

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

一、專案碼雲地址是:https://gitee.com/Steven_me/personal_project41656

 

二、PSP預計表:

 

 

三、簡單的程式流程圖: 

 

四、下面附上程式部分執行程式碼樣式僅限參考(關鍵函式已將重要引數缺失或替換掉)

1.定義去除括號和返回運算值部分:

 1 def quchu(**):
 2   while 1:
 3     ** = re.search(r'\([^(]*?\)',**) 
 4     if **:
 5       re_string = **.group() 
6 re_sj = suanfa(re_string.strip('()')) 7 ** = **.replace(re_string,str(**)) 8 ** 9 break 10 re_sj = suanfa(string) 11 return float(**)
View Code

 

2.定義主要演算法部分,演算法部分優先處理乘除法,如果條件不滿足就算加減法(使用正則運算優化):

 1 def suanfa(**):
 2   while 1:
 3     ** = re.search(r'
\d+\.*?\d*[*/]\-?\d+\.?\d*', **) 4 if **: 5 chengchu_string = **.group(456) 6 **r = chengchu(chengchu_string) 7 re_string = re_string.replace(chengchu_string, str(r**)) 8 re_string =chulifuhao(re_string) 9 ** 10 break 11 **m = re.findall(r'[+-]?\d+\.?\d*
', **) 12 if len(num) > 1: 13 my*** = 0 14 for i in num: 15 my*** += float(i) 16 return my*** 17 else: 18 return ***[0]
View Code

 

3.定義單元演算法處理乘除法:

1 def chengchu(~~):
2   if '*' in ~/~:
3     ~,~ = ~*~.split('*')
4     return float(~)*float(~) 
5   if '/' in ~/~:
6     ~, ~ = ~*~.split('/')
7     return float(~)/float(~)  
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表: