📄 a.c
字号:
/*
扫描一个C源程序,用Hash表存储该程序中出现的关键字,并统计该程序中的关键字出现频度.
用线性探测法解决Hash冲突.
Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 70
typedef struct {
char ch[10]; //关键字
int num; //该关键字出现次数
}HSTable;
HSTable HT[MAXSIZE];
H(HSTable k) //求地址
{
int i=strlen(k.ch);
return((k.ch[0]*100+k.ch[i-1])%41);
}
SearchHash(HSTable HT[MAXSIZE],HSTable k,int &p,int &flag) //查找关键字k,p返回该关键字位置,flag为1,则找到
{
p=H(k);
int tag=strcmp(HT[p].ch,k.ch);
while( strcmp(HT[p].ch,k.ch) && (HT[p].ch[0]!='$') )
p++;
if(!strcmp(HT[p].ch,k.ch)) flag=1;
else flag=0;
}
InsertHash(HSTable HT[MAXSIZE],HSTable s) //插入
{
int d,t;
SearchHash(HT,s,d,t);
if(t) return 0;
else
{
d=H(s);
while(HT[d].ch[0]!='$') d++;
HT[d]=s;
HT[d].num=0;
return 1;
}
}
void main()
{
//从文件中读取关键字,计算得出HASH表
char c;
int i;
HSTable st;
for(i=0;i<MAXSIZE;i++) //HASH表初始化
{
HT[i].ch[0]='$';
HT[i].num=0;
}
FILE *ft;
ft=fopen("guanjianzi.txt","r");
c=fgetc(ft);
while(c!=10)
{
while( c<'a' || c>'z' ) c=fgetc(ft);
for( i=0; c>='a'&&c<='z'; i++ )
{
st.ch[i]=c;
c=fgetc(ft);
}
st.ch[i]='\0';
st.num=0;
InsertHash(HT,st); //插入
}
fclose(ft);
//扫描C程序,统计个关键字频度
int d,f;
ft=fopen("a.c","r");
c=fgetc(ft);
while(c!=EOF)
{
i=0;
if(c=='/') //注释行中的关键字不记
{
c=fgetc(ft);
if(c=='/')
{
do
{
c=fgetc(ft);
}while(c!=10);
}
if(c=='*')
{
do
{
c=fgetc(ft);
if(c=='*')
{
c=fgetc(ft);
if(c=='/') break;
else continue;
}
}while(1);
}
}
while( (c<'a' || c>'z') && (c!=EOF) )
{
c=fgetc(ft);
if(c=='/') //注释行中的关键字不记
{
c=fgetc(ft);
if(c=='/')
{
do
{
c=fgetc(ft);
}while(c!=10);
}
if(c=='*')
{
do
{
c=fgetc(ft);
if(c=='*')
{
c=fgetc(ft);
if(c=='/') break;
else continue;
}
}while(1);
}
}
}//while
while( c>='a' && c<='z' )
{
st.ch[i]=c;
c=fgetc(ft);
i++;
}
st.ch[i]='\0';
SearchHash(HT,st,d,f);
if(f) HT[d].num++;
}
fclose(ft);
//输出结果
int j;
for(i=0;i<MAXSIZE;i++)
{
if( HT[i].ch!="$" && HT[i].num!=0 )
{
printf("%d ->",i);
for(j=0; HT[i].ch[j]!='\0'; j++)
printf("%c",HT[i].ch[j]);
printf(" : %d\n",HT[i].num);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -