20190919-6 四则运算试题生成
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631
Git地址:https://e.coding.net/sxy504/si_ze_yun_suan.git
结对队友:董亚辉
功能1. 四则运算
1.1功能描述
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。你在老师面前作如下表演 (数字你用excel验算过了,UI的卖萌部分你还没有想好) 。
1.2重难点
(1)如何随机产生计算符号,
(2)如何将式子进行拼凑,
(3)如何将产生的式子进行计算,
(4)如果计算结果产生的是小数如何转化为分数
1.3收获:
学习了eval函数给完成作业带来了很大的便捷。
1.4 代码片段:
def creat_equation(): #功能一生成随机式子 ops = ['+', '-', '*', '/'] num1 = r(1, 9) #产生随机数 num2 = r(1, 9) num3 = r(1, 9) num4 = r(1, 9) ops1 = r(0, 2) ops2 = r(0, 3) ops3 = r(0, 3) equa = str(num1) + ops[ops1] + str(num2) + \ ops[ops2] + str(num3) + \ ops[ops3] + str(num4) return (equa) def run_count(equa): #计算式子值函数 result = f(eval(equa)).limit_denominator(1000) #利用eval函数计算式子的值,并将小数转化为分数 result = str(result) return(result)
1.5 运行截图:
功能2. 支持括号
2.1 功能描述:
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"你拿出笔记本,偷偷微信你们《构建之法》班的学霸,她说肯定能行,但是细节信号不好你听不清,只捕捉到隐约几个词"逆波兰""后缀表达式""堆栈""我看好你""数据结构"。两小时后,在老师面前你在控制台下输入f4,然后回车。
2.2重难点:
1、如何划分括号的位置
2、式子的计算
2.3 收获:
利用字典解决问题。
2.4 代码片段:
def creat_equation(): #生成随机式子 ops = ['+', '-', '*', '/'] num1 = r(1, 9) #产生随机数 num2 = r(1, 9) num3 = r(1, 9) num4 = r(1, 9) ops1 = r(0, 3) ops2 = r(0, 3) ops3 = r(0, 3) #生成词典 dic = {1: '(' + str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ')' + ops[ops3] + str(num4), 2: '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + str(num3) + ops[ops3] + str(num4), 3: str(num1) + ops[ops1] + str(num2) + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')', 4: str(num1) + ops[ops1] + '(' + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4) + ')', 5: '(' + '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4), 6: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')' + ')', 7: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ops[ops3] + str(num4) + ')', 8: '(' + str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4), 9: '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')', 10: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4),} test = r(1, 10) eq = dic[test] return (eq) def run_count(eq): #计算式子值函数 result = f(eval(eq)).limit_denominator(1000) #利用eval函数计算式子的值 result = str(result) return(result)
2.5 运行截图:
功能3. 限定题目数量,"精美"打印输出,避免重复
3.1 功能描述
"就这点儿题,像你当年做得那么快,一会儿就完成啦!"老师说,"另外,我想打印出来,上课也不能带台机器。又另外,你把答案也打出来呗,我把答案剪掉,题目给学生做。"一看需求这么多,你生怕她会说,"这都是很简单的功能,你一定能完成吧"。你知道如果承诺今晚,明早交工的时候她一定想出了更多可怕的需求,你赶紧说,"老师我现在就做。"你忘记怎么调用打印机了,就把答案与题目横向对齐,输出在文件的右边。告诉老师txt文件可以用WORD打开,也能打印。她满意而意味深长地笑了,表示同意。你输入命令执行的时候,脑袋比手指头还疼。
3.2 重难点:如何精美输出
3.3 收获:习得ljust()函数与rjust()函数。
3.4 代码片段:
def input_count(n): try: n = int(n) if n >= 0: for i in range(n): eqa = creat_equation() result_right = run_count(eqa) eqa = eqa + "=" print(eqa.ljust(40), result_right) else: print('题目的数量必须是 正整数') except: print('题目的数量必须是 正整数') return(0)
3.5 运行截图:
功能4. 支持分数出题和运算
4.1 功能描述
国庆节后,你终于又回到美丽优雅并且正常的东北师范大学净月校区,在去食堂的路上偶遇你心目中的女神 (或男神,请自行替换)。她说,"哎呀,这跟我们《构建之法》课上的题目要求一样啊,真是巧合。"
"不要客气,代码拿去!反正我也没用。"你说,"如果有需求变更或扩展,尽管找我。"
你伏笔埋得不错。女神马上说,"对啊,有一点儿点儿不一样,你午饭时间加加班帮我改出来吧。"
她的题目还要求支持分数运算,你不禁想到了功能1中你特意规避了一些题目不出。
4.2 重难点:
还是式子生成的问题
4.3 收获:总结之前的方法,完成了此功能。
4.4代码片段:
def creat_formula(): #功能四生成随机式子 ops = ['+', '-', '*', '/'] num1 = r(1, 9) #产生随机数 num2 = r(1, 9) num3 = r(1, 9) num4 = r(1,9) ops1 = r(0, 2) ops2 = r(0, 3) ops3 = r(0, 3) dic = { 1:str(f(r(1,9),r(1,9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) + ops[ops3] + str(num3), 2:str(f(r(1,9),r(1,9))) + ops[ops1] + str(num1) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(num3), 3: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(num1) + ops[ops2] + str(f(r(1, 9), r(1, 9))) + ops[ops3] + str(f(r(1, 9), r(1, 9))), 4: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(num1) + ops[ops2] + str(num2) + ops[ops3] + str(num3), 5:str(f(r(1,9),r(1,9))) + ops[ops1] + str(num1) + ops[ops2] + str(num2)+ops[ops3] + str(f(r(1,9),r(1,9))) , 6:str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num3) + ops[ops3] + str(num4), 7:str(f(r(1,9),r(1,9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] +str(num3), 8: str(f(r(1, 9), r(1, 9))) + ops[ops1] +str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) + ops[ops3] + str(f(r(1,9),r(1,9))), 9: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(f(r(1,9),r(1,9))), 10: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(f(r(1, 9), r(1, 9))) + ops[ops3] + str(f(r(1, 9), r(1, 9))), 11: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] + str(f(r(1,9),r(1,9))), 12: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] + str(num3), 13: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) +ops[ops3] + str(f(r(1,9),r(1,9))), 14: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num2) + ops[ops3] + str(f(r(1, 9), r(1, 9))), 15: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) +ops[ops3] + str(num3), 16: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(num3), } eq = dic[r(1, 16)] return (eq) def run_count(equa): #计算式子值函数 result = f(eval(equa)).limit_denominator(1000) #利用eval函数计算式子的值,并将小数转化为分数 result = str(result) return(result)
4.5 运行截图:
五、结对编程体会:
通过这次的结对编程作业,让我明白了团队协作的重要性,董亚辉同学对比我来说基础更好,他做作业也十分努力,两个人相互督促,共同完成作业。我们两个人合作过程中非常和谐,节奏也很好,遇到我不懂的地方,董亚辉会耐心的告诉我为什么这么做,使我的能力得到了进一步的提升。在过程中,我们遇到过很多的瓶颈,甚至一度以为自己完不成作业了,但是在两个人的相互鼓励下,克服了很多的困难与瓶颈,真的十分感谢结队小伙伴——董亚辉。
花费时间比较长的事件:
(1)功能一中,如何生成产生随机计算符号,查找资料花费不少时间
(2)如何将产生的式子进行计算,这个是最难的了,两人在这个方面尝试了好多种方法,最后在百度中发现python中的eval()函数。
(3)运算结果产生了无限小数
(4)括号运算
(5)修改代码中不规范的命名
六、照片
工作地点:冬华公寓B522
工作机器:董亚辉的计算机