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

📄 family.h

📁 是家谱管理系统
💻 H
📖 第 1 页 / 共 2 页
字号:
	{
		case '1': 
			{
				cout<<"请输入年份:";
				bool flag=true;
				while(flag)
				{
					cin>>s;
					target=isInt(s);
					if(target!=-1)
						flag=false;
					else
						cout<<"输入错误!!!\n请重新输入:";
				}	
			}break;
		case '2': 
				{
				cout<<"请输入月份:";
				bool flag=true;
				while(flag)
				{
					cin>>s;
					target=isInt(s);
					if(target!=-1)
						flag=false;
					else
						cout<<"输入错误!!!\n请重新输入:";
				}	
			}break;
	}
	while (first < last)		// test for nonempty sublist
	{
		mid = (first+last)/2;
		switch(choice)
		{
		case '1': midvalue=v[mid].year;break;
		case '2': midvalue=v[mid].month;break;
		}
		if (target==midvalue)
			return mid;			// have a match
      // determine which sublist to search
		else if (target>midvalue)
			last = mid;			// search lower sublist. reset last
		else
			first = mid+1;		// search upper sublist. reset first
	}
	return origLast;			// target not found
}
int Family::searchbyBirth(vector<Person>&v)
{	
	myBirthheapSort (v);
	int n=v.size();
	int i=binSearchBirth(v,0,n);
	return i;
}

int Family::searchbyName(vector<Person>&v)
{
	cout<<"操作对象姓名:";
	char name[20];
	cin>>name;
	//然后用二分查找,效率为ln N;
	//cout<<"把堆按姓名大小排序"<<endl;ttt(v);
	int n=v.size();
	int i=binSearchName(v,0,n,name);
	return i;
}
void Family::addchild(vector<Person>&v)
{
	int n=v.size();
	int i=searchbyName(v);
//	cout<<"fuqing"<<endl;
//	v[i].outputPerson();
	//cout<<"查找后"<<i<<endl;ttt(v);
	if(i!=n)
	{
		cout<<"父亲已找到,输入孩子信息"<<endl;
		char choice='y';
		while(choice=='y')
		{
			Person p;
			char c;
			bool flag=false;
			cout<<"姓名:";
			cin>>p.name;
			//cout<<v[i].generation;
			p.generation=v[i].generation+1;//为其父亲的下一代		
			cout<<"地址:";
			cin>>p.addr;
			cout<<"性别(M/F):";
			do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='M'&&c!='F')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.sex=c;
			cout<<"婚否(Y/N):";
			flag=false;
				do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='Y'&&c!='N')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.marriage=c;
			cout<<"健在否(Y/N):";
			flag=false;
				do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='Y'&&c!='N')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.alive=c;
			p.setbirthdate();
			p.setdeathdate();
			p.parentID=i;//设置他父亲的ID号
			v.push_back(p);
			memberNum++;
			cout<<"是否继续为该父亲添加孩子(y/n):";
			flag=false;
			do{
				c=getch();
				cout<<c<<endl;
				if(c!='y'&&c!='n')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			choice=c;
		}	
		myNamemakeHeap(v);
	}
	else
		cout<<"家谱中无此人"<<endl;
}


