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

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

结对对象

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

(每个人负责1332976-20180501203925920-1555214715.jpg事情总会慢慢完成的

需求分析

功能要求

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

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

<2> 题目运算

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

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

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

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

设计思路

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

uml类图如下图所示
1332976-20180501204037279-1945274364.jpg

遇到的困难及解决方法

  • 问题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时,出来的题目会是客户需要的题目输入的三倍,如图所示1332976-20180501204536575-1797736629.png

当客户输入测试等级4时,出来的题目会是客户需要的题目输入的两倍,如图所示1332976-20180501204545406-888035146.png

其他的情况下都是正确的,我debug发现,在case3和case4时程序会分别循环3遍和两遍。可是在这两个case里的代码和case1、2、5中的代码是一样的。我和吴恒佚想了很久都不知道为什么。

现阶段成果

  • 一阶题目可以判断对错和正确率了,但二阶及二阶以上暂时不可以
    1332976-20180501204652879-68903368.png
  • 可以随机生成题目和选择难度和题数了
    1332976-20180501204930511-1610923401.png
    1332976-20180501204938301-242194153.png

PSP时间统计:

PSP2.1Personal 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

转载于:https://www.cnblogs.com/amberR/p/8977411.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值