20165230 结对编程项目-四则运算 阶段总结

Posted tiankunye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20165230 结对编程项目-四则运算 阶段总结相关的知识,希望对你有一定的参考价值。

20165230 结对编程项目-四则运算 阶段总结

一、需求分析

  • 随机生成题目
  1. 生成的题目个数从命令行输入
  2. 用户可选择生成不同难度的题目,比如通过参数指定: (1) 运算符个数范围 (2) 运算符限定(小学一年级题目只生成 + - 题目)
  3. 能多次生成题目
  • 题目运算(判题)
  1. 支持多运算符
  2. 支持整数
  3. 支持真分数
  4. 转换为后缀表达式(也可以直接计算中缀表达式)
  • 题目合法性判断
  1. 可独立使用
  2. 可用于测试生成题目的正确性
  • 扩展需求
  1. 题目去重
  2. 支持多语言
  3. 处理生成题目并输出到文件
  4. 完成题目后从文件读入并判题

二、设计思路

  1. 设计一个IntNumber类,用来实现整数的四则运算
  2. 设计一个Fraction类,用来实现真分数的四则运算
  3. 设计一个Judgement类,用来判断用户输入与实际计算值是否相等,并统计正确的次数
  4. 设计主类,生成随机数,生成题目,并判断正确率
  5. 设计测试类,测试整数类与分数类的四则运算
    技术分享图片

三、核心代码及注释

  • Calculate
import java.text.NumberFormat;
import java.util.*;
public class Calculate {
    public static void main(String[] args) {
        NumberFormat number = NumberFormat.getPercentInstance();
        Random ran = new Random();
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.print("请输入要生成的题目数量:");
            int A = scan.nextInt();
            for (int i = 0; i < A; i++) {
                int B = ran.nextInt(2);
                int C = ran.nextInt(4);
                IntNumber in1 = IntNumber.obj();
                IntNumber in2 = IntNumber.obj();
                Fraction score1 = Fraction.obj();
                Fraction score2 = Fraction.obj();
                if (B == 0) {//随机生成整数的计算题目
                    switch (C) {
                        case 0:
                            int num = in1.add(in2);
                            String num1 = "" + num;
                            int n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 1:
                            num = in1.subtract(in2);
                            num1 = "" + num;
                            n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 2:
                            num = in1.multiply(in2);
                            num1 = "" + num;
                            n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 3:
                            num1 = in1.divide(score1);
                            String Q = scan.next();
                            Judgement.judge(Q.equals(num1), num1);
                            break;
                    }
                } else {//随机生成真分数的计算题目
                    switch (C) {
                        case 0:
                            Fraction num2 = score1.add(score2);
                            String num1 = num2.toString();
                            String s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 1:
                            num2 = score1.subtract(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 2:
                            num2 = score1.multiply(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 3:
                            num2 = score1.divide(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                    }
                }
            }
            System.out.println("你答对的题目总数:" +  Judgement.getTrues());
            double T = (double) Judgement.getTrues() / A;//计算正确率
            System.out.println("正确率为:" + number.format(T));
            System.out.println("是否继续生成题目?(y/n):"  );//多次生成题目,直到用户选择退出
            String s1 = scan.next();
            if (s1.equalsIgnoreCase("n")){
                break;
            }
        }
    }
}

四、测试方法

  • IntNumber类的方法测试
    技术分享图片

  • Fraction类的方法测试
    技术分享图片

五、运行过程截图

技术分享图片

技术分享图片

六、代码托管地址

  • 四则运算

    七、遇到的困难及解决方法

  • 问题1:如何实现随机生成数和题目?
  • 解决方法:上星期学了第八章常用实用类中学习过Random类,通过反复思考如何将书上给出的方法运用于实际,最终运用了

    Random random = new Random()
    random.nextInt()
    并结合switch语句,成功实现生成随机数和题目
  • 问题2:如何确定取值范围
  • 解决方法:当把上一个问题解决后,便可解决这个问题,即让随机数生成器random返回一个0--n之间(包括0但不包括n)的随机数,调用带参数的nextInt(int m)方法,即可返回[0,m)之间的某个整数
  • 问题3:如何实现多次生成题目?
  • 解决方法:将主函数里核心部分放入while(true)循环中,当用户选择"n"即结束循环,通过equalsIgnoreCase("n"),比较两个字符串具有相同的字符,而不比较其大小即可

    八、对结对的小伙伴的评价

  • 结对搭档:20165226刘香杉
  • 最开始我们看完题目要求后,都是一头雾水,不知道该从何下手,通过与刘香杉同学交流讨论,开始了我们的头脑风暴,先构建出基本的框架,再写出测试代码,一步一步的完成,在编程的过程中遇到了许多问题,比如如何实现真分数的运算,如何实现生成随机题目等等,最终通过我们的协作,完成了本次编程,收益很大,也体会到了结对编程的好处,当一个人构思出现瓶颈的时候,通过二人交流和相互的提示,会很快又有新的解决方案和想法,在编程的过程中,有语法的错误等等会互相检查和改正,达到了高效率的编程。

    九、参考或引用的设计、实现

  • 结对编程项目-四则运算
  • 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
  • 结对编程和两人合作
  • Intellj IDEA 简易教程——单元测试
  • 现代软件工程讲义 个人项目和结对项目练习 四则运算

    十、PSP表格

    PSP Personal Software Process Stages) 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划
    Estimate 估计这个任务需要多少时间 360 500
    Development 开发
    Analysis 需求分析 (包括学习新技术) 30 40
    Design Spec 生成设计文档 30 35
    Design Review 设计复审 (和同事审核设计文档) 25 20
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 15 30
    Design 具体设计 60 75
    Coding 具体编码 180 255
    Code Review 代码复审 30 25
    Test 测试(自我测试,修改代码,提交修改) 150 135
    Reporting 报告
    Test Report 测试报告 20 25
    Size Measurement 计算工作量 10 5
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 80
    合计 610 725



以上是关于20165230 结对编程项目-四则运算 阶段总结的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

20165318 结对编程项目-四则运算 阶段总结

20165206 结对编程项目-四则运算 阶段一总结

20175209王梓鸿 结对编程项目—四则运算 第一周 阶段总结