【职工管理系统】C++全栈体系(十四)

news2024/9/29 15:31:29

职工管理系统

第七章 添加职工

功能描述:批量添加职工,并且保存到文件中

一、功能分析

分析:

用户在批量创建时,可能会创建不同种类的职工

如果想将所有不同种类的员工都放入到一个数组中,可以将所有员工的指针维护到一个数组里

如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护

在这里插入图片描述

二、功能实现

在WokerManager.h头文件中添加成员属性 代码:

	//记录文件中的人数个数
	int m_EmpNum;

	//员工数组的指针
	Worker ** m_EmpArray;

在WorkerManager构造函数中初始化属性

WorkerManager::WorkerManager()
{
	//初始化人数
	this->m_EmpNum = 0;

	//初始化数组指针
	this->m_EmpArray = NULL;
}

在workerManager.h中添加成员函数

	//增加职工
	void Add_Emp();

workerManager.cpp中实现该函数

//增加职工
void WorkerManager::Add_Emp()
{
	cout << "请输入增加职工数量: " << endl;

	int addNum = 0;
	cin >> addNum;

	if (addNum > 0)
	{
		//计算新空间大小
		int newSize = this->m_EmpNum + addNum;

		//开辟新空间
		Worker ** newSpace = new Worker*[newSize];

		//将原空间下内容存放到新空间下
		if (this->m_EmpArray != NULL)
		{
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				newSpace[i] = this->m_EmpArray[i];
			}
		}

		//输入新数据
		for (int i = 0; i < addNum; i++)
		{
			int id;
			string name;
			int dSelect;

			cout << "请输入第 " << i + 1 << " 个新职工编号:" << endl;
			cin >> id;


			cout << "请输入第 " << i + 1 << " 个新职工姓名:" << endl;
			cin >> name;


			cout << "请选择该职工的岗位:" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> dSelect;


			Worker * worker = NULL;
			switch (dSelect)
			{
			case 1: //普通员工
				worker = new Employee(id, name, 1);
				break;
			case 2: //经理
				worker = new Manager(id, name, 2);
				break;
			case 3:  //老板
				worker = new Boss(id, name, 3);
				break;
			default:
				break;
			}


			newSpace[this->m_EmpNum + i] = worker;
		}

		//释放原有空间
		delete[] this->m_EmpArray;

		//更改新空间的指向
		this->m_EmpArray = newSpace;

		//更新新的个数
		this->m_EmpNum = newSize;

		//提示信息
		cout << "成功添加" << addNum << "名新职工!" << endl;
	}
	else
	{
		cout << "输入有误" << endl;
	}

	system("pause");
	system("cls");
}

在WorkerManager.cpp的析构函数中,释放堆区数据

WorkerManager::~WorkerManager()
{
	if (this->m_EmpArray != NULL)
	{
		delete[] this->m_EmpArray;
	}
}

三、测试添加

在main函数分支 1 选项中,调用添加职工接口
在这里插入图片描述
效果如图:
在这里插入图片描述
至此,添加职工到程序中功能实现完毕

第八章 文件交互 - 写文件

功能描述:对文件进行读写

​ 在上一个添加功能中,我们只是将所有的数据添加到了内存中,一旦程序结束就无法保存了

​ 因此文件管理类中需要一个与文件进行交互的功能,对于文件进行读写操作

一、设定文件路径

首先我们将文件路径,在workerManager.h中添加宏常量,并且包含头文件 fstream

#include <fstream>
#define  FILENAME "empFile.txt"

二、成员函数声明

在workerManager.h中类里添加成员函数 void save()

//保存文件
void save();

三、保存文件功能实现

void WorkerManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);


	for (int i = 0; i < this->m_EmpNum; i++)
	{
		ofs << this->m_EmpArray[i]->m_Id << " " 
			<< this->m_EmpArray[i]->m_Name << " " 
			<< this->m_EmpArray[i]->m_DeptId << endl;
	}

	ofs.close();
}

四、保存文件功能测试

在添加职工功能中添加成功后添加保存文件函数
在这里插入图片描述
再次运行代码,添加职工
在这里插入图片描述
同级目录下多出文件,并且保存了添加的信息
在这里插入图片描述

