结对-四则运算答题器-结对项目总结

项目地址: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)+'道题。'

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

原文地址:https://www.cnblogs.com/kasumis/p/7780111.html