20190919-6 四则运算试题生成,结对
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631
结对伙伴:杨萍
功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
重点难点:控制题目个数,随机生成运算符和运算数,并且当含有分数(不能转化成有限小数的)时,该如何计算?由于是随机生成数,那么当做分数运算时如何确保分母不为零。
因为python中有将浮点数转化成分数的方法:fraction模块提供有关有理数的算术表达和计算,实际上就是分数的表达和计算。也有生成随机数的方法:randint随机生成整数,uniform随机生成浮点数。
功能2. 支持括号
重点难点:括号的匹配问题是重点也是难点。并且,如何控制括号是随机出现也是难点。
因为功能2是在功能1的基础上实现的,为了使程序更简单,将功能1和功能2的代码合并,代码如下:
1 #by: psy_yp 2 class f4(object): 3 def __init__(self): #初始化新建对象 4 pass 5 """ 6 功能1、2:实现含有括号的四则运算 7 """ 8 def _f4(self): 9 from random import randint as r #直接导入randint函数,更名为r 10 from random import uniform as ru #直接导入uniform函数,更名为ru,用于生成指定范围内的随机浮点数 11 from fractions import Fraction as f #直接导入fractions函数,更名为f 12 ops = ['+', '-', '*', '/'] #存储操作符 13 kuohao = ['(', '', ')'] #存储括号,下标为0,1,2 14 15 left1 = r(0, 1) 16 left2 = r(0, 1) 17 left3 = r(0, 1) 18 right1 = r(1, 2) 19 right2 = r(1, 2) 20 right3 = r(1, 2) 21 if left1 == 0: 22 left2 = 1 23 left3 = 1 24 if right1 == 2: 25 right2 = 1 26 right3 = 1 27 else: 28 right2 = 2 29 right3 = 1 30 else: 31 if left2 == 0: 32 left3 = 1 33 right1 = 1 34 if right2 == 2: 35 right3 = 1 36 else: 37 right3 = 2 38 else: 39 left3 = 0 40 right1 = 1 41 right2 = 1 42 right3 = 2 43 add_1 = ru(0, 1) 44 add_1 = f(add_1).limit_denominator(10)#限制最大分母值,小数变分数 45 add_2 = ru(0, 1) 46 add_2 = f(add_2).limit_denominator(10) 47 add_3 = r(1, 10) 48 add_4 = r(1, 10) 49 ops1 = r(0, 2) 50 ops2 = r(0, 3) 51 ops3 = r(0, 3) 52 #由上述操作,随机生成表达式 53 eq = kuohao[left1] + str(add_1) + ops[ops1] + kuohao[left2] + str(add_2) +kuohao[right1] + ops[ops2] + kuohao[left3] + str(add_3) + kuohao[right2] + ops[ops3] + str(add_4) + kuohao[right3] 54 return (eq)
1 for i in range(20): #输出20道题,分别判断输入结果与正确答案是否相同,按要求输出 2 _eq = f4()._f4() 3 print(_eq, "=") 4 _ans_right = f4()._f4_answer(eq = _eq) 5 _ans = input("?") 6 if _ans == _ans_right: 7 print("答对啦,你真是个天才!") 8 yes = yes+ 1 9 else: 10 print("再想想吧,答案似乎是", _ans_right, "喔!") 11 no= no + 1 12 print("你一共答对", yes, "道题,共20道题。") 13 except: 14 print("输入有误") 15 return (0)
运行截图:
功能3. 限定题目数量,"精美"打印输出,避免重复
重点难点:重点是要判断用户输入的是否合法(题目量个数),随机生成用户所限定的题目的个数(正整数),是重点也是难点
功能4. 支持分数出题和运算
重点难点:随机生成数时要考虑到分数运算分母不为零的情况,在做分数四则运算时要要考虑将整数转化成分数进行计算。同时也需要考虑括号匹配问题。
关键代码:
1 """ 2 功能3:限定题目数量,"精美"打印输出,避免重复 3 功能4:在功能3的基础上,支持分数出题和运算 4 """ 5 def _f4_integer_parser(self,x): 6 _p = "题目数量必须是 正整数。" 7 try: 8 x = int(x) 9 if x >= 0: 10 for i in range(x): 11 _eq = f4()._f4() 12 _right = f4()._f4_answer(eq = _eq) 13 _eq = _eq + "=" 14 print(_eq.ljust(40), _right)#方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。 15 else: 16 print(_p) 17 except: 18 print(_p) 19 return(0) 20 if __name__ == "__main__": 21 import argparse #argparse是一个{命令行参数解析}模块 22 parser = argparse.ArgumentParser() 23 parser.add_argument("-c", "--cin") 24 args = parser.parse_args() 25 if args.cin == None: 26 f4()._f4_input() 27 else: 28 f4()._f4_integer_parser(args.cin)
运行截图:
要求1 结对编程体会
自从杨老师提过结对编程这种编程方式时,我就对该方式很感兴趣,我个人编程能力比较弱,通常自己在编程时遇到的困难也是需要花费很长时间去解决,听到结对编程后,我就感觉我可能会在编程时间花费上会减少许多,而且两个人一起编程,共用一台电脑,共用一个键盘、一个鼠标,同时编写同一个程序,可以大大提高编程效率。然而,在实际的结对编程过程中却不是那么顺利,我和杨萍同学都属于代码比较薄弱的同学,刚开始我俩选择相对比较熟悉的Java语言编写该程序,但发现功能3和功能4比较难实现,并且由于上周词频统计作业我俩又都是用的Java语言,在此次个人作业效能分析中将jar文件转换成exe文件再用ptime命令测运行时间,这个过程对于我俩来说都比较困难。还好我俩假期都学了一点Python,俩人就决定尝试一下用Python语言完成此题,当然在实践过程中也遇到种种问题,这个时候就能看出结对编程的优势了,就是遇到BUG不轻易退缩。在结对编程过程中,我克服了自己粗心大意的缺点。我认为结对编程是个相互促进的过程,我和小伙伴都有了不同程度的提高,并且小伙伴是个十分严谨的人,她会及时纠正我的错误,也让我对编程有了更加严谨的态度。总之,很感谢老师给了这次结对编程的机会,也感谢小伙伴杨萍同学给予我的帮助!
结对编程中耗时事件:
1)编程语言:杨萍同学习惯性用JAVA语言,而我认为C比较容易实现,对四则运算作了功能分析之后,决定用一门更简单的语言python进行编程。决定用何语言花费半天时间,虽然我俩都不精通python,但是语言都是相通的,我俩也决定在编程的过程中边学边实施。
2)括号匹配:放弃用Java语言编写也是有一部分这个原因的,在括号匹配上面我俩也是查了很多,但都是不熟悉,看不懂,无意间看到师兄用(0,1,2)作为一个‘(‘,‘ ’ , ’)’作为他们的下标,然后随机生成(0,1,2)数字,进行if条件判断之后,完美解决了括号匹配的问题了,就决定采用师兄的方法。
3)完善功能:大致框架出来之后,在输入输出格式还有随机数生成范围的限定上面进行了多次调试。
4)特殊情况:在做除法运算的时候,刚开始没有考虑到随机数0的情况,一直运行不通过,后来发现用random限定随机数范围之后才解决这个问题。
5)函数调用:对于函数调用,我俩也是费了很多精力上网查询调用函数该如何用,有什么功能。
要求2 结对照片:
编程地点:一食堂二楼学习区 杨萍电脑
要求3 代码地址:https://e.coding.net/xintongxue123/sizeyunsuan.git
https://e.coding.net/xintongxue123/sizeyunsuan.git
https://e.coding.net/xintongxue123/sizeyunsuan.git