📄 home.h
字号:
if(p){
/* cout<<" "<<e<<" 1 修改姓名; "<<" "<<e<<endl;
cout<<" "<<e<<" 2 修改性别; "<<" "<<e<<endl;
cout<<" "<<e<<" 3 代数; "<<" "<<e<<endl;
cout<<" "<<e<<" 4 bymd; "<<" "<<e<<endl;
cout<<" "<<e<<" 5 此人死亡;"<<" "<<e<<endl;
*/
switch(j){
case 1:{
if(!seek(r,info))//判断是否重名
{
p->name=info;
}
else
{
if(r==p)
{
}
else
return false;
}
break;
}
case 2://性别自动修改
{
if(p->distinction=='m')
p->distinction='f';
else
p->distinction='m';
break;
}
case 4:
{
p->bymd=info;
break;
}
case 5:
{
if(p->living=='y')
{
p->living='n';
p->dymd=info;
}
else
{
p->living='y';
p->dymd=NULL;
}
break;
}
case 3:
{
c=info[0];
p->generation=c;
break;
}
default: break;
}//switch
}//if
else
{
return false;
}
return true;
}
bool home::out(int &generation){//为输入出总代数提供一个接口
if(home::ancestors){
generation=home::generations;
return true;
}
else
return false;
}
bool home::printhome(){//在屏幕上打印整个家族,列表形式打印
return true;
}
bool home::writeperson(homeperson *p,FILE *fp){//将一个人在内存中的信息输出到一个文件
if(!p)
return false;
int i;
fputc('!',fp);//与读入相匹配
fwrite(p->name,6,1,fp);
fputc(p->generation,fp);
if(p->father)
fwrite(p->father->name,6,1,fp);
else{
fputc('0',fp);
for(i=0;i<5;i++)
fputc(32,fp);
}
fwrite(p->bymd,8,1,fp);
fputc(p->distinction,fp);
if(p->lmates)
fwrite(p->lmates->name,6,1,fp);
else{
fputc('0',fp);
for(i=0;i<5;i++)
fputc(32,fp);
}
fputc(p->mother,fp);
fputc(p->marry,fp);
if(p->distinction=='f'&&p->lover1){
fwrite(p->lover1->name,6,1,fp);
}
else{
fputc('0',fp);
for(i=0;i<5;i++)
fputc(32,fp);
}
fputc(p->living,fp);
if(p->living=='n')
fwrite(p->dymd,8,1,fp);
else{
fputc('0',fp);
for(i=0;i<8;i++)
fputc(32,fp);
}
fputc(10,fp);
return true;
}
bool home::makefile(){//将内存中的信息进行存盘
FILE *fp;
char flag='y';
if((fp=fopen("home.txt","w+"))==NULL)
{
return true;
}
homeperson *r;
clear();
if(!ancestors)
return false;
inqueue(ancestors);
while(!qempty()){//用队列操作
dequeue(r);
writeperson(r,fp);
if(r->lover1)
writeperson(r->lover1,fp);
if(r->lover2)
writeperson(r->lover2,fp);
if(r->child){
inqueue(r->child);
r=r->child;
while(r->nmates){
inqueue(r->nmates);
r=r->nmates;
}
}
}
clear( );//清空队列,其实不清也行
fclose(fp);
return true;
}
bool home::relation(people q,people p,CString &rela){//找出两个人之间的关系
CString str;
homeperson *r,*s;
int i,j;//记录代数差
if(p==q){
rela+="这是同一个人";
return true;
}
if(q->generation<p->generation){//let r>=s;
r=q; s=p;
}
else{
r=p; s=q;
}
i=s->generation-r->generation;
if(i>=1){//判断差大于1的,所有妻妾转置其丈夫进行计算
if(r->distinction=='f'&&r->lover1) q=r->lover1;
else q=r;
if(s->distinction=='f'&&s->lover1) p=s->lover1;
else p=s;
for(j=0;j<i;j++){
p=p->father;
}
if(p!=q){//为堂关系
if(i>3){
str.Format(" %s是%s的第 %d 代堂", s->name,r->name,i);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
if(i==3)
{
str.Format(" %s是%s的第%d代曾堂", s->name,r->name,i);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
if(i==2){
str.Format(" %s是%s的堂", s->name,r->name);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
str.Format(" %s是%s的",s->name,r->name);
if(s->distinction=='f')
if(s->father)
str+="侄女";
else
str+="侄媳";
else
str+="侄子";
rela+=str;
str.Format(" %s是%s的",r->name,s->name);
if(r->distinction=='f')
if(r->father)
{
if(s->father)
if(compare(s->father,r)==1)
str+="姑姑";
else
str+="姑妈";
else
if(compare(s->lover1->father,r)==1)
str+="姑姑";
else
str+="姑妈";
}
else
{
if(s->father)
if(compare(s->father,r->lover1)==1)
str+="婶婶";
else
str+="伯母";
else
if(compare(s->lover1->father,r->lover1)==1)
str+="婶婶";
else
str+="伯母";
}
else
{
if(s->father)
if(compare(s->father,r)==1)
str+="叔叔";
else
str+="伯父";
else
if(compare(s->lover1->father,r)==1)
str+="叔叔";
else
str+="伯父";
}
}//else
}//else
}//else
rela+="\r\n";
rela+=str;
}
else{//为嫡关系
if(i>3)
{
str.Format(" %s是%s的第%d 代", s->name,r->name,i);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
if(i==3){
str.Format(" %s是%s的第%d代曾", s->name,r->name,i);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
if(i==2){
str.Format(" %s是%s的", s->name,r->name);
if(s->distinction=='f')
if(s->father)
str+="孙女";
else
str+="孙媳";
else
str+="孙";
}
else{
str.Format(" %s是%s的", s->name,r->name);
if(s->distinction=='f')
if(s->father)
str+="女儿";
else
str+="儿媳归";
else
str+="儿子";
rela+="\r\n";
rela+=str;
str.Format(" %s是%s的", r->name,s->name);
if(r->distinction=='f'){
if(s->father){
if((r->lover1->lover1==r&&s->mother=='1')||(r->lover1->lover2==r&&s->mother=='2'))
str+="妈妈";
else
str+="姨娘";
}
else{
if((r->lover1->lover1==r&&s->lover1->mother=='1')||(r->lover1->lover2==r&&s->lover1->mother=='2'))
str+="婆婆";
else
str+="姨娘";
}
}
else
if(s->father)
str+="爸爸";
else
str+="公公";
}//else
}//else
}//else
rela+="\r\n";
rela+=str;
}//else
}
else{//代数差小于2
if(r->lover1||s->lover1){//有一人或两人已婚
if(r->lover1 ==s||s->lover1==r){
str.Format(" %s与%s 是夫妻.", s->name,r->name);
rela+="\r\n";
rela+=str;
return true;
}
if(r->father==NULL||s->father==NULL){
if(r->father==s->father){//父亲同为空
if(r->lover1==s->lover1){//爱人相同
str.Format(" %s与%s同嫁一夫", s->name,r->name);
rela+="\r\n";
rela+=str;
return true;
}
else{
str.Format(" %s与%s是妯娌", s->name,r->name);
rela+="\r\n";
rela+=str;
return true;
}
}
else{
if(r->father){//只有一人是家中儿女
if(compare(s->lover1,r)==1)
str.Format(" %s是%s的嫂子", s->name,r->name);
else
str.Format(" %s是%s的弟媳", s->name,r->name);
rela+="\r\n";
rela+=str;
if(r->distinction=='m'){
if(compare(s->lover1,r)==1)
str.Format(" %s是%s的小叔", r->name,s->name);
else
str.Format(" %s是%s的大伯", r->name,s->name);
}
else
if(compare(s->lover1,r)==1)
str.Format(" %s是%s的小姑", r->name,s->name);
else
str.Format(" %s是%s的大姑", r->name,s->name);
rela+="\r\n";
rela+=str;
return true;
}
else{
if(compare(r->lover1,s)==1)
str.Format(" %s是%s的嫂子", r->name,s->name);
else
str.Format(" %s是%s的弟媳", r->name,s->name);
rela+="\r\n";
rela+=str;
if(s->distinction=='m')
if(compare(r->lover1,s)==1)
str.Format(" %s是%s的小叔", s->name,r->name);
else
str.Format(" %s是%s的大伯", s->name,r->name);
else
if(compare(r->lover1,s)==1)
str.Format(" %s是%s的小姑", s->name,r->name);
else
str.Format(" %s是%s的大姑", s->name,r->name);
rela+="\r\n";
rela+=str;
return true;
}//else
}//else
}//if
rela+="\r\n";
rela+=str;
}//单代关系
q=r->father;
q=q->child;
while(q){
if(q==s)
break;
else
q=q->nmates;
}//while
if(q==NULL){//是堂关系
str.Format(" %s是%s的堂",r->name,s->name);
if(compare(r,s)==1||compare(r,s)==0){
if(r->distinction=='m')
str+="兄";
else
str+="姐";
}
else{
if(r->distinction=='m')
str+="弟";
else
str+="妹";
}
rela+="\r\n";
rela+=str;
str.Format(" %s是%s的堂",s->name,r->name);
if(compare(s,r)==1||compare(s,r)==0){
if(s->distinction=='m')
str+="兄";
else
str+="姐";
}
else{
if(s->distinction=='m')
str+="弟";
else
str+="妹";
}
rela+="\r\n";
rela+=str;
}
else{//为嫡关系
if(r->mother==s->mother){//同一母亲所生
str.Format(" %s是%s的",r->name,s->name);
if(r->distinction=='m')
if(compare(r,s)==1)
str+="哥哥";
else
if(compare(r,s)==0)
str+="胞兄";
else
str+="弟弟";
else
if(compare(r,s)==1)
str+="姐姐";
else
if(compare(r,s)==0)
str+="胞姐";
else
str+="妹妹";
rela+="\r\n";
rela+=str;
str.Format(" %s是%s的",s->name,r->name);
if(s->distinction=='m')
if(compare(s,r)==1)
str+="哥哥";
else
if(compare(s,r)==0)
str+="胞兄";
else
str+="弟弟";
else
if(compare(s,r)==1)
str+="姐姐";
else
if(compare(s,r)==0)
str+="胞姐";
else
str+="妹妹";
rela+="\r\n";
rela+=str;
}//if
else{//同父异母
str.Format(" %s是%s的同父异母的",r->name,s->name);
if(r->distinction=='m')
if(compare(r,s)==1)
str+="哥哥";
else
if(compare(r,s)==0)
str+="胞兄";
else
str+="弟弟";
else
if(compare(r,s)==1)
str+="姐姐";
else
str+="妹妹";
rela+="\r\n";
rela+=str;
str.Format(" %s是%s的同父异母的",s->name,r->name);
if(s->distinction=='m')
if(compare(s,r)==1)
str+="哥哥";
else
str+="弟弟";
else
if(compare(s,r)==1)
str+="姐姐";
else
str+="妹妹";
rela+="\r\n";
rela+=str;
}//else
}//else
}//else
return true;
}
int home::rank(homeperson *q){//计算出此人的排行
int i=0;
homeperson *p;
if(q->father){
p=q->father;
p=p->child;
while(p){
i++;
if(p!=q){
p=p->nmates;
}
else
break;
}
return i;
}
else{
if(q->generation=='1'){//第一代在本程序中认为无兄弟或姐妹
if(q->distinction=='m')
return 1;
else{
return 0;
}
}
else{//妻妾不计排行,如果要计请查询其丈夫
return 0;
}
}
}
int home::compare(homeperson *p,homeperson *q){//比较两个人的大小
return strcmp(q->bymd,p->bymd);//出生年月,字符值越大,则本人越小
}
int home::treehigh(homeperson *q){//将本家族树想像成一个二叉树,child 为左子树,nmates为右子树;
int i,j,k;
if(!q)
return 0;
else{
if(q->child)
i=treehigh(q->child);
else
i=0;
if(q->nmates)
j=treehigh(q->nmates);
else
j=0;
k=i>j?i:j;
k=k+1;
return k;
}
}//此函数为归递算法
void readfile(FILE *fp,CString &edit,int &k)
{
//fp为家谱文件,fp1为记录文件名的文件
CString str;
char *name;
int i=0,j=1;
k=0;
while(j!=0)
{
name=new char[7];
j=fread(name,6,1,fp);
name[6]='\0';
str.Empty();
str.Format("%s",name);
if(j!=0)
{
k++;
if(i==0)
edit+=" ";
edit+=str;
i++;
if(i==9)
{
edit+="\r\n";
i=0;
}
else
edit+=" ";
}
delete []name;
}
fclose(fp);
}
void info(FILE *fp,CString &edit)
{
//fp为家谱文件,fp1为记录文件名的文件
CString str;
char c;
int i=0,j=1;
while(c!=EOF)
{
c=fgetc(fp);
str.Empty();
str.Format("%c",c);
edit+=str;
}
fclose(fp);
}
void infor(FILE *fp,CString &edit)
{
//fp为家谱文件,fp1为记录文件名的文件
CString str;
char c;
int i=0,j=1;
while(c!=EOF)
{
c=fgetc(fp);
str.Empty();
if(c=='#')
str+="\r\n";
else
str.Format("%c",c);
edit+=str;
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -