小学生四则运算项目设计
gitee项目地址:
https://gitee.com/shi-guiyu/four-yun/tree/master/
PSP
PSP2.1 |
|
预估耗时(分钟) | 实际耗时(分钟) | |
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文件。