结对作业
大气的名字 结对作业
张竣淇211617246 瞿煌人211606326
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 5 | 5 |
• Estimate | • 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 395 | 825 |
• Analysis | • 需求分析 (包括学习新技术) | 90 | 120 |
• Design Spec | • 生成设计文档 | 15 | 30 |
• Design Review | • 设计复审 | 15 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
• Design | • 具体设计 | 30 | 300 |
• Coding | • 具体编码 | 200 | 300 |
• Code Review | • 代码复审 | 25 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 10 |
Reporting | 报告 | 30 | 30 |
• Test Repor | • 测试报告 | 10 | 10 |
• Size Measurement | • 计算工作量 | 5 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 430 | 860 |
二、需求分析
- 小学一年级
- 使用的数字小于100且为20以内的加减法
- 运算类型为加减且不能有负数
- 运算类型为加减且不能有负数
- 小学二年级
- 使用的数字小于90
- 乘法运算应为表内乘法
- 除法运算的商和余数为一位数
- 运算类型为乘除且不能有负数
- 小学三年级
- 运算符在2~4个,至少两个不同的运算符
- 可以加括号
- 减法运算的结果不能有负数
- 除法运算除数不能为0,不能有余数
三、设计
1. 设计思路
说明你如何设计这个程序
比如:
- 这个程序有x个类,x个函数,函数之间的调用关系是怎样的?
- 关键函数的流程图是怎样的?
- 算法的关键的关键是什么?
- 这个程序有1个类,4个函数
- 首先通过命令行接收参数
- 然后通过函数来生成题目
- 最后生成题目与答案文件
- 关键函数是题目的生成函数认真构思
2. 实现方案
设计思路
生成四则运算表达式
将表达式从中缀表达式转换成后缀表达式
计算后缀表达式的值
类图
逆波兰式生成流程图
- 实现方案
准备工作:先在Github上创建仓库,克隆到本地...
技术关键点:stack()类的使用,逆波兰式的理解
四、编码
这次编程主要的难点是如何按要求生成四则表达式,只要理解了原理就能一步步写出来,但这次并没有完全实现需求,比如括号的数量以及括号中的运算符数量、不能保证运算中的减法没有负数以及除法没有余数。还有将中缀表达式转换成后缀表达式,注重细节也能写出来
逆波兰式生成
逆波兰式计算
-
调试日志
这次的难点在于运算表达式的生成和逆波兰式的转换,开始打算用二叉树来生成表达式,但是未能完成 -
关键代码
if (isNumber(s)) {
stackNum.push(s);
} else if (s.equals("(")) {
stackOper.push(s);
} else if (s.equals(")")){
while (!stackOper.peek().equals("(")) {
stackNum.push(stackOper.pop());
}
stackOper.pop();
} else {
// 当前为+-*/
if (stackOper.empty()) {
// 运算符栈为空
stackOper.push(s);
} else {
if (stackOper.peek().equals("(")) {
// 运算符栈顶的运算符为括号
stackOper.push(s);
} else {
if (cmpOper(String.valueOf(stackOper.peek()), s) < 0) {
// 运算符栈顶优先级小于当前符号,压栈
stackOper.push(s);
} else {
stackNum.push(stackOper.pop());
if (stackOper.empty()) {
stackOper.push(s);
} else {
if (cmpOper(String.valueOf(stackOper.peek()), s) >= 0) {
stackNum.push(stackOper.pop());
stackOper.push(s);
} else {
stackOper.push(s);
}
}
}
}
}
}
将中缀表达式转换成后缀表达式用于计算结果 -
代码规范
第一条 类型与中括号紧挨相连来定义数组;
第二条 采用4个空格缩进,禁止使用tab字符;
第三条 在一个switch块内,每一个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使空代码;
第四条 在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式:if (condition) statements;
第五条 方法内部单行注释,在被注释语句上方另起一行,使用//珠海。方法内部多行注释使用/**/注释,注意与代码对齐;
第六条 IDE的text file encoding设置为UTF-8;
第七条 注释的斜线与注释内容之间有且仅有空格;
第八条 大括号用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代块则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有 lse 等代码则不换行;表示终止的右大括号后必须换行。
第九条 if/for/while/switch/do等保留字与括号之间都必须加空格。
PMD检查
五、测试
测试用例 | 预期结果 | 是否符合预期
参数个数有误! | 请重新运行! | 是
-n - s 参数个数有误!请重新运行! 是
-n 50 -grade 0 年级选择超出范围,请选择一二三年级。 是
-n 50 -grade h 年级选择选项非正整数!请重新运行! 是
-n -50 -grade 3 题目数量为负!请重新运行! 是
-n 0 -grade 3 请输入合适的题目数量!比如1-50 是
-n h -grade 3 题目数量选项非整数!请重新运行! 是
-n 10 -grade 2 正常运行 是
-grade 3 -n 10 正常运行 是
六、总结
队友功劳 ,我除了帅 没有别的才华。