1、个人通讯录管理系统C语言课程设计报告重庆科技学院C语言程序设计课程设计报告 学 院:_电气与信息工程学院_ 专业班级: 电自专2011-01 学生姓名: 蒋 洪 山 学 号: 2011630194 设计地点(单位)_ I515 _ _设计题目:_个人通讯录管理系统 _ 完成日期: 2012 年12月28日 指导教师评语: _ _ _ _ 成绩(五级记分制):_ _ 指导教师(签字):_ _ 重庆科技学院C语言程序设计课程设计报告摘要本次课程设计的题目为个人通讯录管理系统,要求将程序中所输入的联系人姓名、电话和地址信息这三个数据以文本方式保存在磁盘中,并且能够对所储存的联系人信息进行显示、查询、
2、修改、删除等功能。我编写的程序从整体上看可分为两个部分,一部分为文件的建立、读取和保存,另一部分为通讯录功能的实现。在文件部分,我通过readfile()函数和writefile()函数从而实现了对磁盘上数据的进行写和读,通过刚开始的界面提示可以知道文件是否建立,以免丢失数据,我还为用户设计了保存退出和不保存退出两大功能供用户做选择。在模块功能实现部分,通过scanf从键盘上输入的数字放到switch() case 循环中来实现调用zengjia()、shanchu()、xiugai()、chazhao()等十五个函数来实现“添加”、“查询和显示”、“修改”、“删除”等不同功能。关键字:文件、
3、数组、循环、函数重庆科技学院课程设计任务书设计题目:个人通讯录管理系统学生姓名蒋洪山课程名称C语言程序设计课程设计专业班级电自专2011地 点I515起止时间2012年12月17日-12月28日设计内容及要求建立一通讯录,输入姓名、电话号码、住址等信息,然后对通信簿进行显示、查找、添加、修改及删除。进一步掌握利用C语言进行程序设计的能力;进一步理解和运用结构化程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;学会利用流程图表示算法。根据题目要求,运用所学知识,完成设计和实现工作,并按照书写规范,撰写课程设计报告。设计参数(1)系统分析、设计正确。(2
4、)结果以图表方式显示。(3)界面简洁、美观。(4)报告格式规范。进度要求周一:明确设计任务,学习相关基础知识周二:熟悉各知识点,进行基础练习周三:根据题目要求,进行设计和实现周四:根据题目要求,进行设计和实现周五:撰写报告,进行答辩参考资料1何钦铭 颜晖.语言程序设计.高等教育出版社.2008年2谭浩强 张基温.语言程序设计教程.高等教育出版社.2006年其它说明.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。.若填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。教研室主任: 指导教师:雷亮 2012年12月10日3
5、3目录第一章 软件需求分析说明书11.1设计软件的目的分析11.2软件的界面要求11.3详细的功能分析11.3.1创建文件11.3.2 添加联系人11.3.3显示和查询联系人11.3.4 删除联系人11.3.5 修改联系人11.3.6 保存退出与不保存退出11.4设计要求分析21.5软件的数据结构分析21.5.1 软件的函数21.5.2 文件的调用和保存2第二章 系统分析与设计32.1 软件界面设计32.2 软件的数据(结构)设计32.2.1 软件的文件功能32.2.2 文件内部的数据格式32.3 软件的模块图32.4 软件的流程图42.4.1 添加联系人程序流程图42.4.2 显示和查找联系
6、人程序流程图52.4.3 删除联系人流程图52.4.4 修改联系人流程图6第三章 软件的实现83.1 函数声明83.2 zhucaidan()主菜单函数83.3 main()主函数93.4 readfile()读取文件函数93.5 writefile()联系人写入文件函数103.6 zengjia()增加联系人函数113.7 shanchu()删除函数主界面113.8 xianshi()显示和查询函数123.9 xianshi()显示所有人函数133.10 chazhao_xingming()姓名查询函数133.11 chazhao_dianhua()按号码查询函数143.12 shanchu
7、_dange()删除单个联系人函数153.13 shanchu_quanbu()删除所有联系人函数153.14 shanchu_xingming()按姓名删除联系人函数163.15 shanchu_dianhua()按电话号码删除函数173.16 xiugai()修改函数主体界面183.17 xiugai_xingming()按姓名修改193.18 xiugai_dianhua()按号码修改联系人函数20第四章 软件测试224.1 文件导入界面224.2 软件的主界面224.3 添加联系人模块224.4 显示和查找联系人界面234.4.1主界面234.4.2无联系人的显示界面234.4.3有联
8、系人的显示界面244.4.4按姓名查找244.4.5 按电话号码查找244.5 删除联系人模块254.5.1删除联系人主界面254.5.2没有对应联系人的删除界面254.5.3按姓名删除254.5.4按电话号码删除264.6 修改联系人模块264.6.1修改联系人主菜单264.6.2 按姓名修改274.6.3按电话修改274.7 退出284.7.1 保存退出284.7.2 不保存退出28第五章总结与体会29致谢30参考文献31第一章 软件需求分析说明书1.1设计软件的目的分析本软件要求用C语言建立一通讯录,输入姓名、电话号码、住址等信息,然后对通信录进行显示、查找、添加、修改及删除。1.2软件
9、的界面要求本软件要求软件的界面简洁、美观,让人一目了然,使用起来方便。于是我设计的软件首先提示您是否有通讯录文件存在,如没有文件,则自动建立一个,如有文件存在,则提示导入成功,让人直观明白的了解文件的情况。按任意键便可以进入主菜单,在主菜单上显示出软件的功能,通过输入数字0到5来进行选择便可以实现你所需要的功能,每个模块进入模块内部实现软件的具体功能,实现您所需要的功能。1.3详细的功能分析该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。下面六个模块都是利用C语言文件,向文件中添加数据、修改数据、查询数据、删除数据和保存数据。1.3.1创建文件用fopen()建立
10、一个文本文件,然后向其中输入数据(例如,向文件中输入“姓名”,“地址”,“号码”等),并对文件进行命名。1.3.2 添加联系人通过键盘输入通讯录人员的姓名、电话号码、地址信息便可实现将信息添加到通讯录文件内,添加完毕后,系统会自动询问你是否继续添加,如你想继续添加,再通过键盘输入通讯录人员的姓名、电话号码、地址信息即可实现继续添加。1.3.3显示和查询联系人通过前面第一个模块打得录入我们便可以执行第二个模块,通过第二个模块我们可以进行对联系人进行显示和查找。我通过调用showall()函数来进行显示所有的联系人,showall()函数可以实现逐个显示联系人。对于查找联系人我则采用了search
11、()函数来进行查找联系人,我提供了两种查找方法:按照姓名查找;按照电话号码查找。1.3.4 删除联系人我调用deletecd()函数来实现删除功能,同样我也提供给了两种删除方法:全部删除;单个删除。其中全部删除会提示是否全部删除,以免误删。1.3.5 修改联系人我调用modify()函数来实现修改功能,我同样提供了两种修改方法:对姓名进行修改;对电话号码进行修改。修改完毕后会提示是否据需修改。1.3.6 保存退出与不保存退出你还在为误添加、误修改、误删除后悔吗?还想回到以前的数据吗?这个担忧在我的程序中您就不必担心了,我为程序提供了两种退出方式:保存退出;不保存退出。完全解决您的后顾之忧。1.
12、4设计要求分析进一步掌握利用C语言进行程序设计的能力;进一步理解和运用结构化程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;学会利用流程图表示算法。根据题目要求,运用所学知识,完成设计和实现工作,并按照书写规范,撰写课程设计报告。1.5软件的数据结构分析1.5.1 软件的函数本软件采用了不同的函数来进行定义不同模块的功能,通过调用不同的函数,可以实现不同的功能。软件中采用了五个主体函数来实现添加联系人,修改联系人,查找联系人,显示联系人,删除联系人的功能。1.5.2 文件的调用和保存本软件通过文本方式对用户所录入的信息进行保存。通过保存下来的文本,
13、您可以在电脑磁盘中找到您存入文件的位置,打开后便可以找到您所录入的通讯录信息。第二章 系统分析与设计2.1 软件界面设计画出软件全部输入、输出数据的界面,并对每一个界面进行详细的操作说明2.2 软件的数据(结构)设计 软件调用不同的函数来实现不同的功能,通过反复调用函数来实现反复输入。代码中通过scanf从键盘上输入不同的数字选项,然后通过swtich case()来实现对不同函数的调用。2.2.1 软件的文件功能软件采用了文本文档进行存取,我在C盘建立了一个txl文本文档用于存取输入的信息,打开C盘后就能直接看到您录入的信息,很方便和快捷。2.2.2 文件内部的数据格式我采用了readfil
14、e()函数来读取文件,使用if(fp=fopen(c:通讯录.txt,r)=NULL)以只读方式打开判定文件是否为空,如果不空,则使用fseek(fp,0,2); 文件位置指针移动到文件末尾以来进行写入数据。使用writefile()将联系人写入文件,用if (fp=fopen(c:通讯录.txt,w)=NULL)以只写的方式来对判定文件是否为空,如果不为空,则从键盘上录入所需要录入的信息存到相应的文件中。最后通过fclose(fp)来关闭文件,回到主界面上等待用户输入新的操作。2.3 软件的模块图软件的模块图很直观的反映出软件能够实现的功能,由下面的模块图可以很直观的看出我设计的通讯录软件能
15、够方便的实现添加联系人、显示联系人、删除联系人、修改联系人功能,另外,我设计的软件还实现了保存退出和不保存退出功能,这个功能很独特。在增加联系人部分,我用了三个函数调用来分别实现录入联系人姓名、号码、地址。在显示和查询联系人部分,我也有三个模块: 逐个显示联系人,按姓名查询,按号码查询。在删除联系人部分,我设计了三个界面,可以实现全部删除,单个删除,回到主菜单。在修改联系人模块,我也设计了三个界面,按姓名修改,按号码修改,回到主菜单。最后我设计了保存退出和不保存退出,针对那些修改后却又后悔修改的用户需要。主界面添加联系人显示和查询联系人删除联系人保存退出修改联系人不保存退出输入姓名输入号码显示
16、联系人按姓名查询全部删除删除单个按姓名修改按号码修改保存退出不保存退出输入地址按号码查询回主菜单回主菜单图2.1软件的模块图2.4 软件的流程图由于程序流程图较为复杂,我采用了分块画出程序流程图2.4.1 添加联系人程序流程图由添加联系人的程序流程图可以看出,在添加联系人板块上,我设计了三种信息,输入姓名,输入电话和输入地址,输入完成后会提示是否继续输入,如果输入y后则可以继续输入,输入n后返回主菜单。主界面添加联系人输入姓名输入电话输入地址是否继续添加Y/yN/n开始图2.2添加联系人程序流程图2.4.2 显示和查找联系人程序流程图在主菜单上输入2后便可以进入显示和查询联系人的主界面,我为您
17、提供了三个选项,1.显示全部 2.按姓名查询 3.按电话查询。输入对应的数字便可以实现对应的功能,同理,系统会在您查询完毕后询问您是否继续查询,操作同上。主界面显示和查询联系人显示全部按姓名查询按电话查询是否继续查询Y/yN/n开始图2.3显示和查找联系人程序流程图2.4.3 删除联系人流程图在删除联系人流程图上,我设计了全部删除和单个删除功能,单个删除设计了按照姓名删除和按电话号码删除两种选择,在删除时,系统都会询问您是否删除,以免误删。主界面删除联系人删除所有单个删除确认是否删除N/n按姓名删除按电话删除删除成功Y/y开始图2.4删除联系人流程图2.4.4 修改联系人流程图修改联系人界面上
18、我设计了按姓名修改和按号码修改两种方式,当选择时系统会提示您是否修改,若不修改则返回主界面,若选择是,则系统会该处三个修改项目:修改姓名,修改电话,修改地址,修改完毕后系统会提示您是否继续修改,如不修改,则又返回主界面等待输入。主界面修改联系人按姓名修改按号码修改确认是否继续修改Y/yN/n修改姓名修改电话修改地址确认是否修改Y/yN/n开始图2.5修改联系人流程图第三章 软件的实现3.1 函数声明void zhucaidan(); /*主菜单函数*/void zengjia(); /*增加联系人函数*/void readfile(); /*文件中读入函数*/void writefile();
19、 /*文件中写入函数*/void xiugai(); /*修改联系人函数*/void xiugai_xingming(); /*姓名修改*/void xiugai_dianhua(); /*电话号码修改*/void chazhao(); /*查找联系人函数*/void chazhao_xingming(); /*按姓名查找*/void chazhao_dianhua(); /*按号码查找*/void shanchu(); /*删除联系人函数*/void shanchu_quanbu(); /*全部删除*/void shanchu_dange(); /*单个删除*/void xianshi();
20、 /*号码显示*/3.2 zhucaidan()主菜单函数其源代码如下:void zhucaidan() char c; system(cls); printf(ntt|- 欢迎您使用通讯录管理系统1.0beat版 -|); printf(ntt| 1-添加联系人 2-查询和显示联系人 |); printf(ntt| 3-删除联系人 4-修改联系人 |); printf(ntt| 5-保存退出 0-不保存退出 |); printf(ntt|-|); printf(ntt请选择您所所要的服务:); c=getch(); switch (c) /*对于上边的选择项目*/ case 1:zengji
21、a();break; case 2:chazhao();break; case 3:shanchu();break;case 4:xiugai();break;case 5:writefile();break; case 0:exit(0); default:zhucaidan(); /*如果没有则返回主菜单等待输入*/ 较难语句分析: system(cls);清除输入在屏幕上的数据; c=getch(); 将键盘上输入的数据赋予c; switch (c) case : 实现对主菜单上的选项的控制;3.3 main()主函数main()函数的源代码见下:void main() /*主函数mai
22、n*/ readfile(); /*读入文件*/while(1) /* 循环(永远进行)*/zhucaiidan(); /*调用主菜单函数*/ main()函数功能分析:main()函数通过调用readfile()函数和循环menu()函数实现对入文件和界面进行控制。3.4 readfile()读取文件函数其源代码如下:void readfile() if(fp=fopen(c:通讯录.txt,r)=NULL) /*以只读方式打开判定文件是否为空*/ printf(nttt 通讯录文件不存在); /*判断结论*/if (fp=fopen(同通讯录.txt,w)=NULL) /*只写方式判断*/
23、 printf(ntt建立失败); /*为空结论*/exit(0); /*退出*/ else /*不为空则执行else*/ printf(nt-欢迎使用通讯录管理系统-);printf(nt 通讯录文件已建立 ); printf(nt 按任意键进入主菜单 ); printf(nt-);getch(); return ; exit(0); fseek(fp,0,2); /*文件位置指针移动到文件末尾*/ if (ftell(fp)0) /*文件不为空*/ rewind(fp); /*文件位置指针移动到文件开始位置*/ for (n=0;!feof(fp) & fread(&txln,sizeof
24、(struct tongxunlu),1,fp);n+);printf(nt-欢迎使用通讯录管理系统1.0beat版-);printf(nt 文件导入成功 ); printf(nt 按任意键返回主菜单 ); printf(nt-);getch(); return; printf(nt-欢迎使用通讯录管理系统1.0beat版-);printf(nt 文件导入成功 ); printf(nt 通讯录文件中无任何纪录 ); printf(nt 按任意键返回主菜单 ); printf(nt-);getch(); return; 较难语句分析: if(fp=fopen(c:通讯录.txt,r)=NULL)
25、 以只读方式打开判定文件是否为空; fseek(fp,0,2); 文件位置指针移动到文件末尾; ftell(fp): 返回当前文件位置,也就是说返回FILE指针当前位置; rewind(fp); 文件位置指针移动到文件开始位置; feof(fp) 检测流上的文件结束符; fread(&txln,sizeof(struct tongxunlu),1,fp);n+) 从fp指向的文件中向txl n中读入一个(struct tongxunlu)类型的值并输出后面的内容。若没有成功执行就不输出后面的内容。void readfile()函数的功能分析:首先由if(fp=fopen(c:通讯录.txt,r
26、)=NULL) 判断文件是否存在,如果不存在,则显示通讯录文件不存在,如果文件为空,则显示建立失败;若建立成功,则显示通讯录文件已建立,然后利用fseek(fp,0,2); 将文件位置指针移动到文件末尾等待输入。3.5 writefile()联系人写入文件函数函数源程序见下:void writefile() /*联系人写入文件*/ int i; if (fp=fopen(c:通讯录.txt,w)=NULL) printf(ntt文件打开失败); for (i=0;in;i+) if (fwrite(&txli,sizeof(struct tongxunlu),1,fp)!=1) printf(
27、ntt写入文件错误!n); fclose(fp); /*关闭文件*/printf(nt-); /*输出提示信息*/printf(ntt通讯录文件已保存); printf(ntt谢谢使用,欢迎再次使用!n);printf(如果对本软件有疑问,请到我们官网()提出您的问题,我们将为您解答.n);printf(我们的软件有不足之处,欢迎到官网()反映,我们将努力改正!);printf(ntt按任意键退出程序ntt); /*输出完毕*/exit(0); printf(nt-); 较难语句分析: fp=fopen(c:通讯录.txt,w) 以只写的方式打开c:txl.txt 文件赋予fp; if (fw
28、rite(&txli,sizeof(struct tongxunlu),1,fp)!=1) 从fp指向的文件中向txl n中写入一个(struct tongxunlu)类型的值并输出后面的内容。若没有成功执行就不输出后面的内容。 fclose(fp); 关闭文件writefile()联系人写入文件函数的功能分析:将c:通讯录.txt文件以只读方式打开付给fp,如果为空则输出“文件打开失败”;若果成功则执行if (fwrite(&txli,sizeof(struct tongxunlu),1,fp)!=1) ,如果写入(struct tongxunlu)成功则关闭文件,若果不成功则输出“写入文件
29、错误!”。3.6 zengjia()增加联系人函数其源程序如下:void zengjia() printf(ntt- 请输入联系人信息 -n); printf(ntt输入联系人姓名:); scanf(%s,txln.xingming); /*键盘输入*/printf(ntt输入联系人电话号码:); scanf(%s,txln.dianhua); printf(ntt输入联系人地址:); scanf(%s,txln.dizhi); n+; /*统计个数*/printf(ntt是否继续添加联系人?(Y/N):); /*是否继续输入联系人.*/if (getch()=y) zengjia(); re
30、turn; 功能分析:调用zengjia()函数后,就可以通过txln. xingming,txln.dianhua ,txln.dizhi 数组从键盘上输入联系人的姓名,电话,地址,输入完毕后,系统会提示是否继续输入,输入“y”后,则再次调用zengjia(); 函数,如此循环,直到不输入联系人为止。3.7 shanchu()删除函数主界面原函数代码:void shanchu() char c; if(n=0) /*如果通讯录中没有一个记录输出以下部分*/ printf(ntt对不起,文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; syst
31、em(cls); /*清屏*/printf(ntt- 删除菜单 -); printf(ntt| 1-删除所有 2-删除单个 |); printf(ntt| 3-返回主菜单 |); printf(ntt|-); printf(ntt请选择您所所要的服务:); c=getch(); /*输入的赋予choice*/switch (c) case 1:shanchu_quanbu();break; case 2:shanchu_dange();break; case 3:zhucaidan();break; default:zhucaidan();break; 函数功能分析:通过界面上的数字选项,调用
32、shanchu_quanbu()、shanchu_dange();和zhucaidan()函数来实现不同的删除功能。3.8 xianshi()显示和查询函数函数源程序:void chazhao() char c; system(cls); printf(ntt- 显示和查询联系人 -); printf(ntt| 1-逐个显示所有 2-按姓名查询 |); printf(ntt| 3-按电话查询 4-返回主菜单 |); printf(ntt|-); printf(ntt请选择您所所要的服务:); c=getch(); switch (c) case 1:xianshi();break; /*显示所
33、有号码*/ case 2:chazhao_xingming();break; /*调用按姓名查询函数*/case 3:chazhao_dianhua();break; /*调用按号码查询函数*/case 4:zhucaidan();break; /*主菜单*/ 函数功能分析:首先通过getch();从键盘上输入选项,通过switch case()来调用xianshi()、chazhao_xingming()chazhao_dianhua()三个函数实现不同的功能。3.9 xianshi()显示所有人函数函数源程序:void xianshi()/显示所有联系人函数 int i; system(c
34、ls);/清楚屏幕 if(n!=0) printf(ntt-欢迎您查询通讯录所有联系人信息-); for (i=0;in;i+) /*依次序显示*/ printf(ntt姓名: %s,txli.xingming); printf(ntt电话: %s,txli.dianhua); printf(ntt地址: %s,txli.dizhi); printf(ntt-); if (i+1n) printf(ntt-); system(pause);/返回错误信息 printf(ntt-); else /*无联系人*/printf(ntt通讯录中无任何纪录); printf(ntt按任意键返回主菜单:)
35、; getch(); return; 功能分析:通过for (i=0;in;i+) 循环实现依次序显示联系人。3.10 chazhao_xingming()姓名查询函数函数源程序:void chazhao_xingming()/按姓名查询 int mark=0; int i; char name20; printf(ntt-按姓名查找 -);printf(ntt请输入您要查找的姓名:); scanf(%s,name); for(i=0;in;i+) if (strcmp(txli.xingming,name)=0) printf(ntt- 以下是您查找的联系人信息 -); printf(ntt姓名: %s,txli.xingming); printf(ntt电话: %s,txli.dianhua); printf(ntt地址: %s,txli.dizhi); printf(ntt-); mark+;getch(); return; if (mark=0) printf(ntt没有找到联系人的信息); printf(ntt按任意键返回主菜单); getch(); return; 功能分析:通过scanf(%s,name) 从键盘上输入的姓名利用if (strcmp(txli.xingming,name)=0)进行对比,确认是否有该联系人。3.11 c