第一次编程作业
| 这个作业属于哪个课程 | 19计科国际班的软工 |
| ----------------- |--------------- |
| 这个作业要求在哪里| 要求 |
| 这个作业的目标 | 论文查重 |
[作业GitHub]https://github.com/Gigianluciano/-/tree/main/3119009460
PSP表格
||||||||||||||
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 40 |
Estimate | 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 450 | 450 |
Analysis | 需求分析 (包括学习新技术) | 180 | 240 |
Design Spec | 生成设计文档 | 25 | 25 |
Design Review | 设计复审 | 30 | 35 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 20 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 300 | 360 |
Code Review | 代码复审 | 100 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 40 | 40 |
Reporting | 报告 | 30 | 25 |
Test Repor | 测试报告 | 40 | 30 |
Size Measurement | 计算工作量 | 15 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 45 | 55 |
合计 | 1350 | 1490 |
代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处
代码一共有3个函数,首先第一个函数是用来读取文档的内容的。它通过把绝对路径当成是输入值作为得到输出值为字符串形式的内容的手段。然后紧接着的函数就是比对各个词,第一个函数输出的字符串到了这里成为输入,在这里应用了编辑距离的原理,将一个字符串转为另一个字符串所需的字符编辑次数记录了下来。利用动态规划,设立二维数组来存储,通过每个字符的比较增加更改次数。第三个函数则是包含了输入文件绝对路径的提示,并且还包含了输出原来的输入值以及更改字符数。
改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2017/JProfiler的性能分析工具自动生成),并展示你程序中消耗最大的函数
使用cProfile分析Python代码,收集有关Python程序执行时间的统计信息。它可以报告从整个应用程序到单个语句或表达式的所有内容。
使用line_profiler,这个性能分析器和cProfile不同,他能帮你一行一行的分析性能。如果瓶颈问题在某一行中,这样就需要line_profiler解决了。
可见给c赋值的函数edit_dist(str1,str2)耗时比例最大
我将其中的选择结构的判断优化了一下,从
if i == 0:
dp[i][j] = j
elif j == 0:
dp[i][j] = i
改为了
if i == 0 and j != 0 :
dp[i][j] = j
elif i != 0 and j == 0:
dp[i][j] = i
line_profiler分析结果也从
变成了
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中
if __name__ == '__main__':
path1="C:/Users/86159/Desktop/测试文本2/orig.txt"
path2="C:/Users/86159/Desktop/测试文本2/orig_0.8_add.txt"
str1=get_file_contents(path1)
str2=get_file_contents(path2)
print("源文件路径是"+path1+",抄袭文件地址是,"+path2+".")
c=edit_dist(str1,str2)
doc=open('out.TXT',mode='a',encoding='UTF-8')
print("抄袭文件1与原文不同词的个数是",c)
print(c,file=doc)
print(c1,file=doc)
doc.close()
测试两个函数,分别是根据路径得到承载内容的字符串,以及抄袭文件转为原文件的编辑距离。 测试数据的长度相对较大,输出值相应的较大,设立一个文档用来储存不同比较组别的测试输出值。使用coverage工具得到的测试覆盖率截图:
在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
当输入的两个文件都是空的时候,测试main.py时得到的一个字符串转为另一个字符串所需的字符编辑次数记为-1
使用coverage工具得到的测试覆盖率截图:
在读取文件内容使都读不到两个文件的内容
当输入的两个文件中的某一个文件是空的时候,测试main.py时得到的一个字符串转为另一个字符串所需的字符编辑次数记为非空文件内容的长度
使用coverage工具得到的测试覆盖率截图:
到了textcheck()只能检查出一个文件有内容