第一次个人编程作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
| 这个作业的目标 | 运用PSP,github等工具完成论文查重项目 |
- 一.Github链接
- 二.PSP表
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| · Planning | · 计划 | 60 | 30 |
| · Estimate | · 估计这个任务需要多少时间 | 600 | 540 |
| · Development | · 开发 | 240 | 240 |
| · Analysis | · 需求分析 (包括学习新技术) | 240 | 120 |
| · Design Spec | · 生成设计文档 | 30 | 0 |
| · Design Review | · 设计复审 | 60 | 0 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
| · Design | · 具体设计 | 60 | 120 |
| · Coding | · 具体编码 | 300 | 180 |
| · Code Review | · 代码复审 | 60 | 30 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 120 | 120 |
| · Reporting | · 报告 | 30 | 60 |
| · Test Repor | · 测试报告 | 30 | 30 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| · 合计 | 1920 | 1570 | |
- 三.模块接口的设计与实现过程
设计
![]()
模块
![]()
类及其作用
Main:程序的入口,计算输入的原文文档与抄袭文档的相似度并输出至答案文档中
String filePathOrig = args[0];//原文文档路径为第一个参数
String filePathCopy = args[1];//抄袭文档路径为第二个参数
String filePathResult = args[2];//生成结果文档路径为第三个参数
String content1 = new FileEditor().readFile(filePathOrig);//获取原文文档内容
String content2 = new FileEditor().readFile(filePathCopy);//获取抄袭文档内容
float repetition = new Calculator().calculateSimilarity(content1,content2);//计算相似度
new FileEditor().writeFile(filePathResult,"文本相似度为:" +String.format("%.2f", repetition)+"%");//将结果写入答案文档
FileEditor:文件的写入与读取,readFile()方法读取文档内容转化为字符串并返回,writeFile()方法将指定内容写入指定文档中
Calculator:计算文本相似度,计算两个输入字符串的编辑距离获取对应的相似度
核心算法
public float calculateSimilarity(String origtext,String copytext) {
//编辑距离计算文本相似度
float similarity = 0;
int d[][]; // 矩阵
int n = origtext.length();
int m = copytext.length();
int i; // 遍历origtext
int j; // 遍历copytext
char ch1; // origtext的
char ch2; // copytext的
int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
if (n == 0 || m == 0) {
return 0;
}
d = new int[n + 1][m + 1];
for (i = 0; i <= n; i++) { // 初始化第一列
d[i][0] = i;
}
for (j = 0; j <= m; j++) { // 初始化第一行
d[0][j] = j;
}
for (i = 1; i <= n; i++) { // 遍历origtext
ch1 = origtext.charAt(i - 1);
// 去匹配copytext
for (j = 1; j <= m; j++) {
ch2 = copytext.charAt(j - 1);
if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) {
temp = 0;
} else {
temp = 1;
}
// 左边+1,上边+1, 左上角+temp取最小
d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + temp);
}
}
similarity = (1 - (float) d[n][m] / Math.max(origtext.length(), copytext.length())) * 100F;//将编辑距离转换为相似度
FileEditorTest:FileEditor的测试类,包含文档读取与文档写入的测试
CalculatorTest:Calculator的测试类,包含相同文本测试,空文本测试,类似文本测试
-
四.模块接口部分的性能改进
![]()
![]()
-
五.模块部分单元测试展示
FileEditorTest
![]()
CalculatorTest
![]()
-
六.模块部分异常处理说明
命令行参数异常处理
if(args.length!=3){
System.out.println("参数输入有误!");//参数数量错误提示
return;
}
文件读取异常处理
try {
FileReader fr = new FileReader(filePath);
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
content = content + br.readLine() + "\n";
}
}
catch(IOException e){
System.out.println("读取文件失败!");
}
文件写入异常处理
try {
FileWriter writer = new FileWriter(filePath);
writer.write(text);
writer.close();
}
catch(IOException e){
System.out.println("写入文件失败!");
}







浙公网安备 33010602011771号