1题目:通讯录院系:信息科技学院专业:通信工程姓名:黄晓春学号:0851100311指导教师:杨呈永日期:2009-09-18桂林电子科技大学信息科技学院实训报告2目录1问题定义…………………………………………………………………………..32系统设计……………………………………………………………………32.1总体设计………………………………………………………………………………32.2详细设计………………………………………………………………………………42.2.1主控流程…………………………………………………………………………42.2.2数据结构设计……………………………………………………………………52.2.3输入记录模块……………………………………………………………………52.2.4查询记录模块…………………………………………………………………52.2.5删除记录模块……………………………………………………………………52.2.6显示所有记录模块…………………………………………………………….63系统实现………………………………………………………………………63.1编码………………………………………………………………………63.1.1程序源代码……….……………………………………………………………63.1.2主函数main()……….………………………………………………………103.1.3主菜单界面………….………………………………………………………143.1.4读取文件中的记录……………………………………………………………….143.1.5排序后显示所有记录……………………………………………………………153.1.6删除学生记录………….…………………………………………………………153.1.7查找学生记录………….……………………………………………………….153.1.8插入记录………….……………………………………………………………..163.1.9写入记录到文件中………….………………………………………………….163.2测试与调试………………………………………………………………………173.2.1概述………….……………………………………………………………173.2.2程序测试………….……………………………………………………………184系统维护………………………………………………………………………205归纳总结…………………………………………………………………………205.1开发经验…………………………………………………………………………205.2实训中遇到的问题及解决方法………………………………………………205.3设计中的不足之处……………………………………………………………………205.4感想和心得体会……………………………………………………………………216参考资料………………………………………………………………………213通讯录本题目设计目的是训练学生的基本编程能力,了解通讯录的开发流程,熟悉C语言的文件的各种基本操作。本程序中涉及结构体、各种语句的运用如for();switch();if….else等方面的知识。通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,初步掌握链表的一些结构及构成。掌握利用结构体实现对通讯录的原理,为进一步开发出高质量的通讯录打下坚实的基础。1、问题定义创建一个通讯录。假设系统中每个学生记录包括姓名、性别、联系地址、联系电话,生日信息的修改、删除和查询等程序的运行效果如下图所示,选择任意菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2、系统设计2.1总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。4图2.1通讯录系统功能模块图本通讯录由实现,如图2.1所示,它由如下四大功能模块组成:输入记录模块。完成将数据存入结构体的工作。记录可以从文件中读入,也可从键盘逐个输入朋友信息。朋友信息由朋友的姓名、性别、联系地址、联系电话构成。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中。查询记录模块。完成在结构体中查找满足相关条件的学生记录。在此通讯录中,用户可以按照姓名在中进行查找。若找到该学生的记录,则返回指向该学生的记录的指针。否则返回一个值为NULL的空指针,并打印出未找到该学生记录的提示信息。插入记录模块。完成对朋友信息的更新。在此通讯录中,它实现了对好友记录的增加和排序操作,并将追加后的数据存入源数据文件。输出记录模块。实现对朋友信息的存盘,即将记录写入数据文件中;2.2详细设计2.2.1主控main()函数执行流程52.2.2数据结构设计结构体sstructaddr/*通讯地址结构定义*/{charpost_num[10];/*邮编*/charaddr[40];/*家庭地址*/};structbirth/*出生年月结构定义*/{intyear;/*年份*/intmonth;/*月份*/intday;/*日期*/};structfriend1/*电子通讯录结构定义*/{intnumber;/*序号*/charname[20];/*姓名*/charsex;/*性别*/structbirthbirth;/*出生年月*/structaddraddr;/*通信地址*/chartelephone[13];/*联系电话*/}friends[50];FILE*fp;inti;2.2.3输入记录模块输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。2.2.4查询记录模块2.2.4查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。2.2.5删除记录模块图2.2主控函数执行流程图6该操作完成删除指定姓名的记录,输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。2.2.6显示所有记录模块该操作完成显示所有记录信息,它分两步完成。第一步,按照数组中序号进行排序。第二步,逐条显示出来。3、系统实现3.1编码3.1.1程序源代码#includestdlib.h#includestring.h#includeconio.h#includestdio.h#includedos.hstructaddr/*通讯地址结构定义*/{charpost_num[10];/*邮编*/charaddr[40];/*家庭地址*/};structbirth/*出生年月结构定义*/{intyear;/*年份*/intmonth;/*月份*/intday;/*日期*/};structfriend1/*电子通讯录结构定义*/{intnumber;/*序号*/charname[20];/*姓名*/charsex;/*性别*/structbirthbirth;/*出生年月*/structaddraddr;/*通信地址*/chartelephone[13];/*联系电话*/}friends[50];FILE*fp;inti;voidData_Load()7{intj;longk;fp=fopen(friend.txt,r+t);/*打开文件friend.txt*/if(fp!=NULL){for(i=1;i50;i++){j=fgetc(fp);if(j==EOF)/*判断是否到了文件尾*/return;k=i-1;fseek(fp,k*sizeof(structfriend1),SEEK_SET);fread(&friends[i],sizeof(structfriend1),1,fp);/*从文件中读取一条记录*/}}else{fp=fopen(friend.txt,w);i=1;}}voidData_Show(intj)/*打印记录的详细资料*/{printf(\n\n\tNo:%3d\n,friends[j].number);printf(\n\tBirthday(y/m/d):%4d%2d%2d,friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);printf(\n\tPostnum:%-10s,friends[j].addr.post_num);printf(\n\taddress:%-40s,friends[j].addr.addr);printf(\n\tTele%-13s,friends[j].telephone);}voidData_Input(intj)/*记录插入函数*/{fflush(stdin);friends[j].number=j;printf(\n\n\n\tNo%drecord,j);printf(\n\n\tName:);/*读入姓名*/scanf(%s,friends[j].name);fflush(stdin);printf(\n\tSex(m/f):);/*读入性别*/scanf(%c,&friends[j].sex);printf(\n\t---birthday---);/*读入出生年月*/printf(\n\tyear:);scanf(%d,&friends[j].birth.year);printf(\n\t\tmonth:);8scanf(%d,&friends[j].birth.month);printf(\n\t\tday:);scanf(%d,&friends[j].birth.day);printf(\n\tPost_number:);/*读入邮编*/scanf(%s,friends[j].addr.post_num);printf(\n\tAddress:);/*读入家庭地址*/scanf(%s,friends[j].addr.addr);printf(\n\ttelephone:);/*读入联系电话*/scanf(%s,friends[j].telephone);printf(y/n);if(getch()=='n')main();}voidData_Save(){intj;fp=fopen(friend.txt,w);for(j=1;j=i;j++){fwrite(&friends[j],sizeof(structfriend1),1,fp);}}voidmain(){intj,k;charch;char*search_name;clrscr();Data_Load();i--;do{printf(\n\n\n\tFunctionchoose:);printf(\n\t1.Read);printf(\n\t2.Append);printf(\n\t3.Delete);printf(\n\t4.Search);printf(\n\t5.Insert);printf(\n\t6.SaveandExit);printf(\n\t7.Quit);printf(\n\n);printf(\tChoice:);ch=getche();9switch(ch){case'1':j=1;/*显示通讯录中的所有记录*/while(getch()!=0x1b&&j=i)Data_Show(j++);if(ji)printf(\n\tEndofe_note\n);break;case'2':/*增加通讯录中的记录*/while(getch()!=0x1b&&i50){i++;Data_Input(i);}if(i==