20175120彭宇辰-结对编程-四则运算(二)
一、结对对象
20175131王泽龙
博客链接:https://www.cnblogs.com/WZL-DM/p/10708115.html
二、需求分析
中缀转后缀
有理数计算
真分数计算
生成表达式
计算结果正误并给出正确率
三、设计思路:
中缀转后缀算法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素【栈内的栈顶运算符>=遇到的运算符,就弹出】,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
有理数计算:
1.定义运算符
2.将字符串分解
3.判断是否为操作符,若是,则输出两个操作数
4.用操作符和两个操作数计算结果
真分数计算
1.构造函数定义一个分数
2.定义真分数的加减乘除法
3.定义最大公因子
4.化简真分数使分子分母互素
5.将有理数转化为字符串
6.判断计算结果
四、运行过程截图
有理数计算测试
真分数运算测试
五、实验过程中关键代码解释
有理数运算题目生成及答案显示、正确率计算、后缀表达式显示
package Coperation.sizeyunsuan;
import java.util.*;
public class Chuti {
public Chuti(int level, int num) {
char[] operator = new char[]{'+', '-', '*', '/'};
Random random = new Random();
Scanner scan = new Scanner(System.in);
ArrayList<String> expression = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + level; //1个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(9) + 1; //2个数字
}
for (int j = 0; j < n; j++) {
int s = random.nextInt(4);//随机选择某个运算符
ex += String.valueOf(number[j]) + String.valueOf(operator[s]);
if (s == 3) {
number[j + 1] = decide(number[j], number[j + 1]);
}
}
ex += String.valueOf(number[n]);
expression.add(ex);
}
int wrong = 0;
for (String st : expression) {
System.out.println(st);
System.out.println("输入答案");
int daan = scan.nextInt();
String input = st;
String output;
Zhonghou theTrans = new Zhonghou(input);
System.out.print("后缀表达式为 ");
output = theTrans.doTrans();
String hou = output;
int length = hou.length();
char[] value = new char[length << 1];
for (int i=0, j=0; i<length; ++i, j = i << 1) {
value[j] = hou.charAt(i);
value[1 + j] = ' ';
}
String houzhui = new String(value);
System.out.println(houzhui);
String expressions,again;
int result;
Jisuan evaluator = new Jisuan();
expressions = houzhui;
result = evaluator.evaluate(expressions);//
System.out.println();
if (daan != result) {
System.out.println("错误 正确答案为:" + result);
System.out.println(" ");
wrong = wrong + 1;
} else {
System.out.println("正确");
System.out.println(" ");
}
}
int sum = 100 - (wrong * 100 / num);
System.out.println("正确率:" + sum + "%");
}
private static int decide(int x, int y) {//通过递归实现整除
Random random = new Random();
if (x % y != 0) {
y = random.nextInt(100) + 1;
return decide(x, y);
} else {
return y;
}
}
}
六、代码托管:https://gitee.com/pyc-1751/chapter_1_of_java.git
七、结对感受
这次结对项目遇到许多困难,许多模块的设计思路和代码实现都遇到很多不理解的地方,比如真分数计算的时候分子分母不互素,又比如有理数计算时算式的输出,这些问题我们都用了很久才解决,这也导致我们交迟了。如今我们俩的代码模型架构和代码实现都有些能力不足,还需要进一步的学习以及更多时间的理解。
八、PSP
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
计划 | 60 | 40 |
估计这个任务需要多少时间 | 1405 | 1410 |
开发 | 300 | 300 |
需求分析 | 300 | 240 |
代码规范 | 100 | 30 |
具体编码 | 200 | 330 |
代码复审 | 60 | 120 |
Test 测试 | 120 | 200 |
计算工作量 | 250 | 120 |
事后总结, 并提出过程改进计划 | 15 | 30 |