资源描述
课 程 设 计 报 告课程名称 C语言程序设计 课题名称 简单的通讯录程序设计 专 业 电气工程及其自动化 班 级 1281班 学 号 201213010132 姓 名 姚景昌 指导教师 王颖 2013年 6 月 20 日 湖南工程学院课 程 设 计 任 务 书课程名称 C语言程序设计课 题 通讯录课程设计 专业班级 电气1281 学生姓名 姚景昌 学 号 201213010132 指导老师 王 颖 审 批 王 颖 目录一、绪论4二、需求分析61、系统功能需求分析:62、总体设计思路:6三、概要设计7四、详细设计81、通讯录:82、工作流程图:10五、测试数据及其结果分析141、测试:142、功能模块的调试及测试:20六、课程设计总结22七、附录241.源程序242.参考文献34一、 绪论1、C语言数据结构课程设计是我国高校计算机相关专业在近几年来所面临的一个新课题。自问世以来,以其功能丰富多彩、应用面广、表达能力强、使用灵活方便和可移植性好多等特点,一直是最受欢迎、最活跃的高级语言之一。时间就是金钱,但是就是在一些琐碎的事上面浪费了大量的时间,例如查询资料之类.如果我们把浪费的时间用于其他方面,势必会有更大的收益.应此需求,为使广大教师掌握更多的时间,相应的开发出此软件为学生成绩管理软件系统.而编写详细设计说明书是软件开发过程必不可少的部分,其目的是为了使开发人员在完成概要设计说明书的基础上完成概要设计规定的各项模块的具体实现的设计工作。本软件属于绿色软件, 适合任何层次的用户, 因此本说明书的预期读者范围相当广。笔考提出用数据结构实验来深化课程设计的观点,并对此进行一系列的论述。强调首次设计的重要性,就如何进行选题,调动学生产生浓厚的兴趣,发挥团队精神与运用综合知识的能力等方面采取具体的措施,以其达到课程设计的目标,为今后从事项目开发积累经验。本次设计,设计一个“通讯录管理系统”,使其具有数据插入、修改、删除、显示和查询等功能。关键词:C语言;数据结构;通讯录;经验;兴趣 2、引言:数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用1。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。基于此原因,暑期放假前我们开设了数据结构课程设计。针对数据结构课程的特点,着眼于培养我们的实践能力。实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,同学们都会不同程度上的提高。3、设计目的:设计“通讯录管理系统”使其具有数据插入、修改、删除、显示和查询等功能。使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。其功能包括以下各项:建立学生信息,每个通讯者的信息包括:姓名、电话号码、QQ、类别(小学,初中,高中,大学);新增通讯录信息;根据姓名,电话号码,QQ等查找该通讯者的信息并输出;输入通讯者的姓名,进行查找并修改信息,若不存在该通讯者,则提示说明;根据姓名删除指定信息;显示全部的通讯者信息;能够将输入信息导出文件,同时能把文件导入到内存中;退出整个系统操作。二、 需求分析设计题目及要求: 建立通讯录信息,信息至少包含学号、姓名、年龄、电话、工作单位、电子邮箱等; 能够提供添加、删除和修改通讯录信息的功能; 能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询; 将通讯录保存在文件中; 能够按表格方式输出通讯录信息。1、系统功能需求分析:主要包含一下多种功能:添加:添加通讯录记录显示:显示通讯录记录删除:删除通讯录记录查询:查询通讯录记录修改:修改通讯录记录保存:将信息保存到文件2、总体设计思路:本系统首先设计出了主函数,然后根据去要实现的功能分别设计拉,显示、删除、查找、修改、添加功能的子函数。在显示的函数设计过程中首先运用拉文件的读取等必要的知识通过把文件的内容读取到内存然后打印出来。删除函数的设计是首先从文件内找到要删除的人,然后通过写一个实现删除目的的FOR循环将该人从内存里删除,然后再用写的方式打开文件,将内存内的信息写入文件,实现删除。查找也是先打开文件,用一个字符串对比的方法找出用户要查找的人,然后打印出来。修改也大体和删除相同,添加函数在设计时通过申请一片空间,然后通过指针将需要添加的信息添加进去,从而实现添加功能。三、 概要设计系统功能模块图:添加:可以添加通讯录记录,依次输入学号、姓名、年龄、电话号码、工作单位、电子邮箱后,会提示是否继续添加。显示:可以以表格形式输出所有通讯录里的记录删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容查询:可以选择用姓名、电话、地址三种方式查询修改:输入欲修改的那个人的名字后,再依次输入学号、姓名、年龄、电话号码、工作单位、电子邮箱即可完成修改保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件四、 详细设计1、通讯录:typedef struct char score; /*编号*/char name10; /*姓名*/ char sex; /*性别 */ char num15; /*电话号码*/ char email20;/*邮箱*/char age8;/*年龄*/char adds20;/*住址*/Person;void main() /*主函数*/ int n=0; for(;) switch(menu_select() case 1: printf(nt添加记录到通讯录n); /*添加记录*/ n=Input(pe,n); break; case 2: printf(nttt 通讯录记录表n); /*显示记录*/ Display(pe,n); break;case 3: printf(nt从通讯录中删除记录n); n=Delete_a_record(pe,n); /*删除记录*/ printf(t); system(pause); break; case 4: printf(nt在通讯录中查找记录n); Query_a_record(pe,n); /*查找记录*/ printf(t); system(pause); break;case 5: printf(nt修改通讯录中的记录n); Change(pe,n); /*修改数据*/ printf(t); system(pause); break; case 6: printf(nt保存功能n); WritetoText(pe,n); /*保存数据*/ printf(t); system(pause); break; case 0: printf(ntt谢谢使用,再见!n); /*结束程序*/ printf(ntt); system(pause); exit(0); 2、工作流程图:添加:添加通讯录记录显示:显示通讯录记录删除:删除通讯录记录查询:查询通讯录记录先选择查询方式,以姓名查询方式为例 修改:修改通讯录记录五、 测试数据及其结果分析1、测试:1.添加界面2.显示界面:3.删除界面:删除后,通讯录里的显示记录:4.查询界面:5.修改界面:修改后,通讯录里的显示记录:6.保存界面:问题思考:1.当我在进行删除、查询、修改、保存等功能时,以查询为例,输入名字按回车后,虽然会显示该人的所有记录,但是显示后,它马上自动消失了,还没来得及等我看内容。因此,向别人请教后,在一些地方加入了system(pause);这个语言,用来对某项操作完成后进行暂停。2. 现在这个程序的界面个人感觉很清爽。但在最初,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,如下图(添加后,进行显示操作):之后,我去网上寻求解决办法,知道可以使用system(cls);这一语句可以解决这个问题,最后,修改成功。2、功能模块的调试及测试:(1)、当软件中总有输入人员信息时:1)、添加人员信息:根据提示输入1,添加记录到通讯录,依次为学号、姓名、性别、电话号码、工作单位、电子邮件,如果还要即系添加的话就非n或N即可,直到添加人员已达到你需要的为止再按n或N 。2)、显示人员信息:1.查看全部信息时:根据提示输入2,按回车键,显示所有人员的所有信息。3)、删除人员信息:根据提示输入3,按回车键,输入需要删除人员姓名:例如(小明)按回车显示需要删除人员信息并删除。4)、查找人员信息:根据提示输入4,按回车键,输入要查找的人员名字:例如(于海)按回车键,显示查找到的人员信息。5)、修改人员信息:根据提示输入5,按回车键,输入需要修改的人员姓名:例如(小张)按回车键,根据提示输入修改的信息,修改完后按回车键,显示修改成功,然后可以在显示记录里面可以看到修改了的人员信息。(2)、当软件中总没有输入人员信息时:、添加人员信息:根据提示输入1,按回车键,输入添加的信息,学号、姓名、性别、电话号码、电子邮件、工作单位。输入完毕后按回车键,可以再根据提示使用查找功能。该操作可以看见刚才添加的人员信息。2)、查看全部信息时:根据提示输入2,按回车键,没有任何人员的信息显示3)、删除人员信息:根据提示输入3,按回车键,请输入你想要删除记录中的名字:例如(小明)按回车,显示通讯录中没有此人。4)、查找人员信息:根据提示输入4,按回车键,再按1进行姓名查找,输入要查找的人员名字:例如(欧鸿)按回车,显示通讯录中没有此人。5)、修改人员信息:根据提示输入5,键按回车,输入需要修改的人员姓名、学号、工作单位、电话号码、性别、电子邮件按回车键后,显示通讯录中没有此人六、 课程设计总结通过这次课程设计,我对很多的函数有啦新的认识,也学会啦运用多种函数,我也明白啦写软件的基本过程,和基本方法。写软件的过程中我又学到啦曾经自己不知道的函数或是自己不会的函数的用法。特别是文件的开启和关闭,读与写。这次课程设计课总的来说让我受益匪浅。这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。发现了自己的许多不足,是对学生实际工作能力的具体训练和考察过程。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我们收获的是黎明。在本次实践中,给我印象最为深刻的是在文件删除程序的编译过程中,先有我的各个子程序都已经编辑成功,那么这最后的程序就将是我成功的关键。老天不会让我太过顺利,他在这最后的时刻设置的障碍,是要考验我的能力,他要置我于死地?在这个问题的解决上,我打了退堂鼓,我不能忍受长时间的无功而反,时间正在消磨我的意志。没有了柳暗花明的一天,那么我怎么能说经受住了考验?谢谢老师的那句话,她说:人力有所不能及,然而,人的精神是不会败倒的。我鼓起勇气,到处问,到处查资料,黄天不负有心人,在一篇文章上,终于看到了我所特别要求的函数,我实现了组合是关键的理论。不得不说这是精神的胜利,是永不言败的精神让我的程序重见天日。虽然遇到了很多的困难。在软件一次一次的调试失败下曾经想过要放弃。我最后还是让自己坚持啦下来,毫不畏惧困难,在同学的帮助与讲解下我总算是顺利的完成啦软件的设计。虽然在调试程序遇到拉很多的困难,当软件调试成功时那种喜悦的感觉没有什么东西可以代替。在程序的编写过程中我发现我自己有很多的知识漏洞和缺陷,需要进一步努力学习来完善自己。在这几天的编写过程中我对c语言有啦更进一步的认识和了解。此次编程过程的经验和知识肯定能促进我以后的学习。此次课程设计不仅给啦我很多很好的经验,也然我体会到啦失败时的焦急和难受,也体会到啦成功时的兴奋与喜悦。当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的,。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的,回顾起此次课程设计,至今让我我们仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,也懂得集体团队的重要性。在此我向在此次课程设计时对我伸出援助之手的向王老师,还有帮助我的同学们。这个软件的实现固然需要自身的努力,当然也离不开同学们的帮助与讲解。缺少啦这些也许我的程序就无法调试完成。要感谢学校为我们提供这次实验机会,也要感谢老师的教导和好心人对我的帮助与支持。七、 附录1.源程序#include #include#include #include typedef struct char score; /*学号*/char name10; /*姓名*/ char sex; /*性别 */char num15; /*电话号码*/ char email20;/*邮箱*/char adds20;/*工作单位*/Person; Person pe80; int menu_select() char c; do system(cls); printf(tt *通讯录* n); printf(ttn); printf(tt 1. 添加记录 n); printf(tt 2. 显示记录 n); printf(tt 3. 删除记录 n); printf(tt 4. 查询记录 n); printf(tt 5. 修改记录 n); printf(tt 6. 保存记录 n);printf(tt 0. 退出程序 n); printf(ttn); printf(tt请您选择(0-6):); c=getchar(); while(c6); return(c-0); int Input(Person per,int n) int i=0; char sign,x10; while(sign!=n&sign!=N) printf(t学号:); scanf(t%d,&pern+i.score); printf(t姓名:); scanf(t%s,pern+i.name); /getch();printf(t性别:); scanf(t%c,&pern+i.sex);printf(t电话号码:); scanf(t%s,pern+i.num); printf(t工作单位:); scanf(t%s,pern+i.adds);printf(t电子邮箱:);scanf(t%s,pern+i.email);gets(x); printf(nt是否继续添加?(Y/N); scanf(t%c,&sign); i+; return(n+i); void Display(Person per,int n) int i; printf(-n); /*格式*/ printf(学号 姓名 性别 电话号码 工作单位 电子邮箱n); printf(-n); for(i=1;i1&i%10=0) printf(t-n); printf(t); system(pause); printf(t-n); printf(-n);system(pause); int Delete_a_record(Person per,int n) char s20; int i=0,j; printf(t请输入想删除记录中的名字:); scanf(%s,s); while(strcmp(peri.name,s)!=0&in) i+; if(i=n) printf(t通讯录中没有此人!n); return(n); for(j=i;jn-1;j+) strcpy(perj.num,perj+1.num); strcpy(perj.name,perj+1.name);perj.sex=perj+1.sex;strcpy(perj.adds,perj+1.adds);strcpy(perj.email,perj+1.email);perj.score=perj+1.score; printf(ttt已经成功删除!n); return(n-1); void Query_a_record(Person per,int n) int m;printf(tn请选择查询方式:n); printf(tn); printf(t1-姓名 n); printf(t2-电话 n); printf(t3-地址 n); printf(t4-返回 n); printf(tn); printf(请选择:); scanf(%d,&m); while(m!=1&m!=2&m!=3&m!=4) printf(输入错误,请重新选择:);scanf(%d,&m);if(m=1)char s20; int i=0; printf(t请输入想查询的姓名:); scanf(t%s,s); while(strcmp(peri.name,s)!=0&in) i+; if(i=n) printf(t通讯录中没有此人!n); return; printf(t此人学号: %dn,peri.score); printf(t此人性别: %dn,peri.sex); printf(t电话号码: %sn,peri.num); printf(t工作单位: %sn,peri.adds);printf(t电子邮箱: %sn,peri.email); ;if(m=2)char s20; int i=0; printf(t请输入想查询的电话:); scanf(t%s,s); while(strcmp(peri.num,s)!=0&in) i+; if(i=n) printf(t通讯录中没有此人!n); return; printf(t此人学号: %dn,peri.score);printf(t此人姓名: %sn,peri.name); printf(t此人性别: %dn,peri.sex);printf(t工作单位: %sn,peri.adds);printf(t电子邮箱: %sn,peri.email); ;if(m=3)char s20; int i=0; printf(t请输入想查询的地址:); scanf(t%s,s); while(strcmp(peri.adds,s)!=0&in) i+; if(i=n) printf(t通讯录中没有此人!n); return; printf(t此人学号: %dn,peri.score);printf(t此人姓名: %sn,peri.name); printf(t此人性别: %dn,peri.sex);printf(t电话号码: %sn,peri.num); printf(t电子邮箱: %sn,peri.email); ;void Change(Person per,int n) char s20; int i=0; printf(t请输入想修改的记录中的名字:); scanf(%s,s); while(strcmp(peri.name,s)!=0&in) i+; if(i=n) printf(t通讯录中没有此人!n); return; printf(t学号:); scanf(t%d,&peri.score); printf(t姓名:); scanf(t%s,peri.name); printf(t性别:); scanf(t%s,&peri.sex); printf(t电话号码:); scanf(t%s,peri.num); printf(t工作单位:); scanf(t%s,peri.adds);printf(t电子邮箱:);scanf(t%s,peri.email);printf(t修改成功!);void WritetoText(Person per,int n) int i=0; FILE *fp; /*定义文件指针*/ char filename20; /*定义文件名*/ printf(t保存到文件n); /*输入文件名*/ printf(t请输入所保存的文件名:); scanf(t%s,filename); if(fp=fopen(filename,w)=NULL) printf(t无法打开文件n); system(pause); return; fprintf(fp,*通讯录*n);fprintf(fp,学号 姓名 性别 电话号码 工作单位 电子邮箱n);fprintf(fp,-n);while(in) fprintf(fp,%-3dt%-6st%-3st%-20st%-20sn,peri.score,peri.name, peri.sex,peri.num,peri.adds,peri.email); i+; fprintf(fp,-n);fprintf(fp,*共有%d条记录*n,n); fclose(fp); /*关闭文件*/ printf(保存成功!n); void main() /*主函数*/ int n=0; for(;) switch(menu_select() case 1: printf(nt添加记录到通讯录n); /*添加记录*/ n=Input(pe,n); break; case 2: printf(nttt 通讯录记录表n); /*显示记录*/ Display(pe,n); break;case 3: printf(nt从通讯录中删除记录n); n=Delete_a_record(pe,n); /*删除记录*/ printf(t); system(pause); break; case 4: printf(nt在通讯录中查找记录n); Query_a_record(pe,n); /*查找记录*/ printf(t); system(pause); break;case 5: printf(nt修改通讯录中的记录n); Change(pe,n); /*修改数据*/ printf(t); system(pause); break; case 6: printf(nt保存功能n); WritetoText(pe,n); /*保存数据*/ printf(t); system(pause); break; case 0: printf(ntt谢谢使用,再见!n); /*结束程序*/ printf(ntt); system(pause); exit(0); 2.参考文献、谭浩强编著,C程序设计1991年7月。、姜仲秋等主编,C语言程序设计,南京大学出版社,1998年1月。、C语言程序设计(第二版)、C语言程序设计辅导与习题集应用技术学院课程设计评分表 项 目 评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩课程名称: C语言程序设计 教师签名: 日 期: (注:1.此页附在课程设计报告之后;.综合成绩按优、良、中、及格和不及格五级评定)
展开阅读全文