您好,欢迎来到帮我找美食网。
搜索
您的当前位置:首页家谱管理系统

家谱管理系统

来源:帮我找美食网
数据结构 课程设计报告

家谱管理系统

一、需求分析

本系统实现以下功能:

1). 输入文件以存放最初家谱中各成员的信息。 成员的信息中均应包含以下内容:

姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。 2). 实现数据的存盘和读盘。 3). 以图形方式显示家谱。 4). 显示第n 代所有人的信息。

5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 6). 按照出生日期查询成员名单。 7). 输入两人姓名,确定其关系。 8). 某成员添加孩子。

9). 删除某成员(若其还有后代,则一并删除)。 10).修改某成员信息。

11).按出生日期对家谱中所有人排序。

12).打开一家谱时,提示当天生日的健在成员。 测试要求:

1).建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。 2).对界面的要求是:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

二、设计概要

1、抽象数据类型兄弟孩子树的定义如下: ADT CSNode{ 数据对象:person是兄弟孩子树中的每一个节点,T是整个树的统一体

数据关系:R1={<personi-1,personi>|<personi-1,personi>表示personi-1和personi之间有

血缘关系}

基本操作:

CSNode *CreatTree(fstream &outfile);

初始条件:已经打开了文本文件PersonInfo.txt

操作结果:创建一个兄弟孩子树T,并把从文件中的数据送到树中,关闭文件。 void CreatParent_step(CSNode *parent);

初始条件:兄弟孩子树T已经存在

操作结果:对所有的孩子节点添加指向父亲的指针 void InOrderTraverse(CSNode *T); 初始条件:兄弟孩子树T已经存在 操作结果:对T进行中序遍历。 bool Today_Brithday(CSNode *T); 初始条件:兄弟孩子树T已经存在 操作结果:根据计算机系统的时间判断几天是否有人过生日,并显示他们的名字。

- 1 -

数据结构 课程设计报告

bool (int n,CSNode *T,LinkQueue &Q);

初始条件:兄弟孩子树T已经存在,队列Q也已经存在 操作结果:用队列Q返回第N代人的所有信息 void Link_Info(LinkQueue Q);

初始条件:队列Q中是第N代人的所有信息 操作结果:显示队列中所有人的信息。

CSNode *DetectMember_Name(CSNode *T,char name[]); 初始条件:兄弟孩子树T已经存在

操作结果:根据输入的姓名进行查找,如找到则返回该节点的指针。 CSNode *DetectMember_BornDate(CSNode *T,Date date); 初始条件:兄弟孩子树T已经存在

操作结果:根据输入的出生日期进行查找,如找到则返回该节点的指针。 void OutputOneInfo(CSNode *T); 初始条件:采集到一个节点T

操作结果:显示这一个节点的所有信息。 void Output_Name_Relation(CSNode *T); 初始条件:采集到一个节点T

操作结果:显示这一个节点的父亲和孩子的所有信息。 void Delete_Member(CSNode *T,char name[]); 初始条件:兄弟孩子树T已经存在

操作结果:根据输入的姓名进行查找,如找到则删除该节点和他所有的孩子节点。 void Edit_Member_Info(CSNode *T,char name[]); 初始条件:兄弟孩子树T已经存在

操作结果:根据输入的姓名进行查找,如找到则根据用户要求修改相应的信息。 bool Add_New_Child(CSNode *T); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的姓名进行查找,如找到则在他的孩子树中添加新的孩子节点。 void InOrderInfile(CSNode *T,fstream &infile);

初始条件:兄弟孩子树T已经存在,且已经打开了文本文件PersonInfo.txt 操作结果:把现在的数据读入文件中,关闭文件。 bool Generation(CSNode *T,CSNode *child); 初始条件:兄弟孩子树T已经存在

操作结果:判断child是否是T的后代,如果是返回true,否则返回false。 void Output_Two_Member_Realtionship(CSNode *T,char name1[],char name2[]); 初始条件:兄弟孩子树T已经存在

操作结果:根据已经输入的两个姓名进行查找和判断,确定他们的关系。 void InOrderIn(CSNode *T,CSNode S[],int &num); 初始条件:兄弟孩子树T已经存在

操作结果:对T进行中序遍历,并且把每一个节点信息送到数组S中,num为S

中成员个数。

void LineChars(CSNode S[],int num); 初始条件:节点数组S已经存在

操作结果:对数组的节点信息按照出生日期进行排序,采用的是基数排序 }ADT CSNode

- 2 -

数据结构 课程设计报告

2、抽象数据类型队列的定义如下: ADT LinkQueue{ 数据对象:D={ei| i=1,2,3,…,n;n≧0;ei∈LinkQueue}

数据关系:R1={<ei-1, ei>|<ei-1,ei>表示ei-1和ei之间有先后顺序关系} 基本操作:

bool InitQueue(LinkQueue &Q);

操作结果:创建一个空的队列Q。 bool DestroyQueue(LinkQueue &Q); 初始条件:队列Q存在

操作结果:销毁队列Q,Q不再存在。 bool EnQueue(LinkQueue &Q,CSNode e); 初始条件:队列Q存在

操作结果:插入元素e为Q的新的队尾元素。 bool ClearQueue(LinkQueue &Q); 初始条件:队列Q存在 操作结果:清空队列Q。 bool QueueEmpty(LinkQueue Q); 初始条件:队列Q存在

操作结果:若队列为空,则返回true,否则返回false。 bool DeQueue(LinkQueue &Q,CSNode &e); 初始条件:队列Q存在

操作结果:删除Q的队头元素,并用e返回其值,并返回true。 int QueueLength(LinkQueue Q); 初始条件:队列Q存在

操作结果:返回队列Q的长度。 bool GetHead(LinkQueue Q,CSNode &e); 初始条件:队列Q存在

操作结果:用e返回队首元素,并返回true。 } ADT LinkQueue 3、主程序 Void main() { 打开文本文件PersonInfo.txt; Do{接受命令(对兄弟孩子树进行相关的操作的选项); 处理命令(对兄弟孩子树进行相关的操作); }while(“命令”!=“退出”); }

三、详细设计

1、程序:由于程序有1000多行,所以就不列出,见附后的源程序(电子报告)。2、函数的调用关系图:

- 3 -

数据结构 课程设计报告

main Output_N_MemberAdd_New_Child Delete_MembeDetect DetectMember_Name DetectMember_BornDatInOrderInfile Edit_Member_InName_RelatioToday_Brithday Output_Two_Member_Realtionship 四、调试分析

1、家谱系统的编程过程还是比较简单的,储存结构是兄弟孩子树,所以调试的时候还是比较顺利的。

2、这次程序因为是关于树的操作,所以用递归的思想用的比较多。 3、程序当中的在用树的相关操作外,还运用了队列。 4、在时间和空间复杂度上,都进行了有效的控制。

5、该系统的安全效果较好,能自动辨别出错误的输入信息,并给出警告或提示。

五、测试结果

- 4 -

数据结构 课程设计报告

图1 主界面

图2 家谱图显示

- 5 -

数据结构 课程设计报告

图3 修改成员信息

- 6 -

数据结构 课程设计报告

图4 添加成员

图5 按姓名查找(只显示自己信息)

- 7 -

数据结构 课程设计报告

图6 按姓名查找

图7 按出生日期查找

- 8 -

数据结构 课程设计报告

- 9 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- banwoyixia.com 版权所有 湘ICP备2023022004号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务