1 需求分析
1.1任务与分析
1.建立输入文件以存放最刜家谱中各成员的信息。
2.成员的信息中均应包含以下内容: 姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡) 也可附加其它信息、但不是必需的。
3.能对修改后的家谱存盘以备以后使用。
4.能从文件中读出已有的家谱,形成树状关系。 5.家谱建立好之后,以图形方式显示出来。 6.显示第n 代所有人的信息。
7.按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 8.按照出生日期查询成员名单。 9.输入两人姓名,确定其关系。 10.给某人添加孩子。
11.删除某人(若其还有后代,则一并删除)。 12.修改某人信息。 13.用括号法输出家谱成员信息
1.2测试数据
1 徐朝嬴 m 1938-1-20 1 彭代芳 0 此人相当的热心 0 2 3 4 5 10000
2 徐廷文 m 1964-8-3 2 李太群 1 此人相当有责任心 0 6 7 10000
3 徐素华 w 1966-4-6 2 李奉光 1 此人很好 0 10000
4 徐军华 m 1969-7-8 2 曲舞 1 此人很有正义感 0 10000
5 徐廷国 m 1972-9-2 2 木玛 1 此人心的很善良 0 10000
6 徐光勇 m 1989-1-27 3 Nomarry 2 此人很牛逼 0 10000
7 徐光超 m 1992-9-5 3 Nomarry 2 此人亦很牛逼 0 10000
2 概要设计
2.1 ADT描述 1.ADT Person{
数据对象:D={Pj | Pj={姓名、出生日期、婚否、地址、健在否(如过世,还应有其死亡日 期)},j=0,1,2,…… n,其中n>=0}
数据关系:R={} 基本操作: 无。 }ADT Person
2.ADT FamilytreeFile{
数据对象:D={Aj | Aj 属于 Person,j=1,2,3,……,n 其中n>=1} 数据关系:D 中每个对象用换行符隔开, R={ | Aj 属于D,j=1,2,3,……,n 其中n>=1,String 属于字符串类型,为 Aj 父亲姓名(若String=-1,Aj 无父亲,若String=Aj 的姓名,表示家谱文件结束)}
基本操作: 1. 打开家谱类型文件,并建立兄弟、孩子二叉树。 2. 从内存中读取兄弟、孩子二叉树,并建立家谱类型文件。 }
ADT FamilytreeFlie
3.ADT Familytree{
数据对象:D={Aj | Aj 属于Person,j=1,2,3,……,n 其中n>=0} 数据关系:V={ | Aj-1,Aj 属于D,j=2,3,……,n 其中n>=2,且Aj-1 与Aj 为祖先与 后 代关系(parent)、后代与祖先关系(child)、兄弟之间关系(sibling)}
基本操作: 1. 显示某人信息。 2. 修改某人信息。 3. 增加某人孩子。 4. 删除某人。 5. 通过某人查找其双亲、孩子、兄弟。
}ADT Familytree
2.2程序模块结构
2.2.1 结构体定义
struct People //定义结构体People {
int num;
char name[20]; char sex;
char borndate[15]; int generation; char matename[20]; int parent;
char infor[100]; LinkList child; };
struct Node //{
int a;
struct Node * next; };
struct LinkList //{
NodePoint La; };
struct Tree //{
PeoplePoint Tr; int Length;
int TREE_INIT_SIZE; };
定义结构体Node 定义链表 定义树
2.3 各功能模块
全部功能模块 查找功能模块 添加成员模块 修改婚姻信息 退出程序模块 新建家谱模块 读取家谱模块 保件存读家取谱文模件块读 输出成员模块 void PrintPeople(PeoplePovoid AddPeople(Tree &TR)void MarryChange(Tree TR,cExit(1) void InitTree(Tree &TR)void Open(Tree &TR); void Save(Tree TR); void PrintTree(Tree TR); void InitTree(Tree &TR); //在树已定义的情况下,初始化树TR
LinkList InitLinkList(void); //在什么都没有的情况下,初始化一个带头结点的链表并返回链表L
void AddLinkList(LinkList p); //对带头结点的链表pl,添加一个节点为m的节点在表头 void CreatFamilyTree(Tree &TR); //在什么都没有的情况下,创建一个家谱TR。并返回TR void PrintPeople(PeoplePoint p); // 已知某节点的指针p,输出people p 的相关信息
void PrintLinkList(LinkList p); //已知链表p,输出链表p中的信息
int CompareNum(PeoplePoint p,int num); //已知某节点的指针p和一个编号num,比较p的num和num,如果相等返回1,否则返回0
int CompareName(PeoplePoint p,char a[]);//已知某节点的指针p和一个姓名a,比较p的name,如果两者相等返回1,否则返回0 void TraveTreePrint(Tree TR); //已知树TR,按规定输出节点信息,根据编号、姓名、孩子输出
void AddPeople(Tree &TR); //已知树TR,当有人出生时,添加一个节点