(1)需求分析:
a. 通过设计出自动生成小学四则运算题目的命令行程序,方便教师提取和打印,同时,随机生成的题目不能超出小学生的认识范围。
b. 四则运算加减乘除,采用两个随机数,由于不能出现负数,所以在对两个随机数进行减法运算的时,需要进行比较大小,而除法在运算中,除数不能取0。
(2)定义函数:
a. 用def text()实现随机生成四则运算,最后输出算式并返回正确答案。
b. 用主函数确定所需计算题目的数量,并且调用text函数。
(3)具体编码:
import random #text函数 def test(): sym = ['+', '-', '×', '÷'] result =[] m=0 while m<=(n-1): sym = ['+', '-', '×', '÷'] f= random.randint(0, 3) n1 = random.randint(1, 20) n2 = random.randint(1, 20) result = 0 if f== 0:#加法 result = n1 + n2 elif f == 1:#减法,要先比较大小,防止输出负数 n1, n2 = max(n1, n2), min(n1, n2) result = n1 - n2 elif f== 2:#乘法 result = n1 * n2 elif f == 3:#除法,要比较大小,并循环取整除 n1, n2 = max(n1, n2), min(n1, n2) while n1 % n2 != 0: n1 = random.randint(1, 10) n2 = random.randint(1, 10) n1, n2 = max(n1, n2), min(n1, n2) result = int(n1 / n2) print(n1, sym[f], n2, '= ', end='') j= input() s= int(j) if s== result : print('right') else: print('error ,the answer is', result ) m=m+1 #主函数 print('下面进行四则运算') print('输入所需要的题目数量') n=int(input()) test()
(4)升级
a.时间:计算做完四则运算所需的时间。
import time #开始计时 tic = time.time() #(此处为需要计时的模块) toc = time.time()#计时结束 shijian = toc-tic print(shijian)
完整代码为:
import random import time def test(): sym = ['+', '-', '×', '÷'] tic = time.time() result =[] m=0 while m<=(n-1): sym = ['+', '-', '×', '÷'] f= random.randint(0, 3) n1 = random.randint(1, 20) n2 = random.randint(1, 20) result = 0 if f== 0:#加法 result = n1 + n2 elif f == 1:#减法,要先比较大小,防止输出负数 n1, n2 = max(n1, n2), min(n1, n2) result = n1 - n2 elif f== 2:#乘法 result = n1 * n2 elif f == 3:#除法,要比较大小,并循环取整除 n1, n2 = max(n1, n2), min(n1, n2) while n1 % n2 != 0: n1 = random.randint(1, 10) n2 = random.randint(1, 10) n1, n2 = max(n1, n2), min(n1, n2) result = int(n1 / n2) print(n1, sym[f], n2, '= ', end='') j= input() s= int(j) if s== result : print('right') else: print('error ,the answer is', result ) m=m+1 toc = time.time() shijian = toc-tic print('你所花的时间为:') print(shijian) #主函数 print('下面进行四则运算') print('输入所需要的题目数量') n=int(input()) test()
结果如图所示:
b. 四则运算复杂化:加入了括号和分数等数学符号,使得程序的功能更加齐全。
import random import profile from fractions import Fraction import time operation = ['+', '-', '*', '/'] #四则运算的符号 global f question = [] result = [] answer = [] def integer(n): ch = [] #存储表达式 number = random.randint(1, 4) #随机产生表达式的数量 for i in range(number): rand = random.randint(0, 1) #随机产生0和1 判断是否使用括号 a = func_integer(number) #调用表达式产生函数,产生表达式 if rand == 0: op = operation[random.randint(2,3)] #产生*,/来连接有括号的表达式,避免产生+,— rand = random.randint(0, 1) #随机产生0和1 判断是否使用内嵌括号或外嵌括号 if i != number - 1: #避免开始和结尾用无意义的括号 if rand == 0: ch.append('(') ch.append(a) ch.append(op) ch.append(random.randint(1,10)) ch.append(')') ch.append(operation[random.randint(0, 1)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) f = '' for k,i in enumerate(ch): #把列表中的所有值用f一个个连起来 if k != len(ch)-1: f += str(i) result_integer(f, n) #调用输出函数 def func_integer(number): f = '' ch = [] rand = random.randint(0, 1) #选择内嵌或外嵌括号 if number != 1: #避免一个表达式也产生括号 if rand == 0: ch.append('(') op = operation[random.randint(0, 1)] ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10)) ch.append(')') else: op = operation[random.randint(0, 3)] if op == '/': a = random.randint(1, 10) ch.append(a) ch.append(op) ch.append(random.randint(a, 10)) else: ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10)) else: op = operation[random.randint(0, 3)] if op == '/': a = random.randint(1, 10) ch.append(a) ch.append(op) ch.append(random.randint(a, 10)) else: ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10)) for i in ch: #把产生表达式当成一个整体 f += str(i) return f def result_integer(f, m): try: n = eval(f) n = Fraction('{}'.format(n)).limit_denominator() # 把表达式的结果转成分数 if n > 0: # 判断结果是否大于0,否则重新产生表达式 #print('题目:') question.append(f) result.append(n) #print('请输出答案:') #x = Fraction('{}'.format(eval(input()))).limit_denominator() else: integer() except: integer(m) if __name__ == '__main__': print('本次测试的题目数量:') n = eval(input()) cor = 0 for i in range(n): integer(n) print('题目:') for k, i in enumerate(question): print(k + 1,':',i,'=') print('请输入你的答案:') #开始计时 tic = time.time() for i in range(n): print('第{}题:'.format(i + 1)) x = Fraction('{}'.format(eval(input()))).limit_denominator() if x == result[i]: print('{}:Ture'.format(i + 1)) cor += 1 else: print('{}:False'.format(i + 1)) print('正确的答案为:',result[i]) toc = time.time()#计时结束 shijian = toc-tic print("本次测试答对了 "+str(cor)+" 题目") print("正确率:"+str(cor/n)) print('你所花的时间为:') print(shijian)
结果如下图所示: