unknown2
结对作业
本次结对:211606457 郑沐榕、211406242 杨长元
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 1 | 1 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 200 | 300 |
• Design Spec | • 生成设计文档 | 60 | 30 |
• Design Review | • 设计复审 | 60 | 0 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
• Design | • 具体设计 | 60 | |
• Coding | • 具体编码 | 720 | 300 |
• Code Review | • 代码复审 | 45 | 0 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 0 |
Reporting | 报告 | ||
• Test Report | • 测试报告 | 60 | 0 |
• Size Measurement | • 计算工作量 | 5 | 2 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1241 | 723 |
二、需求分析
通过百度的方式了解到,小学三到四年级的四则运算有如下的几个特点:
- 混合运算中要包含+、-、×、÷运算
- 不涉及分数/小数运算
- 随机数范围要求是[0,10000)
作业要求:
- 运算符在2~4个(且至少出现两个不同的运算符)
- 可以加括号
- 减法运算的结果不能有负数
- 除法运算除数不能为0,不能有余数
经过分析,我认为,这个程序应当:
- 判断用户输入的参数是否符合设定的要求
- 实现加减乘除混合运算
- 将题目和答案输出到指定文件
- 一道题目要保证至少包含两个不同的运算符
- 所有题目要保证不重复
三、设计
1. 设计思路
- 大概包含四个类:①接收用户输入参数并根据参数调用相应的函数、②生成题目、③计算并返回结果、④存储题目和答案
- 算法的关键:调度场算法与逆波兰表达式
- ...
2. 实现方案
-- 分析需求
-- 把几个方法敲出来在进行主方法调用、完善各方法块的的代码(本来整理完需求是想先写注释再敲代码的,结果发现自己还是不太会用这种方法,所以还是边打边想2333)
四、编码
1. 调试日志
没有...我觉得我没有写出出题和解题的功能就是最大的bug,其他都没啥bug。
2. 关键代码
(这是2333上一个任务的需求,但是改过了,新的需求没整出来,没新内容好展示2333)
public static void calculate1(Integer n) {
Random random = new Random();
Map<Integer,String> question = new HashMap<Integer,String>();
Map<Integer,Integer> answer = new HashMap<Integer,Integer>();
for( int i = 1; i <= n; i++) {
int result = 0;
int parm1 = (int)(Math.random() * MAX_NUM); //final static int MAX_NUM = 100;
int parm2 = (int)(Math.random() * MAX_NUM);
int operater1 = random.nextInt()%2;
switch(operater1) {
case 0:
result = parm1 + parm2;
break;
case 1:
if( parm1 < parm2) {
int t = parm2;
parm2 = parm1;
parm1 = t;
result = parm1 - parm2;
}else {
result = parm1 - parm2;
}break;
}
question.put(i, "" + parm1 + operater1 + parm2);
answer.put(i, result);
}
3. 代码规范
-
1.为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
正例:从远程仓库拉取代码的类命名为 PullCodeFromRemoteRepository。
反例:变量 int a; 的随意命名方式。 -
2.注释的双斜线与注释内容之间有且仅有一个空格。
-
3.方法参数在定义和传入时,多个参数逗号后边必须加空格。
正例:method("a", "b", "c");--例子中实参的”a”,后边必须要有一个空格。 -
4.在 if/else/for/while/do 语句中必须使用大括号,即使只有一行代码,为了避免采用单行的编码方式:if (condition) statements;
-
5.避免采用取反逻辑运算符:
说明:取反逻辑不利于快速理解,并且取反逻辑写法必然存在对应的正向逻辑写法。
正例:使用 if (x < 628) 来表达 x 小于 628。
反例:使用 if (!(x >= 628)) 来表达 x 小于 628。 -
6.[参考]对于注释的要求:
第一、能够准确反应设计思想和代码逻辑;
第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。 -
7.在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
说明:不要在方法体内定义:Pattern pattern = Pattern.compile(规则);
五、测试
测试点 | 测试用例 | 测试结果 | 是否解决(是如何解决) |
---|---|---|---|
(我。。。。。。) |
六、总结
emmmm...怎么说呢...先说说结对编程这事吧,因为事先约定,两个人都不知道个人作业和结对作业是穿插进行的,由于队友近期都在带军训(结对作业开始以来两人还没见上面所以photo也没有啦,本来就没在一块打代码2333),所以这次结对互动仅限于网络上少许的交流。然后单纯是疑问有交集,如何解决和代码都没有交集2333最后是先提交了他的代码。另外,我的命令行编译、运行不了.java文件,上一次就不行,百度搜了解决方法都得不到解决,问同学同学说不知道怎么处理,然后就很难受命令行运行不了,就需要改获取输入的方式,判断为空要换方法,正则也不适用,最后测试结果也没做出来= =。然后代码思路方面,开始觉得括号位置随机、数字随机、运算符随机,还要在考虑随机题目产生出来后减数运算不出现负数、以及除法运算不出现小数,把所有问题同时放在一起考虑,就会觉得太复杂了情况太多种了。后来看群上班里同学在交流想法以及今天课上李佳讲他解决问题的一整个思路,会觉得自己想得太局限,没有放开了去想、分析怎么解决(开始也有想到以前数构有讲过二叉树储存运算式,就去翻以前课件,然后发现逆波兰原来和后序表达式有关,查了后缀中缀看了逆波兰,看懂了解题依旧觉得出题难,确实是没有去分解步骤,没有动笔。然后就没有进一步去思考了扶额23333)群上之前在议论提交时间的时候,有同学说到作业太多没时间,可能是因为有重修课程吧,但是如果只剩专业课那其他作业真的并不多,就软工这玩意一直挂着(扶额),花费的时间也最多(而且很多时候就是花了大把时间完了问题还是没解决OWO)。当然,自己没有尽全力想去写出来,有保留。身在曹营心在汉,知道自己以后就业不走敲代码(软件工程就业领域)这些方向,老师说你们就当成做游戏去完成,不要有太大的负担,但是并没有给我是玩游戏(通关)之类的感觉,项目简单也没感觉好玩,项目难度高也没觉得好玩,没有成败感,仅仅只是当成作业去完成;专业课保证基本不落下(软工就...),只是担心毕设,只是担心能否顺利毕业;也没有担心我专业技能学得太差,以后无法以此作为谋生技能;开学以来也一直在反复思考自己选的那条路,近些天终于确定下来了(欢呼OUO),可以开始安排时间为此做准备了。最后觉得很对不住队友(QAQ),没有给他什么帮助,甚至有点拖后腿的性质。以上是本次结对任务期间大致总结。