当前位置: 首页 > article >正文

C++之职工管理系统(细节Q)

指针初始化类 && 普通变量初始化类 

抽象基类worker,只需编写 .h ,无需 .cpp 底层实现

类 记得声明权限public!!!不然默认private,主函数访问不了

记得继承父类

 

Worker * worker:指向Worker类型对象的指针 = 地址

Worker ** worker_Array:(动态) 指针数组,即数组每一个元素都是指向Worker类型对象的指针=地址

 

初始化动态数组(数组首地址指针+人数)

批量添加成员功能实现


1.需添加人数addNum是否大于0

addNum > 0

2.求新动态数组的空间大小newSize 

 newSize=this->EmpNum+addNum

3.生成新动态数组去的地址newSpace(注意格式) 

 Worker ** newSpace=new worker * [newSize]

4.将原来数组内容复制到新数组里面

for循环:newSpace[i] = this->EmpArray[i];

5.将人员信息打包封装,new分配空间(指针)

 wok = new Employee(id, name, 1);

6.将打包好的对象加入新数组

newSpace[this->EmpNum + i] = wok;

7.释放原数组空间(已废弃)

delete[ ] this->EmpArray;

8.更新指向,指向新数组

this->EmpArray = newSpace;

9.更新成员个数,为新数组个数

this->EmpNum = newSize;

void workerManager::Add_EMP()
{
	cout << "请输入添加的人数" << endl;
	int addNum = 0;
	cin >> addNum;
	if (addNum > 0) {

		//添加新的数组空间大小
		int newSize = this->EmpNum + addNum;

		//开辟新空间,新数组的地址
		worker** newSpace = new  worker * [newSize];

		//将原空间地址的内容存放到新空间下(复制)
		if (this->EmpArray != NULL)
		{
			for (int i = 0; i < this->EmpNum; i++)
			{
				newSpace[i] = this->EmpArray[i];
			}
		}

		//输入新数据(批量添加)
		for (int i = 0; i < addNum; i++)
		{
			int id;
			string name;
			int dSelect; //职位

			cout << "请输入第" << i + 1 << "个职工的id" << endl;
			cin >> id;

			cout << "请输入第" << i + 1 << "个职工的name" << endl;
			cin >> name;

			cout << "亲选择岗位:1.员工 2.经理 3.总裁" << endl;
			cin >> dSelect;

			//注意:此时体现多态的重要性
			//初始化为基类worker,初始化为NULL
			worker* wok = NULL;

			//选择岗位,switch实现
			switch (dSelect)
			{
			case 1:
				//给指针分配空间
				wok = new Employee(id, name, 1);
				break;
			case 2:
				wok = new manager(id, name, 1);
				break;
			case 3:
				wok = new Boss(id, name, 1);
				break;
			default:
				break;

			}

			//将刚创建的对象加入数组中
			newSpace[this->EmpNum + i] = wok;
		}

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

		//更新新空间的指向,更新地址
		this->EmpArray = newSpace;

		//更新数组成员个数
		this->EmpNum = newSize;

		//提示信息
		cout << "添加成功!" << endl;
	}
	else
	{
		cout << "输入错误" << endl;
	}

	//按任意键
	system("pause");
	//清屏操作
	system("cls");

}

针对三种文件情况,构造初始化 

文件不存在 创建文件


初始化构造(读文件)

workerManager::workerManager()
{
	
	//文件不存在
	ifstream ifs;
	ifs.open("test", ios::in);//读文件

	if (!ifs.is_open())//文件为空
	{
		cout << "文件不存在" << endl;
		//构造初始化
		this->EmpNum = 0;
		this->EmpArray = NULL;
		//初始化文件标志,默认为空
		this->FileEmpty = true;

		//关闭文件
		ifs.close();
		return;
	}

}

 文件存在 数据为空


文件结尾为 eof,用于判断是否为空(读文件)

//文件存在,但数据为空
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		cout << "文件为空" << endl;
		//构造初始化
		this->EmpNum = 0;
		this->EmpArray = NULL;
		//初始化文件标志,默认为空
		this->FileEmpty = true;

		//关闭文件
		ifs.close();
		return;
	}

 显示职工信息功能

