当前位置:文档之家› 设计散列表实现通讯录查找系统

设计散列表实现通讯录查找系统

长春理工大学
学生实习报告
2010 —2011 学年第一学期
实习类别:课程设计
学院:软件学院
专业:软件开发与测试
班级:
姓名:
建通讯录
【问题描述】
设计散列表实现通讯录查找系统。

【基本要求】
(1) 设每个记录有下列数据项:电话号码、用户名、地址;
(2) 从键盘输入各记录,分别以电话号码为关键字建立散列表;
(3) 采用二次探测再散列法解决冲突;
(4) 查找并显示给定电话号码的记录;
(5) 通讯录信息文件保存;
(6) 要求人机界面友好,使用图形化界面;
【实现提示】
主函数:根据选单的选项调用各函数,并完成相应的功能。

Menu()的功能:显示英文提示选单。

Quit()的功能:退出选单。

Create()的功能:创建新的通讯录。

Append()的功能:在通讯录的末尾写入新的信息。

Find():查询某人的信息,如果找到了,则显示该人的信息,如果没有则提示通讯录中没有此人的信息。

Alter()的功能:修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息。

Delete()的功能:删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息。

List()的功能:显示通讯录中的所有记录。

Save()的功能:保存通讯录中的所有记录到指定文件中。

Load()的功能:从指定文件中读取通讯录中的记录。

(一).需求分析:
(1) 设每个记录有下列数据项:电话号码、用户名、地址;
(2) 从键盘输入各记录,分别以电话号码为关键字建立散列表
(3) 采用二次探测再散列法解决冲突
(4) 查找并显示给定电话号码的记录
(5) 通讯录信息文件保存
(6) 要求人机界面友好,使用图形化界面
(二)概要设计:(流程图)
总流程图:
1.Append()的功能:在通讯录的末尾写入新的信息,并返回选单.
2.Find():查询某人的信息,如果找到了,则显示该人的信息,如果没有则提示通讯录中没有此人的信息.
3.Alter()的功能:修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息.
4.Delete()的功能:删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息.
5.Menu()的功能:显示英文提示选单。

6.Quit()的功能:退出选单。

7.Create()的功能:创建新的通讯录。

8.List()的功能:显示通讯录中的所有记录。

9.Save()的功能:保存通讯录中的所有记录到指定文件中。

10.Load()的功能:从指定文件中读取通讯录中的记录。

(三)详细设计(重要函数、存储结构、类型定义):
//--------通讯录数据类型定义-------------------
typedefstruct Information
{
char Name[20];
char PhoneNO[12]; //以电话号码为关键字建立散列表
char Address[30];
}Inform;
//--------电话本结构设计----------------
typedefstruct Record
{
Inform *base;
intnum; //记录记录的个数
}Record;
//---------哈希表结构定义-------------------
typedefstruct Hash
{
char key[12];
int address;
}Hash;
Record record; //将记录设置为全局变量
Hash *f; //将哈希表设置为全局变量
//-----------二次探测再散列数组定义---
int research[MOD/2];
//-----------二次探测数组初始化-------
void ArrayIni() //±12,±22,±32,±42……±(MOD/2)2.
{
inti,j;
for (i=0,j=-1;i<MOD/2;i=i+2)
{
research[i]=(i+1)*(i+1);
if(i+1<MOD/2)
research[i+1]=j*(i+1)*(i+1);
}
}
//---------------菜单数据定义---------------------
typedefenum{Create,Append,Find,Alter,Delete,List,Save,Load,Quit}DO;
四)调试分析:
1,遇到的问题:
问题1: 将电话号作为关键字在哈希表中存储时,需要将字符串转换为整形,而直接将11位字符串转换为整形将超出int型的最大范围,故不可直接将字符串直接转换为int,要先截取一定长度的字符串,然后转换为整形,再用:Hi=(H(key)%MOD)m 换算在该记录哈希表中的位置。

key=change(phoneNum);
addr=key%MOD;
while((EQ(f[addr].key,phoneNum)!=1)&&i<MOD/2)
{
addr=(key+research[i++])%MOD;
}
问题2: 电话号的前几位一般是相同的,故用于转换为关键字的串需要是电话号的后几位,而现有的strncpy()功能是截取字符串的前几位,故需要自己定义一个转换函数.为此可以先将字符串反转,去前几位,然后将取得的字符串再反转,即得到原来电话号的后几位字符串。

//----------电话号码到关键字的转换---------------
intchange(char phoneNum[])
{
charstr[4];
int key;
strrev(phoneNum);
strncpy(str,phoneNum,3);
str[3]='\0';
strrev(str);
key=atoi(str);
return key;
}
问题3: 图形界面的实现.
因知识水平的限制,MFC中的图形界面用的不熟练,故选择擅长的c来做此通讯录,但c中找不到实用的图形界面头文件.所以就需要自己绘制图形界面。

cout<<" !*********迷你电话本************!"<<endl;
cout<<" |------------------( ^* _ *^ )----------------------|"<<endl;
cout<<" |**【新建电话】请输入: 0 ***|"<<endl;
cout<<" |**【添加记录】请输入: 1 ***|"<<endl;
cout<<" |**【查找记录】请输入: 2 ***|"<<endl;
cout<<" |**【修改记录】请输入: 3 ***|"<<endl;
cout<<" |**【删除记录】请输入: 4 ***|"<<endl;
cout<<" |**【浏览记录】请输入: 5 ***|"<<endl;
cout<<" |**【保存电话本】请输入: 6 ***|"<<endl;
cout<<" |**【打开电话本】请输入: 7 ***|"<<endl;
cout<<" |**【退出】请输入: 8 ***|"<<endl;
cout<<" !---------------------------------------------------!"<<endl;
cout<<" 使用说明:其他操作之前请先新建电话本"<<endl;
cout<<" --------请选择操作的序列号!----------------"<<endl;
2.课程设计过程的收获
通过课程设计让我学习到一个程序正确运行需要各个子程序正确结合,以及严密的语法结构,还要有清晰的流程图。

3.在课程设计过程中对《数据结构》课程的认识
数据结构锻炼的是我们的逻辑思维能力,能增加我们编程过程中的思维的严密性与可行性。

数据结构考察的是程序的时间复杂度,与空间复杂度。

它们直接反映了算法的优劣程度。

故在将算法实现为程序的时候就需要注意实现语言,循环结构的选择,以及变量的类型等。

相关主题