第一次个人编程作业
第一次个人编程作业
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229
这个作业的目标 <独立完成个人编程作业编码部分>
一、psp表格
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 25
· Estimate · 估计这个任务需要多少时间 15 30
Development 开发 630 870
· Analysis · 需求分析 (包括学习新技术) 180 240
· Design Spec · 生成设计文档 20 30
· Design Review · 设计复审 60 45
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 15 20
· Design · 具体设计 35 35
· Coding · 具体编码 400 360
· Code Review · 代码复审 40 55
· Test · 测试(自我测试,修改代码,提交修改) 80 100
Reporting 报告 140 120
· Test Repor · 测试报告 50 55
· Size Measurement · 计算工作量 30 55
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 60
· 合计 1745 2070
二、需求分析
题目:论文查重
描述如下:设计一种论文查重算法,输入为一个原文文件以及一个基于该原文进行增删改后的抄袭版论文文件,在输出文件中给出二者的重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求按照如下规范进行文件输入输出:
通过命令行参数提供论文原文文件的绝对路径。
通过命令行参数提供抄袭版论文文件的绝对路径。
通过命令行参数提供输出答案文件的绝对路径。
总结如下两点:对输入的原文文件与抄袭版文件开展重复率分析计算,借助命令行把重复率输出至答案文件,数字精确到小数点后两位。答案文件输出的答案为浮点型,精确到小数点后两位。
三、计算模块接口的设计与实现:
分为四个类:Main , MainTest , SimilarityMain ,SimilarityMainTest .
包含的方法:main(String[] args) 方法,testSimilarity() 方法,setUp() 方法,calculateVector(String str, int index) 方法,cosineSimilarity() 方法,similarity()方法,testMain 方法等
“类”相关的执行流程如下:
首先由用户运行Main类里的main方法。
在main方法中构建一个Scanner对象,目的是从控制台获取用户输入的文件路径。
用户要输入原始论文的文件路径、抄袭版论文的文件路径以及用于保存相似度结果的文件路径。
要是用户输入的文件路径为空,程序会输出对应的提示信息,然后结束运行。
反之,程序会创建一个DecimalFormat实例,接着使用输入的文件路径创建SimilarityMain实例。
调用SimilarityMain实例的similarity()方法来计算两篇论文的相似度。
将计算得出的相似度结果输出到控制台。
程序把相似度结果写入用户指定的输出文件,并在控制台展示操作结果。
若在写入文件时发生IOException异常,则捕获该异常并输出错误信息。
四、计算模块接口部分的性能改进和测试
改进计算模块思路:
在这个地方花费的时间较多,改进时我增加了异常处理机制,引入了语义信息。
性能分析图:

计算模块部分单元测试展示
部分单元测试代码:
@Test
public void testSimilarity() {
// 运行测试
final double result = similarityMainUnderTest.similarity();// 调用待测试对象的 similarity 方法得到相似度计算结果:
// 验证结果
double expected = 0.4364357804719848;// 预期的相似度计算结果
assertEquals(expected, result, 0.001);// 使用断言验证实际结果和预期结果是否一致,允许误差为0.001
// 打印实际结果和预期结果
System.out.println("实际结果:" + result);
System.out.println("预期结果:" + expected);
}
测试的函数: testSimilarity函数
构建测试数据的思路:
测试数据:在这个测试中,测试数据主要是一个已经初始化好的vectorMap对象,其中包含了字符及其对应的向量。

在这个测试里,最初我使用assertEquals(0.0, result, 0.0001)进行断言,结果引发了java.lang.AssertionError。于是,我对精度进行调整:增大最后一个参数(delta)的值,也就是扩大允许的误差范围,以此来容忍更大的差异。并且,我采用了更恰当的方法来比较浮点数,同时也修改了d1的值。
浙公网安备 33010602011771号