姓名 | 学号 | GitHub地址 |
---|---|---|
钟文铎 | 3120004905 | https://github.com/3120004905/3120004905 |
丁认 | 3120004877 | https://github.com/LanHuXiangYuan/soft_ware4 |
文章目录
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 300 | 310 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 70 |
· Design Spec | · 生成设计文档 | 25 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 25 | 20 |
· Coding | · 具体编码 | 60 | 60 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 70 |
Reporting | 报告 | 70 | 75 |
· Test Report | · 测试报告 | 30 | 35 |
· Size Measurement | · 计算工作量 | 20 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 15 |
合计 | 390 | 405 |
二、效能分析
三、设计实现过程
3.1流程图
3.2算法思路
按照题目要求,生成的算式需要不重复,即不能通过有限次交换得出,我们想到可通过hash表将随机生成的数字存起来,需要生成算式时再拿出来与4种运算符拼成一条算式,此时算式属于一个集合,在通过字符串操作将等号前后分别分为算式与答案分别存入要求的文档。
四、代码说明
4.1 generate函数
private static void generate(Integer num,Integer range,Set<String> formulas) {
//从范围内选择不重复的随机数
Set<Integer> hs = new HashSet<Integer>();
Random r = new Random();
for(int i=0;i<num;i++){
hs.add(r.nextInt(range));
}
ArrayList<Integer> numbers =new ArrayList<Integer>(hs);
StringBuilder sb= new StringBuilder();
for(int i=numbers.size()-1;i>0;i--){
for(int j=0;j<OPERATORS_NUMBER;j++){
if(j==3&&numbers.get(i - 1)==0)continue;
//利用数字numbers.get(i)和numbers.get(i-1)和OPERATORS生成算式
sb.delete(0,sb.length());
float count = switch (j) {
case 0 -> numbers.get(i) + numbers.get(i - 1);
case 1 -> numbers.get(i) - numbers.get(i - 1);
case 2 -> numbers.get(i) * numbers.get(i - 1);
case 3 -> (float)numbers.get(i) / (float)numbers.get(i - 1);
default -> 0;
};
sb.append(numbers.get(i))
.append(OPERATORS[j])
.append(numbers.get(i - 1))
.append("=")
.append(count);
formulas.add(sb.toString());
}
}
循环生成两个数以及运算符,其中因集合的不重复性及自序性,排除重复的题目,最后通过append将各部分拼接起来存入formulas
4.2 output函数
private static void output(Integer num,Set<String> formulas) {
int i=1;
StringBuilder ans= new StringBuilder();
StringBuilder exercises= new StringBuilder();
for (Iterator<String> iterator = formulas.iterator(); iterator.hasNext();)
{
String str=iterator.next();
exercises.append(i).append(" .四则运算题目:").append(StringUtils.substringBefore(str, "=")).append("=").append("\n");;
ans.append(i).append(" .答案:").append(StringUtils.substringAfter(str, "=")).append("\n");
i++;
if(i==num+1)break;
}
writeAnswer(exercises.toString(),EXERCISE_ADDRESS);
writeAnswer(ans.toString(),ANSWER_ADDRESS);
}
此函数旨在拆分出算式集合中的算式部分及答案,通过StringUtils.substringBefore拆出等号之前的字符串即算式,后部分即答案,并通过writeAnswer函数计入Answer.txt和Exercises.txt
4.3 writeAnswer函数
static public void writeAnswer(String answer,String address) {
File answer_file=new File(address);
if(!answer_file.exists()){
try {
answer_file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
byte[] bytes =answer.getBytes();
int b=bytes.length; //是字节的长度,不是字符串的长度
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(answer_file);
fileOutputStream.write(bytes,0,b);
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
五、测试运行
六、项目小结
本次作业中,我们未能完成小括号加入以及对错题的统计,项目的代码量较少。在设计过程中,丁认同学主要负责写代码,钟文铎同学在旁检查代码,我们遇到了很多不会解决的代码问题,例如如何拆分算式字符串,用了StringUtil为何还是不行等等,且最初的构思与最终的代码有所出入,但总的来说,过程虽曲折,但所幸最终完成了这一项目,也学到了很多知识,通过这样结对完成项目,提高了效率,减少了错误,是一次宝贵的经历。