




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第31页共31页GuangxiUniversityofScienceandTechnology课程设计报告课程名称:数据结构与编程综合实训课题名称:通讯录管理系统的设计与实现姓名:熊信萌学号:201400402003院系:计算机科学与通信工程学院专业班级:通信141班指导教师:周坚和完成日期:2015-12-18
目录第一部分课程设计报告…………3第1章课程设计目的……………………3第2章课程设计内容和要求……………32.1问题描述………32.2设计要求…………4第3章课程设计总体方案及分析………53.1问题分析………43.2概要设计…………53.3详细设计…………63.4调试分析………183.5测试结果………183.6参考文献………22第二部分课程设计总结………23附录(源代码)…………………24第一部分课程设计报告第1章课程设计目的课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。课程设计就是让所有同学对课程更全面的应用。本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。1.实现意义本次实验应用性能很好,结构清楚,能随时添加、删除、查找、修改、输出联系人;并且可以用姓名、编号两种方式;而且其中增加了排序功能,使得插入之后排序为接下来的操作提供便利,操作更精确,以人性化的方式展现出来,效果十分突出。2.系统分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出、计算男女人数等功能。每个记录包含编号、姓名、性别、电话号码个人基本信息。用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。第2章课程设计内容和要求2.1问题描述:设计并实现一个通讯录信息系统建立通讯录信息,信息包含编号、姓名、性别、电话;能够提供添加、删除和修改通讯录信息的功能;能够提供查询的功能;能够提供性别统计的功能;能够输出通讯录信息。2.2设计要求:要求设计程序输出如下:用链表实现学生信息管理系统,完成链表建立(至少包括50个节点),以及链表中信息(节点)的插入、查找、删除、修改、输出等操作,具体的模块要求如下(用“文本文件”按照自定义格式存储数据记录集)。第一个模块——主函数main()实现功能:根据菜单的选项调用各函数,并完成相应的功能。第二个模块——Menu()实现功能:显示提示菜单。第三个模块——Quit()实现功能:退出菜单。第四个模块——Create()实现功能:创建新的学生信息记录。第五个模块——Add()实现功能:增加新的学生信息记录,并返回菜单。第六个模块——Find()实现功能:按要求查询相关的信息,如果找到则显示该学生信息,如果未找到则提示文件中没有该信息,并返回菜单。第七个模块——Alter()实现功能:修改某条学生记录的信息,如果未找到要修改的学生记录,则提示系统中无此学生记录,并返回菜单。第八个模块——Delete()实现功能:删除某条学生记录,如果未找到要删除的学生记录,则提示该学生记录集中没有,并返回菜单。第九个模块——List()实现功能:能够分页显示数据记录集中的所有学生的记录。第十个模块——Searchbysex()实现功能:统计通讯录中男性人数及女性人数第3章课程设计总体方案及分析3.1问题分析:该程序是要将几个不同功能的函数用链表串联起来,来组成一个通讯录信息系统。因为链表能让数据既有独立性又便于数据之间的相互联系,也便于数据的添加和删除。用模块化程序设计的理念,对几个不同功能的函数,分块处理,这样有利于后期的调试及今后对功能的完善。菜单中的每一个选项对应着一个子程序,这个系统就由这些子程序建立起来。下面是这个程序的设计流程图:图3.1设计流程图3.2概要设计1.①构建一个结构体用于建立一个链表。②链表里面包括了要储存学生的信息的代号。③屏幕上显示出菜单。2.本程序包含8个函数:(1)主函数main()(2)创建函数LinkListCreateList()(3)增加通讯录人员函数voidAddNode(LinkListhead,ListNode*p)(4)删除某个学生信息的函数voidDeleteNode(LinkListhead)(5)查询通讯录人员的函数ListNode*ListFind(LinkListhead)(6)修改通讯录人员的函数voidAlterNode(LinkListhead)(7)性别统计的函数voidSeachbysex(LinkListhead)(8)通讯录输出函数voidPrintList(LinkListhead)(9)退出系统函数3.3详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法节点类型和指针类型结构体里面的数据类型:typedefstruct//通讯录数据类型{charnumber[3];//编号charname[9];//姓名charsex[10];//性别chartelephone[11];//电话}DataType 主函数voidmain(){ intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通讯录课程设计\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通讯录的建立"); printf("\n\t\t\t2.通讯者的插入"); printf("\n\t\t\t3.通讯者的查询"); printf("\n\t\t\t4.通讯者的删除");printf("\n\t\t\t5.通讯者的修改"); printf("\n\t\t\t6.通讯录的输出"); printf("\n\t\t\t7.男生女生的人数"); printf("\n\t\t\t0.退出通讯录管理系统"); printf("\n\t\t\t******************************"); printf("\n请选择菜单号(0--6):"); scanf("%d",&k); getchar(); switch(k) { case1: { printf("\n1.通讯录的建立\n"); head=CreateList(); flag1=1; break; } case2: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n2.通讯者信息的插入\n"); printf("\n编号姓名性别电话\n"); printf("\n"); p=(ListNode*)malloc(sizeof(ListNode));/*申请新结点*/ printf("输入编号:\n"); scanf("%s",p->data.number); printf("输入姓名:\n"); scanf("%s",p->); printf("输入性别:\n"); scanf("%s",p->data.sex); printf("输入电话:\n"); scanf("%s",p->data.telephone); AddNode(head,p); printf("排序:\n");OrderList(l);//调用通讯录排序函数此处放在插入模块下面} break; } case3: { if(flag1!=1) { printf("请先建立表!"); getchar(); system("cls"); } else { printf("\n3.通讯录信息的查询\n"); p=ListFind(head); if(p!=NULL) { printf("编号姓名性别联系电话\n"); printf("\n"); printf("编号:%s\n姓名:%s\n性别:%s\n联系电话:%s\n", p->data.number,p->,p->data.sex,p->data.telephone); printf("\n"); } elseprintf("没有查到要查询的通讯者!\n"); break; } case4: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n4.通讯录信息的删除\n"); DeleteNode(head);/*删除结点*/ } break; } case5: { if(flag1!=1) { printf("请先建立表!"); getchar(); system("cls"); } else { printf("\n5.通讯录信息的修改\n"); AlterNode(head); } break; } case6: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n6.通讯录链表的输出\n"); PrintList(head); } break; } case7: { if(flag1!=1) { printf("请先建立表!"); getchar(); system("cls"); } else { printf("\n7.通讯录中男生女生的人数\n"); Seachbysex(head); } break; } case0: printf("是否退出(y/n)?"); k=getchar(); if(k=='y'||k=='Y') { j=0; printf("\n\n\t\t\t谢谢使用!谢谢使用!"); printf("\n按任意键退出"); } break; default: printf("\n输入有错,请重新输入!\n"); printf("\n按任意键继续..."); getchar(); break; } }}}通讯录信息系统的具体操作:(1)添加:可以添加通讯录记录,依次输入编号、姓名、性别、电话号码后,会提示是否继续添加。LinkListCreateList()//尾插法建立带头结点的通讯录链表算法{ LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点 ListNode*p,*rear; charflag='y'; //结束标志置y rear=head;//尾指针初始指向头结点 while(flag=='y') { p=(ListNode*)malloc(sizeof(ListNode));//申新结点 printf("编号姓名性别电话\n"); printf("\n"); printf("输入的编号:\n"); scanf("%s",p->data.number); printf("输入的姓名:\n"); scanf("%s",p->); printf("输入性别:\n"); scanf("%s",p->data.sex); printf("输入电话:\n"); scanf("%s",p->data.telephone); rear->next=p;//新结点连接到尾结点之后 rear=p;//尾指针指向新结点 printf("继续建表?(y/n):"); scanf("%s",&flag); } rear->next=NULL;//终端结点指针置空 returnhead;//返回链表头指针}开始开始输入y或n用if判断输入了y还是nyn输入要输入的资料将数据保存到指定的文件里结束图3.2添加通讯录记录流程(2)增加通讯录人员函数voidAddNode(LinkListhead,ListNode*p)//在通讯录链表head中插入结点{ListNode*p1,*p2;p1=head;p2=p1->next;while(p2!=NULL&&strcmp(p2->data.number,p->data.number)<0){p1=p2;//p1指向刚访问过的结点p2=p2->next;//p2指向表的下一个结点}p1->next=p;//插入p所指向的结点p->next=p2;//连接表中剩余的结点}图3.3增加通讯录记录流程图(3)删除通讯录信息函数:输入欲删除的那个人的编号或名字后,会自动删除他(她)的记录内容。voidDeleteNode(LinkListhead)//通讯录链表上的结点删除{ chars; ListNode*p,*q; p=ListFind(head);//调用查找函数 if(p==NULL) { printf("没有查到要删除的通讯者!\n"); return; }printf("%s%s%s%s\n",p->data.number,p->,p->data.sex,p->data.telephone);printf("真的要删除该结点吗?(y/n):"); scanf("%s",&s); if(s=='y') {q=head; while(p!=NULL&&q->next!=p) q=q->next; q->next=p->next;//删除结点 free(p);//释放被删除的结点空间 printf("通讯者已被删除!\n"); return; } printf("通讯者没有被删除!\n");}图3.4删除通讯录记录流程图(4)查询通讯录的函数:用姓名、编号两种方式查询。ListNode*ListFind(LinkListhead)//有序通讯录链表的查找{ListNode*p;charnumber[10];charname[20]; chart;printf("\n");printf("1.按编号\n");printf("2.按姓名\n");printf("\n");printf("请选择1/2:");p=head->next;//假定通讯录表带有结点 scanf("%d",&t);if(t==1) { printf("请输入所求的编号:"); scanf("%s",number); while(p&&strcmp(p->data.number,number)<0)//优化的地方 p=p->next; if(p==NULL||strcmp(p->data.number,number)>0) p=NULL;//没有查到要查找的通讯者 } else if(t==2) { printf("请输入要求的姓名:"); scanf("%s",name); while(p&&strcmp(p->,name)!=0) p=p->next; }returnp;}图3.6查询通讯录信息流程图(5)修改通讯录的函数:输入欲修改的那个人的名字后,再依次输入编号、姓名、性别、电话号码。voidAlterNode(LinkListhead)//通讯录链表上的结点修改{ charch; ListNode*p,*q1; p=ListFind(head); if(p==NULL) { printf("没有查到要修改的通讯者!\n"); return; } elseif(p!=NULL) { printf("真的要修改该结点吗?(y/n)"); scanf("%s",&ch); if(ch=='y'||ch=='Y') { q1=head; printf("\n输出新编号:"); scanf("%s",p->data.number);printf("输出新姓名:\n"); scanf("%s",p->);printf("输出新性别:\n"); scanf("%s",p->data.sex);printf("输出新电话:\n"); scanf("%s",p->data.telephone); printf("修改成功!\n"); } if(ch=='n'||ch=='N') printf("无需修改\n"); }}图3.7修改通讯录信息(6)统计性别信息的函数:可以统计男性人数和女性人数。voidSeachbysex(LinkListhead){ ListNode*p; p=head; intmen=0,women=0;while(p!=NULL) {if(strcmp(p->data.sex,"男")==0)men++;if(strcmp(p->data.sex,"女")==0) women++;p=p->next; } printf("women=%d\nmen=%d\n",women,men);}图3.8统计性别信息流程图3.菜单选择intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通讯录课程设计\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通讯录的建立"); printf("\n\t\t\t2.通讯者的插入"); printf("\n\t\t\t3.通讯者的查询"); printf("\n\t\t\t4.通讯者的删除");printf("\n\t\t\t5.通讯者的修改"); printf("\n\t\t\t6.通讯录的输出"); printf("\n\t\t\t7.男生女生的人数"); printf("\n\t\t\t0.退出通讯录管理系统"); printf("\n\t\t\t******************************"); printf("\n请选择菜单号(0--6):"); scanf("%d",&k); getchar();注:具体源代码见附录3.4调试分析在写统计男女生人数的函数时,一开始只能显示出女生的人数,而且我也没有用到strcmp,所以一直遍历整个链表不成功,后来请教了同学了之后才写出统计的函数。原来开始没有把整个链表传入该函数中。3.5测试结果1.主菜单:2.建立通讯录:3.显示通讯录信息:4.删除某个通讯录信息5.查询通讯录记录:6.修改通讯录信息7.通讯录性别统计:9.退出系统3.6参考文献①徐凤生.《数据结构(C语言版)》.机械工业出版社,2009年9月.②谭浩强.《C程序设计(第三版)》.清华大学出版社.2009年1月.
第2部分课程设计总结课程设计,使我懂得了做什么事情只要专心去做,就能够克服各种困难,达到自己的说想要的结果。当然了,同学们和老师的帮助必不可少。从理论中得出结论。此次课程设计使我对自己的专业有了更深刻的认识,从而提高了自己实际动手能力和独立思考问题的能力,总而言之,此次课程设计让我受益颇丰。⑴该通讯录管理系统可以顺利高效运行,实现相关的要求,当然任何程序都存在不足,我这个程序也不例外:虽然努力在程序中添加了排序模块增加了程序的优化和可读性但是我可以将其中的排序模块的调用放到输出模块中,最后的输出可以更优化些,而不是放在插入后,这样只能根据指示一步一步去调用,相对繁琐一点,其次在程序中增加了修改模块,通过全局的头结点head可以任意修改相关信息,使程序更加可读性和灵活性。⑵同时在这次课程设计中让我们认识到做程序设计这项工作中我门要具备以下素质:①良好的文档是正规研发流程中非常重要的环节,缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。②此外编程是一项高要求的工作所以我们要有规范化,标准化的代码编写习惯通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。③我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作。在编制过程中,可能在实际应用中有些功能不到位,对更多的功能也未能实现。我将不断提高自己,尤其在相关结点知识方面多努力去学习,多看书,多实践,争取今后在编制程序时,能够认真努力编写出有个性且可读性和应用性较强的数据结构系统。附录源文件#include<stdio.h>#include<stdlib.h>#include<string.h>#include"LinkList.h"intflag1=0; //全局变量flag1为0voidmain(){ intk,j=1; ListNode*l; while(j) { printf("\t\t\t熊信萌通讯录课程设计\n"); printf("\t\t\t********************************"); printf("\n\t\t\t1.通讯录的建立"); printf("\n\t\t\t2.通讯者的插入"); printf("\n\t\t\t3.通讯者的查询"); printf("\n\t\t\t4.通讯者的删除");printf("\n\t\t\t5.通讯者的修改"); printf("\n\t\t\t6.通讯录的输出"); printf("\n\t\t\t7.男生女生的人数"); printf("\n\t\t\t0.退出通讯录管理系统"); printf("\n\t\t\t******************************"); printf("\n请选择菜单号(0--6):"); scanf("%d",&k); getchar(); switch(k) { case1: { printf("\n1.通讯录的建立\n"); head=CreateList(); flag1=1; break; } case2: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n2.通讯者信息的插入\n"); printf("\n编号姓名性别电话\n"); printf("\n"); p=(ListNode*)malloc(sizeof(ListNode));/*申请新结点*/ printf("输入编号:\n"); scanf("%s",p->data.number); printf("输入姓名:\n"); scanf("%s",p->); printf("输入性别:\n"); scanf("%s",p->data.sex); printf("输入电话:\n"); scanf("%s",p->data.telephone); AddNode(head,p); printf("排序:\n");OrderList(l);//调用通讯录排序函数此处放在插入模块下面} break; } case3: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n3.通讯录信息的查询\n"); p=ListFind(head); if(p!=NULL) { printf("编号姓名性别联系电话\n"); printf("\n"); printf("编号:%s\n姓名:%s\n性别:%s\n联系电话:%s\n", p->data.number,p->,p->data.sex,p->data.telephone); printf("\n"); } elseprintf("没有查到要查询的通讯者!\n"); break; } case4: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n4.通讯录信息的删除\n"); DeleteNode(head);/*删除结点*/ } break; } case5: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n5.通讯录信息的修改\n"); AlterNode(head); } break; } case6: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n6.通讯录链表的输出\n"); PrintList(head); } break; } case7: { if(flag1!=1) { printf("请先建立表!"); getchar(); } else { printf("\n7.通讯录中男生女生的人数\n"); Seachbysex(head); } break; } case0: printf("是否退出(y/n)?"); k=getchar(); if(k=='y'||k=='Y') { j=0; printf("\n\n\t\t\t谢谢使用!谢谢使用!"); printf("\n按任意键退出"); } break; default: printf("\n输入有错,请重新输入!\n"); printf("\n按任意键继续..."); getchar(); break; } }}}头文件typedefstruct//通讯录数据类型{charnumber[3];//编号charname[9];//姓名charsex[10];//性别chartelephone[11];//电话}DataType;typedefstructnode//结点类型定义{ DataTypedata;//结点数据域structnode*next;//结点指针域}ListNode;typedefListNode*LinkList;LinkListhead;ListNode*p;LinkListCreateList()//尾插法建立带头结点的通讯录链表算法{ LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点 ListNode*p,*rear; charflag='y'; //结束标志置y rear=head;//尾指针初始指向头结点 while(flag=='y') { p=(ListNode*)malloc(sizeof(ListNode));//申新结点 printf("编号姓名性别电话\n"); printf("\n"); printf("输入的编号:\n"); scanf("%s",p->data.number); printf("输入的姓名:\n"); scanf("%s",p->); printf("输入性别:\n"); scanf("%s",p->data.sex); printf("输入电话:\n"); scanf("%s",p->data.telephone); rear->next=p;//新结点连接到尾结点之后 rear=p;//尾指针指向新结点 printf("继续建表?(y/n):"); scanf("%s",&flag); } rear->next=NULL;//终端结点指针置空 returnhead;//返回链表头指针}voidAddNode(LinkListhead,ListNode*p)//在通讯录链表head中插入结点{ListNode*p1,*p2;p1=head;p2=p1->next;while(p2!=NULL&&strcmp(p2->data.number,p->data.number)<0){p1=p2;//p1指向刚访问过的结点p2=p2->next;//p2指向表的下一个结点}p1->next=p;//插入p所指向的结点p->next=p2;//连接表中剩余的结点}//新增通信录排序模块,排序比较简单,通过不断比较,结点指针相互赋值交换解决voidOrderList(ListNode*&l)//按编号排序,调用插入函数之后才可以排序{ ListNode*p,*q,*s; q=head; p=q->next->next; q->next->next=NULL; while(p) { while(q->next&&(strcmp(p->data.number,q->next->data.number)>0))//比较字符串 q=q->next; s=p->next; p->next=q->next; q->next=p; p=s; q=head; }} ListNode*ListFind(LinkListhead)//有序通讯录链表的查找{ListNode*p;charnumber[10];charname[20]; chart;printf("\n");printf("1.按编号\n");printf("2.按姓名\n");printf("\n");printf("请选择1/2:");p=head->next;//假定通讯录表带有结点 scanf("%d",&t);if(t==1) { printf("请输入所求的编号:"); scanf("%s",number); while(p&&strcmp(p->data.number,number)<0)//优化的地方 p=p->next; if(p==NULL||strcmp(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 原油供货合同范例
- 厦门工资合同范例
- 光伏电池转让合同范例
- 南充代理记账合同范例
- 厂家付款合同范例
- 专业劳务分包合同范例
- 个人质押合同范例
- 中介销售合同范例
- 出售木板封边机合同范例
- 2024专升本文学欣赏与评测标准试题及答案
- 单组份室温固化硅橡胶物质安全数据表MSDS模板
- 2022年北京事业单位招聘考试真题及答案解析
- 高中英语 选必二 Unit3 Times change 第4课时-developing ideas- Emojis a new language 课件
- 机动车检测站突发环境污染事件应急预案
- 关于赴XXX医院参观学习联系函
- 【汇总】高二政治选择性必修三(统编版) 重点知识点汇总
- T∕CIS 71001-2021 化工安全仪表系统安全要求规格书编制导则
- 体医融合与健康中国课件
- 福利院装修改造工程施工组织设计(225页)
- 基因表达的调控
- 华师大版九年级下册数学全册教案
评论
0/150
提交评论