1、/* 家谱管理系统 任务:实现具有下列功能的家谱管理系统功能要求:1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2). 实现数据的存盘和读盘。3)。 以图形方式显示家谱。4). 显示第n 代所有人的信息.5)。 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。6)。 按照出生日期查询成员名单。7)。 输入两人姓名,确定其关系。8). 某成员添加孩子。9)。 删除某成员(若其还有后代,则一并删除)。10).修改某成员信息.11).按出生日期对家谱中所有人排序。12
2、).打开一家谱时,提示当天生日的健在成员.要求:建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据.进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;*/includeinclude#includestring.h#includesex = sextemp; /printf(”%s s s d %dn”,nametemp,birthday
3、temp,addresstemp,marriagetemp,livetemp); if(!livetemp) fscanf(in,”s”,livemassagetemp); /printf(sn”,livemassagetemp); if(!T-live) strcpy(Tlivemassage,livemassagetemp); fscanf(in,”c”,&ch); CreatBiTree(T-lc,in); CreatBiTree(T-rc,in); void PrintInfo(BiTree T) printf(”%10s出生于:-10s10s,Tname,Tbirthday,T-ad
4、dress); if(Tmarriage) printf(t已婚”); if(!T-marriage) printf(t未婚”); if(Tsex) printf(”t男); if(!Tsex) printf(”t女”); if(Tlive) printf(”t健在n); if(!Tlive) printf(t去世于:sn”,Tlivemassage);void PreOrderTraverse_recursion(BiTree T)/递归 先序遍历(检查建树是否正确)/printf(PreOrderTraverse_recursionn);if(T)/printf(”-10s出生于:%10s
5、10s,Tname,Tbirthday,Taddress); if(Tmarriage) printf(”t已婚”); if(!T-marriage) printf(”t未婚); if(T-sex) printf(t男”); if(!Tsex) printf(t女”); if(Tlive) printf(”t健在n”); if(!Tlive) printf(t去世于:%sn”,Tlivemassage);/ PrintInfo(T);PreOrderTraverse_recursion(T-lc);PreOrderTraverse_recursion(Trc);void ShowFamilyT
6、ree(BiTree T)/以图形的方式显示家谱 int i,lev; BiTree p; p = T; if(T) lev = Tlevel; for(i=0; ilc; printf( %5sn”,pname); if(p-rc) p = prc; ShowFamilyTree(p); else printf(” (未婚)n); if(T-rc) p = T-rc; ShowFamilyTree(p); void ShowNth(BiTree T)/显示第n代所有人的信息 if(T) if(Tlevel = Nth) PrintInfo(T); /printf(%-10s%-10s10s5
7、d5d5dn”,Tname,Tbirthday,Taddress,Tmarriage,Tlive,T-sex); count+; ShowNth(Tlc);ShowNth(T-rc); void SearchByName(BiTree T)/按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。不能查询祖先信息 if(T)if(Tlc) if(Tlcrc) temp = T-lcrc; while(temp) if(strcmp(temp-name,searchname) = 0) count+; printf(”n此人的信息为: n); PrintInfo(temp); /printf
8、(10s-10s%-10s%5d%5d5dnn”,tempname,tempbirthday,temp-address,tempmarriage,templive,temp-sex); printf(”此人父母的信息为: n”); PrintInfo(T); PrintInfo(T-lc); /printf(”10s10s%10s%5d5d5dn”,T-name,T-birthday,T-address,Tmarriage,T-live,Tsex); /printf(10s-10s%10s5d%5d5dnn”,Tlcname,Tlcbirthday,T-lcaddress,T-lc-marri
9、age,Tlc-live,T-lc-sex); if(!temp-livemassage) printf(”此人还没有妻室n); else printf(此人妻子的信息为: n”); PrintInfo(temp-lc); /printf(”10s%-10s10s5d5d5dnn,temp-lc-name,templc-birthday,temp-lcaddress,templcmarriage,temp-lc-live,templcsex); if(templcrc) printf(”此人孩子的信息为: n”); temp = templcrc; while(temp) PrintInfo(
10、temp); /printf(”10s%10s-10s5d5d%5dn”,tempname,temp-birthday,tempaddress,temp-marriage,templive,temp-sex); temp = temprc; return; else temp = temp-rc; SearchByName(Tlc);SearchByName(T-rc);void SearchByBirthday(BiTree T)/按照出生日期查询成员名单 if(T) if(strcmp(Tbirthday,searchdata) = 0) PrintInfo(T); /printf(10s
11、%10s%-10s%5d5d5dn,Tname,Tbirthday,Taddress,Tmarriage,Tlive,Tsex); count+; SearchByBirthday(Tlc);SearchByBirthday(Trc); void AddChild(BiTree &T)/某成员添加孩子 if(T) if(strcmp(Tname,searchname) = 0) count+; if(!T-lc) printf(该成员还没有结婚,不能添加孩子n”); return; if(!Tsex) printf(不能为该家谱中的女性添加孩子n”); return; else temp =
12、(BiTree)malloc(sizeof(BiTNode)); printf(”请输入添加孩子的姓名n); scanf(”%s,tempname); printf(”请输入添加孩子的出生年月(格式形如: 2010-11)n); scanf(”%s”,tempbirthday); printf(”请输入添加孩子的家庭住址n”); scanf(s”,tempaddress); printf(请输入添加孩子的婚姻状况 0/1 (0表示未婚,1表示已婚)n”); scanf(d,tempmarriage); printf(”请输入添加孩子的在世情况 0/1 (0表示去世,1表示在世)n”); sca
13、nf(%d,&temp-live); if(!templive) printf(请输入添加孩子的去世时间(格式形如: 2010-1-1)n”); scanf(%s”,temp-livemassage); printf(请输入添加孩子的性别 0/1 (0表示女,1表示男)n”); scanf(d,&temp-sex); templevel = Tlevel+1; temprc = T-lc-rc; temp-lc = NULL; Tlcrc = temp; printf(”孩子添加成功n”); return; AddChild(Tlc);AddChild(Trc);void AddWife(Bi
14、Tree T)/某成员添加妻子 if(T) if(strcmp(Tname,searchname) = 0) count+; if(Tlc) printf(该成员已有妻子,可以通过修改的方式替换该妻子n); return; else temp = (BiTree)malloc(sizeof(BiTNode)); printf(请输入添加妻子的姓名n); scanf(”s”,temp-name); printf(”请输入添加妻子的出生年月(格式形如: 201011)n”); scanf(”s,temp-birthday); printf(请输入添加妻子的家庭住址n”); scanf(s,temp
15、address); printf(请输入添加妻子的婚姻状况0/1 (0表示未婚,1表示已婚)n); scanf(”d”,tempmarriage); printf(”请输入添加妻子的在世情况(0表示去世,1表示在世)n); scanf(%d,templive); if(!templive) printf(”请输入添加妻子的去世时间(格式形如: 20101-1)n”); scanf(”%s”,templivemassage); printf(”请输入添加妻子的性别 0/1 (0表示女,1表示男)n); scanf(”%d”,&temp-sex); temp-level = T-level; te
16、mp-lc = NULL; temp-rc = NULL; Tlc = temp; Tmarriage = true; printf(妻子添加成功n); return; AddWife(T-lc);AddWife(Trc);void DeleteByName(BiTree T)/删除某成员(若其还有后代,则一并删除)/printf(”PreOrderTraverse_recursionn);if(T)if(strcmp(Tname,searchname) = 0) count+; T = NULL; return; /printf(%10s%-10s-10s%5d%5d%5dn,Tname,T
17、-birthday,T-address,Tmarriage,T-live,Tsex);DeleteByName(T-lc);DeleteByName(T-rc);void FixLevel(BiTree T) if(T) if(strcmp(Tname,searchname) = 0) count = Tlevel; FixLevel(T-lc); FixLevel(T-rc); void FixRelation(BiTree T)/输入两人姓名,确定其关系 int levo,levt; char levone50,levtwo50; printf(请输入第一个人的姓名n”); scanf(”
18、s,searchname); strcpy(levone,searchname); FixLevel(T); levo = count; if(levo = 1) printf(家谱无此人,请从新进入n”); return; printf(”请输入第二个人的姓名n”); scanf(”%s”,searchname); strcpy(levtwo,searchname); FixLevel(T); levt = count; if(levt = 1) printf(家谱无此人n”); return; if(levo levt) printf(”%s 比 s 大 d 辈n”,levone,levt
19、wo,levt-levo); else if(levo levt) printf(s 比 %s 大 %d 辈n,levtwo,levone,levolevt); else if(levo = levt) printf(”s 和 %s 平辈n”,levone,levtwo);void ShowAmend() printf(1。修改姓名n”); printf(2。修改出生年月n”); printf(3.修改家庭住址n); printf(”4。修改婚姻状况n”); printf(”5。修改在世情况n); printf(6.修改性别n”); printf(”7.返回上一级n”); printf(”请输
20、入选项(1-7): ”);void DoAmend(BiTree T) while(1) system(cls”); ShowAmend(); scanf(”d”,choice); switch(choice) case 1: printf(”请输入修改后的姓名: ”); scanf(s,T-name); break; case 2: printf(”请输入修改后的出生年月: ); scanf(s,Tbirthday); break; case 3: printf(”请输入修改后的住址: ); scanf(%s,Taddress); break; case 4: printf(请输入修改后的婚
21、姻状况: ); scanf(”d,&Tmarriage); break; case 5: printf(”请输入修改后的在世情况: ”); scanf(”d”,&T-live); if(!T-live) printf(请输入本人的过世时间: ”); scanf(”s,Tlivemassage); break; case 6: printf(请输入修改后的性别(1表示男,0表示女): ); scanf(d”,T-sex); case 7: return; default: printf(输入非法,请重新输入n); break; void AmendInfo(BiTree &T)/修改某成员信息。
22、 if(T) if(strcmp(Tname,searchname) = 0) count+; DoAmend(T); return; AmendInfo(T-lc);AmendInfo(Trc); void Sequence(BiTree T)/按出生日期对家谱中所有人排序.if(T) BiTNodeList temp; BiTNodeList p; temp = (BiTNodeList *)malloc(sizeof(BiTNodeList); tempdata = T; /p = List; /while(p) for(p=List; (p-next!=NULL)(strcmp(p-n
23、ext-databirthday,tempdatabirthday)0); p=pnext); tempnext = pnext; p-next = temp;Sequence(Tlc);Sequence(Trc);void PrintSequence(BiTree T) BiTNodeList p; p = List; Sequence(T); printf(tttt排序结果nn); PrintLine(); printf(n”); while(p-next != NULL) printf( ”); PrintInfo(pnextdata); /printf(”t10s-10s-10s%5d
24、5d5dn”,p-nextdata-name,pnext-data-birthday,pnextdata-address,pnextdatamarriage,p-next-datalive,pnextdatasex); p = p-next; printf(”n); PrintLine();void LocateTime() time_t t=time(0); strftime(birthdaytemp,64,Y-md”,localtime(t);void BirthToday(BiTree T)/打开一家谱时,提示当天生日的健在成员。if(T)if(strcmp(Tbirthday,birthdaytemp) = 0) count+; printf(”sn”,T-name); BirthToday(Tlc);BirthToday(Trc); void ShowMenu() PrintBat(); printf(”n”); PrintLine(); printf(”n”); printf(”ttt欢迎进入家谱管理系统nn”); printf(” 1。显示今天生日成员 2.显示家谱n”); printf( 3。显示第n代所有人的信息 4.按姓名查找成员n”); printf( 5。按出生日期查找成员 6。为成员添加孩子n”);