最可爱的标题
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
? Estimate | ? 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | ||
? Analysis | ? 需求分析 (包括学习新技术) | 30 | 60 |
? Design Spec | ? 生成设计文档 | 30 | 30 |
? Design Review | ? 设计复审 | 30 | 30 |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
? Design | ? 具体设计 | 30 | 40 |
? Coding | ? 具体编码 | 120 | 180 |
? Test | ? 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | ||
? Test Repor | ? 测试报告 | 30 | 30 |
? Size Measurement | ? 计算工作量 | 10 | 20 |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 495 |
二、需求分析
我通过查询教学大纲及研究相关试卷的方式了解到,小学一年级及二年级数学有如下的几个特点:
- 特点1
- 加法的和应该小于等于100
- 特点2
- 减法的差应该大于0
- 特点3
- 无论是加法还是减法,两侧数都不应该超过100
- 特点4
- 乘法只在99乘法表范围内
- 特点5
- 被除数要大于0小于100
- 特点6
- 除数应该是个位数
经过分析,我认为,这个程序应当:
- 使用的数字小于100
- 要保证加法时的不超过100
- 要保证减法时的差不为负数
- 乘法时左右两边都应该是个位数
- 除法时要保证被除数大于除数
- 被除数及除数不能为0
- 除数及商需要为个数
三、设计
1. 设计思路
- 这个程序有一个类,3个函数
- 主函数负责判断传入参数是否合法并将合法参数传给math函数生成题目
- check函数负责生成相应随机数并判断是否合适
- math函数负责调用check函数获取合适的数值及符号最后写入文件
- 算法的关键的关键是什么?
- 生成合适的随机数
- 各函数之间的功能联系
- 出错后的提示,并且让程序顺利结束
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地
- 技术关键点:梳理一下设计思路,可能遇到哪些技术关键点
- 随机数的使用,本程序需要大量的使用Math.random()方法
- 全局静态变量的使用,本程序需要多个静态函数共享数据
- ArrayList数组的使用,用该数组存储题目及答案的字符串,相比普通数组,该数组可以动态增加空间
四、编码
1. 调试日志
- 在代码的什么位置,代码出现了什么问题,问题会导致什么结果,怎么解决的
- 在主函数中判断参数时我直接将String类型的参数通过Integer.parseInt()方法转换成数值,当参数为非数值时程序则会出错。处理方法:用一个函数判断输入参数是否为数字字符串,最后再将字符串参数转为int型数值
- 在主函数中,将字符串转为int型数值时,若传入参数数值超过int型数值范围则程序出错。处理方法:考虑到实际情况,用户需要的题目数量本就不需要太多,则可以直接限制出题数量,在判断完传入的参数字符串是数字串后直接限制字符串的长度不超过4,则可以保证数值不大于9999。
2. 关键代码
请展示一段程序的关键代码,并解释代码的作用
public static boolean checkOne() {
a = (int) (0 + Math.random() * (100 - 0 + 1));
b = (int) (0 + Math.random() * (100 - 0 + 1));
// sym为1即为正,2即为负
sym = (int) (1 + Math.random() * (2 - 1 + 1));
if (sym == 1) {
if ((a + b) > 100) {
return false;
} else {
return true;
}
} else {
if ((a - b) < 0) {
return false;
} else {
return true;
}
}
}
public static void mathOne(int n) {
String prob;
String ans;
ArrayList<String> probs = new ArrayList<String>();
ArrayList<String> anss = new ArrayList<String>();
boolean end = false;
for (int i = 1; i <= n; i++) {
do {
end = checkOne();
} while (!end);
// sym为1即为正,2即为负
if (sym == 1) {
prob = "(" + i + ")" + " " + a + " " + "+" + " " + b;
ans = "(" + i + ")" + " " + a + " " + "+" + " " + b + " " + "=" + " " + (a + b);
} else {
prob = "(" + i + ")" + " " + a + " " + "-" + " " + b;
ans = "(" + i + ")" + " " + a + " " + "-" + " " + b + " " + "=" + " " + (a - b);
}
probs.add(prob);
anss.add(ans);
}
}
- 该段代码有两个方法,math方法调用check方法用来生成符号及符号两边的数,并且判断生成的数是否合适,合适的时候该函数才会返回真,此时math才能继续执行,将问题及答案存入ArrayList数组。
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条、代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
- 第二条、类名使用UpperCamelCase风格
- 第三条、方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
- 第四条、方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
五、测试
请思考并记录你认为必要的测试点,并记录测试用例与测试结果
测试项目 | 测试语句 | 预期结果 | 测试结果 |
---|---|---|---|
不输入任何参数 | java MathExam4269 | 输入的参数个数不为2,请重试 | 输入的参数个数不为2,请重试 |
输入一个参数 | java MathExam4269 20 | 输入的参数个数不为2,请重试 | 输入的参数个数不为2,请重试 |
输入二个参数 | java MathExam4269 20 1 | 成功写入20道一年级题目到文件out.txt | 成功写入20道一年级题目到文件out.txt |
输入二个参数且第一个参数小于0 | java MathExam4269 -10 1 | 输入有误,请重新输入 | 输入有误,请重新输入 |
输入二个参数且第一个参数大于9999 | java MathExam4269 10000 1 | 输入题数过大,请重试 | 输入题数过大,请重试 |
输入二个参数且第二个参数不为1和2 | java MathExam4269 20 5 | 输入的年级有误,请重试 | 输入的年级有误,请重试 |
六、总结
- 开始时应该花更多时间分析需求,设计程序架构,能为后续的开发提高很多效率
- 要考虑到后续可能的升级,把需要的功能拆分成函数,专门的功能由专门的函数处理
- 重复的代码太多,需要进一步优化
- 调试程序时要考虑到尽可能多的情况
原文地址:https://www.cnblogs.com/lk123/p/9630840.html
时间: 2024-11-05 23:32:37