職工管理系統源代碼-----C++類實現----文件輸入輸出-----實現過程超詳細講解

前言

  1. 如果你僅僅是想弄一份職工管理系統的源代碼,不想知道過程是怎樣實現的,那你可以直接拉到這篇文章的最底部找源代碼,注意:這個實現過程涉及了多個頭文件,cpp文件,具體創建的方法見代碼下面的詳解
  2. 這個實現過程是用C++的類實現的,而且還涉及到了文件的輸入和輸出。
  3. 這篇文章首先會講解這個職工管理系統能實現的功能,其次會講解過程是怎樣實現的,然後是源代碼,最後就是源代碼的使用說明。

職工管理系統的功能

上面這個圖片就是這個職工管理系統的功能圖,輸入對應的數字就能實現對應的功能。

這個項目的數據是文件進行保存的。保存在  empfile.txt  文件裏  。

這個項目是文件保存輸入輸出的,一旦運行這個程序,首先就會在堆區開闢一個數組,把文件中的數據讀入到這個數組裏面,接下來不論執行哪個功能,都是直接對數組裏面的數據進行操作,比如執行   4 修改職工信息  這個功能,實際上就是修改數組裏對應的信息,等到修改完成,會把修改後的數組保存至文件中(文件中原本的數據就會被覆蓋掉)。

其他的功能也是類似的,只要記住程序一旦運行,在你選擇對應的功能之前,已經完成了開闢數組,並把文件中的數據保存到了數組中,接下來的操作都是對數組進行操作,操作完成之後就是把修改後數組保存到文件中。

這項目中有三類職工,分別是員工,經理,老闆。每個職工都有自己的職工編號m_Id職工姓名m_Name部門編號m_DeptId這些屬性。每個職工都有兩個函數,分別是顯示自己的個人信息showInfo()函數和返回自己的崗位名稱getDeptName函數

員工、經理、老闆,這三種都有對應自己的類。這裏利用多態實現的,寫了父類(Worker)。根據這個父類,利用多態定義出了員工類、經理類和老闆類,具體看代碼詳解。

在這個項目中一共有五個cpp文件,分別是employee、manger、boss、workManger和職工管理系統主程序(main函數在這裏)。其中前三個cpp文件分別是員工類、經理類、老闆類的具體實現,workManger是項目中各個功能類的實現(最重要的一個類)。最後一個就是main函數的入口,在這裏執行程序。

 

最重要的就是workMangerl類,這個類包含三個屬性,

分別是記錄職工人數的m_EmpNum、判斷文件是否爲空的標誌 m_FileIsEmpty 、職工數組指針m_EmpArray。這個指針是一個二級指針,第一指向的是堆區開闢的數組指針,這個數組指針的每一個指針都指向一個職工,假如我們現在有一個員工、一個經理,一個老闆,這就要在堆區開始三個內存空間來存這三組數據(每個職工都有自己的屬性)。上面的數組指針就是指向這個三個內存空間的數據。然後 職工數組指針m_EmpArray  就是指向這個數組指針。這樣通過一個指針就能來維護所有職工的數據。這大概就是多態的優勢所在吧,不然三個類的成員數據進行保存時,要開闢三個數組,每次維護時還要進行分類討論。數據進行保存時,三個數組還都要都進行保存。

 

代碼的實現過程

WorkManger的構造函數

這個構造函數的作用就是初始化數據用的。如果文件不存在或者文件爲空,就是職工人數賦值爲0,數組指針指向爲空,如果文件中有數據,首先就利用一個 get_EmpNum()函數 來計算出文件中保存的有多少職工(這個函數是自己寫的)

然後根據這個字數的大小,在堆區開闢對應的指針數組,然後又利用了一個 init_Emp() 函數 ,來初始化數組,init_Emp()的實現過程就是根據文件,讀出對應的數據,每次讀一行(一個職工的數據),然後開闢空間存入。再把上面開闢的數組指針指向這個開闢的空間。根據這個構造函數,就實現了將文件中的數據讀入到了數組中,然後剩下的操作都是對數組進行操作。

