个人项目-小学四则运算 “软件”之初版

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

我的github远程仓库的地址:https://github.com/manjin666/public

一、题目要求:

像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。

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

23 - 3 * 4 = 11

扩展要求:

1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。

初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。

二、个人软件过程耗时估计与统计表:

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

项目过程:

项目效果图:

主要的逻辑代码如下,是用Java语言来实现的;

 private float getOperationResult(char operation,float x,float y){
        float result=0;
        switch (operation){
            case '+':
                result=x+y;
                break;
            case '-':
                result=x-y;
                break;
            case '*':
                result=x*y;
                break;
            case '/':
                result=x/y;
                break;
        }
        return result;
    }

    private void  arithmetic(){
        int number[]=new int[3]; //运算数量
        char []operation=new char[2]; //符号数量
        while (true){
           for(int i=0;i<number.length;i++){
               number[i]=getRandomNumber(); //给变量赋值
           }
           operation[0]=getRandomOperation(); //给符号位赋值
           operation[1]=getRandomOperation();
           if(operation[0]=='*' || operation[0]=='/'){ //判断第一个是否为*,/ 是,则直接计算
              if(number[1]==0)continue;
               resultNumber=getOperationResult(operation[0],number[0],number[1]);
               if(operation[1]=='/' && number[2]==0)continue;
               resultNumber=getOperationResult(operation[1],resultNumber,number[2]);
          }else {
               //如果第一个符号位不是* ,/那就先算第二个数和三个数的值后,再与第一个值计算
              if(operation[1]=='/'&& number[2]==0)continue; 
              if(operation[0]=='-'){
                  resultNumber=getOperationResult(operation[1],-number[1],number[2]);
                  operation[0]='+';
              }
              else{
                  resultNumber=getOperationResult(operation[1],number[1],number[2]);
              }
               resultNumber=getOperationResult(operation[0],number[0],resultNumber);
          }
          if(resultNumber<0)continue;
          else break;
       }
        //              将数字和符号串联起来 作为输出题目的字符
        result=number[0]+""+operation[0]+number[1]+operation[1]+number[2];
       System.out.print(result+"=");
        Scanner sc = new Scanner(System.in);
        float age = sc.nextFloat();
//        当用户输入的数字和正确答案相比的精确度大于0.01时,判断用户计算错误
        if(Math.abs(age-resultNumber)>0.01){
            System.out.print("你计算错误,正确的答案为:"+String.format("%.2f", resultNumber)+"\n");
        }else{
            System.out.print("你计算正确\n");
            countTrue++;
        }
    }

通过Java来实现这个效果,写起来还是比较繁琐,为了方便修改,很代码模块化,写了比较的多的方法和定义了比较多的变量;

如下图

这个过程还是比较费时间,事前没有花时间去好好规划怎么实现,属于想到哪写到哪;

好在又重新的思考和规划了一下,功能实现了;

posted @ 2018-10-12 21:15  一觉不觉已千年  阅读(242)  评论(2编辑  收藏  举报