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

下载本文档

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

文档简介

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

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

3、程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因为是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思想就是递归调用,每个子函数中都会用到递归。定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。以下时算法思想流程图:家谱管理系统创建家谱显示家谱查找成员修改家谱读写家谱按按修修修存读照照改改改盘盘姓生本父孩名日人母子退出系统二、模块划分1. int main(): 主函数2. void

4、CreatTree(TreeNode *Tree):创建家族树3. void OutPutAll(TreeNode *Tree) :显示家谱4. void Menue(TreeNode *Tree):主菜单5. void SubMenue1(TreeNode * Tree):副菜单(修改选项菜单)6. void Change(TreeNode * Tree):修改家谱7. TreeNode * SearchTree(TreeNode *Tree,char name,int length):按照姓名查找家谱成员8. TreeNode * SearchTree1(TreeNode *Tree,ch

5、ar birth,int length):按照生日查找家谱成员9. void OutPutMessage(TreeNode * Tree,char name,int length):输出按姓名查找到的家谱成员10. void OutPutMessage1(TreeNode * Tree,char birth,int length):输出按生日查找到的家谱成员11. void SaveFamily(TreeNode *root):保存家谱12. void ReadFamily(TreeNode *root) :读取家谱三、数据结构typedef struct TreeNodeintChildNu

6、m; / 记录这个人拥有几个儿女char Name20;/ 记录这个人的姓名char birthday20;/ 生日int marriage;/ 婚否( 1 表示结婚, 0 表示没结婚)int death;/ 生死( 1 表示活着, 0 表示过世)char Kind;/ 标示节点的种类有女G 男 Bchar address100;/ 住址char livemassage50;/ 死亡日期(如果其已经死亡)struct TreeNode *NextNode20;/ 记录这个人的儿女struct TreeNode *Parent;/记录这个节点的父节点TreeNode,*tree;四、测试第一组数

7、据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代 11 个人。其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的配偶是二婶,子女是姐姐。三叔的的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后退出即可。爷爷奶奶爸爸妈妈二叔二婶三叔三婶我姐姐弟弟图1 家族树第一组数据测试截图为:图 2 显示家谱图 3 按照姓名查找家族成员图4存盘第二组数据为:王老刘老王二张二王大李

8、大王 小王 小一二图 4 王家家族树第二组数据测试截屏为:图 5 修改家族成员的信息图 6 修改某个人的具体信息图 7 按照生日查找某人图8读盘五、源程序#include <>#include <>#include <>#ifdef WIN32#define CLEAR system("cls")#define TipForSaveFilePosition printf("tt输入文件名及保存位置: ")#define TipForReadFilePosition printf("tt文件名及其路径 (eg:

