阶段编程四则运算(挑战出题)

阶段编程四则运算(挑战出题)

需求分析

  • 能指定生成题目的数量
  • 能指定题目包含的运算符数量
  • 每次生成的题目不能有重复
  • 通过命令行参数形式指定题目要求
  • 输出题目到文件,一行一个题目
  • 操作数为个位整数,即选择范围只能是:1,2,3,4,5,6,7,8,9这9个数字
  • 操作符选择范围只能是:+,-,*,/, 还有括号

设计思路

  • 通过命令行参数形式来指定生成题目数量以及运算符数量。即通过java ExpressionGenerator <number-of-expressions> <number-of-operator> <output-file-path> 来传达要求。

  • 生成题目去重:将生成的表达式生成校验码,比较校验码,若相同,则再生成一次。

UML图

Main.jpg

实现过程中的关键代码解释

检验校验码,若集合中不存在该校验码,则写入StringBuilder。

while(veriLst.size()<=expr_num - 1) {
    boolean flag = false;
    IntegerExpression exp = new IntegerExpression(optr_num + 1);
    if(check(veriLst,exp.veriCode)){
        veriLst.add(exp.veriCode);
        expr.append(exp.toString());
        expr.append("\r\n");
    }
}

基于数字和符号特征生成校验码。

private void statistic(){
    for(int i : num)numLst[i]+=1;
    for(String i : op){
        switch (i.charAt(0)){
            case '+':{
                opLst[0]+=1;
                break;
            }
            case '-':{
                opLst[1]+=1;
                break;
            }
            case '*':{
                opLst[2]+=1;
                break;
            }
            case '/':{
                opLst[3]+=1;
                break;
            }
        }
    }
    veriCode = numLst[0] + "" + numLst[1] + "" + numLst[2] + "" + numLst[3] + "" + numLst[4] + "" + numLst[5]
            + "" + numLst[6] + "" + numLst[7] + "" + numLst[8] + "" + numLst[9] + "" + opLst[0] + "" +
            opLst[1] + ""  + opLst[2] + "" + opLst[3] + "";
}

校验码检验函数

public static boolean check(Set<String> veri,String beChecked){
    for(String s:veri){
        if(s.equals(beChecked))return false;
    }
    return true;
}

使用BufferedWriter写入文件,提高效率和安全性。

try{
    buffer.write(expr.toString());
    buffer.flush();
    buffer.close();
}catch (Exception e){
    System.out.println(e.getMessage());
}

测试方法

  • 运用老师给出的测试工具测试
  • 结果如下:

    第一次使用StringBuffer测试时间
===============================
total expressions: 20000
duplicated expressions: 0
===============================
Generation cost 14011 ms.


第二次使用StringBuilder和BufferedWrite测试时间

===============================
total expressions: 20000
duplicated expressions: 0
===============================
Generation cost 15027 ms.

结果没有明显提升,凑合着用吧。

运行过程截图

2017-06-04.png

代码托管地址

遇到的困难及解决方法

  • 问题:去除重复题目
  • 解决方案:将每个题目提取出一个校验码,利用校验码对题目的唯一性进行判断。通过这样虽然不能保障去掉的一定是重复的,但是可以保证重复的题目一定已经去掉了。

PSP表格

| PSP2.1| Personal Software Process Stages|预估耗时(小时)|实际耗时(小时)|
--- | :----------------😐:----------------😐:---------------: |:-----😐
| Planning | 计划 | 0.5 | 1 |
| Estimate | · 估计这个任务需要多少时间 | 0.5 | 1 |
|Development | 开发 | 11 | 11.5 |
| · Analysis | ·需求分析 (包括学习新技术) | 1.5 | 1 |
|· Design Spec | ·生成设计文档 | 0.5 | 0.5 |
|Design Review | ·设计复审 (和同事审核设计文档) | 1 | 0.5 |
|· Coding Standard | ·代码规范 (为目前的开发制定合适的规范) | 1 | 0.5 |
|· Design | · 具体设计 | 2 | 1.5 |
|· Coding | · 具体编码 | 2 | 4 |
|· Code Review | · 代码复审 | 1 | 1 |
|· Test | · 测试(自我测试,修改代码,提交修改) | 2 | 2.5 |
|Reporting | 报告 | 2 | 2 |
|· Test Report | · 测试报告 | 0.5 | 0.5 |
|· Size Measurement | · 计算工作量 | 0.5| 0.5|
| · Postmortem & Process Improvement Plan | ·事后总结, 并提出过程改进计划 | 1 | 1 |
| |合计 |13.5 |14.5 |

posted @ 2017-06-04 22:25  20162308马平川  阅读(183)  评论(3编辑  收藏  举报