C语言 家谱问题
#include<stdioh>
#include<stringh>
char w[5][20]={{"child"},{"parent"},{"sibling"},{"descendant"},{"ancestor"}};
int kong(char a[]) {
int n=0,i;
for(i=0;a[i]!='\0';i++) {
if(a[i]==' ')
n++;
else
break;
}
return n;
}
char fam[200][20];
int num[200]={0};
int search(char a[],int n) {
int i=1;
while(1) {
if(!strcmp(a,fam[i]))
return i;
i++;
}
return 0;
}
int search1(int n,int x) {
int i=1;
while(i<x) {
if(num[i]==n)
return i;
i++;
}
return 0;
}
char name[1000],word[1000],n1[100],n2[100],d[100];
int main() {
int n,m,i,j,a,b,t,x,k,h;
while(scanf("%d%d",&n,&m)!=EOF) {
memset(fam,'\0',sizeof(fam));
memset(num,'\0',sizeof(num));
scanf("%s",fam[1]);
getchar();
a=b=2;
t=1;
num[1]=1;
for(i=2;i<=n;i++) {
memset(name,'\0',sizeof(name));
gets(name);
b=kong(name);
if(b>a) {
if(fam[search1(t2+1,i)][0]!='\0')
t=t2+1;
else
t=t2;
}
else { if(b<a) {
h=(a-b)/2;
while(h>=1) {
t=t/2;
h--;
}
}}
if(fam[search1(t2,i)][0]!='\0')
x=t2+1;
else x=t2;
num[i]=x;
for(j=b;name[j]!='\0';j++)
fam[i][j-b]=name[j];
a=b;
}
for(i=0;i<m;i++) {
gets(word);
k=0;h=0;
memset(n1,'\0',sizeof(n1));
memset(n2,'\0',sizeof(n2));
memset(d,'\0',sizeof(d));
for(j=0;word[j]!='\0';j++) {
if(word[j]==' ') {
k++;
h=0;
continue;
}
if(k==0)
n1[j]=word[j];
if(k==5) {
n2[h]=word[j];
h++;
}
if(k==3) {
d[h]=word[j];
h++;
}
}
if(!strcmp(d,w[0])) {
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if(a==b2||a==(b2+1))
printf("True\n");
else printf("False\n");
continue;
}
if(!strcmp(d,w[1])) {
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if(b==a2||b==(a2+1))
printf("True\n");
else printf("False\n");
continue;
}
if(!strcmp(d,w[2])) {
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
if((a==b+1&&a==b/22+1)||(a==b-1&&b==a/22+1))
printf("True\n");
else printf("False\n");
continue;
}
if(!strcmp(d,w[3])) {
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
while(a>0) {
a=a/2;
if(a==b) {
printf("True\n");
break;
}
if(a==0)
printf("False\n");
}
continue;
}
if(!strcmp(d,w[4])) {
a=search(n1,n);a=num[a];
b=search(n2,n);b=num[b];
while(b>0) {
b=b/2;
if(a==b) {
printf("True\n");
break;
}
if(b==0)
printf("False\n");
}
continue;
}
}
}
return 0;
}
听说回答的够长能够自动采纳
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;
}
画法如下:
操作设备:戴尔笔记本电脑
操作系统:win10
操作程序:Word文档20
1、首先打开word文档,点击工具栏中的“插入”选项并找到“smartart”图标。
2、然后在打开的“smartart”页面选择“组织结构图”,点击确定。
3、即可将标准的组织结构图插入页面中,点击文本处即可输入文字。
4、点击空白处或者原本的文本框,并选择添加项目的按钮,选择需要添加的项目的位置。
5、根据需要进行添加后即可生成一个家谱世系图的样式,在其中输入对应的姓名及内容即可。
编制家谱是中华民族一件大事,木有本,水有源,谱牒记录一个家族的源流始末,是人类历史的重要组成部分,于家称谱,于国称史,其史料价值同等重要。
家谱编写中,世系的排列,有瓜藤谱、表格、文字叙述等多种方式,不过各有优点和缺点,要根据自己家谱编排的实际情况选择最适合的一种或者几种使用。
比如,我在1996年参与重修族谱时,就是按线装古书的竖排方式,从始祖开始,由右往左排列。由于那时候我们县内还没有专业的打印装订行业,草稿出来后,要送到云南曲靖去打印装订。由于路途远,我自己又上班,不能到现场去认真校对,结果打印装订出来就出了问题,奇数页面的顺序是由右到左排列,翻篇到偶数页面,变成了由左到右排列,造成了很大的阅读困扰。
2013年,再次重修族谱,我任主编,整个族谱的编排由我亲自设计。这个时候,电脑使用已经普遍,自己也能够基本的电脑操作。在新的族谱中,我综合使用了文字叙述、瓜藤谱(组织结构图)、表格三种世系排列方式。
文字叙述主要记录本族的来源,重大变故和经历;瓜藤谱,在电脑中可直接使用“组织结构图”,从上到下理清楚各个支系的繁衍发展脉络;表格主要展现每一个族人的出生时间、主要经历、上承下连、配偶子女、亡故时间及葬地山向等等基本情况。
这次修谱基本达到了自己的想象,效果不错。
传承家谱程序是专门做树形家谱的程序,而且输出为WORD文档,也可以图形输出。 输出树形谱系为TXT文件,可以输出任意大小的树形谱系,避免了版面上的限制。 可以在百度搜一下。需要注册方可使用。还有电脑excel也可以做,具体教程如下:http://jingyanbaiducom/article/414eccf6197fc86b431f0a0chtml
中国家谱保存至今的,以清代和民国的为主,约占全部数量的将近90%。就这部分现存家谱来看,尽管其编纂形式有所不同,编纂体例有详有略,记载范围有大有小,记载内容有多有少,编修重点各有侧重,但其格式基本上是相同的,是统一的,是有章可循的。一部体例完整的家谱,大致应有以下各项: 1谱名 一般均称为家谱、宗谱、族谱、家乘、世谱、统谱、支谱、祖谱、合谱、联宗谱、大成谱、房谱等,也有的称为谱传、真谱、渊源录、源流考、清芬录、世典、世牒、世恩录、故谱、族谱图、族系、族讲、石谱、世家、私谱、本书、大同谱、乡贤录、传芳集、家传簿、先德传、系谱、谱志略、家谱汇编、家模汇编等,可谓名目繁多。 2谱序 稍具规模的家谱,卷首一定会有一篇至几十篇不等的序文,它是每部家谱不可缺少的内容之一。谱序包括新序、旧序、族外人的客序、跋语、目录和刻印人名以及其它关于本族的记述。 3谱例 又称凡例,主要是阐述家谱的纂修原则和体例。一般而言,一些家谱在每一次续修时都会订出若干条适合社会潮流与需要的规则,以作为修谱时所要遵循的原则。 4谱论 许多家谱都专门辟有谱论一章,专收先贤的谱说、谱论、谱议的篇章和古代经典中的有关论述,对修谱的作用、功能、意义、历史、原理、方法等加以发明和阐述,是研究谱学的宝贵资料。 5恩荣录 主要内容为历代皇帝对家族中的官员及其家谱的敕书、诏命、赐字、赐匾、赐诗、赐联、御谥文、御制碑文以及地方官府的赠谕文字等,以显示和炫耀朝廷对该家庭及其成员的奖励和表彰,同时反映高家族的地位和身份。 6像赞、遗像 祖先及家族中历代英贤、重要人物的图像资料,一般为正面是遗像,背面是像赞。 7姓氏源流 中国家谱素来有“叙本系,述始封”的传统,明清以来各家谱也大多有记姓氏源流的一章,或称姓氏源流,或称宗族源流。它主要是用来记述本姓来源、本族的历史渊源、始祖、世派、迁徙、各支派间关系甚至改姓的原委等。 8族规家法 是宗族家族成员共同制定的、用以约束和教化族人的宗族法规,是家谱中的重要组成部分。其名称各异,种类很多,诸如家规、家约、家戒、家法、家礼 、家典、家仪、家条、族规、族约、祠规、祠约、规范、规条、规矩、条规、戒谕等。 9祠堂 记载宗族、家族祠堂修建的历史,介绍祠堂的建筑规模、地理位置,收录有关祠堂的碑文、诗文、祠联、祠匾、祠堂图,建祠捐资人名,记录祠堂内神位世次、配享、附享、祭祀情况等。 10五服图 又称服制图。所谓五服,就是指古代丧服制度中的五种服色,即斩衰、齐衰、大功、小功、缌麻。丧服是根据生者与死者的远近亲疏关系而穿着的一种服饰。因五服本身就表明生者与死者的亲疏远近关系,同时又表明与死者同有关系的生者与生者之间的远近亲疏关系,所以不仅在执行丧礼时要涉及到,而且在执行宗族、家族事务及执行法律时也必须涉及,所以家谱中一般都载有五服图。 11世系 这是家谱中的主体部分,又称为世系图、世系考、世系记等。这部分内容为所有中国家所共有,因而成为家谱区别于正史、地方志的最明显的标志。世系表除欧阳修、苏洵所发明的欧式图谱和苏式图谱外,还有两种比较常见:(1)宝塔式图谱:这一图谱形式何人所创、创于何时目前尚元定论,不过至迟已在南宋时出现,因此很可能也是北宋人的产品。(2)牒记式图谱:这一图谱的特点是分别按世代以文字叙述先人的事迹,既不用线条,也不用图表。 12传记 家谱中的传记又称行状、行述、行实、事状、志略等,其体裁有传记、行状、寿文、贺序、墓志、祭文以及抄自史传中的资料,主要载录家族成员中“方行可书”的“忠臣孝子”、“节妇义夫”的事迹和传记资料。 13谱系本记 也称作世序、世系录、先世考等,主要内容与世系部分大致相同,记载本族成员的简况即本人名讳、父名讳、排行、字号、生卒年月、寿数等。 14族产 记录家族、宗族的集体财产如祀田、坟地、义庄、学田、义墅、山林、房屋等。 15契据文约 专门登载与记录和族产有关的契据文约、管理制度以及宗族、家族内部关于承嗣、婚姻、分家等的文书及契约。 16坟茔 记载族中公共坟地的情况,包括墓地图、坟向、祖坟及各支派墓地分布等。 17名迹录 记载与本族或族中成员有关的山水桥梁、亭台堂舍、庵寺书院等。 18任宦记 记载族中成员历代官宦名人事迹,其内容与传记部分大致相同,包括履历、科第、政绩、功勋、著作、学说等。 19年谱 是按照年、月、日专门记载一个人生平事迹的一种体裁。 20艺文 收录家族、宗族成员的著述,包括奏疏、殿试文、万言策、诗词和各式文章等。 21字辈谱 又称派语、派行诗、行第、派引、排行等,专门登载族内成员姓名排行的字语。 22领谱字号 中国古代家谱修好后,在派发给族中成员前,对每部谱都编以号码。 23续后篇 或称余庆录。指家谱修完后,专门留空白纸数页,留待后世子孙续,以示绵延不绝。 24纂修、捐资人名 家谱的纂修或续修,是家族、宗族中的一件大事,涉及族中许多人员,且须动员全族成员捐款助修。 以上是家谱的基本格式。一部家谱也许不可能将上述基本格式全部用到,但格式中的主要部分如谱序、凡例、世系图、传记、家规、艺文、字辈谱等肯定会有,家谱也正是任借上述内容将家族的历史渊源、迁徙情况、历代英贤等保存下来,并流传后世。 其实一部完整的家谱就是一部宗族、家族史或宗族、家族百科全书。通过这部家谱,我们可以了解到该家族的历史沿革,世系繁衍,人口变迁,居地变迁,婚姻状况,该家放成员在科第、官职等政治生活中的地位、作用和事迹,该有族的经济情况和丧葬、礼典、家规、家法等典章制度等。而家谱也正是将这些内容以书、图、志、表、史的形式记录下来,从为可与正史与方志并列的又一文史宝库。
C语言 家谱问题
本文2023-11-18 10:26:30发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/501912.html