⼀、需求分析

《家谱管理系统》程序的设计⽬的,是为了解决中国传统家谱不易保存、不易修改、不易统计的缺陷。利⽤计算机程序,可以实现在计算机上存储、管理、查看家谱的相关信息。

⽬标功能:

  1. 建⽴家谱:在计算机上建⽴树状家谱结构。要求⽤户友好,便于不懂计算机的⼈使⽤, 因此需要制作图形⽤户界⾯、⽀持⿏标操作,操作逻辑与市⾯常规操作系统⼀致。

  2. 管理信息:⽅便对家谱成员进⾏信息管理。其中要求实现家谱成员的信息修改、成员的 插⼊与删除,信息要求包括⼀个成员的基本信息,包括:姓名、性别、出⽣⽇期、死亡⽇期、出⽣地点、身⾼等。要求⽀持⿏标操作,操作逻辑简单、与市⾯常规操作系统⼀致。

  3. 统计信息:为了满⾜对⼀整个家族的研究,系统要求⽀持对家谱中所有成员信息进⾏统 计,包括对医学研究有价值的信息,如:年龄、身⾼等。要求实现⿏标操作,操作逻辑简单、与市⾯常规操作系统⼀致。

  4. 存储信息:家谱管理要求实现信息存储,⽅便信息的重复查看、使⽤。要求包括的功能 有:打开程序⾃动进⾏信息的初始化,将计算机内存储的数据⾃动初始化为家谱数据;完成信息的修改后可以实现保存,将家谱信息保存⾄计算机。

⼆、项⽬设计

1.总体设计:

项⽬的头⽂件、源⽂件及ui⽂件

在家谱管理系统项⽬中,我们创建了四个ui界⾯、六个头⽂件及七个源⽂件。

其中四个ui界⾯分别⽤于录⼊信息、主窗体的显示、统计值信息的显示、依据输⼊姓名搜索⽬标信息。

头⽂件中:

mainwindow.h 中声明 MainWindow类 ,包括将Item的相关信息输出到MainWindow.ui中相应标签中、点击搜索/统计按钮,弹出相应窗⼝、进⾏搜索等;相关函数与信号和槽的连接 在 mainwindow.cpp 中实现;

information.h 中声明 Information类 ,包括录⼊的相关信息,信息的返回等;相关函数在 information.cpp 中实现;

mytreewidget.h 中声明了 MyT reeWidget类,包括:点击按钮显示结点的信息、新建结点、删除结点、对结点进⾏信息的修改、重命名结点等功能函数的声明;相关函数与信号和槽的连接在 mytreewidget.cpp 中实现;

mytreewidgetitem.h 中声明了 MyT reeWidget Item类,包括修改结点信息的函数声明; 相关函数在 mytreewidgetitem.cpp 中实现;

result.h 中声明了 Result类,其中有全部结点的信息的统计值,如总结点数、平均年龄、平均身⾼,并声明了输出统计值的函数;相关函数与信号和槽的连接在 result.cpp、mytreewidget.cpp 中实现;

search.h 中声明了 Search类,包括依据输⼊的姓名进⾏搜索的函数声明,和搜索结点信息输出函数的声明;相关函数与信号和槽的连接在 search.cpp 、mytreewidget.cpp 中实现。

main.cpp 中的main函数作为程序的起点,运⾏程序。

项⽬设计的类图

2.算法设计与分析:

查找算法的流程图

查找算法的代码部分

根据⼈名进⾏查找时,我们点击主窗⼝的查找按钮,在输⼊⼀个⼈名后,点击查找的按钮,进⾏查找。

查找的原理是利⽤for循环依次访问根结点,取结点的⼈名信息,与输⼊的⼈名进⾏⽐ 对,如果相等,则找到了⽬标结点,返回此结点。

如果在根结点中没找到,就依次遍历根结点的⼦结点,先获得当前结点的⼦结点个数,⽤for循环访问各个⼦代,如果找到了⽬标结点,返回此结点,否则就对此函数进⾏递归调⽤, 这样可以在找到⽬标结点前⼀直遍历,当遍历所有结点完我们仍没有找到⽬标结点,则说明树中没有此⼈。

