资源描述
/* 家谱管理系统
任务:实现含有下列功效家谱管理系统
功效要求:
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"
#define MAXN 100
#define MAXMEM 100
#define Elemtype char
==============================
//树
typedef struct BiTNode
{
int mark;//标识
int level;
char name[50];//姓名
char birthday[50];//生日
char address[MAXN];//住址
bool marriage;//婚否(true表示结婚,false表示没结婚)
bool live;//建在(true表示活着,false表示过世)
bool sex;//性别(true表示男,false表示女)
char livemassage[50];//死亡日期(假如其已经死亡)
Elemtype data;//
struct BiTNode *lc,*rc;
}BiTNode,*BiTree;
//树相关操作
char nametemp[50];//姓名
char birthdaytemp[50];//生日
char addresstemp[MAXN];//住址
bool marriagetemp;//婚否(true表示结婚,false表示没结婚)
bool livetemp;//建在(true表示或,false表示过世)
bool sextemp;
char livemassagetemp[MAXN];//死亡日期(假如其已经死亡)
char ch;//额外使用
int leveltemp;//人代数
int Nth;//显示第n代人时要用
char searchdata[50];
char searchname[50];
int count;//计数
int choice;//多种选择
int use;
BiTree temp;
struct BiTNodeList
{
BiTree data;
BiTNodeList *next;
};
BiTNodeList *List;
//-----------
void CreatBiTree(BiTree &T,FILE *in)//建立双链二叉树
{
fscanf(in,"%c",&ch);
//printf("%c\n",ch);
if(ch == '@')
{
T = NULL;
fscanf(in,"%c",&ch);
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresstemp,&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,&sextemp);
T->marriage = marriagetemp;
T->live = livetemp;
T->level = leveltemp;
T->sex = sextemp;
//printf("%s %s %s %d %d\n",nametemp,birthdaytemp,addresstemp,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);
}
}
void PrintInfo(BiTree T)
{
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("\t健在\n");
if(!T->live)
printf("\t逝世于:%s\n",T->livemassage);
}
void PreOrderTraverse_recursion(BiTree T)//递归 先序遍历(检验建树是否正确)
{
//printf("PreOrderTraverse_recursion\n");
if(T)
{
/*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("\t健在\n");
if(!T->live)
printf("\t逝世于:%s\n",T->livemassage);*/
PrintInfo(T);
PreOrderTraverse_recursion(T->lc);
PreOrderTraverse_recursion(T->rc);
}
}
void ShowFamilyTree(BiTree T)//以图形方法显示家谱
{
int i,lev;
BiTree p;
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;
printf("★*★ %5s%\n",p->name);
if(p->rc)
{
p = p->rc;
ShowFamilyTree(p);
}
}
else
printf(" (未婚)\n");
}
if(T->rc)
{
p = T->rc;
ShowFamilyTree(p);
}
}
void ShowNth(BiTree T)//显示第n代全部些人信息
{
if(T)
{
if(T->level == Nth)
{
PrintInfo(T);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
count++;
}
ShowNth(T->lc);
ShowNth(T->rc);
}
}
void SearchByName(BiTree T)//根据姓名查询,输出组员信息(包含其本人、父亲、孩子信息)。不能查询祖先信息
{
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");
PrintInfo(temp);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->name,temp->birthday,temp->address,temp->marriage,temp->live,temp->sex);
printf("此人父母信息为: \n");
PrintInfo(T);
PrintInfo(T->lc);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",T->lc->name,T->lc->birthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->sex);
if(!temp->livemassage)
printf("此人还没有妻室\n");
else
{
printf("此人妻子信息为: \n");
PrintInfo(temp->lc);
//printf("%-10s%-10s%-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)
{
PrintInfo(temp);
//printf("%-10s%-10s%-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);
}
}
void SearchByBirthday(BiTree T)//根据出生日期查询组员名单
{
if(T)
{
if(strcmp(T->birthday,searchdata) == 0)
{
PrintInfo(T);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
count++;
}
SearchByBirthday(T->lc);
SearchByBirthday(T->rc);
}
}
void AddChild(BiTree &T)//某组员添加孩子
{
if(T)
{
if(strcmp(T->name,searchname) == 0)
{
count++;
if(!T->lc)
{
printf("该组员还没有结婚,不能添加孩子\n");
return;
}
if(!T->sex)
{
printf("不能为该家谱中女性添加孩子\n");
return;
}
else
{
temp = (BiTree)malloc(sizeof(BiTNode));
printf("请输入添加孩子姓名\n");
scanf("%s",temp->name);
printf("请输入添加孩子出生年月(格式形如: -1-1)\n");
scanf("%s",temp->birthday);
printf("请输入添加孩子家庭住址\n");
scanf("%s",temp->address);
printf("请输入添加孩子婚姻情况 0/1 (0表示未婚,1表示已婚)\n");
scanf("%d",&temp->marriage);
printf("请输入添加孩子在世情况 0/1 (0表示逝世,1表示在世)\n");
scanf("%d",&temp->live);
if(!temp->live)
{
printf("请输入添加孩子逝世时间(格式形如: -1-1)\n");
scanf("%s",temp->livemassage);
}
printf("请输入添加孩子性别 0/1 (0表示女,1表示男)\n");
scanf("%d",&temp->sex);
temp->level = T->level+1;
temp->rc = T->lc->rc;
temp->lc = NULL;
T->lc->rc = temp;
printf("孩子添加成功\n");
return;
}
}
AddChild(T->lc);
AddChild(T->rc);
}
}
void AddWife(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");
scanf("%s",temp->name);
printf("请输入添加妻子出生年月(格式形如: -1-1)\n");
scanf("%s",temp->birthday);
printf("请输入添加妻子家庭住址\n");
scanf("%s",temp->address);
printf("请输入添加妻子婚姻情况0/1 (0表示未婚,1表示已婚)\n");
scanf("%d",&temp->marriage);
printf("请输入添加妻子在世情况(0表示逝世,1表示在世)\n");
scanf("%d",&temp->live);
if(!temp->live)
{
printf("请输入添加妻子逝世时间(格式形如: -1-1)\n");
scanf("%s",temp->livemassage);
}
printf("请输入添加妻子性别 0/1 (0表示女,1表示男)\n");
scanf("%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);
}
}
void DeleteByName(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->birthday,T->address,T->marriage,T->live,T->sex);
DeleteByName(T->lc);
DeleteByName(T->rc);
}
}
void FixLevel(BiTree T)
{
if(T)
{
if(strcmp(T->name,searchname) == 0)
{
count = T->level;
}
FixLevel(T->lc);
FixLevel(T->rc);
}
}
void FixRelation(BiTree T)//输入两人姓名,确定其关系
{
int levo,levt;
char levone[50],levtwo[50];
printf("请输入第一个人姓名\n");
scanf("%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,levtwo,levt-levo);
else if(levo > levt)
printf("%s 比 %s 大 %d 辈\n",levtwo,levone,levo-levt);
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("请输入选项(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",T->birthday);
break;
case 3:
printf("请输入修改后住址: ");
scanf("%s",T->address);
break;
case 4:
printf("请输入修改后婚姻情况: ");
scanf("%d",&T->marriage);
break;
case 5:
printf("请输入修改后在世情况: ");
scanf("%d",&T->live);
if(!T->live)
{
printf("请输入本人过世时间: ");
scanf("%s",T->livemassage);
}
break;
case 6:
printf("请输入修改后性别(1表示男,0表示女): ");
scanf("%d",&T->sex);
case 7:
return;
default:
printf("输入非法,请重新输入\n");
break;
}
}
}
void AmendInfo(BiTree &T)//修改某组员信息。
{
if(T)
{
if(strcmp(T->name,searchname) == 0)
{
count++;
DoAmend(T);
return;
}
AmendInfo(T->lc);
AmendInfo(T->rc);
}
}
void Sequence(BiTree T)//按出生日期对家谱中全部些人排序。
{
if(T)
{
BiTNodeList *temp;
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);
}
}
void PrintSequence(BiTree T)
{
BiTNodeList *p;
p = List;
Sequence(T);
printf("\t\t\t\t排序结果\n\n");
PrintLine();
printf("\n");
while(p->next != NULL)
{
printf(" ");
PrintInfo(p->next->data);
//printf("\t%-10s%-10s%-10s%5d%5d%5d\n",p->next->data->name,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");
PrintLine();
}
void LocateTime()
{
time_t t=time(0);
strftime(birthdaytemp,64,"%Y-%m-%d",localtime(&t));
}
void BirthToday(BiTree T)//打开一家谱时,提醒当日生日健在组员。
{
if(T)
{
if(strcmp(T->birthday,birthdaytemp) == 0)
{
count++;
printf("%s\n",T->name);
}
BirthToday(T->lc);
BirthToday(T->rc);
}
}
void ShowMenu()
{
PrintBat();
printf("\n");
PrintLine();
printf("\n");
printf("\t\t\t欢迎进入家谱管理系统\n\n");
printf(" 1.显示今天生日组员 2.显示家谱\n")
展开阅读全文