• 四则运算试题生成


    此作业要求参见:[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(我和杨金铭在同一个寝室)

    照片:

  • 相关阅读:
    【OpenCV学习】XML的读写
    【学术研究基础】聚类分析学习
    【OpenCV学习】Laplace变换(视频边界检测)
    【OpenCV学习】DFT变换
    【英语天天读】生命的起跑线
    【OpenCV学习】yml的读取
    【OpenCV学习】Kmean均值聚类对图片进行减色处理
    【英语天天读】born to win
    WinFrom 中 label背景透明
    dev GridControl双击行事件
  • 原文地址:https://www.cnblogs.com/yangl794/p/9753790.html
Copyright © 2020-2023  润新知