家谱管理系统

家谱管理系统

一个家谱关系由若干家谱记录构成,每个家谱记录由父亲、母亲和子女姓名构成,其中姓名是关 键字。设计并实现一个简单的家谱管理系统。定义一个主菜单,界面友好,演示程序以用户和计算机的对话方式进行,可以反复操作,方便用户实现下述操作。

2. 功能和原始数据

2.1 主要功能

主要功能包括:

  1. 创建家族关系树:从键盘输入家谱记录,按照祖先到子孙的顺序建立家族关系树,并将其存储到外部文件。
  2. 添加家族成员:通过输入父亲、母亲和子女的姓名,将新的家族成员添加到家族关系树中,并保存到外部文件。
  3. 删除家族成员:根据输入的家族成员姓名,从家族关系树中删除对应的家谱记录,并保存到外部文件。
  4. 查询家族成员信息:根据输入的家族成员姓名,在家族关系树中查询对应的家谱记录,并输出相关信息。
  5. 输出家谱信息:遍历家族关系树并打印家谱信息。
  6. 打印家谱树的先序、中序和后序遍历:分别以先序、中序和后序方式打印家族关系树。

2.2 原始数据

原始数据包括家庭成员的姓名和关系,用于构建和管理家族关系树的层级结构。下面图片是调试所用到的例子:

 

图2-2 原始数据图

3. 程序总体设计

3.1 数据结构设计

程序中使用的数据结构包括:

(1)结构体 FamilyRecord:用于表示家谱记录,包括父亲姓名、母亲姓名、子女姓名列表,以及指向左右子节点的指针。

(2)类 FamilyTree:家谱管理系统类,包括私有成员变量 root(家谱记录的根节点)和 printedMembers(记录已经打印过的成员的集合)。

3.2 程序总体框架

FamilyTree 类框架图描述

类名: FamilyTree

(1)公有成员函数:

FamilyTree(): 构造函数

createFamilyTree(): 从键盘输入家谱记录,建立家族关系树

saveFamilyTreeToFile(): 保存家谱关系到外部文件

addFamilyMember(): 添加家族成员

removeFamilyMember(): 删除家族成员

queryFamilyMember(): 查询家族成员信息

printFamilyTree(): 输出家谱信息

printFamilyTreePreOrder(): 打印家谱树的先序遍历

printFamilyTreeInOrder(): 打印家谱树的中序遍历

printFamilyTreePostOrder(): 打印家谱树的后序遍历

(2)私有成员函数:

insertFamilyRecord(FamilyRecord&, FamilyRecord*&): 插入家谱记录到家族关系树

removeFamilyRecord(const string&, FamilyRecord*&): 从家族关系树中删除家谱记录

deleteFamilyRecord(FamilyRecord*&): 删除家族记录

queryFamilyRecord(const string&, FamilyRecord*, bool&): 查询家族记录

isChild(const string&, const vector<string>&): 判断是否为子女

printChildren(const vector<string>&): 打印子女姓名

printFamilyRecord(FamilyRecord*): 遍历并打印家族记录

printFamilyTreeToFile(FamilyRecord*, ofstream&): 递归打印家谱树并保存到文件

printFamilyTreePreOrder(FamilyRecord*, string): 输出家谱树的先序遍历

printFamilyTreeInOrder(FamilyRecord*, string): 输出家谱树的中序遍历

printFamilyTreePostOrder(FamilyRecord*, string): 输出家谱树的后序遍历

(3)关系:

公有成员函数可以直接调用私有成员函数。

createFamilyTree() 可能会调用 insertFamilyRecord() 来建立家族关系树。

saveFamilyTreeToFile() 可能会调用 printFamilyTreeToFile() 来保存家谱树。

addFamilyMember() 可能会调用 insertFamilyRecord()。

removeFamilyMember() 可能会调用 removeFamilyRecord() 和 deleteFamilyRecord()。

queryFamilyMember() 可能会调用 queryFamilyRecord()。

printFamilyTreePreOrder(), printFamilyTreeInOrder(), 和 printFamilyTreePostOrder() 分别对应不同的树遍历方式,并可能会调用相应的私有成员函数 printFamilyTreePreOrder(FamilyRecord*, string), printFamilyTreeInOrder(FamilyRecord*, string), 和 printFamilyTreePostOrder(FamilyRecord*, string)。

 

图3-2 FamilyTree函数框架图

 

