ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:203.74KB ,
资源ID:7922385      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7922385.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言 任务八 综合项目设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言 任务八 综合项目设计.docx

1、C语言 任务八 综合项目设计任务七 综合项目设计7.1教学目标1 熟练掌握利用C语言的三种流程结构、结构体和函数来完成目标任务2 掌握和利用C语言来编写大型实用程序的技巧和方法3 掌握名片管理系统的程序设计过程7.2工作任务利用所学过的知识,进行综合项目设计,设计一个名片管理程序,能够进行名片添加、名片修改、名片查找、名片删除、名片浏览、名片输出备份。7.3 相关实践知识7.3.1总体设计根据工作任务要求,将该任务用模块图描述总体设计如图7-1所示。图7-1 名片管理系统模块图算法分析: 用户可以根据需要选择不同的功能来对名片进行操作,所以,需要用一个永真循环结合switch.case结构来实

2、现让用户选择的菜单功能。7.3.2 数据初始化模块的设计与实现:(1)数据结构在C语言中用结构体来表示一个对象的多个数据项,名片信息我们采用结构体来描述。除了我们需要使用的联系信息外,为了区分每个名片,同时方便定位名片,我们给每个名片分配一个唯一的编号。名片编号分配给某一个名片后,该编号就不再分配给任何其它名片,即使改名片被删除,也不再重新分配,这样做的好处是不需要管理编号,只要逐个递增就可以了。名片信息具体的数据结构如下:struct card int no; /*编号*/ int group; /*分组号*/ char name20; /*姓名*/ char cphone20; /*手机号

3、*/ char phone20; /*电话*/ char address100; /*地址*/ char email50; /*电子邮件地址*/ char note100; /*备注*/ card; /*声明结构体的同时定义了一个全局变量*/(2)变量的定义为了数据能在所有模块中使用,部分变量定义为全局变量,在C语言中全局变量必须放置在main函数以及其它所有函数之外,而且位于main函数代码之前。在本项目中,定义了如下4个全局变量。struct card int no; int group; char name20; char cphone20; char phone20; char add

4、ress100; char email50; char note100; card; /*用来临时存放用户输入的一个名片信息*/FILE *f1p,*f2p,*fdp; /*三个指向存储文件的文件指针*/(3)数据初始化设计与实现名片信息是用户从键盘输入,在计算机关机后也能保存名片信息。所以,用文件来存放所有的名片和名片输出备份,这我们采用txt文本文件存放。因为名片存放在文件中,不能像在内存中那样用链表来管理。因此,在编辑名片和删除名片的时候,我们不能在同一个文件中挪动名片。我们采用两个文件来回“倒”的方式来解决这个问题。例如,假设现在所有的名片都存储在1.txt中,我们要删除其中的一个名片

5、,那么,我们可以使用一个文件2.txt,然后把1.txt中的名片逐个复制到2.txt中,当遇到要删除的那个名片的时候,跳过该名片,继续复制之后的名片。然后,我们把2.txt标志为当前正在用的名片存储文件。(1.txt 和2.txt需要我们在系统初始化的时候建立好)这样的话,会带来另外一个问题,那就是程序用什么来记住1.txt还是2.txt是当前有效文件,用全局变量可以吗?答案是不行。为什么不行?因为当你这一次使用完系统退出后,全局变量也会消亡,那么下一次你重新使用系统的时候就会不知道你的名片库是存放在1.txt还是2.txt中。所以,我们使用另外建立一个文本文件来保存的解决方案。我们用dire

