第一次个人编程作业
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 写一个程序实现文本相似度检测功能,学习用github等工具管理代码,学习使用工具分析代码,测试程序 |
| GitHub地址 | https://github.com/daboluo233/README |
需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:【论文原文的文件的绝对路径 】 【抄袭版论文的文件的绝对路径】 【输出的答案文件的绝对路径】
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
计算模块接口的设计与实现过程
从命令行参数获取文件路径。
读取原文和抄袭版论文的内容。
将内容转换成统一的格式(例如小写、去除标点符号和空格等)。
遍历抄袭版论文中的每个字符序列,与原文进行匹配。
计算匹配的字符序列长度占抄袭版论文总长度的比例作为重复率。
将重复率写入答案文件。
normalize函数负责内容的规范化处理,而calculateOverlap则负责计算重复的字符,writeAnswer函数首先尝试打开答案文件以进行写入。如果文件打开失败,它会打印错误消息并退出程序。接下来,它使用snprintf函数将重复率格式化为一个包含两位小数的字符串。然后,它使用fprintf将这个字符串写入答案文件,并在末尾添加一个换行符。最后,它关闭答案文件。
计算模块接口部分的性能改进
在打开文件失败时,除了打印错误信息并退出程序外,还可以考虑返回一个错误码或设置错误标志,以便调用者能够更灵活地处理错误。
对于snprintf的使用,应该检查是否发生了缓冲区溢出。可以通过比较snprintf的返回值和缓冲区大小来确保没有溢出。
异常处理
if (originalFile == NULL) {
perror("Error opening original file");
return 1;
}
FILE* plagiarizedFile = fopen(plagiarizedPath, "r");
if (plagiarizedFile == NULL) {
perror("Error opening plagiarized file");
fclose(originalFile);
return 1;
}
当输入文件路径为空时,会输出无法打开文件,并返回。
单元测试

PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 120 |
| · Estimate | · 估计这个任务需要多少时间 | 180 | 220 |
| Development | 开发 | 300 | 400 |
| · Analysis | · 需求分析 (包括学习新技术) | 50 | 100 |
| · Design Spec | · 生成设计文档 | 10 | 15 |
| · Design Review | · 设计复审 | 15 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
| · Design | · 具体设计 | 30 | 60 |
| · Coding | · 具体编码 | 150 | 200 |
| · Code Review | · 代码复审 | 15 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 40 | 100 |
| Reporting | 报告 | 30 | 30 |
| · Test Repor | · 测试报告 | 10 | 15 |
| · Size Measurement | · 计算工作量 | 5 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| 合计 | 855 | 1345 |
浙公网安备 33010602011771号