通讯录管理系统课程设计报告.docx
《通讯录管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
通讯录管理系统课程设计报告
通讯录管理系统
一、目的
随着信息科技高速的发展,计算机的使用也越来越广泛,它渐渐的成为在人们生活中占有重要位置的工具,给人们的生活带来了极大便利和帮助,它帮助人们处理繁琐复杂的工作,可以帮人们高效的处理和存储信息。
在以前,科技不发达,好多事情只能通过人力来完成,对于通讯录人们只能手工管理,手写记录、查找,给人们带来很大的不便。
而随着信息技术的发展,特别是计算机的普及,人们希望能让机器代替人力来解决一些实际问题,开发通讯录管理系统,可以便于人们对通讯录的联系人进行管理,方便日常生活。
该报告主要介绍通讯录管理系统的设计与实现,主要讲述如何开发通讯录管理系统,以及该系统一些模块功能的实现。
二、需求分析
本系统为简单的通讯录管理系统,应具备以下功能:
(1)输入相关数据,创建一个新联系人信息(姓名、性别、地址、电话、QQ、生日)。
(2)按姓名/电话号码查询某个通讯者的信息。
(3)按姓名/电话号码删除某个通讯者的信息。
(4)输出显示所有通讯者的信息。
(5)清空联系人信息。
(6)按姓名/电话号码查找修改某联系人的信息。
三、概要设计
1、本程序包含的模块
(1)主程序模块
Main(){
通讯录链表定义及初始化;
根据用户输入选择调用功能模块;
}
(2)功能模块—实现对通讯录链表的操作
主函数调用功能函数实现对通讯录链表的增、删、改、查。
2、链表的定义及功能函数的抽象数据类型定义
(1)链表的定义
typedefstructnode
{
charname[MAXLEN];
charsex;
intnumber;/*number在头结点被用来存放链表的长度,所以定义为int型*/
charaddress[MAXLEN];
intQQnum;
charbirth[MAXLEN];
structnode*next;/*指向下一节点的指针*/
}AddressNode;/*结构体类型范例*/
typedefstructnode*AddressList;/*结构体指针类型范例*/
(2)功能函数的抽象数据类型定义
voidPrintAddressNode(AddressListL);/*打印当前工作指针指向的节点的数据*/
voidPrintList(AddressListL);/*打印当前链表内所有节点的数据*/
intGetElemByNum(AddressListL,intnumber);/*按号码查找节点*/
intGetElemByName(AddressListL,constchar*name);/*按名字查找结点*/
AddressListCreateEmptyList();/*创建一个空链表*/
voidAddNode(AddressListL,AddressNoden);/*插入一个节点,插入位置为头结点之后*/
voidInputNode(AddressListL);/*用户输入数据,然后插入链表内*/
intDeleteElemByNum(AddressListL,intnumber);/*删除号码为number的节点*/
intDeleteElemByName(AddressListL,constchar*name);/*删除名字为name的节点*/
voidClearList(AddressListL);/*清空链表*/
voidSelectBySex(AddressListL,charsex);/*筛选链表内所有男/女的数据*/
intChangeByName(AddressListL,constchar*name);/*修改名字为name的节点*/
intChangeByNum(AddressListL,intnumber);/*修改号码为number的节点*/
/*menu.c*/
voidmenu_start();/*初始菜单*/
voidmenu_delete(AddressListL)/*选择删除联系人后的次级界面*/;
voidmenu_getelem(AddressListL);/*选择查找联系人后的次级界面*/
voidmenu_change(AddressListL);/*选择修改联系人后的次级界面*/
/*main.c*/
AddressListInitListWithData(AddressListL);/*给通讯录设置一些初始数据*/
2、主程序流程图
四、详细设计
本程序总共有4个文件,一个.h头文件,三个.c资源文件
1、my.h文件
#ifndef__MY_H__
#define__MY_H__
#include
#include
#include
#defineMAXLEN128
#defineOK1
#defineERROR0
typedefstructnode
{
charname[MAXLEN];
charsex;
intnumber;
charaddress[MAXLEN];
intQQnum;
charbirth[MAXLEN];
structnode*next;
}AddressNode;
typedefstructnode*AddressList;
/*函数声明部分*/
/*fun.c*/
voidPrintAddressNode(AddressListL);
voidPrintList(AddressListL);
intGetElemByNum(AddressListL,intnumber);
intGetElemByName(AddressListL,constchar*name);
AddressListCreateEmptyList();
voidAddNode(AddressListL,AddressNoden);
voidInputNode(AddressListL);
intDeleteElemByNum(AddressListL,intnumber);
intDeleteElemByName(AddressListL,constchar*name);
voidClearList(AddressListL);
intChangeByName(AddressListL,constchar*name);
intChangeByNum(AddressListL,intnumber);
/*menu.c*/
voidmenu_start();
voidmenu_delete(AddressListL);
voidmenu_getelem(AddressListL);
voidmenu_change(AddressListL);
/*main.c*/
AddressListInitListWithData(AddressListL);
#endif
2、main.c文件
#include"my.h"
/**************
*函数:
InitListWithData()
*参数:
链表头结点L
*返回值:
链表头结点
*功能:
给通讯录设置一些初始数据
**************/
AddressListInitListWithData(AddressListL)
{
AddressNoden;
strcpy(n.name,"Li");
n.sex='m';
n.number=10010;
strcpy(n.address,"武汉");
n.QQnum=123456789;
strcpy(n.birth,"1996.9.1");
AddNode(L,n);
strcpy(n.name,"Liu");
n.sex='f';
n.number=11000;
strcpy(n.address,"上海");
n.QQnum=78563491;
strcpy(n.birth,"1996.4.9");
AddNode(L,n);
strcpy(n.name,"Shi");
n.sex='m';
n.number=10000;
strcpy(n.address,"深圳");
n.QQnum=12389769;
strcpy(n.birth,"1995.1.23");
AddNode(L,n);
strcpy(n.name,"NiNa");
n.sex='f';
n.number=10001;
strcpy(n.address,"北京");
n.QQnum=18967543;
strcpy(n.birth,"1994.10.19");
AddNode(L,n);
strcpy(n.name,"Lucy");
n.sex='f';
n.number=10100;
strcpy(n.address,"南京");
n.QQnum=129879889;
strcpy(n.birth,"1996.8.7");
AddNode(L,n);
returnL;
}
intmain()
{
intselect;
AddressListphone=CreateEmptyList();
phone=InitListWithData(phone);
do
{
system("cls");//清屏
menu_start();
scanf("%d",&select);
getchar();
if(select==0)
{
printf("欢迎下次使用!
\n");
break;
}
switch(select)
{
case1:
PrintList(phone);
break;
case2:
InputNode(phone);
break;
case3:
menu_delete(phone);
break;
case4:
menu_getelem(phone);
break;
case5:
ClearList(phone);
break;
case6:
menu_change(phone);
break;
default:
printf("输入非法数据,请重新输入!
\n");
}
printf("请按回车继续……\n");
getchar();
}while(select!
=0);
return0;
}
3、menu.c文件
#include"my.h"
/**************
*函数:
menu_start()
*参数:
无
*返回值:
无
*功能:
起始界面
**************/
voidmenu_start()
{
printf("****************************\n");
printf("欢迎使用简易通讯录!
\n");
printf("****************************\n");
printf("1:
输出全部联系人信息\n");
printf("2:
插入新的联系人\n");
printf("3:
删除一个联系人\n");
printf("4:
查找某个联系人\n");
printf("5:
清空联系人信息\n");
printf("6:
修改某个联系人\n");
printf("0:
退出\n");
printf("****************************\n");
printf("请选择要执行的操作:
");
}
/**************
*函数:
menu_delete()
*参数:
链表头结点L
*返回值:
无
*功能:
选择删除联系人后的次级界面
**************/
voidmenu_delete(AddressListL)
{
intselect,number;
charname[MAXLEN];
printf("****************************\n");
printf("请输入删除数据的方式:
\n");
printf("1:
按姓名\n");
printf("2:
按号码\n");
printf("0:
返回\n");
printf("****************************\n");
do
{
printf("请选择:
");
scanf("%d",&select);
getchar();
if(select!
=1&&select!
=2&&select!
=0)
printf("输入非法数据,请重新输入!
\n");
}while(select!
=1&&select!
=2&&select!
=0);
switch(select)
{
case1:
printf("请输入姓名:
");
scanf("%[^\n]",name);
getchar();
DeleteElemByName(L,name);
break;
case2:
printf("请输入号码:
");
scanf("%d",&number);
getchar();
DeleteElemByNum(L,number);
break;
case0:
printf("即将返回上级目录,");
break;
}
}
/**************
*函数:
menu_getelem()
*参数:
链表头结点L
*返回值:
无
*功能:
选择查找联系人后的次级界面
**************/
voidmenu_getelem(AddressListL)
{
intselect,number;
charname[MAXLEN];
printf("****************************\n");
printf("请输入查找联系人的方式:
\n");
printf("1:
按姓名\n");
printf("2:
按号码\n");
printf("0:
返回\n");
printf("****************************\n");
do
{
printf("请选择:
");
scanf("%d",&select);
getchar();
if(select!
=1&&select!
=2&&select!
=0)
printf("输入非法数据,请重新输入!
\n");
}while(select!
=1&&select!
=2&&select!
=0);
switch(select)
{
case1:
printf("请输入姓名:
");
scanf("%[^\n]",name);
getchar();
GetElemByName(L,name);
break;
case2:
printf("请输入号码:
");
scanf("%d",&number);
getchar();
GetElemByNum(L,number);
break;
case0:
printf("即将返回上级目录,");
break;
}
}
/**************
*函数:
menu_change()
*参数:
链表头结点L
*返回值:
无
*功能:
选择修改联系人后的次级界面
**************/
voidmenu_change(AddressListL)
{
intselect,number;
charname[MAXLEN];
printf("****************************\n");
printf("请输入查询修改数据的方式:
\n");
printf("1:
按姓名\n");
printf("2:
按号码\n");
printf("0:
返回\n");
printf("****************************\n");
do
{
printf("请选择:
");
scanf("%d",&select);
getchar();
if(select!
=1&&select!
=2&&select!
=0)
printf("输入非法数据,请重新输入!
\n");
}while(select!
=1&&select!
=2&&select!
=0);
switch(select)
{
case1:
printf("请输入姓名:
");
scanf("%[^\n]",name);
getchar();
ChangeByName(L,name);
break;
case2:
printf("请输入号码:
");
scanf("%d",&number);
getchar();
ChangeByNum(L,number);
break;
case0:
printf("即将返回上级目录,");
break;
}
}
4、fun.c文件
#include"my.h"
/**************
*函数:
PrintAddressNode()
*参数:
当前工作指针p
*返回值:
无
*功能:
打印当前工作指针指向的节点的数据
**************/
voidPrintAddressNode(AddressListp)
{
printf("姓名:
%s\n",p->name);
printf("性别:
%s\n",p->sex=='m'?
"男":
"女");
printf("电话号码:
%d\n",p->number);
printf("地址:
%s\n",p->address);
printf("QQ:
%d\n",p->QQnum);
printf("生日:
%s\n",p->birth);
}
/**************
*函数:
PrintList()
*参数:
链表头结点L
*返回值:
无
*功能:
打印当前链表内所有节点的数据
**************/
voidPrintList(AddressListL)//遍历打印整个链表
{
AddressListp=L->next;
if(!
p)
printf("通讯录为空!
\n");
else
{
printf("共%d个人\n",L->number);
while(p)
{
printf("****************************\n");
PrintAddressNode(p);
p=p->next;
}
printf("****************************\n");
}
}
/**************
*函数:
GetElemByNum()
*参数:
链表头结点L,待查找的号码number
*返回值:
成功OK/失败ERROR
*功能:
按号码查找节点
**************/
intGetElemByNum(AddressListL,intnumber)
{
AddressListp;
p=L->next;
while(p&&p->number!
=number)
{
p=p->next;//让p指向下一个节点
}
if(!
p)
{
printf("没有%d号码的记录,请核对后查阅\n",number);
returnERROR;
}
else
{
printf("找到记录:
\n");
PrintAddressNode(p);
returnOK;
}
}
/**************
*函数:
GetElemByName()
*参数:
链表头结点L,待查找的姓名name
*返回值:
成功OK/失败ERROR
*功能:
按姓名查找节点
**************/
intGetElemByName(AddressListL,constchar*name)
{
AddressListp;
p=L->next;
while(p&&strcmp(p->name,name))
{
p=p->next;//让p指向下一个节点
}
if(!
p)
{
printf("没有%s的记录,请核对后查阅\n",name);
returnERROR;
}
else
{
printf("找到记录:
\n");
PrintAddressNode(p);
returnOK;
}
}
/**************
*函数:
CreateEmptyList()
*参数:
无
*返回值:
链表头结点
*功能:
创建一个空链表
**************/
AddressListCreateEmptyList()//创建一个空表
{
AddressListp;
p=(AddressList)malloc(sizeof(AddressNode));
if(p==NULL)
{
perror("CreateEmptyAddressListerror");
exit(0);
}
p->number=0;//在头结点中的num存储的是链表的整个长度
p->next=NULL;
returnp;
}
/**************
*函数:
AddNode()
*参数:
链表头结点L,保存新节点数据的结构体n
*返回值:
无
*功能:
插入一个节点,插入位置为头结点之后
**************/
voidAddNode(AddressListL,AddressNoden)//插入新节点
{
AddressListp;
if((p=(AddressList)malloc(sizeof(AddressNode)))==NULL)
{
printf("插入新节点失败!
\n");
}
strcpy(p->na