6、ct.txt(系统初始化的时候建立)来保存当前有效文件标识(1或2)和当前最大名片编号。/*系统初始化*/if( fdp=fopen(direct.txt,r)=NULL) /*如果direct.txt 不存在*/ if(fdp=fopen(direct.txt,w)=NULL) /*创建direct.txt*/ printf(flie creat error!);exit(0); else fprintf(fdp,%dn,1); /*有效文件标识为1*/ fprintf(fdp,%dn,0); /*当前名片编号为0*/ fclose(fdp);if( f1p=fopen(1.txt,r)=N

7、ULL) /*如果1.txt 不存在*/ if(f1p=fopen(1.txt,w)=NULL) /*创建1.txt*/ printf(flie creat error!);exit(0); fclose(f1p);if( f2p=fopen(2.txt,r)=NULL) /*如果2.txt 不存在*/ if(f1p=fopen(2.txt,w)=NULL) /*创建.txt*/ printf(flie creat error!);exit(0); fclose(f2p);/*初始化结束*/7.3.3系统菜单显示模块的设计与实现(1)画出菜单显示模块流程图流程图如图7-2所示。图7-2系统菜单

8、显示流程图(2)根据流程图编写源码main() int option; char o=y; /*系统初始化*/*初始化结束*/ while(o!=q&o!=Q) printf(nnnt*n); printf(t * 欢迎使用名片管理系统! *n); printf(t * *n); printf(t * 1.添加新名片 *n); printf(t * 2.编辑名片 *n); printf(t * 3.查询名片 *n); printf(t * 4.删除名片 *n); printf(t * 5.浏览名片簿 *n); printf(t * 6.名片输出备份 *n); printf(t * 7.使用帮助

9、 *n);printf(t*nnnn); printf(请输入1-7选择相应的功能选项n); scanf(%d,&option); switch(option) case 1:add_compact();break; /*调用名片添加模块*/ case 2:edit_compact();break; /*调用名片编辑模块*/ case 3:search_compact(0);break; /*调用名片查询模块*/ case 4:delete_compact();break; /*调用名片删除模块*/ case 5:load();break; /*调用名片浏览模块*/ case 6:transf

10、er_compact();break; /*调用名片输出备份模块*/ case 7:introduction_compact();break; /*调用帮助模块*/ printf(t退出请按 Qn); printf(t继续请按任意键n); o=getchar(); while(o=n) o=getchar(); printf(n); (3)菜单模块运行结果图 模块运行结果如图7-3所示。图7-3 系统菜单模块运行结果图算法设计:本程序将设计许多可以重用的函数,例如保存一张名片、打印一张名片、输出一张名片等等。这些函数可能会被多个功能模块所调用,例如,添加名片需要用到输入名片函数接收一张名片的输

11、入、然后用打印名片函数把刚才输入的结果作为名片的形式输出给用户看,经过用户确认后再用保存名片函数保存结果。所以,在主函数中,我们可以设计如下一些模块函数,例如:void add_compact(void); 完成名片添加任务void edit_compact(void); 完成名片修改任务void search_compact(int); 完成名片查找任务void delete_compact(void); 完成名片删除任务void load_compact(void); 完成名片浏览任务void transfer_compact(void); 完成名片输出备份任务然后,我们再根据每个模块函数

12、的需要,设计一些具体的功能函数,供他们调用。这些功能函数可以被多个模块函数调用,提高里代码的重用率。名片添加任务需要用到的功能:得到名片输入信息、打印名片供用户确认、保存确认后的名片信息、修改名片总数。名片修改任务需要用到的功能:查找用户想要修改的名片、打印名片供用户确认、接收用户编辑的名片信息、在文件中执行名片编辑。名片查找任务需要用到的功能:确定当前有效的名片存储文件、查找用户指定条件的名片、打印查找结果名片。名片删除任务需要用到的功能:查找用户指定条件待删除的名片、打印查找匹配结果名片、删除名片名片浏览任务需要用到的功能函数:确定当前有效的名片存储文件、打印名片名片输出备份任务需要用到的

