任务:实现具有下列功能的家谱管理系统 功能要求:
1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容: 姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的 2). 实现数据的存盘和读盘。 3). 以图形方式显示家谱。
4). 显示第 n 代所有人的信息。
5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 6). 按照出生日期查询成员名单。 7). 输入两人姓名,确定其关系。 8). 某成员添加孩子。
9). 删除某成员(若其还有后代,则一并删除)。 10).修改某成员信息。
11).按出生日期对家谱中所有人排序。
12).打开一家谱时,提示当天生日的健在成员。 要求:建立至少 30 个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。 测试数据:要求使用 1、全部合法数据; 2、局部非法数据。进行程序测试,以保证程序的稳定。 测试数据及测试结果请在上交的资料中写明;
*/
#include #include 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\ if(ch == '@') { T = NULL; fscanf(in,\"%c\ } else { T = (BiTree)malloc(sizeof(BiTNode)); //fscanf(in,\"%s%s%s%d%d\fscanf(in,\"%s\ strcpy(T->name,nametemp); fscanf(in,\"%s\strcpy(T->birthday,birthdaytemp); fscanf(in,\"%s\strcpy(T->address,addresstemp); fscanf(in,\"%d%d%d%d\T->marriage = marriagetemp; T->live = livetemp; T->level = leveltemp; T->sex = sextemp; //printf(\"%s %s %s %d %d\\n\if(!livetemp) { fscanf(in,\"%s\//printf(\"%s\\n\ } if(!T->live) strcpy(T->livemassage,livemassagetemp); fscanf(in,\"%c\CreatBiTree(T->lc,in); CreatBiTree(T->rc,in); } } void PrintInfo(BiTree T) { printf(\"%-10s 出生于 :%-10s%-10s\if(T->marriage) printf(\"\ 已婚 \"); if(!T->marriage) printf(\"\ 未婚 \"); if(T->sex) printf(\"\ 男 \"); if(!T->sex) printf(\"\ 女 \"); if(T->live) printf(\"\ 健在 \\n\"); if(!T->live) printf(\"\ 去世于 :%s\\n\ } void PreOrderTraverse_recursion(BiTree T)// 递归 先序遍历 (检查建树是否正确{ //printf(\"PreOrderTraverse_recursion\\n\"); if(T) { /*printf(\"%-10s 出生于 :%-10s%-10s\if(T->marriage) printf(\"\ 已婚 \"); if(!T->marriage) printf(\"\ 未婚 \"); if(T->sex) printf(\"\ 男 \"); ) if(!T->sex) printf(\"\ 女 \"); if(T->live) printf(\"\ 健在 \\n\"); if(!T->live) printf(\"\ 去世于 :%s\\n\PreOrderTraverse_recursion(T->rc); } } void ShowFamilyTree(BiTree T)// 以图形的方式显示家谱 { int i,lev; BiTree p; p = T; if(T) { lev = T->level; for(i=0; i { p = T->lc; printf(\" ★*★ %5s%\\n\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\ } 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\>live,temp->sex); printf(\" 此人父母的信息为 : \\n\"); PrintInfo(T); PrintInfo(T->lc); //printf(\"%-10s%-10s%-10s%5d%5d%5d\\n\ //printf(\"%-10s%-10s%-10s%5d%5d%5d\\n\\n\e,T->lc->sex); if(!temp->livemassage) printf(\" 此人还没有妻室 \\n\"); else { printf(\" 此人妻子的信息为 : \\n\"); PrintInfo(temp->lc); //printf(\"%-10s%-10s%-10s%5d%5d%5d\\n\\n\ arriage,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\ve,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\ } 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\ printf(\" 请输入添加孩子的出生年 (格式形如 : 2010-1-1)\\n\"); 月 scanf(\"%s\ printf(\" 请输入添加孩子的家庭住\\n\"); 址 scanf(\"%s\ printf(\" 请输入添加孩子的婚姻状0/1 (0 表示未婚, 1 表示已婚况 scanf(\"%d\ printf(\" 请输入添加孩子的在世情0/1 (0 表示去世, 1 表示在世况 scanf(\"%d\ if(!temp->live) { printf(\" 请输入添加孩子的去(格式形如 : 2010-1-1)\\n\"); 世时间 } printf(\" 请输入添加孩子的性别 0/1 (0 表示女, 1 表示 男 )\\n\"); scanf(\"%d\ 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)// 某成员添加妻 子 { \\n\"); \\n\"); ) ) 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\ (格式形如 : 2010-1-1)\\n\"); printf(\" 请输入添加妻子的出生年 月 scanf(\"%s\ printf(\" 请输入添加妻子的家庭住\\n\"); 址 scanf(\"%s\ printf(\" 请输入添加妻子的婚姻状0/1 (0 表示未婚, 1 表示已婚 )\\n\"); 况 scanf(\"%d\ printf(\" 请输入添加妻子的在世情(0 表示去世, 1 表示在世 )\\n\"); 况 scanf(\"%d\ if(!temp->live) { printf(\" 请输入添加妻子的去世时间 (格式形如 : 2010-1-1)\\n\"); scanf(\"%s\ } printf(\" 请输入添加妻子的性别 0/1 (0 表示女, 1 表示男 )\\n\"); scanf(\"%d\ 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\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\strcpy(levone,searchname); FixLevel(T); levo = count; if(levo == -1) { printf(\" 家谱无此人,请从新进入 \\n\"); return; } printf(\" 请输入第二个人的姓名 \\n\"); scanf(\"%s\strcpy(levtwo,searchname); FixLevel(T); levt = count; if(levt == -1) { printf(\" 家谱无此人 \\n\"); return; } if(levo < levt) printf(\"%s 比 %s 大 %d 辈 \\n\printf(\"%s 比 %s 大 %d 辈 \\n\printf(\"%s 和 %s 平辈 \\n\ } 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\ { case 1: printf(\" 请输入修改后的姓名 : \"); scanf(\"%s\break; case 2: printf(\" 请输入修改后的出生年月 : \"); scanf(\"%s\break; case 3: printf(\" 请输入修改后的住址 : \"); scanf(\"%s\break; case 4: printf(\" 请输入修改后的婚姻状况 : \"); scanf(\"%d\break; case 5: printf(\" 请输入修改后的在世情况 : \"); scanf(\"%d\if(!T->live) { printf(\" 请输入本人的过世时间 : \"); scanf(\"%s\ } break; case 6: printf(\" 请输入修改后的性别( 1 表示男, 0 表示女) : \"); scanf(\"%d\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(\"\\\\ 排序结果 \\n\\n\"); PrintLine(); printf(\"\\n\"); while(p->next != NULL) { printf(\" \"); PrintInfo(p->next->data); //printf(\"\%-10s%-10s%-10s%5d%5d%5d\\n\ss,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\ } void BirthToday(BiTree T)// 打开一家谱时,提示当天生日的健在成员。 { if(T) { if(strcmp(T->birthday,birthdaytemp) == 0) { count++; printf(\"%s\\n\ } BirthToday(T->lc); BirthToday(T->rc); } } void ShowMenu() PrintBat(); printf(\"\\n\"); PrintLine(); printf(\"\\n\"); printf(\"\\\欢迎进入家谱管理系统 \\n\\n\"); t\ 1.显示今天生日成员 printf(\" 2.显示家谱 \\n\"); 4.按姓名查找成员 \\n\"); 6.为成员添加孩子 \\n\"); 8.删除成员 \\n\"); 10.确定两个人的关系 \\n\"); 12.退出程序 \\n\"); printf(\" printf(\" printf(\" printf(\" printf(\" printf(\"\\n\"); PrintLine(); printf(\"\\n\"); printf(\" } 3.显示第 n 代所有人的信息 5.按出生日期查找成员 7.为成员添加妻子 9.修改成员信息 11.按出生年月排序家谱成员 已经从文件读入初始家谱信息,请输入您的操作 (1-12): \"); int main(void) { int choice; FILE *in; in = fopen(\"7.out\BiTree T; CreatBiTree(T,in); //PreOrderTraverse_recursion(T); while(1) { system(\"cls\"); ShowMenu(); scanf(\"%d\getchar(); system(\"cls\"); switch(choice) { case 1: LocateTime(); count = 0; BirthToday(T); if(count == 0) printf(\" 今天家谱中没有成员过生日 \\n\"); system(\"pause\"); break; case 2: ShowFamilyTree(T); system(\"pause\"); break; case 3: printf(\" 请输入需要查询第几代人 : \"); count = 0; scanf(\"%d\ ShowNth(T); if(count == 0) printf(\" 第 %d 代尚未有人。 \\n\break; case 4: printf(\" 请输入要查询人的姓名 : \"); scanf(\"%s\if(strcmp(T->name,searchname) == 0) { printf(\" 此人为家谱的祖先 ,其信息为 :\\n\"); printf(\"%-10s%-10s%-10s%5d%5d%5d\\n\他妻子 的信息为 : \\n\"); printf(\"%-10s%-10s%-10s%5d%5d%5d\\n\ temp = T->lc; if(temp->rc) { printf(\" 他孩子的信息为 :\\n\"); temp = temp->rc; while(temp) { printf(\"%-10s%-10s%-10s%5d%5d%5d\\nemp->sex); temp = temp->rc; } } } else { count = 0; SearchByName(T); if(count == 0) printf(\" 对不起,不能检测这个人的信息 \\n\"); } system(\"pause\"); break; case 5: printf(\" 请输入要查询人的生日 : \"); count = 0; scanf(\"%s\ SearchByBirthday(T); if(count == 0) printf(\"%s 没有人过生日。 \\n\system(\"pause\"); break; case 6: count = 0; printf(\" 请输入要添加孩子成员的姓名 : \"); scanf(\"%s\AddChild(T); if(count == 0) printf(\" 没有这个人 \\n\"); system(\"pause\"); break; case 7: count = 0; printf(\" 请输入要添加妻子成员的姓名 : \"); scanf(\"%s\ AddWife(T); if(count == 0) printf(\" 没有这个人 \\n\"); system(\"pause\"); break; case 8: } } count = 0; printf(\" 请输入要删除成员的姓名 : \"); scanf(\"%s\DeleteByName(T); if(count == 0) printf(\" 没有这个人 \\n\"); system(\"pause\"); break; case 9: count = 0; printf(\" 请输入要修改人的姓名 : \"); scanf(\"%s\AmendInfo(T); if(count == 0) printf(\" 没有这个人 \\n\"); system(\"pause\"); break; case 10: FixRelation(T); system(\"pause\"); break; case 11: count = 0; List = (BiTNodeList *)(malloc(sizeof(BiTNodeList))); List->next = NULL; PrintSequence(T); system(\"pause\"); break; case 12: return; system(\"pause\"); break; default: printf(\" 输入数据有误,请重新输入 \\n\"); break; } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务