家谱管理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Project 3 家谱管理
一、题目
用树型结构实现家族成员信息管理,(如建立、删除、查询、统计、打印等)
二、数据结构与算法
1.定义树结点node {
string name;
node *left;
node *right;
string sex;//male or female
int num;//结点编号
node() {
name = "";
left = right = NULL;
num = 0;
sex = "male";
}
};
2.定义class tree{};实现不同对树的操作
其中,以static int count记录节点总数;
以static int height记录树高度;
以node* root作为头指针;
以node* arr[maxnode]将每个节点的指针记录在数组里。
3.对于该树的操作:
a. 创建树:
首先此project中树由男性为根结点。男性的左孩子是其兄弟,右孩子是其第一任妻子,第一任妻子的右孩子是其第二任妻子,每个妻子的左孩子是其与这位妻子的孩子。如此递归生成家谱。
输入时,用0表示左孩子,1表示右孩子,以1010等的字符串输入结点位置来创造结点。创建后用函数cheak来检验创造的树是否正确,具体来说就是避免创建树时出现有结点没有父结点的情况。
b.删除结点:以结点的name成员搜索结点,删除结点及其子树。
c.查询结点:以结点的name成员搜索结点,打印该结点的父母兄弟、妻
子、男孩。
d.统计函数:统计家谱总数。本project中通过#define定义打印屏幕宽
度screen_width为96,最多结点maxnode为32,因此树高度不超过5层,总数count不超过32. (linux下测试,终端宽度可以任意,windows下的话只能是80)
e.打印:采用广度优先搜索遍历来打印树。
三、测试数据、结果及分析
1.界面
(注:单词“member”拼写错误已在代码中改正)
2.初始化家族成员
(注:初始化人数须大于1.)
3.功能菜单(基于2中初始化的成员):
(1)输出整棵树中的成员
其中未存储成员的树的节点用“no”来表示。
(2)查找家谱中的成员及其亲缘关系
测试用例1:father
测试用例2::mother(女性成员)
测试用例3:a(无匹配项用例)
测试用例4:granddad(根节点)
(3)获取家谱中成员总数:
(4)删除家谱成员的测试:
测试用例1:stma
输出家谱:
测试用例2:mother
测试用例3:granddad
(5)退出程序
四、分工、贡献率%、自我评分100%
五、项目总结
本次项目解决的是一些跟我们的生活息息相关的问题。用树的结构来构造家族的族谱,是一个很好的例子。在完成本次项目的过程中,我们的小组成员互相协作,规定了族谱的建立规则,并设计了软件界面,分工完成了代码编写,Bug测试和修补。在本次项目完成过程中,我们小组逐渐摸索到了如何高效合作的方式,
即由不同的人完成不同部分的工作,各有侧重的部分。这样对于软件的编写和bug 修补以及测试会更加方便。三人共同交流,也有助于我们讨论出更有效且完备的算法,并且使我们的测试用例测试更加全面。本次实验中我们小组存在的缺陷也是较为明显的,比如由于是在Linux环境下编写代码,没有考虑到Windows终端中的软件界面出现问题,对于树的显示也会出现一些问题。同时,我们团队的代码完成时间也较晚,代码的测试时间较短,导致最终的软件不够完美。希望下一次在Project编写时,我们可以努力克服这些缺点,也希望每次的project都可以由不同的人负责代码的编写,使三个人都可以在每次的项目中学到不同的技能。
另外,本程序还存有严重不足,一开始我们没有把女儿或者说是姐妹这种关系考虑进去,导致后来发现该点时程序难以更改;并且,对于删除这一功能,如果删除的是男性,则是将其本身及其右子树删去,将左子树补至其父节点;而如果是女性的话,则是将其本身及其左子树删除,将右子树补至其父节点。但是我们的程序只是单纯地将要删除的节点及其左右子树全部删除,这一点严重不足(其实在考虑算法的时候是有考虑的,只是组员在编写代码时忘了这一点)。