家谱管理系统设计与实现

合集下载

家谱管理系统

家谱管理系统

家谱管理系统家谱管理系统一、引言家谱是一种记录家族世系和血统关系的文献资料,对于了解家族历史和传统具有重要意义。

然而,传统的家谱管理方式存在数据维护困难、信息交流不便等问题。

为了解决这些问题,设计并开发了家谱管理系统。

二、系统概述1:目标家谱管理系统旨在提供一个集中管理、维护家族世系和血统关系的平台,方便用户进行查询、编辑和分享家谱信息。

2:功能- 登录功能:用户可以通过账号密码登录系统。

- 家族成员管理:用户可以添加、删除和修改家族成员的信息。

- 家谱维护:用户可以创建、编辑和保存家谱信息。

- 家族树展示:用户可以查看并浏览家族世系树。

- 家谱搜索:用户可以根据关键词快速搜索家谱中的成员。

- 信息分享:用户可以将家谱信息分享给他人。

- 数据备份:系统可以对家谱数据进行定期备份。

三、系统设计1:系统结构家谱管理系统采用三层架构,包括表示层、业务逻辑层和数据访问层。

表示层负责与用户的交互,业务逻辑层处理系统的业务逻辑,数据访问层负责与数据库的交互。

2:数据库设计系统采用关系型数据库存储家谱信息,包括家族成员表、家族关系表和用户表。

家族成员表存储每个成员的个人信息,家族关系表记录成员之间的血缘关系,用户表用于存储系统的用户信息。

3:用户界面设计系统的用户界面简洁明了,包括登录界面、家族成员管理界面、家谱维护界面、家族树展示界面和搜索界面。

界面设计遵循用户友好的原则,方便用户理解和操作。

四、系统实现1:技术选型系统采用Java语言进行开发,使用Spring框架进行项目管理和依赖注入,使用MySQL作为数据库,使用、CSS和JavaScript实现前端页面。

2:功能实现- 登录功能:通过编写登录逻辑和账号密码验证模块实现用户登录功能。

- 家族成员管理:设计数据库结构,编写增删改查操作的接口和逻辑。

- 家谱维护:实现家谱信息的编辑和保存功能。

- 家族树展示:使用数据结构和算法实现家族关系的图形展示。

- 家谱搜索:通过数据库查询和关键词匹配实现家谱搜索功能。

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计一、教学目标本课程旨在通过家谱管理系统课程设计,让学生掌握C语言的基本语法、数据结构、算法以及程序设计的基本方法。

在知识目标方面,学生需要理解C语言的编程概念,掌握家谱数据结构的设计与实现,以及熟悉家谱管理系统的开发流程。

在技能目标方面,学生应具备C语言编程能力,能够独立设计并实现一个简单家谱管理系统。

在情感态度价值观目标方面,学生应培养对计算机科学的兴趣,增强问题解决能力和团队合作意识。

二、教学内容本课程的教学内容主要包括C语言基础知识、家谱数据结构设计与实现、家谱管理系统设计与实现三部分。

C语言基础知识涵盖数据类型、运算符、控制结构、函数等基本概念。

家谱数据结构设计与实现部分包括家族树、家族成员信息表等数据结构的设计,以及相关算法的实现。

家谱管理系统设计与实现部分则涵盖系统需求分析、系统设计、系统实现与测试等环节。

三、教学方法为提高学生学习兴趣和主动性,本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。

讲授法用于传授C语言基本概念和编程技巧;讨论法用于引导学生探讨家谱管理系统的设计与实现问题;案例分析法用于分析实际编程过程中可能遇到的问题;实验法则让学生通过动手实践,加深对知识的理解和技能的掌握。

四、教学资源本课程所需教学资源包括教材、参考书、多媒体资料和实验设备。

教材选用《C程序设计语言》作为主教材,参考书包括《C Primer Plus》等。

多媒体资料包括课件、教学视频等,用于辅助课堂教学。

实验设备包括计算机、网络等,用于开展实验教学。