9、 D:")#else#define CLEAR system("clear")#define TipForSaveFilePosition printf("tt输入文件名及保存位置 (eg: /home/xiong/: ")#define TipForReadFilePosition printf("tt文件名及其路径 (eg: /home/xiong/: ")#endif#define maxFileNameLen 50 / 保存的文件名的最大长度int FLAG=0;int a=1;typedef struct Tree

10、NodeintChildNum; / 记录这个人拥有几个儿女char Name20;/ 记录这个人的姓名char birthday20;/ 生日int marriage;/ 婚否( 1 表示结婚, 0 表示没结婚)int death;/ 生死( 1 表示活着, 0 表示过世)char Kind;/ 标示节点的种类有女G 男 Bchar address100;/ 住址char livemassage50;/ 死亡日期(如果其已经死亡)struct TreeNode *NextNode20;/ 记录这个人的儿女struct TreeNode *Parent;/记录这个节点的父节点TreeNode,

11、*tree;void CreatTree(TreeNode *Tree);void OutPutAll(TreeNode *Tree);void Menue(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);TreeNode * SearchTree(TreeNode *Tree,char name,int length); TreeNode * SearchTree1(T

12、reeNode *Tree,char birth,int length) ; void OutPutMessage(TreeNode * Tree,char name,int length); void OutPutMessage1(TreeNode * Tree,char birth,int length); void SaveFamily(TreeNode *root);void ReadFamily(TreeNode *root);int main()/ 主函数TreeNode *Tree;/TreeNode *Tree1;/Tree1=&(*Tree);Tree=(TreeNo

13、de *)malloc(sizeof(TreeNode);Tree->Parent =NULL;strcpy(Tree->Name,"0");Menue(Tree);return 0;void Menue(TreeNode *Tree)/ 输出主菜单/*TreeNode *Tree1;Tree1=&Tree;*/char c;char name20;char birth20;while(1)system("cls");printf("t");printf("nntt*欢迎使用家族管理printf(&quo

14、t;nttA: 输入家谱信息建立树printf("nttB: 输出整个家谱信息系 统 *nn");");");printf("nttC:按出生日期查找某人");printf("nttD: 按姓名查找某人");printf("nttE: 修改某个人的信息");printf("nttF:存盘");printf("nttG:读盘");printf("nttH: 退出整个程序nt");c=getchar();switch(c)case '

15、;A':TreeNode * NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf("nt请输入姓名:");scanf("%s",Tree->Name);printf("nt请输入性别女G 男 B:");getchar();scanf("%c",&(Tree->Kind);Tree->Parent=NewNode;Tree->Parent=NULL;/CreatTree(Tree);/printf("n

16、t-家谱图已经建立成功-nn");printf("nnt-请按 Enter 键继续操作 -");getchar();break;case 'B':if(strcmp(Tree->Name,"0")=0)printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;printf("nnt整个家谱的主要信息如下:");OutPutAll(Tree);getchar();break;case 'C':if(strcmp(Tree->bir

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

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

19、t;)=0)printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;Change(Tree);getchar();break;case 'F':if(strcmp(Tree->Name,"0")=0)printf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;SaveFamily(Tree);getchar();break;case 'G':/*if(strcmp(Tree->Name,"0")=0)pr

20、intf("nt家谱图的多叉树尚未建立请先建立树n");getchar();break;*/ReadFamily(&Tree);getchar();break;case 'H':printf("nnt-本次服务到此结束-");printf("nt-欢迎下次使用 -");printf("nt-谢谢 -nn");break;case 'n':break;default:printf("nnt-对不起 !你的选择不在服务范围之内!-");printf("

21、;nt-请您再次选择所需的服务项!-");printf("nt-谢谢 -nt");getchar();break;if (c='H'|c='f')break;getchar();void CreatTree(TreeNode *Node) / 创建树int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);Node->NextNode0=NewNode;Node->NextNode0=NULL;printf("nt请输入出生日期:&q

22、uot;);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请输入去世日期:");scanf("%s",Node->livema

23、ssage);else if(Node->death='1')printf("nt仍然建在 ");printf("nt 请输入 %s 的配偶的姓名 (输入 0 代表没结婚 ):",Node->Name); scanf("%s",NewNode->Name);if(strcmp(NewNode->Name,"0")!=0)printf("t请输入配偶的出生日期:");scanf("%s",NewNode->birthday);pri

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

25、;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='g')NewNod

26、e->Kind='B'elseNewNode->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("nt请输入 %s 的第 %d 子女的名字 :",Nod

27、e->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); /从子女的数目开始void OutPutAll

28、(TreeNode *Tree)int i, flag=0;printf("nt-*-*-*-*-*-*-*-*-*-");printf("nt姓 名 :%s出 生 日 期 :%s家庭住址:%s性别: %c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind); if (Tree->Kind='G'|Tree->Kind='g')flag=1; printf(" 女 ");elseprintf(" 男 &q

29、uot;);printf("t 是否健在 (1-健在, 0-去世 ): ");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0");if (!(Tree->NextNode0)printf("nt至今没有配偶和子女n");return;if(flag=1)printf("nt丈夫姓名 :%s",Tree->NextNode0->Name);elseprintf("nt 妻子 姓名

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

