基于C++实现(MFC)职工工作量统计系统【100010022】

news2024/11/15 10:16:06

【职工工作量统计系统设计】

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. 本项目文件功能列表

序号文件名说明
1Date.h数据类定义文件
2targetver.hMFC系统头文件
3pch.hMFC系统头文件
4pch.cppPch实现文件
5afxdialogex.hMFC系统头文件
6framework.hMFC系统头文件
7Resource.hMFC系统头文件
8MFCApplication3Dlg.h登录类定义头文件,包含账号密码
9MFCApplication3Dlg.cpp登录类定义实现文件
10MFCApplication3.hMFC系统头文件
11SystemDlg.h菜单类定义头文件
12SystemDlg.cpp菜单类实现文件,在其中嵌入了文件读写以及排序功能
13Add.h添加功能类定义头文件
14Add.cpp添加功能类实现文件
15Addall.h批量添加功能类定义头文件
16Addall.cpp批量添加功能类实现文件
17AddWH.h添加工作量功能定义头文件
18AddWH.cpp添加工作量功能实现文件
19Delete.h删除功能类定义头文件
20Delete.cpp删除功能类实现文件
21Edit.h编辑功能类定义头文件
22Edit.cpp编辑功能类实现文件
23Find.h查询功能类定义头文件
24Find.cpp查询功能类实现文件
25jieguo.h结果显示功能定义头文件
26jieguo.cpp结果显示功能类实现文件
27xianshi.h显示功能定义头文件
28xianshi.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 统计结果显示

【课程设计所用知识点总结】

表2. 本项目所涉及知识点总结

序号知识点说明
1函数本系统定义了很多个函数,包括带返回值、传入基本数据类型、指针、引用类型
2链表本项目定义了类链表,用于存储数据
3文件本项目使用txt文件做数据持久化存储
4类与对象定义了16个类,分别实现了不同功能
5安全头文件包含类自动包含
6多文件运用了多文件的处理方式,使项目层次清晰
7算法运用了选择排序的思想对工作量进行排序

【项目总结】

设计过程:我是先把整个思路设计好,然后系统的把代码敲完,逐步调试,完善漏洞,最后去自学了MFC把代码拆解进MFC里面完成可视化编程。

得意之处:我的所有数据存储是用链表完成,优化了内存利用,并且利用MFC使界面可视化。把重复出现的部分全部封进函数,精简了代码量。

存在的问题:我的测试并不是很完美,必然存在我没发现的漏洞,但是我也只能尽量去的完善。

心得与体会:写代码比较顺利,一气呵成,但是debug的时间却远远大于写代码时间,说明自己的基础不够扎实,逻辑思维不够严谨,还需继续努力。通过本次项目编写,我对类、链表、指针的知识点得到了进一步巩固,锻炼了全局思维。另外,在此项目编写过程中不仅我的代码能力得到提升,而且自学能力也得到了提升,我遇到不清楚的地方就打开网课看一看,知识点也就更清楚。而且我自学了MFC实现了可视化界面编程,这是我的得意之处,希望以后能有更多这样的项目机会锻炼自己。

♻️ 资源

在这里插入图片描述

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

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

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

相关文章

Alibaba官方上线,Java并发编程全彩图册(终极版)GitHub已置顶

都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升 Java…

