网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(8)某成员添加孩子。
(9)删除某成员(若其还有后代,则一并删除)。
(10)修改某成员信息。
(11)按出生日期对家谱中所有人排序。
(12)打开一家谱时,提示当天生日的健在成员。
【基本要求】
建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
【界面要求】
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
【存储结构】
学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。
界面展示
这里展示一小部分,其他的大家后期根据代码慢慢了解
代码实现
这个系统写起来还是比较庞大的,需要定义很多函数来慢慢实现,所以我们把所有需要用到的头文件和函数的定义都存放在我自己定义的头文件里面,这样我们使用时,只需要导入我们自己定义的头文件即可。
自定义头文件
文件名为:Head_total.h
#define \_CRT\_SECURE\_NO\_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#define len 30
//日期-年月日
struct Date
{
int year;
int month;
int day;
};
struct Info
{
int children_count;//孩子数-hzshu
int alive;
int alive_day;//活了多少日-ri
int marry;//婚否-jiehun
char name[20];//姓名
char birth_place[20];//出生地点 -birthplace[20]
Date birth_date;//结构date定义的出生日期
Date death_date;//结构date定义的死亡日期
int sex;//性别
char wife_or_husband[20];//配偶
char address[50];//家庭住址
char resume[100];//简历
//其他信息如下
int height;//高度
char occupation[20];//职业
char education[20];//受教育程度
char parent_name[20];//父亲姓名,用于添加节点时用
int Depth;//二叉树深度,输出二叉树时用
};
typedef struct CSNode
{
Info data; //个人信息类型结构
CSNode \*first_child,\*next_brother,\*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲节点
}\*person;
//定义链式队列结点
typedef person QElemType;
typedef struct QNode
{
QElemType data;
struct QNode \*next;
}QNode,\*QueuePtr;
typedef struct {
QueuePtr front,rear;
}LinkQueue;
//函数声明
void start\_up(person &T);//给结点置空
void main\_menu(person &);//主菜单
int Create\_familytree(person &,person &);//创建家谱树
person find\_name(person &,char Name[]);//按姓名查找指定成员函数
int birth\_date(person &);//输入出生日期
int death\_date(person &); //输入死者死亡日期
int judge\_birth\_date(person &); //判断出生日期是否在今天之前
int judge\_death\_date(person &); //判断死亡日期死亡日期是否正确
void survival\_day\_sum(int &,int &,int &,int &,int &,int &);//计算生存天数
void level(person &); //计算每位家族成员的辈分
void level\_every(person &);//计算一位家族成员的辈分
void sort(person &); //排序
void sort\_every(person &);//为一个父亲的孩子按出生日期排序
void add\_new\_member(person &);//添加成员函数
void preserve(person &);//保存成员信息函数
void preserve\_member(person &,FILE \*);//保存一个成员信息函数
void preserve\_family(person &,FILE \*); //保存所有成员信息函数
int DeQueue(LinkQueue &,QElemType &);//出队列操作
void InitQueue(LinkQueue &);//构造一个空队列
int QueueEmpty(LinkQueue );//判断链式队列是否为空
void EnQueue(LinkQueue &,QElemType ); //进队列操作
void start\_correct(person &);//该函数的作用是每次从打开家谱,都会根据现在的时间重新计算活着的成员的寿命
void show(person &); //显示家谱树函数
void read\_node(person &,FILE \*);//从文件中读取所有成员节点
void read\_node\_every(person &,FILE \*); //从文件中读取一个成员节点
void show\_tree\_member(person &);//每一个具体展现
void show\_tree(person &);//把家谱成员姓名通过一个层次化的家谱树显示出来
void lookup(person &);//通过名字查找相应的成员,并显示其信息
void show\_member(person &); //显示一个成员所有信息的函数
void Delete(person &);//采用后续遍历的方法删除成员节点
void find(person &); //通过关键字搜索家谱成员
int kmp(char str[], char ptrn[]); //KMP算法,用于搜索简历内容
void member\_message\_num(person &); //统计家谱成员信息函数
void relation(person &);
void QuickSort(person e[], int , int ); //快速排序算法,用于寿命排序
主函数
准备工作结束之后,接下来看看主函数
主函数就是产生一个空结点,用于家族谱的判空操作,然后进入这个系统的主界面
#include "Head\_total.h"
void main() //主函数
{
person T;
T=(person)malloc(sizeof(CSNode));
start\_up(T);
strcpy(T->data.name,"0"); //首先设置第一个节点的成员姓名为0,用于家族谱的判空操作
main\_menu(T);
return;
}
void start\_up(person &T) //初始化,把指针置为空
{
T->parent=NULL;
T->first_child=NULL;
T->next_brother=NULL;
return;
}
菜单界面
接下来看看这个系统的主界面
它主要通过while循环与switch来实现功能,并且通过 SetConsoleTextAttribute()函数来控制控制台窗口字体颜色和背景色,使界面更加优美
原谅我调不出好看的颜色。。
#include "Head\_total.h"
void main\_menu(person &T) //主菜单程序
{
int j=1;
char i;
while (j)
{
system("cls"); //清屏
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GREEN); //设置屏幕字体颜色
printf("\t");
printf("\n\n\t \*\*\*\*\*\*\*家谱管理系统课设版1.0\*\*\*\*\*\*\* ");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY | FOREGROUND_BLUE);
printf("\n\t\t---------------------------------------------\n\t");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY |FOREGROUND_GREEN | FOREGROUND_BLUE);
//printf("\t\t 家谱管理系统\n\t");
printf("\t\t 0. 退出系统 \n\t");
printf("\t\t 1. 新创建家谱树 \t\n\t");
printf("\t\t 2. 添加家谱成员 \t\n\t");
printf("\t\t 3. 保存家谱信息到文件 \t\n\t");
printf("\t\t 4. 从文件读取显示家谱 \t\n\t");
printf("\t\t 5. 按姓名查找家谱成员 \t\n\t");
printf("\t\t 6. 按关键字查找家谱成员 \t\n\t");
printf("\t\t 7. 统计家谱成员 \t\n\t");
printf("\t\t 8. 通过名字确定两人关系 \t\n\t");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY | FOREGROUND_BLUE);
printf("\t---------------------------------------------\n\t");
printf("\t请输入你的操作(0~8):\n");
i=getchar();
fflush(stdin);//刷新缓冲区,将缓冲区内的数据清空并丢弃
switch(i)
![img](https://img-blog.csdnimg.cn/img_convert/206a5786b0460812293911fee310d7a5.png)
![img](https://img-blog.csdnimg.cn/img_convert/73b243e9d01fb49816cd94903170fe9d.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
9794)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**