数据结构家谱管理系统
- 格式:doc
- 大小:118.50 KB
- 文档页数:56
《项目实训二》
项目名称 __ 家谱管理系统__
姓 名 __ ___________
班 级 __ _______________
学 号 __ ________________ 指导教师 __ __________ __
问题描述: 家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。实现对家庭成员信息的建立、查找、插入、修改、增加、删除、更新、统计等等功能。
目的和要求: 目的: 1、 能根据具体问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2、 提高程序设计和调试能力。通过上机学习,验证自己设计的算法的正确性。学会有效利用基本调试方法。 3、 初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4、 培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
要求: 用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。支持对家谱的增加,删除,更新,统计等。
软件环境: Microsoft Visual Studio 2010 流程设计: 开始
Main函数 Menu函数 FamilyTree函数 Getroot函数 Case 1 Case 2 Case 3 Case 4 Case 5 Case 6 Case 7 Case 8 Case 9 Case10 defeau结束
Creat函数 递归调用 Menu函数
PreOrder函数 InOrder函数 PostOrder函数
Generation函数 NumberOfPeople函数 LifeNum函数
Message函数 AddNewPeople函数DeletePeople函数 SetNewName函数 FindChild函数 SaveToFile函数 FileToFamilyTree函数 递归调用 递归调用 递归调用 PrintMessage函数 SetNode函数 PreFindFather函数 PreFindBrother函数 PreFindFather函数 PreFindBrother函数 PrintMessage函数 模块划分: 1、 统计模块 (1) 统计家族总人数、健在人数、几代人 (2) 主要函数: int Generation(Node *root); //这个家族共有几代人 int NumberOfPeople( ); //家族的总人数 int LifeNum( ); //健在人数 (3) 实现方法:静态成员变量 (4) 实现结果:
2、 更新模块 (1) 创建家谱、增加成员、删除成员、成员改名 (2) 主要函数: Node* Creat( ); //构造函数调用 void AddNewPeople(Node *root,string FatherName,string NAme); //增加新的家族成员 int DeletePeople(Node *root,string FatherName,string Deletepeople); //删除家族成员 int SetNewName(Node *root,string NAme,string NewName); //更改姓名 (3) 实现方法:创建家谱和成员改名主要通过递归调用;增加成员和删除成员主要通过栈的非递归调用。 (4) 实现结果:
3、 查询模块 (1) 查询成员详细信息、查询成员的孩子以及孩子的详细信息 (2) 主要函数: int Message(Node *root,string Name); //显示该成员的基本信息 int FindChild(Node *root,string NAme); //显示孩子信息 (3) 实现方法:通过递归调用,找到成员,输出相应的信息 (4) 实现结果:
4、 显示模块 (1) 前序、中序、后序遍历家谱 (2) 主要函数: void PreOrder(Node *root); //前序递归遍历输出家谱 void InOrder(Node *root); //中序递归遍历输出家谱 void PostOrder(Node *root); //后序递归遍历输出家谱 (3) 实现方法:递归遍历 (4) 实现结果: 5、 文件模块 (1) 保存到文件、从文件读取 (2) 主要函数: void SaveToFile(Node *root); //保存到文件 void FileToFamilyTree( Node *root) ; //从文件中读取 (3) 实现方法:文件流 (4) 实现结果: 数据结构实现: 1、 生日结构体 struct BirthDay { int year; int month; int day; friend istream& operator>>(istream &is,BirthDay &b); friend ostream& operator<<(ostream &os,const BirthDay &b); };
2、 信息结构体(家族成员的基本信息) struct Information { string name; //姓名 string birthPlace; //出生地 BirthDay birthDay; //生日 string sex; //性别 string education; //学历 string job; //工作 string father; //父亲 string spouse; //配偶 char life; //是否健在 };
3、 二叉树结点结构体 struct Node { Information data; //个人信息 Node* child; //第一个孩子 Node* brother; //兄弟 };
4、 家谱类(二叉树结构、左孩子,右兄弟) class FamilyTree { private: Node* root; Node* Creat( ); //构造函数调用 void Release(Node *root); //析构函数调用 static int Numberofpeople; //计算总人数,NumberOfPeople()调用 static int LifePeopele; //计算健在人数,LifeNum()调用 public: FamilyTree(); //构造函数,初始化一棵树,其前序序列由键盘输入 ~FamilyTree(); //析构函数,释放链表中各结点的存储空间 void SetNode(Node *root); //设置结点信息 Node* Getroot(); //获取根结点 void PreOrder(Node *root); //前序递归遍历输出家谱 void InOrder(Node *root); //中序递归遍历输出家谱 void PostOrder(Node *root); //后序递归遍历输出家谱 int Generation(Node *root); //这个家族共有几代人 int NumberOfPeople( ); //家族的总人数 int LifeNum( ); //健在人数 void PrintMessage(Node *root ); //输出基本信息 int Message(Node *root,string Name); //显示该成员的基本信息 Node* PreFindFather(Node *root,string FatherName); //给定元素值查找父亲结点指针位置并返回其指针,此方法采用的先序遍历 Node* PreFindBrother(Node *root,string FatherName); //给定元素值查找兄弟结点指针位置并返回其指针,此方法采用的先序遍历 void AddNewPeople(Node *root,string FatherName,string NAme); //增加新的家族成员 int DeletePeople(Node *root,string FatherName,string Deletepeople); //删除家族成员 int SetNewName(Node *root,string NAme,string NewName); //更改姓名 int FindChild(Node *root,string NAme); //显示孩子信息 void SaveToFile(Node *root); //保存到文件 void FileToFamilyTree( Node *root) ; //从文件中读取 };