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. 设计测试类,测试整数类与分数类的四则运算
    1296643-20180415115927942-1727507879.png

三、核心代码及注释

  • 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类的方法测试
    1296643-20180415115959000-1633437493.png

  • Fraction类的方法测试
    1296643-20180415120009265-733093878.png

五、运行过程截图

1296643-20180415120039983-2142827113.png

1296643-20180415120026578-2054342262.png

六、代码托管地址

  • 四则运算

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

  • 问题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表格

    PSPPersonal Software Process Stages)预估耗时(分钟)实际耗时(分钟)
    Planning计划
    Estimate估计这个任务需要多少时间360500
    Development开发
    Analysis需求分析 (包括学习新技术)3040
    Design Spec生成设计文档3035
    Design Review设计复审 (和同事审核设计文档)2520
    Coding Standard代码规范 (为目前的开发制定合适的规范)1530
    Design具体设计6075
    Coding具体编码180255
    Code Review代码复审3025
    Test测试(自我测试,修改代码,提交修改)150135
    Reporting报告
    Test Report测试报告2025
    Size Measurement计算工作量105
    Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6080
    合计610725

转载于:https://www.cnblogs.com/tiankunye/p/8846839.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值