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