1目录一、需求分析………………………………………………………2二、概要设计………………………………………………………2三、详细设计………………………………………………………4四、调试分析………………………………………………………6五、用户手册………………………………………………………7六、测试数据………………………………………………………7七、附录……………………………………………………………152一、需求分析1课程设计目的设计一个实用的小型通讯录程序,具有添加,查询和删除功能。由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码。电话号码可由字符和数字组成。2课程设计任务(1)系统以菜单方式工作(2)信息录入功能(3)信息浏览功能(4)信息查询功能(5)信息修改功能(6)系统退出功能3设计环境(1)WINDOWS2000/2003/XP/7系统(2)VisualC++或TC集成开发环境4开发语言C语言二、概要设计⒈选项菜单printf(******************MENU******************\n\n);printf(0.Enterrecord\n);/*输入记录*printf(1.Listthefile\n);/*显示记录*/printf(2.Searchrecondonname\n);/*按姓名查找记录*/printf(3.Deletearecord\n);/*删除记录*/printf(4.Addrecord\n);/*添加记录*/printf(5.Changerecord\n);/*修改联系人*/3printf(6.Savethefile\n);/*记录保存为文件*/printf(7.Loadthefile\n);/*从文件中读记录*/printf(8.Sorttomakenewfile\n);/*按姓名排序*/printf(9.Quit\n);/*退出*/printf(****************************************\n);2.系统流程图系统流程图3.本程序模块结构(1)结构体模块定义结构体类型typedefstructADDRESS联系人信息(包括:姓名住址电话号码1电话号码2电子邮箱),定义一个结构体数组adr[M],用来存放联系人的信息,在c盘建一record.txt用储存联系人的信息。(2)主函数模块voidmain(){初始化;For(;;){{接受命令;处理命令;Exit(退出命令);}菜单输入记录显示全部记录查找记录删除记录插入记录修改记录按姓名重排序读入保存文件退出系统4}(3)子函数模块定义函数intmenu_select(),主菜单函数定义函数intenter(),用来输入记录。定义函数voidlist(),用来显示记录。定义函数voidsearch(),用来按姓名查找记录。定义函数intdelete(),用来删除记录。定义函数intadd(),用来添加记录。定义函数voidchange(),用来保存通讯录信息,将信息存入record.txt中。定义函数intload(),用来从文件record.txt中导入记录。定义函数voidsort(),用来按姓名排列记录。定义函数voidprint(),用来显示单条记录。定义函数intfind(),用来按姓名查找记录。各模块之间的调用关系如下:主程序模块结构体模块子函数模块三、详细设计⒈基本数据类型操作⑴结构体模块typedefstruct/*定义数据结构*/{charname[20];/*姓名*/charnative[15];/*住址*/chartele1[12];/*电话号码1*/chartele2[12];/*电话号码2*/charmail[20];/*电子邮箱*/}ADDRESS;⑵主函数模块5①参数设置#defineM50/*定义常数表示最大记录数*/②主函数算法描述main(){inti;ADDRESSadr[M];/*定义结构体数组*/intlength;/*记录保存长度*/clrscr();/*清屏*/for(;;)/*无限循环*/{switch(menu_select())/*运行菜单函数进入选项*/{case0:length=enter(adr);break;/*输入记录*/case2:search(adr,length);break;/*查找记录*/case3:length=delete(adr,length);break;/*删除记录*/case4:length=add(adr,length);break;/*插入记录*/case5:change(adr,length);break;/*修改记录*/case6:save(adr,length);break;/*保存文件*/case7:length=load(adr);break;/*读文件*/case8:sort(adr,length);break;/*按姓名排列记录*/case9:exit(0);/*如果返回值为9则程序结束*/}}}(3)子函数模块①显示指定的一条记录的函数voidprint(ADDRESStemp){clrscr();printf(\n\n********************************************************************************\n);printf(namenativetelephone1telephone2e-mail\n);printf(--------------------------------------------------------------------------------\n);6printf(%-20s%-15s%-12s%-12s%-20s,temp.name,temp.native,temp.tele1,temp.tele2,temp.mail);printf(\n**************************************END**************************************);}②查找函数,参数为记录数组,记录条数以及姓名intfind(ADDRESSt[],intn,char*s){inti;for(i=0;in;i++){if(strcmp(s,t[i].name)==0)returni;}returni;}……………..⒉函数的调用关系反映了本演示程序的层次结构Mainmenu_select()enter()list()search()delete()add()change()save()load()sort()exit()print()find()ADDRESSadr[M]四、调试分析⒈开始对结构体structADDRESS里面的各成员类型所占空间大小设置不合理,导致形成的对话框整体不能一一对应,影响对于输入和输出数据的判断,经过不断尝试最终选择了20,15,12,12,20的空间分配,但是当老师进行检测时要求添加一个性别的数据,这是选择的7分配又不合适了,修改为18,4,15,12,12,20。⒉在调试时发现可以导出保存文件但是不能导入文件,经过尝试发现,导出文件时并不是生成record.txt,而是自动生成RECORD.txt,当将源代码中的小写改成大写后能正常导入文件。⒊在调试时还遇到当删除某一条通讯记录时,会将所有的记录删除,并自动跳到输入输入函数中,经过分步执行并观察了某些变量值变化发现,当程序执行到delete(删除)函数并在里面调用print(单条输出)函数时变量i的空间的会在结束print函数时被释放,导致数据错误,下一步就无法进行自动跳到输入函数中,这让我深刻认识到应该注意变量的作用域,在把i的值赋给k后通过k来缓和这种数据丢失的错误。五、用户手册⒈本程序的运行环境为DOS操作系统,执行文件为yymao.exe;⒉进入演示程序后,即显示对话形式的提示操作过程,如:提出选择功能菜单输入选择功能键0(输入记录)再按回车键再输入需要输入的记录数按回车继续按条输入通讯录信息⒊本程序功能有:输入显示所有按姓名查询删除记录插入记录修改记录导入文件导出文件按姓名排序退出通讯录等功能。⒋本程序最多保存50条通讯录。⒌每条通讯录包含姓名,籍贯,电话号码1,电话号码2,电子邮箱等数据。⒍结束程序时注意导出文件防止数据丢失。六、测试数据8菜单输入记录9显示所有记录查询记录110查询记录2删除联系人111删除联系人2添加联系人12修改记录排序前13排序排序后14导入通讯录保存通讯录15退出七、附录源程序代码/*******************头文件********************/#includestdio.h/*I/O函数*/#includestdlib.h/*标准库函数*/#includestring.h/*字符串函数*/#includectype.h/*字符操作函数*/#defineM50/*定义常数表示记录数*/typedefstruct/*定义数据结构*/{charname[20];/*姓名*/charnative[15];/*住址*/chartele1[12];/*电话号码1*/chartele2[12];/*电话号码2*/charmail[20];/*电子邮箱*/}ADDRESS;/******函数原型******/intenter(ADDRESSt[]);/*输入记录*/voidlist(ADDRESSt[],intn);/*显示记录*/voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/intdelete(ADDRESSt[],intn);/*删除记录*/intadd(ADDRESSt[],intn);/*添加记录*/16voidchange(ADDRESSt[],intn);/*修改记录*/voidsave(ADDRESSt[],intn);/*记录保存为文件*/intload(ADDRESSt[]);/*从文件中读记录*/voidsort(ADDRESSt[],intn);/*按姓名排序*/voidprint(ADDRESStemp);/*显示单条记录*/intfind(ADDRESSt[],intn,char*s);/*查找函数*/intmenu_select();/*主菜单函数*//**********主函数开始*********/main(){inti;ADDRESSadr[M];/*定义结构体数组*/intlength;/*记录保存长度*/clrscr();/*清屏*/for(;;)/*无限循环*/{switch(menu_select()){case0:length=enter(adr);break;/*输入记录*/case1:list(adr,length);break;/*显示全部记录*/case2:search(adr,length);break;/*查找记录*/case3:length=delete(adr,length);break;/*删除记录*/case4:length=add(adr,length);break;/*插入记录*/case5:change(adr,length);break;/*修改记录*/case6:save(adr,length);break;/*保存文件*/case7:length=load(adr);break;/*读文件*/case8:sort(adr,length);break;/*按姓名排列记录*/case9:exit(0);/*如果返回值为9则程序结束*/}}}/*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select(){chars[20];intc;gotoxy(1,25);/*将光标定位在第25行第1列*/printf(pressanykeyenterme