第九章 文件交互 - 读文件

功能描述:将文件中的内容读取到程序中

虽然我们实现了添加职工后保存到文件的操作,但是每次开始运行程序,并没有将文件中数据读取到程序中

而我们的程序功能中还有清空文件的需求

因此构造函数初始化数据的情况分为三种

  1. 第一次使用,文件未创建
  2. 文件存在,但是数据被用户清空
  3. 文件存在,并且保存职工的所有数据

一、文件未创建

在workerManager.h中添加新的成员属性 m_FileIsEmpty标志文件是否为空

	//标志文件是否为空
	bool m_FileIsEmpty;

修改WorkerManager.cpp中构造函数代码

WorkerManager::WorkerManager()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);

	//文件不存在情况
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl; //测试输出
		this->m_EmpNum = 0;  //初始化人数
		this->m_FileIsEmpty = true; //初始化文件为空标志
		this->m_EmpArray = NULL; //初始化数组
		ifs.close(); //关闭文件
		return;
	}
}

删除文件后,测试文件不存在时初始化数据功能

二、文件存在且数据为空

在workerManager.cpp中的构造函数追加代码:

	//文件存在,并且没有记录
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		cout << "文件为空!" << endl;
		this->m_EmpNum = 0;
		this->m_FileIsEmpty = true;
		this->m_EmpArray = NULL;
		ifs.close();
		return;
	}

追加代码位置如图:
在这里插入图片描述
将文件创建后清空文件内容,并测试该情况下初始化功能

我们发现文件不存在或者为空清空 m_FileIsEmpty 判断文件是否为空的标志都为真,那何时为假?

成功添加职工后,应该更改文件不为空的标志

void WorkerManager::Add_Emp() 成员函数中添加:

		//更新职工不为空标志
		this->m_FileIsEmpty = false;

在这里插入图片描述

三、文件存在且保存职工数据

1. 获取记录的职工人数

在workerManager.h中添加成员函数 int get_EmpNum();

	//统计人数
	int get_EmpNum();

workerManager.cpp中实现

int WorkerManager::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);

	int id;
	string name;
	int dId;

	int num = 0;

	while (ifs >> id && ifs >> name && ifs >> dId)
	{
        //记录人数
		num++;
	}
	ifs.close();

	return num;
}

在workerManager.cpp构造函数中继续追加代码:

	int num =  this->get_EmpNum();
	cout << "职工个数为:" << num << endl;  //测试代码
	this->m_EmpNum = num;  //更新成员属性 

手动添加一些职工数据,测试获取职工数量函数

在这里插入图片描述
在这里插入图片描述

2. 初始化数组

根据职工的数据以及职工数据,初始化workerManager中的Worker ** m_EmpArray 指针

在WorkerManager.h中添加成员函数 void init_Emp();

	//初始化员工
	void init_Emp();

在WorkerManager.cpp中实现

void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);

	int id;
	string name;
	int dId;
	
	int index = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)
	{
		Worker * worker = NULL;
		//根据不同的部门Id创建不同对象
		if (dId == 1)  // 1普通员工
		{
			worker = new Employee(id, name, dId);
		}
		else if (dId == 2) //2经理
		{
			worker = new Manager(id, name, dId);
		}
		else //总裁
		{
			worker = new Boss(id, name, dId);
		}
		//存放在数组中
		this->m_EmpArray[index] = worker;
		index++;
	}
}

在workerManager.cpp构造函数中追加代码

	//根据职工数创建数组
	this->m_EmpArray = new Worker *[this->m_EmpNum];
	//初始化职工
	init_Emp();

	//测试代码
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工号: " << this->m_EmpArray[i]->m_Id
			<< " 职工姓名: " << this->m_EmpArray[i]->m_Name
			<< " 部门编号: " << this->m_EmpArray[i]->m_DeptId << endl;
	}

运行程序,测试从文件中获取的数据

在这里插入图片描述

至此初始化数据功能完毕,测试代码可以注释或删除掉!

第十章 显示职工

功能描述:显示当前所有职工信息

一、显示职工函数声明

在workerManager.h中添加成员函数 void Show_Emp();

	//显示职工
	void Show_Emp();

