家谱管理系统1.docx

上传人:牧羊曲112 文档编号:5176545 上传时间:2023-06-11 格式:DOCX 页数:26 大小:399.19KB
返回 下载 相关 举报
家谱管理系统1.docx_第1页
第1页 / 共26页
家谱管理系统1.docx_第2页
第2页 / 共26页
家谱管理系统1.docx_第3页
第3页 / 共26页
家谱管理系统1.docx_第4页
第4页 / 共26页
家谱管理系统1.docx_第5页
第5页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《家谱管理系统1.docx》由会员分享,可在线阅读,更多相关《家谱管理系统1.docx(26页珍藏版)》请在三一办公上搜索。

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磅,首行缩进:无,段中不分页, 与下段同页。仅一级标题上目录。三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在400行有效程序 行

3、以上,不得抄袭。四、课程设计工作计划2013年12月2日,指导教师讲课,学生根据题目准备资料,需求分析;2013年12月3日,设计小组进行总体方案设计和任务分工;2013年12月4日2013年12月10日,每人完成自己承担的程序模块并通过 独立编译;2013年12月11日12日,将各模块集成为一个完整的系统,并录入足够的 数据进行调试运行;2013年12月13日,验收、开始撰写课程设计报告;2013年12月18日前,提交课程设计报告和软件。指导教师签章:教研室主任签章指导教师评语与成绩第1章概述.01.1课题研究的目的和技术发展现状01.2课题研究的主要内容01.3课题研究的难点0第2章需求分

4、析12.1性能需求12.2功能需求1第3章可行性分析13.1经济可行性分析13.2技术可行性分析1第4章概要设计24.1程序设计的基本思想24.2总体功能模块图24.3相关应用技术2第5章详细设计35.1日期信息的合法性检验35.2添加成员孩子模块45.3添加成员兄弟模块75.4按照出生日期对家谱排序85.5由兄弟、孩子二叉树生成家谱文件115.6 按照姓名、出生日期查找家谱成员12第6章 调试分析与测试结果136.1测试方法136.2测试过程136.3 测试结论14第7章 结束语18参考文献19附录19第1章概述1.1课题研究的目的和技术发展现状本家谱管理系统是以电子家谱的形式记载父系家族世

5、袭、人物为中心。 电子能准确记录家族成员出生卒年,以及生活地点、家庭成员等信息。一般情况 下是不会出现信息丢失情况。更不需要担心传统家谱随着年代的久远字迹不清 晰,有破损等情况的出现。所以本课题的研究目的是让大家不但能够非常容易的 记录家族情况,而且能清楚的了解本家族信息,使用起来非常方便。现有的计算 机技术足以支撑电子家谱的开发。家谱的科学管理不但有助于民族文化和地方文 化的发展,而且有其自身的积极意义。例如本电子家谱是利用Visval C+ 6.0 开发完成的。电子家谱的出现无疑让家谱焕然一新,但是传统家谱更能凸显出历 史的韵味,文化的内涵。这是电子家谱所不能够替代的,电子家谱不可能成为文

6、 物。开发人员应该清楚的认识到这一点。1.2课题研究的主要内容家谱,又称族谱、祖谱、宗谱等。一种以表谱形式,记载一个以血缘关系为 主题的家族世系繁衍。本课题研究的主要内容是以电子家谱的形式记录、查询父 系家族历史信息为主要内容。1.3课题研究的难点建立输入文件以存放最初家谱中各成员的信息,以及能够对修改后的家谱存 盘以备以后使用。用户界面的设计不够完美。功能上的设计难度很大。第2章需求分析2.1性能需求系统的核心是利用对话框的连接和文本处理来存储和修改家族管理系统的 信息联系,其中的每一个动作都可能影响到其他的功能。使用方便,易于传播, 数据共享等性能。易于维护。2.2功能需求建立输入文件以存

7、放最初家谱中各成员的信息。成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加 其它信息、但不是必需的。能对修改后的家谱存盘以备以后使用。能从文件中读出已有的家谱,形成树状关系。 家谱建立好之后,以图形方式显示出来。显示第n代所有人的信息。按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。按照出生日期查询成员名单。输入两人姓名,确定其关系。某人添加孩子。删除某人(若其还有后代,则一并删除)。 修改某人信息。按出生日期对家谱中所有人排序。打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。第3章可行性分析3.1经济可行性分析对系统