图3-2 FamilyTree函数调用关系图

3.3 函数原型清单

class FamilyTree {

public:

    FamilyTree();

    void createFamilyTree();

    void saveFamilyTreeToFile();

    void addFamilyMember();

    void removeFamilyMember();

    void queryFamilyMember();

    void printFamilyTree();

    void printFamilyTreePreOrder();

    void printFamilyTreeInOrder();

    void printFamilyTreePostOrder();

private:

    void insertFamilyRecord(FamilyRecord&, FamilyRecord*&);

    void removeFamilyRecord(const string&, FamilyRecord*&);

    void deleteFamilyRecord(FamilyRecord*&);

    void queryFamilyRecord(const string&, FamilyRecord*, bool&);

    bool isChild(const string&, const vector<string>&);

    void printChildren(const vector<string>&);

    void printFamilyRecord(FamilyRecord*);

    void printFamilyTreeToFile(FamilyRecord*, ofstream&);

    void printFamilyTreePreOrder(FamilyRecord*, string);

    void printFamilyTreeInOrder(FamilyRecord*, string);

    void printFamilyTreePostOrder(FamilyRecord*, string);

};

3.4 程序组织

 

图3-4 程序组织框架图

4. 功能算法设计和调试

4.1 主要功能算法设计

1.文字描述算法设计思想,并用伪代码描述算法。

设计思想:

(1)创建家谱树:用户依次输入父亲、母亲和子女的信息,通过递归方式将新节点插入到二叉树中。

伪代码:

        创建家族记录

        如果根节点为空

            创建新根节点

        否则

            递归插入到左子树

            递归插入到右子树

(1)添加家族成员:获取新成员信息,按照二叉树的插入规则插入到树中。

伪代码:

        创建家族记录

        如果根节点为空

            创建新根节点

        否则

            递归插入到左子树

            递归插入到右子树

(2)删除家族成员:根据输入的成员姓名,在树中查找并删除。

伪代码:

        如果根节点为空

            返回

        如果根节点的父亲或母亲姓名与输入匹配

            删除根节点

            返回

        遍历子女列表,如果有匹配

            删除对应的子女

        递归删除左子树中的匹配成员

        递归删除右子树中的匹配成员

(4)查询家族成员:在树中递归查找匹配的成员,并输出其信息。
伪代码:

        如果根节点为空

            返回

        如果根节点的父亲、母亲或子女中有匹配

            输出信息

            返回

       递归查询左子树

        递归查询右子树

(5)遍历家谱树(先序、中序、后序):按照相应的遍历规则递归输出节点信息。

伪代码(以先序为例):

        输出根节点信息

        先序遍历左子树

        先序遍历右子树

2.给出算法实现的程序流程图。

 

图4-1 程序流程图

4.2 调试

  1. 运行程序后出现家谱系统界面

 

 

图4-2 调试图1

2.选择操作“1“按照指令输入数据可以保存家谱到文件myFamily073.txt

 

 

图4-2 调试图2

3.选择操作“4”查询家族成员信息,输入要查询成员的姓名即可

 

 

图4-2 调试图3

4.选择操作“5”,等待家谱信息输出

 

 

图4-2 调试图4

5.选择操作“6”,“7”,“8”,会按照先序,中序,后序的顺序树形输出家谱信息

 

 

 

图4-2 调试图5

 

 

 

图4-2 调试图6

 

 

图4-2 调试图7

6.选择操作“2”,添加家族成员信息

 

 

图4-2 调试图8

7.选择操作“3”,输入要删除家族成员的姓名即可

 

 

图4-2 调试图9

8.选择操作“0”,退出家谱系统,界面显示“谢谢使用,再见!”,调试结束

 

 

图4-2 调试图10

