先看要求
小学数学老师很辛苦,经常为出一套数学练习题而绞尽脑汁,答案需反复计算,以免出错影响学生练习。通过python程序可以非常容易的随机出数学练习题,答案实时获得,基本无错。编写一个混合加减法出题程序,可以根据输入出题数量随机输出100以内混合加减法的计算题。出题试卷分为不带答案和带答案两部分,分别输出到屏幕和文件(math.txt和key.txt)中。屏幕输出效果如图所示。
再看代码
from random import randint import random def get_expression():#算式的生成 a=randint(0,100) b=randint(0,100)#随机生成1~100之间的整数 sign=random.choice(['+','-'])#随机进行+,-运算 if sign=='+': ans=a+b else: ans=a-b if ans<0 or ans>100:#如果结果不在0-100之间 则重新生成a b get_expression() else: a='{: <2d}'.format(a) b='{: <2d}'.format(b) ans='{: <2d}'.format(ans) #a,b,ans格式化,统一为2个宽度 使输出更整齐,美观 #存放 带没有(ex1)答案 和 有答案(ex2) 的算式 ex1=str(a)+str(sign)+str(b)+'=' ex2=str(a)+str(sign)+str(b)+'='+str(ans) global expression expression=list() expression.append(ex1) expression.append(ex2) return expression#得到的两个算式以列表的形式返回 def save_expression(n):#得到指定数量的算式 expression_Noans=list()#不带有答案 expression_withans=list()#带有答案 for i in range(0,n):#调用n次生成函数,得到n个满足条件的算式 get_expression() expression_Noans.append(expression[0]) expression_withans.append(expression[1]) return [expression_Noans,expression_withans]#返回的expression_Noans,expression_withans列表中各有n个算式 def show_expression(n=int(eval(input('请输入出题数量:')))):#算式的输出和打印 fp1= open(r'C:\Users\Peng\Desktop\math.txt','a+')#’a+’表示如果没有这个文件则生成,有则在内容中继续填充 fp2= open(r'C:\Users\Peng\Desktop\key.txt','a+') #expression_Noans=save_expression(n)[0] #expression_withans=save_expression(n)[1] #如果这么写,就相当于重新调用了get_expression()函数,答案会不一致 lis=save_expression(n) expression_Noans=lis[0] expression_withans=lis[1] show_number=0#用于记录每行输出的题量 控制排版 print(n,'道混合加减法题:')#在频幕上输出 print(n,'道混合加减法题:',file=fp1)#打印至文本文档中 for i in range(0,len(expression_Noans)): print(expression_Noans[i],end=' ') print(expression_Noans[i],end=' ',file=fp1) show_number+=1 if show_number%2==0:#每行输出两个题 print('\n')#在频幕上输出 print('\n',file=fp1)#打印至文本文档中 show_number=0#用于记录每行输出的题量 控制排版 print()#换一行输出 print(n,'道混合加减法题(带答案):')#在频幕上输出 print(n,'道混合加减法题(带答案):',file=fp2)#打印至文本文档中 for i in range(0,len(expression_withans)): print(expression_withans[i],end=' ') print(expression_withans[i],end=' ',file=fp2) show_number+=1 if show_number%2==0: print('\n') print('\n',file=fp2) show_expression()
最后看一些创作过程中的总结
1,题目生成并不难,只要利用randint()模块随机生成两个整数,然后随机做加减法就可以完成,计算符号的随机==> random.choice(['+','-']),注意一个细节,100以内加减法应该控制答案的范围,防止越界(不应该出现答案是负数的算式)
2,输出的格式化问题,如何让题目排版整齐,是难点,把没有答案和有答案的分开输出在频幕上比打印到对应的文档要难一点。打印到文档只要存入不同路径,相当于做两件独立的事情,打印到频幕上要整体一起做,而且有先后显示的区别。
3,要注意get_expression()函数每调用一次,都会生成一个不一样的算式,所以要化动为静,每生成一个,就把他存入列表,然后返回该列表,就得到了固定不变的算式,方便后续操作,否则可能会遇到算式和答案不匹配的情况。
4,然后就是一些小问题,让每个算式的长度一致,打印的时候会相对美观,'{: <2d}'.format(a),利用数字的format格式化方法,让每个数字占2个长度,像1和11就会对齐
结果: