C/C++家谱管理系统[2023-07-25]

C/C++家谱管理系统[2023-07-25]

1.家谱管理系统
问题描述:
家谱用于记录某家族历代家族成员的情况与关系。本系统要求能对家谱进行存储、更新、查询、统计等操作。
【实现要求】
程序必须采用树形数据结构实现。每个家族成员是一个树结点,每个成员结点逻辑上作为其父亲结点的孩子结点插入树中(不需要记录母亲结点)。提示:可以采用孩子兄弟链表法存储树,相当于存储树对应的二叉树。
(1) 录入:录入家庭成员信息,家庭成员的基本信息包括:(姓名,性别,出生日期,死亡日期(如果有就输入),学历,职业等)。各家庭成员之间的关系,例如录入李四时,指定李四是张三的孩子,则要把李四作为张三的孩子结点插入树中。
(2) 修改:修改成员信息;
(3) 删除:删除成员信息(删除某成员必须把其子孙全部删除);
(4) 输出:将家谱以较友好的格式输出(显示);
(5) 查询:按基本信息查询成员。
(6)导出:将家谱信息导出到文件中保存(例:若采用孩子兄弟链表法存储树对应的二叉树,可以采用括号表示法或带虚结点的先序遍历序列);
(7)导入:把家谱信息从文件读入程序(例:采用带虚结点的先序遍历序列生成二叉树);

源码联系UP主 -> https://space.bilibili.com/329101171

C语言“我的家谱”程序

建立“我的家谱”问题 家谱:又称族谱,是记载一个家族的世系繁衍及重要人物事迹的书。家谱中记录着父亲、母亲和孩子的姓名。请大家利用二叉树设计一个家谱,要求完成以下功能:
(1)输入和输出家谱记录;
(2)查找某个人所有的孩子;
(3)查找某个人所有的祖先;
(4)为某个人添加配偶和孩子的记录。

C语言二叉树的应用(家谱)

实验五 二叉树的应用

(难度系数:☆☆☆☆☆)

[问描述]
假定在当今家庭中,每个人最多可以养育两个孩子,请建立一个从曾祖父开始的家谱,用二叉树的数据结构表示(二叉树的层数可以为 3-4 层)。

[基本要求]
1.实现整个家谱成员的输出。
2.实现家谱中成员的查找与定位,比如该成员位于家谱的第几代。
3.实现家谱中某个成员的双亲结点、子女结点的输出。

家族谱图示.png

程序展现

主菜单.png

树形族谱显示.png

统计查询.png

C/C++家谱管理[2023-05-20]

家谱管理

中国历史悠久,中华民族有五千年的文明史。从远古的神话传说时代、尧舜禹的禅让、夏商西周、东周春秋战国的百家争鸣、秦汉一统、三国战乱、魏晋南北朝的民族大融合、隋唐五代光辉灿烂的文化直到宋元明清帝制结束。五千年的历史留给我们的是无尽的财富,四大发明,随处可见的文化遗产,代代相传的优秀的民族精神和思想,象形文字的汉字等等。
任选中国某一朝代或者历史上有影响力的名人,查阅资料,感受中国历史文化的魅力,尽可能全面的搜集其家族成员,设计和实现家谱管理系统,至少具有以下功能中的(1)、(2) (3)任选一项、(4)(5)任选一项:

(1)录入家谱数据
(2)查询指定家族成员的所有祖先信息
(3)查询指定家族成员的所有子孙信息
(4)插入指定家族成员。
(5)删除指定家族成员

C++家谱管理系统[2023-06-18]

小组项目二

实验题目:家谱管理系统

实验目的:
1、掌握树以及二叉树的定义;
2、掌握树以及二叉树的基本操作,如建立、查找、插入和删除等。
实验要求:小组合作方式,共同讨论完成该任务。

实验内容:
家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的查询到家族成员的详细信息。

输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:假设姓名中没有重名
层号、姓名、性别、出生日期、婚否、配偶姓名(若已婚)、家庭地址、是否健在、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
具有如下功能:

