zoukankan      html  css  js  c++  java
  • 20190919-6 四则运算试题生成

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

    代码地址:https://e.coding.net/wangkefei/f4.git

    结对伙伴:徐姗姗

    功能1. 四则运算:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。

    重点:导入 random 模块,运用random()函数,随机生成数字和运算符号。eval()函数实现计算运算式正确答案,与用户输入的结果进行比较,相等即回答正确,否则错误。

    定义变量k用于计算回答正确数目。

    代码:

    import random
    
    
    def generate():
    
        ope = ['+', '-', '*', '/']
        num1 = random.randint(1, 10)    # 随机生成1-10之间的数字
        num2 = random.randint(1, 10)
        num3 = random.randint(1, 10)
        num4 = random.randint(1, 10)
        ope1 = random.choice(ope)       # 随机生成运算符
        ope2 = random.choice(ope)
        ope3 = random.choice(ope)
        exp = str(num1) + str(ope1) + str(num2) + str(ope2) + str(num3) + str(ope3) + str(num4)
        return exp
    
    
    ret = []
    for i in range(20):
        ret.append(generate())
    k = 0
    for el in ret:
        print(el)
        print('?', end="")
        answer = float(input())
        if answer == eval(el):     # eval()计算表达式的值
            k += 1
            print('答对啦,你真是个天才!')
        else:
            print('再想想吧,答案似乎是%d喔!' % (eval(el)))
    print('你一共答对%d道题,共20道题。' % k)

    运行截图:

    功能2. 支持括号。

    重点:定义一个括号列表,随机生成列表的下标,表示生成左括号、右括号或不生成括号。生成括号的位置利用多层判断进行表示。

    代码:

        ope = ['+', '-', '*', '/']
        bra = ['(', '', ')']      # 0:生成左括号 1:不生成括号 2:生成右括号
        num1 = random.randint(1, 10)
        num2 = random.randint(1, 10)
        num3 = random.randint(1, 10)
        num4 = random.randint(1, 10)
        ope1 = random.choice(ope)
        ope2 = random.choice(ope)
        ope3 = random.choice(ope)
    
        left1 = random.randint(0, 1)
        left2 = random.randint(0, 1)
        left3 = random.randint(0, 1)
        right1 = random.randint(1, 2)
        right2 = random.randint(1, 2)
        right3 = random.randint(1, 2)
        if left1 == 0:           # 括号成对出现的情况
            left2 = 1
            left3 = 1
            if right1 == 2:
                right2 = 1
                right3 = 1
            else:
                right2 = 2
                right3 = 1
        else:
            if left2 == 0:
                left3 = 1
                right1 = 1
                if right2 == 2:
                    right3 = 1
                else:
                    right3 = 2
            else:
                left3 = 0
                right1 = 1
                right2 = 1
                right3 = 2
        exp = bra[left1] + str(num1) + str(ope1) + bra[left2] + str(num2) +          # 在功能一的算术式中加入括号可能出现的位置
              bra[right1] + str(ope2) + bra[left3] + str(num3) + bra[right2] + 
              str(ope3) + str(num4) + bra[right3]
        return exp

    运行截图:

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

    重点:argparse()模块,用于用于解析命令行参数和选项。

     重点代码:

    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser()
        parser.add_argument("-c", "--cin")
        args = parser.parse_args()
        if args.cin is None:
            f4().unlimited()
        else:
            f4().limited(args.cin)

     运行截图:

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

    重点:运用fractions 模块,用来执行包含分数的数学运算。

     重点代码:

            num1 = random.uniform(0, 1)
            num1 = random.Fraction(num1).limit_denominator(10)
            num2 = random.uniform(0, 1)
            num2 = random.Fraction(num2).limit_denominator(10)
        def answer(self, eq):
            from fractions import Fraction as f
            answer = f(eval(eq)).limit_denominator(1000)
            answer = str(answer)
            return answer

    运行截图:

     

    总结与体会:

    1.结对编程的体会

      第一次进行两个人组队编程,比本科期间的多人组队更加直接,效率更高。两个人坐在一起使用同一台电脑这种方式沟通起来更快,尤其是自己不好理解的问题,两个人可以互通有无。首先现有整体思路很重要,两个人商量后决定用python语言编写。以往自己编写代码的时候,经常会有bug改不过来,或者功能无法实现却找不出原因的情况。两个人共同编写就会多了一个思路,在一个人“走进死胡同”的时候能多提供一条路。这次作业对我来说有些困难,一开始思路不够清晰,python也是初学的一门语言,但好在比较简洁易懂,不是很复杂,但也花费了比想象长很多的时间。

    2.至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件

    (1)了解python函数花费时间较长但是收获最大。python有很多内置函数能实现很多功能,例如这次作业中的eval()、random()等,通过上网查找函数及其语法,将函数运用到程序中,比较方便。

    (2)刚开始浏览完题目后认为重点在于逆波兰,于是直接搜索了python逆波兰相关的知识,理解了中缀转后缀,括号及运算符压栈和弹栈的原理,也花费了较长时间。但是后来发现python自带的eval()函数可以让电脑自动运算带有括号的运算式,不需要逆波兰也可以算出正确的结果。虽然逆波兰没有应用到代码中,但是了解了原理,也有很大收获。

    (3)功能二添加括号很难实现,花费时间很长。开始没有思路,师兄提示了思路,我俩又参考了师兄的过去的代码,修改并结合到功能一中才得以实现。

    (4)在编程过程中,将脑中的思路变成实际的代码对我来说是最困难的事。由于编程能力太弱,即使有了思路,也很难用双手实践出来。还好结对编程的过程中,同伴能够给予帮助,虽然花费时间长,但有很大收获。

    (5)功能四中添加了argparse()模块,用于用于解析命令行参数和选项,在了解模块和加以运用上花费了较长时间,但同时也是收获最大的事件。

     

    3、给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。

    工作地点:计算机楼410室

    计算机:实验室电脑

    照片:

     

  • 相关阅读:
    RHEL7 timedatectl命令
    广告点击率的贝叶斯平滑
    Expectation Propagation: Theory and Application
    微博推荐算法学习(Weibo Recommend Algolrithm)
    百度技术沙龙第48期回顾:大规模机器学习(含资料下载)
    内容匹配广告投放技术4:网盟CTR预估(百度文库课程)
    Logistic Regression的几个变种
    广告点击率预测 [离线部分]
    GBDT(MART) 迭代决策树入门教程 | 简介
    xgboost: 速度快效果好的boosting模型
  • 原文地址:https://www.cnblogs.com/wkf-/p/11571777.html
Copyright © 2011-2022 走看看