#python实现自动四则运算2019.11.23 | |
import random | |
import operator | |
import argparse | |
from fractions import Fraction | |
def get_Parameter():#命令行控制模块 | |
parser = argparse.ArgumentParser() | |
parser.add_argument('-n', help='设定题目数量',type=int) | |
parser.add_argument('-r', help='设定数值范围',type=int) | |
return parser.parse_args() | |
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(Fraction(random.randint(1, self.r), random.randint(1, self.r))) | |
m+=1 | |
else: | |
while m <= i: | |
nu = Fraction(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 | |
def get_Calculate(a,b,c):#四则运算 que:a b == int ? | |
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)#numerater是分子 | |
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) | |
def set_Formula(symbol,numerical,syb):#算术表达式 | |
s='' | |
if syb>100: | |
if syb == 112 or syb ==212: | |
s = '(%s %s %s %s %s) %s %s = ' % (get_Conversion(numerical[0]), symbol[0], | |
get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3])) | |
elif syb == 121 or syb ==122: | |
s = '(%s %s %s) %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0], | |
get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3])) | |
else: | |
s = '%s %s %s %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0], | |
get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3])) | |
elif syb>10: | |
if syb == 12: | |
s = '(%s %s %s)%s %s = ' % (get_Conversion(numerical[0]), symbol[0], | |
get_Conversion(numerical[1]), symbol[1], get_Conversion(numerical[2])) | |
else: | |
s = '%s %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0], | |
get_Conversion(numerical[1]), symbol[1], get_Conversion(numerical[2])) | |
else : | |
s ='%s %s %s = ' % (get_Conversion(numerical[0]),symbol[0],get_Conversion(numerical[1])) | |
return s | |
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() # 清空文件 | |
i = 1 | |
for x in data: | |
x='四则运算题目%i:%s\n'%(i,x) | |
file.write(x) | |
i +=1 | |
file.close() | |
print('%s文件保存成功'%filename) | |
def text__save(filename,data): | |
file = open(filename,'a') | |
file.seek(0) | |
file.truncate() # 清空文件 | |
i = 1 | |
for x in data: | |
x='答案%s:%s\n'%(i,x) | |
file.write(x) | |
file.close() | |
i+=1 | |
print('%s文件保存成功'%filename) | |
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) | |
if __name__ == '__main__': | |
main() |
来源:https://www.cnblogs.com/zzjjyy123/p/11919851.html