题目:简易通讯录管理系统院系:专业:姓名:学号:指导教师:日期:2009年9月19日桂林电子科技大学信息科技学院实训报告目录1问题定义…………………………………………………………………………..32系统设计……………………………………………………………………32.1总体设计………………………………………………………………………………32.2详细设计………………………………………………………………………………42.2.1数据结构设计…………………………………………………………42.2.2主控流程…………………………………………………………………………52.2.3输入记录模块……………………………………………………………………62.2.4查询记录模块……………………………………………….…………………62.2.5管理记录模块………………………………………………62.2.6输出记录模块……………………………………………….…………………63系统实现………………………………………………………………………73.1编码………………………………………………………………………73.1.1程序预处理……….……………………………………………………………73.1.2主函数main()……….………………………………………………………83.1.3主菜单界面………….………………………………………………………83.1.4保存信息并释放内存空间…….…………………………………………………93.1.5记录查找(按姓名)………….…………………………………………………103.1.6输入记录……….…………………………………………………….…………113.1.7输出记录………….………………………………………………….…………113.1.8删除记录………….…………………………………………………….………123.2测试与调试………………………………………………………………………123.2.1概述………….……………………………………………………………123.2.2程序测试………….……………………………………………………………134系统维护………………………………………………………………………155归纳总结………………………………………………………………………165.1开发经验………………………………………………………………………165.2设计中的不足之处……………………………………………………………………165.3感想和心得体会……………………………………………………………………16简易通讯录管理系统本题目设计目的是训练学生的基本编程能力,了解简易通讯录的开发流程,熟悉C语言的文件各种基本操作。本程序中涉及很多方面的知识,通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握对简易通讯录实现的原理,进一步开发出高质量的通讯录系统打下坚实的基础。1.问题定义创建一个简易通讯录管理系统。假设系统中包含输入信息,显示信息,增加信息,删除信息和保存等信息。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2.系统设计2.1总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。图2.1本成绩管理系统要求采用单链表实现,如图2.1所示,它由如下四大功能模块组成:输入记录模块。完成将数据存入单链表的工作。从键盘上逐个输入数据。。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。查询记录模块。完成在单链表中查找满足相关条件的记录。在此通讯录系统中,用户可以按照姓名在单链表中进行查找。若找到该人物的记录,则返回指向该人物的记录的指针。否则返回一个值为NULL的空指针,并打印出未找到该人物记录的提示信息。管理记录模块。完成在单链表中删除满足相关条件的人物记录。按照姓名先查找,再删除此记录。完成在单链表中继续添加人物信息的记录。与输入记录模块一样。输出记录模块。一是实现对人物记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。2.2详细设计2.2.1数据结构设计通讯录结构体structTelephone{charname[20];charaddrass[20];charzip[20];chartelephone[20];structTelephone*next;通讯录管理系统输入记录模块模块查询记录模块管理记录模块输出记录模块从键盘输入按姓名查询添加记录删除记录输出至文件输出至屏幕};结构体structTelephone用于储存通讯录的基本信息。结构体typedefstructTelephoneTEL;TEL*head=NULL;voidshowmenu();//菜单voidAppenditem();//添加条目voidprint();//输出条目voidFinditem1();//查找条目(按姓名)voidRemoveitem();//删除信息voidSaveandfree();//保存到文件voidOpen();//打开文件2.2.2主控main()函数的执行voidmain(){charch;Open();//打开文件while(1){showmenu();//显示菜单scanf(%c,&ch);switch(ch){case'1':Appenditem();//添加条目break;case'2':print();//输出条目break;case'3':Finditem1();//查找条目1.按姓名break;case'4':Removeitem();//删除信息print();//输出删除后的结果break;case'0':Saveandfree();//保存并释放内存exit(0);//退出break;default:printf(选择错误!);break;}}}先打开文件,此文件若不存在,则新件此文件.2.2.3输入记录模块输入记录模块主要实现将数据存入单链表中.用户选择voidAppenditem()函数进行对人物记录的输入,即完成在单链表中添加记录的操作.值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样一来,大大减少了代码的重复和冗余,符合模块化程序设计的特点。2.2.4查询记录模块查询记录模块主要实现了在单链表中按姓名查找满足相关条件的人物记录。在查询模块函数voidFinditem1()中,p为指向保存了学生成绩信息的单链表的首地址的指针变量。为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作,设计成了一个单独的函数若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。2.2.5管理记录模块此模块主要实现了对学生记录的删除、添加操作。因为学生记录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。(1)删除记录。该操作完成删除指定学号或姓名的学生记录,它也分两步完成。第一步,输入要删除的姓名,输入后调用定位函数,在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学号或姓名的学生记录,则返回指向该学生记录的节点指针;第二步,若找到该学生记录,将该学生记录所在节点的前驱节点的指针域,指向目标节点的后继节点。(2)添加记录。该操作完成在指定学号的随后位置插入新的学生记录。首先,要求用户输入某个学生的学号,新的记录将插入在该学生记录之后;然后,提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后.2.2.6输出记录模块当把记录输出至文件时,调用函数,将p指针所指节点中的各字段值,写入文件指针fp所指的文件。当把记录输出至屏幕时,调用函数,将单链表中的人物记录信息以表格的形式在屏幕上打印出来。开始着手进行系统实现的工作,开始程序代码的编写.3.系统实现3.1编码3.1.1程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。#includestdio.h#includestring.h#includestdlib.hstructTelephone{charname[20];charaddrass[20];charzip[20];chartelephone[20];structTelephone*next;};typedefstructTelephoneTEL;TEL*head=NULL;voidshowmenu();//菜单voidAppenditem();//添加条目voidprint();//输出条目voidFinditem1();//查找条目(按姓名)voidRemoveitem();//删除信息voidSaveandfree();//保存到文件voidOpen();//打开文件3.1.2主函数main()main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。voidmain(){charch;Open();//打开文件while(1){showmenu();//显示菜单scanf(%c,&ch);switch(ch){case'1':Appenditem();//添加条目break;case'2':print();//输出条目break;case'3':Finditem1();//查找条目1.按姓名break;case'4':Removeitem();//删除信息print();//输出删除后的结果break;case'0':Saveandfree();//保存并释放内存exit(0);//退出break;default:printf(选择错误!);break;}}}3.1.3主菜单界面用户进入通讯录管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。//菜单voidshowmenu(){printf(\n*****************通讯录系统*****************\n);printf(\t1.添加条目。\n);printf(\t2.输出输出\n);printf(\t3.按姓名查询\n);printf(\t4.删除条目\n);printf(\t0.保存并退出!\n);printf(*************************************************\n);printf(\t请选择:\n);}3.1.4保存信息并释放内存空间voidSaveandfree(){TEL*p=NULL;FILE*fp;char*Book=books.txt;if(head==NULL){printf(\n记录为空!\n);return;}elsep=head-next;if((fp=fopen(Book,wb+))==NULL){printf(\n打不开文件!\n);return;}while(p!=NULL)//保存信息{fwrite(p,sizeof(TEL),1,fp);p=p-next;}printf(保存完毕!);fclose(fp);//*****释放链表空间*****for(;head-next!=NULL;){p=head-next;head-next=head-next-next;free(p);}free(head);}//文件信息输出到链表voidOpen(){FILE*fp;TEL*p1=NULL,*p2=NULL,*temp=NULL;if((fp=fopen(books.txt,rb+))==NUL