作业2
https://github.com/Mosya-CX/Mosya-CX/tree/master/3123004137
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 40 |
| · Estimate | · 估计这个任务需要多少时间 | 3 | 1 |
| Development | 开发 | 60 | 80 |
| · Analysis | · 需求分析 (包括学习新技术) | 5 | 5 |
| · Design Spec | · 生成设计文档 | 10 | 5 |
| · Design Review | · 设计复审 | 5 | 3 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 3 | 1 |
| · Design | · 具体设计 | 20 | 30 |
| · Coding | · 具体编码 | 20 | 15 |
| · Code Review | · 代码复审 | 5 | 5 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | 10 |
| Reporting | 报告 | 5 | 5 |
| · Test Repor | · 测试报告 | 5 | 5 |
| · Size Measurement | · 计算工作量 | 3 | 1 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 15 |
| · 合计 | 239 | 221 |
主要函数
read_file:- 功能:读取文件内容并返回字符串。
- 输入:文件路径。
- 输出:文件内容的字符串。
split_utf8:- 功能:将UTF-8编码的字符串分解为单个字符(支持多字节字符)。
- 输入:UTF-8字符串。
- 输出:分解后的字符列表(
vector<string>)。
get_codepoint:- 功能:获取UTF-8字符的Unicode码点。
- 输入:单个UTF-8字符。
- 输出:字符的Unicode码点(
uint32_t)。
filter_chinese:- 功能:过滤非汉字字符,仅保留汉字。
- 输入:字符列表(
vector<string>)。 - 输出:仅包含汉字的字符列表(
vector<string>)。
lcs:- 功能:计算两个字符列表的最长公共子序列(LCS)长度。
- 输入:两个字符列表(
vector<string>)。 - 输出:LCS的长度(
int)。
main:- 功能:程序入口,负责调用其他函数并完成查重逻辑。
- 输入:命令行参数(原文文件路径、抄袭版文件路径、输出文件路径)。
- 输出:将查重结果写入输出文件。
函数之间的关系
main函数:- 调用
read_file读取原文和抄袭版文件内容。 - 调用
split_utf8将文件内容分解为字符列表。 - 调用
filter_chinese过滤非汉字字符。 - 调用
lcs计算最长公共子序列长度。 - 计算重复率并将结果写入输出文件。
- 调用
split_utf8和get_codepoint:split_utf8依赖get_codepoint来判断字符的字节长度。filter_chinese依赖get_codepoint来判断字符是否为汉字。
lcs函数:- 是算法的核心,用于计算两个字符列表的相似度。
算法的关键点
- UTF-8 字符处理:
- UTF-8 是一种变长编码,字符可能占用 1 到 4 个字节。
split_utf8函数通过检查字符的首字节来确定字符的长度,并将字符串正确分解为字符列表。
- 汉字过滤:
- 汉字的 Unicode 范围是
0x4E00到0x9FFF。 filter_chinese函数通过get_codepoint获取字符的 Unicode 码点,并过滤掉非汉字字符。
- 汉字的 Unicode 范围是
- 最长公共子序列(LCS):
- LCS 是动态规划的经典问题,用于计算两个序列的最长公共部分。
- 在本代码中,LCS 用于计算原文和抄袭版之间的相似度。
- 使用滚动数组优化空间复杂度,将空间复杂度从 O(m*n) 降低到 O(n)。
- 重复率计算:
- 重复率公式:
相似度 = (2 * LCS长度) / (原文长度 + 抄袭版长度) * 100%。 - 该公式考虑了原文和抄袭版的长度,能够更公平地反映相似度。
- 重复率公式:
- 文件输入输出:
- 使用
ifstream和ofstream处理文件读写。 - 支持从命令行参数指定文件路径,灵活性高。
- 使用
改进:
1.正确处理中文字符,过滤非汉字内容,准确计算重复率。
2.支持文件错误处理,避免程序崩溃。
3.优化 LCS 算法的空间复杂度,减少内存占用。
4.通过命令行参数指定文件路径,适合实际应用场景。
5.模块化设计,代码逻辑清晰,易于扩展和维护。

测试原文:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig.txt
测试抄袭版1:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_add.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_add_result.txt
测试抄袭版2:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_del.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_del_result.txt
测试抄袭版3:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_1.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_1_result.txt
测试抄袭版4:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_10.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_10_result.txt
测试抄袭版5:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_15.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_15_result.txt
测试代码:.\论文查重算法\x64\Release\main.exe .\Mosya-CX\3123004137\orig.txt .\Mosya-CX\3123004137\orig_xxx.txt .\Mosya-CX\3123004137\orig_xxx_result.txt
输入错误样例:
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/join?id=CfDJ8KL9kPW-LSFBi_9YdTzcC08kUVVPB-v_5se4QgNYTtHhgXVD0f1B8EplikvHhDv2nB0o66FPxjpB8eiX04_5ZvXhhmTRGytCpJxbHm1_gajGsfksUhdc83GO6HHMehr1mS-UlM2RT-FImb_R80Y2oYI |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324 |
| 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |

浙公网安备 33010602011771号