自动生成四则运算
python实现:
import random
list1=[]
#a=int(input('计算数字最大是:'))
sym=['+','-','×','÷']
def szys():
f=random.randint(0,3)
n1=random.randint(1,10)
n2=random.randint(1,10)
n1,n2=max(n1,n2),min(n1,n2)
result=0
if f==0: #加法
result=n1+n2
elif f==1: #减法
result=n1-n2
elif f==2: #乘法
result=n1*n2
elif f==3: #除法
b=n1//n2
c=n1%n2
result=str(b)+'...'+str(c)
return '{0}{1}{2}='.format(n1,sym[f],n2),str(result)
t=int(input('题目数量:'))
tt=0
while tt<t:
list1+=szys()
list1+='\r'
tt+=1
f1=open('题目+答案','w+')
f1.writelines(list1)
有一缺点:题目和答案没有分开。因为局部参数和全局参数的问题,只能将局部参数一次性全部返回,目前未能解决,较为遗憾。
实现过程中产生的问题和解决在本周总结中会提及。
抄的:
import argparse
import random
import fractions
import operator
#1.命令控制模块
def get_Parameter():#命令行控制模块
parser = argparse.ArgumentParser()
parser.add_argument('-n', help='设定题目数量',type=int)
parser.add_argument('-r', help='设定数值范围',type=int)
return parser.parse_args()
#2.建立一个类用以生成随机数与运算符
class com(object):
def __init__(self, r):#初始化
self.r=r
def get_Arithmeticl(self):#获得随机数字与符号
symbol=[]
numerical=[]
syb=0
n=1
m=0
i=random.randint(1, 3)
for x in range(i):
sy=random.choice(['+','-','×','÷'])
if sy=='+'or sy=='-':
syb +=10**(i-x-1)
else :
syb += 2 * (10 ** (i - x - 1))
symbol.append(sy)
if self.r < 10:
n = int(10 / self.r)
if n==1:
while m <= i:
numerical.append(fractions(random.randint(1, self.r), random.randint(1, self.r)))
m+=1
else:
while m <= i:
nu = fractions(random.randint(1, self.r * n), random.randint(1, self.r * n))
if nu<=self.r:
numerical.append(nu)
m += 1
return symbol,syb,numerical,i
#3.识别运算符和分数的转换
def get_Calculate(a,b,c):#四则运算
if c=='+':
results=a+b
elif c=='-':
results=a-b
elif c=='×':
results=a*b
else:results=a/b
return results
def get_Conversion(fraction):#假分数转化真分数
if fraction.numerator%fraction.denominator==0:
return '%d'%(fraction.numerator/fraction.denominator)
elif fraction.numerator>fraction.denominator:
a=int(fraction.numerator/fraction.denominator)
b, c = fraction.numerator - a * fraction.denominator, fraction.denominator
return '%d%s%d%s%d' % (a,'’',b,'/',c)
else:
b, c = fraction.numerator, fraction.denominator
return '%d%s%d' % (b,'/',c)
#4.生成算式列表和查重
def get_Formula(n,r):#生成题目和答案列表
Exercises,Answers,Exercises1,Exercises2=[],[],[],[]
x=1
while x<n+1:
symbol, syb, numerical,i = com(r).get_Arithmeticl()
results = numerical[0]
judge = True
for y in range(i):
calculate=get_Calculate(results,numerical[y+1],symbol[y])
if calculate>=0:#判断算式是否合法
answer=calculate
else:
judge=False
break
if judge:#查重
try:
num=Answers.index(answer)#判断重复答案的索引
if operator.eq(Exercises1[num],symbol) and operator.eq(Exercises2[num],numerical):
pass
except ValueError as e:#可以写入
Answers.append(answer)
Exercises1.append(symbol)
Exercises2.append(numerical)
Exercises.append('%d. %s'%(x,set_Formula(symbol,numerical,syb)))
x+=1
else:pass
return Exercises,Answers
def text_save(filename, data):#filename为写入文件的路径,data为要写入数据列表.
file = open(filename,'a')
file.seek(0)
file.truncate() # 清空文件
for x in data:
x='%s\n'%(x)
file.write(x)
file.close()
print('%s文件保存成功'%filename)
#6.main函数
def main():
args = get_Parameter()
if args.n:
n = args.n
if args.r:
r = args.r
Exercises, Answers = get_Formula(n, r)
for x in range(n):
Answers[x] = '%d. %s' % (x + 1, get_Conversion(Answers[x]))
print('本次共生成题目%d道\n题目数值范围为0-%d' % (n, r))
text_save('Exercises.txt', Exercises)
text_save('Answers.txt', Answers)
但是现在还不知道里面的Formula是什么。在学习这个算法中去学了有关argparse命令行控制模块