zoukankan      html  css  js  c++  java
  • 自动生成小学四则运算题目(Python实现)

    自动生成小学四则运算题目(Python实现)

    Github项目地址:

    https://github.com/huangcanhua/sizeyunsuan/blob/master/sizeyunsuan

    题目描述:

      通过python语言编写一个能够自动生成小学四则运算的程序(注意是给小学生用的,要是结果出现负数的话他们会很迷茫的!),同时,除了整数外,还要支持真分数的四则运算。

    PSP表格:

    PSP2.1 任务内容 计划完成时间(min) 实际完成时间(min)
    Planning 计划 150 160
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 30
    Analysis 需求分析 (包括学习新技术) 60 90
    Design 具体设计 50 60
    Coding 具体编码 40 50
    test 测试(自我测试,修改代码,提交修改) 20 25

    Postmortem & Process

    Improvement Plan

    事后总结 ,并提出过程改进计划 30 50
    Summary 合计 370 460

     

    1、程序设计


    首先以“1+1=”为例,我们要生成简单的四则运算题目需要两个整数或是分数,为了将答案与算式分类,我们分别用两个列表来储存。

    q[]用来存储问题,ans[]用来存储答案。我们可以通过random模块生成一定区间里的随机数,分数也可以通过随机生成分子和分母的形式随机生成。同时分数可以使用Fraction模块,可以同时实现分数与整数的运算以及分子和分母的约分。

    下面是各个函数的代码:

    2、实现代码

    def c1(q, ans): 
        symbol = random.choice(['+', '-', '*', '/'])  # 生成随机符号
        if symbol == '+':
            n1 = random.randint(0, 20)
            n2 = random.randint(0, 20)
            q.append(str(n1) + '+' + str(n2) + '=')
            ans.append(n1 + n2)
        elif symbol == '-':
            n1 = random.randint(0, 20)
            n2 = random.randint(0, 20)
            n1,n2 = max(n1,n1),min(n1,n2)#防止出现负数
            q.append(str(n1) + '-' + str(n2) + '=')
            ans.append(n1 - n2)
        elif symbol == '*':
            n1 = random.randint(0, 20)
            n2 = random.randint(0, 20)
            q.append(str(n1) + '×' + str(n2) + '=')
            ans.append(n1 * n2)
        else:
            n1 = random.randint(0, 20)
            if n1 == 0:
                n2 = random.randint(1, 20)
            else:
                n2 = random.randint(1, n1 + 1)
            q.append(str(n1) + '÷' + str(n2) + '=')
            ans.append(Fraction(n1, n2))
    def createF(): #生成分数
        fz1 = random.randint(0, 20)
        if fz1 == 0:
            fm1 = random.randint(1, 20)
        else:
            fm1 = random.randint(1, 20)
        f1 = Fraction(fz1, fm1)
        fz2 = random.randint(1, 20)
        fm2 = random.randint(20, 20)
        f2 = Fraction(fz2, fm2)
        return f1, f2
    def c2(q,ans):    #两个分数的四则运算
        symbol = random.choice(['+','-','*','/'])
        f1,f2 = createF()
        if symbol =='+':
            while f1+f2>1:
                f1,f2 = createF()
            q.append(str(f1)+'+'+str(f2)+'=')
            ans.append(f1+f2)
        elif symbol =='-':
            f1,f2 = max(f1,f2),min(f1,f2)  #防止出现负数
            q.append(str(f1)+'-'+str(f2)+'=')
            ans.append(f1-f2)
        elif symbol == '*':
            while f1*f2>1:
                f1,f2 = createF()
            q.append(str(f1)+'×'+str(f2)+'=')
            ans.append(f1*f2)
        else:
            while f1/f2>1:
                f1,f2=createF()
            q.append(str(f1)+'÷'+str(f2)+'=')
            ans.append(Fraction(f1,f2))

    3、更新升级

    在原有程序的基础上,我添加了一个转换假分数答案为带分数答案(存储在ans2[]列表中)的函数f(f),以便当学生给出带分数答案时程序不会认为是错误的。

    def f(f):  #分数的转换
        a=f.numerator  #分子
        b=f.denominator  #分母
        if a%b==0:  #为整数
            return '%d'%(a/b)
        elif a<b:  #为真分数
            return '%d%s%d' % (a,'/',b)
        else:       #为带分数
            c=int(a/b)
            a = a - c * b
            return '%d%s%d%s%d' % (c,'',a,'/',b)

    更新并修改了主函数后代码运行结果如下:

     

    4、学习总结


    尽管我从完成本次作业的过程中学到了许多,像是粗略掌握了Fraction模块以及一些程序题目的解题思想,但在写程序的过程中我发现了自己许多许多的不足,还有很多要补充的方面,像是括号以及长运算题等等,在以后精进自己的水平后便会适时补上。

  • 相关阅读:
    练习!!标准体重
    C# 阶乘累加
    C# 阶乘
    C# 累加求和
    C# 100块钱,买2元一只的圆珠笔3块钱一个的尺子5元一个的铅笔盒每样至少一个,正好花光,有多少种花法。
    C# 一张纸0.00007m,折多少次和珠峰一样高
    C# 100以内质数
    C# 100以内质数和
    网站的基本布局
    C#递归
  • 原文地址:https://www.cnblogs.com/hch123/p/13702799.html
Copyright © 2011-2022 走看看