阶段编程四则运算(挑战出题)
阶段编程四则运算(挑战出题)
需求分析
- 能指定生成题目的数量
- 能指定题目包含的运算符数量
- 每次生成的题目不能有重复
- 通过命令行参数形式指定题目要求
- 输出题目到文件,一行一个题目
- 操作数为个位整数,即选择范围只能是:1,2,3,4,5,6,7,8,9这9个数字
- 操作符选择范围只能是:+,-,*,/, 还有括号
设计思路
-
通过命令行参数形式来指定生成题目数量以及运算符数量。即通过
java ExpressionGenerator <number-of-expressions> <number-of-operator> <output-file-path>
来传达要求。 -
生成题目去重:将生成的表达式生成校验码,比较校验码,若相同,则再生成一次。
UML图
实现过程中的关键代码解释
检验校验码,若集合中不存在该校验码,则写入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.
结果没有明显提升,凑合着用吧。
运行过程截图
代码托管地址
遇到的困难及解决方法
- 问题:去除重复题目
- 解决方案:将每个题目提取出一个校验码,利用校验码对题目的唯一性进行判断。通过这样虽然不能保障去掉的一定是重复的,但是可以保证重复的题目一定已经去掉了。
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 |