软件工程 通讯录查询系统.docx

上传人:b****7 文档编号:10423273 上传时间:2023-02-11 格式:DOCX 页数:33 大小:23.04KB
下载 相关 举报
软件工程 通讯录查询系统.docx_第1页
第1页 / 共33页
软件工程 通讯录查询系统.docx_第2页
第2页 / 共33页
软件工程 通讯录查询系统.docx_第3页
第3页 / 共33页
软件工程 通讯录查询系统.docx_第4页
第4页 / 共33页
软件工程 通讯录查询系统.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

软件工程 通讯录查询系统.docx

《软件工程 通讯录查询系统.docx》由会员分享,可在线阅读,更多相关《软件工程 通讯录查询系统.docx(33页珍藏版)》请在冰豆网上搜索。

软件工程 通讯录查询系统.docx

软件工程通讯录查询系统

《数据结构》课程设计报告

计算机学院

软件工程专业

题目:

通信录查询系统(查找应用)

班级:

软件102班第11组

组长:

姓名:

李伟学号:

22

组员:

姓名:

李呢学号:

19

姓名:

李强学号:

21

指导老师:

xxx

日期:

2011年12月30日

程序设计书目录

一、程序设计目标

二、问题描述

三、需求分析(说明课程设计的任务)

四、概要设计(说明课程设计中用到的抽象数据类型的定义、主程序的流程以及各程序模块之间的调用关系等)

五、详细设计(实现程序模块的具体算法)

六、软件说明书(给出软件应如何使用,使用时的注意事项)

七、源程序清单(要求400行以上,要有注释说明)

八、测试报告(调试过程中遇到的问题及解决方法,并列出测试结果,包括输入和输出)

九、课程设计总结

一、程序设计目标

通过本次课设进一步的了解哈希表函数及哈希表等有关概念,掌握哈希表查找的过程及方法。

复习巩固大一时期学过的c语言知识。

进一步加深对c语言、数据结构、离散数学等基础技能的理解和掌握。

让我们有一个既动手又动脑,独立实践的机会,可以让我们将课本上的理论知识和实际邮寄的结合起来,锻炼我们的分析解决实际问题的能力。

提高我们实践编程能力。

通过本项课程设计,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!

更加了解了c语言的好处和其可用性!

同时增加了同学之间的团队合作精神!

更加也体会到以后在工作中团队合作的重要性和必要性!

通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。

为后续各门计算机课程的学习和毕业设计打下坚实基础。

二、问题描述

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

(1)设每个记录有下列数据项:

电话号码、用户名、地址;

(2)从键盘输入各记录,分别以电话号码为关键字建立散列表;

(3)采用二次探测再散列法解决冲突;

(4)查找并显示给定电话号码的记录;

(5)通讯录信息文件保存;

(6)要求人机界面友好,使用图形化界面;

三、需求分析

一.查询:

用户有一个电话号码,但不知道此电话号码是谁的,则需要输入号码来查询该号码是不是此通讯录中已记录的人的号码,若是即显示该号码及姓名、所在地,若不是则显示“无记录”。

进入主菜单界面,输入4,进入通讯录查询模块。

输入你想要搜索通讯人的电话号码。

屏幕输出所搜通讯人的先关信息。

二.通讯录信息添加:

若要向通讯录中添加新号码,也分两种情况:

1若该通讯录是新的,既没有任何通讯记录的,则直接往里添加,需先输入姓名,随即输入号码和所在地,用于存储。

2若通讯录不是空的,再添加新号码时则需在最后一个号码后面进行添加(输入姓名、电话号码及所在地),以此类推。

进入主菜单,输入1,进入通讯录信息添加模块。

按照要求依次输入姓名、电话号码、住址。

三.通讯录信息删除:

若要对通讯录中的内容进行删除:

然后输入所要删除的号码进行删除

删除成功。

出现提示信息。

按任意键回到主菜单。

四、概要设计

对功能键相对应的函数分别对各个函数在程序中进行定义如下:

voidMenu()

voidCreate()

voidAppend()

voidCreateHash()

voidFind()

voidDelete()

voidAlter()

voidList()

voidSave()

voidLoad()

然后根据各功能键的选择主函数分别调用功能键相对应的函数来实现通讯录的查询系统。

五、详细设计

1、定义结构体变量

typedefstructpeople//记录

{

NAname;

NAtel;//关键字

NAadd;

}Record;//查找表中记录类型

typedefstruct//建立哈希表

{

Record*elem[HASHSIZE];//数据元素存储基址

intcount;//当前数据元素个数

intsize;//当前容量

}HashTable;

2、定义显示函数

voidMenu()

3、定义建立时间的函数

voidbenGetTime()

4、定义创建新的通讯录并添加信息的函数

voidCreate(Record*a)

5、定义关键字比较函数

Statuseq(NAx,NAy)

6、定义添加信息函数

voidAppend(Record*a)

7、定义显示通讯录中所有信息函数

voidList(Record*a)

