



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.软件综合设计家谱管理系统院系:计算机科学技术学院二系班级:计11 2班姓名:刘文秀( 15)合 作 者:姜雪 (05) 、岳奉宜 (33)指导教师:薛曼玲2013年12月01日.软件 综合设计 任务书一、题目:家谱管理系统二、设计要求( 1)刘文秀(组长)、姜雪和岳奉宜组成课程设计小组。( 2)小组成员分工协作完成。要求每个成员有自己相对独立的模块, ,同时要了解其他组员完成的内容。( 3)查阅相关资料,自学具体课题中涉及到的新知识。( 4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。( 5)所设计的系统应有菜单、动画和音乐。( 6)按要求写出课程设计报告,并于设计结束后 1
2、周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。报告一律用 A4 纸打印,正文的中文字体为宋体,西文字体用 Time New Roma ,一律用小四号字,行距采用“固定值” 18 磅,首行缩进 2字符。 1 级标题中文字体为黑体,西文字体为Time New Roma,采用三号字;段落为居中、段前18 磅、段后 12 磅、行距采用“固定值”18 磅,首行缩进:无,段中不分页,与下段同页。仅一级标题上目录。三、课程设计工作量由于是设计小组团结协作完成设计任务,
3、 一般每人的程序量在 400 行有效程序行以上,不得抄袭。四、课程设计工作计划2013 年 12 月 2 日,指导教师讲课,学生根据题目准备资料,需求分析;2013 年 12 月 3 日,设计小组进行总体方案设计和任务分工;2013 年 12 月 4 日 2013 年 12 月 10 日,每人完成自己承担的程序模块并通过独立编译;2013 年 12 月 11 日 12 日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2013 年 12 月 13 日,验收、开始撰写课程设计报告;2013 年 12 月 18 日前,提交课程设计报告和软件。指导教师签章:教研室主任签章.指导教师评语
4、与成绩指导教师评语:课程设计验收成绩:课程设计报告成绩:课程设计总成绩:指导教师签章年月日.目录第 1 章 概述 .11.1课题研究的目的和技术发展现状 .11.2课题研究的主要内容 .11.3课题研究的难点 .1第 2章 需求分析 .22.1性能需求 .22.2功能需求 .3第 3章 可行性分析 .33.1经济可行性分析 .33.2技术可行性分析 .4第 4章 概要设计 .44.1程序设计的基本思想 .44.2总体功能模块图 .44.3相关应用技术 .5第 5章详细设计 .65.1日期信息的合法性检验 .65.2添加成员孩子模块 .75.3添加成员兄弟模块 .135.4按照出生日期对家谱排序
5、 .15.5.5由兄弟、孩子二叉树生成家谱文件 .205.6按照姓名、出生日期查找家谱成员 .23第 6章 调试分析与测试结果 .256.1测试方法 .256.2测试过程 .256.3测试结论 .26第 7章 结束语 .31参考文献.33附录 .33.第1章概述1.1 课题研究的目的和技术发展现状本家谱管理系统是以电子家谱的形式记载父系家族世袭、人物为中心。电子能准确记录家族成员出生卒年,以及生活地点、 家庭成员等信息。 一般情况下是不会出现信息丢失情况。更不需要担心传统家谱随着年代的久远字迹不清晰,有破损等情况的出现。 所以本课题的研究目的是让大家不但能够非常容易的记录家族情况, 而且能清楚
6、的了解本家族信息,使用起来非常方便。 现有的计算机技术足以支撑电子家谱的开发。 家谱的科学管理不但有助于民族文化和地方文化的发展,而且有其自身的积极意义。例如本电子家谱是利用VisvalC+6.0开发完成的。电子家谱的出现无疑让家谱焕然一新,但是传统家谱更能凸显出历史的韵味,文化的内涵。 这是电子家谱所不能够替代的,电子家谱不可能成为文物。开发人员应该清楚的认识到这一点。1.2 课题研究的主要内容家谱,又称族谱、祖谱、宗谱等。一种以表谱形式,记载一个以血缘关系为主题的家族世系繁衍。 本课题研究的主要内容是以电子家谱的形式记录、查询父系家族历史信息为主要内容。1.3 课题研究的难点建立输入文件以
7、存放最初家谱中各成员的信息,以及能够对修改后的家谱存盘以备以后使用。用户界面的设计不够完美。功能上的设计难度很大。.第2章需求分析2.1 性能需求系统的核心是利用对话框的连接和文本处理来存储和修改家族管理系统的信息联系,其中的每一个动作都可能影响到其他的功能。使用方便,易于传播,.数据共享等性能。易于维护。2.2 功能需求建立输入文件以存放最初家谱中各成员的信息。成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。能对修改后的家谱存盘以备以后使用。能从文件中读出已有的家谱,形成树状关系。家谱建立好之后,以图形方式显示出来。显示
8、第 n 代所有人的信息。按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。按照出生日期查询成员名单。输入两人姓名,确定其关系。某人添加孩子。删除某人(若其还有后代,则一并删除)。修改某人信息。按出生日期对家谱中所有人排序。打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。第 3章可行性分析3.1 经济可行性分析.对系统开发规模进行估算属此软件项目属于小规模软件开发。所以开发人员三到五人即可。 开发,维护等成本相对较低。 所以从经济可行性分析的角度来看此家谱管理系统适于开发。3.2 技术可行性分析根据软件系统功能、性能要求的各项约束条件从技术的角度实现系统的可行性。家谱信
9、息以树的形式一次读入内存,而个人的各种资料虽然目前条目不多,但随着程序的升级, 以后可能越来越大。 我把树形结构和个人信息记录的文档分为两个文件保存在外存中, 一个文件串行化的记录家谱树的结构化信息,保持少量个人信息作为识别标志; 另一个文档保存完整的个人信息。索引时,以树形中的少量信息为依据在另一个文件中找到全部个人信息资料。第4章概要设计4.1 程序设计的基本思想家谱管理系统 的总体设计思路是先为程序搭建好一个人结构框架,家庭成员之间的关系,用树形结构(家族树)表示,这是本家谱管理系统的逻辑结构。根据 MFC 的特点,采用 CfamilytreeDlg类实现用户窗口界面指令对于家谱的各种操
10、作。有文件控制和家谱控制两大模块, 按生日查找、删除成员、文件输入输出、修改成员信息、按名字查找、成员关系显示、按代数显示等各种操作。然后再根据需求分析逐步增强程序的功能和性能。4.2 总体功能模块图.4.3 相关应用技术1.定义“家谱”类型2.用结构 Date 存储日期3.用结构 QuickSortNode存储快速排序数组值(为快速排序而设)4.根据家谱的特点,采用孩子-兄弟的二叉树链表表示法(链表的基本单位为以结构 ersonNode表示的结点),各种操作以COperationFamilytree类来实现。5.根据 MFC 的特点,采用CfamilytreeDlg类实现用户窗口界面指令对于
11、家谱的各种操作。.第5章详细设计5.1 日期信息的合法性检验图 5-1日期信息的合法性检查IntCOperationFamilytree:ReadNode(FILE*fp,Person&T,char*parentname)/ 本函数从文件fp 中读取信息到结点T 中,并读取结点的父亲名字到字符数.组 parentname 中/ 分别读取结点值 ,为 :姓名 ,出生日期 ( 年,月 ,日 ), 婚否 ,地址 ,健在否 ,( 如过世,还有死亡日期 )fscanf(fp,"%s%d%d%d%d%s%d",T->,&T->info.bi
12、rthday.year, &T->info.birthday.month,&T->info.birthday.day,&T->info.marry,T->info.addr,&T->info.live);if(T->info.live=0)fscanf(fp,"%d%d%d",&T->info.deathday.year,&T->info.deathday.month,&T->info.deathday.day);fscanf(fp,"%s",p
13、arentname);if(!IsDateValid(T->info.birthday)/ 出生日期合法性检查returnFILE_DATA_NOT_PRACTICAL;if(T->info.live=0)/ 若过世 ,死亡日期合法性检查if(!IsDateValid(T->info.deathday)returnFILE_DATA_NOT_PRACTICAL;return OK;5.2 添加成员孩子模块.图 5-2添加成员孩子流程图IntCOperationFamilytree:CreateFamilytree(CString filename)/ 本函数建立一新家谱Des
14、troyFamilytree();/ 建立一新家谱之前,清空原有家谱FILE* fp;if(fp=fopen(filename,"r")=0)/ 打开文件 filenamereturn READ_FILE_ERROR;T=new PersonNode;/ 定义根结点if(!T).return NOT_ENOUGH_MEMORY;T->child=0;T->sibling=0;T->parent=0;Person parentT, temp;/ 定义两个临时结点char parentnameMAX_CHARNUM;/ 定义一个临时字符串数组/ 读取根结点值
15、,( 姓名 ,出生日期 (年 ,月,日), 婚否 ,地址 ,健在否 ,( 如过世,还有死亡日期 )int result; result=ReadNode(fp,T,parentname);if(result=FILE_DATA_NOT_PRACTICAL)delete T;/ 若不合法,删除申请的堆空间T=0;return result;if(strcmp(T->,parentname)=0)/ 根结点名字与其父亲名字相同,说明为空树 delete T;.T=0;return PEDIGREE_EMPTY;temp=new PersonNode;/ 申请一结点if(!t
16、emp)/ 申请失败DestroyFamilytree();/ 释放申请空间return NOT_ENOUGH_MEMORY;result=ReadNode(fp,temp,parentname);while(strcmp(temp->,parentname)&&strcmp(temp->,"end") /读取信息结束的条件是两个人的名字同为endif(result=FILE_DATA_NOT_PRACTICAL)/ 若数据不合法,释放已申请空间,然后返回 delete temp;DestroyFamilytr
17、ee();return result;parentT=0;.Find(T,parentT,parentname);/ 找到 parentname所在结点parentTif(parentT)/ 如果 parentT存在,说明 parentname在家谱中/ 并且 parentname为 temp的父亲int cmp;cmp=CompareDate(temp->info.birthday,parentT->info.birthday);if(cmp<0)/ 若孩子出生日期比父亲大,则不对delete temp;DestroyFamilytree();returnFILE_DATA
18、_NOT_PRACTICAL;temp->child=temp->sibling=0;temp->parent=parentT;/temp的父指针指向parentT;if(parentT->child)/parentname已经有孩子InsertSibling(parentT->child,temp);/if.else/parentname无孩子 ,则 temp 应为parentT->child=temp;/parentname的第一个孩子/ifelse/parentT不存在 ,说明家谱中不存在 parentname此人DestroyFamilytree()
19、;/ 返回出错信息return FILE_DATA_ERROR;temp=new PersonNode;/ 申请一结点if(!temp)/ 申请失败DestroyFamilytree();/ 释放申请空间return NOT_ENOUGH_MEMORY;result=ReadNode(fp,temp,parentname);/ 继续读取数据/whileif(temp)delete temp;fclose(fp);return OK;.5.3 添加成员兄弟模块图 5-3添加成员兄弟模块void SaveNode(FILE *fp, Person &pNode)/ 本函数向文件 fp 中存
20、取一结点 pNode char ch='n'if(pNode)fprintf(fp,"%s%d%d%d%d%s%d",pNode->,pNode->info.birthday.year,.pNode->info.birthday.month,pNode->info.birthday.day,pNode->info.marry,pNode->info.addr,pNode->info.live);if(pNode->info.live=0)fprintf(fp,"%d%d%d"
21、;,pNode->info.deathday.year,pNode->info.deathday.month,pNode->info.deathday.day);if(pNode->parent)/ 家谱结束fprintf(fp," %s ",pNode->parent->);elsefprintf(fp," %s","-1");fprintf(fp," %c",ch);int COperationFamilytree:SaveFamilytree(CStrin
22、g filename)/ 本函数保存家谱到文件 filename 中FILE* fp;if(fp=fopen(filename,"w")=0)/ 打开文件 filename.return WRITE_FILE_ERROR;PreOrderTraverse(fp,T,SaveNode);/ 从根结点开始存储家谱数据/ 置家谱数据结束标记 (一结点的名字与其父结点的名字同为 end) fprintf(fp,"%s %d %d %d %d %s %d %s","end",1999,12,2,1,"end",1,"
23、;end");fclose(fp); return OK;voidCOperationFamilytree:PreOrderTraverse(FILE*fp,Person&T, void(_cdecl *Visit)(FILE* fp,Person &)/ 本函数把所有以 T 结点为根结点的结点值存到文件 fp 中if(T)(*Visit)(fp,T);PreOrderTraverse(fp,T->child,Visit);PreOrderTraverse(fp,T->sibling,Visit);5.4 按照出生日期对家谱排序.void CFamilyt
24、reeDlg:OnFamilytreeSort()/ TODO: Add your command handler code here RefreshList();QuickSortNode* order; int totalNums=0; operFamilytree.GetPersonNums(operFamilytree.GetRoot(),totalNums);order=new QuickSortNodetotalNums+1;if(!order)AfxMessageBox("内存不足 !");return;AfxMessageBox("排序后结果请见下
25、部列表。");operFamilytree.SortByBirthday(order);for(int i=1;i<totalNums+1;i+)DisplayInListCtrl(orderi.oneself);delete order;void COperationFamilytree:SortByBirthday(QuickSortNode *order)./ 本函数对顺序表 order 以出生日期的大小排序int totalNums=0;QuickSortNode* startaddr=order;startaddr+;GetPersonNums(T,totalNums
26、);CopyInfoFromBiTreeToArray(T,startaddr);QuickSort(order,1,totalNums);intCOperationFamilytree:Partition(QuickSortNode*order,intlow,inthigh)/ 本函数供 QuickSort 函数调用/ 交换顺序表 order 中从 low 到 high 的记录,便枢轴记录到位,并返回其所在位置,此时/ 在它之前(后)的记录均不大(小)于它order0=orderlow;/ 用子表的第一个记录做枢轴记录Date pivotkey=orderlow.birthday;/ 枢轴记
27、录关键字.while(low<high)/ 从表的两端交替地向中间扫描while(low<high&&(CompareDate(orderhigh.birthday,pivotkey)=1|CompareDate(orderhigh.birthday,pivotkey)=0)-high;orderlow=orderhigh;/ 将比枢轴记录小的记录移到低端orderlow.birthday=orderhigh.birthday;/ 枢轴记录到位orderlow.oneself=orderhigh.oneself;while(low<high&&
28、(CompareDate(orderlow.birthday,pivotkey)=-1|CompareDate(orderlow.birthday,pivotkey)=0)+low;orderhigh=orderlow;/ 将比枢轴记录大的记录移到高端orderlow=order0;/ 枢轴记录到位return low;/ 返回枢轴位置.void COperationFamilytree:QuickSort(QuickSortNode *order, int low, inthigh)/ 本函数对顺序表 orderlow.high作快速排序int pivotloc;if(low<high
29、)/ 长度大于 1pivotloc=Partition(order,low,high);/ 将 orderlow.high一分为二QuickSort(order,low,pivotloc-1);/ 对 低 子 表 递 归 排 序 ,pivotloc是枢轴位置QuickSort(order,pivotloc+1,high);/ 对高子表递归排序voidCOperationFamilytree:GetPersonNums(Person&T,int&personNums)/ 本函数返回以 T 为根结点的所有结点数,并把结果存入 personNums 中/ 初始值 personNums
30、 必须为 0if(T)personNums+;.GetPersonNums(T->child,personNums);/ 递归调用GetPersonNums(T->sibling,personNums);voidCOperationFamilytree:CopyInfoFromBiTreeToArray(Person&T,QuickSortNode *&order)/ 本函数先序遍历以 T 为根结点的所有结点,并把每一个结点的出生日期信息及其指针值/ 依次存入顺序表 order 中if(T)(*order).birthday=T->info.birthday;
31、(*order).oneself=T;order+;CopyInfoFromBiTreeToArray(T->child,order);CopyInfoFromBiTreeToArray(T->sibling,order);5.5由兄弟、孩子二叉树生成家谱文件.void SaveNode(FILE *fp, Person &pNode)/ 本函数向文件 fp 中存取一结点 pNode char ch='n'if(pNode)fprintf(fp,"%s %d %d %d %d %s %d",pNode->,pNod
32、e->info.birthday.year,pNode->info.birthday.month,pNode->info.birthday.day,pNode->info.marry,pNode->info.addr,pNode->info.live);if(pNode->info.live=0)fprintf(fp,"%d%d%d",pNode->info.deathday.year,pNode->info.deathday.month,pNode->info.deathday.day);if(pNode->
33、;parent)/ 家谱结束fprintf(fp," %s ",pNode->parent->);elsefprintf(fp," %s","-1");fprintf(fp," %c",ch);.int COperationFamilytree:SaveFamilytree(CString filename)/ 本函数保存家谱到文件 filename 中FILE* fp;if(fp=fopen(filename,"w")=0)/ 打开文件 filenameretur
34、n WRITE_FILE_ERROR;PreOrderTraverse(fp,T,SaveNode);/ 从根结点开始存储家谱数据/ 置家谱数据结束标记 (一结点的名字与其父结点的名字同为 end) fprintf(fp,"%s %d %d %d %d %s %d %s","end",1999,12,2,1,"end",1,"end");fclose(fp); return OK;voidCOperationFamilytree:PreOrderTraverse(FILE*fp,Person&T, void
35、(_cdecl *Visit)(FILE* fp,Person &)./ 本函数把所有以 T 结点为根结点的结点值存到文件 fp 中if(T)(*Visit)(fp,T);PreOrderTraverse(fp,T->child,Visit);PreOrderTraverse(fp,T->sibling,Visit);5.6按照姓名、出生日期查找家谱成员voidCOperationFamilytree:Find(Person&T,Person&Tname,char*name)/ 本函数以 T 为根结点开始 ,搜索结点信息中名字等于 name 的结点if(T)/ 如果 T存在if(strcmp(T->in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论