Java结对编程四则运算第二周总结
需求分析
- 题目随机出现并具有多种格式。
- 既有整数又有分数的计算。
- 判断对错并统计正确率。
- 分辨除法的“/”与分数的“/”。
- 给出当前所做的题目数量。
设计思路(双栈)
- 这周和上次的代码比起来变了很多,由于栈的加入使许多内容需要更新一下。
- 主函数是Questions,在主函数中用random和switch来随机选择是整数算数式还是分数式;
- Intquestions,这个类用来随机出现一个计算式
- InToPost,这个类是将输入的中缀表达式转换成后缀表达式。
- PostfixEvaluator,这是用来计算后缀式的类。
实验过程中的关键代码解释
- 1.根据需要输出不停个数的式子。
- 2.Questions.java中,随机出现整数式,并调用相关的类。
- 3.这个类在在编写时还写了一个能够显示出压栈出栈的过程的功能,但后来觉得和老师的要求无关,显示出来太累赘,于是在调用时并没有调用这个功能。另外,Stack在这个类中的存在很重要。
public class InToPost {
private Stack theStack;
private String input;
private String output = "";
public InToPost(String in) {
input = in;
int stackSize = input.length();
theStack = new Stack(stackSize);
}
public String doTrans() {
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
switch (ch) {
case '+':
case '-':
gotOper(ch, 1);
break;
case '*':
case '/':
gotOper(ch, 2);
break;
case '(':
theStack.push(ch);
break;
case ')':
gotParen(ch);
break;
default:
output = output + ch;
break;
}
}
while (!theStack.isEmpty()) {
output = output + theStack.pop();
}
return output;
}
public void gotOper(char opThis, int prec1) {
while (!theStack.isEmpty()) {
char opTop = theStack.pop();
if (opTop == '(') {
theStack.push(opTop);
break;
}
else {
int prec2;
if (opTop == '+' || opTop == '-')
prec2 = 1;
else
prec2 = 2;
if (prec2 < prec1) {
theStack.push(opTop);
break;
}
else
output = output + opTop;
}
}
theStack.push(opThis);
}
public void gotParen(char ch){
while (!theStack.isEmpty()) {
char chx = theStack.pop();
if (chx == '(')
break;
else
output = output + chx;
}
}
class Stack {
private int maxSize;
private char[] stackArray;
private int top;
public Stack(int max) {
maxSize = max;
stackArray = new char[maxSize];
top = -1;
}
public void push(char j) {
stackArray[++top] = j;
}
public char pop() {
return stackArray[top--];
}
public char peek() {
return stackArray[top];
}
public boolean isEmpty() {
return (top == -1);
}
}
}
- 4.这个类专门用来随机出现整数式子,用了Random。
- 5.在postfixEvaluator.java中,这里用来算出扫描进的内容,简单但不可或缺。
- 6.统计正确数,计算正确率
困难
在过程中最大的困难是在这个地方:
在我检查程序时候是发现没有程序的错误的,但是只要整式的计算式,就会出现异常。
后来发现是因为postfixEvaluator.java在读取后缀式的时候必须要求每个char之间都有一个空格。比如:22+10转成后缀若是没有空格就会是:2210+,就不能确定到底是2加210还是什么。
在我加了空格之后就解决了问题。
还有个意外是把一个类名字输入成了Integer.java,带来的结果是许多程序都不能运行了。
总结
我的结对伙伴是20162328蔡文琛,我们之前的java基础都不算很牢固,所以这次的编程任务对我们来说是个巩固自己知识的好时机,而庆幸的是我们抓住了这个机会并完成了它,它让我们收获颇多,这次的编程任务让我们感到很强的成就感。
我们在编程过程中,没有明确的角色分配诸如“键盘手”和“领航员”,而是我们划分好了各自的任务,明确需要做的事,不做白费功夫的事。我们在编程过程中时时交流,以保证我们的程序能够相互交融不发生冲突。
美中不足的是我们由于总是分开在自己的项目中编程,在QQ相互发送代码,完成以后才git push,所以提交过程不够精细。
PSP
PSP2.1 | Personal Softwore Process Stage | 预计耗时(分钟) | 实际耗时(分钟)) | 重要成长 |
---|---|---|---|---|
Planning | 计划 | 40 | 60 | |
Estimate | 做这个任务需要多长时间 | 360 | 240 | |
Development | 开发 | 30 | 30 | |
Analysis | 需求分析(包括学习新技术) | 30 | 35 | |
Design Spec | 生成设计文档 | 60 | 40 | |
Design Review | 设计复审(和同事审核设计软件) | 40 | 20 | |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 120 | 180 | |
Design | 具体设计 | 120 | 100 | |
Coding | 具体编码 | 100 | 120 | |
Code Review | 代码复审 | 30 | 15 | |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 15 | |
Reporting | 报告 | 30 | 40 | |
Test Report | 测试报告 | 40 | 50 | |
Size Measurement | 计算工作量 | 10 | 20 | |
Postmortem & Process Improvement Plan | 30 | 10 |