本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166

我的github远程仓库的地址:https://github.com/LiuQSong/learnning

第一部分:要求

    具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:

23 - 3 * 4 = 11


第二部分:个人软件过程耗时估计与统计表

 

PSP2.1 Personal Software Process Stages Time Senior Student Time
Planning 计划 5 10
· Estimate 估计这个任务需要多少时间 157 173
Development 开发 60 73
· Analysis 需求分析 (包括学习新技术) 6 10
· Design Spec 生成设计文档 5 6
· Design Review 设计复审 4 6
· Coding Standard 代码规范 2 2
· Design 具体设计 10 12
· Coding 具体编码 36 21
· Code Review 代码复审 3 5
· Test 测试(自我测试,修改代码,提交修改) 10 12
Reporting 报告 9 12
· 测试报告 3 2
· 计算工作量 2 1
· 并提出过程改进计划 2 1

 

 


 

 第三部分:软件设计与实现

     设计思想:把运算式的显示和运算结果的计算分别写在两个方法里面,之后用一个产生随机数的方法把它们绑定在一起,实现计算结构和计算式的统一,避免负数结果就用判断语句,做题次数则使用循环语句,而运算式中的运算符与运算符号的使用都是用选择判断语句(switch)实现。

 

    实现代码:  

 public static void main(String[] args){
        int times=0;       //用户输入题数
        int flag=0;    //记录正确题数
        double answer=0;     //用户输入的答案
        double percent=0;     //正确率
        Scanner inputNumber = new Scanner(System.in);
        Scanner answer1 = new Scanner(System.in);
        System.out.println("请输入题数:");
        times = inputNumber.nextInt();
        for(int i=0;i<times;i++)
        {
            double corret;
            do {
                 corret = timu();
            }while (corret<0);
            answer = answer1.nextDouble();
           if(answer==corret){
               System.out.println("回答正确");
               flag=flag+1;
           }
           else{
               System.out.println("回答错误,正确答案是:"+corret);
           }
        }
        percent=(double)flag/times*100;
        System.out.println("正确率为:"+percent+'%');

    }

使用do-while来避免得到负数,用for循环执行要求次数,创建一个方法timu()显示算式并返回一个double类型的运算结果并且赋予给corret,判断是否负数,负数就再执行一次,用corret与用户输入的值进行比对看是否正确。

 

public  static double timu(){
        int sign1 =(int)(Math.random()*3); //产生1-4的随机数 运算符号1
        int sign2 =(int)(Math.random()*3); //产生1-4的随机数  运算符号2
        int  x=1+(int)(Math.random()*99);
        int  y=1+(int)(Math.random()*99);
        int  z=1+(int)(Math.random()*99);
        String result="";
        double result1=0;
        result=count(x,y,z,sign1,sign2);
        result1=count1(x,y,z,sign1,sign2);
        if(result1>=0) {
            System.out.println(result + "=? (答案保留一位小数)");
        }
        return result1;
    }

使用一个方法来产生随机数并且绑定算式与结果,并且在该方法显示题目,返回正确结果,而这里if语句防止得到负数从而再次执行时显示出算式。

 

    public  static String count(int x,int y,int z,int sign1,int sign2){
        String result="";
        String sign3="";
        String sign4="";
        sign3=sign4;
        sign4=sign3;
        String x1 = String.valueOf(x);
        String y1 = String.valueOf(y);
        String z1 = String.valueOf(z);
        switch(sign1){
            case 0:sign3="+";break;
            case 1:sign3="-";break;
            case 2:sign3="x";break;
            case 3:sign3="/";break;
            default:sign3="+";
        }
        switch(sign2){
            case 0:sign4="+";break;
            case 1:sign4="-";break;
            case 2:sign4="x";break;
            case 3:sign4="/";break;
            default:sign4="+";
        }
        result=x1+sign3+y1+sign4+z1;
        return result;
    }
    public  static double count1(int x,int y,int z,int sign1,int sign2){
        double result=0;
         ....
        String test =new DecimalFormat("0.0").format(result);
        result = Double.valueOf(test);
        return result;
    }
}

传入相同的值给count与count1,使得算式与结果一致,count得到算式,count1得到结果,count1执行计算。

执行结果:

:

 


 

 第四部分:遇到的问题与总结

    遇到的问题:

    (1)我在编程该程序的时候参考了一下网上的算法,发现他们都是用出栈入栈进行运算优先级的处理与总体运算,而我一开始没有计划到这样做,只好一条路走到黑,痛点在运算方法count1()太过木讷,只能靠运算的规格不大才用这种多个if语句执行各种运算情况。

    (2)怎么处理小数让用户输入的和程序产生的结果得到统一,后来我使用

 String test =new DecimalFormat("0.0").format(result);
        result = Double.valueOf(test);

 这种方法进行保留一位小数,先得到保留一位小数的字符型test先得到保留一位小数的字符型test,然后再转成浮点数赋予result。

    总结:   

   使用的时间比预想使用的多了16分钟,其实我以为本来会更少的,没想到比想像中的难,也有自己基础不扎实的原因,我更深刻地了解到编程需要不断专研不断锻炼才能得心应手。在日后的编程学习生活里面我会更加努力。