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

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

我的github仓库地址:https://github.com/xichen1602/FourArithmetic

一、题目要求:

  • 任务:

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

  • 具体要求:

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

23 - 3 * 4 = 11
  • 扩展要求:

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

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

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

    然后和同学们比较一下各自程序的功能、实现方法的异同等等。

写博客纪录自己实现的过程和思路。

二、设计

  • 1、类:

FourArithmeticOperation(主类),Random(生成随机数、随机运算符)

  • 2、思路:

通过输入的题目数目,产生相应的题目,调用随机函数产生操作数和操作符,每产生一道题目,对用户输入的结果进行判断,最终评分。

三、运行结果和关键代码

  • 运行结果截图:
  • 关键代码:
//产生题目
 switch (randomOperator1){//判断第一个操作符
        case "+":
            switch (randomOperator2){//判断第二个操作符
                   case "+":
                         result=(float)(num1+num2+num3);
                            System.out.print(num1+"+"+num2+"+"+num3+"=");//显示题目
                            inputAnswer=scanner.nextFloat();//待输入
                            check(inputAnswer,result,countFormat);//检查输入答案并给分数
                            break;
                        case "-":
                            while ((num1+num2)-num3<0){
                                num3=random.randomNumber();
                            }
                            result=(float)(num1+num2-num3);
                            System.out.print(num1+"+"+num2+"-"+num3+"=");
                            inputAnswer=scanner.nextFloat();
                            check(inputAnswer,result,countFormat);
                            break;
                        case "*":
                            result=(float)(num1+num2*num3);
                            System.out.print(num1+"+"+num2+"*"+num3+"=");
                            inputAnswer=scanner.nextFloat();
                            check(inputAnswer,result,countFormat);
                            break;
                        case "/":
                           if(num3==0){//除数不为0,若为0置为1
                            num3=1;
                          }
                           result=num1+(float)num2/num3;
                           System.out.print(num1+"+"+num2+"/"+num3+"=");
                           inputAnswer=scanner.nextFloat();
                           check(inputAnswer,result,countFormat);
                           break;
                    }
                    break;            
//判断输入并累计分数
public static void check(float answer, float result, float countFormat){
        if(Math.abs(answer-result)<0.01){//输入的答案和正确结果相差的绝对值不超过0.01即为正确
            System.out.println("答对了!");
            score= (int) (score+countFormat*100);
        }
        else {
            System.out.println("答错了,正确答案是:"+String.format("%.2f",result));//格式化正确结果,保留两位小数
        }
    }

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

PSP模版表格:

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

五、总结

本次四则运算初版项目,主要遇到的问题是数据之间的转换,特别是整形和浮点型数据,处理不当会丢失精度,这个过程还是需要细心的。实现效果是产生两个运算符,主要实现方式简单粗暴:采用switch嵌套判断。虽然基本实现了功能,但是目前还不能处理分数类型以及不能随机产生三位以上的操作符,所以后续还需要完善。另外,模块化设计做的不好,没能体现“面向对象”的特点,代码冗余较多,也需后续优化。

原文地址:https://www.cnblogs.com/Xi-Chen00/p/9789935.html