家谱树怎么画

栏目:资讯发布:2023-10-02浏览:1收藏

家谱树怎么画,第1张

家谱树一般以树状来呈现,那么具体画法如下:

1、首先第一排是祖辈,写下祖辈的名字。

2、然后写下每个祖辈的子孙三代,每个家族一支,往下按顺序填写。

3、外围画成波浪半圆形,相关亲戚连枝都连在一起就是整个树状家谱图。

那么在整个绘画过程中我们还需要做两件事情:

步骤一:整理收集你所要展现的所有信息。

写下你想要展示在家谱里的所有家庭成员,从你的家庭开始分支出来。首先写下你的直系亲属的名字,然后添加上一代,不要忘了兄弟姐妹及其配偶子女,确保没有遗漏的人。作为家族历史重要的一部分,家谱需要时间与耐心来准确绘制。

步骤二:创建树状图。

写上家庭成员的名字,不清楚的可以问一下家里的老人,写好树状图,去问问家族的老人,以寻找更多的信息来绘制家谱图。

名字、出生日期、生活照片等等,追寻的代数越久远,这些信息越不好收集。进行一些研究,仔细检查自己的家谱树,这是一个大好机会去更多地了解家族历史。

家谱图的绘制都是从基本家谱图开始的。先要用基本符号画出来访者的基本家庭结构。通常是先画来访者及其父母或者子女两代人的家庭,接着是目前一起居住的家庭及其成员然后再加入祖父母及父母的兄弟姐妹。

画完家谱图的基本框架之后,在此基础上添加其它有关家庭的信息。家庭信息的收集是通过访谈的形式完成的。

信息收集具体内容的多少和广泛程度由使用家谱图的目的和咨询的目标确定。第三步是在家谱图上描绘家庭成员的关系。家庭成员关系的特征可以是家庭成员自己叙述的,也可以是咨询员自己观察的。

绘制家谱图步骤如下:

一、从这一代开始。这是树的基础上,包括你,你的父母,你的兄弟姐妹。如果你想让它另辟蹊径垂直,并延续向浓密的上方,像一棵树,从一大张纸的底部开始。你也可以开始于一张纸的左边,这样的图将很容易从左侧看向右侧。填写以下信息即可开始:

1、你的名字。

2、画一条线从你的名字到你母亲的名字。从你的名字到你父亲的名字再画另一条线。画一条水平线连接你的母亲和父亲。

3、如果你有兄弟姐妹,画一条线从你父母的名字到他们的名字。

4、如果你的兄弟姐妹有配偶,把他们名字写上,并用线连接起来。

5、如果你的兄弟姐妹有孩子,把他们名字写上,并用线将他们连接起来。

二、从你的父母辈填写。现在是时候填写第二代——你的父母辈。连接横线在每个已婚夫妇上,然后连接一条线向他们的孩子。

1、写你外公外婆的名字在你妈的名字上面。写你的祖父母的名字在你父亲的名字上面。

2、把你的外公外婆的名字和你妈的兄弟姐妹名字姐连接起来。把你的祖父母的名字和你父亲的兄弟姐妹的名字连接起来。

3、添加你叔叔阿姨配偶的名字。

4、添加你叔叔阿姨的孩子,你的表兄弟姐妹的名字。

三、画你的祖父母那一代。如果你有一个大的家庭,你的图可能已经有要投奔的页面边缘的威胁了。有些人停在了这里,有两组祖父母作为他们家谱图中的树冠。如果你想继续前进,是时候包括你的祖父母那一代了。记住要连接已婚夫妇是水平线,然后话一条线连接家长和子女。

1、添加你的外祖母的父母亲和你祖外公的父母亲的名字。这是你的曾祖父母。

2、添加你的曾祖母的父母亲和你曾祖父的父母亲的名字。这是你的曾曾父母。

3、添加您的外祖父母的兄弟姐妹的名字——你的叔外祖父叔外祖母

4、添加你的祖父母的兄弟姐妹的名字——你的舅爷和姨奶奶。

5、填写你叔外祖父母的配偶和子女的姓名。

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;

}

http://wwwonlinedownnet/soft/39407htm

家谱先生(FamilyKeeper) 61

一款国产的具有很高实用价值的专用家谱制作软件。无论您是新修、续修、还是改修老式家谱、或者是抢救复制私藏老谱,该软件都将成为您家谱管理的强有力工具。 该家谱软件的突出特点如下: ·面向大型家谱管理:成功的实现了家谱的分卷管理技术,卷与卷之间有机结合,上下卷之间跳转自如,随意漫游;续卷灵活,纵横方向均可自由续卷,同一部家谱内续卷数量不限,续卷的世代宽度自由安排,从而有效的实现了对大型家谱的管理。 ·多族谱管理:可以同时对多部(任意姓氏的)族谱管理。 ·强劲的族谱维护技术:族谱连接、族谱拆分、更改族谱起始世代数,还可在卷内对节点(子树)任意精确移动。 ·家族成员信息完备:家谱记录内容丰富,资料显示图文并茂,家族成员的数据参数定义完备。 ·检索结果形象丰富:资料检索结果直观形象,配以“寻根链”视图可以一览查询成员的传承脉系。 ·目录、文件管理隐含化:将家谱编写中可能遇到的目录、文件管理工作完全隐含到软件内部,即使电脑知识很少的网友也能轻松上手。 ·家谱打印:该功能是本软件的核心亮点之一,可以将您录入好的家谱资料打印成册,便于分发给家族的各个成员。目前提供四种打印家谱方案: ①方案一:打印家谱内容包括(家族梗概、目录树、父子图、个人资料)等几大部分。 ②方案二:打印家谱内容包括(家族梗概、目录树、阶梯图、个人资料)等几大部分。 ③方案三:打印家谱内容包括(家族梗概、目录树、宝塔图、个人资料)等几大部分。 ④方案四:打印家谱内容包括(家族梗概、目录树、传承图、个人资料)等几大部分。[分横排、竖排两种版式] ·真人肖像模式:使用该显示模式,在世系图上您可以为每个节点上的成员定义制作成员本人的真人肖像,从而使得世系图更加生动、形象。 ·多媒体资料信息管理:软件为每个成员定义了一个相册、影像集和录音集(不加入资料不占空间),您可以将成员精彩的照片、视频及音频资料加入到家谱中,制成一个图、文、像、声并茂的现代数字家谱,软件内置媒体播放器。

http://downloadenetcomcn/subcategoryphpscid=581&page=1

家谱树怎么画

家谱树一般以树状来呈现,那么具体画法如下:1、首先第一排是祖辈,写下祖辈的名字。2、然后写下每个祖辈的子孙三代,每个家族一支,往下按...
点击下载
热门文章
    确认删除?
    回到顶部