zoukankan      html  css  js  c++  java
  • 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 运行截图:

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

    功能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 收获:还是采用词典+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 运行截图:

    五、结对编程体会:

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

      花费时间比较长的事件:

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

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

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

        (4)括号运算

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

    六、照片

      工作地点:冬华公寓B522

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

  • 相关阅读:
    用chardet判断字符编码的方法
    NLP--edit distance
    nfc是什么?nfc功能是什么?
    【转载】推荐系统的十大挑战
    python--网络爬虫一
    【转载】双调欧几里得距离的算法原理
    Java并发编程:线程池的使用
    Java集合--HashMap源码剖析
    java中集合类详解
    java collection接口源码
  • 原文地址:https://www.cnblogs.com/dongyahui/p/11585131.html
Copyright © 2011-2022 走看看