0 退出管理程序

利用exit(0)就可以正常的退出程序,具體看代碼

1 增加職工信息

  1. 這個程序一個可以增加多名職工信息
  2. 計算新空間的大小,這裏採取的方法是開闢新空間,新空間的大小=原空間大小+新增人數。
  3. 根據新空間大小,來開闢對應的數組指針
  4. 把原來數組中的數據存入到新數組裏面。
  5. 輸入要添加的新職工信息
  6. 存入職工信息(輸入一個,存入一個)
  7. 釋放原本空間的內存
  8. 更改新空間的指向,讓 職工數組指針m_EmpArray  指向這段新空間,更改職工人數,文件是否爲空標誌
  9. 將新數組的數據存入到文件中。

2 顯示職工信息

  1. 首先判斷文件是否爲空或者文件中是否有數據,如果符合條件就直接輸入文件爲空或者無數據就行,剩下的程序就不用執行了,這樣比較方便快捷,具體原因可以自己想想
  2. 如果文件中有數據,直接遍歷一遍數組,把數組的每一個元素調用自身的顯示自己的個人信息showInfo()函數。這裏利用的是多態技術,父類指針指向子類的對象。

3 刪除職工信息

  1. 首先判斷文件是否爲空或者文件中是否有數據,原因和上面一樣
  2. 如果文件中有數據,根據職工編號進行刪除職工對應的信息
  3. 輸入想要刪除的職工編號,這裏有一個 IsExist()  函數  這個函數的作用數傳入一個職工編號,可以返回數組中這個職工編號在數組中存在的下標,如果不存在,會返回-1。利用上面這個函數就能求出來要刪除職工編號對應的下標
  4. 知道下標後,就可以刪除了,這裏採取的方法是覆蓋的方法,比如刪除的是數組中的某一個元素,那麼把這個元素後面的數據都往前移動一個位置,最後再把記錄職工人數的變量減一即可,再把指針指向的最後一個元素的內存空間釋放掉(代碼中好像沒寫這個釋放空間)。
  5. 最後把修改後的新數組保存到文件中

4 修改職工信息

  1. 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
  2. 輸入想要修改職工的編號,根據這個編號,利用IsExist()  函數  找到在數組中對應的下標
  3. 首先釋放數組中對應下標指向的內存空間。
  4. 然後開闢一個新空間,把要修改的職工信息存到新空間裏面,再把指針指向這個新的內存空間
  5. 最後 仍舊是將修改後的數組保存到文件中

5 查找職工信息

  1. 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
  2. 這裏查找職工信息有兩種查找方法,分別是根據職工編號進行查詢、根據職工姓名進行查詢
  3. 如果是根據職工編號進行查詢的話,直接根據這個職工編號,利用IsExist()  函數 求出下標,然後輸出下標對應的信息就可以
  4. 如果是根據職工姓名進行查詢,這裏可能會發生重名的現象,所以可以直接遍歷數組,如果有名字相同的,直接輸出對應的信息就可以(可能會出書多個人的信息)

6 按照職工編號進行排序

  1. 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
  2. 這裏排序有升序和降序兩種方法,這裏排序的方法選擇的是手寫選擇排序,當然排序方法也可以用其他的方法,比如快排。
  3. 將排序後的數組保存到文件中
  4. 這裏還調用了一個 show_Emp()函數 可以輸出排序後的數組信息,當然也可以不調用

7 清空所有文檔

  1. 這裏清空的方法是採取刪除源文件,重新創建一個新的空文件的方法。
  2. 因爲程序一運行,就會開闢內存空間來存原文件中的數據,所以這裏需要把開闢的內存空間釋放掉

 

 

最後再說一點關於WorkManger的析構函數,在這個函數中,我們要把開闢的各種指針都釋放掉,防止內存泄漏

代碼

worker.h的代碼

#pragma once
#include<iostream>
using namespace std;
#include<string>

//職工抽象的類
class Worker
{
public:
		