void Family::buildFamily(vector<Person>&v)
{
	char c;
	bool flag=false;
	cout<<"输入祖宗信息"<<endl;
	Person p;
	cout<<"姓名:";
	cin>>p.name;
	p.generation=1;//祖宗当然为第一代
	p.parentID=-1;//祖宗的父亲编号为-1
	cout<<"地址:";
	cin>>p.addr;

		cout<<"性别(M/F):";
			do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='M'&&c!='F')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.sex=c;
			cout<<"婚否(Y/N):";
			flag=false;
			do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='Y'&&c!='N')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.marriage=c;
			cout<<"健在否(Y/N):";
			flag=false;
			do{
				c=getch();
				c=toupper(c);
				cout<<c<<endl;
				if(c!='Y'&&c!='N')
					cout<<"输入错误!!!\n请重新输入:";
				else flag=true;
			}while(!flag);
			p.alive=c;

	p.setbirthdate();
	p.setdeathdate();
	v.push_back(p);
	memberNum++;
}
void Family::outputbyName(vector<Person>&v)
{
	int n=v.size();
	int i=searchbyName(v);
	if(i!=n)
	{
		cout<<"本人信息:"<<endl;
		Persontitle();
		v[i].outputPerson();

		cout<<"父亲信息:"<<endl;
		int pID=v[i].parentID;
		if(pID==-1)
			cout<<"此人为祖宗,其父亲信息不详"<<endl;
		else
		{
			Persontitle();
			v[pID].outputPerson();
		}

		cout<<"孩子信息:"<<endl;
		vector<Person>vchild;
		for(int j=0;j<v.size();j++)
			if(v[j].parentID==i)
				vchild.push_back(v[j]);
		if(vchild.size()!=0)
		{
			Persontitle();
			for(int j=0;j<vchild.size();j++)
				vchild[j].outputPerson();
		}
		else
			cout<<"此人无孩子"<<endl;
	}
	else
		cout<<"无此人信息"<<endl;
}
//重写了二分查找,使其按按姓名大小查找,
//前提:堆已排序,是最小堆
int Family::binSearchName( vector<Person>&v,int first, int last,  char target[])
{
	myNameheapSort(v);//把堆按姓名大小排序
	int mid;						// index of the midpoint
	char midvalue[20];					// object that is assigned v[mid]
	int origLast = last;		// save original value of last
	
	while (first < last)		// test for nonempty sublist
	{
		mid = (first+last)/2;
		strcpy(midvalue,v[mid].name);
		if (strcmp(target, midvalue)==0)
			return mid;			// have a match
      // determine which sublist to search
		else if (strcmp(target, midvalue)>0)
			last = mid;			// search lower sublist. reset last
		else
			first = mid+1;		// search upper sublist. reset first
	}

	return origLast;			// target not found
}	
void Family::outputgeneration(vector<Person>&v)
{
	int gn,n=v.size(),i,t=0;
	cout<<"您想查询第几代:";
	char s[50];
	bool flag=true;
	while(flag)
	{
		cin>>s;
		gn=isInt(s);
		if(gn!=-1)
			flag=false;
		else
			cout<<"输入错误!!!\n请请重新输入:";
	}
	Persontitle();
	for(i=0;i<n;i++)
		if(v[i].generation==gn)
		{
			t=1;
			v[i].outputPerson();
		}
	if(!t) cout<<"无此代信息"<<endl;
}
void Family::birthsort(vector<Person>&v)
{
	myBirthheapSort (v);
	Persontitle();
	int n=v.size(),i;
	for(i=n-1;i>=0;i--)
		v[i].outputPerson();

}
bool Family::readFamily(vector<Person>&v)
{
	char FileName[30];
	cout<<"请输入您要载入此家谱的文件名称:"<<endl;
	cin>>FileName;

	fp=fopen(FileName,"rb");
	if(fp==NULL)
	{
		cerr<<"无法找到该文件!!!"<<endl;
		return false;
	}
	Person exp,* p;
	p=&exp;
	while(true)
	{
		fread(p,sizeof(Person),1,fp);
		if(feof(fp))//读到文件末尾
			break;
		v.push_back(*p);
		memberNum++;
		//for(int i=0;i<v.size();i++)
			//v[i].outputPerson;
	}
	fclose(fp);
	return true;
}
bool Family::writeFamily(vector<Person>&v)
{
	char FileName[30];
	if(memberNum==0)
	{
		cerr<<"家谱为空,写入无意义"<<endl;
		return false;
	}
	title();
	cout<<"请输入您要保存此家谱的文件名称:"<<endl;
	cin>>FileName;

	fp=fopen(FileName,"wb");
	int n=v.size(),i;
	for(i=0;i<n;i++)
		fwrite(&v[i],sizeof(Person),1,fp);
	fclose(fp);
	return true;
}
/*void Family::ttt(vector<Person>&v)
{
	for(int i=0;i<v.size();i++)
		v[i].outputPerson();
}*/
void Family::Persontitle()
{
	cout<<setiosflags(ios::left)<<setw(15)<<"出生日期"<<setw(10)<<"姓名"<<setw(10)<<"第几代"
		<<setw(10)<<"性别"<<setw(10)<<"健在否"<<setw(7)<<"婚否"<<setw(10)<<"死亡日期"<<"地址"<<endl;
}

void Family::title()
{
	system("cls");
	cout<<"*****************************************************************"<<endl;
	cout<<"                    家谱管理系统             当前有"<<memberNum<<"个成员"<<endl;
	cout<<"*****************************************************************"<<endl;
}
void Family::menu1()
{
	title();
	cout<<"1:自己创建一个家谱"<<endl;
	cout<<"2:文件导入一个家谱"<<endl;
	cout<<"3:一个家谱写入文件"<<endl;
	cout<<"0:退出不保存"<<endl;
	cout<<"请选择:";
}
void Family::menu2()
{
	title();
	cout<<"1:显示第n 代所有人的信息"<<endl;
	cout<<"2:按照姓名查询,输出成员信息"<<endl;
	cout<<"3:按照出生日期查询成员名单"<<endl;
	cout<<"4:输入两人姓名,确定其关系"<<endl;
	cout<<"5:某成员添加孩子"<<endl;
	cout<<"6:删除某成员(若其还有后代,则一并删除)"<<endl;
	cout<<"7:修改某成员信息"<<endl;
	cout<<"8:按出生日期对家谱中所有人排序"<<endl;
	cout<<"9:返回上层"<<endl;
	cout<<"0:退出并保存"<<endl;
	cout<<"请选择:";
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -