中国家谱族谱数据库为什么看不了

栏目:资讯发布:2023-10-23浏览:3收藏

中国家谱族谱数据库为什么看不了,第1张

保护隐私。中国家谱族谱数据库是中国农村研究院/政治科学高等研究院历时3年建设的数据库,已收录的电子化家谱族谱资料共17723册,120893卷,居全球第一,网站里设计到个人名字,地址等隐私。不能查阅。

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;

}

一个表就够了

id——每个人的id

fid——如果有值 就是父亲的id

hid——如果有值 就是丈夫的id

wid——如果有值 就是妻子的id

其他字段:姓名 性别 出生日期 等等

怎样用EXCEL做树状图?

1、在电脑上新建一个EXCEL文档,打开。

2、在界面上方的菜单栏点击“插入”选项,选择“SmartArt”工具。

3、在弹出的对话框中选择“层次结构。

4、随意选择了一种树状图,弹出的树状图如下,图中的文字部分可以更改成需要的内容。

5、更改树状图形状:选择任意需要更改的树状图单元,鼠标右键单击,在弹出的菜单中选择“更改形状”,可将树状图单元改成需要的形状。

6、添加树状图的单元:选择任意需要更改的树状图单元,鼠标右键单击,在弹出的菜单中选择“添加形状”,在树状单元的前、后、上、下方添加单元。

7、其中选择了“在后方添加形状”、“在下方添加形状”选项后,效果如下图所示:

扩展资料:

为了用图表示亲缘关系,把分类单位摆在图上树枝顶部,根据分枝可以表示其相互关系,具有二次元和三次元。在数量分类学上用于表型分类的树状图,称为表型树状图(phenogram),掺入系统的推论的称为系统树状图(cladogram)以资区别。

表型树状图是根据群析描绘的,系统树状图是根据一种模拟的假定的性状进化方向即用电子计算机描绘的。树状图也是初中学生学习概率问题所需要画的一种图形。

参考资料:

——树状图

Excel树状图制作教程

Excel

树状图

制作教程,excel表格制作树状图可以更加的清晰明了的知道数据,那么excel制作树状图应该怎么样做请看下面的excel表格制作教程

图吧

!

第一步,调出窗体控件。

从“开发工具”中调出窗体控件“选项按钮”2个和“组合框”1个,并对两个选项按钮根据要对比的数据内容进行重命名,选中选项按钮,点击右键,再点击“编辑文字”即可。

第二步,设置控件格式。

首先,设置按钮控件格式:选中“选项按钮”—>点击右键,再点击“设置控件格式”—>在“单元格链接”中选中“$L$2”,点击“确定”,这时会发现选中“部门”按钮,L2单元格的值为1,选中“月份”按钮,L2单元格的值为2。

其次,设置组合框控件格式:

1、A9-A13的单元格分别输入各部门名称,B9-B14分别输入月份;

2、点击菜单栏“公式”—>点击“名称管理器”—>点击“新建”,在“名称”输入“下拉列表”,“引用位置”输入“=CHOOSE(sheet1!$L$2,sheet1!$A$9:$A$13,sheet1!$B$9:$B$14)”—>点击“确定”“关闭”;

3、选择“组合框”—>点击“右键”,“设置控件格式”—>在“数据源区域”输入“下拉列表”,“单元格连接”输入“$M$2”,点击“确定”。

此时会发现“组合框”中会出现相应的部门名称列表和月份列表,当选中某个项目时,M2的'值也会发生相应变化。

第三步,设置显示数据。

在对数据进行处理时,应注意对原始数据的保护,故可把原始数据复制到另外一个工作表进行处理。

首先是单个部门每月销售数据:在A16输入“=OFFSET(A1,$M$2,)”,并选中该单元格,当指针变成黑色十字时,往右拖至G16。

接着是各个部门某月份的销售数据:在A18—A22的区域内输入各个部门名称,在B18输入“=OFFSET(A2,,$M$2)”,并选中该单元格,当指针变成黑色十字时,往下拖至B22(在这里也可以尝试用Vlookup函数实现)。

然后定义数据名称:启用“名称管理器”,点击“新建”,“名称”输入“X轴标志”,“引用位置”输入“=CHOOSE(sheet1!$L$2,sheet1!$B$9:$B$14,sheet1!$A$9:$A$13)”;再点击“新建”,“名称”输入“Y轴数据”,“引用位置”输入“=CHOOSE(sheet1!$L$2,sheet1!$B$16:$G$16,sheet1!$B$18:$B$22)”。

至此数据的准备工作完成。

第四步,制作数据图。

点击可放大显示

把指针移到空白位置,在菜单栏点击“插入”,选择“簇状柱形图”得到空白的数据图—>选中该图,菜单栏出现“图表工具”,点击“设计”,点击“选择数据”,出现“选择数据源”界面—>在“图例项(系列)”中点击“添加”,在“系列值”输入“=销售数据对比动态图1xls!Y轴数据”点击“确定”—>“在水平(分类)轴标签”中点击“编辑”,在“轴标签区域”中输入“=销售数据对比动态图1xls!X轴标志”,连续两次点击“确定”,便得到数据图草图。

此时,我们再选择选项按钮和下拉列表中的项目,便会发现图表也跟着相应变化。

第五步,美化图表。

点击可放大

首先是图表标题:在D9单元格输入“图表标题1”,E9输入“=A16&”每月销售数据对比””;在D10输入“图表标题2”,E10输入“=M2&”月份各部门销售数据对比””;在E11输入“=CHOOSE($L$2,$E$9,$E$10)”;插入窗体控件“按钮”,选中该控件,在编辑栏输入“=$E$11”,按

Enter键

,可以发现按钮的文字内容和E11的文字一致。

其余可根据个人喜好对数据系列格式、

坐标轴

和网格线等进行优化。

利用excel表格,如何制作家谱树状图

EXCEL有SmartArt图形,如下截图:插入--SmartArt---层次结构

中国家谱族谱数据库为什么看不了

保护隐私。中国家谱族谱数据库是中国农村研究院/政治科学高等研究院历时3年建设的数据库,已收录的电子化家谱族谱资料共17723册,120893卷...
点击下载
热门文章
    确认删除?
    回到顶部