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

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

需求分析
  • 能指定生成题目的数量
  • 能指定题目包含的运算符数量
  • 每次生成的题目不能有重复
  • 通过命令行参数形式指定题目要求
  • 输出题目到文件,一行一个题目
  • 操作数为个位整数,即选择范围只能是: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.1Personal Software Process Stages预估耗时(小时)实际耗时(小时)
Planning计划0.51
Estimate· 估计这个任务需要多少时间0.51
Development开发1111.5
· Analysis·需求分析 (包括学习新技术)1.51
· Design Spec·生成设计文档0.50.5
Design Review·设计复审 (和同事审核设计文档)10.5
· Coding Standard·代码规范 (为目前的开发制定合适的规范)10.5
· Design· 具体设计21.5
· Coding· 具体编码24
· Code Review· 代码复审11
· Test· 测试(自我测试,修改代码,提交修改)22.5
Reporting报告22
· Test Report· 测试报告0.50.5
· Size Measurement· 计算工作量0.50.5
· Postmortem & Process Improvement Plan·事后总结, 并提出过程改进计划11
合计13.514.5

转载于:https://www.cnblogs.com/pingch/p/6942315.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值