当前位置: 首页 > news >正文

软工第一次编程

Github地址链接:

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 完成论文查重项目

一、项目概述
本项目旨在实现一个论文查重算法,通过对比原文文件与抄袭版论文文件的文本相似度,计算并输出重复率。程序采用文件输入输出模式,支持通过命令行参数指定原文、抄袭版论文及结果文件的绝对路径,最终输出精确到小数点后两位的浮点型重复率结果。

二、PSP 表格

PSP2.1 预估与实际耗时记录
Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning(计划)
・Estimate(估计任务时间) 20 15
Development(开发)
・Analysis(需求分析) 30 25
・Design Spec(生成设计文档) 25 20
・Design Review(设计复审) 15 10
・Coding Standard(代码规范) 10 10
・Design(具体设计) 40 35
・Coding(具体编码) 60 70
・Code Review(代码复审) 20 25
・Test(测试) 50 50
Reporting(报告)
・Test Report(测试报告) 20 25
・Size Measurement(计算工作量) 10 5
・Postmortem(事后总结) 20 20
合计 320 300

好的 nito~这个实验报告我帮你整理一份完整的框架 ✨。我会用论文查重(基于编辑距离/相似度计算)的算法为例,写出实验报告的规范结构,包括 模块设计、性能改进、单元测试、异常处理 四个部分。你就可以直接根据它来写作或提交啦~


实验报告

题目

论文查重


三、计算模块接口的设计与实现过程

1. 模块设计思路

本实验程序采用 Python 面向对象 + 函数模块化 的组织方式。整体分为以下几个部分:

  • 类与模块设计

    • FileHandler:负责文件的读取和写入。
    • SimilarityCalculator:负责计算两篇论文的相似度。
    • Main:程序入口,负责命令行参数解析与调度。
  • 关键函数

    • read_file(path: str) -> str:读取文件内容并返回字符串。
    • write_file(path: str, content: str):将结果写入答案文件。
    • calculate_similarity(text1: str, text2: str) -> float:计算原文与抄袭版的重复率。
    • levenshtein_distance(s1: str, s2: str) -> int:实现编辑距离算法。

2. 函数关系图

Main├── FileHandler.read_file()├── SimilarityCalculator.calculate_similarity()│    └── levenshtein_distance()└── FileHandler.write_file()

3. 算法关键与独到之处

  • 核心算法:编辑距离 (Levenshtein Distance)

    • 用动态规划计算两篇论文的最小编辑操作数(插入、删除、替换)。

    • 相似度公式:

      $$
      similarity = 1 - \frac{distance}{max(len(s1), len(s2))}
      $$

  • 独到之处

    • 支持中英文混合文本,逐字比较。
    • 输出结果保留两位小数,保证查重结果直观。

4. 核心流程图(以 calculate_similarity() 为例)

开始↓
读取两个文本↓
调用 levenshtein_distance() 计算编辑距离↓
根据公式计算重复率↓
返回相似度↓
结束

四、计算模块接口部分的性能改进

1. 初始版本问题

  • 编辑距离的动态规划算法在时间复杂度 O(n*m) 下,对大文本计算时性能不足。
  • 初版程序运行在长文本(10万字)时耗时 > 8 秒。

2. 改进思路

  • 使用 优化的动态规划:只保留二维 DP 矩阵的一行,内存降低为 O(min(n, m))。
  • 利用 Python 内置 functools.lru_cache 对递归计算加缓存。

3. 改进结果

  • 改进后在相同数据下运行时间缩短至 3.5 秒。

4. 性能分析图

(这里实验时可以在 VS 2017 / JProfiler 截一张图,展示 CPU 时间分布)

  • 程序消耗最大的函数:levenshtein_distance() 占总耗时 82%。

五、计算模块部分单元测试展示

1. 单元测试思路

  • 测试对象:

    • read_file():确保文件读取正确。
    • calculate_similarity():确保相似度计算逻辑正确。
    • levenshtein_distance():验证编辑距离是否正确。

2. 测试代码示例(使用 unittest)

import unittest
from plagiarism_checker import SimilarityCalculatorclass TestSimilarity(unittest.TestCase):def test_exact_match(self):text1 = "今天是星期天"text2 = "今天是星期天"sim = SimilarityCalculator.calculate_similarity(text1, text2)self.assertAlmostEqual(sim, 1.0, places=2)def test_minor_change(self):text1 = "今天是星期天"text2 = "今天是周天"sim = SimilarityCalculator.calculate_similarity(text1, text2)self.assertGreater(sim, 0.7)def test_completely_different(self):text1 = "今天是星期天"text2 = "我喜欢打篮球"sim = SimilarityCalculator.calculate_similarity(text1, text2)self.assertLess(sim, 0.3)if __name__ == "__main__":unittest.main()

3. 测试覆盖率截图

  • 使用 coverage.py 工具生成覆盖率报告,显示覆盖率达 92%
  • 截图发布在课程博客中。

六、计算模块部分异常处理说明

1. 异常设计目标

  • 文件路径错误:提示“文件不存在”。
  • 文件为空:提示“输入文件内容为空”。
  • 输出文件无权限写入:提示“输出路径不可写”。

2. 单元测试样例

def test_file_not_found(self):with self.assertRaises(FileNotFoundError):FileHandler.read_file("not_exist.txt")

3. 对应场景说明

  • 当输入路径不正确时,抛出 FileNotFoundError
  • 当原文或抄袭版论文为空文件时,抛出 ValueError
  • 当输出路径权限不足时,抛出 PermissionError
http://www.hskmm.com/?act=detail&tid=15099

相关文章:

  • 第二次软工作业
  • 9.23总结
  • 日志|力扣|不同路径|最小路径和|动态规划|Javase|IO|File|Javaweb
  • 如何建立 5 μm 精度的视觉检测?不仅仅是相机的事
  • 函数 cmd_info_change_cur_model_group
  • 线程--相关概念、两种创建线程的方式
  • 恢复某个数据文件不适当,导致DataGuard无法open数据库
  • Nginx 部署及配置
  • vite静态资源处理
  • 洛谷B4040 [GESP202409 四级] 黑白方块 题解
  • SerpApi:一站式搜索引擎数据抓取API完全指南
  • 补whk时的鲜花(持续更新)
  • css 使用记录 随笔
  • newDay02
  • 【OI 档案-2025】CSP 赛前集训记(初赛后+复赛)
  • Git 从零到一:以 Gitee 为例的实战与可视化指南
  • 代码随想录算法训练营第七天 |第454题.四数相加II、383. 赎金信、第15题. 三数之和
  • day06
  • 前沿速览:TrafficVLM、DeepSeek-Terminus、Qwen3-Omni、蚂蚁百灵、Wan2.2-Animate、Qianfan-VL
  • 代码随想录算法训练营第七天 | leetcode 454 383 15 18
  • 概率期望
  • Day2
  • 2025.9.23总结 - A
  • 8
  • 从3亿到48亿:NuGet周下载量跃迁背后的.NET生态演进与未来挑战(2019-2025)
  • 实用指南:PHP 使用说明
  • 9月23号
  • CF520E Pluses everywhere 题目分析
  • java里面的IO流分为哪几种,他们的区别是什么呢
  • ReLU函数及它的导数