通讯录管理2Word下载.docx
《通讯录管理2Word下载.docx》由会员分享,可在线阅读,更多相关《通讯录管理2Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
陈利民
2013年12月
(一)课程设计的目的
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
⏹训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
(二)问题描述及分析
【问题描述】
设计散列表实现通讯录查找系统。
【基本要求】
(1)设每个记录有下列数据项:
电话号码、用户名、地址等;
(2)从键盘输入各记录,以“用户名的八位二进制内码为一段,各段内码之和对某个素数求余”
为哈希函数建立散列表;
(3)采用二次探测再散列法解决冲突;
(4)输入某个用户名,查找并显示记录;
(5)通讯录信息,保存到磁盘,并能从磁盘读取;
(6)输入某用户名,能够从表中删除(注意删除不是真正删除,应该加标记,以便以后插入或查找并有冲突时,能跳过删除记录继续查找)
(7)要求人机界面友好,使用图形化界面;
面;
【问题分析】
本程序通过创建哈希表,实现通讯录的创建,并通过哈希表的插入和查找使通讯录可以任意进行姓名、电话、地址的添加和查找。
采用二次探测再散列法解决冲突。
调用voidgetin()实现新增功能,调用voidinsert()实现输入新增电话功能,调用voidShowInformation()实现输出通讯录功能,调用save函数保存到磁盘。
(三)数据结构描述
typedefintStatus;
typedefcharNA[MAX_SIZE];
StatusNUM_BER;
typedefstruct{//每一条电话本记录
NAname;
NAtel;
NAadd;
intflag;
}Record;
typedefstruct{//哈希表
Record*elem[HASHSIZE];
//数据元素存储基址
intcount;
//当前数据元素个数
intsize;
//当前容量
}HashTable;
intHash(NAstr){//哈希函数
longn;
intm;
n=fold(str);
//先将用户名进行折叠处理
m=n%HASHSIZE;
//折叠处理后的数,用除留余数法构造哈希函数
returnm;
//并返回模值
}
Statuscollision(intp,intc)
{//冲突处理函数,采用二次探测再散列法解决冲突
inti,q;
i=c/2+1;
while(i<
HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>
=0){
returnq;
}
else{
i=c/2+1;
returnUNSUCCESS;
}
}
else
{
q=(p-i*i)%HASHSIZE;
=0)
returnUNSUCCESS;
}
voidCreateHash(HashTable*H,Record*a)
{//建表,以人的姓名为关键字,建立相应的散列表
//若哈希地址冲突,进行冲突处理
inti,p=-1,c,pp;
for(i=0;
i<
NUM_BER;
i++){
c=0;
p=Hash(a[i].name);
pp=p;
while(H->
elem[pp]!
=NULL&
&
H->
elem[pp]->
flag==1)
pp=collision(p,c);
if(pp<
0){
continue;
}//无法解决冲突,跳入下一循环
H->
elem[pp]=&
(a[i]);
//求得哈希地址,将信息存入
count++;
printf("
\ncreateHash建表完成!
\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n"
HASHSIZE,H->
count);
结论:
以前不注意或是没有想到的问题在编程的都出来了,我们要一个一个去解决。
考虑问题要全面。
(四)主要算法流程描述
(1)显示流程图
可以根据使用者需要选择是否显示通讯录信息(图4-1显示流程图)
图4-1显示流程图
(2)添加流程图
可以根据使用者需要添加用户信息,若已有该用户则显示添加失败,若没有则添加用户信息并保存。
(图4-2添加流程图)
图4-2添加流程图
(五)使用说明
(1)选择“2”,显示通讯录内所有用户信息,则有下图:
(2)选择“3”,添加新的用户信息,则有下图:
输入新增用户信息,并选择‘y’保存信息,则有下图:
(六)调试分析说明
在本次的课程设计中遇到了很多问题,例如一开始保存在文件中的信息无法显示,程序如下:
voidShowInformation(Record*a)//显示输入的用户信息
{
inti;
姓名%-16s电话%-16s住址%-20s\n"
"
"
);
i++){
if(a[i].flag!
=0)
printf("
%-20s%-20s%-20s\n"
a[i].name,a[i].tel,a[i].add);
}
解决方法如下:
FILE*fp;
inti;
Recordt;
if((fp=fopen("
tele_note.txt"
rb+"
))==NULL)
{
数据不存在!
\n"
exit(0);
}
else{
while(fread(&
t,sizeof(Record),1,fp))
if(t.flag)
printf("
%-20s%-20s%-20s%-20d\n"
t.name,t.tel,t.add,t.flag);
fclose(fp);
(七)总结
回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个多月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
学习这么多专业知识需要很大的努力,不过如果心中有一个梦想,那么再难的目标也能实现。
“千里之行,始于足下”,尤其是在迈出了程序的第一步之后,你实际上已经走进了软件开发,尤其是程序设计开发的大门,前面的世界是美丽多彩而又充满挑战的。
(八)参考文献
[1]严蔚敏,吴伟民编著,《数据结构(C语言版)》,清华大学出版社,2010
[2]谭浩强编著,《C程序设计》,清华大学出版社,2009
[3]哈希表通讯录CSDN下载频道: