- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程设计报告程序源代码的相似性.doc
程序源代码的相似性
一、课题内容和要求
对于两个C++语言的源程序代码,用哈希表的方法分别统计两个程序中使用C++语言 关键字的情况,并最终按定量的计算结果,得出两份程序的相似性。
基本要求:建立C++语言关键字的哈希表,统计在每个源程序中C++关键字出现的频 度,得到两个向量XI和X2,通过计算向量XI和X2的相对距离来判断两个源程序的相似 性。
例如:
while
do
break
class
关键字
Void
Int
For
Char
讦
else
程序1关键字频度
4
3
0
4
3
0
7
0
0
2
程序2关键字频度
4
2
0
5
4
0
5
2
0
1
Xl=[4, 3, 0, 4, 3, 0, 7, 0, 0,2]
X2二[4, 2, 0,5, 4, 0, 5,2,0, 1]
设s是向量XI和X2的相对距离,s=sqrt(》(冷1塚2)$ ),当XI二X2时,s二0,反映出 可能是同一个程序;s值越大,则两个程序的差别可能也越大。
测试数据:选择若干组编译和运行都无误的C++程序,程序之间有相近的和差别大的,用 上述方法求s,对比两个程序的相似性。
二、课题需求分析
需求分析
本程序用來通过建立哈希表求源程序关键字的出现的频度和源程序Z间的相似度以及 向量的几何距离。用户可以将源程序的.txt文件放入fgh文件夹中,运行程序就可以输出 每个源程序关键字的出现的频度和源程序之间的相似度以及向量的几何距离。
概要设计
为了实现上述功能,可以用结构体表示哈希表,因此需要哈希表的抽象数据类型。哈希表 抽彖数据类型的定义:
ADT hash table {
数据对象:D={ai |a i 丘 ElemType, .K各不相同,i二 1,2…,n,n 0 数据关系:r二e基本操作:
Hashfunc(char str[]);
Hashfind(char *words);
creathash(void);
resethash(int n);
isletter(char ch);
readc(char * filename);
getkey(char *str,int len);
copycount(int x[],int n);
check(int *xl, int *x2);
}end ADT
本程序实现模块主程序模块:
哈希表程序模块:实现哈希表的抽象数据类型
调用关系(如图一):
的儿何距离的模块
\ 7
图一
详细设计
(1)各个子函数的设计:
创建哈希表函数、重置哈希表函数、获取单词key的函数、判断是否为字母的函数、 将频度拷贝到数组里的函数、检查两个源程序是否相似的函数、取模函数、点积函数、求 相似度S的函数、求距离D的函数、
(2)主函数伪码:
int main()
char filename! []={ ntestl .txtH};
char filename2[]={ test 12.txt};
char filename3[]={ testl 3.txt};
int xl[hashlen],x2[hashlen],x3[hashlen]; // 存储频度的数组,用 丁?相似度 S 的计算 resethash(O); 〃完全重置哈希表,即哈希指针置为NULL,频度置为0
creathash(); //通过文件ckey.txt创建哈希表
readc(filename 1); //读取第一个测试源程序文件
copycount(x 1 ,hashlen); //讲统计好的频度复制给x数组
resethash(l); //仅仅将频度
count置为0
readc(filename2); // 同上
copycount(x2,hashlen);
resethash(l);
readc(filename3);
copycount(x3,hashlen);
cout?H\tn?n 哈希序号 ”vv” \tH?H 关键字 n?u \tH?H 频度 l”vv” \tH?H 频度
2”vv” \t,,?n 频度 3H?endl;
for (int i = 0; i 41; i++)
{
if(hasht[i].hashl!=NULL)
{
cout?H\tH?i?n \tH?hasht[i].hashl?M \tH?xl[i]?M
\t,,?x2[i]?n \tH?x3[i]?endl;
}
}
cout?filename 1 ?u 和vvfilename2v” 的相似情况为: H?endl;
check(xl,x2); //检查相似度
cout?filename 1?和 n?filename3?n 的相似情况为: ?endl; check(xl,x3); cout?filename2?和 H?filename3?
文档评论(0)