一、码云链接
二、需求分析
- 实现一个命令行程序,要求:
- 自动生成小学四则运算题目(加、减、乘、除)
- 支持整数
- 支持多运算符(比如生成包含100个运算符的题目)
- 支持真分数
- 统计正确率
三、设计思路(同时输出UML类图)
这周的总体设计要在上周的基础上深化,上周我们的代码没有用到中缀表达式转后缀表达式,没有用到栈,所以这周不仅要对上一周的代码进行修改,而且还要在此基础上完成更深层的对真分数的要求。
实现四则运算中后缀转换类
实现四则运算后缀表达式计算类
实现四则运算真分数计算类
实现四则运算生成题目并判断正误
- 题目生成
- 可以独立使用
- 可以选择生成的题目数量
- 题目运算及正误判断
- 用到中缀表达式转后缀表达式
- 实现四则运算真分数的计算
- 实现四则运算生成题目并判断正误
- 支持多语言系统
创建一个真分数类
创建一个后缀表达式的计算类
创建一个后缀表达式转中缀表达式的转换类
题目生成并判断正误
计算正确率
四、实现过程中的关键代码解释
- 算法(以加法为例子)
public Shu add(Shu op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int sum = numerator1 + numerator2;
return new Shu (sum, commonDenominator);
}
- 转换为后缀
public void evaluate(String expr) {
String token;
StringTokenizer tokenizer = new StringTokenizer(expr);
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
if (token.equals("("))
stack1.push(token);
else if (token.equals("+") || token.equals("-")) {
while (!stack1.empty()){
if(stack1.peek().equals("(")){
break;
}else list1.add(stack1.pop());
}
stack1.push(token);
}else if (token.equals("*") || token.equals("/")) {
if(!stack1.empty()) {
if (stack1.peek().equals("*") || stack1.peek().equals("/")) {
list1.add(stack1.pop());
stack1.push(token);
} else stack1.push(token);
}else stack1.push(token);
}
else if (token.equals(")")) {
while (!stack1.peek().equals("(")) {
list1.add(stack1.pop());
}
stack1.pop();
}else list1.add(token);
}
while (!stack1.empty()) {
list1.add(stack1.pop());
}
ListIterator<String > li = list1.listIterator();
while (li.hasNext()) {
Message += li.next() + " ";
li.remove();
}
message = Message;
}
- 判断正误
String tmp = br.readLine();
if (tmp != null) {
if (tmp.indexOf("=") != -1) {
ExpreNum++;
StringTokenizer tokenizer = new StringTokenizer(tmp, "=");
infixToSuffix.evaluate(tokenizer.nextToken());
list3.add(tmp);
if ((" " + cal.evaluate(infixToSuffix.getMessage())).equals(tokenizer.nextToken())) {
list3.add("正确");
trues++;
} else {
list3.add("错误");
list3.add("正确答案为" + cal.evaluate(infixToSuffix.getMessage()));
}
} else list3.add(tmp);
} else break;
- 生成文件(.txt)
Biaodashi pra = new Biaodashi();
try {
pra.outFile("SIZEYUNSUAN.txt","Practice.txt");
}catch (IOException e){
System.out.println(e);
}
五、功能截图
- 简体中文界面
- 英文界面
- 繁体中文界面
- 边界值测试
- 生成文件
六、结对感受
本周我们主要做了对上周代码的修改完善,鉴于功能不太全面我们进行了更大程度的改造。通过本周我发现结对编程时间花费比单人编程增加不少,但也会比单人编程减少不少的代码BUG。如果再算上后期代码的维护,结对编程比单人编程更有效率,还更加节省成本。
七、PSP表格
PSP | Personal Software Process Stages) | 预估耗时(分钟)) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 500 | 650 |
Development | 开发 | 300 | 500 |
Analysis | 需求分析 (包括学习新技术) | 30 | 40 |
Design Spec | 生成设计文档 | 10 | 15 |
Design Review | 设计复审 (和同事审核设计文档) | 40 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 30 |
Design | 具体设计 | 60 | 75 |
Coding | 具体编码 | 100 | 125 |
Code Review | 代码复审 | 30 | 45 |
Test | 测试(自我测试,修改代码,提交修改) | 50 | 75 |
Reporting | 报告 | 10 | 20 |
Test Report | 测试报告 | 20 | 25 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 80 |
合计 | 750 | 930 |