程序的源代码的相似性判别.docx

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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 ; cinoperation; 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(); coutbreak char class do else for if int void whileendl; hash1.Display(); //输出第一个哈希表中关键字的个数 hash2.Display(); //输出第二个 cout相似度为: possibality(hash1,hash2)endl; cino

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档