zoukankan      html  css  js  c++  java
  • 阶段编程四则运算(挑战出题)

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

    需求分析

    • 能指定生成题目的数量
    • 能指定题目包含的运算符数量
    • 每次生成的题目不能有重复
    • 通过命令行参数形式指定题目要求
    • 输出题目到文件,一行一个题目
    • 操作数为个位整数,即选择范围只能是: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("
    ");
        }
    }
    

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

    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
  • 相关阅读:
    (转)如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
    Git 常用命令(转)
    (转)iphone常用控件之UIScrollView 不错收藏记录一下
    (转) copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理
    设计一个移动应用的本地缓存机制(转)
    让表格对角线上的表格变色
    DevExpress XtraReports 入门一 创建 Hello World 报表
    DevExpress XtraReports 入门三 创建 MasterDetail(主/从) 报表
    DevExpress XtraReports 入门二 创建 dataaware(数据感知) 报表
    自己搜集的一些资料(只是一些链接而已)
  • 原文地址:https://www.cnblogs.com/pingch/p/6942315.html
Copyright © 2011-2022 走看看