结对作业
211606350曾磊鑫 211606364李冠锐
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 60 | 100 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 600 | 650 |
• Design Spec | • 生成设计文档 | 30 | 40 |
• Design Review | • 设计复审 | 30 | 40 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
• Design | • 具体设计 | 150 | 200 |
• Coding | • 具体编码 | 300 | 600 |
• Code Review | • 代码复审 | 100 | 150 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 30 | 40 |
• Size Measurement | • 计算工作量 | 40 | 60 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 100 |
合计 | 2000 |
二、需求分析
我通过作业要求的方式了解到,小学三年级数学有如下的几个特点:
- 运算符在2~4个
- 可以加括号
- 减法运算的结果不能有负数
- 除法运算除数不能为0,不能有余数
经过分析,我认为,这个程序应当:
- 使用调度场和逆波兰算法
三、设计
1. 设计思路
在之前一二年级的基础上通过一个类在其中调用逆波兰算法的方法来算出混合四则运算的答案,将之前随机生成的四则运算的题目保存在数组调用数组结合答案输出
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地.
- 技术关键点:
- 如何写出调度场算法和逆波兰算法的方法
- 如何随机添加括号
- 如何在命令行输入参数且顺序不限
四、编码
输入年级和题目数量调用不同的方法来达到不同年级出不同题目的目的,中途遇到了许多困难比如逆波兰算法总是调试错误,但是结对编程让我们两个人在互相进步能够及时发现对方的错误并开始互动解决问题,在双方没有合适的思路时,交换彼此的意见互相进步。
1. 调试日志
在写逆波兰算法时,碰到了先算加减后算乘除结果计算错误的情况,后经双方互动,仔细检查终于找到了代码的问题并加以修改
在随机生成算式并add进数组并在最后调用算法计算时,由于没把数组转换成字符串也出现了一些问题
2. 关键代码
public void ReversePolishNotation() {
for (String str : list) {
if (str.matches("[0-9]+")) {
RPOlist.add(str);
}else if (str.matches("[\\+\\-\\×\\÷\\(\\)]")) {
stack(str);
}else {
System.out.println("非法表达式!");
}
}
while(!stack1.isEmpty()) {
RPOlist.add(stack1.pop());
}
}
// 创建一个用于存放字符的方法,将“+-×÷()”放进stack1中
public void stack(String zf) {
if (stack1.isEmpty()) { // 若为空栈,将字符存入栈中
stack1.push(zf);
return ;
}if ("(".equals(zf)){ // 判断字符是否为为“(”
stack1.push(zf);
return ;
}if (")".equals(zf)) { // 判断字符是否为为“)”
String string = "";
while(!"(".equals(string = stack1.pop())) {
RPOlist.add(string);
}return ;
}if ("(".equals(stack1.peek())) { // 若当前栈顶的元素为“(”,则直接入栈
stack1.push(zf);
return ;
}if (judge(zf,stack1.peek())) {// 判断优先级,若预存的字符优先级大于栈顶元素,将此字符存入栈中
stack1.push(zf);
return ;
}else{ // 若优先级低于栈顶元素,则将字符存入存逆波兰式子的数组中
RPOlist.add(stack1.pop());
stack(zf);
}
}
// 创建一个方法用来判断当前字符与栈顶元素的优先级,返回true或false
private boolean judge(String str1, String str2) {
return Judge(str1) > Judge(str2);
}
private int Judge(String str) {
switch(str) {
case "(" :return 3;
case "×" :
case "÷" :return 2;
case "+" :
case "-" :return 1;
case ")" :return 0;
default:return -1;
}
}
// 创建一个用来计算逆波兰式子结果的方法
public int count(String s1,String s2,String s3) {
int a = Integer.parseInt(s2);
int b = Integer.parseInt(s1);
switch(s3) {
case "+":
return a+b;
case "-":
return a-b;
case "×":
return a*b;
case "÷":
return a/b;
default :
return 0;
}
}
public int count() {
for (String str:RPOlist) {
if (str.matches("[0-9]+")) {
stack2.push(str);
}else {
stack2.push(String.valueOf(count(stack2.pop(),stack2.pop(),str)));
}
}
return Integer.parseInt(stack2.pop());
}
3. 代码规范
1.左大括号前不换行。
2.左大括号后换行。
3.右大括号前换行。
4.异常进行手动处理,不抛出。
5.不反复开辟空间,合理利用开辟的空间
6.进行适当合理的代码注释,方便理解,修正
7.代码中的命名均不能以下划线或美元符号开始,也不能一下划线或美元符号结束
8代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式
五、测试
由于能力不足,两个人没想出怎么解决如何在命令行输入所需格式参数且顺序不限,因此测试只能用一开始的输入方法测试。。。
输入5 3 生成5道随机四则运算
输入5 2生成5道二年级运算
输入5 4 提示年级输入错误
输入5 a提示输入错误
输入a a 提示输入错误
六、总结
经过这次结对编程我们明白了相互合作对于双方都是有很大进步的,因基础不好,这次任务完成的很差,有几点要求没做到:随机加括号,在命令行输入所需格式参数且顺序不限。可这次结对编程让我也收获了很多在没有思绪的时候可以和搭档聊聊双方对于题目的想法,互相了解对方的思路,共同在实践中学习进步,在犯迷糊时搭档能及时指点错误,提高双方的效率。