软工作业二:个人项目

news/2025/3/11 5:20:46/文章来源:https://www.cnblogs.com/yx4810/p/18759236

| 这个作业属于哪个课程 | 软件工程 |

| 这个作业要求在哪里 | 作业要求 |

| 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |

一、使用说明📝

1.使用环境:c++;Visual studio 2022

2.使用方法:

1.本系统采用LCS比较来得出论文查重率,采用了相似度计算公式,并对特殊文档进行额外处理。
2.本系统查重时会对文档进行预处理,过滤无用字符,如标点符号、空格等。
3.本系统增加了保存、查看、清空历史记录的功能,命令行中输入-history可查看历史记录,输入-clear可清空历史记录,这两个命令请单独输入,否则无法执行!

3.参数格式

main.exe <原文路径> <抄袭版路径> <输出路径>  # 标准查重模式
main.exe -h                                  # 查看历史记录
main.exe -clear                              # 清空历史记录

4.示例代码

main.exe "input/orig.txt" "input/orig_0.8_dis_1.txt" "output/result.txt"# 查看最近5条记录
main.exe -history# 清空历史记录
main.exe -clear

二、程序流程图🧩

graph TDA[命令行参数解析] --> B{参数校验}B -->|成功| C[读取原文/抄袭版文件]B -->|失败| D[打印帮助信息]C --> E[文本预处理]E --> F[计算LCS长度]F --> G[计算相似度]G --> H[输出结果文件]H --> I[保存历史记录]I --> J[打印格式化表格]

三、核心算法实现🛠️

1.LCS动态规划

// 空间复杂度O(n)的滚动数组实现
int lcs(UnicodeChar *X, int m, UnicodeChar *Y, int n) {int *prev = (int *)calloc(n+1, sizeof(int));int *curr = (int *)calloc(n+1, sizeof(int));for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {curr[j] = (X[i-1] == Y[j-1]) ? prev[j-1] + 1 : max(prev[j], curr[j-1]);}swap(&prev, &curr); // 指针交换}return prev[n];
}

2.文章预处理,使得查重更为清晰

