通讯录管理系统的实现课程设计报告.docx
- 文档编号:10932551
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:17
- 大小:140.52KB
通讯录管理系统的实现课程设计报告.docx
《通讯录管理系统的实现课程设计报告.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统的实现课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
通讯录管理系统的实现课程设计报告
课程设计报告
课程设计名称:
数据结构课程设计
系:
三系
学生姓名:
佘远程
班级:
11计本1班
学号:
20110303132
成绩:
指导教师:
王海燕
开课时间:
2012-2013学年一学期
一、实习目的
通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
二、问题描述
通讯录管理系统的设计主要是实现对通讯录的管理和相关操作。
基本功能如下:
(1)通讯录信息录入、添加功能:
包括编号号、姓名、性别、电话、地址等。
(2)通讯录查询:
可以按编号,姓名,电话等进行查询。
(3)通讯录修改:
按编号的次序插入有序通讯录表的相应位置。
(4)删除:
按编号,姓名,电话等按升序进行排序。
(5)通讯录的修改、删除功能:
按编号进行查找后,修改电话或地址。
(6)通讯录的输出
三、需求分析
通讯录管理系统工作是管理个人通讯资料,对个人资料进行录入,查询,删除,插入,修改,输出……要求:
(1)输入的数据严格按照程序提示要求进行,否则无法进行数据处理.
(2)查询数据必须提供编号或者名字.
(3)程序主要输出的是各个成员的资料
(4)程序的主要功能:
录入,查询,修改,删除,输出
四、概要设计
(1)系统用到的数据:
charnum[100];charname[100];
charsex[100];
chariphone[100];charaddr[100];
(2)用到的主要函数:
intmenu_select();//菜单程序
linklistcreatelist(void);//创建通讯录链表
voidinsertnode(linklisthead,listnode*p);//插入通讯录链表结点
listnode*listfind(linklisthead);//查找通讯录结点
voiddelnode(linklisthead);//删除链表结点
voidprintlist(linklisthead);//输出链表
voidchangelist(linklisthead);//修改
voidmain()//主函数
(3)各个模块之间的关系:
主函数调用这会儿其他所有的函数
五、详细设计(要有注释)
/*主控菜单处理测试程序*/
#include
#include
#include
#include
typedefstruct{//通讯录结点类型
charnum[100];//编号
charname[100];//姓名
charsex[100];//性别
chariphone[100];//电话
charaddr[100];//地址
}datatype;
typedefstructnode{//结点类型定义
datatypedata;//结点数据域
structnode*next;//结点指针域
}listnode;
typedeflistnode*linklist;
linklisthead;
listnode*p;
//子函数的声明
intmenu_select();//菜单程序
linklistcreatelist(void);//创建通讯录链表
voidinsertnode(linklisthead,listnode*p);//插入通讯录链表结点
listnode*listfind(linklisthead);//查找通讯录结点
voiddelnode(linklisthead);//删除链表结点
voidprintlist(linklisthead);//输出链表
voidchangelist(linklisthead);//修改
//主函数
voidmain()
{
for(;;){
switch(menu_select())
{
case1:
printf("***************************\n");
printf("*通讯录链表信息的录入*\n");
printf("****************************\n");
head=createlist();//?
creatlist函数赋给头结点?
break;
case2:
printf("***************************\n");
printf("*通讯录成员信息的插入*\n");
printf("******************************************\n");
printf("编号*姓名*性别*电话*地址*\n");
printf("*******************************************\n");
p=(listnode*)malloc(sizeof(listnode));//创建头结点
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.iphone,p->data.addr);
insertnode(head,p);
break;
case3:
printf("*************************************\n");
printf("*通讯录成员信息的查询*\n");
printf("***************************************\n");
p=listfind(head);
if(p!
=NULL){
printf("编号姓名性别联系电话地址\n");
printf("----------------------------------------------------------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.iphone,p->data.addr);
printf("----------------------------------------------------------------------------------\n");
}
else
printf("查询的通讯录成员不存在!
\n");
break;
case4:
printf("************************************\n");
printf("*通讯录成员信息的删除*\n");
printf("*************************************\n");
delnode(head);
break;
case5:
printf("************************************\n");
printf("*通讯录链表成员信息的输出*\n");
printf("*************************************\n");
printlist(head);
break;
case6:
printf("************************************\n");
printf("*通讯录链表成员信息的修改*\n");
printf("*************************************\n");
changelist(head);
break;
case0:
printf("\t欢迎再次使用本程序!
\n");
return;
}
}
}
//菜单选择函数程序
intmenu_select()
{
intsn;
printf("通讯录管理系统\n");
printf("============================\n");
printf("1.通讯录链表的建立\n");
printf("2.通讯录结点的插入\n");
printf("3.通讯录结点的查询\n");
printf("4.通讯录结点的删除\n");
printf("5.通讯录链表的输出\n");
printf("6.通讯录链表的修改\n");
printf("0.退出管理系统\n");
printf("============================\n");
printf("请选择0-6:
");
for(;;)
{
scanf("%d",&sn);
if(sn<0||sn>6)
printf("\n\t输入错误,重选0-6:
");
else
break;
}
returnsn;
}
//用尾插法建立通讯录链表函数
linklistcreatelist(void)
{//尾插法建立带头结点通讯录链表算法
linklisthead=(listnode*)malloc(sizeof(listnode));//创建头结点
listnode*p,*rear;
intflag=0;//结束标志置0
rear=head;//尾指针初始指向头结点
while(flag==0)
{p=(listnode*)malloc(sizeof(listnode));//申请新结点
printf("编号*姓名*性别*电话*地址*\n");
printf("----------------------------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.iphone,p->data.addr);
rear->next=p;//新结点连接到尾结点之后
rear=p;//尾指针指向新结点
printf("是否继续建立?
(1/0):
");//这是什么意思啊?
scanf("%d",&flag);//读入一个标志数据
}
rear->next=NULL;//终端结点指针域置空
returnhead;//返回链表头指针
}
voidinsertnode(linklisthead,listnode*p)
{
listnode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)//strcmp函数,比较字符串
{
p1=p2;//p1指向刚访问过的结点
p2=p2->next;//p2指向表的下一个结点
}
p1->next=p;//插入p所指向的结点
p->next=p2;//连接表中剩余部分
}
listnode*listfind(linklisthead)
{
listnode*p;
charnum[5];
charname[9];
intxz;
printf("=====================\n");
printf("1.按编号查询\n");
printf("2.按姓名查询\n");
printf("=====================\n");
printf("请选择:
");
p=head->next;//假定通讯录表带头结点
scanf("%d",&xz);
if(xz==1){
printf("请输入要查找者的编号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)<0)//比较字符串比较,编号晓得指向下一个。
p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0)
p=NULL;//没有查到要查找的通讯者
}
else
if(xz==2){
printf("请输入要查找者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
returnp;
}
voiddelnode(linklisthead)
{
charjx;
listnode*p,*q;
p=listfind(head);//调用查找函数
if(p==NULL){
printf("没有查到要删除的通讯者!
\n");
return;
}
printf("真的要删除该结点吗?
(y/n)");
scanf("%c",&jx);
if(jx=='y'||jx=='Y'){
q=head;
while(q!
=NULL&&q->next!
=p)
q=q->next;
q->next=p->next;//删除结点
free(p);//释放被删除的结点空间
printf("通讯者已被删除!
\n");
}
}
voidprintlist(linklisthead)
{
listnode*p;
p=head->next;//因为链表带头接点,使P指向链表开始结点
printf("编号姓名性别联系电话地址\n");
printf("-----------------------------------------------------------------------\n");
while(p!
=NULL)
{
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.iphone,p->data.addr);
printf("-------------------------------------------------------\n");
p=p->next;
}
}
voidchangelist(linklisthead)//修改
{
linklistp;
charch[20];
printf("输入要修改人姓名:
\n");
gets(ch);
p=head;
intflag=0;//用来判断是否修改
while(p!
=NULL)
{
if(strcmp(p->data.name,ch)==0)//比较函数比较两个数据
{
printf("输入新num:
\n");
gets(p->data.num);
printf("输入新name:
\n");
gets(p->data.name);
printf("输入新sex:
\n");
gets(p->data.sex);
printf("输入新phone:
\n");
gets(p->data.iphone);
printf("输入新addres:
\n");
gets(p->data.addr);
flag=1;//找到并修改成功
}
p=p->next;
}
if(flag==1)
printf("修改完成\n");
else
printf("对不起,无此记录!
请重新输入。
");
}
六、测试分析
(最后一个修改功能无法运行)
七、使用说明
(1)首先运行程序,包括六个选项,0.退出系统.1.成绩录入2.成绩查询.3.成绩修改4.删除成绩.5.输出所有人成绩.6.统计各科总成绩.
(2)然后可以根据不同的需要选择不同的选项进行操作,
(3)最后退出程序。
八、运行程序过程中产生的问题及采取的措施
(1)在本次试验中我觉得我遇见了一些技术上的难点,刚开始是通讯录的建立,要用到数据结构中的知识,主要要用到链表和结构体。
在通讯录的插入的时候主要是用到学号的升值法插入,在此过程中要申请结点m和n,而且将要插入结点p插在两结点之间。
在通讯录的查询当中主要分为四类:
1).按学号查找的函数;2).按姓名查找的函数;3).按电话查找的函数;4).按住址查找的函数。
其实原理一样,只是使用strcmp()函数匹配出和要查找的通讯者信息相同的结点,并且将其所有的信息输出。
在删除函数我开始觉得删除的时候很困难,后来我是按学号删除的,因为学号是关键字,主要注意在删除后对一些结点需要改变p=p->next;p->next=p->next->next;free(q);如果没找到则q=q->next。
(2)在开始菜单中对应的功能数字是0-5。
可以按照自己想要操作的动作选择对应的数字实现相应的功能。
对于插入主要是按学号的升序来插入通讯者的信息。
在查找中分为四个查找方式:
1)按学号查询2)按姓名查询3)按号码查询4)按地址查询。
在删除中由于学号是主关键字,是唯一的,所以删除按学号来删除会比较方便。
而输出是按一个指针p指向头指针haed,按循环来输出直到p=NULL则结束输出。
九、总结和展望
总结:
(1)本次的课程设计在实践中操练了我们的编程能力,结果并不如人意.可见我们平时的只是积累还是太过欠缺.基础过于薄弱.以至于基本的编程思想尚未形成.通过这次课程设计,我看到自身存在的缺点.平日学习的编程思想要时时复习,记忆,这样坚持下来,很多的基本程序就可以直接拿出来使用,而一个大的程序也是由多个简单的小程序构造而来的.只有这样才能在接触到新的课题的时候找准出发点.
(2)课程设计的方法多种多样,很多时候我容易把学过的很多知识混杂,就好像C和C++的编程思维经常混杂一起,导致错误难以发现.所以我们的学习必须调理清晰才能保持清醒和流畅的思维,成功才能提高.(3)程序的要求很严格,不能有丝毫的错误,哪怕是中英文的不和谐切换,要细心和警惕,这样才能提高编程的成功率!
(4)一个稍大一点的程序必然会分成各个主程序和子程序来构成,所以在编程的初期不能急着入手,先要把自己想要的程序和实现的功能,包括需要的数据的定义,函数的名称,需要哪些函数,以及声明.就像作文的提纲一样,只有这样才能有条不紊,先从架构上把握整个程序.(5)当程序需要产生多个子函数的时候,要学会用多文件结构来实现程序的编译,也可以将每个子程序各自进行编译,来缩小错误的范围,更方便的来检测错误和修改错误.
展望:
这一次的课程设计带我回顾了很多被我遗忘了的知识,也带给我往后的学习方法,编程的思想和方法都是很枯燥的,但是我们必须接受,熟记.只有这样才能为往后的学习打好基础,才能更轻松的深入到往后更难得学习中去!
每一次的编程实践练习我总能收获到很多东西,很多编程的方法,思路.也只有这个时候,这种氛围之下大家才能真正全身心的投入到编程中去,找出问题解决问题!
对往后的学习大有裨益!
参考文献
[1]李建学等著.数据结构课程设计案例精编.清华大学出版社,2007
[2]唐宁九等主编.数据结构与算法(C++版)实验和课程设计教程.清华大学出版社,2008)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 系统 实现 课程设计 报告