如果找到此⼈,会输出他的⽗亲和孩⼦,同时输出他的个⼈信息;未找到此⼈,输出“未 找到此⼈”。

统计算法的流程图

统计算法的代码部分

根据树的数据统计时,我们点击主窗⼝中的统计按钮,在统计界⾯中,点击统计数据的按钮,进⾏数据的统计与输出,统计的数据有家谱中总⼈数、平均年龄、平均身⾼。

数据统计的原理是⽤for循环依次访问树中的结点,⾸先遍历每个根结点,每访问⼀个结 点,对num进⾏加1、对sum_age进⾏累加、对sum_height进⾏累加。

依次遍历⼦结点,先获得当前结点的⼦结点个数,⽤for循环访问各个⼦代,对各个数据 进⾏累加,再对⼦结点递归调⽤此函数,这样可以遍历所有除根结点之外的结点数据,和最初对根结点的数据⼀起组成了累计的数据。

再对数据进⾏处理,求均值,输出到相应的ui的label上。

  1. ⽤到的数据结构:

项⽬中⽤到了树形结构,⼀个结点可以和多个结点相连,Qt中的QT reeWidget运⽤的就是树形结构对数据进⾏存储,我们在项⽬中对树中结点进⾏遍历,⽤到的是深度优先的遍历⽅式,其形式是递归。

利⽤树形结构,能把家谱中⽗⼦关系表达得很清晰,利⽤深度优先的遍历⽅式使遍历有逻辑地进⾏,使结点能按顺序地进⾏搜索。

三、测试报告

3.1合法数据测试

3.1.1合法祖先结点的建⽴:

3.1.2合法⼦代结点的建⽴:

3.1.3合法结点数据查询:

3.1.4合法数据统计:

3.2⾮法数据测试

3.2.1⾮法信息修改(性别、年龄、身⾼):

3.2.2⽆效成员查询

3.3功能展示

3.3.1祖先结点创建与删除

在空⽩区域单击⿏标右键,弹出选项

3.3.2⼦代结点创建与删除

选中结点单击⿏标右键,弹出选项

3.3.4成员信息查询

点击右下⽅”查询“按钮

3.3.5家谱成员数据统计

四、设计过程中遇到的问题及解决⽅法

问题⼀:图形⽤户界⾯的制作。

解决⽅法:我们⼩组之前并没有图形⽤户界⾯的开发经验,在接到这个⼤作业后,我们先是在⽹络上查找了有关图形⽤户界⾯的制作⼯具,了解到Qt功能强⼤、跨平台性能好的特点 后,我们即选⽤了Qt作为我们的开发⼯具。并且在本学期通过⽹络课程+⽹络⽂档+图书的⽅ 式,初步学习了Qt开发的基本过程和主要功能,并在此基础上使⽤Qt完成了本次⼤作业。

问题⼆:Qt中树对象内部每个结点信息的存储。

解决⽅法:在创建每个成员信息作为结点时,发现把成员信息存储到Qt原有的-- QT reeWidget Item类中较为复杂,因此必须继承该类,派⽣⼀个包含成员信息的新的类-- MyT reeWidget Item。但是在派⽣过程中,由于对C++继承与派⽣机制掌握的不扎实,⾃⼰没有注意到很多之前使⽤的QT reeWidget对象中对QT reeWidget Item的函数将不再适⽤于⾃⼰派⽣的对象。后来在⽹络上查询后了解到,编译器在编译时,会建⽴⼀个类的索引表,根据指针类型来确定指针指向对象成员的偏移量,所以对⽗类对象使⽤派⽣类对象指针不⽤进⾏类型转换,但是对派⽣类对象使⽤⽗类对象指针必须进⾏强制类型转换。

问题三:Qt树组件中遍历、查找的算法设计。

