数据结构家谱管理系统报告书
大数据结构-家谱管理系统
宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称: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”来表示。
家谱管理系统数据结构(两篇)2024
引言概述:家谱管理系统是一种用于管理和记录家族历史数据的工具。
它通过组织和存储家族成员的信息,包括个人资料、家庭关系和血统关系等数据,帮助家族成员更好地了解和维护其家族传统。
数据结构在家谱管理系统中起着重要的作用,它决定了系统的性能和效率。
在上一篇《家谱管理系统数据结构(一)》中我们介绍了家谱管理系统的基本数据结构,包括树和图。
在本文中,我们将深入研究家谱管理系统的数据结构,包括链表、数组、堆和哈希表,以及它们在家谱管理系统中的应用。
正文内容:一、链表1.链表的定义和基本操作,如插入、删除和查找节点等。
2.单向链表、双向链表以及循环链表的特点及适用场景。
3.在家谱管理系统中,链表可以用来存储家族成员的个人资料和家庭关系,形成一个有序的数据结构。
4.链表的优缺点分析,包括插入和删除速度快,但查找的效率低。
二、数组1.数组的定义和基本操作,包括插入、删除和查找元素等。
2.静态数组和动态数组的区别以及在家谱管理系统中的选择。
3.数组的存储方式和访问特点,以及对系统性能的影响。
4.数组的优缺点分析,包括查找速度快,但插入和删除的效率较低。
三、堆1.堆的定义和基本操作,如插入和删除堆顶元素等。
2.最大堆和最小堆的特点及适用场景。
3.在家谱管理系统中,堆可以用来维护家族成员之间的优先级关系,例如根据年龄进行排名。
4.堆的优缺点分析,包括快速找到最大(小)元素,但插入和删除的效率较低。
四、哈希表1.哈希表的定义和基本操作,如插入、删除和查找元素等。
2.哈希函数的设计原则和方法,以及冲突解决的技术。
3.在家谱管理系统中,哈希表可以用来快速查找家族成员的信息,例如根据姓名或者ID进行查找。
4.哈希表的优缺点分析,包括查找速度快,但对存储空间的利用率较低。
五、总结家谱管理系统作为一种用于管理和记录家族历史数据的工具,数据结构在其中起着重要的作用。
本文介绍了家谱管理系统中常用的数据结构,包括链表、数组、堆和哈希表,以及它们在系统中的应用。
家谱系统实验报告(3篇)
第1篇一、实验背景家谱系统作为一种重要的文化遗产,承载着家族的历史与文化。
随着信息化时代的到来,传统的家谱记录方式已无法满足现代社会的需求。
因此,设计一款家谱系统,以数字化、网络化、智能化为特点,对于传承家族文化、加强家族联系具有重要意义。
二、实验目的1. 熟悉家谱系统设计与开发的基本流程。
2. 掌握家谱系统的功能模块设计方法。
3. 提高编程能力,掌握相关技术。
4. 分析家谱系统的应用价值,为家族文化传承提供技术支持。
三、实验内容1. 家谱系统需求分析家谱系统主要包括以下功能模块:(1)基本信息管理:包括家族成员的基本信息、婚姻状况、子女信息等。
(2)家谱树展示:以树状图形式展示家族成员之间的关系。
(3)查询功能:根据姓名、出生年月、地区等条件查询家族成员。
(4)编辑功能:对家族成员信息进行添加、修改、删除等操作。
(5)统计分析:对家族成员进行年龄、性别、婚姻状况等统计分析。
2. 家谱系统功能模块设计(1)基本信息管理模块设计一个用户界面,包括输入框、下拉菜单、按钮等元素。
用户可以在此界面输入家族成员信息,包括姓名、性别、出生年月、婚姻状况、子女信息等。
(2)家谱树展示模块采用树状图展示家族成员之间的关系。
树状图采用递归方式生成,每个节点代表一个家族成员,节点之间通过线条表示关系。
(3)查询功能模块设计一个查询界面,用户可以输入查询条件,系统根据条件在数据库中检索家族成员信息,并将结果展示在列表中。
(4)编辑功能模块在基本信息管理模块的基础上,增加修改、删除等操作。
用户可以选择要编辑的家族成员,对信息进行修改或删除。
(5)统计分析模块设计一个统计分析界面,展示家族成员的年龄、性别、婚姻状况等统计数据。
用户可以选择统计范围和统计指标,系统根据条件进行统计并展示结果。
3. 家谱系统实现采用Java语言和MySQL数据库实现家谱系统。
主要技术包括:(1)Java编程语言:用于实现家谱系统的各个功能模块。
数据结构_家谱管理系统
数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。
传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。
本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。
一、需求分析家谱管理系统的主要功能包括:1. 家族成员的添加、删除和修改;2. 家族成员之间的关系建立与维护;3. 家族成员信息的查询与展示;4. 家族历史的记录与维护。
二、系统设计1. 数据结构选择在设计家谱管理系统时,我们可以选择不同的数据结构来存储家族成员的信息和关系。
常见的数据结构有链表、树和图等。
考虑到家族成员之间具有明确的父子关系,我们选择使用树这一数据结构来存储家族成员的信息。
2. 树的设计与实现家谱管理系统中的树可以采用多叉树的结构,每一个节点表示一个家族成员,节点之间的边表示父子关系。
每一个节点包含成员的基本信息,如姓名、性别、出生日期等。
此外,我们可以添加一些额外的字段来记录其他相关信息,如职业、教育背景等。
3. 树的操作家谱管理系统需要实现一些基本的树操作,包括:- 添加成员:根据家族成员的父子关系,在树中添加新的节点。
- 删除成员:删除指定节点及其子节点。
- 修改成员信息:更新指定节点的信息。
- 查询成员信息:根据成员的姓名或者其他关键字,在树中进行遍历查找。
- 显示家族树:以树的结构展示整个家族的成员关系。
三、系统实现家谱管理系统可以使用编程语言来实现,如Java、Python等。
以下是一个简单的Java代码示例:```javaclass FamilyMember {String name;String gender;String birthdate;// 其他成员信息字段List<FamilyMember> children;public FamilyMember(String name, String gender, String birthdate) { = name;this.gender = gender;this.birthdate = birthdate;this.children = new ArrayList<>();}public void addChild(FamilyMember child) {this.children.add(child);}// 其他成员操作方法}class FamilyTree {FamilyMember root;public FamilyTree(FamilyMember root) {this.root = root;}// 其他树操作方法}public class GenealogyManagementSystem {public static void main(String[] args) {// 创建家族成员FamilyMember grandpa = new FamilyMember("Grandpa", "Male", "1950-01-01");FamilyMember father = new FamilyMember("Father", "Male", "1975-01-01");FamilyMember mother = new FamilyMember("Mother", "Female", "1980-01-01");FamilyMember child1 = new FamilyMember("Child1", "Male", "2000-01-01");FamilyMember child2 = new FamilyMember("Child2", "Female", "2005-01-01");// 建立成员关系grandpa.addChild(father);grandpa.addChild(mother);father.addChild(child1);father.addChild(child2);// 创建家族树FamilyTree familyTree = new FamilyTree(grandpa);// 其他操作}}```四、系统扩展与优化1. 数据存储:可以将家族成员的信息存储在数据库中,以便实现更复杂的查询和统计功能。
家谱管理系统数据结构
家谱管理系统数据结构1.引言本章节介绍家谱管理系统的概述,包括背景、目的和范围。
2.功能需求本章节了家谱管理系统的功能需求,包括:2.1 家族成员管理:包括添加、删除、查询、修改家族成员的基本信息。
2.2 家族关系管理:包括建立、编辑、删除成员之间的家族关系。
2.3 家谱展示:提供家谱的可视化展示,方便用户浏览和查看。
2.4 数据统计分析:对家族成员的数据进行统计和分析,提供相关报表和图表。
3.数据结构设计本章节描述了家谱管理系统的数据结构设计,包括:3.1 家族成员的数据结构:包括成员编号、姓名、性别、出生日期、死亡日期等字段。
3.2 家族关系的数据结构:包括与该成员相关的父母、配偶、子女等字段。
3.3 家族树的数据结构:使用树状结构来表示家谱关系,包括树节点和指针等字段。
4.数据库设计本章节描述了家谱管理系统的数据库设计,包括:4.1 数据表设计:包括成员表、关系表、家谱树表等表的设计。
4.2 数据库关系图:展示了各个数据表之间的关系和连接方式。
5.界面设计本章节描述了家谱管理系统的界面设计,包括:5.1 登录界面:提供用户登录和注册功能。
5.2 主页界面:显示家族成员列表和家谱展示。
5.3 成员管理界面:提供添加、删除、查询、修改等功能。
5.4 关系管理界面:提供建立、编辑、删除家族关系的功能。
5.5 统计分析界面:展示家族成员数据的统计和分析结果。
6.系统性能本章节描述了家谱管理系统的性能要求,包括响应时间、并发用户数、数据处理能力等方面。
7.部署与维护本章节描述了家谱管理系统的部署和维护要求,包括硬件环境、软件环境、数据备份等方面。
8.文档本章节包括对本文档的修改记录和说明。
附件:本文档涉及的附件包括数据库设计图、界面原型图等。
法律名词及注释:1.法律名词1:注释说明。
2.法律名词2:注释说明。
数据结构课设-家谱管理系统
数据结构课程设计——家谱管理系统一、问题描述问题名称:电子家谱问题内容:用树形的形式表示某家族的家谱,每个树结点表示一个家族成员,成员基本信息如下,具体属性自行确定。
1、姓名2、性别3、出生地4、配偶5、电话6、家庭住址7、职业8、简历9、其他系统实现功能:1、家谱信息1.1、输入1.2、修改1.3、删除2、查询2.1、某家谱成员的所有子孙的集合2.2、某家谱成员的所有祖先的集合2.3、某家谱成员的所有同辈成员的集合2.4、求某家谱成员的所有上一辈成员的集合2.5、给出两个家谱成员,确定他们的关系2.6、其他查询3、统计功能3.1、统计家谱成员的总人数3.2、统计从事某种职业的人数3.3、综合统计其他功能要求:1、用文件保存家谱信息2、图形方式显示家谱2二、系统总体设计(模块结构图)建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱统计基本查询关系查询祖先列表两人关系三、算法和数据结构设计数据结构的设计:使用兄弟孩子父亲表示法数据结构由如下的结构体组成1.1、日期的结构struct Date{int year; //年int month; //月int day; //日};1.2、成员信息的结构struct Info{char name[max_char_num];//姓名char birthplace[max_char_num];//出生地点Date birthdate;//结构date定义的出生日期Date deathdate;//结构date定义的死亡日期char sex[max_char_num];//性别char wife_or_husband[max_char_num];//配偶char phone[max_array_num];//电话char address[max_char_num];//家庭住址char resume[max_char_num];//简历//其他信息如下int height;//高度char occupation[max_char_num];//职业3char education[max_char_num];//受教育程度char top_headship[max_char_num];//最高职位char parentname[max_char_num];//父亲姓名,用于添加节点时用int Depth;//二叉树深度,输出二叉树时用};1.3、结点的结构typedef struct CSNode{Info data; //个人信息类型结构CSNode *firstchild,*nextsibling,*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲节点}*person;数据结构设计体会:使用树的按层遍历的方法找出某人的祖先的集合,但在从文件重建家谱的部分又碰到了困难,如何保存文件可是既节省空间又节省重建家谱的时间。
数据结构家谱实验报告
数据结构家谱实验报告
以下是一个数据结构家谱实验报告的模板,可以根据实际情况进行修改和完善:
数据结构家谱实验报告
一、实验目的
本次实验的目的是设计并实现一个家谱数据结构,以展示家族成员之间的关系。
二、实验内容
1. 设计家谱的数据结构,包括节点和边的表示。
2. 实现家谱的基本操作,如添加、删除、查找节点。
3. 按家族关系遍历家谱。
4. 测试所实现的家谱数据结构。
三、实验结果
1. 成功设计了家谱的数据结构,使用邻接表表示节点和边的关系。
2. 实现了家谱的基本操作,可以添加、删除和查找节点。
3. 能够按照家族关系遍历家谱,展示家族成员之间的关系。
4. 通过编写测试用例,验证了所实现的家谱数据结构的正确性。
四、实验总结
通过本次实验,我对数据结构的应用有了更深入的理解。
在设计和实现家谱数据结构的过程中,我运用了邻接表这一数据结构来表示节点和边的关系,并且实现了家谱的基本操作。
通过按家族关系遍历家谱,我成功展示了家族成员之间的关系。
本次实验提高了我的编程能力和问题解决能力。
数据结构课程设计总结报告 家族关系查询系统
郑州轻工业学院课程设计任务书题目家族关系查询系统专业、班级软件外包11-01 学号姓名主要内容、基本要求、主要参考资料等:主要内容:建立家族关系数据库,实现对家族成员关系的相关查询。
基本要求:(1)建立家族关系并能存储到文件中;(2)实现家族成员的添加。
(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。
课程设计按照教学要求需要一周时间完成,总共要上机调试程序10小时。
对每个题目要有需求分析,在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。
给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。
源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
程序能够运行,要有基本的容错功能。
尽量避免出现操作错误时出现死循环;主要参考资料:数据结构(C语言版),在网上查询的相关资料及部分代码完成期限:2013.6.18-2013.6.20指导教师签名:课程负责人签名:2013年 6 月18 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:家族关系查询系统学生姓名:系别:计算机与通信工程专业:软件外包班级:学号:指导教师:2013年6 月20 日一、设计题目(任选其一)家族关系查询系统二、运行环境(软、硬件环境)电脑及Visual C++ 6.0三、算法设计的思想随着社会发展,人们使用纸质的家谱已经非常不方便而且不利于在家谱里进行添加和修改。
而用算法设计一个家族关系查询系统则可以解决这个问题。
数据结构的二叉树刚好满足家谱的基本结构。
首先建立一个文件作为家谱,然后在文件中输入字符串,实现了在文件中按照数据的逻辑关系进进输入便可建立相应的三叉链表。
然后就是进行数据的存储、删除及查找工作。
四、 算法的流程图家谱的创建:修改家谱:成员查询:五、算法设计分析本次设计研究的是建立家族关系,实现对家族成员关系相关查询的问题。
数据结构家谱课程设计报告
家谱管理系统姓名:田鑫磊学号:1514020421(1)功能部分:本程序共实现了6个功能分别为:1.读出家谱并显示2.确定指定成员在家族中得辈份3.输出指定辈得所有成员4.在家谱中添加新成员,并追加到文件中5.输出指定家庭得所有成员6、退出本系统(2)各功能得算法思想:1.读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子得顺序显示所有得家庭成员。
2.确定指定成员在家族中得辈份用求成员所在得二叉树中得层数(按层遍历二叉树)来确定,这里采用得就是递归算法3.输出指定辈得所有成员此处定义了一个新得结构体类型(增加存储节点所在得层数),定义如下:struct{BTNode*q;int loc;//存结点所在得层数}qu[10];并用一个队列来比较显示同辈分得所有成员.4.在家谱中添加新成员,并追加到文件中首先,输入一个新成员得名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。
然后,再将新得存储结构写回到文件中。
二叉链表得结点类型为:typedefstruct node{ElemType data[10]; //存放成员得名字struct node *child;//其孩子指针struct node *brother;//其兄弟指针}BTNode;5.输出指定家庭得所有成员首先,设一个栈,并设一个标记位,先置1;然后,找到输入得要待显示得成员,将标记位置0;再次,显示其孩子与兄弟,依次下去直到显示完其所有得亲戚。
6.退出本系统通过一个输入字符q来控制,每完成一个功能,系统提示就是否要继续操作: 当q为“Y”或者“y”时,显示菜单,程序继续执行;当ﻩq为其她字符时,程序执行结束,退出本系统。
三、详细设计:通过一个do—while语句来控制各个模块得选择与实现。
1.读出家谱并显示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;}}}2.确定指定成员在家族中得辈分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);}3、输出指定辈得所有成员void layer(BTNode *t,intm){ 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) //找到m辈得即输出printf("%c",p—〉data);while(front〈rear)//通过站查找所有m辈得结点并输出{ front++;p=qu[front]、q;if(p—>child!=NULL)ﻩ{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);ﻩ}}}4、在家谱中添加新成员,并追加到文件中voidadd(BTNode *&b,ElemType y[],ElemTypex[]){char [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 :");ﻩ scanf("%s",&);ﻩif((fp=fopen(,”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];int i=0;ﻩ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)ﻩ{ﻩﻩf puts(s,fp);ﻩDispBTNode(b-〉child,fp);//递归写入其孩子ﻩﻩﻩif (b—〉brother!=NULL)ﻩﻩ{ﻩﻩfputs(p,fp);DispBTNode(b->brother,fp); //递归写入其兄弟ﻩﻩﻩ}ﻩfputs(t,fp);}ﻩ}}5、输出指定家庭得所有成员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;tap=0;}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 ;}}}}}6、退出本系统此处通过一个输入字符q来控制,当q为“Y”或者“y”时,显示菜单,程序继续执行,当q为其她字符时,程序执行结束,退出本系统。
数据结构家谱管理系统范本
数据结构家谱管理系统范本在当今数字化的时代,管理和保存家族信息变得越来越重要。
一个高效的数据结构家谱管理系统能够帮助我们更好地记录家族成员的关系、个人信息以及家族的历史。
接下来,让我们详细探讨一下这样一个系统的范本。
首先,让我们来明确一下这个系统的主要目标和功能。
其核心目标是提供一个集中、准确且易于维护的平台,用于存储和查询家族信息。
主要功能应包括:家族成员信息的录入与编辑、成员之间关系的定义和展示、家族历史事件的记录、以及强大的查询和搜索功能。
在设计数据结构时,我们需要考虑如何有效地存储家族成员的信息。
可以创建一个“家族成员”表,其中包含诸如姓名、出生日期、出生地、逝世日期(若有)、照片(路径)等基本字段。
为了表示成员之间的关系,我们可以再创建一个“关系”表,记录每个成员与其亲属(如父母、配偶、子女等)的关联。
对于界面设计,应追求简洁明了、易于操作的风格。
首页可以展示家族树的概览,以直观的方式呈现家族成员之间的关系。
用户点击某个成员节点,能够查看该成员的详细信息,并可以进行编辑或添加新的信息。
在录入家族成员信息时,系统应提供友好的输入界面,并进行必要的数据验证,以确保输入信息的准确性和完整性。
例如,出生日期的格式应该符合规范,姓名不能为空等。
为了方便查询,系统应支持多种查询方式。
用户可以通过姓名、出生日期范围、籍贯等条件进行搜索,快速找到所需的家族成员信息。
在家谱管理系统中,数据的安全性和备份也是至关重要的。
用户的登录和操作权限应该得到严格控制,只有授权人员能够进行数据的修改和删除。
同时,定期对数据进行备份,以防止数据丢失。
此外,系统还可以提供一些扩展功能,比如生成家族报告,以图表或文档的形式展示家族的人口分布、年龄结构等信息;或者与社交媒体平台集成,方便与家族成员分享家族历史和最新动态。
在实际开发过程中,选择合适的编程语言和数据库管理系统也非常关键。
常见的编程语言如 Java、Python 等都能够胜任,而数据库可以选择 MySQL、SQL Server 等。
数据结构家谱管理系统报告书
数据结构大作业说明文档一、题目的选择这次数据结构的大作业,我的选题是家谱管理系统的设计与实现。
由于平时疏于编程——针对我得个人实际——我把主要的目标定位在完成家谱管理系统得基本要求。
(基本要求大纲中有,就不浪费版面了)二、设计的思路接到这个题目,我的总体设计思路是先为程序搭建好一个结构框架,再跟据时间的宽裕程度和其它的要求逐步增强程序的性能。
关于IO的设计:考虑到题目要求家谱信息以树形的形式一次读入内存,而个人的各种资料现在虽然条目不多,但随着程序的升级,以后可能变得越来越大。
我把树形结构和个人信息记录的文档分为两个文件保存在外存中,一个文件串行化地记录家谱树的结构信息,保存少量个人信息作为识别标志;另一个文件保存完整的个人信息,所有的个人信息以线性记录的方式记录在其中。
当程序运行要读入家谱结构时,只读入保存少量记录的文件并建立起树形结构。
索引时,以树形中的少量信息为依据在另一个文件中找到全部的各人信息资料。
这样的好处主要有两点:1. 由于树形结构是串行化记录于外存,一个节点记录多次,信息大量冗余,如果树形节点中保留全部信息,必将造成大量的空间浪费;只保存作为索引的少量信息在树形结构中,节约了空间。
2. 由于结构的精简,在家谱初始化时读入内存需要的时间相应减少,节约了装载时间。
这样做存在的问题:每次执行修改,添加,删除,查询时都要直接访问外存来取得或写入数据。
内外存访问上的巨大时间差的存在,使得进行这些操作相对来说并不显得很高效。
关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。
树形结构的外存保存。
为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。
也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。
- 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代表实际信息)查询页面附:程序得到了比较好的调试和极限输入测试,很多问题的到了解决,但有一个漏洞,现有的设计很难完美解决:当用到亲戚查询,选择子女序号时,必须按提示输入数字,否则系统会出现未知错误。
其它界面即使随便输入系统也会给予纠正。