已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江西农业大学科技月月评题目:家谱管理系统小组成员:陈江、易伟、段浩然(1107)汪志民、张馨香(1113)2012、11、30目录1问题陈述12设计方法阐述12.1总体规划12.2功能分析与实现32.2.1主界面介绍32.2.2增加成员功能52.2.3显示家族成员信52.2.4删除功能62.2.5查询功能72.2.6查询第n代所有人得信息82.2.7修改成员信息82.2.8连接数据库92.2.9绘制图形家谱102.2.10小结113.总结114.代码125.家族成员46家谱管理系统1问题陈述家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理。支持对家谱的存储、更新、查询、统计等操作。并用计算机永久储存家族数据,方便随时调用。2设计方法阐述2.1总体规划在动手编制程序之前,先要做好程序的规划,包括程序储存数据所用的结构,数据类型等等,只有确定了数据类型和数据结构,才能在此基础上进行各种算法的设计和程序的编写。首先是考虑数据类型。在家谱中,家族成员是最基本的组成部分,对于家族管理中,已经不能再进行细分了,所以选定家族成员作为数据的基本类型,并在程序中定义Person 类。Class Person String name;/姓名int age;/年龄String sex;/性别Birthday ymd;/出生日期String fatherName;String motherName;String spouseName;int childNum;int levelTemp; /代数Boolean isAlive;/是否健在为方便计算机进行比较,在Person类的某些属性中用数字代替了某些不会改变的字符串,譬如判断是否健在(true为是,false为否)。在设置日期上,为1方便以后的计算与比较,也将日期用整型数字表示1999-05-05表示1999年5月5日,这种表示方法只需在输入和输出上作少许的运算便可方便地与日期进行转换。在设计家谱以图谱的形式来显示时,从直观来说,选择树型结构无疑是最直观易懂的,我在一开始构思的时候也是从树型结构去想的,但是二叉树不能满足我的要求,我的家谱中的一个节点有父亲,母亲,孩子(个数任意),配偶,兄弟姐妹(个数任意).于是我自己设计了一个存储结构,一个节点有四个指针域,指向父亲(或母亲),指向配偶,指向兄弟姐妹。节点孩子兄弟姐妹父(母)配偶 图(1)这样,要找节点的父母亲则只需访问父亲节点,和父亲节点的配偶节点,其他的类似。于是我设计了节点的类:class Family static int num = 0;/节点的个数Person in; /数据域Family parents; /指向父亲的引用Family spouse;/指向配偶的引用Family child;/指向孩子的引用Family bro_sis;/指向兄弟姐妹Static Family root;/祖先节点难题就是如何将所有的家族成员同过祖先节点连接起来。我的思路是先将所2有的家族成员的信息用一个TXT文本存储起来,然后读出来,用一个数组mem存起来,之后初始化祖先节点,根据祖先节点的数据域的信息来添加,先添加祖先的父(母)亲,若有则从数组中读出来添加,否则添加兄弟姐妹,再添加配偶,最后添加孩子,最重要的是每添加一个节点时应该判断该节点是否已经在家族树中了,若存在则直接重家族树中找出来对其进行相应的操作,若不在则从数组mem中读取,之后遍历创建其兄弟姐妹,配偶,孩子。2.2功能分析与实现构想好总体规划之后,便开始设计程序中需要用到的各个功能函数,初步构想是要先实现最基本的几项功能,其中数据操作的有:增加成员,修改成员资料,删除成员,数据查询的有:查看某代信息,按姓名查找,按生日查找,查看成员关系以及显示查看家族成员信息表,还有就是绘制家谱图以及连接数据库的操作。2.2.1主界面介绍主界面由三部分组成:菜单、生日公告栏以及欢迎封面。下面为主界面图:图1 主界面3图2 菜单1图3 菜单24说明:(1)菜单中主要包括三大子菜单:文件、编辑、帮助。其中文件菜单中有连接数据库以及退出的操作,编辑中有所有功能实现操作。(2)生日公告栏为系统自动获取当日时间以判断今日家族中是否有人生日,如果有则会自动发出祝福,本功能为创新功能。(3)特别说明:在每一个功能界面中都设有带图标的快捷功能键,便于操作。(4)主界面的代码位于:FTFrame.java中,下面将一一介绍功能。实现主界面的方法:位于public class FTFrame类中2.2.2增加成员功能我设计了两种添加方式,首先,添加进去的人要与家族里的某一个或某几个有联系,比如是某个人的孩子啊,或配偶,不然是无法加入进这个家族的。(1)根据要添加人的父亲添加,父亲必须在家族中找到。(2)根据添加人的配偶。若这个配偶已有配偶则不允许添加,不允许三妻四妾。实现增加成员的方法:public String addMember(Person p) 代码省略/该方法位于familyTest类中图4 添加功能界面2.2.3显示家族成员信5家族成员信息表是用于显示及查看家族所有成员信息以及及时查看新增及删除后的情况,进入界面点击显示按钮即可完成功能。实现显示成员信息表的方法:public void initrowData(Family root) 代码省略/该方法位于FTFrame类中;实现显示成员信息表界面的方法:位于AddMember类中;图5 家庭信息表2.2.4删除功能删除功能执行时,会将本人及其后代及配偶全部删除。实现删除功能以及界面的代码:位于deleteMember类和familyTest类中。图6 删除成员图16图7 删除操作图该删除功能只通过姓名进行删除,删除后通过家庭成员信息表观察出其本人以及其后代及配偶以及完全被删除。2.2.5查询功能查询功能中有两种查找功能:查询相同生日的所有成员、查找两人关系。(1) 查询两人关系时,输入两人姓名即可按查询按钮进行查询。(2) 查询相同生日成员时,在下拉列表中选中日期即可查询。图8 查询操作实现查询功能以及界面的代码:位于searchMember类和familyTest中,其中实现关系查询的函数为relationship(name, Name),生日查询为brithday(Family root,Birthday d).72.2.6查询第n代所有人得信息进入操作界面,输入代数即可进行查询,如下图中查询第3代人。图9 代数查询实现显示成员信息表界面和方法:AddMember类中(界面)和familyTest中的inquire_N(Family root,int anger)方法。2.2.7修改成员信息修改操作中有明确的说明规则,方便操作。在修改中好友根据姓名查询的操作,方便查看修改后是否正确。图10 修改成员82.2.8连接数据库在文件菜单中点击连接数据库操作,在弹出来的对话框中选择确定,在弹出的登陆框中输入用户名及密码便可以连接数据库。说明:由于技术原因本系统只可以连接MySQL数据库,还望谅解。图11菜单中选择连接数据库图12 确定连接数据库9图13连接数据库实现数据库连接的方法:位于familyTest中Family类的public void connectionDB_MySQL(String passNum)方法。2.2.9绘制图形家谱根据家族树的存储结构画出来,难点是其中的间距很难调准。图14 家谱图10实现绘制家谱图的方法:位于CFrame类中。2.2.10小结至此,本家谱管理系统实现了在不同界面上操作不同的功能,其中包括七大主要功能以及主功能下的多个小功能。本家谱管理系统基本实现了要求的所有内容,界面使用了美化包。但是由于技术知识有限,本系统或多或少存在一些不足之处,待在今后改正。3.总结通过这次大作业,体会很深刻,用刚学的java都运用到这上面,学以致用,对所学知识有了更深刻的理解,同时还发现了许多平时在书本上没有遇见过的问题,促进了自己对知识的渴望,遇见了问题,就希望能够通过查找课外书来解决它们。刚接触题目的时候,自己就有了一定的想法,觉得这个程序做起来是问题不大的,但到了自己真正开始编程的时候却发现远远没有想象中那么简单,很多细节的问题没有预想到,很多关系的处理想得过于简单,以至于实施起来遇到了很大的困难,花了大量的时间。关于这个程序的缺点方面,由于自己花的时间不是很多,再加上知识有限,编写出来的界面不够友好,在功能上还是有不完善的地方,譬如说各项数据的统计还没有弄,数据的存储还不够理想等等。 对于这个程序的改进,我自己还是有不少想法的,因为怎么说都是自己亲手编制出来的程序,当然是希望尽善尽美。首先是需要加强数据的存储这方面的知识,使自己编写出来的程序能以一种标准的格式存储下来,方便以后其它程序的读取。总的来说,通过这次任务,收获还是挺多的,也发现了不少的问题,并给自己以后的学习指引了方向,知道自己缺少哪方面的知识,需要补充哪些知识等等。自己将会以这次作业为契机,看更多编程方面的书籍,不断充实自己的知识库。4.代码我只提供的功能实现的代码,至于界面我没提供import java.awt.*;import java.io.*;import java.util.*;import java.sql.*;import javax.swing.*;public class familyTest /* * param args */public static void main(String args) /测试函数/ TODO Auto-generated method stub/*Member m = new Member();for(int i=0;im.memberNum;i+)System.out.println(m.memberi);*/System.out.println();Family f = new Family();f.initRoot();f.CreateFamilyTree(Family.root);/Birthday a = new Birthday(8888,6,11);/Family t = f.isAtTree(Family.root, 贾演);/System.out.println(t.parents.in);/f.birthday(Family.root,a);/System.out.println(f.birthday);/f.showFamilyTree(Family.root);/System.out.println(t.in);/System.out.println(f.deleteTree(贾演);/System.out.println(t.parents.in);Birthday d1,d2;d1 = new Birthday(2,1);d2 = new Birthday(3,3);Person p1,p2;p1=new Person(林四,20,男,d1,林如海);p2=new Person(张三,25,d2,林黛玉);/System.out.println(f.addMember(p1);/System.out.println(f.addMember(p2);/System.out.println(f.num);/f.showFamilyTree(Family.root);/System.out.println(f.modification(王夫, 假贷, 20, d1, true);/f.showFamilyTree(Family.root);CFrame c=new CFrame(Family.root);/f.connectionDB_MySQL(cjtc);class Birthday /生日int year;int month;int day;Birthday() Birthday(int m,int d) year = 8888;month = m;day = d;Birthday(int y,int m,int d) year = y;month = m;day = d;public String toString() return month +- + day;class Person /家族成员的类String name;/姓名int age;/年龄String sex;/性别Birthday ymd;/出生日期String fatherName; /父亲名字String motherName; /母亲名字String spouseName; /伴侣int childNum; /孩子个数int levelTemp; /代数Boolean isAlive;ArrayList brothers_sisters; /兄弟姐妹ArrayList children; /孩子Person() name = null;age = 0;sex = null;ymd = null;levelTemp = 0;fatherName = 无;motherName = 无;spouseName = null;childNum = 0;isAlive = true;brothers_sisters=null;children=null;Person(String name,int age,String sex,Birthday ymd,String fatherName) =name;this.age=age;this.sex=sex;this.ymd=ymd;this.isAlive=true;this.fatherName=fatherName;Person(String name,int age,Birthday ymd,String spouseName) =name;this.age=age;this.ymd=ymd;this.isAlive=true;this.spouseName=spouseName;Person(String name,int age,String sex,Birthday ymd,String fatherName,String motherName,String spouseName,int childNum,int levelTemp,Boolean isAlive,ArrayList brothers_sisters,ArrayList children) /构造方法,用于初始化 = name;this.age = age;this.sex = sex;this.ymd = ymd;this.levelTemp = levelTemp;if(!fatherName.equals(无)this.fatherName = fatherName;else this.fatherName = null;if(!motherName.equals(无)this.motherName = motherName;else this.motherName = null;if(!spouseName.equals(无)this.spouseName = spouseName;else this.spouseName = null;this.childNum = childNum;this.isAlive = isAlive;this.brothers_sisters = brothers_sisters;this.children = children;public String toString() return 姓名: + + ,年龄: + this.age + ,性别: + this.sex + ,出生日期 : + this.ymd + ,父亲: + this.fatherName + ,母亲: + this.motherName + ,配偶: + this.spouseName + ,子女个数: + this.childNum + ,是第 + this.levelTemp + 代人 + ,是否健在: + this.isAlive + ,兄弟姐妹: + this.brothers_sisters + ,孩子: + this.children; class Member /用于存储成员,Person member;int memberNum = 0;public final int MaxSize = 100;Member() member = new PersonMaxSize;String s = 家谱管理系统成员.txt; /存储成员的文件String line;try BufferedReader in = new BufferedReader( new FileReader(s);line = in.readLine();while(line != null) String t;String time;String bsNum;String cNum;ArrayList bro_sis = new ArrayList();ArrayList child = new ArrayList();Boolean bl;t = line.split(,);time = t3.split(-);Birthday b = new Birthday(8888,Integer.parseInt(time0),Integer.parseInt(time1);if(t9 = FALSE) bl = false;else bl = true;bsNum = t10.split(;);cNum = t11.split(;);if(bsNum0.equals(无)bro_sis = null;else for(int i=0;ibsNum.length;i+)bro_sis.add(bsNumi);if(cNum0.equals(无)child = null;else for(int i=0;icNum.length;i+)child.add(cNumi);membermemberNum = new Person(t0,Integer.parseInt(t1),t2,b,t4,t5,t6,Integer.parseInt(t7),Integer.parseInt(t8),bl,bro_sis,child);memberNum +;line = in.readLine();catch(IOException e) e.printStackTrace();class XY /每个节点的位置(x,y)int x,y;XY() XY(int x,int y) this.x=x;this.y=y;class Family /家族树的类static int num = 0;Person in; /数据域Family parents; /指向父亲的引用Family spouse;/指向配偶的引用Family child;/指向孩子的引用Family bro_sis;Member mem = new Member();ArrayList birthday = new ArrayList();ArrayList n_People = new ArrayList();XY location;/坐标String dbUL=jdbc:mysql:/localhost/dbgoods;String dbNewUL = jdbc:mysql:/localhost/;String userName = root;String userPwd;Connection dbConn;Connection newConn;Statement stmt;ResultSet rs;static Family root = new Family(); /根节点,祖先节点void initRoot() /初始化祖先节点root.in.age = 9999; = 祖先;root.in.fatherName = null;root.in.spouseName = null;root.in.sex = 男;root.in.children = new ArrayList();root.in.children.add(贾源);root.in.children.add(贾演);root.in.childNum = root.in.children.size();root.in.ymd = new Birthday(888,888,888);root.in.isAlive=false;root.location= new XY();Family() in = new Person();parents = null;spouse = null;child = null;bro_sis = null;this.location=new XY();Family(Person p) in = p;parents = null;spouse = null;child = null;bro_sis = null;this.location=new XY();public void CreateFamilyTree(Family root) /创建家族树if(root != null) Family parents,spouse,child,bro_sis;/找root双亲节点if(root.in.fatherName != null | root.in.motherName != null) parents= this.isAtTree(this.root, root.in.fatherName); /找root的双亲节点是否已经存在于家族树中if(parents != null) root.parents = parents;else parents = this.isAtTree(this.root, root.in.motherName);if(parents != null) root.parents = parents;/找root的兄弟姐妹节点if(root.in.brothers_sisters != null) for(int i=0;iroot.in.brothers_sisters.size();i+) bro_sis = this.isAtTree(this.root,root.in.brothers_sisters.get(i);if(bro_sis = null) Person p_bs = this.inqureMember(root.in.brothers_sisters.get(i);bro_sis = new Family(p_bs);Family t = root;while(t.bro_sis != null) t = t.bro_sis; t.bro_sis = bro_sis;num+;/找root的配偶节点if(root.in.spouseName != null) spouse = this.isAtTree(this.root, root.in.spouseName); /找root的配偶节点是否已经存在于家族树中if(spouse = null) Person p_spouse;p_spouse = this.inqureMember(root.in.spouseName);if(p_spouse != null) spouse = new Family(p_spouse);root.spouse = spouse;num+;if(root.in.children != null) child = this.isAtTree(this.root,root.in.children.get(0);if(child = null) Person p_child = this.inqureMember(root.in.children.get(0);if(p_child != null) child = new Family(p_child);root.child = child;num+;if(root.bro_sis != null)CreateFamilyTree(root.bro_sis);if(root.spouse != null)CreateFamilyTree(root.spouse);if(root.child != null)CreateFamilyTree(root.child);public Family isAtTree(Family r,String name) /判断节点是否在家族树中if( != null) if(.equals(name) return r;else if(r.bro_sis != null) Family p = isAtTree(r.bro_sis,name); /从兄弟姐妹节点找if(p != null) return p;if(r.spouse != null) Family p = isAtTree(r.spouse,name); /从配偶节点找if(p != null) return p;if(r.child != null) Family p = isAtTree(r.child,name); /从孩子节点找if(p != null) return p;return null;public Person inqureMember(String name) /根据姓名查找家族成员for(int i=0;i f2.in.age) if(f1.in.sex.equals(男) & f2.in.sex.equals(女)return + 与 + + 为兄妹关系 + ,且 + + 为兄, + + 为妹。;if(f1.in.sex.equals(男) & f2.in.sex.equals(男)return + 与 + + 为兄弟关系 + ,且 + + 为兄, + + 为弟。;if(f1.in.sex.equals(女) & f2.in.sex.equals(男)return + 与 + + 为姐弟关系 + ,且 + + 为姐, + + 为弟。;if(f1.in.sex.equals(女) & f2.in.sex.equals(女)return + 与 + + 为姐妹关系 + ,且 + + 为姐, + + 为妹。;else if(f1.in.sex.equals(男) & f2.in.sex.equals(女)return + 与 + + 为姐弟关系 + ,且 + + 为弟, + + 为姐。;if(f1.in.sex.equals(男) & f2.in.sex.equals(男)return + 与 + + 为兄弟关系 + ,且 + + 为弟, + + 为兄。;if(f1.in.sex.equals(女) & f2.in.sex.equals(男)return + 与 + + 为兄妹关系 + ,且 + + 为妹, + + 为兄。;if(f1.in.sex.equals(女) & f2.in.sex.equals(女)return + 与 + + 为姐妹关系 + ,且 + + 为妹, + + 为姐。;else if(f1.in.sex.equals(男) & f2.in.sex.equals(男) if(f1.parents !=null & f1.parents = f2) return + 与 + + 为父子关系 + ,且 + + 为儿子, + + 为父亲。;if(f2.parents !=null & f2.parents = f1)return + 与 + + 为父子关系 + ,且 + + 为父亲, + + 为儿子。;if(f1.parents!=null & f1.parents.bro_sis = f2) if(f1.parents.in.age f2.in.age) return + 为侄子, + + 为叔父。;else return + 为侄子, + + 为伯父。;if(f2.parents!=null & f2.parents.bro_sis = f1) if(f2.parents.in.age f1.in.age) return + 为叔父, + + 为侄子。;else return + 为伯父, + + 为侄子。;if(f1.parents !=null & f1.parents.parents != null & f1.parents.parents = f2)return + 与 + + 为爷孙关系 + ,且 + + 为孙子, + + 为爷爷。;if(f2.parents !=null & f2.parents.parents !=null & f2.parents.parents = f1)return + 与 + + 为爷孙关系 + ,且 + + 为爷爷, + + 为孙子。;return 无法考证!;else if(f1.in.sex.equals(男) & f2.in.sex.equals(女) if(f1.parents !=null & f1.parents.spouse = f2) return + 与 + + 为母子关系 + ,且 + + 为儿子, + + 为母亲。;if(f2.parents !=null & f2.parents = f1)return + 与 + + 为父女关系 + ,且 + + 为父亲, + + 为女儿。;if(f1.in!=null & f1.in.spouseName!=null&f1.in.spouseName.equals() return + 与 + + 为夫妻关系 + ,且 + + 为丈夫, + + 为妻子。;if(f1.parents!=null & f1.parents.bro_sis!=null & f1.parents.bro_sis.spouse = f2) if(f1.parents.in.a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创业项目市场推广方案
- 老年人安宁疗护家属支持方向护理手册
- 广州加油站复工通知书
- 广西人社保减免通知书
- 广饶县职业中等学校入学通知书
- 库尔勒节假日放假通知书
- 延东小区停电通知书
- 建昌花园停电通知书
- 开发区封区文件通知书
- 开封定点降水预警通知书
- 2024-2030年肠粉行业市场发展分析及发展前景与投资机会研究报告
- HG∕T 2729-2012 硫化橡胶与薄片摩擦系数的测定 滑动法
- 国家中医药管理局发布的406种中医优势病种诊疗方案和临床路径目录
- 2024年贵州省护士岗位技能竞赛操作评分标准
- (高清版)JGT 225-2020 预应力混凝土用金属波纹管
- 心电图进修汇报
- 循证医学智慧树知到期末考试答案章节答案2024年广西中医药大学
- 人工智能辅助治疗技术管理规范
- 2024届高考地理二轮复习微专题-锋及锋的概念延伸题型汇
- 山东省春季高考技能考试-汽车专业必刷必练题库(600题)
- THHPA 001-2024 盆底康复管理质量评价指标体系
评论
0/150
提交评论