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
原文地址:https://www.cnblogs.com/1751-pyc/p/10727659.html