家谱管理系统

news2024/9/20 9:00:46

家谱管理系统

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1906021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开关电源——调制模式和工作模式

一、开关电源的调制模式 开关电源作为一种广泛应用于电子设备中&#xff0c;用于将一定电压和电流转换为另一种电压和电流的技术&#xff0c;以下是开关电源三种常见的调制模式&#xff1a; 脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09; 脉冲频率调制&#xff…

触发器编程-创建(CREATE TRIGGER)、删除(DROP TRIGGER)

一、定义 1、触发器&#xff08;Trigger&#xff09;是用户对某一表中的数据做插入、更新和删除操作时被处罚执行的一段程序&#xff0c;通常我们使用触发器来检查用户对表的操作是否合乎整个应用系统的需求&#xff0c;是否合乎商业规则以维持表内数据的完整性和正确性 2、一…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢&#xff1f;如果下一个定义&#xff0c;你会如何来定义&#xff1f; 所谓智慧&#xff0c;就是能区分自己能改变的部分&#xff0c;自己无法改变的部分&#xff0c;努力去做自己能改变的&#xff0c;而不要天天想着那些无法改变的东西&a…

AI视频教程下载-使用ChatGPT成为全栈JavaScript开发者

学习使用Express JS和React JS进行全栈JavaScript开发 ChatGPT Express JS MongoDB React JS Tailwind 解锁全栈网页开发的世界&#xff0c;我们为初学者和中级学习者设计了全面的课程。在这段沉浸式的旅程中&#xff0c;你将深入前端和后端开发的基本概念&#xff0c;为自…

everything高级搜索-cnblog

everything高级搜索用法 基础4选项验证 总结搜索方式 高级搜索搜指定路径文件名: 文件名 路径不含文件名: &#xff01;文件名包含单词 路径包含指定内容: 路径 content:内容 大小写 区分大小写搜索搜指定路径文件名: case:文件名 路径全字匹配 全字搜指定路径文件名: wholewo…

【网络安全】实验六(网络安全协议的应用SSL,Ipsec)

一、实验目的 二、搭配环境 打开两台虚拟机&#xff0c;并参照下图&#xff0c;搭建网络拓扑环境&#xff0c;要求两台虚拟机的IP地址要按照图中的标识进行设置&#xff0c;并根据搭建完成情况&#xff0c;勾选对应选项。同时&#xff0c;按照多选题中2-3题的要求完成相关环境…

java核心-泛型

目录 概述什么是泛型分类泛型类泛型接口泛型方法 泛型通配符分类 泛型类型擦除分类无限制类型擦除有限制类型擦除 问题需求第一种第二种 概述 了解泛型有利于学习 jdk 、中间件的源码&#xff0c;提升代码抽象能力&#xff0c;封装通用性更强的组件。 什么是泛型 在定义类、接…

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 网域名称(英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain)&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck&#xff0c;GFLOPs从239降到了227&#xff1b;同时&#xff0c;map50从0.989涨到了0.99&#xff08;重参数后的结果&#xff09;。 改进方法简单&#xff0c;只做简单的替换就行&#xff0c;即插即用&#xff0c;非常…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

Cyber Weekly #14:WAIC 2024

赛博新闻 1、WAIC2024开幕&#xff1a;一半机器人&#xff0c;一半大模型 7月4日&#xff0c;AI界春晚——2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海开幕&#xff0c;大会展示了500家企业的1500项展品&#xff0c;突出了机器人和大模型技术。国产机器人和…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

知识的向量表示

1、one-hot表示&#xff0c;空间太大 2、bag词袋模型&#xff0c;无法表示词的语义 3、词的语义由什么决定&#xff1f;词由他的上下文决定&#xff1f;分布式语义 4、CBow&#xff0c;通过前面几个词和后面几个词&#xff0c;预测中间几个词 5、skip-gram&#xff0c;通过…

深度讲解 UUID/GUID 的结构、原理以及生成机制

目录 一. 前言 二. 被广泛使用 三. UUID 的结构 3.1. 必须了解的 3.2. 十六进制数字字符&#xff08;hexDigit&#xff09; 3.3. UUID 基本结构 3.4. 类型&#xff08;变体&#xff09;和保留位 3.5. 版本&#xff08;子类型&#xff09; 3.6. 时间戳 3.7. 时钟序列 …

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序&#xff0c;其中必定有很多辅助内容&#xff0c;这只会增加篇幅&#xff0c;在这里我们更愿意列举一些典型的备份脚本功能&#xff0c;展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

计算机如何存储浮点数

浮点数组成 在计算机中浮点数通常由三部分组成&#xff1a;符号位、指数位、尾数位。IEEE-754中32位浮点数如下&#xff1a; 上图32bit浮点数包含1bit的符号位&#xff0c;8比特的指数位和23bit的尾数位。对于一个常规浮点数&#xff0c;我们来看看它是如何存储和计算的。这里…

保健品商城小程序模板源码

保健品商城小程序模板源码 简洁通用的保健品&#xff0c;健康生活&#xff0c;零售商品&#xff0c;电子商务微信小程序前端模板下载。包含&#xff1a;主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

【系统架构设计师】八、系统工程基础知识(系统工程|系统性能)

目录 一、系统工程 1.1 系统工程的方法 1.1.1 霍尔的三维结构 1.1.2 切克兰德方法 1.1.3 并行工程方法 1.1.4 综合集成法 1.1.5.WSR 系统方法。 二、系统工程生命周期 2.1 系统工程生命周期7阶段 2.2 生命周期方法 三、基于模型的系统工程(MBSE) 四、系统性能 4.1…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统&#xff0c;万界星空科技开源的MES系统。该系统基于Java开发&#xff0c;具有广泛的适用性和高度的可定制性&#xff0c;能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…