📄 genealogy.h
字号:
#define max_char_num 100
#define max_array_num 30
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>
struct Date
{
int year; //年
int month; //月
int day; //日
};
struct Info
{
char name[max_char_num];//姓名
char birthplace[max_char_num];//出生地点
Date birthdate;//结构date定义的出生日期
Date deathdate;//结构date定义的死亡日期
char sex[max_char_num];//性别
int height;//高度
char occupation[max_char_num];//工作职务
char education[max_char_num];//受教育程度
char top_headship[max_char_num];//最高职位
char parentname[max_char_num];//父亲姓名,用于添加节点时用
int Depth;//二叉树深度,输出二叉树时用
};
typedef struct CSNode
{
Info data; //个人信息类型结构
CSNode *firstchild,*nextsibling,*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲借点
}*person;
class GEnealogy
{
public:
GEnealogy();//构造函数
~GEnealogy();//析构函数
void NewGEnealogy();//建立一个空的家谱树
void CreateGEnealogy();//从磁盘读取文件建立家谱树
void DestroyGEnealogy();//删除家谱树
void SaveGEnealogy(); //保存家谱树
void PreOrderTraverse(fstream &f,person& T ,void (*Visit)(fstream &f,person &T));//先序遍历家谱树,为保存和显示家谱树作准备
void PostOrderTraverse(person& T,void (*Visit)(person& T));//后序遍历家谱树,为删除家谱树作准备
void ReadNode(fstream &f,person &pnode); //从二进制文件读取结点信息以供CreateGenealogy()建立家谱树
void FindByRelationship(person pnode); //按照亲属关系查找某人的父母,孩子,兄弟,若查找成功则显示出来
void Modify(person& pNode,person newValue);//修改某个人的信息
int CompareDate(Date date1, Date date2);// //比较两日期大小,若date1比date2早,返回-1;date1比date2晚,返回1;date1与date2相等,返回0
void FindByName(person& T,person& Tname,char* name);//查找姓名=name的人,若在家谱中,用Tname返回,否则Tname为空,Tname初始为空
void FindByBirthplace(person &T,person& Tname,char* name);//查找出生地=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByBirthday(person &T,person& Tname,Date date);//查找出生日期=date的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByDeathday(person& T,person& Tname,Date date);//查找死亡日期=date的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindBySex(person& T,person& Tname,char* name);//查找性别=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByHeight(person &T,person &Tname,int height);//查找身高=height的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByEducation(person& T,person& Tname,char* name);//查找受教育程度=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByOccupation(person& T,person& Tname,char* name);//查找职位=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void FindByTopHeadship(person& T,person& Tname,char* name);//查找最高职位=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
void Inquire();//查询函数,调用上述各个Find函数按成员基本信息以查询家谱
void Delete ( person &rootnode);//删除rootnode结点以及他的所有孩子结点
void Display(person info);//显示info的各样信息
void Add(person parent, person addNode);//将addnode添加到parent作为parent的孩子结点
void DisplayTree(person &pnode);//按照depth值在屏幕上输出整个家谱,其中只显示姓名
int IsDateValid(Date date);//检查日期是否符合要求
bool IsLeapYear(int year);//判断某一年是否为闰年
void AverageLife(person &T,int &personNums,int &age);//统计整个家谱的人的平均寿命
void AverageHeight(person &T,int &personNums, int &height);//统计整个家谱的人的平均身高
void MaleFemale(person &T,int &maleNum,int &femaleNum);//统计整个家谱的人的男女比例
int FamilyNumber(person pnode);//统计以某个人为parent的家庭的人口
int Age(person pNode);//返回某个人的年龄
int Height(person pNode);//返回某个人的身高
void TotalFamily(person &T,int &total);//统计家谱中家庭人数
void TotalFamilyNumber(person &T,int &totalfamily);//统计家谱中家庭人口总数
void Statistic();//统计函数,调用上述的函数完成统计功能
person& GetRoot();//返回家谱的根结点
void InputData(person &pnode);//输入pnode的个人信息
void InputDate(Date &day);//输入日期
void InsertSibling(person& Firstchild,person insertSibling);//搜索insertsibling的位置,插入到firstchild的nextsibling结点中去
void AddOperation();//添加孩子函数调用add()来添加。
private:
person T;//家谱的根结点
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -