- 1、本文档共36页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
-
程序源代码的相似性
一、课题内容和要求
对于两个C++语言的源程序代码,用哈希表的方法分别统计两个程序中使用C++语言关键字的情况,并最终按定量的计算结果,得出两份程序的相似性。 ? 基本要求:建立C++语言关键字的哈希表,统计在每个源程序中C++关键字出现的频度, 得到两个向量X1和X2,通过计算向量X1和X2的相对距离来判断两个源程序的相似性。
例如: ? ? 关键字 Void Int For Char if else while 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( ∑(xi1-xi2) 2 ),当X1=X2时,s=0, 反映出可能是同一个程序;s值越大,则两个程序的差别可能也越大。
测试数据: 选择若干组编译和运行都无误的C++程序,程序之间有相近的和差别大的,用上述方法求s, 对比两个程序的相似性。
二、课题需求分析
1.需求分析
软件的基本功能、输入/输出形式、测试数据要求。
该软件能够比较两个源程序代码的相似度。需要用户输入两个源代码的文件名,系统会自动计算出两个程序中关键字的个数,并进行对比,而且计算出两个程序的相似度并输出,用户可以根据,系统输出相似度的大小,来估计两个程序相似的概率。 ?
2.概要设计
抽象数据类型、主程序流程及模块调用关系。
该程序用到的数据结构主要是哈希表,其次是顺序表:哈希表的功能是统计文件里出现的关键字的个数,通过++模式,该程序主要统计了C++的十个常用关键字break,char,class,do,else,for,if,int,void,while出现的频度,在Hash类里定义了一个哈希表,哈希表的大小为十个整形数据,哈希表里的十个数据是与已知的十个关键字一一对应的,顺序表用于存放处理后的数据。
主程序流程:图2.1
图2.1 主程序流程
3.详细设计
实现概要设计的数据类型、主程序以及其它模块的算法描述。
数据类型有哈希表,顺序表。
ADT 类 class Hash如图2.2:
图2.2 ADT类class Hash
这个程序主要包括三个函数
(1)主函数 int main() 负责调用其他的函数
(2)文件处理函数 count fileProcessed(char sourceData[],count)对文件进行处理
(3)相似度计算函数double possibality(Hash hash1,Hash hash2)根据已有的公式计算相似度。
三、课题相关数据结构及算法设计
1 主要数据结构
主程序为:
int main()
{
char operation;
cout<<" 其他键开始比较 E 程序结束:"<<endl<<" ";
cin>>operation;
while(operation != 'E')
{
int count1 = 1; //1,2用于判断第一个文件或者第二个文件
int count2 = 2;//定义两个字符数组,用于存放经过处理后的文件的字符///////
char sourceData1[M];///////第一个字符数组///////////////
char sourceData2[M];///////第二个字符数组///////////////
count1 = fileProcessed(sourceData1,count1); //数组赋值并返回字符个数
count2 = fileProcessed(sourceData2,count2);
Hash hash1(sourceData1,count1); //定义第一个哈希表
Hash hash2(sourceData2,count2); //定义第二个
hash1.calcuNum(); //计算1中每个关键字的频度
hash2.calcuNum();
cout<<"break char class do else for if int void while"<<endl;
hash1.Display(); //输出第一个哈希表中关键字的个数
hash2.Display(); //输出第二个
cout<<"相似度为: "<<possibal
文档评论(0)