小学生四则运算项目设计

gitee项目地址:

https://gitee.com/shi-guiyu/four-yun/tree/master/

PSP

PSP2.1
Personal Software Process Stages
预估耗时(分钟 实际耗时(分钟)
Planning 计划 10 8
· Estimate · 估计这个任务需要多少时间 15 9
Development 开发 710 760
 Analysis · 需求分析 (包括学习新技术) 30 25
· Design Spec · 生成设计文档 30 40
· Design Review · 设计复审 (和同事审核设计文档) 10 15
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 10
· Design · 具体设计 40 60
· Coding · 具体编码 300 350
· Code Review · 代码复审 60 90
· Test · 测试(自我测试,修改代码,提交修改) 180 120
Reporting 报告 290 350
· Test Report ·测试报告+博客 240 510
· Size Measurement ·计算工作量 10 15
· Postmortem & Process Improvement Plan ·事后总结,并提出过程改进计划 40 60
合计   1970 2422

 项目要求

- 能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)
- 除了整数外,还要支持真分数的四则运算。
- 参与运算的操作数在100以内。
-并且能处理用户的输入,并且判断对错。
解题思路

 

 

 解决方法:

1、利用python的random库来自动生成1~100以内的数,并且在+-*÷中随机选择一个符号。

2、要注意项目要求是有真分数运算,并且在减法中得出的结果不能是负数。

具体程序设计

question类的设计(生成等式的类)

 

class question:
    def __init__(self,num1,num2,num3,num4,sign,sign1):
        self.num1 = num1
        self.num2 = num2
        self.num3 = num3
        self.num4 = num4
        self.sign = sign
        self.sign1 = sign1
    #@profile
    def equal(self):     #生成算式等式
        if self.num1<self.num2:
            t=self.num1
            self.num1 = self.num2
            self.num2 = t
            
        if self.num3<self.num4:
            temp=self.num3
            self.num3 = self.num4
            self.num4 = temp
        
        if self.sign1=='/' :
            eqstr = '('+str(self.num2)+'/'+str(self.num1)+')'+ self.sign + '('+(str(self.num4)+'/'+str(self.num3))+')'
        
        else:
            eqstr = str(self.num1) + self.sign + str(self.num2)
            
        print(eqstr)

 

 

 

judge类的设计(判断用户输入是否正确)

class calculate:
    def __init__(self,num1,num2,num3,num4,sign,sign1,answer):
        self.num1 = num1
        self.num2 = num2
        self.num3 = num3
        self.num4 = num4
        self.sign = sign
        self.sign1 = sign1
        self.answer = answer
    #@profile
    def judge(self):
            
        if self.sign1 == '/':
            if self.sign == '+' :
                rightAnswer = (self.num1/self.num2) + (self.num3/self.num4);
            elif (self.sign == '-'):
                rightAnswer = (self.num1/self.num2) - (self.num3/self.num4)
            elif (self.sign == '*'):
                rightAnswer = (self.num1/self.num2) * (self.num3/self.num4)
            elif (self.sign == '÷'):
                    rightAnswer = (self.num1/self.num2)  / (self.num3/self.num4)
            else:
                print("错误")
        else:
            if self.sign == '+':
                rightAnswer =self.num1 + self.num2
            elif (self.sign == '-'):
                if(self.num1 >= self.num2):
                    rightAnswer = self.num1 - self.num2
                else:
                    rightAnswer = self.num2 - self.num1
            elif (self.sign == '*'):
                    rightAnswer = self.num1 * self.num2
            elif (self.sign == '÷'):
                    rightAnswer = self.num1 / self.num2
        if abs(self.answer-rightAnswer)<=0.01:
            print("答案是正确的")
        else:
            print("答案是错误的")
            

main函数的设计

def main():
    num1 = random.randint(1,100)    #生成100内的随机数
    num2 = random.randint(1,100)    
    num3 = random.randint(1,100)    #生成真分数分子
    num4 = random.randint(1,100)     #分母
    sign = random.choice('+-*÷')
    sign1 = random.choice('+-*÷/')
    que = question(num1,num2,num3,num4,sign,sign1)
    que.equal()
    print("请输入答案")
    answer = float(input())
    cal = calculate(num1,num2,num3,num4,sign,sign1,answer)
    cal.judge()

以main函数逻辑运行

if __name__ == '__main__':
    main()

运行的结果如下:

 

 

对上述代码进行效能分析

方法一、line_profile(line_profiler可以统计每行代码的执行次数和执行时间等,时间单位为微妙。)

使用方法:

1.在需要测试的函数加上@profile装饰,这里我们把测试代码写在E:\人工智能\class.py文件上.

2.运行命令行:kernprof -l -v E:\人工智能\class.py

输出结果如下:

如下是question类中的equal方法测试

 

 

 如下是calculate类中的judge方法。

 

 

 方法二:

memory_profiler

memory_profiler工具可以统计每行代码占用的内存大小。

安装:

pip install memory_profiler  

pip install psutil

使用: 

1、在需要测试的函数加上@profile装饰
 输入命令:mprof run test.py
结果会生成一个.dat文件,如”mprofile_20160716170529.dat”,里面记录了内存随时间的变化

2、再输入命令mprof plot
使用该命令以图片的形式展示出来

 

结果如下:

再当前目录下生成.dat文件如下

 

 

 

 

 画图显示结果如下:

 

 

 

 

使用单元测试对项目进行测试,并且使用插件查看测试分治覆盖率等指标。

Coverage的使用

1.命令行方式

详见:http://coverage.readthedocs.io/en/latest/cmd.html

可以使用help命令查看帮助:$ coverage help

关键命令如下:

A.run

执行代码覆盖率统计,只需要通过coverage的run参数执行被统计代码即可。

$ coverage run test.py arg1 arg2

test.py是测试脚本,arg1 arg2是test.py执行需要的参数。跑完后,会自动生成一个覆盖率统计结果文件(data file):.coverage。

B.report

有了覆盖率统计结果文件,只需要再运行report参数,就可以在命令里看到统计的结果。

Stmts/Miss表示语句总数/未执行到的语句数

Cover=(Stmts-Miss)/Stmts

 

c. html

生成html的测试报告。

 $ coverage html -d covhtml

结果如下:

 

 

 

 注:高亮显示覆盖的和未覆盖的代码,覆盖的用绿色标示,未覆盖的用红色标示。

coverage run test.py命令运行的文件,会统计项目中包括测试文件本身在内的所有文件,run参数的子参数—source可以指定要统计的文件:

$ coverage run --source=totest.py test.py 可以只统计totest.py文件。

 

posted @ 2020-09-22 17:59  哈哈哈和  阅读(305)  评论(0编辑  收藏  举报