1. 程式人生 > >第二次課後作業

第二次課後作業

後綴表達式 組織 alt 處理 存在 stat 判斷 handle hand

一、碼雲項目地址

  https://gitee.com/LaoXianYuGuJiaMing/personal_project41656

二、PSP表格

  技術分享圖片

三、從零開始的問題

  剛拿到問題時我是一臉問號的,和上學期python課上講的不同,這次的計算器獲取的表達式是正正經經的一條長字符串,那麽之前的那種通過按鍵來計算的思路只能統統推倒,還好老師在作業要求裏留了相關知識的博客,通過學習,也算能勉強寫出個簡單的計算器,下面細就說一下本人從學習到最終完成程序的方方面面。

  在經過一段學習之後,回來再閱讀題目,我大概得到了這樣的一套程序流程:

     技術分享圖片

四、程序的設計

  有了思路,那麽久開始程序設計。

   1.能支持稍微復雜的混合四則運算(一個或一個以上運算符,有括號)。

   2.代碼組織:

      lib.py: 包含核心計算方法與異常處理工具方法。

      main.py: 通過對lib.py文件內的方法進行調用以完成計算。

   3.關鍵功能代碼:

中綴轉後綴      

#中綴表達式轉換為逆波蘭表達式
def nifixToPostfix(expression):
    result = []
    stack = []
    for item in expression:
        if item.isnumeric():
            result.append(item)
        
else: if len(stack) == 0: stack.append(item) elif item in */(: stack.append(item) elif item == ): t = stack.pop() while t != (: result.append(t) t
= stack.pop() # 如果當前字符為加減且棧頂為乘除,則開始彈出 elif item in +- and stack[len(stack) - 1] in */: if stack.count(() == 0: while stack: result.append(stack.pop()) else: t = stack.pop() while t != (: result.append(t) t = stack.pop() stack.append(() stack.append(item) else: stack.append(item) while stack: result.append(stack.pop()) return "".join(result)

計算後綴表達式

 1 # 後綴表達式求值
 2 def expression_to_value(expression):
 3     stack_value = []
 4     try:
 5         for item in expression:
 6             if item in [+, -, *, /]:
 7                 n2 = stack_value.pop()
 8                 n1 = stack_value.pop()
 9                 result = cal(n1, n2, item)
10                 stack_value.append(result)
11             else:
12                 stack_value.append(int(item))
13         return [True, stack_value[0]]
14     except BaseException:
15         return [False,"表達式存在非法字符或這非法字符位置"]
16 
17 
18 
19 # 四則運算通用方法
20 def cal(n1, n2, op):
21     if op == +:
22         return n1 + n2
23     if op == -:
24         return n1 - n2
25     if op == *:
26         return n1 * n2
27     if op == /:
28         return n1 / n2

程序主體與結果的輸出

 1 # 程序主方法
 2 def main(argv):
 3 
 4     # 獲取參數
 5     value = lib.getValueByComment(argv)
 6 
 7     #### 參數處理 ####
 8     status = lib.formulaHandle(value)
 9 
10     # 表達式無異常
11     if status["status"] == True:
12 
13         # 開始計算
14         value = lib.matchComment(value)
15 
16         # 填充數據對象(kv對)
17         if value[0] == True:
18             status["info"] = "計算成功" if value != "" else {}
19             status["value"] = value[1]
20         else:
21             status["info"] = "計算失敗" if value != "" else {}
22             status["value"] = "無值"
23 
24         return status
25     else:
26         return status
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 if __name__ == __main__:
37     dic = main(sys.argv[1:])
38     # 打印數據
39     print "Info: "+lib.strChange(dic["info"])+"!\n"+"value: "+lib.strChange(str(dic["value"]))

五、遇到的困難

  一開始最大的困難就是中綴表達式入棧的問題了,不過在閱讀了大偉老師提供的資料和反復嘗試之後終於解決了問題,之後就是一些對於異常的的判斷,不過好歹做出來了。

  以上。

第二次課後作業