EssayGhost Assignment代写,Essay代写,网课代修,Quiz代考

EssayGhost-Essay代写,作业代写,网课代修代上,cs代写代考

一站式网课代修,论文代写

高质量的Assignment代写、Paper代写、Report代写服务

+8617853885483
网课代修代上,cs代写代考
数据结构代写
您的位置: 主页 > 编程案例 > 数据结构代写 >
代做数据结构:MFC计算机C++ MFC相关界面GUi编程作业代码代做:家谱管理系统 MFC界面实现 - 数据结构代做
发布时间:2021-07-25 13:54:26浏览次数:
5.5由兄弟、孩子二叉树生成家谱文件 125.6 按照姓名、出生日期查找家谱成员 13第6章 调试分析与测试结果 146.1 测试方法 146.2 测试过程 146.3 测试结论 15第7章 结束语 19参考文献 20附 录 20 第1章概述1.1 课题研究的目的和技术发展现状本《家谱管理系统》是以电子家谱的形式记载父系家族世袭、人物为中心。电子能准确记录家族成员出生卒年,以及生活地点、家庭成员等信息。一般情况下是不会出现信息丢失情况。更不需要担心传统家谱随着年代的久远字迹不清晰,有破损等情况的出现。所以本课题的研究目的是让大家不但能够非常容易的记录家族情况,而且能清楚的了解本家族信息,使用起来非常方便。现有的计算机技术足以支撑电子家谱的开发。家谱的科学管理不但有助于民族文化和地方文化的发展,而且有其自身的积极意义。例如本电子家谱是利用Visval C++ 6.0开发完成的。电子家谱的出现无疑让家谱焕然一新,但是传统家谱更能凸显出历史的韵味,文化的内涵。这是电子家谱所不能够替代的,电子家谱不可能成为文物。开发人员应该清楚的认识到这一点。1.2 课题研究的主要内容家谱,又称族谱、祖谱、宗谱等。一种以表谱形式,记载一个以血缘关系为主题的家族世系繁衍。本课题研究的主要内容是以电子家谱的形式记录、查询父系家族历史信息为主要内容。1.3 课题研究的难点建立输入文件以存放最初家谱中各成员的信息,以及能够对修改后的家谱存盘以备以后使用。用户界面的设计不够完美。功能上的设计难度很大。第2章需求分析2.1 性能需求系统的核心是利用对话框的连接和文本处理来存储和修改家族管理系统的信息联系,其中的每一个动作都可能影响到其他的功能。使用方便,易于传播,数据共享等性能。易于维护。2.2 功能需求²建立输入文件以存放最初家谱中各成员的信息。²成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。²能对修改后的家谱存盘以备以后使用。²能从文件中读出已有的家谱,形成树状关系。²家谱建立好之后,以图形方式显示出来。²显示第n代所有人的信息。²按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。²按照出生日期查询成员名单。²输入两人姓名,确定其关系。²某人添加孩子。²删除某人(若其还有后代,则一并删除)。²修改某人信息。²按出生日期对家谱中所有人排序。²打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。第3章可行性分析3.1 经济可行性分析对系统开发规模进行估算属此软件项目属于小规模软件开发。所以开发人员三到五人即可。开发,维护等成本相对较低。所以从经济可行性分析的角度来看此《家谱管理系统》适于开发。3.2 技术可行性分析根据软件系统功能、性能要求的各项约束条件从技术的角度实现系统的可行性。家谱信息以树的形式一次读入内存,而个人的各种资料虽然目前条目不多,但随着程序的升级,以后可能越来越大。我把树形结构和个人信息记录的文档分为两个文件保存在外存中,一个文件串行化的记录家谱树的结构化信息,保持少量个人信息作为识别标志;另一个文档保存完整的个人信息。索引时,以树形中的少量信息为依据在另一个文件中找到全部个人信息资料。第4章概要设计4.1 程序设计的基本思想《家谱管理系统》的总体设计思路是先为程序搭建好一个人结构框架,家庭成员之间的关系,用树形结构(家族树)表示,这是本《家谱管理系统》的逻辑结构。根据MFC的特点,采用CfamilytreeDlg类实现用户窗口界面指令对于家谱的各种操作。有文件控制和家谱控制两大模块,按生日查找、删除成员、文件输入输出、修改成员信息、按名字查找、成员关系显示、按代数显示等各种操作。然后再根据需求分析逐步增强程序的功能和性能。4.2 总体功能模块图4.3相关应用技术1.定义“家谱”类型2.用结构Date存储日期3.用结构QuickSortNode存储快速排序数组值(为快速排序而设)4.根据家谱的特点,采用孩子-兄弟的二叉树链表表示法(链表的基本单位为以结构PersonNode表示的结点),各种操作以COperationFamilytree类来实现。5.根据MFC的特点,采用CfamilytreeDlg类实现用户窗口界面指令对于家谱的各种操作。第5章 详细设计5.1日期信息的合法性检验图5-1 日期信息的合法性检查 Int COperationFamilytree::ReadNode(FILE *fp, Person T,char* parentname){//本函数从文件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.deathday.month, T- info.deathday.day);fscanf(fp, %s ,parentname);if(!IsDateValid(T- info.birthday)) //出生日期合法性检查return FILE_DATA_NOT_PRACTICAL;if(T- info.live==0) //若过世,死亡日期合法性检查if(!IsDateValid(T- info.deathday))return FILE_DATA_NOT_PRACTICAL;return OK;}5.2 添加成员孩子模块图5-2 添加成员孩子流程图Int COperationFamilytree::CreateFamilytree(CString filename){//本函数建立一新家谱DestroyFamilytree(); //建立一新家谱之前,清空原有家谱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 parentname[MAX_CHARNUM]; //定义一个临时字符串数组//读取根结点值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如过世,还有死亡日期)) int result;result=ReadNode(fp,T,parentname);if(result==FILE_DATA_NOT_PRACTICAL){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.name,parentname) strcmp(temp- info.name, end )){ //读取信息结束的条件是两个人的名字同为endif(result==FILE_DATA_NOT_PRACTICAL){ //若数据不合法,释放已申请空间,然后返回delete temp;DestroyFamilytree();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();return FILE_DATA_NOT_PRACTICAL;}temp- child=temp- sibling=0;temp- parent=parentT; //temp的父指针指向parentT;if(parentT- child){ //parentname已经有孩子InsertSibling(parentT- child,temp);}//ifelse //parentname无孩子,则temp应为parentT- child=temp; //parentname的第一个孩子}//ifelse{ //parentT不存在,说明家谱中不存在parentname此人DestroyFamilytree(); //返回出错信息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中存取一结点pNodechar ch= 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.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- parent) //家谱结束fprintf(fp, %s ,pNode- parent- info.name);elsefprintf(fp, %s , -1 fprintf(fp, %c ,ch);}}int COperationFamilytree::SaveFamilytree(CString filename){//本函数保存家谱到文件filename中FILE* fp;if((fp=fopen(filename, w ))==0) //打开文件filenamereturn 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;}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,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 QuickSortNode[totalNums+1];if(!order){AfxMessageBox( 内存不足! return;}AfxMessageBox( 排序后结果请见下部列表。 operFamilytree.SortByBirthday(order);for(int i=1;i totalNums+1;i++)DisplayInListCtrl(order[i].oneself);delete []order;}void COperationFamilytree::SortByBirthday(QuickSortNode *order){//本函数对顺序表order以出生日期的大小排序int totalNums=0;QuickSortNode* startaddr=order;startaddr++;GetPersonNums(T,totalNums);CopyInfoFromBiTreeToArray(T,startaddr);QuickSort(order,1,totalNums);}int COperationFamilytree::Partition(QuickSortNode *order, int low, int high){//本函数供QuickSort函数调用//交换顺序表order中从low到high的记录,便枢轴记录到位,并返回其所在位置,此时//在它之前(后)的记录均不大(小)于它order[0]=order[low]; //用子表的第一个记录做枢轴记录 Date pivotkey=order[low].birthday; //枢轴记录关键字while(low high){ //从表的两端交替地向中间扫描while(low high (CompareDate(order[high].birthday,pivotkey)==1||CompareDate(order[high].birthday,pivotkey)==0)) high;order[low]=order[high]; //将比枢轴记录小的记录移到低端order[low].birthday=order[high].birthday; //枢轴记录到位order[low].oneself=order[high].oneself;while(low high (CompareDate(order[low].birthday,pivotkey)==-1||CompareDate(order[low].birthday,pivotkey)==0))++low;order[high]=order[low]; //将比枢轴记录大的记录移到高端}order[low]=order[0]; //枢轴记录到位return low; //返回枢轴位置}void COperationFamilytree::QuickSort(QuickSortNode *order, int low, int high){//本函数对顺序表order[low high]作快速排序int pivotloc;if(low high){ //长度大于1pivotloc=Partition(order,low,high); //将order[low high]一分为二QuickSort(order,low,pivotloc-1); //对低子表递归排序,pivotloc是枢轴位置QuickSort(order,pivotloc+1,high); //对高子表递归排序}}void COperationFamilytree::GetPersonNums(Person T,int personNums){//本函数返回以T为根结点的所有结点数,并把结果存入personNums中//初始值personNums必须为0if(T){personNums++;GetPersonNums(T- child,personNums); //递归调用GetPersonNums(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);CopyInfoFromBiTreeToArray(T- sibling,order);}}5.5由兄弟、孩子二叉树生成家谱文件void SaveNode(FILE *fp, Person pNode){//本函数向文件fp中存取一结点pNodechar ch= 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.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- parent) //家谱结束fprintf(fp, %s ,pNode- parent- info.name);elsefprintf(fp, %s , -1 fprintf(fp, %c ,ch);}}int COperationFamilytree::SaveFamilytree(CString filename){//本函数保存家谱到文件filename中FILE* fp;if((fp=fopen(filename, w ))==0) //打开文件filenamereturn 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;}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,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结点指针传给TnameTname=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==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 测试方法该课程设计只有一个主要类,即对孩子——兄弟二叉树的操作类。该类主要包括文件读取函数、创建孩子——兄弟二叉树函数、在树中查找函数、遍历函数以及对树中结点进行加入、删除、修改的函数。由于树存储结构的特殊性,故编制这些算法时大量使用了递归,虽然这样做可能会降低程序的执行效率,但程序的易读性较强。6.2 测试过程在调试时,遇到的几个问题如下:(1)建立树时,由于新申请结点的孩子指针、兄弟指针、及双亲指针均未赋空值。而在以后的函数中对树进行递归操作时均以这些指针值中的一个或几个是否为空作为递归结束条件。从而导致调用这些函数时出现系统保护异常(使用了不安全的指针)。(2)刚开始删除结点时,只考虑到删除其本身结点的情况,而删除其孩子结点的情况未考虑到,故在删除某些结点时使树出现了“断链”现象。故在程序代码中对删除某一结点进行操作时,首先要判断此结点是否有孩子及兄弟,然后进行相应操作。(3)刚开始进行程序概要设计时,曾考虑到用控制台下的文本方式作为程序界面,实际操作后发现并不理想。一方面字符形式的界面友好性较差,另一方面显示整个家谱树的信息时不方便。故考虑用VC++中MFC类自带的树型控件显示家谱层次,而用列表控件显示家谱中的信息。用后效果不错。6.3 测试结论(1)按下按钮“打开家谱”,打开一个家谱文件(*.ftf)(2)按下按钮“新建家谱”,新建一个家谱文件(*.ftf)(3)按下按钮“保存家谱”,将修改过的家谱保存(4)按下按钮“另存家谱”,将修改过的家谱另存为一个家谱文件(*.ftf)(5)按下按钮“删除该人”,将树型控件中选中的成员及其后代删除(6)按下按钮“增加孩子”,给树型控件中选中的成员增加一个孩子(7)按下按钮“更改资料”,更改树型控件中选中的成员的资料(8)按下按钮“按照姓名查找”,将家谱中特定名字的成员的信息显示在列表控件中(9)按下按钮“确定两人关系”,将家谱中某两人的关系显示出(10)按下按钮“出生日期排序”,将家谱中的所有成员按出生日期排序并显示在列表控件中(11)按下按钮“按照生日查找”,将家谱中特定日期出生的成员的信息显示在列表控件中(12)选择菜单项目“关于”,显示该程序的版权信息(13)选择菜单项目“退出”,结束该程序的运行 第7章结束语通过这次大作业,体会很深刻,将一直以来学到的东西都运用到实际上来,学以致用,对所学知识有了更深刻的理解,同时还发现了许多平时在书本上没有遇见过的问题,促进了自己对知识的渴望,遇见了问题,就希望能够通过查找课外书来解决它们。刚接触题目的时候,自己就有了一定的想法,觉得这个程序做起来是问题不大的,但到了自己真正开始编程的时候却发现远远没有想象中那么简单,很多细节的问题没有预想到,很多关系的处理想得过于简单,以至于实施起来遇到了很大的困难,花了大量的时间。同时还有一个比较深刻的体会就是要尽量多在源码上作注释,以前编一些功能简单的程序,总能很清楚每个函数和每个变量的作用,但到了做这个大作业,由于分开了各个功能板块去实现,很多时候是做了后面就忘了前面,后来意识到这个问题,便开始在编程时加入注释,而且是越详细越好,这样做了以后,很多时候需要查看自己原来写的源代码,也能够很方便地了解了,跟上了思路,也方便以后的维护。关于这个程序的缺点方面,由于自己花的时间不是很多,再加上知识有限,编写出来的界面不够友好,在功能上还是有不完善的地方,譬如说各项数据的统计还没有弄,数据的存储还不够理想等等。对于这个程序的改进,我自己还是有不少想法的。首先是需要加强数据的存储这方面的知识,使自己编写出来的程序能以一种标准的格式存储下来,方便以后其它程序的读取。总的来说,通过这次作业,收获还是挺多的,也发现了不少的问题,并给自己以后的学习指引了方向,知道自己缺少哪方面的知识,需要补充哪些知识等等。自己将会以这次作业为契机,看更多编程方面的书籍,不断充实自己的知识库。参考文献《数据结构(C语言版)》——清华大学出版社——严蔚敏、吴伟民编著《C至Visual C++程序设计语言》——科学出版社——蔡常丰、林小苹编著《Microsoft Visual C++ 6.0 高手速成》——兵器工业出版社——步行者工作室编著《C++程序设计》——清华大学出版社——谭浩强编著附 录源程序文件名清单:Familytree.cpp Familytree.h——主程序实现单元FileOpenAndSaveDlg.cpp FileOpenAndSaveDlg.h——文件输入输出实现单元OperationFamilytree.cpp OperationFamilytree.h——家谱操作实现单元StdAfx.cpp StdAfx.h Resourse.h——MFC类实现及资源头文件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——显示代数的实现单元代写计算机编程类/金融/高数/论文/英文本网站支持淘宝 支付宝 微信支付 paypal等等交易。如果不放心可以用淘宝或者Upwork交易!E-mail:[email protected]微信:BadGeniuscs 工作时间:无休息工作日-早上8点到凌晨3点如果您用的手机请先保存二维码到手机里面,识别图中二维码。如果用电脑,直接掏出手机果断扫描。

所有的编程代写范围:essayghost为美国、加拿大、英国、澳洲的留学生提供C语言代写、代写C语言、C语言代做、代做C语言、数据库代写、代写数据库、数据库代做、代做数据库、Web作业代写、代写Web作业、Web作业代做、代做Web作业、Java代写、代写Java、Java代做、代做Java、Python代写、代写Python、Python代做、代做Python、C/C++代写、代写C/C++、C/C++代做、代做C/C++、数据结构代写、代写数据结构、数据结构代做、代做数据结构等留学生编程作业代写服务。