用哈希表判别两个源程序的相似性 (2)

上传人:M****1 文档编号:498716078 上传时间:2023-06-23 格式:DOCX 页数:5 大小:10.55KB
返回 下载 相关 举报
用哈希表判别两个源程序的相似性 (2)_第1页
第1页 / 共5页
用哈希表判别两个源程序的相似性 (2)_第2页
第2页 / 共5页
用哈希表判别两个源程序的相似性 (2)_第3页
第3页 / 共5页
用哈希表判别两个源程序的相似性 (2)_第4页
第4页 / 共5页
用哈希表判别两个源程序的相似性 (2)_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《用哈希表判别两个源程序的相似性 (2)》由会员分享,可在线阅读,更多相关《用哈希表判别两个源程序的相似性 (2)(5页珍藏版)》请在金锄头文库上搜索。

1、细心整理用哈希表判别两个源程序的相像性以下是应用源程序代码:将以下程序下载后,用C+6.0翻开,同时在根书目下新建三个文本文档.txt格式。命名分别为keyword,program1,program2;即可运行出结果。 #include#include#include#includetypedef struct nodechar c10; int len; /记录关键字的长度 struct node *q; keynode; /关键字结点,认为关键字的长度不超过10个字符 typedef struct tablechar w; keynode *p;hash; /定义哈希表类型 void in

2、it_value(hash key,char stack ,int information1, int information2 ) /初始化函数 int i; for(i=0;i100;i+) keyi.p=NULL; for(i=0;i10;i+) stacki=0; for(i=0;i20;i+) information1i=0; information2i=0; void create_hash(hash key) /创立哈希表函数 int i,num=0,k; /num表示关键字的数量,k表示单个关键字的长度 char ch; FILE *fp; keynode *p1; /p1为指

3、向关键字结点类型的指针 hash p2; /p2为指向hash类型的指针 for(i=0;i26;i+) keyi.w=a+i; /哈希表每个结点的字符域存储26个字母 if (fp=fopen(keyword.txt,r)=NULL) /翻开写有关键字的文件,文件存储在C盘上 printf(没有翻开文件n); exit(0); while(num100) /假设关键字的个数少于100 k=0; while(k10) /假设关键字的长度少于10 ch=fgetc(fp); /从文件中读一个字符,遇空格那么退出 if(ch=32) break; if(k=0) p1=(keynode*)mall

4、oc(sizeof(struct node); /假设不是空格,且是关键字的第一个字母, 那么开拓关键字结点空间 (*p1).ck=ch; k+; i=0; while(iq=NULL; p1-len=k; num+; if(feof(fp) /假如该文件已读完,那么关闭文件 fclose(fp); break; void get_compare1(char stack,hash key,int information1) /从给出的一个源程序中读关键字,将该关键字存入字符数组 FILE *fp; char ch; int i,j; keynode *q1; fp=fopen(program1

5、.txt,r); /翻开存储在C盘的源程序 do i=0; while(i10) /读取时认为关键字的长度小于10 ch=fgetc(fp); /从文件中读取时一个字符一个字符来读,遇到空格那么退出 if(ch=32) break; stacki=ch; i+; /读取下一个字符 i=0; while(ic)!=0) /假设待比拟的关键字与当前指向的关键字不同,那么指向下一个关键字 q1=q1-q; else /假设待比拟的关键字与当前指向的关键字一样,那么对应位置的频数加1 j=(*q1).len; information1j+; break; break; while(ch!=EOF);

6、/假设该源程序已读完,那么关闭文件 fclose(fp); void get_compare2(char stack,hash key,int information2) /从给出的另一个源程序中读关键字,将该关键字存入字符数组FILE *fp; char ch; int i,j; keynode *q1; fp=fopen(program2.txt,r); do i=0; while(i10) ch=fgetc(fp); if(ch=32) break; stacki=ch; i+; i=0; while(iq) if(strcmp(stack,q1-c)!=0) q1=q1-q; else

7、 /假设待比拟的关键字与当期指向的关键字一样,那么对应位置的频数加1 j=(*q1).len; information2j+; break; break; while(ch!=EOF); fclose(fp);float similarity(int information1,int information2) /利用广义余弦法计算这两个程序的相像度 int k=0,m=0,n=0,p=0,q=0; float r,l,i; while (k100) n+=information1k*information2m; p+=information1k*information1k; q+=infor

8、mation2m*information2m; k+; m+; r= sqrt (p); l= sqrt (q); i= n/(l*r); return(i); / i即为两源程序的相像度 int main(void) float i; hash key100; /建立一个hash构造的数组空间,该数组中存放26个字母 char stack10; /建立一个字符数组空间,其中存放待比拟源程序的关键字 int information120,information220; printf(姓名:* t学号:*nn试验二:两个源程序的相像性判别nn); printf(*nn); init_value(

9、key,stack,information1,information2); /初始化数组 printf(创立哈希表:n); /create_hash(key); /创立哈希表 printf(比拟哈希表1n); get_compare1(stack,key,information1); /比拟第一个源程序 printf(比拟哈希表2n); get_compare2(stack,key,information2); /比拟其次个源程序 printf(计算相像度n); i=similarity(information1,information2); /计算相像度 printf(n两个程序的相像度为: %fnn,i); printf(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号