自动生成四则运算

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命令行控制模块
posted @ 2021-11-23 19:00  周意凯  阅读(73)  评论(0编辑  收藏  举报