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

地点:寝室

 

原文地址:https://www.cnblogs.com/songyuu/p/7648695.html