20172324 结对编程项目-四则运算 第一周 阶段总结
20172324 结对编程项目-四则运算 第一周 阶段总结
结对对象
- 学号 20172321
- 姓名 吴恒佚
- 伙伴第一周博客:小吴同学的博客
- 担任角色:
- 驾驶员:吴恒佚
- 驾驶员:曾程
(每个人负责事情总会慢慢完成的
)
需求分析
功能要求
<1> 能按照不同的难度要求自动生成小学四则运算题目
- 可独立使用(能实现自己编写测试类单独生成题目的功能)
- 可生成不同等级题目,一级题目就是只有一个运算符,余此类推,最高级是五级。
<2> 题目运算
- 可独立使用
- 可进行分数运算(真分数)
- 将中缀表达式转为后缀表达式并输出转化结果和答案
- 判断用户答题正误,并输出正确结果
- 计算正确率
<3>题目去重(扩展需求,加分项)
- 可独立使用
需求理解
- 随机生成题目的类,要满足客户央求得难度和题目数目。
- 需要创建一个类,用来将将中缀表达式转化为后缀表达式
- 计算后缀表达式结果的类
- 判断题目对错和正确率的类
后续扩展
题目去重,暂时没有想法,但是如果有的话一定会补上的。能不能做到这个随缘...
设计思路
- 如何能够随机输出题目,特别的,可以根据客户需求输出题目等级和题目个数?(将运算符号存储在数组里,用random随机选择运算符和生成1-100的数字,一阶的直接用+连接就可以了,二阶及以上的需要用到for循环。至于客户对难度的选择,用switch语句,客户输入几级难度就到那个难度的case。)
- 中缀转化成后缀?(利用stack,首先栈为空,从左到右扫描原式,如果遇到操作数直接输出,并且输出一个空格作为两个操作数的分隔符,如果遇到运算符,与栈顶相比,比栈顶级别高就进栈,否则就退出栈顶元素并输出,然后输出一个空格做分隔符。并且在入栈之前,要先创造一个二维数组定义运算符的优先级)
- 计算后缀表达式?(设置一个操作数栈,开始栈为空,从左开始扫描,与操作数进栈,若与运算符,就从栈里退出两个元素,先退出的放右边,后退出的放左边,运算后进栈,直到扫描完毕最后那个元素就是结果)
- 判断对错和正确率(对错的话先在程序里计算出正确结果但是不输出,再与客户输入的结果做比较,一致输出true,不一致输出false。正确率的话就是用正确的题数除以总题数)
uml类图如下图所示
遇到的困难及解决方法
- 问题1及解决办法:我最开始走偏的,我直接用main方法将题目生成出来了,没有创建类。原因是因为我发现不用main方法有些操作就不能进行,比如switch、for之类的就会有错误提示。最后还好有王文彬同学倾情指导,教会了我如何创建类。
- 问题2及没有解决办法:现在遇到了一个很大很大很大的问题...debug没有问题,应该是逻辑错误,但是没有想到解决的办法。以下是代码
生成计算的式子类
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;
//三级算式
case 3:
ArrayList<String> expression3 = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + 3; //3个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(100) + 1; //4个数字
}
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 += "=";
expression3.add(ex);
}
for(int ii = 0; ii < expression3.size() ; ii++)
{
System.out.print(expression3.get(ii) + "\n");
}
//四级算式
case 4:
ArrayList<String> expression4 = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + 4; //4个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(100) + 1; //5个数字
}
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 += "=";
expression4.add(ex);
}
for(int ii = 0; ii < expression4.size() ; ii++)
{
System.out.print(expression4.get(ii) + "\n");
}
//五级算式
case 5:
ArrayList<String> expression5 = new ArrayList<String>();
for (int i = 0; i < num; i++) {
int n = random.nextInt(1) + 5; //5个运算符
int[] number = new int[n + 1];
String ex = new String();
for (int j = 0; j <= n; j++) {
number[j] = random.nextInt(100) + 1; //6个数字
}
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 += "=";
expression5.add(ex);
}
for(int ii = 0; ii < expression5.size() ; ii++)
{
System.out.print(expression5.get(ii) + "\n");
}
}
}
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;
}
}
public void produce(){
}
}
类的实现
public class test {
public static void main(String[] args) {
levelclass a = new levelclass();
a.produce();
}
}
问题就是当客户输入测试等级3时,出来的题目会是客户需要的题目输入的三倍,如图所示
当客户输入测试等级4时,出来的题目会是客户需要的题目输入的两倍,如图所示
其他的情况下都是正确的,我debug发现,在case3和case4时程序会分别循环3遍和两遍。可是在这两个case里的代码和case1、2、5中的代码是一样的。我和吴恒佚想了很久都不知道为什么。
现阶段成果
- 一阶题目可以判断对错和正确率了,但二阶及二阶以上暂时不可以
- 可以随机生成题目和选择难度和题数了
PSP时间统计:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | |
---|---|---|---|---|
Planning | 计划 | 50 | ||
Estimate | 估计这个任务需要多少时间 | 60 | ||
Development | 开发 | 600 | ||
Analysis | 需求分析 (包括学习新技术) | 150 | ||
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 45 | ||
Design UML | 设计项目UML类图 | 20 | ||
Coding | 具体编码 | 180 | ||
Code Review | 代码复审 | 60 | ||
Test | 测试(自我测试,修改代码,提交修改) | 100 | ||
Size Measurement | 计算工作量(实际时间) | 30 | ||
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | ||
合计 | 1315 |