⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 home.h

📁 红楼梦贾氏家族人物谱  V1.0.rar
💻 H
📖 第 1 页 / 共 2 页
字号:
	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 + -