数据结构家谱管理系统公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间: 2012年12月1日信息工程学院制目录一、案例描述...................................................1、总体描述................................................2、模块描述................................................二、设计思路...................................................三、程序设计...................................................1、数据结构描述............................................2、主函数及其流程图........................................3、源程序..................................................四、调试与分析.................................................1、主菜单..................................................2、显示家谱信息............................................3、显示家谱中第n代人所有信息..............................4、按姓名查找某人并相应输出................................5、按出生日期查找家谱成员信息..............................6、为家谱中成员添加孩子信息................................7、为家谱中成员添加妻子信息................................8、删除家谱中成员及其后代信息..............................9、修改家谱中成员信息......................................10、确定家谱中两个成员关系.................................11、按出生年月排序家谱.....................................五、设计总结...................................................1、完成情况................................................2、心得体会................................................一、案例描述1、总体描述家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的查询到家族成员的详细信息。
该家谱管理系统是通过树来实现的。
本程序具有插入、查找等功能,可以实现存放家谱中各成员的信息。
程序的操作界面简洁美观,易于操作。
本程序运用了函数、循环、树等知识来进行设计,实现系统和数据结构设计。
2、模块描述1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
2). 实现数据的存盘和读盘。
3). 以图形方式显示家谱。
4). 显示第n 代所有人的信息。
5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6). 按照出生日期查询成员名单。
7). 输入两人姓名,确定其关系。
8). 某成员添加孩子。
9). 删除某成员(若其还有后代,则一并删除)。
10).修改某成员信息。
11).按出生日期对家谱中所有人排序。
12).打开一家谱时,提示当天生日的健在成员。
图1 模块调用示意图二、设计思路本程序要求模块化管理,分成菜单函数、创建函数、添加函数、查找函数、控制各个部分从而将程序简单化出来分析。
本程序的主要功能是:创建数据:创建各相关数据,例如创建家谱信息。
添加数据:增加家谱成员孩子信息。
查询信息:按照姓名来查询成员信息,还可以通过输入出生日期来查询该家谱信息。
退出系统:程序编译结束后退出系统。
三、程序设计1、数据结构描述本程序首先定义了结构体,定义了lc,rc两个指针域;定义如下:typedef struct BiTNode取一个家庭关系\n");printf(" \n");printf(" 2.显示一个家庭关系\n");printf(" \n");printf(" 3.查找成员\n");printf(" \n");printf(" 4.添加新成员\n");printf(" \n");printf(" 5.修改成员\n");printf(" \n");printf(" 6.保存\n");printf(" \n");printf(" 7.退出系统\n\n\n");printf(" \n");printf("************************************************** ******************\n\n");printf("输入1~6之间的数字选择相应功能:");scanf("%d",&i);return i;}ptree creatfamily(FILE *fp){if(!feof(fp)){ptree p;p=(ptree)malloc(sizeof(pnode));char fname[10],mname[10];int i;fscanf(fp,"%s %s %d\n", fname,mname,&i);if((strcmp(fname,"n")==0) && (strcmp(mname,"n")==0) && (i==0)){p=NULL;return p;}else{strcpy(p->male,fname);strcpy(p->female,mname);p->n=i;printf("读取成功\n");p->fchild=creatfamily(fp); p->brother=creatfamily(fp);return p;}}}void PreOrder(ptree p){if(p){show(p);PreOrder(p->fchild);PreOrder(p->brother);}}void show(ptree p){printf("名字配偶第几代\n");printf("%2s %6s %d\n",p->male,p->female,p->n); }void search(ptree p,char name[]){if(p){if(strcmp(p->male,name)==0){show(p);getchar();getchar();}search(p->fchild,name);search(p->brother,name);}}void add(ptree p,char name[]){char fname[10],mname[10];int i;if(p){if(strcmp(p->male,name)==0){printf("名字配偶第几代\n");scanf("%s %s %d",fname,mname,&i);p->fchild=(ptree)malloc(sizeof(pnode)); strcpy(p->fchild->male,fname);strcpy(p->fchild->female,mname);p->fchild->n=i;p->fchild->fchild=NULL;p->fchild->brother=NULL;}add(p->fchild,name);add(p->brother,name);}}void gai(ptree p,char name[]){char fname[10],mname[10];int i;if(p){if(strcmp(p->male,name)==0){printf("名字配偶第几代\n");scanf("%s %s %d",fname,mname,&i);strcpy(p->male,fname);strcpy(p->female,mname);p->n=i;}gai(p->fchild,name);gai(p->brother,name);}}void save(ptree p,FILE *stream){if(p){fprintf(stream,"%s %s %d",p->male,p->female,p->n);save(p->fchild,stream);save(p->brother,stream);}else{char out[20] = "n n 0";fprintf(stream,"%s\n",out); }}int main(){ int status;char name[10];ptree p;FILE *fp= fopen("","r+");while(1){status=Menu();switch(status){case 1:p=creatfamily(fp);getchar();getchar();break;case 2:PreOrder(p);getchar();getchar();break;case 3:printf("请输入搜索的名字\n");scanf("%s",name);search(p,name);break;case 4:printf("请输入要孩子的人\n");scanf("%s",name);add(p,name);break;case 5:printf("请输入要修该的人\n");scanf("%s",name);gai(p,name);break;case 6:save(p,fp);getchar();getchar();break;case 7:printf("\n感谢使用本系统\n");fclose(fp);fclose(fp);exit(0); //如果选择5,则退出循环终止程序break;default :printf("\n您选择有误\n");getchar();}}}四、调试与分析1、主菜单家谱管理系统的主界面2、显示家谱信息读取家谱信息3、显示家谱中第n代人所有信息显示家谱中第n代人所有信息4、按姓名查找某人并相应输出查询家谱成员信息的界面5、为家谱中成员添加孩子信息为家谱中成员添加孩子信息6、修改家谱中成员信息修改家谱中成员信息五、设计总结1、完成情况2、心得体会白钰琦:从这个项目中,我懂得了代码编写能力的提高不是一天两天的事,而是一个日积月累的过程。