当前位置:文档之家› 家谱管理系统样本

家谱管理系统样本

家谱管理系统
一、需求分析
本系统实现以下功能:
1). 输入文件以存放最初家谱中各成员的信息。

成员的信息中均应包含以下内容:
姓名、出生日期、婚否、地址、健在否、死亡日期( 若其已死亡) 也
可附加其它信息、但不是必须的。

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

3). 以图形方式显示家谱。

4). 显示第n 代所有人的信息。

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

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

7). 输入两人姓名, 确定其关系。

8). 某成员添加孩子。

9). 删除某成员( 若其还有后代, 则一并删除) 。

10).修改某成员信息。

11).按出生日期对家谱中所有人排序。

12).打开一家谱时, 提示当天生日的健在成员。

测试要求:
1).建立至少30个成员的数据, 以较为直观的方式显示结果, 并提供文稿形式以便检查。

2).对界面的要求是: 有合理的提示, 每个功能能够设立菜单, 根据提示,
能够完成相关的功能要求。

二、设计概要
1、抽象数据类型兄弟孩子树的定义如下:
ADT CSNode{
数据对象: person是兄弟孩子树中的每一个节点, T是整个树的统一体
数据关系: R1={<person
i-1,person
i
>|<person
i-1
,person
i
>表示person
i-1
和person
i
之间有血缘关系}
基本操作:
CSNode *CreatTree(fstream &outfile);
初始条件: 已经打开了文本文件PersonInfo.txt
操作结果: 创立一个兄弟孩子树T, 并把从文件中的数据送到树中, 关闭文件。

void CreatParent_step(CSNode *parent);
初始条件: 兄弟孩子树T已经存在
操作结果: 对所有的孩子节点添加指向父亲的指针
void InOrderTraverse(CSNode *T);
初始条件: 兄弟孩子树T已经存在
操作结果: 对T进行中序遍历。

bool Today_Brithday(CSNode *T);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据计算机系统的时间判断几天是否有人过生日, 并显示她们的名字。

bool (int n,CSNode *T,LinkQueue &Q);
初始条件: 兄弟孩子树T已经存在, 队列Q也已经存在
操作结果: 用队列Q返回第N代人的所有信息
void Link_Info(LinkQueue Q);
初始条件: 队列Q中是第N代人的所有信息
操作结果: 显示队列中所有人的信息。

CSNode *DetectMember_Name(CSNode *T,char name[]);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据输入的姓名进行查找, 如找到则返回该节点的指针。

CSNode *DetectMember_BornDate(CSNode *T,Date date);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据输入的出生日期进行查找, 如找到则返回该节点的指针。

void OutputOneInfo(CSNode *T);
初始条件: 采集到一个节点T
操作结果: 显示这一个节点的所有信息。

void Output_Name_Relation(CSNode *T);
初始条件: 采集到一个节点T
操作结果: 显示这一个节点的父亲和孩子的所有信息。

void Delete_Member(CSNode *T,char name[]);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据输入的姓名进行查找, 如找到则删除该节点和她所有的孩子节点。

void Edit_Member_Info(CSNode *T,char name[]);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据输入的姓名进行查找, 如找到则根据用户要求修改相应的信息。

bool Add_New_Child(CSNode *T);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据输入的姓名进行查找, 如找到则在她的孩子树中添加新的孩子节点。

void InOrderInfile(CSNode *T,fstream &infile);
初始条件: 兄弟孩子树T已经存在, 且已经打开了文本文件PersonInfo.txt
操作结果: 把现在的数据读入文件中, 关闭文件。

bool Generation(CSNode *T,CSNode *child);
初始条件: 兄弟孩子树T已经存在
操作结果: 判断child是否是T的后代, 如果是返回true, 否则返回false。

void Output_Two_Member_Realtionship(CSNode *T,char name1[],char name2[]);
初始条件: 兄弟孩子树T已经存在
操作结果: 根据已经输入的两个姓名进行查找和判断, 确定她们的关系。

void InOrderIn(CSNode *T,CSNode S[],int &num);
初始条件: 兄弟孩子树T已经存在
操作结果: 对T进行中序遍历, 而且把每一个节点信息送到数组S中, num为S中成员个数。

void LineChars(CSNode S[],int num);
初始条件: 节点数组S已经存在
操作结果: 对数组的节点信息按照出生日期进行排序, 采用的是基数排

}ADT CSNode
2、抽象数据类型队列的定义如下:
ADT LinkQueue{
数据对象: D={e
i | i=1,2,3,…,n; n≧0; e
i
∈LinkQueue}
数据关系: R1={<e
i-1, e
i
>|<e
i-1
,e
i
>表示e
i-1
和e
i
之间有先后顺序关系}
基本操作:
bool InitQueue(LinkQueue &Q);
操作结果: 创立一个空的队列Q。

bool DestroyQueue(LinkQueue &Q);
初始条件: 队列Q存在
操作结果: 销毁队列Q, Q不再存在。

bool EnQueue(LinkQueue &Q,CSNode e);
初始条件: 队列Q存在
操作结果: 插入元素e为Q的新的队尾元素。

bool ClearQueue(LinkQueue &Q);
初始条件: 队列Q存在
操作结果: 清空队列Q。

bool QueueEmpty(LinkQueue Q);
初始条件: 队列Q存在
操作结果: 若队列为空, 则返回true, 否则返回false。

bool DeQueue(LinkQueue &Q,CSNode &e);
初始条件: 队列Q存在
操作结果: 删除Q的队头元素, 并用e返回其值, 并返回true。

int QueueLength(LinkQueue Q);
初始条件: 队列Q存在
操作结果: 返回队列Q的长度。

bool GetHead(LinkQueue Q,CSNode &e);
初始条件: 队列Q存在
操作结果: 用e返回队首元素, 并返回true。

} ADT LinkQueue
3、主程序
Void main()
{
打开文本文件PersonInfo.txt;
Do{接受命令( 对兄弟孩子树进行相关的操作的选项) ;
处理命令( 对兄弟孩子树进行相关的操作) ;
}while(”命令”! =”退出”);
}。

相关主题