软件工程第二次作业——个人项目
| 这个作业所属课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业目标 | 设计一个论文查重的个人项目 |
1.GitHub链接
GitHub仓库地址:https://github.com/pascal5233/3123002353
realease:https://github.com/pascal5233/3123002353/releases/tag/f
2.PSP表格
| PSP2.1 | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|
| 计划 | 15 | 20 |
| 估计这个任务需要多少时间 | 20 | 20 |
| 开发 | 60 | 60 |
| 需求分析 (包括学习新技术) | 60 | 60 |
| 生成设计文档 | 20 | 30 |
| 设计复审 | 20 | 20 |
| 代码规范 (为目前的开发制定合适的规范) | 30 | 45 |
| 具体设计 | 30 | 20 |
| 具体编码 | 60 | 75 |
| 代码复审 | 30 | 30 |
| 测试(自我测试,修改代码,提交修改) | 30 | 30 |
| 报告 | 30 | 20 |
| 测试报告 | 20 | 20 |
| 计算工作量 | 5 | 5 |
| 事后总结, 并提出过程改进计划 | 15 | 15 |
| 合计 | 445 | 470 |
3.计算模块接口设计:
本项目中共有路径转换模块,文件读入模块,计算重复率模块,文件输出模块
- 路径转换模块:将文件绝对路径转换为字符串,通过转换UTF-8编码,实现对于中文路径的支持
- 文件读入模块:通过读取传参中的绝对路径,实现对于对应路径文件内容的读取,并将其存储到对应的字符串中
- 计算重复率模块:通过LCS算法计算处理完后的两个字符串,并的出最后的重复率
- 文件输出模块:通过文件操作将答案写入到答案文件当中
4.实现明细
程序优势:
- 通过使用宽字符串,实现多种语言混合处理,提高对于不同情况的兼容性
- 通过调用windows api接口来读入文件,简化读入过程,同时减少内存泄漏风险
- 将各模块独立封装处理,方便未来对于代码优化时,无需对于其他模块进行改动
- 考虑了各种异常情况,提高了程序可靠性,减少出错可能
LCS算法实现:
- 定义:dp[i][j]为s1的前i个字符和s2的前j个字符的最长公共子序列
- 转移方程:
- 若s1[i]==s2[j]:dp[i][j]=dp[i-1][j-1]+1
- 若s1[i]!=s2[j]:dp[i][j]=max(dp[i-1][j],dp[i][j-1])
- i的范围:0-s1.length()-1,j的范围:0-s2.length()-1
流程图

5.代码检查和性能优化
通过静态分析工具纠正语法错误,实现命名规范,减少冗余![1]()
性能改进
LCS算法时间复杂度为O(nm),空间复杂度为O(nm),通过滚动数组优化可以将时间复杂度优化为O(m)
优化前:

优化后

6.单元测试
群内样例测试结果:

异常处理说明:
对于命令行参数错误会输出error,同时输出正确格式:
if (argc != 4) {//检查命令行是否符合要求
std::wcout << "error,"<<L"格式应为:论文原文的文件的绝对路径 抄袭版论文的文件的绝对路径 输出的答案文件的绝对路径" << std::endl;
return -1;
}
命令行参数错误测试结果:


浙公网安备 33010602011771号