家谱管理系统_第1页
家谱管理系统_第2页
家谱管理系统_第3页
家谱管理系统_第4页
家谱管理系统_第5页
已阅读5页,还剩26页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精心整理洛阳理工学院程设计报告课程名称数据结构课程设计设计题目家谱管理系统专业计算机科学与技术班级B150405学号JI姓名宋士龙完成日期2016年12月30日课程设计任务书设计题目:家谱管理系统设计内容与要求:【问题描述】:实现具有下列功能的家谱管理系统1) .输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2) .实现数据的存盘和读盘。3) .显示家谱。4) .按照出生日期查询成员名单。5) .按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。6) .修改某成员信息。【

2、基本要求】:界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证精心整理精心整理程序的稳定。测试数据及测试结果请在上交的资料中写明。指导教师:年月日课程设计评语指导教师:年月日精心整理、算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找、修改、以及保存家谱和读取家谱功能。该系统分为以下几个模块,分别是:创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。本

3、程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因为是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思想就是递归调用,每个子函数中都会用到递归。定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。以下时算法思想流程图:精心整理二、模块划分1. intmain():主函数2. voidCreatTree(TreeNode*Tree)创建家族树3. voidOutPutAll(TreeNod

4、e*Tree):显示家谱4. voidMenue(TreeNode*Tree):主菜单5. voidSubMenue1(TreeNode*Tree)副菜单(修改选项菜单)6. voidChange(TreeNode*Tree)修改家谱7. TreeNode*SearchTree(TreeNode*Tree,charname,intlength)按照姓名查找家谱成员8. TreeNode*SearchTree1(TreeNode*Tree,charbirth口,intlength):按照生日查找家谱成员9. voidOutPutMessage(TreeNode*Tree,charname,int

5、length)输出按姓名查找到的家谱成员10. voidOutPutMessage1(TreeNode*Tree,charbirth,intlength):输出按生日查找到的家谱成员11. voidSaveFamily(TreeNode*root):保存家谱12. voidReadFamily(TreeNode*root):读取家谱三、数据结构typedefstructTreeNode精心整理intChildNum;记录这个人拥有几个儿女charName20;记录这个人的姓名charbirthday20;/生日intmarriage;/婚否(1表示结婚,0表示没结婚)intdeath;/生死(

6、1表示活着,0表示过世)charKind;/标示节点的种类有女G男Bcharaddress100;住址charlivemassage50;/死亡日期(如果其已经死亡)structTreeNode*NextNode20;/记录这个人的儿女structTreeNode*Parent;/记录这个节点的父节点TreeNode,*tree;四、测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代11个人。其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的配偶是二婶,子女是姐姐。三叔的

7、的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后退出即可。精心整理图1家族树第一组数据测试截图为:图2显示家谱图3按照姓名查找家族成员图4存盘第二组数据为:图4王家家族树精心整理第二组数据测试截屏为:图5修改家族成员的信息图6修改某个人的具体信息图7按照生日查找某人图8读盘五、源程序#include<stdio.h>#include<stdlib.h>#include<string.h>#ifdefWIN32#defineCLEARsys

8、tem("cls")#defineTipForSaveFilePositionprintf("t't输入文件名及保存位置(eg:D:Wexample.txt):")#defineTipForReadFilePositionprintf("tt文件名及其路径(eg:D:Wexample.txt):")#else#defineCLEARsystem("clear")#defineTipForSaveFilePositionprintf("tt输入文件名及保存位置(eg:/home/xiong/exam

9、ple.txt):")#defineTipForReadFilePositionprintf("tt文件名及其路径(eg:/home/xiong/example.txt):")#endif#definemaxFileNameLen50候存的文件名的最大长度精心整理intFLAG=0;inta=1;typedefstructTreeNode(intChildNum;记录这个人拥有几个儿女charName20;记录这个人的姓名charbirthday20;生日intmarriage;/婚否(1表示结婚,0表示没结婚)intdeath;/生死(1表示活着,0表示过世)c