解决⽅法:Qt中树结构是封装成类的,⽆法直接通过指针获得⽗类或者⼦类结点,通过 查询Qt的官⽅⽂档,找到了QT reeWidget和QT reeWidget Item封装好的函数parent( )和child( )来返回⽗⼦结点的指针,以及childcount( )返回孩⼦结点个数。有了这些函数,就可以通过递归⼦树来实现遍历、查找功能。

五、尚未解决的问题及考虑应对的策略

本程序在设计计算机存储功能时遇到了困难。⽬标是⽤户在点击保存功能按钮时,将每个成员的信息输出⾄⽬标计算机硬盘⽬录上的⽂本⽂档中;⽽⽤户在重新打开此程序时,程序会

计算机存储功能⾃动读取⽬标计算机硬盘⽬录上的⽂本⽂档,实现通过⽂本⽂档数据初始化成员信息,从⽽实现程序的重复多次使⽤。

在实际编写程序时,发现对于此类⾮⼆叉树的更⼀般的树结构,不太容易通过较为简单的

⽅式实现相同类型、规格数据初始化⼀棵树。在向⼀些同学请教、上⽹查找⽅法之后,我们还

是没能够在有限的时间⾥完成这个很重要的功能,但是也有了⼀些想法。初步定下来的未来实现思路有两种。

思路⼀、使⽤”索引“

常规的通过数列初始化⼆叉树的⽅法对于家谱这种”多叉树“已经不适⽤,为此我们想到可 以在数据存储时,为每个成员添加⼀个”索引“。可以在索引中标注其孩⼦结点的名字,在初始 化此家谱时,初始化完成⽗亲结点后,通过索引找到孩⼦结点;建⽴好孩⼦结点后,通过孩⼦ 结点的索引继续查找孩⼦结点的孩⼦……通过递归⽅法,按照深度优先的⽅向建⽴树结构。

但是这种⽅法运⾏所消耗的时间可能会⽐较多,读取⽂件操作本来就是⽐较耗时的指令, 遍历⽂件的次数⼜很多,在数量⼤的情况下,可能会花费较多时间。

思路⼆、使⽤数据库

在⽹络上查找相关的内容时,我们发现CSDN上有⼀名作者初始化树状结构时使⽤了数据 库,通过数据库提供的丰富功能,⽅便地实现了数据的保存和树的初始化。但是我们⼩组两⼈都没有数据库操作知识作为基础,最后剩下的⾃学时间也不太够⽤。

没能完成如此重要的功能,我们的程序就只能算⼀个半成品,我们两个⼈都很不⽢⼼。我们⼩组希望在寒假的时候,再花费⼀点时间将数据保存和初始化功能完善好,使该程序成为⼀个完整可⽤的家谱管理系统。

♻️ 资源

大小: 0.99MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248368