13、功能:确定当前有效的名片存储文件、查找用户指定的备份项目并输出到备份文件。7.3.4名片添加模块的设计与实现(1)画出名片添加模块流程图流程图如图7-4所示。图7-4 名片添加模块流程图(2)根据流程图编写源码void add_compact(void) char d; printf(Please input information.n); getcard();/*接收用户从键盘输入的名片信息,并保存在内存中的结构体中*/ printcard(card,1);/*把内存中的结构体中的信息按照名片的形式输出到屏幕上*/ printf(save?(Y/N); d=getchar(); if (d=

14、y|d=Y) save(filedirectory(),numdirectory();/* filedirectory() 当前有效文件标识存放在 direct.txt 文件中,该函数会返回 1 or 2代表当前有效文件是1.txt或者2.txt;numdirectory() 代表名片总数的编号也存放在 direct.txt 中,该函数返回最后一个名片的编号.*/ directoryedit(filedirectory(),1);/* directoryedit(int,int) 该函数改写 direct.txt 以改变当前有效文件编号*/ (3)模块运行结果图模块运行结果如图7-5所示。图7

15、-5 名片添加模块运行结果图7.3.5名片修改模块的设计与实现(1)画出名片修改模块流程图流程图如图7-6所示。图7-6 名片修改模块流程图(2)跟据流程图编写源码void edit_compact(void) char d=0; search_compact(1);/*调用查找模块,根据用户的要求,查找待编辑名片查找到的时候,该名片也已经保存于 card全局变量中*/ printf(编辑?(Y/N)n); while(d!=y& d!=Y& d!=n& d!=N) d=getchar(); if(d=Y|d=y) getcard(); /*接收用户编辑后的名片信息*/ printcard(c

16、ard,1); /*输出编辑后的名片供用户确认*/ printf( 确认保存编辑结果?(Y/N)n); d=0; while(d!=y& d!=Y& d!=n& d!=N) d=getchar(); if(d=Y|d=y) editcard(card.no); /*保存编辑结果到存储文件中*/ (3)模块运行结果图模块运行结果如图7-7所示。图7-7名片修改模块运行结果图7.3.6名片查询模块的设计与实现(1)画出名片查询模块流程图流程图如图7-8所示。图7-8 名片查询模块流程图(2)根据流程图编写源码void search_compact(int o) int d; int p,i; ch

17、ar flag,ch,a,c; char word20,word120,cellph20,cellph120,telph20,telph120; int grp; printf(请选择查找关键字?n); if(o=0)/*名片查找模式*/ printf(N代表namen); printf(G代表groupn); printf(C代表cellphonen); printf(P代表phonen); printf(请输入您的选择:(N/G/C/P)n); else if(o=1)/*名片编辑模式不包含群组匹配*/ printf(N代表namen); printf(C代表cellphonen); pr

18、intf(P代表phonen); printf(请输入您的选择:(N/C/P)n); while(a!=N& !=n&a!=C&a!=c&a!=g&a!=G&a!=p&a!=P) a=getchar(); d=filedirectory(); if(d=1) f1p=fopen(1.txt,r); else if(d=2) f1p=fopen(2.txt,r); if(a=N|a=n) if(f1p!=NULL) printf(名字: );/ 下面接收名字 getchar(); for(i=0;(c=getchar()!=n;i+) word1i=c; word1i=0; for(i=0;(w

19、ordi=word1i)!=0;i+) ;/*空语句,因为赋值操作已经在for的语句2中执行*/ wordi+=n; wordi=0; p=0; while(ch=fgetc(f1p)!=EOF) if(namesearch(word) /*在当前文件中的名片的name成员中查找和当前字符串有否匹配,有则return 1,并且把该名片存放在全局变量card中,否则,return 0*/ p+; printcard(card,0); /*打印找到的名片*/ break; else if(f1p=NULL) printf(文件不能被打开n); if(p=0) printf(%s 不在名片簿中n,w

20、ord); fclose(f1p); else if(a=G|a=g) if(f1p!=NULL) printf(1.家庭 2.商务 3.朋友 4.用户n); printf(群组: ); scanf(%d,&grp); p=0; while(ch=fgetc(f1p)!=EOF) if(groupsearch(grp)/类似上面的namesearch,匹配群组 p+; printcard(card,0); else if(f1p=NULL) printf(文件打不开n); if(p=0) printf(群组是空的n); fclose(f1p); else if(a=C|a=c) if(f1p!

21、=NULL) printf(手机号码: ); getchar(); for(i=0;(c=getchar()!=n;i+) cellph1i=c; cellph1i=0; for(i=0;(cellphi=cellph1i)!=0;i+) ; cellphi+=n; cellphi=0; p=0; while(ch=fgetc(f1p)!=EOF) if(cellsearch(cellph)/类似上面的namesearch,匹配手机号码 p+; printcard(card,0); break; else if(f1p=NULL) printf(文件打不开n); if(p=0) printf(

22、%s 不在名片簿中n,cellph); fclose(f1p); else if(a=P|a=p) if(f1p!=NULL) printf(电话号码: ); getchar(); for(i=0;(c=getchar()!=n;i+) telph1i=c; telph1i=0; for(i=0;(telphi=telph1i)!=0;i+) ; telphi+=n; telphi=0; p=0; while(ch=fgetc(f1p)!=EOF) if(telsearch(telph)/类似上面的namesearch,匹配电话号码 p+; printcard(card,0); break;

23、else if(f1p=NULL) printf(文件打不开n); if(p=0) printf(%s 不在名片簿中n,card.phone); fclose(f1p); (3)模块运行结果图模块运行结果如图7-9所示。图7-9名片查询模块运行结果图7.3.7名片删除模块的设计与实现(1)画出名片删除模块流程图流程图如图7-10所示。图7-10 名片删除模块流程图(2)根据流程图编写源码void delete_compact(void) char d=0; search_compact(1); /调用查找模块,根据用户的要求,查找待删除名片 /查找到的时候,该名片也已经保存于 card全局变量

24、中 printf(删除?(Y/N)n); while(d!=y& d!=Y& d!=n& d!=N) d=getchar(); if(d=Y|d=y) deletecard(card.no); /根据查找到的名片编号,删除该名片void deletecard(int n) struct card tempcard; int d; char test50; if(filedirectory()=1) /判断当前有效文件 f1p=fopen(1.txt,r); /当前有效文件只读 f2p=fopen(2.txt,w); /备份文件只写 d=2; else if(filedirectory()=2)

25、 f2p=fopen(1.txt,w); /当前有效文件只读 f1p=fopen(2.txt,r); /备份文件只写 d=1; while(fgets(test,100,f1p)!=NULL)/当还有名片 fscanf(f1p,%d,&tempcard.no); fscanf(f1p,%d,&tempcard.group); fgetc(f1p); fgets(tempcard.name,100,f1p); fgets(tempcard.cphone,100,f1p); fgets(tempcard.phone,100,f1p); fgets(tempcard.address,100,f1p)

26、; fgets(tempcard.email,100,f1p); fgets(tempcard.note,100,f1p);/读一个名片到tempcard结构体变量中 if(tempcard.no!=n) /比较编号,是否待删除名片 /如果不是,则拷贝到备份文件中 fprintf(f2p,n); fprintf(f2p,%dn,tempcard.no); fprintf(f2p,%dn,tempcard.group); fprintf(f2p,%s,tempcard.name); fprintf(f2p,%s,tempcard.cphone); fprintf(f2p,%s,tempcard.

27、phone); fprintf(f2p,%s,tempcard.address); fprintf(f2p,%s,tempcard.email); fprintf(f2p,%s,tempcard.note); fclose(f1p); fclose(f2p); directoryedit(d,0); /改变有效文件标识(3)模块运行结果图模块运行结果如图7-11所示。图7-11 名片删除模块运行结果图7.3.8名片浏览模块的设计与实现(1)画出名片浏览模块流程图流程图如图7-12所示。图7-12名片浏览模块流程图(2)根据流程图编写源码void load(void) int i,count,d; struct card tempcard; char test100; d=filedirectory(); if(d=1) f1p=fopen(1.txt,r); else if(d=2) f1p=fopen(2.txt,r); if(f1p=NULL) printf(文件打不开或者不存在!n); return; while(fgets(test,100,f1p)!=NULL) /当还有名片 / 从当前有效文件中读取一个名片 fscanf(f1p

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1