二、显示职工函数实现

在workerManager.cpp中实现成员函数 void Show_Emp();

//显示职工
void WorkerManager::Show_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用接口
			this->m_EmpArray[i]->showInfo();
		}
	}

	system("pause");
	system("cls");
}

三、测试显示职工

在main函数分支 2 选项中,调用显示职工接口
在这里插入图片描述
测试时分别测试 文件为空和文件不为空两种情况

测试效果:

测试1-文件不存在或者为空情况
在这里插入图片描述
测试2 - 文件存在且有记录情况
在这里插入图片描述
测试完毕,至此,显示所有职工信息功能实现

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

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

相关文章

组织级过程资产库如何助力CMMI3-5级高效落地?

为了助力CMMI3-5级高效落地&#xff0c;近日CoCode旗下Co-ProjectV3.0智能项目管理平台全面升级&#xff0c;CMMI落地4大工具正式上线&#xff1a;CMMI成熟度自测工具、量化管理工具&#xff08;组织级过程改进工具和量化项目管理工具&#xff09;、组织级过程资产库。 组织级过…

tomcat下载安装步骤(笔记整理)

目录Tomcat下载安装以及配置&#xff08;详细教程&#xff09;tomcat下载安装步骤&#xff08;超详细&#xff09;Apache Tomcat下载、安装、配置图文教程Tomcat下载安装配置详细过程Tomcat下载及配置&#xff08;IDEA&#xff09;Tomcat 下载安装教程Linux系统中Tomcat下载安装…

振弦采集模块配置工具VMTool 扩展功能数据处理

振弦采集模块配置工具VMTool 扩展功能数据处理 数据存储 数据存储功能模块支持自动或手动将实时数据寄存器值存储到数据库&#xff0c; 并支持导出为 Excel文件功能。 &#xff08; 1&#xff09; 手动存储 每点击数据存储面板内的【 手动存储】按钮一次&#xff0c;将当前寄存…

Spring Cloud_Gateway新一代网关

目录一、概述简介1.官网2.是什么3.能干嘛4.微服务架构中网关在哪里二、三大核心概念1.Route(路由)2.Predicate&#xff08;断言&#xff09;3.Filter(过滤)4.总体三、Gateway工作流程1.官网总结2.核心逻辑&#xff1a;路由转发执行过滤器链四、入门配置1.新建Module2.POM3.YML4…

模板征集活动正式上线 | 加入我们,共创可视化内容!

本活动是由EasyV官方发布举办的定向主题模板征集活动&#xff0c;用户报名参加并使用EasyV进行创作后&#xff0c;通过素材广场上传作&#xff0c;经由官方进行作品评估&#xff0c;取得奖次的用户即可获得相应奖励。活动面向EasyV所有产品用户&#xff0c;以作品为维度独立参与…

tomcat下载与安装win11

目录 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 10版本为例&#xff09; 2、之后选择解压到任意一个盘&#xff0c;我解压到D盘&#xff0c;解压的路径一定要记住&#xff0c;后面系统环境变量配置的时候要用到。 二、配置环境 三、验证是否配置成功…

jvm 堆 栈大小设置

1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermSize128M //非堆内存 -XX:MaxPermSize256M 2、Eclise 中设置jvm内…

mybatis-plus02

目录一、乐观锁二、查询构造器三、分页查询四、逻辑删除五、Mybatis的应用一、乐观锁 配置示例&#xff1a; 在数据库表中加入version字段&#xff0c;表示数据版本号 修改实体类&#xff0c;在使用类中加入对应的version字段&#xff0c;并使用是乐观锁 //乐观锁 Version pr…

数据结构 第六章 二叉树与树(二叉树的性质)

玫瑰少年&#xff1a;点击收听 1 基本知识点 1、根结点&#xff1a;在一棵树中&#xff0c;(唯一)一个没有前驱的结点 2、叶子结点&#xff1a;在一棵树中&#xff0c;没有后继的结点 3、结点的度&#xff1a;是指结点后继的数量 4、树的度&#xff1a;是指所有结点度的最大值…

VMware ESXi 6.7 U3 Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi-6.7.0-20221004001 Build 20497097 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-6-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org VMware ESXi 6.7.0 Update 3 Build 20497097 Unlocker &…

