当前位置:
文档之家› 利用哈希技术统计C源程序关键字出现的频度
利用哈希技术统计C源程序关键字出现的频度
} }
int Read(char *filename) //读取文件 {
char word[MAXLEN],ch; int i; FILE *read;
if( (read=fopen(filename,"r"))==NULL ) //只读方式打开一个文本文件,只允许读数据 {
cout<<"文件不存在,请确认好再输入!"<<endl; return -1;
}
while(!feof(read)) //feof()是文件结束检测函数,如果没有结束,返回值是 0,结束了是 1 {
i=0; ch=fgetc(read); //读取一个字符 while(isLetter(ch)==0 && feof(read)==0 ) ch=fgetc(read); //如果不是字母的话接着读取 while(isLetter(ch)==1 && feof(read)==0 ) {
东华理工大学 课程设计实验 报 告
姓名 : 学号:
班级:
实验题目:数据结构课程设计之利用哈希技术统计 C 源程序关键字出现的频度
实验时间: 12 月 31 日
实验地点:软件楼
一、实验目的
加深对数据结构的了解
二、实验内容
三、实验步骤 #include <iostream> #include <string> #include <iomanip> using namespace std;
if(strcmp(HS[key].keyword,keyword)==0)
{ //再判断哈希表中该位置的关键字是否相同 HS[key].count++; return 1;
} key=FindHX(keyword); //不相同,继续查找 if(key<0) {
key=GetFreePos(GetKey(keyword)); if(key<0) return -1; strcpy(HS[key].keyword,keyword); //将关键字插入哈希表 }
char filename[128],word[MAXLEN]; int i,key,count; switch(choice) {
case 1: cout<<"请输入要读取的文件名(文件必须在同一目录下):"; cin>>filename;
cout<<endl; Read(filename); Select(Input()); break;
int key,find,tem=0;
if(!isKeyWords(keyword)) return -1; key=GetKey(keyword);
if(strcmp(HS[key].keyword,keyword)==0) return key;
for(find=key+1;find<HASHLEN;find++)
if(i==MAXLEN) {
while(isLetter(ch)==1&& feof(read)==0) {
ch=fgetc(read); } i=0; break; }
else //超过关键字长度将跳过当前识别区域,读取后一单词 { //将连续读取的字母存在数组里,组成一个单词
word[i++]=ch; ch=fgetc(read); } } word[i]='\0'; //字符数组的结束标志 if(isKeyWords(word)) { CreatHX(word); } } fclose(read); cout<<"读取成功,文件中关键字已经存入 hash 表,请继续操作"<<endl; menu(); return 1; }
int GetKey(char *keyword); void menu(); void Select(int choice); int Input();
int Read(char *filename); void Show(int key); int isLetter(char ch); int FindHX(char *keyword); int CreatHX(char *keyword); int GetFreePos(int key); int isKeyWords(char *word);
cout<<endl; cout<<"请输入你的选择(1-4): "; while(true) //确保输入的为数字 {
int choice=0; if((cin>>choice)) {
if((choice<=0)||(choice>4)) cout<<"输入范围不正确,请重新输入"<<endl; } else {
if(key<0) return -1; HS[key].count++; } else //该位置为空,直接将关键字插入该位置中 { strcpy(HS[key].keyword,keyword); HS[key].count++;
} re//在哈希表中给关键字找个位置插进去 {
cout<<"输入错误,请重新输入"<<endl; cin.clear(); } while(!isspace(cin.get())) //判断字符是否为空白符 当字符为空白符时,返回非零值,否则返回零。 continue; cout<<endl; return choice; } }
void Select(int choice) {
int GetKey(char *keyword) //哈西函数 {
return ( keyword[0]*100+keyword[strlen(keyword)-1] ) % 41; //Hash 函数为:Hash(Key)=[(Key 的首字母序号)*100+(Key 的尾字母序号)] Mod 41 }
int CreatHX(char *keyword) //建立哈希表 {
int key; if(!isKeyWords(keyword)) return -1; key=GetKey(keyword); //计算哈希值
if(strlen(HS[key].keyword)>0) //判断关键字表中该位置是否存在关键字 { //已经存在有关键字
class HASH //哈希表类 { public:
char keyword[MAXLEN]; int count; //出现次数(频度) };
HASH HS[HASHLEN];
int main() {
cout<<endl; cout<<" --数据结构课程设计之利用哈希技术统计 C 源程序关键字出现的频度--"<<endl; menu(); Select(Input()); return(0); }
void Show(int key)//显示出某关键字的频度
{ if(key<0||key>=HASHLEN) { cout<<"关键字不存在!"<<endl; return; } if(HS[key].count>0) { cout<<"哈希表位置: "<<key<<" 关键字: " <<HS[key].keyword<<" 出现次数 "<<HS[key].count<<endl; cont++; }
case 2: for(i=0;i<HASHLEN;i++) { Show(i); } cout<<"关键字总数为:"<<cont<<endl; Select(Input()); break;
case 3: menu(); Select(Input());
case 4:
break;
default: Select(Input()); return;
int i; for(i=0;i<TOTAL;i++) if(strcmp(word,KeyWords[i])==0) return 1; return 0; } 四、实验结果
五、实验小结 加深了对数据结构的理解
const int TOTAL=39; //39 个关键字 const int MAXLEN=10; //关键字长度 const int HASHLEN=41; //哈希表长度
int cont=0; //统计哈希表中的关键字个数
char KeyWords[TOTAL][MAXLEN]= //构造二维数组存储 39 个关键字 {
void menu()//主菜单函数 {
cout<<endl; cout<<"\t1.读取一个文件"<<endl;
cout<<"\t2.输出 Hash 表(关键字总数,冲突次数)"<<endl; cout<<"\t3.回主菜单"<<endl; cout<<"\t4.退出"<<endl; }
int Input() {
for(find=0;find<key;find++) //再找前面的位置 {