1、#include#include#include#includestruct perint data; char name20;char brith20;char marry;char address20;char live;char dietime20;char parent20;int generation;int child10;int numberchild;per()for(int i=0;i20;i+)namei=0;for(i=0;i20;i+)brithi=0;for(i=0;i20;i+)addressi=0;for(i=0;i20;i+)dietimei=0;for(i=0
2、;i10;i+)childi=0;for(i=0;i20;i+)parenti=0;live=0;marry=0;data=-10;generation=0;numberchild=0;void setupinfo(per person);void display(per person,int&);void displayhome(per person,int&);void displayinfo(per person,int&);void namesearch(per person,int&);void birtfdaysearch(per person,int&);void addchil
3、d(per person,int&); void editmember(per person,int&);void sortbirthday(per person,int&);void main()per person36;int count=0;fstream inputFile(person.txt,ios:in|ios:out|ios:binary);if(!inputFile) cout文献不存在!endl; exit(0);inputFile.read(char*)&personcount,sizeof(personcount);/从文献中读取指定大小字节函数read(),读取字节函
4、数while(!inputFile.eof() /当文献没有读取完毕,进行循环if(personcount.name0!=0)/当名字不为空时count+; /记录人数inputFile.read(char*)(person+count),sizeof(*person);inputFile.close();/关闭文献if(count1) /如果家谱图里面没人cout 家谱不存在,请你建立一种家谱!endl;setupinfo(person);display(person,count);void setupinfo(per person36) /创立信息int i,j,k;fstream out
5、putfile(person.txt,ios:in|ios:out|ios:binary|ios:app); /打开文献for(i=0;i5;i+)cout 姓名 :;cin.getline(personi.name,20);cout 生日(日期样式为xxxx/xx/xx) :;cin.getline(personi.brith,20);coutpersoni.marry;while(toupper(personi.marry)!=Y&toupper(personi.marry)!=N)cout 你输入错误,请你重新输入!endl;coutpersoni.marry;cin.ignore();
6、cout 地址 :;cin.getline(personi.address,20);coutpersoni.live; /与否死亡while(toupper(personi.live)!=Y&toupper(personi.live)!=N)cout 你输入错误,请你重新输入!endl;coutpersoni.live;cin.ignore();if(toupper(personi.live)=N)cout 死亡日期(日期样式为xxxx/xx/xx) :;cin.getline(personi.dietime,20);/ 输入死亡日期coutpersoni.generation;cin.ign
7、ore();if(personi.generation!=1) /不是第一代cout 她(她)爸爸 :;cin.getline(personi.parent,20); /cin.getline是读取字符串函数 20是读取字符串个数coutendl;for(j=0;ji;j+)if(personj.generation=1)personj.data=-1; /*for(j=0;ji;j+)for(k=0;ki;k+)if(strcmp(personj.parent,personk.name)=0) /比较2个字符串与否相似,实质是找某个人爸爸personj.data=k;for(j=0;ji;j
8、+)for(k=0;ki;k+)if(strcmp(personj.parent,personk.name)=0)personk.childpersonk.numberchild=j;personk.numberchild+; /找某个人孩子for(j=0;ji;j+)outputfile.write(char*)(person+j),sizeof(*person); /写文献outputfile.close(); /关闭文献夹system(cls); void display(per person36,int &n1)int choice; while(1) /循环式始终进行 coutend
9、lendlendl;couttt 家族关系查询系统endl; couttt1. 显示家谱endl; couttt2. 显示第n代人所有信息endl; couttt3. 按照姓名查询某成员信息endl; couttt4. 按照出生日期查询成员名单endl;couttt5. 某成员添加孩子endl;couttt6. 修改某成员信息endl;couttt7. 按生日日期对家谱中所有人进行排序endl;couttt8. 退出系统endl; couttt 输入选取:endl; couttt 请输入1-8之间数choice; while (choice!=1&choice!=2&choice!=3&cho
10、ice!=4&choice!=5&choice!=6&choice!=7&choice!=8)coutyou enter wrong!endl;coutplease enter again!choice; cin.ignore(1,n); /跳过一种字符,含义是忽视一行system(cls);switch(choice) case 1:displayhome(person,n1);break; case 2:displayinfo(person,n1); break; case 3:namesearch(person,n1);break;case 4:birtfdaysearch(person
11、,n1);break;case 5:addchild(person,n1);break;case 6:editmember(person,n1);break;case 7:sortbirthday(person,n1);break; case 8:exit(0); void displayhome(per person36,int &n2) /调用函数参数 传递是一种参数地址int i,j,max;char again;coutendlendl;for(i=0;in2-1;i+)max=personi.generation;for(j=i+1;jn2;j+)if(personi.generat
12、ionpersonj.generation)max=personj.generation; /找出最大代数for(i=1;i=max;i+)cout 第i代成员有 :;for(j=0;jn2;j+)if(personj.generation=i)coutpersonj.name ; /输出每一代人coutendl;coutendlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y) /就是判断输入得与否为y或Ysystem(cls);return;if(toupper(again)=N)exit(0); /终结程序执行
13、void displayinfo(per person36,int &n2) /显示代数int i,gen,j=0;char again;coutendlendl;coutgen;coutendl; /换行for(i=0;in2;i+)if(personi.generation!=gen)j+;if(j=n2) /判断与否找到cout 你要查代数还没有!endlendl;for(i=0;in2;i+)if(personi.generation=gen)cout 姓名 :personi.nameendl 出生日期 :personi.brith 第几代 :personi.generationend
14、l 婚否 :personi.marry 地址 :personi.addressendl 与否健在 :personi.liveendl; if(personi.live=N|personi.live=n)cout 死亡日期 :personi.dietimeendl;coutendlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)system(cls);return;if(toupper(again)=N)exit(0);void namesearch(per person36,int &n2)int i,j=0,k;
15、char again,name20;coutendlendl;cout 请你输入你想要查询人姓名 :;cin.getline(name,20);for(i=0;in2;i+)if(strcmp(personi.name,name)!=0)j+;coutendlendl;if(j=n2)cout 你要查询人没有!endlendl;for(i=0;in2;i+)if(strcmp(personi.name,name)=0)cout 姓名 :personi.nameendl 出生日期 :personi.brith 第几代 :personi.generationendl 婚否 :personi.mar
16、ry 地址 :personi.addressendl 与否健在 :personi.liveendl; if(personi.live=N|personi.live=n)cout 死亡日期 :personi.dietimeendl;coutendlendl;if(personi.generation=1)cout 她是这个家根,没有爸爸!endlendl;elsecout 她(她)爸爸信息 :endl;cout 姓名 :personpersoni.data.nameendl 出生日期 :personpersoni.data.brith 第几代 :personpersoni.data.genera
17、tionendl 婚否 :personpersoni.data.marry 地址 :personpersoni.data.addressendl 与否健在 :personpersoni.data.liveendl;if(personpersoni.data.live=N|personpersoni.data.live=n)cout 死亡日期 :personpersoni.data.dietimeendl;coutendlendl;if(personi.numberchild=0)cout 她没有孩子!endlendl;elsecout 她有personi.numberchild个孩子,她们信息
18、 :endlendl;for(k=0;kpersoni.numberchild;k+)cout 姓名 :personpersoni.childk.nameendl 出生日期 :personpersoni.childk.brith 第几代 :personpersoni.childk.generationendl 婚否 :personpersoni.childk.marry 地址 :personpersoni.childk.addressendl 与否健在 :personpersoni.childk.live;if(personpersoni.childk.live=N|personpersoni
19、.childk.live=n)cout 死亡日期 :personpersoni.childk.dietimeendl;coutendlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)system(cls);return;if(toupper(again)=N)exit(0);void birtfdaysearch(per person36,int &n2) char begbir20,endbir20,again;int i,flag=0;coutendlendl;cout 请你输入两个时间,格式为*/*/*!en
20、dl;cout 起始时间是 :;cin.getline(begbir,20);cout 终结时间是 :;cin.getline(endbir,20);coutendlendl;for(i=0;i=0&strcmp(personi.brith,endbir)=0)cout 姓名 :personi.name;cout 生日 :personi.brith;flag=1;coutendl;coutendlendl;if(flag=0)cout 在这段时间内没有人生日!endlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)
21、system(cls);return;if(toupper(again)=N)exit(0);void addchild(per person36,int &n2) int i;char again;fstream file(person.txt,ios:in|ios:out|ios:binary|ios:app);coutendlendl;cout 请输入孩子信息!endlendlendl;cout 姓名 :;cin.getline(personn2.name,20);cout 生日(日期样式为xxxx/xx/xx) :;cin.getline(personn2.brith,20);cout
22、personn2.marry;while(toupper(personn2.marry)!=Y&toupper(personn2.marry)!=N)cout 你输入错误,请你重新输入!endl;coutpersonn2.marry;cin.ignore();cout 地址 :;cin.getline(personn2.address,20);coutpersonn2.live;while(toupper(personn2.live)!=Y&toupper(personn2.live)!=N)cout 你输入错误,请你重新输入!endl;coutpersonn2.live;cin.ignore
23、();if(toupper(personn2.live)=N)cout 死亡日期(日期样式为xxxx/xx/xx) :;cin.getline(personn2.dietime,20);coutpersonn2.generation;cin.ignore();if(personn2.generation!=1)cout 她(她)爸爸 :;cin.getline(personn2.parent,20);coutendl;for(i=0;in2;i+)if(strcmp(personn2.parent,personi.name)=0)personn2.data=i;break;file.write
24、(char*)&personn2,sizeof(personn2);file.close();file.open(person.txt,ios:in|ios:out|ios:binary);file.seekp(i*sizeof(per),ios:beg);personi.childpersoni.numberchild=n2;personi.numberchild+;file.write(char*)&personi,sizeof(per);file.close();n2+;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)
25、system(cls);return;if(toupper(again)=N)exit(0);void editmember(per person36,int &n2)int i,flag=0,choice;char name20,again;fstream file(person.txt,ios:in|ios:out|ios:binary);coutendlendl;cout 请你输入你想修改成员名字 :;cin.getline(name,20);coutendlendl;for(i=0;in2;i+)if(strcmp(personi.name,name)=0)flag=1;break;i
26、f(flag=0)cout 家谱中没有这个人!endlendlendl;if(flag=1) couttt请你选取你要修改项!endl; couttt 1. 姓名endl; couttt 2. 地址endl; couttt 3. 婚否endl; couttt 4. 生日endl; couttt 5. 与否死亡endl; couttt 6. 死亡日期endl; couttt 请输入1-6之间数endl; coutchoice; while (choice!=1&choice!=2&choice!=3&choice!=4&choice!=5&choice!=6) coutyou enter wro
27、ng!endl; coutplease enter again!choice; cin.ignore(1,n); switch(choice) case 1:coutendl 请你输入新名字 :; cin.getline(personi.name,20);/ file.seekp(i*sizeof(per),ios:beg);/ file.write(char*)&personi,sizeof(per);break; case 2:coutendl 请输入新地址 :; cin.getline(personi.address,20);/ file.seekp(i*sizeof(per),ios:
28、beg);/ file.write(char*)&personi,sizeof(per);break; case 3:coutendlpersoni.marry;/ file.seekp(i*sizeof(per),ios:beg);/ file.write(char*)&personi,sizeof(per);break; case 4:coutendl 请你输入新生日 :; cin.getline(personi.brith,20);/ file.seekp(i*sizeof(per),ios:beg);/ file.write(char*)&personi,sizeof(per);bre
29、ak; case 5:coutendlpersoni.live;/ file.seekp(i*sizeof(per),ios:beg);/ file.write(char*)&personi,sizeof(per);break; case 6:coutendl 请你输入新死亡日期 :; cin.getline(personi.dietime,20);/ file.seekp(i*sizeof(per),ios:beg);/ file.write(char*)&personi,sizeof(per);break; for(int j=0;jn2;j+)file.write(char*)&pers
30、onj,sizeof(per);coutendlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)system(cls);return;if(toupper(again)=N)exit(0);void sortbirthday(per person36,int &n2)per person1;int i,j;char again;coutendlendl;for(i=0;in2-1;i+)for(j=i+1;j=0)person1=personi;personi=personj;personj=person1;for(i=0;in2;i+)cout 姓名 :personi.name 生日 :personi.brithendl;coutendlendl;cout 你与否想继续查看?如果继续请输入Y或y,否则输入N或n!again;if(toupper(again)=Y)system(cls);return;if(toupper(again)=N)exit(0);