📄 family.h
字号:
{
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 + -