• 小学生四则运算项目设计


    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文件。

  • 相关阅读:
    【计蒜客习题】取石子游戏
    【SCOI2005】骑士精神
    依赖背包
    强连通分量
    2017 Multi-University Training Contest
    2017 Multi-University Training Contest
    3月每日。
    2月每日DONE。
    寒假划水。
    基础实验2-2.5 整数分解为若干项之和 (20分)--dfs
  • 原文地址:https://www.cnblogs.com/sgy614092725/p/shiguiyu34.html
Copyright © 2020-2023  润新知