家族关系查询系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

郑州科技学院
算法与数据结构课程
设计
题目家族关系查询系统
学生姓名
专业班级
学号
所在系
指导教师
完成时间

郑州科技学院
算法与数据结构课程设计任务书专业:班级:学号:姓名:一、设计题目:
家族关系查询系统
二、基本要求
1、建立家族关系并能存储到文件;
2、对于建立的家族关系能够遍历家族成员,输入两个人的名字能够确定二人的关系;
3、实现家族成员的添加。

4、可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。

三、设计任务
1、根据问题分析,实现树的的存储结构。

2、将家族中各个成员保存到自己命名的文件中。

3、创建遍历、查找、添加等函数,实现函数基本的一些功能。

四、设计时间
2010 年12月 19日至 2011 年 12 月 25 日
指导教师:
教研室主任:
目录
1、课程设计分析 (3)
1.1课程设计内容 (3)
1.2课程设计要求 (3)
1.3课程设计性质 (3)
1.4课程设计目的 (4)
2、课程设计原理 (4)
2.1课程设计题目分析
2.1.1程序执行的命令包括 (4)
2.12程序中的四大模块 (4)
2.2 课程设计原理图分析 (5)
2.2.1 功能模块图 (5)
2.2.2 流程图分析 (6)
3、数据结构分析 (10)
3.1 存储结构 (11)
3.2 算法描述 (11)
4、调试与分析 (12)
4.1 调试过程 (12)
4.2执行过程 (12)
4.3运行时的界面 (13)
结束语 (16)
致谢 (17)
参考文献 (18)
附录 (19)
1、课程设计介绍
1.1、课程设计内容
运用队列的存储结构,构建家族关系树。

输入家族的名称,以此名称作文件的名称,建立文本文件。

按层次输入结点信息,在文件中每个人的信息占一行,同时保存到树的存储结构中。

输入一个结点,若此结点有多个兄弟,以“@”作为兄弟结点的结束标志,结点若无孩子,直接以“@”作为标志,依次输入各个结点的信息,以“#”作为结束的标志。

输入结点的序列为zhangxianzu,@,zhangguoyu,zhangguojun,zhangguoqiang,@,zhangyongzhi,@,zhangyongrui,zhangyongming,@,zhangwende,zhangwenjia,@,#。

建立家族关系树后,对树进行一些基本操作。

首先,对家族关系树遍历,确定家族成员已存入文件,并检验是否成功建立家族关系树。

输入两个人的姓名,判断此二人是否属于此家族,若属于就判断此二人的关系。

最后,能够成功退出家族关系查询系统。

1.2、课程设计要求
构建家族关系树。

使用队列的存储结构,建立家族关系查询系统树。

采用指针数组作为队列,保存结点输入的地址。

能够遍历家族关系树。

遍历家族成员,检验输出信息是否满足要求。

成功地判断所输入的两个人是否是家族中得人,如果属于就判断两人的关系。

最后,若选择退出,能够成功退出家族关系查询系统。

否则,继续输入相关操作。

1.3、课程设计的性质
通过数据结构的学习,使自己对软件编程能力有一定的提高。

数据结构学习是锻炼学生在进一步掌握模块化、结构化程序设计的方法的同时,培养自己运用已学知识分析问题、解决问题及编写实用程序的能力,通过对线性化、层次化、网络化数据结构的了解进一步掌握自然数据的结构方式及组织方式,让自己深入体会存储在计算机中的数据及程序,如何运用数据实现编程。

加深自己对该课程所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。

通过课程设计,能够提高自
己分析问题、解决问题,从而运用所学知识解决实际问题的能力。

1.3、课程设计的目的
主要目的如下:
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、此部分是家族关系查询系统的主函数。

首先,初始化程序中所需要的变量;在输出提示性的语句,等待用户输入将要进行的操作的选项,根据用户输入的数据调用相关的函数。

2、此部分是创建家族关系树函数,并且保存到文件。

用队列的存储结构辅助创建树。

3、此部分是遍历家族成员函数。

采用递归的思想,对家族关系树进行遍历。

N
4、此部分是确定家族成员中两人关系的函数。

由用户输
入两个人的姓名,系统调用Confirm()函数判断此二人
是否属于此家族。

若属于,判断两人的关系。

3、数据结构分析
3.1、存储结构
根据要求首先应该建立一个队列,用队列的存储结构辅助实现家族关系树的建立。

树是n(>=0)个结点的有限集。

在任意一棵非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m个互不相交的有限集,其中每个集合本身又是一棵树。

