20165201 结对编程练习_四则运算(第二周)
1、需求分析
实现一个命令行程序,要求:
- 自动生成指定数量的小学四则运算题目(加、减、乘、除)
- 支持整数
- 统计正确率
- 支持多运算符
- 题目去重
- 支持真分数
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判题
2、设计思路(UML类图)
3、实现过程中的关键代码解释
- 算法(以加法为例子)
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);
}
4、运行过程截图
- 简体中文
- 英文
- 繁体中文
- 边界值测试
通过!
5、代码托管地址
6、遇到的困难及解决方法
- 问题: 生成题目时,我输入想要做的题目难度为0,会出现错误
- 问题解决方法: 我俩检查了代码之后发现是没有考虑边界值的问题,添加了if-else语句判断输入的值就好了,改过的代码如下:
int many = scan.nextInt();
while (true) {
if (many > 0) {
pra.CreateExpre(Tinumber, many, language);
pra.showC();
System.out.println("
您答对的题目数为:" + pra.getTrues());
double trues = (double) pra.getTrues() / Tinumber;
System.out.println("您的正确率为:" + nf.format(trues));
System.out.println("
再来一次输入y重来输入n退出)");
another = scan.nextLine();
break;
} else
System.out.println("输入错误!请重新输入,至少为1!");
many = scan.nextInt();
}
break;
7、PSP
Personal Software Process Stages) | 预估耗时(分钟)) | 实际耗时(分钟) |
---|---|---|
Planning | 计划 | 30 |
Estimate | 估计这个任务需要多少时间 | 500 |
Development | 开发 | 300 |
Analysis | 需求分析 (包括学习新技术) | 30 |
Design Spec | 生成设计文档 | 10 |
Design Review | 设计复审 (和同事审核设计文档) | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 |
Design | 具体设计 | 60 |
Coding | 具体编码 | 100 |
Code Review | 代码复审 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 50 |
Reporting | 报告 | 10 |
Test Report | 测试报告 | 20 |
Size Measurement | 计算工作量 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 |
合计 | 750 |
8、对结对的小伙伴做出评价(重点指出需要改进的地方)
这次结对学习反映出了很大的问题,最重要的一点就是我们俩的时间经常错开,能坐在一起讨论的机会并不多,也只有晚上。原因是最近的事情太多了,很多事做不完,希望今后事情少的时候能多讨论交流~