20190919-6 四则运算试题生成,结对

 

此作业要求参见: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收获:

       我觉得此次最大的收获是在遇到问题时,不要先百度,一定要先思考,看看自己有没有解决办法。尽管会花费不少时间,但是能提高自己的能力。还收获了两大法宝,python中Fraction函数和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 运行截图:

20190919-6 四则运算试题生成,结对

20190919-6 四则运算试题生成,结对

功能2. 支持括号

2.1 功能描述:

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

2.2重难点:

        1、如何划分括号的位置

        2、式子的计算

2.3 收获:

       这个功能的实现原本打算用老师的提示,用数据结构中的知识,采用栈,并将中缀表达式转化为后缀表达式。但是无奈于水平有限,没能实现。经过向同学询问,了解到一个名为词典的东西,一下打开了自己的视野,原地空喊一声python真牛×。尽管需要写不少代码,但是还真有效的解决了问题。

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 运行截图:

20190919-6 四则运算试题生成,结对

20190919-6 四则运算试题生成,结对

功能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 运行截图:

20190919-6 四则运算试题生成,结对

20190919-6 四则运算试题生成,结对

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

4.1 功能描述

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

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

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

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

4.2 重难点:

            还是式子生成的问题

4.3 收获:还是采用词典+Fraction()函数+eval()函数完成,尽管方法有些愚笨,还耗费体力,但还是完成了女神的要求。

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 运行截图:

20190919-6 四则运算试题生成,结对

五、结对编程体会:

   通过这次的结对编程作业,让我明白了团队协作的重要性,两个人相互督促,共同完成作业。我们两个人合作过程中非常和谐,节奏也很好,使我的能力得到了进一步的提升。在过程中,我们遇到过很多的瓶颈,甚至一度以为自己完不成作业了,但是在两个人的相互鼓励下,克服了很多的困难与瓶颈,感谢结对的小伙伴。

  花费时间比较长的事件:

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

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

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

    (4)括号运算

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

六、照片

  工作地点:冬华公寓B522

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

20190919-6 四则运算试题生成,结对

 

上一篇:剖析cmdb业务处理流程


下一篇:双栈算术表达式求值