版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*家谱管理系统
任务:实现具有下列功能的家谱管理系统
功能要求:
1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以
下内容:
姓名、诞生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可
附加其它信息、但不是必需的。
2).实现数据的存盘和读盘。
3).以图形方式显示家谱。
4).显示第n代全部人的信息。
5).依据姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6).依据诞生日期查询成员名单。
7).输入两人姓名,确定其关系。
8).某成员添加孩子。
9).删除某成员(若其还有后代,则一并删除)。
10).修改某成员信息。
11).按诞生日期对家谱中全部人排序。
12).打开一家谱时,提示当天生日的健在成员。
要求:建立至少30个成员的数据,以较为直观的方式显示结果,并供应
文稿形式以便检查。
界面要求:有合理的提示,每个功能可以设立菜单,依据提示,可以完成
相关的功能要求。
存储结构:学生自己依据系统功能要求自己设计,但是要求相关数据要存
储在数据文件中。
测试数据:要求运用1、全部合法数据;2、局部非法数据。进行程序测
试,以保证程序的稳定。
测试数据与测试结果请在上交的资料中写明;
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include"map.h"
#defineMAXN100
#defineMAXMEM100
#defineElemtypechar
〃树
typedefstructBiTNode
{
intmark;//标记
intlevel;
charname[50];//姓名
charbirthday[50];//生日
charaddress[MAXN];//fttil:
boolmarriage;//蜡否(true表示结婚,false表示没结婚)
boollive;〃建在(true表示活着,false表示过世)
boolsex;//性别(tme表示男,false表示女)
charlivemassage[50];//死亡日期(假如其已经死亡)
Elemtypedata;//
structBiTNode*lc,*rc;
}BiTNode,*BiTree;
//树的相关操作
charnametemp[50];〃姓名
charbirthdaytemp[50];//生日
charaddresstemp[MAXN];//住址
boolmarriagetemp;//婚否(true表示结婚,fa:se表示没结婚)
boollivetemp;〃建在(true表示或者,false表示过世)
boolsextemp;
charlivemassagetemp[MAXN];//5EC日期(假如其已经死亡)
charch;//额外运用
intleveltemp;//人的代数
intNth;〃显示第n代人时要用
charsearchdata[50];
charsearchname[50];
else
T=(BiTree)malloc(sizeof(BiTNode));
//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresste
mp,&marriagetemp,&livetemp);
fscanf(in,"%s',nametemp);
strcpy(T->name,nametemp);
fscanf(in,"%s',birthdaytemp);
strcpy(T->birthday,birthdaytemp);
fscanf(in,"%s',addresstemp);
strcpy(T->address,addresstemp);
fscanf(in,"%d%d%d%d",&marriagetemp,&livetemp,&leveltemp,&s
extemp);
T->marriage=marriagetemp;
T->live=livetemp;
T->level=leveltemp;
T->sex=sextemp;
//printf("%s%s%s%d%d\n",nametemp,birthdaytemp,ad
dresstemp,marriagetemp,livetemp);
if(!livetemp)
fscanf(in,"%s",livemassagetemp);
//printf("%s\n",livemassagetemp);
}
if(!T->live)
strcpy(T->livemassage,livemassagetemp);
fscanf(in,"%c',&ch);
CreatBiTree(T->lc,in);
CreatBiTree(T->rc,in);
voidPrintlnfofBiTreeT)
(
printf("%-10s诞生
:%-10s%-10s",T->name,T->birthday,T->address);
if(T->marriage)
printf(”\t已婚”);
if(!T->marriage)
printf("\t未婚”);
if(T->sex)
printf(”\t男叱
if(!T->sex)
printf("\t女”);
if(T->live)
printf(、健在\n”);
if(!T->live)
printf("\t去世于:%s\rT,T->livemassage);
}
voidPreOrderTraverse_recursion(BiTreeT)//递归先序遍历(检查建
树是否正确)
{
//printf("PreOrderTraverse_recursion\n");
if(T)
{
/*printf("%-10s诞生
zf:%-10s%-10s",T->nanie,T->birthday,T->address);
if(T->marriage)
printf("\t已婚叱
if(!T->marriage)
printf(、未婚叱
if(T->sex)
printf(”\t男
if(!T->sex)
printf(“\t女”);
if(T->live)
printf(“\t健在\n");
if(!T->live)
printf("\t去世于:%s\n",T->livemassage);*/
Printlnfo(T);
PreOrderTraverse_recursion(T->lc);
PreOrderTraverse_recursion(T->rc);
voidShowFamilyTreefBiTreeT)〃以图形的方式显示家谱
inti,lev;
BiTreep;
P=T;
if(T)
{
lev=T->level;
for(i=0;i<lev;i++)
printf("\t");
printf("%-5s',p->name);
if(p->lc)
|
p=T->lc;
printfO*★%5s%\n",p->name);
if(p->rc)
{
p=p->rc;
ShowFamilyTree(p);
}
}
else
printff1味婚)\n”);
}
if(T->rc)
{
p=T->rc;
ShowFamilyTree(p);
voidShowNth(BiTreeT)//显示第n代全部人的信息
if(T)
if(T->level==Nth)
{
PrintlnfoiT);
//printff"%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthd
ay,T->address,T->marriage,T->live,T->sex);
count++;
}
ShowNth(T->lc);
ShowNth(T->rc);
voidSearchByName(BiTreeT)//依据姓名查询,输出成员信息(包括
其本人、父亲、孩子的信息)。不能查询祖先信息
{
if(T)
if(T->lc)
if(T->lc->rc)
temp=T->lc->rc;
while(temp)
{
if(strcmp(temp->name,searchname)==0)
count++;
printf(”\n此人的信息为:\n);
Printlnfo(temp);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->name,tem
p->birthday,temp->address,temp->marriage,temp->live,temp->se
x);
printf(”此人父母的信息为:\n");
Printlnfo(T);
PrintInfo(T->lc);
//printf("%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthd
ay,T->address,T->marriage,T->live,T->sex);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",T->lc->name,T->l
c->birthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->se
x);
if(!temp->livemassage)
printf(”此人还没有妻室\n”);
else
{
printf("此人妻子的信息为:\n");
Printlnfo(temp->lc);
//printff'%-1Os%-1Os%-10s%5d%5d%5d\n\n",temp->lc->name,
temp->lc->birthday,temp->lc->address,temp->lc->marriage,temp
->lc->live,temp->lc->sex);
if(temp->lc->rc)
(
printf("此人孩子的信息为:\n”);
temp=temp->lc->rc;
while(temp)
(
Printlnfo(temp);
//printff'%-1Os%-1Os%-10s%5d%5d%5d\n",temp->name,temp-
>birthday,temp->address,temp->marriage,temp->live,temp->sex);
temp=temp->rc;
return;
else
temp=temp->rc;
SearchByName(T->lc);
SearchByName(T->rc);
voidSearchByBirthday(BiTreeT)//依据诞生日期查询成员名单
if(T)
if(strcmp(T->birthday,searchdata)==0)
Printlnfo(T);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthd
ay,T->address,T->marriage,T->live,T->sex);
count++;
}
SearchByBirthday(T->lc);
SearchByBirthday(T->rc);
}
}
voidAddChild(BiTree&T)//某成员添加孩子
{
if(T)
{
if(strcmp(T->name,searchname)==0)
(
count++;
if(!T->lc)
{
prints该成员还没有结婚,不能添加孩子\n”);
return;
}
if(!T->sex)
{
printf(”不能为该家谱中的女性添加孩子\n”);
return;
}
else
{
temp=(BiTree)malloc(sizeof(BiTNode));
printf(”请输入添加孩子的姓名\n");
scan:("%sM,temp->name);
printf(”请输入添加孩子的诞生年月(格式形如:
2010-l-l)\n");
scani("%s",temp->birthday);
printf(”请输入添加孩子的家庭住址\n”);
scan:("%sn,temp->address);
printf(”请输入添加孩子的婚姻状况0/1(0表示未婚,
1表示已婚)\n”);
scan:("%d",&temp->marriage);
printf(”请输入添加孩子的在世状况0/1(0表示去世,
1表示在世世口");
scanf("%d",&temp->live);
if(!temp->live)
printf(”请输入添加孩子的去世时间(格式形如:
2010-l-l)\n");
scanf("%s",temp->livemassage);
printf(”请输入添加孩子的性别0/1(0表示女,1表示
男)\n");
scanf("%d",&temp->sex);
temp->level=T->level+l;
temp->rc=T->lc->rc;
temp->lc=NULL;
T->lc->rc=temp;
printf("孩子添加胜利\n");
return;
AddChild(T->lc);
AddChild(T->rc);
voidAddWife(BiTree&T)〃某成员添加妻子
if(T)
if(strcmp(T->name,searchname)==0)
{
count++;
if(T->lc)
{
printf(”该成员已有妻子,可以通过修改的方式替换该妻
子\n”);
return;
)
else
{
temp=(BiTree)malloc(sizeof(BiTNode));
printf(”请输入添加妻子的姓名\n”);
scani("%sM,temp->name);
printf(”请输入添加妻子的诞生年月(格式形如:
2010-l-l)\n");
scani("%s",temp->birthday);
printf(”请输入添加妻子的家庭住址\n”);
scan:("%sM,temp->address);
printf(”请输入添加妻子的婚姻状况0/1(0表示未婚,
1表示已婚八n”);
scanf("%d",&temp->marriage);
printf(”请输入添加妻子的在世状况(0表示去世,1表示
在世)\n“);
scanf("%d",&temp->live);
if(!temp->live)
printf(”请输入添加妻子的去世时间(格式形如:
2010-l-l)\n");
scanf("%s",temp->livemassage);
printf(”请输入添加妻子的性别0/1(0表示女,1表示
男八n”);
scani("%d",&temp->sex);
temp->level=T->level;
temp->lc=NULL;
temp->rc=NULL;
T->lc=temp;
T->marriage=true;
printf("妻子添加胜利\n”);
return;
}
AddWife(T->lc);
AddWife(T->rc);
voidDeleteByName(BiTree&T)//删除某成员(若其还有后代,则一并
删除)
{
//printf("PreOrderTraverse_recursion\n");
if(T)
{
if(strcmp(T->name,searchname)==0)
(
count++;
T=NULL;
return;
}
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthd
ay,T->address,T->marriage,T->live,T->sex);
DeleteByName(T->lc);
DeleteByName(T->rc);
voidFixLevel(BiTreeT)
if(T)
if(strcmp(T->name,searchname)==0)
count=T->level;
FixLevel(T->lc);
FixLevel(T->rc);
voidFixRelation(BiTreeT)//输入两人姓名,确定其关系
intlevo,levt;
charlevone[50],levtwo[50];
printf("请输入第一个人的姓名\n");
scanf("%s",searchname);
strcpyflevone,searchname);
FixLevel(T);
levo=count;
if(levo==-1)
{
printf("家谱无此人,请从新进入\n");
return;
}
printf("请输入其次个人的姓名\n");
scanf("%s",searchname);
strcpyflevtwo,searchname);
FixLevel(T);
levt=count;
if(levt==-1)
(
printf("家谱无此人\n”);
return;
}
if(levo<levt)
printf("%s比%s大%d\n",1evone,1evtwo,1evt-1evo);
elseif(levo>levt)
printf("%s比%s大%d^\n",levtwo,levone,levo-levt);
elseif(levo==levt)
printf("%s和%sJf|g\n",levone,levtwo);
}
voidShowAmendO
{
printf”,修改姓名\n”);
printf(”2.修改诞生年月\n”);
printf(”3.修改家庭住址\n”);
printf(”4.修改婚姻状况\n”);
printf("5.修改在世状况\n”);
printf(”6.修改性别性”);
printf".返回上一级\rT);
printf(”请输入选项(1・7):");
)
voidDoAmend(BiTree&T)
{
while(l)
{
systemf'cls");
ShowAmendO;
scanf("%d",&choice);
switch(choice)
case1:
printf(“请输入修改后的姓名:”);
scanf("%s',,T->name);
break;
case2:
printf(”请输入修改后的诞生年月:");
scanf("%sM,T->birthday);
break;
case3:
printf(”请输入修改后的住址:");
scanf("%sM,T->address);
break;
case4:
printf(”请输入修改后的婚姻状况:
scanf("%d",&T->marriage);
break;
case5:
printf(”请输入修改后的在世状况:
scanf("%d",&T->live);
if(!T->live)
printf(”请输入本人的过世时间:叱
scanf("%s",T->livemassage);
)
break;
case6:
printf(”请输入修改后的性别(1表示男,。表示女):");
scani("%d",&T->sex);
case7:
return;
default:
printf("输入非法,请重新输入\n”);
break;
voidAmendInfo(BiTree&T)〃修改某成员信息。
{
if⑴
if(strcmp(T->name,searchname)==0)
count++;
DoAmend(T);
return;
}
AmendInfo(T->lc);
AmendInfo(T->rc);
}
}
voidSequence(BiTreeT)〃按诞生日期对家谱中全部人排序。
(
if(T)
{
BiTNodeListxtemp;
BiTNodeList*p;
temp=(BiTNodeList*)malloc(sizeof(BiTNodeList));
temp->data=T;
//P=List;
//while(p->)
for(p=List;
(p->next!=NULL)&&(strcmp(p->next->data->birthday,temp->data
->birthday)<0);p=p->next);
temp->next=p->next;
p->next=temp;
Sequence(T->lc);
Sequence(T->rc);
)
voidPrintSequence(BiTreeT)
{
BiTNodeL运t*p;
p=List;
Sequence(T);
printf(”\t\t\t\t排序结果\n\rT);
PrintLineQ;
printf("\n");
while(p->next!=NULL)
{
printff"");
Printlnfo(p->next->data);
//printff'\t%-1Os%-10s%-10s%5d%5d%5d\n",p->next->data->n
ame,p->next->data->birthday,p->next->data->address,p->next->
data->marriage,p->next->data->live,p->next->data->sex);
p=p->next;
printf("\n");
PrintLineQ;
}
voidLocateTimeQ
{
time_tt=time(O);
strftime(birthdaytemp,64,"%Y-%m-%d",localtime(&t));
voidBirthToday(BiTreeT)〃打开一家谱时,提示当天生日的健在成员。
(
if(T)
{
if(strcmp(T->birthday,birthdaytemp)==0)
(
count++;
printf("%s\n",T->name);
}
BirthToday(T->lc);
BirthToday(T->rc);
voidShowMenuf)
PrintBatO;
printf("\n");
PrintLineQ;
printf("\n");
printf(”\t\t\t欢迎进入家谱管理系统\n\n”);
printf("1.显示今日生日成员2.显示家谱
\n");
printf("3.显示第n代全部人的信息4.按姓名查
找成员\n”);
printf("5.按诞生日期查找成员6.为成员添加
孩子\n”);
printf("7.为成员添加妻子8.删除成员
\n");
printff"9.修改成员信息10.确定两个
人的关系\n”);
printff'11.按诞生年月排序家谱成员12.退出程序
\n");
printf("\n");
PrintLineQ;
printfCAn");
printfl"已经从文件读入初始家谱信息,请输入您的操作(1-12):
”);
}
intmain(void)
{
intchoice;
FILE*in;
in=fopen("7.out","r");
BiTreeT;
CreatBiTree(T,in);
//PreOrderTraverse_recursion(T);
whilefl)
{
systemf'cls");
ShowMenuf);
scanf("%d",&choice);
getchar();
systemf'cls");
switch(choice)
case1:
LocateTimeQ;
count=0;
BirthTodayfT);
if(count==0)
printf("今日家谱中没有成员过生日\n");
systemf'pause");
break;
case2:
ShowFamilyTree(T);
systemf'pause");
break;
case3:
printf(”请输入须要查询第几代人:”);
count=0;
scanz("%d",&Nth);
ShowNth(T);
iffcount==0)
printf("第%d代尚未有人。\n",Nth);
systemf'pause");
break;
case4:
printf(”请输入要查询人的姓名:");
scanfC^s',,searchname);
if(strcmp(T->name,searchname)==0)
{
printf(”此人为家谱的祖先淇信息为:\n");
printff'%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthday,
T->address,T->marriage,T->live,T->sex);
printf(”他妻子的信息为:\n”);
printff'%-10s%-10s%-10s%5d%5d%5d\n",T->lc->name,T->lc->bi
rthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->sex);
temp=T->lc;
if(temp->rc)
(
printf("他孩子的信息为:'n");
temp=temp->rc;
while(temp)
{
printf("%-lOs%-1Os%-10s%5d%5d%5d\n",temp->name,temp->bi
rthday,te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 管理制度医院绩效考核管理办法
- 从被收录到被引用 2026年GEO发稿平台效果验证的 5 个关键节点
- 《写意墨韵》教学设计-2026-2027学年沪书画版(五四学制)(新版)初中美术七年级上册
- 晚期肿瘤呼吸困难以氧疗为主共识
- 2026年特种设备作业人员考试特种设备安全操作与法规标准解析试题及答案
- 危化品仓库围堰应急收集池清理指南(2026版)
- 2026年煤炭生产经营单位(安全生产管理人员)参考题库含答案
- 2026年特殊作业监护人安全防护设备使用试题及答案
- 心电监护仪使用方法试题及答案
- 小学数学教资面试几何图形专项题库及解析
- 远离毒品小学主题班会课件
- (2026秋新版)青岛版五年级数学上册全册教案(五四制)
- 第19课《培养德智体美劳全面发展的社会主义建设者和接班人》教学设计-2026-2027学年统编版九年级语文上册
- 【新版】2025-2026学年北师大版(2024)生物八年级上册全册教案(教案设计)
- 中央生态环境资金项目储备库入库指南(2025版)
- 四年级上信息技术教案
- 2026年4月自考00037美学试题及答案含评分参考
- 人教版小学数学五年级上册第六单元《多边形的面积》单元作业设计
- 2026年法院司法辅助人员题库检测试卷及完整答案详解【全优】
- 2025年商用无人机续航电池供应合同
- 艺术品设计合同范本
评论
0/150
提交评论