1、问题定义
创建一个通讯录系统。假设系统中每个联系人记录只包括姓名,年龄,性别,电话号码,QQ、住址及生日等信息。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1 通讯录系统功能需求
2、系统设计
2.1 总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
图2.1 通讯录系统功能模块图
本通讯录系统要求采用数组实现,如图2.1所示,它由如下五大功能模块组成:
- 输入记录模块。完成将数据存入数组的工作。记录可以从通过记录函数存储的数据文件中读入,也可从键盘逐个输入联系人记录。联系人记录由联系人的基本信息字段构成。
- 查询记录模块。完成在数组中查找满足相关条件的联系人记录。在此通讯录系统中,用户可以按照联系人的姓名或电话号码在数组中进行查找。
- 更新记录模块。完成对联系人记录的维护。在此通讯录系统中,它实现了对联系人记录的增加、删除及修改操作,并将修改后的数据存入源数据文件。
- 输出记录模块。一是实现对联系人记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。
2.2 详细设计
2.2.1数据结构设计
- 通讯录结构体
}per[N];
注:per[N]中的N为记录的总个数,程序中用宏定义的方式,可以随时在源程序宏定义中修改。本程序的宏定义为#define N 100。
.2.2 主控main()函数执行流程
图2.2 主控函数执行流程图
本通讯录系统执行主流程如图2.2所示。它先以目录形式显示一系列功能选项,接着由用户通过键盘输入数值。
在判断键值时,有效的输入为0至6之间的任意数值,其他输入都被视为错误按键。
若选择1,则调用append()函数,执行增加联系人记录操作;若选择2,则调用del()函数,执行删除联系人记录操作;若选择3,则调用alt()函数,执行修改联系人记录操作;若选择4,则调用search()函数,执行查找联系人记录操作;若选择5,则调用print()函数,执行打印联系人记录操作;若选择6,则退出该程序。若输入为0~9之外的值,则提示“输入有误,请重新输入”。
2.2.3输入记录模块
输入记录模块主要实现将数据存入数组中。若数据文件中无记录,则无法从文件中读取数据输入到数组中。此时,用户应选择1,调用add()函数,进行联系人记录的输入,即完成在数组中添加记录的操作。
2.2.4查询记录模块
查询记录模块主要实现了在数组中按姓名或电话号码查找满足相关条件的联系人记录。在查询函数search()
中,通过判断键入号码是否存在于通讯录中而判断函数常量是否被赋值。若存在,则表示已被赋值,将其输出。否
则,进行错误提示。
2.2.5更新记录模块
此模块主要实现了对联系人记录的增加、删除及修改操作。因为联系人记录是以数组的结构形式存储的,所以这些操作都在数组中完成。下面分别介绍这3个功能模块。
- 增加记录。该操作完成增加联系人记录。
输入要增加的联系人姓名,回车;输入要增加的联系人年龄,回车;输入要增加的联系人性别,回车;输入要增加的联系人电话,回车;输入要增加的联系人QQ,回车;输入要增加的联系人住址,回车;输入要增加的联系人生日,回车。完成后,系统提示“保存成功”。
- 删除记录。该操作完成删除指定姓名的联系人记录。
选择“删除联系人”选项后屏幕上将自动打印出通讯录所有记录信息,输入要删除的联系人姓名,回车,则现实系统提示“删除成功”。
- 修改记录。该操作完成修改制定姓名的联系人记录。
选择“修改联系人”选项后屏幕将自动打印出通讯录所有记录信息,输入要修改的联系人姓名,回车,选择要修改的项目,输入修改后的记录,回车,退出程序。
2.2.6输出记录模块
当把记录输出至文件时,调用记录函数,将程序所保存的数据写入文件指针fp所指的文件。当把记录输出至屏幕时,调用print函数,将数组中的联系人记录信息以表格的形式在屏幕上打印出来。
2.2.7函数功能描述
- menu()
menu()函数用于展示功能项,供用户完成任务。
- append()
append()函数用于增加联系人记录。
- del()
del()函数用于删除联系人记录。
- alt()
alt()函数用于修改单个记录。
- search()
search()函数用于搜索联系人记录。
- print()
print()函数用于打印联系人记录。
- back()
back()函数作为公告函数,提供从各个子模块返回主菜单或者退出。