| #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