还剩50页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
课程设计报告C语言课程设计通讯录管理系统系(院)计算机工程学院班级13级计科二班学生姓名学号老师任正云时间2014年6月3日学校荆楚理工学院摘要本通讯录信息管理系统用计算机管理电子通讯录的一种算机应用技术的创新在计算机还未普及之前通讯管理都是由联系人采用名片笔录手工记帐的方式来操作的.现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理通讯录管理系统是典型的信息管理系统MIS其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面对于前者要求建立起数据一致性和完整性强、数据安全性好的库而对于后者则要求应用程序功能完备易使用等特点经过分析我们使用 MICROSOFT公司的C语言开发工具利用其提供的各种面向对象的开发工具尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象首先在短时间内建立系统应用原型然后对初始原型系统进行需求迭代不断修正和改进直到形成用户满意的可行系统目录TOC\o1-3\h\z\u第一章前言3第二章系统设计
52.1系统设计的目的
52.2数据存储结构6第三章 系统主菜单的设计8第四章功能演示及说明
104.1启动程序界面
104.2主菜单功能及其实现
134.3添加功能
164.4查找功能
224.5修改功能
284.6全部输出功能
354.7删除功能
414.8格式化和退出功能45第五章总结
465.1C语言总结
475.2想法49第一章前言在当今社会,知识爆炸的年代里,科技的发展日新月异,我们都被无数无形的网充斥着,缠绕着,联系着信息网,互联网的到来把人与人之间的距离拉得更近了,人与人之间的关系也更复杂了基于此原因各个不同种类的通讯录层出不穷,然而在众多通讯录中存储功能多样性便成为人们关注的焦点同时,电脑语言的开发也日新月异,它的发展促使了很多通讯设备的革命性发展,当然通讯录也不例外 过去,人们都采用传统方式的手工记录通讯资料,即费时、易丢失、保密性也不高、效率太低,可以说传统意义上的手工记录已经不能适应现代人的要求所以人们急切的要求利用这些技术来进行创新,来提高工作效率,工作质量,减轻人们的工作压力 编辑通讯录系统,进一步提高现代人在工作,学习,生活中的效率,通过此通讯录程序来实现资料存储的合理化,查询资料的系统化,存储容量的规模化从而来替代传统意义上的手工记录 本软件采用C语言程序编程,运用子函数调用的方式实现了多个功能密码验证,通讯录基本功能(输入、载入、存储、查询等)本软件在中文版Dev-C++、CodeBlocks或VisualC++
6.0中运行操作简单方便,可移植性好本软件的特点是运行完一个操作,系统会自动回复到主菜单,以免忘记操作键并且为了加强系统的安全性,本软件适时的添入密码验证功能,让用户的信息得到保障缺点是本软件功能单一,只有通讯录的基本的,输入,载入,存储,查询、删除等功能第二章系统设计
2.1系统设计的目的课程设计为学生提供一个既动手又动脑的,独立实现的机会,将课上的理论知识与实践有机结合起来,锻炼我们的实践解决问题的能力提高实践能力,解决问题的能力
2.2数据存储结构通迅录基本存储信息姓名、QQ、电话、性别、出生年月等基本介绍姓名的保存,通过保存中文姓名以及英文姓名,方便后面的查找,然后基本的保存信息是QQ,电话,性别,出生年月等,在我的原计划中本来还想加上相片的,可是由于目前的知识有限无法做出,实属本程序的遗憾!!!对于要保存上述一个联系人的结构,我们需要新建一个专门适用于本程序的数据结构,通过struct来定义一个,下面就是本程序的定义结构的代码typedefstruct{charnamechina
[10];charnameenglish
[30];charpnumber
[13];charqq
[13];charsex
[4];intbirth
[3];}yuansu;yuansu则是来定义一个联系人的结构类型charnamechina
[10];是用来保存一个中文名字的,在写代码的开始时,我写的是charnamechina
[5];数组的大小定义为五个字节,我当时想,中文名字最多也就四个字的,所以五个字节足够存放的,但当我运行程序的时候,输出的是乱码,得不到我想要的结果,按照我当时的想法,应该没有,很合理啊!那到底哪里出错了?汉字也是字符啊!这也没有错啊!那到底是为什么了?就不卖关子了,汉字的确是字符,但是汉字的存储时需要两个字符的,当我用数组大小为5个字节的字符数组存放汉字,写入三个名字的汉字的时候,毫无疑问需要六个字节charnameenglish
[30];charpnumber
[13];charqq
[13];charsex
[4];其余的几个应该没有什么问题了,但还需要值得提一下的事,数组的大小应该比所存放的字节要大,是为了在字符的后面存放空字符第三章 系统主菜单的设计主菜单简单介绍
1、输入模块在主菜单的界面里,把输入模块作为第一个功能,当然,通讯录的首要功能当然是要保存联系人,而存入作为第一个也是可接受的当然在此模块中,有时候会出现一些添加重复,于是就想到添加防重复模块,当存入以存在的信息时,则显示一个提示,显示信息已存在
2、输出模块把输出作为第二个功能,根据该功能在平常日常生活中的使用频率来说,该功能的使用仅次于存于功能
3、修改模块该功能是改联系人的
4、查询模块:查询联系人
5、格式化模块该功能在一些人看来可能是多余的,可是我认为,有些时候需要从新存入,删除以前所有的联系人,这是一个很不错的功能
6、删除模块该模块提供的功能是,需要删除某个联系人,可以输入名字显示出来,然后进行删除
7、退出模块这个模块最为最后一个模块,在执行上面的所有的模块当中,返回的都是主菜单界面,所以需要一个来退出程序的功能,于是就把最后的一个功能作为退出程序在下一章节里,将会着重分析程序的思想以及每个模块的功能,会出现的问题,外加个人的思想第四章功能演示及说明在本章中,会先给出每个界面,然后对每个界面进行解说,从而来让大家明白本程序的编写原理以及思想,其中每个小节会演示一个功能
4.1启动程序界面在上图中可以看到,提示要输入密码,其作用是起到保护隐私的作用,而本程序所设置的密码为123456,而对于别人是不知道密码的,会输错密码,此时给出了人性化的提示,例如下图所示这个模块式通过调用一个函数来实现的,一下则是该函数的代码boolmimavoid{charp
[100];longin=0;printf请输入密码;fori=8;i0;i--//设置为只有8次机会{getsp;ifstrlenp!=6{puts请输入6位数字!;printf密码错误,你还有%ld次机会!!\ni-1;puts\n请从新输入;continue;}ifstrcmpchuship==0returntrue;elseprintf密码错误,你还有%ld次机会!!\ni-1;ifi-10//最后一次不需要输出printf\n请重新输入;}exit0;}本程序的主要思想可以用下面的结构图进行说明输入正确的密码123456,后得到的界面如下图从上面对色程序可以看出,输入正确的密码后,显示的是主界面,而不知道大家有没有注意到,在主界面的上面并没有刚开始输入密码的那些提示,这是为什么呢?这里说到底也是一个起到保护的作用(而主要是靠system“cls“;来进行刷屏),从而删除以前显示的所有字符好了,下面开始介绍本程序的重头戏了
4.2主菜单功能及其实现在上面的截图中,有主功能界面,而这写功能的选择及如何实现了,对此我们大家估计首先想到的是,使用switch,来选择,这的确是很好的一个法子,可是新的问题又来了,每一个功能都对应一个函数块,怎么来选择执行这些函数块了?对此我们需要用到函数指针,为此就把这些功能模块的函数原型都定义一样,bool函数名void;然后在定义一个函数指针bool*变量void;然后把函数名的地址赋给变量,使变量能只想该函数,而本程序的函数原型为boolmimavoid;//设置密码boolcunru;//向文件里存储boolduchu;//把文件里的数据全部读出来boolchazhao;//通过名字字符串来查找voidfenggevoid;//以输出一行“*”来构建boolgongneng;//功能选择voidzhixingchara;//执行所选择的功能boolxiugai;//修改boolgeshihua;//格式化文件boolshanchu;//删除联系人booltuichu;然后通过*变量void;来执行函数,就可以了,下面给出switch与函数的选择使用的代码voidzhixingchara{boolpd=false;bool*pst;switcha{case1:pst=cunru;break;case2:pst=chazhao;break;case3:pst=xiugai;break;case4:pst=duchu;break;case5:pst=shanchu;break;case6:pst=geshihua;break;case0:pst=tuichu;break;default:printf输入有误!!\n;whilegetchar==\n//去掉换行符,免得会在存入里面作为第一个输入字符break;systempause;return;}whilegetchar==\n//去掉换行符,免得会在存入里面作为第一个输入字符break;fengge;whilepd==false//返回值为false为失败,则任然需要继续执行,而返回true则不需要执行{pd=*pst;whilegetchar==\nbreak;}returntrue;}在上面的代码中,你可能也发现没有输出字符串的函数,也没有需要选择功能的输入函数,下面给出功能界面输出的模块boolgongneng{chara;fengge;printf请选择你所要执行的功能\n\n;printf
1、添加\n\n;printf
2、查找\n\n;printf
3、修改\n\n;printf
4、全部输出\n\n;printf
5、删除\n\n;printf
6、格式化文件\n\n;printf
0、退出\n\n;fengge;scanf%ca;zhixinga;returntrue;}scanf%ca;是通过键盘来输入一个字符,保存在变量a中,然后通过zhixinga;来调用zhixing这个函数,并把a中的值传递过去从而达到执行函数的目的
4.3添加功能在键盘上输入数字”1”然后回车可进入添加功能,可以得到的界面为并按照提示信息输入要存入的信息,当输入完信息后,按回车键会显示是否会继续存入还是退出,退出时会回到主界面上当然不这些信息都已经,存入到了另外开辟的文件里,而这个文件的名为txl.lkx的里面,位置为当前位置而此函数的的代码模块为boolcunru{systemcls;intlastcount=0;FILE*file;yuansuone
[1]two
[1];charazh;iffile=fopenD:\\txl.lkxab+==NULL//ab打开并创建二进制文件,结构体用二进制文件来存取{puts打开失败!!;returntrue;}printf请输入中文名字:;getsone-namechina;printf请输入英文名字;getsone-nameenglish;printf电话号码;getsone-pnumber;printfQQ号:;getsone-qq;printf性别;getsone-sex;printf出身年月(中间以逗号隔开);scanf%d%d%done-birth
[0]one-birth
[1]one-birth
[2];//需要加一个防重复的fseekfile0LSEEK_END;last=ftellfile;rewindfile;whilecountlast{fseekfilecountSEEK_SET;freadtwosizeofyuansu1file;count=count+sizeofyuansu;ifstrcmptwo-namechinaone-namechina==0strcmptwo-nameenglishone-nameenglish==0{fengge;printf\n此信息已存在!\n;whilegetchar==\n//去掉第106行的换行符break;fengge;printf\n;printf继续存入还是退出?
1、存入
2、退出\n;z=getchar;ifz==2returntrue;ifz==1{printf\n;fengge;returnfalse;}}}fclosefile;//从新打开存入iffile=fopenD:\\txl.lkxab+==NULL//ab打开并创建二进制文件,结构体用二进制文件来存取{puts打开失败!!;returntrue;}fwriteonesizeofyuansu1file;fclosefile;fengge;whilegetchar==\n//去掉第106行的换行符,免得会在存入里面作为第一个输入字符break;printf\n;printf继续存入还是退出?
1、存入
2、退出\n;z=getchar;ifz==2returntrue;elseifz==1{printf\n;fengge;returnfalse;}else{printf\n输入错误,请从新开始!!\n;systempause;returntrue;}}上面的代码看起来很长,对此下面会给出结构图来帮助理解这个功能对于上述功能中,有两个要值得提一下的是,第一就是,如何将结构数组的内容保存在文件中?iffile=fopenD:\\txl.lkxab+==NULL//ab打开并创建二进制文件,结构体用二进制文件来存取{puts打开失败!!;returntrue;}fwriteonesizeofyuansu1file;fclosefile;这就是存入文件的代码,可以看出,我并没有在信息输入后就直接存入,而是先关闭然后再打开存入,主要是考虑到,在存入文件中,避免格式出错,导致在输出的时候乱码,而且在存入的时候,我用到的事二进制存入方式“ab+”采取这种忖度方式的好处是,可以再文件不存在的时候,能新建一个,即能写也能读,写的的方式是在后面追加,并不会破坏先前的内从,读的话,相当于“rb”一样的功能,从用二进制的方式,也是防止数据的丢失;第二个需要值得提一下的是,在存入成功后马上接着会输出,是否继续存入,这样的提示,实现这样的功能是在执行模块和当前函数模块里的在执行模块的代码为whilepd==false//返回值为false为失败,则任然需要继续执//行,而返回true则不需要执行{pd=*pst;whilegetchar==\nbreak;}returntrue;在当前函数模块的代码为printf继续存入还是退出?
1、存入
2、退出\n;z=getchar;ifz==2returntrue;elsereturnfalse;可以看出,当要退出时,会返回一个布尔常量true而在执行的模块中,当函数的返回值true时,whilepd==false会停止循环,执行函数模块结束运行,此时回到了主函数里面,稍不注意就可以回认为程序运行结束,程序关闭,但是在本程序里面,此时会返回到显示主功能的界面里,接下来我们来看看主函数的代码,就会豁然开朗了主函数代码为intmainvoid{mima;systemcls;printf\n;while1{systemcls;gongneng;}systempause;return0;}在主函数里面有一个循环,而这个循环的后面圆括号里是1,也就是说可以无限制循环下去,此时又有人估计会有疑问,既然此循环无限制循环下去,那又怎么来结束程序呢?这个疑问将在讲退出模块里,具体来说明
4.4查找功能对于查找功能,实现应该很简单,只要找到与输入字符创相对应的就可以了,在着了采用的是名字作为查找标记,而本程序的查找是把应经存在文件里的内容按照结构体数组输出,在这里本程序在这个功能模块里只创建一个大小为一的结构体数组,将txl.lkx文件里的内容一个一个输出,输出一个就马上与要查找的字符串(也就是名字)进行比较,看是否相同,若相同则会输出,然后执行完循环直至结束,但是若找不到,则会显示找不到联系人在键盘上输入“2”,可以进入查找功能,显示的界面为然后按照提示输入你要查找的名字,输入汉字或拼音都可以当你输入你要查找的名字时,若当前文件存有你要查找的名字,则输入名字后显示出你要查找的名字的所有信息,并且会显示出是否继续查找按1继续,按2退出;若当前文件没有存有你要查找的名字,则会显示出查找失败或不存在的提示信息,并且会显示出是否继续查找按1继续,按2退出有关信息都存入好文件名为txl.lkx的文件当中而此函数的代码模块是boolchazhao{systemcls;FILE*file;yuansuone
[1];charhedui
[30]zi;intcount=0lastn=0;iffile=fopenD:\\txl.lkxab+==NULL\\打开并创建二进制文件,结构体用二进制文件来存取{puts打开失败!!;returntrue;}printf输入要查找的名字(输入汉字或者拼音);\\输入用户要查找的名字getshedui;fseekfile0LSEEK_END;\\将光标移至文件的最后面last=ftellfile;\\测试文件的末位置,并赋值给last.whilecountlast{fseekfilecountSEEK_SET;freadonesizeofyuansu1file;count=count+sizeofyuansu;ifstrcmpone-namechinahedui==0||strcmpone-nameenglishhedui==0{printf\n%sone-namechina;printf%s\n\none-nameenglish;printf电话%s\n\none-pnumber;printfQQ:%s\n\none-qq;printf性别%s\n\none-sex;printf出生年月%d年%d月%d日\none-birth
[0]one-birth
[1]one-birth
[2];fengge;n++;}}fclosefile;ifn==0{printf查找失败,或者不存在!!!\n;fengge;}printf\n;printf继续查找还是退出?
1、查找
2、退出\n;zi=getchar;ifzi==2returntrue;ifzi==1printf\n;fengge;returnfalse;}查找这一功能的代码比较长,可以用流程图来帮助理解对于查找这一功能,比较注意的几个部分是第一代码为fseekfile0LSEEK_END;last=ftellfile;虽然代码比较简单,但还是比较需要注意的地方,这一代码的作用是将光标移至文件的末位置,并赋值给last,这一步是必须做的第二代码为whilecountlast{fseekfilecountSEEK_SET;freadonesizeofyuansu1file;count=count+sizeofyuansu;这几行代码看似简单,但却是必不可少的,首先fseek函数将光标移至文件的开头位置,这个的意思是将用户所要查找的信息从文件的第一个存储的信息开始核对,这样的话就不会漏掉一个要进行核对的信息,然后将文件中第一个人的信息存入数组one中,这样就可以在数组中于用户要查找的姓名进行核对最后将一个人的信息所占的字节数赋值给count中,这样做的原因是进行countlast的比较,这样就达到当用户输入要查找的名字时,从第一个开始,并逐一进行比较的目的,知道与最后一个人的姓名核对之后才会结束第三代码为ifstrcmpone-namechinahedui==0||strcmpone-nameenglishhedui==0{printf\n%sone-namechina;printf%s\n\none-nameenglish;printf电话%s\n\none-pnumber;printfQQ:%s\n\none-qq;printf性别%s\n\none-sex;printf出生年月%d年%d月%d日\none-birth
[0]one-birth
[1]one-birth
[2];fengge;n++;}}fclosefile;这一段代码比较长,但确很容易理解这一段代码的作用是,将用户输入的中文名字或者英文名字和文件内存储的信息名字相核对若一样的话则将该人的相关信息输出若不存在,程序会显示出相关提示信息第四代码为zi=getchar;ifzi==2returntrue;ifzi==1printf\n;fengge;该代码也相对比较简单,当用户输入的是2是,则程序将退出此功能,当用户输入的是1是,则程序将返回开始重新执行这里的分割功能主要是使提示信息显示的时候比较清晰,容易懂在做这个功能代码的整体思想应该为首先应该定义一个文件指针类型,然后在定义两个字符数组,用来存放文件内的信息和用户输入的信息因为核对信息的时候从文件的开头开始核对,所以应该知道什么时候文件内的信息就是最后一个所以利用fseek函数测出文件的末位置,再利用while函数进行一一核对一样是,再利用if语句将此人的相关信息输出还需要啰嗦一下的是,怎么来知道内容不存在,而输出一个提示呢?对此我想到的一个方法是,定义一个整数n=0然后把它放在ifstrcmpone-namechinahedui==0||strcmpone-nameenglishhedui==0{}大括号里,对其进行自加,然后在本函数块的结尾给出一个判断,看n==0若成立,则说明n没有进行自加,也说明不存在要查找的信息,就直接输出此信息不存在即可;反之,若n==0不成立则会导致要查找的信息存在,就会使本函数正常结束返回true即可
4.5修改功能修改功能,大家通过字面上的意思应该就可以知道,修改已存在信息,首先我们肯定需要输入名字查找,将该信息显示然后在选择需要修改的信息,然后在存入文件中虽然这几步看似简单,但是他比我们所想的要复杂的多,并且这里的查找功能与上一个小节的查找实现是不一样的,先来显示一下该功能的界面通过键盘输入数字3,回车我们可以得到修改界面在上图中,我们可以看到,当写入yangguanlin(也可以写杨冠林)时,回车可以得到这个联系人的信息,下面接着是显示你所要修改的目录这个功能块的代码为boolxiugai{systemcls;FILE*file;yuansuone[max];charhedui
[30]zihz;intcount=0lastjim=0n=0;iffile=fopenD:\\txl.lkxab+==NULL{puts打开失败!!;returntrue;}printf输入要修改的名字(输入汉字或者拼音);getshedui;fseekfile0LSEEK_END;last=ftellfile;rewindfile;whilecountlast{//fseekfilecountSEEK_SET;freadone[m]sizeofyuansu1file;ifstrcmpone[m].namechinahedui==0||strcmpone[m].nameenglishhedui==0{printf\n%sone[m].namechina;printf%s\n\none[m].nameenglish;printf电话%s\n\none[m].pnumber;printfQQ:%s\n\none[m].qq;printf性别%s\n\none[m].sex;printf出生年月%d年%d月%d日\none[m].birth
[0]one[m].birth
[1]one[m].birth
[2];//找出要修的,就开始修改printf\n;printf选择你要修改的部分\n\n;printf
1、中文名字\n;printf
2、英文名字\n;printf
3、电话号码\n;printf
4、QQ号\n;printf
5、性别\n;printf
6、出身年月(中间以逗号隔开)\n;printf\n输入数字;zi=getchar;whileh=getchar==\nbreak;switchzi{case1:{printf\n请输入中文名字:;getsone[m].namechina;}break;case2:{printf\n请输入英文名字;getsone[m].nameenglish;}break;case3:{printf\n电话号码;getsone[m].pnumber;}break;case4:{printf\nQQ号:;getsone[m].qq;}break;case5:{printf\n性别;getsone[m].sex;}break;case6:{printf\n出身年月(中间以逗号隔开);scanf%d%d%done[m].birth
[0]one[m].birth
[1]one[m].birth
[2];}break;}n++;}m++;count=count+sizeofyuansu;}fclosefile;//确认是否修改ifn==0printf查找失败,或不存在!!!\n;else{printf确定修改?
1、确定
2、退出\n;z=getchar;ifz==2returntrue;ifz==1{whilegetchar==\nbreak;//returnfalse;}}//把文件清空file=fopenD:\\txl.lkxwb+;freadonesizeofyuansu1file;fclosefile;iffile=fopenD:\\txl.lkxab+==NULL//wb+先将文件清空在存{puts打开失败!!;returntrue;}rewindfile;m=0;count=0;whilecountlast{fwriteone[m]sizeofyuansu1file;count=count+sizeofyuansu;++m;}fclosefile;fengge;printf\n;printf继续修改还是退出?
1、修改
2、退出\n;z=getchar;ifz==2returntrue;ifz==1printf\n;fengge;returnfalse;//returntrue;}直接看这个函数块的代码,可能很纠结,下面给出这个功能块的流程图来说明下通过这个流程图,大家就可以很好理解这个功能模块了,下面我们来具体分析这个修改模块的精髓地方首先我来谈一下我自己刚开始写这个模块的想法,对于修改我首先想到的事将他查找出来,然后在进行修改,修改后在放回文件,以此来达到修改的目的,可是当我把这个代码写好后进行调试后是,发现用查找功能来进行查找那个修改的联系人,会显示两个,修改三次的时候,查找就会显示三次,对此才知道,那个想法是无法达到目的的,修改后的信息再次存入到文件中时,并不会覆盖原有的内容,只会在后面追加,就无法达到修改的目的对此又想到另一种方法,首先定义一个很大结构体数组(本程序的数组大小设置为1000,这也导致了一个弊端,存放联系人的个数有限),把文件里的信息全部输出来,然后需要修改哪一个就查找到对应的信息,马上修改修改完后放回原数组位置,剩下的就是把这些信息放入到文件中去,如果和刚才一样直接放进去,那么会出现同样的问题,对此在放入之前需要对文件进行清空,然后存放,这样就可以达到目的file=fopentxl.lkxwb+;fclosefile;上面两行代码则可以达到清空作用,“wb+”同样是以二进制方式打开,但是他的方式有些不同,打开的时候会把文件里面的内容清空,在关闭文件,在存放的时候,从新以“ab+”方式打开存入即可当然写入文件的方式,是在修改后,并不是马上存入文件的,而是采取和添加一样的形式,这里我详细解释一样下为什么要这么做?我们使用fopen来打开问价的时候,一般情况是指在文件的开始位置,然而向里面存入或读出的时候都会使文件的指向发生偏移,不知道大家有没有注意到没,在上面的代码中可能有人注意到rewind这个函数,这是干什么用的呢?这是可以使文件指向位置发生变化的,其作用是使其位置指向文件的开始位置而我关闭文件在打开从新存入文件也是取得这样类似的效果,当然也有人就纳闷,直接使用rewind不好些,何必写那么多代码?当然我也想这样,但是使用关闭文件重新打开存入,可以再避免查找遗漏,关闭后在存入,然后马上执行查找他会从文件的开始位置查找,而不会从上次查找的地方接着向下查找从而导致有些会遗漏简单用流程图来总结一下上面的表述
4.6全部输出功能在键盘上输入4后可以进入全部输出功能显示界面为:如图所示程序将文件内的所用信息全部输出.然后根据用户的需要可以查询用户所要查询的信息.此函数的代码为:boolduchu{systemcls;yuansuone
[1];FILE*file;\\定义一个文件指正类型intm=0;intcount=0last;iffile=fopentxl.lkxab+==NULL\\将存储数据的文件打开{printfcannotopenfile\n;returnfalse;}fseekfile0LSEEK_END;\\将文件的光标移至末尾last=ftellfile;\\获取文件的末位置rewindfile;whilecountlast{//fseekfilecountSEEK_SET;fengge;\\分割功能使输出的信息更加清晰freadonesizeofyuansu1file;count=count+sizeofyuansu;printf\n%sone-namechina;printf%s\n\none-nameenglish;printf电话:%s\n\none-pnumber;printfQQ:%s\n\none-qq;printf性别:%s\n\none-sex;printf出生年月:%d年%d月%d日\none-birth
[0]one-birth
[1]one-birth
[2];m++;}fclosefile;ifm==0printf\n内容为空!!!\n;printf\n\n按回车键键退出!\n;returntrue;}该功能可用流程图表示,将更加方便理解:在设计此功能的时候,应注意的几点为第一代码为yuansuone
[1];FILE*file;intm=0;intcount=0last;iffile=fopentxl.lkxab+==NULL{printfcannotopenfile\n;returnfalse;}先定义一个结构体数组,该数组是用来存放文件内将要输出的信息,然后在利用数组将其输出然后在定义一个文件指针类型,该指针用来指向存放数据的文件然后在将存放数据的文件打开在输出信息前,一定先将文件打开第二代码为fseekfile0LSEEK_END;last=ftellfile;rewindfile;这几行代码虽然很少,但确必不可少先利用fseek函数将文件的光标移至末位置,然后在将末位置赋给last,last就作为后面while循环的条件然后记得在将光标移至文件的开头位置,因为要从开头将信息一一输出,这样才不会漏掉一个第三代码为whilecountlast{//fseekfilecountSEEK_SET;fengge;freadonesizeofyuansu1file;count=count+sizeofyuansu;printf\n%sone-namechina;printf%s\n\none-nameenglish;printf电话:%s\n\none-pnumber;printfQQ:%s\n\none-qq;printf性别:%s\n\none-sex;printf出生年月:%d年%d月%d日\none-birth
[0]one-birth
[1]one-birth
[2];m++;}这几行代码看似复杂,但其实就是一个简单的while循环当文件内的光标不在文件的末位置时,将文件内的信息一一输出,知道光标处于文件的末位置是,文件内的信息也就全部输出了每输出一个信息时,令m加
1.这样是为了下面的if语句在全部输出以后切记要关闭存储数据文件第四代码为ifm==0printf\n内容为空!!!\n;printf\n\n按回车键键退出!\n;returntrue;这是一个简单的if语句,是用来当文件内的数据为空时,用来提示用户当前文件的数据为空的这个程序总体来说,设计的时候相对比较的简单,在设计的时候主要需要注意将文件的末位置搞出来,用来while循环的条件然后再将文件内的数据一一输出,这样输出的时候才不会漏掉一个文件内的信息
4.7删除功能在写这个程序的时候,并没有用到任何链表的知识,在写这个功能的时候,我想没有链表也无所谓吧!最后程序写成功的时候,发现其实在删除某一个信息的时候,链表的方便真是无与伦比了,太强大了,虽然我没有用到链表把删除功能给做出来了,但是却存在很大的遗憾,这里先大致说一下,待会就详说首先我满来看看删除更能的界面有上图可以看出,先查找然后在进行删除,并提示是否删除在本程序里面,我事先保存了两个联系人,现在删除一个那么在txl.lkx文件里面应该只保存了一个联系人信息,对吧!用全部输出功能,也只能输出一个,下面我们来看如下的截图由上信息我们可以看出,虽然把信息给删除了,可是在在txl.lkx里面还是占据了内存,并以空信息的方式输出了,倘若是链表的话就不会出现这样的缺陷了但是如今的技术发达,内存都很大,所以这些问题也不算是很大的问题下面我们来看看这个功能的代码吧!boolshanchu{systemcls;FILE*file;yuansuone[max];charhedui
[30]zihz;intcount=0lastjim=0n=0;iffile=fopentxl.lkxab+==NULL{puts打开失败!!;returntrue;}printf输入要删除的名字(输入汉字或者拼音);getshedui;fseekfile0LSEEK_END;last=ftellfile;rewindfile;whilecountlast{//fseekfilecountSEEK_SET;freadone[m]sizeofyuansu1file;ifstrcmpone[m].namechinahedui==0||strcmpone[m].nameenglishhedui==0{printf\n%sone[m].namechina;printf%s\n\none[m].nameenglish;printf电话%s\n\none[m].pnumber;printfQQ:%s\n\none[m].qq;printf性别%s\n\none[m].sex;printf出生年月%d年%d月%d日\none[m].birth
[0]one[m].birth
[1]one[m].birth
[2];n++;ji=m;}m++;count=count+sizeofyuansu;}fclosefile;ifn==0printf查找失败,或不存在!!!\n;else{printf\n确定删除?
1、确定
2、退出\n;z=getchar;ifz==2returntrue;ifz==1{whilegetchar==\nbreak;//returnfalse;}}//移动数组的元素进行删除whilejim{one[ji]=one[ji+1];ji++;}file=fopentxl.lkxwb+;freadonesizeofyuansu1file;fclosefile;iffile=fopentxl.lkxab+==NULL//wb+先将文件清空在存入{puts打开失败!!;returntrue;}rewindfile;m=0;count=0;whilecountlast{fwriteone[m]sizeofyuansu1file;count=count+sizeofyuansu;++m;}fclosefile;fengge;printf\n;printf继续删除还是退出?
1、删除
2、退出\n;z=getchar;ifz==2returntrue;ifz==1printf\n;fengge;returnfalse;}用表格的形式来演示本功能的原理,下列是演示删除第二个联系人信息1信息2信息3…….信息n信息1信息3…….信息n信息n+1数组一旦确定后并放入了数据就无法修改数组的大小,这大家都知道的,所以从上图大家可以看出,删除一个信息后,必然会在后面引入一个数组,才能保证数组大小不变,也就会出现上图中输出空白信息,就是这样造成的所以在此建议大家以后写这样的程序时,就把链表的知识引用到里面去吧!其他的相信大家也都看得懂,我也不多啰嗦了下面简单介绍下格式化和退出功能
4.8格式化和退出功能格式化功能这连个功能比较简单所以我就放在一起讲首先来讲讲格式化功能,在文件管理这一章里面,我们都学过打开文件,以何种方式打开,而本功能就是用到这点知识,file=fopentxl.lkxwb+才用wb+的形式打开,二进制方式打开,在打开的时候就把文件给清空了下面来给出代码boolgeshihua{systemcls;FILE*file;yuansuone
[1];charz;printf确定格式化?
1、确定
2、退出\n;z=getchar;ifz==2returntrue;ifz==1;iffile=fopentxl.lkxwb+==NULL{puts打开失败!!;returntrue;}freadonesizeofyuansu1file;fclosefile;puts格式化成功!!!;systempause;returntrue;}退出功能上面已经介绍过,主函数里面有个死循环,也就是不会终止的循环,所以如果不出意外的话,程序会无休止的循环下去,对此可以使用exit0函数来结束程序,从而退出下面给出代码booltuichu{exit0;}第五章总结在本程序的设计开始时候,由于是第一次写,所以许多准备工作都做得不足,到时再此程序中有许多地方不够严谨,希望可以谅解,现在我总体来说说本程序本程序主要是建立一个二进制文件,然后对此文件进行一系列操作比如对此文件的数据进行查找、修改、添加、输出、存入,然后在对此文件设计一个加密功能在用分割功能对输出的数据和对用户的提示信息进行分割,使信息更加清晰使用户更加容易懂设计者的用意
5.1C语言总结此程序用了C语言的大量知识第一结构体在程序开头需要定义一个结构体,结构体内容包括姓名(中文和英文)、性别、电话号、QQ号、出身年月日建立一个结构体的目的是在对文件进行操作时,方便对数据进行处理在C语言中,结构体是不同数据类型的集合所以,避免了对信息的批量定义方便简单在此程序中,涉及到对结构体变量的引用结构体成员的表示方法为结构体变量名.成员名其中.是成员运算符,用于连接结构体类型变量名和成员名它在所用运算符中的优先级最高,因此把“结构体变量名.成员名”作为一个整体来对待,且整体的数据类型与结构体中该成员的数据类型相同此程序还涉及到对结构体变量的定义和初始化,还有结构体数组这些都是C中的基本知识都比较简单还涉及到结构体指针的有关知识、指向结构体数组的指针第二函数是C语言程序的基本模块,由于采用了函数模块的结构,C语言易于实现结构化程序设计,使程序的结构清晰、减少重复编写程序的工作量、提高程序的可续行和可维护性本程序中使用了标准库函数例如scanf、printf、这些都是C语言中常用的库函数本程序中还有我们自己定义的函数例如boolmimavoid;//设置密码boolcunru;//向文件里存储boolduchu;//把文件里的数据全部读出来boolchazhao;//通过名字字符串来voidfenggevoid;//以输出一行“*”来构建boolgongneng;//功能选择voidzhixingchara;//执行所选择的功能boolxiugai;//修改boolgeshihua;//格式化文件boolshanchu;//删除联系人booltuichu;这些函数都是对文件进行处理的函数,在主函数中进行调用对于函数的调用,可以使主函数更加简单易懂,在函数调用之前,必须对被调函数进行声明,不然的话无法使用被调函数此函数还涉及到符号常量#definechushi123456//初始密码#definemax1000使用符号常量的好处就是在后面设计程序是使用简单第三数组和指针数组是同类型数据的有序集合也就是说,数组有若干个元素组成的,其中所有元素都属于同一个基本数据类型,而且它们的先后次序是确定的指针式C语言中广泛使用得一种数据类型使用指针,可以有效的表示复杂的数据结构指针在C语言中是最复杂的知识,数组和指针混在一起就更比较复杂了定义一个指向数组的指针,将更有效的对数组内的数据进行操作第四文件我们写设计的程序既然是对文件进行相关处理,所以也缺少不了C语言中的文件的知识文件这一知识也比较简单,主要掌握几个主要函数就可以了此程序主要用了fopen函数(将要处理的文件打开)、fclose函数(将要处理的文件关闭)、fread函数(对文件内的数据进行读)、fwrite(对文件进行写)、还有rewind函数(将文件的光标移至文件开头)、fseek函数(改变文件位置标记)、ftell函数(测定文件位置标记的当前位置)
5.2想法写完本程序后,有些想法
1、在写程序之前,首先我觉得要确定好这个程序是要干什么,要有哪些功能,希望得到哪些效果等,没有必要一想到要写程序就不加思考就开始写下面的代码#includestdio.hintmainvoid{return0;}然后边敲边想要做什么东西,我开始就是这样,想敲代码再说,写完这个功能再说,下一个功能就放在一边不管,如此犯了大忌,一个程序每个功能模块都是有关联的,并不是分隔独立的,所以在想要写这个程序之前要总体分析这个程序然后仔细分析每个功能模块,分析之间的关联进行分析,得出要写哪些函数,进而让我们在写的时候能少走一点弯路,免得到时候写的时候,又要大规模的改动,改程序本来也是一件很伤神的事
2、还有一点值得注意的是,在写程序的时候,我们要时刻注意按入的回车键,因为我们按入的回车键很有可能作为下次的字符输入进去了,从而导致输入错误,特别是在马上输入数据后,接着又要输入字符的时候,就要注意第一次输入按下的回车键会马上就为下次的字符输入,从而导致第二次输入的字符而无法输入,这就造成输入错误我们可以用如下的代码来除掉这个字符whilegetchar==\nbreak;上面这两行代码这能除掉一个字符,当然一般的情况只需要除掉一个字符就可以了
3、还有一点要注意的就是,我们需要按程序更加健壮,更加人性化,我们需要在从键盘输入数字来选择的时候,有时候一不小心输错了,那该怎么办了?这的确是一个头疼的问题,在这个程序里就有部分代码就是放错误输入而写的,比如switcha{case1:pst=cunru;break;case2:pst=chazhao;break;case3:pst=xiugai;break;case4:pst=duchu;break;case5:pst=shanchu;break;case6:pst=geshihua;break;case0:pst=tuichu;break;default:printf输入有误!!\n;whilegetchar==\n//去掉换行符,免得会在存入里面作为第一个输入字符break;systempause;return;}这里有一个printf输入有误!!\n;就是起到这样的作用通讯录姓名QQ电话性别出身年月日通讯录输入板块输出板块修改板块查询板块格式化板块删除板块系统板块按中文查找找按英文查找退出输入密码密码正确,进入主菜单密码错误,从新输入,并限制次数密码?输出提示信息,对其输入信息判断是否重复?则显示重复,并不会存入,提示结束还是继续存入否将信息存入文件中,提示结束还是继续存入是输入2,执行查找功能打开文件输入要查找的名字当前光标是否处于文件末尾否将文件内的第一个名字与所要查找的名字核对将光标移向下一个名字处否名字是否相同?是输出相关信息输入要查找的对象打开文件,将信息全部输出到大数组里,然后逐一核对有相同信息吗?则输查找失败,提示是否继续查找,还是退出否是输出联系人的信息,并修改,后放回原位置不动,然后就将存放信息的数组放回文件即可存放成功后,最后提示是继续修改还是退出将txl.lkx文件全写入one[max]根据查找到信息进行修改,修改后放回原数组将txl.lkx的内容清空将存放信息的数组放入文件即可打开存储数据的文件获取文件的末位置将光标移至文件的开头是否是否按回车键结束输出功能M的值是否为0将当前的信息全部输出在令m加一将当前要输出信息的字节数赋给count光标是否处于文件的末位置当前文件为空。