




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 语 言 课 程 设 计题 目:通讯录管理系统设 计 者:院 系:数理学院专 业:信息与计算科学班 号:123111学 号:20111000586指导教师:吴湘宁2012年6月29日1. 题目要求通讯录管理系统是具有数据插入、更新、删除、显示和查询功能的电话簿管理程序。(1)数据包括姓名、工作单位、电话号码和E-MAIL地址等。(2)可对记录中的姓名和电话号码进行更新。(3)可增加和删除记录。(4)可显示所有的保存的记录。(5)可按姓名或电话号码进行查询。2. 需求分析1 信息记录要存放到文件中,要实现文件的输入、输出功能;2 实现数据的添加、删除、更新和显示,要提供输入、删除、更新和显示功能;3 要实现按人名或电话号码进行查询,因而要提供查找功能;4 应该提供键盘式选择菜单以实现功能选择。5 采用模块化,由上到下的设计方法,通过数字选择菜单功能,上级菜单可进入下级菜单,下级菜单可返回上级菜单。3. 总体设计根据上面得需求分析,系统有菜单选择、数据输入、数据查找、数据更新、数据的存储等功能。可以将系统设计分为四大模块,即显示、查找、更新(包括增加和删除)和退出,如图1所示。其中,主要功能是显示、查询和更新三个模块。通讯录管理系统显示查询更新退出 图1 系统功能模块图4. 详细设计4.1主函数主函数设计比较简洁,只提供输入、功能处理和输出部分得函数调用。其中各功能模块采用菜单方式选择。另外,菜单部分也可以写出函数。具体流程图如图2所示。 图2 主函数流程图显示一系列功能选项开始输入n,判断n是否是14根据n的值调用各功能模块函数结束【程序】main()int n,w;doputs(*通讯录管理系统*n);puts(*菜单*n);puts(1.显示通讯录n);puts(2.查找n);puts(3.更新n);puts(4.退出n);puts(*n);printf(选择功能(1-4):);scanf(%d,&n);if(n4)w=1;getchar();else w=0;while(w=1);switch(n) /*选择功能*/case 1:list();break; /*列出通讯录*/case 2:find();break; /*查找*/case 3:choose();break; /*更新通讯录*/case 4: printf(谢谢使用!nn); /*退出*/4.2各功能模块设计数据结构通讯录的数据信息:姓名、工作单位、电话号码、E-MAIL均采用字符型数组,用结构体的形式,把各信息作为结构的成员。结构体变量可以是指针类型,结构体的类型如下:struct personschar name100;char address100;char number100;char email100;perN; /*N为通讯录总人数*/注:perN中的N为记录的总个数,程序中用宏定义的方式,可以随时在源程序宏定义中修改。本程序的宏定义为#define N 100。back():返回菜单,作为公告函数,提供从各个子模块返回主菜单或者退出,程序如下:void back()int n,m,w;doputs(*n);puts(1.返回主菜单 2.退出n);scanf(%d,&m);if(m!=1&m!=2)w=1;getchar();else w=0;while(w=1);if(m=2)puts(*n);printf(谢谢使用!nn); exit(0);if(m=1)doputs(*通讯录管理系统*n);puts(*菜单*n);puts(1.显示通讯录n);puts(2.查找n);puts(3.更新通讯录n);puts(4.退出);puts(n*n);printf(请选择功能(1-4):);scanf(%d,&n);if(n4)w=1;getchar();else w=0;while(w=1);puts(n*n);switch(n) /*选择功能*/case 1:list();break; /*列出通讯录*/case 2:find();break; /*查找*/case 3:alter();break; /*更新通讯录*/case 4:printf(谢谢使用!nn);exit(0); /*退出*/(1) 显示通讯录模块【分析】要从文件读入记录,还要统计记录的总个数。因为读入文件的一些基本功能在其他地方还可能要用到,为了方便,在此都写成相应的功能函数,这样程序看起来结构更简单更清晰。【程序】void list() /*读入数据并显示*/n=loadfiles();printf_files(n-1);printf(n);back(); /*返回主菜单或者退出*/注:这里n作为全局变量,统计文件记录的总个数。 loadfiles():读入记录函数。【程序】int loadfiles()FILE *fp;int i;if(fp=fopen(通讯录.txt,r)=NULL) /*判断文件是否存在*/printf(不能打开文件n);return 0;for(i=0;!feof(fp);i+) /*从文件读入数据,保存在per结构体数组中*/fscanf(fp,%s%s%s%s,,peri.address,peri.number,peri.email);fclose(fp); /*关闭文件*/return (i); /*返回记录个数*/ printf_one ():显示一条信息。【分析】为了方便每条记录的显示及修改,在此特意设计了该函数。【程序】void printf_one(int i)printf(%s %s %s %sn,,peri.address,peri.number,peri.email); printf_files():显示n条信息。【程序】void printf_files(int n)int j;printf(姓名 工作地址 电话 Emailn);for(j=0;jn;j+) /*用for循环实现记录的全部显示*/printf_one(j);getch();这样就实现了显示通讯录的功能,如下图:(2) 查找模块【分析】要实现通过姓名或者电话号码来查找记录,需要判断键入的姓名(电话号码)在文件中是否对应存在。用条件判断语句选择是用哪种方式查找。 find():查找函数。【程序】void find()int i,k,p=-1; /*p初赋值-1,用来后面判断要查找的内容存不存在*/char m100,d100;n=loadfiles(); /*载入文件记录并统计总信息条数*/printf(n*查找功能*n);printf(按什么查找?n);printf(1.姓名 2.电话号码n); scanf(%d,&k);if(k=1)printf(请输入姓名:);scanf(%s,&m);for(i=0;in;i+)if(strcmp(m,)=0) /*判断键入的名字在通讯录中有没有*/p=i; /*如果有,p被赋值*/puts(n*n);printf(姓名 工作地址 电话 Emailn);printf(%s %s %s %s nn,,perp.address,perp.number,perp.email);break;if(p=-1) /*p没有被赋值,说明输入的姓名记录中没有*/printf(n没有找到!n);else if(k=2)printf(请输入电话号码:);scanf(%s,&d);for(i=0;in;i+)if(strcmp(d,peri.number)=0) /*判断键入的电话号码在通讯录中有没有*/p=i; /*如果有,p被赋值*/puts(n*n);printf(姓名 工作地址 电话 Emailn);printf(%s %s %s %snn,,perp.address,perp.number,perp.email);break;if(p=-1) /*p没有被赋值,说明输入的姓名记录中没有*/printf(n没有找到!nn);else printf(n输入错误!n);back(); /*返回主菜单或者退出*/这样就实现了记录查找功能。如下图:(3) 更新通讯录模块(此模块运行截图将在“系统运行”中给出) 图3 更新功能模块更新删除修改增加【分析】这个模块包含三个功能:更新、增加和删除,结构如图3所示。用保存函数更新文件。choose():先定义一个更新通讯录主模块函数,用于选择对通讯录进行怎样的更新。【程序】void choose()int n;puts(*记录更新菜单*n);puts(1.修改n);puts(2.增加n);puts(3.删除n);puts(*n);printf(选择功能(1-3):);scanf(%d,&n);switch(n) /*选择功能*/case 1:alt();break;case 2:add();break;case 3:del();break;default:printf(n输入错误!n);back(); /*返回主菜单或者退出*/ 修改子模块【分析】为了是更新子功能简洁清晰,这里特意定义了choose(),alter(),alt()三个函数并有所嵌套。 alt():子修改函数,用于修改单个记录。【程序】void alt()int i,p=-1,a,n; /*p=-1的功能和前面的相同*/char m100;n=loadfiles(); /*载入文件记录并统计总信息条数*/puts(n*记录修改模块*n);printf_files(n); /*显示通讯录*/puts(*n);printf(输入要修改人的姓名:n);scanf(%s,&m); for(i=0;in;i+)if(strcmp(m,)=0) /*判断键入的名字在通讯录中有没有*/p=i;printf(n姓名 工作地址 电话 Emailn); printf(%s %s %s %sn,,perp.address,perp.number,perp.email);break;if(p=-1) /*p没有被赋值,说明输入的姓名记录中没有*/printf(输入错误!n);back(); /*返回主菜单或者退出*/puts(*n);printf(请输入要修改的选项:n); /*选择要修改的选项*/printf(1.姓名n);printf(2.工作地点n);printf(3.电话号码n);printf(4.Emailn);scanf(%d,&a);switch(a) /*选择后修改结构体*/case 1:printf(姓名改为:);scanf(%s,);break; case 2:printf(工作地点改为:);scanf(%s,perp.address);break; case 3:printf(电话号码改为:);scanf(%s,perp.number);break; case 4:printf(Email改为:);scanf(%s,perp.email); break;default:printf(输入错误!);back(); /*不想更改可以按别的键键返回主菜单或退出*/ alter():主修改函数,并将修改后的新记录保存到文件中。【程序】void alter() FILE *fp1;int j,n;if(fp1=fopen(通讯录.txt,r+)=NULL) /*用读写的方式打开文件*/printf(不能打开文件);exit(0);n=loadfiles(); /*载入文件记录并统计总信息条数*/choose(); /*调用更新主模块函数*/for(j=0;jn;j+) /*用for循环将更新后的内容覆盖保存到文件里面*/fputs(,fp1);fputs(t,fp1);fputs(perj.address,fp1);fputs(t,fp1);fputs(perj.number,fp1);fputs(t,fp1);fputs(perj.email,fp1);fputs(t,fp1);fputs(n,fp1);fclose(fp1); /*关闭文件*/puts(n*);printf(保存成功!n);back(); /*返回主菜单或者退出*/ 增加子模块【分析】增加子模块比较简单,用追加的方式打开文件并追加记录就可以了。 add():增加函数。【程序】void add()FILE *fp2;n=loadfiles(); /*载入文件记录并统计总信息条数*/printf(n*增加记录模块*nn);printf(姓名:);scanf(%s,);printf(工作地点:);scanf(%s,pern.address);printf(电话号码:);scanf(%s,pern.number);printf(Email:);scanf(%s,pern.email);if(fp2=fopen(通讯录.txt,a)=NULL) /*用追加方式打开文件*/printf(不能打开文件);exit(0);fputs(,fp2);fputs(t,fp2);fputs(pern.address,fp2);fputs(t,fp2);fputs(pern.number,fp2);fputs(t,fp2);fputs(pern.email,fp2);fputs(t,fp2);fputs(n,fp2);fclose(fp2); /*关闭文件*/puts(*n);printf(保存成功!nn);back(); /*返回主菜单或者退出*/ 删除子模块【分析】用前面查找的方法找到要删除的单个记录,再通过结构体数组赋值的方法从这个文件起后一个文件赋值给前一个文件,再把钱n-2个结构体写到文件中去。 del():删除函数。【程序】(部分编程功能和前面的一样,不再赘述)void del()FILE *fp3;int i,j,k,p=-1,n;char m100;printf(n*删除记录模块*nn);n=loadfiles();printf_files(n-1); /*这里特意是n-1,是为了避免重复删除时出现最后一条记录重复出现的情况发生,在系统运行中将给出调试过程*/puts(n*n);printf(输入要删除记录的姓名:n);scanf(%s,m);for(i=0;in;i+)if(strcmp(m,)=0)p=i;printf(n姓名 工作地址 电话 Emailn); printf(%s %s %s %sn,,perp.address,perp.number,perp.email);puts(*n);for(k=p;kn-2;k+)perk=perk+1; /*后面的结构体数组往前推,将要删除的覆盖掉*/if(fp3=fopen(通讯录.txt,w)=NULL)printf(不能打开文件);exit(0);for(j=0;jn-2;j+) /*这里不是n-1而是n-2,因为已经删除了一条记录*/fputs(,fp3);fputs(t,fp3);fputs(perj.address,fp3);fputs(t,fp3);fputs(perj.number,fp3);fputs(t,fp3);fputs(perj.email,fp3);fputs(t,fp3);fputs(n,fp3);fclose(fp3);printf(删除成功!nn);break;if(p=-1)printf(n输入错误!n);back();back();(4) 退出功能【分析】这个也很简单,在switch中自动退出或用exit(0)实现退出。5. 系统运行 在这里将演示更新“通讯录功能”的过程。在主菜单中选择“3.更新通讯录” ,如下图:选择修改,如下图:输入孔明,回车,修改工作地点为西蜀,如下图:返回主菜单,显示通讯录,如下图:“孔明”的“工作地点”已经变成“西蜀” ,修改成功。选择增加,如下图:输入新记录,回车,如下图:返回主菜单,显示通讯录,如下图:华佗来“上班”了,添加成功。选择删除,如下图:输入关羽,回车,如下图:返回主菜单,显示通讯录,如下图:关羽“走麦城”去了,删除成功。关于在del()函数里面要写成printf_files(n-1)的原因: 这里特意是n-1,是为了避免重复删除时出现最后一条记录重复出现的情况发生。如果写成printf_files(n),而且在删除记录后再进入删除菜单将出现下图的情况:(这里删除张飞)这是由于n=loadfiles()中n的值没有随着一条记录的删除而减1导致。因此要改丞printf_files(n-1),而且这样改了之后不管连续删除多少条记录都不会出现最后一天记录重复出现的情况。其之后的for(j=0;jn-2;j+)中的n-2也是同样的道理。 关于在程序中设计back()函数的好处:只要对键入的东西进行判断,如果子功能结束或输入错误,用back()函数就能返回主菜单,避免输入错误而必须频繁重新打开程序。有了back()函数,实现了不用重新开启就能重复执行不同功能,而且我特意在每一个可能结束程序的地方都添加了back()函数。只举下面几个例子:6. 总结 在这次c语言程序设计实习,我主要碰到下面3个问题:1缺少头文件,导致有些看不懂的错误或警告出现;2文件用不同的方式打开所实现的功能不同,有的是追加,有的是直接覆盖;3忘了函数定义一定要写在其他语句前面,导致出现好多个错误。不过在这次实习中,我也有很多收获:1我经常用调试功能一步一步跟踪程序的运行(前面那个n-1的问题就是通过调试发现的),观察变量的变化;2有些c语言知道忘记了,通过看书,重新温习,而且通过实践加强了印象;3有些难题经过老师的指点和自己独立思考后得到解决后,感到很有成就感;4由于我的c语言基础较好,同学们经常找我帮忙解决问题,使我在这次实习中接触了不同的课题和不同的程序设计思路,锻炼了解决问题的能力,提高了c语言实际应用能力。附1:程序源代码#include#include#include#include#define N 100 int n; /返回主菜单void list();void find();void alter();void back()int n,m,w;doputs(*n);puts(1.返回主菜单 2.退出n);scanf(%d,&m);if(m!=1&m!=2)w=1;getchar();else w=0;while(w=1);if(m=2)puts(*n);printf(谢谢使用!nn); exit(0);if(m=1)doputs(*通讯录管理系统*n);puts(*菜单*n);puts(1.显示通讯录n);puts(2.查找n);puts(3.更新通讯录n);puts(4.退出);puts(n*n);printf(请选择功能(1-4):);scanf(%d,&n);if(n4)w=1;getchar();else w=0;while(w=1);puts(n*n);switch(n) /*选择功能*/case 1:list();break; /*列出通讯录*/case 2:find();break; /*查找*/case 3:alter();break; /*更新通讯录*/case 4:printf(谢谢使用!nn);exit(0); /*退出*/ /结构体struct personschar name100;char address100;char number100;char email100;perN; /*N为通讯录总人数*/载入记录int loadfiles()FILE *fp;int i;if(fp=fopen(通讯录.txt,r)=NULL)printf(不能打开文件n);return 0;for(i=0;!feof(fp);i+) /*从文件读入数据,保存在per结构体数组中*/fscanf(fp,%s%s%s%s,,peri.address,peri.number,peri.email);fclose(fp);return (i); /*返回信息个数*/显示一条信息void printf_one(int i)printf(%s %s %s %sn,,peri.address,peri.number,peri.email);/显示n条信息void printf_files(int n)int j;printf(姓名 工作地址 电话 Emailn);for(j=0;jn;j+)printf_one(j);getch();/列出通讯录void list() /*读入数据并显示*/n=loadfiles();printf_files(n-1);printf(n);back();/查找记录void find()int i,k,p=-1;char m100,d100;n=loadfiles(); /*总信息条数*/printf(n*查找功能*n);printf(按什么查找?n);printf(1.姓名 2.电话号码n);scanf(%d,&k);if(k=1)printf(请输入姓名:);scanf(%s,&m);for(i=0;in;i+)if(strcmp(m,)=0) /*判断键入的名字在通讯录中有没有*/p=i;puts(n*n);printf(姓名 工作地址 电话 Emailn);printf(%s %s %s %snn,,perp.address,perp.number,perp.email);break;if(p=-1) /*p没有被赋值,说明输入的姓名记录中没有*/printf(n没有找到!n);else if(k=2)printf(请输入电话号码:);scanf(%s,&d);for(i=0;in;i+)if(strcmp(d,peri.number)=0) /*判断键入的电话号码在通讯录中有没有*/p=i;puts(n*n);printf(姓名 工作地址 电话 Emailn);printf(%s %s %s %snn,,perp.address,perp.number,perp.email);break;if(p=-1)printf(n没有找到!nn);else printf(n输入错误!n);back();void alt() /*修改函数*/int i,p=-1,a,n;char m100;n=loadfiles();puts(n*记录修改模块*n);printf_files(n);puts(*n);printf(输入要修改人的姓名:n);scanf(%s,&m); for(i=0;in;i+)if(strcmp(m,)=0) /*判断键入的名字在通讯录中有没有*/p=i;printf(n姓名 工作地址 电话 Emailn);printf(%s %s %s %sn,,perp.address,perp.number,perp.email);break;if(p=-1)printf(输入错误!n);back();puts(*n);printf(请输入要修改的选项:n);printf(1.姓名n);printf(2.工作地点n);printf(3.电话号码n);printf(4.Emailn);scanf(%d,&a);switch(a)case 1:printf(姓名改为:);scanf(%s,);break; case 2:printf(工作地点改为:);scanf(%s,perp.address);break; case 3:printf(电话号码改为:);scanf(%s,perp.number);break; case 4:printf(Email改为:);scanf(%s,perp.email); break;default:printf(n输入错误!n);back();void add() /*增加函数*/FILE *fp2;n=loadfiles();printf(n*增加记录模块*nn);printf(姓名:);scanf(%s,);printf(工作地点:);scanf(%s,pern.address);printf(电话号码:);scanf(%s,pern.number);printf(Email:);scanf(%s,pern.email);if(fp2=fopen(通讯录.txt,a)=NULL)printf(不能打开文件);exit(0);fputs(,fp2);fputs(t,fp2);fputs(pern.address,fp2);fputs(t,fp2);fputs(pern.number,fp2);fputs(t,fp2);fputs(pern.email,fp2);fputs(t,fp2);fputs(n,fp2);fclose(fp2);puts
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 减少印刷浪费的方案
- 小区管理效益评估方式
- 纺织工艺技术创新方案
- 考研复习如何高效
- 化学制造工艺技术规程
- 养生大法的实践心得
- 心灵手巧:手工艺术的乐趣
- 2025云南丽江市古城区司法局招聘司法行政辅助人员1人笔试含答案
- 2025信息安全工程师招聘笔试题库及答案
- 果汁机故障排查方案
- 劳动教育读本中职版专题一崇尚劳动学习资料
- 河道生态修复工程施工图设计总说明-水生态部分
- 慢病患者的自我管理培训课件
- 学校食堂员工培训方案
- 教学查房流程
- 《建筑材料与构造》课件-3.建筑材料的基本要求与选用
- 《员工行为准则培训》课件
- 2025年广汽集团股份有限公司招聘笔试参考题库含答案解析
- 钢结构维护结构施工方案
- 仓管员晋升组长述职报告
- 《慢性乙型肝炎防治指南(2022年版)-》解读
评论
0/150
提交评论