ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:225.40KB ,
资源ID:4560835      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4560835.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(设计哈希表实现电话号码查询系统C语言版课程设计报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

设计哈希表实现电话号码查询系统C语言版课程设计报告.docx

1、设计哈希表实现电话号码查询系统C语言版课程设计报告设计哈希表实现 查询系统一目的通过课程设计,巩固和加深对结构体、文件、哈希表等理论知识的理解;掌握现实复杂问题的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人动手能力,历练自身素质。哈希表实现 查询系统是利用哈希表实现 系统的快速查询,程序实现哈希表建表和查表,并实现对没有查找到的内容进行记录。掌握哈希表的工作原理,熟悉建立哈希表、对哈希表冲突处理、哈希表查找等功能的实现,回顾文件读取、写入,回顾随机函数的作用。二需求分析1.输入的形式和输入值的范围

2、数据输入分两种模式:一种是将原有数据记录在old.txt文档中,由程序读入;另一种是由程序随机生成,并储存在new.txt文档中。数据的格式为:#、 、家庭住址。用户使用时显示菜单,用户输入菜单选项完成操作。2.输出的形式查找的结果显示在屏幕上。未被查找到的内容输出到out.txt文档中。在用户需要时,将哈希表显示在屏幕上。3.程序所能达到的功能根据用户的选择,从原有文档读入数据或随机生成数据,分别以#和 做为关键字生成哈希表。生成哈希表后用户可以根据相应关键字进行数据的查找,若查找到对应的数据则将数据输出到屏幕,若没有查找到对应的数据则将用户输入的查找内容输出到out.txt文档。在用户选择

3、显示哈希表时,显示完整的哈希表。程序使用文字菜单的友好界面。在数据输入时对输入内容进行范围控制。4.初步测试计划在old.txt文档中输入30条记录,令程序读入并分别以#和 做为关键字生成哈希表,查找记录中原有的记录,查看输出数据,查找记录中没有的记录查看回馈,查看整个哈希表的数据。令程序随机生成记录,查看new.txt文档,分别以#和 做为关键字生成哈希表,查看整个哈希表的数据,分别查找原有和没有的记录,查看回馈。三概要设计1.数据类型定义结构体类型存储每条记录。struct Data char namesizename; char phonesizephone; char addresss

4、izeaddress; bool used;*hash_data;2各种函数说明:int get_hashkey(char* str,int select)/ 获得关键字void show(int i)/ 显示每条信息void Store(char *str)/在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中void Allshow()/输出哈希表中的记录void Auto_file()/随机生成数据,并将数据保存在new.txtvoid Build_Hash(int HashType)/建立哈希表void FindName()/根据#查找哈希表中的记录void Fin

5、dPhone()/根据 查找哈希表中的记录四详细设计1.头文件与定义结构体类型#include #include #include #include struct Data string name;/ string phone; string address; Data *hash_data;2.定义长度#define sizehash 100#define sizename 20#define sizephone 15#define sizeaddress 403.获取关键字函数int get_hashkey(char* str,int select) int Key=0, ReKey,m;

6、 char tmp10; for (int i=0;istrlen(str);i+) Key+=stri; Key%=sizehash; if (hash_dataKey.used) m=Key; Key=-1; if (select=1) for (i=0;i10;i+) ReKey=(m+Ai)%sizehash; if (!hash_dataReKey.used) Key=ReKey; break; else if (select=2) ReKey=m;for (i=0;i100;i+) ReKey=ReKey+1; ReKey=ReKey%sizehash; if (!hash_dat

7、aReKey.used) Key=ReKey; break; return Key;4.产生hash表void Build_Hash(int HashType) for (int i=0;i0) name=strtok(s,seps); phone=strtok(NULL,seps); address=strtok(NULL,seps); if (HashType=1) HashKey=get_hashkey(name,HashType); else if (HashType=2) HashKey=get_hashkey(phone,HashType); if (HashKey=-1) pri

8、ntf( 哈希表过小或哈希碰撞过多); fclose(reader); exit(1); else strcpy(hash_dataHashKey.name,name); strcpy(hash_dataHashKey.phone,phone); strcpy(hash_dataHashKey.address,address); hash_dataHashKey.used=true; fclose(reader);5.在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中void Store(char *str)/将查找失败记录添加到out.txt文件末尾 FILE* pf=

9、fopen(out.txt,wa); /以追加的方式写入 if (pf=NULL)/判断文件是否打开成功 printf( 创建out.txt失败n); fclose(pf); exit(1); fscanf(pf,%s,str); fclose(pf);6.输出哈希表中的记录void Allshow() for (int i=0;isizehash;i+) if (hash_datai.used) show(i); printf(nn);7.随机生成数据,并将数据保存在new.txtvoid Auto_file() FILE* fp=fopen(new.txt, w+);writer.open

10、(new.txt); if(fp=NULL) printf( 创建new.txt失败!nn); fclose(fp); exit(1); char s100=0; int k=0; srand(time(0); for (int i=0;i50;i+) memset(s,0,100); k=0; /随?机产生用?户名? for (int j=0;j8;j+,k+) sk=a+rand()%26; /随?机产生电?话号?码? sk+=t; for (j=0;j12;j+,k+) sk=0+rand()%10; /随?机产生地?址 sk+=t; for (j=0;j20;j+,k+) sk=a+r

11、and()%26; fprintf(fp,%s,s); if(i!=49) fprintf(fp,n); fclose(fp);8.根据#查找哈希表中的记录int Find_by_name(string name) int i=0; int j=1; int key; char*p; for(key=0,p=&name0;*p;p+) key=key+*p; key=key%43; while(1) if(signkey=0&key=42) key+;j+; if(hash_datakey.name=name) return key; else key=Handle_Random(key,i)

12、; j+; if(j=num) return -1; 9.根据用户名查找记录void FindName() char name10=; printf( 请输入要查找的用户名:); scanf(%s,name); int i=Find(name,1); if (i=-1) printf( 无此记录n); Store(name); else printf( 查找结果:n); show(i); printf(nn);10.根据 查找记录void FindPhone() char phone12=; printf( 请输入要查找的 :); scanf(%s,phone); int i=Find(pho

13、ne,2); if (i=-1) printf( 无此记!n); Store(phone); else printf( 查找结果:n); show(i); printf(nn); 12.整个程序的流程图如下五调试分析1.测试环境在Windows 7环境下的Visual C+ 6.0。2.模块调试随机生成数据时,对随机生成的内容的控制需要特别注意。要注意其字符组合模式,比如生成名字是应该只有字幕,生成 是应该只有数字,在随机生成是用ASCII码的规律解决。还要注意生成字符组合的长度限制,比如 应该是11位,这可以在循环语句中进行控制。在哈希含查找时要注意取余的除数的一致,这是哈希表成立的关键点。

14、3.复杂度分析使用哈希表存储记录,在执行查找是可以快捷的进行查找。程序选用了除留余数法建立哈希函数,选用在哈希法和为随机探测再散列法。程序设定的哈希标长为50,文件数据长度为30,则哈希表的填装因子为0.6,则查找成功时的平均查找长度为Snr-In1-0.6查找不成功时的平均查找长度为Unr六测试结果1菜单:运行软件后会出现主菜单,然后可以根据上面的提示,选择相应操作。2 以#或者查询old.txt文件中的数据:按照提示输入#查找:第一步输入文件中没有的#kjhyuio查找结果显示无此记录。第二步输入hefangfang就立刻显示出正确信息。第三步显示以#为关键字建立的哈希表。第四步输入0退出

15、程序。第二步输入文件中没有的1332455查找结果显示输入不正确。第三步显示以为关键字建立的哈希表。第四步输入0退出程序。3 以#或者查询new.txt文件中的数据:按照提示输入#查找:第一步输入文件中没有的#dbfgdswe查找结果显示无此记录。第二步输入wfnfozvs就立刻显示出正确信息。第三步显示以#为关键字建立的哈希表。第四步输入0退出程序。第二步输入20973726016查找结果显示正确信息。第三步显示以为关键字建立的哈希表。第四步输入0退出程序。七用户使用说明本程序运行在Windows 7系统下。程序为命令提示行文件,执行文件前请在程序同目录下的old.txt文件中输入原始数据。

16、程序生成的文档文件也将存放在程序同目录下。打开程序后请根据提示选择功能。输入“1程序将使用程序同目录下的old.txt文件中的数据;输入“2 程序将随机生成数据;输入“0则会结束程序。输入“1表明用#做为关键字进行查找;输入“2 表明用 做为关键字进行查找;用# 查找时输入“1用户将需要输入# 进行查找;输入“2程序将显示完整的哈希表;输入“0则会结束程序。用户输入#查找后,若有这条记录,程序将显示该条记录。若未找到这条记录,则显示“没有找到这条记录!,同时将输入记录在程序同目录下的out.txt文件中。选择随机生成随据,数据同时将输出在程序同目录下的new.txt文件中。八课程设计总结 1

17、编程前遇到一些小问题:由于C语言我们现在学的比较浅,所以编程都是自己通过网上学习或者请教同学,对于文件应用方面我了解甚少,但是经过自己自行学习文件知识后,了解了文件方面相应的知识。开始时程序出现了一些问题,经过修改和完善,终于解决了每个问题,使程序新建或打开文件非常好。通过努力也把文件应运得很好。 2 心得:通过此次课程设,我巩固和加深了对哈希表、文件等理论知识的理解;掌握现实复杂问题的分析建模和解决方法;也提高了对报告书写的规范性。本次设计哈希表实现 查询系统课程设计,实现了用户通过#或者 查找自己建好的old.txt文件和系统自动生成的new.txt文件中的信息。九附录源代码#includ

18、e #include #include #include #define sizehash 100#define sizename 20#define sizephone 15#define sizeaddress 40struct Data char namesizename; char phonesizephone; char addresssizeaddress; bool used;/表示该条记录已使用*hash_data;int A10=1,6,11,16,21,26,31,36,41,46;/伪随机数char *DataFile;void Auto_file() FILE* fp=

19、fopen(new.txt, w+); /writer.open(new.txt); if(fp=NULL) printf( 创建new.txt失败!nn); fclose(fp); exit(1); char s100=0; int k=0; srand(time(0); for (int i=0;i50;i+) memset(s,0,100); k=0; for (int j=0;j8;j+,k+) sk=a+rand()%26; sk+=t; for (j=0;j12;j+,k+) sk=0+rand()%10; sk+=t; for (j=0;j20;j+,k+) sk=a+rand(

20、)%26; fprintf(fp,%s,s); if(i!=49) fprintf(fp,n); fclose(fp);int get_hashkey(char* str,int select) int Key=0, ReKey,m; char tmp10; for (int i=0;istrlen(str);i+) Key+=stri; Key%=sizehash; if (hash_dataKey.used) m=Key; Key=-1; if (select=1) for (i=0;i10;i+) ReKey=(m+Ai)%sizehash; if (!hash_dataReKey.us

21、ed) Key=ReKey; break; else if (select=2) ReKey=m;for (i=0;i100;i+) ReKey=ReKey+1; ReKey=ReKey%sizehash; if (!hash_dataReKey.used) Key=ReKey; break; return Key;void Build_Hash(int HashType)/产生hash表 for (int i=0;i0) name=strtok(s,seps); phone=strtok(NULL,seps); address=strtok(NULL,seps); if (HashType=

22、1) HashKey=get_hashkey(name,HashType); else if (HashType=2) HashKey=get_hashkey(phone,HashType); if (HashKey=-1) printf( 哈t希表过y小?或哈t希碰?撞2过y多!?); fclose(reader); exit(1); else strcpy(hash_dataHashKey.name,name); strcpy(hash_dataHashKey.phone,phone); strcpy(hash_dataHashKey.address,address); hash_data

23、HashKey.used=true; fclose(reader);void show(int i) printf( %st%st%sn,hash_datai.name,hash_datai.phone, hash_datai.address);void Allshow() for (int i=0;isizehash;i+) if (hash_datai.used) show(i); printf(nn);int Find(char *str,int select) int Key=0; int ReKey; char tmp10;int m; for (int i=0;istrlen(st

24、r);i+) Key+=stri; Key%=sizehash; if (!hash_dataKey.used) return -1; if (select=1 & strcmp(hash_dataKey.name,str)!=0)| (select=2 & strcmp(hash_dataKey.phone,str)!=0 ) m=Key; Key=-1; if (select=1) for (i=0;i10;i+) ReKey=(m+Ai)%sizehash; /if (pInfoReHashKey.name=str) if (strcmp(hash_dataReKey.name,str)=0) Key=ReKey; break; else if (select=2)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1