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

上传人:b****6 文档编号:17495779 上传时间:2022-12-06 格式:DOCX 页数:29 大小:225.40KB
下载 相关 举报
设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx_第1页
第1页 / 共29页
设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx_第2页
第2页 / 共29页
设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx_第3页
第3页 / 共29页
设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx_第4页
第4页 / 共29页
设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

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

《设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。

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

charaddress[sizeaddress];

boolused;

}*hash_data;

2各种函数说明:

intget_hashkey(char*str,intselect)//获得关键字

voidshow(inti)//显示每条信息

voidStore(char*str)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中

voidAllshow()//输出哈希表中的记录

voidAuto_file()//随机生成数据,并将数据保存在new.txt

voidBuild_Hash(intHashType)//建立哈希表

voidFindName()//根据##查找哈希表中的记录

voidFindPhone()//根据查找哈希表中的记录

四﹑详细设计

1.头文件与定义结构体类型

#include<

time.h>

stdio.h>

string.h>

stdlib.h>

stringname;

//

stringphone;

stringaddress;

};

Data*hash_data;

2.定义长度

#definesizehash100

#definesizename20

#definesizephone15

#definesizeaddress40

3.获取关键字函数

intget_hashkey(char*str,intselect)

{

intKey=0,ReKey,m;

chartmp[10];

for(inti=0;

i<

strlen(str);

i++)

Key+=str[i];

}

Key%=sizehash;

if(hash_data[Key].used)

{

m=Key;

Key=-1;

if(select==1)

{

for(i=0;

10;

{

ReKey=(m+A[i])%sizehash;

if(!

hash_data[ReKey].used)

{

Key=ReKey;

break;

}

}

}elseif(select==2)

ReKey=m;

for(i=0;

100;

i++)

{ReKey=ReKey+1;

ReKey=ReKey%sizehash;

}

returnKey;

}

4.产生hash表

voidBuild_Hash(intHashType){

sizehash;

i++)hash_data[i].used=false;

FILE*reader=fopen(DataFile,"

r"

);

if(reader==NULL)

printf("

%s读取失败\n"

DataFile);

fclose(reader);

exit

(1);

chars[100];

charseps[]="

\t"

;

char*name;

char*phone;

char*address;

intHashKey;

while(!

feof(reader))

fgets(s,100,reader);

if(strlen(s)>

0)

name=strtok(s,seps);

phone=strtok(NULL,seps);

address=strtok(NULL,seps);

if(HashType==1)

HashKey=get_hashkey(name,HashType);

}elseif(HashType==2)

HashKey=get_hashkey(phone,HashType);

if(HashKey==-1)

