2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算
2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算
结对伙伴
- 学号:20172324
- 姓名:曾程
- 我们在无尽的Java之海里相互领航,驾驶程序编程的船前进。
需求分析
1.项目内容
-
1.自动生成题目
-
可独立使用(能实现自己编写测试类单独生成题目的功能)
-
可生成不同等级题目,类似于:
1级题目:2 + 5 =
10 - 5 =
之类的两个数,一个运算符的题目
-
-
2.题目运算(判题)
-
可独立使用
-
实现中缀表达式转为后缀表达式并计算
-
判断用户答题正误,并输出正确结果
-
-
3.支持真分数
-
可独立使用
-
实现分数算式的计算
-
-
3.题目去重(扩展需求,加分项)
-
可独立使用
-
实现对自动生成表达式的去重:如下
若生成:2 + 5 =
5 + 2 =
为同一题目
-
2.对需求的理解
- 首先要有一个可以按照需求生成随机题目的类,其中随机生成的数可以是整数或分数。
- 然后要有一个可以将中缀表达式转化为后缀表达式的以便于计算的类。
- 还要有一个计算后缀表达式的类,可以计算生成的题目的正确答案。
- 最后要有一个判断输入的答案是否为正确答案的类。
3.后续扩展的可能性
去重这种东西听起来就很麻烦,之前在网上找资料的时候看到一些博客写了语言的切换和计时,所以说可能性还是有的。
设计思路
- 1.UML图
- 2.思路
- 创建一个题目生成类,可以随机生成数字(包括真分数和整数),随机产生符号(加减乘除)并生成表达式。
- 创建一个中缀表达式转后缀表达式的转化类(使用栈)
- 创建一个计算后缀表达式的类
- 创建测试类
相关过程截图
- 生成题目的类部分代码
import java.util.*;
import java.util.Random;
import java.util.Scanner;
public class levelclass {
public levelclass(){
char[] operator = new char[]{'+', '-', '*', '/'};
Random random = new Random();
Scanner scan = new Scanner(System.in);
int num;
int level;
System.out.println("该程序只能计算一到五个操作符的算式。");
System.out.println("输入你需要测试的算式等级:");
level = scan.nextInt();
System.out.println("输入你需要的式子数量:");
num = scan.nextInt();
switch (level)
{
//一级算式
case 1:
ArrayList<String> expression1 = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + 1; //1个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(100) + 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]);
ex += "=";
expression1.add(ex);
}
for(int ii = 0; ii < expression1.size() ; ii++)
{
System.out.print(expression1.get(ii) + "\n");
}
System.out.println(expression1);
break;
//二级算式
case 2:
ArrayList<String> expression2 = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + 2; //2个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(100) + 1; //3个数字
}
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]);
ex += "=";
expression2.add(ex);
}
for(int ii = 0; ii < expression2.size() ; ii++)
{
System.out.print(expression2.get(ii) + "\n");
}
break;
- 测试运行的截图
遇到的困难及解决办法
- 我们在进行测试的时候发现有个题目等级的出题数量不可控制
- 截图如下
- 原因:是因为在for循环的时候括号位置有问题,导致后一个循环多循环了一次。
对结对的小伙伴做出评价
本周我的小伙伴很灵性的做出了生成题目的部分,而我在本周的星期一到星期六之间对于这个项目并没有花费什么精力,只是在假期的时候研究完了她的设计思路,并且开始思考怎么完成之后的部分,这个项目要真的做起来是非常麻烦的,我们的完成度并不是特别高,目前只能做到对一级题目的随意输出和正误判断,之后栈的部分需要靠我的小伙伴来完成。
PSP
PSP2.1| Personal Software Process Stages|预估耗时(分钟)|实际耗时(分钟)|
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
|Planning |计划 |60 |90
|Estimate |估计这个任务需要多少时间 | 30|50
|Development |开发 |500|600
|Analysis |需求分析 (包括学习新技术) |120 |180
|Coding Standard |代码规范 (为目前的开发制定合适的规范) |30|40
|Design UML |设计项目UML类图 |120|90
|Coding |具体编码 |100|
|Code Review |代码复审 |100|
|Test |测试(自我测试,修改代码,提交修改)|50|
|Size Measurement |计算工作量(实际时间) |30|
|Postmortem & Process Improvement Plan |事后总结, 并提出过程改进计划|20 |
| |合计|1600|