此外,还将提供在线编程平台,让学生在线编写代码、调试程序,提高编程能力。

五、教学评估本课程的教学评估将采取多元化方式,以全面、公正地评价学生的学习成果。

评估内容包括平时表现、作业、实验和期末考试四个方面。

平时表现主要评估学生的课堂参与度、提问与回答问题的情况;作业则主要评估学生对C语言基础知识和编程技巧的掌握;实验评估学生的动手实践能力,要求学生独立完成家谱管理系统的设计与实现;期末考试则全面测试学生的知识掌握和编程能力。

家谱系统

家谱系统

《数据结构的课程设计》报告题目:家谱管理系统设计与实现班级:1612401学号:*********姓名:***指导老师:**完成日期:2014.1.3目录一.需求分析.二.程序主要功能.三.程序运行平台.四.程序类说明.五.运行分析六.存在的不足与对策.七.体验感悟八.程序源代码.需求分析实现具有下列功能的家谱管理系统。

程序主要功能(1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。

(2)实现数据的存盘和读盘。

(3)以图形方式显示家谱。

(4)显示第n 代所有人的信息。

(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

(6)按照出生日期查询成员名单。

(7)输入两人姓名,确定其关系。

(8)某成员添加孩子。

(9)删除某成员(若其还有后代,则一并删除)。

(10)修改某成员信息。

(11)按出生日期对家谱中所有人排序。

(12)打开一家谱时,提示当天生日的健在成员。

(13)要求建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。

(14)界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

(15)存储结构:根据系统功能要求自行设计,但是要求相关数据要存储在数据文件中。

测试数据:要求使用1、全部合法数据;2、局部非法数据。

进行程序测试,以保证程序的稳定。

程序运行平台该程序是用VC++6.0制做的,使用Microsoft Visual C++ 6.0运行该程序,具体操作是:打开Microsoft Visual C++ 6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。

家谱的设计与实现(二叉树)

家谱的设计与实现(二叉树)

家谱的设计与实现(树,查找)家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。

可。

基本功能如下:(1)家谱中每个成员的信息包括:姓名、性别。

(2)家谱祖先数据的录入(树的根结点)。

(3)家庭成员的添加:即添加某人的儿女(包括姓名和性别),儿女的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿女的姓名不能重名)。

(4)家庭成员的修改:可以修改某一成员的姓名。

(5)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。

(6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。

#include <stdio.h>#include <malloc.h>#include <string>#include <stdlib.h>#define MAX 10typedef struct node{ //定义data存储结构char name[MAX]; //姓名char sex; //性别int generation;//代目}node;typedef struct ft{ //创建结构体struct node l; //家谱中直系家属struct ft *brother;//用来指向兄弟struct ft *child;//用来指向孩子}ft;ft *root; //root是结构体ft的指针ft *search(ft *p,char ch[]) // 搜索指针函数{ft *q;if(p==NULL)return NULL;//没有家谱,头指针下为空if(strcmpi(p->,ch)==0)return p;//家谱不为空,头指针下有这个人if(p->brother){q=search(p->brother,ch);//在兄弟中找if(q)return q;//找到}if(p->child){q=search(p->child,ch);//在孩子中找if(q!=NULL)return q;}return NULL;//没有找到}ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。

家谱管理系统实验报告

家谱管理系统实验报告

《家谱管理系统》课程设计报告学院:信息科学与工程学院班级:计算机科学与技术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。

家谱管理系统设计报告

家谱管理系统设计报告

目录第一章绪论............................................... 错误!未定义书签。

第二章需求分析........................................... 错误!未定义书签。

题目..................................................... 错误!未定义书签。

设计任务................................................. 错误!未定义书签。

数据测试................................................. 错误!未定义书签。

第三章概要设计........................................... 错误!未定义书签。

设计思想............................................. 错误!未定义书签。

实现方法............................................. 错误!未定义书签。

第四章详细设计........................................... 错误!未定义书签。

功能构想................................................. 错误!未定义书签。

界面设计................................................. 错误!未定义书签。

增加成员................................................. 错误!未定义书签。

添加子女............................................ 错误!未定义书签。

添加配偶............................................ 错误!未定义书签。

家谱管理系统设计与实现

家谱管理系统设计与实现

课程设计报告ﻩ课程名称ﻩ《数据结构》ﻩﻩ课题名称排序综合ﻩ专ﻩﻩ业ﻩﻩ班ﻩﻩ级ﻩﻩ学ﻩ号ﻩﻩﻩﻩﻩ姓ﻩ名ﻩﻩﻩﻩﻩﻩ联系方式ﻩﻩﻩﻩﻩ指导教师ﻩﻩﻩ20 11 年12月21 日目录1。

问题陈述 (3)2.设计方法阐述 (3)2.1总体规划 (3)2.2功能构想 (4)2。

2。

1增加成员........................................................................42。

2.2修改成员资料 (5)2。

2。

3删除成员........................................................................62.2.4打开家谱 (7)2.2。

5新建家谱 (8)2.2.6保存家谱...........................................................................102。

2.7查看某代信息 (11)2.2.8按姓名查找 (12)2.2.9按生日查找 (12)2。

2。

10查看成员关系..................................................................132。

2。

11按出生日期排序...............................................................1 4 2.3板块整合 (15)2.4调试分析.................................................................................193.总结 (19)4. 测试结果…………………………………………………………………………201.问题陈述家谱用于记录某家族历代家族成员的情况与关系。

现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理.支持对家谱的存储、更新、查询、统计等操作。

家谱管理系统(二)

家谱管理系统(二)

引言概述:正文内容:1.基本功能1.1家族人员信息管理家谱管理系统可以对家族成员的基本信息进行记录,包括姓名、性别、出生日期、婚姻状况等。

同时,系统还支持照片和添加,方便家族成员了解彼此的身份和历史。

1.2家族谱系构建家族谱系是家谱管理系统的核心功能之一。

系统可以通过输入家族成员的关系,自动家族谱系图,便于家族成员了解自己在家族中的位置,并追溯家族历史。

2.高级功能2.1家族活动管理家族管理系统可以帮助组织家族活动,包括集会、聚餐、纪念日等。

系统可以记录活动的时间、地点、参与成员等信息,并提供日程提醒,方便家族成员参与和组织活动。

2.2家族财物管理家谱管理系统还支持家族财物的管理。

家族成员可以记录家族财物的来源、价值、管理人等信息,并通过系统实时了解家族财物的情况,避免财物流失或遗弃。

2.3家族传统文化保留3.系统优势3.1方便快捷的信息搜索家谱管理系统具有强大的搜索功能,可以根据姓名、关系等条件快速搜索到目标家族成员的信息,提高了家族成员之间的互动和联系。

3.2数据安全与隐私保护家谱管理系统采用密码登录、数据加密等安全措施,保障家族成员的数据安全与隐私。

系统只允许家族成员之间分享信息,确保用户信息不会被泄露给外部人员。

3.3多平台的支持家谱管理系统兼容多种平台,包括电脑、方式、平板等设备,用户可以随时随地访问家谱信息,便于快速查询和分享。

4.使用步骤4.1注册账号用户需要在家谱管理系统网站或APP上注册账号,并填写基本信息。

4.2添加家族成员4.3构建家族谱系在添加家族成员后,系统会自动家族谱系图。

用户可以通过编辑和添加关系,完善家族谱系图。

4.4管理家族活动和财物用户可以在系统中管理家族活动,记录活动信息和参与成员。

同时,可以管理家族财物信息,包括来源、价值等。

4.5传承家族传统文化总结:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程名称《数据结构》课题名称排序综合专业班级学号姓名联系方式指导教师20 11 年 12 月 21 日目录1. 问题陈述 (3)2.设计方法阐述 (3)2.1总体规划 (3)2.2功能构想 (4)2.2.1增加成员 (4)2.2.2修改成员资料 (5)2.2.3删除成员 (6)2.2.4打开家谱 (7)2.2.5新建家谱 (8)2.2.6保存家谱 (10)2.2.7查看某代信息 (11)2.2.8按姓名查找 (12)2.2.9按生日查找 (12)2.2.10查看成员关系 (13)2.2.11按出生日期排序 (14)2.3板块整合 (15)2.4调试分析 (19)3.总结 (19)4. 测试结果 (20)1.问题陈述家谱用于记录某家族历代家族成员的情况与关系。

现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理。

支持对家谱的存储、更新、查询、统计等操作。

并用计算机永久储存家族数据,方便随时调用。

2.设计方法阐述2.1总体规划在动手编制程序之前,先要做好程序的规划,包括程序储存数据所用的结构,数据类型等等,只有确定了数据类型和数据结构,才能在此基础上进行各种算法的设计和程序的编写。

首先是考虑数据类型。

在家谱中,家族成员是最基本的组成部分,对于家族管理中,已经不能再进行细分了,所以选定家族成员作为数据的基本类型,并在程序中定义COperationFamilytree 类。

其中COperationFamilytree 类的各种属性可以根据需要进行添加或删除,从日常生活应用的角度出发,制定了COperationFamilytree 类中包含了一下属性:char name[MAX_CHARNUM]; //姓名Date birthday; //出生日期In tsex; //性别char addr[MAX_CHARNUM]; //基本资料int live; //健在否Date deathday; //死亡日期int ChildNums(Person pNode) ; //返回pNode孩子数intInSiblingPos(Person pNode); //返回pNode在其兄弟中的排行为方便计算机进行比较,在familytree类的某些属性中用数字代替了某些不会改变的字符串,譬如性别(1代表男,0代表女)、判断是否健在(1为是,0为否)。

在设置日期上,为方便以后的计算与比较,也将日期用整型数字表示19990505表示1999年5月5日,这种表示方法只需在输入和输出上作少许的运算便可方便地与日期进行转换。

在家族关系的表示上,并没有用相关家属的姓名作为储存数据,而仅仅是存储了各关系亲属的ID,方便日后作为指针指示调用相对应的家族成员。

其中在属性pNode上,其表示的是下一个同父母的弟或妹ID,也就是说,当某家族成员有若干个子女,其pNode仅指向第一个孩子,其余的孩子如何表示呢?可以通过第一个孩子的pNode指示,如此类推,直到孩子的pNode =0为止。

这样就可以避免需在程序设计时预定父母可以拥有的孩子数,有多少孩子就表示多少,实现了动态的储存数据。

在选择数据结构方面,从直观来说,选择树型结构通过链表来连接数据无疑是最直观易懂的,我在一开始构思的时候也是从树型结构去想的,但当构思到如何存储和提取数据是,便发现了问题。

毫无疑问,用指针来处理数据的确是方便直观,但当我要储存数据是,便发现把指针储存进去是没有作用的,因为当我们下一次读取数据的时候,数据内存地址已经不同了,不在是我们上次存储数据时的地址,也就是说指针这时已经是没有作用了。

要解决这样的问题,我们必须要在存储数据之前,先家族树序列化,用数组(或者其他可以用数字表示关系的方法)来存储,并且,再下一次读取数据时,再把数据按照序列号重新组成一个家族树,过程比较繁复,而且实现起来也不容易。

所以我便考虑直接用数组来存储数据,即使是在内存中也用数组来处理数据间的联系。

运用顺序表这个结构虽然不是那么直观,但在查找数据时的算法设计比较简单容易实现,效率高,而且在内存中的数据可以直接读入到文件中,文件中的数据也可以直接读入内存,不需要进行转换。

所以在衡量的各个方面之后,我决定用数组来处理数据间的联系。

2.2功能构想构想好总体规划之后,便开始设计程序中需要用到的各个功能函数,初步构想是要先实现最基本的几项功能,其中数据操作的有:增加成员,修改成员资料,删除成员;数据存取的有:打开家谱,新建家谱,保存家谱,另存家谱;数据查询的有:查看某代信息,按姓名查找,按生日查找,查看成员关系,按出生日期排序等等。

2.2.1增加成员这项功能做得不够理想,在规划时没有把成员以配偶的形式增加,而只能以子女的形式增加。

对应的函数代码如下:void COperationFamilytree::Add(Person parent, Person addNode){//本函数把addNode结点加入到其父结点parent下addNode->child=addNode->sibling=0; //把欲加入的结点所有指针域置空addNode->parent=parent; //因addNode欲加为parent 的孩子,故addNode结点的父指针域应指向parentif(parent==0){ //若parent 为0,则表示欲加addNode为根结点if(T==0){ //若本为空家谱T=addNode; //把addNode当成根结点return;}addNode->child=T; //使原来的根结点成为新根结点的孩子T->parent=addNode;T=addNode;return;}if(parent->child==0) //parent无孩子,把addNode加入其孩子parent->child=addNode;elseInsertSibling(parent->child,addNode); //把addNode加到parent孩子的兄弟域中}2.2.2修改成员资料修改成员这项功能实现起来比较简单,找到要修改成员的名字,再输入新修改的值,整个函数没有什么需要运用算法的地方,但如果想真正写好这个函数,则需要考虑相当多的细节,譬如各个输入项目的错误处理等等,要非常全面地考虑各项细节。

函数代码如下:void CFamilytreeDlg::OnModify(){// TODO: Add your command handler code hereif(operFamilytree.GetRoot()==0)return;CModifyInfoDlg dlg;HTREEITEM hItem;hItem=m_peTree.GetSelectedItem();dlg.m_newname=m_peTree.GetItemText(hItem);Person oneself=0;char oldname[MAX_CHARNUM];strcpy(oldname,dlg.m_newname);operFamilytree.Find(operFamilytree.GetRoot(),oneself,oldname);if(dlg.DoModal()==IDCANCEL)return;UpdateData(FALSE);Person newValue=new PersonNode;strcpy(newValue->,dlg.m_newname); //判断家谱中是否已有用户给定的新名字if(strcmp(newValue->,oldname)==0) ; //用户不修改姓名else{Person p=0;operFamilytree.Find(operFamilytree.GetRoot(),p,newValue->); //查找家谱中有没有此人if(p!=0){AfxMessageBox("家谱中已有此人!");delete newValue;return;}}strcpy(newValue->info.addr,dlg.m_newaddr);newValue->info.marry=dlg.m_marry;newValue->info.live=dlg.m_live;newValue->info.birthday.day=dlg.m_birthday_day;newValue->info.birthday.month=dlg.m_birthday_month;newValue->info.birthday.year=dlg.m_birthday_year;if(!newValue->info.live){ //如若过世,则应有死亡日期newValue->info.deathday.day=dlg.m_deathday_day;newValue->info.deathday.month=dlg.m_deathday_month;newValue->info.deathday.year=dlg.m_deathday_year;if(!operFamilytree.IsDateValid(newValue->info.deathday)){AfxMessageBox("此人信息中死亡日期不合实际!");delete newValue;return;}if(pareDate(newValue->info.deathday,newValue->info.birthday)==-1){AfxMessageBox("此人死亡日期不可能比其出生日期早!");return;}}operFamilytree.Modify(oneself,newValue);RefreshTree();RefreshList();IsFamilytreeModified=true; //置家谱修改标记为真delete newValue;}2.2.3删除成员用数组来储存数据,,最麻烦的就是删除数组元素了,在这个程序中,删除数组不但意味着要重新排列各成员,还要重新更新各成员的关系,所以我个人认为在这个程序中,删除成员函数可以说是一个难点。

通过分析,发现删除成员的情况就只有两种,只要针对这两种情况处理好删除,就可以完成成员删除这个功能。

1,删除的成员是出于家族中最底层的,也就是删除该成员不会牵连其他成员,但这也需要处理好其父母的孩子数。

2,删除的成员还有子孙,则需要连带所有子孙都要删除出家谱。

相关文档
最新文档