家谱管理系统.docx

上传人:b****6 文档编号:4805446 上传时间:2022-12-09 格式:DOCX 页数:33 大小:294.12KB
下载 相关 举报
家谱管理系统.docx_第1页
第1页 / 共33页
家谱管理系统.docx_第2页
第2页 / 共33页
家谱管理系统.docx_第3页
第3页 / 共33页
家谱管理系统.docx_第4页
第4页 / 共33页
家谱管理系统.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

家谱管理系统.docx

《家谱管理系统.docx》由会员分享,可在线阅读,更多相关《家谱管理系统.docx(33页珍藏版)》请在冰豆网上搜索。

家谱管理系统.docx

家谱管理系统

 

洛阳理工学院

课程设计报告

课程名称___________________________________

设计题目___________________________________

专业___________________________________

班级___________________________________

学号___________________________________

姓名___________________________________

完成日期___________________________________

 

课程设计任务书

设计题目:

家谱管理系统

设计内容与要求:

【问题描述】:

实现具有下列功能的家谱管理系统

1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:

姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。

2).实现数据的存盘和读盘。

3).显示家谱。

4).按照出生日期查询成员名单。

5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

6).修改某成员信息。

【基本要求】:

界面要求:

有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

存储结构:

学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。

测试数据:

要求使用1、全部合法数据;2、局部非法数据。

进行程序测试,以保证程序的稳定。

测试数据及测试结果请在上交的资料中写明。

指导教师:

_______________

年月日

课程设计评语

 

成绩:

指导教师:

_______________

年月日

一、算法思想

本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找

、修改、以及保存家谱和读取家谱功能。

该系统分为以下几个模块,分别是:

创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。

本程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。

用多叉树来存储,就用用到多叉树的递归创建及递归遍历。

因为是多叉树,所以遍历时用广度优先搜索合适。

本函数最主要的思想就是递归调用,每个子函数中都会用到递归。

定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。

定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。

以下时算法思想流程图:

家谱管理系统

创建家谱

显示家谱

修改家谱

查找成员

读写家谱

按照姓名

按照生日

修改本人

修改父母

修改孩子

存盘

读盘

退出系统

二、模块划分

1.intmain():

主函数

2.voidCreatTree(TreeNode*Tree):

创建家族树

3.voidOutPutAll(TreeNode*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[],intlength):

输出按姓名查找到的家谱成员

10.voidOutPutMessage1(TreeNode*Tree,charbirth[],intlength):

输出按生日查找到的家谱成员

11.voidSaveFamily(TreeNode*root):

保存家谱

12.voidReadFamily(TreeNode**root):

读取家谱

三、数据结构

typedefstructTreeNode

{

intChildNum;//记录这个人拥有几个儿女

charName[20];//记录这个人的姓名

charbirthday[20];//生日

intmarriage;//婚否(1表示结婚,0表示没结婚)

intdeath;//生死(1表示活着,0表示过世)

charKind;//标示节点的种类有女G男B

charaddress[100];//住址

charlivemassage[50];//死亡日期(如果其已经死亡)

structTreeNode*NextNode[20];//记录这个人的儿女

structTreeNode*Parent;//记录这个节点的父节点

}TreeNode,*tree;

四、测试

第一组数据为:

爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代11个人。

其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。

爸爸,二叔,三叔为爷爷的子女。

爸爸的配偶是妈妈,爸爸的子女是我。

二叔的配偶是二婶,子女是姐姐。

三叔的的配偶是三婶,三叔的的子女是弟弟。

进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。

退出程序在进入程序时,进行读盘。

之后在进行其他操作,程序完成之后退出即可。

爷爷

爸爸

二叔

奶奶

三叔

妈妈

二婶

三婶

姐姐

弟弟

图1家族树

第一组数据测试截图为:

图2显示家谱

 

图3按照姓名查找家族成员

 

图4存盘

 

第二组数据为:

 

王老

王大

刘老

王二

李大

张二

王小一

