第二次課後作業
阿新 • • 發佈:2018-11-09
後綴表達式 組織 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"]))
五、遇到的困難
一開始最大的困難就是中綴表達式入棧的問題了,不過在閱讀了大偉老師提供的資料和反復嘗試之後終於解決了問題,之後就是一些對於異常的的判斷,不過好歹做出來了。
以上。
第二次課後作業