Python图像识别实战(一):实现按数量随机抽取图像复制到另一文件夹(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

Qt实现全局鼠标事件监听器-Linux

Qt实现全局鼠标事件监听器-Linux版&#x1f991; var code “bc8d4eb4-a9df-48e9-8028-bbe1ae7fbd05” 文章目录Qt实现全局鼠标事件监听器-Linux版&#x1f991;1、概述&#x1f99e;2、实现效果&#x1f370;3、实现方式&#x1f980;4、关键代码&#x1f366;5、源代码&…

SpringMVC基础篇:第一个MVC程序和细节分析

文章整理自孙哥说SpringMVC&#xff0c;相关课程联系孙哥学习谢谢。第一章&#xff1a;编码开发一&#xff1a;思路分析二&#xff1a;SpringMVC程序编码三&#xff1a;控制器提供多个服务方法四&#xff1a;注意事项第二章&#xff1a;细节分析一&#xff1a;控制器创建次数二…

C++ 【set、map模拟实现】

目录 set概念 set基本使用 map概念 map的使用 map统计次数 operator[] operator[]底层如何实现&#xff1f; set和map迭代器封装 红黑树迭代器基本结构 operator operator-- operator[] 源代码链接 map、set底层都使用平衡搜索树(即红黑树)&#xff0c;容器中的元素…

HanLP 基于朴素贝叶斯 训练 文本分类

一、HanLP 朴素贝叶斯分类器 HanLP 针对文本分类算法已经帮我们实现 朴素贝叶斯法 &#xff0c;用户可以无需关心内部细节&#xff0c;HanLP 也提供了相关自定义训练接口&#xff0c;前提需要将数据集根据分类放到不同的目录中&#xff0c;例如&#xff1a; 官方给出了相关性能…

HanLP 基于SVM支持向量机 训练 文本分类

一、HanLP 基于SVM支持向量机分类器 上篇文章通过朴素贝叶斯文本分类器&#xff0c;训练测试了 搜狗文本分类语料库迷你版 &#xff0c;本篇继续测试SVM支持向量机分类器。 由于HanLP 官方给出的 SVM 分类器依赖了第三方库&#xff0c;没有集成在主项目中&#xff0c;需要拉取…

问题解决(1)——VS中scanf报错怎么解决

目录 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&#xff08;公众号拉到底部就能看到呦~~&am…

Redis【13】-修改数据库后,如何保证Redis与数据库的数据一致性

一、需求起因 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问MySQL等数据库。 这个业务场景&#xff0c;主要是解决读数据从Redi…

ARM 代码重定位实战

前言 任务 在 SRAM 中将代码从 0xd0020010 重定位到 0xd0024000。任务解释&#xff1a;本来代码是运行在0xd0020010的&#xff0c;但是因为一些原因我们又希望代码实际是在0xd0024000位置运行 的。这时候就需要重定位了。注解&#xff1a;本练习对代码本身运行无实际意义&…

你都工作两年半了,还不会RabbitMQ?

What is rabbitMQ &#xff1f; RabbitMQ 是一个由 Erlang 语言开发的 AMQP(高级消息队列协议) 的开源实现。 RabbitMQ 是轻量级且易于部署的&#xff0c;能支持多种消息协议。 RabbitMQ 可以部署在分布式和联合配置中&#xff0c;以满足高规模、高可用性的需求。 具体特点包括…

ADI Blackfin DSP处理器-BF533的开发详解29:TOUCH_LINE(屏幕画线)(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 代码实现了读取触摸屏坐标&#xff0c;并将触摸屏坐标换算为液晶屏的显示坐标&#xff0c;将像素点显示到触摸坐标的位…

学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

科赫曲线和谢尔宾斯基三角形是常见的分形图形&#xff08;详细介绍见参考文献1&#xff09;&#xff0c;本文使用turtle库绘制这两类图形。 科赫曲线 科赫曲线的详细介绍见参考文献2&#xff0c;其中的绘图思路是“画正三角形&#xff0c;并把每一边三等分,取三等分后的一边中…

【LeetCode】Day194-超级丑数

题目 313. 超级丑数【中等】 题解 之前做过丑数&#xff0c;规定丑数是质因数只包含2,3,5的正整数&#xff0c;而这道题丑数升级为超级丑数&#xff0c;规定为包含的质因数是在primes数组中的正整数 丑数的题解用动态规划&#xff0c;那么超级丑数也可以利用相同的方法解答…

CSS -- CSS元素显示模式总结(块元素,行内元素,行内块元素)

文章目录CSS 的元素显示模式1 什么是元素显示模式2 块元素3 行内元素4 行内块元素5 元素的显示模式总结CSS 的元素显示模式 1 什么是元素显示模式 作用&#xff1a;网页的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的特点可以更好的布局我们…

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-(系统+LW)

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff…

开源即巅峰,《Java程序性能优化实战》GitHub三小时标星已超34k

蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#xff0c;…

项目设置分页条件查询接口

一、分页 1、HospPlusConfig中配置分页插件1 /** 2 * 分页插件 3 */ 4 Bean 5 public PaginationInterceptor paginationInterceptor() { 6 return new PaginationInterceptor(); 7 }2、分页Controller方法 HospitalSetController中添加分页方法1 ApiOperation(value "分…

Python学习基础笔记四十二——序列化模块

1、序列化的概念&#xff1a; 序列&#xff1a;就是字符串。 序列化&#xff1a;将原本的字典、列表等内容转换成一个字符串数据类型的过程就叫做序列化。 反序列化&#xff1a;从字符串到数据类型的过程。 2、序列化的目的&#xff1a; 1、以某种存储形式使自定义的数据持…

servlet+Mysql实现的校园论坛管理系统(功能包含登录,首页帖子查看、发帖、个人帖子删除编辑、帖子评论回复、用户管理等)

博客目录servletMysql实现的校园论坛管理系统实现功能截图系统功能使用技术代码完整源码servletMysql实现的校园论坛管理系统 本系统是一个简单的校园论坛系统&#xff0c;学生可以在线发帖并进行帖子评论回复&#xff0c;同同时管理员可以对用户进行管理。 (文末查看完整源码…