第4章通讯录管理4.1 功能需求分析通讯录管理系统的开发工具采用Visual C++6.0,主要功能是对联系人的信息进行添加、显示、查找、删除、更新、保存等功能。
系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用对应函数完成系统提供的管理功能。
主要功能需求描述如下:1. 系统主控平台:允许用户选择想要进行的操作,包括输入添加联系人信息、显示联系人信息、查找联系人信息、删除联系人信息、更新联系人信息、保存到文件和退出系统等。
2. 添加联系人信息:用户根据提示输入联系人的姓名、性别、电话、手机、传真、地址及邮编等。
输入完一条联系人信息,提示用户是否继续输入下一条联系人信息或者继续其他操作。
允许输入多条联系人的信息。
输入完的联系人信息暂时保存在单链表中,等待下一步的操作。
3. 显示联系人信息:在选择了显示联系人信息后,将刚输入的联系人信息从单链表中调出来显示,如果没有数据,则提示无联系人信息。
4. 查找联系人信息:可以根据联系人姓名从单链表中对所有联系人的信息进行查询,如果没有查询到任何信息,系统给出提示信息。
5. 删除联系人信息:首先提示用户输入要删除的联系人的姓名,系统根据用户输入的信息在单链表中查到,如果找到,直接删除该联系人全部信息,如果没找到,系统给出提示信息。
6. 修改联系人信息:首先提示用户输入要进行修改操作的学号,如果单链表中有该学生的信息存在,则提示用户输入要修改的联系人的信息,并将修改结果重新存储在单链表中。
如果没有找到要修改的联系人信息,系统将给出提示。
7. 文件保存:本模块的功能是将单链表中的信息存储到文本文件中。
系统将提示用户输入文本文件名,确认后将单链表中存储的联系人的信息。
8. 退出,退出系统。
4.2 总体设计4.2.1 功能模块设计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所示。
图4-1 通讯录管理功能模块图4.2.2 程序处理流程系统的执行应从系统菜单的选择开始,允许用户输入1~7之间的数值来选择要进行的操作,输入其它字符都是无效的,系统会给出出错的提示信息。
若用户输入1,则调用add()函数,进行添加联系人操作;若输入2,则调用show()函数,显示联系人信息;若输入3,则调用search()函数,查找联系人信息;若用户输入4,则调用delete()函数,删除联系人信息;若输入5,则调用update ()函数,更新联系人信息;若输入6,则调用save ()函数,将联系人信息保存到文件;若输入7,则调用quit ()函数,退出系统。
系统的处理流程图如图4-2所示:图4-2 通讯录管理处理流程图4.3详细设计与程序实现4.3.1 预处理#include <stdio.h> /*标准输入输出函数库*/#include <stdlib.h> /*标准函数库*/#define MAX_NAME 11#define MAX_SEX 3#define MAX_BIRTHDAY 9#define MAX_TEL 21#define MAX_MOBILE 21#define MAX_FAX 21#define MAX_ADDRESS 101#define MAX_POSTAL_CODE 74.3.2 数据类型定义定义一个结构体类型_person,使用typedef语句定义一个新类型person,结构体中包括联系人姓名、性别、出生日期、电话、手机、传真、地址及邮编共8个成员。
typedef struct _person{char name[MAX_NAME]; /*姓名*/char sex[MAX_SEX]; /*性别*/char birthday[MAX_BIRTHDAY]; /*出生日期*/char tel[MAX_TEL]; /*电话*/char mobile[MAX_MOBILE]; /*手机*/char fax[MAX_FAX]; /*传真*/char address[MAX_ADDRESS]; /*地址*/char postal_code[MAX_POSTAL_CODE];/*邮编*/}person;定义一个结构体类型_addr_book,使用typedef语句定义一个新类型addr_book,结构体中包括一个存储联系人基本信息的结构体变量per和指向下一个联系人的指针变量。
typedef struct _addr_book{person per; /*联系人基本信息*/struct _addr_book* next;}addr_book;定义一个头结点,将其初始化为空。
addr_book* first = NULL;/*addr_book结构体,链表的头结点,置空*/4.3.3函数及变量声明1. 主要处理函数声明函数声明部分包括了主要函数的声明。
主要有添加联系人函数、显示联系人信息函数、查找联系人函数、删除联系人函数、更新联系人函数、保存到文件和退出函数8个功能函数。
void add(); /*添加联系人函数*/void show(); /*显示联系人函数*/void search(); /*查找联系人函数*/void delete(); /*删除联系人函数*/void update(); /*更新联系人函数*/void save(); /*保存到文件*/void quit(); /*退出*/2. 辅助函数声明为了完成系统功能,特编写了一些辅助功能的小函数,包括打印主菜单函数、取链表中最后一个值的函数、打印联系人信息函数和输入联系人信息函数。
下面是这部分函数的声明。
int print_menu(); /*打印主菜单界面*/addr_book* get_last(addr_book* from); /*取得链表最后一个值*/void print_person(person* p); /*显示一个联系人信息*/void input_person(person* p); /*提示输入一个联系人具体信息*/3. 常量声明以下是主菜单要显示的字符的声明。
char menu[] ="+=====================================================+\n""| 通讯簿管理系统 |\n""+-----------------------------------------------------+\n""| 1 添加联系人 |\n""| 2 显示所有联系人 |\n""| 3 查找联系人 |\n""| 4 删除联系人 |\n""| 5 更新联系人 |\n""| 6 保存 |\n""| 7 退出系统 |\n""+=====================================================+\n";4.3.4 主函数主函数中,首先调用打印主菜单界面函数print_menu(),打印主菜单,等待用户输入1~7中的任一数值,根据用户的输入在switch语句中选择相应的操作,分别是用户输入1,调用添加联系人函数(add())添加联系人信息,输入2调用显示联系人函数(show())显示已输入的联系人信息,输入3调用查找联系人函数(search())按姓名查找联系人信息,输入4调用删除联系人函数(delete())删除联系人信息,输入5调用更新联系人函数(update())修改联系人信息,输入6调用保存函数(save())保存联系人信息,输入7调用退出函数(quit())退出系统。
程序清单:int main(){int flg = 1;while (flg){switch(print_menu()) {case 1:add();break;case 2:show();break;case 3:search();break;case 4:delete();break;case 5:update();break;case 6:save();break;case 7:quit();break;}}}4.3.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””,表示继续输入,则调用本函数;否则返回主函数。