这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 结对合作+生成四则运算题目程序/检查器 |
项目成员1 | 3119005481 杨春晓 Github项目地址 |
项目成员2 | 3119005488 钟理恩 Github项目地址 |
目录
1.作业 GitHub 链接
2.开发环境
3.PSP 表格
4.效能分析
5.设计与实现过程
6.代码说明
7.测试运行
8.项目小结
作业 GitHub 链接
杨春晓(ychunx)链接:https://github.com/ychunx/FourArithmeticGenerator
钟理恩(CharlesZhongLE)链接:https://github.com/CharlesZhongLE/FourArithmeticGenerator
exe 已经发布至仓库的 release 文件夹内
开发环境
- 编程语言:Java 16
- 编程工具:IDEA 2021.2
- 项目构建工具:maven
- 性能分析工具:JProfiler 12
- 单元测试框架:JUnit 4.12
效能分析
性能分析看来,生成四则运算方面耗能最多,其中用于约分的接口占比最大,充分说明对于本生成器而言,小学生需要在分数运算上多下功夫。
全部性能
类的占用情况
CPU view
设计与实现过程
通过题目生成类生成题目和答案,储存在数组中,由文本输出类输出。文本输入类读取作业和答案文件,通过批改作业类批改,生成成绩要求格式,输出文本文件。
主要的包
- appMain包:主程序 Main 包
- Util包:有三个主要类,如下述
主要的类
- GenerateUtil 类:生成题目的类
- FileIOUtil 类:文件输入输出类,包括作业的读入和成绩、练习的输出
- JudgeUtil 类:批改类,通过简单思路判断作业对错
代码说明
批改函数
由于要求作业文件和答案文件都是包含题目和答案的,所以只需要判断文本文件读出的字符串数组中,每个对应元素是否相等就可以完成该功能
public static void judge(String[] e,String[] a){
ArrayList rCount =new ArrayList();
ArrayList wCount =new ArrayList();
//int rCount[]=new int[e.length];
//int wCount[]=new int[a.length];
//int rightNum=0; //记录正确数目
//int wrongNum=0; //记录错误数目
//根据学生提交的作业(包含题目和答案)判断是否与原题目和答案相等做出简单判断
for(int i=0;i<e.length;i++){
if(e[i].equals(a[i])) {
rCount.add(i+1); //记录正确题号
//rightNum++;
}
else {
wCount.add(i+1); //记录错误题号
//wrongNum++;
}
}
String r = "";
String w = "";
//拼接题号字符串
for(int i=0;i<rCount.size();i++){
r = r.concat(rCount.get(i).toString() + ",");
}
for(int i=0;i<wCount.size();i++){
w = w.concat(wCount.get(i).toString() + ",");
}
String[] s = new String[2];
s[0] = "Correct:" + rCount.size() + "(" + r + ")";
s[1] = "Wrong:" + wCount.size() + "(" + w + ")";
//输出至文本文件
FileIOUtil.outPut(s,2);
}
文本输出函数
outPut 是简单的根据传入的参数判断需要输出的文件类型
out 是将字符串数组输出成文本文件
public static void outPut(String[] s,int i) {
if(i == 0){
String path = "Exercise.txt"; //题目
out(s,path);
}else if(i == 1){
String path = "Answers.txt"; //答案
out(s,path);
}else if(i == 2){
String path = "Grade.txt"; //成绩
out(s,path);
} else if(i == 3){
String path = "exerciseAns.txt"; //题目和答案
out(s,path);
}
}
public static void out(String[] s,String path){
File file = new File(path);
try {
FileWriter fw = new FileWriter(file, true);
for(int i=1;i<s.length+1;i++){
fw.write(i + "、" + s[i-1]+"\n");
}
fw.close();
} catch (IOException e) {
System.out.println("文件保存失败。");
}
}
真假分数转换
将假分数转换为带分数,直接输出真分数。对于分子大于分母的数字,利用整除与求余,求得带分数的整数与分数部分并输出,余数为0或分子小于分母的数则直接输出。
public static String divide(int a, int b){
if(a>=b){
int c,d;
c=a/b;
d=a%b;
if(d==0)return c+"";
else return c+"'"+d+"/"+b;
}
else return a+"/"+b;
}
约分
将分数进行约分。利用穷举法求出公因子,分子分母同时除以公因子约分。并用divide()将数字以真分数形式输出。
public static String reductionOfAFraction(int a, int b) {
int maxfactor = 1;
for (int i = a; i >= 1; i--) {
if (a % i == 0 && b % i == 0) {
maxfactor = i;
break;
}
}
int numerator = a / maxfactor;
int denominator = b / maxfactor;
if (numerator == 0) return "0";
if (denominator == 1) return numerator + "";
else return divide(numerator, denominator);
}
测试运行
运行结果
一、生成题目部分
首先命令行输入 Myapp.exe -n 10000 -r 100 可以得到三个文件,分别为题目、答案、题目和答案
能够生成10000个题目,该图是包含题目和答案的 exerciseAns.txt ,而题目和答案分别在 Exercise.txt 和 Answers.txt
二、批改部分
根据上面生成的题目和答案文件 exerciseAns.txt ,随机修改几题的答案作为学生提交的作业,测试时命名 exerciseAns1.txt(作业包含题目和答案,答案文件也包括题目和答案)
命令行输入 Myapp.exe -e C:\Users...\FourArithmeticGenerator\release\exerciseAns.txt -a C:\Users...\FourArithmeticGenerator\release\exerciseAns1.txt
生成 Grade.txt 成绩文件
单元测试
本次单元测试设置了10个测试用例,共分为6类
1、测试CreateExercise()生成四则运算,对生成数的范围和大小进行测试
2、测试JudgeUtil()校对答案,自定义字符串进行测试
3、测试divide()假分数转带分数、真分数显示,对不同大小分子分母进行测试
4、测试reductionOfAFraction()约分,对带0情况以及是否能继续约分进行测试
5、测试in()文件输入
6、测试out()文件输出
项目小结
成员1:杨春晓(ychunx)小结
本次作业还是有功能没有实现:查重、括号和多个运算符号,也只能基于字符串进行编写代码,确实是比较遗憾。但是学习了四则运算题的生成思路和熟悉的各类间的传参、各函数间的传参,同时学会了打包成 exe 的方法。最重要的是这次作业是初步尝试与他人合作完成,是不错的体验。
成员2:钟理恩(CharlesZhongLE)小结
本次作业主要负责四则运算的生成以及测试接口,对于各函数参数传递有了更深刻认识,也首次接触了jar包生成exe过程,学到了很多东西。
PSP 表格
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 20 | 25 |
Development | 开发 | 600 | 720 |
Analysis | 需求分析 (包括学习新技术) | 120 | 120 |
Design Spec | 生成设计文档 | 60 | 50 |
Design Review | 设计复审 | 30 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
Design | 具体设计 | 30 | 60 |
Coding | 具体编码 | 120 | 240 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 45 |
Reporting | 报告 | 60 | 80 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 45 |
合计 | 1310 | 1595 |