[Vulnhub] DC-7

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-7.zip git信息泄露Drupal-CMS 拿shellnc反弹shell反弹shell写入root用户的cron定时任务&#xff0c;root执行提权 目录 <1> 信息搜集 (1) nmap扫靶机ip&端口服务 (2) github上DC-7项目信息泄露 <2&g…

洛谷 P1417 烹调方案 01背包题解 动态规划

真的好久没有写题解了 上次写还是在上次呢 先赞后看好习惯&#xff01; 昨天打了一月份的USACO(美国信奥赛) 给我一个感触&#xff08;也算是感想吧&#xff09;&#xff1a; 我是蒟蒻 我是蒟蒻 我是蒟蒻 我是蒟蒻 水内容&#xff08;&#xff09; 言归正传看今天这道题 题…

电脑键盘打字错乱怎么办?按键混乱的5种解决方法

有人问电脑无故乱打字&#xff0c;明明按的正确的键&#xff0c;打出来的却是错误的字母。换个键盘是不是就能解决呢&#xff1f; 不过如果你的手边恰好没有新键盘&#xff0c;又立刻要用电脑&#xff0c;可以先试试下面的5种方法。 重新连接键盘和电脑禁用键盘上的Num Lock运…

爬虫进阶(web逆向之b站)

文章目录 简介分析nowh5获取动态参数模拟 now模拟 h5小结简介 前面在《web逆向初步》练习了一些 JS 加密操作,这篇进入基础实战部分,通过给b沾刷播放量的例子,体会逆向的作用!当然,这里不是恶意刷流量,而是通过程序模拟一个正常用户,给视频增加一次播放量分析 一个正常用…

【深度学习框架-Paddle】丝滑安装PaddlePaddle,无缝衔接使用多卡

目录Paddle爱恨史PaddleCloud多卡Paddle爱恨史 Paddle是由百度开发的国内的深度学习框架&#xff0c;PaddlePaddle支撑了PaddleOCR、PaddleNLP等一系列领域内的开源工具包&#xff0c;为国内深度学习的落地与实践做出了大量贡献。 但是&#xff0c;PaddlePaddle安装问题一直都…

wpa_supplicant EAPOL状态机分析

协议 EEE 802.1X-2004协议&#xff1a;基于端口的网络接入控制协议&#xff08;port based network access control protocol&#xff09;。在LAN口对所接入的用户设备进行认证和控制&#xff0c;如果通过认证则端口打开&#xff0c;可以访问局域网中的资源。 状态机设计原理…

TYPE-C接口引脚详解

Type-C口有4对TX/RX分线&#xff0c;2对USBD/D-&#xff0c;一对SBU&#xff0c;2个CC&#xff0c;另外还有4个VBUS和4个地线。 1、当Type-C接口仅用作传输DP信号时&#xff0c;则可利用4对TX/RX&#xff0c;从而实现4Lane传输&#xff0c;这种模式称为DPonly模式&#xff1b;…

如何对项目健康度进行测量?评估项目健康状况

项目驱动变革&#xff0c;大部分公司逐步由运营驱动转变为项目驱动&#xff0c;带来更多重新和商业价值。对组织而言&#xff0c;从商业角度看&#xff0c;项目旨在推动组织从一个状态转到另一个状态&#xff0c;从而达成特定目标。项目的健康情况如何关乎项目和变革的成本&…

生成package.json文件报错“系统找不到指定的路径”

文章目录一、提出问题二、解决问题一、提出问题 package.json文件作为Web工程的入口&#xff0c;到底有多少配置是和我们的日常开发相关的&#xff1f;使用npm或yarn命令生成一个最简单的package.json文件。在命令行执行命令&#xff1a;yarn init -y 执行命令hadoop version也…

IB数学还能做什么IA

苦恼着不知道怎么写数学科IA。对呀&#xff0c;数学不就是做做题&#xff0c;算算数吗&#xff0c;加减乘除神马的&#xff0c;到底还可以做什么课题&#xff01;&#xff1f; 第一问&#xff1a;“到底怎么才是一个没有bug的数学IA题目呢&#xff1f;” 面对这个问题&#xff…