家族关系图 你好:我想制作我家里所有人的名字 做一个家谱图 请问怎样设计

栏目:资讯发布:2023-11-28浏览:1收藏

家族关系图   你好:我想制作我家里所有人的名字  做一个家谱图   请问怎样设计,第1张

  家谱图(genogram):家谱图的使用源于系统家庭治疗,是以图的形式描述家庭从祖父母到自己三代人的血亲关系和婚姻关系,可以帮助心理咨询与治疗的实践者对来访者及其家庭系统保持一种系统观。

  中文名

  家谱图

  外文名

  genogram

  应用学科

  心理学

  应用范围

  临床与咨询心理学

  

C++语言: 二叉树实现的简单家谱树

/

File Name: BiTreecpp

Author: Geng Lequn[glq2000@126com]

Thur July 1 2010

Discription: 建立二叉家谱树,实现输入任意两个人的名字,查找得到其关系

/

#include <iostream>

#include <string>

#include <cstring>

#include <cstdlib>

#include <vector>

#include <mathh>

using namespace std;

typedef struct _Node

{

string sex; //性别 m 男; f 女

string name; //此人的姓名

string spause; //配偶的姓名

unsigned short level; //层次 辈分最高一层为1,下一层为为2,以此类推

struct _Node l_child; //指向其第一个孩子的指针

struct _Node r_brother; //指向其某一个兄弟姐妹的指针, 即左孩子为其后代,右孩子为其兄弟姐妹

struct _Node btr; //指向其父亲或者母亲的指针

_Node():level(0),l_child(NULL),r_brother(NULL),btr(NULL){cout<<"constructor"<<endl;}

~_Node(){cout<<name<<" destructor"<<endl;}

}Node, PNode;

void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth);//建立二叉家谱树,以先序方式

void VisitBiTreePreOrder(PNode root); //前序遍历此二叉树

void TellRelation(PNode root); //判断两人关系

void DestroyBiTreePostOrder(PNode root); //销毁二叉树,释放节点占用的空间

void FindPersonMiddleOrder(PNode root, string name, PNode &presult); //返回家谱中指向某人的指针,找不到返回NULL

Node root=NULL; //全局变量,二叉树的根节点

unsigned findPersonFlag = 0; //标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此flag可避免将整个tree遍历一遍(若该name在tree中存在的话)

int main()

{

cout<<"请按先序遍历的顺序根据提示输入家谱信息,不存在则输入\"#\""<<endl;

CreateBiTreePreOrder(root, NULL, 1);//建立二叉家谱树,以先序方式

VisitBiTreePreOrder(root); //前序遍历此二叉树

TellRelation(root); //判断两人关系

DestroyBiTreePostOrder(root); //销毁二叉树

getchar();getchar();getchar();

return 0;

}

/

function:建立二叉家谱树,以先序方式

argument:

pn: 指向二叉树节点的引用

pback: pn这个节点的btr指针的值,即指向其parent的指针

depth: 该节点的层次,分最高一层为1,下一层为为2,以此类推

/

void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth)

{

string str;

cin>>str; //输入该人信息,格式是 sex-name-spausename,如不存在则输入#

if(str == "#") //如: M-tom-marry, 表示此人叫tom, 男性, 配偶名字marry

{

pn = NULL;

return;

}

//如果是自定义的struct/class,应该使用构造函数。如果是内建数据类型,

//比如int,应该memset。 当然,更好的建议是使用vector取代new出来的数组

pn = new Node;

//处理输入的字符串

vector<string> v;

for(size_t b=0, e=strfind('-'); ; e=strfind('-', b))

{

if(e == string::npos)

{

vpush_back(strsubstr(b));

break;

}

else

vpush_back(strsubstr(b, e-b));

b = e+1;

}

//初始化该节点

pn->sex = v[0];

pn->name = v[1];

pn->spause = v[2];

pn->btr = pback;

pn->level = depth;

//递归建立左右子树的节点

CreateBiTreePreOrder(pn->l_child, pn, depth+1); //注意后两个参数的值

CreateBiTreePreOrder(pn->r_brother, pback, depth); //注意后两个参数的值

}

/

function: 前序遍历此二叉树

/

void VisitBiTreePreOrder(PNode pn)

