20190919-6 四则运算试题生成

▼魔方 西西 提交于 2019-11-30 12:31:22

 

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

 

Git地址:https://e.coding.net/thiking/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

 

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

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!