	//顯示個人信息
	virtual void showInfo() = 0;

	//獲取崗位名稱
	virtual string getDeptName() = 0;
		
		
	//職工編號
	int m_Id;
	//職工姓名
	string m_Name;
	//部門編號
	int m_DeptId;
};

employee.h的代碼

//普通員工文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

class Employee :public Worker
{
public:
	//構造函數
	Employee(int id, string name, int did);

	//顯示個人信息
	virtual void showInfo() ;

	//獲取個人信息
	virtual string getDeptName() ;

};

manager.h的代碼

#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

//經理類
class Manger : public Worker
{
public:

	//構造函數
	Manger(int id, string name, int did);

	//顯示個人信息
	virtual void showInfo() ;

	//獲取崗位名稱
	virtual string getDeptName() ;

};

boss.h的代碼

#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

//經理類
class Boss : public Worker
{
public:

	//構造函數
	Boss(int id, string name, int did);

	//顯示個人信息
	virtual void showInfo();

	//獲取崗位名稱
	virtual string getDeptName();

};

workManger.h的代碼

#pragma once

#include <iostream>
using namespace std;

#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"

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

class WorkManger
{
public:
	WorkManger();
	//展示菜單
	void Show_Menu();

	//退出系統
	void ExitSystem();

	//記錄職工的人數有
	int m_EmpNum;

	//職工數組指針
	Worker** m_EmpArray;

	//添加職工
	void Add_Emp();

	//保存文件
	void save();

	//判斷文件是否爲空的標誌
	bool m_FileIsEmpty;

	//統計文件中的人數
	int get_EmpNum();

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

	//顯示職工
	void Show_Emp();

	//刪除職工,根據職工的編號進行刪除
	void Del_Emp();

	//判斷職工是否存在。如果存在,返回職工所在數組中的位置,不存在返回-1
	int  IsExist(int id);

	//修改職工
	void Mod_Emp();

	//查找職工   按照姓名查詢或按照編號查詢
	void Find_Emp();

	//按照職工的編號進行排序
	void Sort_Emp();

	//清空文件操作
	void Clean_File();

	~WorkManger();
};

employee.cpp的代碼

#include "employee.h"

//構造函數
Employee::Employee(int id, string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = did;
}

//顯示個人信息
void Employee::showInfo()
{
	cout << "職工編號: " << this->m_Id
		<< "\t職工姓名: " << this->m_Name
		<< "\t崗位: " << this->getDeptName()
		<< "\t崗位職責: 完成經理交給的任務" << endl;

}

//獲取崗位名稱
string Employee::getDeptName()
{
	return string("員工");
}


manager.cpp的代碼

#include "manager.h"

//構造函數
Manger::Manger(int id , string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = did;
}

//顯示個人信息
void Manger::showInfo()
{
	cout << "職工編號: " << this->m_Id
		<< "\t職工姓名: " << this->m_Name
		<< "\t崗位: " << this->getDeptName()
		<< "\t崗位職責: 完成老闆交給的任務,並下發任務" << endl;
}

//獲取崗位名稱
string Manger::getDeptName()
{
	return string("經理");
}

boss.cpp的代碼

#include "boss.h"

//構造函數
Boss::Boss(int id, string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = did;
}

//顯示個人信息
void Boss::showInfo()
{
	cout << "職工編號: " << this->m_Id
		<< "\t職工姓名: " << this->m_Name
		<< "\t崗位: " << this->getDeptName()
		<< "\t崗位職責: 管理公司所有事務" << endl;
}

//獲取崗位名稱
string Boss::getDeptName()
{
	return string("老闆");
}

workManger.cpp的代碼

#include "workManger.h"

