先看要求
小学数学老师很辛苦,经常为出一套数学练习题而绞尽脑汁,答案需反复计算,以免出错影响学生练习。通过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+belse:ans=a-bif ans<0 or ans>100:#如果结果不在0-100之间 则重新生成a bget_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 expressionexpression=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+')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+=1if 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+=1if 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就会对齐
结果:
请输入出题数量:12
12 道混合加减法题:
32-7 = 96-95= 32+66= 62+13= 52-13= 41-16= 96-62= 42+14= 26-6 = 30+14= 60+14= 69+28= 12 道混合加减法题(带答案):
32-7 =25 96-95=1 32+66=98 62+13=75 52-13=39 41-16=25 96-62=34 42+14=56 26-6 =20 30+14=44 60+14=74 69+28=97