{

if(!pn)

return;

cout<<endl<<"sex:"<<pn->sex<<endl;

cout<<"name:"<<pn->name<<endl;

cout<<"spause:"<<pn->spause<<endl;

cout<<"level:"<<pn->level<<endl;

cout<<"father's name:"<<((pn->btr == NULL)"NULL":pn->btr->name)<<endl;

cout<<"======================"<<endl;

VisitBiTreePreOrder(pn->l_child);

VisitBiTreePreOrder(pn->r_brother);

}

/

function: 中序遍历找到家谱中的一个人,返回其指针,若找不到,返回NULL

isSpause 1表示是找到的节点的配偶 0表示不是所找到的节点的配偶

/

void FindPersonMiddleOrder(PNode pn, string name, PNode &presult)

{

if(!pn)

return;

FindPersonMiddleOrder(pn->l_child, name, presult);

if(findPersonFlag) return;

if(name == pn->name || name == pn->spause)

{

presult = pn;

findPersonFlag = 1; //全局标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此全局flag可避免将整个tree遍历一遍(若该name在tree中存在的话)

return; //下次使用前不要忘记置为0

}

FindPersonMiddleOrder(pn->r_brother, name, presult);

}

/

function: 判断两人关系,若两人中至少一人不在树中,则两人无关系

若两人在树中,先判断两人是否同层次,若同层,判断是否是亲兄弟姐妹;

若不同层,设辈分大的人为A,辈分小的人为B,判断A和B是亲的还是表的,

比如,A为男性,且比B大一倍,判断A是否为B的爸爸,或亲叔叔(舅舅),或表叔叔(舅舅)

简单起见,此处没有区分是叔叔还是舅舅

比如,A为男性,且比B大两倍,判断A是否为B的亲爷爷(姥爷),或亲爷爷(姥爷)的亲兄弟

,或亲爷爷(姥爷)的表兄弟

简单起见,此处没有区分是叔叔和舅舅等做进一步区分

简单起见,查询时只输入节点中的name,不查询spause,否则处理起来太麻烦

/

void TellRelation(PNode pn)

