通讯录管理系统设计.docx
《通讯录管理系统设计.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统设计.docx(21页珍藏版)》请在冰豆网上搜索。
通讯录管理系统设计
一.需求分析
设计题目:
实现通讯录管理系统
设计要求:
自学C语言中有关链表及外部文件的内容,设计出通讯录管理系统。
要求如下所述:
建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;;
能够提供添加、删除和修改通讯录信息的功能;
能够提供按不同方式查询的功能;如按姓名或年龄、电话等查询;
将通讯录保存在文件中;
能够按表格方式输出通讯录信息。
系统功能需求分析:
由于通讯录涉及到多个不同类型的数据组合成一个有机的整体,故考虑到使用结构体来表述。
又链表能够动态地进行存储分配的一种结构,根据需要开辟新的内存,没有浪费系统的内存资源,故采用链表结构。
由于系统比较复杂,采用模块化方式可以大大减少编译时的困难。
整个程序包括主函数在内共使用了13个函数,分别实现了,创建、查找、删除、存储、读取等功能。
二.概要设计
系统总体设计框架及系统功能模块图:
三.详细设计:
主要功能模块的算法设计及工作流程图:
.创建通讯录:
通过对结构体中各个变量相应的赋值达到创建通讯录的目的。
通过对malloc的应用以及链表的结构可以连续的进行多组通讯录的建立。
N-S流程图:
.插入新条目:
插入一个新的条目可以通过调用创建通讯录时的enter函数即可,加入了读取和保存函数。
N-S流程图:
.删除条目:
利用一个strcmp函数找到应该删除的项,新建两个节点,将删除后的前后两个节点连接起来,使断开的链表连续。
最后使用free()函数达到删除的目的。
N-S流程图:
.查找条目:
利用strcmp函数可以查找到自己想要的条目。
使用了两个函数组合的形式达到了查找的目的。
N-S流程图:
.find():
.search():
.显示条目:
读取存储的文件后,输出第一个节点后,可以利用结构体中链表的特性*next指向下一点,从而很方便将整个链表输出。
N-S流程图:
.保存:
使用fopen,fclose,fwrite等函数可以实现保存文件功能。
N-S流程图:
四.主要源程序代码:
#include
#include
#include
#include
structaddress
{
charnum[30];
charname[50];
charage[10];
charphone[50];
charadd[50];
charemail[50];
structaddress*next;
};
structaddress*head;
inti;
intmenu_select()
{
inta;
charc[20];
printf("\t请选择功能:
\n\n");
printf("\t1.新建并输入通讯录\n");
printf("\t2.添加记录\n");
printf("\t3.按姓名查找通讯地址\n");
printf("\t4.删除一个人的记录\n");
printf("\t5.显示通讯录\n");
printf("\t0.退出\n");
do
{
printf("\t请输入数字选择对应的功能:
");
scanf("%d",&a);
gets(c);
}while(a<0||a>5);
returna;
}
voidinputs(char*prompt,char*s,unsignedcount)
{
charp[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t输入越界了!
\n");
}while(strlen(p)>count);
strcpy(s,p);
}
structaddress*put_in(structaddress*i,structaddress*head)
{
structaddress*pbefore,*p;
if(head==NULL)
{
head=i;
head->next=NULL;
returnhead;
}
p=head;
pbefore=NULL;
while(p)
{
if(strcmp(p->name,i->name)<0)
{
pbefore=p;
p=p->next;
}
else
{
if(p==head)
{
i->next=head;
head=i;
returnhead;
}
pbefore->next=i;
i->next=p;
returnhead;
}
}
pbefore->next=i;
i->next=NULL;
returnhead;
}
voidenter()
{
structaddress*info;
while
(1)
{
info=(structaddress*)malloc(sizeof(structaddress));
if(!
info)
{
printf("\t内存不足!
\n");
return;
}
inputs("\t请输入姓名(输入为空时结束):
",info->name,49);
if(!
*info->name)
{
free(info);
printf("\n\n\t输入通讯记录结束!
\n\n");
return;
}
inputs("\t请输入编号:
",info->num,29);
inputs("\t请输入年龄:
",info->age,9);
inputs("\t请输入电话:
",info->phone,49);
inputs("\t请输入地址:
",info->add,49);
inputs("\t请输入电邮:
",info->email,49);
head=put_in(info,head);
}
}
voidsave()
{
structaddress*info;
FILE*fp;
charfilename[80]="love";
if(head)
{
if(!
(fp=fopen(filename,"wb")))
{
printf("\t发生异常,请重试!
\n");
exit(0);
}
printf("\t正在保存文件!
\n");
info=head;
while(info)
{
fwrite(info,sizeof(structaddress),1,fp);
info=info->next;
}
fclose(fp);
}
else
printf("\t目前没有通讯信息可以保存!
\n\n");
}
voiddisplay(structaddress*info)
{
printf("\t%2d.编号:
%s\n",++i,info->num);
printf("\t姓名:
%s\n",info->name);
printf("\t年龄:
%s\n",info->age);
printf("\t电话:
%s\n",info->phone);
printf("\t地址:
%s\n",info->add);
printf("\t电邮:
%s\n",info->email);
printf("\n");
}
voidload(char*filename)
{
structaddress*info,*pbefore=NULL;
FILE*fp;
while(head)
{
info=head;
head=head->next;
free(info);
}
if(!
(fp=fopen(filename,"rb")))
{
printf("\t发生异常,请重试!
\n");
return;
}
printf("\t正在装入文件,请等待!
\n");
info=(structaddress*)malloc(sizeof(structaddress));
if(!
info)
{
printf("\t内存不足!
\n");
return;
}
head=info;
while(!
feof(fp))
{
if(fread(info,sizeof(structaddress),1,fp)!
=1)
break;
info->next=(structaddress*)malloc(sizeof(structaddress));
if(!
info->next)
{
printf("\t内存不足!
\n");
return;
}
pbefore=info;
info=info->next;
}
pbefore->next=NULL;
free(info);
printf("\t已成功装入文件!
\n\n");
fclose(fp);
}
voidlist()
{
structaddress*info;
charfilename[80]="love";
load(filename);
i=0;
info=head;
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
structaddress*find()
{
structaddress*info;
charfilename[80]="love";
charname[20];
while(head)
{
info=head;
head=head->next;
free(info);
}
load(filename);
info=head;
inputs("\t请输入你想要找的姓名:
",name,19);
while(info)
{
if(!
strcmp(name,info->name))
returninfo;
info=info->next;
}
returnNULL;
}
voidsearch()
{
structaddress*info;
if(info=find())
{
printf("\n\n\t查询结果为:
\n\n");
printf("\t编号:
%s\n",info->num);
printf("\t姓名:
%s\n",info->name);
printf("\t年龄:
%s\n",info->age);
printf("\t电话:
%s\n",info->phone);
printf("\t地址:
%s\n",info->add);
printf("\t电邮:
%s\n",info->email);
printf("\n");
}
else
printf("\t查无此人!
\n\n");
}
structaddress*tell(char*name)
{
structaddress*info;
info=head;
while(info)
{
if(!
strcmp(name,info->name))
returninfo;
info=info->next;
}
returnNULL;
}
voidresave(char*filename)
{
structaddress*info;
FILE*fp;
if(!
(fp=fopen(filename,"wb")))
{
printf("\t发生错误,请重试!
\n");
return;
}
if(head)
{
printf("\t正在更新通讯录数据!
\n");
info=head;
while(info)
{
if(fwrite(info,sizeof(structaddress),1,fp)!
=1)
return;
info=info->next;
}
printf("\t成功更新通讯录!
\n");
fclose(fp);
}
else
printf("\t已经没有了通讯录信息!
\n\n");
}
voiddel()
{
structaddress*info,*pbefore=NULL,*p;
charname[20],filename[80]="love";
load(filename);
if(!
head)return;
inputs("\t请输入要删除的姓名:
",name,19);
info=tell(name);
if(info)
{
p=head;
while(p!
=info)
{
pbefore=p;
p=p->next;
}
if(p==head)
head=head->next;
else
pbefore->next=p->next;
free(info);
resave(filename);
printf("\t已成功删除名字为%s的通讯记录!
\n",name);
}
else
printf("\t查无此人!
\n");
}
voidinsert()
{
charfilename[80]="love";
load(filename);
if(!
head)return;
enter();
resave(filename);
}
voidmain()
{
head=NULL;
structaddress*t=NULL;
while
(1)
{
switch(menu_select())
{
case1:
enter();;save();break;
case2:
insert();break;
case3:
search();break;
case4:
del();break;
case5:
list();break;
case0:
exit(0);break;
while(head)
{
t=head;
head=head->next;
free(t);
}
printf("\t程序已结束!
\n");
exit(0);
}
}
}
五.调试分析:
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
1
请输入姓名(输入为空时结束):
tom
请输入编号:
1
请输入年龄:
19
请输入电话:
12345
请输入地址:
wust
请输入电邮:
123@
正在保存文件!
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
2
正在装入文件,请等待!
已成功装入文件!
请输入姓名(输入为空时结束):
jack
请输入编号:
2
请输入年龄:
20
请输入电话:
56789
请输入地址:
wust
请输入电邮:
234@
正在更新通讯录数据!
成功更新通讯录!
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
5
正在装入文件,请等待!
已成功装入文件!
1.编号:
2
姓名:
jack
年龄:
20
电话:
56789
地址:
wust
电邮:
234@
2.编号:
1
姓名:
tom
年龄:
19
电话:
12345
地址:
wust
电邮:
123@
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
3
正在装入文件,请等待!
已成功装入文件!
请输入你想要找的姓名:
tom
查询结果为:
编号:
1
姓名:
tom
年龄:
19
电话:
12345
地址:
wust
电邮:
123@
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
4
正在装入文件,请等待!
已成功装入文件!
请输入要删除的姓名:
tom
正在更新通讯录数据!
成功更新通讯录!
已成功删除名字为tom的通讯记录!
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
5
正在装入文件,请等待!
已成功装入文件!
1.编号:
2
姓名:
jack
年龄:
20
电话:
56789
地址:
wust
电邮:
234@
请选择功能:
1.新建并输入通讯录
2.添加记录
3.按姓名查找通讯地址
4.删除一个人的记录
5.显示通讯录
0.退出
请输入数字选择对应的功能:
0
六.课程设计小结:
通过对这个课程设计任务的完成,我对C语言的学习有了进一步的提高。
第一次对这种比较大的程序的设计,遇到了许多的困难。
而以前在编写小程序时能够避免的小错误(如分号等)在这次编写中出现了很多。
在设计实现要求的一些功能时碰到了很多的障碍,但最后在同学和朋友的帮助下终于还是实现了。
这也说明编程的能力就是在程序的一个个错误的修正中得到提高,程序亦会随之趋近于完善。
C语言是计算机编程语言中最基础的语言,务必要熟练掌握。
在今后的学习中,也要多多练习编写这样的程序,使自己的能力得到更大的进步。