软件工程 2.20194650 自动生成四则运算题第一版报告

一、需求分析:
    1,要能随机生成运算式。
    2,能对照正确答案。
    3,没有重复的。
    4,能自选类型题。
    5,式子能在txt文档查看打印。
二、 功能设计:
        基本功能:随机输出运算式(加减乘除,混合运算,小括号优先级)
        扩展功能:
                          1,给出答案(用户自选)
                          2,剔除重复
                          3,打印留出运算空间
                          3,提供用户选择(两位操作数,三位操作数(小括号);加减法(正负),乘除法(整分);题的个数;题的范围(操作数和结果)...)
三、设计实现:
        1,普通加减法
        2,加减法混合运算
        3,乘除法
四、测试运行:

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

软件工程 2.20194650 自动生成四则运算题第一版报告

五、 比较独特的或满意的代码片段。
1,剔除重复代码块

                     //定义数组
                    int[] strx = new int[5];
                    String[]str00 = new String[5];
                    int[]stry = new int[5];
                    //存入算式值
                    strx[i]=x;
                    str00[i]=str0[ran0];
                    stry[i]=y;
                    //定义判断参数
                    int ccc = 0;
                    //判断重复
                    for(int j=i;j>0&&j<5;j--){//从当前位置向前遍历数组元素        
                        if(strx[i]==strx[j-1]){//比较操作数x是否重复
                            if(str00[i]==str00[j-1]){//如重复比较操作符是否重复
                                if(stry[i]==stry[j-1]){//如重复比较最后一个操作数是否重复
                                    ccc=1;
                                }
                            }
                        }
                    }