8、开发规模进行估算属此软件项目属于小规模软件开发。所以开发人员 三到五人即可。开发,维护等成本相对较低。所以从经济可行性分析的角度来看 此家谱管理系统适于开发。3.2技术可行性分析根据软件系统功能、性能要求的各项约束条件从技术的角度实现系统的可行 性。家谱信息以树的形式一次读入内存,而个人的各种资料虽然目前条目不多, 但随着程序的升级,以后可能越来越大。我把树形结构和个人信息记录的文档分 为两个文件保存在外存中,一个文件串行化的记录家谱树的结构化信息,保持少 量个人信息作为识别标志;另一个文档保存完整的个人信息。索引时,以树形中 的少量信息为依据在另一个文件中找到全部个人信息资料。第4章概要设计

9、4.1程序设计的基本思想家谱管理系统的总体设计思路是先为程序搭建好一个人结构框架,家庭 成员之间的关系,用树形结构(家族树)表示,这是本家谱管理系统的逻辑 结构。根据MFC的特点,采用CfamilytreeDlg类实现用户窗口界面指令对于家 谱的各种操作。有文件控制和家谱控制两大模块,按生日查找、删除成员、文件 输入输出、修改成员信息、按名字查找、成员关系显示、按代数显示等各种操作。 然后再根据需求分析逐步增强程序的功能和性能。4.2总体功能模块图家谱管理系统家谱控制卜文件控制p大新建家谱保存家谱删除该人增加孩子更改资料某代信息按姓名查找出生日排序按生日查找4.3相关应用技术1. 定义“家谱”

