家族关系查询系统.docx
《家族关系查询系统.docx》由会员分享,可在线阅读,更多相关《家族关系查询系统.docx(25页珍藏版)》请在冰豆网上搜索。
家族关系查询系统
课程设计说明书
题目:
家族关系查询系统
姓名:
院(系):
信息工程学院
专业班级:
16级计算机科学与技术二班
学号:
指导教师:
成绩:
时间:
2018年1月2日至2018年1月11日
课程设计任务书
题目家族关系查询系统
专业、班级16级计算机科学与技术二班学号姓名
基本要求:
1、建立家族关系并能存储到文件;
2、对于建立的家族关系能够遍历家族成员,输入两个人的名字能够确定二人的关系;
3、实现家族成员的添加。
4、可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。
主要参考资料:
【1】严蔚敏、吴伟民.数据结构(C语言版).清华大学出版社
【2】滕国文.数据结构课程设计.清华大学出版社
【3】谭浩强.C程序设计(第四版).清华大学出版社
完成期限:
2018.1.2-2018.1.11
指导教师签名:
课程负责人签名:
1、课程设计介绍…………………………………………4
1.1课程设计内容……………………………………4
1.2课程设计要求……………………………………4
1.3课程设计性质……………………………………4
1.4课程设计目的……………………………………4
2、课程设计原理…………………………………………4
2.1课程设计题目分析
2.1.1程序执行的命令包括……………………………………5
2.12程序中的四大模块………………………………………5
结束语…………………………………………………14
参考文献………………………………………………15
附录……………………………………………………16
1课程设计介绍
1.1、课程设计内容
运用队列的存储结构,构建家族关系树。
输入家族的名称,以此名称作文件的名称,建立文本文件。
按层次输入结点信息,在文件中每个人的信息占一行,同时保存到树的存储结构中。
输入一个结点,若此结点有多个兄弟,以“@”作为兄弟结点的结束标志,结点若无孩子,直接以“@”作为标志,依次输入各个结点的信息,以“#”作为结束的标志。
输入结点的序列为zhangxianzu,@,zhangguoyu,zhangguojun,zhangguoqiang,@,zhangyongzhi,@,zhangyongrui,zhangyongming,@,zhangwende,zhangwenjia,@,#。
建立家族关系树后,对树进行一些基本操作。
首先,对家族关系树遍历,确定家族成员已存入文件,并检验是否成功建立家族关系树。
输入两个人的姓名,判断此二人是否属于此家族,若属于就判断此二人的关系。
最后,能够成功退出家族关系查询系统。
1.2、课程设计要求
构建家族关系树。
使用队列的存储结构,建立家族关系查询系统树。
采用指针数组作为队列,保存结点输入的地址。
能够遍历家族关系树。
遍历家族成员,检验输出信息是否满足要求。
成功地判断所输入的两个人是否是家族中得人,如果属于就判断两人的关系。
最后,若选择退出,能够成功退出家族关系查询系统。
否则,继续输入相关操作。
1.3、课程设计的性质
通过数据结构的学习,使自己对软件编程能力有一定的提高。
数据结构学习是锻炼学生在进一步掌握模块化、结构化程序设计的方法的同时,培养自己运用已学知识分析问题、解决问题及编写实用程序的能力,通过对线性化、层次化、网络化数据结构的了解进一步掌握自然数据的结构方式及组织方式,让自己深入体会存储在计算机中的数据及程序,如何运用数据实现编程。
加深自己对该课程所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。
通过课程设计,能够提高自己分析问题、解决问题,从而运用所学知识解决实际问题的能力。
1.4、课程设计的目的
主要目的如下:
1、培养学生运用算法与数据结构的基本知识解决实际编程中的数据结构设计和算法设计问题。
2、培养学生独立设计程序与解决问题的能力,培养学生团队协作集成程序模块及调试能力。
3、培养学生初步的软件设计及软件测试的能力。
2.课程设计原理
2.1、课程设计题目分析
演示程序以用户和计算机的对话的方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应的数据(即每个人都所持的密码),每个人的序号由程序自动分配。
2.1.1程序执行的命令包括:
(1)构造家族关系查询系统(使用树的存储结构);
(2)根据提示及使用者的需求,用户选择相关选项,输入相关数据;
(3)执行用户所选的选项对应的程序,满足用户需求,实现相关功能;
(4)退出家族关系查询系统,结束操作。
2.1.2程序中的四个大模块(本程序共有六个模块,其中查找模块又分为六个):
(1)家族成员信息录入(构造家族关系查询系统)模块。
此模块将对家族关系树初始化,根据用户输入的信息构造家族关系查询系统树,并提醒用户再次输入数据以便后续程序的使用。
(2)遍历家族成员模块。
此模块将满足用户遍历家族关系查询系统树中的各个成员。
另外,可以检测用户输入的信息是否正确,以及浏览家族中的人员。
(3)确定两个家族成员的关系模块。
由用户输入两个人的名字,此模块实现在整个程序中查找,确定是否有用户输入的人。
如果有,则输出两人的之间的关系(即他们相差几代)。
(4)主程序中的退出模块。
根据用户输入的信息管理控制变量,根据控制变量判断是否退出程序。
2.2、课程设计原理图分析
2.2.1、功能模块图
2.2.2、流程图分析
1、此部分是家族关系查询系统的主函数。
首先,初始化程序中所需要的变量;在输出提示性的语句,等待用户输入将要进行的操作的选项,根据用户输入的数据调用相关的函数。
N
Y
N
Y
Y
N
2、此部分是创建家族关系树函数,并且保存到文件。
用队列的存储结构辅助创建树。
N
Y
N
Y
N
Y
N
Y
N
Y
3、此部分是遍历家族成员函数。
采用递归的思想,对家族关系树进行遍历。
Y
N
N
Y
N
Y
4、此部分是确定家族成员中两人关系的函数。
由用户输入两个人的姓名,系统调用Confirm()函数判断此二人是否属于此家族。
若属于,判断两人的关系。
3、数据结构分析
3.1、存储结构
根据要求首先应该建立一个队列,用队列的存储结构辅助实现家族关系树的建立。
树是n(>=0)个结点的有限集。
在任意一棵非空树中:
(1)有且仅有一个特定的称为根的结点;
(2)当n>1时,其余结点可分为m个互不相交的有限集,其中每个集合本身又是一棵树。
设置结构体存储节点:
用结构体存储每一个家族成员的基本信息,及结点的左右孩子指针和双亲指针;再使用结构体存储表示队列结点。
树的结点结构体:
typedefstructTNode
{
charname[M];
structTNode*parent;
structTNode*lchild;
structTNode*rchild;
}Tree;
队列结点结构体:
typedefstructNode
{
Tree*info;
structNode*next;
}Node;
typedefstruct
{
structNode*front;
structNode*rear;
}LQ;
3.2、算法描述
1、用户进入家族关系查询系统,根据提示输入要进行的操作所对应的选项,用户输入的数据被d接收,系统判断d是否大于7并小于1,如果是,则提醒用户重新输入。
否则调用相关函数,执行相应的功能。
若用户输入的d的值在1-6之间,如果用户第一次输入的数值大于1,则系统会提醒用户先建立家族关系树。
2、建立家族关系树。
用户输入家族名称,系统根据家族名称建立对应的文件,用户输入结点信息,系统先将信息保存到文件和fname[M]数组中。
在建树时,将结点的信息从fname[M]数组中复制给str,系统判断str[0]是否等于’#’,并且是否等于’@’,直接执行下面的语句,第一次传入结点时,root等于NULL,建立头结点,再次传入结点时,如果str[0]等于‘@’,内部循环结束,接着出入结点,再次此判断str[0]是否等于‘@’,不等于的话,执行内部循环,取对头元素,判断flag是否等于0,如果等于0,将结点接在所取对头的左孩子上,否则接在右孩子上。
在执行外循环时,如果start2不等于0时,删除对头元素。
3、查询两个家族成员的关系。
由用户输入两个人的姓名,Relation()函数调用Confirm()函数,确认用户所输入成员姓名是否属于此家族中的成员。
如果属于,用x[M]存放对应的结点,并令全局变量z等于1,在执行Relation()函数时,判断z的值,确定此人是否属于这个家族。
若属于,令结点不停的指向它的父亲结点,直到父亲结点是根结点,同时应整数形式的w[M]控制执行的次数,作为判断是第几代的根据。
最后,根据w[M]判断两人相差几代。
4、退出家族关系查询系统。
在主函数中,用户选择退出选项在(即输入6),系统执行flag等于0,即控制外循环的变量为0,循环结束,成功退出家族关系查询系统。
4、调试与分析
4.1、调试过程
在调试程序是主要遇到一下几类问题:
1、当输入此函数时出现了与&相关的错误,例如后面缺少括号以及分号等等以下的错误;
2、输入每个家庭成员的的信息时,兄弟之间没有用“@”区分,导致建立家族关系树时错误。
另外输入不正确,程序有可能出现停止;
3、在一些函数前不加返回值变量类型,调试时出现逻辑错误;
4、在定义结构体时,定义结构体指针变量,但在程序运行时出现了定义的结构体指针不起作用。
5、在运行程序时,由于没有声明变量,或对于指针变量没有初始化,无法执行程序。
4.2、执行过程
进入家族关系查询系统,系统提示用户输入相关操作:
输入要进行的操作:
1
输入家族的名称:
zhang
输入家族成员姓名:
zhangxianzu
输入家族成员姓名:
@
输入家族成员姓名:
zhangguoyu
输入家族成员姓名:
zhangguojun
输入家族成员姓名:
zhangguoqiang
输入家族成员姓名:
@
输入家族成员姓名:
zhangyongzhi
输入家族成员姓名:
@
输入家族成员姓名:
zhangyongrui
输入家族成员姓名:
zhangyongming
输入家族成员姓名:
@
输入家族成员姓名:
@
输入家族成员姓名:
zhangwende
输入家族成员姓名:
zhangwenjia
输入家族成员姓名:
@
输入家族成员姓名:
#
家族关系成功建立!
(系统接着提示用户输入)
输入要进行的操作:
2
(输入结果)
zhangxianzuzhangguoyuzhangyongzhizhangwende,zhangwenjiazhangguojunzhangyongruizhangyongming
zhangguoqiang
(系统接着提示用户输入)
输入要进行的操作:
6
(输入结果)
成功退出家族关系查询系统!
4.3、运行时界面
1、运行主函数时。
2、输入要进行的操作。
3、接着根据提示输入相应的操作,输入数据遍历家族关系查询系统中的成员。
4、根据提示选择确定两人关系选项,输入两个人的姓名。
1、若输入的人不时家族中得人,运行情况如下。
2、退出家族关系查询系统。
结束语
通过这次课程设计,虽然程序设计和调试的能力有所提升,但最终还是没能独立完成课程设计的课程要求。
这次课程设计使我深刻认识到自己专业知识的匮乏,缺乏独立程序设计的能力。
通过这次的课程设计也是我认识到了我在程序设计方面的严重不足,以及专业知识的严重匮乏。
我的程序设计思想和代码的编写和调试能力在此次课设期间有所提高。
这样一种更贴切实际的课程设计,大大的提高了我的学习效率,希望能够在平时教学的时候也能加入一些类似课程设计的程序设计习题。
参考文献
【1】严蔚敏、吴伟民.数据结构(C语言版).清华大学出版社
【2】滕国文.数据结构课程设计.清华大学出版社
【3】谭浩强.C程序设计(第四版).清华大学出版社
附录
主要程序:
1、主函数程序:
voidmain()
{
intd,flag=1,start1=1,f;
Treet1;
t=&t1;
while(flag)
{
printf("\t\t家族关系查询系统\n");
printf("\t-------------------------------\n");
printf("\t1、新建家族关系\t2、遍历家族成员\n\n");
printf("\t3、确定两人关系\t4、查找\n\n");
printf("\t5、添加家族关系\t6、退出查询系统\n");
printf("\t-------------------------------\n");
A:
printf("输入要进行的操作(1-6):
");
scanf("%d",&d);getchar();
f=1;
if(d<1||d>6)
{
printf("\n输入有误,请重新输入!
!
!
\n\n");
gotoA;
}
if((d>1)&&start1)
{
printf("\n\n请先创建家庭关系!
\n\n");
f=0;
}
if(f)
{
switch(d)
{
case1:
Create();start1=0;break;
case2:
Traverse(t);printf("\n\n");break;
case3:
Relation();printf("\n\n");break;
case4:
Search(t);printf("\n\n");break;
case5:
Add(t);printf("\n\n");break;
case6:
flag=0;break;
}
}
}
printf("\n\t家族关系查询系统使用结束!
\n");
}
2、建立家族关系树程序
voidCreate()
{
charstr[M];
inti=0;
FILE*fp;
t->parent=NULL;
t->lchild=NULL;
t->rchild=NULL;
printf("请输入文件的名称(家族的名称):
");
scanf("%s",filename);getchar();
strcat(filename,".txt");
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannotopen!
");
exit(0);
}
printf("请按层次输入结点(姓名),兄弟输入结束以“@”为标志,结束标志为“#”:
\n");
gets(str);
fputs(str,fp);
fputc('\n',fp);
strcpy(fname[i],str);
i++;
while(str[0]!
='#')
{
printf("请继续输入:
\n");
gets(str);
fputs(str,fp);
fputc('\n',fp);
strcpy(fname[i],str);
i++;
}
fclose(fp);
TreeCreate(t);
printf("家族关系已成功建立!
\n\n");
}
voidTreeCreate()
{
Tree*t1,*root=NULL;
LQ*q;
inti=0,flag=0,start2=0;
charstr[M];
q=LQCreateEmpty();
strcpy(str,fname[i]);
while(str[0]!
='#')
{
while(str[0]!
='@')
{
if(root==NULL)
{
root=(Tree*)malloc(sizeof(Tree));
strcpy(root->name,str);
root->lchild=NULL;
root->parent=NULL;
root->rchild=NULL;
LQEnQueue(q,root);
t=root;
}
else
{
t1=(Tree*)malloc(sizeof(Tree));
strcpy(t1->name,str);
t1->lchild=NULL;
t1->rchild=NULL;
t1->parent=LQGetFront(q);
LQEnQueue(q,t1);
if(!
flag)
root->lchild=t1;
else
root->rchild=t1;
root=t1;
}
flag=1;
i++;
strcpy(str,fname[i]);
}
if(start2!
=0)
{
LQDeQueue(q);
if(q->front!
=NULL)
root=LQGetFront(q);
}
start2=1;
flag=0;
i++;
strcpy(str,fname[i]);
}
}
3、确定关系函数程序
voidRelation()
{
charstr[2][M];
inti,w[2]={1,1};
v=0;
for(i=0;i<2;i++)
{
printf("请输入第%d个人的姓名:
",i+1);
gets(str[i]);
Confirm(t,str[i]);
if(z==1)
y[i]=1;
else
y[i]=0;
z=0;
}
if(y[0]&&y[1])
{
printf("\n两人都属于此家族。
\n\n");
for(i=0;i<2;i++)
{
while(x[i]!
=t)
{
x[i]=x[i]->parent;
w[i]++;
}
}
if(w[0]==w[1])
printf("%s和%s都是第%d代人。
\n",str[0],str[1],w[0]);
elseif(w[0]>w[1])
printf("%s比%s早%d代。
\n",str[1],str[0],w[0]-w[1]);
else
printf("%s比%s早%d代。
\n",str[0],str[1],w[1]-w[0]);
}
elseif(!
y[0]&&y[1])
printf("%s是此家族中的人,%s不是此家族中的人!
\n",str[1],str[0]);
elseif(y[0]&&!
y[1])
printf("%s是此家族中的人,%s不是此家族中的人!
\n",str[0],str[1]);
else
printf("%s和%s都不是此家族中的人!
\n",str[0],str[1]);
}
课程设计成绩评定表
评定项目
内容
满分
评分
总分
学习态度
学习认真,态度端正,遵守纪律。
10
设计情况
认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。
40
说明书质量
设计方案正确、表达清楚;设计思路、实验(论证)方法科学合理;达到课程设计任务书规定的要求;图、表、文字表达准确规范,上交及时。
40
回答问题情况
回答问题准确,基本概念清楚,有理有据,有一定深度。
10
总成绩
采用五级分制:
优、良、中、及格、不及格
指导教师评语:
签名:
年月日