利用哈希技术统计C源程序关键字出现频度Word文档格式.docx
- 文档编号:16092626
- 上传时间:2022-11-19
- 格式:DOCX
- 页数:17
- 大小:38.15KB
利用哈希技术统计C源程序关键字出现频度Word文档格式.docx
《利用哈希技术统计C源程序关键字出现频度Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用哈希技术统计C源程序关键字出现频度Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
Hash(key)[(key的第一个字母序号)*100+(key的最后一个字母序号)]MOD41
二、总体设计
一.算法思想描述
首先读取关键字文件以建立二叉排序树以供后续查询,每个树节点保存一个关键字字符串及指向左右子树的指针。
同时创建一Hash表,每个节点除应保存关键字字符串外,还应保存关键字频数及该存储单元冲突次数。
然后扫描一个C源程序,每次扫描一行,从中循环分离出每个单词,每次均查找其是否为关键字,若是,则按计算公式计算其KEY值并在Hash表中进行相应操作,若该节点为空则插入否者比较其是否与现有关键字相同,若相同则增加其频数,否则增加其冲突次数并继续线性探测下一个存储单元,完了继续操作下一个分离出来的单词,如此循环运行直至扫描结束。
编写本程序时,使用了二叉树创建、二叉树查找、Hash表的建立和操作及文件操作等基本算法。
二.三、详细设计(程序结构
//Hash表存储结构
typedefstructnode//定义
{chars[20];
intnum,time;
//num为频数,time为冲突次数
}node;
//二叉排序树结构定义
typedefstructnod//定义
structnod*left,*right;
}nod;
intmax;
//max为Hash表长度
函数说明:
nod*creat():
读关键字文件,按照关键字中字符字母先后顺序建立二叉排序树,每个节点中保存一个关键字;
voidinit(node*head):
初始化Hash表各节点数据域;
voiddeal(node*head,nod*parent,char[]):
扫描源文件,分离出每个单词,检验是否为关键字;
并根据检验结果来决定是否调用strdeal函数,以对Hash做适当更改;
voidstrcp(node*head,chars[],intk):
将新查找到的关键字复制到Hash表中第k个节点存储单元;
voidstrdeal(node*head,chars[],intk):
判断Hash表中第k个单元中有无关键字,若无则将当前关键字存入该单元,返回;
否则比较两关键字是否相等,相等则将该单元频数加一,返回;
不相等则将该单元冲突数加一并循环线性探测下一个存储单元;
intstrcmp(chart[],chars[]):
字符串比较;
voidprin(nod*head):
以左根右的顺序将二叉排序树打印在屏幕上;
四、实现部分
#include<
iostream.h>
string>
iomanip.h>
usingnamespacestd;
constintTOTAL=39;
//39个关键字
constintMAXLEN=10;
//关键字长度
constintHASHLEN=41;
//哈希表长度
intcont=0;
//统计哈希表中的关键字个数
voidjiemian();
voidShow(intkey);
voidSelect(intchoice);
intRead(char*);
intInput();
intisLetter(charch);
intisKeyWords(char*word);
intFindHX(char*keyword);
intCreatHX(char*keyword);
intGetFreePos(intkey);
voidResetHX();
intGetKey(char*keyword);
charKeyWords[TOTAL][MAXLEN]=//构造二维数组存储39个关键字
{
"
asm"
"
auto"
break"
case"
cdecl"
char"
const"
continue"
default"
do"
double"
else"
enum"
extern"
far"
float"
for"
goto"
huge"
if"
int"
interrupt"
long"
near"
pascal"
register"
return"
short"
signed"
sizeof"
static"
struct"
switch"
typedef"
union"
unsigned"
void"
volatile"
while"
};
/***********************************************************************
typedefstructHASH
charkeyword[MAXLEN];
intcount;
//出现次数(频度)
intcon;
//冲突次数
}HASHHS[HASHLEN];
/****************************************************************************/
classHASH//哈希表类
public:
charkeyword[MAXLEN];
HASHHS[HASHLEN];
intmain()
ResetHX();
//先清空哈希表
cout<
<
"
\t================================================================="
endl;
\t*欢迎使用该软件,请按提示操作*"
\t*该程序功能是统计一个文件中C语言关键字的频度*"
\t*统计开始前请先读取一个文件*"
\t**"
\t*by黄耀广*"
endl<
jiemian();
Select(Input());
return(0);
}
voidjiemian()//主菜单函数
\t\t1.读取一个文件"
\t\t2.输出Hash表(关键字总数,冲突次数)"
\t\t3.查询某关键字在Hash表中的情况"
\t\t4.显示Hash表中的冲突关键字"
\t\t5.显示C语言关键字的Hash函数值(作为对照)"
\t\t6.回主菜单"
\t\t7.退出"
}
intInput()
{
按'
6'
回主菜单,请输入你的选择(1-7):
;
while(true)//确保输入的为数字
{
intchoice=0;
if((cin>
>
choice))
{
if((choice<
=0)||(choice>
7))
cout<
输入范围不正确,请重新输入"
}
else
输入错误,请重新输入"
cin.clear();
while(!
isspace(cin.get()))//功能:
判断字符是否为空白符
//说明:
当字符为空白符时,返回非零值,否则返回零。
// 空白符指空格、水平制表、垂直制表、换页、回车和换行符。
continue;
returnchoice;
}
voidShow(intkey)//显示出某关键字的频度
if(key<
0||key>
=HASHLEN)
cout<
关键字不存在!
return;
if(strlen(HS[key].keyword)==0)
哈希表位置:
key<
记录是空的"
return;
哈希表位置:
关键字:
<
HS[key].keyword<
出现次数"
HS[key].count<
cont++;
voidSelect(intchoice)
char[128],word[MAXLEN];
inti,key,count;
switch(choice)
case1:
请输入要读取的文件名(文件必须与程序在同一目录下):
cin>
Read();
//read函数从一个文件读字节到一个指定的存储器区域,由长度参数确定要读的字节数
Select(Input());
break;
case2:
每次显示5行,请按回车键继续!
for(i=0;
i<
HASHLEN;
i++)
{
Show(i);
if((i+1)%5==0)getchar();
//为了清晰,每次显示5行
}
关键字总数为:
cont<
case3:
请输入你想要查找的关键字:
word;
Show(FindHX(word));
case4:
\t冲突关键字列表"
e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 技术 统计 源程序 关键字 出现 频度