MathExam v9.999
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 15 | 10 |
Development | 开发 | 30 | 25 |
• Analysis | • 需求分析 (包括学习新技术) | 35 | 40 |
• Design Spec | • 生成设计文档 | 30 | 30 |
• Design Review | • 设计复审 | 20 | 25 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
• Design | • 具体设计 | 30 | 25 |
• Coding | • 具体编码 | 240 | 180 |
• Code Review | • 代码复审 | 25 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 100 | 80 |
Reporting | 报告 | 30 | 25 |
• Test Repor | • 测试报告 | 40 | 55 |
• Size Measurement | • 计算工作量 | 15 | 15 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 40 | 60 |
合计 | 630 |
二、需求分析
我通过百度的方式了解到,小学一、二年级数学有如下的几个特点:
- 特点1:一年级的加减法都是在0-100间进行计算的
- 特点2:都是整数,没有小数
- 特点3:没有负数
- 特点4:二年级乘法与除法源于九九乘法中的计算
- 特点5:除法中除数不能为0
经过分析,我认为,这个程序应当:
- 加减法使用的数字为0-100
- 生成减法时注意结果不能为负数
- 乘法题只生成乘法表中有的
三、设计
1. 设计思路
- 程序有一个类,主要有四个方法,用于实现以下几个目的:
- 随机生成所需的数字
- 对题目进行计算
- 将题目与答案写入文档中
- 算法的关键:
- 判断输入的格式是否正确并给予提示
- 如何按照正确的格式将题目写入文档
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地,编写代码后通过git远程上传到Github上
- 思路:通过创建数组保存题目所需的两个数以及计算后的答案,最后按照格式写入文档中,另外在输入题数与年级时,需判断输入的格式是否正确,不正确时应给予相应的提示
- 技术关键点:1.如何随机生成一个数字;2.如何判断输入的格式是否符合要求
四、编码
1. 调试日志
首先从键盘输入一个数n,然后创建三个大小为n的整型数组和一个字符数组分别来记录题目所需的两个数、计算结果以及符号,之后随机生成n组数和符号,然后进行计算,最后按照格式将题目与答案写入文档中
- 问题:第一次出的减法的题目中存在结果为负数的题目,后对其进行了修改,再没有对输入的数判断格式,后添加了判断其是否为数字的方法,当输入错误时给予提醒并重新输入
2. 关键代码
for (int i = 0; i < a.length; i++) {
a[i]=(int)(Math.random()*101);
b[i]=(int)(Math.random()*101);
t=(int)(Math.random()*2);
while(a[i]<b[i]&&t==1) {
a[i]=(int)(Math.random()*101);
b[i]=(int)(Math.random()*101);
t=(int)(Math.random()*2);
}
if(t==0) d[i]='+';
else d[i]='-';
}
}
if(m==2) {
for (int i = 0; i < a.length; i++) {
t=(int)(Math.random()*2);
if(t==0) {
a[i]=(int)(Math.random()*10);
b[i]=(int)(Math.random()*10);
}
else {
a[i]=(int)(Math.random()*82);
b[i]=(int)(Math.random()*9)+1;
}
if(t==0) d[i]='*';
else d[i]='/';
}
}```
随机生成我们所需要的数字
### 3. 代码规范
请给出本次实验使用的代码规范:
- 第一条:在 if/else/for/while/do 语句中必须使用大括号。 即使只有一行代码,避免使用单行的形式: if (condition) statements;
- 第二条:表达异常的分支时, 少用 if-else 方式。如果非得使用 if()...else if()...else...方式表达逻辑,避免后续代码维护困难, 请勿超过 3 层
- 第三条:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务
- 第四条:在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度
- 第五条:Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。
- 第六条:方法名首字母小写
## 五、测试
- 输入:10
1(正确)
- 输入:10 0/001/asdad/ 545 45 4/
1(请输入正确的题数)
- 输入:10
1 0/001/asdasd/3(请输入正确的年级)
- 输入:10 0/001/wqd/ 4554 5 6 /
1 0/002/4/ 1 /4 55 6/(请输入正确的题数与年级)
## 六、总结
注意将每个功能的代码单独写成一个方法,便于查看和理解;尽量将代码简化优化,减少不必要的变量的使用,选用更优的算法,避免开辟不必要的空间内存;注意理清代码的层次与结构,以及每个方法之间的联系