• 20190919-6 四则运算试题生成


    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631

    Git地址:https://e.coding.net/sxy504/si_ze_yun_suan.git

    结对队友:董亚辉

    功能1. 四则运算

    1.1功能描述

      支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。你在老师面前作如下表演 (数字你用excel验算过了,UI的卖萌部分你还没有想好) 。

    1.2重难点

      (1)如何随机产生计算符号,

      (2)如何将式子进行拼凑,

      (3)如何将产生的式子进行计算,

      (4)如果计算结果产生的是小数如何转化为分数

    1.3收获:

          学习了eval函数给完成作业带来了很大的便捷。

    1.4 代码片段:

    复制代码
    def creat_equation():    #功能一生成随机式子
        ops = ['+', '-', '*', '/']
        num1 = r(1, 9)      #产生随机数
        num2 = r(1, 9)
        num3 = r(1, 9)
        num4 = r(1, 9)
        ops1 = r(0, 2)
        ops2 = r(0, 3)
        ops3 = r(0, 3)
        equa = str(num1) + ops[ops1] + str(num2) + 
             ops[ops2] + str(num3) + 
             ops[ops3] + str(num4)
        return (equa)
    def run_count(equa):                #计算式子值函数
        result = f(eval(equa)).limit_denominator(1000)   #利用eval函数计算式子的值,并将小数转化为分数
        result = str(result)
        return(result)
    复制代码

    1.5 运行截图:

    功能2. 支持括号

    2.1 功能描述:

      老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"你拿出笔记本,偷偷微信你们《构建之法》班的学霸,她说肯定能行,但是细节信号不好你听不清,只捕捉到隐约几个词"逆波兰""后缀表达式""堆栈""我看好你""数据结构"。两小时后,在老师面前你在控制台下输入f4,然后回车。

    2.2重难点:

            1、如何划分括号的位置

            2、式子的计算

    2.3 收获:

           利用字典解决问题。

    2.4 代码片段:

    复制代码
    def creat_equation():    #生成随机式子
        ops = ['+', '-', '*', '/']
        num1 = r(1, 9)      #产生随机数
        num2 = r(1, 9)
        num3 = r(1, 9)
        num4 = r(1, 9)
        ops1 = r(0, 3)
        ops2 = r(0, 3)
        ops3 = r(0, 3)            #生成词典
        dic = {1: '(' + str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ')' + ops[ops3] + str(num4),
               2: '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + str(num3) + ops[ops3] + str(num4),
               3: str(num1) + ops[ops1] + str(num2) + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')',
               4: str(num1) + ops[ops1] + '(' + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4) + ')',
               5: '(' + '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4),
               6: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')' + ')',
               7: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ops[ops3] + str(num4) + ')',
               8: '(' + str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4),
               9: '(' + str(num1) + ops[ops1] + str(num2) + ')' + ops[ops2] + '(' + str(num3) + ops[ops3] + str(num4) + ')',
               10: str(num1) + ops[ops1] + '(' + str(num2) + ops[ops2] + str(num3) + ')' + ops[ops3] + str(num4),}
        test = r(1, 10)
        eq = dic[test]
        return (eq)
    def run_count(eq):           #计算式子值函数
        result = f(eval(eq)).limit_denominator(1000)   #利用eval函数计算式子的值
        result = str(result)
        return(result)
    复制代码

    2.5 运行截图:

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

    3.1 功能描述

    "就这点儿题,像你当年做得那么快,一会儿就完成啦!"老师说,"另外,我想打印出来,上课也不能带台机器。又另外,你把答案也打出来呗,我把答案剪掉,题目给学生做。"一看需求这么多,你生怕她会说,"这都是很简单的功能,你一定能完成吧"。你知道如果承诺今晚,明早交工的时候她一定想出了更多可怕的需求,你赶紧说,"老师我现在就做。"你忘记怎么调用打印机了,就把答案与题目横向对齐,输出在文件的右边。告诉老师txt文件可以用WORD打开,也能打印。她满意而意味深长地笑了,表示同意。你输入命令执行的时候,脑袋比手指头还疼。

    3.2 重难点:如何精美输出

    3.3 收获:习得ljust()函数与rjust()函数。

    3.4 代码片段:

    复制代码
    def input_count(n):
              try:
                n = int(n)
                if n >= 0:
                    for i in range(n):
                        eqa = creat_equation()
                        result_right = run_count(eqa)
                        eqa = eqa + "="
                        print(eqa.ljust(40), result_right)
                else:
                    print('题目的数量必须是 正整数')
              except:
                  print('题目的数量必须是 正整数')
              return(0)
    复制代码

    3.5 运行截图:

    功能4. 支持分数出题和运算

    4.1 功能描述

    国庆节后,你终于又回到美丽优雅并且正常的东北师范大学净月校区,在去食堂的路上偶遇你心目中的女神 (或男神,请自行替换)。她说,"哎呀,这跟我们《构建之法》课上的题目要求一样啊,真是巧合。"

    "不要客气,代码拿去!反正我也没用。"你说,"如果有需求变更或扩展,尽管找我。"

    你伏笔埋得不错。女神马上说,"对啊,有一点儿点儿不一样,你午饭时间加加班帮我改出来吧。"

    她的题目还要求支持分数运算,你不禁想到了功能1中你特意规避了一些题目不出。

    4.2 重难点:

                还是式子生成的问题

    4.3 收获:总结之前的方法,完成了此功能。

    4.4代码片段:

    复制代码
    def creat_formula():    #功能四生成随机式子
        ops = ['+', '-', '*', '/']
        num1 = r(1, 9)      #产生随机数
        num2 = r(1, 9)
        num3 = r(1, 9)
        num4 = r(1,9)
        ops1 = r(0, 2)
        ops2 = r(0, 3)
        ops3 = r(0, 3)
        dic  = {
                1:str(f(r(1,9),r(1,9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) + ops[ops3] + str(num3),
                2:str(f(r(1,9),r(1,9))) + ops[ops1] + str(num1) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(num3),
                3: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(num1) + ops[ops2] + str(f(r(1, 9), r(1, 9))) + ops[ops3] + str(f(r(1, 9), r(1, 9))),
                4: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(num1) + ops[ops2] + str(num2) + ops[ops3] + str(num3),
                5:str(f(r(1,9),r(1,9))) + ops[ops1] + str(num1) + ops[ops2] + str(num2)+ops[ops3] + str(f(r(1,9),r(1,9))) ,
                6:str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num3) + ops[ops3] + str(num4),
                7:str(f(r(1,9),r(1,9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] +str(num3),
                8: str(f(r(1, 9), r(1, 9))) + ops[ops1] +str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) + ops[ops3] + str(f(r(1,9),r(1,9))),
                9: str(f(r(1, 9), r(1, 9))) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(f(r(1,9),r(1,9))),
                10: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(f(r(1, 9), r(1, 9))) + ops[ops3] + str(f(r(1, 9), r(1, 9))),
                11: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] + str(f(r(1,9),r(1,9))),
                12: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(f(r(1,9),r(1,9))) + ops[ops3] + str(num3),
                13: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) +ops[ops3] + str(f(r(1,9),r(1,9))),
                14: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(num2) + ops[ops3] + str(f(r(1, 9), r(1, 9))),
                15: str(num1) + ops[ops1] + str(f(r(1,9),r(1,9))) + ops[ops2] + str(num2) +ops[ops3] + str(num3),
                16: str(num1) + ops[ops1] + str(num2) + ops[ops2] + str(f(r(1,9),r(1,9))) +ops[ops3] + str(num3),
    
        }
        eq = dic[r(1, 16)]
        return (eq)
    def run_count(equa):                #计算式子值函数
        result = f(eval(equa)).limit_denominator(1000)   #利用eval函数计算式子的值,并将小数转化为分数
        result = str(result)
        return(result)
    复制代码

    4.5 运行截图:

    五、结对编程体会:

      通过这次的结对编程作业,让我明白了团队协作的重要性,董亚辉同学对比我来说基础更好,他做作业也十分努力,两个人相互督促,共同完成作业。我们两个人合作过程中非常和谐,节奏也很好,遇到我不懂的地方,董亚辉会耐心的告诉我为什么这么做,使我的能力得到了进一步的提升。在过程中,我们遇到过很多的瓶颈,甚至一度以为自己完不成作业了,但是在两个人的相互鼓励下,克服了很多的困难与瓶颈,真的十分感谢结队小伙伴——董亚辉。

      花费时间比较长的事件:

        (1)功能一中,如何生成产生随机计算符号,查找资料花费不少时间

        (2)如何将产生的式子进行计算,这个是最难的了,两人在这个方面尝试了好多种方法,最后在百度中发现python中的eval()函数。

        (3)运算结果产生了无限小数

        (4)括号运算

        (5)修改代码中不规范的命名

    六、照片

    工作地点:冬华公寓B522

    工作机器:董亚辉的计算机

     

     

     

  • 相关阅读:
    Scala中的构造器和高阶函数
    Scala中的元组
    Scala中的Map
    Scala中的If判断&While&For循环
    [改善Java代码]asList方法产生的List对象不可更改
    [改善Java代码]避开基本类型数组转换列表陷阱
    [改善Java代码]枚举和注解结合使用威力更大
    [改善Java代码]枚举项的数量限制在64个以内
    [改善Java代码]用枚举实现工厂方法模式更简洁
    [改善Java代码]在switch的default代码块中增加AssertionError错误
  • 原文地址:https://www.cnblogs.com/sunxiaoyu/p/11584821.html
Copyright © 2020-2023  润新知