20170928-3 四则运算试题生成
作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997
结对伙伴:苗威
git:https://git.coding.net/songyuu/f4.git
要求1:
(1) 给出每个功能的重点、难点、编程收获。
功能1的重点是随机生成4个数字和符号,在python中用random标准库解决。
功能2的重点是随机生成括号,用random标准库解决。难点是括号生成的顺序,没有用逆波兰解决,觉得一共就4个数字,直接用if语句解决。
功能3的重点是命令行参数,用argparse标准库解决。难点是判断是否有命令行参数,学习了语法加上自己的思考解决。
功能4的重点是支持分数,用fractions标准库解决,难点超级多,python内置函数eval()输出为浮点数,大约14-16位,生成的分数分子分母都有14-16位,这样不符合规定,所以要限制位数。
经过多次实验,例如1/3=0.3333333....如果限制在小数点后10位以下都可以得到1/3,看了一篇博客,写的是python底层的运行机制,如果是4则运算,只限制10^4即可。
感觉时间不太够了,所以没有完成功能4的一又二分之一 表示 1 1/2。
(2)给出结对编程的体会。
结对编程体会到团队合作的好处,可以交流解决问题,互相讨论互相学习。
(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。
一开始没有用oop方式写代码,经讨论后改正。
复审中为避免写重复代码而把计算答案写在了一个函数中,开始没有注意,没有给函数变量,导致算的答案是再次随机生成四则运算的答案。改正这个错误让我更深刻的理解运行机制。
学python不久,导致编码不是很熟练,经过这次作业,感觉编码比上次作业要编的好看。
花费时间最长的就是python如何单元测试,期间想换成C++,但是没换,找各种资料学习,编写了一个用于单元测试的代码。
最后用pyinstaller包生成exe文件,相同操作系统有的电脑就好使,有的就不好使。
要求2 :
照片:
要求3:已经用tortoiseGit上传。
四则运算:
先把所有代码附上:
#by: sy class f4(object): def __init__(self): pass def _f4(self): from random import randint as r from random import uniform as ru from fractions import Fraction as f ops = ['+', '-', '*', '/'] bra = ['(', '', ')'] _l1 = r(0, 1) _l2 = r(0, 1) _l3 = r(0, 1) _r1 = r(1, 2) _r2 = r(1, 2) _r3 = r(1, 2) if _l1 == 0: _l2 = 1 _l3 = 1 if _r1 == 2: _r2 = 1 _r3 = 1 else: _r2 = 2 _r3 = 1 else: if _l2 == 0: _l3 = 1 _r1 = 1 if _r2 == 2: _r3 = 1 else: _r3 = 2 else: _l3 = 0 _r1 = 1 _r2 = 1 _r3 = 2 add_1 = ru(0, 1) add_1 = f(add_1).limit_denominator(10) add_2 = ru(0, 1) add_2 = f(add_2).limit_denominator(10) add_3 = r(1, 10) add_4 = r(1, 10) o_1 = r(0, 2) o_2 = r(0, 3) o_3 = r(0, 3) eq = bra[_l1] + str(add_1) + ops[o_1] + bra[_l2] + str(add_2) + \ bra[_r1] + ops[o_2] + bra[_l3] + str(add_3) + bra[_r2] + \ ops[o_3] + str(add_4) + bra[_r3] return (eq) def _f4_answer(self,eq): from fractions import Fraction as f _answer = f(eval(eq)).limit_denominator(1000) _answer = str(_answer) return(_answer) def _f4_input(self): try: _y = 0 _n = 0 for i in range(20): _eq = f4()._f4() print(_eq, "=") _ans_right = f4()._f4_answer(eq = _eq) _ans = input("?") if _ans == _ans_right: print("答对了,你真是个天才!") _y = _y + 1 else: print("你再想想吧,答案似乎是", _ans_right, "喔!") _n = _n + 1 print("你一共答对", _y, "道题,一共20道题。") except: print("输入有误") return (0) def _f4_integer_parser(self,x): _p = "请输入正整数。" try: x = int(x) if x >= 0: for i in range(x): _eq = f4()._f4() _right = f4()._f4_answer(eq = _eq) _eq = _eq + "=" print(_eq.ljust(40), _right) else: print(_p) except: print(_p) return(0) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("-c", "--cin") args = parser.parse_args() if args.cin == None: f4()._f4_input() else: f4()._f4_integer_parser(args.cin)
四个函数功能分别是:
1.生成算式。
2.计算生成算式。
3.无命令行参数的功能函数。
4.有命令行参数的功能函数。
运行截图:
命令行参数:
输出到txt:
结对编程环境:
软件:pycharm
地点:寝室