一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 180 | 200 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 10 | 10 |
• Design Spec | • 生成设计文档 | 5 | 5 |
• Design Review | • 设计复审 | 5 | 5 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 10 | 10 |
• Coding | • 具体编码 | 60 | 60 |
• Code Review | • 代码复审 | 5 | 5 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 30 | 30 |
• Test Repor | • 测试报告 | 30 | 30 |
• Size Measurement | • 计算工作量 | ||
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 200 |
二、需求分析
- 特点1
- 经过分析,我认为,这个程序应当:
- 一年级使用20以内的数字进行加减法,并且结果需要小于等于20大于等于0。
- 二年级使用乘法表上的乘法作为题目,除法则是100以内的数除以一个个位数,并且答案也应该为个位数。
三、设计
1. 设计思路
说明你如何设计这个程序
- 这个程序需要有三个函数,一个一年级函数,一个二年级函数,一个输出文件函数。
- 使用主函数调用一年级函数或二年级函数,函数计算完成之后调用输出文件函数进行输出
- 算法的关键是
- 1.使用数组保存随机出的数值,符号,答案
- 2.一年级函数中,需要判断两数相加或相减是否小于等于20大于等于0,如果不是使用 i--并使用continue结束当前循环,使当前数值作废。
- 3.二年级函数中,除法需要将答案作为被除的数,第一个随机数值或第二个随机数值作为除数,以保证符合需求,并减少时间浪费。
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地...
- 技术关键点:输入数值验证,使用while无限循环,如果数值正确使用break脱离循环。 使用二维数组保存随机出的数值。
四、编码
- 首先随机三个数值,a,b,m,m为符号限制随机数只能为1,2,1代表加法2代表减法,在二年级则是乘除。
- 一年级先随机abm,然后根据m的数决定加减,计算出ans答案,然后验证ans是否小于而是,如果不小于20则continue,将此次数据作废,然后将a b m ans存入一个二维数组,二维数组第一个数代表题目,第第二个数0 2代表运算的两个数,1代表符合,3代表答案。
- 二年级先随机abm,如果m为1,使用乘法,将a m b ans依次存入二维数组中,如果m为2,则是除法此时将ans 与 a作为运算数值,b作为答案。
- 输出的时候先将二维数组的0 1 2 输出出去,作为题目,然后将0 1 2 3 输出,作为答案。
1. 调试日志
- 第一次调试,发现所有结果都是0,发现是放在for循环数组的第一个数写成n了。
- 第二次调试,发现一年级ans不符合标准,使用if,剔除不符合标准的数值
- 第三次调试,发现二年级ans不符合标准,除法使用ans 与 a作为运算数值
- 第四次调试,发现没有处理异常的能力,是用while循环,检测输入数值是否在规定数值内,如果符合使用break跳出循环,如果不符合则继续循环。
2. 关键代码
for(int i = 0; i < n; i++) {
int a = (int) (Math.random()*20);
int b = (int) (Math.random()*20);
int ans = 0;
int mark = (int) (Math.random()*2+1);
String strMark = null;
if(mark == 1) {
ans = a+b;
strMark = "+";
}else {
ans = a-b;
strMark = "-";
}
if(ans >= 20 || ans < 0) {
i--;
continue;
}
str[i][0] = String.valueOf(a);
str[i][1] = strMark;
str[i][2] = String.valueOf(b);
str[i][3] = String.valueOf(ans);
}
- 将答案大于20的数值剔除掉,将符合需求的数值存入二维数组中
3. 代码规范
- 第一条:不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
- 第二条:大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:左大括号前不换行。左大括号后换行。右大括号前换行。右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- 第三条:左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格。
- 第四条:在 if/else/for/while/do 语句中必须使用大括号。
- 第五条:任何二目、三木运算符的左右两边都需要加一个空格。
- 第六条:单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。运算符与下文一起换行。方法调用的点符号与下文一起换行。方法调用时,多个参数,需要换行时,在逗号后进行。
五、测试
需要测试如果输入数值不是规定数值,程序是否能处理这种情况
- 输入200 输出:您输入的不是小于100大于0的整数,请重新输入
- 输入-1 输出:您输入的不是小于100大于0的整数,请重新输入
- 输入1.1 输出:您输入的不是小于100大于0的整数,请重新输入
- 输入-2.1 输出:您输入的不是小于100大于0的整数,请重新输入
- 输入0 输出:您输入的不是小于100大于0的整数,请重新输入
- 输入10 3 输出:您输入的不是1或2,请重新输入
- 输入10 -1 输出:您输入的不是1或2,请重新输入
- 输入10 1.1 输出:您输入的不是1或2,请重新输入
- 输入10 0 输出:您输入的不是1或2,请重新输入
- 输入10 -2.6 输出:您输入的不是1或2,请重新输入
输入6 1输出正常
六、总结
- 本次作业先将问题简化,先在主函数里写出随机一个加减法的函数,然后写出一个二维数组进行储存,然后写出一个输出函数。然后将一年级函数与输出函数从主函数中分开,分为单独的函数,然后再写一个二年级函数,将一年级函数复制过去,在判断符号处进行修改。然后测试程序是否能够正常运行。测试成功后,在处理异常输入数据。