10、harKind;标示节点的种类有女G男Bcharaddress100;住址charlivemassage50;/死亡日期(如果其已经死亡)structTreeNode*NextNode20;/记录这个人的儿女structTreeNode*Parent;/记录这个节点的父节点TreeNode,*tree;voidCreatTree(TreeNode*Tree);voidOutPutAll(TreeNode*Tree);voidMenue(TreeNode*Tree);voidSubMenue1(TreeNode*Tree);voidSubMenue2(TreeNode*Tree);voidCha

11、nge(TreeNode*Tree);voidAddNew(TreeNode*Tree);精心整理TreeNode*SearchTree(TreeNode*Tree,charname,intlength);TreeNode*SearchTree1(TreeNode*Tree,charbirth,intlength);voidOutPutMessage(TreeNode*Tree,charname,intlength);voidOutPutMessage1(TreeNode*Tree,charbirth,intlength);voidSaveFamily(TreeNode*root);voidR

12、eadFamily(TreeNode*root);intmain()/主函数(TreeNode*Tree;/TreeNode*Tree1;/Tree1=&(*Tree);Tree=(TreeNode*)malloc(sizeof(TreeNode);Tree->Parent=NULL;strcpy(Tree->Name,"0");Menue(Tree);return0;voidMenue(TreeNode*Tree)输出主菜单(/*TreeNode*Tree1;Tree1=&Tree;*/charc;charname20;精心整理charbirt

13、h20;while(1)(system("cls");printf("t");printf("nntt*欢迎使用家族管理系统A:输入家谱信息建立树B:输出整个家谱信息C:按出生日期查找某人D:按姓名查找某人E修改某个人的信息F:存盘");G:读盘");H:退出整个程序*nn");printf("ntt");printf("ntt");printf("ntt");printf("ntt");printf("ntt");

14、printf("nttprintf("nttprintf("nttnt");c=getchar();精心整理switch(c)(case'A':TreeNode*NewNode;NewNode=(TreeNode*)malloc(sizeof(TreeNode);printf("nt请输入姓名:");scanf("%s",Tree->Name);printf("nt请输入性别女G男B:");getchar();scanf("%c”,&(Tree->K

15、ind);Tree->Parent=NewNode;Tree->Parent=NULL;/CreatTree(Tree);/printf("nt家谱图已经建立成功nn");printf("nnt请按Enter键继续操作-);getchar();break;case'B':if(strcmp(Tree->Name,"0")=0)(printf("nt家谱图的多叉树尚未建立请先建立树n");精心整理getchar();break;)printf("nnt整个家谱的主要信息如下:&quo

16、t;);OutPutAll(Tree);getchar();break;case'C':if(strcmp(Tree->birthday,"0")=0)printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;)printf("nt请输入你要查找的出生日期:");scanf("%s",birth);OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);printf("nnt*-*-*-*-*-*-*-

17、*-*-*-nt");getchar();break;case'D':精心整理if(strcmp(Tree->Name,"0")=0)(printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;printf("nt请输入你要查找的人的姓名:nt");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name,20);printf("nnt*-*-*-*-*-*-*-*-*-*-n

18、t");getchar();break;case'E':if(strcmp(Tree->Name,"0")=0)(printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;Change(Tree);getchar();精心整理break;case'F':if(strcmp(Tree->Name,"0")=0)(printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;SaveFamily(Tre

19、e);getchar();break;case'G':/*if(strcmp(Tree->Name,"0")=0)(printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;*/ReadFamily(&Tree);getchar();break;case'H':精心整理printf("nnt本次服务到此结束");printf("nt欢迎下次使用");printf("nt谢谢nn");break;case'n&

20、#39;:break;default:printf("nnt对不起!你的选择不在服务范围之内!");printf("nt请您再次选择所需的服务项!");printf("nt谢谢nt");getchar();break;if(c='H'|c='f')break;getchar();voidCreatTree(TreeNode*Node)创建树精心整理inti;TreeNode*NewNode;NewNode=(TreeNode*)malloc(sizeof(TreeNode);Node->NextN

21、ode0=NewNode;Node->NextNode0=NULL;printf("nt请输入出生日期:”);scanf("%s",Node->birthday);printf("nt请输入家庭住址:");getchar();scanf("%s",Node->address);printf("nt请输入是否建在(1-是或0-否):");scanf("%d”,&(Node->death);if(Node->death=0)(printf("nt请输入

22、去世日期:");scanf("%s",Node->livemassage);elseif(Node->death='1')printf("nt仍然建在");printf("nt请输入s的配偶的姓名(输入0代表没结婚):",Node->Name);scanf("%s",NewNode->Name);精心整理if(strcmp(NewNode->Name,"0")!=0)printf("t请输入配偶的出生日期:");scan

23、f("%s",NewNode->birthday);printf("nt请输入家庭住址:");getchar();scanf("%s",NewNode->address);printf("nt请输入是否建在(1-是或0-否):");scanf("%d”,&(NewNode->death);if(NewNode->death=0)printf("nt请输入去世日期:");scanf("%s",NewNode->livemassag

24、e);elseif(NewNode->death='1')printf("nt仍然建在");printf("nt请输入s的子女的数目(当子女输入0时便停止输入该成员有关信息):",Node->Name);scanf("%d”,&(Node->ChildNum);if(Node->ChildNum)=0&&strcmp(NewNode->Name,"0")=0)return;if(Node->Kind='G'|Node->Kind

25、='g')NewNode->Kind='B'else精心整理NewNode->Kind='G'NewNode->ChildNum=0;NewNode->NextNode0=NULL;Node->NextNode0=NewNode;Node->NextNode0->Parent=Node;孩子的父母for(i=1;i<=Node->ChildNum;i+)NewNode=(TreeNode*)malloc(sizeof(TreeNode);a+;printf("n't请输入s的

26、第d子女的名字:",Node->Name,i);scanf("%s",NewNode->Name);printf("nt请输入s的第d子女的性别女G男B:",Node->Name,i);getchar();scanf("%c”,&NewNode->Kind);NewNode->ChildNum=-1;NewNode->Parent=Node;Node->NextNodei=NewNode;CreatTree(Node->NextNodei);从子女的数目开始voidOutPutA

27、ll(TreeNode*Tree)精心整理inti,flag=0;printf("nt-*-*-*-*-*-*-*-")5printf("nt姓名:s出生日期:s家庭住址:%s性另U:%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);if(Tree->Kind='G'|Tree->Kind='g')flag=1;printf("女");elseprintf("男");printf(&qu

28、ot;t是否健在(1-健在,0-去世):”);if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0");if(!(Tree->NextNode0)printf("nt至今没有配偶和子女n");return;if(flag=1)printf("nt丈夫姓名:s",Tree->NextNode0->Name);精心整理elseprintf("nt妻子姓名:%s",Tree->NextNode0-&g

29、t;Name);printf("t是否健在(1-健在,0-去世):”);if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0");for(i=1;i<=Tree->ChildNum;i+)printf("nt第d个子女的姓名:s出生日期:s家庭住址:%s性另fJ%c”,i,Tree->NextNodei->Name,Tree->NextNodei->birthday,Tree->NextNodei->addre

30、ss,Tree->NextNodei->Kind);if(Tree->NextNodei->Kind='G'|Tree->NextNodei->Kind='g')printf("女");elseprintf("男");printf("t是否健在(1-健在,0-去世):");if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0");printf(&quo

31、t;nt");for(i=1;i<=Tree->ChildNum;i+)精心整理OutPutAll(Tree->NextNodei);)TreeNode*SearchTree(TreeNode*Tree,charname,intlength)(inti;TreeNode*NewNode;if(strcmp(Tree->Name,name)=0)(if(length=0)FLAG=1;elseFLAG=0;returnTree;)if(Tree->NextNode0=NULL)returnNULL;for(i=0;i<=Tree->ChildN

32、um;i+)(if(i=0)NewNode=SearchTree(Tree->NextNodei,name,0);else精心整理NewNode=SearchTree(Tree->NextNodei,name,20);if(NewNode!=NULL)returnNewNode;returnNULL;voidOutPutMessage(TreeNode*Tree,charname,intlength)(intflag=0,i;TreeNode*NewNode;printf("nnt*-*-*-*-*-*-*-*-*-*-");if(Tree=NULL)(prin

33、tf("nnt*该家谱图中没有%s这个人的信息请确认是否输入错误*n",name);return;printf("nnt您所要找的人已经找到信息如下所示:");printf("nnt姓名:5出生日期:%s家庭住址:%s性另U:%c”,name,Tree->birthday,Tree->address,Tree->Kind);if(Tree->Kind='G'|Tree->Kind='g')(精心整理flag=1;/标记他(她)的性别printf("女");)els

34、eprintf("男");printf("t是否健在(1-健在,0-去世):”);if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0");NewNode=Tree->Parent;if(FLAG=1)if(flag=1)printf("nnt她是嫁入此家族的所以亲生父母信息不在家谱内包括)printf("nt丈夫姓名:%s",NewNode->Name);)elseprintf("nnt他是入赘

35、此家族的所以亲生父母信息不在家谱内包括");printf("nt妻子姓名:s”,NewNode->Name);精心整理)if(NewNode->ChildNum)>0)/判断他(她)是否有孩子(printf("nt的孩子的信息如下:");输出他(她)的孩子的信息for(i=1;i<=NewNode->ChildNum;i+)(printf("nt姓名:%s性别:",NewNode->NextNodei->Name);if(NewNode->NextNodei->Kind='

36、G'|NewNode->Kind='g')printf("女");elseprintf("男");printf("t是否健在(1-健在,0-去世):");if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0");)return;if(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息printf("nt是这个家谱图里最年长的人",name);el

37、se精心整理if(NewNode->Kind='G'|NewNode->Kind='g')/判断父亲节点是父亲还是母亲(printf("nt母亲姓名:s",NewNode->Name);输出他(她)的父母亲的信息printf("nt父亲姓名:s”,NewNode->NextNode0->Name);else(printf("nt母亲姓名:s”,NewNode->NextNode0->Name);printf("nt父亲姓名:s",NewNode->Name

38、);if(Tree->NextNode0!=NULL)判断他(她)是否有配偶(if(flag=1)/输出他(她)的配偶的信息printf("nt丈夫姓名:s",Tree->NextNode0->Name);elseprintf("nt妻子姓名:s",Tree->NextNode0->Name);if(Tree->ChildNum>0)/判断他(她)是否有孩子精心整理printf("nt的孩子的信息如下:");输出他(她)的孩子的信息for(i=1;i<=Tree->ChildNum

39、;i+)(printf("nt姓名:s性另U:",Tree->NextNodei->Name);if(Tree->NextNodei->Kind='G'|Tree->Kind='g')printf("女");elseprintf("男");printf("t是否健在(1-健在,0-去世):”);if(Tree->death=1)printf("1");elseif(Tree->death=0)printf("0"

40、);elseprintf("nt%s至今还没有孩子",name);elseprintf("nt%s至今还没有配偶和孩子n",Tree->Name);精心整理)TreeNode*SearchTree1(TreeNode*Tree,charbirth,intlength)(inti;TreeNode*NewNode;if(strcmp(Tree->birthday,birth)=0)(if(length=0)FLAG=1;elseFLAG=0;returnTree;)if(Tree->NextNode0=NULL)returnNULL;fo

41、r(i=0;i<=Tree->ChildNum;i+)(if(i=0)NewNode=SearchTree1(Tree->NextNodei,birth,0);elseNewNode=SearchTree1(Tree->NextNodei,birth,20);if(NewNode!=NULL)精心整理returnNewNode;returnNULL;)voidOutPutMessage1(TreeNode*Tree,charbirth,intlength)(intflag=0,i;TreeNode*NewNode;printf("nnt*-*-*-*-*-*-

42、*-*-*-*-");if(Tree=NULL)(printf("nnt*该家谱图中没有出生日期为%s这个人的信息请确认是否输入错误*n",birth);return;)printf("nnt您所要找的人已经找到信息如下所示:");printf("nnt姓名:5出生日期:s家庭住址:%s性另U:%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);if(Tree->Kind='G'|Tree->Kind='g')(flag=1;/标记他(她)的性别printf("女");精心整理)elseprintf("男");)voidChange(TreeNode*Tree)/修改某个人的信息(charname20;TreeNode*NewNode;printf("nt请输入你要修改的人的姓名:nt");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode=NULL)(printf("nnt*该家谱图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论