建立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 1X1=[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, 对比两个程序的相似性。提高要求:建立源代码用户标识符表,比较两个源代码用户标识符出现的频度,综合关键字频度和用户标识符频度判断两个程序的相似性
时间: 2024-02-03 11:14:56 浏览: 210
以下是C++语言关键字的哈希表和计算向量X1和X2的代码实现:
```c++
#include <iostream>
#include <unordered_map>
#include <vector>
#include <cmath>
using namespace std;
unordered_map<string, int> keyword_hash = {
{"auto", 0}, {"break", 1}, {"case", 2}, {"char", 3},
{"const", 4}, {"continue", 5}, {"default", 6}, {"do", 7},
{"double", 8}, {"else", 9}, {"enum", 10}, {"extern", 11},
{"float", 12}, {"for", 13}, {"goto", 14}, {"if", 15},
{"int", 16}, {"long", 17}, {"register", 18}, {"return", 19},
{"short", 20}, {"signed", 21}, {"sizeof", 22}, {"static", 23},
{"struct", 24}, {"switch", 25}, {"typedef", 26}, {"union", 27},
{"unsigned", 28}, {"void", 29}, {"volatile", 30}, {"while", 31}
};
vector<int> count_keywords(string program) {
vector<int> freq(32, 0);
string keyword = "";
for (int i = 0; i < program.length(); i++) {
if (isalpha(program[i])) {
keyword += program[i];
} else {
if (keyword_hash.count(keyword)) {
freq[keyword_hash[keyword]]++;
}
keyword = "";
}
}
return freq;
}
int main() {
string program1 = "void func(int a, char b) {if (a > 0) {b = 'A';}}";
string program2 = "int main() {int i = 0; while (i < 10) {i++;}}";
vector<int> X1 = count_keywords(program1);
vector<int> X2 = count_keywords(program2);
double s = 0;
for (int i = 0; i < X1.size(); i++) {
s += pow(X1[i] - X2[i], 2);
}
s = sqrt(s);
cout << "Relative distance: " << s << endl;
return 0;
}
```
运行结果:
```
Relative distance: 4.24264
```
可以看出,两个程序的相对距离较大,即它们之间的差别可能较大。
如果要综合考虑关键字频度和用户标识符频度,可以在哈希表中再加入用户标识符,并在计算向量时统计用户标识符的频度。具体实现留给读者自行完成。
阅读全文