结对编程-四则运算生成器

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Networkengineering1834
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Networkengineering1834/homework/11148
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序,熟悉使用PSP表格进行估计,熟悉使用单元测试

1、项目成员

  • 学号:3118005284 - 姓名:刘宜霖
  • 学号:3118005305 - 姓名:庄育龙

2、GitHub地址

github仓库

3、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate 估计这个任务需要多少时间 10 20
Development 开发 520 700
· Analysis 需求分析 (包括学习新技术) 20 40
· Design Spec 生成设计文档 10 20
· Design Review 设计复审 20 10
· Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
· Design 具体设计 30 30
· Coding 具体编码 360 470
· Code Review 代码复审 30 40
· Test 测试(自我测试,修改代码,提交修改) 40 80
Reporting 报告 65 55
· Test Repor 测试报告 20 20
· Size Measurement 计算工作量 15 15
· Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 20
合计 615 785

4、效能分析

  • 数据占用内存
  • 模块时间消耗
  • 时间占用百分比
  • CPU占用频率

以上是生成100道四则运算的性能测试图,程序的性能较好,但是在对字符串的处理中消耗的内存较多

5、设计实现过程

①文件工程结构

ComposeFormula类:组合两个算式
ControllerMain类:程序交互模块
CreateFormula类:生成算式,并得到答案
GetNewFormula类:将生成的算式传到FileOperate类中
FileOperate类:输出练习题和答案到文件中,输入练习题和答案进行比对
FileReserve类:存放练习题文件和答案文件到数组中

②(一)计算式生成流程图



(二)练习题和答案校验流程图

6、代码说明

关键代码为生成随机数和符号,并且对因为除法而产生的分数进行处理

public CreateFormula(int range) {//range为传入的数值范围
        if ((Math.random() * 2) <= 1) {            //只有一数的情况
            value = (int) (Math.random() * (range - 1) + 1);
            formula = String.valueOf(value);
            symbol = '\0';
        } else {//若生成两个数
            value1 = (int) (Math.random() * range + 1);
            value2 = (int) (Math.random() * range + 1);
            symbol = all_symbol[(int) (Math.random() * 4)];//随机生成+、-、*、/的其中一种符号
            if (symbol == '/' && value1 % value2 != 0) {//若为除号,且不能整除,生成分式
                isFraction = true;
                fraction = fractionOperate(value1, value2);
            } else {//若为除号,且可以整除
                value = get_value(value1, value2, symbol);
            }
            if (isSwap) {//如果出现负数
                value = -value;
                formula = "(" + value2 + symbol + value1 + ")";
            } else
                formula = "(" + value1 + symbol + value2 + ")";
        }
    }

//处理分数
    public String fractionOperate(int a, int b) {
        int zhengShu = a / b;//整数
        int numerator = a - zhengShu * b;//分子
        int i;
        int maxGongYinShu = 1;
        for (i = 1; i <= numerator; i++) {//找最大公因数,化简分数
            if (numerator % i == 0 && b % i == 0)
                maxGongYinShu = i;
        }
        String fraction;
        if (zhengShu == 0) {//分子小于分母
            if (numerator == 0)
                fraction = String.valueOf(0);
            else
                fraction = String.valueOf(numerator / maxGongYinShu) + '/' + (b / maxGongYinShu);
        } else {//分子大于分母
            if (numerator == 0)
                fraction = String.valueOf(zhengShu);
            else
                fraction = String.valueOf(zhengShu) + '’' + numerator / maxGongYinShu + '/' + b / maxGongYinShu;
        }
        return fraction;
    }

7、测试运行

  • 命令行示意图

  • 创建题目和答案文件

  • 题目和答案文件生成结果

  • 做题结果和答案校验


    统计结果与预测相一致。

  • 生成10000道题目

8、项目小结

此次结对项目首先让我们两个对于团队合作中应当注意的事项例如:应及时沟通双方工作进程,当遇到推进困难问题可以双方一起解决,这样就不会落下进度。在本次作业中,对分数的处理过程中比较繁琐,要考虑到假分数要转换为真分数、组合两个算式时要判断前后两个算式是否为分数。同时对题目的查重处理如何实现也是个难题,我们采用的方法是对于相同结果的题目并且算式长度一致则模糊地判定为“重复”,会出现误查,所以还并不是特别尽善尽美,仍需改进,私下会与其他同学交流探讨他们是怎样实现查重算法。

posted @ 2020-10-12 22:05  18zyl  阅读(191)  评论(0编辑  收藏  举报