C语言程序设计实践——通讯录管理系统实践报告组长:吴政组员:吴政吴伟明王成武北京师范大学信息科学与技术学院本科生2010级1班二〇一一年三月二十六日实践报告:C语言程序设计之通讯录管理系统-2-※实践前论:实践的目的、要求与内容一、实践的目的和要求经过了一个学期对C语言的学习,大家对C语言有了一定的认识。在此基础上,为了加深对C语言课程所学知识的理解,进一步巩固C语言算法规则,学会编制结构清晰、风格良好、数据结构适当的C程序,从而具备解决综合性问题的能力,特设此课程实践内容,通过完成一项具体的程序来检验对所学知识的掌握情况。要求能够完成一项完整并且具有初步实用性,经编写调试,确保能够正常运行的小型程序。二、实践所涉及的内容实践内容所涉及的均为C语言的基础知识,包括:数据类型(整型、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数定义与调用)等,以及进一步掌握各种函数的应用以及文件的读写操作等。实践报告:C语言程序设计之通讯录管理系统-3-※实践细述:通讯录管理系统一、任务概述:通讯录管理系统程序通过用户录入的通讯录成员信息,由计算机自动实现数据的存储,读取,修改等功能,用户可以根据计算机的提示完成各项操作,实现电脑协助人工管理信息的功能。二、程序功能:1、导入通讯录文件,如果文件不存在,则按照输入的路径自动创建;2、录入通讯录成员记录,包括姓名、电话号码、电子邮箱、qq号及分类;3、查询成员信息,根据用户输入的姓名检索出该成员的所有录入信息;4、删除记录,选择通讯录成员的姓名并将其所有信息从存储的数据中删除;5、修改成员信息,选择数据中某一成员,并依次修改各项记录;6、显示成员信息,可以一次性显示所有成员的记录,或是按照分类显示某一类成员的所有记录;7、拨打电话,选择某一成员,依次显示其电话号码各个数实践报告:C语言程序设计之通讯录管理系统-4-字来实现拨号(此项功能为模拟实现功能);8、保存记录,用户可将记录保存为文件存在硬盘上。三、设计思路所有成员的记录用结构体数组存储,每个结构体包括姓名、电话号码、电子邮箱、qq号及分类五个字符型数组;上述的各项功能由定义函数分别实现,由主函数控制各个函数的调用;整个程序产生于文本界面,通过一些字符简单对界面进行装饰。具体的各个函数设计思路如下:1、导入通讯录函数:通过fopen函数打开指定文件,并用fread函数将文件内的数据读入结构体数组中,这两个标准库函数都定义在stdio.h头文件中。整个函数的返回值为整形i,用来并表示导入的数据成员个数,而后将该值赋给全局变量count用来计数。2、保存文件函数:通过将文件名字符串作为参数传入,用fwrite函数将当前结构体数组中的全部数据写入文件中并关闭文件。该函数无返回值。3、分类显示成员信息函数:无参数传入,无返回值,用户根据提示输入指令,用switch语句分析指令并遍历所有结构体数据,将符合的数据输出。该函数也没有返回值。4、录入新成员信息函数:该函数没有参数,通过提示用户输入数据;当输入的姓名或电话号码重复时,提示用户重复并重实践报告:C语言程序设计之通讯录管理系统-5-新输入;被录入一个完整的新数据后让全局变量count自增,并将其作为函数的返回值返回。5、查找记录函数:将用户要找的成员姓名作为参数传入,遍历所有结构体并找出符合的输出,若输出成功则返回整数1,用户所输姓名不存在则返回0。6、删除记录函数:将用户要删除的成员姓名作为参数传入,遍历所有结构体并找出符合的删除,并将后面的所有数据向前移动一个位置,返回值同查找记录函数。7、修改记录函数:将用户要修改的成员姓名作为参数传入,遍历所有结构体并找出符合的,依次提示修改项目,由用户输新数据并保存,返回值同查找记录函数。8、拨号功能函数:无参数传入,显示已存入的所有成员的姓名,由用户选择拨打电话的姓名,依次显示电话号码的各个数字,并用Sleep函数设置一定时间的延时以表现号码依次输出的效果,该函数包含在windows.h头文件中。成功拨号则返回整数1,输入了错误的姓名则返回0。9、主函数:用switch语句来判断用户输入的指令,转向具体的函数来执行,并根据函数的返回值判断执行结果并予以提示。主函数中用exit(0);语句结束程序,并在结束前提示用户保存数据。整个程序由上述9个函数组成。此外,源程序将结构体数组和计数变量count以及文件指针fp设为全局变量,目的是为了实践报告:C语言程序设计之通讯录管理系统-6-让所有函数都能正常使用这几个变量,保证整个程序的正常运行。四、附加功能及优化整个程序比较顺利的完成了既定任务中的所有功能要求,并增加了读取和保存文件的功能,使通讯录记录课一永久保存与硬盘上。另外,在程序与用户交互时用Sleep函数进行一定时间的延时,方便用户交互,使得在文本界面中交互内容不会因一闪而过而无法看清。延时的时间用#define定义为常量,可以方便修改,数据的总容量也用#define定义,可以随时“扩容”。五、程序流程图开始路径存在输入文件路径读取文件内容创建新文件是否实践报告:C语言程序设计之通讯录管理系统-7-六、程序源代码及注释#includestdio.h#includestdlib.h#includestring.h#includewindows.h#defineSUM100分析指令输入指令1·新增2·删除3·查询4·修改5·分类显示6·拨打电话7·保存0·退出结束保存?是否实践报告:C语言程序设计之通讯录管理系统-8-#defineSTOP1000typedefstruct/*结构体,存放通讯录成员信息,重新定义成member型变量*/{charname[10];chartel[15];charcla[5];charmail[20];charqq[15];}member;memberinfo[SUM];//所有成员空间FILE*fp;//文件指针,用于打开或保存通讯录文件intcount=0;//全局变量,用于计数已存入数量/*------------------------------------------------------*/intload(charfilename[])//打开通讯录文件{member*p;inti=0;实践报告:C语言程序设计之通讯录管理系统-9-if((fp=fopen(filename,rb))==NULL)returni;else{while(!feof(fp)){p=(member*)malloc(sizeof(member));if(fread(p,sizeof(member),1,fp)==1){strcpy(info[i].name,p-name);strcpy(info[i].tel,p-tel);strcpy(info[i].cla,p-cla);strcpy(info[i].mail,p-mail);strcpy(info[i].qq,p-qq);i++;}free(p);}returni;}}/*-------------------------------------------------*/实践报告:C语言程序设计之通讯录管理系统-10-voidsave(charfilename[])//保存通讯录文件{inti;member*p;if((fp=fopen(filename,wb))==NULL){printf(无法保存!打开文件%s时出错\n,filename);exit(1);}elsefor(i=0;icount;i++){p=(member*)malloc(sizeof(member));strcpy(p-name,info[i].name);strcpy(p-tel,info[i].tel);strcpy(p-cla,info[i].cla);strcpy(p-mail,info[i].mail);strcpy(p-qq,info[i].qq);fwrite(p,sizeof(member),1,fp);free(p);}实践报告:C语言程序设计之通讯录管理系统-11-fclose(fp);}/*------------------------------------------------*/voiddisplay(void)//分类查看功能{chardis;charway[5];inti,j=0;choice:printf(**********请选择查看分类***********);printf(**********1.亲友**********);printf(**********2.同学**********);printf(**********3.老师**********);printf(**********4.其他**********);printf(**********5.查看全部**********);printf(**********0.返回上一级菜单**********);printf(*****************************************);printf(请选择(1~5或0):);dis=getchar();getchar();switch(dis){实践报告:C语言程序设计之通讯录管理系统-12-case'1':strcpy(way,亲友);break;case'2':strcpy(way,同学);break;case'3':strcpy(way,老师);break;case'4':strcpy(way,其他);break;case'5':printf(*******通讯成员·全部*******);for(i=0;icount;i++){printf(****姓名:%s\n,info[i].name);printf(****电话号码:%s\n,info[i].tel);printf(****电子邮箱:%s\n,info[i].mail);printf(****QQ号:%s\n,info[i].qq);printf(****分类:%s\n,info[i].cla);printf(**********************);j++;}if(j==0){printf(************************);printf(无任何通讯成员!);printf(************************);}j=0;Sleep(STOP);gotochoice;break;实践报告:C语言程序设计之通讯录管理系统-13-case'0':return;break;default:printf(*************************);printf(输入指令有误!);printf(*************************);Sleep(STOP);gotochoice;}printf(********通讯成员·%s*******,way);for(i=0;icount;i++){if(strcmp(info[i].cla,way)==0){printf(****姓名:%s\n,info[i].name);printf(****电话号码:%s\n,info[i].tel);printf(****电子邮箱:%s\n,info[i].mail);printf(****QQ号:%s\n,info[i].qq);printf(****分类:%s\n,info[i].cla);printf(**********************************);j++;}}if(j==0){实践报告:C语言程序设计之通讯录管理系统-14-printf(该分类中无通讯成员!);printf(*************************);}j=