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

posted @ 2019-09-24 21:21  彭思雨  阅读(237)  评论(0编辑  收藏  举报