




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、洛 阳 理 工 学 院课 程 设 计 报 告 数据结构课程设计课程名称 _家谱管理系统设计题目 _计算机科学与技术专 业 _B150405班 级 _B15080822学 号 _宋士龙姓 名 _2016年12月30日完成日期 _课 程 设 计 任 务 书设计题目:家谱管理系统设计内容与要求:【问题描述】:实现具有下列功能的家谱管理系统1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2). 实现数据的存盘和读盘。3). 显示家谱。4). 按照出生日期查询成员名单。5). 按照姓名
2、查询,输出成员信息(包括其本人、父亲、孩子的信息)。6). 修改某成员信息。【基本要求】:界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明。 指导教师:_ 年 月 日课 程 设 计 评 语 成绩: 指导教师:_ 年 月 日洛 阳 理 工 学 院 课 程 设 计 报 告一、 算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找、修改、
3、以及保存家谱和读取家谱功能。该系统分为以下几个模块,分别是:创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。本程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因为是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思想就是递归调用,每个子函数中都会用到递归。定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。以下时算法思想流程图:家谱管理系统创建家谱显示家谱修
4、改家谱查找成员读写家谱按照姓名按照生日修改本人修改父母修改孩子存盘读盘退出系统二、 模块划分1. int main():主函数2. void 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
5、 name,int length):按照姓名查找家谱成员8. TreeNode * SearchTree1(TreeNode *Tree,char 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
6、ReadFamily(TreeNode *root):读取家谱三、 数据结构typedef struct TreeNode int ChildNum; /记录这个人拥有几个儿女 char Name20;/记录这个人的姓名 char birthday20;/生日int marriage;/婚否(1表示结婚,0表示没结婚)int death;/生死(1表示活着,0表示过世) char Kind;/标示节点的种类有女G男B char address100;/住址 char livemassage50;/死亡日期(如果其已经死亡) struct TreeNode *NextNode20; /记录这个人
7、的儿女 struct TreeNode *Parent; /记录这个节点的父节点 TreeNode,*tree;四、 测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代11个人。其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的配偶是二婶,子女是姐姐。三叔的的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后退出即可。爷爷爸爸二叔奶奶三叔妈妈二婶三婶我姐姐
8、弟弟 图1 家族树第一组数据测试截图为:图2 显示家谱图3 按照姓名查找家族成员图4 存盘第二组数据为:王老王大刘老王二李大张二王小一王小二图4 王家家族树第二组数据测试截屏为:图5 修改家族成员的信息图6 修改某个人的具体信息图7 按照生日查找某人图8 读盘五、 源程序#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32#define CLEAR system("cls")#define TipForSaveFilePosition printf(
9、"tt输入文件名及保存位置(eg: D:example.txt): ")#define TipForReadFilePosition printf("tt文件名及其路径(eg: D:example.txt): ")#else#define CLEAR system("clear")#define TipForSaveFilePosition printf("tt输入文件名及保存位置(eg: /home/xiong/example.txt): ")#define TipForReadFilePosition prin
10、tf("tt文件名及其路径(eg: /home/xiong/example.txt): ")#endif#define maxFileNameLen 50 /保存的文件名的最大长度int FLAG=0;int a=1; typedef struct TreeNode int ChildNum; /记录这个人拥有几个儿女 char Name20;/记录这个人的姓名 char birthday20;/生日int marriage;/婚否(1表示结婚,0表示没结婚)int death;/生死(1表示活着,0表示过世) char Kind;/标示节点的种类有女G男B char ad
11、dress100;/住址 char livemassage50;/死亡日期(如果其已经死亡) struct TreeNode *NextNode20; /记录这个人的儿女 struct TreeNode *Parent; /记录这个节点的父节点 TreeNode,*tree; void CreatTree(TreeNode *Tree); void OutPutAll(TreeNode *Tree); void Menue(TreeNode *Tree); void SubMenue1(TreeNode * Tree); void SubMenue2(TreeNode *Tree); void
12、 Change(TreeNode * Tree); void AddNew(TreeNode * Tree); TreeNode * SearchTree(TreeNode *Tree,char name,int length); TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) ; void OutPutMessage(TreeNode * Tree,char name,int length); void OutPutMessage1(TreeNode * Tree,char birth,int length); voi
13、d SaveFamily(TreeNode *root); void ReadFamily(TreeNode *root); int main()/主函数 TreeNode *Tree;/TreeNode *Tree1; /Tree1=&(*Tree); Tree=(TreeNode *)malloc(sizeof(TreeNode); Tree->Parent =NULL; strcpy(Tree->Name,"0"); Menue(Tree); return 0; void Menue(TreeNode *Tree)/输出主菜单 /*TreeNode
14、 *Tree1; Tree1=&Tree;*/ char c; char name20;char birth20;while(1) system("cls"); printf("t"); printf("nntt*欢 迎 使 用 家 族 管 理 系 统*nn");printf("ntt A:输入家谱信息建立树 "); printf("ntt B:输出整个家谱信息 "); printf("ntt C:按出生日期查找某人 "); printf("ntt D:按姓
15、名查找某人 "); printf("ntt E:修改某个人的信息 ");printf("ntt F:存盘 ");printf("ntt G:读盘 "); printf("ntt H:退出整个程序 nt"); c=getchar();switch(c) case 'A': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf("nt请输入姓名:"); scanf("%s&qu
16、ot;,Tree->Name); printf("nt请输入性别女G男B:"); getchar(); scanf("%c",&(Tree->Kind);Tree->Parent=NewNode; Tree->Parent=NULL;/ CreatTree(Tree); / printf("nt-家谱图已经建立成功-nn"); printf("nnt-请按Enter键继续操作-"); getchar(); break; case 'B': if(strcmp(Tree
17、->Name,"0")=0) printf("nt家谱图的多叉树尚未建立请先建立树n"); getchar(); break; printf("nnt整个家谱的主要信息如下:"); OutPutAll(Tree); getchar(); break; case 'C': if(strcmp(Tree->birthday,"0")=0) printf("nt家谱图的多叉树尚未建立请先建立树n"); getchar(); break; printf("nt请输入
18、你要查找的出生日期:"); scanf("%s",birth); OutPutMessage1(SearchTree1(Tree,birth,20),birth,20); printf("nnt-*-*-*-*-*-*-*-*-*-*-nt"); getchar(); break; case 'D': if(strcmp(Tree->Name,"0")=0) printf("nt家谱图的多叉树尚未建立请先建立树n"); getchar(); break; printf("n
19、t请输入你要查找的人的姓名:nt"); scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20); printf("nnt-*-*-*-*-*-*-*-*-*-*-nt"); getchar(); break; case 'E':if(strcmp(Tree->Name,"0")=0) printf("nt家谱图的多叉树尚未建立请先建立树n"); getchar(); break; Change(Tree);
20、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) printf("nt家谱图的多叉树尚未建立请先建立树n"); getchar(); break; */ReadFamil
21、y(&Tree);getchar();break; case 'H': printf("nnt-本次服务到此结束-"); printf("nt-欢迎下次使用-");printf("nt-谢谢-nn");break;case 'n':break; default: printf("nnt-对不起!你的选择不在服务范围之内!-"); printf("nt-请您再次选择所需的服务项!-"); printf("nt-谢谢-nt");getcha
22、r(); 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请输入出生日期:"); scanf("%s",Node->birthday); prin
23、tf("nt请输入家庭住址:");getchar(); scanf("%s",Node->address); printf("nt请输入是否建在(1-是或0-否):"); scanf("%d",&(Node->death);if(Node->death=0) printf("nt请输入去世日期:"); scanf("%s",Node->livemassage); else if(Node->death='1') print
24、f("nt仍然建在");printf("nt请输入%s的配偶的姓名(输入0代表没结婚):",Node->Name); scanf("%s",NewNode->Name); if(strcmp(NewNode->Name,"0")!=0)printf("t请输入配偶的出生日期:");scanf("%s",NewNode->birthday); printf("nt请输入家庭住址:");getchar();scanf("%s&
25、quot;,NewNode->address);printf("nt请输入是否建在(1-是或0-否):"); scanf("%d",&(NewNode->death); if(NewNode->death=0) printf("nt请输入去世日期:"); scanf("%s",NewNode->livemassage); else if(NewNode->death='1') printf("nt仍然建在");printf("nt请
26、输入%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&
27、#39; 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子女的名字:",Node->Name,i); scanf("%s",NewNode->Na
28、me); 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(TreeNode *Tree) int i, flag=0;printf("nt-*-
29、*-*-*-*-*-*-*-*-");printf("nt姓名:%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-&
30、gt;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); else printf("nt妻子 姓名:%s",Tree->NextNode0->Name);printf("t
31、是否健在(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->Name,Tree->NextNodei->birthday,Tree->NextNodei->address,T
32、ree->NextNodei->Kind); if (Tree->NextNodei->Kind='G'|Tree->NextNodei->Kind='g') printf("女"); else printf("男");printf("t是否健在(1-健在,0-去世):"); if(Tree->death=1) printf("1"); else if(Tree->death=0) printf("0"); prin
33、tf("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; else FLAG=0; return Tree; if(Tree->NextNode0=NULL) return NULL; for(i=0;
34、i<=Tree->ChildNum;i+) if (i=0) NewNode=SearchTree(Tree->NextNodei,name,0); else NewNode=SearchTree(Tree->NextNodei,name,20); if (NewNode!=NULL) return NewNode; return NULL; void OutPutMessage(TreeNode * Tree,char name,int length) int flag=0,i; TreeNode *NewNode; printf("nnt-*-*-*-*-
35、*-*-*-*-*-*-"); if(Tree=NULL) printf("nnt*该家谱图中没有%s这个人的信息请确认是否输入错误*n",name); return; printf("nnt您所要找的人已经找到信息如下所示:"); printf("nnt姓名:%s出生日期:%s 家庭住址:%s 性别:%c",name,Tree->birthday,Tree->address,Tree->Kind); if (Tree->Kind='G'|Tree->Kind='g
36、9;) flag=1; /标记他(她)的性别 printf("女"); else printf("男");printf("t是否健在(1-健在,0-去世):");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0"); NewNode=Tree->Parent; if (FLAG=1) if(flag=1) printf("nnt她是嫁入此家族的所以亲生父母信息不在家谱内包括"); p
37、rintf("nt丈夫 姓名:%s",NewNode->Name); else printf("nnt他是入赘此家族的所以亲生父母信息不在家谱内包括"); printf("nt妻子姓名:%s",NewNode->Name); if (NewNode->ChildNum)>0) /判断他(她)是否有孩子 printf("nt的孩子的信息如下:"); /输出他(她)的孩子的信息for(i=1;i<=NewNode->ChildNum;i+) printf("nt姓名:%s
38、性别:",NewNode->NextNodei->Name);if (NewNode->NextNodei->Kind='G'|NewNode->Kind='g') printf("女"); else printf("男");printf("t是否健在(1-健在,0-去世):"); if(Tree->death=1) printf("1"); else if(Tree->death=0) printf("0");
39、 return; if(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息 printf("nt是这个家谱图里最年长的人",name); else if (NewNode->Kind='G'|NewNode->Kind='g') /判断父亲节点是父亲还是母亲 printf("nt母亲 姓名:%s",NewNode->Name);/输出他(她)的父母亲的信息 printf("nt父亲 姓名:%s",NewNode->NextNode0->Name);
40、else printf("nt母亲 姓名:%s",NewNode->NextNode0->Name); printf("nt父亲 姓名:%s",NewNode->Name); if(Tree->NextNode0!=NULL) /判断他(她)是否有配偶 if(flag=1)/输出他(她)的配偶的信息 printf("nt丈夫 姓名:%s",Tree->NextNode0->Name); else printf("nt妻子 姓名:%s",Tree->NextNode0->
41、;Name); if (Tree->ChildNum>0) /判断他(她)是否有孩子 printf("nt的孩子的信息如下:"); /输出他(她)的孩子的信息 for(i=1;i<=Tree->ChildNum;i+) printf("nt姓名:%s 性别:",Tree->NextNodei->Name); if (Tree->NextNodei->Kind='G'|Tree->Kind='g') printf("女"); else printf(&
42、quot;男");printf("t是否健在(1-健在,0-去世):"); if(Tree->death=1) printf("1"); else if(Tree->death=0) printf("0"); else printf("nt%s至今还没有孩子",name); else printf("nt%s至今还没有配偶和孩子n",Tree->Name); TreeNode * SearchTree1(TreeNode *Tree,char birth,int le
43、ngth) int i; TreeNode *NewNode; if(strcmp(Tree->birthday,birth)=0) if(length=0) FLAG=1; else FLAG=0; return Tree; if(Tree->NextNode0=NULL) return NULL; for(i=0;i<=Tree->ChildNum;i+) if (i=0) NewNode=SearchTree1(Tree->NextNodei,birth,0); else NewNode=SearchTree1(Tree->NextNodei,birt
44、h,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这个人的信息请确认是否输入错误*n",birth); return; printf("nnt您所要找的人
45、已经找到信息如下所示:"); printf("nnt姓名:%s出生日期:%s 家庭住址:%s 性别:%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind); if (Tree->Kind='G'|Tree->Kind='g') flag=1; /标记他(她)的性别 printf("女"); else printf("男"); void Change(TreeNode * Tree) /修改某个人的信息
46、char name20; TreeNode * NewNode; printf("nt请输入你要修改的人的姓名:nt"); scanf("%s",name); NewNode=SearchTree(Tree,name,20); if(NewNode=NULL) printf("nnt*该家谱图中没有%s这个人的信息请确认是否输入错误*n",name); return; else SubMenue1(NewNode); void SubMenue1(TreeNode * Tree) /输出副菜单 char c; int flag,i;
47、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:修改父母的信息-*-*-*-*-*-*- "); prin
48、tf("nt-*-*-*-C:修改子女的信息-*-*-*-*-*-*- "); printf("nt-*-*-*-D:退出-*-*-*-*-*-*-*-*-*-nt"); c=getchar(); switch(c) case 'A': printf("nnt请输入修改的姓名:如果不需要修改就输入0然后按Enter键继续nt"); scanf("%s",name); if(strcmp(name,"0")!=0) strcpy(Tree->Name,name); print
49、f("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("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个人信息修改成功")
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌核心价值的建立试题及答案
- 监狱法及试题答案
- 如何在纺织考试中进行高效记忆试题及答案
- 广告设计师商业价值评估试题及答案
- 知识点梳理纺织设计师试题及答案
- 公司应聘测试题及答案
- 助理广告师考试2024年潜力挖掘试题及答案
- 2024年中国纺织行业的生态转型试题及答案
- 2024年设计师考试作品创作流程概述试题及答案
- 2024年纺织品设计中的市场反馈考题及答案
- 拨叉加工工艺及夹具设计毕业设计
- (高清版)TDT 1015.1-2024 地籍数据库 第1部分:不动产
- 幼小衔接 每日一练
- 哈尔滨市木兰县文职辅警招聘考试真题
- 室上速心动过速治疗
- 铸就数字坚盾:网络安全技术智慧树知到期末考试答案章节答案2024年青岛工学院
- 芦丁鸡怎么养
- 幽门螺杆菌预防措施及治疗
- MOOC 近世代数-南京大学 中国大学慕课答案
- 烟草行业安全风险分级管控和事故隐患排查治理双重预防机制
- 毕业设计论文《10t单梁桥式起重机的设计》
评论
0/150
提交评论