资讯动态

基于 C++ 实现(控制台)家谱管理系统

发布时间:2026/9/5 9:40:22 来源:尧图企业网站定制
♻️ 资源大小905KB➡️资源下载https://download.csdn.net/download/s1t16/87472204家谱管理系统1.分析1.1 背景分析家谱是一种以表谱形式记载一个以血缘关系为主体的家族世袭繁衍和重要人物事迹的特殊图书体裁。家谱是中国特有的文化遗产是中华民族的三大文献国史地志族谱之一属于珍贵的人文资料对于历史学民俗学人口学社会学和经济学的深入研究均有其不可替代的独特功能。本项目对家谱管理进行简单的模拟以实现查看祖先和子孙个人信息插入家族成员删除家族成员的功能。1.2 功能分析本项目的实质是完成对家谱成员信息的建立查找插入修改删除等功能可以首先定义家族成员数据结构然后将每个功能作为一个成员函数来完成对数据的操作最后完成主函数以验证各个函数功能并得到运行结果。同时还具有简单的输出人物关系的功能。对于族谱中的某一个成员可以查询他的父母(父结点)兄弟姐妹(兄弟结点),子女(子女结点)的相关信息。2.设计2.1 数据结构设计此系统主要考察树这种数据结构。考虑到一个家族中一个家庭成员和另一个家庭成员的关系可能是祖先、父母、兄弟、子女、后代等等。所以笔者采用“左长子右兄弟”的森林结构。从根结点开始对于森林中的某一个结点其左子树上的结点均为此结点的子女其右子树上的结点均为此结点的兄弟(或姐妹)。出于优化系统的目的笔者采用了链表栈的数据结构栈主要用于用户输入时暂存输入的成员姓名在用户输入结束之后栈将弹出元素向用户展示自己刚才输入的成员姓名方便用户和系统进行交互。2.2 类结构设计引入类 FamilyTree 来表示森林这种数据结构,引入树节点 FamilyNode 类作为森林的结点,引入 Stack 类表示栈将 Stack 设计为链表栈的形式方便元素的入栈与出栈Stack 类的结点为 FamilyNode.考虑到增强代码的复用性所有的类均采用模板的形式FamilyNode,Stack,FamilyTree.由于栈Stack和森林FamilyTree需要访问其结点内部的数据所以将Stack和FamilyTree设置为FamilyNode的友元2.3 成员与操作设计(1)结点(FamilyNode)//家谱结点 templateclass T class FamilyNode { private: T _name; //结点的名称 FamilyNodeT* _childNode; //左节点-子女结点 FamilyNodeT* _siblingNode; //右节点-兄弟结点 FamilyNodeT* _preSiblingNode; //前兄弟结点 FamilyNodeT* _next; //新增栈中的下一个元素 FamilyNodeT* _parentNode; //新增指向父节点 public: FamilyNode(); FamilyNode(T data); ~FamilyNode(); T getNodeName() const; friend FamilyTreeT; friend StackT; };(2)森林(FamilyTree)//家谱 templateclass T class FamilyTree { private: FamilyNodeT* _first; /*家谱的内容一律存放在_first的_childNode指针域中_silbNode始终为空*/ protected: void recursionDelete(FamilyNodeT*node); //递归删除结点 public: FamilyTree(); ~FamilyTree(); FamilyNodeT* getNodeByName(T name,FamilyNodeT* node,bool tag) ; //查询名为name的结点 FamilyNodeT* 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(FamilyNodeT* number); //输出结点number的兄弟和子女 void deleteNode(FamilyNodeT* node); };(3)栈(Stack)//栈 以树结点为栈结点 templateclass T class Stack { private: FamilyNodeT* _top; public: Stack(); ~Stack(); void push(T name); //用于类外入栈 void pop(); //用于.cpp的函数 friend class FamilyTreeT; };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 无签名)-代码页650013.实现3.1 完善家谱功能(A)测试3.1.1 功能说明此功能主要用于系统的初始化刚进入系统时首先需要用户输入祖先的相关信息然后才能进行后续功能的实现。除了初始化以外在后续阶段此操作可以实现给结点添加子女的功能(只能添加子女不能添加兄弟)3.1.2 核心代码展示3.1.3 程序运行截图展示3.1.4 流程图展示3.2 添加家庭成员功能(B)测试3.2.1 功能说明此功能能够让用户给结点添加子女或兄弟3.2.2 核心代码展示3.2.3 程序运行截图展示3.2.4 流程图展示3.3 查看家庭成员功能(C)测试3.3.1 功能说明此功能能够让用户查看某一个家谱成员的相关信息(子女、父母、兄弟的姓名)。查看时只需要输入成员的姓名即可3.3.2 核心代码展示3.3.3 程序运行截图展示3.3.4 流程图展示3.4 解散局部家庭功能(D)测试3.4.1 功能说明此功能能够让用户删除家谱中的某个结点删除结点时将把这个结点以及其左子树(子女分支)的所有结点删去其右节点(兄弟分支)将会被保留。3.4.2 核心代码展示3.4.3 程序运行截图展示可以发现删除 aa 结点后其左子树被完全删除其右子树(兄弟分支 bb 等)被保留3.4.4 流程图展示3.5 更改家庭成员姓名功能(E)测试3.5.1 功能说明此功能支持用户修改家谱中某个成员的姓名首先输入原来的姓名在提示下输入新的名称就可以实现名称更改。3.5.2 核心代码展示3.5.3 程序运行截图展示3.5.4 流程图展示4.测试4.1 样例测试4.2 边界测试与错误测试4.2.1 查询不到家谱中的人执行删除、查询、添加子女等时需要输入家谱成员的姓名若输入一个不存在于家谱中的名字系统会给出相应的提示。4.2.2 输入不合法的操作指令此系统所支持的操作指令为 A、B、C、D、E、F 若输入不合法的指令系统能给出相应的提示。4.2.3 输入正整数时输入不合法的值此系统的插入子女等操作设计输入人数正整数,若输入非法的值系统会给出相应的提示。4.2.4 执行 B 操作时输入非法值此系统的 B 操作(添加家庭成员)需要用户输入需要添加的家庭成员类型(1-子女 2-兄弟)。若输入非法值系统会给出相应的提示。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价