WorkManger::WorkManger()
{
	ifstream ifs;

	//1、文件不存在
	ifs.open(FILENAME, ios::in); //讀文件

	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化屬性
		//初始化記錄人數
		this->m_EmpNum = 0;
		//初始化數組指針爲空
		this->m_EmpArray = NULL;
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}

	//2、文件存在,但是數據爲空
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		//文件爲空
		//cout << "文件爲空" << endl;
		//初始化記錄人數
		this->m_EmpNum = 0;
		//初始化數組指針爲空
		this->m_EmpArray = NULL;
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}

	//3、文件,並且記錄數據
	int num = this->get_EmpNum();
	//cout << "職工人數爲:" << num << endl;
	this->m_EmpNum = num;

	//開闢空間
	this->m_EmpArray = new Worker * [this->m_EmpNum];

	//將文件中的數據存到數組中
	this->init_Emp();

	//測試代碼
	/*for (int i = 0; i < this->m_EmpNum; i++)
	{
		cout << "職工編號: " << this->m_EmpArray[i]->m_Id
			<< "姓名: " << this->m_EmpArray[i]->m_Name
			<< "部門編號: " << this->m_EmpArray[i]->m_DeptId << endl;

	}*/
}

//展示菜單
void WorkManger::Show_Menu()
{
	cout << "************************************" << endl;
	cout << "****** 歡迎使用職工管理系統! *******" << endl;
	cout << "********** 0 退出管理程序 **********" << endl;
	cout << "********** 1 增加職工信息 **********" << endl;
	cout << "********** 2 顯示職工信息 **********" << endl;
	cout << "********** 3 刪除離職員工 **********" << endl;
	cout << "********** 4 修改職工信息 **********" << endl;
	cout << "********** 5 查找職工信息 **********" << endl;
	cout << "********** 6 按照編號排序 **********" << endl;
	cout << "********** 7 清空所有文檔 **********" << endl;
	cout << "************************************" << endl;
	cout << endl;

}

//退出系統
void WorkManger::ExitSystem()
{
	cout << "歡迎下次使用" << endl;
	system("pause");
	exit(0);
}

//添加職工
void WorkManger::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 Manger(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;


		//更新職工不爲空標記
		this->m_FileIsEmpty = false;

		
		//提示添加成功
		cout << "成功添加" << addNum <<"名新職工"<< endl;

		//保存數據到文件中
		this->save();
	}
	else
	{
		cout << "輸入數據有誤" << endl;
	}
	
	//按任意鍵後 清屏回到上級目錄
	system("pause");
	system("cls");

}

//保存文件       這個保存文件是從文件頭開始保存的,
//文件中的數據一開始已經存入到數組中了,這時候文件中的數據 已經沒用了,
//保存文件時直接把原來文件中的數據覆蓋了
void WorkManger::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();
}

//統計文件中的人數
int WorkManger::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++;
	}
	return num;
}

//初始化員工
void WorkManger::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;
		if (dId == 1) //普通職工
		{
			worker = new Employee(id, name, dId);
		}
		if (dId == 2) //經理
		{
			worker = new Manger(id, name, dId);
		}
		if (dId == 3) //老闆
		{
			worker = new Boss(id, name, dId);
		}

		this->m_EmpArray[index] = worker;
		index++;
	}

	//關閉文件
	ifs.close();
}

//顯示職工
void WorkManger::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");

}

//刪除職工,根據職工的編號進行刪除
void WorkManger::Del_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或記錄爲空!" << endl;
	}
	else
	{
		//按照職工編號進行刪除
		cout << "請輸入想要刪除職工編號: " << endl;
		int id = 0;
		cin >> id;

		int index = this->IsExist(id);
		if (index != -1)
		{
			for (int i = index; i < this->m_EmpNum-1; i++)
			//如果是刪除的最後一個元素,就不用移動數據,直接把數組人數-1即可
			{
				//數據前移
				this->m_EmpArray[i] = this->m_EmpArray[i + 1];
			}

			this->m_EmpNum--;//更新數組中數組人數的

			//數據同步更新到文件中
			this->save();

			cout << "刪除成功!" << endl;
		}
		else
		{
			cout << "刪除失敗,未找到該職工!" << endl;
		}
	}
	//按任意鍵後清屏
	system("pause");
	system("cls");
}

