家谱用于记录某家族历代家族成员的情况与关系本课程设

上传人:宝路 文档编号:23761273 上传时间:2017-12-03 格式:DOC 页数:7 大小:50.50KB
返回 下载 相关 举报
家谱用于记录某家族历代家族成员的情况与关系本课程设_第1页
第1页 / 共7页
家谱用于记录某家族历代家族成员的情况与关系本课程设_第2页
第2页 / 共7页
家谱用于记录某家族历代家族成员的情况与关系本课程设_第3页
第3页 / 共7页
家谱用于记录某家族历代家族成员的情况与关系本课程设_第4页
第4页 / 共7页
家谱用于记录某家族历代家族成员的情况与关系本课程设_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《家谱用于记录某家族历代家族成员的情况与关系本课程设》由会员分享,可在线阅读,更多相关《家谱用于记录某家族历代家族成员的情况与关系本课程设(7页珍藏版)》请在金锄头文库上搜索。

1、实习报告题目: 家谱用于记录某家族历代家族成员的情况与关系。本课程设计要求设计并实现一个计算机软件,支持对家谱的存储、更新、查询、统计等操作。一.需求分析1) 要求将家谱信息看作树形结构处理,并可存储在外存。数据可一次读入内存;2) 家庭成员信息存储:将每个家庭成员的基本信息存储在计算机中(可永久保存) 。家庭成员的基本信息至少应包括:(姓名,出生地,出生日期,死亡日期,性别,身高,学历,职业,最高职务/ 职称, ) ;3) 家族关系存储:将各家庭成员之间的关系,存储在计算机中(可永久保存) ;4) 更新:家谱数据的更新(修改、删除、加入) ;5) 输出:将家谱以较友好的格式输出(显示) ;6

2、) 查询:按基本信息查询成员,按亲戚关系查询;7) 统计:统计并打印(显示)结果,统计的项目有:平均寿命、平均身高、男女比例、家庭平均人口.二.概要设计1.设定栈的数据类型定义:Stack数据对象:D=a|a 属于 familyTree;数据关系:R1=|a1,a2 属于 D;基本操作:Stack()操作结果:构造一个空栈Stack()初始条件:栈已存在;操作结果:栈被销毁;GetTop();初始条件:栈已存在;操作结果:若栈不空,返回栈顶元素;Push(familyTree*);操作结果:往栈顶加入一个元素;Pop();初始条件:栈已存在;操作结果:若栈不空,则栈顶元素出栈;Length()

3、;操作结果:返回栈的元素数目;GetBasePointer();操作结果:返回栈底指针;GetTopPointer();操作结果:返回栈顶指针;Stack;2.日期的定义:struct dateint year,month,day;3.家谱树的结点定义:struct familyTree int number;date birthday,deathday;char name20,birthAdress10,sex6,educationLevel10,occupation10;double height;familyTree *firstchild,*nextsibling,*father,*w

4、ife,*husband;4.本程序包含三个基本模块.1)main 函数模块 :这一模块主要实现操作界面;2)栈模块 :这一模块主要实现栈的操作;3)主功能模块:该模块实现基本的建树,更新等操作 ;5.建立二叉树的伪码算法:While(从文本读入的不为空 )生成一个结点,把读入内容赋给它;若已经读入过,刚搜寻其指针所在;否则新生成的结点添加为上一结点的孩子;三.详细设计1.家谱树的主要结构:class Familyprivate:familyTree *head;/这是一个头结点,主要用来定位家谱树的根结点;int length,totalNum;/整型数 length 用来记录家谱中本姓的人

5、口数;/totalNum 用来记录包括妻子在内的所有人口数;public:Family();/构造函数,初始化整棵树;Family();/析构函数,销毁整棵树;void LoadFamilyTree();/读取文本建树函数,用来从外存中读取信息,同时建立家谱树/是整个程序的关键所在;void ModifyInformation();/修改家谱成员函数;void AddMember();/增加家谱成员函数;void DeleteMember()/删除家谱成员函数;void Save();/保存对家谱的更新的存储函数;void Show();/用横向树在屏幕上输出家谱树函数;void Traver

6、se();/遍历所有家谱成员函数;void Inquire();/查询成员资料函数;void Statistics();/统计函数;protected:void UpdateNumber();/更新序号函数,用于更新树之后成员序号的重定位;int NumberOfChild(familyTree *);/计算成员的孩子数目;familyTree * Search();/定位成员结点在内存中的位置;void DeleteNode(familyTree*);/删除一结点;2.实现过程:该问题最主要难点在于如何建立一棵家谱二叉树 .联想到在课程中学习的用先序递归来生成二叉树的做法,于是先确定建树方法

