此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631
git链接:https://e.coding.net/kangzhe/size.git
结对伙伴:付宇泽
功能1与功能2. 四则运算、支持括号
功能一题目:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。
你在老师面前作如下表演 (数字你用excel验算过了,UI的卖萌部分你还没有想好) 。
功能二题目:
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"
你拿出笔记本,偷偷微信你们《构建之法》班的学霸,她说肯定能行,但是细节信号不好你听不清,只捕捉到隐约几个词"逆波兰""后缀表达式""堆栈""我看好你""数据结构"。
两小时后,在老师面前你在控制台下输入f4,然后回车。
功能一、二重点和难点:
重点:功能一和二的基本运行规则相似,所以放在一起说,首先在生成随机的题目之前需要定义好加减乘数的优先级,其次就是需要设立一个栈,为中缀表达式转后缀表达式做准备,然后的重点就是计算后缀表达式的这一步,需要判断表达式中的括号,如果有括号,需要先计算括号内的公式,然后才能继续计算后缀表达式。
难点:如何生成随机的表达式,还有在后面的计算后缀表达式都是难点。
收获:在编写这两个功能前,我查阅了很多类似CSDN这样的网站,学会了如何用python语言创建一栈,运用random类随机生成一个表达式。
运行代码如下:
def function1(): right = 0 i = 0 while i in range(20): i = i + 1 equation = create_formula() re_equation = reverse_polish(equation) result = calculate(re_equation) answer0 = result if result is False or result is None or len(str(result)) > 12: i = i - 1 continue str_equation = " ".join('%s' % id for id in equation) print(str_equation + "=") print("?", end="") answer = float(input()) if abs(result - int(result)) < 1.0e-16: result = int(result) if answer == answer0: print("答对啦,你真是个天才!") right = right + 1 else: print("再想想吧,答案似乎是" + repr(result) + "喔!") print("你一共答对" + repr(right) + "道题,共20道题。")
运行效果如下:
功能3. 限定题目数量,"精美"打印输出,避免重复
"就这点儿题,像你当年做得那么快,一会儿就完成啦!"老师说,"另外,我想打印出来,上课也不能带台机器。又另外,你把答案也打出来呗,我把答案剪掉,题目给学生做。"
一看需求这么多,你生怕她会说,"这都是很简单的功能,你一定能完成吧"。你知道如果承诺今晚,明早交工的时候她一定想出了更多可怕的需求,你赶紧说,"老师我现在就做。"
你忘记怎么调用打印机了,就把答案与题目横向对齐,输出在文件的右边。告诉老师txt文件可以用WORD打开,也能打印。她满意而意味深长地笑了,表示同意。
你输入命令执行的时候,脑袋比手指头还疼。
功能三重点和难点:
重点:功能三的重点是如何在命令行读取命令行参数,同时还要判断所生成的题目的数量是否符合要求,对于小数和负数都输需要输出提示语句的,其次就是需要将生成的表达式写入到本地的txt文件中。
难点:怎么样将生成的表达式写入到本地的文件中是一个难点。
收获:通过查阅相关的网站等,学会了如何使用python语言生成一个文本文件,并且使用with open()将生成的随机公式写入到本地文件当中。
运行代码如下:
ef function3(n): n = int(n) i = 0 while i in range(n): i = i+1 equation = create_formula() re_equation = reverse_polish(equation) result = calculate(re_equation) if result is False or result is None or len(str(result)) > 12: i = i-1 continue if i is 1: if os.path.exists('result.txt'): os.remove('result.txt') write_file(equation, result)
运行效果如下:
结对编程的体会:通过此次结对编程我和付宇泽认识到了自己专业知识的不足,对于python的一些方法和类库还是不太熟悉,在编码的过程中我们都是在边写代码边查资料,而且对于自己敲代码的速度也不敢恭维,太慢了,觉得我们以后还是得多练习一下敲代码的速度。同时,我也认识到了多一个人编程的重要性,首先旁边的同学可以在看你编程的时候给你指出来一些编程上的缺陷,其次在遇到一个难点时不只是去自己查资料,还可以两个人一起讨论,集思广益。
讨论时间较长的功能及收获:讨论时间较长的功能包括上述的功能一二三的所讨论的重点和难点,但是最大的收获就是对于括号到底是怎么样生成,用什么方法生成进行了讨论,主要是两种,一种就是用random生成,一种就是用枚举生成,思前想后还是决定用随机类生成,枚举没有太了解,可能会浪费很多时间而得不到正确的解决方法。
工作环境:冬华B521
编程采用康哲的电脑