四则运算试题生成

此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148]

代码地址:https://git.coding.net/y45777704/f4final.git

 

其中f41文件夹,dist中f4.exe为功能1代码(原始功能)地址:https://coding.net/u/y45777704/p/f4/git/tree/11/f41/dist

 

f42文件夹,dist中f4为功能2代码(加括号功能)地址:https://coding.net/u/y45777704/p/f4/git/tree/11/f42/dist

 

f4final文件夹,dist中f4为功能3、4代码。地址:https://coding.net/u/y45777704/p/f4/git/tree/11/f4final/dist

 

本次作业用python实现

结对编程对象:杨金铭

需求分析:

       功能一:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 ;

        功能二:支持括号,所出题包含括号;

        功能三:限定题目数量,"精美"打印输出,避免重复;

        功能四:支持分数出题和运算;

要求1 参考《构建之法》第4章两人合作,结对编程上述功能。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。

功能一: 

           重点难点:看到题目后首先想到的就是如何能够实现生成随机数,因为基础比较差所以通过了大量的资料查阅,最后选择了random.randint()方法,在python中的random.randint(a,b)用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b。然后生成表达式,随机生成数的范围取得是[0,15]

            部分代码如下:

def _f4(self):
        from random import randint
        operator1 = ['+', '-', '*', '/']
        left_1 = randint(0, 1)
        left_2 = randint(0, 1)
        left_3 = randint(0, 1)
        right_1 = randint(1, 2)
        right_2 = randint(1, 2)
        right_3 = randint(1, 2)
        if left_1 == 0:
            left_2 = 1
            left_3 = 1
            if right_1 == 2:
                right_2 = 1
                right_3 = 1
            else:
                right_2 = 2
                right_3 = 1
        else:
            if left_2 == 0:
                left_3 = 1
                right_1 = 1
                if right_2 == 2:
                    right_3 = 1
                else:
                    right_3 = 2
            else:
                left_3 = 0
                right_1 = 1
                right_2 = 1
                right_3 = 2
        a = randint(1, 15)
        b = randint(1, 15)
        c = randint(1, 15)
        d = randint(1, 15)
        x = randint(0, 2)
        y = randint(0, 3)
        z = randint(0, 3)
        equal = str(a) + operator1[x]+ str(b)+ operator1[y] + str(c) +  operator1[z] + str(d)
        return (equal)

        实现截图:

功能二:

            重点难点:在试题中添加括号,保证括号得成对出现,以及在正确的位置出现,运用了枚举的方法

             部分代码如下:

 operator2 = ['(', '', ')']
 equal = operator2[left_1] + str(a) + operator1[x] + operator2[left_2] + str(b) + \
             operator2[right_1] + operator1[y] + operator2[left_3] + str(c) + operator2[right_2] + \
             operator1[z] + str(d) + operator2[right_3]

             实现截图:

功能三:

            重点难点:运用argparse模块来处理命令行参数,加入判断输入题目数必须是正整数,根据输入的参数输出试题的数量,并写入txt文件,运用ljust()方法,返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串,使得表达式左对齐,答案对齐

             部分代码如下:

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)

               实现截图:

功能四:

            重点难点:为实现分数出题运用random.uniform() 方法生成随机浮点数,uniform() 方法随机生成一个实数(浮点数),它在[a,b)范围内。然后运用fractions.Fraction()方法生成分数形式,可以同时提供分子和分母给构造函数用于实例化Fraction类,但两者必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误。通过运用limit_denominator()来减小舍入误差的问题。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了。

             部分代码如下:

from fractions import Fraction
a = uniform(0,1)
a = Fraction(a).limit_denominator(10)
b = uniform(0,1)
b = Fraction(b).limit_denominator(10)
c = uniform(0,1)
c = Fraction(c).limit_denominator(10)

             实现截图:

结对编程的体会:通过本次结对编程深刻体会到了人多力量大,相比较一个人编程,两个人结对能够提供更多的思路和想法,虽然过程中也有分歧,但是我们最终愉快地解决了,本次结对编程总体来说是一次不错的体会。

5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件:

                    1、语言选择(C语言与Python的选择)

                    2、是否使用后缀表达式。

                    3、命令行参数处理。

                    4、借鉴他人方法实现分数功能。

                    5、运行过程中编译失败,找语法错误。

要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。

工作地点:冬华公寓B603(我和杨金铭在同一个寝室)

照片:

 

posted @ 2018-10-08 18:56  杨磊794  阅读(156)  评论(0编辑  收藏  举报