7、为先序建树.具体伪码算法如下所述:1)成员信息分两个文本存储.文本一是用根叶序列记录成员之间关系.如下:0 1 20 1 3 40 5该序列表示 1 和 5 是 0 的孩子,而 2 和 3 都是 1 的孩子,依次类推,文本一是建树用,故没有包含妻子;文本二用于保存每个成员的具体资料,如身高,出生地址,出生年月等资料,包括了妻子的资料;2)建树的实现:/两个读入流:instuf1,instuf2;/先读取文本一的信息,文本一包含的成员的序号 num;length 初始为 0;While(instuf1num)If(num=0) p=head;/ 记录指针 p 指向 head;If(num=len

8、gth)生成一个新结点 q;若 p 的左子树为空,则 q 为 p 的左子树;否则 q 为 p 的左子树的右子树,即为 p 的第一个孩子的兄弟;ElseNum 已经读入过一次以上,不用再生成新结点只需把记录指针 p 指向该 num 所在结点;由于使用了 num 进行比较,省去了每次读入都须对原来结点进行检查以确定结点是否存在的工作,因而提高了效率;3)树型输出的实现:为实现在非 GUI 环境下的树型结构输出,输入不能使用 GUI 控件,因而我选择了横向输出家谱树.通过仔细分析用栈进行先充遍历家谱树的过程,我发现每当一个叶子结点进栈时,从栈底到栈顶正好是前面所说的根叶序列的排列.由此我把常的栈改写

9、成可以横向输出树的结构.伪码算法如下:/p 为祖先结点Do while(p!=NULL)S.push(p);P=p-firstchild; /p 指向其孩子;If(s.length!=0) /栈不为空时if(s.GetTop()-firstchild=NULL)/判断是否为叶子结点 ;由栈底到栈顶输出各元素的名字,即为树型结构的一个分支S.pop();P=p-nextsibling;while(P!=null&S.length!=0);4)删除结点的实现:由于家谱树删除一个成员的话,该成员的孩子也将被删除,所以不能直接删除一个结点,应先删除他的子孙结点,这样才能正确的释放内存.同时考虑到每次删

10、除都是一样的操作,故可用递归函数来实现!实现伪码如下:DeleteNode(familyTree *t) 如果 t 有孩子 DeleteNode(t-firstchild);如果 t 有兄弟 DeleteNode(t-nextsibling);如果 t 有妻子,则删除妻子;删除 t;家谱人口数减 1;5)异常处理 :由于本程序要多次需要用户输入选择,所以可能会出现需要整型数 ,而用户输入的却是字符,要求输入的是一个字符 ,而用户输入一串字符的情况 ,这些情况都会造成程序的死循环,必须得解决.本程序先声明一个字符串,然后再判断用户的输入长度是否为 1,否的话则异常警告,若字符串长度为 1,再判断

11、该字符串的字符是否为程序所要的,否的话也异常警告.具体实现如下:Char *choice;Cinchoice;If(strlen(choice)!=1)抛出异常警告;ElseIf(*choice 不在程序的选择范围内)抛出异常警告;Else 接收输入;6)查询信息 :查询功能是本程序中不够完整的一部分,只提供了序号查询与姓名查询,没有其他同学的程序那样还提供学历查询,出生查询等功能.这是因为考虑到这些查询都是姓名查询的改版,实现起来没有多大的实际意义.本程序提供了按亲戚关系查询,用户可以先定位一个成员,之后可以查询该成员的父亲,妻子,孩子,兄弟等家属.7)程序的开始:本程序提供了新建家谱和从硬

12、盘读入家谱两种功能.用户可以在操作中新建一个家谱,也可以读入已保存的现有家谱.8)数据的保存:程序中对家谱的修改是可以保存到外存即硬盘上的.这一操作通过写文件来实现.由于程序是用根叶序列在硬盘上保存信息的,所以用户只要打开保存的文本文档,就可以很清楚的阅览家谱信息.9)程序中使用的栈:本程序没有使用 C+提供的模板,而是用了自己写的一个链栈.尽管用名空间中的栈非常方便,但是考虑到数据结构大作业本身就是让我们学会写基本类库,所以我还是自己写了一个栈.四.总结体会:1.程序中需要的改进:1)本程序只是实现所要求的基本要求与增强要求,没有实现扩展要求.这是一个不足.同时每次查找都要用到先序栈遍历,效

13、率比较低;2)用户界面不够友好,用户在操作上不够方便.2.体会:做这个大作业用了我几个星期的时间,这段时间每天都在研究程序的算法,功能的实现,现在对数据结构有了更深的认识.首先,数据结构无愧于计算机的灵魂所在.现在我所遇到的每一个程序,如果想优化的实现的话,都离不开数据结构.比如我最近做一个聊天室这样的软件,服端对每一个客户端的监控就是要用到队列.这样才能对每个客户端实现实时管理.其次,数据结构是其它一切计算机课的基础,这个说法在我这个学期所学的课程中得到验证.我这个学期所学的计算机组成,编译原理都离不开数据结构这基础.每付出一份努力,都必会有一份收获.虽然做这个大作业让我苦苦的熬了多少个不眠夜,但是却让我深深的喜欢上编程这样一个表面枯燥实现上乐趣无穷的工作!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号