基于C++实现(MFC)职工工作量统计系统
题目:职工工作量统计系统设计
1、问题描述
职工包括姓名、职工号、性别、年龄、所在部门、联系方式等信息。 工作量包括职工号、完成的产品数量等信息。 该设计系统能够对职工的工作量进行统计,并排出名次。注意,一个职工的工作量是可以多次输入的。
2、功能要求
(1)添加功能:程序能够添加职工的记录和工作量,可提供选择界面供用户选择所要添加的类别, 要求职工的编号要唯一,如果添加了重复职工号的职工记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据职工号、姓名等信息对已添加的职工记录进行查询。还可以按职工号对工 作量进行查询。如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3)显示功能:可显示当前系统中所有职工记录和工作量统计信息,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5) 删除功能:主要实现对已添加的人员记录进行删除和工作量进行删除。如果当前系统中没有 相应的人员记录,则提示“记录为空!”并返回操作;否则,输入要删除的人员的编号,根据所输入的 信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存在。
(6)统计功能:对职工可按工作量进行统计,并排名次。
(7)保存功能:可将当前系统中各类人员记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的人员信息读入到当前系统中,供用户进行使用。
3、问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
【题目分析】
此题我选择采用链表的思路,设置了Date类作为数据模板用来存放数据,开了一个核心头指针head并且应用于全局,所有功能的实现围绕head展开。并且应用了mfc使得界面可视化,增加了用户友好性。
【类结构设计】
根据题目分析。主要运用了Date类,如图1所示
图1 Date类图
因为运用了MFC进行界面设计,所以类比较多。其中MFC为我自动提供了一些支持程序的类如targetver.h,pch.h,MFCApplication3.h,afxdialogex.h,framework.h,MFCApplication3Dlg.h,Resource.h。其中主菜单类是SystemDlg.h,我在其中定义了一些按键接口如afx_msg void OnBnClickedButton1();在cpp实现文件中通过DoModal()弹窗函数实现调用。其中数据类是Date.h,我在其中定义了数据类型,因为是用链表的思路,所以也定义了链表指针。其中每一个功能我都单独开了一个类,如添加功能就是Add.h实现。具体各类之间的关系如图2所示例
图2 类之间的关系
【流程图】
【工程结构组织】
本项目使用Visual Studio实现,工程文件结构图如图3所示。
图3 工程文件结构图
图4 头文件结构图
图5 源文件结构图
本项目主要由28个文件组成(不包括外部依赖项和资源文件),各文件的功能如下表(表1)所示。
表1. 本项目文件功能列表
序号 | 文件名 | 说明 |
---|---|---|
1 | Date.h | 数据类定义文件 |
2 | targetver.h | MFC系统头文件 |
3 | pch.h | MFC系统头文件 |
4 | pch.cpp | Pch实现文件 |
5 | afxdialogex.h | MFC系统头文件 |
6 | framework.h | MFC系统头文件 |
7 | Resource.h | MFC系统头文件 |
8 | MFCApplication3Dlg.h | 登录类定义头文件,包含账号密码 |
9 | MFCApplication3Dlg.cpp | 登录类定义实现文件 |
10 | MFCApplication3.h | MFC系统头文件 |
11 | SystemDlg.h | 菜单类定义头文件 |
12 | SystemDlg.cpp | 菜单类实现文件,在其中嵌入了文件读写以及排序功能 |
13 | Add.h | 添加功能类定义头文件 |
14 | Add.cpp | 添加功能类实现文件 |
15 | Addall.h | 批量添加功能类定义头文件 |
16 | Addall.cpp | 批量添加功能类实现文件 |
17 | AddWH.h | 添加工作量功能定义头文件 |
18 | AddWH.cpp | 添加工作量功能实现文件 |
19 | Delete.h | 删除功能类定义头文件 |
20 | Delete.cpp | 删除功能类实现文件 |
21 | Edit.h | 编辑功能类定义头文件 |
22 | Edit.cpp | 编辑功能类实现文件 |
23 | Find.h | 查询功能类定义头文件 |
24 | Find.cpp | 查询功能类实现文件 |
25 | jieguo.h | 结果显示功能定义头文件 |
26 | jieguo.cpp | 结果显示功能类实现文件 |
27 | xianshi.h | 显示功能定义头文件 |
28 | xianshi.cpp | 显示功能实现文件 |
【核心代码解释】
核心代码1:文件保存
如图6运用输入输出流进行文件保存,包含头文件后定义一个ofstream的对象save,调用open函数以ios::out方式打开文件,如果文件不存在将会创建一个数据库的txt文件来保存信息,因为采用ios::out的方式,每次保存信息会覆盖之前的信息,避免了重复保存。保存方式是定义一个工作指针p,接收应用于全局的头指针head,遍历一遍链表通过重载运算符<<依次保存。保存成功后,调用close函数关闭文件,调用MFC的一个MessageBox函数进行一个保存成功的弹窗提示。
图6 文件保存
核心代码2:文件读取
如图7运用输入输出流进行文件保存,包含头文件后定义一个ifstream的对象read,调用open函数打开文件,调用is_open函数判断文件是否为空,如果文件不存在或者文件为空,将会调用MessageBox函数进行一个文件为空的弹窗提示;如果文件存在,则会通过while循环进行链表创建,其中定义一个工作指针node并为其开辟内存空间,通过read对象运用重载运算符>>初始化node的信息,然后判断node是头节点还是普通节点,循环创建,当node循环到文件末尾或者node里面的age为非正常值时候跳出循环。读入成功后,将会调用MessageBox函数进行一个读入成功的弹窗提示。创建链表的代码会再下一部分核心代码详细解释。
图7 文件读取
核心代码3:添加信息
如图8定义CString类型的数个变量与Date里面的数据对应,调用GetDlgItemText函数用于接收输入框内的文本类型的数值(其中变量是输入框的ID和接收变量的变量名),再调用CW2A函数进行强制类型转换,将CString类型的变量通过GetString函数转换成string类型存入工作指针node,调用GetDlgItemInt函数将输入框中的数据类型的变量转换为int型存入工作指针node。
图8接收信息
如图9 node指针已被成功定义,在添加信息之前创建一个工作指针进行链表遍历,对新添加信息和原有信息的ID进行比较,如果重复将会调用MessageBox函数进行一个请勿重复添加的添加失败的提示。如果没有重复,则会进入创建链表的函数,先判断node是否为头节点,如果是则插入头节点,然后使next置空形成尾节点;如果是普通节点,则开一个尾指针tail,通过尾指针的特性next为空循环查找尾节点,找到后使node的next置空形成新的尾节点,再将tail的指针指向新的尾节点。通过flag的值判断是否创建成功,创建成功后将会调用MessageBox函数进行一个添加成功的弹窗提示
图9 插入链表
核心代码4:删除信息
同样的思路获取输入框中的值,循环查找要删除的节点,依次判断节点类型,分头节点,普通节点,尾节点三类删除,通过flag的值判断是否删除成功,后调用MessageBox函数进行一个添加成功的弹窗提示
图10 删除信息
核心代码5:排序算法
运用选择排序的思想,对链表进行选择排序,其中不改变链表的指向,只交换其数据,实现从小到大排序(因为后期显示运用MFC的链表函数会逆序输出,所以这里排序用了从小到大)。
图11 排序算法
核心代码6:查询显示方式
如图12,设置一个指向父窗口的指针,用MFC内函数GetDlgItemtExt函数获取父窗口内输入框的值并将其转换成string类型,遍历链表进行比较,找到后运用之前设置过的列表,先用OnInitDialog对其进行初始化,然后调用InsertColumn函数进行输出,四个参数分别为列数,名称,行数,宽度。这里还是运用到了CString和string的相互转换。
图12 查询及显示
核心代码7:登录设置
如图13定义两个CString数据类型的变量来存储输入框中的用户名和密码,运用CompareNoCase函数进行忽略大小写的比较,比较成功则可以通过DoModal弹窗进入菜单界面,比较失败则调用MessageBox函数进行一个用户名或密码正确的登录失败弹窗提示。
图13 登录设置
【运行主要界面】
图14 登录界面
图15 登录失败提示
图16 菜单界面
图17文件读入提示
图18 文件保存提示
图19 所有信息显示
图20 添加职工工作量
图21 添加失败提示
图22 添加成功提示
图23 删除职工信息
图24 删除成功提示
图25 删除失败提示
图26 编辑职工信息
图27 编辑成功提示
图28 编辑失败提示
图29 查找职工信息
图30 查找成功提示
图31 查找失败提示
图32 添加工作量
图33 批量添加工作量
图34 统计结果显示
4、课程设计所用知识点总结
表2. 本项目所涉及知识点总结
序号 | 知识点 | 说明 |
---|---|---|
1 | 函数 | 本系统定义了很多个函数,包括带返回值、传入基本数据类型、指针、引用类型 |
2 | 链表 | 本项目定义了类链表,用于存储数据 |
3 | 文件 | 本项目使用txt文件做数据持久化存储 |
4 | 类与对象 | 定义了16个类,分别实现了不同功能 |
5 | 安全头文件包含 | 类自动包含 |
6 | 多文件 | 运用了多文件的处理方式,使项目层次清晰 |
7 | 算法 | 运用了选择排序的思想对工作量进行排序 |
5、项目总结
设计过程:我是先把整个思路设计好,然后系统的把代码敲完,逐步调试,完善漏洞,最后去自学了MFC把代码拆解进MFC里面完成可视化编程。
得意之处:我的所有数据存储是用链表完成,优化了内存利用,并且利用MFC使界面可视化。把重复出现的部分全部封进函数,精简了代码量。
存在的问题:我的测试并不是很完美,必然存在我没发现的漏洞,但是我也只能尽量去的完善。
心得与体会:写代码比较顺利,一气呵成,但是debug的时间却远远大于写代码时间,说明自己的基础不够扎实,逻辑思维不够严谨,还需继续努力。通过本次项目编写,我对类、链表、指针的知识点得到了进一步巩固,锻炼了全局思维。另外,在此项目编写过程中不仅我的代码能力得到提升,而且自学能力也得到了提升,我遇到不清楚的地方就打开网课看一看,知识点也就更清楚。而且我自学了MFC实现了可视化界面编程,这是我的得意之处,希望以后能有更多这样的项目机会锻炼自己。
相关文章:

