家谱管理软件设计报告.doc_第1页
家谱管理软件设计报告.doc_第2页
家谱管理软件设计报告.doc_第3页
家谱管理软件设计报告.doc_第4页
家谱管理软件设计报告.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

家谱管理软件设计报告 计算机科学与技术04级(2)班 蔡少伟 200433100067 一 问题陈述 1.1 问题提出背景 家谱是记载同一姓氏血缘关系的世系、重要人物、个人事迹、家族历史为主要内容的谱籍,又称“族谱”、“家谱”、“家乘”,还有称作“谱碟”。家谱上可以追本溯源,缅怀先人,下可以辨明关系,联络宗亲,从而启孝梯心,唤德善之本,激励后人,奋发有为,其作用不可尽述。在社会方面,家谱对于海内外华人寻根认祖,增强民族凝聚力起着重要作用。在文史工作者,家谱是研究人口学、社会学、经济学、历史学、氏族学、人物传记,以及研究地方史乃是重要资料。在个人方面家谱又是每个公民身份证明之一。如有些族规有载,某人若不遵法纪,为非作歹者,击鼓鸣公,革出族外,不准入谱。可见家谱无论在社会在个人都起着重要作用。 现在广东省已经是经济大省,正在向文化大省迈开步伐,家谱的科学管理不但有助于民族文化和地方文化的发展,而且有其自身的积极意义。广州作为广东的政治经济文化中心,若家谱管理能在广州得到应用,必会促进广州文化的发展,进一步推广应用,带动广东的文化事业。 1.2 概述设计目标和软件功能 本课程设计正是以家谱管理为课题,力求通过设计并实现一个计算机软件,来支持对家谱的存储、更新、查询、统计,打印等操作。本课程设计要实现的功能详述如下: 一,家谱信息的存储。将家谱成员的基本信息和各成员的关系存储在计算机中,并可永久保存。家谱成员的基本信息包括:编号,辈份,姓名,出生地,出生日期,死亡日期,性别,身高,学历,职业,最高职务/职称,寿命等。 二,家谱信息的更新。主要是对家谱中个人信息的修改,删除成员,添加成员。 三,查询功能。包括按姓名查询,按基本信息查询和按亲戚关系查询。其中按基本信息查询包括按身高,姓别,学历,寿命,职业查询。按亲戚关系查询中亲戚关系有:家人(三代),所有关系(三代),爷爷,奶奶,父亲,母亲,叔伯,姑姑,配偶,兄弟姐妹,堂兄弟姐妹,子女,孙子女等。 四,统计功能。统计的项目有:平均(最长/最短)寿命、平均(最高)身高、男女比例、平均(最高/低)学历、总人口,职业统计等。 五,打印功能。将家谱以较友好的格式在屏幕上显示。 二 设计方法阐述 2.1 软件总体框架 本软件的运行方式是程序开始经登录界面进入家谱管理系统。登录不成功(即登录信息不正确)则退出程序,登录成功则进入家谱管理系统。进入家谱管理系统后首先从磁盘读出家谱信息和各家庭成员的基本信息,以邻接表的形式把各成员结点链成双向链表。生成链表过程中每读出一个成员的信息就生成一新结点,并把该结点加在表尾。信息读取完毕,建立起邻接表形式的双向链表,便可以对家谱进行各种操作。程序结束后再把信息存储在磁盘上。本软件的总体运行框架如下: 登 录 界 面磁盘文件成功不成功退出读取信息生成链表家家 谱 管 理成员管理查找统计打印修改用户名或密码 写回信息 注:在打印家谱操作中,实现了支持鼠标的功能。 2.2 软件设计思路 (1)数据结构 在数据结构上,家庭成员之间的关系,用树形结构(家族树)表示,这是本家谱管理系统的逻辑结构;而家族树在内存中的存储结构是采用邻接表。邻接表的实现:家庭成员基本信息设置数字编号,用于唯一地标识记录,树结点用家庭成员的编号标识,通过编号,建立家庭成员的基本信息与树结点的联系;家庭成员基本信息另设置邻接点的数字编号,包括第一个孩子,父亲,配偶和下一个弟弟或妹妹的编号,暂无该关系的则该关系编号为0,通过这些编号可以建立起结一个树结点和其它各结点之间的联系。这样,就建立起邻接表形式的家族树。邻接表的形式如下:本人 父亲 配偶 孩子 兄弟 个人信息31694王一仁。417125王一义。518150王一勇。 。 。 。37145100王三勇。381552039王三清。39155300王三城。 在设计家谱管理系统的时候,最重要的是决定使用何种方式组织家族树,即采用何种数据结构。本系统是采用邻接表来组织家族树的。这是因为邻接表可以以链表的形式来组织,而在链表上进行操作是比较容易实现的,而且链表的组织形式简单,不容易出错。再者,由于邻接表中各结点都记下了其邻接点的编号,通过编号建立各结点的联系,可以表示树。这样,采用邻接表的数据结构,在准确表示家族树的前提下,使得对家谱的操作变得更简便易行。 (2)类分布 本软件的设计和实现是基于面向对象的思想的,为了方便软件的设计和管理,我将它的实体对象和管理实体对象的数据结构相分离。因此,软件的类有实体类和应用类。各个类的具体功能如下: AppClass 应用程序类,提供软件接口。 Family 家族类,实现家谱管理的各个功能。 person 成员类,家族中每一个成员都是成员类的一个实体,实现对成员个人的操作。 String 自定义字符串类,提供字符串各种操作,以便使程序对字符串的操作在各个编译器能编译通过。 Menu 菜单类,为了软件的友好,以菜单选择的方式展示给用户。 (3)具体实现 本软件通过应用程序类提供软件的接口。家谱管理系统的整体控制由应用程序类的run函数负责。而应用程序类AppClass中有私有成员Family * sept,对家谱的各种操作就是通过sept 调用Family类中的函数来实现的,应用程序类中的函数只是提供各种操作的接口。run函数首先将用户名和密码从主控文件加载到内存,如果用户登录成功,则从主文件中加载家谱信息和各成员信息到内存,建立以双向链表形式存在的邻接表来表示家族树。接着用户可通过菜单选择进行各种操作,在程序结束运行时,把操作后的家谱信息和各成员信息写回到主文件中。如果用户名和密码有所改动,把新的用户名和密码写回主控文件中。家谱的具体操作是在Fmily类中实现的,在这之前首先由person类实现成员个人的相关操作,如返回各种个人信息,设置各种个人信息,不同版本的构造函数,输入个人信息,输出个人信息,修改个人信息,删除个人信息,把个人信息写入指定文件等。其中返回各种个人信息和设置各种个人信息是为了方便对个人进行操作,包括个人相关信息的获取和赋值。输入个人信息的操作根据实际情况由personinput(),childinput(),deathinput()这三个函数实现。personinput()负责一般成员的信息输入,包括以配偶身分加入家谱的成员的信息输入;childinput()负责刚出生婴儿的信息输入;deathinput()负责已故成员的信息输入。分成三个函数来实现是因为这三种情况所要输入的信息不全一样,如childinput()所需输入的信息较少,而deathinput()所需输入信息最多,连寿命和死亡日期也要输入。删除个人信息是从家谱中删除该成员的操作,函数为delinformation(),删除个人信息时保留指针信息即其在家谱中邻接点的编号,这样才能避免因删除了一个成员导致家谱散落而被破坏。这样,实现了成员个人的相关操作后,接下来便是在此基础上由Fmily类来实现家谱的各种操作,这也是软件的主体部分。通过Fmily类实现的家谱操作主要分为六大部分:一,家谱的初始化;二,家谱信息的读取和存储;三,成员管理,包括添加成员,删除成员,成员信息修改;四,查询,包括按姓名查询,按基本信息查询和按亲戚关系查询;五,统计,包括平均(最长/最短)寿命统计、平均(最高)身高统计、男女比例统计、平均(最高/低)学历统计、总人口/在世总人口统计,职业统计;六,打印家谱。具体实现如下:一, 家谱的初始化。每次启动程序时的初始化主要是对Fmily类中的私有成员赋值,其中成员int currentnum记录下一个成员的编号,初始化为1;其它Fmily类中的私有成员成员全是统计数字,全部初始化为0。当从磁盘文件中加载家谱信息时,这些私有成员则赋值为文件中记录的数字。而这里指的家谱的初始化更着重于指生成家谱,即第一次使用本软件时程序会要求用户先输入家谱中的第一个成员的信息,一般这第一个人往往是家谱记载中家族的始祖宗。相关方法:firstperson()函数:void firstperson()功能:输入家谱中的第一个成员的信息,并对家谱信息初始化。二, 家谱信息的读取和存储。进入家谱管理系统后,首先从磁盘文件中读取家谱信息,生成链表,这样才能进行家谱的其它操作;程序运行结束时,又将家谱信息写回文件。相关方法:(1)write函数原型:bool Family:write(char*filename)功能实现:把家谱信息包括家谱统计信息和各个成员信息写入指定的文件中,若操作成功,return true。 关键语句:person* p=head; while(p) p-write(file); p=p-next; (2)read函数原型:bool Family:read(char *filename)功能实现:从指定文件中读取家谱信息包括家谱统计信息和各个成员信息,每读取一个成员的信息就生成一person结点,并以Family类的私有成员person * head作头指针,将各个成员链成双向链表,若操作成功,return true。三, 成员管理。包括添加成员,删除成员,成员信息修改。 添加成员,按新添成员以何种身份加入家谱分为四种情况:按配偶添加,按一般成员添加,按婴儿添加和按已故成员添加。添加成员的时候,需要输入成员信息,这时是调用person类中输入个人信息的相关函数来实现。再根据成员加入家谱时的身份和关系人,给指针信息即邻接点的编号赋值,最后将该新添成员链在表尾完成成员的添加。调用person类的personinput(),childinput(),deathinput()等函数。 删除成员,用户输入要删除的成员的名字,找到该成员并删除该成员在家谱中的记录,调用person类的delinformation()函数。 成员信息修改,用户输入要删除的成员的名字,找到该成员并修改其信息,提供菜单,用户可选择其中一项或若干项进行修改。调用 person类的change()函数。 相关方法:(1) enterspouse() 函数原型:void Family:enterspouse() 功能实现:按配偶添加成员,并根据新添成员的信息修改相关的家谱统计信息,如平均身高等。(2) enterchild()函数原型:void Family:enterchild() 功能实现:按婴儿添加成员,并根据新添成员的信息修改相关的家谱统计信息。(3) entercommon()函数原型:void Family:entercommon() 功能实现:按一般成员添加成员,并根据新添成员的信息修改相关的家谱统计信息。(4) enterdeath()函数原型:void Family:enterdeath() 功能实现:按已故成员添加成员,并根据新添成员的信息修改相关的家谱统计信息。(5) deleteperson()函数原型:void Family: deleteperson() 功能实现:删除指定的成员,保留其编号及邻接点编号,并根据新添成员的信息修改相关的家谱统计信息。(6) change()函数原型:void Family: change() 功能实现:改变成员信息,并根据成员信息的改动修改相关的家谱统计信息。四, 查询,包括按姓名查询,按基本信息查询和按亲戚关系查询。按姓名查询是从链表中逐个成员比较,直到找到名字相同的第一个结点。按基本信息查询是对链表的遍历,找出所有符合条件的成员。而按亲戚关系查询,则是按编号查询的。因家族树中每个结点都有记下邻接点的编号,因此按特定亲戚关系查询成员时就是按该结点特定的邻接点编号去查找成员。相关方法:(1) namesearch 函数原型:person* Family:namesearch(char *xname) 功能实现:用户输入姓名,查询成员,返回查找到的结点。 . 若查询失败,return NULL。(2)关于按基本信息查询的函数有void height_search();void sex_search();void deg_search();void degree_range();void job_search();函数比较简单,不作详述。(3) numsearch 函数原型:person* numsearch(int num) 功能实现:按编号查询成员,在双向链表中查询可采用就近原则,若该编号小于当前下一个编号currentnum的二分之一,则从头指针开始往后查询,否则从表尾往前查询。返回查找到的结点。若查询失败,return NULL. (4) 对某成员按亲戚关系查询其亲人就是根据该成员的相关邻接点的编号来调用numsearch方法,输出查询结果为个人信息。各种亲戚关系查询均是如此,不作详述。五, 统计,包括平均(最长/最短)寿命统计、平均(最高)身高统计、男女比例统计、平均(最高/低)学历统计、总人口/在世总人口统计,职业统计。相关方法:(1) statis_lifeyear函数原型:void Family:statis_lifeyear()功能实现:统计家族成员的平均(最长/最短)寿命统计。由Family类中私有成员lifeyear_sum,lifeyear_max,lifeyear_min记下已故成员寿命总和,最长寿命,最短寿命,统计时只需调出这些成员便可得结果。要得平均寿命还需Family类的另外两个私有成员currentnum和people_live(记录家族中在世的总人口)。(2) statis_height函数原型:void Family:statis_height()功能实现:统计家族成员的平均(最高)身高。Family类中相关私有成员有height_sum(身高总和),height_max(最高身高),currentnum和people_delete(被逐出家谱的人数)。(3) statis_mentowemen函数原型:void Family:statis_mentowemen()功能实现:统计男女比例。由Family类中私有成员man和female分别记录男性成员人数和女性成员人数。统计时将此二成员加以约分即可得男女比例。(4) statis_degree函数原型:void Family:statis_degree()功能实现:统计平均(最高/低)学历。平均学历的计算与平均身高的计算相似,计算总和时需将学历量化,以degreeclass_sum记录学历总和,无学历加1,小学加2,初中加3,。 degreeclass_max,degreeclass_min记录最高和最低学历。(5) statis_peoplecount函数原型:void Family:statis_peoplecount()功能实现:由currentnum-1-people_delete得家族总人口。people_live即是家族在世人口。(6) statis_job函数原型:void Family:statis_job()功能实现:由Family类相关私有成员数组int job15记录各种职业的人数。输出各种职业的人数统计。六, 打印家谱。主要算法是用迭代法对家族树进行深度遍历,再加上格式控制,就可以把家谱以友好的格式打印出来,显示在屏幕上。格式如下: 爷爷 父亲 儿子1 儿子2 叔叔 儿子1 。 儿子2 另外,本软件有支持鼠标的功能,体现在打印家谱显示出来后,可通过鼠标在某一成员上的点击来查看该成员的具体信息。这个功能的实现主要是利用了标准输入输出设备句柄的调用。打印家谱时用一算法记下每个成员的坐标,当鼠标事件为左键单击时,便作出相应反应,用标准输出设备句柄清屏之后输出所点中的成员的具体信息。三 后记31 软件的优缺点及待改进的地方 本软件设计思路清晰,采用面向对象的思想,把实体对象和管理实体对象的数据结构分离,易于系统的管理,不易出错,所以设计出来的家谱管理系统较为稳定。在数据结构上采用邻接表的形式,既可以正确表达家族树,又可令操作简单易行,综合了树和链表两种数据结构的优点。程序的运行时间和占用空间都很合理,算法优化。程序提供菜单类,虽不能实现可视化,但界面也算工整,条理清晰,用户界面友好。另外,本软件实现了支持鼠标的功能,方便用户。然而在家谱输出时虽格式友好,但还不能做到以可扩展的树状的形式输出,导致输出界面还比较粗糙。 32 实践感想“平时的编程作业最多是几百行,这次一下子要写4000行代码,真是郁闷”,这是我在知道这次数据结构大作业时的感慨。说实在的,一开始还真有点不知所措,毕竟这是第一次要独立

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论