Word版可编辑-C语言程序设计小组精心整理.doc_第1页
Word版可编辑-C语言程序设计小组精心整理.doc_第2页
Word版可编辑-C语言程序设计小组精心整理.doc_第3页
Word版可编辑-C语言程序设计小组精心整理.doc_第4页
Word版可编辑-C语言程序设计小组精心整理.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京石油化工学院 BEIJING INSTITUTE OF PETROCHEMICAL TECHNOLOGY 课程设计用纸1 高级语言(C)课程设计题目: 小型通讯录设计 院(系、部): 信息工程学院 姓 名: 李海霞 (5120110752) 孙 琳 (5120110723) 班 级: 电 112 指导教师签名: 2012 年 7 月 4日北京 目录一、 任务书*2二、 小组成员情况*2三、 总体设计*2四、 模块划分及功能*3五、 算法说明*4六、 框架图*6七、 流程图*8八、 源程序清单*12九、 程序测试*26十、 结论、体会及建议*32十一、 附:参考文献资料*33一、任务书题目6:小型通讯录设计功能:实现简单的通讯录信息管理,基本信息包括编号、姓名、手机、邮编、地址、关系、性别、生日、QQ、e-mail.基本要求: 1.设计简单的菜单,能够进行系统功能选择。2 实现信息的录入功能。3 在已有信息的基础上添加新的记录。4 删除指定编号的记录。5 复制指定编号的记录6 实现信息的浏览功能7 按编号查询功能8 按手机号排序功能二小组成员情况组长:李海霞 学号:5120110752 负责:文件导出、删除、排序、复制、输出 组员:孙琳 学号:5120110723 负责:主菜单、添加、查询、保存退出另外:主函数,结构体定义,函数声明,文件及实验报告,虽有分工,但是大多数内容是有两人讨论后共同完成的。期间各自编写函数的过程中遇到的问题均由两人共同商讨,以及询问老师后,一起解决的。三、总体设计利用struct record定义数据结构,用void声明函数,用开关语句switch, case分开事件进行程序,实现系统功能选择,利用if,while语句判断函数,for语句实现循环,利用printf和scanf进行输出与输入,用getch()输入字符串,最终实现通讯录功能。通讯录中的记录项用结构体record表示,包含10个属性:id、name、phone 、address、postcode、e-mail、relation、QQ、sex、birthday分别代表用户的编号、姓名、电话、地址、邮编、e_mail、关系、QQ 、性别、生日。1、结构体数组:struct record /定义一个结构体数组 char id10; /编号char name20;/姓名char phone20;/电话 char adress40; /地址char postcode10; /邮编char e_mail30; /e_mailchar relation20;/关系char QQ20;/QQchar sex10;/性别char birthday20;/生日student500;2、包括的函数:void mainmenu();/主菜单 void readfromfile();/读取文件void newrecord();/新添纪录 void showall();/输出记录void searchmenu();/查询菜单void searchbyid();/按编号查询 void searchbyname();/按姓名查询 void searchbyphone();/按电话查询void deletemenu();/删除菜单 void deleteall();/删除所有 void deleteone();/删除单个 void deletebyid();/按编号删除 void deletebyname();/按姓名删除void listmenu();/排序菜单void listbyid();/按编号排序 void listbyname();/按姓名排序 void copy();/复制菜单void writetofile();/保存退出 四、模块划分及功能主模块:main()/主函数其他模块:模块一:void mainmenu(); /主菜单 模块二:void readfromfile(); /读取文件模块三:void newrecord(); /新添纪录 模块四:void showall(); /输出记录模块五:void searchmenu(); /查询菜单模块六:void searchbyid(); /按编号查询 模块七:void searchbyname(); /按姓名查询 模块八:void searchbyphone(); /按电话查询模块九:void deletemenu(); /删除菜单 模块十:void deleteall(); /删除所有 模块十一:void deleteone(); /删除单个 模块十二:void deletebyid(); /按编号删除 模块十三:void deletebyname(); /按姓名删除模块十四:void listmenu(); /排序菜单模块十五:void listbyid(); /按编号排序 模块十六:void listbyname(); /按姓名排序 模块十七:void copy(); /复制菜单模块十八:void writetofile(); /保存退出五、算法说明:1.通讯录中的记录项用结构体record表示,包含10个属性。2.主菜单:利用switch语句进行选择所需功能;输入“1”会进入“新添记录”的界面;输入“2”进入“输出记录”的界面;输入“3”会进入“查询菜单”的界面;输入“4”进入“删除记录”的界面;输入“5”进入“记录排序”的界面;输入“7”进入“保存退出”的界面;输入“8”进入“不保存退出”的界面。3.添加记录:利用printf()函数和scanf() 函数实现按要求输入信息,再利用if()语句实现是否继续添加记录。4.输出记录:利用for循环和if语句实现全部输出;5.查询菜单:利用switch选择查询方式。在查询菜单中输入“1”进入“按编号查询”界面;输入“2”进入“按姓名查询”界面;输入“3”进入“按电话查询”界面;输入“4”进入“主菜单”界面。6.按编号查询:利用for循环从第一条记录到最后一条记录进行查找,再利用if语句判断要查找的记录和待比较的编号是否相等,如找到相同的记录,就输出此人的全部信息,如果没有找到就显示“没有此人的信息”。7.按姓名查询:利用for循环从第一条记录到最后一条记录进行查找,再利用if语句判断要查找的记录和待比较的姓名是否相等,如找到相同的记录,就输出此人的全部信息,再内嵌一个if语句进行查找相同名字的人的信息,再内嵌一个if语句继续查找,若不继续查找就输出“没有相同姓名的学生纪录按任意键返回主菜单”,如果一开始没有找到就显示“没有此人的信息”。8.按电话号查询:利用for循环从第一条记录到最后一条记录进行查找,再利用if语句判断要查找的记录和待比较的电话号码是否相等,如找到相同的记录,就输出此人的全部信息,如果没有找到就显示“没有此人的信”。9.删除菜单:利用switch语句进行选择所需功能;输入“1”会进入“删除所有”的界面;输入“2”进入“删除单个”的界面;输入“3”会进入“返回主菜单”的界面。10.删除所有:利用if 语句进行是否全部删除。11.删除单个:利用switch语句选择删除方式,输入“1”进入“按电话号码删除”界面;输入“2”进入“按姓名删除”界面。11.按电话号码删除:利用if语句进行判断是否有记录,再利用for循环进行查找信息,如果找到,就显示所有要删除的信息,再利用if语句进行是否删除,内嵌for循环,把记录前移,内嵌if 语句实现是否继续删除。12.按姓名删除:利用if语句进行判断是否有记录,再利用for循环进行查找信息,如果找到,就显示所有要删除的信息,再利用if语句进行是否删除,内嵌for循环,把记录前移,内嵌if 语句实现是否删除相同姓名的同学信息13.利用switch语句实现排序选择,输入“1”会进入“按电话排序的界面;输入“2”进入“按姓名排序”的界面;输入“3”会进入“返回主菜单”的界面。14.按电话号码排序:利用for循环和if语句以及do.while实现升序,再利用if语句实现是否显示排序后的信息,调用显示函数。15.按姓名排序排序:利用for循环和if语句以及do.while实现升序,再利用if语句实现是否显示排序后的信息,调用显示函数。六、框架图:文件导入菜单显示输出全部人员信息删除菜单删除单个菜单按姓名查找输入姓名显示信息菜单按编号查找输入编号显示信息菜单添加输入信息菜单复制输入复制信息菜单按电话排序输出信息菜单退出退出系统删除所有输入姓名输入电话按电话查找输入电话显示信息菜单按姓名排序输出信息菜单开始七流程图:提示输入新纪录 输入是否继续nextNext=yphead+数组长度P=head+n next=y结束结束无此信息输出信息strcmp(,name)=0调用函数查找输入姓名、编号、电话开始查找search流程图NY删除成功删除失败确认是否删除strcmp(studenti.id,id)=0strcmp(,name)=0输入要删除的编号、姓名删除所有If(num!=0)开始删除delete流程图结束是否继续删除 开始排序list流程图结束Showall排序成功是否显示Listbyphone()Listbyname()输入姓名、电话八、源程序清单#include #include #include /控制字符串 #include /控制台输入输出 struct record /定义一个结构体数组 char id10; /编号char name20;/姓名char phone20;/电话 char adress40; /地址char postcode10; /邮编char e_mail30; /e_mailchar relation20;/关系char QQ20;/QQchar sex10;/性别char birthday20;/生日student500; int num=0;/外部变量num为文件中的纪录数 FILE *p; /定义一个指向文件的指针变量pvoid mainmenu();/主菜单 void readfromfile();/读取文件void newrecord();/新添纪录 void showall();/输出记录void searchmenu();/查询菜单void searchbyid();/按编号查询 void searchbyname();/按姓名查询 void searchbyphone();/按电话查询void deletemenu();/删除菜单 void deleteall();/删除所有 void deleteone();/删除单个 void deletebyphone();/按电话号码删除 void deletebyname();/按姓名删除void listmenu();/排序菜单void listbyphone();/按电话号码排序 void listbyname();/按姓名排序 void copy();/复制菜单void writetofile();/保存退出void main() readfromfile(); while (1) mainmenu(); void readfromfile()/从文件导出,判断是否有通讯录 if(p=fopen(student.txt,rb)=NULL) /将fopen函数的返回值赋给指针变量P,打开输入文件student.txt printf(ntt通讯录文件不存在); if (p=fopen(student.txt,wb)=NULL) /打开输出文件student.txt printf(ntt建立失败); exit(0); /终止正在执行的程序 else printf(ntt通讯录文件已建立); printf(ntt按任意键进入主菜单); getch(); return; exit(0); fseek(p,0,2); /文件位置指针移动到文件末尾,fseek(文件类型指针,位移量,起始点)if (ftell(p)0) /ftell函数的目的是得到当前位置,用相对于文件开头的位移量来表示,文件不为空 rewind(p); /文件位置指针移动到文件开始位置,此函数没有返回值 for (num=0;!feof(p) & fread(&studentnum,sizeof(struct record),1,p);num+);/*fread(buffer,size,count,pt)(地址,读写的字节数,读写多少数据项,FILE类型指针),每次从P指向的文件中读入结构体数组的一个元素;feof检查文件是否结束,遇见文件结束符,返回非零值*/printf(ntt文件导入成功); printf(ntt按任意键返回主菜单); getch(); return; printf(ntt文件导入成功); printf(ntt通讯录文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; void mainmenu()/主菜单 char choice; system(cls);/清屏 printf(ntt* 主菜单 *); printf(ntt* 1-新添纪录 2-输出记录 *); printf(ntt* 3-查询菜单 4-删除菜单 *); printf(ntt* 5-记录排序 6-文件复制 *);printf(ntt* 7-保存退出 8-不保存退出*); printf(ntt*); printf(ntt请选择:); choice=getch(); switch(choice) case 1:newrecord();break; case 2:showall();break; case 3:searchmenu();break;case 4:deletemenu();break; case 5:listmenu();break; case 6:copy();break; case 7:writetofile();break;case 8:exit(0); break;default:mainmenu(); void newrecord()/添加记录 printf(ntt* 请输入信息 *n); printf(ntt输入编号:); scanf(%s,&studentnum.id); printf(ntt输入姓名:); scanf(%s,&); printf(ntt输入电话号码:); scanf(%s,&studentnum.phone); printf(ntt输入地址:); scanf(%s,&studentnum.adress); printf(ntt输入邮编:); scanf(%s,&studentnum.postcode); printf(ntt输入e-mail:); scanf(%s,&studentnum.e_mail);printf(ntt输入QQ:); scanf(%s,&studentnum.QQ);printf(ntt输入性别:);scanf(%s,&studentnum.sex);printf(ntt输入生日:);scanf(%s,&studentnum.birthday);printf(ntt输入关系:); scanf(%s,&studentnum.relation);num+; printf(ntt是否继续添加?(Y/N):); if (getch()=y) newrecord(); return; void showall()/输出记录 int i; system(cls); if(num!=0) printf(ntt* 以下为通讯录所有信息*); for (i=0;inum;i+) printf(ntt编号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt关系:%s,studenti.relation); printf(tt); if (i+1num) printf(ntt_请按任意键继续); getch(); printf(ntt*); else printf(ntt通讯录中无任何纪录); printf(ntt按任意键返回主菜单:); getch(); return; void searchmenu()/查询菜单 char choice; system(cls); printf(ntt* 查询菜单 *); printf(ntt* 1-按编号查询 2-按姓名查询*); printf(ntt* 3-按电话查询 4-返回主菜单*); printf(ntt*); printf(ntt请选择:); choice=getch(); switch (choice) case 1:searchbyid();break; case 2:searchbyname();break; case 3:searchbyphone();break; case 4:mainmenu();break; void searchbyid()/按编号查询 int mark=0; /查找到的个数int i; int a=0; printf(ntt* 按编号查找 *n); char id10; printf(ntt请输入编号:); scanf(%s,id); for(i=0;inum;i+)/从第一条记录开始直到最后一条 if (strcmp(studenti.id,id)=0) /记录中的编号和待比较的编号是否相等 printf(ntt* 以下是您查找的信息 *); printf(ntt编号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt关系:%s,studenti.relation); printf(ntt*); printf(ntt按任意键返回主菜单:); mark+; getch(); return; if (mark=0) printf(ntt没有此人的信息); printf(ntt按任意键返回主菜单); getch(); return; void searchbyname()/按姓名查询 int mark=0; int i; int a=0; printf(ntt* 按姓名查找 *); char name20; printf(ntt请输入姓名:); scanf(%s,name); for(i=a;inum;i+) if (strcmp(,name)=0) /记录中的姓名和待比较的姓名是否相等 printf(ntt* 以下是您查找的学生信息 *); printf(ntt编号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt关系:%s,studenti.relation); printf(ntt*); mark+; if (i+1)num) printf(ntt是否继续查找相同名字的人的信息:(y/n); if (getch()=y) a=i; continue; /跳出本次循环,回到第一个if,继续查找 else return; else printf(ntt按任意键返回主菜单); getch(); return; if(mark!=0) printf(ntt没有相同姓名的学生纪录); printf(ntt按任意键返回主菜单); getch(); return; else printf(ntt没有相同姓名的学生纪录); printf(ntt按任意键返回主菜单); getch(); return; void searchbyphone() /按电话查询 int mark=0; int i; int a=0; printf(ntt* 按电话查找 *); char phone10; printf(ntt请输入电话号码:); scanf(%s,phone); for(i=0;inum;i+) if(strcmp(studenti.phone,phone)=0) printf(ntt* 以下是您查找的信息 *); printf(ntt学号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt关系:%s,studenti.relation); printf(ntt*); printf(ntt按任意键返回主菜单:); mark+; getch(); return; if (mark=0) printf(ntt没有此人的信息); printf(ntt按任意键返回主菜单); getch(); return; void deletemenu()/删除菜单 char choice; if(num=0) printf(ntt对不起,文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; system(cls); printf(ntt*删除菜单*);printf(ntt* 1-删除所有 *); printf(ntt* 2-删除单个 *); printf(ntt* 3-返回主菜单*); printf(ntt*); printf(ntt请选择:); choice=getch(); switch (choice) case 1:deleteall();break; case 2:deleteone();break; case 3:mainmenu();break; default:mainmenu();break; void deleteall()/删除所有 printf(ntt确认删除?(y/n); if (getch()=y) fclose(p); /成功执行了关闭操作,返回值为0 if (p=fopen(student.tex,wb)=NULL) /打开输出文件 printf(ntt不能打开文件,删除失败); readfromfile(); num=0; printf(ntt纪录已删除,按任意键返回主菜单); getch(); return; else return; void deleteone()/删除单个 char choice; printf(ntt1-按电话号码删除 2-按姓名删除); printf(ntt请选择:); choice=getch(); switch (choice) case 1:deletebyphone();break; case 2:deletebyname();break; void deletebyphone()/按电话号码删除 int i,j; int deletemark=0; char phone20; printf(ntt请输入要删除电话号码:); scanf(%s,phone); if(num=0) printf(ntt对不起,文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; for (i=0;inum;i+) if (strcmp(studenti.phone,phone)=0) printf(ntt以下是您要删除的纪录:); printf(ntt编号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt是否删除?(y/n); if (getch()=y) for (j=i;jnum-1;j+) /删除该记录,后续记录前移 studentj=studentj+1; num-; /记录数减1deletemark+; printf(ntt删除成功); printf(ntt是否继续删除?(y/n); if (getch()=y) deletebyphone(); return; else return; continue; if (deletemark=0) printf(ntt没有此人的纪录); printf(ntt是否继续删除?(y/n); if (getch()=y) deletebyphone(); return; void deletebyname()/按姓名删除 int a=0; int findmark=0; int j; int deletemark=0; int i; char name20; printf(ntt请输入要删除学生姓名:); scanf(%s,name); for (i=a;inum;i+) if (strcmp(,name)=0) printf(ntt以下是您要删除的学生纪录:); findmark+; printf(ntt_); printf(ntt编号: %s,studenti.id); printf(ntt姓名: %s,); printf(ntt电话: %s,studenti.phone); printf(ntt地址: %s,studenti.adress); printf(ntte-mail:%s,studenti.e_mail); printf(nttQQ:%s,studenti.QQ); printf(ntt邮编:%s,studenti.postcode); printf(ntt生日:%s,studenti.birthday); printf(ntt性别:%s,studenti.sex); printf(ntt_); printf(ntt是否删除?(y/n); if (getch()=y) for (j=i;jnum-1;j+) /纪录移动,后续记录前移num-; deletemark+; printf(ntt删除成功); if(i+1)num) printf(ntt是否继续删除相同姓名的同学信息?(y/n); if (getch()=y) a=i; continue; printf(ntt是否继续删除?(y/n); if (getch()=y) deletebyname(); return;/返回主菜单 if(i+1)num) printf(ntt是否继续删除相同姓名的同学信息?(y/n); if (getch()=y) a=i; continue; else continue; if (deletemark=0)&(findmark=0) printf(ntt没有此人的纪录); printf(ntt是否继续删除?(y/n); if (getch()=y) deletebyphone(); return; return; else if (findmark!=0) printf(ntt没有重名信息); printf(ntt没有此人的纪录); printf(ntt是否继续删除?(y/n); if (getch()=y) deletebypphone(); return; return; void listmenu()/排序菜单 char choice; if(num=0) printf(ntt对不起,文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; system(cls); printf(ntt* 排序菜单 *); printf(ntt* 1-按电话排序 2-按姓名排序 *); printf(ntt* 3-返回主菜单 *); printf(ntt*); printf(ntt请选择:); choice=getch(); switch(choice) case 1:listbyphone();break; case 2:listbyname();break; case 3:mainmenu();break; default:mainmenu();break; void listbyphone()/按电话排序 int i,j; record tmp; /临时变量做交换数据用for (i=1;inum;i+) if(strcmp(studenti.phone,studenti-1.phone)0) tmp=studenti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论