王小二

图4王家家族树

第二组数据测试截屏为:

图5修改家族成员的信息

 

图6修改某个人的具体信息

 

图7按照生日查找某人

 

图8读盘

五、源程序

#include

#include

#include

#ifdefWIN32

#defineCLEARsystem("cls")

#defineTipForSaveFilePositionprintf("\t\t输入文件名及保存位置(eg:

D:

\\\\example.txt):

")

#defineTipForReadFilePositionprintf("\t\t文件名及其路径(eg:

D:

\\\\example.txt):

")

#else

#defineCLEARsystem("clear")

#defineTipForSaveFilePositionprintf("\t\t输入文件名及保存位置(eg:

/home/xiong/example.txt):

")

#defineTipForReadFilePositionprintf("\t\t文件名及其路径(eg:

/home/xiong/example.txt):

")

#endif

#definemaxFileNameLen50//保存的文件名的最大长度

intFLAG=0;

inta=1;

typedefstructTreeNode

{

intChildNum;//记录这个人拥有几个儿女

charName[20];//记录这个人的姓名

charbirthday[20];//生日

intmarriage;//婚否(1表示结婚,0表示没结婚)

intdeath;//生死(1表示活着,0表示过世)

charKind;//标示节点的种类有女G男B

charaddress[100];//住址

charlivemassage[50];//死亡日期(如果其已经死亡)

structTreeNode*NextNode[20];//记录这个人的儿女

structTreeNode*Parent;//记录这个节点的父节点

}TreeNode,*tree;

voidCreatTree(TreeNode*Tree);

voidOutPutAll(TreeNode*Tree);

voidMenue(TreeNode*Tree);

voidSubMenue1(TreeNode*Tree);

voidSubMenue2(TreeNode*Tree);

voidChange(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);

