⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a.c

📁 扫描一个C源程序
💻 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 + -