家谱管理系统是数据结构课程的一个经典的课程设计,也算是一个比较庞大的程序了吧,写出来还是蛮不容易的!分享出来希望能对大家有帮助!
家谱管理系统
【问题描述】
实现具有下列功能的家谱管理系统
【功能要求】
(1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
(2)实现数据的存盘和读盘。
(3)以图形方式显示家谱。
(4)显示第n代所有人的信息。
(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
(6)按照出生日期查询成员名单。
(7)输入两人姓名,确定其关系。
(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)
{
case '0':
j=0;
break;
case '1':
system("cls"); //清屏
if(strcmp(T->data.name,"0")==0)
{
printf("下面请输入祖先的信息\n");
person b;
b=(person)malloc(sizeof(CSNode));
start_up(b);
if(Create_familytree(b,T))
{
T=b;
level(T);
sort(T);
printf("\n\t ***** 家谱树已建立完成 ***** \n\t");
}
}
else
printf("家谱树已存在,要新建家谱树请先删除原有家谱树!\n");
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause"); //程序运行到此处会暂停,等待键盘命令
break;
case '2':
system("cls"); //清屏
add_new_member(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '3':
system("cls"); //清屏
if(strcmp(T->data.name,"0"))
preserve(T);
else
printf("家谱树为空,无法保存!\n");
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '4':
system("cls"); //清屏
show(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '5':
system("cls"); //清屏
lookup(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '6':
system("cls"); //清屏
find(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '7':
system("cls"); //清屏
member_message_num(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
case '8':
system("cls"); //清屏
relation(T);
fflush(stdin);
printf("\n即将返回主菜单!\n");
system("pause");
break;
default:
printf("你的操作有误,请重新选择!\n");
fflush(stdin);
system("pause");
}
}
return;
}
因为代码行数太多了,大概用2000多行,所以我就传到文件上来了,点击蓝色字体可以直接到下载页面。
如果对你有帮助或者你使用过程中出现了问题可以关注下面公众号联系我!
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注