[1]从family.txt文件读取信息,并创建家谱树
[2]对家谱信息进行后序遍历(对应二叉树的中序),并输出
[3]保存家谱信息到文件(按先序遍历顺序输出)
[4]以凹入表示法显示家谱信息;每一代空一格
[5]显示第n 代所有人的信息
[6]按照姓名查询,输出成员信息(包括其本人、父母、孩子的信息)
[7]输入出生日期查询成员名单
[8]为某成员添加孩子
[9]根据姓名查找,修改某成员信息
[10]按出生日期对家谱中所有人排序
[11]根据姓名查找,删除成员

[其他]输入值若小于1或者大于11,结束程序

备注:系统需要包含但不仅限于以上功能。

实验提示:

初始家庭成员信息存放在family.txt中,你也可以修改数据。

数据样例:

15
层号  姓名  性别  出生日期  婚否  配偶姓名(若已婚,否则无该数据)  家庭地址  是否健在  死亡日期
1 陈雪见  男 1926.11.21 已婚  李美丽  江西南昌  否 2016.07.02
2 陈敏瑜  女 1953.04.26 已婚  江怀国  江西南昌  是
3 江浩东  男 1977.08.02 已婚  田晶晶  江西南昌  是
4 江天宇  男 2008.07.26 未婚  江西南昌  是
3 江浩南  男 1979.08.26 已婚  高晓云  江西南昌  是
4 江天怡  女 2010.08.26 未婚  江西南昌  是
3 江浩北  男 1981.06.02 已婚  黄志丽  江西南昌  是
4 江天豪  男 2010.03.02 未婚  江西南昌  是
2 陈敏杰  男 1956.09.01 已婚  曾钰  江西南昌  是
3 陈贝贝  女 1983.04.26 已婚  薛庚庆  江西南昌  是
4 薛加真  男 2009.10.1 未婚  江西南昌  是
4 薛惊云  男 2011.08.26 未婚  江西南昌  是
3 薛加美  女 1988.02.04 已婚  曹志高  北京  是   
4 曹霄涵  男 2015.08.26 未婚  北京  是
4 曹雪涵  女 2018.07.08 未婚  北京  是

家谱文本文件中,每一行包含一个人的名字。第一行是家族人数,第二行是表头信息,第三行之后是家族成员。家谱仅包含最早祖先的后代,而他们的丈夫或妻子出现在家谱的配偶信息中。每个人的信息第一列是层号信息,数据以先序遍历的顺序给出 。以上述家谱文本文件为例,“陈雪见”是这个家族最早的祖先;他有两个子女“陈敏瑜”和“陈敏杰”;“陈敏瑜”有三个子女“江浩东”、“江浩南”和“江浩北”;“江浩东”有只有一个子女“江天宇”。

#define MaxPerson 100
typedef struct datainfo {
 int level;
 char name[50];//姓名
 char sex[3];//性别
 char birthday[11];//生日 2008.09.02
 bool marriage;//婚否(true表示结婚,false表示没结婚)
 char partner[50];//伴侣,如果已婚
 char address[100];//住址
 bool live;//是否健在(true表示活着,false表示过世)
 char death_date[11];//死亡日期(如果其已经死亡) 1998.07.02
} familyInfoNode,*FamilyInfo;

//将树结构转换成二叉树来处理
typedef struct biTreeNode {
 familyInfo data;
 struct biTreeNode *leftChild,*rightChild,*parent;
} familyTreeNode,*FamilyTree;

实验要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 根据实验报告模板详细书写实验报告,在实验报告中给出根据姓名进行查找的算法和插入算法的流程图或者伪代码。
(5) 上传源程序和实验报告小组作业中。实验报告命名为:第小组-小组实验报告03+家族管理系统.doc 或者小组实验报告03+家族管理系统.docx。源程序压缩为一个文件(如果定义了头文件则一起压缩),按以下方式命名:第小组-实验报告02+家族管理系统.rar或者 第小组-实验报告02+家族管理系统.zip
(6)录制5分钟左右的视频,对项目进行介绍,需对项目实现功能进行演示,同时上传到学习通的小组作业中。

C/C++家谱管理系统[2023-05-29]

题目8:家谱管理系统 (1~3人)

[问题描述]

实现具有下列功能的家谱管理系统

