数据结构家谱管理系统报告书
大数据结构-家谱管理系统

宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间: 2012年12月1日信息工程学院制目录一、案例描述.................................................... - 3 -1、总体描述................................................. - 3 -2、模块描述................................................. - 3 -二、设计思路.................................................... - 3 -三、程序设计.................................................... - 4 -1、数据结构描述............................................. - 4 -2、主函数及其流程图......................................... - 4 -3、源程序................................................... - 5 -四、调试与分析.................................................. - 5 -1、主菜单.................................................. - 10 -2、显示家谱信息............................................ - 11 -3、显示家谱中第n代人所有信息.............................. - 11 -4、按姓名查找某人并相应输出................................ - 11 -5、按出生日期查找家谱成员信息................... 错误!未定义书签。
家谱管理系统实验报告

《家谱管理系统》课程设计报告学院:信息科学与工程学院班级:计算机科学与技术08-4班制作人:邢尚文****:***山东科技大学2011年9月1日需求分析:本系统主要完成对家谱的相关操作和家谱人员信息的管理,包括打开家谱、新加家谱、保存家谱和家谱人员的姓名查找、某代信息查找、信息删除等。
系统的核心是利用对话框的连接和文本处理来存储和修改家谱管理系统的信息联系,其中的每一个动作都可能影响到其他的功能。
本系统实现以下功能:1). 输入文件以存放最初家谱中各成员的信息。
成员的信息中均应包含以下内容:姓名、辈分、父辈姓名、电话。
2). 实现数据的存盘和读盘。
3). 以图形方式显示家谱。
4). 显示第n 代所有人的信息。
5). 按照姓名查询,输出成员信息6). 删除某成员。
本系统的作用不是为了代替家谱,而是为了更好的建立家庭之间成员的联系,提供一个查询的平台,里面的族谱及文化介绍可以有效的介绍家族历史,让成员了解家族历史,向外界展示。
E-R图程序界面与代码:using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form1 : Form {public Form1(){InitializeComponent();}private void button4_Click(object sender, EventArgs e){if (textBox1.Text == "" && textBox2.Text == " "){MessageBox.Show("信息不全请重新填写");}if (textBox1.Text == "admin" && textBox2.Text == "admin"){Form2 form = new Form2();form.Show();}else{textBox1.Text = "";textBox2.Text = "";MessageBox.Show("请重新输入用户名密码?");}}private void button1_Click(object sender, EventArgs e){Form6 form = new Form6();form.Show();}private void button3_Click(object sender, EventArgs e){Form7 form = new Form7();form.Show();}private void button2_Click(object sender, EventArgs e){MessageBox.Show("本软件的设¨计?是º?为a了¢?让¨?用®?户¡ì能¨¹够?更¨¹好?地Ì?管¨¹理¤¨ª家¨°谱¡Á以°?及¡ã方¤?便À?家¨°谱¡Á的Ì?修T改?,ê?使º1用®?注Á¡é册¨¢过y的Ì?账?号?的Ì?登Ì?陆?后¨®就¨ª可¨¦以°?使º1用®?本À?软¨¨ª件t!ê?");}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form2 : Form {public Form2(){InitializeComponent();}private void祖Á?先¨¨功|德Ì?ToolStripMenuItem_Click(object sender, EventArgs e) {Form3 form = new Form3();form.Show();}private void zToolStripMenuItem_Click(object sender, EventArgs e){Form4 form = new Form4();form.Show();}private void祭¨¤祖Á?文?化¡¥ToolStripMenuItem_Click(object sender, EventArgs e) {Form5 form = new Form5();form.Show();}private void家¨°谱¡Á管¨¹理¤¨ªToolStripMenuItem_Click(object sender, EventArgs e){Form8 form = new Form8();form.Show();}private void dsdfsdToolStripMenuItem_Click(object sender, EventArgs e){Form9 form = new Form9();form.Show();}private void通ª¡§讯?录?添¬¨ª加¨®ToolStripMenuItem_Click(object sender, EventArgs e){Form10 form = new Form10();form.Show();}private void制?作Á¡Â人¨?ToolStripMenuItem1_Click(object sender, EventArgs e) {MessageBox.Show("制?作Á¡Â人¨?计?算?机¨²08-3班㨤:êo李¤?蓟?涛¬?,ê?李¤?赟²S,ê?张?拓ª?,ê?苏?晓t慧?");}private void通ª¡§讯?录?ToolStripMenuItem_Click(object sender, EventArgs e) {MessageBox.Show("要°a做Á?出?修T改?需¨¨要°a提¬¨¢供?管¨¹理¤¨ª员¡À权¨¡§限T!ê?");Form11 form = new Form11();form.Show();}private void制?作Á¡Â人¨?ToolStripMenuItem_Click(object sender, EventArgs e) {Form13 form = new Form13();form.Show();}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form3 : Form {public Form3(){InitializeComponent();}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form4 : Form {public Form4(){InitializeComponent();}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form5 : Form {public Form5(){InitializeComponent();}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form6 : Form {public Form6(){InitializeComponent();}}}using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication12 {public partial class Form7 : Form {public Form7(){InitializeComponent();}}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OleDb;namespace WindowsFormsApplication12{public partial class Form9 : Form{public Form9(){InitializeComponent();}private void Form9_Load(object sender, EventArgs e){// TODO: 这a行D代䨲码?将?数ºy据Y加¨®载?到Ì?表À¨ª“¡ãdb1DataSet11.表À¨ª2”¡À中D。
数据结构家谱管理系统

数据结构家谱管理系统公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间: 2012年12月1日信息工程学院制目录一、案例描述...................................................1、总体描述................................................2、模块描述................................................二、设计思路...................................................三、程序设计...................................................1、数据结构描述............................................2、主函数及其流程图........................................3、源程序..................................................四、调试与分析.................................................1、主菜单..................................................2、显示家谱信息............................................3、显示家谱中第n代人所有信息..............................4、按姓名查找某人并相应输出................................5、按出生日期查找家谱成员信息..............................6、为家谱中成员添加孩子信息................................7、为家谱中成员添加妻子信息................................8、删除家谱中成员及其后代信息..............................9、修改家谱中成员信息......................................10、确定家谱中两个成员关系.................................11、按出生年月排序家谱.....................................五、设计总结...................................................1、完成情况................................................2、心得体会................................................一、案例描述1、总体描述家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的查询到家族成员的详细信息。
数据结构家谱课程设计报告

家谱(3-1)本程序共实现了6 个功能分别为:1. 读出家谱并显示2. 确定指定成员在家族中的辈份3. 输出指定辈的所有成员4. 在家谱中添加新成员,并追加到文件中5. 输出指定家庭的所有成员6. 退出本系统1. 读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。
2. 确定指定成员在家族中的辈份用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法3. 输出指定辈的所有成员此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:struct{ BTNode *q;int loc; //存结点所在的层数}qu[10];并用一个队列来比较显示同辈份的所有成员。
4. 在家谱中添加新成员,并追加到文件中首先,输入一个新成员的名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。
然后,再将新的存储结构写回到文件中。
二叉链表的结点类型为:typedef struct node{ElemType data[10]; struct node *child; struct node *brother;}BTNode;//存放成员的名字 //其孩子指针 //其兄弟指针5. 输出指定家庭的所有成员首先,设一个栈,并设一个标记位,先置 1; 然后,找到输入的要待显示的成员,将标记位置0;再次,显示其孩子和兄弟,挨次下去直到显示完其所有的亲戚。
6. 退出本系统通过一个输入字符 q 来控制,每完成一个功能,系统提示是否要继续操作:当 q 为“Y ”或者“y ”时,显示菜单,程序继续执行;当 q 为其他字符时,程序执行结束,退出本系统。
通过一个 do-while 语句来控制各个模块的选择和实现。
void display(BTNode *b) {BTNode *q[10]; //定义一个栈 int front,rear; int k;BTNode *p; p=b;k=0;front=-1;rear=0;q[rear]=p; //头结点先入栈 while(front<rear) { front++; p=q[front];printf("%s",p->data ); //头结点出栈,并显示 printf("("); disbr(p->child); printf(")\n");if(p->child!=NULL) //显示其孩子 {rear++;q[rear]=p->child; }if(p->brother!=NULL) //显示其兄弟 {rear++;q[rear]=p->brother; } }}int generation(BTNode *b,int h,ElemType x[]) //用递归的思想{ int i;if(b==NULL)return(0);i=strcmp(b->data,x);if(i==0)//比较是否相等return(h);int L=generation(b->child,h+1,x);if(L==0)L=generation(b->brother,h,x);return(L);}void layer(BTNode *t,int m){ struct //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数{BTNode *q;int loc;}qu[10];int front,rear;BTNode *p;p=t;k=0;front=-1;rear=0;qu[rear].q=p;qu[rear].loc=1;if( qu[rear].loc==m) printf("%c",p->data); while(front<rear){ front++;p=qu[front].q;if(p->child!=NULL)//找到m辈的即输出//通过站查找所有m辈的结点并输出{rear++;qu[rear].q=p->child;qu[rear].loc=qu[front].loc+1;if(m== qu[rear].loc)printf("%s ",p->child->data);}if(p->brother!=NULL){rear++;qu[rear].q=p->brother;qu[rear].loc=qu[front].loc;if( qu[rear].loc==m)printf("%s ",p->brother->data);}}}void add(BTNode *&b,ElemType y[],ElemType x[]) {char filename[20]=" ";FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode));for(i=0;x[i]!='\0';i++)q->data[i]=x[i];q->data[i]='\0';q->child=q->brother=NULL;if(p->child ==NULL)p->child=q;else{ p=p->child;while(p->brother!=NULL)p=p->brother ;p->brother=q;}display(b);printf("向文件中读入新家谱\n");printf("\n input a filename:");scanf("%s",&filename);if((fp=fopen(filename,"w"))==NULL){puts("\n can't open the file.");exit(0);} elseDispBTNode(b,fp);fclose (fp);}void DispBTNode(BTNode *b,FILE *fp){char a[10];if(b!=NULL){while(b->data[i]!='\0'){a[i]=b->data[i];i++;}a[i]='\0';fputs(a,fp); //写入文件if(b->child!=NULL || b->brother!=NULL){fputs(s,fp);DispBTNode(b->child,fp); //递归写入其孩子if (b->brother!=NULL){fputs(p,fp);DispBTNode(b->brother,fp);}//递归写入其兄弟fputs(t,fp);}}}void dispfamily(BTNode *b,ElemType x[]) { BTNode *p;BTNode *q[MaxSize];int top=-1,tap=1;if(b!=NULL){top++;q[top]=b;while(top>-1){p=q[top];top-- ;if(strcmp(p->data,x)==0){top=-1;//查找这人}if(p->child!=NULL){top++;q[top]=p->child;if(tap==0){display(p->child); //显示其孩子return ;}}if(p->brother!=NULL){top++;q[top]=p->brother;if(tap==0){display(p->brother); //显示其兄弟return ;}}}}}此处通过一个输入字符q 来控制,当q 为“Y”或者“y”时,显示菜单,程序继续执行,当q 为其他字符时,程序执行结束,退出本系统。
家谱管理系统.doc

家谱管理系统。
洛阳科技学院课程设计报告数据结构课程设计课程名称_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _家谱管理系统设计主题_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _计算机科学与技术专业_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ b 150405班级_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ b 15080822学校编号_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _宋世龙的姓氏是_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x XXX,2006年12月30日。
完成日期_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _家谱管理系统设计的内容和要求;[问题描述]以下内容:实现了具有以下功能的家谱树管理系统1)。
家谱管理系统设计报告

目录第一章绪论............................................... 错误!未定义书签。
第二章需求分析........................................... 错误!未定义书签。
题目..................................................... 错误!未定义书签。
设计任务................................................. 错误!未定义书签。
数据测试................................................. 错误!未定义书签。
第三章概要设计........................................... 错误!未定义书签。
设计思想............................................. 错误!未定义书签。
实现方法............................................. 错误!未定义书签。
第四章详细设计........................................... 错误!未定义书签。
功能构想................................................. 错误!未定义书签。
界面设计................................................. 错误!未定义书签。
增加成员................................................. 错误!未定义书签。
添加子女............................................ 错误!未定义书签。
添加配偶............................................ 错误!未定义书签。
数据结构_家谱管理系统

数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。
为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。
本文将详细介绍该系统的设计和实现。
二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。
系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。
三、系统设计1. 数据结构选择在家谱管理系统中,我们选择了树这种数据结构来表示家族关系。
每个节点代表一个家庭成员,节点之间通过指针连接,形成家族的层级结构。
2. 数据模型设计家族成员的信息可以通过一个结构体来表示,包括姓名、性别、出生日期等字段。
每个节点除了包含成员信息外,还包含指向配偶的指针和指向子女的指针。
3. 系统功能设计家谱管理系统提供了以下功能:(1) 添加成员:用户可以输入成员信息,系统根据用户输入创建一个新的节点,并将其插入到适当的位置。
(2) 删除成员:用户可以指定要删除的成员,系统会删除该成员及其所有子孙节点。
(3) 修改成员信息:用户可以选择要修改的成员,然后输入新的信息进行更新。
(4) 查询成员信息:用户可以通过姓名、出生日期等条件查询成员信息。
(5) 统计家族人数:系统可以统计家族的总人数、男性人数、女性人数等信息。
四、系统实现1. 数据结构实现我们使用C语言来实现家谱管理系统。
通过定义一个节点结构体,使用指针来连接各个节点,实现家族关系的表示和管理。
2. 功能实现(1) 添加成员:根据用户输入的信息,创建一个新节点,并将其插入到适当的位置。
插入操作需要遍历树来找到合适的位置。
(2) 删除成员:根据用户指定的成员,删除该节点及其所有子孙节点。
删除操作需要递归地遍历树。
(3) 修改成员信息:根据用户选择的成员,更新其信息。
家谱管理实验报告

Project 3 家谱管理一、题目用树型结构实现家族成员信息管理,(如建立、删除、查询、统计、打印等)二、数据结构与算法1.定义树结点node {string name;node *left;node *right;string sex;//male or femaleint 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”来表示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构大作业说明文档一、题目的选择这次数据结构的大作业,我的选题是家谱管理系统的设计与实现。
由于平时疏于编程——针对我得个人实际——我把主要的目标定位在完成家谱管理系统得基本要求。
(基本要求大纲中有,就不浪费版面了)二、设计的思路接到这个题目,我的总体设计思路是先为程序搭建好一个结构框架,再跟据时间的宽裕程度和其它的要求逐步增强程序的性能。
关于IO的设计:考虑到题目要求家谱信息以树形的形式一次读入内存,而个人的各种资料现在虽然条目不多,但随着程序的升级,以后可能变得越来越大。
我把树形结构和个人信息记录的文档分为两个文件保存在外存中,一个文件串行化地记录家谱树的结构信息,保存少量个人信息作为识别标志;另一个文件保存完整的个人信息,所有的个人信息以线性记录的方式记录在其中。
当程序运行要读入家谱结构时,只读入保存少量记录的文件并建立起树形结构。
索引时,以树形中的少量信息为依据在另一个文件中找到全部的各人信息资料。
这样的好处主要有两点:1. 由于树形结构是串行化记录于外存,一个节点记录多次,信息大量冗余,如果树形节点中保留全部信息,必将造成大量的空间浪费;只保存作为索引的少量信息在树形结构中,节约了空间。
2. 由于结构的精简,在家谱初始化时读入内存需要的时间相应减少,节约了装载时间。
这样做存在的问题:每次执行修改,添加,删除,查询时都要直接访问外存来取得或写入数据。
内外存访问上的巨大时间差的存在,使得进行这些操作相对来说并不显得很高效。
关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。
树形结构的外存保存。
为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。
也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。
关于功能的设计(以基本要求为准):1.插入:用户按提示输入资料,在树形中插入节点,在个人完整记录文件中添加插入人的所有信息并保存。
2.删除:用户输入被删除人的识别关键字(即名字),在树形结构中删除此人,在个人记录文件中不处理。
3.修改:用户输入被删除任的识别关键字(即名字),从个人完整记录文件中读出该人所有信息供用户进行修改,然后写回。
4.查询:完成了关键字查找部分和关系查找部分,读出个人全部信息并显示。
关于个人资料单元:由于树形节点要涉及到大量的逻辑操作,要用到一些运算符的重载,个人资料在树形单元定义为class类,而写入文件的单元存萃是数据,定义为简单的struct 类。
定义为struct和class类,使得不管是树形结构插入删除还是IO都是对整个结构体进行的操作,这样,如果要往结构体中添加若干个新信息条目或取消一些不必要的信息条目,需要修改的代码非常之少,方便了以后的升级。
三、程序源/头文件及主要类的说明程序包含六个文件。
一个源文件:test.cpp ;五个头文件:GTNode.h 、GTree.h 、IOMan.h 、LList.h Link.h 。
GTNode.h 头文件的说明:文件中有GTNode模板类的定义和说明,GTNode类是一般树的节点类,类中的私有变量包含一个待定义的数据变量,一个最左孩子指针,一个右兄弟指针,一个父指针。
类中公有成员函数的作用主要是对四个私有成员进行返值和置值,此外还包括一个叶子节点的判断函数。
GTree.h 头文件的说明:文件中有GTree 模板类的定义和说明,GTree 类是一般树类,以GTNode 类为基础进行操作。
一般树类的私有部分包括两个私有变量:树的根指针和整型的当前树的节点个数记录。
另外还有三个私有辅助函数:析构辅助函数,打印辅助函数和查找辅助函数。
这三个函数都是用递归的方式访问整棵树来完成打印,查找和树的析构。
一般树的公有部分重定义了构造和析构函数,定义了以私有的辅助查找函数为基础的对外的查找函数,定义了节点插入函数,节点删除函数和返回值节点个数记录的求树节点个数的函数。
List.h 头文件的说明:文件中定义并说明了模板类List 类,这是程序中最简单的一个类,类中只有公有部分,包含一个待定义的数据变量,一个指向下一个节点的指针,和两个构造函数。
LList.h 头文件的说明:文件中定义并说明了模板类LList 类,这是一个但链表类,这个类主要是我以数据结构教材中了LList 类为范本,进行一些细部的修改,并添加了一些成员函数后形成。
LList 类的私有部分包含了一个待定义的数据,头、尾和“栅栏”三个指,两个分别辅助构造与析构的函数。
LList 类的公有部分我根据需要添加了一个删除最后一个节点的函数,其它部分与教材中基本一致。
IOMan.h 头文件的说明:IOMan.h 头文件是本程序中最大的一个头文件,其它四个头文件都是这个文件的支持。
其中包含了两个类,一个结构:一个一般树节点类,一个IOMan类,一个个人记录文件模块化写入读出的结构。
这里重点介绍一下处理文件,树,输入输出的IOMan 类,这个类也是本程序的核心所在。
IOMan 类的私有部分包含一个树,一个链表和一个写入辅助函数。
树是用来存放家谱中关系的结构;链表主要用来辅助输入,输出;写入辅助函数在链表的帮助下完成串型化地把树的结构写入外存保存树结构的文档中。
IOMan类的公有部分包含六个函数:构造函数,析构函数,家谱添加函数,删除函数,修改函数和查找函数。
构造函数处理完成家族树的建树任务,析构函数同时完成家族树的写入外存保存,其它四个函数处理用户输入输出的同时也对外部文件进行更新。
test.cpp源文件的说明:该文件中包含了main 函数。
在main 函数中,如果没有记录文件,则完成记录文件的创建,否则,完成记录文件的打开。
同时,main 函数还提供初始化的用户面板供用户进行操作。
四、主要函数的说明:这次的大作业,我在程序中总共新写了(原创)五个类和二十多个较复杂的函数。
其中的大部在源文件中都有较好的注释或用了比较常规的手法,在这里就不多加说明了,现在介绍的主要是比较特别的几个函数。
IOMan::IOMan ( ) 构造函数。
这个构造函数的逻辑流程是:先打开线型化保存树形结构的文件,如果打开成功则继续后续操作,否则退出程序。
在打开结构文件成功的情况下,模块化以树节点大小为单位逐个读入保存在结构文件中的内容,并用两个指针变量记录当前和上次读入的节点,如果当前读入节点在树中存在,则更新上次记录指针为当前记录指针值,如果读入节点不存在,则把当前读入的节点值作为上次记录节点的孩子插入结构树中,最后读完整个结构记录文件后,关闭该文件。
IOMan::~IOMan ( ) 析构函数。
该函数主要完成树结构的写入保存工作。
函数流程是:先打开保存树结构的文件,如打开失败则提示用户无法保存信息,否则调用辅助函数writeHelp ( ) 把树的结构写入结构保存文件。
writeHelp ( ) 函数的写入规则是:遇到中间节点,往链表中添加该节点,先递归访问它的最左孩子,从链表中剔除该节点,再访问它的右兄弟;遇到叶子节点,顺序写出链表中所有节点数据和该节点,再递归访问它的右兄弟。
IOMan::appendIt ( ) 家谱成员添加函数。
该函数首先打印出家谱树的结构供用户查看,然后由用户添加成员,为了确认添加位置,除了主根节点外,所有添加的成员都要求用户输入父节点的关键码(即父亲姓名),否则无法添加。
然后用户按提示输入添加成员的信息,由系统保存在个人信息记录文件中,同时更新树结构。
当个人记录保存文件无法打开时提示用户无法添加。
IOMan::removeIt ( ) 家谱成员删除函数,不对个人记录文件进行操作,只在树形机构中进行删除。
IOMan::changeIt ( ) 家谱成员修改函数,由用户输入新的信息,更新个人记录文件。
IOMan::inquire ( ) 家族成员查看函数,该函数有两个选择提供给用户:按成员名字查找或者按父亲名字查找,查找到的结构包含树中的关系。
五、心得体会这次大作业的推荐学时是20个学时,但回想起来,光这篇报告就写了有三四个学时,由于我本身编程能力不强,构思,写代码,修改,调试的时间加起来绝对是有余了。
虽然付出不少,但在前期的设计组织中,中期的代码编写和后期的修改调试中都学到了不少。
起初我的家谱中数据并不是以结构的形式打包,读入,写出操作的时候代码异常繁琐,这是恰好看到一本编程书上有用结构输入输出的范例,深深感到结构化确实是方便多了,而且读写不容易出错。
当时我的代码本已经写了有一大半,思虑再三,还是决定进行大换血,家谱数据的改变让程序来了个大换血,提高了效率的同时,代码几乎变了一多半。
我想,当时唯一不变的就只有对整个程序越来越清醒地认识和对将要完成的代码的更准确地把握。
代码完成之后,一编译,至少有五六十个错误提示,而且最末debug一行栏的最后一行提示因为先前的错误而中断编译,有的是指针指向错误,有的是忘了分号,括号,更多的是一些赋值错误,前面的错误都好改,赋值错误就比较麻烦了,因为要使用赋值的地方太多,逐行改代码虽然也可以,但实在是一个巨大工程。
所谓巧招必是险招——至少对我是这样——说来惭愧,我只有尝试着写以前从未是过的运算符重载函数,为此专门翻找出了大一的C++教材,温习了一番运算符重载才战战兢兢地搞定了赋值问题。
试运行时出现了更多的问题,而且更具有隐蔽性,几次为了一个逻辑错误而来回反复地翻看代码,嘿嘿,再加上网上有代码的传说,让人有想直接放弃的冲动,但一想到写代码的辛苦,觉得放弃了实在可惜。
那几天吃饭,睡觉,走路,看电视,随时随地,都记挂着那几处错误,脑子都会浮现出代码的影子,不自觉地开始找错误。
哎~那种感觉!~不知道是充实还是急迫地烦恼,最后终于找到了,根本来不急高兴,只有松了一口气和一阵的疲惫。
现在程序终于完成了,心里的石头也下了地。
至于成绩,不想了~~六、程序运行剪影剪影中只以两个节点的树为例,其实程序本身可以支持任意多节点,欢迎老师测试。
主面板个人信息显示(其中的数字2代表实际信息)查询页面附:程序得到了比较好的调试和极限输入测试,很多问题的到了解决,但有一个漏洞,现有的设计很难完美解决:当用到亲戚查询,选择子女序号时,必须按提示输入数字,否则系统会出现未知错误。
其它界面即使随便输入系统也会给予纠正。