资源描述:
《天津科技大学数据结构与算法课程设计报告--源程序的相似性》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、可编辑版数据结构与算法课程设计报告设计题目:源程序的相似性专业计算机科学与技术学号14101103姓名傅开煤2017年1月10日Word完美格式可编辑版源程序的相似性一、问题描述对于两个C++语言的源程序代码,用哈希表的方法分别统计两个程序中使用C++语言关键字的情况,并最终按定量的计算结果,得出两份程序的相似性。二、需求分析建立C++语言关键字的哈希表,统计在每个源程序中C++关键字出现的频度,得到两个向量X1和X2,通过计算向量X1和X2的相对距离来判断两个源程序的相似性。例如: 关键字 Void Int For Char if else w
2、hile do break class程序1关键字频度 4 3 0 4 3 0 7 0 0 2程序2关键字频度 4 2 0 5 4 0 5 2 0 1 X1=[4,3,0,4,3,0,7,0,0,2]X2=[4,2,0,5,4,0,5,2,0,1]设s是向量X1和X2的相对距离,s=sqrt(∑(x1[i]-x2[i])2),当X1=X2时,s=0,反映出可能是同一个程序;s值越大,则两个程序的差别可能也越大。三、概要设计为了实现上述功能,可以用结构体表示哈希表,因此需要哈希表的抽象数据类型。哈希表抽象数据
3、类型的定义:ADThashtable{数据对象:D={ai
4、ai∈ElemType,且各不相同,i=1,2...,n,n≥0}数据关系:R=φ基本操作:Hashfunc(charstr[]);Hashfind(char*words);creathash(void);resethash(intn);isletter(charch);readc(char*filename);getkey(char*str,intlen);copycount(intx[],intn);check(int*x1,int*x2);}endADTWord完美格式可编辑版本程序实现模块
5、主程序模块哈希表程序模块:实现哈希表的抽象数据类型调用关系图如下:主程序模块哈希表程序模块计算相似度和向量的几何距离的模块三、详细设计1、各个子函数的设计(1)创建哈希表函数函数原型:voidcreathash(void);输入:读取存储了32个关键字的文件keyword.txt思路:通过对keyword.txt文件逐行赋值给创建的str字符数组,并将该数组调入Hashfunc函数。(2)将关键字根据哈希函数放入哈希表中的指定位置的函数函数原型:voidHashfunc(charstr[]);思路:对调进来的str数组通过调用getkey函数得到该关键词的
6、key值后放入哈希表中的特定位置,并用线性探索来解决冲突。(3)在哈希表中找是否该words为关键字,并统计频度的函数函数原型:intHashfind(char*words);思路:将调进来的word字符数组先调用getkey函数获取key值,然后在哈希表里查找是否存在该字符串,如果存在则该关键字对应的频度加1。(4)重置哈希表函数函数原型:voidresethash(intn);功能:当n为0时,将指向哈希表中关键字的指针置成Null,同时将频度全部置为0.而当n为1时,仅仅将频度置为0。(5)获取单词key的函数函数原型:intgetkey(char*
7、str,intlen);思路:用key1存储关键字的首字母,key2存储关键字的末字母,然后通过哈希函数得到key的值并返回。(6)判断是否为字母的函数函数原型:intisletter(charch);Word完美格式可编辑版思路:如果调进来的ch字符的ASCII值在a~z或A~Z范围内的话则返回1,否则返回0。(7)读取源程序文件中的单词的函数函数原型:intreadc(char*filename);思路:为了读取源程序文件中的单词,所以一个字符一个字符的,如果读的超过最大关键字长度将会跳过当前识别区域,读取下一个单词,将得到的该单词调入Hashfind
8、函数,来判断是否为关键字,并统计频度。(8)将频度拷贝到数组里的函数函数原型:voidcopycount(intx[],intn);功能:将哈希表中关键字的频度复制到x数组中,以便进行后面相似度等的计算。(9)检查两个源程序是否相似的函数函数原型:voidcheck(int*x1,int*x2);思路:对调进来的x1和x2数组进行相似度计算,若相似度大于设定好的阈值,则再进行几何距离计算,最后给出两个文件是否相似的判断。(10)取模函数函数原型:floatMol(int*x);思路:通过求向量模值的数学知识求x数组的模。(11)点积函数函数原型:intDo
9、t(int*x1,int*x2)思路:通过点积的数学知识对两个向量