1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
2).实现数据的存盘和读盘。
3).显示家谱。
4).显示第 n 代所有人的信息。
5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)
6).按照出生日期查询成员名单。
7).输入两人姓名,确定其关系。
8).某成员添加孩子。
9).删除某成员(若其还有后代,则一并删除)。
10).修改某成员信息。
11).按出生日期对家谱中所有人排序。

[基本要求]
建立至少 30 个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。[界面要求]:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
[存储结构]:
学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。
[测试数据]:
要求使用 1、全部合法数据; 2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

C/C++家谱管理系统[2023-06-09]

题目3:家谱管理系统(10 人左右,每两人一组)

内容:

设计一个家谱管理系统,为家族成员提供各种信息服务。建立至少20个成员信息数据以直观的方式显示结果。

基本要求:
1.输入家谱中各成员信息,成员的信息中包括的内容有:姓名、出生日期、婚否、地址、健在否等,也可以附加其他信息。
2.实现成员数据的保存和读取。
3.以树形方式显示家谱信息。
4.显示第n代所有人的信息
5.按照姓名查询,输出成员信息(包括本人、双亲和孩子信息)
6.按照出生日期查询家族成员名单。
7.输入两人姓名,确定其关系。
8.修改某位家族成员信息。
9.按出生日期对家族中所有人排序:

要求:
(1)程序要添加适当的注释,程序的书写要采用缩进格式。
(2)程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3)程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4)根据课程设计报告模板详细书写课程设计报告报告。
(5)上传源程序和课程设计报告到学习通。

注意:课设的内容可以根据需要拓展。

C/C++家族族谱管理系统

  1. 课题名称:

家族族谱管理

  1. 主要目标:

通过训练,强化学生对树结构、二叉树结构的表示及操作算法的掌握和灵活运用

3.具体要求:

要求设计实现具有下列功能的家谱管理系统:

(1) 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含姓名、出生日期、婚否、地址等;
(2) 实现数据的存盘和读盘;
(3) 以图形方式显示家谱;
(4) 显示第n 代所有人的信息;
(5) 按照姓名查询,输出成员信息 (包括其本人、父亲、孩子的信息);
(6) 按照出生日期查询成员名单;
(7) 输入两人姓名,确定其关系;
(8) 某成员添加孩子;
(9) 删除某成员 (若其还有后代,则一并删除);
(10) 修改某成员信息。

程序展现

主菜单.png

树形族谱显示.png

统计查询.png

