此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148
具体实现功能如下:
功能1:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。(+10)
功能2:在功能1的基础上,支持括号。(+15)
功能3:限定题目数量,“精美”打印输出,且要避免重复,最好能输出到.txt文件中。且对输入题目数进行限定,题目数量必须是正整数。(+10)
功能4:支持分数出题和运算。(不完成此题不倒扣分数)
功能5:可把程序改成GUI版/web版/移植为android,ios版。
此次作业完成是以“结对编程”的形式完成,我的伙伴是刘欣,她的博客地址为:http://www.cnblogs.com/liu-xin1995/
本次编程采用面向过程的方法,先生成算式,然后将算式转为逆波兰表达式,再计算逆波兰表达式的值即为生成的算式的值。
功能1、2运行截图:
……
功能3运行截图:
最后一条命令在根目录下生成文件result.txt,文件内容截图如下:
功能4对分数进行计算暂未能实现。
代码分析:
功能实现过程中,重要的是利用栈实现逆波兰和计算逆波兰的过程,重要代码片段如下:
1 class PyStack(object): #自定义栈 2 3 def __init__(self, initSize = 20, incSize = 10): 4 self.initSize = incSize 5 self.incSize = incSize 6 self.stackList = [] 7 self.top = self.bottom = 0 8 9 def push(self, ele): 10 if self.top-self.bottom >= self.initSize: 11 self.incSize += self.initSize 12 self.stackList.append(ele) 13 self.top += 1 14 15 def pop(self): 16 if self.top-self.bottom > 0: 17 self.top -= 1 18 ret = self.stackList.pop() 19 return ret 20 else: 21 return None 22 23 def len(self): 24 return self.top-self.bottom
1 def reverse_polish(equation): 2 result = [] 3 c = [] 4 slist = [i for i in equation] 5 6 for item in slist: 7 if item in range(0, 100): 8 result.append(item) 9 elif not c and item in cal.keys(): 10 c.append(item) 11 continue 12 elif c and item in cal.keys(): 13 for x in range(c.__len__()): 14 z = c[-1] 15 temp = cal[z] if z in cal else cal1[z] 16 if temp >= cal[item]: 17 result.append(c.pop()) 18 else: 19 c.append(item) 20 break 21 if not c: 22 c.append(item) 23 elif item is ")": 24 for x in range(c.__len__()): 25 if c[-1] == "(": 26 c.pop() 27 break 28 else: 29 result.append(c.pop()) 30 elif item is "(": 31 c.append(item) 32 # print(result,c) 33 for x in range(c.__len__()): 34 result.append(c.pop()) 35 return result
1 def calculate(re_equation): 2 stack = PyStack() 3 sumEnd = 0 4 5 if len(re_equation) is 0: 6 return sumEnd 7 for i in re_equation: 8 if i in range(0, 100): 9 stack.push(float(i)) 10 elif '+' is i: 11 a = stack.pop() 12 b = stack.pop() 13 stack.push(b + a) 14 elif '-' is i: 15 a = stack.pop() 16 b = stack.pop() 17 stack.push(b - a) 18 elif '*' is i: 19 a = stack.pop() 20 b = stack.pop() 21 stack.push(b * a) 22 elif '÷' is i: 23 a = stack.pop() 24 b = stack.pop() 25 if a == 0: 26 return False #print('%d/%d分子不能为0' % (b, a)) 27 else: 28 stack.push(b / a) 29 return stack.pop()
结对感想:
本次结对,整体来说是很和谐的。在函数的数量和设计上有过很深刻的讨论,但总体意见是一致的。
在制定代码规范时,我们参考了python书写的基本的一些规范,编写代码的过程中相互监督,基本上能做到及时提醒及时改正。
通过本次编程,更深刻的感受到了python语言的强大。其中栈的实现是借用了别人写的模块,然后处理了一下接口就很顺利的完成了后续对栈的应用。
对生成的算式处理的过程中,我们又重拾了对逆波兰的认识,忍不住感慨:啊原来逆波兰是后缀表达式来着。
两个人编程,一个编写代码,一个领航,很好的弥补了自己个人编程时编着编着就迷糊脑子乱掉的弊端,可以相互提醒,弥补对方没想到的东西,两个人考虑问题的完整性总归是比一个人要好的,可以更好地保证代码的质量。而且遇到问题,两个人一起想办法解决的感觉是很好的,可以有更多的思路或更快的找到解决方法。
照片(地点:宿舍):