【功能介绍】 1.该族谱管理系统一改以往修谱系统的特点,增加了输出word文档的功能,方便在打印前对出谱资料的二次修改,具有很强的可修改性。另外,可以将族人图形资料输出到word文档,和族人资料一起一并打印。可以打印输出族人的图形等可见信息。 2.可以在数据库内保存家族和族人的语音、视频、扫描资料等重要资料,由于保存在数据库内,所以具有保密性。家谱资料在数据库内可以删除、查看,方便整个家族资料的管理和完备性。 3.可以将世系树的结构输出到文本文档,对于家族的分支结构在树上得到很好的诠释。由于文本文档不具有格式性, 所以可以输出无限大的世系图,可以将整个家族的世系图完整输出 。 4.具有输出部分世系图分支的功能,可以分段输出世系图,便于将世系图分段保存和管理。配合整个世系图和分段世系图,对于某一分支可以了解自家分支的世系全貌。 5.可以管理多个配偶信息,配偶信息的输出是附加在族人后面,对于家庭的完整性得到很好的体现。配偶信息资料全,可以了解配偶在自家的排行、兄弟姐妹等情况。 6.自定义家谱输出格式,方便输出古代的五代格式。五代输出按大排行方式输出,符合大家的排行习惯。 7.族人输出按照大排行的顺序输出,例子老大的儿子输出要排在老二儿子的前边, 老大的孙子输出也要排在老二孙子的前边,以此类推。 8.可以管理家族的历史事件,历史人物,可以任意增加历史事件和历史人物,来阐述家族曾经出得辉煌。增加的人物和事件无限制。
家谱软件是应海峡姓氏研究之约开发的族谱管理软件。 该软件是最新开发和上市的族谱管理软件,经过专业人士的指导和专业团队的开发,是目前国内性价比很高的专业族谱管理软件。 该软件具有管理大家族的能力,扩充能力在千万、亿级别,适合修全国统谱。可以谱修全国各个姓氏的族谱,对管理姓氏无限制。在同一软件上可以管理本家族和其他家族的资料,例可以管理外亲等家族的同步资料。 经过近三年的专业团队开发已经具有完善的族谱管理功能,可以帮助专业的谱修人士完成建谱、调谱、出谱等复杂的工作。该软件已经经过专业人士的测试,指导,能够完成大部分人的修谱需求。 该软件采用最先进的开发技术,采用国外最强大的单机版数据库技术,具有无限扩充能力和功能完善能力,该数据库支持的是上亿级别的数据处理。其技术为微软的开发平台支持,是其他族谱软件所无法比拟的平台和技术支撑。采用微软的visual studio开发技术,该技术是微软的最先进开发技术,从微软创办至今一直完善的一个技术支撑。 单机版本,数据库为单一文件,不是其他族谱软件的一堆数据文件。该数据库文件可以自己备份管理,可以拷贝到其他机器硬盘等来备份。 该程序可以脱网来使用,不需要上网,完全属于自己的软件,放心,安全,不受任何网络和第三方的控制。 该软件是目前市场上唯一直接对树操作的族谱管理软件,可以在树世系图上任意增加族人,选择某一族人后可以增加兄弟或子女。增加族人人数无限制。使用鼠标右键操作,符合大家的操作习惯。可以任意修改族人在树上的位置,方便在填错父亲的情况下将其修改回原来在树上的位置。在树上的位置可以整个分支改挂到另外一个分支,调整族人分支很方便。适合先建族人后修改父亲等需求。 该软件一改以往修谱软件的特点,增加了输出word文档的功能,方便在打印前对出谱资料的二次修改,具有很强的可修改性。另外,可以将族人图形资料输出到word文档,和族人资料一起一并打印。可以打印输出族人的图形等可见信息。 可以在数据库内保存家族和族人的语音、视频、扫描资料等重要资料,由于保存在数据库内,所以具有保密性。家谱资料在数据库内可以删除、查看,方便整个家族资料的管理和完备性。 可以将世系树的结构输出到文本文档,对于家族的分支结构在树上得到很好的诠释。由于文本文档不具有格式性, 所以可以输出无限大的世系图,可以将整个家族的世系图完整输出 。 具有输出部分世系图分支的功能,可以分段输出世系图,便于将世系图分段保存和管理。配合整个世系图和分段世系图,对于某一分支可以了解自家分支的世系全貌。 可以管理多个配偶信息,配偶信息的输出是附加在族人后面,对于家庭的完整性得到很好的体现。配偶信息资料全,可以了解配偶在自家的排行、兄弟姐妹等情况。 自定义家谱输出格式,方便输出古代的五代格式。五代输出按大排行方式输出,符合大家的排行习惯。 族人输出按照大排行的顺序输出,例子老大的儿子输出要排在老二儿子的前边, 老大的孙子输出也要排在老二孙子的前边,以此类推。 可以管理家族的历史事件,历史人物,可以任意增加历史事件和历史人物,来阐述家族曾经出得辉煌。增加的人物和事件无限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值