3.6实例6通讯录程序本实例希望设计一个通讯录程序,要求实现通讯录信息的录入,并具有添加、查询、删除、显示等功能;使用结构体存储通讯录中记录信息;使用链表来实现通讯录信息的添加、删除、查询及显示等操作;通讯录程序可实现文件读写,在通讯录信息录入结束之后,可存入文件中,在下次程序运行时可将通讯录中的记录读取到程序中。通讯录程序可采用基于Win32控制台程序构建或采用基于MFC应用向导.EXE的应用程序,下面对这两种方法进行详细介绍。3.6.1.设计目的1、掌握结构体的基本工作原理和工作方式。2、熟悉结构体与链表的使用方法。3、熟悉C语言下数据的输入与输出。4、掌握C语言下对TXT文件的读写操作。5、熟悉函数的设计方法及调用方法。3.6.2.基本要求1、本实例要求实现对通讯录信息的查找、添加、删除、显示等功能,每个功能模块均能实现随时从模块中退出,可以通过键盘对功能进行选择,完成一个通讯录管理系统的运行。2、要使用结构体来实现对通讯录信息的存储。3、使用链表来实现对通讯录信息的查找、添加、删除、浏览显示。4、使用文件对记录进行存储,程序运行时还可以从文件中读取记录。5、系统设计完成后应实现类似下图所示界面。3.6.3设计结构及算法分析在进行程序设计时,选择一种合理的数据存储结构是非常关键的。本实例根据题目要求,采用结构体来存放通讯录中的信息,并采用文件存储通讯录中的信息。1、存储结构本实例存储数据时,除了采用最常用的基本类型存储外,采用结构体的方式来存储通讯录中的个人信息,结构体如下所示:structstu{charname[20];/*人名*/chartelephone[20];/*电话*/charsex[4];/*性别*/charcompany[20];/*单位*/structstu*next;/*链表节点*/};typedefstructstuSTU;2、main()主函数采用模块化设计,功能放在各模块函数中实现。主函数是程序的入口,在其中采用循环结构,根据用户的键盘输入,依次调用各功能函数。3、mycreate()函数------创建链表函数函数根据用户输入的信息,存储到结构体中,并建立链表结构,函数返回链表的头指针。链表建立完成后,可根据链表的头指针来添加后续指针。4、myadd()函数------添加学生信息记录函数函数根据用户输入信息,分配内存,将数据存储到结构体中,并建立新的链表节点,链接到已经建立好的链表尾部。5、mydelete()函数------删除链表节点函数根据用户输入通讯录中人名,在已有的链表中查找该人名信息存放的节点,如找到该节点,则删除该节点,并对链表结构重新链接;如未找到该人名信息的节点,则提示用户不存在。6、mydisplay()函数------显示所有用户记录函数用来遍历所有节点,并向屏幕上输出所有节点的通讯录中的详细信息。7、displaymenu()函数-------显示菜单函数函数向屏幕上输出,用户可以选择的选项菜单,给用户提示信息,给用户选择做出提示。8、mysearch()函数-------查找学生信息函数用来查找通讯录中人名信息存在与否,如不存在则提示用户,如存在返回该人名的链表节点。3.6.4.程序执行流程图main()mycreate()myadd()mysearch()mydelete()mydisplay()Displaymenu()功能模块图3.6.5基于Win32控制台的C语言程序设计详细步骤步骤1:建立一个工程在VisualC++6.0的集成开发环境下,单击File(文件)菜单项,之后选择其子菜单项New(新建),如下图所示。屏幕上回弹出New(新建)对话框,如下图所示。单击对话框上方的Projects(工程)选项卡,在其下方列表中选择Win32ConsoleApplication选项,在右侧的Projectname(工程名)框中输入工程名Address,在Location(目录)中输入工程文件存放的目录C:\Student,之后单击OK按钮。单击OK按钮后,会弹出如下图所示的界面,为了方便编程,选择Asimpleapplication,之后单击Finish按钮。之后,弹出如下图所示界面。界面中包含了建立此工程文件的头文件及路径等信息。单击OK按钮,则进入了一个简单的C语言Win32控制台程序集成开发界面,如下图所示。左侧窗口为工程管理窗口,选择FileView选项卡,通过点击“+”可打开工程的文件及目录列表,工程的很多操作都需要通过此窗口进行。同时通过双击列表中的Address.cpp文件名,可在中央的编辑窗口中打开其文件,如下图所示,此文件中只包含有一个主函数main()框架。步骤2:添加程序头文件,在打开的Address.cpp文件上部,添加如下代码。#includestdio.h#includestring.h#includestdlib.h#includeconio.h步骤3:在主函数上面添加函数定义、变量定义以及结构体定义,如下所示。structstu{charname[20];/*姓名*/chartelephone[20];/*电话*/charsex[4];/*性别*/charcompany[20];/*公司*/structstu*next;/*链表节点*/};typedefstructstuSTU;STU*mycreate();/*创建节点*/voidmydisplay(STU*head);/*显示节点*/voidmyadd(STU*head);/*增加记录*/STU*mysearch(STU*head,charname[20]);/*查找记录*/voidmydelete(STU*head,charname[20]);/*删除记录*/voiddisplaymenu();/*显示所有记录*/位置如下图所示:步骤4:添加main()函数的实现部分以及其它功能函数,在main()主函数中添加代码内容如下:intmain(intargc,char*argv[])/*主函数*/{STU*head=NULL,*p;charname[20];intselect;while(1){displaymenu();//显示功能菜单printf(请选择一个功能:);scanf(%d,&select);switch(select){case1://录入通讯记录//getchar();head=mycreate();mydisplay(head);break;case2://添加通信记录//getchar();myadd(head);mydisplay(head);break;case3://查找通信记录printf(请输入要查找的人的姓名:);scanf(%s,name);p=mysearch(head,name);if(p!=NULL)printf(%s%s%s%s,p-telephone,p-name,p-sex,p-company);elseprintf(没找到!);break;case4://删除通信记录printf(请输入要删除的人的姓名:);scanf(%s,&name);mydelete(head,name);mydisplay(head);break;case5://显示通讯记录mydisplay(head);break;case9://退出系统exit(0);default://输入错误的功能选项printf(选择功能错误,请重新选择。\n);break;}//endofswitchprintf(按任意键继续......\n);getch();}//endofwhilereturn0;}STU*mycreate()/*创建链表*/{STU*head,*p,*q;head=(STU*)malloc(sizeof(STU));q=head;printf(请输入:电话号码姓名性别单位:\n);p=(STU*)malloc(sizeof(STU));scanf(%s%s%s%s,p-telephone,p-name,p-sex,p-company);q-next=p;q=p;q-next=NULL;returnhead;}voidmyadd(STU*head)/*添加记录*/{STU*p;p=(STU*)malloc(sizeof(STU));printf(请输入:电话号码姓名性别单位:\n);scanf(%s%s%s%s,&p-telephone,p-name,p-sex,p-company);p-next=head-next;head-next=p;}voidmydelete(STU*head,charname[20])/*删除记录*/{STU*p,*q;q=head;p=head-next;while(p!=NULL){if(strcmp(p-name,name)==0){q-next=p-next;free(p);break;}q=p;p=p-next;}return;}STU*mysearch(STU*head,charname[20])/*查找记录*/{STU*p;p=head-next;while(p!=NULL){if(strcmp(p-name,name)==0)break;p=p-next;}returnp;}voidmydisplay(STU*head)/*显示记录*/{STU*p;p=head-next;while(p!=NULL){printf(%s%s%s%s\n,p-telephone,p-name,p-sex,p-company);p=p-next;}}voiddisplaymenu()/*显示菜单*/{system(cls);printf(**************MENU**************\n\n);printf(1.创建通讯录\n);printf(2.添加通讯录\n);printf(3.查找通讯录\n);printf(4.删除通讯录\n);printf(5.显示通讯录\n);printf(6.退出通讯录系统\n);printf(**************MENU**************\n\n);}至此所有代码输入工作完成。步骤5.程序调试单击VisualC++6.0环境下的工具条中快捷执行按钮或(Ctrl+F5),按照提示菜单输入选择键就可以进行相应操作,程序执行结果如下所示。3.6.6基于MFC应用向导.EXE的应用程序设计详细步骤步骤1:建立一个工程在VisualC++6.0的集成开发环境下,单击File(文件)菜单项,之后选择其子菜单项New(新建),如下图所示。屏幕上回弹出New(新建)对话框,如下图所示。单击对话框上方的Projects(工程)选项卡,在其下方列表中选择MFCAppWizard(exe)选项,在右侧的Projectname(工程名)框中输入工程名Address,在Location(目录)中输入工程文件存放的目录C:\Address,之后单击OK按钮。如下图所示:单击OK按钮后,会弹出MFC程序创建向导,如下图所示的界面,选择基于对话框的选项(Dialogbased),之后单击Finish按钮。之后,弹出如下图所示界面。界面中包含了建立此工程文件的头文件及路径等信息。单击OK按钮,则进入了一个简单的C语言MFC应用向导.EXE的应用程序集成开发界面,如下图所示。由于MFC程序含有用户界面,因此在编写代码前,可以设置用户的界面,通过单击左侧工程管理窗口中的ResourceView选项卡,Dialog下的IDD_ADDRESS_DIALOG选项,则界面显示在在集成开发环境中间的编辑区域。采用右侧工具箱进行界面设计,工具箱中提供了常用的界面应用控件,可点击控件图标之后在界面上画出控件对象,如创建多个相同的控件对象,可在创建第一个后,采用复制黏贴的方式创建其它多个相同的控件对象。构建界面时,删除上图中