//判斷職工是否存在。如果存在,返回職工所在數組中的位置,不存在返回-1
int  WorkManger::IsExist(int id)
{
	int index = -1;
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		if (this->m_EmpArray[i]->m_Id == id)
		{
			//找到職工
			index = i;
			break;
		}
	}
	return index;
}

//修改職工
void WorkManger::Mod_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或者記錄爲空!" << endl;
	}
	else
	{
		cout << "請輸入修改職工的編號" << endl;
		int  id;
		cin >> id;

		int ret = this->IsExist(id);
		if (ret != -1)
		{
			//查找到編號的職工

			delete this->m_EmpArray[ret];


			int newId=0;
			string newName;
			int dSelect = 0;

			cout << "查找: " << id << "號職工,輸入新職工號: " << endl;
			cin >> newId;

			cout << "請輸入新姓名: " << endl;
			cin >> newName;

			cout << "請輸入崗位: " << endl;
			cout << "1、普通職工" << endl;
			cout << "2、經理" << endl;
			cout << "3、老闆" << endl;
			cin >> dSelect;

			Worker * worker = NULL;

			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker = new Manger(newId, newName, dSelect);
				break;
			case 3:
				worker = new Boss(newId, newName, dSelect);
				break;

			default :
				break;
			}

			//更新數據到數組中
			this->m_EmpArray[ret] = worker;

			cout << "修改成功!" << endl;


			//保存到文件中
			this->save();

		}
		else
		{
			cout << "修改失敗,查無此人!" << endl;
		}
	}

	//按任意鍵清屏
	system("pause");
	system("cls");
}

//查找職工   按照姓名查詢或按照編號查詢
void WorkManger::Find_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或者記錄爲空!" << endl;
	}
	else
	{
		cout << "請輸入查找的方式: " << endl;
		cout << "1、按照職工編號查找: " << endl;
		cout << "2、按照職工姓名查詢: " << endl;
		int select = 0;
		cin >> select;
		if (select == 1)
		{
			//按照編號查
			int id;
			cout << "請輸入查找的職工編號: " << endl;
			cin >> id;

			int ret = IsExist(id);
			if (ret != -1)
			{
				//找到職工
				cout << "查找成功!該職工的信息如下: " << endl;
				this->m_EmpArray[ret]->showInfo();
			}
			else
			{
				cout << "查找失敗!查無此人" << endl;
			}
		}
		else if (select == 2)
		{
			//按照姓名查詢
			string name;
			cout << "請輸入查找的姓名: " << endl;
			cin >> name;

			//假如一個判斷是否查到的標誌
			bool flag = false;//默認未找到職工

			for (int i = 0; i < m_EmpNum; i++)
			{
				if (this->m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功,職工編號爲: "
						<< this->m_EmpArray[i]->m_Id
						<< "號職工信息如下" << endl;

					flag = true;

					//調用顯示信息的接口
					this->m_EmpArray[i]->showInfo();
				}
			}
			if (flag == false)
			{
				cout << "查找失敗!查無此人" << endl;
			}
		}
		else 
		{
			cout << "輸入選項有誤,請重新輸入!" << endl;
		}
	}

	//按任意鍵清屏
	system("pause");
	system("cls");
}

//按照職工的編號進行排序
void WorkManger::Sort_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或記錄爲空!" << endl;

		//按任意鍵清屏
		system("pause");
		system("cls");

	}
	else
	{
		cout << "請選擇排序的方式: " << endl;
		cout << "1、按照職工號進行升序" << endl;
		cout << "2、按照職工號進行降序" << endl;

		int select = 0;
		cin >> select;
		for (int i = 0; i < m_EmpNum; i++)
		{ 
			int minOrmax = i;//聲明最小值 或 最大值的下標
			for (int j = i + 1; j < this->m_EmpNum; j++)
			{
				if (select == 1)//升序
				{
					if ((this->m_EmpArray[minOrmax]->m_Id) > (this->m_EmpArray[j]->m_Id))
					{
						minOrmax = j;
					}
				}
				else  //降序
				{
					if((this->m_EmpArray[minOrmax]->m_Id) < (this->m_EmpArray[j]->m_Id))
					{
						minOrmax = j;
					}
				}

				//判斷一開始認定 最大值或最小值,是不是計算的最大值或最小值,如果不是交換數據
				Worker* temp = this->m_EmpArray[i];
				this->m_EmpArray[i] = this->m_EmpArray[minOrmax];
				this->m_EmpArray[minOrmax] = temp;
			}

		}

	cout << "排序成功!排序後的結果爲: " << endl;
	this->save();//把排序後的結果保存到文件中
	this->Show_Emp();//展示所有職工

	}
}

