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

news2025/1/19 20:37:23

⼀、需求分析

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

⽬标功能:

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树算法

写在前面 树的定义 typedef struct Node {int data;struct Node *lchild,*rchild; }Bnode,*Btree;最近公共祖先 已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近公共祖先节点的值。 算法思想: 顺序…

牛客竞赛每日俩题 - Day9

目录 日期推算 分解因数 日期推算 美国节日__牛客网 思路: 首先,我们要想找到一个月第N个星期W,一定需要一个参照物,最好的目标当然是这个月的第一天。拿到参照物后,我要能得 到参照物的星期数,然后就能…

马来酰亚胺聚乙二醇叠氮,MAL-PEG-N3,Maleimide-PEG-Azide

马来酰亚胺聚乙二醇叠氮(MAL-PEG-N3)是MeloPEG的硫醇反应性“点击化学”PEG交联剂之一。马来酰亚胺与pH 6.5-7.5的游离巯基/巯基迅速反应,形成稳定的,不可裂解的硫醚键。马来酰亚胺和硫醇的反应使得叠氮化物功能性PEG能够快速有效…

[附源码]Python计算机毕业设计Django的家政服务平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

设计模式-Acyclic Visitor(非循环访问者模式)

目的:允许将新功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会有四人帮访客模式中那样循环依赖的问题。 类图: 使用场景: 需要在现有层次结构中添加新功能而无需更改或影响该层次结构时。 当某些功能在层…

Linux服务器远程访问通过Tomcat部署的静态资源

一、安装Java和Tomcat 1.1 安装Java 下载jdk8切换到root用户,创建文件夹/usr/local/java,将下载的jdk压缩包上传到该目录下,解压 mkdir /usr/local/java cd /usr/local/java rz tar -zxvf jdk-8u351-linux-x64.tar.gz编辑配置文件&#xf…

数据技术篇之数据服务

第6章 数据服务 1.服务架构演进 演进过程 DWSOA (1)实施原理   将业务方对数据的需求通过SOA服务的方式暴露出去。有需求驱动,一个需求开发一个或则几个接口,编写接口文档,开放给业务方调用。 (2&…

[附源码]Python计算机毕业设计SSM基于WEB的心理测评系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【手把手教你】使用qstock进行量化回测

01qstock简介qstock由“Python金融量化”公众号开发,试图打造成个人量化投研分析开源库,目前包括数据获取(data)、可视化(plot)、选股(stock)和量化回测(backtest)四个模块。其中数据模块(data&…

SAS中用单因素ANOVA研究不同疗法对焦虑症的有效性

本教程将介绍如何使用SAS进行单因素方差分析。 最近我们被客户要求撰写关于单因素ANOVA的研究报告,包括一些图形和统计输出。我们想研究不同疗法对焦虑症的有效性。我们收集了以下类别的75个主题的样本: 无处理(1个n1 27)。生物…

5W3H法与SMART原则的结合使用

5W3H 5W3H分析法,又称“八何分析法”。在实际工作中,人们常常运用5W3H分析法,进行顾客分析、市场需求分析,解决计划编制的结构问题、方向问题、执行力问题。 5W3H是描述问题的手段,其具体指的是:What&…

【图像处理】深入解析LBP算法

问题 LBP是一种常见的特征描述算法,用来提取局部的纹理特征,其原理其实很简单,下面我们就来看看它是怎么一回事吧。 LBP简介 LBP(Local Binary Patterns,局部二值模式)是一种很简单但很高效的局部纹理特…

2025年DMS前装搭载或突破750万辆!多方势力搅局「融合集成」

在智能驾驶功能和舱内人机交互体验不断融合演进的过程中,基于摄像头的DMS/OMS功能正在进入新的发展周期。而在欧洲等部分国家及地区,DMS的标配(主要涉及驾驶安全的监控,比如,驾驶员疲劳、注意力分散、安全带使用、吸烟…

java工厂策略模式的开发应用

java工厂策略模式的开发应用前言准备工作具体实现测试仰天大笑出门去,我辈岂是蓬蒿人前言 大概内容: 假设我有五个车间,每一个车间生产不同的车子,想要统一管理,不关心哪个车间生产什么车;只需找一个代理…

Ajax(一)

1.客户端与服务器 1.1 服务器 上网过程中,负责存放和对外提供资源的电脑。 1.2 客户端 上网过程中,负责获取和消费资源的电脑。 2.URL地址 2.1 URL地址的概念 2.2 URL地址的组成部分 3. 分析网页的打开过程 3.1 图解客户端与服务器的通信过程 三个…

NLP学习笔记(一) RNN基本介绍

大家好,我是半虹,这篇文章来讲循环神经网络 (Recurrent Neural Network, RNN) 文章行文思路如下: 首先通过前馈神经网络引出为啥需要循环神经网络然后介绍循环神经网络的核心思想与运作方式最后拓展两个循环神经网络常见且常用的变体 在讲循…

Windows 7恢复分区丢失了怎么恢复?

问题:Windows 7恢复分区丢失 戴尔、惠普和华硕等电脑制造商现会在他们的计算机上创建一个恢复分区。恢复分区允许用户在系统出现问题时将计算机恢复到出厂默认设置。但是,由于丢失了恢复分区,因此某些用户无法将电脑恢复到出厂设置。这是一个…

析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?

先回答标题中中的几个问题: 析构函数可以为纯虚函数吗? yes。纯虚函数可以有函数体吗? yes。纯虚函数需要函数体吗? 一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函…

Web前端大作业:基于bootstrap响应式页面,家具装修公司网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

最新版本APT漏洞利用工具箱

点击"仙网攻城狮”关注我们哦~不当想研发的渗透人不是好运维让我们每天进步一点点简介1.最近发现一个好用的渗透工具箱,基本包含最新热门漏洞exp,分享一下项目地址:https://github.com/White-hua/Apt_t00ls环境:jdk1.8如果双…