printf("

哈希表过小或哈希碰撞过多"

fclose(reader);

exit

(1);

}else{

strcpy(hash_data[HashKey].name,name);

strcpy(hash_data[HashKey].phone,phone);

strcpy(hash_data[HashKey].address,address);

hash_data[HashKey].used=true;

5.在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中

voidStore(char*str)//将查找失败记录添加到out.txt文件末尾

FILE*pf=fopen("

out.txt"

"

wa"

//以追加的方式写入

if(pf==NULL)//判断文件是否打开成功

创建out.txt失败\n"

fclose(pf);

fscanf(pf,"

%s"

str);

6.输出哈希表中的记录

voidAllshow()

if(hash_data[i].used)

show(i);

printf("

\n\n"

7.随机生成数据,并将数据保存在new.txt

voidAuto_file()

FILE*fp=fopen("

new.txt"

"

w+"

writer.open("

if(fp==NULL)

printf("

创ä

¡

ä

建¡

§

new.txt失º

ì

败ã

¨

¹

!

fclose(fp);

chars[100]={0};

intk=0;

srand(time(0));

50;

memset(s,0,100);

k=0;

//随?

机¨

²

产¨

生¦

用®

?

户¡

名?

for(intj=0;

j<

8;

j++,k++)

s[k]='

a'

+rand()%26;

电Ì

话¡

ã

号?

码?

s[k++]='

\t'

for(j=0;

12;

0'

+rand()%10;

地Ì

址¡

¤

20;

fprintf(fp,"

s);

if(i!

=49)

\n"

fclose(fp);

8.根据##查找哈希表中的记录

intFind_by_name(stringname)

inti=0;

intj=1;

intkey;

char*p;

for(key=0,p=&

name[0];

*p;

p++)

key=key+*p;

key=key%43;

while

(1)

if(sign[key]=='

&

key<

=42)

{key++;

j++;

if(hash_data[key].name==name)

returnkey;

else

key=Handle_Random(key,i);

j++;

if(j==num)

return-1;

9.根据用户名查找记录

voidFindName(){

charname[10]="

"

请输入要查找的用户名:

scanf("

name);

inti=Find(name,1);

if(i==-1)

无此记录\n"

Store(name);

}else{

查找结果:

show(i);

10.根据查找记录

voidFindPhone(){

charphone[12]="

请输入要查找的:

phone);

inti=Find(phone,2);

无此记!

Store(phone);

12.整个程序的流程图如下

 

五﹑调试分析

1.测试环境

在Windows7环境下的VisualC++6.0。

2.模块调试

随机生成数据时,对随机生成的内容的控制需要特别注意。

要注意其字符组合模式,比如生成名字是应该只有字幕,生成是应该只有数字,在随机生成是用ASCII码的规律解决。

还要注意生成字符组合的长度限制,比如应该是11位,这可以在循环语句中进行控制。

在哈希含查找时要注意取余的除数的一致,这是哈希表成立的关键点。

3.复杂度分析

使用哈希表存储记录,在执行查找是可以快捷的进行查找。

程序选用了除留余数法建立哈希函数,选用在哈希法和为随机探测再散列法。

程序设定的哈希标长为50,文件数据长度为30,则哈希表的填装因子α为0.6,则查找成功时的平均查找长度为Snr≈-In〔1-0.6〕

查找不成功时的平均查找长度为Unr≈

六﹑测试结果

1菜单:

运行软件后会出现主菜单,然后可以根据上面的提示,选择相应操作。

2以##或者查询old.txt文件中的数据:

按照提示输入##查找:

第一步输入文件中没有的##kjhyuio查找结果显示无此记录。

第二步输入hefangfang就立刻显示出正确信息。

第三步显示以##为关键字建立的哈希表。

第四步输入0退出程序。

第二步输入文件中没有的1332455查找结果显示输入不正确。

第三步显示以为关键字建立的哈希表。

3以##或者查询new.txt文件中的数据:

第一步输入文件中没有的##dbfgdswe查找结果显示无此记录。

第二步输入wfnfozvs就立刻显示出正确信息。

第二步输入20973726016查找结果显示正确信息。

七﹑用户使用说明

本程序运行在Windows7系统下。

程序为命令提示行文件,执行文件前请在程序同目录下的old.txt文件中输入原始数据。

程序生成的文档文件也将存放在程序同目录下。

打开程序后请根据提示选择功能。

输入“1〞程序将使用程序同目录下的old.txt文件中的数据;

输入“2〞程序将随机生成数据;

输入“0〞则会结束程序。

输入“1〞表明用##做为关键字进行查找;

输入“2〞表明用做为关键字进行查找;

用##〔〕查找时

输入“1〞用户将需要输入##〔〕进行查找;

输入“2〞程序将显示完整的哈希表;

用户输入##查找后,若有这条记录,程序将显示该条记录。

若未找到这条记录,则显示“没有找到这条记录!

〞,同时将输入记录在程序同目录下的out.txt文件中。

选择随机生成随据,数据同时将输出在程序同目录下的new.txt文件中。

八﹑课程设计总结

1编程前遇到一些小问题:

由于C语言我们现在学的比较浅,所以编程都是自己通过网上学习或者请教同学,对于文件应用方面我了解甚少,但是经过自己自行学习文件知识后,了解了文件方面相应的知识。

开始时程序出现了一些问题,经过修改和完善,终于解决了每个问题,使程序新建或打开文件非常好。

通过努力也把文件应运得很好。

2心得:

通过此次课程设,我巩固和加深了对哈希表、文件等理论知识的理解;

掌握现实复杂问题的分析建模和解决方法;

也提高了对报告书写的规范性。

本次设计哈希表实现查询系统课程设计,实现了用户通过##或者查找自己建好的old.txt文件和系统自动生成的new.txt文件中的信息。

九﹑附录

源代码

//表示该条记录已使用

intA[10]={1,6,11,16,21,26,31,36,41,46};

//伪随机数

char*DataFile;

//writer.open("

创建new.txt失败!

s[k++]='

s[k++]='

voidBuild_Hash(intHashType)//产生hash表

哈t希¡

ê

表À

ª

过y小?

或¨

°

碰?

撞Á

2过y多¨

voidshow(inti)

%s\t%s\t%s\n"

hash_data[i].name,hash_data[i].phone,hash_data[i].address);

intFind(char*str,intselect){

intKey=0;

intReKey;

intm;

if(!

hash_data[Key].used)

return-1;

if((select==1&

strcmp(hash_data[Key].name,str)!

=0)||(select==2&

strcmp(hash_data[Key].phone,str)!

=0))

//if(pInfo[ReHashKey].name==str)

if(strcmp(hash_data[ReKey].name,str)==0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

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

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