31、gt;Name,Tree->NextNodei->birthday,Tree->NextNodei->address,Tree->NextNodei->Kind);if (Tree->NextNodei->Kind='G'|Tree->NextNodei->Kind='g')printf(" 女 ");elseprintf(" 男 ");printf("t是否健在 (1-健在, 0-去世 ) :");if(Tree->death=1) p

32、rintf("1");else if(Tree->death=0) printf("0");printf("nt");for(i=1;i<=Tree->ChildNum;i+)OutPutAll(Tree->NextNodei);TreeNode * SearchTree(TreeNode *Tree,char name,int length)int i;TreeNode *NewNode;if(strcmp(Tree->Name,name)=0)if(length=0)FLAG=1;elseFLAG=0

33、;return Tree;if(Tree->NextNode0=NULL)return NULL;for(i=0;i<=Tree->ChildNum;i+)if (i=0)NewNode=SearchTree(Tree->NextNodei,name,0);elseNewNode=SearchTree(Tree->NextNodei,name,20);if (NewNode!=NULL)return NewNode;return NULL;void OutPutMessage(TreeNode * Tree,char name,int length)int fla

34、g=0,i;TreeNode *NewNode;printf("nnt-*-*-*-*-*-*-*-*-*-*-");if(Tree=NULL)printf("nnt* 该 家 谱 图 中 没 有 %s 这 个 人 的 信 息 请 确 认 是 否 输 入 错 误 *n",name);return;printf("nnt您所要找的人已经找到信息如下所示printf("nnt姓名:%s出生日期:");:%s家庭住址:%s性别:%c",name,Tree->birthday,Tree->address,Tre

35、e->Kind);if (Tree->Kind='G'|Tree->Kind='g')flag=1;/标记他 (她 )的性别printf(" 女 ");elseprintf(" 男 ");printf("t 是否健在 (1-健在, 0-去世 ): ");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0");NewNode=Tree->Parent;if

36、(FLAG=1)if(flag=1)printf("nnt 她是嫁入此家族的所以亲生父母信息不在家谱内包括 "); printf("nt 丈夫 姓名 :%s",NewNode->Name);elseprintf("nnt他是入赘此家族的所以亲生父母信息不在家谱内包括");printf("nt妻子姓名 :%s",NewNode->Name);if (NewNode->ChildNum)>0)/判断他 (她 )是否有孩子printf("nt 的孩子的信息如下 :"); / 输