8、定义哈希函数

intHash(NAstr)

9、定义冲突处理函数

Statuscollision(intp,int&c)

10、定义建立散列表的函数

voidCreateHash(HashTable*H,Record*a)

11、定义通讯录查找的函数

voidFind(HashTable*H,int&c)

12、定义修改信息的函数

voidAlter(HashTable*H,int&c)

13、定义删除信息的函数

voidDelete(HashTable*H,int&c)

14、定义保存信息到指定文件的函数

voidSave(HashTable*H)

15、定义从指定文件中读取信息的函数

voidLoad()

16、定义主函数

intmain(intargc,char*argv[])

{

system("colorFO");

system("CLS");

intc,flag=1;

HashTable*H;

H=(HashTable*)malloc(LEN);

for(inti=0;i

H->elem[i]=NULL;

H->size=HASHSIZE;

H->count=0;

Recorda[MAXSIZE];

donghua();

while

(1)

{

face();

printf("请输入一个任务选项>>>");

printf("\n");

intnum;

scanf("%d",&num);getchar();

switch(num){

case1:

Create(a);break;

case2:

Append(a);break;

case3:

CreateHash(H,a);break;

case4:

c=0;Find(H,c);break;

case5:

c=0;Delete(H,c);break;

case6:

c=0;Alter(H,c);break;

case7:

List(a);break;

case8:

Save(H);break;

case9:

Load();break;

case0:

Quit();return0;break;

case10:

;;break;

default:

printf("你输错了,请重新输入!

");

printf("\n");}

system("CLS");

}

return0;

}

六、软件说明书

双击程序,程序运行后,进入通信录查询系统菜单的操作界面,然后采用键盘进行操作。

各功能键的选择如下:

1、创建新的通讯录并写入新的信息

2、添加某人的信息

3、以电话号码建立散列表

4、查找并显示给定电话号码的记录

5、删除某人的信息

6、修改某人的信息

7、显示通讯录中所有记录

8、保存通讯录所有记录到指定文件

9、从指定文件中读取通讯录中的记录

0、退出选单

选择1,建立新的通讯录,通讯录创建成功,按Enter键进入添加信息界面,界面会出现

根据系统提示进行相应的添写,添加成功之后,按Enter键返回主菜单。

选择2,在通讯录的末尾写入新的信息,与上诉添加信息操作相同。

同样按Enter键返回主菜单。

选择3,会立即调用冲突处理函数以及建立散列表,界面上会显示冲突次数,哈希表容量和当前储存记录的个数,按Enter键返回主菜单。

3功能键必须在4、5、6功能键之前选择,才能使4、5、6功能键派上用场。

选择4,查找某人信息,写入查找的电话号码,如果通讯录中有则会出现查找成功否则出现此人不存在,查找不成功。

按Enter键返回主菜单。

选择5,删除某人信息,写入删除的电话号码,如果通讯录中有则会出现删除成功否则出现此人不存在,删除不成功。

按Enter键返回主菜单。

选择6,修改某人信息,写入修改的电话号码,通过查找函数找到要修改的信息,在对找的的信息进行修改,如果通讯录中有则会出现原信息让用户输入修改后的信息,根据系统的提示输入修改后的信息,按Enter键会出现修改成功,否则出现此人不存在,修改不成功。

按Enter键返回主菜单。

选择7,界面会输出全部成员的信息。

按Enter键返回主菜单。

选择8,利用存盘函数保存数据到指定文件,界面会出现保存成功,按Enter键返回主菜单。

选择9,载入存储过的电话、姓名、地址,界面会出现指定文件所存储的所有信息。

按Enter键返回主菜单。

选择0,显示再见,按Enter键退出系统。

七、源程序清单

#include

#include

#include

#include

#include

#include

usingnamespacestd;

#defineMAXSIZE20//电话薄记录数量

#defineMAX_SIZE20//人名的最大长度

#defineHASHSIZE60//定义表长

#defineSUCCESS1

#defineUNSUCCESS-1

#defineLENsizeof(HashTable)//为建立的对象定义长度

typedefintStatus;//为现有类型添加一个同义字

typedefcharNA[MAX_SIZE];//typedef掩饰数组类型

staticintm=0;

typedefstructpeople//记录

{

NAname;

NAtel;//关键字

NAadd;

}Record;//查找表中记录类型

typedefstruct//建立哈希表

{

Record*elem[HASHSIZE];//数据元素存储基址

intcount;//当前数据元素个数

intsize;//当前容量

}HashTable;

inti;

voidMenu()

{

printf("######################################################################\n");

printf("##\t\t\t――――――\t\t\t##\n");

printf("#\t\t\t丨1.创建丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨2.写入丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨3.建表丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨4.查找丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨5.删除丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨6.修改丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨7.查看丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨8.保存丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨9.读取丨#\n");

printf("#\t\t\t――――――#\n");

printf("#\t\t\t丨0.退出丨#\n");

printf("##\t\t\t――――――##\n");

printf("######################################################################\n");

}

voidbenGetTime()//建立时间函数

{

SYSTEMTIMEsys;

GetLocalTime(&sys);

printf("%4d/%02d/%02d%02d:

%02d:

%02d.%03d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds);

}

StatusNUM_BER;//记录的个数

StatusNUM_BER1;

voidCreate(Record*a)//创建新的通讯录

{

system("CLS");//调用DOS命令CLS能够清屏

FILE*fp1,*fp2;

if((fp1=fopen("record.txt","r"))!

=NULL)//打开文件

{

fclose(fp1);//关闭文件

}

else

{

fp2=fopen("record.txt","w");//如果不存在record.txt就创建一个

fclose(fp2);

}

printf("\n");

printf("#############################################################\n");

printf("====================→创建成功←===================\n");

printf("#############################################################\n");

printf("\n");

printf("◇◆请按ENTER进入添加通讯信息菜单◇◆\n");

getchar();

system("CLS");

system("CLS");//调用DOS命令CLS能够清屏

printf("#############################################################\n");

printf("====================→用户信息记录表←===================\n");

printf("#############################################################\n");

printf("输入要添加的个数:

\n");

scanf("%d",&NUM_BER);

for(i=0;i

{

printf("请输入第%d个记录的用户名:

\n",i+1);

scanf("%s",a[i].name);

printf("请输入%d个记录的电话号码:

\n",i+1);

scanf("%s",a[i].tel);

printf("请输入第%d个记录的地址:

\n",i+1);

scanf("%s",a[i].add);

}

getchar();

printf("####################################\n");

printf("添加成功!

!

!

\n");

benGetTime();

printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

printf("◇◆请按ENTER返回功能操作菜单◇◆\n");

printf("####################################\n");

getchar();

}

Statuseq(NAx,NAy)//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS

{

if(strcmp(x,y)==0)

{

returnSUCCESS;

}

elsereturnUNSUCCESS;

}

voidAppend(Record*a)//键盘输入各人的信息

{

system("CLS");//调用DOS命令CLS能够清屏

printf("#############################################################\n");

printf("====================→用户信息记录表←===================\n");

printf("#############################################################\n");

printf("输入要添加的个数:

\n");

scanf("%d",&NUM_BER1);

intj=i;

for(i;i

{

printf("请输入第%d个记录的用户名:

\n",i+1);

scanf("%s",a[i].name);

printf("请输入%d个记录的电话号码:

\n",i+1);

scanf("%s",a[i].tel);

printf("请输入第%d个记录的地址:

\n",i+1);

scanf("%s",a[i].add);

}

getchar();

printf("####################################\n");

printf("添加成功!

!

!

\n");

benGetTime();

printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

printf("◇◆请按ENTER返回功能操作菜单◇◆\n");

printf("####################################\n");

getchar();

}

voidList(Record*a)//显示通讯录中所有记录

{

Record*p;

p=a;

inti;

system("CLS");//调用DOS命令CLS能够清屏

printf("#############################################################\n");

printf("====================→用户信息记录表←===================\n");

printf("#############################################################\n");

if(a!

=NULL)

{

printf("\n\n姓名\t电话号\t\t地址\n");

printf("_____________________________________________________\n");

for(i=0;i

{

printf("%s\t%s\t\t%s\n",a[i].name,a[i].tel,a[i].add);

printf("_____________________________________________________\n");

}

}

else

{

printf("对不起!

!

没有任何联系人记录!

!

\n\n");

printf("=============================================================\n");

}

benGetTime();

printf("#################################\n");

printf("◇◆请按ENTER返回功能操作菜单◇◆\n");

printf("#################################\n");

getchar();

}

intHash(NAstr)//哈希函数

{

system("CLS");//调用DOS命令CLS能够清屏

longn;

intm;

n=atoi(str);//把字符串转换成整型数.

m=n%HASHSIZE;//用除留余数法构造哈希函数

returnm;//并返回模值

}

Statuscollision(intp,int&c)//冲突处理函数,采用二次探测再散列法解决冲突

{

inti,q;

i=c/2+1;

while(i

{

if(c%2==0)

{

c++;

q=(p+i*i)%HASHSIZE;

if(q>=0)

{

returnq;

}

else

{

i=c/2+1;

}

}

else

{

q=(p-i*i)%HASHSIZE;

c++;

if(q>=0)

{

returnq;

}

else

{

i=c/2+1;

}

}

}

returnUNSUCCESS;

}

voidCreateHash(HashTable*H,Record*a)//建表,以电话号码为关键字,建立相应的散列表

{

system("CLS");//调用DOS命令CLS能够清屏

inti,p=-1,c,pp;

for(i=0;i

{

c=0;

p=Hash(a[i].tel);

pp=p;

while(H->elem[pp]!

=NULL)

{

pp=collision(p,c);//若哈希地址冲突,进行冲突处理

if(pp<0)

{

printf("#################################

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

当前位置:首页 > 高等教育 > 军事

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

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