Github项目地址:https://github.com/Lily4323/lily-

   1、 题目要求:

    a:能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)

    b:除了整数外,还要支持真分数的四则运算、

   2、PSP表格:

(在开始实现程序之前,通过PSP表格估计程序的各个模块的开发上耗费的时间)

 

PSP2.1

Personal Software Process Stages

预估耗时(min)

实际耗时(min)

Planning

计划

15

30

 Estimate

估计这个任务需要多少时间

10

15

Development

开发

120

160

Analysis

需求分析

10

20

Design Spec

生成设计文档

20

30

Design

具体设计

10

20

Code

具体编码

180

220

Test

测试(自我测试,修改代码,提交修改)

40

60

Reporting

报告

20

30

Summary

合计

 425

 585

 

    3、项目思路:

a.能够让用户输入自己想要的数量

b.能够随机给用户列出四则运行的运行公式

c.可以在用户进行回答后列出该运算法则的结果并对其结果进行判断是否正确,并能够在命令行中表现出来

d.考虑是小学生的四则运算加减乘除,采用两个随机数,不能出现负数,除法在运算中,除数不能取0。

 

    4、项目实现

     1)思路设计实现

问题a:可以在代码中利用数组来控制用户想要输出的题目数量

问题b:可以利用Python自带的随机函数获得随机的操作数和随机的运算符

问题c:可以将随给出的操作数用一个变量进行储存,并在用户进行输入后对该输入值进行对比,在对比错误的情况下,输出储存的变量值。

问题d:由于不能出现负数,所以在对两个随机数进行减法运算的时候,可以对两个随机数进行比较大小。

  定义函数:用def szys()实现随机生成四则运算最后输出算式并返回正确答案

      2)代码说明:

我们知道,在进行四则运算时进行真分数运算应注意假分数的影响,因此我们在进行代码编写时应注意分数的运算,代码更新如下

import random
from fractions import Fraction
##两个整数的四则运算
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 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)
##两个分数的四则运算
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))
def main():
    while 1:
        print("输入题目的数量", end='  ')
        k = int(input())
        p = 100 / k
        s = 0
        q = []
        ans = []
        ans2 = []
        for i in range(k):
            n = random.randint(1, 4)
            if n == 1:
                c1(q, ans)
                g = Fraction(ans[i])
                ans2.append(f(g))
            else:
                c2(q, ans)
                g = Fraction(ans[i])
                ans2.append(f(g))#记录带分数答案
        for i in range(k):
            print("第{}题:{}".format(i + 1, q[i]), end="  ")
            a = input()
            if a == str(ans[i]):
                s = s + p
        print("所得的分数为:{}".format(s))
        print("正确答案:", end="  ")
        for i in range(k):
            if str(ans[i]) == str(ans2[i]):
                print(q[i] + str(ans[i]))
            else:
                print("{}{}或{}".format(q[i],str(ans2[i]),str(ans[i])))
if __name__ == '__main__':
    main()

    3) 测试运行结果:

 5.性能分析

 

python的性能测试工具有很多种,无非模块是纯Python还是用C写的。这次我使用cProfile对上面的代码进行性能分析:

列名

含义

ncalls

表示函数调用的次数

tottime

表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间

percall

(第一个percall)等于 tottime/ncalls

cumtime

表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间

percall

(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls

filename:lineno(function)

每个函数调用的具体信息,一般指向函数名

 

 由于篇幅问题,对部分指数进行分析。通过上面的性能分析结果可以看出该代码有165个函数被调用,用时2.780秒

 接下来我们再回到我们的SPS表格记录下我们在各阶段所用的实际时间。

 我们的小学四则运算项目基本完成啦。。。。