UnicodeChar* convert_to_unicode(const char* utf8_str, int* len) {int capacity = 256;*len = 0;UnicodeChar* array = (UnicodeChar*)malloc(capacity * sizeof(UnicodeChar));UnicodeChar *new_array = (UnicodeChar*)realloc(array, capacity * sizeof(UnicodeChar));
if (!new_array) {perror("内存扩容失败");free(array);exit(EXIT_FAILURE);
}
array = new_array;const char* p = utf8_str;while (*p) {unsigned char c = *p;int char_len = 0;UnicodeChar code_point = 0;// UTF-8解码逻辑if ((c & 0x80) == 0) {         // 1字节字符char_len = 1;code_point = c;}else if ((c & 0xE0) == 0xC0) { // 2字节字符char_len = 2;code_point = (c & 0x1F) << 6;code_point |= (p[1] & 0x3F);}else if ((c & 0xF0) == 0xE0) { // 3字节字符char_len = 3;code_point = (c & 0x0F) << 12;code_point |= (p[1] & 0x3F) << 6;code_point |= (p[2] & 0x3F);}else if ((c & 0xF8) == 0xF0) { // 4字节字符char_len = 4;code_point = (c & 0x07) << 18;code_point |= (p[1] & 0x3F) << 12;code_point |= (p[2] & 0x3F) << 6;code_point |= (p[3] & 0x3F);}else {p++; // 非法起始字节continue;}// 验证后续字节有效性int valid = 1;for (int i = 1; i < char_len; i++) {if ((p[i] & 0xC0) != 0x80) {valid = 0;break;}}if (valid) {// 保留汉字、字母、数字(过滤标点符号)if (isalnum(c) || (code_point >= 0x4E00 && code_point <= 0x9FFF)) {if (*len >= capacity) { // 动态扩容capacity *= 2;array = (UnicodeChar*)realloc(array, capacity * sizeof(UnicodeChar));}array[(*len)++] = code_point;}p += char_len;}else {p++; // 跳过无效字节}}printf("预处理后有效字符数:%d\n", *len);return array;
}

四、程序的特色🌈

1.处理能力得到优化

  • 支持较大文件的快速处理(<500ms)。
  • 采用滚动数组优化了空间复杂度。

2.友好的交互设计

  • 界面有专门提示
  • 实时显示查重流程
  • 错误输入可以及时反馈
  • 可以保留历史记录

五、程序调试结果🔧

1.性能分析:


2.用于调试的文档

点击查看测试文档

3.论文查重


4.保存历史记录

5.清空历史记录


六、PSP2.1 个人开发流程时间管理表☕

Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning(计划) 20 20
· Estimate(估计任务时间) 20 20
Development(开发) 300 340
· Analysis(需求分析,含学习新技术) 60 65
· Design Spec(生成设计文档) 20 20
· Design Review(设计复审) 10 15
· Coding Standard(制定代码规范) 20 20
· Design(具体设计) 40 60
· Coding(具体编码) 60 70
· Code Review(代码复审) 20 20
· Test(测试与修改) 70 70
Reporting(报告) 80 80
· Test Repor(测试报告) 40 40
· Size Measurement(计算工作量) 20 20
· Postmortem & Process Improvement Plan(总结与改进计划) 20 20
合计 400 440

七、程序改进规划🚀

  • 1.提升性能:做好性能瓶颈分析,以及可采用多线程方式是日后研究重点。
  • 2.改进用户体验:查重结果输出格式有待完善,多重功能还有待开发。

八、个人总结🌟

  • 1.本次程序开发是一个自己之前接触较少的算法,这是一次新的体验,自然会有新的收获。
  • 2.我在开发过程中,会仔细思考用户的需求以及如何改善用户的实际体验,这是一种职场觉悟。
  • 3.本次开发还有许多不足之处,比如说算法的代码有些冗杂,用户体验仍未达到最佳水平等,需要后期继续改进。

相关代码及文件已传输至github:我的github仓库 💡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[T.1] 团队项目:团队成员介绍

组一辈子杰队项目 内容这个作业属于哪个课程 2025年春季软件工程(罗杰、任健)这个作业的要求在哪里 [T.1] 团队项目:团队成员介绍我在这个课程的目标是 学习软件工程理论与实践,完成一款高质量的软件项目这个作业在哪个具体方面帮助我实现目标 确定分工,团队破冰,初步确定…

阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!

本文的 原始地址 ,传送门 本文的 原始地址 ,传送门 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:每天新增100w订单,如何的分库分表? 1…

递归?动态规划?几道题帮你理清楚基本思路!—— 一维动态规划解析

动态规划定义 动态规划(Dynamic Programming,简称 DP)是解决最优化问题的一种重要算法思想。它通过将原问题分解为多个子问题,逐步求解子问题,最终合并子问题的解来解决原问题。动态规划在解决具有重叠子问题和最优子结构性质的问题上非常高效,常用于路径规划、背包问题、…

ABAP-后台Job相关(转)

定义JOB 查看作业日志 查看JOB变式动态日期变式设置 如果有其他的动态参数设置,建议程序中调用JOBDATA:lv_job_name LIKE tbtco-jobname, "作业名lv_job_nr LIKE tbtco-jobcount, "作业号lv_job_released TYPE c,lv_job_start_so…

在Android Studio上完成一个简单的添加项目(累死了!)

所花时间:7h 代码量(行):430 博客量:5 了解的知识点: 真的累死娃了快 昨天需要完成从web端转向Andriod端的小项目,对于已经明白的来说这是挺容易的(我现在是这样觉得的), 但是昨天什么都不知道,从哪里开始都不了解,只能问AI,一开始是依托于IDEA上进行项目搭建和实…

逆向新手 WriteUp

WriteUp 题目信息 名称:逆向新手.exe 分类:Reverse 描述:找到程序的flag题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5解题思路 首先用DIE对文件查壳,发现是一个无壳的32位程序。于是直接用32位IDA对文件进行反汇编,得到如下伪代码:…

P3243 [HNOI2015] 菜肴制作(图论)

P3243 [HNOI2015] 菜肴制作 题目描述 知名美食家小 A 被邀请至 ATM 大酒店,为其品评菜肴。ATM 酒店为小 A 准备了 \(n\) 道菜肴,酒店按照为菜肴预估的质量从高到低给予 \(1\) 到 \(n\) 的顺序编号,预估质量最高的菜肴编号为 \(1\)。 由于菜肴之间口味搭配的问题,某些菜肴必…

第一章课后作业

r = float(input("请输入圆的半径:")) area = 3.1415r r print(area)str1 = input("请输入一个人的名字:") str2 = input("请输入一个国家的名字:") print("世界这么大,{}想去{}看看.".format(str1,str2))n = input("请输入整…

Landsat遥感影像分幅条带介绍与矢量下载:WRS的Path与Row

本文介绍Landsat系列卫星的分幅规则,并提供WRS的矢量文件下载~本文介绍Landsat系列卫星的分幅规则,并提供WRS的矢量文件下载。WRS,即Worldwide Reference System,是Landsat系列卫星全球影像标记符号系统,用以区分全球各区域对应的Landsat系列卫星影像编号;其用“Path”与…

Manus爆火,是硬核还是营销?

Manus是一款引发热议的通用Agent产品,凭借强大任务处理能力及营销手段备受关注,其爆火带动了开源复刻潮,并为垂直领域智能体开发提供灵感,如图数据库智能体Chat2Graph。相信这两天小伙伴们应该被Manus刷屏了,铺天盖地的体验解读文章接踵而来,比如「数字生命卡兹克」凌晨爆…

实验一C语言开发环境使用和数据类型、运算符、表达式

实验一 实验任务一 代码点击查看代码 #include<stdio.h> #include<stdlib.h> int main() {printf(" o o\n");printf("<H> <H>\n");printf("I I I I\n");printf(" o \n");printf("<H>\n"…