一:题目
1、题目内容:
利用Hash技术统计某个C源程序中的关键字出现的频度
2、基本要求:
扫描一个C源程序,用Hash表存储该程序中出现的关键字,并统计该程序中的关键字出现的频度。用线性探测法解决Hash冲突。设Hash函数为:
Hash(key)[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
二:总体设计(流程图)
三、详细设计
1、定义结构体
typedef struct mykey {
char data[M];//关键字
int con = 0;//冲突次数
int num = -1;//出现次数,-1表示没有
}mykey;
2、初始化
void init(); //初始化结构体数组
void create(); //建立关键词Hash表
void menu(); //显示操作菜单
//用户进入程序时自动初始化,更好的提供服务
3、读取文件(统计关键字)
void choose(int n); //选择读取的文件
void readFile(); //读取文件
void test(int n); //检测某文件
//用户能自己选择文件,选择完后进行统计,完成之后进行提示
4、打印hash表
void myprint(); //打印Hash表,输出到test.txt
打印完整hash表,存储到test.txt里面,保持数据有序,一目了然
5、查找关键字
void find();
//用户可以自行查找关键字,查看其频率和冲突次数
6、其他
bool isChar(char a);
//判断字符是否是字母
void isKey(char str[]);
//判断是否是关键字
四:全部代码(运行环境:vs2019或VC6.0、dev5.40)
vc6.0、dev5.40
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <fstream>
#define N 41
//37个关键字
char key[37][10] = {
"auto","break","bool","case","char","const","continue","default",
"do","double","else","enum","extern","float","false","for","goto","if","int","inline",
"long","register","return","restrict","short","signed","sizeof","static","struct",
"switch","typedef","true","union","unsigned","void","volatile","while" };
typedef struct mykey {
char data[10];
int con ;//冲突次数
int num ;//出现次数,-1表示没有
}mykey;
mykey my[N]; //hash表
int sum = 0, m,i; //总的关键字数,m用于选项
FILE* fi; //所要读取文件指针
FILE* fo; //所要写的文件指针
void init(); //初始化结构体数组
bool isChar(char a); //判断字符是否是字母
void isKey(char str[]); //判断是否是关键字
void myprint(); //打印Hash表,输出到test.txt
void test(int n); //检测某文件
void choose(int n); //选择读取的文件
void readFile(); //读取文件
void find(); //查找某个关键词
void menu(); //显示操作菜单
void create(); //建立关键词Hash表
int main()
{
create();
menu();
return 0;
}
void init() {
//指针为空,初始化数据
fi = NULL;
sum = 0;
for (int i = 0; i < N; i++) {
if (my[i].num != -1) {
//hash表中该位置是否有关键词
my[i].num = 0;
}
}
}
bool isChar(char a) {
if (a >= 'a' && a <= 'z' || a >= 'A' && a <= 'Z')
return true;
else
return false;
}
void isKey(char str[]) {
int n = strlen(str);
int y = (str[0] * 100 + str[n - 1]) % N;
int i = 0;
do {
i++;
if (strcmp(my[y].data, str) == 0) {
//与hash表中关键词比较是否相同
if(my[y].num==-1)
break;
sum++;//相同关键词总数加1
my[y].num++;//出现次数加1
break;
}
else {
y = (y + 1) % N;
}
} while (i <= N);
}
void find() {
char fin[10];
bool flag = false;
do {
printf("请正确输入要查找的关键词:\n");
scanf("%s", fin);
getchar();
for (int i = 0; i < N; i++) {
if (strcmp(key[i], fin) == 0) {
flag = true;
break;
}
}
} while (flag == false);
int n = strlen(fin);
int y = (fin[0] * 100 + fin[n - 1]) % N;
bool isfind = false;
int i = 0;
do {
i++;
if (strcmp(my[y].data, fin) == 0) {
isfind = true;
break;
}
else {
y = (y + 1) % N