基于C++实现(MFC)职工工作量统计系统
题目:职工工作量统计系统设计 1、问题描述 职工包括姓名、职工号、性别、年龄、所在部门、联系方式等信息。 工作量包括职工号、完成的产品数量等信息。 该设计系统能够对职工的工作量进行统计,并排出名次。注意,一个职工的工作量是可以多次…...
大家好,我叫Redis~
大家好,我是Redis!下面请通过我的故事来认识我吧。 1. 初次登场:为什么需要我 在“双十一”期间,商店被顾客挤得水泄不通,所有人都急着问:“这款商品还有库存吗?” 可怜的服务员(My…...

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件
目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…...

网络安全学习(五)Burpsuite
经过测试,发现BP需要指定的JAVA才能安装。 需要的软件已经放在我的阿里云盘。 (一)需要下载Java SE 17.0.12(LTS) Java Downloads | Oracle 1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持 看一下是否安装成功,…...

多版本node管理工具nvm
什么是nvm? 在项目开发过程中,使用到vue框架技术,需要安装node下载项目依赖,但经常会遇到node版本不匹配而导致无法正常下载,重新安装node却又很麻烦。为解决以上问题,nvm:一款node的版本管理工…...

如何扫描试卷去除笔迹?4种方法还原整洁试卷
如何扫描试卷去除笔迹?扫描试卷去除笔迹,作为现代学习管理与评估的革新手段,不仅显著提升了试卷的整洁美观度,更在环保和资源再利用层面发挥了积极作用。它使得试卷的保存、分享与复习变得更加便捷高效,减少了纸质资源…...
介绍⼀下泛型擦除
1.是什么 泛型擦除(Type Erasure)是Java泛型实现中的一个重要概念。Java的泛型是通过类型擦除来实现的,这意味着在运行时,泛型信息(即类型参数的具体类型)是不可用的。编译器在编译时会对泛型代码进行擦除处…...
从底层原理上理解ClickHouse 中的 Distributed 引擎
ClickHouse 的 Distributed 引擎 是实现大规模分布式查询和高可用性的关键技术之一,它允许集群中的多个节点协同工作,提供横向扩展能力和负载均衡机制。在底层,Distributed 引擎通过一系列的机制和策略,确保数据的分布、查询的并行…...

社区志愿者服务系统小程序的设计
管理员账户功能包括:系统首页,个人中心,志愿者管理,社区管理,活动类型管理,志愿者活动管理,活动报名管理,活动签到管理,证书信息管理,系统管理 微信端账号功…...

echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】
在数据可视化中,地图是很重要的一个环节,很多时候需要展现的不仅是国家地图,还需要能从国家进入到省市。这个逐级进入的过程就是我们今天说的地图下钻。 地图下钻看起来很屌、很高大上,但是仔细琢磨一下,技术实现上真的…...

Python热频随机森林分类器算法模型模拟
🎯要点 研究发射测量斜率和时滞热频率表征,使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应,测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…...

C++11新增特性:lambda表达式、function包装器、bind绑定
一、lambda表达式 1)、为啥需要引入lambda? 在c98中,我们使用sort对一段自定义类型进行排序的时候,每次都需要传一个仿函数,即手写一个完整的类。甚至有时需要同时实现排升序和降序,就需要各自手写一个类&…...
动态主题模型DTM(Dynamic topic model)简介及python代码
文章目录 DTM模型简介DTM实现1:gensim.models.ldaseqmodel包DTM实现2:gensim.models.wrappers.dtmmodel.DtmModel包DTM模型简介 DTM模型(Dynamic Topic Model)是一种用于文本数据分析的概率模型,主要用于发现文本数据背后的主题结构和主题的演化过程。DTM模型是LDA模型的…...