voidReadFamily(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;

charname[20];

charbirth[20];

while

(1)

{

system("cls");

printf("\t");

printf("\n\n\t\t**********欢迎使用家族管理系统**********\n\n");

printf("\n\t\tA:

输入家谱信息建立树");

printf("\n\t\tB:

输出整个家谱信息");

printf("\n\t\tC:

按出生日期查找某人");

printf("\n\t\tD:

按姓名查找某人");

printf("\n\t\tE:

修改某个人的信息");

printf("\n\t\tF:

存盘");

printf("\n\t\tG:

读盘");

printf("\n\t\tH:

退出整个程序\n\t");

c=getchar();

switch(c)

{

case'A':

TreeNode*NewNode;

NewNode=(TreeNode*)malloc(sizeof(TreeNode));

printf("\n\t请输入姓名:

");

scanf("%s",Tree->Name);

printf("\n\t请输入性别女G男B:

");

getchar();

scanf("%c",&(Tree->Kind));

Tree->Parent=NewNode;

Tree->Parent=NULL;//

CreatTree(Tree);//

printf("\n\t--------------家谱图已经建立成功---------------\n\n");

printf("\n\n\t--------------请按Enter键继续操作--------------");

getchar();

break;

case'B':

if(strcmp(Tree->Name,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}

printf("\n\n\t整个家谱的主要信息如下:

");

OutPutAll(Tree);

getchar();

break;

case'C':

if(strcmp(Tree->birthday,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}

printf("\n\t请输入你要查找的出生日期:

");

scanf("%s",birth);

OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);

printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t");

getchar();

break;

case'D':

if(strcmp(Tree->Name,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}

printf("\n\t请输入你要查找的人的姓名:

\n\t");

scanf("%s",name);

OutPutMessage(SearchTree(Tree,name,20),name,20);

printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t");

getchar();

break;

case'E':

if(strcmp(Tree->Name,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}

Change(Tree);

getchar();

break;

case'F':

if(strcmp(Tree->Name,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}

SaveFamily(Tree);

getchar();

break;

case'G':

/*if(strcmp(Tree->Name,"0")==0)

{

printf("\n\t家谱图的多叉树尚未建立请先建立树\n");

getchar();

break;

}*/

ReadFamily(&Tree);

getchar();

break;

case'H':

printf("\n\n\t-----------------本次服务到此结束------------------");

printf("\n\t------------------欢迎下次使用---------------------");

printf("\n\t----------------------谢谢-------------------------\n\n");

break;

case'\n':

break;

default:

printf("\n\n\t--------对不起!

你的选择不在服务范围之内!

-----------");

printf("\n\t-----------请您再次选择所需的服务项!

---------------");

printf("\n\t------------------谢谢------------------------\n\t");

getchar();

break;

}

if(c=='H'||c=='f')

break;

getchar();

}

}

voidCreatTree(TreeNode*Node)//创建树

{

inti;

TreeNode*NewNode;

NewNode=(TreeNode*)malloc(sizeof(TreeNode));

Node->NextNode[0]=NewNode;

Node->NextNode[0]=NULL;

printf("\n\t请输入出生日期:

");

scanf("%s",Node->birthday);

printf("\n\t请输入家庭住址:

");getchar();

scanf("%s",Node->address);

printf("\n\t请输入是否建在(1-是或0-否):

");

scanf("%d",&(Node->death));

if(Node->death==0)

{

printf("\n\t请输入去世日期:

");

scanf("%s",Node->livemassage);

}

elseif(Node->death=='1')

printf("\n\t仍然建在");

printf("\n\t请输入%s的配偶的姓名(输入0代表没结婚):

",Node->Name);

scanf("%s",NewNode->Name);

if(strcmp(NewNode->Name,"0")!

=0)

{printf("\t请输入配偶的出生日期:

");

scanf("%s",NewNode->birthday);

printf("\n\t请输入家庭住址:

");getchar();

scanf("%s",NewNode->address);

printf("\n\t请输入是否建在(1-是或0-否):

");

scanf("%d",&(NewNode->death));

if(NewNode->death==0)

{

printf("\n\t请输入去世日期:

");

scanf("%s",NewNode->livemassage);

}

elseif(NewNode->death=='1')

printf("\n\t仍然建在");}

printf("\n\t请输入%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')

NewNode->Kind='B';

else

NewNode->Kind='G';

NewNode->ChildNum=0;

NewNode->NextNode[0]=NULL;

Node->NextNode[0]=NewNode;

Node->NextNode[0]->Parent=Node;//孩子的父母

for(i=1;i<=Node->ChildNum;i++)

{

NewNode=(TreeNode*)malloc(sizeof(TreeNode));a++;

printf("\n\t请输入%s的第%d子女的名字:

",Node->Name,i);

scanf("%s",NewNode->Name);

printf("\n\t请输入%s的第%d子女的性别女G男B:

",Node->Name,i);

getchar();

scanf("%c",&NewNode->Kind);

NewNode->ChildNum=-1;

NewNode->Parent=Node;

Node->NextNode[i]=NewNode;

CreatTree(Node->NextNode[i]);//从子女的数目开始

}

}

voidOutPutAll(TreeNode*Tree)

{

inti,flag=0;

printf("\n\t---****---***---***---***---***---***---***---***---***---");

printf("\n\t姓名:

%s出生日期:

%s家庭住址:

%s性别:

%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);

if(Tree->Kind=='G'||Tree->Kind=='g')

{

flag=1;

printf("女");

}

else

printf("男");

printf("\t是否健在(1-健在,0-去世):

");

if(Tree->death==1)printf("1");

elseif(Tree->death==0)printf("0");

if(!

(Tree->NextNode[0]))

{

printf("\n\t至今没有配偶和子女\n");

return;

}

if(flag==1)

printf("\n\t丈夫姓名:

%s",Tree->NextNode[0]->Name);

else

printf("\n\t妻子姓名:

%s",Tree->NextNode[0]->Name);

printf("\t是否健在(1-健在,0-去世):

");

if(Tree->death==1)printf("1");

elseif(Tr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1