zoukankan      html  css  js  c++  java
  • 结对-四则运算答题器-结对项目总结

    项目地址:https://github.com/xyhcq/calc

    结对成员:
    学号:2015035107136 张良
    学号:2015035107128 邢云淇

    本次结对项目历时2个月,2位成员都是第一次从事结对编程,我们都能感到自己有了很大的收获,在结对编程的过程中,我们交换了一些自己的想法,发现了对方的一些想法优于自己的想法,互相学习了一番。

    我们的结对项目为:四则运算答题器,能够根据用户输入的数值来界定出题的算数的最大值,同时可以控制生成计算题的数目,在生成题目后,由用户输入算式的答案来进行下一步,同时判断答案的正确与否,在最后,能够反馈给用户正确与错误的题目的数量。

    在程序开始时,我们先导入了random模块来实现能够生成随机数的功能

    1 import random

    我们定义了一个变量hard用于控制算数的最大值,然后就可以生成随机数,这样,就可以控制了数值的最大值,实现了控制难易度的功能了。

    random.randint(1, hard)

    在往下一步,我们该考虑运算符了,正常来说加减乘除是+,-,*,/,我编写的时候直接用会报错,于是我们商量了一下,把运算符都扔进了列表,用的时候可以调用

    # 运算符
    ops = ['+', '-', '*', '/']

    比如我需要加,就是

    ops[0]

    所以我们随机生成0-3就相当于随机生成运算符了

    # 随机生成运算符
    op = random.randint(0, 3)

    这时,我们需要生成2个数,中间夹一个运算符就能生成算式了。

    # 生成第一个数和第二个数
    num1 = random.randint(1, hard)*1.0
    num2 = random.randint(1, hard)*1.0

    在这里我们测试的时候发现,除法时候会有bug,因为是int的数,所以我们将生成的数*1.0,使其变成了浮点型。

    我们用变量i来控制生成题目数量,所以在循环中,i就可以作为循环的控制条件了。

    复制代码
    while i < int(number) + 1:
        # 生成第一个数和第二个数
        num1 = random.randint(1, hard)*1.0
        num2 = random.randint(1, hard)*1.0
        # 随机生成运算符
        op = random.randint(0, 3)
        # 产生算式和答案
        eq = str(num1) + ops[op] + str(num2)
    复制代码

    我们在这时又遇到问题了,eq是算式,可是数据类型是str,这不能计算,乍办呢,于是我们在网上查了一下,发现还有这种用法:

    value =eval(eq)

    这样,我们既可以将算式的值保存到value变量中,又可以print出我们的算式,作为让用户计算的题目。

        # 显示问题
        print "问题%d: %s=" % (i, eq)

    我们添加上了判断正误的功能

    复制代码
        # 接收用户的答案
        answer = raw_input("请输入答案: ")
        # 判断正误
        if value == float(answer):
            print "回答正确!"
        else:
            print "回答错误,正确答案是: %d" % value
    复制代码

    我们兴高采烈测试,于是bug应声而来,测试时候输入过快,当答案为空时候报错了,于是我们用笨方法加上了不允许输入空值的条件:

        # 接收用户的答案
        answer = raw_input("请输入答案: ")
        while answer == '':
            answer = raw_input("答案不能为空,请重新输入: ")

    我们开始了各种测试,发现,产生了很多重复的算式,这不是我们想要的结果,所以,我们将生成过的算式加入一个列表中,每次生成前先遍历一下列表,看看有没有生成过,避免重复,不过我觉得当生成成千上万个算式后,应该会降低效率,可我们现在管不了那么多了,没有别的办法

    # 生成过的算式
    used_eq=[]
    
    # 将算式添加到用过的算式列表
    used_eq.append(eq)
    复制代码
        # 判断是否重复,重复则重新生成
        while eq in used_eq:
            # 生成第一个数和第二个数
            num1 = random.randint(1, hard)*1.0
            num2 = random.randint(1, hard)*1.0
            # 随机生成运算符
            op = random.randint(0, 3)
            # 产生算式和答案
            eq = str(num1) + ops[op] + str(num2)
    
        # 将算式添加到用过的算式列表
        used_eq.append(eq)
    复制代码

    这样我们以为就完事了,可随着我们功能越多,bug就越多了,我们发现,当能生成的算式达到了够生成的算式数量时,程序会异常报错,于是我们又加上了限制生成数量的方法,从源头上阻止bug的产生:

    复制代码
    # 题目数量
    number = raw_input('请输入题目数量:')
    
    while int(number)> 4**hard:
        print '你输入的数将产生重复的题,请重新输入'
        number = raw_input('请输入题目数量:')
    复制代码

    可是我们测试时候,输入的不是数字,是字母,bug又来了,字母当然不能作为数字用了,我们在网上找了老半天,发现有个Python自带的方法可以轻易解决,就是

    number.isdigit()

    当number不是数字时候,会返回False,是则返回True,ok,就它了,于是诞生了这个方法:

    复制代码
    # sw控制循环
    sw1=1
    while sw1:
        if number.isdigit():
            #number=int(number)
            sw1=0
        else :
            number = raw_input('请输入题目数量:')
            sw1=1
    复制代码

    我们还需要统计计算正确与错误的数量,于是定义2个变量,并将它们插入题目中

    # 计算正确和错误的数量
    calc_true, calc_false= 0,0
    复制代码
        # 判断正误
        if value == float(answer):
            print "回答正确!"
            calc_true+=1
        else:
            print "回答错误,正确答案是: %d" % value
            calc_false+=1
    复制代码

    在程序的最后,我们实现输出统计计算结果,程序就完成了

    print '共计算'+str(number)+'道题,
    计算正确'+str(calc_true)+'道题,
    计算错误'+str(calc_false)+'道题。'

    现在看来,我们这程序写的是真的糟糕,看起来很幼稚,我们还需要更多学习才能写出更好的程序。

  • 相关阅读:
    git commit --amend
    Interleaving String leetcode
    Longest Common Substring
    Distinct Subsequences Leetcode
    Longest Common Subsequence
    Palindrome Partitioning II Leetcode
    百度面试时遇到这样一个问题:给定数组a[];计算除最后一个元素之外其他元素的和,下面的代码有什么问题吗
    sizeof与strlen
    网络是怎么连接的(2)?
    网络是怎么连接的(1)?
  • 原文地址:https://www.cnblogs.com/kasumis/p/7780111.html
Copyright © 2011-2022 走看看