//清空文件操作
void WorkManger::Clean_File()
{
	cout << "確定清空? " << endl;
	cout << "1、確定" << endl;
	cout << "2、返回" << endl;

	int select = 0;
	cin >> select;

	if (select == 1)
	{
		//清空文件
		ofstream ofs(FILENAME, ios::trunc);//刪除文件,重新創建一個新的空文件
		ofs.close();

		if (this->m_EmpArray != NULL)
		{
			//刪除堆區的每個職工給對象
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				delete this->m_EmpArray[i];
				this->m_EmpArray[i] = NULL;
			}

			//刪除堆區數組指針
			delete[] this->m_EmpArray;
			this->m_EmpArray = NULL;
			this->m_EmpNum = 0;
			this->m_FileIsEmpty = true;
		}

		cout << "清空成功" << endl;
	}

	//按任意鍵清屏
	system("pause");
	system("cls");
}

WorkManger::~WorkManger()
{
	if (this->m_EmpArray != NULL)
	{
		for (int i = 0; i < this->m_EmpNum; i++)
		{
			if (this->m_EmpArray[i] != NULL )
			{
				delete this->m_EmpArray[i];
			}
		}

		delete[] this->m_EmpArray;
		this->m_EmpArray = NULL;
	}
}

職工管理系統.cpp的代碼

#include<iostream>
#include  "workManger.h"
using namespace std;

//#include "worker.h"
//#include "employee.h"
//#include "manager.h"
//#include "Boss.h"


int main()
{
	WorkManger wm;

	int choice = 0;

	while (true)
	{
		//調用菜單函數
		wm.Show_Menu();

		cout << "請輸入你的選擇: " << endl;
		cin >> choice;//接受用戶的選項

		switch (choice)
		{
		case 0:		//退出系統
			wm.ExitSystem();
			break;
		case 1:		//增加職工
			wm.Add_Emp();
			break;
		case 2:		//顯示職工
			wm.Show_Emp();
			break;
		case 3:		//刪除職工
			wm.Del_Emp();
			break;
		case 4:		//修改職工、
			wm.Mod_Emp();
			break;
		case 5:		//查找職工
			wm.Find_Emp();
			break;
		case 6:		//排序職工
			wm.Sort_Emp();

			break;
		case 7:		//清空文檔

			wm.Clean_File();
			break;


		default:
			break;
		}


	}

	system("pause");

	return 0;
}

代碼使用說明:

  1. 我用的是VS2019寫的,如果要使用源代碼,你可以去VS裏面創一個新的項目,名字可以命名爲職工管理系統
  2. 然後就就創建一些頭文件和cpp文件,這些文件的名稱如下圖

注意這文件名的大小寫,以及字母的拼寫不要錯誤,我裏面的manager有的好像拼寫有些問題,不過你跟着我圖片裏的命名就可以保證你的正常運行創建好之後,把上面對應的源代碼複製到對應的文件中去。然後點擊運行就可以。

  1. 根據圖片創建對應的文件
  2. 把上面的源代碼填入到對應的文件中去

如果上面的步驟嫌麻煩,可以直接去下載我上傳的資源,裏面有這個職工管理系統的壓縮包,打開就可以直接運行。

  如果代碼和命名都沒有錯誤,但是還無法運行,那就可以在評論出說出你的問題,我會及時回覆的!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章