全功能版通讯录c语言 设计说明.docx
《全功能版通讯录c语言 设计说明.docx》由会员分享,可在线阅读,更多相关《全功能版通讯录c语言 设计说明.docx(12页珍藏版)》请在冰点文库上搜索。
![全功能版通讯录c语言 设计说明.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/1e3a2634-4991-401d-acf9-ec5ac6986e60/1e3a2634-4991-401d-acf9-ec5ac6986e601.gif)
全功能版通讯录c语言设计说明
通讯录管理系统设计说明书
一、需求分析
本通讯录是一款具有基本通讯信息管理功能的系统。
包括基本添加,修改,删除,查询和输出等功能。
其中联系组是为了更好地管理联系人信息,如常用的组有亲戚,家人,朋友,同学等。
用户添加的信息存储到文件当中,本系统的数据存储文件包括group.dat和linkman.dat,其中group.dat存储组信息;而linkman.dat则存储联系人的信息。
用户登陆系统后,根据需要,选择操作类型。
系统一启动,便将相关数据文件装载进内存,如果数据文件不存在,系统将会创建新的数据文件。
并将数据文件内的记录存放在链表数据结构类型中,接下来用户所有的操作,都是对链表的操作。
当用户退出系统时,系统将自动将链表的信息存进数据文件。
本系统中包含两个链表:
group链表和linkman链表,分别对应group,dat
和linkman,dat两个数据文件。
1、组信息管理模块:
◎添加新组信息:
当用户添加一个新组时,这个新组将被添加到group.dat文件的末尾,如果添加的组已存在则返回出错信息。
◎修改已有组信息:
用户首先输入所要修改的联系组,然后系统查询该联系组存不存在。
若存在,则要求用户输入新的信息,并进行替换;若不存在,则返回错误信息。
◎删除已有组:
用户首先输入所要删除的组,然后系统查询该组存不存在。
如果存在,则先删除该组下的所有联系人的信息,再删除该组;如果所要删除的信息不存在,则返回错误信息。
◎删除所有已有组信息:
该操作没有输入值。
如果原来group.dat文件中没有联系组,返回错误信息;否则,删除所有联系组,同时删除各个组下的联系人信息。
◎组查询功能:
按用户输入的查询条件,在group.dat文件中查询相关信息。
若存在
符合条件的组,则输出相应的组信息;若不存在,则返回出错信息。
◎输出所有组信息:
将group.dat中所有组全部输出来。
2、联系人信息管理模块:
◎添加联系人:
当用户添加一个新联系人时,这个联系人的信息将被添加到group.dat文件的末尾,若添加的联系人已存在,则返回出错信息。
添加一个联系人时,他所属的组成员个数同时增加1。
◎修改联系人:
用户首先输入所要修改的联系人,然后系统查询该联系人存不存在。
若存在,则要求用户输入新的信息,并进行替换;若不存在,则返回错误信息。
◎删除联系人:
用户首先输入所要删除的联系人,然后系统查询该联系人存不存在。
如果存在,则删除,并返回相关信息;如果所要删除的信息不存在,则返回错误信息。
删除一个联系人时,他所属的组成员个数同时减少1。
◎删除所有联系人:
该操作没有输入值。
如果原来linkman.dat文件中没有联系联系人,返回错误信息;否则,删除所有联系人信息。
◎联系人查询功能:
按用户输入的查询条件,在linkman.dat文件中查询相关信息。
若存在符合条件的联系人,则输出相应的联系人信息;若不存在,则返回出错信息。
而且提供不同种类的查询,如:
按联系人姓名来查询,按联系人电话来查询,按联系人所在的组来查询。
◎输出所有联系人信息:
将所有联系人信息输出。
二、概要设计
1、抽象数据类型定义:
/***********************存储结构设计*****************************/
/**************节点类型设计***************/
typedefstruct{
chargroup_num[10];//组号
chargroup_name[20];//组名称
intmem_num;//组内联系人个数
}GroupType;//存放一条组信息
typedefstruct{
charmem_num[10];//联系人号
charmem_name[20];//联系人名称
charmem_sex[2];//联系人性别
charmem_phone[20];//联系人电话
charmem_addr[50];//联系人地址
charmem_group_num[10];//联系人所在组的组号
}LinkmanType;
/*************线性表存储结构设计**************/
typedefstructgroupnote{
GroupTypegroupdata;//组数据信息
structgroupnote*next;
}*GroupNote;//组表节点
typedefstruct{
GroupNotehead,tail;//分别指向组信息链表的头结点和尾节点
intlenth;//链表中元素个数
}GroupList;
typedefstructlinkmannote{
LinkmanTypelinkmandata;
structlinkmannote*next;
}*LinkmanNote;//联系人表节点
typedefstruct{
LinkmanNotehead,tail;//分别指向联系人信息链表的头结点和尾节点
intlenth;//链表中元素个数
}LinkmanList;
/*************基本操作列表******************/
/*************组管理模块功能函数**************/
◎voidaddGroup();//操作类型号是1
◎voiddeleteCroup();//操作类型号是2
◎voiddeleteAllGroup();//操作类型号是3
◎voidselectGroup();//操作类型号是4
◎voidprintAllGroup();//操作类型号是5
/*************联系人模块功能函数**************/
◎voidaddLinkman();//操作类型号是6
◎voidupdateLinkman();//操作类型号是7
◎voiddeleteLinkman();//操作类型号是8
◎voiddeleteAllLinkman();//操作类型号是9
◎voidselectMenu();//操作类型号是10
○selectByName();//查询子菜单下的类型号1
○selectByPhone();//子菜单下的类型号2
○selectByGroup();//子菜单下的类型号3
◎voidprintAllLinkman();//操作类型号是12
/*************系统基本操作**************/
◎voidsystemMenu();//系统菜单
◎voidreadFromFile();//将数据文件导入内存并存储在单链表中,系统一开始运行时,就将数据文件读入内存。
◎voidwriteToFile();//将内存单链表中的数据写入数据文件
◎voidexitSystem();//退出并保存,操作类型号是0,退出系统时自动将链表中的数据写入数据文件。
◎GroupNoteselectGroupPub(char*name);/*组查询的公共函数*/
◎LinkmanNoteselectLinkmanPub(char*name);/*联系人查询的公共函数*/
◎voiddeleteByGroup(char*groupname);/*删除某一组下的所有联系人信息*/
◎voidprintLinkman(LinkmanNoteln);/*输出ln节点里联系人的信息*/
三、详细设计
详细设计中主要用了PDA(问题分析图)来进行设计。
考虑到链表基本操作书上都有,所以这里凡是涉及到链表的基本操作,都没有给出,只轻轻带过。
到代码实现部分再具体实现这些功能。
/************************系统功能模块详细设计*************************/
1、系统菜单函数systemMenu()的PAD图:
2、查询菜单函数selectMenu()的PDA图:
3、加载数据文件函数readFromFile():
加载数据文件时,首先判断数据文件存不存在。
如果不存在,输出相关错误信息并返回主菜单;若存在,则打开数据文件group.dat和linkman.dat。
接着,判断数据文件是不是为空。
如果为空,则什么都不做;若不为空,则建立两个链表group和linkman,并循环将group.dat和linkman.dat两个数据文件中的每一条记录分别加载到group和linkman两个链表中。
注意,每读入一条新纪录,则动态开辟一个存储节点,将记录信息读入这个节点,然后将这个节点采用尾插法插入相应链表中。
对应PDA图如下:
4、保存数据函数writeToFile():
将group和linkman两个链表中的所有信息分别存储到group.dat和linkman.dat中。
每存储进一个节点则将对应的节点删除(头删除法),释放存储空间。
由于存储节点时,从链表的首位置依次循环将所有节点都写入数据文件。
对应的PAD图如下:
5、退出系统函数exitSystem():
退出系统,退出时将保存内存中的数据信息。
6、组查询公共函数selectGroupPub(char*name):
/************************组管理功能模块详细设计*************************/
1、添加组函数addGroup():
开辟一个新的结点,提示用户输入要添加的组信息,并判断这个组是否已经存在。
如果存在,返回错误信息;若不存在则将这个节点插入到group链表的尾部。
最后判断用户是否要继续添加。
如果是,则继续完成上述过程;否则,返回主菜单。
2、修改组函数updateGroup():
首先,提示用户输入所要修改的组的组名称。
然后查询,如果组不存在,则输出出错信息并返回主菜单。
否则,提示用户输入新的组信息替换原来的组信息。
2、删除组信息函数deleteGroup():
删除某一个组时,同时将这个组下的所有联系人信息也一并删除,所以进行操作之前,必须要求用户确认。
首先,提示用户输入所要删除的组的组名称。
判断该组存不存在,若不存在,出错并返回;否则,要求用户确认操作,若用户取消操作,则退出;否则,首先在linkman链表中查找该组下的所有联系人,并一一将它们删除,最后从group链表中删除该组。
3、删除所有组信息函数deleteAllGroup():
删除所有组信息时,首先删除所有联系人,再删除所有组。
4、组查询函数selectGroup():
因为组信息不多,所以这里只提供一个查询函数,即按组的名称来查询。
首先,用户输入组名称,系统在group链表中查询,若存在,则输出该组的信息;否则出错返回。
5、输出所有组信息函数printAllGroup():
这个就是将group链表的所有节点信息输出来。
/************************联系人管理功能模块详细设计*************************/
由于addLinkman(),updateLinkman(),deleteLinkman(),deleteAllLinkman(),printAllLinkman()和组管理模块对应功能是基本相同的,所以这里就不再对它们进行详细设计了。
下面主要对查询功能给出详细设计。
1、按名字查询函数selectByName():
首先,用户输入所要查询的联系人姓名。
系统按照联系人姓名在linkman链表中进行查询,找到符合条件的则输出该联系人的所有信息。
否则,输出出错信息。
2、按电话号码查询函数selectByPhone():
首先,用户输入所要查询的电话号码。
系统按照电话号码在linkman链表中进行查询,找到符合条件的则输出该联系人的所有信息。
否则,输出出错信息。
2、按组查询函数selectByGroup():
首先,用户输入所要查询的组的组名称。
系统按照组名称在group链表中查询,如果该组不存在则出错并返回;否则,取得该组的组号,并按照组号在linkman链表中进行查询,找到符合条件的则输出该组下所有联系人的信息。
否则,输出出错信息。
注意:
由于一个组下的联系人可能不止一个,所以,系统在查询联系人信息时应该遍历全表,而不能像上两个函数一样,找到符合条件的信息就可以退出查找了。