此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245]
要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数)。
(1) 给出每个功能的重点、难点、编程收获。
结对编程伙伴:季嘉
开发环境:windows 10(全程使用季嘉同学笔记本开发)
开发工具:pycharm
版本控制:Git
coding:https://e.coding.net/a123098/test4/py.git
国庆节你去探望初中数学老师,她感叹你当年真是个优秀学生啊,从来不报怨作业多,然后关切地问,“你现在学啥呢?”你说学计算机呢,她要求你举个例子证明你学的知识有用。你的回答她一直不懂。
你回家后连夜编了个程序,展示你的水平。程序准备帮助她给初中生出四则运算题目,学生答题后,自动判断对错。你第二天去找老师献宝。
功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。
你在老师面前作如下表演 (数字你用excel验算过了,UI的卖萌部分你还没有想好) 。
完成这个功能,老师对你的信任值+10.
主要代码
1 #coding=utf-8 2 from random import randint as r 3 from fractions import Fraction as f 4 import argparse 5 def creat_formula(): #功能四生成随机式子 6 ops = ['+', '-', '*', '/'] 7 n1 = r(1, 9) #产生随机数 8 n2 = r(1, 9) 9 n3 = r(1, 9) 10 n4 = r(1,9) 11 o1 = r(0, 2) 12 o2 = r(0, 3) 13 o3 = r(0, 3) 14 dic = { 15 0: '(' + str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ')' + ')' + ops[o3] + str(n4), 16 1: '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + str(n3) + ops[o3] + str(n4), 17 2: str(n1) + ops[o1] + str(n2) + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')', 18 3: str(n1) + ops[o1] + '(' + '(' + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4) + ')', 19 4: '(' + '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), 20 5: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')' + ')', 21 6: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ops[o3] + str(n4) + ')', 22 7: '(' + str(n1) + ops[o1] + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), 23 8: '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')', 24 9: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), } 25 test = r(0, 9) 26 eqa = dic[test] 27 return (eqa) 28 def _count(equa): 29 result = f(eval(equa)).limit_denominator(1000) #利用eval函数计算式子的值,并将小数转化为分数 30 result = str(result) 31 return(result) 32 def _equations(): #功能一生成随机式子 33 ops = ['+', '-', '*', '/'] 34 n1 = r(1, 9) #产生随机数 35 n2 = r(1, 9) 36 n3 = r(1, 9) 37 n4 = r(1, 9) 38 o1 = r(0, 2) 39 o2 = r(0, 3) 40 o3 = r(0, 3) 41 equa = str(n1) + ops[o1] + str(n2) + 42 ops[o2] + str(n3) + 43 ops[o3] + str(n4) 44 return (equa) 45 def _input(): #控制输入 46 num = 0 47 n = 0 48 for i in range(20): #循环20道题 49 eqa = _equations() 50 print(eqa, "=") 51 result_right = _count(eqa) # 52 answer = input("?") #接收输入的数 53 if answer == result_right: 54 print("答对了,你真是个天才!") 55 num = num + 1 56 else: 57 print("再想想吧,答案似乎是", result_right, "喔!") 58 n = n + 1 59 print("你一共答对", num, "道题,一共20道题。") 60 def function_four(x): 61 try: 62 x = int(x) 63 if x >= 0: 64 for i in range(x): 65 result_right = creat_formula() 66 _right = _count(result_right) 67 result_right = result_right + "=" 68 print(result_right.ljust(40), _right) 69 else: 70 print('题目的数量必须是 正整数') 71 except: 72 print('题目的数量必须是 正整数') 73 return (0) 74 if __name__ == "__main__": 75 parser = argparse.ArgumentParser() 76 parser.add_argument("-c", "--cin") 77 args = parser.parse_args() 78 if args.cin == None: 79 _input() # 功能一入口 80 else: 81 function_four(args.cin) # 功能四入口
运行截图
重难点:由于我是第一次使用Python,对其所具有的函数及其功能都还不是很了解,所以做作业的过程中eval()函数的使用并没有想到,而季嘉同学对python来说比较熟悉,多亏了她,我们才能顺利完成这个作业。而且,在编程的过程中,我们对产生随机数的功能也不了解,又去补充了相关的概念功能,这才慢慢一步步的完成了随机运算式的生成。在结对编程的过程中,季嘉同学提出来了许多我所不知道的方法功能,真的让我受益匪浅。
功能2. 支持括号
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"
你拿出笔记本,偷偷微信你们《构建之法》班的学霸,她说肯定能行,但是细节信号不好你听不清,只捕捉到隐约几个词"逆波兰""后缀表达式""堆栈""我看好你""数据结构"。
两小时后,在老师面前你在控制台下输入f4,然后回车。
完成这个功能,老师对你的信任值+15.
主要代码主要由两部分构成
def _formula(): # 生成随机式子 ops = ['+', '-', '*', '/'] n1 = r(1, 9) # 产生随机数 n2 = r(1, 9) n3 = r(1, 9) n4 = r(1, 9) o1 = r(0, 2) o2 = r(0, 3) o3 = r(0, 3) dic = { 0: '(' + str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ')' + ')' + ops[o3] + str(n4), 1: '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + str(n3) + ops[o3] + str(n4), 2: str(n1) + ops[o1] + str(n2) + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')', 3: str(n1) + ops[o1] + '(' + '(' + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4) + ')', 4: '(' + '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), 5: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')' + ')', 6: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ops[o3] + str(n4) + ')', 7: '(' + str(n1) + ops[o1] + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), 8: '(' + str(n1) + ops[o1] + str(n2) + ')' + ops[o2] + '(' + str(n3) + ops[o3] + str(n4) + ')', 9: str(n1) + ops[o1] + '(' + str(n2) + ops[o2] + str(n3) + ')' + ops[o3] + str(n4), } test = r(0, 9) eqa = dic[test] return (eqa)
这一段代码的重点就是随机生成运算式,使用python语言开发真的比其他语言边便捷很多。
def out_input(): #控制输入 num = 0 n = 0 for i in range(20): #循环20道题 eqa = _formula() print(eqa, "=") result_right = run_count(eqa) # answer = input("?") #接收输入的数 if answer == result_right: print("答对了,你真是个天才!") num = num + 1 else: print("再想想吧,答案似乎是", result_right, "喔!") n = n + 1 print("你一共答对", num, "道题,一共20道题。")
运行截图
功能二的重点在于为表达式添加括号
难点在于如何随机生成一个表达式然后判断回答的值是否正确
功能3. 限定题目数量,"精美"打印输出,避免重复
"就这点儿题,像你当年做得那么快,一会儿就完成啦!"老师说,"另外,我想打印出来,上课也不能带台机器。又另外,你把答案也打出来呗,我把答案剪掉,题目给学生做。"
一看需求这么多,你生怕她会说,"这都是很简单的功能,你一定能完成吧"。你知道如果承诺今晚,明早交工的时候她一定想出了更多可怕的需求,你赶紧说,"老师我现在就做。"
你忘记怎么调用打印机了,就把答案与题目横向对齐,输出在文件的右边。告诉老师txt文件可以用WORD打开,也能打印。她满意而意味深长地笑了,表示同意。
你输入命令执行的时候,脑袋比手指头还疼。
你指着屏幕对老师说,">"是提示符,实际运行时可能是"C:UsersYoung>","f4"是程序的名字,它真正的名字是"f4.exe","-c 3"是命令行参数。按下回车,此时程序开始执行。"-c"这个参数后面输入多少,就生成多少题目。老师输入
老师欣慰的笑了。你怔怔地看着她,心下怀疑她真的是教初中数学的那位么。
老师在你的指导下试用了一下,打印出来的题目堪称精美。老师让你做一次试试看能得多少分。你不敢借口四则运算忘光了,只好提起笑来开始答。刚做一半,你发现有几道题目是相同的,心中暗骂随机数不靠谱。又有几道虽然不完全相同,但是可以通过交换律、结合律、分配律变换为同一道题。比如
你暗叫惭愧,说有个小错误修正一下,调试了半晌,终于解决。
完成此功能,老师对你的信任值+10.
主要代码
def input_count(n): try: n = int(n) if n >= 0: data = open("result.txt", 'w+') for i in range(n): eqa = _formula() result_right = run_count(eqa) eqa = eqa + "=" print(eqa.ljust(40), result_right,file=data) data.close() else: print('题目的数量必须是 正整数') except: print('题目的数量必须是 正整数') return(0)
运行截图
此功能的重点为如何对题目的数目进行限定然后按照老师要求的格式输出。
难点:python ljust()方法的使用
经过这次作业,我明显的意识到了自己编程能力的不足,季嘉同学一直在为我讲解编程过程中代码函数的功能,而且自己的基础知识也需要提升。
功能5 未来
还有可能把程序改造成GUI版,把程序改造为web版,把程序移植为android/ios版。今天留好接口,明天就不发愁。 (0分)
要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)
1.每个功能的重点、难点、编程收获已经在每部分功能后面给出
2.结对编程的体会
(1)此次结对编程任务需要和伙伴对意见不一致的地方进行沟通协商,然后两人共同选取最佳方案,极大的考验了我们的沟通决策能力。
(2)此次结对编程对任务进行时间的协商也非常重要,它需要综合我们每个人的不同生活习惯及个人原定学习计划。
(3)结对编程任务分配也需要考虑到每个人的能力,合理分配才能取得预期结果。
3.在编码、争论、复审等活动中花费时间较长,给我收获较大的事情有:
(1)结对任务非常考验学生的责任感。我一开始对本作业的重视程度远不如季嘉同学,导致在整体进度上拖了后腿。但非常幸运的是,季嘉同学明确的为我指出来,在这里非常感谢季嘉同学的认真负责的指正,在这次组队编程任务中我真的受益匪浅,也认识到了自己态度上的欠缺。
(2)对编程语言的选取。
(3)如何随机生成运算式
(4)对实现代码的整体规划以及对不了解的知识的扩充。
(5)如何实现打印功能
要求2 给出结对开发的截图证据,要求截图能够证明你们是在结对编程。 (5分)
要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)