void workerManager:: Show_Emp()
{
	if (this->FileEmpty)
	{
		cout << "文件不存在or记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < EmpNum; i++)
		{
			//多态调用接口,数组成员均为worker
			this->EmpArray[i]->showInfo();
		}
	}
}

 查找目标职工在数组中的位置


主要思路:

遍历数组查找需删除对象在数组中的位置 index,不存在则返回-1

int workerManager::IsExist(int id)
{
	int index = -1;

	for (int i = 0; i < this->EmpNum; i++)
	{
		if (this->EmpArray[i]->ID == id)
		{
			index = i;  //找到职工
			break;
		}
	}
	return index;
}

 删除职工信息


数组成员 前移

void workerManager::Del_Emp()
{
	if (this->FileEmpty)
	{
		cout<< "文件不存在" << endl;

	}
	else
	{
		cout << "请输入需删除职工编号" << endl;
		int id = 0;
		cin >> id;

		int index = this->IsExist(id);
		if (index != -1)
		{
			for (int i = index; i < this->EmpNum - 1; i++)
			{
				//数据前移
				this->EmpArray[i] = this->EmpArray[i + 1];
			}
			this->EmpNum--; //人数--
			this->save(); //数据同步更新到文件中
			cout << "删除成功" << endl;
		}
		else
		{
			cout << "未找到该职工" << endl;
		}
		system("pause");
		system("cls");
	}
}

修改职员信息


1.是否存在

2.删除该职工

3.重写职工信息

void workerManager::Mod_Emp()
{
	int id;
	cin >> id;
	int ret = this->IsExist(id);
	if (ret != -1)
	{
		delete this->EmpArray[ret];

		int newId = 0;  
		string newName = "";
		int dSelect = 0;  //岗位

		cin >> newId;
		cin >> newName;
		cin >> dSelect;

		//多态创建人员,初始化空指针
		worker* wok = NULL;
		switch (dSelect)
		{
		case 1:
			//给指针分配空间
			wok = new Employee(newId, newName, dSelect);
			break;
		case 2:
			wok = new manager(newId, newName, dSelect);
			break;
		case 3:
			wok = new Boss(newId, newName, dSelect);
			break;
		default:
			break;

		}

         //写入数组
		this->EmpArray[ret] = wok;
	}
	else { cout << "未找到需修改职工" << endl; }
}

 选择排序

 

清空

 


http://www.kler.cn/news/313873.html

相关文章:

  • Spring Boot集成Akka remoting快速入门Demo
  • Spring-关于IOC的解释及相关理解(如何从三个方面理解)
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-16
  • leetcode 380.O(1) 时间插入、删除和获取随机元素
  • 电脑ip会因为换了网络改变吗
  • JavaScript web API完结篇---多案例
  • Abp vNext(五)集成MQTTnet,可收发消息
  • 【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题六
  • Android架构组件中的MVVM模式实战应用与数据绑定技巧
  • Python精选200Tips:156-160
  • 力扣刷题--3033. 修改矩阵【简单】
  • 【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具
  • 执行 npm报错 Cannot find module ‘../lib/cli.js‘
  • 电脑技巧:Win11家庭版和专业版之间的区别详解
  • KVM环境下制作ubuntu qcow2格式镜像
  • xml中的转义字符
  • 【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过
  • 前端web端项目运行的时候没有ip访问地址
  • 【信创】Linux上如何创建和管理自定义的 systemd 服务 _ 统信 _ 麒麟 _ 方德
  • 滑动窗口算法专题(1)
  • pgsql 分组查询方法
  • Python基础知识——字典排序(不断补充)
  • 数据库课程设计mysql
  • python-SZ斐波那契数列/更相减损数
  • 【Python】Anaconda插件:Sublime Text中的Python开发利器
  • 【数据结构初阶】链式二叉树接口实现超详解
  • InnoDB锁机制全解析
  • VScode快速配置c++(菜鸟版)
  • 基于SpringBoot的招生宣传管理系统【附源码】
  • 计算机网络(Hub 集线器、交换机、路由器)