软件工程第二次作业——个人项目

这个作业所属课程 软件工程
这个作业要求在哪里 作业要求
这个作业目标 设计一个论文查重的个人项目

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

流程图

2

5.代码检查和性能优化

通过静态分析工具纠正语法错误,实现命名规范,减少冗余1

性能改进

LCS算法时间复杂度为O(nm),空间复杂度为O(nm),通过滚动数组优化可以将时间复杂度优化为O(m)

优化前:
3
优化后
4

6.单元测试

群内样例测试结果:
5

异常处理说明:

对于命令行参数错误会输出error,同时输出正确格式:

 if (argc != 4) {//检查命令行是否符合要求
        std::wcout << "error,"<<L"格式应为:论文原文的文件的绝对路径 抄袭版论文的文件的绝对路径 输出的答案文件的绝对路径" << std::endl;
        return -1;
    }

命令行参数错误测试结果:
image

posted @ 2025-09-23 20:18  pascal5233  阅读(19)  评论(0)    收藏  举报