【功能介绍】 1.该族谱管理系统一改以往修谱系统的特点,增加了输出word文档的功能,方便在打印前对出谱资料的二次修改,具有很强的可修改性。另外,可以将族人图形资料输出到word文档,和族人资料一起一并打印。可以打印输出族人的图形等可见信息。 2.可以在数据库内保存家族和族人的语音、视频、扫描资料等重要资料,由于保存在数据库内,所以具有保密性。家谱资料在数据库内可以删除、查看,方便整个家族资料的管理和完备性。 3.可以将世系的结构输出到文本文档,对于家族的分支结构在上得到很好的诠释。由于文本文档不具有格式性, 所以可以输出无限大的世系图,可以将整个家族的世系图完整输出 。 4.具有输出部分世系图分支的功能,可以分段输出世系图,便于将世系图分段保存和管理。配合整个世系图和分段世系图,对于某一分支可以了解自家分支的世系全貌。 5.可以管理多个配偶信息,配偶信息的输出是附加在族人后面,对于家庭的完整性得到很好的体现。配偶信息资料全,可以了解配偶在自家的排行、兄弟姐妹等情况。 6.自定义家谱输出格式,方便输出古代的五代格式。五代输出按大排行方式输出,符合大家的排行习惯。 7.族人输出按照大排行的顺序输出,例子老大的儿子输出要排在老二儿子的前边, 老大的孙子输出也要排在老二孙子的前边,以此类推。 8.可以管理家族的历史事件,历史人物,可以任意增加历史事件和历史人物,来阐述家族曾经出得辉煌。增加的人物和事件无限制。
好的,以下是代码实现: ```c++ #include<iostream> #include<string> #include<vector> #include<map> using namespace std; // 节点结构体 struct Node { string name; // 节点名称 Node* parent; // 双亲节点 vector<Node*> children; // 子节点 Node(string n) : name(n), parent(nullptr) {} // 构造函数 }; // 根节点 Node* root = new Node("祖先"); // 添加节点 void addNode(string parentName, string childName) { // 查找父节点 Node* parentNode = nullptr; if (parentName != "祖先") { parentNode = root; while (parentNode && parentNode->name != parentName) { int n = parentNode->children.size(); for (int i = 0; i < n; i++) { if (parentNode->children[i]->name == parentName) { parentNode = parentNode->children[i]; break; } } } } // 添加子节点 Node* childNode = new Node(childName); childNode->parent = parentNode; if (parentNode) { parentNode->children.push_back(childNode); } } // 查询节点 void queryNode(string name) { // 查找节点 Node* node = root; while (node && node->name != name) { int n = node->children.size(); for (int i = 0; i < n; i++) { if (node->children[i]->name == name) { node = node->children[i]; break; } } if (node->name != name) { node = node->parent; } } // 输出结果 if (!node) { cout << "未找到该节点!" << endl; } else { // 输出双亲节点 if (node->parent) { cout << "双亲节点:" << node->parent->name << endl; } else { cout << "双亲节点:无" << endl; } // 输出子孙节点 cout << "子孙节点:"; vector<Node*> q; q.push_back(node); while (!q.empty()) { Node* front = q.front(); q.erase(q.begin()); int n = front->children.size(); for (int i = 0; i < n; i++) { q.push_back(front->children[i]); cout << front->children[i]->name << " "; } } cout << endl; } } // 修改节点 void modifyNode(string name, string newName) { // 查找节点 Node* node = root; while (node && node->name != name) { int n = node->children.size(); for (int i = 0; i < n; i++) { if (node->children[i]->name == name) { node = node->children[i]; break; } } if (node->name != name) { node = node->parent; } } // 修改节点名称 if (!node) { cout << "未找到该节点!" << endl; } else { node->name = newName; cout << "修改成功!" << endl; // 更新子孙节点的双亲节点 vector<Node*> q; q.push_back(node); while (!q.empty()) { Node* front = q.front(); q.erase(q.begin()); int n = front->children.size(); for (int i = 0; i < n; i++) { q.push_back(front->children[i]); front->children[i]->parent = front; } } } } int main() { // 初始化族谱 addNode("祖先", "父亲1"); addNode("祖先", "父亲2"); addNode("祖先", "父亲3"); addNode("父亲1", "儿子1"); addNode("父亲1", "儿子2"); addNode("父亲2", "儿子3"); addNode("父亲2", "儿子4"); addNode("父亲3", "儿子5"); addNode("儿子2", "孙子1"); addNode("孙子1", "曾孙子1"); while (true) { // 输出菜单 cout << endl << "--------------- 族谱管理系统 ---------------" << endl; cout << "1. 查询某个人物的双亲和他所有的子孙" << endl; cout << "2. 新增某个人物的子孙" << endl; cout << "3. 修改某个人物的名称" << endl; cout << "4. 退出系统" << endl; cout << "请输入序号:"; // 输入菜单选项 int choice; cin >> choice; // 执行相应操作 if (choice == 1) { // 查询节点 string name; cout << "请输入人物名称:"; cin >> name; queryNode(name); } else if (choice == 2) { // 新增子孙节点 string parentName, childName; cout << "请输入父亲节点名称:"; cin >> parentName; cout << "请输入子孙节点名称:"; cin >> childName; addNode(parentName, childName); cout << "新增成功!" << endl; } else if (choice == 3) { // 修改节点名称 string name, newName; cout << "请输入人物名称:"; cin >> name; cout << "请输入新名称:"; cin >> newName; modifyNode(name, newName); } else if (choice == 4) { // 退出系统 cout << "谢谢使用!" << endl; break; } else { // 输入错误选项 cout << "输入错误,请重新输入!" << endl; } } return 0; } ``` 以上代码实现了一个简单的族谱管理系统,包括节点的添加、查询、修改等功能,可以通过菜单进行操作。注意在查询节点时,使用了广度优先搜索算法来搜索子孙节点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值