- 21
- 0
- 约4.26千字
- 约 7页
- 2016-11-27 发布于河南
- 举报
家谱用于记录某家族历代家族成员的情况与关系本课程设
实习报告
题目: 家谱用于记录某家族历代家族成员的情况与关系。本课程设计要求设计并实现一个计算机软件,支持对家谱的存储、更新、查询、统计等操作。
一.需求分析
要求将家谱信息看作树形结构处理,并可存储在外存。数据可一次读入内存;
家庭成员信息存储:将每个家庭成员的基本信息存储在计算机中(可永久保存)。家庭成员的基本信息至少应包括:(姓名,出生地,出生日期,死亡日期,性别,身高,学历,职业,最高职务/职称,…);
家族关系存储:将各家庭成员之间的关系,存储在计算机中(可永久保存);
更新:家谱数据的更新(修改、删除、加入);
输出:将家谱以较友好的格式输出(显示);
查询:按基本信息查询成员,按亲戚关系查询;
统计:统计并打印(显示)结果,统计的项目有:平均寿命、平均身高、男女比例、家庭平均人口.
二.概要设计
1.设定栈的数据类型定义:
Stack{
数据对象:D={a|a属于familyTree};
数据关系:R1={a1,a2|a1,a2属于D};
基本操作:
Stack()
操作结果:构造一个空栈
~Stack()
初始条件:栈已存在;
操作结果:栈被销毁;
GetTop();
初始条件:栈已存在;
操作结果:若栈不空,返回栈顶元素;
Push(familyTree*);
操作结果:往栈顶加入一个元素;
Pop();
初始条件:栈已存在;
操作结果:若栈不空,则栈顶元素出栈;
Length();
操作结果:返回栈的元素数目;
GetBasePointer();
操作结果:返回栈底指针;
GetTopPointer();
操作结果:返回栈顶指针;
}Stack;
2.日期的定义:
struct date{
int year,month,day;
};
3.家谱树的结点定义:
struct familyTree
{ int number;
date birthday,deathday;
char name[20],birthAdress[10],sex[6],educationLevel[10],occupation[10];
double height;
familyTree *firstchild,*nextsibling,*father,*wife,*husband;
};
4.本程序包含三个基本模块.
1)main函数模块:这一模块主要实现操作界面;
2)栈模块:这一模块主要实现栈的操作;
3)主功能模块:该模块实现基本的建树,更新等操作;
5.建立二叉树的伪码算法:
While(从文本读入的不为空)
{
生成一个结点,把读入内容赋给它;
若已经读入过,刚搜寻其指针所在;
否则新生成的结点添加为上一结点的孩子;
}
三.详细设计
1.家谱树的主要结构:
class Family{
private:
familyTree *head;
//这是一个头结点,主要用来定位家谱树的根结点;
int length,totalNum;
//整型数length用来记录家谱中本姓的人口数;
//totalNum用来记录包括妻子在内的所有人口数;
public:
Family();
//构造函数,初始化整棵树;
~Family();
//析构函数,销毁整棵树;
void LoadFamilyTree();
//读取文本建树函数,用来从外存中读取信息,同时建立家谱树
//是整个程序的关键所在;
void ModifyInformation();
//修改家谱成员函数;
void AddMember();
//增加家谱成员函数;
void DeleteMember()
//删除家谱成员函数;;
void Save();
//保存对家谱的更新的存储函数;
void Show();
//用横向树在屏幕上输出家谱树函数;
void Traverse();
//遍历所有家谱成员函数;
void Inquire();
//查询成员资料函数;
void Statistics();
//统计函数;
protected:
void UpdateNumber();
//更新序号函数,用于更新树之后成员序号的重定位;
int NumberOfChild(familyTree *);
//计算成员的孩子数目;
familyTree * Search();
//定位成员结点在内存中的位置;
void DeleteNode(familyTree*);
//删除一结点
};
2.实现过程:该问题最主要难点在于如何建立一棵家谱二叉树.联想到在课程中学习的用先
原创力文档

文档评论(0)