利用哈希技术统计C源程序关键字出现频度.docx
- 文档编号:3182855
- 上传时间:2022-11-19
- 格式:DOCX
- 页数:17
- 大小:38.15KB
利用哈希技术统计C源程序关键字出现频度.docx
《利用哈希技术统计C源程序关键字出现频度.docx》由会员分享,可在线阅读,更多相关《利用哈希技术统计C源程序关键字出现频度.docx(17页珍藏版)》请在冰豆网上搜索。
利用哈希技术统计C源程序关键字出现频度
:
利用哈希技术统计C源程序关键字出现频度
一.需求分析说明·····················3
二.总体设计·························3
三.详细设计························4
四.实现部分························5
五.程序测试·························10
六.总结·································11
一、需求分析说明
1.课程设计目的
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
2.题目要求
1)题目内容:
利用Hash技术统计某个C源程序中的关键字出现的频度
2)基本要求:
扫描一个C源程序,用Hash表存储该程序中出现的关键字,并统计该程序中的关键字出现的频度。
用线性探测法解决Hash冲突。
设Hash函数为:
Hash(key)[(key的第一个字母序号)*100+(key的最后一个字母序号)]MOD41
二、总体设计
一.算法思想描述
首先读取关键字文件以建立二叉排序树以供后续查询,每个树节点保存一个关键字字符串及指向左右子树的指针。
同时创建一Hash表,每个节点除应保存关键字字符串外,还应保存关键字频数及该存储单元冲突次数。
然后扫描一个C源程序,每次扫描一行,从中循环分离出每个单词,每次均查找其是否为关键字,若是,则按计算公式计算其KEY值并在Hash表中进行相应操作,若该节点为空则插入否者比较其是否与现有关键字相同,若相同则增加其频数,否则增加其冲突次数并继续线性探测下一个存储单元,完了继续操作下一个分离出来的单词,如此循环运行直至扫描结束。
编写本程序时,使用了二叉树创建、二叉树查找、Hash表的建立和操作及文件操作等基本算法。
二.三、详细设计(程序结构
//Hash表存储结构
typedefstructnode//定义
{chars[20];
intnum,time;//num为频数,time为冲突次数
}node;
//二叉排序树结构定义
typedefstructnod//定义
{chars[20];
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
#include
#include
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];
intcount;//出现次数(频度)
intcon;//冲突次数
};
HASHHS[HASHLEN];
intmain()
{
ResetHX();//先清空哈希表
cout<<"\t================================================================="< cout<<"\t*欢迎使用该软件,请按提示操作*"< cout<<"\t*该程序功能是统计一个文件中C语言关键字的频度*"< cout<<"\t*统计开始前请先读取一个文件*"< cout<<"\t**"< cout<<"\t*by黄耀广*"< cout<<"\t================================================================="< jiemian(); Select(Input()); return(0); } voidjiemian()//主菜单函数 { cout< cout<<"\t\t1.读取一个文件"< cout<<"\t\t2.输出Hash表(关键字总数,冲突次数)"< cout<<"\t\t3.查询某关键字在Hash表中的情况"< cout<<"\t\t4.显示Hash表中的冲突关键字"< cout<<"\t\t5.显示C语言关键字的Hash函数值(作为对照)"< cout<<"\t\t6.回主菜单"< cout<<"\t\t7.退出"< } intInput() { cout< cout<<"按'6'回主菜单,请输入你的选择(1-7): "; while(true)//确保输入的为数字 { intchoice=0; if((cin>>choice)) { if((choice<=0)||(choice>7)) cout<<"输入范围不正确,请重新输入"< } else { cout<<"输入错误,请重新输入"< cin.clear(); } while(! isspace(cin.get()))//功能: 判断字符是否为空白符 //说明: 当字符为空白符时,返回非零值,否则返回零。 // 空白符指空格、水平制表、垂直制表、换页、回车和换行符。 continue; cout< returnchoice; } } voidShow(intkey)//显示出某关键字的频度 { if(key<0||key>=HASHLEN) { cout<<"关键字不存在! "< return; } if(strlen(HS[key].keyword)==0) { cout<<"哈希表位置: "< return; } cout<<"哈希表位置: "< " < cont++; } voidSelect(intchoice) { char[128],word[MAXLEN]; inti,key,count; switch(choice) { case1: cout<<"请输入要读取的文件名(文件必须与程序在同一目录下): "; cin>>; cout< Read();//read函数从一个文件读字节到一个指定的存储器区域,由长度参数确定要读的字节数 Select(Input()); break; case2: cout<<"每次显示5行,请按回车键继续! "< for(i=0;i { Show(i); if((i+1)%5==0)getchar();//为了清晰,每次显示5行 } cout<<"关键字总数为: "< Select(Input()); break; case3: cout<<"请输入你想要查找的关键字: "; cin>>word; cout< Show(FindHX(word)); Select(Input()); break; case4: cout<<"\t冲突关键字列表"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 技术 统计 源程序 关键字 出现 频度