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

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

    十、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 | |

  • 相关阅读:
    最长公共前缀
    无重复字符的最长子串
    文章采集代码
    网络验证常见的攻击方式与防御手段
    初创公司如何避免服务器被攻击
    拒绝ssh远程暴力破解
    我公司开了7年,靠的就是这套顶级销售打法撑下来!
    顶级销售的十个习惯,轻松签下百万千万合同!(值得背下来)
    顶级销售高手总结的 9 个方面
    一位顶级销售高手总结的“销售心得”!
  • 原文地址:https://www.cnblogs.com/tiankunye/p/8846839.html
Copyright © 2011-2022 走看看