211614331 王诚荣 211614354 陈斌 --第一次结对作业
本体
《口算大作战 2》标准版现已发布!!!项目本体包含题库调用模块,一二年级口算模块。
DLC
《口算大作战 2》DLC:算法真奇妙 现在您可以免费获得此DLC!!!
单击此处了解详情:DLC:算法真奇妙
一、开发时间表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 10 | 5 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 10 | 10 |
• Design Spec | • 生成设计文档 | 10 | 15 |
• Design Review | • 设计复审 | 5 | 5 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
• Design | • 具体设计 | 30 | 60 |
• Coding | • 具体编码 | 300 | 1320 |
• Code Review | • 代码复审 | 30 | 35 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 40 | 60 |
• Size Measurement | • 计算工作量 | 5 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 15 |
合计 | 525 | 1640 |
二、用户需求分析
我通过作业要求的方式了解到,小学三年级数学有如下的几个特点:
- 运算符在2~4个
- 保留为一、二年级出题功能
- 除法运算不能出现小数,只能是整数
- 可以加括号
- 减法运算的结果不能有负数
- 除法运算除数不能为0,不能有余数
- 加减乘除混合运算
经过分析,我认为,这个程序应当:
在作业一上新增带括号的四则混合运算。
三、项目设计设计
1. 设计思路
用户输入的参数,需要判断是否符合要求,不符合就直接结束运算,符合就继续判断。
根据输入的参数,随机生成加减乘除运算,运算需要符合小学一二三年级的算术规则。
在本次结对作业中,我负责做主函数的编码还有文件输入输出以及一二年级算术的模块整合和测试部分。
2. 实现方案
- 用命令行输出四个参数 :
- args[0 ] : -n(题数)
- arg[ 1]:-n的值
- arg[ 2]:-grade(年级)
- arg[ 3]:-grade的值
- 把加减乘除拆分成了四个方法
- 输出out.txt文件
- 测试结果数值的准确性还有检查代码的BUG与修复
四、编码方案
- 用args[0 ],args[1 ],args[2 ],args[3 ]数组来实现从命令行中接收到的参数
- 用Random来生成随机数
- 判断输入参数 -n 还有-grade 的先后顺序
- 加减乘除的设计算法
1. 调试日志
- 如果数组越界,就扩大数组;
- 无法用命令行直接传参,用args数组解决;
- 不会将运算后的结果写入txt文件里,通过伙伴的解答后,找到了解决办法;
- 发生过题号都是1,原因是没有循环变量i或者j++;
- 本来题目是数量是10,运行后只输出5套题,原因是用了同一个循环变量i来统计题号和参与循环,导致集合越界。
- ArrayList集合中变量都为String类型,int类型的变量需要先强制转换成String类型。
- 在主函数代码设计中,出现了几处BUG,比如在年级参数中输入001,不能识别年级参数001的错误,显示的是结果却是right,原因是正则表达式[^0]\\ *与!冲突,删除感叹号后并且当args[1]为-n的数值时候,args[ 1].matches("\\d+")代表从1开始后的数字,之前写成\\d*,把数值0也包括了进去,导致判断错误。
还有一处BUG是在输入题数参数0.1,不能识别题数参数0.1的错误,显示的结果却也是right,原因是if判断语句的括号没有括对位置,导致有的判断语句会直接跳过。
2. 关键代码
if (args.length != 4) {
isError = false;
errorMessage = "参数错误,输入的参数个数必须得为4";
}
else if (args[0].equals("-n") && args[2].equals("-grade")) {
//输入的一个参数是题数,第二个参数是年级
if (args[1].length() >= 5 || args[1].length()==0) {
isError = false;
errorMessage = "参数错误,输入题数的参数不能是超过四位数且不能为0位数";
}
else if ((!args[1].matches("\\d+")) || args[1].matches("[0]\\d*")) {
isError = false;
errorMessage = "参数错误,输入题数的参数必须都为数字和正整数,且输入的参数中不能以0开头";
}
else if (!args[3].matches("[123]")) {
isError = false;
errorMessage = "参数错误,输入年级的参数必须为123数字中的其中一个";
}
}
else if (args[0].equals("-grade") && args[2].equals("-n")) {
//输入的第一个参数是年级,第二个参数是题数
if (!args[1].matches("[123]")) {
isError = false;
errorMessage = "参数错误,输入年级的参数必须为123数字中的其中一个";
}
else if (args[3].length() >= 5 || args[3].length()==0) {
isError = false;
errorMessage = "参数错误,输入题数的参数不能是超过四位数且不能为0位数";}
else if (!(args[3].matches("\\d+")) || !args[3].matches("[^0]\\*")) {//bug修复:无法识别年级为001
isError = false;
errorMessage = "参数错误,输入题数的参数必须都为数字和正整数,且输入的参数中不能有以0开头";
}
}
else if(args[0].matches("\\d+") || args[2].matches("\\d+")) {
isError = false;
errorMessage = "参数错误,输入的参数位置不对";
}//判断结束
3. 代码规范
- 采用四个空格缩进,不能使用tab键
- 一些模糊的变量需要用//xxxxxxxxxxxxxxxx来备注,以便知道变量代表的什么意思
- 同一个类中避免出现相同的字母变量
- 尽量使用if{}else,不要一直if去判断
- 变量都需要先赋予初始值
五、BUG调试
在测试的过程中,要判断输入参数-n 还有-grade的先后顺序,还要判断它们数值的各种不同,比如小数点,负数,字母,0开头的数字等等,一共能排出几十种的不同的参数顺序,结果也是很多不同,还发现了好几处BUG地方,经过反复测试以后,将BUG都修复完成了。由于是有四个参数的输入,在测试过程中也比较繁琐,需要认真仔细的将每一个参数的不同都测试过去。
六、开发者有话说
- 需要养成代码缩进的好习惯;
- 写代码的格式很不规范,需要慢慢实践改善;
- 平时不常敲代码,对JAVA的一些基础知识的理解还有些欠缺,这次的很多不理解的地方经过伙伴和百度的帮助下,解决了很多问题;
- 拿到项目前一定要先分析需求,构思好大致方向,才能高效率敲好代码。
- 这次的结对作业,让我认识了一个人的力量是有限的,如果有一个伙伴与自己共同完成项目的话,那样做项目会事倍功半,更有效率,遇到不同的地方问问自己结对的伙伴,也比一直上网百度要靠谱很多,也来的效率,遇到不会的地方,经过伙伴的解答,也能加深自己在这不会的地方如何处理的印象,还有一些细小的错误,也能一起检查并快速发现出来,毕竟四只眼睛比两只眼睛看的远,在做项目的过程中和伙伴互相探讨,互相取长补短。这次的结对作业,给了我很多感想和经验,也为将来的公司团队项目合作垫下了基础。