hash数据结构课程设计.docx
- 文档编号:4907984
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:15
- 大小:61.71KB
hash数据结构课程设计.docx
《hash数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《hash数据结构课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
hash数据结构课程设计
数据结构课程设计报告
题目:
利用Hash技术统计单词的频度
院(系):
计算机工程学院
专业:
计算机科学与技术
班级:
嵌入式1091
学生:
周宇
指导教师:
寇海洲孙成富
邱军林殷路
2010年12月
目录
一、设计目的1
二、设计内容1
三、程序设计步骤2
四、调试分析13
五、测试结果13
六、课程设计小结17
一、设计目的
1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计内容
1、系统名称
利用Hash技术统计单词的频度
。
2、要求:
扫描一个C源程序,用Hash表存储该程序中出现的关键字,并统计该程序中的关键字出现的频度。
用线性探测法解决Hash冲突。
设Hash函数为:
Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)]Mod41。
三:
程序设计步骤
2)采用主要的数据结构类型。
#include"stdafx.h"
#include"iostream.h"
#include
#include
constintTOTAL=39;
constintMAXLEN=10;
constintHASHLEN=41;
intcont=0;
voidjiemian();
voidShow(intkey);
voidSelect(intchoice);
intRead(char*filename);
intInput();
intisLetter(charch);
intisKeyWords(char*word);
intFindHX(char*keyword);
intCreatHX(char*keyword);
intGetFreePos(intkey);
voidResetHX();
intGetKey(char*keyword);
charKeyWords[TOTAL][MAXLEN]=
{
"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",
};
classHASH
public:
charkeyword[MAXLEN];
intcount;
intcon;
};
HASHHS[HASHLEN];
voidmain()
{
ResetHX();//先清空哈希表
cout<<"\t================================================================="< cout<<"\t*欢迎使用该软件,请按提示操作*"< cout<<"\t*该程序功能是统计一个文件中C语言关键字的频度*"< cout<<"\t*统计开始前请先读取一个文件*"< cout<<"\t**"< cout<<"\t**"< cout<<"\t================================================================="< jiemian(); Select(Input()); } 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(); } continue; cout< returnchoice; } } voidShow(intkey) { if(key<0||key>=HASHLEN) { cout<<"关键字不存在! "< return; } if(strlen(HS[key].keyword)==0) { cout<<"哈希表位置: "< return; } cout<<"哈希表位置: "< " < cont++; } voidSelect(intchoice) { charfilename[128],word[MAXLEN]; inti,key,count; switch(choice) { case1: cout<<"请输入要读取的文件名(文件必须与程序在同一目录下): "; cin>>filename; cout< Read(filename); 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冲突关键字列表"< count=0; for(i=0;i { if(strlen(HS[i].keyword)>0) { key=GetKey(HS[i].keyword); if(key! =i) { count++; cout<<"\t[关键字]: "< cout<<"\t[哈希表当前位置]: "< cout<<"\t[冲突次数]: "< } } } if(count==0) cout<<"没有冲突"< else cout<<"\t冲突关键字共: "< Select(Input()); break; case5: cout<<"C语言中的关键字和其在哈希表的位置: "< for(i=0;i { cout< : left)<<"["< (2)< < : left)< if((i+1)%5==0)cout< } cout< Select(Input()); break; case6: jiemian(); Select(Input()); case7: break;//退出 default: Select(Input()); return; } } intRead(char*filename) { charword[MAXLEN],ch; inti; FILE*read; if((read=fopen(filename,"r"))==NULL) { cout<<"文件不存在,请确认好再输入! "< return-1; } ResetHX();/ 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) { 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表,请继续操作"< jiemian(); return1; } intisLetter(charch) if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))return1; elsereturn0; //是字母就返回1,否则返回0值 } intFindHX(char*keyword) { intkey,find,tem=0; if(! isKeyWords(keyword))return-1; key=GetKey(keyword); if(strcmp(HS[key].keyword,keyword)==0)returnkey; for(find=key+1;find { tem++; if(strcmp(HS[find].keyword,keyword)==0){ HS[find].con=tem; returnfind;} } for(find=0;find { tem++; if(strcmp(HS[find].keyword,keyword)==0){ HS[find].con=tem; returnfind;} } return-1; } intCreatHX(char*keyword) { intkey; if(! isKeyWords(keyword))return-1; key=GetKey(keyword);//计算哈希值 if(strlen(HS[key].keyword)>0) { if(strcmp(HS[key].keyword,keyword)==0) { HS[key].count++; return1; } key=FindHX(keyword); if(key<0) { key=GetFreePos(GetKey(keyword)); if(key<0)return-1; strcpy(HS[key].keyword,keyword); } if(key<0)return-1; HS[key].count++; } else { strcpy(HS[key].keyword,keyword); HS[key].count++; } return1; } intGetFreePos(intkey) { intfind,tem=0; if(key<0||key>=HASHLEN)return-1; for(find=key+1;find { tem++; if(strlen(HS[find].keyword)==0){ HS[find].con=tem; returnfind;} } for(find=0;find { tem++; if(strlen(HS[find].keyword)==0){ HS[find].con=tem; returnfind;} } return-1; } voidResetHX() { inti; for(i=0;i { strcpy(HS[i].keyword,""); HS[i].count=0; HS[i].con=0; } } intGetKey(char*keyword) {//Hash函数为: Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)]Mod41 return(keyword[0]*100+keyword[strlen(keyword)-1])%41; } intisKeyWords(char*word) { inti; for(i=0;i if(strcmp(word,KeyWords[i])==0)return1; return0; } } } 四、调试分析 在调试的过程中我遇到了一些困难,总是运行错误,我努力去寻找错误的来源! 比如说头文件错误,读取文件错误,但在同学的帮助下我都找到了原因! 五、测试结果 六、课程设计小结: 做课程设计,是一次完整的播种与收获的过程,为它挥汗,因它烦忧,同时也因它而雀跃。 在写代码期间,每天长时间坐在电脑显示器前面,酸胀的眼睛,手旁满是手工演算的草稿,有时为了实现某个功能绞尽脑汁,坐站都不是。 当程序遇到问题运算结果与演算结果不匹配而又怎么也找不到问题的所在时,那个痛苦啊,真的是有一绝不想再有二了。 当然,也有快乐的时候,那自然是当顺利实现某方面功能的时候。 编程需要有耐心,尤其实在单步调试的时候,更是马虎不得,有时候关键就是那么一步,错过了就得从头来过了。 编程也需要勇气,要勇于发现自己的错误,也要勇于推翻自己之前的思路,要坚信“没有最好,只有更好”。 编程,最好是一鼓作气,得天天“摸摸”它,时时想着它,要是过一阵再去碰它那就得先去读懂自己的程序了,一切的一切几乎都得从头开始。 编程需要细心,有时一个不注意小错误就能引出大问题。 编程也需要规范,不仅为了他人能看得懂程序,也为了方便自己以后程序的更改与进一步的完善。 总之,做完课程设计使我感觉成长了许多,有艰辛的付出才会有收获,它使我收获了那份喜悦,更使我增强了自信心。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hash 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)