此作业的要求参见:
具体实现功能如下:
功能1:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。(+10)
功能2:在功能1的基础上,支持括号。(+15)
功能3:限定题目数量,“精美”打印输出,且要避免重复,最好能输出到.txt文件中。且对输入题目数进行限定,题目数量必须是正整数。(+10)
功能4:支持分数出题和运算。(不完成此题不倒扣分数)
功能5:可把程序改成GUI版/web版/移植为android,ios版。
此次作业完成是以“结对编程”的形式完成,我的伙伴是刘欣,她的博客地址为:
本次编程采用面向过程的方法,先生成算式,然后将算式转为逆波兰表达式,再计算逆波兰表达式的值即为生成的算式的值。
功能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.initSize12 self.stackList.append(ele)13 self.top += 114 15 def pop(self):16 if self.top-self.bottom > 0:17 self.top -= 118 ret = self.stackList.pop()19 return ret20 else:21 return None22 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 continue12 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 break21 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 break28 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语言的强大。其中栈的实现是借用了别人写的模块,然后处理了一下接口就很顺利的完成了后续对栈的应用。
对生成的算式处理的过程中,我们又重拾了对逆波兰的认识,忍不住感慨:啊原来逆波兰是后缀表达式来着。
两个人编程,一个编写代码,一个领航,很好的弥补了自己个人编程时编着编着就迷糊脑子乱掉的弊端,可以相互提醒,弥补对方没想到的东西,两个人考虑问题的完整性总归是比一个人要好的,可以更好地保证代码的质量。而且遇到问题,两个人一起想办法解决的感觉是很好的,可以有更多的思路或更快的找到解决方法。
照片(地点:宿舍):