欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    家谱树管理系统设计.doc

    • 资源ID:1083026       资源大小:716.50KB        全文页数:30页
    • 资源格式: DOC        下载积分:10积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要10积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    家谱树管理系统设计.doc

    1、湖南科技大学数据结构课程设计(报告)数 据 结 构 课程设计报告家谱树管理系统学生姓名: 张 朝 政 学 号: 0807020218 年级专业: 08级信息与计算科学班 级: 信计二班 指导老师: 李英龙老师 学 院:数学与计算科学学院 同组成员:夏 鑫 杨贵生 左 斌起止时间:2010.6.212010.6.27目 录1 前言32 课程设计的相关说明32.1课程设计的要求32.2课程设计的需求分析32.3课程设计的实验环境43 家谱树管理系统的概要分析44 家谱树管理系统的详细分析84.1函数调用的关系图84.2 系统运行主界面94.3各主要功能的函数实现105 系统各功能的调试分析(附有运

    2、行截图)195.1文件操作模块195.11新建家谱205.12打开家谱205.13保存家谱205.2家谱操作模块 215.21删除某人 215.22增加孩子 225.23两人关系与某代信息 225.24姓名查找 225.25个人修改 235.3调试小结 236 心得体会246.1.个人感想及不足之处247 参考文献25附录26 家谱树管理系统张 朝 政(湖南科技大学 信息与计算科学专业 0807020218)前 言本次课程设计任务是通过编写一个简单的家谱树管理系统,进一步学习用MFC开发简单的管理系统。采用Visual C+ 6.0软件为主要开发工具,更进一步了解系统开发的需求分析、层次设计、

    3、数据结构分析、编码测试、模块组装与整体调试的全过程,加深对树状数据结构的理解与MFC环境的使用,以便逐步熟悉大型程序设计的方法,养成良好的编程习惯。本系统主要完成对家谱的相关操作和家谱人员信息的管理,包括打开家谱、新建家谱、保存家谱和家谱人员的姓名查找、生日查找、某代信息查找、增加孩子、两人关系、信息修改、信息删除等。系统的核心是利用对话框的连接和文本处理来存储和修改家谱管理系统的信息联系,其中的每一个动作都可能影响到其它的功能。2 课程设计的相关说明 2.1 课程设计的要求题目:家谱树管理系统1).建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。2).对界面的要求

    4、是:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 2.2课程设计的需求分析 1). 输入文件以存放最初家谱中各成员的信息。 成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)2). 实现数据的存盘和读盘。3). 以图形方式显示家谱。(利用树形控件)4). 显示第n 代所有人的信息。5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。6). 按照出生日期查询成员名单。7). 输入两人姓名,确定其关系。8). 某成员添加孩子。9). 删除某成员(若其还有后代,则一并删除)。10).修改某成员信息。11).按出生日期对家

    5、谱中所有人排序。2.3课程设计的实验环境开发工具: Visual C+运行环境:Windows 9x、Windows NT/2000、Windows XP 3家谱树管理系统的概要分析1、抽象数据类型兄弟孩子树的定义如下:ADT CSNode数据对象: person是兄弟孩子树中的每一个节点,T是整个树的统一体数据关系: R1=person,person|person,person表示person和person之间有血缘关系基本操作:CSNode *CreatTree(fstream &outfile);初始条件:已经打开了文本文件PersonInfo.txt操作结果:创建一个兄弟孩子树T,并把

    6、从文件中的数据送到树中,关闭文件。void CreatParent_step(CSNode *parent);初始条件:兄弟孩子树T已经存在操作结果:对所有的孩子节点添加指向父亲的指针void InOrderTraverse(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:对T进行中序遍历。bool Today_Brithday(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:根据计算机系统的时间判断几天是否有人过生日,并显示他们的名字。bool (int n,CSNode *T,LinkQueue &Q); 初始条件:兄弟孩子树T已经存在,队列Q也已经存在 操作结

    7、果:用队列Q返回第N代人的所有信息void Link_Info(LinkQueue Q); 初始条件:队列Q中是第N代人的所有信息 操作结果:显示队列中所有人的信息。CSNode *DetectMember_Name(CSNode *T,char name); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的姓名进行查找,如找到则返回该节点的指针。CSNode *DetectMember_BornDate(CSNode *T,Date date); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的出生日期进行查找,如找到则返回该节点的指针。void OutputOneInfo(CSNo

    8、de *T); 初始条件:采集到一个节点T 操作结果:显示这一个节点的所有信息。void Output_Name_Relation(CSNode *T); 初始条件:采集到一个节点T 操作结果:显示这一个节点的父亲和孩子的所有信息。void Delete_Member(CSNode *T,char name); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的姓名进行查找,如找到则删除该节点和他所有的孩子节点。void Edit_Member_Info(CSNode *T,char name); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的姓名进行查找,如找到则根据用户要求修改相应

    9、的信息。bool Add_New_Child(CSNode *T); 初始条件:兄弟孩子树T已经存在 操作结果:根据输入的姓名进行查找,如找到则在他的孩子树中添加新的孩子节点。void InOrderInfile(CSNode *T,fstream &infile); 初始条件:兄弟孩子树T已经存在,且已经打开了文本文PersonInfo.txt 操作结果:把现在的数据读入文件中,关闭文件。bool Generation(CSNode *T,CSNode *child); 初始条件:兄弟孩子树T已经存在 操作结果:判断child是否是T的后代,如果是返回true,否则返回false。Void

    10、Output_Two_Member_Realtionship(CSNode*T,char name1,char name2); 初始条件:兄弟孩子树T已经存在 操作结果:根据已经输入的两个姓名进行查找和判断,确定他们的关系。void InOrderIn(CSNode *T,CSNode S,int &num); 初始条件:兄弟孩子树T已经存在 操作结果:对T进行中序遍历,并且把每一个节点信息送到数组S中,num为S中成员个数。void LineChars(CSNode S,int num); 初始条件:节点数组S已经存在操作结果:对数组的节点信息按照出生日期进行排序,采用的是基数排序ADT C

    11、SNode2、抽象数据类型队列的定义如下:ADT LinkQueue数据对象:D=ei| i=1,2,3,n;n0;eiLinkQueue 数据关系:R1=ei-1, ei|ei-1,ei表示ei-1和ei之间有先后顺序关系基本操作:bool InitQueue(LinkQueue &Q); 操作结果:创建一个空的队列Q。bool DestroyQueue(LinkQueue &Q); 初始条件:队列Q存在 操作结果:销毁队列Q,Q不再存在。bool EnQueue(LinkQueue &Q,CSNode e); 初始条件:队列Q存在 操作结果:插入元素e为Q的新的队尾元素。bool Clea

    12、rQueue(LinkQueue &Q); 初始条件:队列Q存在 操作结果:清空队列Q。bool QueueEmpty(LinkQueue Q); 初始条件:队列Q存在 操作结果:若队列为空,则返回true,否则返回false。bool DeQueue(LinkQueue &Q,CSNode &e); 初始条件:队列Q存在 操作结果:删除Q的队头元素,并用e返回其值,并返回true。int QueueLength(LinkQueue Q); 初始条件:队列Q存在 操作结果:返回队列Q的长度。bool GetHead(LinkQueue Q,CSNode &e); 初始条件:队列Q存在 操作结果

    13、:用e返回队首元素,并返回true。 ADT LinkQueue3、主程序Void main() 打开文本文件PersonInfo.txt; Do接受命令(对兄弟孩子树进行相关的操作的选项);处理命令(对兄弟孩子树进行相关的操作);while(“命令”!=“退出”);4家谱树管理系统的详细设计4.1 函数调用的关系图MainToday_BrithdayName_RelationEdit_Member_InfoDelete_MemberAdd_New_ChildDetectOutput_N_MembersOutput_Two_Member_RealtionshipInOrderInfileDet

    14、ectMember_BornDateDetectMember_Name系统进入 4.2系统运行主界面 图3.2系统运行主界面4.3各主要功能函数的实现说明:由于系统的功能函数较多且代码量大,故只选取了打开家谱、家谱保存、两人关系、增加孩子等为例。1打开家谱函数的实现/ void CFamilytreeDlg:OnFileOpen()函数的实现void CFamilytreeDlg:OnFileOpen() / TODO: Add your control notification handler code hereif(IsFamilytreeModified)/如家谱被修改,给出保存提示Sa

    15、veTip();IsFamilytreeModified=false;CFileOpenAndSaveDlg dlg(true);/打开文件对话框if(dlg.DoModal()=IDCANCEL)return;UpdateData(false);if(strcmp(dlg.m_filePath,)=0)AfxMessageBox(文件名不能为空!);return;int result;result=operFamilytree.CreateFamilytree(dlg.m_filePath);/根据用户指定的文件名建立家谱if(result!=OK) /建立家谱时有错误switch(resu

    16、lt)case NOT_ENOUGH_MEMORY:/内存不足AfxMessageBox(内存不足!);break;case READ_FILE_ERROR:/读文件错误AfxMessageBox(文件无法打开!);break;case FILE_DATA_NOT_PRACTICAL:/文件数据不合实际AfxMessageBox(家谱日期数据不合实际!);break;case FILE_DATA_ERROR:/文件数据错误(一个人的父亲的名字在家谱中从未出现)AfxMessageBox(家谱成员关系有误!);break;case PEDIGREE_EMPTY: /家谱没有根结点AfxMessa

    17、geBox(家谱没有根结点!);break;return;strcpy(savepath,dlg.m_filePath);/修改保存文件路径为当前打开文件路径RefreshTree();/刷新树型控件RefreshList();/刷新列表控件BirthdayTip();/提示今天是家谱中哪些人的生日 GetDlgItem(IDC_ADD)-EnableWindow(TRUE); /家谱控制按钮可用 GetDlgItem(IDC_DELETE)-EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)-EnableWindow(TRUE); GetDlgItem(ID

    18、C_PEDIGREE_IGENERATION_INFO)-EnableWindow(TRUE); GetDlgItem(IDC_PEDIGREE_SORT)-EnableWindow(TRUE); GetDlgItem(IDC_PEDIGREE_RELATIONS)-EnableWindow(TRUE); GetDlgItem(IDC_PEDIGREE_PERSONAL_INFO)-EnableWindow(TRUE); GetDlgItem(IDC_BIRTHDAY)-EnableWindow(TRUE);2、家谱保存函数的实现/ void CFamilytreeDlg:OnFileSave

    19、()函数的实现void CFamilytreeDlg:OnFileSave() / TODO: Add your control notification handler code hereif(operFamilytree.GetRoot()=0)return;int saveResult;saveResult=operFamilytree.SaveFamilytree(savepath);/保存while(saveResult=WRITE_FILE_ERROR)AfxMessageBox(CString(找不到文件 )+CString(savepath)+CString(该文件可能已被删除

    20、.);CFileOpenAndSaveDlg dlg(false);/保存文件对话框if(dlg.DoModal()=IDCANCEL)return;UpdateData(false);if(strcmp(dlg.m_filePath,)=0)AfxMessageBox(文件名不能为空!);return;strcpy(savepath,dlg.m_filePath);saveResult=operFamilytree.SaveFamilytree(savepath);/保存IsFamilytreeModified=false;3、两人关系函数的实现/ void CFamilytreeDlg:O

    21、nPedigreeRelations()函数的实现void CFamilytreeDlg:OnPedigreeRelations() / TODO: Add your control notification handler code hereCRelationsDlg dlg;if(dlg.DoModal()=IDCANCEL)return;UpdateData(FALSE);int pos1,pos2;Person oneself=0;char name1MAX_CHARNUM,name2MAX_CHARNUM;strcpy(name1,dlg.m_firstname);operFamil

    22、ytree.Find(operFamilytree.GetRoot(),oneself,name1);if(oneself)pos1=operFamilytree.InGenerationPos(oneself);elseAfxMessageBox(本家谱中找不到+CString(name1)+!);return;Person p,q;CString generation;generation+=oneself-info.name;generation+=在家谱中的位置: ;for(q=oneself,p=q-parent;p!=0;p=p-parent)generation+=q-info.

    23、name;generation+= -;q=p;generation+=q-info.name;generation+=n; oneself=0;strcpy(name2,dlg.m_secondname);operFamilytree.Find(operFamilytree.GetRoot(),oneself,name2);if(oneself)pos2=operFamilytree.InGenerationPos(oneself);elseAfxMessageBox(本家谱中找不到+CString(name2)+!);return;generation+=oneself-info.name

    24、;generation+=在家谱中的位置: ;for(q=oneself,p=q-parent;p!=0;p=p-parent)generation+=q-info.name;generation+= - ;q=p;generation+=q-info.name;generation+=nn;CString cmpResult;if(pos1pos2)cmpResult.Format(%s在第%d代,%s在第%d代,%s是%s的晚辈.,name1,pos1,name2,pos2,name1,name2);else if(pos1parent=0;addnode-child=0;addnode-

    25、sibling=0;/把有关结点信息加入到结点中去strcpy(addnode-info.name,dlg.m_name);strcpy(addnode-info.addr,dlg.m_addr);addnode-info.birthday.year=dlg.m_birthday_year;addnode-info.birthday.month=dlg.m_birthday_month;addnode-info.birthday.day=dlg.m_birthday_day;addnode-info.marry=dlg.m_marry;addnode-info.live=dlg.m_live;

    26、/若此人已过世,则还应有死亡日期if(!dlg.m_live)addnode-info.deathday.year=dlg.m_deathday_year;addnode-info.deathday.month=dlg.m_deathday_month;addnode-info.deathday.day=dlg.m_deathday_day;Person oneself=0;operFamilytree.Find(operFamilytree.GetRoot(),oneself,addnode-info.name);/查找家谱中有没有此人if(oneself!=0)AfxMessageBox(

    27、家谱中已有此人!);delete addnode;return;Person parent=0;char parentnameMAX_CHARNUM;strcpy(parentname,dlg.m_parentname);if(strcmp(parentname,-1)=0)/试图加入一个新的根结点时给出警告int reply;reply=:MessageBox(this-m_hWnd,确实要置此结点为根结点吗?,警告,MB_YESNO|MB_ICONWARNING);if(reply=IDNO)return;else/加入的结点不是根结点operFamilytree.Find(operFam

    28、ilytree.GetRoot(),parent,parentname);/在家谱中找addnode的父结点if(parent=0)AfxMessageBox(父亲结点没找到!);delete addnode;return;/日期合法性检查if(!operFamilytree.IsDateValid(addnode-info.birthday)AfxMessageBox(个人信息中的出生日期不合实际!);delete addnode;return;/比较孩子结点与其父亲结点的出生日期if(strcmp(parentname,-1)!=0)/加入的结点不是根结点 if(operFamilytre

    29、e.CompareDate(addnode-info.birthday,parent-info.birthday)info.birthday,parent-info.birthday)=0)AfxMessageBox(所加入孩子的出生日期与其父亲的出生日期相等,不合实际!);delete addnode;return;if(!addnode-info.live)/查看死亡日期的合法性if(!operFamilytree.IsDateValid(addnode-info.deathday)AfxMessageBox(个人信息中的死亡日期不合实际!);delete addnode;return;

    30、if(operFamilytree.CompareDate(addnode-info.birthday,addnode-info.deathday)0)AfxMessageBox(此人出生日期不可能比其死亡日期早!);delete addnode;return;operFamilytree.Add(parent,addnode);/找到,把addnode加入家谱中HTREEITEM hParentItem=0,hRootItem;hRootItem=m_peTree.GetRootItem();/得到树的根结点if(strcmp(parentname,-1)!=0)/加入的结点不是根结点Fin

    31、dInTree(hRootItem,hParentItem,parentname);/在树中找到要加入结点addnode的父结点parentnameAddToTree(hParentItem,addnode);/把此结点加入到树中RefreshTree();/刷新该树IsFamilytreeModified=true;/置家谱修改标记为真5系统各功能的调试分析(附有运行截图)5.1 文件操作模块 1、新建家谱 输入根结点的相关信息(注:其中父亲一栏填-1),再依次输入其他的结点信息。 图一 添加信息界面 2、打开家谱 输入想要打开家谱的文件名(如zhang 等) 3、保存家谱 输入想要打开家谱

    32、的文件名(如chao zheng 等)5.2 家谱控制模块 1、删除某人 删除该节点的相关信息(如:删除张四) 2、增加孩子 为该节点添加孩子结点(如:为张六添加孩子张章) 3、 两人关系 比较两人之间的关系(如张三与张四) 图 关系比较对话框 图 结果输出对话框4、 某代信息 输出第i代所有人的信息(如i=2) 图 某代信息查询对话框 图 某代信息输出对话框5、 姓名查找 给出某个人的姓名,查询其相关信息(如张三) 图 查询信息输入框 图 查询信息输出框6、 个人修改 给出要修改人的姓名(如先在树形结构中点击张四,在填写下面对话框,即把张四李四) 图 个人信息修改对话框 图 修改后的信息输出

    33、5.3 调试小结:1、 家谱系统的编程过程还是比较复杂,有些代码不会,只能参照网上的有关代码来做,家谱树的储存结构是兄弟孩子树与二叉树有一些区别,所以调试的时候还是比较困难的。2、这次程序因为是关于树的操作,递归的思想用的比较多。3、程序当中除了用到树的相关操作外,还运用了队列来进行树的遍历等相关操作。4、在时间和空间复杂度上,都进行了有效的控制。5、该系统的安全效果较好,能自动辨别出错误的输入信息,并给出警告或提示。6、该系统由于采用MFC开发,所以视面效果较好,且结果易懂、直观。经过对家谱树管理系统的测试,基于书写的关系,只选取了部分功能的测试,如上写出。经过测试,该系统大致上能够较好地完

    34、成需求分析中的任务,如家谱建立、家谱保存、增加孩子、删除个人信息、修改个人信息等。但仍然存在很多问题,如对数据的输入方面没有太多的限制,这可能导致用户输入的异常发生。对系统查询设置也不灵活,系统的可扩展性不强。功能的实现也不太完善,有待进一步改善。6 课程设计心得体会1)个人感想经过这些天的设计和开发,系统基本开发完毕。在本次课程设计中困难遇到不少,比如像以前C+里面的一些文本文件的操作,i/o流,string,Cstring类,容器类相关的成员函数,全局参数的传递等都忘了很多了,都全是在百度和书籍中查找到的,并且有些不懂得问题也请教了老师、同学,也为我自己今后的学习解决了一些问题。这次课程设

    35、计,我选取的题目是家谱树管理系统,刚开始是准备不用MFC来做的因为我感觉自己好像那个已经忘的差不多了,但是当我发现不用MFC做出来的东西非常不好看、不好用时,我便强迫自己用MFC,并从图书馆和百度中查找了一些代码和相关资料,这样一来不仅让我对树的定义、存取、遍历等有了更进一步的了解,更让我对如何运用MFC来解决一些数据结构中的问题有了更深一步的了解,在学习专业课的同时,能有这样一次机会,让我这个还未出茅庐的小子看到了编程这门课的博大精深,也体会了其中的无穷乐趣,获得了更多更实用的知识。2)不足之处由于设计时间较短,所以该系统还有许多不尽如人意的地方,比如用户界面不够美观,功能不够完善等多方面问

    36、题。1在这次系统开发的过程中,我对MFC和数据结构的关系以及他们是如何相关联的有些疑问,如那个树形插件,为什么只要把它消息映射一下那样就可以构造出一棵树的结构等等。2、对需求分析的考虑,系统的制作,从功能分析到功能模块分析、与其他系统的关系,再到后台数据存储设计及各功能模块的创建都还欠考虑。3、系统中还有一个很大的问题始终无法解决,那就是在我的主界面上用此“(温馨提示)此链接有问题勿”用标出来的那个。其实,这个系统还有很多不足之处,但由于有篇幅限制(15页左右)故望读者能够给予改进。7参考文献1.郑 莉. C+语言程序设计(第三版)学生用书. 清华大学出版社 2004.6.2.黄 明. Vis

    37、ual C+信息系统设计与开发实例. 机械工业出版社 2005.3.3.罗建军. 大学Visual C+程序设计案例教程. 高等教育出版社 2004.8.4.求是科技.Visual C+6.0数据库开发技术. 人民邮电出版社 2004.1. 5.严蔚敏. 数据结构(C语言版). 清华大学出版社 2009.9. 6.严蔚敏. 数据结构题集(C语言版). 清华大学出版社 2009.9. 7.Larry Nyhoff. 数据结构与算法分析 清华大学出版社 2006.11. 附录:说明:由于代码量太大,仅附FamilytreeDlg.cpp的少部分代码,敬请原谅!/ FamilytreeDlg.cpp

    38、 : implementation file#include stdafx.h#include 0807020218张朝政(家谱信息管理系统).h#include FamilytreeDlg.h#include FileOpenAndSaveDlg.h#include AddInfoDlg.h#include DellInfoDlg.h#include ModifyInfoDlg.h#include RelationsDlg.h#include PersonalInfoDlg.h#include BirthdayDlg.h#include SearchGenerationDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Ab


    注意事项

    本文(家谱树管理系统设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922