基于C++实现(WinForm)家谱管理系统【100010033】相关推荐

  1. 基于C#+VisualStudio winform 图书管理系统

    搭建项目: 设计数据: 读者表: 读者类型表 借书表: 归还图书表: DBO.NET连接: 借书,还书: 罚息: 图书馆藏位置: 借书权限:读者类型登录: 黑名单:

  2. java毕业设计项目介绍 基于SSM+Vue数字化家谱网站管理系统

    一.源码描述   这是一款基于web的前后端分离JAVA+SSM和vue.js源码 基于B/S开发,包含毕业论文和答辩ppt,开发工具idea支持eclipse,MySQL,适合作为毕业设计使用,感兴 ...

  3. 基于角色管理的简易家谱管理系统(C++/C(几乎都是C))2020-06-16

    一.课题内容和要求 (一)课题要求 家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的了解家族成员信息.该家谱管理系统是通过树来实现的.要求系统界面友好,易于操作. (二)课题要求 ...

  4. 基于C++实现(MFC界面)家谱管理系统【100010005】

    概述 题目的理解和分析: 该程序带有MFC界面,有树形控件来展示家庭成员的层次关系,还有list控件来浏览家庭成员信息.以及有对家谱成员的添加,删除,修改,查询功能,统计男女比例和求平均年龄,以及有对 ...

  5. mysql存储家庭成员信息_家谱管理系统的设计与实现(MyEclipse,MySQL)

    家谱管理系统的设计与实现(MyEclipse,MySQL)(任务书,开题报告,中期检查表,文献综述,毕业论文16700字,程序代码,MySQL数据库,答辩PPT) 家谱是现代人们怀旧的重要部分,因此, ...

  6. 计算机毕业设计ssm基于b_s架构的实习管理系统

    最新200套计算机专业原创毕业设计参考选题都有源码+数据库是近期作品 如果题目不合适,可以评论留下题目,或add_用户名,有时间看到机会给您发 1 jsp计算机系教师教研科研管理系统 2 ssm基于s ...

  7. 基于Struts2框架的名片管理系统

    目录 1.系统设计 2.数据库设计 3.系统管理 4.用户管理 5.名片管理 本篇博文将分享一款基于Struts2框架的名片管理系统,JSP引擎为Tomcat9.0,数据库采用的是MySQL5.5,集 ...

  8. 基于SSM实现的图书馆管理系统

    项目类别: BS-XX-075 运行环境: 开发工具:IDEA / ECLIPSE 数据库:MYSQL5.7 应用服务器:TOMCAT8.5.31 JDK: 1.8 开发技术:Spring+Sprin ...

  9. eclipse jsp 写 js 代码提示_基于jsp+servlet的宠物管理系统

    源码编号:B-E00002  点击查看分类规则 项目类型:Java EE项目(java web项目) 项目名称:基于jsp+servlet的宠物管理系统(Pet) 当前版本:V1.0.0版本 难度等级 ...

  10. 用链表c语言程序设计,C语言程序设计-基于链表的学生成绩管理系统

    <C语言程序设计-基于链表的学生成绩管理系统>由会员分享,可在线阅读,更多相关<C语言程序设计-基于链表的学生成绩管理系统(18页珍藏版)>请在人人文库网上搜索. 1.华北科技 ...

最新文章

  1. unknown error 1130,unknown error 1045
  2. SAP PM 初级系列之27 – SAP系统怎么知道某种类型的维修工单检验批上的检验类型是14?
  3. 一种可以穿透还原卡和还原软件的代码
  4. 从无到有算法养成篇-算法基础常识
  5. 将字符串中的大写字母变成小写字母
  6. java懒加载设计模式_java设计模式——单例模式
  7. 随机过程及其在金融领域中的应用 第三章 习题 及 答案
  8. 迁移学习与模型融合问题若干
  9. java 流水_Java之流水号生成器实现
  10. Node.js 整合 Express 框架实现微信支付和支付宝支付
  11. ROS2与C++入门教程-进程内(intra_process)话题发布和订阅演示2
  12. 网络宽带和实际下载速度单位换算详解:
  13. 学习日记day22 平面设计 构图
  14. 计算机密码技术发展,密码技术的分类
  15. java--for循环的三种写法
  16. 抖音爆火的“弹幕互动游戏”是什么,如何搭建直播间?
  17. npoi 将html导出word,使用NPOI将数据导出为word格式里的table
  18. 4/20 Fizz Buzz(412)
  19. JS标签选择器以及节点操作
  20. 关于线程 thread (4)线程的交互

热门文章

  1. 用尽量简单地话,一次讲明白傅里叶级数(FS)、傅里叶变换(FT)、离散时间傅里叶变换(DTFT)、离散傅里叶级数(DFS)、离散傅里叶变换(DFT)以及它们之间的联系和区别。
  2. 第一章习题讲解(2020版操作系统)
  3. Android的虚拟设备的缩写,Android虚拟设备的英语缩写是
  4. MSP430F149 微安级低功耗模式设置总结
  5. 我说Java完全面向对象,老大过来就是一jio
  6. 萌新,C++、Java、Python 选择哪个好?
  7. 网站被劫持,打开一个网站会跳到另一个怎么办,直接输入网址也是这样。怎么办呢?
  8. 【博士论文】深度学习的对抗攻击与鲁棒性测评
  9. 豆瓣电影TOP250和书籍TOP250爬虫
  10. react全家桶指的是哪些?