Java结对编程四则运算第二周总结
需求分析
- 要随机产生规定数量的式子。
- 要对分式进行计算。
- 要支持多语言。
- 要自动判断对错。
设计思路
- 确定要选用的语言;
- 要产生随机数;
- 在产生随机数的时候就要产生随机的运算符;
- 在产生数字与运算符时最后一个数字之后就不能再产生运算符(运算符的数量始终比数字少1);
- 在一个式子中要多次产生随机数与运算符因此要用到循环;
- 在循环结束时就产生了一个式子就要求进行计算与输入;
- 在产生中缀的式子后要将其转化为后缀;
- 在输入完之后就要判断对错,统计正确率;
实现过程中的关键代码解释
- 1.拆分式子
ArrayList<String> result = new ArrayList<String>();
StringTokenizer tokenizer = new StringTokenizer(str," ");
这段代码是对上周代码的改进,原先我用的是一个一字符的拆分的方法,这周因为要加入分数运算我发现他会把分数也当做除法进行拆分所以就不得不找到另一个方法对输入的字符串进行拆分。StringTokenizer刚好就可以避免这个问题。
- 2.计算多个分数
public String calculate(ArrayList<String> postOrder)throws IOException {
Stack stack = new Stack();
//ArrayList<String> stack = postOrder;
String res = "";
FileWriter fm = new FileWriter("answer.txt");
BufferedWriter bufm = new BufferedWriter(fm);
for (int i = 0; i < postOrder.size(); i++) { if (res.equals("")) {
if (Character.isDigit(postOrder.get(i).charAt(0))) {
stack.push(Integer.parseInt(postOrder.get(i)));
} else {
Integer back = (Integer) stack.pop();
Integer front = (Integer) stack.pop();
stack.push(back);
Calculator calculator2 = new Calculator();
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(front + "/1", "+", back + "/1");
//res = (front + back);
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(front + "/1", "-", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();> break;
case '*':
res = calculator2.compute(front + "/1", "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(front + "/1", "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
} }
else {
if (Character.isDigit(postOrder.get(i).charAt(0))) {
stack.push(Integer.parseInt(postOrder.get(i)));
} else {
Integer back = (Integer) stack.pop();
Calculator calculator2 = new Calculator();
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(res, "+", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(res, "-", back + "/1");
bufm.write(res);> bufm.flush();
bufm.newLine();
break;
case '*':> res = calculator2.compute(res, "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(res, "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
}
}
}
return res;
}
由于参考课本上的代码只能进行两个分数的计算所我就加了这么一个方法来进行多个这正数的运算
- 将答案写入文件
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(res, "+", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(res, "-", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '*':
res = calculator2.compute(res, "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(res, "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
将计算的结果写入文件有利于在判断是将文件读入。
运行过程截图
测试
代码托管地址
遇到的问题及其解决方法。
- 问题1 如何加入分数的运算。
解决:这是由于我前周写代码是考虑不周所带来的问题本来一直没找到解决的方法,后来在和结对伙伴和张旭生同学交流之后我就找到上面关键代码中的第一个代码,大大的优化了代码的结构和运行的时间。 - 问题2(上周的问题) 如何解决无法产生括号的问题,就是当除不尽时的计算的误差大?
这个问题再加入了分式运算之后就得到了解决。
— 对于答案的判断
由于代码的改动发现上周的方法已经不再适用无法直接返回答案,于是我就先将答案输出到TXT文件中,在判断的那个类时再读入。就解决无法直接返回答案的这个问题。
对结对的小伙伴做出评价
- 结对伙伴: 20162312 张家铖
这周编写程序时几乎都是在一起写的,对彼此的写代码的方式有了进一步的了解,他的建议对我的帮助比较大。
由于结对伙伴用的是bash有很多方法有点衔接不上。
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|---|
Planning | 计划 | 1 | 1 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
· Analysis | · 需求分析 (包括学习新技术) | 1 | 3 |
· Design Spec | · 生成设计文档 | 0.5 | 0.5 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0.5 | 0.5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 1.5 | 1 |
· Design | · 具体设计 | 2 | 2.5 |
· Coding | · 具体编码 | 2 | 3 |
· Code Review | · 代码复审 | 2 | 2 |
· Test | · 测试(自我测试,修改代码,提交修改) | 2 | 1 |
Reporting | 报告 | 1 | 1.5 |
· Test Report | · 测试报告 | 1.5 | 2 |
· Size Measurement | · 计算工作量 | 1.5 | 1 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 1 | 1 |