项目地址: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)+'道题,\n计算正确'+str(calc_true)+'道题,\n计算错误'+str(calc_false)+'道题。'
现在看来,我们这程序写的是真的糟糕,看起来很幼稚,我们还需要更多学习才能写出更好的程序。
所有评论(0)