口算大作战!!!
---个人作业1
孩子心算特别好??? 多半是练了!
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 30 | 25 |
• Design Spec | • 生成设计文档 | 30 | 35 |
• Design Review | • 设计复审 | 15 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
• Design | • 具体设计 | 20 | 25 |
• Coding | • 具体编码 | 180 | 150 |
• Code Review | • 代码复审 | 30 | 25 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 100 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | 30 |
• Size Measurement | • 计算工作量 | 20 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 65 |
合计 595 | 505 |
二、需求分析
小学一年级需求分析我通过网络搜索 小学教学大纲 ( 人教版2011 、 人教新课标版2014 )的方式了解到,小学一年级数学加减法有如下的几个特点:
经过分析,我认为,这个程序应当:
|
小学二年级需求分析在分析二年级数学的时候,我还是通过查询上面的教学大纲及(二年级人教版2011、人教新课标版2014的目录),了解到了一下几个特点:
经过分析,我认为,这个程序应当:
|
三、设计
1. 设计思路
- 在程序刚开始的设计阶段,因为要考虑一年级及二年级的问题,计划是先写一年级的内容,再去完成二年级的内容,所以我选择了模块化。分别有一个运算父类(提供四则运算需要用到的变量,以及对于变量的get()和set()方法),四个加减乘除的运算类(分别继承运算父类),一个文件I/O的输出类,一个主方法
- 使用集合来临时保存题目,答案紧接着题目存储在集合里
- 主方法有四个任务:
- 接受输入的参数
- 对输入的参数进行判断并提供相应的错误提示
- 针对年级选择符合本年级的四则运算类
- 调用输出类完成题目输出
- 四则运算类则分别产生符合本年级教学大纲的口算题目
- 输出类专门负责输出out.txt文档
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地,在本地新建PSP4331文件夹,在eclipes中创建工程
- 技术关键点:
- 如何用命令行接受参数(main函数中的args数组可以接收命令行参数)
- 如何输出out.txt文件(使用I/o对文件输出)
- 判断参数的正确性(正则表达式)
- 在一年级题目中如何让两位数加减整十数及个位数
- 除法能否变成反向的乘法(可以变成反向的乘法,先得到口诀表内的乘法 A * B = C, 然后判断是否 随机 产生一个余数D,最后结果变成(C+D)/A=B...D,或者是 C/A = B,但在产生 余数 的时候需判断 D 是否小于 除数 A)【ps:一开始我是打算这样实现的,但在当时还没想到要判断 余数 是否 小于除数,就出问题了,而且好像有点麻烦的感觉,所以那时就改成了现在的办法--(正向的除法,先直接产生一个 被除数 和一个 个位数的除数,再直接判断 商 是否为 个位 和 除数 是否小于 被除数)】
四、编码
请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程
1. 调试日志
记录编码调试的日志,请记录下开发过程中的 debug 历程
-
只输入一个参数时:无法多次运行
- 原因:在减法运算类中,rand.nextInt()里的值不确定
- 修复:在A-B中,本来B是直接随机一个小于A的数,后来改成,判断随机出来的B是否大于A,如果大于,则两数交换
-
无法识别超过规定题数的错误,无法识别0001的错误:
- 原因:判断题数的正则表达式出错
- 修复:修改正则表达式
2. 关键代码
请展示一段程序的关键代码,并解释代码的作用
firstNumber=rand.nextInt(100);
if((firstNumber/10)>0) //第一个加数是两位数的时候 (根据教学大纲,两位数只能加个位数或者整十数)
{
do {
secondNumber=rand.nextInt(10); //输出一个个位数
int n=0;
n=rand.nextInt(2); //用n随机判断第二个加数(即上一步随机的个位数)是否需要变成整十数 0:不变 1:变
if(n==0)
answerNumber=firstNumber+secondNumber; // n=0,第二个加数是不需要变成整十数,直接加,得出答案
else //第二个加数需要变成整十数
{
secondNumber=secondNumber*10; //把第二个加数*10变成整十数,再与第一个数相加
answerNumber=firstNumber+secondNumber; //得出答案
}
}while(answerNumber>=100); //判断答案是否超过100
}
else { //第一个加数是一位数
do {
secondNumber=rand.nextInt(100); //第二个数只要随机到100以内的任意数即可
answerNumber=firstNumber+secondNumber; //得出答案
}while(answerNumber>=100);//判断答案是否大于100
}
answerSet.add("("+testNumber+")"+" "+firstNumber+" + "+secondNumber+" =");//把结果输出的集合中
answerSet.add(" "+answerNumber); //把答案输出到集合中
}
这是我用来生成一年级加法的思想,因为一年级加法只能是:个位数+个位数,十位数+个位数,十位数+整十数
所以我用了上面的代码来产生一个符合要求的题目,减法运算同理。但我觉得,这种分类分步的方法有点复杂,应该还有更简单的办法
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条:代码中的命名均不能以下划线或美元符号开始,也不以一下划线或美元符号结束
- 第二条:代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式
- 第三条:类名使用UpperCamelCase风格
- 第四条:方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
- 第五条:杜绝完全不规范的缩写,避免忘文不知义,都以英文单词命名
五、测试
请思考并记录你认为必要的测试点,并记录测试用例与测试结果
六、总结
请总结过程中的教训和经验,思考
- 程序不仅仅只是编码,在开始编码前应该还有很多工作要做,要分析需求,设计好文档,才能在完成的时候符合要求
- 编码前要先构思,有一个大致的方向
- 测试是很有用的事情,虽然有很多数据要输入,很麻烦,但却是程序完成所必不可少的过程,需要通过测试来发现潜在的bug
- 重构代码还是不怎么理解,对于这方面的知识还要加强
- try catch不怎么会用,对异常理解不多
- 对于代码的注释也要有,要在关键点做好标记,方便后续查看