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室

计算机:实验室电脑

照片:

 

 

转载于:https://www.cnblogs.com/wkf-/p/11571777.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值