37、出他 (她 )的孩子的信息 for(i=1;i<=NewNode->ChildNum;i+)printf("nt 姓名 :%s 性别 :",NewNode->NextNodei->Name); if (NewNode->NextNodei->Kind='G'|NewNode->Kind='g')printf(" 女 ");elseprintf(" 男 ");printf("t是否健在 (1-健在, 0-去世 ) :");if(Tree->

38、;death=1) printf("1");else if(Tree->death=0) printf("0");return;if(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息printf("nt是这个家谱图里最年长的人",name);elseif (NewNode->Kind='G'|NewNode->Kind='g')/ 判断父亲节点是父亲还是母亲printf("nt 母亲 姓名 :%s",NewNode->Name);/

39、输出他(她)的父母亲的信息 printf("nt 父亲 姓名 :%s",NewNode->NextNode0->Name);elseprintf("nt 母亲 姓名 :%s",NewNode->NextNode0->Name); printf("nt 父亲 姓名 :%s",NewNode->Name);if(Tree->NextNode0!=NULL) /判断他 (她 ) 是否有配偶if(flag=1)/ 输出他 ( 她)的配偶的信息printf("nt丈夫姓名 :%s",Tre

40、e->NextNode0->Name);elseprintf("nt妻子姓名 :%s",Tree->NextNode0->Name);if (Tree->ChildNum>0) /判断他 (她 )是否有孩子printf("nt 的孩子的信息如下 :"); / 输出他 (她 )的孩子的信息 for(i=1;i<=Tree->ChildNum;i+)printf("nt姓名 :%s性别 :",Tree->NextNodei->Name);if (Tree->NextNode

41、i->Kind='G'|Tree->Kind='g')printf(" 女 ");elseprintf(" 男 ");printf("t 是否健在 (1-健在, 0-去世 ): ");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0");elseprintf("nt%s至今还没有孩子",name);elseprintf("nt%s至今还

42、没有配偶和孩子n",Tree->Name);TreeNode * SearchTree1(TreeNode *Tree,char birth,int length)int i;TreeNode *NewNode;if(strcmp(Tree->birthday,birth)=0)if(length=0)FLAG=1;elseFLAG=0;return Tree;if(Tree->NextNode0=NULL)return NULL;for(i=0;i<=Tree->ChildNum;i+)if (i=0)NewNode=SearchTree1(Tree-

43、>NextNodei,birth,0);elseNewNode=SearchTree1(Tree->NextNodei,birth,20);if (NewNode!=NULL)return NewNode;return NULL;void OutPutMessage1(TreeNode * Tree,char birth,int length)int flag=0,i;TreeNode *NewNode;printf("nnt-*-*-*-*-*-*-*-*-*-*-");if(Tree=NULL)printf("nnt*该家谱图中没有出生日期为%s这

44、个人的信息请确认是否输入错误*n",birth);return;printf("nnt您所要找的人已经找到信息如下所示:");printf("nnt姓名:%s出生日期:%s家庭住址:%s性别:%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);if (Tree->Kind='G'|Tree->Kind='g')flag=1;/标记他 (她 )的性别printf(" 女 ");elseprintf(&

45、quot; 男 ");void Change(TreeNode * Tree) / 修改某个人的信息char name20;TreeNode * NewNode;printf("nt请输入你要修改的人的姓名:nt");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode=NULL)printf("nnt* 该 家 谱 图 中 没 有 %s 这 个 人 的 信 息 请 确 认 是 否 输 入 错 误 *n",name);return;elseSubMenue1

46、(NewNode);void SubMenue1(TreeNode * Tree) / 输出副菜单char c;intflag,i;char name20;char birth20;char address150;char Parent220;TreeNode * NewNode;getchar();while(1)system("cls");printf("t");printf("nnt-*-请选择你的操作-*-");printf("nt-*-*-*-A:printf("nt-*-*-*-B:printf(&qu

47、ot;nt-*-*-*-C:修改个人的信息 -*-*-*-*-*-*- 修改父母的信息 -*-*-*-*-*-*- 修改子女的信息 -*-*-*-*-*-*-");");");printf("nt-*-*-*-D:退出 -*-*-*-*-*-*-*-*-*-nt");c=getchar();switch(c)case 'A':printf("nnt 请输入修改的姓名 :如果不需要修改就输入 0然后按 Enter 键继续 nt"); scanf("%s",name);if(strcmp(na

48、me,"0")!=0)strcpy(Tree->Name,name);printf("nnt 是否要修改性别 :如果需要就输入 '1'不需要修改就输入 '0'然后按 Enter 键继续 nt");scanf("%d",&flag);if (flag=1)if(Tree->Kind='G'|Tree->Kind='g')Tree->Kind='B'else Tree->Kind='G'printf(&qu

49、ot;nnt请输入修改的出生日期:如果不需要修改就输入0然后按Enter键继续nt");scanf("%s",birth);if(strcmp(birth,"0")!=0)strcpy(Tree->birthday,birth);printf("nnt请输入修改的家庭地址:如果不需要修改就输入0然后按Enter键继续nt");scanf("%s",address1);if(strcmp(address1,"0")!=0)strcpy(Tree->address,address1);printf("nnt个人信息修改成功");break;c

温馨提示

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

评论

0/150

提交评论