# 家谱管理系统
## 1.分析
### 1.1 背景分析
家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世袭繁衍和重要人物事迹的特殊图书体裁。家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属于珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有其不可替代的独特功能。本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息,插入家族成员,删除家族成员的功能。
### 1.2 功能分析
本项目的实质是完成对家谱成员信息的建立,查找,插入,修改,删除等功能,可以首先定义家族成员数据结构,然后将每个功能作为一个成员函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得到运行结果。
同时还具有简单的输出人物关系的功能。对于族谱中的某一个成员,可以查询他的父母(父结点),兄弟姐妹(兄弟结点),子女(子女结点)的相关信息。
## 2.设计
### 2.1 数据结构设计
此系统主要考察树这种数据结构。考虑到一个家族中一个家庭成员和另一个家庭成员的关系可能是祖先、父母、兄弟、子女、后代等等。所以笔者采用“左长子,右兄弟”的森林结构。从根结点开始,对于森林中的某一个结点,其左子树上的结点均为此结点的子女;其右子树上的结点均为此结点的兄弟(或姐妹)。
出于优化系统的目的,笔者采用了链表栈的数据结构,栈主要用于用户输入时暂存输入的成员姓名;在用户输入结束之后栈将弹出元素,向用户展示自己刚才输入的成员姓名,方便用户和系统进行交互。
### 2.2 类结构设计
引入类 FamilyTree 来表示森林这种数据结构,引入树节点 FamilyNode 类,作为森林的结点,引入 Stack 类,表示栈;将 Stack 设计为链表栈的形式,方便元素的入栈与出栈,Stack 类的结点为 FamilyNode.
考虑到增强代码的复用性,所有的类均采用模板的形式,FamilyNode<T>,
Stack<T>,FamilyTree<T>.
由于栈Stack和森林FamilyTree需要访问其结点内部的数据,所以将Stack和FamilyTree设置为FamilyNode的友元
### 2.3 成员与操作设计
(1)结点(FamilyNode)
```
//家谱结点
template<class T>
class FamilyNode
{
private:
T _name; //结点的名称
FamilyNode<T>* _childNode; //左节点-子女结点
FamilyNode<T>* _siblingNode; //右节点-兄弟结点
FamilyNode<T>* _preSiblingNode; //前兄弟结点
FamilyNode<T>* _next; //新增,栈中的下一个元素
FamilyNode<T>* _parentNode; //新增,指向父节点
public:
FamilyNode();
FamilyNode(T data);
~FamilyNode();
T getNodeName() const;
friend FamilyTree<T>;
friend Stack<T>;
};
```
(2)森林(FamilyTree)
```
//家谱
template<class T>
class FamilyTree
{
private:
FamilyNode<T>* _first; /*家谱的内容一律存放在_first的_childNode指针域中,_silbNode始终为空*/
protected:
void recursionDelete(FamilyNode<T>*node); //递归删除结点
public:
FamilyTree();
~FamilyTree();
FamilyNode<T>* getNodeByName(T name,FamilyNode<T>* node,bool& tag) ; //查询名为name的结点
FamilyNode<T>* getFirstNode()const //返回祖先结点(第一个有用的结点)
{
return this->_first->_childNode;
};
void insertNode(T target, T name, Tag tag); //在名为target的结点处插入名为name的tag类型结点
void changeNode(T target,T name); //将名为target的结点名称修改为name
void insertRoot(T name); //插入根节点
void printNode(FamilyNode<T>* number); //输出结点number的兄弟和子女
void deleteNode(FamilyNode<T>* node);
};
```
(3)栈(Stack)
```
//栈 以树结点为栈结点
template<class T>
class Stack
{
private:
FamilyNode<T>* _top;
public:
Stack();
~Stack();
void push(T name); //用于类外入栈
void pop(); //用于.cpp的函数
friend class FamilyTree<T>;
};
```
### 2.4 文件设计
本系统支持windows系统和Linux系统。
(1)Windows 系统
windows系统的相关文件在文件夹06_1953608_WuYinghao_Windows中,
其中类的定义以及其成员函数的定义在 06_1953608_WuYinghao.h 中;main 函数以及相关的函数定义在 06_1953608_WuYinghao.cpp 中.06_1953608_WuYinghao.exe 为 Windows 平台下的可执行文件。
06_1953608_WuYinghao.cpp和06_1953608_WuYinghao.h的编码格式均为简体中文(GB2312)-代码页 936
(2)Linux 系统
Linux系统的相关文件在文件夹06_1953608_WuYinghao_Linux中,其中类的定义以及其成员函数的定义在 06_1953608_WuYinghao_Linux.h 中;main 函数以及相关的函数定义在 06_1953608_WuYinghao_Linux.cpp 中.06_1953608_WuYinghao.out 为 Linux 平台下的可执行文件。
06_1953608_WuYinghao_Linux.cpp和06_1953608_WuYinghao_Linux.h的编码格式均为Unicode(UTF-8 无签名)-代码页65001
## 3.实现
### 3.1 完善家谱功能(A)测试
#### 3.1.1 功能说明
此功能主要用于系统的初始化,刚进入系统时首先需要用户输入祖先的相关信息,然后才能进行后续功能的实现。
除了初始化以外,在后续阶段此操作可以实现给结点添加子女的功能(只能添加子女,不能添加兄弟)
#### 3.1.2 核心代码展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/3327503860e889036404d664cad0e8e6.writebug)
#### 3.1.3 程序运行截图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/db29d23ad03dbc70d67e7b3f2848ad5a.writebug)
#### 3.1.4 流程图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/44bf70d38a4cb288b984e6089f9ccdcd.writebug)
### 3.2 添加家庭成员功能(B)测试
#### 3.2.1 功能说明
此功能能够让用户给结点添加子女或兄弟
#### 3.2.2 核心代码展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/c9b8a4fcc284acd54f5c8b3cad59fef1.writebug)
#### 3.2.3 程序运行截图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/727a265fd560dec08604fe9df93b61bb.writebug)
#### 3.2.4 流程图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/9aac5feaa6639fa7873707fcb8c60e6a.writebug)
### 3.3 查看家庭成员功能(C)测试
#### 3.3.1 功能说明
此功能能够让用户查看某一个家谱成员的相关信息(子女、父母、兄弟的姓名)。查看时只需要输入成员的姓名即可
#### 3.3.2 核心代码展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/74374c043e54ae147aa1cf18a7a11b2d.writebug)
#### 3.3.3 程序运行截图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/b5adaeb9de895722adec9985f33863f4.writebug)
#### 3.3.4 流程图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/5849b963e0a0d50593821d0d0f7b884e.writebug)
### 3.4 解散局部家庭功能(D)测试
#### 3.4.1 功能说明
此功能能够让用户删除家谱中的某个结点,删除结点时,将把这个结点以及其左子树(子女分支)的所有结点删去,其右节点(兄弟分支)将会被保留。
#### 3.4.2 核心代码展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/21728b8d0bd0bd5e5f73a8cc3db3fdbd.writebug)
#### 3.4.3 程序运行截图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/873763c50bd053a5e73a673e4426bb28.writebug)
可以发现删除 aa 结点后其左子树被完全删除,其右子树(兄弟分支 bb 等)被保留
#### 3.4.4 流程图展示
![](https://www.writebug.com/myres/static/uploads/2021/11/20/ae0b732ed7f60f4a4381baf256038635.writebug)
### 3.5 �
基于 C++ 实现(控制台)家谱管理系统【100010877】
版权申诉
5星 · 超过95%的资源 165 浏览量
2023-02-21
11:12:31
上传
评论 1
收藏 906KB ZIP 举报
神仙别闹
- 粉丝: 2671
- 资源: 7640
最新资源
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 二叉树7-1-1.cpp
- android 9.0 原生模拟器 签名文件
- 技术面试最后反问面试官的话 校招面试非技术问题有哪些 非技术问题如何回答.png
- NB-IOT-BC26全网通模块Altium+ CADENCE +PADS三种格式(原理图SCH+PCB封装库)文件.zip
- 基于微信小程序开发的校园失物招领系统源码毕业设计(优质项目源码).zip
- 词向量是一种将自然语言中的单词转换为数值向量的技术,它能够捕捉词义和上下文信息
- nmap与masscan的简单使用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