2,操作数范围,题目数量可定制代码块

                //定制范围
                System.out.println("请输入操作数的范围,100以内请输入100,1000以内请输入1000");
                int nc = reader.nextInt();
                //定制数量
                System.out.println("请输入题的数量");
                int num = reader.nextInt();
                //循环输出num道随机题
                for (int i=0;i<num;i++){    
                    //随机产生范围内随机数和操作符
                    int a = (int)(0+Math.random()*(nc-0+1));
                    String[] str = { "+", "-"};
                    int random = (int) ( Math.random () * 2 );
                    int b = (int)(0+Math.random()*(nc-0+1));
                    int c;
                    //给出正确答案
                    if(random==0){
                        c = a+b;
                    }else{
                        c = a-b;
                    }

3,控制运算结果范围,打印方式,答案显示代码块

                     //运算结果控制在在0-100以内
                    if(c<=100&&c>=0){
                        //输出随机式
                        System.out.println (a+str[random]+b+"=");
                        //控制打印方式
                        System.out.println("如需留出运算行请输入1");
                        int nl = reader.nextInt();
                        if(nl==1){
                            System.out.println(" ");
                            System.out.println(" ");
                        }
                        //控制查看正确答案
                        System.out.println("如需显示答案请输入1");
                        int nd = reader.nextInt();
                        if(nd==1){
                            System.out.println(c);
                        }
                    }else{
                        //不在需求内 重新计算
                        i=i-1;
                    }

4,正负数可控代码块

             //操作数是否含负数(加减有无负数
            System.out.println("请选择操作数是否含有负数,是请输入1,否请输入2");
            int fs = reader.nextInt();
            if(fs==1){
                //操作数含有负数
                //循环输出5道随机题
                for (int i=0;i<5&&i>=0;i++){    
                    //随机产生范围内随机数和操作符
                    int x = (int)(-100+Math.random()*(2*100+1));
                    String[] str0 = { "+", "-"};
                    int ran0 = (int) (Math.random () * 2 );
                    int y = (int)(-100+Math.random()*(2*100+1));

5,分数可控代码块

                //是否支持分数
                System.out.println("请选择操作数是否含有分数,是请输入1,否请输入2");
                int fs2 = reader.nextInt();
                if(fs2==1){
                    //含有分数
                    //循环输出num2道随机题
                    for (int i=0;i<num2;i++)
                    {
                        //产生随机数
                        double u = (double)(0+Math.random()*(100-0+1));
                        String[] str2 = { "*", "/"};
                        int r3 = (int) ( Math.random () * 2 );
                        double v = (double)(0+Math.random()*(100-0+1));
                        double ww;
                        //计算正确答案
                        if(r3==0){
                            ww = u*v;
                        }else{
                            ww = u/v;
                        }
                        //输出随机式
                        System.out.println (u+str2[r3]+v+"="+ww);
                    }

6,小括号混合运算可控代码块

             System.out.println("请选择操作数是否含有小括号,是请输入1,否请输入2");
            int fsx = reader.nextInt();
            if(fsx==1){
                //含有小括号
                //循环输出num1道随机题
                for (int i=0;i<num1;i++)
                {    
                    String[] stra = { "1", "2"};
                    int aaa = (int) ( Math.random () * 2 );
                    switch(aaa){
                        case 0:
                                //1.(a+b)+c
                                //随机产生范围内随机数和操作符
                                int ll = (int)(0+Math.random()*(100-0+1));
                                String[] str1 = { "+", "-"};
                                int rll = (int) ( Math.random () * 2 );
                                int mm = (int)(0+Math.random()*(100-0+1));
                                String[] str2 = { "+", "-"};
                                int rlll = (int) ( Math.random () * 2 );
                                int nn = (int)(0+Math.random()*(100-0+1));;
                                //定义结果参数
                                int gg1,gg2;
                                //计算正确答案
                                if(rll==0){
                                    gg1 = ll+mm;
                                }else{
                                    gg1 = ll-mm;
                                }
                                if(rlll==0){
                                    gg2 = gg1+nn;
                                }else{
                                    gg2 = gg1-nn;
                                }
                                //输出随机式
                                System.out.println ("("+ll+str1[rll]+mm+")"+str2[rlll]+nn+"="+gg2);    
                                break;
                        case 1:
                                //2.a+(b+c)
                                //随机产生范围内随机数和操作符
                                int ll0 = (int)(0+Math.random()*(100-0+1));
                                String[] str10 = { "+", "-"};
                                int rll0 = (int) ( Math.random () * 2 );
                                int mm0 = (int)(0+Math.random()*(100-0+1));
                                String[] str20 = { "+", "-"};
                                int rlll0 = (int) ( Math.random () * 2 );
                                int nn0 = (int)(0+Math.random()*(100-0+1));;
                                //定义结果参数
                                int gg10=0,gg20=0;
                                //计算正确答案
                                
                                if(rlll0==0){
                                    gg20 = mm0+nn0;
                                }else{
                                    gg20= mm0-nn0;
                                }
                                if(rll0==0){
                                    gg10 = ll0+gg20;
                                }else{
                                    gg10 = ll0-gg20;
                                }
                                //输出随机式
                                System.out.println (ll0+str10[rll0]+"("+mm0+str20[rlll0]+nn0+")"+"="+gg10);
                                break;
                    }
                }

7,生成的运算题存储到外部文件result.txt中代码块

                        //生成的运算题存储到外部文件result.txt中
                        Path debugFile = Paths.get("d:\result.txt");
                        try (OutputStream outputStream = Files.newOutputStream(debugFile, StandardOpenOption.CREATE,StandardOpenOption.APPEND);
                        PrintStream printStream = new PrintStream(outputStream, true))
                        {
                            System.setOut(printStream);
                            System.out.println (x+str0[ran0]+"("+y+")"+"="+z);
                        } catch (IOException e) {
                        e.printStackTrace();
                        }

 六、总结:
        1,从基础功能做起,逐层递增
        2,分工能块编写代码
        3,在原有基础上不断增加新的功能,每一个功能都要单独测试,防止找不到错误源。
七、PSP

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

5

10

·       Estimate

·  估计这个任务需要多少时间,并规划大致工作步骤

5

10

Development

开发

670

810

··       Analysis

  需求分析 (包括学习新技术)

5

10

·       Design Spec

·  生成设计文档

0

0

·       Design Review

·  设计复审 (和同事审核设计文档)

0

0

·       Coding Standard

  代码规范 (为目前的开发制定合适的规范)

5

10

·       Design

  具体设计

10

10

·       Coding

  具体编码

600

660

·       Code Review

·  代码复审

30

60

·       Test

·  测试(自我测试,修改代码,提交修改)

20

60

Reporting

报告

20

120

··       Test Report

·  测试报告

0

0

·       Size Measurement

  计算工作量

0

0

·       Postmortem & Process Improvement Plan

·  事后总结 ,并提出过程改进计划

20

120

具体编码耗时最多,相差最大是在编写报告上,因为运用不熟练。