{

string name1, name2;

//p1指向name1, p2指向name2, pbig指向辈分大的,psmall指向辈分小的

PNode p1 = NULL, p2 = NULL, pbig = NULL, psmall = NULL;

int differ = 0; //两人辈分数的差别

string title;

Label:

cout<<endl<<"输入想查询关系的两个人的名字,不想查则将两人名字输成#:"<<endl;

while(cin>>name1 && cin>>name2)

{

if(name1=="#" && name2=="#") return;

p1 = NULL; p2 = NULL; //因为程序是循环执行的,需要将上次遗留的值清掉

findPersonFlag = 0;

FindPersonMiddleOrder(root, name1, p1);

findPersonFlag = 0;

FindPersonMiddleOrder(root, name2, p2);

if(!p1 || !p2) //若有一个为空或都为空,说明至少有一个人不在家谱中,故两人无亲缘关系

{

cout<<name1<<((!p1)" 不在":" 在")<<" 家谱树中"<<endl;

cout<<name2<<((!p2)" 不在":" 在")<<" 家谱树中"<<endl;

cout<<name1<<" 和 "<<name2<<" 间没有关系"<<endl<<endl;

goto Label;

}

differ = (int)abs(p1->level - p2->level);

if(!differ) //辈分一样大

{

if(p1->sex == p2->sex)

{

if(p1->sex == "M") title = "兄弟关系";

else title = "姐妹关系";

}

else title = "兄妹(姐弟)关系";

if(p1->btr == p2->btr) //parent相同

cout<<name1<<" 和 "<<name2<<" 间是 "<<" 亲 "<<title<<endl;

else

cout<<name1<<" 和 "<<name2<<" 间是 "<<" 表 "<<title<<endl;

}

else //辈分不一样大

{

if(p1->level < p2->level) {pbig = p1; psmall = p2;}

else {pbig = p2; psmall = p1;}

switch(differ)

{

case 1:

if(psmall->btr == pbig)

title = ((pbig->sex == "M")"爸爸":"妈妈");

else

{

if(psmall->btr->btr == pbig->btr)

title = ((pbig->sex == "M")"亲叔(舅)":"亲姑(姨)");

else

title = ((pbig->sex == "M")"表叔(舅)":"表姑(姨)");

}

break;

case 2:

if(psmall->btr->btr == pbig)

title = ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");

else

{

string tmp = ((pbig->sex == "M")"兄弟":"姐妹");

if(psmall->btr->btr->btr == pbig->btr)

title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲") + tmp;

else

title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表") + tmp;

}

break;

default:

string tmp2;

PNode pt = psmall;

int n = differ-2; //计算"老"字 (即grand这个字) 出现的个数

for(int i=0; i<n; ++i)

tmp2 += "老";

for(int i=0; i<differ; ++i)

pt = pt->btr;

if(pt == pbig)

title = tmp2 + ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");

else

{

string tmp3 = ((pbig->sex == "M")"兄弟":"姐妹");

if(pt->btr == pbig->btr)

{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲"); title+=tmp3;}

else

{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表"); title+=tmp3;}

}

break;

}

cout<<pbig->name<<" 是 "<<psmall->name<<" 的 "<<title<<endl;

}

goto Label;

}

}

/

function: 后序遍历销毁此二叉树,释放节点占用的内存空间

/

void DestroyBiTreePostOrder(PNode pn)

{

if(!pn) return;

DestroyBiTreePostOrder(pn->l_child);

DestroyBiTreePostOrder(pn->r_brother);

delete pn;

}

了解元数据,可以看下下面这篇文章,是一个90后的小美女写的,通俗易懂。\x0d\\x0d\近几年,随着90后群体逐步迈入职场,逐渐出现在社会大众的视野当中。本文出自一名90后美女程序员之手,他们是极具个性的一代,他们这代技术人的新奇想法,正是现代企业需要的创新源泉\x0d\\x0d\关于作者:\x0d\\x0d\龚菲普元信息大数据产品部90后美女程序员\x0d\\x0d\公司大数据治理正做得风生水起,各种核心产品在国内市场数一数二,终极大BOSS们将数据治理方面的经验总结成文章,篇篇干货,堪称经典。(有兴趣的同学可以看下公众号的历史文章,不过据说有一批干货文章还没发表出来,敬请期待)。作为尚未正式入职的小菜鸟,我也只能在极浅的层面发表一些我自己的看法\x0d\\x0d\我将文章分为两大部分,第一部分介绍元数据概念,第二部分从几个方面说明元数据管理的应用,最后一部分总结一下元数据的重要性,仅代表我的一些个人观点,还请各位前辈们不要见笑。\x0d\\x0d\一、元数据什么鬼\x0d\\x0d\我入职的时候刚好赶上公司的元数据产品升级换代,同事们的研发气氛正火热,作为新入职菜鸟,总得先了解一下元数据概念,不然日后怎么和小伙伴们愉快地玩耍,于是查找国内外相关材料:\x0d\\x0d\一段时间之后有了一些知识积累,才发现用“关于数据的数据”来给元数据下定义确实再准确不过了,但同时也略微抽象,新人难于快速理解,待到上周我们数据治理专家从心理学的角度来阐述元数据之后,我终于也算理解了元数据到底是个啥,今天也算是站在“巨人”的肩膀上,用一种更简单的方式来回答“元数据究竟是什么”这个问题\x0d\\x0d\元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助。咦检索信息小蝌蚪找妈妈的过程也是一个检索信息的过程,是不是看懂这个故事就能懂元数据是什么了\x0d\\x0d\池塘里有一群小蝌蚪,他们看见鲤鱼妈妈在教小鲤鱼捕食,就迎上去,问:“鲤鱼阿姨,我们的妈妈在哪里”\x0d\\x0d\此时蝌蚪们意识到,不对啊,我们的数据库里不是应该存在着一张Mother表吗,但是蝌蚪们竟然对这张表一无所知,不知道有什么字段,也不知道各个字段对应的具体数值:\x0d\\x0d\鲤鱼妈妈说:“你们的妈妈有四条腿,宽嘴巴。你们到那边去找吧!”\x0d\\x0d\鳄鱼笑着说:“你们的妈妈有两只大眼睛,披着绿衣裳。你们到那边去找吧!”\x0d\\x0d\乌龟笑着说:“我不是你们的妈妈,你们的妈妈肚皮是白的,到前面去找吧。”\x0d\\x0d\青蛙听了“各各”地笑起来,说“唉!傻孩子,我就是你们的妈妈呀”\x0d\\x0d\整个过程可以看成是Mother这张表逐步完善的过程,数据来源分别是鲤鱼妈妈、鳄鱼妈妈和乌龟妈妈,如下图所示:\x0d\\x0d\对蝌蚪们最终获取到的信息进行进一步抽象,就可以形成一种“元数据”,该元数据描述了Mother这张表的结构:\x0d\\x0d\刚才不是说元数据能为检索信息提供帮助吗,那是不是也说明元数据能为小蝌蚪找妈妈提供帮助我们将在第二部分试着对这个故事进行改编,详细介绍小蝌蚪利用元数据快速找到妈妈的过程。\x0d\\x0d\二、元数据管理的应用\x0d\\x0d\通常一款元数据管理工具应具备元模型设计、元数据采集、元数据分析、数据地图展现等核心功能,我们试着改编小蝌蚪找妈妈这个故事,在改编的过程中理解这几个核心功能,前提是我们假设所有动物共同构成了一个庞大的数据体系,小蝌蚪们Mother的具体数据已经存在于此体系之中(鲤鱼系统、鳄鱼系统、乌龟系统)。\x0d\\x0d\1、元模型设计\x0d\\x0d\先解释一下元模型。如果说元数据是对数据的描述,那么元模型就是对元数据的描述,是对元数据的进一步抽象,三者的关系如下图所示:\x0d\\x0d\再讲一下元模型设计的过程。首先获取到系统中的所有元数据,将这些元数据汇总并进行合理规划,进一步抽象成元模型,从一定角度来说,可以把这个抽象的过程看成元模型设计的过程。\x0d\\x0d\元模型定义了各种元数据的结构以及元数据之间的关系,是元数据管理的基础,也就是说,如果我们想用元数据帮助小蝌蚪找妈妈,需要先设计出合理的元模型。下图是我试着给它们设计出的元模型(对于企业来说,真正的元模型设计过程非常复杂,受多方面因素影响):\x0d\\x0d\我们认为小蝌蚪的妈妈(Mother)由若干个属性(Property)组成,每个属性的名称用Name表示,每个属性的类型用Type表示。\x0d\\x0d\现在元模型有了,下一步就是按照这个设计好的元模型采集小蝌蚪们需要的元数据信息,也就是我们常说的元数据采集。\x0d\\x0d\2、元数据采集\x0d\\x0d\设计好元模型之后,元数据管理工具能通过全自动的方式采集到企业所需要的元数据,在这个故事中,按照我设计好的元模型,元数据管理工具的元数据采集结果应该如下图所示:\x0d\\x0d\小蝌蚪们拿着这份元数据再去针对性地检索关于妈妈的信息,就能一步到位,将目标直接锁定到青蛙,整个故事将因元数据的出现而成功改写。\x0d\\x0d\说明:在真实的企业数据环境中,数据与元数据是已经存在于系统之中的,元数据管理就是根据企业现有的元数据设计出适合企业的元模型,然后将系统之中的元数据按照元模型集中汇总并关联到一起,达到企业对数据统一管理与应用的目的。\x0d\\x0d\3、元数据分析\x0d\\x0d\a、血缘分析\x0d\\x0d\假设动物园园长慢羊羊正管理着整个动物园的数据信息,有一天园长发现自己这里有个数据不对,需要找出错误数据的提供者并追究责任,那么这个错误数据来自于哪个动物家庭呢挨家挨户去敲门核对数据显然不够高效,元数据管理工具的血缘分析功能会自动帮助园长分析这个错误数据的上游路径,比如这个数据是由鲤鱼妈妈交给鳄鱼妈妈,鳄鱼妈妈再提交给园长的,那么此时园长只需要去敲鲤鱼和鳄鱼家的门就可以了。\x0d\\x0d\b、影响分析\x0d\\x0d\数据终于更正了,此时园长需要及时提醒大家这个数据的更正信息,只需要通知这个数据影响到的动物家庭就可以了,这让园长十分苦恼,整个动物园的数据传递这么复杂,怎么判断哪个家庭会受到这个数据的影响呢,元数据管理工具的影响分析功能会分析出这个数据的影响范并能用可视化的方式展现出来,园长只需要通知受影响的动物家庭就可以了。\x0d\\x0d\c、数据地图展现\x0d\\x0d\随着动物园规模的日益扩大,入住的动物种类日益增多,有一天园长想了解动物园的整体情况,有多少动物家庭,哪个家庭和哪个家庭比较要好,哪个家庭和哪个家庭又从来没有联系,此时元数据管理工具的数据地图可以帮助园长获取到他想要的信息,数据地图展现功能可以通过可视化的方式,让园长对整个动物园的情况了如指掌,帮助它更好地观察整个动物园的情况。\x0d\\x0d\三、元数据的重要性\x0d\\x0d\在大数据时代的背景下,数据即资产,元数据实现了信息的描述和分类的格式化,从而为机器处理创造了可能,它能帮助企业更好地对数据资产进行管理,理清数据之间的关系。元数据管理是企业提升数据质量的基础,也是企业数据治理中的关键环节。元数据管理不当,信息很容易被丢失,进而不能对业务进行有效支撑,企业内部业务人员要识别相关信息就会变得十分困难,最终用户也将失去对数据的信任。\x0d\\x0d\写在最后:\x0d\\x0d\公司正在研发针对企业级用户的数字化企业云平台,并且全面公开研发文档与技术细节,由我担任的群主的微信讨论群也会对架构设计过程进行公开,欢迎对此感兴趣的前辈和朋友入群,与我们共同讨论,共商“云”是。感兴趣或者想学习相关技术,可在百度中搜EAii了解。

1、成立“修谱机构”及确定“修谱主持人”

  凡一个家族准备新修或续修家谱,首要的工作就是成立“修谱机构”。“修谱机构”通常称为“×氏家族修谱理事会”(或委员会等)。其次,就需要确定“修谱主持人”,由“修谱主持人”全面负责,并组织有关人员开展修谱工作。

  2、“登记入谱”的准备工作

  “登记入谱”是决定修家谱之后就要开展的一项十分重要的工作,此项工作按以下要求办理:

  ①分发“家族成员入谱登记表”必须使用专门设计、统一印刷而成的,与《家谱》配套使用的专用底稿纸:“家族成员入谱登记表”,将每一房人、每个家庭的成员全部正确的进行填表登记。

  ②确定始祖

  ③确定修谱的范围

  3.整理、审定“家族成员入谱登记表”,使每个入

谱人员的填写情况都正确无误后,即可正式填表修谱了。

  4、填表修谱前的准备工作

  ①确定填写谱册的人

由于《家谱》填表方法简明易懂,填写人具有初中文化水平即可,只要认真细心、书写工整、责任感强就可以胜任。

  ②墨水最好使用炭素墨水,以保证字迹永不褪色。

  ③所有文字资料已准备好“家族成员入谱登记表”已全部收回并经整理审核无误。由修谱主持人组织人员拟定序、凡例、先世考、个人传记…有关文字资料已定稿。

  ④将已定稿的基本文字部分,以及家族成员的生平传记,和家族大事记等文字记叙部分抄写在“谱序、源流、凡例…”和“生平传记”、“家族大事记”、“家族荣誉册”等表式中。将家族成员个人情况、血缘关系情况分别填入“家族名册”、“世系表”等表式中。

  ⑤如家族人口多,分支多所需要的谱册套数较多时,则可以依照已修好的第一套“家谱”作样本,可由一人或数人填写复制所需要的套数。

  ⑥如所需谱册不只一套时,必须在每一套谱册的内封页右上角空白方框内填上每一套谱册的编号,并将每套谱册内的“第几次修谱

套分存情况表”分别填好。

  ⑦将修好的谱册,分发给每一位收藏“家谱”的持有人,妥为保存。至此,采用《家谱》修谱这一工作即告完成。

家族关系图 你好:我想制作我家里所有人的名字 做一个家谱图 请问怎样设计

  家谱图(genogram):家谱图的使用源于系统家庭治疗,是以图的形式描述家庭从祖父母到自己三代人的血亲关系和婚姻关系,可以帮助心理咨...
点击下载
热门文章
    确认删除?
    回到顶部