GDPU MySQL数据库 天码行空1 数据库的创建和基本操作
💖 必看 MySQL 5.7默认的 innodb 存储引擎Windows10 和 Centos7 一、实验目的 1.熟知机房用机安全规则。 2.通过上机操作,加深对数据库系统理论知识的理解;通过使用具体的DBMS,了解一种实际的数据库管理系…...

《告别卡顿,一键卸载!IObit Uninstaller 13 免费版让电脑重获新生》
随着电脑使用时间的增长,各种软件的安装和卸载,难免会让电脑变得臃肿不堪,运行速度大不如前。你是否也有过这样的烦恼?别担心,IObit Uninstaller 13 免费版来帮你解决这个问题! IObit Uninstaller 13 是一…...
Python|基于Kimi大模型,实现上传文档并进行对话(5)
前言 本文是该专栏的第5篇,后面会持续分享AI大模型干货知识,记得关注。 我们在利用大模型进行文本处理的时候,可能会遇到这样的情况。 笔者在这里举个例子,比如说我们的目标文本是一堆docx文档,或者pdf文档,doc文档等等。这时需要大模型对这样的文档文本内容进行语义处…...

C++设计模式——Prototype Pattern原型模式
一,原型模式的定义 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。 原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化…...

Vue3 : ref 与 reactive
目录 一.ref 二.reactive 三.ref与reactive的区别 四.总结 一.ref 在 Vue 3 中,ref 是一个用于创建可读写且支持数据跟踪的响应式引用对象。它主要用于在组件内部创建响应式数据,这些数据可以是基本类型(如 number、string、boolean&…...

html实现好看的多种风格手风琴折叠菜单效果合集(附源码)
文章目录 1.设计来源1.1 风格1 -图文结合手风琴1.2 风格2 - 纯图片手风琴1.3 风格3 - 导航手风琴1.4 风格4 - 双图手风琴1.5 风格5 - 综合手风琴1.6 风格6 - 简描手风琴1.7 风格7 - 功能手风琴1.8 风格8 - 全屏手风琴1.9 风格9 - 全屏灵活手风琴 2.效果和源码2.1 动态效果2.2 源…...

Nacos分布式配置中心
分布式配置的优势: 不需要重新发布我们的应用 新建父工程:【将它作为跟 所以要把父工程里面的src删掉】 新建子模块: 新建bootstrap.properties: 在使用Nacos作为配置中心时,推荐在bootstrap.properties中配置Nacos相…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...