这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
这个作业的目标 | 学会使用github管理代码,学会自己设计算法、编写代码、制作PSP表格 |
一、作业github链接:https://github.com/nokcool/nokcool/tree/main/3122004393
二、PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 2 |
· Estimate | · 估计这个任务需要多少时间 | 342 | 422 |
Development | 开发 | 20 | 40 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 150 |
· Design Spec | · 生成设计文档 | 2 | 3 |
· Design Review | · 设计复审 | 10 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 1 |
· Design | · 具体设计 | 20 | 30 |
· Coding | · 具体编码 | 60 | 45 |
· Code Review | · 代码复审 | 10 | 7 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 45 |
Reporting | 报告 | 30 | 40 |
· Test Repor | · 测试报告 | 20 | 25 |
· Size Measurement | · 计算工作量 | 5 | 7 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 12 |
· 合计 | 342 | 422 |
三、模块接口的设计与实现过程:
1、代码的组织:
该论文查重算法一共包括一个类、一个主函数、四个方法。四个方法处于平行对等关系,均由主函数单独调用。
2、程序执行流程:
(1)主函数调用getString方法,将文件中的数据写入字符串;
(2)主函数调用getCount方法,计算论文中重复的字数;
(3)主函数调用getInts方法,计算重复率并存入数组中;
(4)主函数调用writeResult方法,将程序执行结果写入文件中。
2、算法的关键:
(1)分别将原版论文和抄袭版论文写入字符串;
(2)将抄袭版论文字符串的每一个字符与原版论文字符串对应的下标的前后二十个字符进行比较,若找到相同字符则count+1,最后用count除以抄袭版论文字符串长度得出重复率。
(3)该算法的独到之处是用count除以论文总字数时,先将count乘以10000再除以总字数,随后将结果拆分成个位十位和小数位存入数组中,再将数组按一定的下标顺序写入文件,从而得到保留两位小数的结果。
四、计算模块接口部分的性能改进:
1、改进计算模块性能上所花费的时间:15分钟;
2、改进思路:
(1)将抄袭版文件前后对比的字数设置为全局变量,方便根据论文的不同来改进算法。
(2)由于论文字数可能较多,于是将计算重复数字的变量count的类型由int改为long。
(3)JProfiler性能分析图:
(4)程序中消耗最大的函数:getString函数
getString函数代码如下:
public static String getString(String w1) throws IOException {
FileReader fr = new FileReader(w1);
int ch;
String word1 = new String();
while ((ch = fr.read()) != -1)
word1 += (char) ch;
fr.close();
return word1;
}
五、计算模块部分单元测试展示:
1、测试的函数:main函数
2、测试的思路:
(1)创建多组原版论文、抄袭版论文和输出文件的txt文件。原版论文和抄袭版论文一共十组,包括内容毫不相干的几组以及内容有一定关联的几组和没有内容的几组。
(2)将主函数执行流程套入循环中,重复输入多组文件路径进行测试。
(3)单元测试代码:
public static void main(String[] args) throws IOException {
for(int k=0;k<10;k++){
Scanner sc=new Scanner(System.in);
System.out.println("请输入原版论文的绝对路径:");
String w1=sc.nextLine();
System.out.println("请输入抄袭版论文的绝对路径:");
String w2=sc.nextLine();
System.out.println("请输入输出答案文件的绝对路径:");
String out=sc.nextLine();
String word1 = getString(w1);//将原版论文写入字符串
String word2 = getString(w2);//将抄袭版论文写入字符串
long count = getCount(word2, word1);//计算重复字数
long result=0;
if(word2.length()!=0)
`result=count*100000/word2.length();
long[] arr = getInts(result);//计算重复率,将结果存入数组
writeResult(arr, out);//将结果写入文件中
}
}
(4)测试覆盖率截图:
六、计算模块部分异常处理说明:
异常1:文件的绝对路径输入错误时,程序会自动报错。
对应场景:用户输入文件的路径错误时系统会提示。
解决办法:重新运行程序并输入正确的路径。
异常2:用户提交的原版论文或抄袭版论文是空白时输出的重复率为0。
对应场景:两篇论文至少有一篇是空白论文时输出正确的重复率。