10、类型2. 用结构Date存储日期3. 用结构QuickSortNode存储快速排序数组值(为快速排序而设)4. 根据家谱的特点,采用孩子-兄弟的二叉树链表表示法(链表的基本单位为 以结构PersonNode表示的结点),各种操作以COperationFamilytree类来 实现。5. 根据MFC的特点,采用CfamilytreeDlg类实现用户窗口界面指令对于家谱 的各种操作。第5章详细设计5.1日期信息的合法性检验图5-1日期信息的合法性检查Int COperationFamilytree:ReadNode(FILE *fp, Person &T,char* parentname) (/本

11、函数从文件fp中读取信息到结点T中,并读取结点的父亲名字到字符数组 parentname 中分别读取结点值,为:姓名,出生日期(年,月,日),婚否,地址,健在否,(如 过世,还有死亡日期)fscanf(fp,s%d%d%d%d%s%d,T-info.name,&T-info.birthday.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

12、.deathday.month ,&T-info.deathday.day);fscanf(fp,s,parentname);if(!IsDateValid(T-info.birthday)出生日期合法性检查return ;if(T-info.live=0)/若过世,死亡日期合法性检查if(!IsDateValid(T-info.deathday) return ;return OK;5.2添加成员孩子模块图5-2添加成员孩子流程图Int COperationFamilytree:CreateFamilytree(CString )(/本函数建立一新家谱DestroyFamilytree();

13、FILE* fp;if(fp=fopen(,r)=0)return READ_;T=new PersonNode;if(!T)return NOT_ENOUGH_MEMORY;T-child=0;T-sibling=0;T-parent=0;Person parentT, temp;char parentnameMAX_CHARNUM;/建立一新家谱之前,清空原有家谱/打开文件定义根结点定义两个临时结点定义一个临时字符串数组/读取根结点值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如过世, 还有死亡日期)int result;result二ReadNode(fp,T,parentn

14、ame);if(result=)(delete T;/若不合法,删除申请的堆空间T=0;return result;if(strcmp(T-info.name,parentname)=0) 根结点名字与其父亲名字相同,说明为空树 delete T;T=0;return PEDIGREE_EMPTY;/申请一结点/申请失败释放申请空间temp=new PersonNode;if(!temp)DestroyFamilytree(); return NOT_ENOUGH_MEMORY;result二ReadNode(fp,temp,parentname);while(strcmp(temp-info

15、.name,parentname)&strcmp(temp-info.name,end) /读取信息结束的条件是两个人的名字同为endif(result=)/若数据不合法,释放已申请空间,然后返回delete temp;DestroyFamilytree();return result;parentT=0;Find(T,parentT,parentname);/找到 parentname 所在结点parentTif(parentT)(/如果 parentT 存在,说明 parentname 在家谱中/并且 parentname为 temp 的父亲 int cmp;cmp二CompareDate

16、(temp-info.birthday,parentT-info.birthday);if(cmpchild=temp-sibling=0;/temp的父指针指向parentT;temp-parent=parentT;/parentname已经有孩子InsertSibling(parentT-child,temp);/ifelseparentT-child=temp;/ifelse(不存在parentname此人DestroyFamilytree(); return ;temp=new PersonNode;if(!temp)(DestroyFamilytree();return NOT_EN

17、OUGH_MEMORY;result=ReadNode(fp,temp,parentname);if(parentT-child)/parentname 无孩子,则 temp 应为/parentname的第一个孩子/parentT不存在,说明家谱中/返回出错信息/申请一结点/申请失败/释放申请空间/继续读取数据/whileif(temp)delete temp;fclose(fp);return OK;5.3添加成员兄弟模块鬲a.的成员金图5-3添加成员兄弟模块void SaveNode(FILE *fp, Person &pNode)(/本函数向文件fp中存取一结点pNodechar ch=

18、n;if(pNode)fprintf(fp,s %d %d %d %d %s %d ,pNode-info.name,pNode-info.birthday.year,pNode-info.birthday.month,pNode-info.birthday.day,pNode-info.m arry,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

19、);if(pNode-parent)/家谱结束fprintf(fp, %s ,pNode-parent-info.name); else fprintf(fp, %s,-1); fprintf(fp, %c,ch); int COperationFamilytree:SaveFamilytree(CString ) ( 本函数保存家谱到文件中 FILE* fp; if(fp=fopen(,w)=0)/打开文件return WRITE_; PreOrderTraverse(fp,T,SaveNode);/从根结点开始存储家谱数据/置家谱数据结束标记(一结点的名字与其父结点的名字同为end) fp

20、rintf(fp,%s %d %d %d %d %s %d %s,end,1999,12, 2,1,end,1,end); fclose(fp); return OK;void COperationFamilytree: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,

21、Visit); 5.4按照出生日期对家谱排序 void CFamilytreeDlg:OnFamilytreeSort() ( / TODO: Add your command handler code hereRefreshList();QuickSortNode* order;int totalNums=0;operFamilytree.GetPersonNums(operFamilytree.GetRoot(),totalNums);order=new QuickSortNodetotalNums+1;if(!order)(AfxMessageBox(内存不足!);return;AfxM

22、essageBox(排序后结果请见下部列表。);operFamilytree.SortByBirthday(order);for(int i=1;itotalNums+1;i+)DisplayInListCtrl(orderi.oneself);delete order;void COperationFamilytree:SortByBirthday(QuickSortNode *order)(本函数对顺序表order以出生日期的大小排序int totalNums=0;QuickSortNode* startaddr=order;startaddr+;GetPersonNums(T,total

23、Nums);CopyInfoFromBiTreeToArray(T,startaddr);QuickSort(order,1,totalNums);int COperationFamilytree:Partition(QuickSortNode *order, int low, int high)(本函数供QuickSort函数调用交换顺序表order中从low到high的记录,便枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它order0=orderlow;/用子表的第一个记录做枢轴记录Date pivotkey=orderlow.birthday; /枢轴记录关键字

24、while(lowhigh)(/从表的两端交替地向中间扫描while(lowhigh&(CompareDate(orderhigh.birthday,pivotkey)=1|CompareDate(orderhigh.birthday,pivotkey)=0)high;orderlow=orderhigh;将比枢轴记录小的记录移到低端orderlow.birthday=orderhigh.birthday; 枢轴记录到位 orderlow.oneself=orderhigh.oneself;while(lowhigh&(CompareDate(orderlow.birthday,pivotke

25、y)=-1|CompareDate(orderlow.birthday,pivotkey)=0) +low;orderhigh=orderlow;将比枢轴记录大的记录移到高端orderlow=order0;/枢轴记录到位return low;/返回枢轴位置 void COperationFamilytree:QuickSort(QuickSortNode *order, int low, int high) (本函数对顺序表orderlow.high作快速排序int pivotloc;长度大于1/将/对低子表递归排序,/对高子表递归排序if(lowchild,personNums);递归调用G

26、etPersonNums(T-sibling,personNums);void COperationFamilytree:CopyInfoFromBiTreeToArray(Person &T, QuickSortNode *&order) (本函数先序遍历以T为根结点的所有结点,并把每一个结点的出生日期信息及其指针值/依次存入顺序表order中if( T)(*order).birthday=T-info.birthday;(*order).oneself二T;order+;CopyInfoFromBiTreeToArray(T-child,order);CopyInfoFromBiTreeT

27、oArray(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-info.name,pNode-info.bi rthday.year,pNode-info.birthday.month,pNode-info.birthday.day,pNode-info.m arry,pNode-info.addr,pNode-info.live);

28、if(pNode-info.live=0) fprintf(fp,%d%d%d”,pNode-info.deathday.year,pNode-info.deathday.month, pNode-info.deathday.day);if(pNode-parent)/家谱结束fprintf(fp, %s ,pNode-parent-info.name); else fprintf(fp, %s,-1); fprintf(fp, %c,ch); int COperationFamilytree:SaveFamilytree(CString ) (本函数保存家谱到文件中 FILE* fp;if(

29、fp=fopen(,w)=0)/打开文件return WRITE_;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;void COperationFamilytree:PreOrderTraverse(FILE* fp,Person &T, void(_cdecl *Visit)(FILE* fp,Person &)(本函数把所

30、有以T结点为根结点的结点值存到文件fp中if( T)(*Visit)(fp,T);PreOrderTraverse(fp,T-child,Visit);PreOrderTraverse(fp,T-sibling,Visit);5.6按照姓名、出生日期查找家谱成员void COperationFamilytree:Find(Person& T,Person& Tname,char* name)(本函数以T为根结点开始,搜索结点信息中名字等于name的结点if(T)(/如果T存在if(strcmp(T-info.name,name)=0) /T 结点姓名和 name 相同,把 T 结点指针传给Tn

31、ameTname=T;else(Find(T-sibling,Tname,name);对 T 的兄弟递归搜索Find(T-child,Tname,name);对 T 的孩子递归搜索 void COperationFamilytree:Find(Person &T, Person*& Tname,int month, int day)(本函数以T为根结点开始,搜索结点信息中生日等于month,day的结点,并把所有符合条件的结点指针值存入以Tname为起始地址的地址数组中if(T)(如果T存在if(T-info.birthday.month=month& T-info.birthday.day=

32、day)/T结点生日与所给相同,把T结点指针传给Tname,同时Tname指针前进 *Tname二T;Tname+;else(Find(T-sibling,Tname,month,day); /对 T 的兄弟递归搜索Find(T-child,Tname,month,day); /对 T 的孩子递归搜索 第6章 调试分析与测试结果6.1测试方法该课程设计只有一个主要类,即对孩子一一兄弟二叉树的操作类。该类主要 包括文件读取函数、创建孩子一一兄弟二叉树函数、在树中查找函数、遍历函数 以及对树中结点进行加入、删除、修改的函数。由于树存储结构的特殊性,故编 制这些算法时大量使用了递归,虽然这样做可能会

33、降低程序的执行效率,但程序 的易读性较强。6.2测试过程在调试时,遇到的几个问题如下:(1)建立树时,由于新申请结点的孩子指针、兄弟指针、及双亲指针均未 赋空值。而在以后的函数中对树进行递归操作时均以这些指针值中的一 个或几个是否为空作为递归结束条件。从而导致调用这些函数时出现系 统保护异常(使用了不安全的指针)。(2)刚开始删除结点时,只考虑到删除其本身结点的情况,而删除其孩子 结点的情况未考虑到,故在删除某些结点时使树出现了 “断链”现象。 故在程序代码中对删除某一结点进行操作时,首先要判断此结点是否有 孩子及兄弟,然后进行相应操作。(3)刚开始进行程序概要设计时,曾考虑到用控制台下的文本

34、方式作为程 序界面,实际操作后发现并不理想。一方面字符形式的界面友好性较差, 另一方面显示整个家谱树的信息时不方便。故考虑用VC+中MFC类自带 的树型控件显示家谱层次,而用列表控件显示家谱中的信息。用后效果不错。6.3测试结论(1)按下按钮“打开家谱”,打开一个家谱文件(*.ftf)但湖苣坦里貌-jrJI(2)按下按钮“新建家谱”,新建一个家谱文件(*.ftf)(3) 按下按钮“保存家谱”,将修改过的家谱保存(4) 按下按钮“另存家谱”将修改过的家谱另存为一个家谱文件(*.ftf)(5) 按下按钮“删除该人”,将树型控件中选中的成员及其后代删除(6)按下按钮“增加孩子”,给树型控件中选中的成

35、员增加一个孩子(7)按下按钮“更改资料”,更改树型控件中选中的成员的资料(8)按下按钮“按照姓名查找”,将家谱中特定名字的成员的信息显示在列表控 件中匚手魂豆什操作-李伟:.三吉 t李用+李华幌洋家诺出生日期排序杲代陪息技照兰口查找姓右匕主口期婚舌如J 1逢在否-死亡曰期孩子数李伟19S65是古林市昌邑区是无11(9)按下按钮“确定两人关系”,将家谱中某两人的关系显示出来(10)按下按钮“出生日期排序”,将家谱中的所有成员按出生日期排序并 显示在列表控件中(Manu)-M沿-李亮i白孕韦 手侑:田孝明南李华文件操作打E晋新崖军i晋倡有军-.晋用行家主姓各 n出注日期鸠否地址函t否无匚期咳子敬r

36、d李易194至华194李佶ME李明196?至达197李传1李璐1935- 12-9是39106 54是f 1】是0933015是2-3-25蓉吉吉特古套邑M北卓市2008-512 2012416 无 无 无 无2 1 111 0 02121(11)按下按钮“按照生日查找”,将家谱中特定日期出生的成员的信息显示在列表控件中(12)选择菜单项目“关于”,显示该程序的版权信息(13)选择菜单项目“退出”,结束该程序的运行逸涂健用本程序1由于我们于MFC的开发经会不足r EUGJB龟有之r还造 多多包涵;)I 11 I 磷;E第7章 结束语通过这次大作业,体会很深刻,将一直以来学到的东西都运用到实际上

37、来, 学以致用,对所学知识有了更深刻的理解,同时还发现了许多平时在书本上没有 遇见过的问题,促进了自己对知识的渴望,遇见了问题,就希望能够通过查找课 外书来解决它们。刚接触题目的时候,自己就有了一定的想法,觉得这个程序做 起来是问题不大的,但到了自己真正开始编程的时候却发现远远没有想象中那么 简单,很多细节的问题没有预想到,很多关系的处理想得过于简单,以至于实施 起来遇到了很大的困难,花了大量的时间。同时还有一个比较深刻的体会就是要 尽量多在源码上作注释,以前编一些功能简单的程序,总能很清楚每个函数和每 个变量的作用,但到了做这个大作业,由于分开了各个功能板块去实现,很多时 候是做了后面就忘了

38、前面,后来意识到这个问题,便开始在编程时加入注释,而 且是越详细越好,这样做了以后,很多时候需要查看自己原来写的源代码,也能 够很方便地了解了,跟上了思路,也方便以后的维护。关于这个程序的缺点方面,由于自己花的时间不是很多,再加上知识有限, 编写出来的界面不够友好,在功能上还是有不完善的地方,譬如说各项数据的统 计还没有弄,数据的存储还不够理想等等。对于这个程序的改进,我自己还是有不少想法的。首先是需要加强数据的存 储这方面的知识,使自己编写出来的程序能以一种标准的格式存储下来,方便以 后其它程序的读取。总的来说,通过这次作业,收获还是挺多的,也发现了不少的问题,并给自 己以后的学习指引了方向

39、,知道自己缺少哪方面的知识,需要补充哪些知识等等。 自己将会以这次作业为契机,看更多编程方面的书籍,不断充实自己的知识库。参考文献数据结构(C语言版)一一清华大学出版社一一严蔚敏、吴伟民编著C至Visual C+程序设计语言一一科学出版社一一蔡常丰、林小苹编著Microsoft Visual C+ 6.0高手速成兵器工业出版社步行者工作室编著C+程序设计一一清华大学出版社一一谭浩强编著附录源程序文件名清单:一Familytree.cpp& Familytree.h主程序实现单元文件输入输出实现单元一OperationFamilytree.cpp& OperationFamilytree.h家谱

40、操作实现单元StdAfx.cpp& StdAfx.h &Resourse.hMFC 类实现及资源头文件Familytree.rc& Familytree.rc2& Familytree.ico资源文件AddInfoDlg.cpp& AddInfoDlg.h增加成员的实现单元DelInfoDlg.cpp& DelInfoDlg.h删除成员的实现单元ModifyInfoDlg.cpp& ModifyInfoDlg.h修改成员资料的实现单元BirthdayDlg.cpp& BirthdayDlg.h按出生日期查找成员的实现单元PersonalInfoDlg.cpp& PersonalInfoDlg.h按姓名查找成员的实现单元RelationsDlg.cpp& RelationsDlg.h显示成员关系的实现单元SearchGenerationDlg.cpp& SearchGenerationDlgh显示代数的实现单元

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号