一、码云项目地址
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"]))
五、遇到的困难
一开始最大的困难就是中缀表达式入栈的问题了,不过在阅读了大伟老师提供的资料和反复尝试之后终于解决了问题,之后就是一些对于异常的的判断,不过好歹做出来了。
以上。