20172324 结对编程项目-四则运算 第一周 阶段总结

20172324 结对编程项目-四则运算 第一周 阶段总结

结对对象

  • 学号 20172321
  • 姓名 吴恒佚
  • 伙伴第一周博客:小吴同学的博客
  • 担任角色:
  • 驾驶员:吴恒佚
  • 驾驶员:曾程

(每个人负责事情总会慢慢完成的

需求分析

功能要求

<1> 能按照不同的难度要求自动生成小学四则运算题目

  • 可独立使用(能实现自己编写测试类单独生成题目的功能)
  • 可生成不同等级题目,一级题目就是只有一个运算符,余此类推,最高级是五级。

<2> 题目运算

  • 可独立使用
  • 可进行分数运算(真分数)
  • 将中缀表达式转为后缀表达式并输出转化结果和答案
  • 判断用户答题正误,并输出正确结果
  • 计算正确率

<3>题目去重(扩展需求,加分项)

  • 可独立使用
需求理解
  1. 随机生成题目的类,要满足客户央求得难度和题目数目。
  2. 需要创建一个类,用来将将中缀表达式转化为后缀表达式
  3. 计算后缀表达式结果的类
  4. 判断题目对错和正确率的类
后续扩展

题目去重,暂时没有想法,但是如果有的话一定会补上的。能不能做到这个随缘...

设计思路

  1. 如何能够随机输出题目,特别的,可以根据客户需求输出题目等级和题目个数?(将运算符号存储在数组里,用random随机选择运算符和生成1-100的数字,一阶的直接用+连接就可以了,二阶及以上的需要用到for循环。至于客户对难度的选择,用switch语句,客户输入几级难度就到那个难度的case。)
  2. 中缀转化成后缀?(利用stack,首先栈为空,从左到右扫描原式,如果遇到操作数直接输出,并且输出一个空格作为两个操作数的分隔符,如果遇到运算符,与栈顶相比,比栈顶级别高就进栈,否则就退出栈顶元素并输出,然后输出一个空格做分隔符。并且在入栈之前,要先创造一个二维数组定义运算符的优先级)
  3. 计算后缀表达式?(设置一个操作数栈,开始栈为空,从左开始扫描,与操作数进栈,若与运算符,就从栈里退出两个元素,先退出的放右边,后退出的放左边,运算后进栈,直到扫描完毕最后那个元素就是结果)
  4. 判断对错和正确率(对错的话先在程序里计算出正确结果但是不输出,再与客户输入的结果做比较,一致输出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

猜你喜欢

转载自www.cnblogs.com/amberR/p/8977411.html