通讯录管理.docx
《通讯录管理.docx》由会员分享,可在线阅读,更多相关《通讯录管理.docx(36页珍藏版)》请在冰豆网上搜索。
通讯录管理
2通讯录管理
2.1系统分析
2.1.1功能需求分析
通讯录管理系统的开发工具采用VisualC++6.0,主要功能是对联系人的信息进行添加、显示、查找、删除、更新、保存等功能。
系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用对应函数完成系统提供的管理功能。
主要功能需求描述如下:
1.系统主控平台:
允许用户选择想要进行的操作,包括输入添加联系人信息、显示联系人信息、查找联系人信息、删除联系人信息、更新联系人信息、保存到文件和退出系统等。
2.添加联系人信息:
用户根据提示输入联系人的姓名、性别、电话、手机、传真、地址及邮编等。
输入完一条联系人信息,提示用户是否继续输入下一条联系人信息或者继续其他操作。
允许输入多条联系人的信息。
输入完的联系人信息暂时保存在单链表中,等待下一步的操作。
3.显示联系人信息:
在选择了显示联系人信息后,将刚输入的联系人信息从单链表中调出来显示,如果没有数据,则提示无联系人信息。
4.查找联系人信息:
可以根据联系人姓名从单链表中对所有联系人的信息进行查询,如果没有查询到任何信息,系统给出提示信息。
5.删除联系人信息:
首先提示用户输入要删除的联系人的姓名,系统根据用户输入的信息在单链表中查到,如果找到,直接删除该联系人全部信息,如果没找到,系统给出提示信息。
6.修改联系人信息:
首先提示用户输入要进行修改操作的学号,如果单链表中有该学生的信息存在,则提示用户输入要修改的联系人的信息,并将修改结果重新存储在单链表中。
如果没有找到要修改的联系人信息,系统将给出提示。
7.文件保存:
本模块的功能是将单链表中的信息存储到文本文件中。
系统将提示用户输入文本文件名,确认后将单链表中存储的联系人的信息。
8.退出,退出系统。
2.1.2功能模块设计
1.添加联系人(add函数)
首先建立单链表,调用input_person()函数输入联系人信息,将用户输入的联系人信息存储到单链表中,提示用户是否继续输入,用户输入“Y”或“y”,则调用add()函数实现添加联系人的操作。
用户输入“N”或“n”,则返回主菜单界面。
2.显示联系人
将单链表中的联系人信息打印出来,单链表不为空时,循环调用print_person()函数打印每个联系人信息。
3.查找联系人
首先提示用户输入要查找的联系人姓名,根据用户输入的姓名在单链表中利用strcmp()函数逐个查找。
如果找到该联系人,调用print_person()函数显示查找到的联系人信息,如果没找到给出提示信息。
4.删除联系人
首先提示用户输入要删除的联系人姓名,根据用户的输入在单链表中查找该联系人是否存在,如果存在,调用print_person()函数显示该联系人信息,提示用户是否确认删除该联系人,用户输入“Y”或“y”,则删除该联系人,否则提示用户是否继续删除的操作,用户输入“Y”或“y”,则在此调用delete()函数进行删除操作。
5.更新联系人
首先提示用户输入要更新的联系人姓名,根据用户的输入在单链表中查找该联系人是否存在,如果存在,先调用print_person()函数显示该联系人信息,在调用input_person()函数输入新的数据。
最后提示用户是否继续更新的操作,用户输入“Y”或“y”,则在此调用update()函数进行删除操作。
6.保存到文件
首先提示用户输入要保存的文件名,文件将保存在程序目录下。
系统将单链表中的联系人信息保存在刚才输入的文件中,并给出“保存成功”的提示信息。
7.退出系统
将单链表中的数据全部释放掉,防止内存泄露,退出系统。
通讯录管理的功能模块图如图4-1所示。
2.2设计说明
2.2.1预处理
#include/*标准输入输出函数库*/
#include/*标准函数库*/
#defineMAX_NAME11
#defineMAX_SEX3
#defineMAX_BIRTHDAY9
#defineMAX_TEL21
#defineMAX_MOBILE21
#defineMAX_FAX21
#defineMAX_ADDRESS101
#defineMAX_POSTAL_CODE7
2.2.2数据类型定义
定义一个结构体类型_person,使用typedef语句定义一个新类型person,结构体中包括联系人姓名、性别、出生日期、电话、手机、传真、地址及邮编共8个成员。
typedefstruct_person
{
charname[MAX_NAME];/*姓名*/
charsex[MAX_SEX];/*性别*/
charbirthday[MAX_BIRTHDAY];/*出生日期*/
chartel[MAX_TEL];/*电话*/
charmobile[MAX_MOBILE];/*手机*/
charfax[MAX_FAX];/*传真*/
charaddress[MAX_ADDRESS];/*地址*/
charpostal_code[MAX_POSTAL_CODE];/*邮编*/
}person;
定义一个结构体类型_addr_book,使用typedef语句定义一个新类型addr_book,结构体中包括一个存储联系人基本信息的结构体变量per和指向下一个联系人的指针变量。
typedefstruct_addr_book
{
personper;/*联系人基本信息*/
struct_addr_book*next;
}addr_book;
定义一个头结点,将其初始化为空。
addr_book*first=NULL;/*addr_book结构体,链表的头结点,置空*/
2.2.3函数及变量声明
1.主要处理函数声明
函数声明部分包括了主要函数的声明。
主要有添加联系人函数、显示联系人信息函数、查找联系人函数、删除联系人函数、更新联系人函数、保存到文件和退出函数8个功能函数。
voidadd();/*添加联系人函数*/
voidshow();/*显示联系人函数*/
voidsearch();/*查找联系人函数*/
voiddelete();/*删除联系人函数*/
voidupdate();/*更新联系人函数*/
voidsave();/*保存到文件*/
voidquit();/*退出*/
2.辅助函数声明
为了完成系统功能,特编写了一些辅助功能的小函数,包括打印主菜单函数、取链表中最后一个值的函数、打印联系人信息函数和输入联系人信息函数。
下面是这部分函数的声明。
intprint_menu();/*打印主菜单界面*/
addr_book*get_last(addr_book*from);/*取得链表最后一个值*/
voidprint_person(person*p);/*显示一个联系人信息*/
voidinput_person(person*p);/*提示输入一个联系人具体信息*/
3.常量声明
以下是主菜单要显示的字符的声明。
charmenu[]=
"+=====================================================+\n"
"|通讯簿管理系统|\n"
"+-----------------------------------------------------+\n"
"|1添加联系人|\n"
"|2显示所有联系人|\n"
"|3查找联系人|\n"
"|4删除联系人|\n"
"|5更新联系人|\n"
"|6保存联系人|\n"
"|7退出系统|\n"
"+=====================================================+\n";
2.2.4主函数
主函数中,首先调用打印主菜单界面函数print_menu(),打印主菜单,等待用户输入1~7中的任一数值,根据用户的输入在switch语句中选择相应的操作,分别是用户输入1,调用添加联系人函数(add())添加联系人信息,输入2调用显示联系人函数(show())显示已输入的联系人信息,输入3调用查找联系人函数(search())按姓名查找联系人信息,输入4调用删除联系人函数(delete())删除联系人信息,输入5调用更新联系人函数(update())修改联系人信息,输入6调用保存函数(save())保存联系人信息,输入7调用退出函数(quit())退出系统。
程序清单:
intmain()
{
intflg=1;
while(flg)
{
switch(print_menu()){
case1:
add();
break;
case2:
show();
break;
case3:
search();
break;
case4:
delete();
break;
case5:
update();
break;
case6:
save();
break;
case7:
quit();
break;
}
}
}
2.2.5主要函数功能介绍
1.添加新记录
函数名称:
add。
函数功能:
用户在主菜单中选择1的时候调用此函数,用来输入联系人的基本信息。
处理过程:
(1)首先创建一个结构体指针变量new_addr,并将其next指针置空,其余信息使用memset函数置0。
(2)判断单链表是否有数据,如果有,即first==NULL,则置new_addr为头结点;否则调用函数get_last找到单链表中的最后一个结点last,将new_addr连接到最后一个结点last的后面;
(3)调用函数input_person完成一个联系人信息的输入;
(4)提示用户是否继续输入联系人信息,如果用户输入“y”或“Y””,表示继续输入,则调用本函数;否则返回主函数。
程序清单:
voidadd()
{
charinput='N';
addr_book*last=NULL;
addr_book*new_addr=(addr_book*)malloc(sizeof(addr_book));
/*将new_addr中的前addr_book个长度的初值设置为0*/
memset(new_addr,0,sizeof(addr_book));
new_addr->next=NULL;
if(first==NULL)
{
first=new_addr;
}
else
{
last=get_last(first);
last->next=new_addr;
}
input_person(&(new_addr->per));
printf(">继续输入?
(Y继续,N返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
add();
}
}
2.显示联系人信息
函数名称:
show。
函数功能:
用户在主菜单中选择2的时候调用此函数,用来显示联系人的基本信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)在单链表未结束时((p!
=NULL)反复调用函数print_person逐个打印联系人信息;
(3)如果单链表中没有数据,系统给出提示。
(4)返回主函数。
程序清单:
voidshow()
{
inti=0;
addr_book*p=first;
while(p!
=NULL)
{
i++;
printf("*****第%d个联系人***********************************\n",i);
print_person(&(p->per));
p=p->next;
}
if(i==0)
{
printf("没有联系人!
");
}
printf("按任意键返回菜单...");
getchar();
getchar();
}
3.查找联系人信息
函数名称:
search。
函数功能:
用户在主菜单中选择3的时候调用此函数,根据联系人姓名查找相关信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)输入要查找的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果找到,调用函数print_person显示该联系人信息,否则给出提示信息;
(3)提示用户是否查找,如果用户输入“y”或“Y”,表示继续查找,则调用本函数;否则返回主函数。
程序清单:
voidsearch()
{
intcount=0;
charinput='N';
charname[MAX_NAME]={0};
addr_book*p=first;
printf(">请输入要查找的联系人姓名(最大%d个字符):
",MAX_NAME-1);
scanf("%s",name);
while(p!
=NULL)
{
if(strcmp(p->per.name,name)==0)
{
print_person(&(p->per));
count++;
}
p=p->next;
}
if(count==0)
{
printf("没有找到姓名为%s的人.",name);
}
printf("继续查找吗?
(Y继续查找,N返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search();
}
}
4.删除联系人信息
函数名称:
delete。
函数功能:
用户在主菜单中选择4的时候调用此函数,根据联系人姓名删除该联系人相关信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first,定义一个p1,将其置空;
(2)输入要删除的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果没找到,系统给出提示信息,否则进行删除操作:
1)如果要删除的结点p是头结点,则将p->next赋值给first,即first=p->next,直接删除;
2)如果要删除的接点不是头结点,先设置p1指向头结点,然后在循环体中判断p1的后续结点是不是p,借助p1删除结点p,即p1->next=p->next;
3)释放结点p。
(3)提示用户是否删除操作,如果用户输入“y”或“Y”,表示继续删除,调用本函数;否则返回主函数。
程序清单:
voiddelete()
{
intcount=0;
charinput='N';
charname[MAX_NAME]={0};
addr_book*p=first;
addr_book*p1=NULL;
printf(">请输入要删除的联系人姓名(最大%d个字符):
",MAX_NAME-1);
scanf("%s",name);
while(p!
=NULL)
{
if(strcmp(p->per.name,name)==0)
{
print_person(&(p->per));
count++;
break;
}
p=p->next;
}
if(count==0)
{
printf("没有姓名为%s的人.",name);
}
else
{
printf("确定要删除姓名为[%d]的联系人么?
(Y确认,N取消)",name);
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
if(p==first)
{
first=p->next;
}
else
{
p1=first;
while(p1!
=NULL)
{
if(p1->next==p)
{
p1->next=p->next;
break;
}
p1=p1->next;
}
}
free(p);
}
}
printf("继续删除其它联系人吗?
(Y继续删除,N返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
delete();
}
}
5.更新联系人信息
函数名称:
update。
函数功能:
用户在主菜单中选择5的时候调用此函数,输入联系人姓名,更新其相关信息。
处理过程:
(1)首先定义一个指针变量p,指向头结点first;
(2)输入要更新的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果找到,调用函数print_person显示该联系人信息,对于找到的联系人调用函数input_person更新其基本信息,如果没找到给出提示信息;
(3)提示用户是否更新的操作,如果用户输入“y”或“Y”,表示继续更新,则调用本函数;否则返回主函数。
程序清单:
voidupdate()
{
intcount=0;
charinput='N';
charname[MAX_NAME]={0};
addr_book*p=first;
printf(">请输入要更新的联系人姓名(最大%d个字符):
",MAX_NAME-1);
scanf("%s",name);
while(p!
=NULL)
{
if(strcmp(p->per.name,name)==0)
{
print_person(&(p->per));
count++;
break;
}
p=p->next;
}
if(count==0)
{
printf("没有找到姓名为%s的人.",name);
}
else
{
input_person(&(p->per));
}
printf("继续更新其它联系人吗?
(Y继续更新,N返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
update();
}
}
6.保存联系人信息
函数名称:
save。
函数功能:
用户在主菜单中选择6的时候调用此函数,将单链表中的联系人信息保存到文件中。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)输入文件名,在循环体中利用函数fprintf逐个将单链表中的联系人的信息保存到文件中;
(3)否则返回主函数。
程序清单:
voidsave()
{
FILE*fp;
charfile[100];
addr_book*p=first;
printf("请输入文件名:
");
scanf("%s",file);
fp=fopen(file,"w");
while(p!
=NULL)
{
fprintf(fp,"%s,%s,%s,%s,%s,%s,%s,%s\n",
p->per.name,p->per.sex,p->per.birthday,
p->per.tel,p->per.mobile,p->per.fax,p->per.address,p->per.postal_code);
p=p->next;
}
fclose(fp);
printf("保存成功!
\n按任意键返回菜单..\n");
getchar();
getchar();
}
/*退出*/
voidquit()
{
addr_book*pdel=first;
addr_book*p=NULL;
if(pdel==NULL)
{
exit(0);
}
/*如果pdel的next指针不为空,表示有下一条数据*/
/*先将p指向pdel,释放掉pdel,再将p重复给pdel*/
while(pdel->next!
=NULL)
{
p=pdel->next;
free(pdel);
pdel=p;
}
free(pdel);/*如果pdel的next指针为空,表示没有下一条数据,直接删除该结点*/
exit(0);
}
2.2.6辅助函数功能介绍
1.显示主菜单界面
函数名称:
print_menu。
函数功能:
显示主菜单界面。
处理过程:
等待用户输入1~7中的任一数据,如果用户输入的1~7之外的数据,则给出出错的提示信息,提示用户再次输入,直到输入正确为止,并将用户输入的值返回。
程序清单:
intprint_menu()
{
intselected=0;
system("cls");
printf(menu);
printf(">请选择[1-7]:
");
scanf("%d",&selected);
if(selected<1||selected>7)
{
printf("错误的选择!
(请输入1-7).按任意键继续...");
getchar();
getchar();
}
returnselected;
}
2.显示主菜单界面
函数名称:
input_person。
函数功能:
提示用户输入相关联系人信息。
程序清单:
intprint_menu()
{
intselected=0;
system("cls");
printf(menu);
printf(">请选择[1-7]:
");
scanf("%d",&selected);
if(selected<1||selected>7)
{
printf("错误的选择!
(请输入1-7).按任意键继续...");
getchar();
getchar();
}
returnselected;
}
intprint_menu()
{
intselected=0