C

通讯录管理C语言程序设计报告

一.设计目的

利用静态数组实现通讯录管理,数组的每一个元素时结构体类型,通过这个例子了解数据库管理的基本功能,重点掌握数组元素为结构体的应用、数组作函数参数、文件读写、自定义函数等知识。

二.总体设计

1.设计思路

程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。在通讯录管理程序中,由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大,除了能够增加、删除、保存等外,更多的情况时查询,且能够实现快速查询,所以选用静态数组保存数据,实现多种查询方式。

2.设计组成框图、流程图

三.详细设计

1.数据结构

由于使用静态数组需要预先估计记录数,所以先预定义一个常数M,表示记录数,也就是数组的大小,记录联系人的信息至少应有姓名、单位、电话,所以定义每个数组元素的类型为结构体。由于数组存储是采取顺序存放,在内存空间中占用连续空间,所以若干条记录通讯录的管理实质就是对顺序存储的线性表的管理。结点结构如下:

#define M 50 /*估计的记录数*/

typedef struct

{

char name[20]; /*姓名*/

char units[30]; /*单位*/

char tele[10]; /*电话*/

}ADDRESS; /*结构体类型名*/

2.main()主函数

程序采用模块化设计,主函数是程序的人口,各模块独立,可分块调试,均由主函数控制调用。控制功能的实现通过循环执行一个开关语句,该语句的条件值时通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。

3.menuselect()主菜单

直接利用输出函数printf()输出字符串,在屏幕上显示一个菜单,并显示一个提示输入选项,输入0~11之间的数字,将此数字作为菜单函数的返回值返回主函数,主函数根据这个数字调用相应的功能函数。

由于程序中很多地方用到了字符串输入语句,会造成下一个字符不能正确读入,为了在程序调用执行了各个函数后能够清晰地看到菜单,并输入新的选项,首先写了一条输出信息,printf(“press any key enter menu……\n”)表示按任意键继续,一条读字符语句getch()等待输入字符,按任意键即可进入主菜单。

4.enter()输入记录

输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,且能直接反映数据之间的关系。

由于记录并不是一次性全部输入,而是随时添加和删除的,而是预先开辟的空间数往往大于实际的记录数,所以程序设计为首先输入准备输入的记录数n,然后用for循环语句循环n次,输入记录。输入完一条按回车键,继续输入下一条,达到规定的记录数,输入停止,返回记录数到主函数。

5.list()显示所有记录

通讯录建立好后,更频繁的操作是显示和查找记录,本函数实现显示所有记录功能。将主函数传递过来的数组输出,用for循环,循环次数由参数长度决定。

6.search()和find()查找记录

查找指定姓名的记录,采用顺序查找法,首先输入要查找记录的姓名,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个find()函数,专门进行查找。从第一条记录开始,将记录中的姓名字段和待比较的姓名字符串s进行比较,一旦相等,程序结束,返回该回路的下标号i,也就是记录所在的序号;如果不相等,则继续下一条比较,所有记录比较完毕,循环结束,返回此时的下标变量i值。search()函数通过调用find()函数的得到了整数i,判断i的值如果大于n-1,已超过实际记录数,说明所有记录都进行过比较,没有找到,查找不成功;否则,说明找到,调用输出函数printf(),显示该第i条记录。

7.delete()删除记录

输入要删除记录的姓名,调用find函数,如果没有该记录,显示没找到信息;否则,调用printf函数,显示记录信息,接着显示是否确定要删除,输入确认信息整数0或.1,1表示时,0表示否。要删除数组中的某一条元素,实际所做的操作是将其后记录依次前移一条,所以删除第i条记录,用for语句,从i+1开始,依次将每个字段拷贝到前一条记录的相应字段,即覆盖了前一条记录,达到前移的目的,直到最后一条记录。由于删除了一条记录,记录数减.1,返回记录数,程序结束。

8.add()插入记录

输入要插入记录的信息,保存到临时变量temp中,然后再输入一个姓名