设置结构体存储节点:
用结构体存储每一个家族成员的基本信息,及结点的左右孩子指针和双亲指针;再使用结构体存储表示队列结点。

树的结点结构体:
typedef struct TNode
{
char name[M];
struct TNode *parent;
struct TNode *lchild;
struct TNode *rchild;
}Tree;
队列结点结构体:
typedef struct Node
{
Tree *info;
struct Node *next;
}Node;
typedef struct
{
struct Node *front;
struct Node *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
(输入结果)
zhangxianzu zhangguoyu zhangyongzhi zhangwende,zhangwenjia zhangguojun zhangyongrui zhangyongming
zhangguoqiang
(系统接着提示用户输入)
输入要进行的操作:6
(输入结果)
成功退出家族关系查询系统!
4.3、运行时界面
1、运行主函数时。

2、输入要进行的操作。

3、接着根据提示输入相应的操作,输入数据遍历家族关系查询系统中的成员。

4、根据提示选择确定两人关系选项,输入两个人的姓名。

5、若输入的人不时家族中得人,运行情况如下。

6、退出家族关系查询系统。

结束语
通过这次课程设计,虽然程序设计和调试的能力有所提升,但最终还是没能独立完成课程设计的课程要求,没能独立做出此次要求的航空客运订票系统。

这次课程设计使我深刻认识到自己专业知识的匮乏,缺乏独立程序设计的能力。

通过这次的课程设计也是我认识到了我在程序设计方面的严重不足,以及专业知识的严重匮乏。

我的程序设计思想和代码的编写和调试能力在此次课设期间有所提高。

这样一种更贴切实际的课程设计,大大的提高了我的学习效率,希望能够在平时教学的时候也能加入一些类似课程设计的程序设计习题。

致谢
本课题在选题及进行过程中得到周丽老师的悉心指导。

论文行文过程中,周老师多次帮助我分析思路,开拓视角,在我遇到困难想放弃的时候给予我最大的支持和鼓励。

周老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。

再多华丽的言语也显苍白。

在此,谨向周老师致以诚挚的谢意和崇高的敬意。

感谢郑科院党所有老师对我生活和工作的关怀。

在你们的帮助和陪伴下走过的大二岁月,给了我最好的锻炼和最快的成长。

感谢新和我同宿舍的各位好友,在我课题研究过程中给予我技术上的极大支持和心理上的鼓励。

感谢高道辉和黄志斌,是你们的陪伴让我度过了最难过的时光;感谢董怡博,是你教会了我如何简单地快乐;感谢金长江,是你让我懂得温暖。

感谢我的室友们,我们一起经历过的聚散喜悲,一起走过的每一段路,我一生都不会忘记。

友情的无私为我们的大学时光重重地写下了无悔。

感谢我的家人,养育之恩,无以回报。

我将用自己最大的努力给你们欣慰。

大二上学期生活随着论文的完成划上句号。

最后,我感谢大二上学期内给过我帮助和关注的所有人,更加感谢给过我挫折的所有人。

你们用不同的方式给了我成长,也是你们促使我在大二上学期时光里一直努力,我终于可以在毕业的那一天无愧的说一声:青春无悔!
参考文献
1.《数据结构课程设计》
2./forum-179-1.html数据结构与算法编程论坛
3 《数据结构》(C语言版)
4 C语言设计教程
附录
主要程序:
1、主函数程序:
void main()
{
int d,flag=1,start1=1,f;
Tree t1;
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");
goto A;
}
if((d>1)&&start1)
{
printf("\n\n请先创建家庭关系!\n\n");
f=0;
}
if(f)
{
switch(d)
{
case 1: Create();start1=0;break;
case 2: Traverse(t);printf("\n\n");break;
case 3: Relation();printf("\n\n");break;
case 4: Search(t);printf("\n\n");break;
case 5: Add(t);printf("\n\n");break;
case 6: flag=0;break;
}
}
}
printf("\n\t家族关系查询系统使用结束!\n");
}
2、建立家族关系树程序
void Create()
{
char str[M];
int i=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("can not open!");
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"); }
void TreeCreate()
{
Tree *t1,*root=NULL;
LQ *q;
int i=0,flag=0,start2=0;
char str[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、确定关系函数程序
void Relation()
{
char str[2][M];
int i,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]);
else if(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]);
}
else if(!y[0]&&y[1])
printf("%s是此家族中的人,%s不是此家族中的人!\n",str[1],str[0]);
else if(y[0]&&!y[1])
printf("%s是此家族中的人,%s不是此家族中的人!\n",str[0],str[1]);
else
printf("%s和%s都不是此家族中的人!
\n",str[0],str[1]);
}。

相关文档
最新文档